【工作日记】智能合同模板

智能合同模板

https://antchain.antgroup.com/docs/11/424446

这个蚂蚁链是制作合同模板的文档,官方文档


控制层代码

 //续租合同
    @RequestMapping("/continueCreateContract")
    public ResData createContinueContract(@RequestParam("id") Long id) {
        if (this.isNotId(id)) {
            return this.error("参数错误");
        }
        RLock lock = redissonClient.getLock("order:created:contract:" + id);
        try {
            lock.lock();
            OrderRelet relet = orderReletService.findById(id);//获取到续租合同信息
            OrderMaster detail = orderMasterService.findById(relet.getOrderMasterId());//获取到ordermaster信息
            if (detail == null) {
                return this.error("参数ID错误");
            }
            if (Utils.incloud(new int[]{OrderStatus.NEW.getCode(), OrderStatus.RETURN.getCode(), OrderStatus.CANCEL.getCode()}, detail.getStatus())) {
                return this.error("订单状态错误,无法生成合同");
            }
            if (StringUtils.isNotBlank(detail.getContractFlowId())) {
                return this.error("已创建合同,无需重复创建");
            }
            User user = userService.findById(detail.getUserId());
            detail.setItems(orderItemService.findByOrderMasterId(detail.getId()));
            detail.setStages(orderStagesService.findByOrderMasterId(detail.getId()));
            List<OrderStages> stages = orderStagesService.findByOrderMasterId(detail.getId());

            relet.setContinueNumber(DateUtils.format(new Date(), "yyyyMMddHHmm") + relet.getId());
            String flowId = antCloudContractService.createOrderRetContract(detail, user, stages, relet);
            OrderRelet update = new OrderRelet();
            update.setContractId(flowId);//更新数据库里order_relet表的智能合同id
            update.setContinueNumber("R"+relet.getContinueNumber());
            orderReletService.update(relet.getId(), update);
            return this.success(flowId);
        } catch (Exception e) {
            logger.error("错误", e);
            return this.error("智能合同生成失败:msg=" + e.getMessage());
        } finally {
            lock.unlock();
        }
    }

控制层的话就是返回了flowId,success就是封装好的给前端的响应

我其实就做了下修改,新增了一个续租合同的模板地址方法,并将一些字段修改了下,新增了个接口

智能合同区块链代码(重点是map键值对)

AntCloudContractService

键是合同模板里面你填的key,值就是对应的要变化的数值啦

package com.zhiwei.rent.service.blockchain;

import cn.com.antcloud.api.twc.v1_0_0.response.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.zhiwei.rent.common.Constants;
import com.zhiwei.rent.model.merchant.Merchant;
import com.zhiwei.rent.model.order.OrderItem;
import com.zhiwei.rent.model.order.OrderMaster;
import com.zhiwei.rent.model.order.OrderRelet;
import com.zhiwei.rent.model.order.OrderStages;
import com.zhiwei.rent.model.product.Product;
import com.zhiwei.rent.model.product.ProductSku;
import com.zhiwei.rent.model.product.SkuAttribute;
import com.zhiwei.rent.model.user.User;
import com.zhiwei.rent.service.BaseService;
import com.zhiwei.rent.service.blockchain.vo.AntOrgInfo;
import com.zhiwei.rent.service.merchant.MerchantService;
import com.zhiwei.rent.service.order.OrderItemService;
import com.zhiwei.rent.service.order.OrderStagesService;
import com.zhiwei.rent.service.product.ProductBomService;
import com.zhiwei.rent.service.product.ProductService;
import com.zhiwei.rent.service.product.ProductSkuService;
import com.zhiwei.rent.service.sys.BrandService;
import com.zhiwei.rent.util.DateUtils;
import com.zhiwei.rent.util.MoneyUtil;
import com.zhiwei.rent.util.OrderUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class AntCloudContractService extends BaseService {

    private final Logger logger = LoggerFactory.getLogger(AntCloudContractService.class);

    @Autowired
    private AntCloudService antCloudService;

    @Autowired
    private OrderItemService orderItemService;

    @Autowired
    private OrderStagesService orderStagesService;

    @Autowired
    private ProductService productService;

    @Autowired
    private BrandService brandService;

    @Autowired
    private ProductSkuService productSkuService;

    @Autowired
    private MerchantService merchantService;

    @Autowired
    private ProductBomService productBomService;

    @Autowired
    private AntCloudAccountService antCloudAccountService;

    @Autowired
    private AntUploadContractTemplateService antUploadContractTemplateService;

    public String createContract(OrderMaster orderMaster, User user) throws Exception{
        // 签署流程ID
        String flowId;

        // 电子合同文档ID
        String fileId;

        Merchant merchant = merchantService.findById(orderMaster.getMerchantId());
        if(merchant == null){
            throw new Exception("商户信息获取错误");
        }

        AntOrgInfo platform = antCloudAccountService.getAccountByType(null,Constants.LEGAL_PERSON,Constants.LEGAL_ID_CARD_NO,Constants.COMPANY_PHONE_NUMBER);
        if(platform == null){
            throw new Exception("电子合同平台方注册失败");
        }

        AntOrgInfo jf = antCloudAccountService.getAccountByType(merchant,merchant.getLegalPerson(),merchant.getLegalPersonIdNo(),merchant.getPhone());
        if(jf == null){
            throw new Exception("电子合同甲方注册失败");
        }

        AntOrgInfo userInfo = antCloudAccountService.getUserAccountInfo(user);
        if(userInfo == null){
            throw new Exception("电子合同用户注册失败");
        }

        // 创建电子合同签署流程
        CreateContractFlowResponse createContractFlowResponse = antCloudService.twcNotaryContractFlowCreate( platform.getAccountId(),platform.getOrgId());
        if (createContractFlowResponse != null) {
            if ("200".equals(createContractFlowResponse.getResultCode())) {
                flowId = createContractFlowResponse.getFlowId();
            } else {
                throw new Exception(String.format("创建电子合同签署流程失败:%s", createContractFlowResponse.getResultMsg()));
            }
        } else {
            throw new Exception("创建电子合同签署流程失败");
        }
        // 合同文件
        String templateId = antUploadContractTemplateService.getTemplateId();
        // StringBuilder pb = new StringBuilder(); // 品牌
        StringBuilder xh = new StringBuilder(); // 型号
        StringBuilder cs = new StringBuilder(); // 成色
        StringBuilder sp = new StringBuilder(); // 商品
        // StringBuilder pj = new StringBuilder(); // 配件
        double depositMoney = 0;    // 押金
        double allActMoney = 0D;  // 总的买断金额
        Long allNum = 0L; // 数量
        if(orderMaster.getItems() == null){
            orderMaster.setItems(orderItemService.findByOrderMasterId(orderMaster.getId()));
        }
        if(orderMaster.getStages() == null){
            orderMaster.setStages(orderStagesService.findByOrderMasterId(orderMaster.getId()));
        }
        StringBuilder imei = new StringBuilder();
        if(orderMaster.getItems() != null && orderMaster.getItems().size() > 0){
            for(OrderItem item : orderMaster.getItems()){
                sp.append(item.getProductName());
                if(item.getImei() != null) {
                    imei.append(item.getImei()).append(",");
                }
                allNum += item.getNum();
                depositMoney += (item.getPledge() * item.getNum());
                Product product = productService.findById(item.getProductId());
                if(product != null) {
                    /*Brand brand = brandService.findById(product.getBrandId());
                    if(brand != null){
                        pb.append(brand.getName()).append("\n");
                    }*/
                    cs.append(product.getQuality() >= 100 ? "全新" : "二手");
                }
                if(item.getActualMoney() != null && item.getActualMoney() > 0) {
                    allActMoney += item.getActualMoney() * item.getNum();
                }
                ProductSku sku = productSkuService.findById(item.getSkuId());
                if(sku != null){
                    try {
                        List<SkuAttribute> attrs = JSONArray.parseArray(sku.getAttributes(), SkuAttribute.class);
                        if(CollectionUtils.isNotEmpty(attrs)){
                            for(SkuAttribute att : attrs){
                                xh.append(att.getValue()).append("/");
                            }
                            xh.deleteCharAt(xh.length() - 1);
                        }
                    }catch (Exception e){
                        logger.error("SkuAttribute={}转换错误:",sku.getAttributes(),e);
                    }
                }
                /*List<ProductBom> boms = productBomService.findByProductId(item.getProductId());
                if(CollectionUtils.isNotEmpty(boms)){
                    for(ProductBom bom : boms){
                        pj.append(bom.getName());
                    }
                }*/
            }
        }

        String deliverAddress = orderMaster.getDeliveryProvinceName()+orderMaster.getDeliveryCityName()+orderMaster.getDeliveryCountyName()+orderMaster.getDeliveryDetailAddress();
        String sign_date =  DateUtils.format(new Date(), "yyyy-MM-dd");
        Double allRentMoney = OrderUtils.getAllRentMoneyAndExcludeDiscountMoney(orderMaster);
        // 电子合同模板添加文档
        Map<String, String> templateParams = new HashMap<>();
        // 甲方也就是出租方
        templateParams.put("mname",merchant.getLicenseName());
        templateParams.put("maddress",merchant.getProvinceName()+merchant.getCityName()+merchant.getCountyName()+merchant.getDetailAddress());
        templateParams.put("mmobile",merchant.getPhone());
        templateParams.put("memail","");


        templateParams.put("pname",Constants.COMPANY_NAME);

        templateParams.put("uname",user.getTrueName());
        templateParams.put("umobile",user.getMobile());
        templateParams.put("uidcardno",user.getIdCardNum());
        templateParams.put("uemail",user.getEmail());
        templateParams.put("deliveraddress",deliverAddress);

        templateParams.put("uproduct",sp.toString());
        templateParams.put("ordernumber",orderMaster.getOrderNumber());
        templateParams.put("delivername",orderMaster.getDeliveryUsername());
        templateParams.put("delivermobile",orderMaster.getDeliveryMobile());
        templateParams.put("tname",xh.toString());
        templateParams.put("pnum",allNum.toString());
        templateParams.put("imei",imei.toString());
        templateParams.put("quality",cs.toString());
        templateParams.put("ordertimelen",DateUtils.format(orderMaster.getBeginDate(),"yyyy-MM-dd")+" 至 "+DateUtils.format(orderMaster.getEndDate(),"yyyy-MM-dd") +" 共 "+ orderMaster.getDay()+"天");
        templateParams.put("unitmoney",String.valueOf(MoneyUtil.round(allRentMoney/orderMaster.getDay())));
        templateParams.put("day",orderMaster.getDay().toString());
        templateParams.put("allmoney",String.valueOf(MoneyUtil.round(allRentMoney))); // 总租金
        templateParams.put("allactmoney",MoneyUtil.round(allActMoney).toString());  // 买断金额
        templateParams.put("depositmoney",MoneyUtil.round(depositMoney).toString()); // 押金
        templateParams.put("alldepositmoney",MoneyUtil.round(depositMoney).toString()); // 设备和配件总价
        templateParams.put("insurancemoney",MoneyUtil.round(orderMaster.getAllInsuranceMoney()).toString()); // 保险
        templateParams.put("firstpay","1"); // 首付期数
        templateParams.put("signtime",sign_date);

        List<OrderStages> stages = orderMaster.getStages();
        if(CollectionUtils.isEmpty(stages)){
            stages = orderStagesService.findByOrderMasterId(orderMaster.getId());
        }
        if(CollectionUtils.isNotEmpty(stages)){
            for(OrderStages item : stages){
                templateParams.put("paydate_"+item.getSort(),DateUtils.format(item.getRefundDate(),"yyyy-MM-dd"));
                templateParams.put("paymoney_"+item.getSort(),MoneyUtil.round(item.getMoney()).toString());
            }
        }
        logger.info("合同内容txt={}", JSON.toJSONString(templateParams));
        AddContractFileResponse addContractFileResponse = antCloudService.twcNotaryContractFileAdd(templateId,templateParams);
        if (addContractFileResponse != null) {
            if ("200".equals(addContractFileResponse.getResultCode())) {
                fileId = addContractFileResponse.getFileId();
            } else {
                logger.error("errorjson={}",JSON.toJSONString(addContractFileResponse));
                throw new Exception(String.format("电子合同模板添加文档失败:%s", addContractFileResponse.getResultMsg()));
            }
        } else {
            throw new Exception("电子合同模板添加文档失败");
        }

        // 电子合同签署流程中添加待签署文档
        AddContractDocumentResponse addContractDocumentResponse = antCloudService.twcNotaryContractDocumentAdd(flowId, fileId);
        if (addContractDocumentResponse != null) {
            if (!"200".equals(addContractDocumentResponse.getResultCode())) {
                throw new Exception(String.format("电子合同签署流程中添加待签署文档失败:%s", addContractDocumentResponse.getResultMsg()));
            }
        } else {
            throw new Exception("电子合同签署流程中添加待签署文档失败");
        }

        // 添加电子合同签署方自动盖章签署区
        AddContractSignfieldResponse addContractSignfieldResponse = antCloudService.twcNotaryContractSignfieldAdd( flowId,fileId,platform,jf,userInfo);
        if (addContractSignfieldResponse != null) {
            if (!"200".equals(addContractSignfieldResponse.getResultCode())) {
                logger.error("添加电子合同签署方自动盖章签署区失败,msg={}",JSON.toJSONString(addContractSignfieldResponse));
                throw new Exception(String.format("添加电子合同签署方自动盖章签署区失败:%s", addContractSignfieldResponse.getResultMsg()));
            }
        } else {
            throw new Exception("添加电子合同签署方自动盖章签署区失败");
        }
        // 电子合同签署流程开启
        StartContractFlowResponse startContractFlowResponse = antCloudService.twcNotaryContractFlowStart(flowId);
        if (startContractFlowResponse != null) {
            if (!"200".equals(startContractFlowResponse.getResultCode())) {
                throw new Exception(String.format("电子合同签署流程开启失败:%s", startContractFlowResponse.getResultMsg()));
            }
        } else {
            throw new Exception("电子合同签署流程开启失败");
        }
        return flowId;
    }


    //续租合同
    public String createOrderRetContract(OrderMaster orderMaster, User user, List<OrderStages> stages, OrderRelet relet) throws Exception{
        // 签署流程ID
        String flowId;
        // 电子合同文档ID
        String fileId;
        Merchant merchant = merchantService.findById(orderMaster.getMerchantId());
        if(merchant == null){
            throw new Exception("商户信息获取错误");
        }

        AntOrgInfo platform = antCloudAccountService.getAccountByType(null,Constants.LEGAL_PERSON,Constants.LEGAL_ID_CARD_NO,Constants.COMPANY_PHONE_NUMBER);
        if(platform == null){
            throw new Exception("电子合同平台方注册失败");
        }

        AntOrgInfo jf = antCloudAccountService.getAccountByType(merchant,merchant.getLegalPerson(),merchant.getLegalPersonIdNo(),merchant.getPhone());
        if(jf == null){
            throw new Exception("电子合同甲方注册失败");
        }

        AntOrgInfo userInfo = antCloudAccountService.getUserAccountInfo(user);
        if(userInfo == null){
            throw new Exception("电子合同用户注册失败");
        }

        // 创建电子合同签署流程
        CreateContractFlowResponse createContractFlowResponse = antCloudService.twcNotaryContractFlowCreate( platform.getAccountId(),platform.getOrgId());
        if (createContractFlowResponse != null) {
            if ("200".equals(createContractFlowResponse.getResultCode())) {
                flowId = createContractFlowResponse.getFlowId();
            } else {
                throw new Exception(String.format("创建电子合同签署流程失败:%s", createContractFlowResponse.getResultMsg()));
            }
        } else {
            throw new Exception("创建电子合同签署流程失败");
        }
        // 合同文件
        String templateId = antUploadContractTemplateService.getContinueTemplateId();
        // StringBuilder pb = new StringBuilder(); // 品牌
        StringBuilder xh = new StringBuilder(); // 型号
        StringBuilder cs = new StringBuilder(); // 成色
        StringBuilder sp = new StringBuilder(); // 商品
        StringBuilder continueNumber = new StringBuilder();//合同编号
        // StringBuilder pj = new StringBuilder(); // 配件
        double depositMoney = 0;    // 押金
        double allActMoney = 0D;  // 总的买断金额
        Long allNum = 0L; // 数量
        if(orderMaster.getItems() == null){
            orderMaster.setItems(orderItemService.findByOrderMasterId(orderMaster.getId()));
        }
        StringBuilder imei = new StringBuilder();
        if(orderMaster.getItems() != null && orderMaster.getItems().size() > 0){
            for(OrderItem item : orderMaster.getItems()){
                sp.append(item.getProductName());
                if(item.getImei() != null) {
                    imei.append(item.getImei()).append(",");
                }
                allNum += item.getNum();
                depositMoney += (item.getPledge() * item.getNum());
                Product product = productService.findById(item.getProductId());
                if(product != null) {
                    /*Brand brand = brandService.findById(product.getBrandId());
                    if(brand != null){
                        pb.append(brand.getName()).append("\n");
                    }*/
                    cs.append(product.getQuality() >= 100 ? "全新" : "二手");
                }
                if(item.getActualMoney() != null && item.getActualMoney() > 0) {
                    allActMoney += item.getActualMoney() * item.getNum();
                }
                ProductSku sku = productSkuService.findById(item.getSkuId());
                if(sku != null){
                    try {
                        List<SkuAttribute> attrs = JSONArray.parseArray(sku.getAttributes(), SkuAttribute.class);
                        if(CollectionUtils.isNotEmpty(attrs)){
                            for(SkuAttribute att : attrs){
                                xh.append(att.getValue()).append("/");
                            }
                            xh.deleteCharAt(xh.length() - 1);
                        }
                    }catch (Exception e){
                        logger.error("SkuAttribute={}转换错误:",sku.getAttributes(),e);
                    }
                }
                /*List<ProductBom> boms = productBomService.findByProductId(item.getProductId());
                if(CollectionUtils.isNotEmpty(boms)){
                    for(ProductBom bom : boms){
                        pj.append(bom.getName());
                    }
                }*/
            }
        }

        String deliverAddress = orderMaster.getDeliveryProvinceName()+orderMaster.getDeliveryCityName()+orderMaster.getDeliveryCountyName()+orderMaster.getDeliveryDetailAddress();
        String sign_date =  DateUtils.format(new Date(), "yyyy-MM-dd");
        Double allRentMoney = OrderUtils.getAllRentMoneyAndExcludeDiscountMoney(orderMaster);
        // 电子合同模板添加文档
        Map<String, String> templateParams = new HashMap<>();
        // 甲方也就是出租方
        templateParams.put("mname",merchant.getLicenseName());//出租人
        templateParams.put("maddress",merchant.getProvinceName()+merchant.getCityName()+merchant.getCountyName()+merchant.getDetailAddress());//出租人联系地址
        templateParams.put("mmobile",merchant.getPhone());//出租人联系电话
        templateParams.put("memail","");


        templateParams.put("pname",Constants.COMPANY_NAME);

        templateParams.put("uname",user.getTrueName());//承租人
        templateParams.put("umobile",user.getMobile());
        templateParams.put("uidcardno",user.getIdCardNum());//承租人身份证
        templateParams.put("uemail",user.getEmail());
        templateParams.put("deliveraddress",deliverAddress);

        templateParams.put("uproduct",sp.toString());//商品名称
        templateParams.put("ordernumber",orderMaster.getOrderNumber());//首租合同编号
        templateParams.put("delivername",orderMaster.getDeliveryUsername());
        templateParams.put("delivermobile",orderMaster.getDeliveryMobile());
        templateParams.put("tname",xh.toString());//型号
//        templateParams.put("pnum",allNum.toString());
        templateParams.put("imei",imei.toString());//imei
        templateParams.put("quality",cs.toString());//成色
//        templateParams.put("ordertimelen",DateUtils.format(orderMaster.getBeginDate(),"yyyy-MM-dd")+" 至 "+DateUtils.format(orderMaster.getEndDate(),"yyyy-MM-dd") +" 共 "+ orderMaster.getDay()+"天");
        templateParams.put("unitmoney",String.valueOf(MoneyUtil.round(allRentMoney/orderMaster.getDay())));  //租金额,也就是每一期所还的金额
        templateParams.put("day",orderMaster.getDay().toString());//期数,就是你的租金分几期
        templateParams.put("allmoney",String.valueOf(MoneyUtil.round(allRentMoney))); // 总租金
        templateParams.put("allactmoney",MoneyUtil.round(allActMoney).toString());  // 买断金额
        templateParams.put("depositmoney",MoneyUtil.round(depositMoney).toString()); // 押金
        templateParams.put("alldepositmoney",MoneyUtil.round(depositMoney).toString()); // 设备和配件总价
//        templateParams.put("insurancemoney",MoneyUtil.round(orderMaster.getAllInsuranceMoney()).toString()); // 保险
//        templateParams.put("firstpay","1"); // 首付期数
        templateParams.put("signtime",sign_date);//签订日期
        templateParams.put("paytype", orderMaster.getPayType());//支付方式
        templateParams.put("continuenumber",  relet.getContinueNumber());//续租订单编号
        templateParams.put("allpledge",String.valueOf(orderMaster.getAllPledge()));//官网价


        if(CollectionUtils.isNotEmpty(stages)){//账单日和租金额
            int sort = 1;
            for(OrderStages item : stages){
                templateParams.put("paydate_"+sort,DateUtils.format(item.getRefundDate(),"yyyy-MM-dd"));
                templateParams.put("paymoney_"+sort,MoneyUtil.round(item.getMoney()).toString());
                sort ++;
            }
        }
        logger.info("合同内容txt={}", JSON.toJSONString(templateParams));
        AddContractFileResponse addContractFileResponse = antCloudService.twcNotaryContractFileAdd(templateId,templateParams);
        if (addContractFileResponse != null) {
            if ("200".equals(addContractFileResponse.getResultCode())) {
                fileId = addContractFileResponse.getFileId();
            } else {
                logger.error("errorjson={}",JSON.toJSONString(addContractFileResponse));
                throw new Exception(String.format("电子合同模板添加文档失败:%s", addContractFileResponse.getResultMsg()));
            }
        } else {
            throw new Exception("电子合同模板添加文档失败");
        }

        // 电子合同签署流程中添加待签署文档
        AddContractDocumentResponse addContractDocumentResponse = antCloudService.twcNotaryContractDocumentAdd(flowId, fileId);
        if (addContractDocumentResponse != null) {
            if (!"200".equals(addContractDocumentResponse.getResultCode())) {
                throw new Exception(String.format("电子合同签署流程中添加待签署文档失败:%s", addContractDocumentResponse.getResultMsg()));
            }
        } else {
            throw new Exception("电子合同签署流程中添加待签署文档失败");
        }

        // 添加电子合同签署方自动盖章签署区
        AddContractSignfieldResponse addContractSignfieldResponse = antCloudService.twcNotaryContractSignfieldAdd( flowId,fileId,platform,jf,userInfo);
        if (addContractSignfieldResponse != null) {
            if (!"200".equals(addContractSignfieldResponse.getResultCode())) {
                logger.error("添加电子合同签署方自动盖章签署区失败,msg={}",JSON.toJSONString(addContractSignfieldResponse));
                throw new Exception(String.format("添加电子合同签署方自动盖章签署区失败:%s", addContractSignfieldResponse.getResultMsg()));
            }
        } else {
            throw new Exception("添加电子合同签署方自动盖章签署区失败");
        }
        // 电子合同签署流程开启
        StartContractFlowResponse startContractFlowResponse = antCloudService.twcNotaryContractFlowStart(flowId);
        if (startContractFlowResponse != null) {
            if (!"200".equals(startContractFlowResponse.getResultCode())) {
                throw new Exception(String.format("电子合同签署流程开启失败:%s", startContractFlowResponse.getResultMsg()));
            }
        } else {
            throw new Exception("电子合同签署流程开启失败");
        }
        return flowId;
    }
}





不重要的代码(区块链等技术)

AntBlockChainService

package com.zhiwei.rent.service.blockchain;

import cn.com.antcloud.api.AntFinTechApiClient;
import cn.com.antcloud.api.AntFinTechProfile;
import cn.com.antcloud.api.product.AntCloudProdClient;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.antgroup.antchain.openapi.bot.Client;
import com.antgroup.antchain.openapi.bot.models.*;

import com.zhiwei.rent.common.Constants;
import com.zhiwei.rent.config.AntBlockChainConfig;
import com.zhiwei.rent.config.ProjectConfig;
import com.zhiwei.rent.controller.web.user.vo.ValicationIdVo;
import com.zhiwei.rent.service.blockchain.vo.LeaseRiskVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

/**
 * 蚂蚁区块链
 */
@Service
@Slf4j
public class AntBlockChainService {

    @Autowired
    private AntBlockChainConfig antBlockChainConfig;

    @Autowired
    private ProjectConfig projectConfig;

    @Autowired
    private AntCloudService antCloudService;

    private static final String ENDPOINT = "https://prodapigw.xxx.com/gateway.do";

    // private static final String sceneId = "805000070";

    private AntCloudProdClient clientV2;

    @PostConstruct
    private void init(){
        clientV2 = AntCloudProdClient.newBuilder()
                .setEndpoint(ENDPOINT)
                .setAccess(antBlockChainConfig.getAccessKey(), antBlockChainConfig.getSecret())
                .build();
    }

    public AntCloudProdClient getClient(){
        return clientV2;
    }

    /**
     * 身份认证初始化
     */
    public ValicationIdVo valicationIdCard(String reqId,String name, String idCard){
        CreateLeaseRealpersonRequest request = new CreateLeaseRealpersonRequest();
        request.setCertType("IDENTITY_CARD");
        request.setIdentityType("CERT_INFO");
        request.setCertName(name.trim());
        request.setCertNo(idCard.trim());
        request.setOuterOrderNo(reqId);
        request.setReturnUrl("/");
        request.setProductInstanceId(Constants.ALIPAY_RISK_PRODUCT_ID);
        try {
            CreateLeaseRealpersonResponse response = this.getAntBotClient().createLeaseRealperson(request);
            log.info("请求实人认证接口返回body={}",JSON.toJSONString(response));
            if (!"OK".equals(response.getResultCode())) {
                return null;
            }
            JSONObject body = JSON.parseObject(response.getData());
            ValicationIdVo vo = new ValicationIdVo();
            vo.setCertifyId(body.getString("certifyId"));
            vo.setUrl(body.getString("certifyUrl"));
            vo.setIdCardNo(idCard);
            vo.setName(name);
            vo.setRequestNo(reqId);
            return vo;
        }catch (Exception e){
            log.error("实人认证接口错误:{},{},{}",reqId,name,idCard,e);
        }
        return null;
    }

    public boolean queryValidationIdCard(String certifyId,String requestNo){
        if (StringUtils.isBlank(certifyId) || StringUtils.isBlank(requestNo)) {
            return false;
        }
        QueryLeaseRealpersonRequest queryLeaseRealpersonRequest = new QueryLeaseRealpersonRequest()
                .setCertifyId(certifyId)
                .setOuterOrderNo(requestNo);
        try {
            QueryLeaseRealpersonResponse response = this.getAntBotClient().queryLeaseRealperson(queryLeaseRealpersonRequest);
            log.info("实人认证结果查询返回body={}",JSON.toJSONString(response));
            if(!"OK".equals(response.getResultCode())){
                return false;
            }
            JSONObject body = JSON.parseObject(response.getData());
            return "T".equals(body.getString("passed"));
        }catch (Exception e){
            log.error("查询实人认证错误,certifyId={}", certifyId, e);
        }
        return false;
    }



    /**
     * 蚁盾风险决策查询
     */
    /*public Proposal riskplusSecurityPolicyQuery(String zfbUserId,String mobile,String username,String idcardNumber) {
        Proposal proposal = null;
        String EVENT_DATA_TYPE_PROD = "prod";
        try {
            HttpServletRequest request = ControllerContent.getRequest();
            Binding binding = new Binding(antBlockChainConfig.getAccessKey(), antBlockChainConfig.getSecret(), EVENT_DATA_TYPE_PROD);
            RiskService riskService = LocateService.lookUp(RiskService.class);
            riskService.bind(binding);
            // 构造事件信息
            Knowledge knowledge = new Knowledge("EC_APPLY");
            knowledge.getEvent()
                    .set("gmt_occur", DateUtils.format(new Date()))
                    .set("user_id", zfbUserId)
                    .set("user_name",username)
                    .set("ip", RequestUtils.getIp(request))
                    .set("mobile",mobile)
                    .set("cert_no",idcardNumber);
            proposal = riskService.assess(knowledge);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return proposal;
    }*/


    public LeaseRiskVo riskV2(String zfbUserId, String mobile, String username, String idCardNumber, String ip) {
        // 构建请求
        cn.com.antcloud.api.bot.v1_0_0.request.QueryLeaseRiskRequest request = new cn.com.antcloud.api.bot.v1_0_0.request.QueryLeaseRiskRequest();
        request.setUserId(zfbUserId);
        request.setUserName(username);
        request.setCertNo(idCardNumber);
        request.setMobile(mobile);
        request.setIp(ip);
        request.setProductInstanceId(Constants.ALIPAY_RISK_PRODUCT_ID);
        request.setRegionName(Constants.ALIPAY_REGION_NAME);
        try {
            // 发送请求,并且获取响应结果
            cn.com.antcloud.api.bot.v1_0_0.response.QueryLeaseRiskResponse response = this.getAntFinApiClient().execute(request);
            log.info("蚁盾V2返回{},{},{},{},{},{}",zfbUserId,mobile,username,idCardNumber,ip,JSONObject.toJSONString(response));
            if(StringUtils.isNotBlank(response.getData())){
                return JSON.parseObject(response.getData(),LeaseRiskVo.class);
            }
        }catch (Exception e){
            log.error("蚁盾V2查询报错{},{},{},{},{}",zfbUserId,mobile,username,idCardNumber,ip,e);
        }
        return null;
    }


    private AntFinTechApiClient getAntFinApiClient(){
        AntFinTechProfile profile = AntFinTechProfile.getProfile(
                "https://openapi.xxx.com",
                antBlockChainConfig.getAccessKey(),
                antBlockChainConfig.getSecret());
        return new AntFinTechApiClient(profile);
    }



    private Client getAntBotClient() throws Exception{
        Config config = new Config();
        // 您的AccessKey ID
        config.accessKeyId = antBlockChainConfig.getAccessKey();
        // 您的AccessKey Secret
        config.accessKeySecret = antBlockChainConfig.getSecret();
        return new Client(config);
    }



}


AntCloudHashService

package com.zhiwei.rent.service.blockchain;

import cn.com.antcloud.api.twc.v1_0_0.response.CreateLeaseBizResponse;
import cn.com.antcloud.api.twc.v1_0_0.response.DownloadContractDocumentResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.rent.common.*;
import com.zhiwei.rent.config.AntBlockChainConfig;
import com.zhiwei.rent.config.ProjectConfig;
import com.zhiwei.rent.model.merchant.Merchant;
import com.zhiwei.rent.model.order.*;
import com.zhiwei.rent.model.product.Product;
import com.zhiwei.rent.model.product.ProductSku;
import com.zhiwei.rent.model.sys.Brand;
import com.zhiwei.rent.model.user.User;
import com.zhiwei.rent.service.BaseService;
import com.zhiwei.rent.service.FileuploadService;
import com.zhiwei.rent.service.HttpUtilService;
import com.zhiwei.rent.service.blockchain.vo.LeaseRiskVo;
import com.zhiwei.rent.service.blockchain.vo.OrderHashContext;
import com.zhiwei.rent.service.common.AliyunKuaidiService;
import com.zhiwei.rent.service.order.OrderItemService;
import com.zhiwei.rent.service.order.OrderStagesService;
import com.zhiwei.rent.service.order.OrderSupplementService;
import com.zhiwei.rent.service.product.ProductService;
import com.zhiwei.rent.service.product.ProductSkuService;
import com.zhiwei.rent.service.sys.BrandService;
import com.zhiwei.rent.service.user.UserService;
import com.zhiwei.rent.service.zfb.ZfbService;
import com.zhiwei.rent.util.DateUtils;
import com.zhiwei.rent.util.MD5Utils;
import com.zhiwei.rent.util.OrderUtils;
import com.zhiwei.rent.util.Utils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @date 2020年12月27日11时38分
 */
@Service
@Slf4j
public class AntCloudHashService extends BaseService {
    @Autowired
    private AntCloudService  antCloudService;
    @Autowired
    private BrandService brandService;
    @Autowired
    private ProjectConfig projectConfig;
    @Autowired
    private AntBlockChainConfig chainConfig;
    @Autowired
    private ProductSkuService productSkuService;
    @Autowired
    private ZfbService zfbService;
    @Autowired
    private ProductService productService;
    @Autowired
    private OrderItemService orderItemService;
    @Autowired
    private HttpUtilService httpUtilService;
    @Autowired
    private FileuploadService fileuploadService;
    @Autowired
    private OrderStagesService orderStagesService;
    @Autowired
    private UserService userService;
    @Autowired
    private AliyunKuaidiService aliyunKuaidiService;
    @Autowired
    private AntBlockHashService antBlockHashService;
    @Autowired
    private OrderSupplementService orderSupplementService;

    /**
     * 发货时同步 - 因为需要发货时的 imei
     */
    public void allHash(OrderHashContext context){
        // 订单未添加智能合同
        /*if(StringUtils.isBlank(context.getOrderMaster().getContractFlowId())){
            return ;
        }*/
        List<OrderItem> items = context.getOrderMaster().getItems();
        if(items == null){
            items = orderItemService.findByOrderMasterId(context.getOrderMaster().getId());
            context.getOrderMaster().setItems(items);
        }
        this.forEach(items,(index,item)->{
            ProductSku sku = productSkuService.findById(item.getSkuId());
            String hash = this.productHash(context.getOrderMaster().getId(), sku, context.getMerchant());
            antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),hash,"商品["+item.getProductName()+"]HASH");
        });
        // 用户信息 hash
        antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),this.userHash(context),"用户信息hash");

        // 订单信息 hash 在订单后面
        ContractOss oss = this.ossUrl(context.getOrderMaster(),context.getMerchant());
        if(oss != null){
            antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),oss.getHash(),"智能合同存证HASH");

            String orderHash = this.orderHash(context,oss.getHash(),oss.getOssUrl());
            antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),orderHash,"订单HASH");
        }

        List<OrderStages> stages = context.getOrderMaster().getStages();
        if(stages == null){
            stages = orderStagesService.findByOrderMasterId(context.getOrderMaster().getId());
        }
        // 用户订单承诺
        String promise = this.userPromise(context.getOrderMaster(),stages,context.getOrderMaster().getAllInsuranceMoney());
        antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),promise,"用户承诺HASH");

        // 订单商品 hash
        String orderProductHash = this.orderProduct(context);
        antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),orderProductHash,"订单商品HASH");

        // 第一期订单履约 - 在用户支付金额,并且到账后同步
        /*int lasNumber = 0; // 剩余期数
        ZfbYsqType payType = ZfbYsqType.PAY;
        if(OrderUtils.isStages(context.getOrderMaster())){ // 月租订单
            payType = ZfbYsqType.STAGES;
            lasNumber = stages == null ? 0 :  stages.size() - 1;
        }
        ZfbYsqRecord record = zfbYsqRecordService.findByOrderMasterIdAndType(context.getOrderMaster().getId(),payType);
        String rental = this.orderRental(context.getOrderMaster(),1,lasNumber, record);
        JSONArray array = new JSONArray();
        array.add(rental);
        ret.put("rental",array);*/
    }

    /**
     * 用户确认收货
     */
    public void userConfirm(OrderMaster master){
        this.orderWl(master);
    }



    public String orderHash(OrderHashContext context,String hash,String ossUrl){
        // 总租金 - 总的保险金额,保险金额不算
        Double allRentMoney = OrderUtils.getAllRentMoneyAndExcludeDiscountMoney(context.getOrderMaster())
                - context.getOrderMaster().getAllInsuranceMoney();
        // 总押金
        Long money = this.getMoneyLi(context.getOrderMaster().getAllPledge());
        // 单价
        Long unitMoney = this.getMoneyLi(allRentMoney/context.getOrderMaster().getDay());

        JSONObject order = new JSONObject();
        order.put("orderId",context.getOrderMaster().getId());
        order.put("orderCreateTime",this.getDate(context.getOrderMaster().getCreateDate()) );
        order.put("orderPayTime",this.getDate(context.getOrderMaster().getPayDate()));
        order.put("orderPayId",context.getOrderMaster().getId());
        order.put("orderPayType","1");
        order.put("depositFree",money); //
        order.put("acutalPreAuthFree",money);
        order.put("rentTerm",this.getUnitDay(context.getOrderMaster())); // 单位
        order.put("rentPricePerMonth",unitMoney); // 月租金
        order.put("buyOutPrice",money); // 买断价格
        order.put("leaseServiceFileHash",hash);
        order.put("leaseServiceFileTxHash",hash);
        order.put("leaseContractUrl",ossUrl);
        order.put("dueMode","1");
        order.put("totalRentMoney",this.getMoneyLi(allRentMoney));
        OrderSupplement supplement = orderSupplementService.findByOrderId(context.getOrderMaster().getId());
        if(supplement != null){
            LeaseRiskVo yd = Utils.parseJson(supplement.getYdTxt(),LeaseRiskVo.class);
            if(yd != null){
                Double scors = CollectionUtils.isEmpty(yd.getModels()) ? null : NumberUtils.toDouble(yd.getModels().get(0).getScore());
                if(scors != null && scors > 0){
                    order.put("yidunScore",scors.intValue());
                }
            }
        }
        String address = context.getOrderMaster().getDeliveryDetailAddress();
        if(StringUtils.isBlank(address)){
            address = "自提";
        }
        order.put("userAddress",address);
        order.put("provinceCode",context.getOrderMaster().getDeliveryProvinceId()); //
        order.put("cityCode",context.getOrderMaster().getDeliveryCityId());
        order.put("districtCode",context.getOrderMaster().getDeliveryCountyId());
        order.put("storeType","1");
        return this.getHash(antCloudService.orderHash(order, AntLeaseType.order));
    }

    private String userHash(OrderHashContext context){
        User user = context.getUser();
        String userImageHash = user.getIdCardFrontHash();
        User update = new User();
        if(StringUtils.isBlank(userImageHash)){
            userImageHash = MD5Utils.md5(fileuploadService.download(user.getIdCardFrontUrl()));
            this.fileHash(userImageHash);
            update.setIdCardFrontHash(userImageHash);
        }
        String userBackImageHash = user.getIdCardBackHash();
        if(StringUtils.isBlank(userBackImageHash)){
            userBackImageHash = MD5Utils.md5(fileuploadService.download(user.getIdCardBackUrl()));
            this.fileHash(userBackImageHash);
            update.setIdCardBackHash(userBackImageHash);
        }
        if(StringUtils.isNotBlank(update.getIdCardBackHash()) || StringUtils.isNotBlank(update.getIdCardFrontHash())){
            userService.update(user.getId(),update);
            userService.clearUserinfo(new UserAuthorization(user));
        }
        Merchant merchant = context.getMerchant();
        JSONObject hash = new JSONObject();
        hash.put("orderId",context.getOrderMaster().getId());
        hash.put("loginId",context.getOrderMaster().getUserId());
        hash.put("loginType","1");
        hash.put("loginTime",this.getDate(new Date()));
        hash.put("userName",user.getTrueName());
        hash.put("userId",user.getIdCardNum());
        hash.put("userImageHash",userImageHash); //
        hash.put("userBackImageHash",userBackImageHash); //
        hash.put("userPhoneNumber",user.getMobile());
        hash.put("userType","3");
        hash.put("alipayUID",user.getZfbUserId());
        hash.put("leaseCorpName",merchant.getName());
        hash.put("leaseCorpId",merchant.getTaxNumber());
        hash.put("leaseCorpOwnerName",merchant.getLegalPerson());
        hash.put("lesseeType","2");
        hash.put("leasedEnterprise",merchant.getName());
        hash.put("userImageUrl",user.getIdCardFrontUrl());
        hash.put("userBackImageUrl",user.getIdCardBackUrl());
        return this.getHash(antCloudService.orderHash(hash, AntLeaseType.user));
    }

    private String productHash(Long orderMasterId,ProductSku sku,Merchant merchant){
        StringBuilder xh = new StringBuilder();
        JSONArray xhjson = JSONArray.parseArray(sku.getAttributes());
        for(int i = 0 ; i < xhjson.size(); i ++){
            JSONObject xhobj = xhjson.getJSONObject(i);
            xh.append(xhobj.getString("value")).append("/");
        }

        String xhTxt = xh.toString();
        if(xhTxt.length() > 30){
            xhTxt = xh.substring(0,30);
        }

        Product product = productService.findById(sku.getProductId());
        Brand brand = brandService.findById(product.getBrandId());
        JSONObject obj = new JSONObject();
        obj.put("productId",this.getProdudId(sku.getProductId(),sku.getId()));
        obj.put("productVersion",orderMasterId);
        obj.put("productName",product.getName());
        obj.put("productPrice",this.getMoneyLi(sku.getDeposit()));
        obj.put("mainClass","3C");
        obj.put("subClass","3c_other");
        obj.put("supplierName",merchant.getName());
        obj.put("supplierId",merchant.getId());
        obj.put("installPrice","0"); // 安装服务费
        obj.put("productOrigin","1"); // 供应商
        obj.put("realStock","1");   // 库存
        obj.put("estimatedShipment","1"); // 实际出货量
        obj.put("productDetailInfo",product.getContentUrl()); // 商品详情
        obj.put("productUrl",projectConfig.getDomain()+"/product/detail.json?id="+product.getId());
        obj.put("productBrand",brand == null ? "未知":brand.getName()); // 品牌
        obj.put("productModel",xhTxt); // 商品型号
        obj.put("depositPrice",this.getMoneyLi(sku.getDeposit()));
        return this.getHash(antCloudService.orderHash(obj, AntLeaseType.product));
    }

    private String orderProduct(OrderHashContext context){
        JSONObject json = new JSONObject();
        json.put("leaseId",chainConfig.getTenantId());
        json.put("orderId",context.getOrderMaster().getId());
        JSONArray productInfo = new JSONArray();
        for(OrderItem item : context.getOrderMaster().getItems()){
            JSONObject obj = new JSONObject();
            obj.put("productId",this.getProdudId(item.getProductId(),item.getSkuId()));
            obj.put("productName",this.getStringMaxLen(item.getProductName(),49));
            obj.put("productNumber",item.getNum());
            List<String> imeiTxt = this.getImei(String.valueOf(item.getId()),item.getImei(),item.getNum());
            obj.put("productImeiId",Utils.listJoin(imeiTxt,","));
            obj.put("productVersion",context.getOrderMaster().getId());
            // this.getMoneyLi(item.getMoney() * item.getNum() * context.getOrderMaster().getDay())
            // 调整为押金
            obj.put("productPrice",this.getMoneyLi(item.getPledge() * item.getNum()));
            obj.put("supplierId",chainConfig.getTenantId());
            productInfo.add(obj);
        }
        json.put("productInfo",productInfo);
        return this.getHash(antCloudService.orderHash(json,AntLeaseType.orderProduct));
    }


    /**
     * 订单履约
     */
    public void orderRental(OrderMaster orderMaster,int number,int lasNumber, ZfbYsqRecord record,RentalType type){
        JSONObject json = new JSONObject();
        json.put("orderId",orderMaster.getId());
        json.put("leaseTermIndex",number);
        json.put("rentalReturnState",type.getCode());
        json.put("rentalMoney",record == null ? 0 : this.getMoneyLi(record.getMoney()));
        json.put("returnTime",DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
        json.put("returnWay",type.getWay()); // 归还方式,1预授权代扣,2支付宝代扣,3主动还款,4其他
        json.put("returnVoucherType",type.getVoucher()); // 还款凭证类型,1支付宝,2平台代收(客户主动还款),3其他
        json.put("returnVoucherSerial",record == null ? "qt" : record.getPayId());
        json.put("charge",0);
        json.put("remainTerm", Math.max(lasNumber, 0));
        String hash = this.getHash(antCloudService.orderHash(json,AntLeaseType.rental));
        antBlockHashService.saveOrderHash(orderMaster.getId(),hash,"订单履约HASH");
    }

    /**
     * 物流信息
     */
    public boolean orderWl(OrderMaster orderMaster){
        JSONObject json = new JSONObject();
        json.put("orderId",orderMaster.getId());
        json.put("leaseId",chainConfig.getTenantId());
        json.put("arriveConfirmUrl",projectConfig.getDomain()+"/common/expressQuery.json?com="+orderMaster.getGoExpress()+"&num="+orderMaster.getGoExpressNumber()+"&id="+orderMaster.getId()+"&type=order");
        JSONObject tx = this.getWlTxt(orderMaster);
        if(tx == null){
            return false; // 快递错误
        }
        String ossUrl = fileuploadService.uploadText(tx.toJSONString());
        String hash = MD5Utils.md5(tx.toJSONString());
        this.fileHash(hash);

        json.put("arriveConfirmTxHash",hash);
        json.put("arriveConfirmHash",hash);
        json.put("logisticStatus",3);
        json.put("arriveConfirmTime",DateUtils.format(new Date()));
        json.put("logisticCompanyName",aliyunKuaidiService.getExpressName(orderMaster.getGoExpress()));
        json.put("leaseStatus",1);
        json.put("logisticsOrderId",orderMaster.getId());
        json.put("deliverTime",orderMaster.getGoExpressDate());
        JSONObject extraInfo = new JSONObject();
        extraInfo.put("wlinfo",ossUrl); // 其他信息
        json.put("extraInfo",extraInfo.toJSONString());
        String retHash = this.getHash(antCloudService.orderHash(json,AntLeaseType.logistic));
        if(StringUtils.isBlank(retHash)){
            return false;
        }
        return antBlockHashService.saveOrderHash(orderMaster.getId(),hash,AntLeaseType.logistic.getDesc());
    }

    private JSONObject getWlTxt(OrderMaster master){
        if(Constants.WU_EXPRESS.equals(master.getGoExpress())){ // 无物流
            JSONObject json = new JSONObject();
            json.put("state",5);
            json.put("comName","无物流-自取");
            json.put("info", master.getGoExpressDate() +" 无物流自取");
            return json;
        }
        return aliyunKuaidiService.query(master.getGoExpress(),master.getGoExpressNumber(),master.getDeliveryMobile());
    }


    public String userPromise(OrderMaster orderMaster, List<OrderStages> stages,Double allInsuranceMoney){
        // 日租订单
        if(this.isEmpty(stages) && RentType.day.name().equals(orderMaster.getRentType())){
            stages = new ArrayList<>();
            OrderStages item = new OrderStages();
            item.setRefundDate(orderMaster.getBeginDate());
            item.setMoney(OrderUtils.getAllRentMoneyAndExcludeDiscountMoney(orderMaster));
            stages.add(item);
        }
        JSONObject json = new JSONObject();
        json.put("orderId",orderMaster.getId());
        json.put("limit",0);
        JSONArray payDateList = new JSONArray();
        JSONArray payMoneyList = new JSONArray();
        for(OrderStages item : stages){
            payDateList.add(DateFormatUtils.format(item.getRefundDate(),"yyyy-MM-dd HH:mm:ss"));
            Double money = item.getMoney();
            if(item.getSort() == 1){ // 第一期需要扣减保险上链金额
                money = money - (allInsuranceMoney == null ? 0 : allInsuranceMoney);
            }
            payMoneyList.add(this.getMoneyLi(money));
        }
        json.put("payDateList",payDateList);
        json.put("payPeriod",this.getUnitDay(orderMaster));
        json.put("payMoneyList",payMoneyList);
        AppletIdEnum appletIdEnum = AppletIdEnum.get(orderMaster.getAppletSource());
        json.put("leaseAlipayUid",zfbService.getPid(appletIdEnum.getAppid()));
        return this.getHash(antCloudService.orderHash(json,AntLeaseType.leasePromise));
    }

    /**
     * 文件 hash
     */
    public String fileHash(String hash){
        boolean res = antCloudService.leaseBiznotary(hash, Constants.COMPANY_CODE,Constants.COMPANY_NAME,Constants.LEGAL_PERSON);
        return res?hash:"";
    }


    public ContractOss ossUrl(OrderMaster master,Merchant merchant){
        String url = this.getContractUrl(master.getContractFlowId());
        if (StringUtils.isNotBlank(url)) {
            byte[] data = httpUtilService.donwnloadFile(url);
            String hash = MD5Utils.md5(data);
            String key = (projectConfig.getApiDebug() ? "test/" : "") + "contract/" + master.getOrderNumber() + ".pdf";
            String ossUrl = fileuploadService.uploadAndKey(new ByteArrayInputStream(data), key);
            boolean hashRes = antCloudService.leaseBiznotary(hash,merchant.getTaxNumber(),merchant.getName(),merchant.getLegalPerson());
            if (hashRes) {
                return new ContractOss(hash,ossUrl);
            }
        }
        return null;
    }

    @Data
    private class ContractOss{
        public ContractOss(String hash,String ossUrl){
            this.hash = hash;
            this.ossUrl = ossUrl;
        }
        private String hash;
        private String ossUrl;
    }

    private String getContractUrl(String flowId) {
        try {
            DownloadContractDocumentResponse response = antCloudService.twcNotaryContractDocumentDownload(flowId);
            if (response.getDocs() != null && response.getDocs().size() > 0) {
                return response.getDocs().get(0).getFileUrl();
            }
            log.error("获取合同下载地址返回 flowId = {},body={}", flowId, JSON.toJSONString(response));
        } catch (Exception e) {
            log.error("获取只能合同错误,flowId={}", flowId, e);
        }
        return "";
    }

    private List<String> getImei(String orderItemId,String imeiTxt,int len){
        String [] imei = StringUtils.isBlank(imeiTxt) ? null : StringUtils.split(imeiTxt,",");
        List<String> list = new ArrayList<>();
        int jsonLen = imei == null ? 0 : imei.length;
        for (int i = 0; i < len; i++) {
            list.add(i + orderItemId+":"+(i < jsonLen ? imei[i] : ""));
        }
        return list;
    }

    private String getHash(CreateLeaseBizResponse res){
        return res == null ? "" : res.getResponseData();
    }

    private String getDate(Date date){
        return DateFormatUtils.format(date,"yyyy-MM-dd HH:mm:ss");
    }

    private Long getMoneyLi(Double money){
        return Double.valueOf(money * 10000).longValue();
    }

    private String getProdudId(Long productId, Long skuId){
        return productId+":"+skuId;
    }

    private String getStringMaxLen(String str,int len){
        if(str == null){
            return null;
        }
        if(len >= str.length()){
            return str;
        }
        return str.substring(0,len);
    }

    private int getUnitDay(OrderMaster orderMaster){
        if(RentType.day.name().equals(orderMaster.getRentType())){
            return 1; // 日租订单只有一个月
        }
        return OrderUtils.getMonthLen(orderMaster.getDay());
    }

    /**
     * 用户的履约状态
     */
    public enum RentalType{
        ZEGH(1,1,1,"足额归还"),
        OFFLINE(1,4,3,"足额归还"), // 线下支付
        BFGH(2,1,1,"部分归还"),
        WGH(3,4,3,"未归还"),
        TZ(4,4,3,"退租"),
        YWJ(5,1,1,"已完结")
        ;
        RentalType(int code,int way,int voucher,String name){
            this.code = code;
            this.way = way;
            this.voucher = voucher;
            this.name = name;
        }
        private final int code; // 租金归还状态,1足额归还,2部分归还,3未归还,4退租,5该订单整个生命周期已完结
        private final int way; // 归还方式,1预授权代扣,2支付宝代扣,3主动还款,4其他
        private final int voucher; // 还款凭证类型,1支付宝,2平台代收(客户主动还款),3其他
        private final String name;
        public int getCode() {
            return code;
        }
        public String getName() {
            return name;
        }
        public int getWay() {
            return way;
        }
        public int getVoucher() {
            return voucher;
        }
    }
}



AntUploadContractTemplateService

package com.zhiwei.rent.service.blockchain;

import cn.com.antcloud.api.twc.v1_0_0.response.CreateContractTemplateResponse;
import com.zhiwei.rent.service.CacheService;
import com.zhiwei.rent.util.CacheKeysUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;

@Service
public class AntUploadContractTemplateService {

    @Autowired
    private CacheService cacheService;

    @Autowired
    private AntCloudService antCloudService;

    public String getContinueTemplateId() throws Exception{
        CacheKeysUtils.CacheKey key = CacheKeysUtils.getContractTemplateId();
        String templateId = cacheService.get(key.getKey());
        if(StringUtils.isNotBlank(templateId)){
            return templateId;
        }
        // 获取合同模版文件
        byte [] contractTemplateFile = antCloudService.getContinueContractTemplateFileByte();
        String uploadUrl = "";
        // 通过文件上传方式创建电子合同签署模板
        CreateContractTemplateResponse createContractTemplateResponse = antCloudService.twcNotaryContractTemplateCreate(contractTemplateFile);
        if (createContractTemplateResponse != null) {
            if ("200".equals(createContractTemplateResponse.getResultCode())) {
                templateId = createContractTemplateResponse.getTemplateId();
                uploadUrl = createContractTemplateResponse.getUploadUrl();
            } else {
                throw new Exception(String.format("创建电子合同签署模板失败:%s", createContractTemplateResponse.getResultMsg()));
            }
        } else {
            throw new Exception("创建电子合同签署模板失败");
        }
        // 上传电子合同模板
        try {
            boolean isSuccess = antCloudService.twcNotaryContractPlatformTemplateUpload(uploadUrl, contractTemplateFile);
            if (!isSuccess) {
                throw new Exception("上传电子合同模板失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new Exception("上传电子合同模板失败",e);
        }
        cacheService.set(key,templateId);
        return templateId;
    }

    public String getTemplateId() throws Exception{
        CacheKeysUtils.CacheKey key = CacheKeysUtils.getContractTemplateId();
        String templateId = cacheService.get(key.getKey());
        if(StringUtils.isNotBlank(templateId)){
            return templateId;
        }
        // 获取合同模版文件
        byte [] contractTemplateFile = antCloudService.getContractTemplateFileByte();
        String uploadUrl = "";
        // 通过文件上传方式创建电子合同签署模板
        CreateContractTemplateResponse createContractTemplateResponse = antCloudService.twcNotaryContractTemplateCreate(contractTemplateFile);
        if (createContractTemplateResponse != null) {
            if ("200".equals(createContractTemplateResponse.getResultCode())) {
                templateId = createContractTemplateResponse.getTemplateId();
                uploadUrl = createContractTemplateResponse.getUploadUrl();
            } else {
                throw new Exception(String.format("创建电子合同签署模板失败:%s", createContractTemplateResponse.getResultMsg()));
            }
        } else {
            throw new Exception("创建电子合同签署模板失败");
        }
        // 上传电子合同模板
        try {
            boolean isSuccess = antCloudService.twcNotaryContractPlatformTemplateUpload(uploadUrl, contractTemplateFile);
            if (!isSuccess) {
                throw new Exception("上传电子合同模板失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new Exception("上传电子合同模板失败",e);
        }
        cacheService.set(key,templateId);
        return templateId;
    }


}


AntCloudAccountService

package com.zhiwei.rent.service.blockchain;

import cn.com.antcloud.api.twc.v1_0_0.response.*;
import com.alibaba.fastjson.JSON;
import com.zhiwei.rent.common.CommonException;
import com.zhiwei.rent.common.Constants;
import com.zhiwei.rent.model.merchant.Merchant;
import com.zhiwei.rent.model.user.User;
import com.zhiwei.rent.service.CacheService;
import com.zhiwei.rent.service.blockchain.vo.AntOrgInfo;
import com.zhiwei.rent.service.blockchain.vo.OrgInfo;
import com.zhiwei.rent.service.user.UserService;
import com.zhiwei.rent.util.CacheKeysUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @date 2020年09月03日19时59分
 */
@Service
public class AntCloudAccountService {

    private final Logger logger = LoggerFactory.getLogger(AntCloudAccountService.class);

    @Autowired
    private CacheService cacheService;

    @Autowired
    private AntCloudService antCloudService;

    @Autowired
    private UserService userService;

    private OrgInfo getOrgInfo(Merchant merchant){
        OrgInfo info = new OrgInfo();
        if(merchant == null){
            info.setCompanyName(Constants.COMPANY_NAME);
            info.setCompanyCode(Constants.COMPANY_CODE);
            info.setLegalPerson(Constants.LEGAL_PERSON);
            info.setLegalPersonIdCardNo(Constants.LEGAL_ID_CARD_NO);
            return info;
        }
        info.setCompanyName(merchant.getLicenseName());
        info.setCompanyCode(merchant.getTaxNumber());
        info.setLegalPerson(merchant.getLegalPerson());
        info.setLegalPersonIdCardNo(merchant.getLegalPersonIdNo());
        return info;
    }

    public AntOrgInfo getAccountByType(Merchant merchant, String username, String idCardNo, String mobile) throws Exception{
        OrgInfo info = this.getOrgInfo(merchant);
        Long id = merchant == null ? 0L: merchant.getId();
        // 获取合同签署平台方个人账号ID
        CacheKeysUtils.CacheKey contractPlatformAccountIdCacheKey = CacheKeysUtils.getContractPlatformAccountId(id);
        String platformAccountId = cacheService.get(contractPlatformAccountIdCacheKey,()->{
            CreateContractAccountResponse createContractAccountResponse = antCloudService.twcNotaryContractAccountCreate(username,idCardNo,mobile);
            if (createContractAccountResponse != null) {
                if ("200".equals(createContractAccountResponse.getResultCode())) {
                    return createContractAccountResponse.getAccountId();
                }
                logger.error("电子合同平台方个人账号注册失败,username={},idcardNo={},mobile={},msg={}",username,idCardNo,mobile,JSON.toJSONString(createContractAccountResponse));
            }
            return null;
        });
        // 判断账号是否存在,不存在则注册
        if (StringUtils.isBlank(platformAccountId)) {// 平台方个人账号注册
            throw new Exception("电子合同平台方个人账号注册失败");
        }


        // 获取合同签署平台方企业账号ID
        CacheKeysUtils.CacheKey contractPlatformOrgIdCacheKey = CacheKeysUtils.getContractPlatformOrgId(id);
        String platformOrgId = cacheService.get(contractPlatformOrgIdCacheKey,()->{
            CreateContractOrganizationResponse createContractOrganizationResponse = antCloudService.twcNotaryContractOrganizationCreate(platformAccountId,info);
            if (createContractOrganizationResponse != null) {
                logger.info(JSON.toJSONString(createContractOrganizationResponse));
                if ("200".equals(createContractOrganizationResponse.getResultCode())) {
                    return createContractOrganizationResponse.getOrgId();
                }
                logger.error("orgInfo={},username={},idCardNo={},mobile={},msg={}",JSON.toJSONString(info),username,idCardNo,mobile,JSON.toJSONString(createContractOrganizationResponse));
            }
            return null;
        });
        // 判断账号是否存在,不存在则注册
        if (StringUtils.isBlank(platformOrgId)) {// 平台方企业账号注册
            throw new Exception("电子合同平台方企业账号注册失败");
        }

        // 获取平台企业账号印章ID
        CacheKeysUtils.CacheKey contractPlatformOrgSealIdCacheKey = CacheKeysUtils.getContractPlatformOrgSealId(id);
        String platformOrgSealId = cacheService.get(contractPlatformOrgSealIdCacheKey,()->{
            CreateContractOrgsealResponse createContractOrgsealResponse = antCloudService.twcNotaryContractOrgsealCreate(platformOrgId);
            if (createContractOrgsealResponse != null) {
                if ("200".equals(createContractOrgsealResponse.getResultCode())) {
                    return createContractOrgsealResponse.getSealId();
                }
                logger.error("获取平台企业账号印章ID:{},{},{},{}",username,idCardNo,mobile,JSON.toJSONString(createContractOrgsealResponse));
            }
            return null;
        });

        // 判断印章是否存在,不存在则创建
        if (StringUtils.isBlank(platformOrgSealId)) {// 平台方企业印章创建
            throw new Exception("电子合同平台方企业账号印章创建失败");
        }

        // 平台方自动签署授权
        AuthContractSignResponse platformAuthContractSignResponse = antCloudService.twcNotaryContractSignAuth(platformOrgId);
        if (platformAuthContractSignResponse != null) {
            logger.info("reqBody={}", JSON.toJSONString(platformAuthContractSignResponse));
            if (!"200".equals(platformAuthContractSignResponse.getResultCode()) || !platformAuthContractSignResponse.getAccepted()) {
                throw new Exception(String.format("平台方自动签署授权失败:%s,ID=%s", platformAuthContractSignResponse.getResultMsg(),id));
            }
        } else {
            throw new Exception("平台方自动签署授权失败,ID="+id);
        }
        AntOrgInfo ret = new AntOrgInfo();
        ret.setAccountId(platformAccountId);
        ret.setOrgId(platformOrgId);
        ret.setOrgSealId(platformOrgSealId);
        return ret;
    }


    public AntOrgInfo getUserAccountInfo(User user) throws Exception{
        String userAccountId;
        // 判断合同签署用户方个人账号是否存在,不存在则注册
        if (StringUtils.isBlank(user.getContractUserId())) {
            // 用户方个人账号注册
            CreateContractAccountResponse createContractAccountResponse = antCloudService.twcNotaryContractAccountCreate(user.getTrueName(),user.getIdCardNum(),user.getMobile());
            if (createContractAccountResponse != null) {
                if ("200".equals(createContractAccountResponse.getResultCode())) {
                    userAccountId = createContractAccountResponse.getAccountId();
                    // 更新用户信息
                    userService.update(user.getId(), new User() {{
                        setContractUserId(userAccountId);
                    }});
                } else {
                    throw new Exception(String.format("电子合同用户方个人账号注册失败:%s", createContractAccountResponse.getResultMsg()));
                }
            } else {
                throw new Exception("电子合同用户方个人账号注册失败");
            }
        } else {
            userAccountId = user.getContractUserId();
        }
        String userSealId;
        // 判断合同签署用户方个人账号印章是否存在,不存在则创建
        if (StringUtils.isBlank(user.getContractSealId())) {
            // 用户方个人印章创建
            CreateContractAccountsealResponse createContractAccountsealResponse = antCloudService.twcNotaryContractSccountsealCreate( userAccountId);
            if (createContractAccountsealResponse != null) {
                if ("200".equals(createContractAccountsealResponse.getResultCode())) {
                    userSealId = createContractAccountsealResponse.getSealId();
                    // 更新用户信息
                    userService.update(user.getId(), new User() {{
                        setContractSealId(userSealId);
                    }});
                } else {
                    throw new Exception(String.format("电子合同用户方个人账号印章创建失败:%s", createContractAccountsealResponse.getResultMsg()));
                }
            } else {
                throw new Exception("电子合同用户方个人账号印章创建失败");
            }
        } else {
            userSealId = user.getContractSealId();
        }


        // 用户方自动签署授权
        AuthContractSignResponse userAuthContractSignResponse = antCloudService.twcNotaryContractSignAuth(userAccountId);
        if (userAuthContractSignResponse != null) {
            if (!"200".equals(userAuthContractSignResponse.getResultCode()) || !userAuthContractSignResponse.getAccepted()) {
                throw new CommonException(String.format("用户方自动签署授权失败:%s,ID=%s", userAuthContractSignResponse.getResultMsg(),user.getId()));
            }
        } else {
            throw new Exception("用户方自动签署授权失败"+user.getId());
        }

        AntOrgInfo info = new AntOrgInfo();
        info.setAccountId(userAccountId);
        info.setOrgSealId(userSealId);
        return info;
    }




}


AntCloudService

package com.zhiwei.rent.service.blockchain;

import cn.com.antcloud.api.AntFinTechApiClient;
import cn.com.antcloud.api.AntFinTechProfile;
import cn.com.antcloud.api.twc.v1_0_0.model.*;
import cn.com.antcloud.api.twc.v1_0_0.request.*;
import cn.com.antcloud.api.twc.v1_0_0.response.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.rent.common.AntLeaseType;
import com.zhiwei.rent.common.Constants;
import com.zhiwei.rent.config.AntBlockChainConfig;
import com.zhiwei.rent.config.ProjectConfig;
import com.zhiwei.rent.model.user.User;
import com.zhiwei.rent.service.FileuploadService;
import com.zhiwei.rent.service.blockchain.vo.AntOrgInfo;
import com.zhiwei.rent.service.blockchain.vo.OrgInfo;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.*;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class AntCloudService {//区块链技术

    private final Logger logger = LoggerFactory.getLogger(AntCloudService.class);

    @Autowired
    private AntBlockChainConfig  antBlockChainConfig;

    @Autowired
    private ProjectConfig projectConfig;

    @Autowired
    private FileuploadService fileuploadService;


    private static final String fileName = "contract-template.pdf"; // 文件名


    public AntFinTechApiClient getClient(){
        AntFinTechProfile profile = AntFinTechProfile.getProfile(
                "https://prodapigw.cloud.alipay.com",
                antBlockChainConfig.getAccessKey(), // AccessKey
                antBlockChainConfig.getSecret() // SecretKey
        );
        return new AntFinTechApiClient(profile);
    }

    public String getProductInstanceId(){
        if(projectConfig.getApiDebug()){
            return "notary-api-test";
        }
        return "notary-api-prod";
    }
    public byte [] getContractTemplateFileByte(){
 
        return fileuploadService.download("xxxxx");
    }

    //续租合同
    public byte[] getContinueContractTemplateFileByte(){
        return fileuploadService.download("C:\\Users\\Lemon\\Desktop\\续租合同.pdf");
    }



    /**
     * 电子合同平台方注册
     */
    public CreateContractPlatformResponse twcNotaryContractPlatformCreate() {
        CreateContractPlatformResponse response = null;
        try {
            // 构建请求
            CreateContractPlatformRequest request = new CreateContractPlatformRequest();
            ContractAccountApplication creator = new ContractAccountApplication();
            creator.setUserId("1");
            request.setCreator(creator);
            ContractOrganizationApplication platform = new ContractOrganizationApplication();
            platform.setIdNumber(Constants.COMPANY_CODE);
            platform.setIdType("CRED_ORG_USCC");
            platform.setLegalPerson(Constants.LEGAL_PERSON);
            platform.setLegalPersonId(Constants.LEGAL_ID_CARD_NO);
            platform.setName(Constants.COMPANY_NAME);
            request.setPlatform(platform);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 创建智能合同模板
     */
    public CreateContractPlatformtemplateResponse twcNotaryContractPlatformTemplateCreate(InputStream contractFile) {
        CreateContractPlatformtemplateResponse response = null;
        try {
            // 构建请求
            CreateContractPlatformtemplateRequest request = new CreateContractPlatformtemplateRequest();
            request.setContentMd5(calcNotaryContractFileMD5(contractFile));
            request.setContentType("application/octet-stream");
            request.setConvert2Pdf(false);
            request.setFileName(fileName);
            List<ContractPlatformSignField> contractPlatformSignFields = new ArrayList<>();
            ContractPlatformSignField contractPlatformSignField = new ContractPlatformSignField();
            contractPlatformSignField.setAddSignTime(true);
            contractPlatformSignField.setOrder(1l);
            contractPlatformSignField.setPosPage("1");
            contractPlatformSignField.setPosX("350");
            contractPlatformSignField.setPosY("450");
            contractPlatformSignFields.add(contractPlatformSignField);
            request.setSignFields(contractPlatformSignFields);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 上传智能合同模板
     */
    public boolean twcNotaryContractPlatformTemplateUpload(String url,byte [] contractFile) throws IOException {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            HttpPut httpPut = new HttpPut(url);
            httpPut.setHeader("Content-Type", "application/octet-stream");
            httpPut.setHeader("Content-MD5", calcNotaryContractFileMD5(new ByteArrayInputStream(contractFile)));
            httpPut.setEntity(new InputStreamEntity(new ByteArrayInputStream(contractFile), ContentType.APPLICATION_OCTET_STREAM));
            CloseableHttpResponse execute = httpclient.execute(httpPut);
            if (execute.getStatusLine().getStatusCode() == 200) {
                String result = EntityUtils.toString(execute.getEntity(), "UTF-8");
                JSONObject object = JSON.parseObject(result);
                if (object.getIntValue("errCode") == 0) {
                    return true;
                }
            }
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            httpclient.close();
        }
    }

    /**
     * 电子合同平台方的用户注册
     */
    public CreateContractUserResponse twcNotaryContractUserCreate(User user) {
        CreateContractUserResponse response = null;
        try {

            // 构建请求
            CreateContractUserRequest request = new CreateContractUserRequest();
            ContractAccountApplication contractAccountApplication = new ContractAccountApplication();
            contractAccountApplication.setEmail("");
            contractAccountApplication.setIdNumber(user.getIdCardNum());
            contractAccountApplication.setIdType("CRED_PSN_CH_IDCARD");
            contractAccountApplication.setMobile(user.getMobile());
            contractAccountApplication.setName(user.getTrueName());
            contractAccountApplication.setUserId(user.getId().toString());
            request.setUser(contractAccountApplication);
            request.setUserType("PERSON");
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 电子合同平台方发起手动签署流程
     */
    public StartContractHandsignResponse twcNotaryContractHandsignStart(User user, String template, String userAccount) {
        StartContractHandsignResponse response = null;
        try {

            // 构建请求
            StartContractHandsignRequest request = new StartContractHandsignRequest();
            request.setAutoArchive(true);
            request.setBusinessScene(Constants.WEBSIT_NAME + "平台用户协议");
            ContractSignFlowConfig contractSignFlowConfig = new ContractSignFlowConfig();
            contractSignFlowConfig.setNoticeType("1");
            contractSignFlowConfig.setSignPlatform("1");
            request.setContractSignFlowConfig(contractSignFlowConfig);

            JSONObject formFields = new JSONObject();
            formFields.put("s_name", user.getTrueName());
            formFields.put("s_id_card_number", user.getIdCardNum());
            request.setSimpleFormFields(formFields.toJSONString());

            request.setTemplate(template);
            request.setUserAccount(userAccount);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);

            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 签署流程查询
     * @param flowId 合同ID
     */
    public QueryContractFlowResponse twcNotaryContractFlowQuery(String flowId) {
        QueryContractFlowResponse response = null;
        try {
            // 构建请求
            QueryContractFlowRequest request = new QueryContractFlowRequest();
            request.setFlowId(flowId);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);

            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 创建电子合同签署个人帐户
     */
    public CreateContractAccountResponse twcNotaryContractAccountCreate(String username,String idCardNo,String mobile) {
        CreateContractAccountResponse response = null;
        try {
            // 构建请求
            CreateContractAccountRequest request = new CreateContractAccountRequest();
            request.setIdNumber(idCardNo);
            request.setIdType("CRED_PSN_CH_IDCARD");
            request.setMobile(mobile);
            request.setName(username);
            request.setUserId(idCardNo);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }


    public QueryContractOrganizationResponse twcNotaryContractOrganizationQuery(String accountId, OrgInfo info) {
        QueryContractOrganizationResponse response = null;
        try {
            // 构建请求
            QueryContractOrganizationRequest request = new QueryContractOrganizationRequest();
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 创建电子合同签署机构帐户
     */
    public CreateContractOrganizationResponse twcNotaryContractOrganizationCreate(String accountId, OrgInfo info) {
        CreateContractOrganizationResponse response = null;
        try {
            // 构建请求
            CreateContractOrganizationRequest request = new CreateContractOrganizationRequest();
            request.setCreator(accountId);
            request.setIdNumber(info.getCompanyCode());
            request.setIdType("CRED_ORG_USCC");
            request.setLegalPerson(info.getLegalPerson());
            request.setLegalPersonId(info.getLegalPersonIdCardNo());
            request.setName(info.getCompanyName());
            request.setUserId(info.getCompanyCode());
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);

            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 创建电子合同机构帐户印章
     */
    public CreateContractOrgsealResponse twcNotaryContractOrgsealCreate(String accountId) {
        CreateContractOrgsealResponse response = null;
        try {
            CreateContractOrgsealRequest request = new CreateContractOrgsealRequest();
            request.setAlias(String.valueOf(System.currentTimeMillis()));
            request.setCentral("STAR");
            request.setColor("RED");
            request.setOrgId(accountId);
            request.setType("TEMPLATE_ROUND");
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 创建电子合同个人帐户印章
     */
    public CreateContractAccountsealResponse twcNotaryContractSccountsealCreate(String accountId) {
        CreateContractAccountsealResponse response = null;
        try { // 构建请求
            CreateContractAccountsealRequest request = new CreateContractAccountsealRequest();
            request.setAccountId(accountId);
            request.setColor("RED");
            request.setAlias(String.valueOf(System.currentTimeMillis()));
            request.setHeight(100L);
            request.setType("BORDERLESS");
            request.setWidth(100L);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return response;
    }

    /**
     * 静默签署授权
     */
    public AuthContractSignResponse twcNotaryContractSignAuth(String accountId) {
        AuthContractSignResponse response = null;
        try {
            // 构建请求
            AuthContractSignRequest request = new AuthContractSignRequest();
            request.setAccountId(accountId);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 创建电子合同签署流程
     */
    public CreateContractFlowResponse twcNotaryContractFlowCreate(String accountId, String orgId) {
        CreateContractFlowResponse response = null;
        try {
            // 构建请求
            CreateContractFlowRequest request = new CreateContractFlowRequest();
            request.setAutoArchive(true);
            request.setBusinessScene(Constants.WEBSIT_NAME + "平台用户协议");
            ContractSignFlowConfig contractSignFlowConfig = new ContractSignFlowConfig();
            contractSignFlowConfig.setNoticeType("");
            contractSignFlowConfig.setSignPlatform("1");
            request.setConfigInfo(contractSignFlowConfig);
            request.setInitiatorAccountId(accountId);
            request.setInitiatorAuthorizedAccountId(orgId);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return response;
    }

    /**
     * 通过文件上传方式创建电子合同签署模板
     * @param contractFile 合同文件二进制数据
     */
    public CreateContractTemplateResponse twcNotaryContractTemplateCreate(byte [] contractFile) {
        CreateContractTemplateResponse response = null;
        try {
            // 构建请求
            CreateContractTemplateRequest request = new CreateContractTemplateRequest();
            request.setContentMd5(calcNotaryContractFileMD5(new ByteArrayInputStream(contractFile)));
            request.setContentType("application/octet-stream");
            request.setConvert2Pdf(false);
            request.setFileName(fileName);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 通过电子合同模板添加文档
     * @param templateId 模版ID
     * @param params 参数
     * @return null
     */
    public AddContractFileResponse twcNotaryContractFileAdd(String templateId, Map<String, String> params) {
        AddContractFileResponse response = null;
        try {
            // 构建请求
            AddContractFileRequest request = new AddContractFileRequest();
            request.setName(Constants.WEBSIT_NAME+"平台用户协议");
            request.setSimpleFormFields(JSON.toJSONString(params));
            request.setTemplateId(templateId);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            logger.info("reqBody={}",JSON.toJSONString(request));
            response = this.getClient().execute(request);
        } catch (Exception e) {
            logger.error("智能合同模板上传错误",e);
        }
        return response;
    }

    /**
     * 向电子合同签署流程中添加待签署文档
     * @param flowId 合同ID
     * @param fileId 文件ID
     * @return null
     */
    public AddContractDocumentResponse twcNotaryContractDocumentAdd(String flowId, String fileId) {
        AddContractDocumentResponse response = null;
        try {

            // 构建请求
            AddContractDocumentRequest request = new AddContractDocumentRequest();
            List<ContractDoc> contractDocList = new ArrayList<>();
            ContractDoc contractDoc = new ContractDoc();
            contractDoc.setEncryption(0L);
            contractDoc.setFileId(fileId);
            contractDocList.add(contractDoc);
            request.setDocs(contractDocList);
            request.setFlowId(flowId);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 添加电子合同签署方自动盖章签署区
     *
     * @param flowId 合同ID
     * @param fileId 文件ID
     */
    public AddContractSignfieldResponse twcNotaryContractSignfieldAdd(String flowId,
                                                                      String fileId, AntOrgInfo platform,AntOrgInfo jf,AntOrgInfo user) {
        AddContractSignfieldResponse response = null;
        try {

            // 构建请求
            AddContractSignfieldRequest request = new AddContractSignfieldRequest();
            request.setFlowId(flowId);
            List<ContractSignFieldApplication> contractSignFieldApplicationList = new ArrayList<>();
            // 签章1:甲方 - 商家
            contractSignFieldApplicationList.add(this.createSign(fileId,jf.getOrgId(),jf.getOrgSealId(),1,9,300,300));

            // 签章2:乙方 - 用户
            contractSignFieldApplicationList.add(this.createSign(fileId,user.getAccountId(),user.getOrgSealId(),2,9,200,350));

            // 签章3:丙方 - 平台
            contractSignFieldApplicationList.add(this.createSign(fileId,platform.getOrgId(),platform.getOrgSealId(),2,9,200,200));



            // 签章1:甲方 - 商家
            contractSignFieldApplicationList.add(this.createSign(fileId,jf.getOrgId(),jf.getOrgSealId(),1,14,450,150));
            // 签章3:丙方 - 平台
            contractSignFieldApplicationList.add(this.createSign(fileId,platform.getOrgId(),platform.getOrgSealId(),2,14,300,150));
            // 签章2:乙方 - 用户
            contractSignFieldApplicationList.add(this.createSign(fileId,user.getAccountId(),user.getOrgSealId(),2,14,170,170));

            // 签章3:用户 - 授权签名
            contractSignFieldApplicationList.add(this.createSign(fileId,user.getAccountId(),user.getOrgSealId(),6,16,250,740));


            contractSignFieldApplicationList.add(this.createSign(fileId,user.getAccountId(),user.getOrgSealId(),6,21,450,580));
            // contractSignFieldApplicationList.add(this.createSign(fileId,platform.getOrgId(),platform.getOrgSealId(),7,21,200,550));

            contractSignFieldApplicationList.add(this.createSign(fileId,user.getAccountId(),user.getOrgSealId(),6,23,250,700));

            // 添加签署区
            request.setSignfields(contractSignFieldApplicationList);

            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);

            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }


    private ContractSignFieldApplication createSign(String fileId,String orgId,String sealId,int order,int page,int x,int y){
        ContractSignFieldApplication platField = new ContractSignFieldApplication();
        platField.setAddSignTime(false);
        platField.setAuthorizedAccountId(orgId);
        platField.setFileId(fileId);
        platField.setOrder((long)order);
        platField.setPosPage(String.valueOf(page));
        platField.setPosX(String.valueOf(x));
        platField.setPosY(String.valueOf(y));
        platField.setSealId(sealId);
        return platField;
    }


    /**
     * 电子合同签署流程开启
     * @param flowId 合同ID
     */
    public StartContractFlowResponse twcNotaryContractFlowStart(String flowId) {
        StartContractFlowResponse response = null;
        try {
            // 构建请求
            StartContractFlowRequest request = new StartContractFlowRequest();
            request.setFlowId(flowId);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);

            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 电子合同签署流程归档
     * @param flowId 合同ID
     */
    public SaveContractFlowResponse twcNotaryContractFlowSave(String flowId) {
        SaveContractFlowResponse response = null;
        try {
            // 构建请求
            SaveContractFlowRequest request = new SaveContractFlowRequest();
            request.setFlowId(flowId);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);

            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }

    /**
     * 电子合同流程文档下载
     *
     * @param flowId 合同ID
     */
    public DownloadContractDocumentResponse twcNotaryContractDocumentDownload(String flowId) {
        DownloadContractDocumentResponse response = null;
        try {
            // 构建请求
            DownloadContractDocumentRequest request = new DownloadContractDocumentRequest();
            request.setFlowId(flowId);
            request.setProductInstanceId(this.getProductInstanceId());
            request.setRegionName(Constants.ALIPAY_REGION_NAME);
            // 发送请求,并且获取响应结果
            response = this.getClient().execute(request);
        } catch (Exception e) {
            logger.error("flowId={}",flowId,e);
        }
        return response;
    }

    public CreateLeaseBizResponse orderHash(JSONObject json, AntLeaseType type){
        // 构建请求
        CreateLeaseBizRequest request = new CreateLeaseBizRequest();
        request.setBizContent(json.toJSONString());
        request.setType(type.name());
        request.setProductInstanceId(this.getProductInstanceId());
        request.setRegionName(Constants.ALIPAY_REGION_NAME);
        // 发送请求,并且获取响应结果
        try {
            logger.info(type.getDesc() + "存证body={}",json.toJSONString());
            CreateLeaseBizResponse response = this.getClient().execute(request);
            logger.info(type.getDesc() + "存证返回body={}",JSON.toJSONString(response));
            if(StringUtils.isBlank(response.getResponseData())){
                return null;
            }
            return response;
        }catch (Exception e){
            logger.error(type.getDesc() + "存储错误,json={},type={}",json.toJSONString(),type.name(),e);
        }
        return null;
    }

    public String queryByOrderId(Long orderId,AntLeaseType type){
        QueryLeaseBizRequest request = new QueryLeaseBizRequest();
        request.setBizContent("{\"orderId\":\""+orderId+"\"}");
        request.setType(type.name());
        request.setProductInstanceId(this.getProductInstanceId());
        request.setRegionName(Constants.ALIPAY_REGION_NAME);
        // 发送请求,并且获取响应结果
        try {
            logger.info(type.getDesc()+"存证结果查询 orderId={},type={}",orderId,type.name());
            QueryLeaseBizResponse response = this.getClient().execute(request);
            logger.info(type.getDesc()+"存证结果查询返回 body={}",JSON.toJSONString(response));
            if(StringUtils.isBlank(response.getResponseData())){
                return null;
            }
            return response.getResponseData();
        }catch (Exception e){
            logger.error(type.getDesc() + "存证结果查询错误,orderId={},type={}",orderId,type.name());
        }
        return null;
    }


    public boolean leaseBiznotary(String hash,String leaseCorpId,String leaseCorpName,String leaseCorpOwnerName){
        CreateLeaseBiznotaryRequest request = new CreateLeaseBiznotaryRequest();
        request.setHash(hash);
        request.setLeaseCorpId(leaseCorpId);
        request.setLeaseCorpName(leaseCorpName);
        request.setLeaseCorpOwnerName(leaseCorpOwnerName);
        request.setProductInstanceId(this.getProductInstanceId());
        request.setRegionName(Constants.ALIPAY_REGION_NAME);
        // 发送请求,并且获取响应结果
        try {
            logger.info("req={}",JSON.toJSONString(request));
            CreateLeaseBiznotaryResponse response = this.getClient().execute(request);
            logger.info("租赁平台存证文件哈希返回hash={},leaseCorpId={},leaseCorpName={},leaseCorpOwnerName={},body={}",hash,leaseCorpId,leaseCorpName,leaseCorpOwnerName,JSON.toJSONString(response));
            return Long.valueOf(0).equals(response.getCode());
        }catch (Exception e){
            logger.error("租赁平台存证文件哈希错误,hash={},leaseCorpId={},leaseCorpName={},leaseCorpOwnerName={}",hash,leaseCorpId,leaseCorpName,leaseCorpOwnerName);
        }
        return false;
    }

    /**
     * 计算电子合同文件的MD5并返回Base64编码值
     */
    private String calcNotaryContractFileMD5(InputStream fileInputStream) {
        try {
            MessageDigest MD5 = MessageDigest.getInstance("MD5");
            byte[] buffer = new byte[8092];
            int length;
            while ((length = fileInputStream.read(buffer)) != -1) {
                MD5.update(buffer, 0, length);
            }
            // 取摘要的base64
            return Base64.encodeBase64String(MD5.digest());
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会爆发的火山_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值