修复bug

This commit is contained in:
2026-06-02 19:17:42 +08:00
parent 8bb1fb49d2
commit 0e9900eadc
24 changed files with 603 additions and 166 deletions

View File

@@ -279,7 +279,7 @@ public class AssetsService {
}
public Map<String,Object> getAssetsManagerInfo(String assetsNo) throws Exception {
String formNo = configProvider.getBizConfigByKey(RentConstants.ASSETS_INFO_FORMNO);
String formNo = configProvider.getBizConfigByKey(RentConstants.ASSETS_FORMNO);
List<FormWhereCondition> conditions = new ArrayList<>();
conditions.add(FormWhereCondition.build().display("资产编号").value(assetsNo));
FormColumn formColumn = formDataOperator.queryOneRowFormData(formNo, false, null, conditions);

View File

@@ -2,7 +2,6 @@ package com.seeyon.apps.src_rent.bill;
import cn.hutool.log.Log;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.aicloud.common.JsonUtils;
import com.seeyon.apps.src_rent.assets.AssetsService;
import com.seeyon.apps.src_rent.assets.OaAssetsVo;
import com.seeyon.apps.src_rent.config.RentConfigProvider;
@@ -41,6 +40,7 @@ public class BillService {
private FlowCreateService flowCreateService = (FlowCreateService) AppContext.getBean("qcFlowCreateService");
private OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager");
private DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
private DateFormat sysDf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String getFormNo() {
return configProvider.getBizConfigByKey(RentConstants.CONTRACTBILLFORMNO);
@@ -62,6 +62,12 @@ public class BillService {
if(StringUtils.isNotBlank(params.getString("billNo"))) {
conditions.add(FormWhereCondition.build().display("租赁账单编号").value(params.getString("billNo")));
}
if(StringUtils.isNotBlank(params.getString("startDate"))) {
conditions.add(FormWhereCondition.build().display("账单-开始日期").clauseFactor(ClauseFactor.GT).value(params.getString("startDate")));
}
if(StringUtils.isNotBlank(params.getString("endDate"))) {
conditions.add(FormWhereCondition.build().display("账单-开始日期").clauseFactor(ClauseFactor.LE).value(params.getString("endDate")));
}
if(StringUtils.isNotBlank(params.getString("billStatus"))) {
if("已缴费".equals(params.getString("billStatus"))) {
conditions.add(FormWhereCondition.build().display("账单-收款结果反馈").clauseFactor(ClauseFactor.NOT_NULL));
@@ -104,7 +110,7 @@ public class BillService {
Integer pageNo = params.getInteger("pageNo") == null ? 1 : params.getInteger("pageNo");
Integer pageSize = params.getInteger("pageSize") == null ? 10 : params.getInteger("pageSize");
PageQueryVo<BillVo> pageQueryVo = new PageQueryVo();
List<Object> datas = formDataOperator.queryFormDataPageCondition(getFormNo(), true,null, conditions, pageNo, pageSize);
List<Object> datas = formDataOperator.queryFormDataPageCondition(getFormNo(), true,null, conditions, pageNo, pageSize,"账单-开始日期",null);
List<BillVo> vos = new ArrayList<>();
Long count = formDataOperator.countConditon(getFormNo(), conditions);
if(datas.size() > 0){
@@ -175,11 +181,10 @@ public class BillService {
return null;
}
Map<String, Object> fieldsMap = formColumn.getFieldsMap();
String contractNo = getStringValue(fieldsMap, "合同编号");
return contractDocService.getAssetsManagerOrg(contractNo);
return getStringValue(fieldsMap,"签订单位");
}
public void payCallBack(String billNo) throws Exception {
public void payCallBack(String billNo,String payDate) throws Exception {
// 1. 获取Bean + 非空校验
FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4");
if (formApi4Cap4 == null) {
@@ -221,18 +226,15 @@ public class BillService {
List<FormWhereCondition> conditions = new ArrayList<>();
conditions.add(FormWhereCondition.build().display("账单-账单明细编号").value(billNo));
FormColumn formColumn = this.formDataOperator.queryOneRowFormData(this.getFormNo(), false, null, conditions);
// 7. 主数据非空判断
if (formColumn == null || formColumn.getFieldsMap() == null) {
throw new Exception("根据账单编号:" + billNo + "未查询到账单数据");
}
Map<String, Object> fieldsMap = formColumn.getFieldsMap();
BigDecimal accountsReceivable = BigDecimal.ZERO;
// 初始化实际收款金额避免null
BigDecimal actualReceipts = BigDecimal.ZERO;
BigDecimal rate = new BigDecimal("0.997");
// 8. 组装子表数据
Map<String, Object> subTableRowData = new HashMap<>();
subTableRowData.put("账单明细编号", fieldsMap.get("账单-账单明细编号"));
@@ -241,7 +243,6 @@ public class BillService {
subTableRowData.put("当期缴费时限", fieldsMap.get("账单-当前缴费时限"));
subTableRowData.put("综合减免", fieldsMap.get("账单-减免金额") == null ? BigDecimal.ZERO : fieldsMap.get("账单-减免金额"));
subTableRowData.put("租费递增", fieldsMap.get("账单-租费递增") == null ? BigDecimal.ZERO : fieldsMap.get("账单-租费递增"));
// 应收金额计算
BigDecimal receivable = (BigDecimal) fieldsMap.get("账单-应收租金");
if (receivable != null) {
@@ -259,22 +260,19 @@ public class BillService {
FormFieldBean formFieldBean = subTableBean.getFieldBeanByDisplay("收款结果");
subTableRowData.put("收款结果", EnumMapUtils.getEnumItemValueByEnumId("已结清",formFieldBean.getEnumId()));
subFormDataList.add(subTableRowData);
// 9. 获取合同信息 + 非空校验
String contractNo = (String) fieldsMap.get("合同编号");
Map<String, Object> contractInfo = this.contractDocService.getContractInfoByContractNo(contractNo);
if (contractInfo != null) {
mainData.put("合同名称", contractInfo.get("合同名称"));
mainData.put("合同金额", contractInfo.get("合同金额"));
mainData.put("承租方类型", contractInfo.get("承租方类型"));
mainData.put("承租方名称", contractInfo.get("承租方名称"));
}
mainData.put("合同名称", fieldsMap.get("合同名称"));
mainData.put("合同金额", fieldsMap.get("合同金额"));
mainData.put("签订单位", fieldsMap.get("签订单位"));
mainData.put("承租方类型", fieldsMap.get("承租方类型"));
mainData.put("承租方名称", fieldsMap.get("承租方"));
mainData.put("承租方名称编号", fieldsMap.get("承租方编号"));
// 10. 经办人/部门信息(安全赋值)
String assetNo = (String) fieldsMap.get("资产编号");
Map<String, Object> assetsManagerInfo = this.assetsService.getAssetsManagerInfo(assetNo);
if (assetsManagerInfo != null && assetsManagerInfo.get("经办人") != null) {
String managerId = String.valueOf(assetsManagerInfo.get("经办人"));
if (assetsManagerInfo != null && assetsManagerInfo.get("运营管理员") != null) {
String managerId = String.valueOf(assetsManagerInfo.get("运营管理员"));
try {
V3xOrgMember member = this.orgManager.getMemberById(Long.parseLong(managerId));
if (member != null) {
@@ -286,14 +284,12 @@ public class BillService {
log.warn("获取经办人信息失败", e);
}
}
// 11. 组装主表数据(线程安全日期)
mainData.put("收款项", EnumMapUtils.getMasterTableEnumItemValue(templateCode, "收款项", "租金"));
mainData.put("经办日期", LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
mainData.put("本次收款时间", payDate);
mainData.put("合同编号", contractNo);
mainData.put("本次收款金额", actualReceipts);
// 12. 启动流程
this.flowCreateService.flowStart("微信小程序支付完成收款登记",
mainFormData, subFormDataMap, appName, templateCode);

View File

@@ -13,6 +13,7 @@ import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -54,12 +55,12 @@ public class FeeRecordService {
.display("收付款日期")
.startWithBracket(true)
.clauseFactor(ClauseFactor.GE)
.value(params.getString("year") + "-01-01"));
.value(params.getString("year") + "-01-01 00:00:00"));
conditions.add(FormWhereCondition.build()
.display("收付款日期")
.endWithBracket(true)
.clauseFactor(ClauseFactor.LE)
.value(params.getString("year") + "-12-31"));
.value(params.getString("year") + "-12-31 23:59:59"));
}
return conditions;
}
@@ -101,11 +102,13 @@ public class FeeRecordService {
}
}
public void payCallBack(String billNo,String bizType) throws Exception {
public void payCallBack(String billNo, String bizType, String payDate) throws Exception {
if("rent".equals(bizType)) {
billService.payCallBack(billNo);
}else {
waeBillService.payCallBack(billNo);
billService.payCallBack(billNo,payDate);
}else if("wae".equals(bizType)){
waeBillService.payCallBack(billNo,payDate);
}else if("margin".equals(bizType)){
}
}
}

View File

@@ -0,0 +1,247 @@
package com.seeyon.apps.src_rent.bill;
import cn.hutool.log.Log;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.src_rent.assets.AssetsService;
import com.seeyon.apps.src_rent.assets.OaAssetsVo;
import com.seeyon.apps.src_rent.config.RentConfigProvider;
import com.seeyon.apps.src_rent.constants.RentConstants;
import com.seeyon.apps.src_rent.contract.ContractDocService;
import com.seeyon.apps.src_rent.contract.ContractService;
import com.seeyon.apps.src_rent.flow.FlowCreateService;
import com.seeyon.apps.src_rent.form.*;
import com.seeyon.apps.src_rent.po.PageQueryVo;
import com.seeyon.cap4.form.api.FormApi4Cap4;
import com.seeyon.cap4.form.bean.FormBean;
import com.seeyon.cap4.form.bean.FormFieldBean;
import com.seeyon.cap4.form.bean.FormTableBean;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.organization.bo.V3xOrgMember;
import com.seeyon.ctp.organization.manager.OrgManager;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
public class MarginBillService {
private static final Log log = Log.get(MarginBillService.class);
private RentConfigProvider configProvider = (RentConfigProvider) AppContext.getBean("rentConfigProvider");
private FormDataOperator formDataOperator = (FormDataOperator) AppContext.getBean("qcFormDataOperator");
private AssetsService assetsService = (AssetsService) AppContext.getBean("qcAssetsService");
private ContractDocService contractDocService = (ContractDocService) AppContext.getBean("qcContractDocService");
private FlowCreateService flowCreateService = (FlowCreateService) AppContext.getBean("qcFlowCreateService");
private OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager");
private DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
private DateFormat sysDf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String getFormNo() {
return configProvider.getBizConfigByKey(RentConstants.UNPAIDMARGINFORMNO);
}
private String getStringValue(Map<String, Object> fieldsMap,String key) {
Object o = fieldsMap.get(key);
if(o == null) {
return null;
}
return o + "";
}
private List<FormWhereCondition> buildConditions(JSONObject params) {
List<FormWhereCondition> conditions = new ArrayList<>();
if(StringUtils.isNotBlank(params.getString("cusNo"))) {
conditions.add(FormWhereCondition.build().display("承租方编号").value(params.getString("cusNo")));
}
if(StringUtils.isNotBlank(params.getString("billStatus"))) {
if("已缴费".equals(params.getString("billStatus"))) {
conditions.add(FormWhereCondition.build().display("缴费状态").clauseFactor(ClauseFactor.NOT_NULL));
}else {
conditions.add(FormWhereCondition.build().display("缴费状态").clauseFactor(ClauseFactor.NULL).startWithBracket(true).concatFactor(ClauseFactor.OR));
conditions.add(FormWhereCondition.build().display("缴费状态").value(EnumMapUtils.getMasterTableEnumItemValue(getFormNo(),"缴费状态","未结清")).endWithBracket(true));
}
}
if(StringUtils.isNotBlank(params.getString("startDate"))) {
conditions.add(FormWhereCondition.build().display("合同开始日期").clauseFactor(ClauseFactor.GT).value(params.getString("startDate")));
}
if(StringUtils.isNotBlank(params.getString("endDate"))) {
conditions.add(FormWhereCondition.build().display("合同开始日期").clauseFactor(ClauseFactor.LE).value(params.getString("endDate")));
}
return conditions;
}
public PageQueryVo pageQuery(JSONObject params) throws Exception {
List<FormWhereCondition> conditions = buildConditions(params);
conditions.add(FormWhereCondition.build().display("是否同步小程序").value(EnumMapUtils.getMasterTableEnumItemValue(getFormNo(),"是否同步小程序","")));
Integer pageNo = params.getInteger("pageNo") == null ? 1 : params.getInteger("pageNo");
Integer pageSize = params.getInteger("pageSize") == null ? 10 : params.getInteger("pageSize");
PageQueryVo<BillVo> pageQueryVo = new PageQueryVo();
List<Object> datas = formDataOperator.queryFormDataPageCondition(getFormNo(), true,null, conditions, pageNo, pageSize,"账单开始日期",null);
List<BillVo> vos = new ArrayList<>();
Long count = formDataOperator.countConditon(getFormNo(), conditions);
if(datas.size() > 0){
for (Object data : datas) {
Map<String,Object> map = (Map<String, Object>) data;
BillVo billVo = new BillVo();
fillVo(map, billVo);
vos.add(billVo);
}
pageQueryVo.setDatas(vos);
pageQueryVo.setTotalCount(count);
}
return pageQueryVo;
}
public Integer countUnpay(JSONObject params) throws Exception {
List<FormWhereCondition> conditions = buildConditions(params);
conditions.add(FormWhereCondition.build().display("是否同步小程序").value(EnumMapUtils.getMasterTableEnumItemValue(getFormNo(),"是否同步小程序","")));
conditions.add(FormWhereCondition.build().display("缴费状态").clauseFactor(ClauseFactor.NULL).startWithBracket(true).concatFactor(ClauseFactor.OR));
conditions.add(FormWhereCondition.build().display("缴费状态").value(EnumMapUtils.getMasterTableEnumItemValue(getFormNo(),"缴费状态","未结清")).endWithBracket(true));
Long count = formDataOperator.countConditon(getFormNo(), conditions);
return count.intValue();
}
public void fillVo(Map<String, Object> fieldsMap, BillVo billVo) throws Exception {
billVo.setBillType("MARGIN");
billVo.setBillStartDate(getStringValue(fieldsMap,"合同开始日期"));
billVo.setBillEndDate(getStringValue(fieldsMap,"合同截止日期"));
billVo.setBillStatus(getStringValue(fieldsMap,"缴费状态"));
billVo.setCusNo(getStringValue(fieldsMap,"承租方编号"));
billVo.setBillNo(getStringValue(fieldsMap,"单据编号"));
BigDecimal marginFee = fieldsMap.get("履约保证金") == null ? BigDecimal.ZERO : (BigDecimal) fieldsMap.get("履约保证金");
billVo.setBillAmount(marginFee.toString());
String contractName = null;
String contractNo = getStringValue(fieldsMap, "合同编号");
if(StringUtils.isNotBlank(contractNo)) {
contractName = getContractName(contractNo);
}
billVo.setBillName(contractName + "_保证金");
}
private String getContractName(String contractNo) throws Exception {
if(contractNo == null) {
return null;
}
Map<String, Object> map = contractDocService.getContractInfoByContractNo(contractNo);
if(map == null) {
return null;
}
return (String)map.get("合同名称");
}
public String getBillPayReceiver(String billNo) throws Exception {
List<FormWhereCondition> conditions = new ArrayList<>();
conditions.add(FormWhereCondition.build().display("单据编号").value(billNo));
FormColumn formColumn = formDataOperator.queryOneRowFormData(getFormNo(), true, null, conditions);
if(formColumn == null) {
return null;
}
Map<String, Object> fieldsMap = formColumn.getFieldsMap();
String contractNo = getStringValue(fieldsMap, "合同编号");
return contractDocService.getAssetsManagerOrg(contractNo);
}
public void payCallBack(String billNo,String payDate) throws Exception {
// 1. 获取Bean + 非空校验
FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4");
if (formApi4Cap4 == null) {
throw new Exception("Spring容器中未找到formApi4Cap4 Bean");
}
// 2. 复用配置,避免重复查询
String templateCode = this.configProvider.getBizConfigByKey(RentConstants.PAYMENT_REGISTRATION_TEMPLATECODE);
String appName = this.configProvider.getBizConfigByKey(RentConstants.FORMAPPNAME);
// 3. 获取表单结构
FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(templateCode);
FormTableBean masterTableBean = cap4FormBean.getMasterTableBean();
String tableName = masterTableBean.getTableName();
List<FormTableBean> subTableBeanList = cap4FormBean.getSubTableBean();
FormTableBean subTableBean = null;
// 4. 获取子表名 + 非空校验
String subDbTableName = null;
for (FormTableBean tableBean : subTableBeanList) {
if ("非租赁收款明细".equals(tableBean.getDisplay())) {
subDbTableName = tableBean.getTableName();
subTableBean = tableBean;
break;
}
}
// 5. 构造数据结构(规范泛型)
Map<String, Object> mainFormData = new HashMap<>();
Map<String, List<Object>> subFormDataMap = new HashMap<>();
List<Object> subFormDataList = new ArrayList<>();
Map<String, Object> mainData = new HashMap<>();
mainFormData.put(tableName, mainData);
if (subDbTableName != null) {
log.info("明细表表名为: " + subDbTableName);
subFormDataMap.put(subDbTableName, subFormDataList);
}
// 6. 查询账单数据
List<FormWhereCondition> conditions = new ArrayList<>();
conditions.add(FormWhereCondition.build().display("单据编号").value(billNo));
FormColumn formColumn = this.formDataOperator.queryOneRowFormData(this.getFormNo(), false, null, conditions);
// 7. 主数据非空判断
if (formColumn == null || formColumn.getFieldsMap() == null) {
throw new Exception("根据账单编号:" + billNo + "未查询到账单数据");
}
Map<String, Object> fieldsMap = formColumn.getFieldsMap();
BigDecimal accountsReceivable = BigDecimal.ZERO;
// 初始化实际收款金额避免null
BigDecimal actualReceipts = BigDecimal.ZERO;
BigDecimal rate = new BigDecimal("0.997");
// 8. 组装子表数据
Map<String, Object> subTableRowData = new HashMap<>();
// 应收金额计算
BigDecimal receivable = (BigDecimal) fieldsMap.get("履约保证金");
if (receivable != null) {
accountsReceivable = accountsReceivable.add(receivable);
// 修复BigDecimal.setScale不生效问题
actualReceipts = accountsReceivable.multiply(rate).setScale(2, RoundingMode.HALF_UP);
}
subTableRowData.put("收款金额", receivable);
subTableRowData.put("开票金额", receivable);
subFormDataList.add(subTableRowData);
// 9. 获取合同信息 + 非空校验
String contractNo = (String) fieldsMap.get("合同编号");
mainData.put("合同名称", fieldsMap.get("合同名称"));
mainData.put("合同金额", fieldsMap.get("合同金额"));
mainData.put("承租方类型", fieldsMap.get("承租方类型"));
mainData.put("承租方名称", fieldsMap.get("承租方名称"));
mainData.put("承租方名称编号", fieldsMap.get("承租方编号"));
// 10. 经办人/部门信息(安全赋值)
String assetNo = (String) fieldsMap.get("资产编号");
Map<String, Object> assetsManagerInfo = this.assetsService.getAssetsManagerInfo(assetNo);
if (assetsManagerInfo != null && assetsManagerInfo.get("经办人") != null) {
String managerId = String.valueOf(assetsManagerInfo.get("经办人"));
try {
V3xOrgMember member = this.orgManager.getMemberById(Long.parseLong(managerId));
if (member != null) {
mainData.put("经办部门", member.getOrgDepartmentId());
mainData.put("经办单位", member.getOrgAccountId());
mainData.put("经办人员", managerId);
}
} catch (Exception e) {
log.warn("获取经办人信息失败", e);
}
}
// 11. 组装主表数据(线程安全日期)
mainData.put("收款项", EnumMapUtils.getMasterTableEnumItemValue(templateCode, "收款项", "非租金"));
mainData.put("经办日期", LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
mainData.put("本次收款时间", payDate);
mainData.put("合同编号", contractNo);
mainData.put("本次收款金额", actualReceipts);
// 12. 启动流程
this.flowCreateService.flowStart("微信小程序支付完成收款登记",
mainFormData, subFormDataMap, appName, templateCode);
}
}

View File

@@ -14,6 +14,7 @@ import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -42,6 +43,12 @@ public class WaeBillService {
if(StringUtils.isNotBlank(params.getString("cusNo"))) {
conditions.add(FormWhereCondition.build().display("承租方编号").value(params.getString("cusNo")));
}
if(StringUtils.isNotBlank(params.getString("startDate"))) {
conditions.add(FormWhereCondition.build().display("账单开始日期").clauseFactor(ClauseFactor.GT).value(params.getString("startDate")));
}
if(StringUtils.isNotBlank(params.getString("endDate"))) {
conditions.add(FormWhereCondition.build().display("账单开始日期").clauseFactor(ClauseFactor.LE).value(params.getString("endDate")));
}
if(StringUtils.isNotBlank(params.getString("billStatus"))) {
if("已缴费".equals(params.getString("billStatus"))) {
conditions.add(FormWhereCondition.build().display("缴费状态").clauseFactor(ClauseFactor.NOT_NULL));
@@ -56,10 +63,11 @@ public class WaeBillService {
public PageQueryVo pageQueryWaeBill(JSONObject params) throws Exception {
List<FormWhereCondition> conditions = buildConditions(params);
conditions.add(FormWhereCondition.build().display("是否同步小程序").value(EnumMapUtils.getMasterTableEnumItemValue(getFormNo(),"是否同步小程序","")));
Integer pageNo = params.getInteger("pageNo") == null ? 1 : params.getInteger("pageNo");
Integer pageSize = params.getInteger("pageSize") == null ? 10 : params.getInteger("pageSize");
PageQueryVo<BillVo> pageQueryVo = new PageQueryVo();
List<Object> datas = formDataOperator.queryFormDataPageCondition(getFormNo(), true,null, conditions, pageNo, pageSize);
List<Object> datas = formDataOperator.queryFormDataPageCondition(getFormNo(), true,null, conditions, pageNo, pageSize,"账单开始日期",null);
List<BillVo> vos = new ArrayList<>();
Long count = formDataOperator.countConditon(getFormNo(), conditions);
if(datas.size() > 0){
@@ -95,6 +103,7 @@ public class WaeBillService {
public Integer countUnpayWaeBills(JSONObject params) throws Exception {
List<FormWhereCondition> conditions = buildConditions(params);
conditions.add(FormWhereCondition.build().display("是否同步小程序").value(EnumMapUtils.getMasterTableEnumItemValue(getFormNo(),"是否同步小程序","")));
conditions.add(FormWhereCondition.build().display("缴费状态").clauseFactor(ClauseFactor.NULL).startWithBracket(true).concatFactor(ClauseFactor.OR));
conditions.add(FormWhereCondition.build().display("缴费状态").value(EnumMapUtils.getMasterTableEnumItemValue(getFormNo(),"缴费状态","未结清")).endWithBracket(true));
Long count = formDataOperator.countConditon(getFormNo(), conditions);
@@ -107,16 +116,16 @@ public class WaeBillService {
billVo.setBillEndDate(getStringValue(fieldsMap,"账单结束日期"));
billVo.setBillStatus(getStringValue(fieldsMap,"缴费状态"));
billVo.setCusNo(getStringValue(fieldsMap,"承租方编号"));
billVo.setBillNo(getStringValue(fieldsMap,"档案编号"));
billVo.setBillNo(getStringValue(fieldsMap,"唯一标识"));
BigDecimal powerFee = fieldsMap.get("本次应缴电费") == null ? BigDecimal.ZERO : (BigDecimal) fieldsMap.get("本次应缴电费");
BigDecimal waterFee = fieldsMap.get("本次应缴水费") == null ? BigDecimal.ZERO : (BigDecimal) fieldsMap.get("本次应缴水费");
billVo.setBillAmount((powerFee.add(waterFee)).toString());
billVo.setBillName("");
billVo.setBillName(BigDecimal.ZERO.equals(powerFee) ? "电费" : "水费");
}
public String getBillPayReceiver(String billNo) throws Exception {
List<FormWhereCondition> conditions = new ArrayList<>();
conditions.add(FormWhereCondition.build().display("档案编号").value(billNo));
conditions.add(FormWhereCondition.build().display("唯一标识").value(billNo));
FormColumn formColumn = formDataOperator.queryOneRowFormData(getFormNo(), true, null, conditions);
if(formColumn == null) {
return null;
@@ -127,9 +136,9 @@ public class WaeBillService {
return docService.getAssetsManagerOrg(contractNoByAssetsNo);
}
public void payCallBack(String billNo) throws BusinessException {
public void payCallBack(String billNo, String payDate) throws BusinessException {
List<FormWhereCondition> conditions = new ArrayList<>();
conditions.add(FormWhereCondition.build().display("档案编号").value(billNo));
conditions.add(FormWhereCondition.build().display("唯一标识").value(billNo));
List<FormUpdateField> updateFields = new ArrayList<>();
updateFields.add(FormUpdateField.build().display("缴费状态").value(EnumMapUtils.getMasterTableEnumItemValue(getFormNo(),"缴费状态","结清")));
formDataOperator.updateMasterForm(getFormNo(),updateFields,conditions);

View File

@@ -27,6 +27,7 @@ public enum RentConstants {
FORMAPPNAME("","表单应用名称"),
FEERECORDFORMNO("","费用收支台账表单编码"),
CONTRACTBILLFORMNO("","合同账单表单编码"),
UNPAIDMARGINFORMNO("","履约保证金表单编码"),
WAEBILLFORMNO("","水电费账单表单编码"),
CUSDOCFORMNO("","客商档案表单编码"),
NOTICEFORMNO("","招商公告表单编码"),

View File

@@ -34,6 +34,9 @@ public class ContractDocService {
List<FormWhereCondition> conditions = new ArrayList<>();
conditions.add(FormWhereCondition.build().display("合同编号").value(contractNo));
FormColumn formColumn = formDataOperator.queryOneRowFormData(formNo, false, null, conditions);
if(formColumn == null) {
return null;
}
Map<String, Object> fieldsMap = formColumn.getFieldsMap();
Map<String,Object> map = new HashMap<>();
if(fieldsMap == null) {

View File

@@ -38,6 +38,7 @@ public class EsignCallBackController extends BaseController {
String tableName = request.getParameter("tablename");
String updatefield = request.getParameter("updatefield");
String statusfield = request.getParameter("statusfield");
String appId = request.getParameter("xId");
BufferedReader reader = request.getReader();
StringBuilder sb = new StringBuilder();
String line;
@@ -52,25 +53,22 @@ public class EsignCallBackController extends BaseController {
String flowId = callbackParams.getSignFlowId();
String action = callbackParams.getAction();
log.info("签署回调当前流程: " + flowId);
if(action.equals("SIGN_FLOW_COMPLETE")) {
if(callbackParams.getSignFlowStatus() == 2) {
Map<String, Object> fileInfo = esignByUploadFileService.getDownloadFileInfo(flowId);
esignCallbackBizService.handleSuccessSignCallbackBiz(tableName,updatefield,statusfield,formId,(String)fileInfo.get("downloadUrl"),(String)fileInfo.get("fileName"));
}else if(callbackParams.getSignFlowStatus() == 5){
if (action.equals("SIGN_FLOW_COMPLETE")) {
if (callbackParams.getSignFlowStatus() == 2) {
Map<String, Object> fileInfo = esignByUploadFileService.getDownloadFileInfo(flowId,appId);
esignCallbackBizService.handleSuccessSignCallbackBiz(tableName, updatefield, statusfield, formId, (String) fileInfo.get("downloadUrl"), (String) fileInfo.get("fileName"));
} else if (callbackParams.getSignFlowStatus() == 5) {
//合同过期
esignCallbackBizService.handleExpiredSignCallbackBiz(tableName,statusfield,formId);
}else {
esignCallbackBizService.handleFailSignCallbackBiz(tableName,statusfield,formId,callbackParams.getResultDescription());
esignCallbackBizService.handleExpiredSignCallbackBiz(tableName, statusfield, formId);
} else {
esignCallbackBizService.handleFailSignCallbackBiz(tableName, statusfield, formId, callbackParams.getResultDescription());
}
signLinkService.del(flowId);
response.setStatus(HttpServletResponse.SC_OK);
return;
}else if(action.equals("SIGN_MISSON_COMPLETE") && callbackParams.getSignResult() == 2 && callbackParams.getSignOrder() == 2){
} else if (action.equals("SIGN_MISSON_COMPLETE") && callbackParams.getSignResult() == 2 && callbackParams.getSignOrder() == 2) {
//发送消息
MessageVo messageVo = new MessageVo();
messageVo.setBizId(flowId);
messageVo.setMessageType("SIGN");
// thirdMessageService.sendMessage();
}
//下载合同
@@ -82,11 +80,10 @@ public class EsignCallBackController extends BaseController {
out.flush();
}
log.info("回调处理完成: " + flowId);
return;
} catch (Exception e) {
log.error("回调处理失败", e);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
e.printStackTrace();
}
// response.setStatus(HttpServletResponse.SC_OK);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}

View File

@@ -21,9 +21,9 @@ public class CustomerService {
}
public String matchCusPerson(Customer customer) throws Exception {
String phone = customer.getCusPhone();
String cardNo = customer.getCardNo();
List<FormWhereCondition> conditions = new ArrayList<>();
conditions.add(FormWhereCondition.build().display("联系电话").value(phone).clauseFactor(ClauseFactor.EQ));
conditions.add(FormWhereCondition.build().display("统一社会信用代码").value(cardNo).clauseFactor(ClauseFactor.EQ));
conditions.add(FormWhereCondition.build().display("承租方类型").value(EnumMapUtils.getMasterTableEnumItemValue(getFormNo(),"承租方类型","个人")));
List<FormColumn> formColumnList = formDataOperator.queryFormDataCondition(getFormNo(), null, conditions);
if(formColumnList != null && formColumnList.size() > 0){
@@ -36,7 +36,8 @@ public class CustomerService {
public String matchCusOrg(Customer customer) throws BusinessException {
String orgNo = customer.getOrgNo();
List<FormWhereCondition> conditions = new ArrayList<>();
conditions.add(FormWhereCondition.build().display("社会信用代码").value(orgNo).clauseFactor(ClauseFactor.EQ));
conditions.add(FormWhereCondition.build().display("承租方类型").value(EnumMapUtils.getMasterTableEnumItemValue(getFormNo(),"承租方类型","单位")));
conditions.add(FormWhereCondition.build().display("统一社会信用代码").value(orgNo).clauseFactor(ClauseFactor.EQ));
List<FormColumn> formColumnList = formDataOperator.queryFormDataCondition(getFormNo(), null, conditions);
if(formColumnList != null && formColumnList.size() > 0){
Map<String, Object> fieldsMap = formColumnList.get(0).getFieldsMap();

View File

@@ -12,6 +12,7 @@ import com.seeyon.ctp.util.JDBCAgent;
import com.seeyon.v3x.services.form.FormFactory;
import com.seeyon.v3x.services.form.bean.FormExport;
import com.seeyon.v3x.services.form.bean.ValueExport;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -368,6 +369,81 @@ public class FormDataOperator {
return columns;
}
public List<Object> queryFormDataPageCondition(String formNo,Boolean changeEnum,List<String> queryColumnVos, List<FormWhereCondition> conditionVos,Integer pageNo,Integer pageSize,String orderField,String orderKeyWord) throws BusinessException {
FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4");
FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo);
List<String> queryColumns = new ArrayList<>();
FormTableBean masterTableBean = cap4FormBean.getMasterTableBean();
String tableName = masterTableBean.getTableName();
Map<String, FormFieldBean> fieldMap4Name = masterTableBean.getFieldMap4Name();
String orderFieldName = null;
if (queryColumnVos != null) {
for (String queryColumnVo : queryColumnVos) {
FormFieldBean fieldBeanByDisplay = masterTableBean.getFieldBeanByDisplay(queryColumnVo);
if (fieldBeanByDisplay == null) {
continue;
}
queryColumns.add(fieldBeanByDisplay.getColumnName());
}
}
FormFieldBean formFieldBean = masterTableBean.getFieldBeanByDisplay(orderField);
if(formFieldBean != null) {
orderFieldName = formFieldBean.getColumnName();
}
for (FormWhereCondition conditionVo : conditionVos) {
FormFieldBean fieldBeanByDisplay = masterTableBean.getFieldBeanByDisplay(conditionVo.getDisplay());
if (fieldBeanByDisplay == null) {
if (conditionVo.getDisplay().equals("ID") || conditionVo.getDisplay().equals("id")) {
conditionVo.setFieldName("ID");
}
continue;
}
conditionVo.setFieldName(fieldBeanByDisplay.getColumnName());
}
Map<String, Object> generateSql = generatePageQuerySql(queryColumns, conditionVos, tableName,pageNo,pageSize,orderFieldName,orderKeyWord);
String sql = (String) generateSql.get("sql");
List<Object> params = (List<Object>) generateSql.get("params");
log.info("sql为: " + sql);
log.info("参数为: " + JsonUtils.toJSONString(params));
JDBCAgent jdbcAgent = new JDBCAgent();
List<Object> columns = new ArrayList<>();
try {
jdbcAgent.execute(sql, params);
List list = jdbcAgent.resultSetToList();
for (Object o : list) {
FormColumn column = new FormColumn();
Map<String, Object> columnMap = (Map<String, Object>) o;
List<FormFieldVo> vos = new ArrayList<>();
for (String key : columnMap.keySet()) {
FormFieldVo fieldVo = new FormFieldVo();
if (fieldMap4Name.containsKey(key)) {
FormFieldBean fieldBean = fieldMap4Name.get(key);
fieldVo.setDisplayName(fieldBean.getDisplay());
fieldVo.setValue(columnMap.get(key));
if(changeEnum){
//转换枚举值
convert2ShowValue(fieldVo,fieldBean);
}
vos.add(fieldVo);
}
}
column.setVos(vos);
if (columnMap.get("id") != null) {
column.setId(columnMap.get("id") + "");
}
Map<String, Object> fieldsMap = column.getFieldsMap();
columns.add(fieldsMap);
}
} catch (Exception e) {
log.error(e.getMessage(),e);
} finally {
jdbcAgent.close();
}
return columns;
}
public List<Object> queryFormDataPageCondition(String formNo,Boolean changeEnum,List<String> queryColumnVos, List<FormWhereCondition> conditionVos,Integer pageNo,Integer pageSize) throws BusinessException {
FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4");
FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo);
@@ -563,7 +639,7 @@ public class FormDataOperator {
break;
}
}
Map<String, Object> generateSql = generateSql(queryColumns, conditionVos, tableName,"sort",pageNo,pageSize);
Map<String, Object> generateSql = generateSql(queryColumns, conditionVos, tableName,"sort",null,pageNo,pageSize);
String sql = (String) generateSql.get("sql");
List<Object> params = (List<Object>) generateSql.get("params");
log.info("sql为: " + sql);
@@ -625,14 +701,19 @@ public class FormDataOperator {
}
private Map<String, Object> generateSql(List<String> queryColumn, List<FormWhereCondition> conditions, String tableName) {
return generateSql( queryColumn, conditions, tableName,null,null,null);
return generateSql( queryColumn, conditions, tableName,null,null,null,null);
}
private Map<String, Object> generatePageQuerySql(List<String> queryColumn, List<FormWhereCondition> conditions, String tableName,Integer pageNo,Integer pageSize,String orderField,String orderKeyWord) {
return generateSql( queryColumn, conditions, tableName,orderField,orderKeyWord,pageNo,pageSize);
}
private Map<String, Object> generatePageQuerySql(List<String> queryColumn, List<FormWhereCondition> conditions, String tableName,Integer pageNo,Integer pageSize) {
return generateSql( queryColumn, conditions, tableName,null,pageNo,pageSize);
return generateSql( queryColumn, conditions, tableName,null,null,pageNo,pageSize);
}
private Map<String, Object> generateSql(List<String> queryColumn, List<FormWhereCondition> conditions, String tableName,String orderField,Integer pageNo,Integer pageSize) {
private Map<String, Object> generateSql(List<String> queryColumn, List<FormWhereCondition> conditions, String tableName,String orderField,String orderKeyWord,Integer pageNo,Integer pageSize) {
if (tableName == null) {
throw new IllegalArgumentException("tableName cannot be null or empty");
}
@@ -656,8 +737,11 @@ public class FormDataOperator {
List<Object> params = new ArrayList<>();
sqlBuilder.append(buildWhereClause(conditions,params));
String orderType = StringUtils.isBlank(orderKeyWord) ? "ASC" : orderKeyWord;
if(orderField == null) {
sqlBuilder.append(" order by start_date desc");
sqlBuilder.append(" order by start_date " + orderType);
}else {
sqlBuilder.append(" order by " + orderField + " " +orderType);
}
if(pageNo != null && pageSize != null) {
sqlBuilder.append(" limit " + pageSize + " offset " + (pageNo - 1) * pageSize);

View File

@@ -15,6 +15,7 @@ import com.seeyon.ctp.common.AppContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.List;
import java.util.Map;
public class SealDocSyncJob extends AbstractQuartzTask {
@@ -27,22 +28,24 @@ public class SealDocSyncJob extends AbstractQuartzTask {
@Override
public String taskRun(String s) throws Exception {
log.info("开始执行印章同步任务");
syncSeals();
List<String> appIds = tokenCacheManager.getAppIds();
for (String appId : appIds) {
syncSeals(appId);
}
log.info("印章同步任务完成");
return "";
}
private void syncSeals() {
String orgId = configProvider.getBizConfigByKey(RentConstants.eSignOrgId);
private void syncSeals(String appId) {
String host = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST);
Integer pageNum = 1;
Integer pageSize = 20;
EsignApiHeader esignApiHeader = EsignApiHeader.build().appId(configProvider.getBizConfigByKey(RentConstants.APP_ID));
esignApiHeader.token(tokenCacheManager.getToken());
EsignApiHeader esignApiHeader = EsignApiHeader.build().appId(appId);
esignApiHeader.token(tokenCacheManager.getToken(appId));
EsignBaseResp esignBaseResp = null;
Map<String,Object> dataMap = null;
do {
String url = host + EsignApiUrl.SEAL_QUERY_URL + "?" + "orgId=" + orgId + "&pageNum=" + (pageNum++) + "&pageSize=" + pageSize;
String url = host + EsignApiUrl.SEAL_QUERY_URL + "?" + "orgId=" + tokenCacheManager.getOrgNameByAppId(appId) + "&pageNum=" + (pageNum++) + "&pageSize=" + pageSize;
String respStr = HttpClient.httpGet(url, esignApiHeader.convert2Headers(),"UTF-8");
esignBaseResp = JsonUtils.parseObject(respStr, EsignBaseResp.class);
if(esignBaseResp.getCode() != 0) {

View File

@@ -17,6 +17,7 @@ import com.seeyon.apps.src_rent.po.Signer;
import com.seeyon.apps.src_rent.service.EsignByTemplateService;
import com.seeyon.apps.src_rent.service.EsignByUploadFileService;
import com.seeyon.apps.src_rent.service.SignLinkService;
import com.seeyon.apps.src_rent.service.TokenCacheManager;
import com.seeyon.cap4.form.bean.FormDataMasterBean;
import com.seeyon.cap4.form.bean.FormFieldBean;
import com.seeyon.cap4.form.service.CAP4FormManager;
@@ -43,6 +44,7 @@ public class EsignMultipleSignerNode extends ACommonSuperNode {
private EsignByUploadFileService uploadFileService = (EsignByUploadFileService) AppContext.getBean("qcEsignByUploadFileService");
private EsignByTemplateService templateService = (EsignByTemplateService) AppContext.getBean("qcEsignByTemplateService");
private SignLinkService signLinkService = (SignLinkService) AppContext.getBean("qcSignLinkService");
private TokenCacheManager tokenCacheManager = (TokenCacheManager) AppContext.getBean("qcTokenCacheManager");
@Override
public String getPluginId() {
@@ -59,13 +61,17 @@ public class EsignMultipleSignerNode extends ACommonSuperNode {
SuperNodeContext context = new SuperNodeContext();
context.setNeedSave(true);
log.info("进入 E签宝多方签署集成超级节点");
try {
Map<String, Object> signParams = buildSignParams(formDataVo, formDataMasterBean, true);
String appId = null;
FieldDataVo signOrgData = formDataVo.getFieldData("签订单位");
if(signOrgData != null) {
appId = tokenCacheManager.getAppIdByOrgName(signOrgData.getStringValue());
}
Map<String, Object> signParams = buildSignParams(appId,formDataVo, formDataMasterBean, true);
if (signParams == null) throw new RuntimeException("签署参数构建失败");
EsignParamRecordUtils.saveEsignParamRecord(signParams);
String esignFlowId = templateService.createBySignTemplate(signParams);
signLinkService.saveGetLinkParam(formDataVo, formDataMasterBean,esignFlowId);
String esignFlowId = templateService.createBySignTemplate(signParams,appId);
signLinkService.saveGetLinkParam(appId,formDataVo, formDataMasterBean,esignFlowId);
log.info("E签宝签署流程ID: " + esignFlowId + " , OA超级节点ID" + formDataVo.getToken());
log.info("E签宝多方签署合同已发送: " + esignFlowId);
formDataVo.getNewFieldDataMap().put("电子签合同流程ID", esignFlowId);
@@ -77,12 +83,13 @@ public class EsignMultipleSignerNode extends ACommonSuperNode {
}
}
private Map<String, Object> buildSignFlowConfig(FormDataVo formDataVo,FormDataMasterBean masterBean) throws Exception {
private Map<String, Object> buildSignFlowConfig(String appId,FormDataVo formDataVo,FormDataMasterBean masterBean) throws Exception {
String contractName = getStringField(formDataVo, CONTRACT_NAME_FIELD);
if (contractName == null) throw new RuntimeException("合同名称不能为空");
String formId = formDataVo.getToken() +"_" + formDataVo.getId();
Long enumId = masterBean.getFormTable().getFieldBeanByDisplay("签署状态").getEnumId();
String signCallBackUrl = configProvider.getBizConfigByKey(RentConstants.OA_HOST) + "/seeyon/esigncallback.do?method=callback&formId=" + formId + "&tablename=" + masterBean.getFormTable().getTableName() + "&updatefield=" + masterBean.getFormTable().getFieldBeanByDisplay("盖章后合同附件").getColumnName() + "&statusfield=" + masterBean.getFormTable().getFieldBeanByDisplay("签署状态").getColumnName() + "_" + enumId;
String signCallBackUrl = configProvider.getBizConfigByKey(RentConstants.OA_HOST) + "/seeyon/esigncallback.do?method=callback&formId=" + formId + "&tablename=" + masterBean.getFormTable().getTableName() + "&updatefield=" + masterBean.getFormTable().getFieldBeanByDisplay("盖章后合同附件").getColumnName()
+ "&statusfield=" + masterBean.getFormTable().getFieldBeanByDisplay("签署状态").getColumnName() + "_" + enumId + "&xId=" + appId;;
Map<String, Object> config = new HashMap<>();
config.put("signFlowTitle", contractName);
config.put("autoFinish", true);
@@ -101,8 +108,8 @@ public class EsignMultipleSignerNode extends ACommonSuperNode {
return config;
}
private List<Signer> buildSigners(FormDataVo formDataVo, String fileId) throws Exception {
List<Object> positions = uploadFileService.getSignPosition(fileId);
private List<Signer> buildSigners(String appId,FormDataVo formDataVo, String fileId) throws Exception {
List<Object> positions = uploadFileService.getSignPosition(appId,fileId);
List<SignFieldPosition> bPositions = extractPosition(positions, configProvider.getBizConfigByKey(RentConstants.bSignPositionKeyword));
List<SignFieldPosition> aPositions = extractPosition(positions, configProvider.getBizConfigByKey(RentConstants.aSignPositionKeyword));
List<SignFieldPosition> lpPositions = extractPosition(positions, configProvider.getBizConfigByKey(RentConstants.lpSignPositionKeyword));
@@ -154,13 +161,13 @@ public class EsignMultipleSignerNode extends ACommonSuperNode {
}
}
private Map<String, Object> buildSignParams(FormDataVo formDataVo, FormDataMasterBean formDataMasterBean, boolean byFile) throws Exception {
private Map<String, Object> buildSignParams(String appId,FormDataVo formDataVo, FormDataMasterBean formDataMasterBean, boolean byFile) throws Exception {
log.info("开始构建签署方参数");
String fileId = null;
if (byFile) {
String attachmentId = getStringField(formDataVo, CONTRACT_ATTACHMENT_FIELD);
if (attachmentId == null) throw new RuntimeException("合同附件不能为空");
fileId = uploadFileService.uploadFileToEsign(attachmentId);
fileId = uploadFileService.uploadFileToEsign(appId,attachmentId);
if(fileId == null) {
throw new RuntimeException("合同附件上传E签宝失败");
}
@@ -171,8 +178,8 @@ public class EsignMultipleSignerNode extends ACommonSuperNode {
Thread.sleep(1000);
List<Object> docs = new ArrayList<>();
docs.add(docMap);
Map<String, Object> signFlowConfig = buildSignFlowConfig(formDataVo, formDataMasterBean);
List<Signer> signers = buildSigners(formDataVo, fileId);
Map<String, Object> signFlowConfig = buildSignFlowConfig(appId,formDataVo, formDataMasterBean);
List<Signer> signers = buildSigners(appId,formDataVo, fileId);
Map<String, Object> signParams = new HashMap<>();
signParams.put("signFlowConfig", signFlowConfig);
signParams.put("signers", signers);

View File

@@ -16,6 +16,7 @@ import com.seeyon.apps.src_rent.po.SignFieldPosition;
import com.seeyon.apps.src_rent.po.Signer;
import com.seeyon.apps.src_rent.service.EsignByTemplateService;
import com.seeyon.apps.src_rent.service.EsignByUploadFileService;
import com.seeyon.apps.src_rent.service.TokenCacheManager;
import com.seeyon.cap4.form.bean.FormDataMasterBean;
import com.seeyon.cap4.form.bean.FormFieldBean;
import com.seeyon.cap4.form.service.CAP4FormManager;
@@ -43,6 +44,7 @@ public class EsignOneSignerNode extends ACommonSuperNode {
private EsignByUploadFileService uploadFileService = (EsignByUploadFileService) AppContext.getBean("qcEsignByUploadFileService");
private EsignByTemplateService templateService = (EsignByTemplateService) AppContext.getBean("qcEsignByTemplateService");
private OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager");
private TokenCacheManager tokenCacheManager = (TokenCacheManager) AppContext.getBean("qcTokenCacheManager");
@Override
public String getPluginId() {
@@ -61,10 +63,15 @@ public class EsignOneSignerNode extends ACommonSuperNode {
log.info("进入 E签宝单方签署集成超级节点");
try {
Map<String, Object> signParams = buildSignParams(formDataVo, formDataMasterBean, true);
String appId = null;
FieldDataVo signOrgData = formDataVo.getFieldData("签订单位");
if(signOrgData != null) {
appId = tokenCacheManager.getAppIdByOrgName(signOrgData.getStringValue());
}
Map<String, Object> signParams = buildSignParams(appId,formDataVo, formDataMasterBean, true);
if (signParams == null) throw new RuntimeException("签署参数构建失败");
EsignParamRecordUtils.saveEsignParamRecord(signParams);
String esignFlowId = templateService.createBySignTemplate(signParams);
String esignFlowId = templateService.createBySignTemplate(signParams,appId);
log.info("E签宝签署流程ID: " + esignFlowId + " , OA超级节点ID" + formDataVo.getToken());
log.info("E签宝单方签署合同已发送: " + esignFlowId);
formDataVo.getNewFieldDataMap().put("电子签合同流程ID", esignFlowId);
@@ -76,12 +83,13 @@ public class EsignOneSignerNode extends ACommonSuperNode {
}
}
private Map<String, Object> buildSignFlowConfig(FormDataVo formDataVo,FormDataMasterBean masterBean) throws Exception {
private Map<String, Object> buildSignFlowConfig(String appId,FormDataVo formDataVo,FormDataMasterBean masterBean) throws Exception {
String contractName = getStringField(formDataVo, CONTRACT_NAME_FIELD);
if (contractName == null) throw new RuntimeException("合同名称不能为空");
String formId = formDataVo.getToken() +"_" + formDataVo.getId();
Long enumId = masterBean.getFormTable().getFieldBeanByDisplay("签署状态").getEnumId();
String signCallBackUrl = configProvider.getBizConfigByKey(RentConstants.OA_HOST) + "/seeyon/esigncallback.do?method=callback&formId=" + formId + "&tablename=" + masterBean.getFormTable().getTableName() + "&updatefield=" + masterBean.getFormTable().getFieldBeanByDisplay("盖章后合同附件").getColumnName() + "&statusfield=" + masterBean.getFormTable().getFieldBeanByDisplay("签署状态").getColumnName() + "_" + enumId;
String signCallBackUrl = configProvider.getBizConfigByKey(RentConstants.OA_HOST) + "/seeyon/esigncallback.do?method=callback&formId=" + formId + "&tablename=" + masterBean.getFormTable().getTableName() + "&updatefield=" + masterBean.getFormTable().getFieldBeanByDisplay("盖章后合同附件").getColumnName() + "&statusfield="
+ masterBean.getFormTable().getFieldBeanByDisplay("签署状态").getColumnName() + "_" + enumId + "&xId=" + appId;
Map<String, Object> config = new HashMap<>();
config.put("signFlowTitle", contractName);
config.put("autoFinish", true);
@@ -95,7 +103,7 @@ public class EsignOneSignerNode extends ACommonSuperNode {
return config;
}
private List<Signer> buildOnlyASigner(FormDataVo formDataVo, String fileId) throws Exception {
private List<Signer> buildOnlyASigner(String appId,FormDataVo formDataVo, String fileId) throws Exception {
SignFieldPosition aQiFengposition = new SignFieldPosition();
aQiFengposition.setAcrossPageMode("ALL");
@@ -115,7 +123,7 @@ public class EsignOneSignerNode extends ACommonSuperNode {
throw new RuntimeException("甲方签署经办人为空");
}
String psnMobile = getStringField(formDataVo,"甲方签署经办人联系方式");
String orgName = configProvider.getBizConfigByKey(RentConstants.UNITNAME);
String orgName = tokenCacheManager.getOrgNameByAppId(appId);
List<SignFieldPosition> pos = new ArrayList<>();
Signer aSigner = createOrgSigner(
fileId,orgName, pos, null, null, null, psnMobile, psnName, null,false
@@ -129,13 +137,13 @@ public class EsignOneSignerNode extends ACommonSuperNode {
return signers;
}
private Map<String, Object> buildSignParams(FormDataVo formDataVo, FormDataMasterBean formDataMasterBean, boolean byFile) throws Exception {
private Map<String, Object> buildSignParams(String appId,FormDataVo formDataVo, FormDataMasterBean formDataMasterBean, boolean byFile) throws Exception {
log.info("开始构建签署方参数");
String fileId = null;
if (byFile) {
String attachmentId = getStringField(formDataVo, CONTRACT_ATTACHMENT_FIELD);
if (attachmentId == null) throw new RuntimeException("合同附件不能为空");
fileId = uploadFileService.uploadFileToEsign(attachmentId);
fileId = uploadFileService.uploadFileToEsign(appId,attachmentId);
if(fileId == null) {
throw new RuntimeException("合同附件上传E签宝失败");
}
@@ -146,8 +154,8 @@ public class EsignOneSignerNode extends ACommonSuperNode {
docMap.put("fileId", fileId);
List<Object> docs = new ArrayList<>();
docs.add(docMap);
Map<String, Object> signFlowConfig = buildSignFlowConfig(formDataVo, formDataMasterBean);
List<Signer> signers = buildOnlyASigner(formDataVo, fileId);
Map<String, Object> signFlowConfig = buildSignFlowConfig(appId,formDataVo, formDataMasterBean);
List<Signer> signers = buildOnlyASigner(appId,formDataVo, fileId);
Map<String, Object> signParams = new HashMap<>();
signParams.put("signFlowConfig", signFlowConfig);
signParams.put("signers", signers);

View File

@@ -15,16 +15,17 @@ import java.util.Map;
public class EsignAuthService {
private RentConfigProvider configProvider = (RentConfigProvider) AppContext.getBean("rentConfigProvider");
private TokenCacheManager tokenCacheManager = (TokenCacheManager) AppContext.getBean("qcTokenCacheManager");
public void personAuth(Map<String,Object> authParams) throws Exception {
public void personAuth(Map<String,Object> authParams,String appId) throws Exception {
EsignApiHeader esignApiHeader = EsignApiHeader.build();
String jsonBody = JsonUtils.toJSONString(authParams);
esignApiHeader.appId(configProvider.getBizConfigByKey(RentConstants.APP_ID))
esignApiHeader.appId(appId)
.httpMethod("POST")
.heads("")
.pathAndParameters(EsignApiUrl.PERSON_AUTH_URL)
.contentMD5(jsonBody)
.signature(configProvider.getBizConfigByKey(RentConstants.APP_SECRET));
.signature(tokenCacheManager.getSecretByAppId(appId));
String url = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + EsignApiUrl.PERSON_AUTH_URL;
String respStr = HttpClient.httpPostRaw(url, jsonBody, esignApiHeader.convert2Headers(), "UTF-8");
EsignBaseResp esignBaseResp = JsonUtils.parseObject(respStr, EsignBaseResp.class);

View File

@@ -35,10 +35,10 @@ public class EsignByTemplateService {
}
}
public String createBySignTemplate(Map<String,Object> params) throws Exception {
public String createBySignTemplate(Map<String,Object> params,String appId) throws Exception {
EsignApiHeader esignApiHeader = EsignApiHeader.build();
String jsonBody = JsonCleaner.removeEmptyObjects(JsonUtils.toJSONString(params));
esignApiHeader.token(tokenCacheManager.getToken()).appId(configProvider.getBizConfigByKey(RentConstants.APP_ID));
esignApiHeader.token(tokenCacheManager.getToken(appId)).appId(appId);
String url = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + EsignApiUrl.SIGN_BY_FILE_URL;
log.info("合同发起入参: " + jsonBody);
String respStr = HttpClient.httpPostRaw(url, jsonBody, esignApiHeader.convert2Headers(), "UTF-8");

View File

@@ -11,6 +11,7 @@ import com.seeyon.apps.src_rent.utils.FileUtil;
import com.seeyon.apps.src_rent.utils.HttpClient;
import com.seeyon.ctp.common.AppContext;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.FileInputStream;
@@ -27,10 +28,10 @@ public class EsignByUploadFileService {
protected TokenCacheManager tokenCacheManager = (TokenCacheManager) AppContext.getBean("qcTokenCacheManager");
public Map<String,Object> getDownloadFileInfo(String flowId) throws Exception {
public Map<String,Object> getDownloadFileInfo(String flowId,String appId) throws Exception {
String reqPath = EsignApiUrl.CONTRACT_DOWNLOAD_URL.replace("{signFlowId}", flowId);
String getDownloadUrl = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + reqPath;
EsignApiHeader esignApiHeader = EsignApiHeader.build().appId(configProvider.getBizConfigByKey(RentConstants.APP_ID)).token(tokenCacheManager.getToken());
EsignApiHeader esignApiHeader = EsignApiHeader.build().appId(appId).token(tokenCacheManager.getToken(appId));
String respStr = HttpClient.httpGet(getDownloadUrl, esignApiHeader.convert2Headers(), null);
EsignBaseResp esignBaseResp = JsonUtils.parseObject(respStr, EsignBaseResp.class);
if(esignBaseResp.getCode() != 0 || esignBaseResp.getData() == null){
@@ -45,11 +46,11 @@ public class EsignByUploadFileService {
return fileInfo;
}
public GetUploadUrlResp getUploadFileUrl(String fileName, String fileMd5, Long fileSize, boolean convert2Pdf) throws Exception {
public GetUploadUrlResp getUploadFileUrl(String appId,String fileName, String fileMd5, Long fileSize, boolean convert2Pdf) throws Exception {
String url = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + EsignApiUrl.GET_UPLOAD_FILE_URL;
GetUploadUrlResp resp = new GetUploadUrlResp();
EsignApiHeader esignApiHeader = EsignApiHeader.build().appId(configProvider.getBizConfigByKey(RentConstants.APP_ID));
esignApiHeader.token(tokenCacheManager.getToken());
EsignApiHeader esignApiHeader = EsignApiHeader.build().appId(appId);
esignApiHeader.token(tokenCacheManager.getToken(appId));
EsignFileUploadParams params = new EsignFileUploadParams();
params.setFileName(fileName);
params.setContentMd5(fileMd5);
@@ -70,17 +71,29 @@ public class EsignByUploadFileService {
}
public List<Object> getSignPosition(String fileId) throws Exception {
public List<Object> getSignPosition(String appId,String fileId) throws Exception {
String reqPath = EsignApiUrl.SIGN_POSITION_URL.replace("{fileId}", fileId);
String url = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + reqPath;
EsignApiHeader esignApiHeader = EsignApiHeader.build().appId(configProvider.getBizConfigByKey(RentConstants.APP_ID));
EsignApiHeader esignApiHeader = EsignApiHeader.build().appId(appId);
List<String> keywords = new ArrayList<>();
keywords.add(configProvider.getBizConfigByKey(RentConstants.bSignPositionKeyword));
keywords.add(configProvider.getBizConfigByKey(RentConstants.aSignPositionKeyword));
keywords.add(configProvider.getBizConfigByKey(RentConstants.lpSignPositionKeyword));
String aSignPosKeyword = configProvider.getBizConfigByKey(RentConstants.aSignPositionKeyword);
String bSignPosKeyword = configProvider.getBizConfigByKey(RentConstants.bSignPositionKeyword);
String lpSignPosKeyword = configProvider.getBizConfigByKey(RentConstants.lpSignPositionKeyword);
if(StringUtils.isNotBlank(aSignPosKeyword)){
keywords.add(aSignPosKeyword);
}
if(StringUtils.isNotBlank(bSignPosKeyword)){
keywords.add(bSignPosKeyword);
}
if(StringUtils.isNotBlank(lpSignPosKeyword)) {
keywords.add(lpSignPosKeyword);
}
Map<String,Object> params = new HashMap<>();
if(keywords.isEmpty()) {
return new ArrayList<>();
}
params.put("keywords",keywords);
esignApiHeader.token(tokenCacheManager.getToken());
esignApiHeader.token(tokenCacheManager.getToken(appId));
String respStr = HttpClient.httpPostRaw(url,JsonUtils.toJSONString(params),esignApiHeader.convert2Headers(),null);
Map map = JsonUtils.parseObject(respStr, Map.class);
Map<String,Object> data = (Map<String,Object>) map.get("data");
@@ -92,7 +105,7 @@ public class EsignByUploadFileService {
return resList;
}
public String uploadFileToEsign(String refId) throws Exception {
public String uploadFileToEsign(String appId,String refId) throws Exception {
String tempDir = System.getProperty("java.io.tmpdir");
File file = null;
FileUtil fileUtil = new FileUtil();
@@ -100,7 +113,7 @@ public class EsignByUploadFileService {
List<String> paths = fileUtil.fieldFileDownload(Long.parseLong(refId), tempDir + File.separator + "oafile" + File.separator);
file = new File(paths.get(0));
String contentMD5 = EsignByUploadFileService.getFileContentMD5(paths.get(0));
GetUploadUrlResp uploadResp = getUploadFileUrl(file.getName(), contentMD5, file.length(),true);
GetUploadUrlResp uploadResp = getUploadFileUrl(appId,file.getName(), contentMD5, file.length(),true);
uploadFile(uploadResp.getFileUploadUrl(), contentMD5, file.getName(), paths.get(0));
return uploadResp.getFileId();
}finally {

View File

@@ -26,12 +26,12 @@ public class EsignFileTemplateService {
private String getOrgId(String appId) {
EsignApiHeader esignApiHeader = EsignApiHeader.build();
try {
esignApiHeader.token(tokenCacheManager.getToken()).appId(appId);
esignApiHeader.token(tokenCacheManager.getToken(appId)).appId(appId);
} catch (Exception e) {
e.printStackTrace();
}
//获取orgId
String queryStr = EsignApiUrl.QUERY_ORGINFO + "?orgName=" + configProvider.getBizConfigByKey(RentConstants.UNITNAME);
String queryStr = EsignApiUrl.QUERY_ORGINFO + "?orgName=" + tokenCacheManager.getOrgNameByAppId(appId);
String reqUrl = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + queryStr;
String orgInfoRespStr = HttpClient.httpGet(reqUrl, esignApiHeader.convert2Headers(), "UTF-8");
EsignBaseResp orgInfoResp = JsonUtils.parseObject(orgInfoRespStr, EsignBaseResp.class);
@@ -77,7 +77,7 @@ public class EsignFileTemplateService {
//获取模板详细信息
public Map<String,Object> getTemplateDetail(String appId,String signTemplateId,String orgId) {
String url = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + EsignApiUrl.QUERY_TEMPLATE_DETAIL_URL + "?" +"orgId=" + orgId + "&signTemplateId=" + signTemplateId;
EsignApiHeader apiHeader = EsignApiHeader.build().token(tokenCacheManager.getToken()).appId(appId);
EsignApiHeader apiHeader = EsignApiHeader.build().token(tokenCacheManager.getToken(appId)).appId(appId);
String resp = HttpClient.httpGet(url, apiHeader.convert2Headers(), "UTF-8");
EsignBaseResp esignBaseResp = JsonUtils.parseObject(resp, EsignBaseResp.class);
Map<String,Object> data = (Map<String, Object>) esignBaseResp.getData();
@@ -87,7 +87,7 @@ public class EsignFileTemplateService {
public Map<String,Object> queryTemplates(Integer pageNo,String appId) throws Exception {
EsignApiHeader esignApiHeader = EsignApiHeader.build().appId(appId);
String queryStr = EsignApiUrl.QUERY_TEMPLATES_URL + "?" + "orgId=" + obtainOrgId(appId) + "&pageNum=" + pageNo + "&pageSize=" + 20 + "&status=" + 1;
esignApiHeader.token(tokenCacheManager.getToken());
esignApiHeader.token(tokenCacheManager.getToken(appId));
String url = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + queryStr;
String templateListRespStr = HttpClient.httpGet(url, esignApiHeader.convert2Headers(), "UTF-8");
EsignBaseResp templateListResp = JsonUtils.parseObject(templateListRespStr, EsignBaseResp.class);
@@ -101,15 +101,15 @@ public class EsignFileTemplateService {
}
public String getCompareDetailUrl(String appId,String templateRefId,String contractRefId) throws Exception {
String templateFileId = uploadFileService.uploadFileToEsign(templateRefId);
String contractFileId = uploadFileService.uploadFileToEsign(contractRefId);
String templateFileId = uploadFileService.uploadFileToEsign(appId,templateRefId);
String contractFileId = uploadFileService.uploadFileToEsign(appId,contractRefId);
String url = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + EsignApiUrl.CONTRACT_COMPARE_GETURL;
Map<String,String> params = new HashMap<>();
params.put("standardFileId",templateFileId);
params.put("comparativeFileId",contractFileId);
String jsonString = JsonUtils.toJSONString(params);
EsignApiHeader esignApiHeader = EsignApiHeader.build().appId(appId);
esignApiHeader.token(tokenCacheManager.getToken());
esignApiHeader.token(tokenCacheManager.getToken(appId));
String respStr = HttpClient.httpPostRaw(url, jsonString, esignApiHeader.convert2Headers(), null);
EsignBaseResp esignBaseResp = JsonUtils.parseObject(respStr, EsignBaseResp.class);
log.info("调用获取合同比对链接接口返回值: " + JsonUtils.toJSONString(esignBaseResp));

View File

@@ -29,6 +29,7 @@ public class SealService {
private static final Log log = LogFactory.getLog(SealService.class);
private RentConfigProvider configProvider = (RentConfigProvider) AppContext.getBean("rentConfigProvider");
private FormFactory formFactory;
private TokenCacheManager tokenCacheManager = (TokenCacheManager) AppContext.getBean("qcTokenCacheManager");
public FormFactory getFormFactory() {
if (formFactory == null) {
@@ -37,9 +38,9 @@ public class SealService {
return formFactory;
}
public void grantSeal(Map<String, Object> params) throws Exception {
public void grantSeal(String appId,Map<String, Object> params) throws Exception {
JsonObject reqParams = new JsonObject();
String sealId = getSealId((String) params.get("orgId"), (String) params.get("sealName"));
String sealId = getSealId(appId,(String) params.get("orgId"), (String) params.get("sealName"));
reqParams.put("sealId", sealId);
List<String> authorizedPsnIds = new ArrayList<>();
authorizedPsnIds.add((String) params.get("accountId"));
@@ -52,27 +53,27 @@ public class SealService {
sealAuthScope.put("templateIds", templateIds);
reqParams.put("sealAuthScope", sealAuthScope);
EsignApiHeader esignApiHeader = EsignApiHeader.build();
esignApiHeader.appId(configProvider.getBizConfigByKey(RentConstants.APP_ID))
esignApiHeader.appId(appId)
.httpMethod("POST")
.heads("")
.pathAndParameters(EsignApiUrl.SEAL_GRANT_URL)
.contentMD5(reqParams.toString())
.signature(configProvider.getBizConfigByKey(RentConstants.APP_SECRET));
.signature(tokenCacheManager.getSecretByAppId(appId));
String url = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + EsignApiUrl.SEAL_GRANT_URL;
HttpClient.httpPostRaw(url, reqParams.toString(), esignApiHeader.convert2Headers(), null);
}
private String getSealId(String orgId, String sealName) throws Exception {
private String getSealId(String appId,String orgId, String sealName) throws Exception {
String host = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST);
int pageNo = 1;
int pageSize = 20;
EsignApiHeader esignApiHeader = EsignApiHeader.build();
esignApiHeader.appId(configProvider.getBizConfigByKey(RentConstants.APP_ID))
esignApiHeader.appId(appId)
.httpMethod("GET")
.heads("")
.pathAndParameters(EsignApiUrl.SEAL_QUERY_URL + "?" + HttpClient.sortQueryString("orgId=" + orgId + "&pageNo=" + pageNo + "&pageSize=" + pageSize))
.contentMD5("")
.signature(configProvider.getBizConfigByKey(RentConstants.APP_SECRET));
.signature(tokenCacheManager.getSecretByAppId(appId));
String url = host + EsignApiUrl.SEAL_QUERY_URL + "?orgId=" + orgId + "&pageNo=" + pageNo + "&pageSize=" + pageSize;
String respStr = HttpClient.httpGet(url, esignApiHeader.convert2Headers(), "UTF-8");
EsignBaseResp esignBaseResp = JsonUtils.parseObject(respStr, EsignBaseResp.class);

View File

@@ -27,7 +27,7 @@ public class SignLinkService {
private RentConfigProvider configProvider = (RentConfigProvider) AppContext.getBean("rentConfigProvider");
private TokenCacheManager tokenCacheManager = (TokenCacheManager) AppContext.getBean("qcTokenCacheManager");
public void saveGetLinkParam(FormDataVo formDataVo, FormDataMasterBean formDataMasterBean,String eFlowId) {
public void saveGetLinkParam(String appId,FormDataVo formDataVo, FormDataMasterBean formDataMasterBean,String eFlowId) {
try {
String bSignerType = formDataVo.getFieldData("乙方签署类型").getStringValue();
String psnAccount = null;
@@ -44,7 +44,7 @@ public class SignLinkService {
param.put("signFlowId",eFlowId);
param.put("operator",operator);
String paramStr = JsonUtils.toJSONString(param);
saveDb(paramStr,eFlowId,contractNo);
saveDb(paramStr,eFlowId,appId,contractNo);
}catch (Exception e) {
log.error(e.getMessage(),e);
}
@@ -65,8 +65,8 @@ public class SignLinkService {
}
}
private void saveDb(String jsonStr,String eFlowId,String contractNo) {
String sqlInsert = "insert into SIGN_LINK_PARAM (id,param,eFlowId,contractNo) values (?,?,?,?)";
private void saveDb(String jsonStr,String eFlowId,String appId,String contractNo) {
String sqlInsert = "insert into SIGN_LINK_PARAM (id,param,eFlowId,contractNo,appId) values (?,?,?,?,?)";
String sqlQuery = "select * FROM SIGN_LINK_PARAM where contractNo = ?";
String sqlUpdate = "update SIGN_LINK_PARAM set param = ?,eFlowId = ? where id = ?";
JDBCAgent jdbcAgent = new JDBCAgent();
@@ -83,6 +83,7 @@ public class SignLinkService {
param.add(jsonStr);
param.add(eFlowId);
param.add(contractNo);
param.add(appId);
jdbcAgent.execute(sqlInsert,param);
}else {
param.clear();
@@ -110,12 +111,13 @@ public class SignLinkService {
if(list.size() > 0) {
Map<String,Object> tempMap = (Map<String, Object>) list.get(0);
String paramStr = (String)tempMap.get("param");
if(!checkContractVaild(eFlowId)) {
String appId = (String)tempMap.get("appid");
if(!checkContractVaild(eFlowId,appId)) {
throw new RuntimeException("当前合同无效");
}
String url = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + EsignApiUrl.SIGN_LINK_GET_URL.replace("{signFlowId}",eFlowId);
EsignApiHeader esignApiHeader = EsignApiHeader.build();
esignApiHeader.token(tokenCacheManager.getToken()).appId(configProvider.getBizConfigByKey(RentConstants.APP_ID));
esignApiHeader.token(tokenCacheManager.getToken(appId)).appId(appId);
String respStr = HttpClient.httpPostRaw(url, paramStr,esignApiHeader.convert2Headers(), "UTF-8");
EsignBaseResp esignBaseResp = JsonUtils.parseObject(respStr, EsignBaseResp.class);
Map<String,Object> dataMap = (Map<String, Object>) esignBaseResp.getData();
@@ -134,9 +136,9 @@ public class SignLinkService {
return null;
}
private boolean checkContractVaild(String eFlowId) {
private boolean checkContractVaild(String eFlowId,String appId) {
EsignApiHeader esignApiHeader = EsignApiHeader.build();
esignApiHeader.token(tokenCacheManager.getToken()).appId(configProvider.getBizConfigByKey(RentConstants.APP_ID));
esignApiHeader.token(tokenCacheManager.getToken(appId)).appId(appId);
String url = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + EsignApiUrl.SIGN_FLOW_QUERY.replace("{signFlowId}",eFlowId);
String respStr = HttpClient.httpGet(url, esignApiHeader.convert2Headers(), "UTF-8");
EsignBaseResp esignBaseResp = JsonUtils.parseObject(respStr, EsignBaseResp.class);

View File

@@ -10,34 +10,29 @@ import com.seeyon.apps.src_rent.po.EsignToken;
import com.seeyon.apps.src_rent.utils.HttpClient;
import com.seeyon.ctp.common.AppContext;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
public class TokenCacheManager {
private RentConfigProvider configProvider = (RentConfigProvider) AppContext.getBean("rentConfigProvider");
private final AtomicReference<EsignToken> tokenRef = new AtomicReference<>();
private final ConcurrentHashMap<String, EsignToken> tokenRef = new ConcurrentHashMap<>();
private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
private static final long CHECK_INTERVAL = 2 * 60 * 60 * 1000; // 120分钟检查一次
public TokenCacheManager() {
// 启动定期检查任务
scheduler.scheduleAtFixedRate(this::checkTokenExpiry,
CHECK_INTERVAL, CHECK_INTERVAL, TimeUnit.MILLISECONDS);
}
private boolean checkExpired(String token) {
private boolean checkExpired(String token,String appId) {
EsignApiHeader esignApiHeader = EsignApiHeader.build();
try {
esignApiHeader.token(token).appId(configProvider.getBizConfigByKey(RentConstants.APP_ID));
esignApiHeader.token(token).appId(appId);
} catch (Exception e) {
e.printStackTrace();
}
//获取orgId
String queryStr = EsignApiUrl.QUERY_ORGINFO + "?orgName=" + configProvider.getBizConfigByKey(RentConstants.UNITNAME);
String queryStr = EsignApiUrl.QUERY_ORGINFO + "?orgName=" + getOrgNameByAppId(appId);
String reqUrl = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + queryStr;
String orgInfoRespStr = HttpClient.httpGet(reqUrl, esignApiHeader.convert2Headers(), "UTF-8");
EsignBaseResp orgInfoResp = JsonUtils.parseObject(orgInfoRespStr, EsignBaseResp.class);
@@ -46,35 +41,35 @@ public class TokenCacheManager {
}
return false;
}
public String getToken() {
EsignToken current = tokenRef.get();
if (current != null && !checkExpired(current.getTokenStr())) {
public String getToken(String appId) {
EsignToken current = tokenRef.get(appId);
if (current != null && !checkExpired(current.getTokenStr(),appId)) {
return current.getTokenStr();
}
return refreshToken();
return refreshToken(appId);
}
private String refreshToken() {
EsignToken newToken = fetchNewToken();
tokenRef.set(newToken);
private String refreshToken(String appId) {
EsignToken newToken = fetchNewToken(appId);
tokenRef.put(appId,newToken);
return newToken.getTokenStr();
}
private void checkTokenExpiry() {
EsignToken current = tokenRef.get();
private void checkTokenExpiry(String appId) {
EsignToken current = tokenRef.get(appId);
if (current != null && isTokenExpired(current)) {
refreshToken();
refreshToken(appId);
}
}
private boolean isTokenExpired(EsignToken token) {
return System.currentTimeMillis() >= token.getTtl();
}
private EsignToken fetchNewToken() {
private EsignToken fetchNewToken(String appId) {
// 实际获取token的逻辑
String queryStr = "?appId=" + configProvider.getBizConfigByKey(RentConstants.APP_ID) + "&secret=" + configProvider.getBizConfigByKey(RentConstants.APP_SECRET) + "&grantType=client_credentials";
String queryStr = "?appId=" + appId + "&secret=" + getSecretByAppId(appId) + "&grantType=client_credentials";
String url = configProvider.getBizConfigByKey(RentConstants.ESIGN_HOST) + EsignApiUrl.TOKEN_GET_URL + queryStr;
String respStr = HttpClient.httpGet(url, null, null);
EsignBaseResp esignBaseResp = JsonUtils.parseObject(respStr, EsignBaseResp.class);
@@ -91,9 +86,37 @@ public class TokenCacheManager {
esignToken.setRefreshToken(refreshToken);
return esignToken;
}
public void shutdown() {
scheduler.shutdown();
}
public String getOrgNameByAppId(String appId) {
String configMap = configProvider.getBizConfigByKey(RentConstants.ESIGN_APP_UNITMAP);
Map<String,String> map = JsonUtils.parseObject(configMap, Map.class);
return map.get(appId);
}
public String getSecretByAppId(String appId) {
String configMap = configProvider.getBizConfigByKey(RentConstants.ESIGN_APP_SECRETMAP);
Map<String,String> map = JsonUtils.parseObject(configMap, Map.class);
return map.get(appId);
}
public String getAppIdByOrgName(String orgName) {
String configMap = configProvider.getBizConfigByKey(RentConstants.ESIGN_APP_UNITMAP);
Map<String,String> map = JsonUtils.parseObject(configMap, Map.class);
for (String key : map.keySet()) {
if(map.get(key).equals(orgName)) {
return key;
}
}
return null;
}
public List<String> getAppIds() {
String configMap = configProvider.getBizConfigByKey(RentConstants.ESIGN_APP_SECRETMAP);
Map<String,String> map = JsonUtils.parseObject(configMap, Map.class);
return map.keySet().stream().collect(Collectors.toList());
}
}

View File

@@ -1,6 +1,5 @@
package com.seeyon.apps.src_rent.service;
import org.springframework.stereotype.Service;
public class WeAppContractSyncService {

View File

@@ -4,6 +4,7 @@ import cn.hutool.log.Log;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.src_rent.bill.BillService;
import com.seeyon.apps.src_rent.bill.FeeRecordService;
import com.seeyon.apps.src_rent.bill.MarginBillService;
import com.seeyon.apps.src_rent.bill.WaeBillService;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.rest.resources.BaseResource;
@@ -13,6 +14,7 @@ import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.util.Date;
/**
@@ -26,6 +28,7 @@ public class BillResource extends BaseResource {
private BillService billService = (BillService) AppContext.getBean("qcBillService");
private WaeBillService waeBillService = (WaeBillService) AppContext.getBean("qcWaeBillService");
private FeeRecordService feeRecordService = (FeeRecordService) AppContext.getBean("qcFeeRecordService");
private MarginBillService marginBillService = (MarginBillService) AppContext.getBean("qcMarginBillService");
@POST
@Path("/contractBill/queryPage")
@@ -40,6 +43,21 @@ public class BillResource extends BaseResource {
return fail(e.getMessage());
}
}
@POST
@Path("/unpaidMargin/queryPage")
@Produces({"application/json"})
@Consumes({"application/json"})
public Response cunpaidMarginQueryPage(JSONObject params) throws IOException {
log.info("分页查询保证金账单信息参数为:"+params);
try{
return success(marginBillService.pageQuery(params));
} catch (Exception e) {
log.error(e.getMessage(),e);
return fail(e.getMessage());
}
}
@POST
@Path("/payRecord/queryPage")
@Produces({"application/json"})
@@ -68,15 +86,17 @@ public class BillResource extends BaseResource {
}
}
@GET
@POST
@Path("/pay/callback")
@Produces({"application/json"})
public Response onlinePayCallback(@Context HttpServletRequest request) throws IOException {
String billNo = request.getParameter("billNo");
String bizType = request.getParameter("bizType");
log.info("支付回调信息参数为:"+ billNo +"," + bizType);
@Consumes({"application/json"})
public Response onlinePayCallback(JSONObject params) throws IOException {
String billNo = params.getString("billNo");
String bizType = params.getString("bizType");
String payDate = params.getString("payDate");
log.info("支付回调信息参数为:"+ billNo +"," + bizType + "," + payDate);
try{
feeRecordService.payCallBack(billNo,bizType);
feeRecordService.payCallBack(billNo,bizType,payDate);
return this.success("回调处理成功");
} catch (Exception e) {
log.error(e.getMessage(),e);
@@ -99,6 +119,21 @@ public class BillResource extends BaseResource {
}
}
@POST
@Path("/countUnpay/margin")
@Produces({"application/json"})
@Consumes({"application/json"})
public Response countUnpaidRentMargin(JSONObject params) throws IOException {
log.info("统计待缴保证金账单数量:" + params, new Object[0]);
try {
return this.success(marginBillService.countUnpay(params));
} catch (Exception e) {
log.error(e.getMessage(), new Object[]{e});
return this.fail(e.getMessage());
}
}
@POST
@Path("/countUnpay/wae")
@Produces({"application/json"})
@@ -124,8 +159,10 @@ public class BillResource extends BaseResource {
String bizType = params.getString("bizType");
if("rent".equals(bizType)){
return this.success(billService.getBillPayReceiver(params.getString("billNo")));
}else {
}else if("wae".equals(bizType)){
return this.success(waeBillService.getBillPayReceiver(params.getString("billNo")));
}else {
return this.success(marginBillService.getBillPayReceiver(params.getString("billNo")));
}
} catch (Exception e) {
log.error(e.getMessage(), new Object[]{e});

View File

@@ -32,7 +32,7 @@ public class CustomerMatchResource extends BaseResource {
try{
log.info("匹配个人客商参数为:" + params);
Customer customer = new Customer();
customer.setCusPhone(params.getString("phone"));
customer.setCardNo(params.getString("cardNo"));
String cusNo = customerService.matchCusPerson(customer);
return success(cusNo);
} catch (Exception e) {
@@ -47,6 +47,7 @@ public class CustomerMatchResource extends BaseResource {
@Consumes({"application/json"})
public Response matchOrg(JSONObject params) throws IOException {
try{
log.info("匹配单位客商参数为:" + params);
Customer customer = new Customer();
customer.setOrgNo(params.getString("orgNo"));
return success(customerService.matchCusOrg(customer));

View File

@@ -33,4 +33,5 @@
<bean id="qcContractDocService" class="com.seeyon.apps.src_rent.contract.ContractDocService"/>
<bean id="qcCustomerService" class="com.seeyon.apps.src_rent.cus.CustomerService"/>
<bean id="qcViewRecordService" class="com.seeyon.apps.src_rent.viewrecord.ViewRecordService"/>
<bean id="qcMarginBillService" class="com.seeyon.apps.src_rent.bill.MarginBillService"/>
</beans>