提交 5efb14ae 作者: xiaowang

合同签署

上级 bfbf58e6
......@@ -29,4 +29,10 @@ public class ContractVO implements Serializable {
@ApiModelProperty(value = "合同标题")
@NotNull(message = "合同标题不能为空")
private String title;
@ApiModelProperty(value = "端口:0小程序 1后台")
private Integer port;
@ApiModelProperty(value = "unionId", hidden = true)
private String unionId;
}
......@@ -25,6 +25,4 @@ public class SealVO implements Serializable {
private String unionId;
@ApiModelProperty(value = "端口:0小程序 1后台")
private Integer port;
@ApiModelProperty(value = "印章状态 0非默认 1默认")
private Integer sealStatus;
}
......@@ -28,9 +28,7 @@ public class FddConstant {
//小程序企业实名认证异步回调
public static final String NOTIFY_E_CERT_RES = "fdd/notifyECertRes";
//签署合同异步回调
public static final String NOTIFY_STAMP = "fddservlet/contract/notifyStamp";
public static final String UAV_NOTIFY_STAMP = "fddservlet/uav/contract/notifyStamp";
public static final String NOTIFY_STAMP = "fdd/contract/notifyStamp";
public static final String APP_ID = "appId";
......
......@@ -7,17 +7,19 @@ import com.mmc.iuav.user.service.fdd.ContractService;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @Author LW
* @date 2022/9/5 14:31
* 概要:
*/
@Api(tags = {"无人机城--合同管理" })
@Api(tags = {"合同管理"})
@RestController
@RequestMapping("/uav/contract/")
@RequestMapping("/contract/")
public class ContractController extends BaseController {
@Autowired
private ContractService contractService;
......@@ -26,7 +28,7 @@ public class ContractController extends BaseController {
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("/uploadContract")
public ResultBody uploadContract(@RequestBody ContractVO param, HttpServletRequest request) {
return contractService.uploadContract(param, this.getUserLoginInfoFromRedis(request).getUserAccountId());
return contractService.uploadContract(param, this.getUserLoginInfoFromRedis(request));
}
@ApiOperation(value = "合同预览")
......@@ -51,14 +53,14 @@ public class ContractController extends BaseController {
HttpServletRequest request, @ApiParam(value = "端口:0小程序 1后台") @RequestParam(value = "port") Integer port) {
return contractService.stamp(contractId, this.getUserLoginInfoFromRedis(request), pages, port);
}
//
// @ApiOperation(value = "异步处理手动签署信息")
// @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
// @PostMapping("notifyStamp")
// @ApiIgnore
// public ResultBody notifyStamp(@RequestParam Map<String, String> map) {
// return uavContractManageService.notifyStamp(map);
// }
@ApiOperation(value = "异步处理手动签署信息")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("notifyStamp")
@ApiIgnore
public ResultBody notifyStamp(@RequestParam Map<String, String> map) {
return contractService.notifyStamp(map);
}
//
// @ApiOperation(value = "合同签署信息-条件查询")
// @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
......
......@@ -6,6 +6,7 @@ import com.mmc.iuav.user.model.fdd.dto.FddVerifyInfoDTO;
import com.mmc.iuav.user.model.fdd.dto.UserFddDTO;
import com.mmc.iuav.user.model.fdd.resp.CompanyVerifyResp;
import com.mmc.iuav.user.model.fdd.resp.PersonVerifyResp;
import com.mmc.iuav.user.service.fdd.FddService;
import com.mmc.iuav.user.service.fdd.UserFddAuthService;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -19,7 +20,7 @@ import java.util.Map;
* @author:lw Date:2022/9/1
* time:15:44
*/
@Api(tags = {"fdd用户认证" })
@Api(tags = {"fdd用户认证"})
@RestController
@RequestMapping("/fdd/")
public class UserFddAuthController extends BaseController {
......@@ -27,6 +28,9 @@ public class UserFddAuthController extends BaseController {
@Autowired
private UserFddAuthService userFddAuthService;
@Autowired
private FddService fddService;
@ApiOperation(value = "注册法大大账号")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = String.class)})
@ApiIgnore
......@@ -49,6 +53,13 @@ public class UserFddAuthController extends BaseController {
return userFddAuthService.getCompanyVerifyUrl(port, this.getUserLoginInfoFromRedis(request));
}
@ApiOperation(value = "申请实名证书")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = String.class)})
@GetMapping("getApplyCert")
public String getApplyCert(@RequestParam String customerId, @RequestParam String transactionNo) {
return fddService.getApplyCert(customerId, transactionNo);
}
@ApiOperation(value = "异步处理企业实名认证")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@ApiIgnore
......
......@@ -18,7 +18,7 @@ public interface ContractDao {
*/
void insertUavContractInfo(ContractInfoDO uavContractInfoDO);
ContractInfoDO contractInfoByOrderNo(String orderNo);
ContractInfoDO contractInfoByOrderNo(String orderNo, String contractNo);
void deleteContractInfo(String orderNo);
}
......@@ -23,7 +23,7 @@ public class ContractInfoDO implements Serializable {
/**
* 发起合同方用户id
*/
private Integer userAccountId;
private String unionId;
/**
* 订单号
*/
......@@ -37,7 +37,7 @@ public class ContractInfoDO implements Serializable {
*/
private String contractTitle;
/**
* 状态: 0、等待(买家/供应商)签署 1、(买家/供应商)签署失败 2、等待平台签署((买家/供应商)签署成功) 3、平台签署失败 4、平台签署成功、5、归档
* 状态: 0、等待平台签署1、平台签署失败 2、等待(买家/供应商)签署(平台签署成功) 3、(买家/供应商)签署失败 4、(买家/供应商)签署成功、5、归档
*/
private Integer signStatus;
/**
......@@ -45,19 +45,19 @@ public class ContractInfoDO implements Serializable {
*/
private Date singerTime;
/**
* (买家/供应商)签署失败备注信息
* 平台签署失败备注信息
*/
private String aRemark;
/**
* 平台签署失败备注信息
* (买家/供应商)签署失败备注信息
*/
private String bRemark;
/**
* (买家/供应商)签署交易号
* 平台签署交易号
*/
private String aTransactionId;
/**
* 平台签署交易号
* (买家/供应商)签署交易号
*/
private String bTransactionId;
......
......@@ -4,6 +4,8 @@ import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
import com.mmc.iuav.user.model.fdd.vo.ContractVO;
import java.util.Map;
/**
* @Author LW
* @date 2022/9/5 14:38
......@@ -17,7 +19,7 @@ public interface ContractService {
* @param id
* @return
*/
ResultBody uploadContract(ContractVO param, Integer id);
ResultBody uploadContract(ContractVO param, LoginSuccessDTO loginSuccessDTO);
ResultBody viewContract(String contractId);
......@@ -25,36 +27,13 @@ public interface ContractService {
ResultBody stamp(String contractId, LoginSuccessDTO loginSuccessDTO, String pages, Integer port);
// /**
// * 预览合同
// * @param contractId
// * @return
// */
// ResultBody viewContract(String contractId);
//
// /**
// * 下载合同
// * @param contractId
// * @return
// */
// String downloadContract(String contractId);
//
// /**
// * 手动签署
// * @param contractId
// * @param id
// * @param unionId
// * @param pages
// * @return
// */
// ResultBody stamp(String contractId, Integer id,String unionId,String pages);
//
// /**
// * 异步回调
// * @param map
// * @return
// */
// ResultBody notifyStamp(Map<String, String> map);
/**
* 异步回调
*
* @param map
* @return
*/
ResultBody notifyStamp(Map<String, String> map);
//
// /**
// * 选择列表
......
......@@ -23,4 +23,6 @@ public interface SealManageService {
ResultBody getSealInfo(String signatureId, Integer port, LoginSuccessDTO loginSuccessDTO);
ResultBody editSealName(String signatureId, Integer port, LoginSuccessDTO loginSuccessDTO, String sealName);
ResultBody checkAuthStatus(Integer port, LoginSuccessDTO loginSuccessDTO);
}
......@@ -3,23 +3,29 @@ package com.mmc.iuav.user.service.fdd.impl;
import com.alibaba.fastjson.JSONObject;
import com.fadada.sdk.base.client.FddBaseClient;
import com.fadada.sdk.base.model.req.DownloadPdfParams;
import com.fadada.sdk.base.model.req.ExtSignParams;
import com.fadada.sdk.base.model.req.UploadDocsParams;
import com.fadada.sdk.base.model.req.ViewPdfURLParams;
import com.fadada.sdk.utils.crypt.FddEncryptTool;
import com.mmc.iuav.general.CodeUtil;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.response.ResultEnum;
import com.mmc.iuav.user.constant.fdd.FddConnectConstant;
import com.mmc.iuav.user.constant.fdd.FddConstant;
import com.mmc.iuav.user.dao.fdd.ContractDao;
import com.mmc.iuav.user.entity.fdd.ContractInfoDO;
import com.mmc.iuav.user.entity.fdd.UserFddDO;
import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
import com.mmc.iuav.user.model.fdd.vo.ContractVO;
import com.mmc.iuav.user.service.fdd.ContractService;
import com.mmc.iuav.user.service.fdd.SealManageService;
import com.mmc.iuav.user.util.TDateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Map;
import java.util.UUID;
/**
* @Author LW
......@@ -31,19 +37,22 @@ import javax.annotation.Resource;
public class ContractServiceImpl implements ContractService {
@Resource
ContractDao contractDao;
@Resource
SealManageService sealManageService;
/**
* 上传合同
*
* @param param
* @param id
* @return
*/
@Override
public ResultBody uploadContract(ContractVO param, Integer id) {
public ResultBody uploadContract(ContractVO param, LoginSuccessDTO loginSuccessDTO) {
ResultBody resultBody = sealManageService.checkAuthStatus(param.getPort(), loginSuccessDTO);
UserFddDO userFddDO = (UserFddDO) resultBody.getResult();
FddBaseClient baseClient = new FddBaseClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
// 查询这个订单号之前有没有上传过合同有的话就删除
ContractInfoDO contractInfoDO = contractDao.contractInfoByOrderNo(param.getOrderNo());
ContractInfoDO contractInfoDO = contractDao.contractInfoByOrderNo(param.getOrderNo(), null);
if (contractInfoDO != null) {
// 把合同删除
contractDao.deleteContractInfo(param.getOrderNo());
......@@ -70,7 +79,7 @@ public class ContractServiceImpl implements ContractService {
contractInfo.setContractTitle(param.getTitle());
contractInfo.setOrderNo(param.getOrderNo());
contractInfo.setContractNo(contractId);
contractInfo.setUserAccountId(id);
contractInfo.setUnionId(userFddDO.getUnionId());
contractDao.insertUavContractInfo(contractInfo);
return ResultBody.success(contractInfo);
} else {
......@@ -105,6 +114,60 @@ public class ContractServiceImpl implements ContractService {
@Override
public ResultBody stamp(String contractId, LoginSuccessDTO loginSuccessDTO, String pages, Integer port) {
return null;
ResultBody resultBody = sealManageService.checkAuthStatus(port, loginSuccessDTO);
UserFddDO userFddDO = (UserFddDO) resultBody.getResult();
// 获取合同信息
ContractInfoDO contractInfo = contractDao.contractInfoByOrderNo(null, contractId);
FddBaseClient baseClient = new FddBaseClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
ExtSignParams params = new ExtSignParams();
String transactionId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
//平台自定义唯一交易号
params.setTransactionId(transactionId);
//此处传入调用上传或填充合同接口成功时定义的合同编号
params.setContractId(contractId);
params.setCustomerId(userFddDO.getCustomerId());
params.setDocTitle(contractInfo.getContractTitle());
if (pages != null) {
params.setOpenEnvironment("1");
params.setReturnUrl(pages);
} else {
params.setOpenEnvironment("0");
}
params.setNotifyUrl(FddConnectConstant.MMC_URL + FddConstant.NOTIFY_STAMP);
params.setMobileSignType("0");
String result = baseClient.invokeExtSign(params);
// 将链接转成base64返回
String base64 = new String(FddEncryptTool.Base64Encode(result.getBytes())).trim();
ContractInfoDO updateContract = new ContractInfoDO();
updateContract.setContractNo(contractId);
if (contractInfo.getUnionId().equals(userFddDO.getUnionId())) {
updateContract.setATransactionId(transactionId);
} else {
updateContract.setBTransactionId(transactionId);
}
return ResultBody.success(base64);
}
@Override
public ResultBody notifyStamp(Map<String, String> map) {
log.info("合同签署异步回调返回数据,{}", map.toString());
String transactionId = map.get("transaction_id");// 交易号
String contractId = map.get("contract_id");// 合同编号
String resultCode = map.get("result_code");// 返回的code码
String resultDesc = map.get("result_desc");// 签章结果描述信息
String timestamp = map.get("timestamp");// 时间戳
String msgDigest = map.get("msg_digest");// 摘要
String sha1 = FddEncryptTool.sha1(FddConnectConstant.APP_KEY + transactionId);
try {
String md5 = FddEncryptTool.md5Digest(timestamp);
String outSha1 = FddEncryptTool.sha1(FddConnectConstant.APP_ID + md5 + sha1);
String base64 = new String(FddEncryptTool.Base64Encode(outSha1.getBytes())).trim();
if (!base64.equals(msgDigest)) {
return ResultBody.error(ResultEnum.NOT_FOUND);
}
} catch (Exception e) {
return ResultBody.error(ResultEnum.NOT_FOUND);
}
return ResultBody.success();
}
}
......@@ -52,21 +52,9 @@ public class SealManageServiceImpl implements SealManageService {
@Override
public ResultBody uploadSeal(SealVO sealVO, LoginSuccessDTO loginSuccessDTO) {
// 判断当前用户是那个端口进来的用户,根据不同端口用户设置不同的unionId
if (sealVO.getPort().equals(0)) {
UserAccountDO userInfo = userServiceDao.getUserAccountById(loginSuccessDTO.getUserAccountId());
String uid = userFddAuthService.replaceUnableString(userInfo.getUnionId());
sealVO.setUnionId(uid);
} else {
sealVO.setUnionId(loginSuccessDTO.getUserAccountId().toString());
}
// 获取用户法大大的(实名/企业)认证信息
UserFddDO userFddInfo = userFddAuthDao.getAppUserFddInfo(sealVO.getUnionId());
if (userFddInfo == null) {
return ResultBody.error(ResultEnum.BUSINESS_LICENSE_CHECK_ERROR);
} else if (!userFddInfo.getPersonVerifyStatus().equals(2) || !userFddInfo.getEntVerifyStatus().equals(4)) {
return ResultBody.error(ResultEnum.BUSINESS_LICENSE_CHECK_NOT_PASS);
}
ResultBody resultBody = this.checkAuthStatus(sealVO.getPort(), loginSuccessDTO);
UserFddDO userFddInfo = (UserFddDO) resultBody.getResult();
sealVO.setUnionId(userFddInfo.getUnionId());
FddBaseClient baseClient = new FddBaseClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
AddSignatureParams params = new AddSignatureParams();
//客户编号
......@@ -80,6 +68,8 @@ public class SealManageServiceImpl implements SealManageService {
if (!JSONObject.parseObject(result).getString(FddConstant.CODE).equals(FddConstant.SUCCESS)) {
return ResultBody.error(JSONObject.parseObject(result).getString(FddConstant.MSG));
} else {
// 根据当前用户查询印章列表
getSealInfoListByUnionId(sealVO.getUnionId());
// 获取返回的印章编号
String dataStr = JSONObject.parseObject(result).getString(FddConstant.DATA);
String signatureId = JSONObject.parseObject(dataStr).getString(FddConstant.SIGNATURE_ID);
......@@ -87,7 +77,6 @@ public class SealManageServiceImpl implements SealManageService {
sealInfoDO.setSealName(sealVO.getSealName());
sealInfoDO.setSignatureId(signatureId);
sealInfoDO.setUnionId(sealVO.getUnionId());
sealInfoDO.setSealStatus(sealVO.getSealStatus());
sealInfoDO.setSealUrl(sealVO.getSealUrl());
// 新增印章信息
sealManageDao.insertSealInfo(sealInfoDO);
......@@ -95,6 +84,18 @@ public class SealManageServiceImpl implements SealManageService {
}
}
private void getSealInfoListByUnionId(String unionId) {
List<SealInfoDO> sealInfoList = sealManageDao.getSealInfoListByUnionId(unionId);
// 判断是否有状态是默认的章(默认:0 非默认:1)
List<Integer> sealIds = sealInfoList.stream()
.filter(d -> d.getSealStatus() == 1)
.map(SealInfoDO::getId).collect(Collectors.toList());
// 将默认章的状态进行更换
if (sealIds.size() > 0) {
sealManageDao.updateSealStatusById(sealIds);
}
}
@Override
public PageResult getSealInfoList(SealInfoVO param, LoginSuccessDTO loginSuccessDTO) {
if (param.getPort().equals(0)) {
......@@ -133,6 +134,7 @@ public class SealManageServiceImpl implements SealManageService {
}
@Override
@Transactional
public ResultBody checkAuthStatus(Integer port, LoginSuccessDTO loginSuccessDTO) {
String uid;
......@@ -146,7 +148,10 @@ public class SealManageServiceImpl implements SealManageService {
UserFddDO userFddInfo = userFddAuthDao.getAppUserFddInfo(uid);
if (userFddInfo == null) {
return ResultBody.error(ResultEnum.BUSINESS_LICENSE_CHECK_ERROR);
} else if (!userFddInfo.getPersonVerifyStatus().equals(2) || !userFddInfo.getEntVerifyStatus().equals(4)) {
}
boolean isPersonVerified = userFddInfo.getAccountType().equals(1) && userFddInfo.getPersonVerifyStatus().equals(2);
boolean isEntVerified = userFddInfo.getAccountType().equals(2) && userFddInfo.getEntVerifyStatus().equals(4);
if (!isPersonVerified && !isEntVerified) {
return ResultBody.error(ResultEnum.BUSINESS_LICENSE_CHECK_NOT_PASS);
}
return ResultBody.success(userFddInfo);
......@@ -163,14 +168,7 @@ public class SealManageServiceImpl implements SealManageService {
params.setSignatureId(signatureId);
String result = client.invokeDefaultSignature(params);
// 获取印章列表
List<SealInfoDO> sealInfoList = sealManageDao.getSealInfoListByUnionId(userFddInfo.getUnionId());
// 判断是否有状态是默认的章(默认:0 非默认:1)
List<Integer> sealIds = sealInfoList.stream()
.filter(d -> d.getSealStatus() == 1)
.map(SealInfoDO::getId).collect(Collectors.toList());
if (sealIds.size() > 0) {
sealManageDao.updateSealStatusById(sealIds);
}
getSealInfoListByUnionId(userFddInfo.getUnionId());
sealManageDao.updateSealStatusBySignatureId(signatureId);
if (!JSONObject.parseObject(result).getString(FddConstant.CODE).equals(FddConstant.SUCCESS)) {
// 如果失败,手动回滚修改的数据
......
......@@ -3,6 +3,10 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.iuav.user.dao.fdd.ContractDao">
<insert id="insertUavContractInfo">
insert into contract_info (union_id, order_no, contract_no, contract_title)
values (#{unionId}, #{orderNo}, #{contractNo}, #{contractTitle})
</insert>
<delete id="deleteContractInfo">
delete
from contract_info
......@@ -11,20 +15,27 @@
<select id="contractInfoByOrderNo" resultType="com.mmc.iuav.user.entity.fdd.ContractInfoDO">
select id,
user_account_id,
order_no,
contract_no,
contract_title,
sign_status,
singer_time,
a_remark,
b_remark,
a_transaction_id,
b_transaction_id,
create_time,
update_time,
archive_date
union_id,
order_no,
contract_no,
contract_title,
sign_status,
singer_time,
a_remark,
b_remark,
a_transaction_id,
b_transaction_id,
create_time,
update_time,
archive_date
from contract_info
where order_no = #{orderNo}
<where>
<if test="orderNo != null">
order_no = #{orderNo}
</if>
<if test="contractNo != null">
contract_no = #{contractNo}
</if>
</where>
</select>
</mapper>
\ No newline at end of file
......@@ -4,8 +4,8 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.iuav.user.dao.fdd.SealManageDao">
<insert id="insertSealInfo">
insert into seal_info (seal_name, signature_id, seal_url, union_id, seal_status)
values (#{sealName}, #{signatureId}, #{sealUrl}, #{unionId}, #{sealStatus})
insert into seal_info (seal_name, signature_id, seal_url, union_id)
values (#{sealName}, #{signatureId}, #{sealUrl}, #{unionId})
</insert>
<update id="updateSealStatusById">
update seal_info set seal_status = 0
......
......@@ -51,7 +51,14 @@
where customer_id = #{customerId}
</select>
<select id="getAppUserFddInfo" resultType="com.mmc.iuav.user.entity.fdd.UserFddDO">
select id, customer_id, person_verify_status, ent_verify_status, account_type, create_time, update_time
select id,
customer_id,
union_id,
person_verify_status,
ent_verify_status,
account_type,
create_time,
update_time
from user_fdd
where union_id = #{unionId}
</select>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论