diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/assets/AssetsService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/assets/AssetsService.java index b5b17cc..2718490 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/assets/AssetsService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/assets/AssetsService.java @@ -279,7 +279,7 @@ public class AssetsService { } public Map getAssetsManagerInfo(String assetsNo) throws Exception { - String formNo = configProvider.getBizConfigByKey(RentConstants.ASSETS_INFO_FORMNO); + String formNo = configProvider.getBizConfigByKey(RentConstants.ASSETS_FORMNO); List conditions = new ArrayList<>(); conditions.add(FormWhereCondition.build().display("资产编号").value(assetsNo)); FormColumn formColumn = formDataOperator.queryOneRowFormData(formNo, false, null, conditions); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/BillService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/BillService.java index 5b8dbf5..c8008f1 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/BillService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/BillService.java @@ -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 pageQueryVo = new PageQueryVo(); - List datas = formDataOperator.queryFormDataPageCondition(getFormNo(), true,null, conditions, pageNo, pageSize); + List datas = formDataOperator.queryFormDataPageCondition(getFormNo(), true,null, conditions, pageNo, pageSize,"账单-开始日期",null); List vos = new ArrayList<>(); Long count = formDataOperator.countConditon(getFormNo(), conditions); if(datas.size() > 0){ @@ -175,11 +181,10 @@ public class BillService { return null; } Map 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 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 fieldsMap = formColumn.getFieldsMap(); BigDecimal accountsReceivable = BigDecimal.ZERO; // 初始化实际收款金额(避免null) BigDecimal actualReceipts = BigDecimal.ZERO; BigDecimal rate = new BigDecimal("0.997"); - // 8. 组装子表数据 Map 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 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 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); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/FeeRecordService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/FeeRecordService.java index 4a8ec77..53ebbc0 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/FeeRecordService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/FeeRecordService.java @@ -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)){ + } } } diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/MarginBillService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/MarginBillService.java new file mode 100644 index 0000000..fdb1a74 --- /dev/null +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/MarginBillService.java @@ -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 fieldsMap,String key) { + Object o = fieldsMap.get(key); + if(o == null) { + return null; + } + return o + ""; + } + + private List buildConditions(JSONObject params) { + List 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 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 pageQueryVo = new PageQueryVo(); + List datas = formDataOperator.queryFormDataPageCondition(getFormNo(), true,null, conditions, pageNo, pageSize,"账单开始日期",null); + List vos = new ArrayList<>(); + Long count = formDataOperator.countConditon(getFormNo(), conditions); + if(datas.size() > 0){ + for (Object data : datas) { + Map map = (Map) 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 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 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 map = contractDocService.getContractInfoByContractNo(contractNo); + if(map == null) { + return null; + } + return (String)map.get("合同名称"); + } + + public String getBillPayReceiver(String billNo) throws Exception { + List conditions = new ArrayList<>(); + conditions.add(FormWhereCondition.build().display("单据编号").value(billNo)); + FormColumn formColumn = formDataOperator.queryOneRowFormData(getFormNo(), true, null, conditions); + if(formColumn == null) { + return null; + } + Map 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 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 mainFormData = new HashMap<>(); + Map> subFormDataMap = new HashMap<>(); + List subFormDataList = new ArrayList<>(); + + Map mainData = new HashMap<>(); + mainFormData.put(tableName, mainData); + if (subDbTableName != null) { + log.info("明细表表名为: " + subDbTableName); + subFormDataMap.put(subDbTableName, subFormDataList); + } + + // 6. 查询账单数据 + List 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 fieldsMap = formColumn.getFieldsMap(); + BigDecimal accountsReceivable = BigDecimal.ZERO; + // 初始化实际收款金额(避免null) + BigDecimal actualReceipts = BigDecimal.ZERO; + BigDecimal rate = new BigDecimal("0.997"); + // 8. 组装子表数据 + Map 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 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); + } + + +} diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/WaeBillService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/WaeBillService.java index 13f886c..f3838a4 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/WaeBillService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/bill/WaeBillService.java @@ -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 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 pageQueryVo = new PageQueryVo(); - List datas = formDataOperator.queryFormDataPageCondition(getFormNo(), true,null, conditions, pageNo, pageSize); + List datas = formDataOperator.queryFormDataPageCondition(getFormNo(), true,null, conditions, pageNo, pageSize,"账单开始日期",null); List 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 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 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 conditions = new ArrayList<>(); - conditions.add(FormWhereCondition.build().display("档案编号").value(billNo)); + conditions.add(FormWhereCondition.build().display("唯一标识").value(billNo)); List updateFields = new ArrayList<>(); updateFields.add(FormUpdateField.build().display("缴费状态").value(EnumMapUtils.getMasterTableEnumItemValue(getFormNo(),"缴费状态","结清"))); formDataOperator.updateMasterForm(getFormNo(),updateFields,conditions); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/constants/RentConstants.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/constants/RentConstants.java index c77f54a..c80a655 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/constants/RentConstants.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/constants/RentConstants.java @@ -27,6 +27,7 @@ public enum RentConstants { FORMAPPNAME("","表单应用名称"), FEERECORDFORMNO("","费用收支台账表单编码"), CONTRACTBILLFORMNO("","合同账单表单编码"), + UNPAIDMARGINFORMNO("","履约保证金表单编码"), WAEBILLFORMNO("","水电费账单表单编码"), CUSDOCFORMNO("","客商档案表单编码"), NOTICEFORMNO("","招商公告表单编码"), diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/contract/ContractDocService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/contract/ContractDocService.java index fa0c849..82c7979 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/contract/ContractDocService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/contract/ContractDocService.java @@ -34,6 +34,9 @@ public class ContractDocService { List conditions = new ArrayList<>(); conditions.add(FormWhereCondition.build().display("合同编号").value(contractNo)); FormColumn formColumn = formDataOperator.queryOneRowFormData(formNo, false, null, conditions); + if(formColumn == null) { + return null; + } Map fieldsMap = formColumn.getFieldsMap(); Map map = new HashMap<>(); if(fieldsMap == null) { diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/controller/EsignCallBackController.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/controller/EsignCallBackController.java index bcb62cd..4694f6e 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/controller/EsignCallBackController.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/controller/EsignCallBackController.java @@ -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 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 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); } } diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/cus/CustomerService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/cus/CustomerService.java index 41ea45a..008ddc9 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/cus/CustomerService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/cus/CustomerService.java @@ -21,9 +21,9 @@ public class CustomerService { } public String matchCusPerson(Customer customer) throws Exception { - String phone = customer.getCusPhone(); + String cardNo = customer.getCardNo(); List 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 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 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 formColumnList = formDataOperator.queryFormDataCondition(getFormNo(), null, conditions); if(formColumnList != null && formColumnList.size() > 0){ Map fieldsMap = formColumnList.get(0).getFieldsMap(); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/form/FormDataOperator.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/form/FormDataOperator.java index f94dbfd..3f6a7ce 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/form/FormDataOperator.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/form/FormDataOperator.java @@ -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 queryFormDataPageCondition(String formNo,Boolean changeEnum,List queryColumnVos, List conditionVos,Integer pageNo,Integer pageSize,String orderField,String orderKeyWord) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + List queryColumns = new ArrayList<>(); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + String tableName = masterTableBean.getTableName(); + Map 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 generateSql = generatePageQuerySql(queryColumns, conditionVos, tableName,pageNo,pageSize,orderFieldName,orderKeyWord); + String sql = (String) generateSql.get("sql"); + List params = (List) generateSql.get("params"); + log.info("sql为: " + sql); + log.info("参数为: " + JsonUtils.toJSONString(params)); + JDBCAgent jdbcAgent = new JDBCAgent(); + List columns = new ArrayList<>(); + try { + jdbcAgent.execute(sql, params); + List list = jdbcAgent.resultSetToList(); + for (Object o : list) { + FormColumn column = new FormColumn(); + Map columnMap = (Map) o; + List 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 fieldsMap = column.getFieldsMap(); + columns.add(fieldsMap); + } + + } catch (Exception e) { + log.error(e.getMessage(),e); + } finally { + jdbcAgent.close(); + } + return columns; + } + public List queryFormDataPageCondition(String formNo,Boolean changeEnum,List queryColumnVos, List 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 generateSql = generateSql(queryColumns, conditionVos, tableName,"sort",pageNo,pageSize); + Map generateSql = generateSql(queryColumns, conditionVos, tableName,"sort",null,pageNo,pageSize); String sql = (String) generateSql.get("sql"); List params = (List) generateSql.get("params"); log.info("sql为: " + sql); @@ -625,14 +701,19 @@ public class FormDataOperator { } private Map generateSql(List queryColumn, List conditions, String tableName) { - return generateSql( queryColumn, conditions, tableName,null,null,null); + return generateSql( queryColumn, conditions, tableName,null,null,null,null); } + private Map generatePageQuerySql(List queryColumn, List conditions, String tableName,Integer pageNo,Integer pageSize,String orderField,String orderKeyWord) { + return generateSql( queryColumn, conditions, tableName,orderField,orderKeyWord,pageNo,pageSize); + } + + private Map generatePageQuerySql(List queryColumn, List 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 generateSql(List queryColumn, List conditions, String tableName,String orderField,Integer pageNo,Integer pageSize) { + private Map generateSql(List queryColumn, List 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 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); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/job/SealDocSyncJob.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/job/SealDocSyncJob.java index 54b870d..233fd3b 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/job/SealDocSyncJob.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/job/SealDocSyncJob.java @@ -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 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 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) { diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/node/EsignMultipleSignerNode.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/node/EsignMultipleSignerNode.java index e622d95..e76913b 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/node/EsignMultipleSignerNode.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/node/EsignMultipleSignerNode.java @@ -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 signParams = buildSignParams(formDataVo, formDataMasterBean, true); + String appId = null; + FieldDataVo signOrgData = formDataVo.getFieldData("签订单位"); + if(signOrgData != null) { + appId = tokenCacheManager.getAppIdByOrgName(signOrgData.getStringValue()); + } + Map 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 buildSignFlowConfig(FormDataVo formDataVo,FormDataMasterBean masterBean) throws Exception { + private Map 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 config = new HashMap<>(); config.put("signFlowTitle", contractName); config.put("autoFinish", true); @@ -101,8 +108,8 @@ public class EsignMultipleSignerNode extends ACommonSuperNode { return config; } - private List buildSigners(FormDataVo formDataVo, String fileId) throws Exception { - List positions = uploadFileService.getSignPosition(fileId); + private List buildSigners(String appId,FormDataVo formDataVo, String fileId) throws Exception { + List positions = uploadFileService.getSignPosition(appId,fileId); List bPositions = extractPosition(positions, configProvider.getBizConfigByKey(RentConstants.bSignPositionKeyword)); List aPositions = extractPosition(positions, configProvider.getBizConfigByKey(RentConstants.aSignPositionKeyword)); List lpPositions = extractPosition(positions, configProvider.getBizConfigByKey(RentConstants.lpSignPositionKeyword)); @@ -154,13 +161,13 @@ public class EsignMultipleSignerNode extends ACommonSuperNode { } } - private Map buildSignParams(FormDataVo formDataVo, FormDataMasterBean formDataMasterBean, boolean byFile) throws Exception { + private Map 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 docs = new ArrayList<>(); docs.add(docMap); - Map signFlowConfig = buildSignFlowConfig(formDataVo, formDataMasterBean); - List signers = buildSigners(formDataVo, fileId); + Map signFlowConfig = buildSignFlowConfig(appId,formDataVo, formDataMasterBean); + List signers = buildSigners(appId,formDataVo, fileId); Map signParams = new HashMap<>(); signParams.put("signFlowConfig", signFlowConfig); signParams.put("signers", signers); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/node/EsignOneSignerNode.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/node/EsignOneSignerNode.java index 68b5b83..c296e68 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/node/EsignOneSignerNode.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/node/EsignOneSignerNode.java @@ -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 signParams = buildSignParams(formDataVo, formDataMasterBean, true); + String appId = null; + FieldDataVo signOrgData = formDataVo.getFieldData("签订单位"); + if(signOrgData != null) { + appId = tokenCacheManager.getAppIdByOrgName(signOrgData.getStringValue()); + } + Map 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 buildSignFlowConfig(FormDataVo formDataVo,FormDataMasterBean masterBean) throws Exception { + private Map 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 config = new HashMap<>(); config.put("signFlowTitle", contractName); config.put("autoFinish", true); @@ -95,7 +103,7 @@ public class EsignOneSignerNode extends ACommonSuperNode { return config; } - private List buildOnlyASigner(FormDataVo formDataVo, String fileId) throws Exception { + private List 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 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 buildSignParams(FormDataVo formDataVo, FormDataMasterBean formDataMasterBean, boolean byFile) throws Exception { + private Map 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 docs = new ArrayList<>(); docs.add(docMap); - Map signFlowConfig = buildSignFlowConfig(formDataVo, formDataMasterBean); - List signers = buildOnlyASigner(formDataVo, fileId); + Map signFlowConfig = buildSignFlowConfig(appId,formDataVo, formDataMasterBean); + List signers = buildOnlyASigner(appId,formDataVo, fileId); Map signParams = new HashMap<>(); signParams.put("signFlowConfig", signFlowConfig); signParams.put("signers", signers); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignAuthService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignAuthService.java index 4414e0f..c9df52c 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignAuthService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignAuthService.java @@ -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 authParams) throws Exception { + public void personAuth(Map 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); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignByTemplateService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignByTemplateService.java index 0e49213..45e037f 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignByTemplateService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignByTemplateService.java @@ -35,10 +35,10 @@ public class EsignByTemplateService { } } - public String createBySignTemplate(Map params) throws Exception { + public String createBySignTemplate(Map 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"); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignByUploadFileService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignByUploadFileService.java index 034c200..91f8122 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignByUploadFileService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignByUploadFileService.java @@ -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 getDownloadFileInfo(String flowId) throws Exception { + public Map 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 getSignPosition(String fileId) throws Exception { + public List 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 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 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 data = (Map) 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 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 { diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignFileTemplateService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignFileTemplateService.java index 31d2eb0..ebf09a3 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignFileTemplateService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/EsignFileTemplateService.java @@ -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 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 data = (Map) esignBaseResp.getData(); @@ -87,7 +87,7 @@ public class EsignFileTemplateService { public Map 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 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)); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/SealService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/SealService.java index ebfd397..4dad007 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/SealService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/SealService.java @@ -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 params) throws Exception { + public void grantSeal(String appId,Map 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 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); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/SignLinkService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/SignLinkService.java index 7381d4b..de7167b 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/SignLinkService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/SignLinkService.java @@ -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 tempMap = (Map) 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 dataMap = (Map) 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); diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/TokenCacheManager.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/TokenCacheManager.java index f91ca12..ed68add 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/TokenCacheManager.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/TokenCacheManager.java @@ -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 tokenRef = new AtomicReference<>(); + private final ConcurrentHashMap 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 map = JsonUtils.parseObject(configMap, Map.class); + return map.get(appId); + } + + public String getSecretByAppId(String appId) { + String configMap = configProvider.getBizConfigByKey(RentConstants.ESIGN_APP_SECRETMAP); + Map map = JsonUtils.parseObject(configMap, Map.class); + return map.get(appId); + } + + public String getAppIdByOrgName(String orgName) { + String configMap = configProvider.getBizConfigByKey(RentConstants.ESIGN_APP_UNITMAP); + Map map = JsonUtils.parseObject(configMap, Map.class); + for (String key : map.keySet()) { + if(map.get(key).equals(orgName)) { + return key; + } + } + return null; + } + + public List getAppIds() { + String configMap = configProvider.getBizConfigByKey(RentConstants.ESIGN_APP_SECRETMAP); + Map map = JsonUtils.parseObject(configMap, Map.class); + return map.keySet().stream().collect(Collectors.toList()); + } } \ No newline at end of file diff --git a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/WeAppContractSyncService.java b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/WeAppContractSyncService.java index 7accf86..d092d10 100644 --- a/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/WeAppContractSyncService.java +++ b/apps-customize/src/main/java/com/seeyon/apps/src_rent/service/WeAppContractSyncService.java @@ -1,6 +1,5 @@ package com.seeyon.apps.src_rent.service; -import org.springframework.stereotype.Service; public class WeAppContractSyncService { diff --git a/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/rent/BillResource.java b/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/rent/BillResource.java index 97af0fc..32b7287 100644 --- a/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/rent/BillResource.java +++ b/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/rent/BillResource.java @@ -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}); diff --git a/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/rent/CustomerMatchResource.java b/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/rent/CustomerMatchResource.java index 259ca9c..eb650c9 100644 --- a/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/rent/CustomerMatchResource.java +++ b/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/rent/CustomerMatchResource.java @@ -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)); diff --git a/seeyon/WEB-INF/cfgHome/component/src_rent/spring/spring-bean.xml b/seeyon/WEB-INF/cfgHome/component/src_rent/spring/spring-bean.xml index ca5b6df..e6387fa 100644 --- a/seeyon/WEB-INF/cfgHome/component/src_rent/spring/spring-bean.xml +++ b/seeyon/WEB-INF/cfgHome/component/src_rent/spring/spring-bean.xml @@ -33,4 +33,5 @@ +