Commit 77dd2305 authored by hongguangwu's avatar hongguangwu

MVP1.7.16-法大大

parent d73818dd
......@@ -88,6 +88,7 @@ public class TEmployeeContractPre extends BaseEntity {
@Schema(description = "法大大模版名称")
private String fadadaTemplate;
@Schema(description = "数据来源1客户端 2客服端")
private String dataSource;
......@@ -288,4 +289,15 @@ public class TEmployeeContractPre extends BaseEntity {
@TableField(exist = false)
private List<TAttaInfo> attaList;
@Schema(description = "法大大模版ID")
private String fadadaTemplateId;
// 1待发起、5发起失败、7签署失败,可以发起电子签 2025-10-14 18:25:16倩倩
// processStatus = "状态,0待确认,1待发起,2线下签待审核,3线下签审核不通过4线下签待归档5发起失败6签署中7签署失败8电子待归档9已完结10撤销签署")
@Schema(description = "任务ID")
private String requestId;
@Schema(description = "任务信息")
private String requestMsg;
}
......@@ -56,6 +56,14 @@ public class TFascTemplateDetail extends BaseEntity {
@ExcelProperty("模板ID")
@Schema(description = "模板ID")
private String signTemplateId;
/**
* 法大大文档ID
*/
@ExcelAttribute(name = "法大大文档ID", maxLength = 100)
@Length(max = 100, message = "法大大文档ID不能超过100个字符")
@ExcelProperty("法大大文档ID")
@Schema(description = "法大大文档ID")
private String fascDocId;
/**
* 法大大字段
*/
......
......@@ -565,4 +565,13 @@ public class TEmployeeContractPreVo extends RowIndex implements Serializable {
private String revokeReason;
/**
* 法大大模版ID
*/
@Length(max = 50, message = "法大大模版ID 不能超过50 个字符")
@ExcelAttribute(name = "法大大模版ID", maxLength = 50)
@Schema(description = "法大大模版ID")
@ExcelProperty("法大大模版ID")
private String fadadaTemplateId;
}
package com.yifu.cloud.plus.v1.yifu.archives.controller;
import com.alibaba.fastjson.JSON;
import com.fasc.open.api.exception.ApiException;
import com.yifu.cloud.plus.v1.yifu.archives.entity.FddReqLog;
import com.yifu.cloud.plus.v1.yifu.archives.service.*;
import com.yifu.cloud.plus.v1.yifu.common.core.exception.CheckedException;
import com.yifu.cloud.plus.v1.yifu.archives.service.FascService;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.common.dapr.config.DaprUpmsProperties;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @auther huyc
* @date 2022/6/29
*/
@EnableConfigurationProperties({DaprUpmsProperties.class})
@RestController
@RequiredArgsConstructor
@RequestMapping("/fasc")
......@@ -30,18 +24,6 @@ public class FascController {
@Autowired
private FascService fascService;
@Autowired
private FddReqLogService reqLogService;
@Autowired
private FddPersonAccountService fddPersonAccountService;
@Autowired
private FddContractInfoService fddContractInfoService;
@Autowired
private FddCompanyInfoService fddCompanyInfoService;
@Autowired
private FddContractAttachInfoService fddContractAttachInfoService;
@Autowired
private TEmployeeContractInfoService employeeContractInfoService;
/**
* @param templateName 签署任务模板名称,如果传了该参数,会根据名称模糊匹配查询,长度最大100个字符。
......@@ -51,50 +33,48 @@ public class FascController {
* @return: com.yifu.cloud.plus.v1.yifu.common.core.util.R<java.lang.String>
**/
@Operation(description = "获取模板")
@GetMapping("/getTemplate" )
@GetMapping("/getTemplate")
public R<String> getTemplate(@RequestParam(required = false) String templateName) throws ApiException {
return fascService.getTemplate(templateName);
}
/**
* 保存请求参数日志
*
* @param request
*/
private void saveReqLog(HttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
FddReqLog fddReqLog = new FddReqLog();
fddReqLog.setResData(JSON.toJSONString(parameterMap));
fddReqLog.setMethodName(Thread.currentThread().getStackTrace()[1].getMethodName());
fddReqLog.setClassName(Thread.currentThread().getStackTrace()[1].getClassName());
reqLogService.save(fddReqLog);
* @param id 合同待签订任务记录表TEmployeeContractPre:id
* @Description: 发起电子签署
* @Author: hgw
* @Date: 2025/10/13 17:24
* @return: com.yifu.cloud.plus.v1.yifu.common.core.util.R<java.lang.String>
**/
@Operation(description = "发起电子签署")
@GetMapping("/submitContract")
public R<String> submitContract(@RequestParam String id) throws ApiException {
return fascService.submitContract(id);
}
//验证签名
public void checkSign(HttpServletRequest request) throws Exception {
/* Map<String, String> paraMap = new HashMap<>(8);
paraMap.put(GlobalConstants.FDD_APPID, request.getHeader(GlobalConstants.FDD_APPID));
paraMap.put(GlobalConstants.FDD_SIGN_TYPE, request.getHeader(GlobalConstants.FDD_SIGN_TYPE));
paraMap.put(GlobalConstants.FDD_TIMESTAMP, request.getHeader(GlobalConstants.FDD_TIMESTAMP));
paraMap.put(GlobalConstants.FDD_NONCE, request.getHeader(GlobalConstants.FDD_NONCE));
paraMap.put(FDD_EVENT, request.getHeader(FDD_EVENT));
String fddBizContent = request.getParameter(FDD_BIZ_CONTENT);
paraMap.put(FDD_BIZ_CONTENT, fddBizContent);
//得到排序后的字符串,FddCryptUtil为法大大提供得签名工具类
String sortParam = FddCryptUtil.sortParameters(paraMap);
//计算之后得到签名 该签名需要放到请求头
String signature = FddCryptUtil.sign(sortParam, request.getHeader(GlobalConstants.FDD_TIMESTAMP), fddConfigProperties.getAppKey());
if (StringUtils.equals(signature, request.getHeader(GlobalConstants.FDD_API_SIGN))) {
FddReqLog fddReqLog = new FddReqLog();
paraMap.put(GlobalConstants.FDD_TIMESTAMP, request.getHeader(GlobalConstants.FDD_TIMESTAMP));
fddReqLog.setReqData(signature);
fddReqLog.setResData(JSON.toJSONString(paraMap));
fddReqLog.setMethodName(Thread.currentThread().getStackTrace()[1].getMethodName());
fddReqLog.setClassName(Thread.currentThread().getStackTrace()[1].getClassName());
reqLogService.save(fddReqLog);
return;
}*/
throw new CheckedException("签名异常");
/**
* @param id 合同待签订任务记录表TEmployeeContractPre:id
* @Description: 撤销签署
* @Author: hgw
* @Date: 2025/10/13 17:24
* @return: com.yifu.cloud.plus.v1.yifu.common.core.util.R<java.lang.String>
**/
@Operation(description = "撤销签署")
@GetMapping("/cancelTask")
public R<String> cancelTask(@RequestParam String id) throws ApiException {
return fascService.cancelTask(id);
}
/**
* @param id 合同待签订任务记录表TEmployeeContractPre:id
* @Description: 催办
* @Author: hgw
* @Date: 2025/10/13 17:24
* @return: com.yifu.cloud.plus.v1.yifu.common.core.util.R<java.lang.String>
**/
@Operation(description = "催办")
@GetMapping("/urgeTask")
public R<String> urgeTask(@RequestParam String id) throws ApiException {
return fascService.urgeTask(id);
}
}
......@@ -32,4 +32,14 @@ public interface FascService extends IService<FddContractInfo> {
// 获取模板
R<String> getTemplate(String templateName) throws ApiException;
// 推送法大大任务
R<String> submitContract(String id) throws ApiException;
// 撤销签署任务
R<String> cancelTask(String id) throws ApiException;
// 催办签署任务
R<String> urgeTask(String id) throws ApiException;
}
......@@ -19,23 +19,18 @@ package com.yifu.cloud.plus.v1.yifu.archives.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasc.open.api.exception.ApiException;
import com.fasc.open.api.v5_1.res.template.SignTemplateListInfo;
import com.yifu.cloud.plus.v1.yifu.archives.entity.FddContractInfo;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TFascEditLog;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TFascTemplate;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TFascTemplateDetail;
import com.yifu.cloud.plus.v1.yifu.archives.entity.*;
import com.yifu.cloud.plus.v1.yifu.archives.mapper.FddContractInfoMapper;
import com.yifu.cloud.plus.v1.yifu.archives.service.*;
import com.yifu.cloud.plus.v1.yifu.archives.utils.FascUtil;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 法大大专业版
......@@ -54,6 +49,7 @@ public class FascServiceImpl extends ServiceImpl<FddContractInfoMapper, FddContr
private final TFascPushLogService tFascPushLogService;
private final TFascTemplateService tFascTemplateService;
private final TFascTemplateDetailService tFascTemplateDetailService;
private final TEmployeeContractPreService tEmployeeContractPreService;
@Override
public R<String> getTemplate(String templateName) throws ApiException {
......@@ -95,10 +91,14 @@ public class FascServiceImpl extends ServiceImpl<FddContractInfoMapper, FddContr
}
// 主表:
TFascTemplate oldMain;
String logId;
for (TFascTemplate t : tList) {
oldMain = oldMainMap.get(t.getSignTemplateId());
if (oldMain != null) {
t.setId(oldMain.getId());
} else {
logId = String.valueOf(UUID.randomUUID()).replaceAll("-", "");
t.setId(logId);
}
this.addFascLogToList(t.getId(), CommonConstants.ONE_STRING, editContent1, logList);
updateMain.add(t);
......@@ -115,6 +115,9 @@ public class FascServiceImpl extends ServiceImpl<FddContractInfoMapper, FddContr
oldDetail = oldDetailMap.get(t.getSignTemplateId() + CommonConstants.DOWN_LINE_STRING + t.getFascFieldId());
if (oldDetail != null) {
t.setId(oldDetail.getId());
} else {
logId = String.valueOf(UUID.randomUUID()).replaceAll("-", "");
t.setId(logId);
}
this.addFascLogToList(t.getId(), CommonConstants.TWO_STRING, editContent1, logList);
updateDetail.add(t);
......@@ -157,4 +160,90 @@ public class FascServiceImpl extends ServiceImpl<FddContractInfoMapper, FddContr
}
/**
* @param id TEmployeeContractPre主键
* @Description: 推送法大大任务
* @Author: hgw
* @Date: 2025/10/15 16:40
* @return: com.yifu.cloud.plus.v1.yifu.common.core.util.R<java.lang.String>
**/
@Override
public R<String> submitContract(String id) throws ApiException {
// templateName 签署任务模板名称
TEmployeeContractPre contract = tEmployeeContractPreService.getById(id);
if (contract == null) {
return R.failed("未找到合同");
}
if (Common.isEmpty(contract.getFadadaTemplateId())) {
return R.failed("未找到合同模板ID,请联系管理员");
}
if (Common.isEmpty(contract.getSignType())) {
return R.failed("签署方式为空,请联系管理员");
} else if (!CommonConstants.ONE_STRING.equals(contract.getSignType())) {
return R.failed("签署方式不是电子签,不可发起电子签署");
}
if (Common.isEmpty(contract.getProcessStatus())) {
return R.failed("合同无状态,请联系管理员");
} else if (!CommonConstants.dingleDigitStrArray[1].equals(contract.getProcessStatus())
&& !CommonConstants.dingleDigitStrArray[5].equals(contract.getProcessStatus())
&& !CommonConstants.dingleDigitStrArray[7].equals(contract.getProcessStatus())) {
return R.failed("合同状态不是待发起、发起失败、签署失败,不可发起电子签署!");
}
if (Common.isNotNull(contract.getRequestId())) {
return R.failed("合同已发起,请勿重复发起!");
}
// TODO - 判断是否入职超过1个月
R<String> requestInfo = fascUtil.submitContract(contract, tFascPushLogService, tEmployeeContractPreService);
return requestInfo;
}
/**
* @param id TEmployeeContractPre主键
* @Description: 撤销签署任务
* @Author: hgw
* @Date: 2025/10/15 16:40
* @return: com.yifu.cloud.plus.v1.yifu.common.core.util.R<java.lang.String>
**/
@Override
public R<String> cancelTask(String id) throws ApiException {
// templateName 签署任务模板名称
TEmployeeContractPre contract = tEmployeeContractPreService.getById(id);
if (contract == null) {
return R.failed("未找到合同");
}
if (Common.isEmpty(contract.getRequestId())) {
return R.failed("无requestId,请检查数据");
}
// TODO - 判断什么状态撤销等,需要产品定
return fascUtil.cancelTask(contract, tFascPushLogService, tEmployeeContractPreService);
}
/**
* @param id TEmployeeContractPre主键
* @Description: 催办签署任务
* @Author: hgw
* @Date: 2025/10/15 17:56
* @return: com.yifu.cloud.plus.v1.yifu.common.core.util.R<java.lang.String>
**/
@Override
public R<String> urgeTask(String id) throws ApiException {
// templateName 签署任务模板名称
TEmployeeContractPre contract = tEmployeeContractPreService.getById(id);
if (contract == null) {
return R.failed("未找到合同");
}
if (Common.isEmpty(contract.getRequestId())) {
return R.failed("无requestId,请检查数据");
}
// TODO - 判断什么状态催办等,需要产品定
return fascUtil.urgeTask(contract, tFascPushLogService, tEmployeeContractPreService);
}
}
......@@ -36,5 +36,10 @@ public interface FascConstants {
// 控件类型是印章
String FIELD_ZHANG_TYPE = "corp_seal,corp_seal_cross_page";
// 撤销签署失败原因为 已完成签署(处理的同时员工完成签署公司免验证签完成),则更新为签署完成的“待归档”状态。
String FIELD_REASON = "已完成签署";
// 超时未签署自行变更为线下签
String TIME_OUT_REASON = "超时未签署自行变更为线下签";
//String FIELD_TYPE = "text_single_line,text_multi_line,number,id_card,fill_date,multi_radio,multi_checkbox,picture,select_box,table,verification_code,business_code";
}
package com.yifu.cloud.plus.v1.yifu.archives.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasc.open.api.bean.base.BaseRes;
import com.fasc.open.api.bean.common.Actor;
import com.fasc.open.api.bean.common.OpenId;
import com.fasc.open.api.bean.common.TemplateField;
import com.fasc.open.api.exception.ApiException;
import com.fasc.open.api.v5_1.client.OpenApiClient;
import com.fasc.open.api.v5_1.client.ServiceClient;
import com.fasc.open.api.v5_1.client.SignTaskClient;
import com.fasc.open.api.v5_1.client.TemplateClient;
import com.fasc.open.api.v5_1.req.signtask.*;
import com.fasc.open.api.v5_1.req.template.GetSignTemplateListReq;
import com.fasc.open.api.v5_1.req.template.SignTemplateDetailReq;
import com.fasc.open.api.v5_1.req.template.SignTemplateListFilterInfo;
import com.fasc.open.api.v5_1.res.service.AccessTokenRes;
import com.fasc.open.api.v5_1.res.signtask.CreateSignTaskRes;
import com.fasc.open.api.v5_1.res.template.DocumentInfo;
import com.fasc.open.api.v5_1.res.template.SignTemplateDetailRes;
import com.fasc.open.api.v5_1.res.template.SignTemplateListInfo;
import com.fasc.open.api.v5_1.res.template.SignTemplateListRes;
import com.yifu.cloud.plus.v1.yifu.archives.config.FascConfig;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TEmployeeContractPre;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TFascPushLog;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TFascTemplate;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TFascTemplateDetail;
import com.yifu.cloud.plus.v1.yifu.archives.service.TEmployeeContractPreService;
import com.yifu.cloud.plus.v1.yifu.archives.service.TFascPushLogService;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CacheConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.exception.CheckedException;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.DateUtil;
import com.yifu.cloud.plus.v1.yifu.common.core.util.LocalDateTimeUtils;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static com.alibaba.fastjson.serializer.SerializerFeature.*;
/**
* @Author: hgw
* @Date: 2025-9-25 14:24:53
......@@ -46,6 +59,11 @@ public class FascUtil {
@Autowired
private FascConfig fascConfig;
private static final SerializerFeature[] features = new SerializerFeature[]{
WriteMapNullValue, WriteNullNumberAsZero, WriteNullListAsEmpty,
WriteNullStringAsEmpty, WriteDateUseDateFormat
};
/**
* @Description: 获取token
* @Author: huyc
......@@ -107,7 +125,7 @@ public class FascUtil {
// 新增推送日志
TFascPushLog pushLog = new TFascPushLog();
pushLog.setTransReferenceId(fascConfig.getOpenId());
pushLog.setPushData(getSignTemplateListReq.toString());
pushLog.setPushData(JSON.toJSONString(getSignTemplateListReq, features));
pushLog.setTaskStatus(CommonConstants.ZERO_STRING);
pushLog.setTypeKey("获取所有模板");
pushLog.setTypeName("获取模板");
......@@ -117,7 +135,7 @@ public class FascUtil {
List<SignTemplateListInfo> list = null;
if (res != null) {
// 更新日志
pushLog.setReturnData(res.toString());
pushLog.setReturnData(JSON.toJSONString(res, features));
pushLog.setTaskStatus(res.isSuccess() ? CommonConstants.ONE_STRING : CommonConstants.TWO_STRING);
tFascPushLogService.updateById(pushLog);
......@@ -133,7 +151,7 @@ public class FascUtil {
pushLog = new TFascPushLog();
pushLog.setTransReferenceId(fascConfig.getOpenId());
pushLog.setPushData(getSignTemplateListReq.toString());
pushLog.setPushData(JSON.toJSONString(getSignTemplateListReq, features));
pushLog.setTaskStatus(CommonConstants.ZERO_STRING);
pushLog.setTypeKey(pushLog.getId() + "获取所有模板" + i);
pushLog.setTypeName("分页循环获取模板");
......@@ -142,7 +160,7 @@ public class FascUtil {
res = templateClient.getSignTemplateList(getSignTemplateListReq);
if (res != null) {
// 更新日志
pushLog.setReturnData(res.toString());
pushLog.setReturnData(JSON.toJSONString(res, features));
pushLog.setTaskStatus(res.isSuccess() ? CommonConstants.ONE_STRING : CommonConstants.TWO_STRING);
tFascPushLogService.updateById(pushLog);
......@@ -184,6 +202,7 @@ public class FascUtil {
String fieldType;
String isMust;
StringBuilder zhangName;
String docId;
for (SignTemplateListInfo mainInfo : templateList) {
if (mainInfo != null && mainInfo.getSignTemplateId() != null) {
zhangName = new StringBuilder();
......@@ -208,7 +227,7 @@ public class FascUtil {
// 新增推送日志
TFascPushLog pushLog = new TFascPushLog();
pushLog.setTransReferenceId(fascConfig.getOpenId());
pushLog.setPushData(signTemplateDetailReq.toString());
pushLog.setPushData(JSON.toJSONString(signTemplateDetailReq, features));
pushLog.setTaskStatus(CommonConstants.ZERO_STRING);
pushLog.setTypeKey("获取所有明细映射");
pushLog.setTypeName("获取明细映射");
......@@ -218,7 +237,7 @@ public class FascUtil {
if (res != null) {
// 更新日志
pushLog.setReturnData(res.toString());
pushLog.setReturnData(JSON.toJSONString(res, features));
pushLog.setTaskStatus(res.isSuccess() ? CommonConstants.ONE_STRING : CommonConstants.TWO_STRING);
tFascPushLogService.updateById(pushLog);
......@@ -229,7 +248,8 @@ public class FascUtil {
}
// 循环文档(1,2,3)
for (DocumentInfo doc : res.getData().getDocs()) {
if (doc.getDocFields() != null) {
if (doc.getDocFields() != null && Common.isNotNull(doc.getDocId())) {
docId = String.valueOf(doc.getDocId());
// 循环文档里的字段
for (TemplateField fields : doc.getDocFields()) {
fieldType = fields.getFieldType();
......@@ -238,6 +258,7 @@ public class FascUtil {
// 文本数字等控件
detail = new TFascTemplateDetail();
detail.setSignTemplateId(signTemplateId);
detail.setFascDocId(docId);
detail.setFascField(fields.getFieldName());
detail.setFascFieldId(fields.getFieldId());
isMust = CommonConstants.ONE_STRING;
......@@ -291,4 +312,299 @@ public class FascUtil {
}
}
public R<String> submitContract(TEmployeeContractPre contract, TFascPushLogService tFascPushLogService
, TEmployeeContractPreService tEmployeeContractPreService) throws ApiException {
OpenApiClient openApiClient = new OpenApiClient(fascConfig.getAppId(), fascConfig.getAppSecret(), fascConfig.getAppUrl());
String accessToken = this.getFascToken(openApiClient);
OpenId openId = new OpenId();
openId.setIdType(CacheConstants.FASC_ID_TYPE);
openId.setOpenId(fascConfig.getOpenId());
SignTaskClient signTaskClient = new SignTaskClient(openApiClient);
CreateWithTemplateReq createWithTemplateReq = new CreateWithTemplateReq();
createWithTemplateReq.setAccessToken(accessToken);
createWithTemplateReq.setInitiator(openId);
createWithTemplateReq.setSignTaskSubject("签署合同-" + contract.getEmpIdcard() + CommonConstants.DOWN_LINE_STRING + DateUtil.getThisTime());
createWithTemplateReq.setAutoStart(false);// 不要自动提交
createWithTemplateReq.setAutoFillFinalize(true);// 自动定稿
createWithTemplateReq.setAutoFinish(true);// 签署完成后自动结束
createWithTemplateReq.setCertCAOrg("CFCA");// 签署参与方使用的签章证书颁发机构,默认无要求。CFCA:要求使用CFCA(中国金融认证中心);EZCA:要求使用东方中讯CA
createWithTemplateReq.setSignTemplateId(contract.getFadadaTemplateId());
// 核心代码:设置参与方列表
createWithTemplateReq.setActors(this.buildActors(contract));
// 新增推送日志
TFascPushLog pushLog = new TFascPushLog();
pushLog.setTransReferenceId(fascConfig.getOpenId());
pushLog.setPushData(JSON.toJSONString(createWithTemplateReq, features));
pushLog.setTaskStatus(CommonConstants.ZERO_STRING);
String empIdCard = contract.getEmpIdcard();
pushLog.setTypeKey("发起合同签署任务,身份证:" + empIdCard);
pushLog.setTypeName("发起合同签署任务");
pushLog.setContractId(contract.getId());
tFascPushLogService.save(pushLog);
BaseRes<CreateSignTaskRes> res = signTaskClient.createWithTemplate(createWithTemplateReq);
String requestId = null;
String msg = "法大大第一步创建签署任务失败!";
if (res != null) {
// 更新日志
pushLog.setReturnData(JSON.toJSONString(res, features));
pushLog.setTaskStatus(res.isSuccess() ? CommonConstants.ONE_STRING : CommonConstants.TWO_STRING);
if (res.isSuccess() && res.getData() != null && res.getData().getSignTaskId() != null) {
requestId = res.getData().getSignTaskId();
pushLog.setSignTaskId(requestId);
}
tFascPushLogService.updateById(pushLog);
if (Common.isNotNull(requestId)) {
// 第二步:填写控件
R<String> sendValue = buildDocFieldValue(contract, requestId, openApiClient, accessToken);
if (R.isSuccess(sendValue)) {
// 第三步:提交任务
sendValue = submitTask(requestId, openApiClient, accessToken);
if (R.isSuccess(sendValue)) {
// 电子签签署中
this.doSuccessContract(contract, tEmployeeContractPreService, requestId);
return R.ok();
} else {
msg = "第三步失败:提交任务失败:" + sendValue.getMsg();
}
} else {
msg = "第二步失败:填写控件失败:" + sendValue.getMsg();
}
} else {
msg = "第一步失败:" + res.getMsg();
}
}
this.doFailContract(contract, tEmployeeContractPreService, msg);
return R.failed(msg);
}
// 发起失败,更新合同状态
private void doFailContract(TEmployeeContractPre contract, TEmployeeContractPreService tEmployeeContractPreService, String msg) {
contract.setProcessStatus(CommonConstants.dingleDigitStrArray[7]);
contract.setRequestMsg(msg);
tEmployeeContractPreService.updateById(contract);
}
// 发起成功,更新合同状态
private void doSuccessContract(TEmployeeContractPre contract, TEmployeeContractPreService tEmployeeContractPreService, String requestId) {
// 电子签签署中
contract.setProcessStatus(CommonConstants.dingleDigitStrArray[6]);
contract.setRequestId(requestId);
contract.setRequestMsg("");
tEmployeeContractPreService.updateById(contract);
}
// 第二步:填写控件
private R<String> buildDocFieldValue(TEmployeeContractPre contract, String requestId
, OpenApiClient openApiClient, String accessToken) throws ApiException {
SignTaskClient signTaskClient = new SignTaskClient(openApiClient);
FillFieldValuesReq fillFieldValuesReq = new FillFieldValuesReq();
fillFieldValuesReq.setSignTaskId(requestId);
List<DocFieldValueInfo> docFieldValues = new ArrayList<>();
DocFieldValueInfo dfv = new DocFieldValueInfo();
dfv.setDocId("78112332");
dfv.setFieldId("9738851979");
dfv.setFieldValue(contract.getEmployeeName());
docFieldValues.add(dfv);
dfv = new DocFieldValueInfo();
dfv.setDocId("78112332");
dfv.setFieldId("2324432163");
dfv.setFieldValue(contract.getEmpIdcard());
docFieldValues.add(dfv);
fillFieldValuesReq.setDocFieldValues(docFieldValues);
fillFieldValuesReq.setAccessToken(accessToken);
BaseRes<Void> res = signTaskClient.fillFieldValues(fillFieldValuesReq);
if (res != null) {
if (res.isSuccess()) {
return R.ok();
}
return R.failed(res.getMsg());
}
return R.failed("res无返回");
}
// 第三步:提交任务
private R<String> submitTask(String requestId, OpenApiClient openApiClient, String accessToken) throws ApiException {
SignTaskClient signTaskClient = new SignTaskClient(openApiClient);
SignTaskBaseReq signTaskBaseReq = new SignTaskBaseReq();
signTaskBaseReq.setSignTaskId(requestId);
signTaskBaseReq.setAccessToken(accessToken);
BaseRes<Void> res = signTaskClient.start(signTaskBaseReq);
if (res != null) {
if (res.isSuccess()) {
return R.ok();
}
return R.failed(res.getMsg());
}
return R.failed("res无返回");
}
/**
* 构建参与方列表
*/
private List<AddActorsTempInfo> buildActors(TEmployeeContractPre contract) {
List<AddActorsTempInfo> actors = new ArrayList<>();
// 添加企业方(甲方)
actors.add(buildCompanyActor(contract));
// 核心代码:添加员工方(乙方)
actors.add(buildEmployeeActor(contract));
return actors;
}
/**
* 构建企业方参与方
*/
private AddActorsTempInfo buildCompanyActor(TEmployeeContractPre contract) {
AddActorsTempInfo companyActor = new AddActorsTempInfo();
Actor actor = new Actor();
// TODO - 改造签署openID到mysql表里配置
// TODO - 参与方1 在模板详情接口返回
actor.setActorId("发起企业"); // 与模板中的参与方标识一致
actor.setActorType(CacheConstants.FASC_ID_TYPE);
actor.setActorName("安徽皖信人力资源管理有限公司");
// 权限设置
actor.setPermissions(Collections.singletonList("sign"));
// 企业OpenId
actor.setActorOpenId(fascConfig.getOpenId());
// 通知设置
actor.setSendNotification(true);
// 通知地址:注:如参与方已传actorOpenId、acterFDDId或accountName,该字段会被忽略
/*if Common.isNotNull(contract.getEmpPhone()))
actor.setNotifyAddress(contract.getEmpPhone()
}*/
actor.setNotifyType(Collections.singletonList("start"));
companyActor.setActor(actor);
return companyActor;
}
/**
* 构建员工方参与方
*/
private AddActorsTempInfo buildEmployeeActor(TEmployeeContractPre contract) {
AddActorsTempInfo employeeActor = new AddActorsTempInfo();
Actor actor = new Actor();
// TODO - 改造签署openID到mysql表里配置
// TODO - 参与方1 在模板详情接口返回
actor.setActorId("个人签署"); // 与模板中的参与方标识一致
actor.setActorType(CacheConstants.FASC_ID_TYPE_PERSON);
actor.setActorName(contract.getEmployeeName());
// 权限设置
actor.setPermissions(Collections.singletonList("sign"));
// 通知设置
actor.setSendNotification(true);
if (Common.isNotNull(contract.getEmpPhone())) {
actor.setNotifyAddress(contract.getEmpPhone());
}
actor.setNotifyType(Collections.singletonList("start"));
employeeActor.setActor(actor);
return employeeActor;
}
// 撤销签署
public R<String> cancelTask(TEmployeeContractPre contract, TFascPushLogService tFascPushLogService
, TEmployeeContractPreService tEmployeeContractPreService) throws ApiException {
OpenApiClient openApiClient = new OpenApiClient(fascConfig.getAppId(), fascConfig.getAppSecret(), fascConfig.getAppUrl());
String accessToken = this.getFascToken(openApiClient);
SignTaskClient signTaskClient = new SignTaskClient(openApiClient);
SignTaskCancelReq signTaskCancelReq = new SignTaskCancelReq();
signTaskCancelReq.setSignTaskId(contract.getRequestId());
signTaskCancelReq.setAccessToken(accessToken);
// 新增推送日志
TFascPushLog pushLog = new TFascPushLog();
pushLog.setTransReferenceId(fascConfig.getOpenId());
pushLog.setPushData(JSON.toJSONString(signTaskCancelReq, features));
pushLog.setTaskStatus(CommonConstants.ZERO_STRING);
String empIdCard = contract.getEmpIdcard();
pushLog.setTypeKey("发起撤销签署任务,身份证:" + empIdCard);
pushLog.setTypeName("发起撤销签署任务");
pushLog.setContractId(contract.getId());
tFascPushLogService.save(pushLog);
BaseRes<Void> res = signTaskClient.cancel(signTaskCancelReq);
if (res != null) {
pushLog.setReturnData(JSON.toJSONString(res, features));
pushLog.setTaskStatus(res.isSuccess() ? CommonConstants.ONE_STRING : CommonConstants.TWO_STRING);
tFascPushLogService.updateById(pushLog);
if (res.isSuccess()) {
contract.setProcessStatus(CommonConstants.dingleDigitStrArray[1]);
contract.setSignType(CommonConstants.dingleDigitStrArray[1]);
contract.setRequestMsg("");
tEmployeeContractPreService.updateById(contract);
return R.ok();
} else {
// 撤销签署失败原因为 已完成签署(处理的同时员工完成签署公司免验证签完成),则更新为签署完成的“待归档”状态。
if (Common.isNotNull(res.getMsg()) && FascConstants.FIELD_REASON.equals(res.getMsg())) {
contract.setProcessStatus(CommonConstants.dingleDigitStrArray[8]);
contract.setRevokeReason(FascConstants.TIME_OUT_REASON);
}
contract.setRequestMsg(res.getMsg());
tEmployeeContractPreService.updateById(contract);
return R.failed(res.getMsg());
}
}
return R.failed("res无返回");
}
// 催办
public R<String> urgeTask(TEmployeeContractPre contract, TFascPushLogService tFascPushLogService
, TEmployeeContractPreService tEmployeeContractPreService) throws ApiException {
OpenApiClient openApiClient = new OpenApiClient(fascConfig.getAppId(), fascConfig.getAppSecret(), fascConfig.getAppUrl());
String accessToken = this.getFascToken(openApiClient);
SignTaskClient signTaskClient = new SignTaskClient(openApiClient);
SignTaskBaseReq signTaskBaseReq = new SignTaskBaseReq();
signTaskBaseReq.setSignTaskId(contract.getRequestId());
signTaskBaseReq.setAccessToken(accessToken);
// 新增推送日志
TFascPushLog pushLog = new TFascPushLog();
pushLog.setTransReferenceId(fascConfig.getOpenId());
pushLog.setPushData(JSON.toJSONString(signTaskClient, features));
pushLog.setTaskStatus(CommonConstants.ZERO_STRING);
String empIdCard = contract.getEmpIdcard();
pushLog.setTypeKey("发起催办任务,身份证:" + empIdCard);
pushLog.setTypeName("发起催办任务");
pushLog.setContractId(contract.getId());
tFascPushLogService.save(pushLog);
BaseRes<Void> res = signTaskClient.signTaskUrge(signTaskBaseReq);
if (res != null) {
pushLog.setReturnData(JSON.toJSONString(res, features));
pushLog.setTaskStatus(res.isSuccess() ? CommonConstants.ONE_STRING : CommonConstants.TWO_STRING);
tFascPushLogService.updateById(pushLog);
if (res.isSuccess()) {
return R.ok();
} else {
contract.setRequestMsg(res.getMsg());
tEmployeeContractPreService.updateById(contract);
return R.failed(res.getMsg());
}
}
return R.failed("res无返回");
}
}
......@@ -8,6 +8,7 @@ spring:
redis:
host: 127.0.0.1
port: 6379
password: '@yf_2017'
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
......
......@@ -24,6 +24,7 @@
<result property="errorInfo" column="error_info"/>
<result property="errorTime" column="error_time"/>
<result property="fadadaTemplate" column="fadada_template"/>
<result property="fadadaTemplateId" column="fadada_template_id"/>
<result property="dataSource" column="data_source"/>
<result property="expectedCollectionTime" column="expected_collection_time"/>
<result property="contractStart" column="contract_start"/>
......@@ -84,7 +85,9 @@
<result property="createName" column="create_name"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="contractSubName" column="CONTRACT_SUB_NAME,"/>
<result property="contractSubName" column="CONTRACT_SUB_NAME"/>
<result property="requestId" column="request_id"/>
<result property="requestMsg" column="request_msg"/>
</resultMap>
<sql id="Base_Column_List">
id
......@@ -103,6 +106,7 @@
,customer_user_loginname
,sign_type
,fadada_template
,fadada_template_id
,data_source
,expected_confirm_time
,expected_collection_time
......@@ -165,6 +169,8 @@
,TASK
,TASK_TYPE
,TASK_END_STANDARD,contract_flag,a.CONTRACT_SUB_NAME
,a.request_id
,a.request_msg
</sql>
<sql id="tEmployeeContractPre_where">
<if test="tEmployeeContractPre != null">
......
......@@ -41,6 +41,7 @@
<result property="signTemplateName" column="sign_template_name"/>
<result property="signTemplateStatus" column="sign_template_status"/>
<result property="contractType" column="contract_type"/>
<result property="fascDocId" column="fasc_doc_id"/>
</resultMap>
<resultMap id="tFascTemplateDetailExportMap" type="com.yifu.cloud.plus.v1.yifu.archives.vo.TFascTemplateDetailExportVo">
......@@ -59,6 +60,7 @@
<sql id="Base_Column_List">
a.id,
a.sign_template_id,
a.fasc_doc_id,
a.fasc_field,
a.fasc_field_id,
a.is_must,
......
......@@ -202,6 +202,7 @@ public interface CacheConstants {
String FASC_ACCOSS_TOKEN = "FASC_ACCOSS_TOKEN";
// 如果idType为corp:代表应用系统上的企业用户,主体方是openCorpId所指定的企业
String FASC_ID_TYPE = "corp";
String FASC_ID_TYPE_PERSON = "person";
/**
* 登录用户最近一次选择的收入证明单位名称
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment