diff --git a/seeyon/WEB-INF/cfgHome/component/esign/spring/spring-bean.xml b/seeyon/WEB-INF/cfgHome/component/esign/spring/spring-bean.xml
index 148f59e..c64e43e 100644
--- a/seeyon/WEB-INF/cfgHome/component/esign/spring/spring-bean.xml
+++ b/seeyon/WEB-INF/cfgHome/component/esign/spring/spring-bean.xml
@@ -17,6 +17,7 @@
+
diff --git a/src/main/java/com/seeyon/apps/esign/constants/EsignApiUrl.java b/src/main/java/com/seeyon/apps/esign/constants/EsignApiUrl.java
index 5c201d8..446dbbd 100644
--- a/src/main/java/com/seeyon/apps/esign/constants/EsignApiUrl.java
+++ b/src/main/java/com/seeyon/apps/esign/constants/EsignApiUrl.java
@@ -16,4 +16,5 @@ public class EsignApiUrl {
public static final String TOKEN_GET_URL = "/v1/oauth2/access_token";
public static final String SEAL_QUERY_URL = "/v3/seals/org-own-seal-list";
public static final String SIGN_LINK_GET_URL ="/v3/sign-flow/{signFlowId}/sign-url";
+ public static final String QUERY_FILEUPLOADSTATUS = "/v3/files/";
}
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 aea78a7..4899ddc 100644
--- a/src/main/java/com/seeyon/apps/esign/constants/EsignConfigConstants.java
+++ b/src/main/java/com/seeyon/apps/esign/constants/EsignConfigConstants.java
@@ -2,12 +2,8 @@ package com.seeyon.apps.esign.constants;
public enum EsignConfigConstants {
plugin("esign",""),
- APP_ID("7438886882",""),
- APP_SECRET("325c8cc6c2a303d6cf1fb5657a16e591",""),
OA_HOST("http://cd-2.frp.one:58336",""),
ESIGN_HOST("",""),
- SIGN_SERVICE_PROVIDER("ESIGN",""),
- UNITNAME("","平台方组织名称"),
FORMEDITLOGINNAME("","表单修改登录名"),
updateAccountName("表单","平台方单位名"),
getTokenUrl("/seeyon/rest/token/","调用获取TOKEN地址"),
@@ -15,13 +11,17 @@ public enum EsignConfigConstants {
restName("",""),
restPwd("",""),
signAutoDate("","是否自动加盖签署日期"),
- eSignOrgId("61f735dd368c45a191f43a6711c3c88a","e签宝平台方组织id"),
formLoginName("2019","表单数据录入登录名"),
sealInfoFormCode("","印章档案编码"),
aSignPositionKeyword("甲方盖章/签字","甲方签署位置关键字"),
bSignPositionKeyword("乙方盖章/签字","乙方签署位置关键字"),
lpSignPositionKeyword("法定代表人","法人签署位置关键字"),
signLinkSave("false","是否保存签署链接"),
+ ESIGN_APP_UNITMAP("","E签宝应用APPID与公司映射关系"),
+ ESIGN_APP_SECRETMAP("325c8cc6c2a303d6cf1fb5657a16e591","e签宝appIDSecret映射"),
+ ENABLEANTIFAKESIGN("","是否加盖防伪章"),
+ FIXAPPUNIT("true","是否固定要用的E签宝应用主体单位"),
+ FIXAPPUNITNAME("","固定要用的E签宝应用主体单位名称")
;
private String defaultValue;
diff --git a/src/main/java/com/seeyon/apps/esign/constants/FlowFormFieldConstants.java b/src/main/java/com/seeyon/apps/esign/constants/FlowFormFieldConstants.java
new file mode 100644
index 0000000..fba8f53
--- /dev/null
+++ b/src/main/java/com/seeyon/apps/esign/constants/FlowFormFieldConstants.java
@@ -0,0 +1,14 @@
+package com.seeyon.apps.esign.constants;
+
+/**
+ * 流程表单字段显示名常量
+ */
+public final class FlowFormFieldConstants {
+
+ private FlowFormFieldConstants() {}
+
+ public static final String CONTRACT_TITLE = "合同名称";
+ public static final String CONTRACT_APPROVAL_ATTACHMENT = "合同审批附件";
+ public static final String SIGNED_ATTACHMENT = "盖章后合同附件";
+ public static final String SIGN_STATUS = "签署状态";
+}
diff --git a/src/main/java/com/seeyon/apps/esign/constants/JsonParamKeyConstants.java b/src/main/java/com/seeyon/apps/esign/constants/JsonParamKeyConstants.java
new file mode 100644
index 0000000..01fa8a5
--- /dev/null
+++ b/src/main/java/com/seeyon/apps/esign/constants/JsonParamKeyConstants.java
@@ -0,0 +1,26 @@
+package com.seeyon.apps.esign.constants;
+
+/**
+ * JSON 接口参数 key 常量
+ */
+public final class JsonParamKeyConstants {
+
+ private JsonParamKeyConstants() {}
+
+ public static final String CONTRACT_TITLE = "contractTitle";
+ public static final String BY_FILE = "byFile";
+ public static final String FORM_ID = "formId";
+ public static final String TABLE_NAME = "tableName";
+ public static final String SIGN_FILE_REF_ID = "signFileRefId";
+ public static final String SIGNED_FILE_FIELD = "signedFileField";
+ public static final String SIGN_STATUS_FIELD = "signStatusField";
+ public static final String SIGN_STATUS_ENUM_ID = "signStatusEnumId";
+ public static final String SIGNERS = "signers";
+ public static final String SIGNER_TYPE = "signerType";
+ public static final String SIGN_ORDER = "signOrder";
+ public static final String NAME = "name";
+ public static final String PHONE = "phone";
+ public static final String SIGN_POS_KEYWORD = "signPosKeyword";
+ public static final String ORG_NAME = "orgName";
+ public static final String ORG_CODE = "orgCode";
+}
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 dc6f93f..8706129 100644
--- a/src/main/java/com/seeyon/apps/esign/controller/DefaultEsignCallBackController.java
+++ b/src/main/java/com/seeyon/apps/esign/controller/DefaultEsignCallBackController.java
@@ -9,6 +9,7 @@ import com.seeyon.apps.esign.service.EsignUploadFileService;
import com.seeyon.apps.esign.service.EsignCallbackFlowBizService;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.controller.BaseController;
+import com.seeyon.ctp.util.annotation.NeedlessCheckLogin;
import javax.servlet.http.HttpServletRequest;
@@ -25,7 +26,7 @@ public class DefaultEsignCallBackController extends BaseController {
private EsignUploadFileService esignUploadFileService = (EsignUploadFileService) AppContext.getBean("esignUploadFileService");
private EsignCallbackFlowBizService esignCallbackFlowBizService = (EsignCallbackFlowBizService) AppContext.getBean("esignCallbackFlowBizService");
-
+ @NeedlessCheckLogin
public void callback(HttpServletRequest request, HttpServletResponse response) {
try {
log.info("签署回调触发");
@@ -34,6 +35,7 @@ public class DefaultEsignCallBackController 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;
@@ -50,7 +52,7 @@ public class DefaultEsignCallBackController extends BaseController {
log.info("签署回调当前流程: " + flowId);
if(action.equals("SIGN_FLOW_COMPLETE")) {
if(callbackParams.getSignFlowStatus() == 2) {
- Object[] fileInfos = esignUploadFileService.getDownloadFileInfo(flowId);
+ Object[] fileInfos = esignUploadFileService.getDownloadFileInfo(appId,flowId);
esignCallbackFlowBizService.handleSuccessSignCallbackBiz(tableName,updatefield,statusfield,formId,fileInfos);
}else if(callbackParams.getSignFlowStatus() == 5){
//合同过期
diff --git a/src/main/java/com/seeyon/apps/esign/job/SealDocSyncJob.java b/src/main/java/com/seeyon/apps/esign/job/SealDocSyncJob.java
index 922fdd5..d2c56f5 100644
--- a/src/main/java/com/seeyon/apps/esign/job/SealDocSyncJob.java
+++ b/src/main/java/com/seeyon/apps/esign/job/SealDocSyncJob.java
@@ -16,6 +16,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import java.util.List;
import java.util.Map;
@@ -30,22 +31,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(EsignConfigConstants.eSignOrgId);
+ private void syncSeals(String appId) {
String host = configProvider.getBizConfigByKey(EsignConfigConstants.ESIGN_HOST);
Integer pageNum = 1;
Integer pageSize = 20;
- EsignApiHeader esignApiHeader = EsignApiHeader.build().appId(configProvider.getBizConfigByKey(EsignConfigConstants.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/src/main/java/com/seeyon/apps/esign/logfile/EsignParamRecordUtils.java b/src/main/java/com/seeyon/apps/esign/logfile/EsignParamRecordUtils.java
new file mode 100644
index 0000000..f8f7ff7
--- /dev/null
+++ b/src/main/java/com/seeyon/apps/esign/logfile/EsignParamRecordUtils.java
@@ -0,0 +1,22 @@
+package com.seeyon.apps.esign.logfile;
+
+import com.seeyon.aicloud.common.JsonUtils;
+import com.seeyon.v3x.dee.util.DateUtil;
+import org.apache.commons.io.FileUtils;
+
+import java.io.File;
+import java.util.Date;
+import java.util.Map;
+
+public class EsignParamRecordUtils {
+
+ public static void saveEsignParamRecord(Map params) {
+ try {
+ String str = "/home/seeyon/Seeyon/A8/ApacheJetspeed/logs_sy";
+ String date = DateUtil.format(new Date(), "yyyyMMddHHmmss");
+ FileUtils.writeStringToFile(new File(str+"/esignParams/" + date + ".json"), JsonUtils.toJSONString(params), "UTF-8");
+ }catch (Exception e){
+
+ }
+ }
+}
diff --git a/src/main/java/com/seeyon/apps/esign/msg/MessageVo.java b/src/main/java/com/seeyon/apps/esign/msg/MessageVo.java
index 1675d50..28ec159 100644
--- a/src/main/java/com/seeyon/apps/esign/msg/MessageVo.java
+++ b/src/main/java/com/seeyon/apps/esign/msg/MessageVo.java
@@ -1,12 +1,19 @@
package com.seeyon.apps.esign.msg;
+import java.util.Map;
+
public class MessageVo {
+ private String title;
private String messageType;
private String messageContent;
+ private String messageText;
private String messageTime;
private String messageReceiver;
private String bizId;
+ private Boolean sendSubscribeMsg;
+ private String subscribeMsgMode;
+ private Map templateValue;
public String getMessageType() {
return messageType;
@@ -47,4 +54,44 @@ public class MessageVo {
public void setBizId(String bizId) {
this.bizId = bizId;
}
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getMessageText() {
+ return messageText;
+ }
+
+ public void setMessageText(String messageText) {
+ this.messageText = messageText;
+ }
+
+ public Boolean getSendSubscribeMsg() {
+ return sendSubscribeMsg;
+ }
+
+ public void setSendSubscribeMsg(Boolean sendSubscribeMsg) {
+ this.sendSubscribeMsg = sendSubscribeMsg;
+ }
+
+ public String getSubscribeMsgMode() {
+ return subscribeMsgMode;
+ }
+
+ public void setSubscribeMsgMode(String subscribeMsgMode) {
+ this.subscribeMsgMode = subscribeMsgMode;
+ }
+
+ public Map getTemplateValue() {
+ return templateValue;
+ }
+
+ public void setTemplateValue(Map templateValue) {
+ this.templateValue = templateValue;
+ }
}
diff --git a/src/main/java/com/seeyon/apps/esign/node/EsignAntiFakeSignNode.java b/src/main/java/com/seeyon/apps/esign/node/EsignAntiFakeSignNode.java
new file mode 100644
index 0000000..77f2312
--- /dev/null
+++ b/src/main/java/com/seeyon/apps/esign/node/EsignAntiFakeSignNode.java
@@ -0,0 +1,187 @@
+package com.seeyon.apps.esign.node;
+
+import com.seeyon.aicloud.common.JsonUtils;
+import com.seeyon.apps.collaboration.po.ColSummary;
+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.OrgInfo;
+import com.seeyon.apps.esign.po.signer.PersonInfo;
+import com.seeyon.apps.esign.po.signer.SignParty;
+import com.seeyon.apps.esign.po.signer.SignerType;
+import com.seeyon.apps.esign.service.ContractCreateService;
+import com.seeyon.apps.esign.service.SealService;
+import com.seeyon.apps.esign.service.TokenCacheManager;
+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.ctp.organization.bo.V3xOrgMember;
+import com.seeyon.ctp.organization.manager.OrgManager;
+import com.seeyon.ctp.util.JDBCAgent;
+import com.seeyon.utils.form.*;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+public class EsignAntiFakeSignNode extends ACommonSuperNode {
+
+ private static final Log log = LogFactory.getLog(EsignAntiFakeSignNode.class);
+ private EsignConfigProvider configProvider = EsignConfigProvider.getInstance();
+ private TokenCacheManager tokenCacheManager = (TokenCacheManager) AppContext.getBean("tokenCacheManager");
+ private ContractCreateService contractCreateService = (ContractCreateService) AppContext.getBean("contractCreateService");
+ private SealService sealService = (SealService) AppContext.getBean("sealService");
+
+ @Override
+ public String getPluginId() {
+ return EsignConfigConstants.getPluginId();
+ }
+
+ @Override
+ public String getFormParse() {
+ return "";
+ }
+
+ @Override
+ public SuperNodeContext proceed(String s, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception {
+ SuperNodeContext context = new SuperNodeContext();
+ context.setNeedSave(true);
+ log.info("进入E签宝防伪签署签署集成超级节点");
+ try {
+ FlowParamSource source = new FlowParamSource();
+ source.setConfigProvider(configProvider);
+ source.setFormDataVo(formDataVo);
+ source.setDoAutoSign(true);
+ String unitName = configProvider.getBizConfigByKey(EsignConfigConstants.FIXAPPUNITNAME);
+ String appId = tokenCacheManager.getAppIdByOrgName(unitName);
+ source.setAppId(appId);
+ source.setMasterBean(formDataMasterBean);
+ source.setUseKeyWordPositing(false);
+ source.setSignerParties(buildSigners(formDataVo,true,unitName));
+ String esignFlowId = contractCreateService.startSign(source);
+ if(esignFlowId == null) {
+ return context.back("E签宝签署发起失败");
+ }
+ 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());
+ }
+ }
+
+ private String getStringField(FormDataVo vo, String field) {
+ try {
+ FieldDataVo fieldData = vo.getFieldData(field);
+ return fieldData.getStringValue();
+ }catch (Exception e) {
+ return null;
+ }
+ }
+
+ private V3xOrgMember getPsn(Long memberId) throws NoSuchFieldException {
+ OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager");
+ if(memberId != null) {
+ try {
+ V3xOrgMember member = orgManager.getMemberById(memberId);
+ return member;
+ }catch (Exception e){
+
+ }
+ }
+ return null;
+ }
+
+ private String getLastSenderId(Long caseId) {
+ List columns = new ArrayList<>();
+ columns.add("SENDER_ID");
+ SqlBuildParam param = new SqlBuildParam();
+ List conditions = new ArrayList<>();
+ conditions.add(FormWhereCondition.build().fieldName("CASE_ID").value(caseId));
+ param.setSqlType(SqlType.SELECT);
+ param.setTableName("ctp_affair");
+ param.setQueryColumns(columns);
+ param.setConditions(conditions);
+ param.setPageNo(1);
+ param.setPageSize(1);
+ param.setOrderField("UPDATE_DATE");
+ param.setSortType("DESC");
+ Map sqlMap = FormTableExecutor.generateSql(param);
+ JDBCAgent agent = new JDBCAgent();
+ try {
+ agent.execute((String)sqlMap.get("sql"), (List)sqlMap.get("params"));
+ log.info("执行sql为: " + sqlMap.get("sql"));
+ List