保理合同
parent
741a1302df
commit
9570d59595
@ -0,0 +1,61 @@
|
||||
package com.sztzjy.block_finance.controller;
|
||||
|
||||
import com.sztzjy.block_finance.annotation.AnonymousAccess;
|
||||
import com.sztzjy.block_finance.entity.StuUploadResourceInfo;
|
||||
import com.sztzjy.block_finance.entity.StuUploadResourceInfoExample;
|
||||
import com.sztzjy.block_finance.entity.dto.StutInfoSecDto;
|
||||
import com.sztzjy.block_finance.entity.dto.StutranDocDto;
|
||||
import com.sztzjy.block_finance.mappers.StuUploadResourceInfoMapper;
|
||||
import com.sztzjy.block_finance.service.StuSignFactorContractService;
|
||||
import com.sztzjy.block_finance.util.ResultEntity;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author 17803
|
||||
* @date 2024-04-09 11:32
|
||||
*/
|
||||
|
||||
@Api(tags = "签署保理合同(供应商)")
|
||||
@RestController
|
||||
@RequestMapping("/api/stu/signFactContract")
|
||||
public class StuSignFactorContractBySupplyController {
|
||||
|
||||
|
||||
@Autowired
|
||||
private StuSignFactorContractService contractService;
|
||||
|
||||
@Autowired
|
||||
private StuUploadResourceInfoMapper stuUploadResourceInfoMapper;
|
||||
|
||||
@Value("${file.path}")
|
||||
private String filePath;
|
||||
|
||||
@Resource
|
||||
private com.sztzjy.block_finance.util.file.IFileUtil IFileUtil;
|
||||
|
||||
|
||||
|
||||
//保理合同
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package com.sztzjy.block_finance.service;
|
||||
|
||||
import com.sztzjy.block_finance.entity.dto.StutInfoSecDto;
|
||||
import com.sztzjy.block_finance.entity.dto.StutranDocDto;
|
||||
import com.sztzjy.block_finance.util.ResultEntity;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
/**
|
||||
* @author 17803
|
||||
* @date 2024-04-09 11:34
|
||||
*/
|
||||
public interface StuSignFactorContractService {
|
||||
/**
|
||||
* 保理合同加密
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
|
||||
ResultEntity contractEncry(StutInfoSecDto dto);
|
||||
|
||||
/**
|
||||
* 上传保理合同/客户结算条款
|
||||
* @param file
|
||||
* @param userId
|
||||
* @param fileName
|
||||
* @return
|
||||
*/
|
||||
|
||||
ResultEntity uploadContract(MultipartFile file, String userId, String fileName);
|
||||
|
||||
/**
|
||||
* 保理合同数字签名
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
|
||||
ResultEntity contractSignature(StutranDocDto dto) throws Exception;
|
||||
|
||||
/**
|
||||
* 保理合同交易信息加密
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
|
||||
ResultEntity contractTranInfo(StutInfoSecDto dto) throws Exception;
|
||||
}
|
@ -0,0 +1,251 @@
|
||||
package com.sztzjy.block_finance.service.impl;/**
|
||||
* @author 17803
|
||||
* @date 2024-04-09 11:34
|
||||
*/
|
||||
|
||||
import cn.hutool.core.convert.Convert;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.hutool.crypto.digest.DigestUtil;
|
||||
import com.sztzjy.block_finance.config.Constant;
|
||||
import com.sztzjy.block_finance.config.exception.handler.ServiceException;
|
||||
import com.sztzjy.block_finance.entity.StuBlockOnChain;
|
||||
import com.sztzjy.block_finance.entity.StuBlockOnChainExample;
|
||||
import com.sztzjy.block_finance.entity.StuUploadResourceInfo;
|
||||
import com.sztzjy.block_finance.entity.StuUploadResourceInfoExample;
|
||||
import com.sztzjy.block_finance.entity.dto.StutInfoSecDto;
|
||||
import com.sztzjy.block_finance.entity.dto.StutranDocDto;
|
||||
import com.sztzjy.block_finance.mappers.StuBlockOnChainMapper;
|
||||
import com.sztzjy.block_finance.mappers.StuUploadResourceInfoMapper;
|
||||
import com.sztzjy.block_finance.service.StuSignFactorContractService;
|
||||
import com.sztzjy.block_finance.util.ResultEntity;
|
||||
import com.sztzjy.block_finance.util.RsaUtil;
|
||||
import com.sztzjy.block_finance.util.file.IFileUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class StuSignFactorContractServiceImpl implements StuSignFactorContractService {
|
||||
|
||||
@Autowired
|
||||
private StuUploadResourceInfoMapper stuUploadResourceInfoMapper;
|
||||
|
||||
@Autowired
|
||||
private StuBlockOnChainMapper stuBlockOnChainMapper;
|
||||
|
||||
|
||||
|
||||
@Value("${file.path}")
|
||||
private String filePath;
|
||||
|
||||
@Resource
|
||||
private com.sztzjy.block_finance.util.file.IFileUtil IFileUtil;
|
||||
|
||||
|
||||
/**
|
||||
* 保理合同加密
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
|
||||
@Override
|
||||
public ResultEntity contractEncry(StutInfoSecDto dto) {
|
||||
|
||||
String sha256Hex1 = DigestUtil.sha256Hex("合同");
|
||||
System.out.println(sha256Hex1);
|
||||
if (Constant.SHENZHENPUBLICKEY.equals(dto.getPublicKey()))
|
||||
{
|
||||
String sha256Hex = DigestUtil.sha256Hex("合同");
|
||||
|
||||
StuUploadResourceInfoExample example = new StuUploadResourceInfoExample();
|
||||
example.createCriteria().andUserIdEqualTo(dto.getUserId()).andModuleEqualTo("保理合同");
|
||||
List<StuUploadResourceInfo> uploadResourceInfoList = stuUploadResourceInfoMapper.selectByExample(example);
|
||||
if (uploadResourceInfoList.isEmpty()) {
|
||||
return new ResultEntity<>(HttpStatus.BAD_REQUEST,"加密失败");
|
||||
}
|
||||
|
||||
uploadResourceInfoList.get(0).setEncryAbstract(sha256Hex);
|
||||
stuUploadResourceInfoMapper.updateByPrimaryKeySelective(uploadResourceInfoList.get(0));
|
||||
return new ResultEntity<>(HttpStatus.OK,"加密成功",sha256Hex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
throw new ServiceException(HttpStatus.ACCEPTED,"请选择正确密钥!");
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传保理合同/客户结算条款
|
||||
* @param file
|
||||
* @param userId
|
||||
* @param fileName
|
||||
* @return
|
||||
*/
|
||||
|
||||
@Override
|
||||
public ResultEntity uploadContract(MultipartFile file, String userId, String fileName) {
|
||||
if (file.isEmpty())
|
||||
{
|
||||
return new ResultEntity(HttpStatus.BAD_REQUEST,"请勿上传空文件!");
|
||||
}
|
||||
|
||||
//上传文件路径
|
||||
String path = IFileUtil.upload(file);
|
||||
|
||||
|
||||
StuUploadResourceInfoExample example = new StuUploadResourceInfoExample();
|
||||
example.createCriteria().andUserIdEqualTo(userId).andModuleEqualTo(fileName);
|
||||
List<StuUploadResourceInfo> uploadResourceInfoList = stuUploadResourceInfoMapper.selectByExample(example);
|
||||
if (!uploadResourceInfoList.isEmpty()){
|
||||
//更新上传
|
||||
|
||||
uploadResourceInfoList.get(0).setFileUrl(path);
|
||||
uploadResourceInfoList.get(0).setUpdateTime(new Date());
|
||||
uploadResourceInfoList.get(0).setFileName(file.getOriginalFilename());
|
||||
uploadResourceInfoList.get(0).setFileSize(String.valueOf(file.getSize()));
|
||||
|
||||
|
||||
stuUploadResourceInfoMapper.updateByPrimaryKeySelective(uploadResourceInfoList.get(0));
|
||||
|
||||
}else {
|
||||
//第一次上传
|
||||
StuUploadResourceInfo resourceInfo = new StuUploadResourceInfo();
|
||||
resourceInfo.setId(IdUtil.simpleUUID());
|
||||
resourceInfo.setFileUrl(path);
|
||||
resourceInfo.setCreateTime(new Date());
|
||||
resourceInfo.setFileName(file.getOriginalFilename());
|
||||
resourceInfo.setFileSize(String.valueOf(file.getSize()));
|
||||
stuUploadResourceInfoMapper.updateByPrimaryKeySelective(resourceInfo);
|
||||
}
|
||||
|
||||
return new ResultEntity<>(HttpStatus.OK,"上传成功");
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 保理合同数字签名
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
|
||||
@Override
|
||||
public ResultEntity contractSignature(StutranDocDto dto) throws Exception {
|
||||
|
||||
|
||||
|
||||
if (Constant.SHENZHENPRIVATEKEY.equals(dto.getPrivateKey()))
|
||||
{
|
||||
String sha256Hex = RsaUtil.decryptByPrivateKey("数字签名",dto.getPrivateKey());
|
||||
|
||||
StuUploadResourceInfoExample example = new StuUploadResourceInfoExample();
|
||||
example.createCriteria().andUserIdEqualTo(dto.getUserId()).andModuleEqualTo("保理合同");
|
||||
List<StuUploadResourceInfo> uploadResourceInfoList = stuUploadResourceInfoMapper.selectByExample(example);
|
||||
if (uploadResourceInfoList.isEmpty()) {
|
||||
return new ResultEntity<>(HttpStatus.BAD_REQUEST,"加密失败");
|
||||
}
|
||||
|
||||
uploadResourceInfoList.get(0).setSignature(sha256Hex);
|
||||
stuUploadResourceInfoMapper.updateByPrimaryKeySelective(uploadResourceInfoList.get(0));
|
||||
return new ResultEntity<>(HttpStatus.OK,"加密成功",sha256Hex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
throw new ServiceException(HttpStatus.ACCEPTED,"请选择正确密钥!");
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 保理合同交易信息加密
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
|
||||
@Override
|
||||
public ResultEntity contractTranInfo(StutInfoSecDto dto) throws Exception {
|
||||
if (Constant.SHENZHENPUBLICKEY.equals(dto.getPublicKey()))
|
||||
{
|
||||
//加密数据
|
||||
String encrypt = RsaUtil.encryptByPrivateKey("保理合同上链", dto.getPublicKey());
|
||||
//通过hash256将加密数据生成区块哈希
|
||||
String blockHashInfo = DigestUtil.sha256Hex(encrypt);
|
||||
|
||||
StuUploadResourceInfoExample example = new StuUploadResourceInfoExample();
|
||||
example.createCriteria().andUserIdEqualTo(dto.getUserId()).andModuleEqualTo("保理合同");
|
||||
List<StuUploadResourceInfo> uploadResourceInfoList = stuUploadResourceInfoMapper.selectByExample(example);
|
||||
if (uploadResourceInfoList.isEmpty()) {
|
||||
return new ResultEntity<>(HttpStatus.BAD_REQUEST,"加密失败");
|
||||
}
|
||||
|
||||
uploadResourceInfoList.get(0).setEncryAbstract(encrypt);
|
||||
uploadResourceInfoList.get(0).setFactorContractEncryState(1);
|
||||
|
||||
stuUploadResourceInfoMapper.updateByPrimaryKeySelective(uploadResourceInfoList.get(0));
|
||||
|
||||
|
||||
//上链
|
||||
//根据时间获取上一条加密数据,将数据加密,
|
||||
|
||||
StuBlockOnChainExample onChainExample = new StuBlockOnChainExample();
|
||||
onChainExample.createCriteria().andUserIdEqualTo(dto.getUserId());
|
||||
List<StuBlockOnChain> blockOnChainList = stuBlockOnChainMapper.selectByExample(onChainExample);
|
||||
if (!blockOnChainList.isEmpty()){
|
||||
|
||||
//追加在上一个区块链后面
|
||||
StuBlockOnChain stuBlockOnChain1 = stuBlockOnChainMapper.selectByTime(dto.getUserId());
|
||||
StuBlockOnChain onChain = stuBlockOnChainMapper.selectByPrimaryKey(stuBlockOnChain1.getId());
|
||||
|
||||
Integer sequence = onChain.getSequence();
|
||||
|
||||
|
||||
String chainName = onChain.getChainName();
|
||||
// 从原始字符串中提取数字部分
|
||||
String numberPart = chainName.replaceAll("[^\\d]", "");
|
||||
// 将数字部分转换为整数
|
||||
int number = Integer.parseInt(numberPart);
|
||||
// 递增数字
|
||||
number++;
|
||||
// 根据原始字符串的格式构建新的字符串(保持数字部分的格式)
|
||||
String newString = chainName.replaceAll("\\d+", String.format("%1d", number));
|
||||
|
||||
StuBlockOnChain chain = new StuBlockOnChain();
|
||||
|
||||
chain.setBlockIndex(onChain.getBlockIndex() + 1);
|
||||
chain.setChainName(newString);
|
||||
chain.setUserId(dto.getUserId());
|
||||
chain.setChainTime(System.currentTimeMillis());
|
||||
chain.setBlockHash(blockHashInfo);
|
||||
chain.setPreBlockHash(onChain.getBlockHash());
|
||||
chain.setId(RandomUtil.randomString(64));
|
||||
chain.setBuyData(encrypt);
|
||||
chain.setSequence(sequence+1);
|
||||
|
||||
stuBlockOnChainMapper.insert(chain);
|
||||
|
||||
|
||||
return new ResultEntity(HttpStatus.ACCEPTED,"加密成功!",encrypt);
|
||||
|
||||
|
||||
}else {
|
||||
|
||||
return new ResultEntity(HttpStatus.BAD_REQUEST,"加密失败!");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
throw new ServiceException(HttpStatus.ACCEPTED,"请选择正确密钥!");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue