From 36b08b0d6be329bda656f302e8234680112a5597 Mon Sep 17 00:00:00 2001 From: RuicyWu <1063154311@qq.com> Date: Wed, 15 Apr 2026 15:32:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../esign/constants/EsignConfigConstants.java | 3 +- .../DefaultEsignCallBackController.java | 3 +- .../esign/node/EsignMultipleSignerNode.java | 22 ++-- .../apps/esign/node/EsignOneSignerNode.java | 10 +- .../apps/esign/po/param/FlowParamSource.java | 38 ++++++- .../apps/esign/po/param/JsonParamSource.java | 11 +- .../esign/po/signer/DefaultSignerBuilder.java | 16 ++- .../esign/po/signer/JsonSignerBuilder.java | 105 +++++++++++++++--- .../apps/esign/po/signer/SignParty.java | 9 ++ .../apps/esign/po/signer/SignerType.java | 2 +- .../esign/service/EsignUploadFileService.java | 2 +- .../FlowFormSignParamBuildFactory.java | 21 +++- .../NormalFormSignParamBuildFactory.java | 24 +++- .../apps/esign/service/SignParamSource.java | 2 +- .../esign/EsignFlowQueryResource.java | 1 + .../esign/EsignTemplateResource.java | 2 + 16 files changed, 211 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/seeyon/apps/esign/constants/EsignConfigConstants.java b/src/main/java/com/seeyon/apps/esign/constants/EsignConfigConstants.java index 638f621..aea78a7 100644 --- a/src/main/java/com/seeyon/apps/esign/constants/EsignConfigConstants.java +++ b/src/main/java/com/seeyon/apps/esign/constants/EsignConfigConstants.java @@ -9,7 +9,7 @@ public enum EsignConfigConstants { SIGN_SERVICE_PROVIDER("ESIGN",""), UNITNAME("","平台方组织名称"), FORMEDITLOGINNAME("","表单修改登录名"), - updateAccountName("表单",""), + updateAccountName("表单","平台方单位名"), getTokenUrl("/seeyon/rest/token/","调用获取TOKEN地址"), nodeTokenUrl("/seeyon/rest/flow/notification/","超级节点回调URL"), restName("",""), @@ -21,6 +21,7 @@ public enum EsignConfigConstants { aSignPositionKeyword("甲方盖章/签字","甲方签署位置关键字"), bSignPositionKeyword("乙方盖章/签字","乙方签署位置关键字"), lpSignPositionKeyword("法定代表人","法人签署位置关键字"), + signLinkSave("false","是否保存签署链接"), ; private String defaultValue; diff --git a/src/main/java/com/seeyon/apps/esign/controller/DefaultEsignCallBackController.java b/src/main/java/com/seeyon/apps/esign/controller/DefaultEsignCallBackController.java index 35c5871..dc6f93f 100644 --- a/src/main/java/com/seeyon/apps/esign/controller/DefaultEsignCallBackController.java +++ b/src/main/java/com/seeyon/apps/esign/controller/DefaultEsignCallBackController.java @@ -22,7 +22,7 @@ public class DefaultEsignCallBackController extends BaseController { private static final Log log = Log.get(DefaultEsignCallBackController.class); - private EsignUploadFileService esignUploadFileService = (EsignUploadFileService) AppContext.getBean("esignByUploadFileService"); + private EsignUploadFileService esignUploadFileService = (EsignUploadFileService) AppContext.getBean("esignUploadFileService"); private EsignCallbackFlowBizService esignCallbackFlowBizService = (EsignCallbackFlowBizService) AppContext.getBean("esignCallbackFlowBizService"); @@ -80,6 +80,7 @@ public class DefaultEsignCallBackController extends BaseController { log.info("回调处理完成: " + flowId); return; } catch (Exception e) { + e.printStackTrace(); log.error("回调处理失败", e); } // response.setStatus(HttpServletResponse.SC_OK); diff --git a/src/main/java/com/seeyon/apps/esign/node/EsignMultipleSignerNode.java b/src/main/java/com/seeyon/apps/esign/node/EsignMultipleSignerNode.java index b0ef62f..819e909 100644 --- a/src/main/java/com/seeyon/apps/esign/node/EsignMultipleSignerNode.java +++ b/src/main/java/com/seeyon/apps/esign/node/EsignMultipleSignerNode.java @@ -8,29 +8,16 @@ import com.seeyon.apps.esign.po.signfield.NormalSignFieldConfig; import com.seeyon.apps.esign.po.signfield.SignField; import com.seeyon.apps.esign.po.signfield.SignFieldPosition; import com.seeyon.apps.esign.po.signer.Signer; -import com.seeyon.apps.esign.service.ContractCreateService; -import com.seeyon.apps.esign.service.EsignByTemplateService; -import com.seeyon.apps.esign.service.EsignUploadFileService; -import com.seeyon.apps.esign.service.FlowFormSignParamBuildFactory; +import com.seeyon.apps.esign.service.*; import com.seeyon.apps.ext.workflow.vo.FieldDataVo; import com.seeyon.apps.ext.workflow.vo.FormDataVo; import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; import com.seeyon.cap4.form.bean.FormDataMasterBean; import com.seeyon.ctp.common.AppContext; -import com.seeyon.ctp.common.exceptions.BusinessException; -import com.seeyon.utils.form.FormTableExecutor; -import com.seeyon.utils.form.FormUpdateField; -import com.seeyon.utils.form.FormWhereCondition; -import com.seeyon.utils.form.TableContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - public class EsignMultipleSignerNode extends ACommonSuperNode { @@ -43,6 +30,8 @@ public class EsignMultipleSignerNode extends ACommonSuperNode { // private EsignUploadFileService uploadFileService = (EsignUploadFileService) AppContext.getBean("esignByUploadFileService"); // private EsignByTemplateService templateService = (EsignByTemplateService) AppContext.getBean("esignByTemplateService"); // private FlowFormSignParamBuildFactory flowFormSignParamBuildFactory = new FlowFormSignParamBuildFactory(); + + private SignLinkService signLinkService = (SignLinkService) AppContext.getBean("signLinkService"); private ContractCreateService contractCreateService = (ContractCreateService) AppContext.getBean("contractCreateService"); @Override @@ -71,11 +60,16 @@ public class EsignMultipleSignerNode extends ACommonSuperNode { if(esignFlowId == null) { return context.back("E签宝签署发起失败"); } + String isSaveSignLink = configProvider.getBizConfigByKey(EsignConfigConstants.signLinkSave); + if("true".equals(isSaveSignLink)){ + signLinkService.saveGetLinkParam(formDataVo, formDataMasterBean,esignFlowId); + } log.info("E签宝签署流程ID: " + esignFlowId + " , OA超级节点ID:" + formDataVo.getToken()); log.info("E签宝多方签署合同已发送: " + esignFlowId); return context.wait("等待签署结束"); } catch (Exception e) { log.error("E签宝签署失败", e); + e.printStackTrace(); context.setErrMsg("E签宝签署失败: " + e.getMessage()); return context.back("E签宝签署失败: " + e.getMessage()); } diff --git a/src/main/java/com/seeyon/apps/esign/node/EsignOneSignerNode.java b/src/main/java/com/seeyon/apps/esign/node/EsignOneSignerNode.java index fea81c2..0899b67 100644 --- a/src/main/java/com/seeyon/apps/esign/node/EsignOneSignerNode.java +++ b/src/main/java/com/seeyon/apps/esign/node/EsignOneSignerNode.java @@ -4,22 +4,13 @@ import com.seeyon.apps.common.workflow.node.ACommonSuperNode; import com.seeyon.apps.esign.config.EsignConfigProvider; import com.seeyon.apps.esign.constants.EsignConfigConstants; import com.seeyon.apps.esign.po.param.FlowParamSource; -import com.seeyon.apps.esign.po.signer.Signer; -import com.seeyon.apps.esign.po.signfield.NormalSignFieldConfig; -import com.seeyon.apps.esign.po.signfield.SignField; -import com.seeyon.apps.esign.po.signfield.SignFieldPosition; import com.seeyon.apps.esign.service.ContractCreateService; -import com.seeyon.apps.esign.service.EsignByTemplateService; -import com.seeyon.apps.esign.service.EsignUploadFileService; -import com.seeyon.apps.ext.workflow.vo.FieldDataVo; import com.seeyon.apps.ext.workflow.vo.FormDataVo; import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; import com.seeyon.cap4.form.bean.FormDataMasterBean; -import com.seeyon.cap4.form.service.CAP4FormManager; import com.seeyon.ctp.common.AppContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; import java.util.*; @@ -69,6 +60,7 @@ public class EsignOneSignerNode extends ACommonSuperNode { return context.wait("等待签署结束"); } catch (Exception e) { log.error("E签宝签署失败", e); + e.printStackTrace(); context.setErrMsg("E签宝签署失败: " + e.getMessage()); return context.back("E签宝签署失败: " + e.getMessage()); } diff --git a/src/main/java/com/seeyon/apps/esign/po/param/FlowParamSource.java b/src/main/java/com/seeyon/apps/esign/po/param/FlowParamSource.java index e9e32fc..28e07f4 100644 --- a/src/main/java/com/seeyon/apps/esign/po/param/FlowParamSource.java +++ b/src/main/java/com/seeyon/apps/esign/po/param/FlowParamSource.java @@ -7,6 +7,9 @@ import com.seeyon.apps.esign.service.SignParamSource; import com.seeyon.apps.ext.workflow.vo.FieldDataVo; import com.seeyon.apps.ext.workflow.vo.FormDataVo; import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; import com.seeyon.utils.form.EnumMapUtils; import java.util.ArrayList; @@ -105,8 +108,23 @@ public class FlowParamSource implements SignParamSource { "&bizType=FLOW"; } + private String getPsnName(FormDataVo formDataVo) throws NoSuchFieldException { + OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager"); + FieldDataVo psn = formDataVo.getFieldData("甲方签署经办人"); + String psnName = null; + if(psn != null) { + try { + V3xOrgMember member = orgManager.getMemberById(Long.parseLong((String)psn.getDbValue())); + psnName = member.getName(); + }catch (Exception e){ + + } + } + return psnName; + } + @Override - public List getSignerParties() { + public List getSignerParties() throws Exception { List parties = new ArrayList<>(); SignParty aParty = new SignParty(); aParty.setPartyId("甲方"); @@ -117,7 +135,10 @@ public class FlowParamSource implements SignParamSource { if(!doAutoSign){ OrgInfo orgInfo = new OrgInfo(); aParty.setOrgInfo(orgInfo); - String psnName = getStringField(formDataVo,"甲方签署经办人"); + String psnName = getPsnName(formDataVo); + if(psnName == null) { + throw new RuntimeException("甲方签署经办人为空"); + } String psnMobile = getStringField(formDataVo,"甲方签署经办人联系方式"); String orgName = configProvider.getBizConfigByKey(EsignConfigConstants.UNITNAME); PersonInfo personInfo = new PersonInfo(); @@ -125,6 +146,15 @@ public class FlowParamSource implements SignParamSource { personInfo.setName(psnName); personInfo.setPhone(psnMobile); orgInfo.setTransactor(personInfo); + FieldDataVo isLpSign = formDataVo.getFieldData("是否盖法人章"); + if(isLpSign != null && "是".equals(isLpSign)) { + SignParty lpParty = new SignParty(); + lpParty.setPartyId("法人章"); + lpParty.setAutoSign(false); + lpParty.setSignOrder(3); + lpParty.setSignerType(SignerType.LP); + parties.add(lpParty); + } } parties.add(aParty); String signWay = getStringField(formDataVo, "签署方式"); @@ -158,7 +188,9 @@ public class FlowParamSource implements SignParamSource { bParty.setOrgInfo(bOrgInfo); bParty.setSignerType(SignerType.ORG); } - }catch (Exception e){} + }catch (Exception e){ + e.printStackTrace(); + } parties.add(bParty); } return parties; diff --git a/src/main/java/com/seeyon/apps/esign/po/param/JsonParamSource.java b/src/main/java/com/seeyon/apps/esign/po/param/JsonParamSource.java index c6ec99c..ae7fee1 100644 --- a/src/main/java/com/seeyon/apps/esign/po/param/JsonParamSource.java +++ b/src/main/java/com/seeyon/apps/esign/po/param/JsonParamSource.java @@ -61,7 +61,7 @@ public class JsonParamSource implements SignParamSource { @Override public Long getSignStatusEnumId() { - return oriParams.get("signStatusEnumId") == null ? null : Long.parseLong((String)oriParams.get("signStatusEnumId")); + return oriParams.get("signStatusEnumId") == null ? null : (Long) oriParams.get("signStatusEnumId"); } @Override @@ -87,15 +87,22 @@ public class JsonParamSource implements SignParamSource { String tempStr = (String)oriParams.get("signers"); List signers = JsonUtils.parseObject(tempStr, List.class); List parties = new ArrayList<>(); + Float qfPos = 100f; for (Object signer : signers) { Map signerMap = (Map) signer; SignParty signParty = new SignParty(); SignerType signerType = SignerType.valueOf((String) signerMap.get("signerType")); signParty.setSignerType(signerType); - signParty.setSignOrder((Integer) signerMap.get("signeOrder")); + signParty.setSignOrder((Integer) signerMap.get("signOrder")); signParty.setAutoSign(false); signParty.setFreeSign(true); + signParty.setQfPos(qfPos); + qfPos += 100f; signParty.setPartyId((String)signerMap.get("name")); + if(signerMap.get("signPosKeyword") != null) { + signParty.setSignKeyword((String)signerMap.get("signPosKeyword")); + signParty.setFreeSign(false); + } if(signerType == SignerType.PERSON) { PersonInfo personInfo = new PersonInfo(); personInfo.setName((String)signerMap.get("name")); diff --git a/src/main/java/com/seeyon/apps/esign/po/signer/DefaultSignerBuilder.java b/src/main/java/com/seeyon/apps/esign/po/signer/DefaultSignerBuilder.java index 74548e5..38875d0 100644 --- a/src/main/java/com/seeyon/apps/esign/po/signer/DefaultSignerBuilder.java +++ b/src/main/java/com/seeyon/apps/esign/po/signer/DefaultSignerBuilder.java @@ -5,6 +5,7 @@ import com.seeyon.apps.esign.constants.EsignConfigConstants; import com.seeyon.apps.esign.po.signfield.NormalSignFieldConfig; import com.seeyon.apps.esign.po.signfield.SignField; import com.seeyon.apps.esign.po.signfield.SignFieldPosition; +import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.HashMap; @@ -19,7 +20,7 @@ public class DefaultSignerBuilder implements SignerBuilder { public Signer build(List fileIds,List keywordPos, SignParty party) { if (party.getSignerType() == SignerType.PERSON) { return buildPersonSigner(fileIds, keywordPos,party); - } else if (party.getSignerType() == SignerType.ORG) { + } else if (party.getSignerType() == SignerType.ORG || party.getSignerType() == SignerType.LP) { return buildOrgSigner(fileIds,keywordPos, party); } else { throw new IllegalArgumentException("不支持的签署方类型"); @@ -50,7 +51,11 @@ public class DefaultSignerBuilder implements SignerBuilder { private Signer buildOrgSigner(List fileIds, List keywordPos,SignParty party) { OrgInfo org = party.getOrgInfo(); Signer signer = new Signer(); - signer.setSignerType(1); + if(SignerType.ORG.equals(party.getSignerType())) { + signer.setSignerType(1); + }else { + signer.setSignerType(2); + } signer.setSignConfig(mapOf("signOrder", party.getSignOrder())); if (!party.getAutoSign() && org != null) { signer.setNoticeConfig(mapOf("noticeTypes", "1")); @@ -76,6 +81,9 @@ public class DefaultSignerBuilder implements SignerBuilder { } private List extractPosition(List positions, String keyword) { + if(StringUtils.isBlank(keyword)) { + return null; + } List posList = new ArrayList<>(); for (Object obj : positions) { Map position = (Map) obj; @@ -88,7 +96,7 @@ public class DefaultSignerBuilder implements SignerBuilder { Map tempMap = (Map) coord; SignFieldPosition sfp = new SignFieldPosition(); sfp.setPositionPage(posMap.get("pageNum") + ""); - sfp.setPositionX(toFloat(tempMap.get("positionX")) + 150f); + sfp.setPositionX(toFloat(tempMap.get("positionX")) + 160f); sfp.setPositionY(toFloat(tempMap.get("positionY"))); posList.add(sfp); } @@ -122,7 +130,7 @@ public class DefaultSignerBuilder implements SignerBuilder { if(lpSignFieldPositions != null && lpSignFieldPositions.size() > 0) { signFieldPositions.addAll(lpSignFieldPositions); } - if(signFieldPositions.size() > 0) { + if(signFieldPositions.size() > 0 && !SignerType.PERSON.equals(party.getSignerType())) { signFieldPositions.add(qiFengposition); } for (SignFieldPosition position : signFieldPositions) { diff --git a/src/main/java/com/seeyon/apps/esign/po/signer/JsonSignerBuilder.java b/src/main/java/com/seeyon/apps/esign/po/signer/JsonSignerBuilder.java index 005201c..5fc96d5 100644 --- a/src/main/java/com/seeyon/apps/esign/po/signer/JsonSignerBuilder.java +++ b/src/main/java/com/seeyon/apps/esign/po/signer/JsonSignerBuilder.java @@ -5,6 +5,7 @@ import com.seeyon.apps.esign.constants.EsignConfigConstants; import com.seeyon.apps.esign.po.signfield.NormalSignFieldConfig; import com.seeyon.apps.esign.po.signfield.SignField; import com.seeyon.apps.esign.po.signfield.SignFieldPosition; +import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.HashMap; @@ -18,9 +19,9 @@ public class JsonSignerBuilder implements SignerBuilder{ @Override public Signer build(List fileIds, List keywordPos, SignParty party) { if (party.getSignerType() == SignerType.PERSON) { - return buildPersonSigner(fileIds,party); + return buildPersonSigner(fileIds,keywordPos,party); } else if (party.getSignerType() == SignerType.ORG) { - return buildOrgSigner(fileIds, party); + return buildOrgSigner(fileIds,keywordPos,party); } else { throw new IllegalArgumentException("不支持的签署方类型"); } @@ -30,23 +31,66 @@ public class JsonSignerBuilder implements SignerBuilder{ return val instanceof Number ? ((Number) val).floatValue() : Float.parseFloat(val.toString()); } - private List buildSignFields(List fileIds, SignParty party) { + private List buildSignFields(List fileIds,List keywordPos, SignParty party) { List signFields = new ArrayList<>(); for (String fileId : fileIds) { - NormalSignFieldConfig normalSignFieldConfig = new NormalSignFieldConfig(); - normalSignFieldConfig.setAssignedSealId(party.getSealId()); - normalSignFieldConfig.setFreeMode(true); - normalSignFieldConfig.setAutoSign(false); - normalSignFieldConfig.setAdaptableSignFieldSize(true); - SignField field = new SignField(); - field.setSignFieldType(0); - field.setNormalSignFieldConfig(normalSignFieldConfig); - field.setFileId(fileId); - signFields.add(field); + List signFieldPositions = null; + if(!Boolean.TRUE.equals(party.getFreeSign())){ + String signKeyword = party.getSignKeyword(); + signFieldPositions = extractPosition(keywordPos, signKeyword); + for (SignFieldPosition position : signFieldPositions) { + NormalSignFieldConfig fieldConfig = new NormalSignFieldConfig(); + fieldConfig.setSignFieldPosition(position); + fieldConfig.setAutoSign(party.getAutoSign()); + fieldConfig.setSignFieldStyle("ALL".equals(position.getAcrossPageMode()) ? 2 : 1); + SignField field = new SignField(); + field.setSignFieldType(0); + field.setNormalSignFieldConfig(fieldConfig); + field.setFileId(fileId); + signFields.add(field); + } + if(signFieldPositions.size() > 0 && !SignerType.PERSON.equals(party.getSignerType())) { + SignField field = new SignField(); + field.setSignFieldType(0); + buildQfSignNormalConfig(party); + field.setNormalSignFieldConfig(buildFreeModeSignNormalConfig(party)); + field.setFileId(fileId); + signFields.add(field); + } + }else { + + SignField field = new SignField(); + field.setSignFieldType(0); + field.setNormalSignFieldConfig(buildFreeModeSignNormalConfig(party)); + field.setFileId(fileId); + signFields.add(field); + } } return signFields; } + private NormalSignFieldConfig buildFreeModeSignNormalConfig(SignParty party) { + NormalSignFieldConfig normalSignFieldConfig = new NormalSignFieldConfig(); + normalSignFieldConfig.setAssignedSealId(party.getSealId()); + normalSignFieldConfig.setFreeMode(true); + normalSignFieldConfig.setAutoSign(false); + normalSignFieldConfig.setAdaptableSignFieldSize(true); + return normalSignFieldConfig; + } + + private NormalSignFieldConfig buildQfSignNormalConfig(SignParty party) { + NormalSignFieldConfig normalSignFieldConfig = new NormalSignFieldConfig(); + normalSignFieldConfig.setAssignedSealId(party.getSealId()); + normalSignFieldConfig.setFreeMode(false); + normalSignFieldConfig.setAutoSign(false); + SignFieldPosition qfengposition = new SignFieldPosition(); + qfengposition.setAcrossPageMode("ALL"); + qfengposition.setPositionY(party.getQfPos()); + normalSignFieldConfig.setSignFieldPosition(qfengposition); + normalSignFieldConfig.setAdaptableSignFieldSize(true); + return normalSignFieldConfig; + } + private Map mapOf(Object... keyValues) { if (keyValues.length % 2 != 0) throw new IllegalArgumentException("key-value 必须成对出现"); Map map = new HashMap<>(); @@ -56,7 +100,34 @@ public class JsonSignerBuilder implements SignerBuilder{ return map; } - private Signer buildPersonSigner(List fileIds, SignParty party) { + private List extractPosition(List positions, String keyword) { + if(StringUtils.isBlank(keyword)) { + return null; + } + List posList = new ArrayList<>(); + for (Object obj : positions) { + Map position = (Map) obj; + if (Boolean.TRUE.equals(position.get("searchResult")) && keyword.equals(position.get("keyword"))) { + Object[] posArray = (Object[]) position.get("positions"); + for (Object o : posArray) { + Map posMap = (Map)o; + Object[] coords = (Object[]) posMap.get("coordinates"); + for (Object coord : coords) { + Map tempMap = (Map) coord; + SignFieldPosition sfp = new SignFieldPosition(); + sfp.setPositionPage(posMap.get("pageNum") + ""); + sfp.setPositionX(toFloat(tempMap.get("positionX")) + 160f); + sfp.setPositionY(toFloat(tempMap.get("positionY"))); + posList.add(sfp); + } + } + return posList; + } + } + return new ArrayList<>(); + } + + private Signer buildPersonSigner(List fileIds,List keywordPos, SignParty party) { PersonInfo psn = party.getPersonInfo(); if (psn == null) throw new IllegalStateException("个人签署方缺少 PersonInfo"); Signer signer = new Signer(); @@ -73,11 +144,11 @@ public class JsonSignerBuilder implements SignerBuilder{ ) )); } - signer.setSignFields(buildSignFields(fileIds, party)); + signer.setSignFields(buildSignFields(fileIds,keywordPos,party)); return signer; } - private Signer buildOrgSigner(List fileIds,SignParty party) { + private Signer buildOrgSigner(List fileIds,List keywordPos,SignParty party) { OrgInfo org = party.getOrgInfo(); Signer signer = new Signer(); signer.setSignerType(1); @@ -101,7 +172,7 @@ public class JsonSignerBuilder implements SignerBuilder{ ) )); } - signer.setSignFields(buildSignFields(fileIds,party)); + signer.setSignFields(buildSignFields(fileIds,keywordPos,party)); return signer; } } diff --git a/src/main/java/com/seeyon/apps/esign/po/signer/SignParty.java b/src/main/java/com/seeyon/apps/esign/po/signer/SignParty.java index 6f93672..21b565c 100644 --- a/src/main/java/com/seeyon/apps/esign/po/signer/SignParty.java +++ b/src/main/java/com/seeyon/apps/esign/po/signer/SignParty.java @@ -35,6 +35,7 @@ public class SignParty { /** 签署关键字(可为空) */ private String signKeyword; + private Float qfPos; private Boolean freeSign = false; @@ -125,4 +126,12 @@ public class SignParty { public void setSignKeyword(String signKeyword) { this.signKeyword = signKeyword; } + + public Float getQfPos() { + return qfPos; + } + + public void setQfPos(Float qfPos) { + this.qfPos = qfPos; + } } \ No newline at end of file diff --git a/src/main/java/com/seeyon/apps/esign/po/signer/SignerType.java b/src/main/java/com/seeyon/apps/esign/po/signer/SignerType.java index 7c4708a..b5c7661 100644 --- a/src/main/java/com/seeyon/apps/esign/po/signer/SignerType.java +++ b/src/main/java/com/seeyon/apps/esign/po/signer/SignerType.java @@ -1,5 +1,5 @@ package com.seeyon.apps.esign.po.signer; public enum SignerType { - PERSON, ORG + PERSON, ORG,LP } \ No newline at end of file diff --git a/src/main/java/com/seeyon/apps/esign/service/EsignUploadFileService.java b/src/main/java/com/seeyon/apps/esign/service/EsignUploadFileService.java index cc14353..4128b94 100644 --- a/src/main/java/com/seeyon/apps/esign/service/EsignUploadFileService.java +++ b/src/main/java/com/seeyon/apps/esign/service/EsignUploadFileService.java @@ -107,7 +107,7 @@ public class EsignUploadFileService { for (String path : paths) { file = new File(path); String contentMD5 = EsignUploadFileService.getFileContentMD5(path); - GetUploadUrlResp uploadResp = getUploadFileUrl(file.getName(), contentMD5, file.length(),false); + GetUploadUrlResp uploadResp = getUploadFileUrl(file.getName(), contentMD5, file.length(),true); uploadFile(uploadResp.getFileUploadUrl(), contentMD5, file.getName(), path); fileIds.add(uploadResp.getFileId()); } diff --git a/src/main/java/com/seeyon/apps/esign/service/FlowFormSignParamBuildFactory.java b/src/main/java/com/seeyon/apps/esign/service/FlowFormSignParamBuildFactory.java index dbf2893..3151f3d 100644 --- a/src/main/java/com/seeyon/apps/esign/service/FlowFormSignParamBuildFactory.java +++ b/src/main/java/com/seeyon/apps/esign/service/FlowFormSignParamBuildFactory.java @@ -4,10 +4,12 @@ import com.seeyon.apps.esign.config.EsignConfigProvider; import com.seeyon.apps.esign.constants.EsignConfigConstants; import com.seeyon.apps.esign.po.param.FlowParamSource; import com.seeyon.apps.esign.po.signer.DefaultSignerBuilder; +import com.seeyon.apps.esign.po.signer.SignParty; import com.seeyon.apps.esign.po.signer.Signer; import com.seeyon.apps.ext.workflow.vo.FieldDataVo; import com.seeyon.apps.ext.workflow.vo.FormDataVo; import com.seeyon.ctp.common.AppContext; +import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.HashMap; @@ -35,10 +37,21 @@ public class FlowFormSignParamBuildFactory implements SignParamBuildFactory { Map signFlowConfig = buildSignFlowConfig(source.getContractTitle(),source.getCallbackUrl()); DefaultSignerBuilder signerBuilder = new DefaultSignerBuilder(); List keywords = new ArrayList<>(); - keywords.add(configProvider.getBizConfigByKey(EsignConfigConstants.aSignPositionKeyword)); - keywords.add(configProvider.getBizConfigByKey(EsignConfigConstants.bSignPositionKeyword)); - keywords.add(configProvider.getBizConfigByKey(EsignConfigConstants.lpSignPositionKeyword)); - List signers = signerBuilder.buildAll(fileIds,getKeywordPos(fileIds,keywords),source.getSignerParties()); + String aSignPosKeyword = configProvider.getBizConfigByKey(EsignConfigConstants.aSignPositionKeyword); + String bSignPosKeyword = configProvider.getBizConfigByKey(EsignConfigConstants.bSignPositionKeyword); + String lpSignPosKeyword = configProvider.getBizConfigByKey(EsignConfigConstants.lpSignPositionKeyword); + if(StringUtils.isNotBlank(aSignPosKeyword)){ + keywords.add(aSignPosKeyword); + } + if(StringUtils.isNotBlank(bSignPosKeyword)){ + keywords.add(bSignPosKeyword); + } + if(StringUtils.isNotBlank(lpSignPosKeyword)) { + keywords.add(lpSignPosKeyword); + } + List keywordPos = getKeywordPos(fileIds, keywords); + List signerParties = source.getSignerParties(); + List signers = signerBuilder.buildAll(fileIds,keywordPos,signerParties); signParams.put("signFlowConfig", signFlowConfig); signParams.put("signers", signers); return signParams; diff --git a/src/main/java/com/seeyon/apps/esign/service/NormalFormSignParamBuildFactory.java b/src/main/java/com/seeyon/apps/esign/service/NormalFormSignParamBuildFactory.java index 8c9a06c..51d0988 100644 --- a/src/main/java/com/seeyon/apps/esign/service/NormalFormSignParamBuildFactory.java +++ b/src/main/java/com/seeyon/apps/esign/service/NormalFormSignParamBuildFactory.java @@ -5,10 +5,13 @@ import com.seeyon.apps.esign.config.EsignConfigProvider; import com.seeyon.apps.esign.constants.EsignConfigConstants; import com.seeyon.apps.esign.po.param.JsonParamSource; import com.seeyon.apps.esign.po.signer.DefaultSignerBuilder; +import com.seeyon.apps.esign.po.signer.JsonSignerBuilder; +import com.seeyon.apps.esign.po.signer.SignParty; import com.seeyon.apps.esign.po.signer.Signer; import com.seeyon.apps.ext.workflow.vo.FieldDataVo; import com.seeyon.apps.ext.workflow.vo.FormDataVo; import com.seeyon.ctp.common.AppContext; +import org.apache.commons.lang3.StringUtils; import java.util.*; @@ -32,13 +35,30 @@ public class NormalFormSignParamBuildFactory implements SignParamBuildFactory { signParams.put("docs", docs); } Map signFlowConfig = buildSignFlowConfig(source.getContractTitle(),source.getCallbackUrl()); - DefaultSignerBuilder signerBuilder = new DefaultSignerBuilder(); - List signers = signerBuilder.buildAll(fileIds,null,source.getSignerParties()); + JsonSignerBuilder signerBuilder = new JsonSignerBuilder(); + List signerParties = source.getSignerParties(); + List keywords = new ArrayList<>(); + signerParties.forEach(party -> { + if(StringUtils.isNotBlank(party.getSignKeyword())) { + keywords.add(party.getSignKeyword()); + } + }); + List keywordPos = getKeywordPos(fileIds, keywords); + List signers = signerBuilder.buildAll(fileIds,keywordPos,signerParties); signParams.put("signFlowConfig", signFlowConfig); signParams.put("signers", signers); return signParams; } + private List getKeywordPos(List fileIds,List keywords){ + List pos = new ArrayList<>(); + for (String fileId : fileIds){ + List signPosition = uploadFileService.getSignPosition(fileId, keywords); + pos.addAll(signPosition); + } + return pos.size() > 0 ? pos : null; + } + @Override public boolean support(SignParamSource source) { return source instanceof JsonParamSource; diff --git a/src/main/java/com/seeyon/apps/esign/service/SignParamSource.java b/src/main/java/com/seeyon/apps/esign/service/SignParamSource.java index d4e2b62..7d6247f 100644 --- a/src/main/java/com/seeyon/apps/esign/service/SignParamSource.java +++ b/src/main/java/com/seeyon/apps/esign/service/SignParamSource.java @@ -41,7 +41,7 @@ public interface SignParamSource { /** * 所有签署方(顺序、类型、自动签等都在这里) */ - List getSignerParties(); + List getSignerParties() throws Exception; /** 通知类型 */ default String noticeTypes() { diff --git a/src/main/java/com/seeyon/ctp/rest/resources/esign/EsignFlowQueryResource.java b/src/main/java/com/seeyon/ctp/rest/resources/esign/EsignFlowQueryResource.java index 5d0e6b5..8958dec 100644 --- a/src/main/java/com/seeyon/ctp/rest/resources/esign/EsignFlowQueryResource.java +++ b/src/main/java/com/seeyon/ctp/rest/resources/esign/EsignFlowQueryResource.java @@ -26,6 +26,7 @@ public class EsignFlowQueryResource extends BaseResource { try { return success(esignFlowQueryService.queryFlow(req.getParameter("eFlowId"))); }catch (Exception e) { + e.printStackTrace(); log.error(e.getMessage(),e); } return fail("失败"); diff --git a/src/main/java/com/seeyon/ctp/rest/resources/esign/EsignTemplateResource.java b/src/main/java/com/seeyon/ctp/rest/resources/esign/EsignTemplateResource.java index 59069e2..fbaa53d 100644 --- a/src/main/java/com/seeyon/ctp/rest/resources/esign/EsignTemplateResource.java +++ b/src/main/java/com/seeyon/ctp/rest/resources/esign/EsignTemplateResource.java @@ -29,6 +29,7 @@ public class EsignTemplateResource extends BaseResource { Map map = esignFileTemplateService.queryTemplates(pageNum); return success(map); }catch (Exception e) { + e.printStackTrace(); log.error(e.getMessage(),e); } return fail("失败"); @@ -43,6 +44,7 @@ public class EsignTemplateResource extends BaseResource { String compareDetailUrl = esignFileTemplateService.getCompareDetailUrl(templateRefId, contractRefId); return success(compareDetailUrl); }catch (Exception e) { + e.printStackTrace(); log.error(e.getMessage(),e); } return fail("失败");