ソースを参照

网点签约法大大

FengChaoYu 6 ヶ月 前
コミット
8f26352a69
17 ファイル変更1119 行追加45 行削除
  1. 6 1
      mall-server-api/src/main/java/com/gree/mall/manager/bean/admin/AdminUserCom.java
  2. 17 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/contract/AuthBean.java
  3. 5 0
      mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/CommonMapper.java
  4. 1 0
      mall-server-api/src/main/java/com/gree/mall/manager/constant/Constant.java
  5. 17 2
      mall-server-api/src/main/java/com/gree/mall/manager/controller/contract/WebsitContractSignController.java
  6. 36 0
      mall-server-api/src/main/java/com/gree/mall/manager/controller/fadada/NotifyController.java
  7. 56 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/contract/FieldTypeEnum.java
  8. 1 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/contract/SignContractStatusEnum.java
  9. 175 36
      mall-server-api/src/main/java/com/gree/mall/manager/logic/admin/AdminUserLogic.java
  10. 5 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/admin/AdminWebsitLogic.java
  11. 1 1
      mall-server-api/src/main/java/com/gree/mall/manager/logic/contract/CompanyCaAuthLogic.java
  12. 2 2
      mall-server-api/src/main/java/com/gree/mall/manager/logic/contract/ContractTemplateLogic.java
  13. 525 3
      mall-server-api/src/main/java/com/gree/mall/manager/logic/contract/WebsitContractSignLogic.java
  14. 246 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/fadada/FDDNotifyLogic.java
  15. 2 0
      mall-server-api/src/main/java/com/gree/mall/manager/schedule/daily/TransferRetrySchedule.java
  16. 6 0
      mall-server-api/src/main/java/com/gree/mall/manager/utils/oss/OSSUtil.java
  17. 18 0
      mall-server-api/src/main/resources/mapper/CommonMapper.xml

+ 6 - 1
mall-server-api/src/main/java/com/gree/mall/manager/bean/admin/AdminUserCom.java

@@ -6,7 +6,6 @@ import com.gree.mall.manager.plus.entity.AdminDept;
 import com.gree.mall.manager.plus.entity.AdminUser;
 import com.gree.mall.manager.plus.entity.AdminWebsit;
 import io.swagger.annotations.ApiModelProperty;
-import jdk.nashorn.internal.ir.annotations.Ignore;
 import lombok.Data;
 
 import java.util.List;
@@ -40,6 +39,12 @@ public class AdminUserCom extends AdminUser {
     @ApiModelProperty("库存管理方式 NO 不管理  CODE 管条码   NUM 管数量")
     private String joinCode;
 
+    @ApiModelProperty("是否需要跳签约 true=是 false=否")
+    private Boolean isJumpSign;
+
+    @ApiModelProperty("合同签约信息")
+    private String contractSignInfo;
+
 
     @JsonIgnore
     public String getJoinNickName() {

+ 17 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/contract/AuthBean.java

@@ -0,0 +1,17 @@
+package com.gree.mall.manager.bean.contract;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel
+public class AuthBean {
+
+    @ApiModelProperty(value = "是否跳转链接")
+    private boolean isJump = false;
+
+    @ApiModelProperty(value = "地址")
+    private String url = "";
+
+}

+ 5 - 0
mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/CommonMapper.java

@@ -34,6 +34,7 @@ import com.gree.mall.manager.bean.settle.repair.*;
 import com.gree.mall.manager.bean.workorder.*;
 import com.gree.mall.manager.enums.UserTypeEnum;
 import com.gree.mall.manager.plus.entity.ComList;
+import com.gree.mall.manager.plus.entity.ContractTemplate;
 import com.gree.mall.manager.zfire.bean.WorkerParamBean;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
 import org.apache.ibatis.annotations.Mapper;
@@ -722,4 +723,8 @@ public interface CommonMapper {
     IPage<WebsitContractSignVO> websitContractSignPage(Page page,
                                                        @Param("ex") ZfireParamBean zfireParamBean,
                                                        @Param("websitId") String websitId);
+
+    List<ContractTemplate> queryNeedContract(@Param("companyId") String companyWechatId,
+                                       @Param("websitId") String websitId,
+                                       @Param("onDate") String onDate);
 }

+ 1 - 0
mall-server-api/src/main/java/com/gree/mall/manager/constant/Constant.java

@@ -101,6 +101,7 @@ public class Constant {
         public static final String WRITE_SALES_ITEM = "jsm:sxb:parts:write:sales:item:";
         public static final String NEW_CHANGE = "jsm:sxb:parts:change:sales:";
         public static final String PARTS_REFUND = "jsm:sxb:lock:parts:refund";
+        public static final String FDD_BATCH_SIGN_NOTIFY = "jsm:sxb:fdd:batch:sign:notify:";
     }
     public class ChatMessage {
         public final static String MSG_TYPE_DOC = "docmsg";

+ 17 - 2
mall-server-api/src/main/java/com/gree/mall/manager/controller/contract/WebsitContractSignController.java

@@ -3,14 +3,17 @@ package com.gree.mall.manager.controller.contract;
 import cn.hutool.core.lang.TypeReference;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.gree.mall.manager.annotation.ZfireList;
+import com.gree.mall.manager.bean.contract.AuthBean;
 import com.gree.mall.manager.bean.contract.WebsitContractSignRecordBean;
 import com.gree.mall.manager.bean.contract.WebsitContractSignVO;
+import com.gree.mall.manager.enums.contract.SignContractStatusEnum;
 import com.gree.mall.manager.helper.ResponseHelper;
 import com.gree.mall.manager.logic.contract.WebsitContractSignLogic;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
 import com.gree.mall.manager.zfire.util.FieldUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
@@ -61,8 +64,20 @@ public class WebsitContractSignController {
 
     @PostMapping("/sign")
     @ApiOperation(value = "网点合同签约-签约")
-    public ResponseHelper sign(@RequestParam String id) {
-        websitContractSignLogic.sign(id);
+    public ResponseHelper<AuthBean> sign(
+            @ApiParam(value = "id", required = true) @RequestParam String id,
+            @ApiParam(value = "返回地址", required = true) @RequestParam String returnUrl) throws Exception {
+        AuthBean bean = websitContractSignLogic.sign(id, returnUrl);
+        return ResponseHelper.success(bean);
+    }
+
+    @PostMapping("/confirm")
+    @ApiOperation(value = "网点合同签约-审核")
+    public ResponseHelper confirm(
+            @ApiParam(value = "明细id", required = true) @RequestParam String id,
+            @ApiParam(value = "状态 OK=通过 REJECT=驳回", required = true) @RequestParam SignContractStatusEnum status,
+            @ApiParam(value = "备注", required = true) @RequestParam String remark) {
+        websitContractSignLogic.confirm(id, status, remark);
         return ResponseHelper.success();
     }
 }

+ 36 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/fadada/NotifyController.java

@@ -1,6 +1,8 @@
 package com.gree.mall.manager.controller.fadada;
 
 import com.gree.mall.manager.annotation.ApiNotAuth;
+import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.helper.ResponseHelper;
 import com.gree.mall.manager.logic.fadada.FDDNotifyLogic;
 import io.swagger.annotations.Api;
@@ -13,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
 
 @RequiredArgsConstructor
 @RestController
@@ -46,4 +50,36 @@ public class NotifyController {
         return ResponseHelper.success();
     }
 
+    @ApiNotAuth
+    @RequestMapping("/websit/auth")
+    @ApiOperation(value = "实名网点认证回调")
+    public ResponseHelper<String> websitAuthResultPost(@RequestParam Map<String, String> params) throws Exception {
+        fddNotifyLogic.websitAuthResult(params);
+        return ResponseHelper.success();
+    }
+
+    @ApiNotAuth
+    @RequestMapping("/websit/person")
+    @ApiOperation(value = "实名网点个人认证回调")
+    public ResponseHelper<String> websitPersonAuthResultPost(@RequestParam Map<String, String> params) throws Exception {
+        fddNotifyLogic.websitPersonAuthResul(params);
+        return ResponseHelper.success();
+    }
+
+    @ApiNotAuth
+    @RequestMapping("websit/batch/sign")
+    @ApiOperation(value = "网点批量签署回调")
+    public ResponseHelper<String> websitBatchSignResultPost(@RequestParam Map<String, String> params) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.FDD_BATCH_SIGN_NOTIFY + params.get("transaction_id"));
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("冻结法大大批量签署交易号");
+        }
+        try {
+            fddNotifyLogic.websitBatchSignResult(params);
+        } finally {
+            obtain.unlock();
+        }
+        return ResponseHelper.success();
+    }
+
 }

+ 56 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/contract/FieldTypeEnum.java

@@ -0,0 +1,56 @@
+package com.gree.mall.manager.enums.contract;
+
+import cn.hutool.core.util.EnumUtil;
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.google.common.collect.Lists;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum FieldTypeEnum implements BaseEnum {
+    YYYYMMDD("YYYYMMDD","日期"),
+    YYYYMMDDTIME("YYYYMMDDTIME","日期时间"),
+    YYYY("YYYY","年"),
+    MM("MM","月"),
+    DD("DD","日"),
+    BANK_LINK_NAME("BANK_LINK_NAME","银行户名"),
+    BANK_DEPOSIT("BANK_DEPOSIT","开户行名称"),
+    BANK_ACCOUNT("BANK_ACCOUNT","银行卡号"),
+    CUSTOM("CUSTOM", "自定义"),
+    WEBSIT_NAME("WEBSIT_NAME", "网点名称"),
+    WEBSIT_ID("WEBSIT_ID", "网点编号"),
+    ADDRESS("ADDRESS", "地址"),
+    EMAIL("EMAIL", "邮箱"),
+    TEL("TEL", "电话"),
+    FAX("FAX", "传真"),
+    ZIP_CODE("ZIP_CODE", "邮编"),
+    ;
+
+    @JsonValue
+    @EnumValue
+    private final String key;
+    private final String remark;
+
+    /**
+     * 网点模板字段
+     * @return
+     */
+    public static Map<String, Object> websitList() {
+        Map<String, Object> fieldMap = EnumUtil.getNameFieldMap(FieldTypeEnum.class, "value");
+        ArrayList<FieldTypeEnum> fieldTypeEnums = Lists.newArrayList(CUSTOM, YYYYMMDD, YYYYMMDDTIME, YYYY, MM, DD, WEBSIT_ID,
+                WEBSIT_NAME, ADDRESS, BANK_LINK_NAME, BANK_DEPOSIT, BANK_ACCOUNT, EMAIL, TEL, FAX, ZIP_CODE);
+        Map<String, Object> map = new LinkedHashMap<>();
+        for (FieldTypeEnum typeEnum : fieldTypeEnums) {
+            map.put(typeEnum.getKey(), fieldMap.get(typeEnum.getKey()));
+        }
+        return map;
+    }
+}

+ 1 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/contract/SignContractStatusEnum.java

@@ -8,6 +8,7 @@ public enum SignContractStatusEnum implements BaseEnum {
     WAIT_SIGN("WAIT_SIGN","待签约"),
     WAIT("WAIT","待审核"),
     OK("OK","审核通过"),
+    REJECT("REJECT","审核驳回"),
     CANCEL("CANCEL","已失效"),;
 
     SignContractStatusEnum(String key, String remark) {

+ 175 - 36
mall-server-api/src/main/java/com/gree/mall/manager/logic/admin/AdminUserLogic.java

@@ -1,7 +1,10 @@
 package com.gree.mall.manager.logic.admin;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.code.kaptcha.impl.DefaultKaptcha;
 import com.gree.mall.manager.bean.ExcelData;
@@ -13,18 +16,22 @@ import com.gree.mall.manager.bean.admin.AdminWebsitGrantBean;
 import com.gree.mall.manager.bean.admin.reqDto.AdminUserAddReqBean;
 import com.gree.mall.manager.bean.admin.respDto.AdminCompanyWechatRespPageBean;
 import com.gree.mall.manager.commonmapper.AdminMapper;
+import com.gree.mall.manager.commonmapper.CommonMapper;
+import com.gree.mall.manager.enums.IsYesNoEnum;
 import com.gree.mall.manager.enums.RedisPrefixEnum;
 import com.gree.mall.manager.enums.admin.AdminWebsitTypeEnum;
+import com.gree.mall.manager.enums.contract.SignContractStatusEnum;
+import com.gree.mall.manager.enums.material.StateEnum;
 import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.logic.big.BigLogic;
 import com.gree.mall.manager.logic.common.CommonLogic;
 import com.gree.mall.manager.plus.entity.*;
 import com.gree.mall.manager.plus.service.*;
 import com.gree.mall.manager.utils.*;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -38,42 +45,33 @@ import java.util.stream.Collectors;
 
 @Slf4j
 @Service
+@RequiredArgsConstructor
 public class AdminUserLogic {
-    @Autowired
-    RedisUtil redisUtil;
-    @Autowired
-    DefaultKaptcha defaultKaptcha;
-    @Autowired
-    CommonLogic commonLogic;
-    @Autowired
-    AdminUserService adminUserService;
-    @Autowired
-    AdminModuleService adminModuleService;
-    @Autowired
-    AdminRoleService adminRoleService;
-    @Autowired
-    AdminUserModuleRelaService adminUserModuleRelaService;
-    @Autowired
-    AdminCompanyWechatService adminCompanyWechatService;
-    @Autowired
-    AdminWebsitService adminWebsitService;
-    @Autowired
-    AdminUserWebsitRelaService adminUserWebsitRelaService;
-    @Autowired
-    AdminMapper adminMapper;
-    @Autowired
-    BuyCompanyInfoService buyCompanyInfoService;
-    @Autowired
-    AdminUserDeptRelaService adminUserDeptRelaService;
-
-    @Autowired
-    AdminDeptWebsitService adminDeptWebsitService;
-
-    @Autowired
-    AdminDeptService adminDeptService;
-
-
-    @Autowired
+
+    private final RedisUtil redisUtil;
+    private final DefaultKaptcha defaultKaptcha;
+    private final CommonLogic commonLogic;
+    private final CommonMapper commonMapper;
+    private final AdminUserService adminUserService;
+    private final AdminModuleService adminModuleService;
+    private final AdminRoleService adminRoleService;
+    private final AdminUserModuleRelaService adminUserModuleRelaService;
+    private final AdminCompanyWechatService adminCompanyWechatService;
+    private final AdminWebsitService adminWebsitService;
+    private final AdminUserWebsitRelaService adminUserWebsitRelaService;
+    private final AdminMapper adminMapper;
+    private final AdminUserDeptRelaService adminUserDeptRelaService;
+    private final AdminDeptWebsitService adminDeptWebsitService;
+    private final AdminDeptService adminDeptService;
+    private final WebsitContractSignRecordService websitContractSignRecordService;
+    private final WebsitContractSignItemService websitContractSignItemService;
+    private final WebsitContractSignFieldService websitContractSignFieldService;
+    private final WebsitFollowConfigItemService websitFollowConfigItemService;
+    private final ContractTemplateService contractTemplateService;
+    private final ContractTemplateFieldService contractTemplateFieldService;
+    private final CompanyCaAuthService companyCaAuthService;
+
+    
     BigLogic bigLogic;
 //    @Value("${front.top.url}")
 //    private String frontTopUrl;
@@ -145,6 +143,9 @@ public class AdminUserLogic {
 
         String token = JwtUtils.createJWT(adminUser.getAdminUserId(), adminUser.getNickName(), adminUser.getUserName(), 20 * 60 * 60 * 1000);
         AdminUserCom adminUserCom = commonLogic.getAdminUser(adminUser.getAdminUserId(), token);
+        // 检查是否要签约的网点
+        this.checkWebsitLevel2(adminUser, adminUserCom);
+
         adminUserCom.setToken(token);
         //存放到redis
         redisUtil.set(RedisPrefixEnum.TOKEN_MGR.toString() + adminUserCom.getToken(), adminUserCom, 20 * 60 * 60 * 1000);
@@ -156,6 +157,144 @@ public class AdminUserLogic {
     }
 
     /**
+     * 检查二级网点签约合同
+     * @param adminUser
+     * @param adminUserCom
+     */
+    private void checkWebsitLevel2(AdminUser adminUser, AdminUserCom adminUserCom) {
+        if (CollectionUtil.isNotEmpty(adminUserCom.getAdminWebsitIds()) && adminUserCom.getAdminWebsitIds().size() == 1) {
+            adminUserCom.setIsJumpSign(false);
+            final AdminWebsit websit = adminWebsitService.getById(adminUserCom.getAdminWebsitIds().get(0));
+            // 二级网点
+            if (websit.getLevel() == 2) {
+                Integer existCount = websitContractSignRecordService.lambdaQuery()
+                        .eq(WebsitContractSignRecord::getWebsitId, websit.getWebsitId())
+                        .eq(WebsitContractSignRecord::getStatus, SignContractStatusEnum.OK.getKey())
+                        .le(WebsitContractSignRecord::getSignOverTime, DateUtil.formatDate(DateUtil.date()))
+                        .count();
+                // 没有签成功并且审核通过未过期的记录,进行下一步检查
+                if (existCount == 0) {
+                    adminUserCom.setIsJumpSign(true);
+                    // 查询是否有状态为待签约或待审核的
+                    existCount = websitContractSignRecordService.lambdaQuery()
+                            .eq(WebsitContractSignRecord::getWebsitId, websit.getWebsitId())
+                            .in(WebsitContractSignRecord::getStatus, SignContractStatusEnum.WAIT_SIGN.getKey(), SignContractStatusEnum.WAIT.getKey())
+                            .le(WebsitContractSignRecord::getSignOverTime, DateUtil.formatDate(DateUtil.date()))
+                            .isNull(WebsitContractSignRecord::getCancelTime)
+                            .count();
+                    if (existCount == 0) {
+                        List<ContractTemplate> contractList = commonMapper.queryNeedContract(adminUser.getCompanyWechatId(), websit.getWebsitId(), DateUtil.formatDate(DateUtil.date()));
+                        if (CollectionUtil.isEmpty(contractList)) {
+                            adminUserCom.setContractSignInfo("未发现网点需要签约合同,请联系管理员处理");
+                        } else if (CollectionUtil.isNotEmpty(contractList) && contractList.size() > 1) {
+                            adminUserCom.setContractSignInfo("发现网点需要签约合同多份,请联系管理员处理");
+                        } else {
+                            final WebsitFollowConfigItem item = websitFollowConfigItemService.lambdaQuery()
+                                    .eq(WebsitFollowConfigItem::getCompanyWechatId, websit.getCompanyWechatId())
+                                    .eq(WebsitFollowConfigItem::getSubWebsitId, websit.getWebsitId())
+                                    .one();
+                            if (Objects.isNull(item)) {
+                                adminUserCom.setContractSignInfo("二级网点未绑定一级网点,请联系管理员处理");
+                            } else {
+                                final AdminWebsit parentWebsit = adminWebsitService.getById(item.getParentId());
+                                final CompanyCaAuth caAuth = companyCaAuthService.lambdaQuery()
+                                        .eq(CompanyCaAuth::getCompanyWechatId, item.getCompanyWechatId())
+                                        .eq(CompanyCaAuth::getWebsitId, item.getParentId())
+                                        .eq(CompanyCaAuth::getFadadaIsAuth, IsYesNoEnum.YES.getKey())
+                                        .eq(CompanyCaAuth::getFadadaAuthAutoStatus, IsYesNoEnum.YES.getKey())
+                                        .one();
+                                if (Objects.isNull(caAuth)) {
+                                    adminUserCom.setContractSignInfo("一级网点的CA认证未完成,请联系管理员处理");
+                                } else {
+                                    final ContractTemplate template = contractList.get(0);
+                                    WebsitContractSignRecord record = new WebsitContractSignRecord();
+                                    record.setId(IdWorker.getIdStr())
+                                            .setCompanyWechatId(websit.getCompanyWechatId())
+                                            .setCompanyWechatName(websit.getCompanyWechatName())
+                                            .setBelongCompany(websit.getBelongCompany())
+                                            .setBelongCompanyCode(websit.getBelongCompanyCode())
+                                            .setWebsitId(websit.getWebsitId())
+                                            .setWebsitName(websit.getName())
+                                            .setParentId(parentWebsit.getParentId())
+                                            .setParentName(parentWebsit.getName())
+                                            .setContractTemplateId(template.getContractTemplateId())
+                                            .setContractName(template.getContractTemplateName())
+                                            .setAuthStatus(StringUtils.isBlank(websit.getFadadaCustomerId()) ? IsYesNoEnum.NO.getKey() : IsYesNoEnum.YES.getKey());
+
+                                    WebsitContractSignItem signItem = new WebsitContractSignItem();
+                                    signItem.setId(IdWorker.getIdStr())
+                                            .setWebsitContractSignRecordId(record.getId())
+                                            .setContractName(template.getContractTemplateName())
+                                            .setContractType(template.getContractType())
+                                            .setContractStatus(SignContractStatusEnum.WAIT_SIGN.getKey())
+                                            .setValidDate(template.getValidDate())
+                                            .setExpireDate(template.getExpireDate())
+                                            .setContractTemplateId(template.getContractTemplateId())
+                                            .setFadadaTemplateId(template.getFadadaTemplateId())
+                                            .setNeedCompanySign(template.getNeedCompanySign())
+                                            .setNeedManagerSign(template.getNeedManagerSign())
+                                            .setNeedPartyASign(template.getNeedPartyASign())
+                                            .setCaCustomerId(caAuth.getFadadaCustomerId())
+                                            .setCompanySignFiled(template.getCompanySignFiled())
+                                            .setManagerSignField(template.getManagerSignField())
+                                            .setPartyASignFiled(template.getPartyASignFiled());
+
+                                    // 根据主合同查询从合同
+                                    final List<ContractTemplate> templateList = contractTemplateService.lambdaQuery()
+                                            .eq(ContractTemplate::getFollowContractTemplateId, template.getContractTemplateId())
+                                            .eq(ContractTemplate::getStatus, StateEnum.ON.getKey())
+                                            .list();
+                                    List<WebsitContractSignItem> signItemList = new ArrayList<>();
+                                    List<WebsitContractSignField> signFieldList = new ArrayList<>();
+                                    signItemList.add(signItem);
+                                    for (ContractTemplate contractTemplate : templateList) {
+                                        WebsitContractSignItem contractSignItem = new WebsitContractSignItem();
+                                        contractSignItem.setId(IdWorker.getIdStr())
+                                                .setWebsitContractSignRecordId(record.getId())
+                                                .setContractName(contractTemplate.getContractTemplateName())
+                                                .setContractType(contractTemplate.getContractType())
+                                                .setContractStatus(SignContractStatusEnum.WAIT_SIGN.getKey())
+                                                .setValidDate(template.getValidDate())
+                                                .setExpireDate(template.getExpireDate())
+                                                .setContractTemplateId(contractTemplate.getContractTemplateId())
+                                                .setFadadaTemplateId(contractTemplate.getFadadaTemplateId())
+                                                .setNeedCompanySign(contractTemplate.getNeedCompanySign())
+                                                .setNeedManagerSign(contractTemplate.getNeedManagerSign())
+                                                .setNeedPartyASign(contractTemplate.getNeedPartyASign())
+                                                .setCaCustomerId(caAuth.getFadadaCustomerId())
+                                                .setCompanySignFiled(contractTemplate.getCompanySignFiled())
+                                                .setManagerSignField(contractTemplate.getManagerSignField())
+                                                .setPartyASignFiled(contractTemplate.getPartyASignFiled());
+                                        signItemList.add(contractSignItem);
+                                    }
+                                    // 遍历网点合同签约明细找出填充字段配置
+                                    for (WebsitContractSignItem contractSignItem : signItemList) {
+                                        final List<ContractTemplateField> templateFieldList = contractTemplateFieldService.lambdaQuery()
+                                                .eq(ContractTemplateField::getContractTemplateId, contractSignItem.getContractTemplateId())
+                                                .list();
+                                        for (ContractTemplateField templateField : templateFieldList) {
+                                            WebsitContractSignField field = new WebsitContractSignField();
+                                            field.setWebsitContractSignRecordId(contractSignItem.getWebsitContractSignRecordId())
+                                                    .setWebsitContractSignItemId(contractSignItem.getId())
+                                                    .setFieldType(templateField.getFieldType())
+                                                    .setFieldName(templateField.getFieldName())
+                                                    .setFieldValue(templateField.getFieldValue());
+                                            signFieldList.add(field);
+                                        }
+                                    }
+
+                                    websitContractSignItemService.saveBatch(signItemList);
+                                    websitContractSignFieldService.saveBatch(signFieldList);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
      * 修改密码
      */
     public void updatePassword(String userName, String password, String newPwd) throws RemoteServiceException {

+ 5 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/admin/AdminWebsitLogic.java

@@ -365,6 +365,11 @@ public class AdminWebsitLogic {
                 }
             }
 
+            if (adminWebsit.getInsureType().contains("工伤险")
+                    && org.apache.commons.lang3.StringUtils.isBlank(adminWebsit.getInsureSteadUnit())) {
+                throw new RemoteServiceException("工伤险代买单位不能为空");
+            }
+
             if (org.apache.commons.lang3.StringUtils.isBlank(adminWebsit.getLegalName())) {
                 throw new RemoteServiceException("企业法人不能为空");
             }

+ 1 - 1
mall-server-api/src/main/java/com/gree/mall/manager/logic/contract/CompanyCaAuthLogic.java

@@ -164,7 +164,7 @@ public class CompanyCaAuthLogic {
         CompanyInfo company = new CompanyInfo();
         company.setCompanyName(companyCaAuth.getCompanyName());
         company.setCreditNo(companyCaAuth.getTaxNo());
-        company.setCreditImagePath(ossUtil.getUrlWw(companyCaAuth.getBusinessLicenseUrl()));
+        company.setCreditImagePath(ossUtil.getUrlWw(ossUtil.replaceLongKeyUrl(companyCaAuth.getBusinessLicenseUrl())));
 
         LegalInfo legal = new LegalInfo();
         legal.setLegalName(companyCaAuth.getLegalName());

+ 2 - 2
mall-server-api/src/main/java/com/gree/mall/manager/logic/contract/ContractTemplateLogic.java

@@ -77,7 +77,7 @@ public class ContractTemplateLogic {
             throw new RemoteServiceException("平台账号禁止操作");
         }
         this.validRequireParams(contractTemplate);
-        String urlWw = ossUtil.getUrlWw(contractTemplate.getContractTemplatePdf());
+        String urlWw = ossUtil.getUrlWw(ossUtil.replaceLongKeyUrl(contractTemplate.getContractTemplatePdf()));
         String templateId = IdWorker.getIdStr();
 
         Auth4FDDUtil.uploadTemplate(templateId, null, urlWw);
@@ -102,7 +102,7 @@ public class ContractTemplateLogic {
         this.validRequireParams(contractTemplate);
         ContractTemplate byId = contractTemplateService.getById(contractTemplate.getContractTemplateId());
         if (!byId.getContractTemplatePdf().equals(contractTemplate.getContractTemplatePdf())) {
-            String urlWw = ossUtil.getUrlWw(contractTemplate.getContractTemplatePdf());
+            String urlWw = ossUtil.getUrlWw(ossUtil.replaceLongKeyUrl(contractTemplate.getContractTemplatePdf()));
             String templateId = IdWorker.getIdStr();
             Auth4FDDUtil.uploadTemplate(templateId, null, urlWw);
             byId.setFadadaTemplateId(templateId);

+ 525 - 3
mall-server-api/src/main/java/com/gree/mall/manager/logic/contract/WebsitContractSignLogic.java

@@ -1,26 +1,47 @@
 package com.gree.mall.manager.logic.contract;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.gree.mall.manager.bean.admin.AdminUserCom;
-import com.gree.mall.manager.bean.contract.WebsitContractSignRecordBean;
-import com.gree.mall.manager.bean.contract.WebsitContractSignVO;
+import com.gree.mall.manager.bean.contract.*;
 import com.gree.mall.manager.commonmapper.CommonMapper;
+import com.gree.mall.manager.enums.ContractTypeEnum;
+import com.gree.mall.manager.enums.IsYesNoEnum;
+import com.gree.mall.manager.enums.contract.FieldTypeEnum;
+import com.gree.mall.manager.enums.contract.SignContractStatusEnum;
+import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.logic.fadada.FDDNotifyLogic;
 import com.gree.mall.manager.plus.entity.AdminWebsit;
+import com.gree.mall.manager.plus.entity.WebsitContractSignField;
 import com.gree.mall.manager.plus.entity.WebsitContractSignItem;
 import com.gree.mall.manager.plus.entity.WebsitContractSignRecord;
 import com.gree.mall.manager.plus.service.AdminWebsitService;
+import com.gree.mall.manager.plus.service.WebsitContractSignFieldService;
 import com.gree.mall.manager.plus.service.WebsitContractSignItemService;
 import com.gree.mall.manager.plus.service.WebsitContractSignRecordService;
+import com.gree.mall.manager.utils.fadada.Auth4FDDUtil;
+import com.gree.mall.manager.utils.oss.OSSUtil;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
 import com.gree.mall.manager.zfire.util.FieldUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
 
 @Slf4j
 @Service
@@ -32,6 +53,20 @@ public class WebsitContractSignLogic {
     private final AdminWebsitService adminWebsitService;
     private final WebsitContractSignRecordService websitContractSignRecordService;
     private final WebsitContractSignItemService websitContractSignItemService;
+    private final WebsitContractSignFieldService websitContractSignFieldService;
+    private final FDDNotifyLogic fddNotifyLogic;
+    private final OSSUtil ossUtil;
+
+    @Value("${fadada.websit.auth.verified-way}")
+    private String fddAuthVerifiedWay;
+    @Value("${fadada.websit.auth.page-modify}")
+    private String fddAuthPageModify;
+    @Value("${fadada.websit.auth.notify.url}")
+    private String fddAuthNotifyUrl;
+    @Value("${fadada.websit.sign.notify.url}")
+    private String fddSignAuthNotifyUrl;
+    @Value("${fadada.websit.person.auth.notify.url}")
+    private String fddPersonAuthNotifyUrl;
 
     public IPage<WebsitContractSignVO> list(ZfireParamBean zfireParamBean) {
         AdminUserCom adminUser = commonLogic.getAdminUser();
@@ -61,8 +96,495 @@ public class WebsitContractSignLogic {
     }
 
     public void cancel(String id) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        websitContractSignRecordService.lambdaUpdate()
+                .set(WebsitContractSignRecord::getStatus, SignContractStatusEnum.CANCEL.getKey())
+                .set(WebsitContractSignRecord::getCancelBy, adminUser.getNickName())
+                .set(WebsitContractSignRecord::getCancelTime, DateUtil.date())
+                .eq(WebsitContractSignRecord::getId, id)
+                .update();
+    }
+
+    public AuthBean sign(String id, String returnUrl) throws Exception {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        AuthBean bean = new AuthBean();
+
+        WebsitContractSignRecord record = websitContractSignRecordService.getById(id);
+
+        if (Objects.isNull(record)) {
+            throw new RemoteServiceException("合同记录不存在");
+        }
+        WebsitContractSignItem item = websitContractSignItemService.lambdaQuery()
+                .eq(WebsitContractSignItem::getWebsitContractSignRecordId, record.getId())
+                .eq(WebsitContractSignItem::getContractType, ContractTypeEnum.MAIN.getKey())
+                .one();
+        AdminWebsit websit = adminWebsitService.getById(record.getWebsitId());
+
+        // 未企业认证
+        if (StringUtils.isBlank(websit.getFadadaWebsitNo()) && StringUtils.isBlank(websit.getFadadaWebsitId())) {
+            this.companyAuthMethod(websit, bean, returnUrl);
+        }
+
+        // 企业认证已通过执行个人认证处理
+        if (!bean.isJump()
+                && StringUtils.isBlank(websit.getFadadaCustomerNo())
+                && StringUtils.isBlank(websit.getFadadaCustomerAuthUrl())) {
+            this.personAuthMethod(websit, record, bean, returnUrl);
+        }
+
+        // 避免前端调用过快,法大大还没更新状态
+        Thread.sleep(1000);
+
+        if (!bean.isJump() && item.getCompanySignStatus().equals(IsYesNoEnum.NO.getKey())) {
+            // 签约企业签约跳
+            this.companySignMethod(websit, item, bean, returnUrl);
+        }
+
+        if (!bean.isJump()
+                && item.getNeedManagerSign().equals(IsYesNoEnum.YES.getKey())
+                && item.getManagerSignStatus().equals(IsYesNoEnum.NO.getKey())) {
+            // 签约负责人签约跳
+            this.managerSignMethod(websit, item, bean, returnUrl);
+        }
+
+        if (!bean.isJump()) {
+            if (websit.getFadadaWebsitRealStatus().equals(IsYesNoEnum.NO.getKey())) {
+                bean.setJump(true);
+                bean.setUrl(websit.getFadadaWebsitAuthUrl());
+            } else if (websit.getFadadaCustomerRealStatus().equals(IsYesNoEnum.NO.getKey())) {
+                bean.setJump(true);
+                bean.setUrl(websit.getFadadaCustomerAuthUrl());
+            } else if (item.getCompanySignStatus().equals(IsYesNoEnum.NO.getKey())) {
+                // 签约企业签约跳
+                bean.setJump(true);
+                bean.setUrl(item.getCompanySignUrl());
+            } else if (item.getNeedManagerSign().equals(IsYesNoEnum.YES.getKey())
+                    && item.getManagerSignStatus().equals(IsYesNoEnum.NO.getKey())) {
+                // 签约负责人签约跳
+                bean.setJump(true);
+                bean.setUrl(item.getManagerSignUrl());
+            }
+        }
+
+        return bean;
+    }
+
+    private void companySignMethod(AdminWebsit websit, WebsitContractSignItem item, AuthBean bean, String returnUrl) {
+        // 公章签约地址不为空查询合同签章状态
+        if (StringUtils.isNotBlank(item.getCompanySignUrl())) {
+            this.queryCompanySignStatus(websit, item);
+            // 同步查询公章签约结果成功退出不继续
+            if (item.getCompanySignStatus().equals(IsYesNoEnum.YES.getKey())) {
+                return;
+            }
+        }
+
+        // 准备批量签合同
+        if (StringUtils.isBlank(item.getCompanySignUrl())) {
+            this.getNeedSignContract(websit, item, bean, returnUrl);
+        }
+    }
+
+    private void getNeedSignContract(AdminWebsit websit, WebsitContractSignItem item, AuthBean bean, String returnUrl) {
+
+        // 第一步 查询可签网点电子合同
+        List<WebsitContractSignItem> websitFiles = websitContractSignItemService.lambdaQuery()
+                .eq(WebsitContractSignItem::getWebsitContractSignRecordId, item.getWebsitContractSignRecordId())
+//                .eq(WebsitContractSignItem::getNeedCompanySign, IsYesNoEnum.YES.getKey())
+                .isNotNull(WebsitContractSignItem::getFadadaTemplateId)
+                .list();
+
+        if (CollectionUtil.isEmpty(websitFiles)) {
+            throw new RemoteServiceException("未发现可签电子合同");
+        }
+
+        // 第二步 用合同模版调用模板填充生成电子合同后调批量签署(半自动)接口
+
+        // 构造signdata
+        JSONArray signData = new JSONArray();
+        String batchId = IdWorker.getIdStr();
+        for (WebsitContractSignItem websitFile : websitFiles) {
+            String generateContractId = IdWorker.getIdStr();
+            String generateTransactionId = IdWorker.getIdStr();
+            String fddParams = this.getContractParams(websit, websitFile.getId());
+            Auth4FDDUtil.generateContract(websitFile.getFadadaTemplateId(), generateContractId,
+                    websitFile.getContractName(), null, null, fddParams);
+
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.set("contractId", generateContractId);
+            jsonObject.set("keywordStrategy", "0");
+            jsonObject.set("signKeyword", websitFile.getCompanySignFiled());
+            jsonObject.set("transactionId", generateTransactionId);
+            signData.set(jsonObject);
+
+            websitFile.setFadadaContractId(generateContractId)
+                    .setFadadaTransactionId(generateTransactionId)
+                    .setFadadaBatchId(batchId)
+                    .setFadadaBatchTitle("批量签署");
+        }
+//        List<WebsitContractSignItem> collect = websitFiles.stream()
+//                .peek(v -> v.setFadadaSignData(signData.toString()))
+//                .collect(Collectors.toList());
+
+        websitFiles.get(0).setFadadaSignData(signData.toString());
+
+        websitContractSignItemService.saveOrUpdateBatch(websitFiles);
+        // 调用批量签
+        String companySignUrl = Auth4FDDUtil.batchExtSign(batchId, "批量签署", signData.toString(), websit.getFadadaWebsitId(),
+                "1", "0", null, returnUrl, this.fddSignAuthNotifyUrl);
+        item.setCompanySignUrl(companySignUrl);
+
+        websitContractSignItemService.lambdaUpdate()
+                .set(WebsitContractSignItem::getCompanySignUrl, companySignUrl)
+                .eq(WebsitContractSignItem::getId, item.getId())
+                .update();
+
+        bean.setJump(true);
+        bean.setUrl(companySignUrl);
+    }
+
+    private String getContractParams(AdminWebsit websit, String id) {
+        List<WebsitContractSignField> fields = websitContractSignFieldService.lambdaQuery()
+                .eq(WebsitContractSignField::getWebsitContractSignItemId, id)
+                .list();
+
+        if (CollectionUtil.isEmpty(fields)) {
+            return "";
+        }
+        JSONObject params = new JSONObject();
+        String formatDate = DateUtil.formatDate(DateUtil.date());
+        String[] dateSplit = formatDate.split("-");
+
+        for (WebsitContractSignField field : fields) {
+            if (field.getFieldType().equals(FieldTypeEnum.CUSTOM.getKey())) {
+                params.set(field.getFieldName(), field.getFieldValue());
+            } else if (field.getFieldType().equals(FieldTypeEnum.WEBSIT_NAME.getKey())) {
+                params.set(field.getFieldName(), websit.getName());
+            } else if (field.getFieldType().equals(FieldTypeEnum.WEBSIT_ID.getKey())) {
+                params.set(field.getFieldName(), websit.getWebsitId());
+            } else if (field.getFieldType().equals(FieldTypeEnum.EMAIL.getKey())) {
+                params.set(field.getFieldName(), Optional.ofNullable(websit.getEmail()).orElse(""));
+            } else if (field.getFieldType().equals(FieldTypeEnum.ADDRESS.getKey())) {
+                params.set(field.getFieldName(), Optional.ofNullable(websit.getAddress()).orElse(""));
+            } else if (field.getFieldType().equals(FieldTypeEnum.TEL.getKey())) {
+                params.set(field.getFieldName(), Optional.ofNullable(websit.getLinkMobile()).orElse(""));
+            } else if (field.getFieldType().equals(FieldTypeEnum.FAX.getKey())) {
+                params.set(field.getFieldName(), Optional.ofNullable(websit.getLegalMobile()).orElse(""));
+            } else if (field.getFieldType().equals(FieldTypeEnum.ZIP_CODE.getKey())) {
+                params.set(field.getFieldName(), Optional.ofNullable(websit.getZipCode()).orElse(""));
+            } else if (field.getFieldType().equals(FieldTypeEnum.BANK_DEPOSIT.getKey())) {
+                params.set(field.getFieldName(), Optional.ofNullable(websit.getOpenBank()).orElse(""));
+            } else if (field.getFieldType().equals(FieldTypeEnum.BANK_ACCOUNT.getKey())) {
+                params.set(field.getFieldName(), Optional.ofNullable(websit.getBankAccount()).orElse(""));
+            } else if (field.getFieldType().equals(FieldTypeEnum.YYYY.getKey())) {
+                params.set(field.getFieldName(), dateSplit[0]);
+            } else if (field.getFieldType().equals(FieldTypeEnum.MM.getKey())) {
+                params.set(field.getFieldName(), dateSplit[1]);
+            } else if (field.getFieldType().equals(FieldTypeEnum.DD.getKey())) {
+                params.set(field.getFieldName(), dateSplit[2]);
+            } else {
+                throw new RemoteServiceException("找不到填充类型");
+            }
+        }
+
+        return params.toString();
+    }
+
+    private void companyAuthMethod(AdminWebsit websit, AuthBean bean, String returnUrl) throws Exception {
+        // 企业认证
+        if (StringUtils.isBlank(websit.getFadadaWebsitId())) {
+            String customerId = Auth4FDDUtil.regAccount("2", websit.getWebsitId()).get("data", String.class, true);
+            if (StringUtils.isBlank(customerId)) {
+                throw new RemoteServiceException("注册法大大企业失败");
+            }
+            adminWebsitService.lambdaUpdate()
+                    .set(AdminWebsit::getFadadaWebsitId, customerId)
+                    .eq(AdminWebsit::getWebsitId, websit.getWebsitId())
+                    .update();
+
+            websit.setFadadaWebsitId(customerId);
+        }
+
+        if (StringUtils.isNotBlank(websit.getFadadaWebsitNo())) {
+            this.queryWebsitAuthResult(websit);
+            // 同步查询企业认证结果成功退出不继续
+            if (websit.getFadadaWebsitRealStatus().equals(IsYesNoEnum.YES.getKey())) {
+                return;
+            }
+        }
+        CompanyInfo company = new CompanyInfo();
+        company.setCompanyName(websit.getName());
+//        company.setCreditNo(websit.getTaxNo());
+//        company.setCreditImagePath(ossUtil.getUrlWw(ossUtil.replaceLongKeyUrl(websit.getBusinessLicenseUrl())));
+
+        LegalInfo legal = new LegalInfo();
+        legal.setLegalName(websit.getLegalName());
+        legal.setLegalId(websit.getLegalIdCard());
+        legal.setLegalMobile(websit.getLegalMobile());
+
+        JSONObject resultJson = Auth4FDDUtil.getAuthCompanyUrl(websit.getFadadaWebsitId(), this.fddAuthPageModify,
+                this.fddAuthVerifiedWay, null, null, null,
+                null, null, null, null, null,
+                null, null, null, null, null, this.fddAuthNotifyUrl,
+                returnUrl, company, legal, null, null);
+
+
+        JSONObject data = resultJson.getJSONObject("data");
+        String authUrl = Auth4FDDUtil.decodeUrl(data.get("url", String.class));
+
+        websit.setFadadaWebsitNo(data.get("transactionNo", String.class))
+                .setFadadaWebsitAuthUrl(authUrl);
+
+        adminWebsitService.lambdaUpdate()
+                .set(AdminWebsit::getFadadaWebsitNo, websit.getFadadaWebsitNo())
+                .set(AdminWebsit::getFadadaWebsitAuthUrl, websit.getFadadaWebsitAuthUrl())
+                .eq(AdminWebsit::getWebsitId, websit.getWebsitId())
+                .update();
+
+        bean.setJump(true);
+        bean.setUrl(authUrl);
+    }
+
+
+    private void queryWebsitAuthResult(AdminWebsit websit) {
+        fddNotifyLogic.websitAuthResultHandle(websit);
+        adminWebsitService.lambdaUpdate()
+                .set(AdminWebsit::getFadadaWebsitRealStatus, websit.getFadadaWebsitRealStatus())
+                .set(AdminWebsit::getFadadaAuthFailReason, websit.getFadadaAuthFailReason())
+                .set(AdminWebsit::getFadadaRegFormPath, websit.getFadadaRegFormPath())
+                .set(AdminWebsit::getFadadaOrganizationPath, websit.getFadadaOrganizationPath())
+                .eq(AdminWebsit::getWebsitId, websit.getWebsitId())
+                .update();
+    }
+
+    private void personAuthMethod(AdminWebsit websit, WebsitContractSignRecord record, AuthBean bean, String returnUrl) throws Exception {
+        // 个人认证
+        if (StringUtils.isBlank(websit.getFadadaCustomerId())) {
+            String personCustomerId = Auth4FDDUtil.regAccount("1", IdUtil.objectId()).get("data", String.class, true);
+            if (StringUtils.isBlank(personCustomerId)) {
+                throw new RemoteServiceException("注册法大大个人失败");
+            }
+            adminWebsitService.lambdaUpdate()
+                    .set(AdminWebsit::getFadadaCustomerId, personCustomerId)
+                    .eq(AdminWebsit::getWebsitId, websit.getWebsitId())
+                    .update();
+            websit.setFadadaCustomerId(personCustomerId);
+        }
+
+        if (StringUtils.isNotBlank(websit.getFadadaCustomerNo())) {
+            this.queryWebsitPersonAuthResult(websit);
+            // 同步查询个人认证结果成功退出不继续
+            if (websit.getFadadaCustomerRealStatus().equals(IsYesNoEnum.YES.getKey())) {
+                return;
+            }
+        }
+
+        JSONObject personResultJson = Auth4FDDUtil.getAuthPersonUrl(websit.getFadadaCustomerId(), this.fddAuthPageModify, this.fddAuthVerifiedWay,
+                websit.getLegalName(), "0", "", websit.getLegalMobile(),
+                null, null, null, "1", "0", null, null,
+                "2", null, null, this.fddPersonAuthNotifyUrl, returnUrl, null, null);
+
+        JSONObject personData = personResultJson.getJSONObject("data");
+        String personAuthUrl = Auth4FDDUtil.decodeUrl(personData.get("url", String.class));
+        websit.setFadadaCustomerAuthUrl(personAuthUrl);
+        websit.setFadadaCustomerNo(personData.get("transactionNo", String.class));
+
+        adminWebsitService.lambdaUpdate()
+                .set(AdminWebsit::getFadadaCustomerNo, websit.getFadadaCustomerNo())
+                .set(AdminWebsit::getFadadaCustomerAuthUrl, websit.getFadadaCustomerAuthUrl())
+                .eq(AdminWebsit::getWebsitId, websit.getWebsitId())
+                .update();
+
+        bean.setJump(true);
+        bean.setUrl(personAuthUrl);
     }
 
-    public void sign(String id) {
+    private void queryWebsitPersonAuthResult(AdminWebsit websit) {
+        fddNotifyLogic.websitPersonAuthResultHandle(websit);
+        adminWebsitService.lambdaUpdate()
+                .set(AdminWebsit::getFadadaCustomerRealStatus, websit.getFadadaCustomerRealStatus())
+                .set(AdminWebsit::getFadadaAuthFailReason, websit.getFadadaAuthFailReason())
+                .set(AdminWebsit::getFadadaCustomerHeadPhotoPath, websit.getFadadaCustomerHeadPhotoPath())
+                .set(AdminWebsit::getFadadaCustomerAuditorTime, websit.getFadadaCustomerAuditorTime())
+                .set(AdminWebsit::getFadadaCustomerPhotoUuid, websit.getFadadaCustomerPhotoUuid())
+                .eq(AdminWebsit::getWebsitId, websit.getWebsitId())
+                .update();
+    }
+
+    private void queryCompanySignStatus(AdminWebsit websit, WebsitContractSignItem item) {
+        List<WebsitContractSignItem> websitFiles = websitContractSignItemService.lambdaQuery()
+                .eq(WebsitContractSignItem::getWebsitContractSignRecordId, item.getWebsitContractSignRecordId())
+                .eq(WebsitContractSignItem::getNeedCompanySign, IsYesNoEnum.YES.getKey())
+                .list();
+        if (CollectionUtils.isEmpty(websitFiles)) {
+            throw new RemoteServiceException("未找到有效签约合同");
+        }
+        boolean sign = false;
+        // 遍历查询签章状态
+        for (WebsitContractSignItem file : websitFiles) {
+            JSONObject object = Auth4FDDUtil.querySignStatus(file.getFadadaContractId(), websit.getFadadaWebsitId(), file.getFadadaTransactionId());
+            Integer code = object.get("code", Integer.class);
+            String msg = object.get("msg", String.class);
+            JSONObject data = object.getJSONObject("data");
+            log.info("{} 二级网点签约查询结果: {}", websit.getWebsitId(), msg);
+            if (code != 1) {
+                sign = false;
+                break;
+            }
+            String result = data.get("result", String.class);
+            sign = result.equals("3000");
+        }
+
+        if (sign) {
+            websitContractSignItemService.lambdaUpdate()
+                    .set(WebsitContractSignItem::getCompanySignStatus, IsYesNoEnum.YES.getKey())
+                    .eq(WebsitContractSignItem::getWebsitContractSignRecordId, item.getWebsitContractSignRecordId())
+                    .update();
+            item.setCompanySignStatus(IsYesNoEnum.YES.getKey());
+        }
+    }
+
+    private void managerSignMethod(AdminWebsit websit, WebsitContractSignItem item, AuthBean bean, String returnUrl) {
+        // 负责人签约地址不为空查询合同签章状态
+        if (StringUtils.isNotBlank(item.getManagerSignUrl())) {
+            this.queryManagerSignStatus(websit, item);
+            // 同步查询负责人签约结果成功退出不继续
+            if (item.getManagerSignStatus().equals(IsYesNoEnum.YES.getKey())) {
+                return;
+            }
+        }
+
+        if (StringUtils.isBlank(item.getManagerSignUrl())) {
+            // 第一步 查询可签网点电子合同
+            List<WebsitContractSignItem> websitFiles = websitContractSignItemService.lambdaQuery()
+                    .eq(WebsitContractSignItem::getWebsitContractSignRecordId, item.getWebsitContractSignRecordId())
+                    .eq(WebsitContractSignItem::getNeedManagerSign, IsYesNoEnum.YES.getKey())
+                    .list();
+
+            // 构造signdata
+            JSONArray signData = new JSONArray();
+            String batchId = IdWorker.getIdStr();
+            for (WebsitContractSignItem websitFile : websitFiles) {
+                String generateTransactionId = IdWorker.getIdStr();
+
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.set("contractId", websitFile.getFadadaContractId());
+                jsonObject.set("keywordStrategy", "0");
+                jsonObject.set("signKeyword", websitFile.getManagerSignField());
+                jsonObject.set("transactionId", generateTransactionId);
+                signData.set(jsonObject);
+
+                websitFile.setManagerTransactionId(generateTransactionId)
+                        .setManagerBatchId(batchId)
+                        .setManagerBatchTitle("批量签署");
+            }
+
+            websitContractSignItemService.saveOrUpdateBatch(websitFiles);
+            // 调用批量签
+            String managerSignUrl = Auth4FDDUtil.batchExtSign(batchId, "批量签署", signData.toString(), websit.getFadadaCustomerId(),
+                    "1", "0", null, returnUrl, this.fddSignAuthNotifyUrl);
+            item.setManagerSignUrl(managerSignUrl);
+            websitContractSignItemService.lambdaUpdate()
+                    .set(WebsitContractSignItem::getManagerSignUrl, managerSignUrl)
+                    .eq(WebsitContractSignItem::getId, item.getId())
+                    .update();
+            bean.setJump(true);
+            bean.setUrl(managerSignUrl);
+        }
+    }
+
+    private void queryManagerSignStatus(AdminWebsit websit, WebsitContractSignItem item) {
+        List<WebsitContractSignItem> websitFiles = websitContractSignItemService.lambdaQuery()
+                .eq(WebsitContractSignItem::getWebsitContractSignRecordId, item.getWebsitContractSignRecordId())
+                .eq(WebsitContractSignItem::getNeedManagerSign, IsYesNoEnum.YES.getKey())
+                .list();
+
+        if (CollectionUtils.isEmpty(websitFiles)) {
+            throw new RemoteServiceException("未找到有效签约合同");
+        }
+        boolean sign = false;
+        // 遍历查询签章状态
+        for (WebsitContractSignItem file : websitFiles) {
+            JSONObject object = Auth4FDDUtil.querySignStatus(file.getFadadaContractId(), websit.getFadadaCustomerId(), file.getManagerTransactionId());
+            Integer code = object.get("code", Integer.class);
+            String msg = object.get("msg", String.class);
+            JSONObject data = object.getJSONObject("data");
+            log.info("{} 法人签约查询结果: {}", websit.getWebsitId(), msg);
+            if (code != 1) {
+                sign = false;
+                break;
+            }
+            String result = data.get("result", String.class);
+            sign = result.equals("3000");
+        }
+
+        if (sign) {
+            item.setManagerSignStatus(IsYesNoEnum.YES.getKey());
+            websitContractSignItemService.lambdaUpdate()
+                    .set(WebsitContractSignItem::getManagerSignStatus, IsYesNoEnum.YES.getKey())
+                    .set(WebsitContractSignItem::getContractStatus, SignContractStatusEnum.WAIT.getKey())
+                    .eq(WebsitContractSignItem::getWebsitContractSignRecordId, item.getWebsitContractSignRecordId())
+                    .update();
+            websitContractSignRecordService.lambdaUpdate()
+                    .set(WebsitContractSignRecord::getFadadaWebsitId, websit.getFadadaWebsitId())
+                    .set(WebsitContractSignRecord::getFadadaWebsitNo, websit.getFadadaWebsitNo())
+                    .set(WebsitContractSignRecord::getFadadaCustomerId, websit.getFadadaCustomerId())
+                    .set(WebsitContractSignRecord::getFadadaCustomerNo, websit.getFadadaCustomerNo())
+                    .set(WebsitContractSignRecord::getStatus, SignContractStatusEnum.WAIT.getKey())
+                    .eq(WebsitContractSignRecord::getId, item.getWebsitContractSignRecordId())
+                    .update();
+        }
+    }
+
+    @Transactional
+    public void confirm(String id, SignContractStatusEnum status, String remark) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        WebsitContractSignItem signItem = websitContractSignItemService.getById(id);
+        if (Objects.isNull(signItem)) {
+            throw new RemoteServiceException("合同明细不存在");
+        }
+        if (status.getKey().equals(SignContractStatusEnum.OK.getKey())) {
+            if (signItem.getNeedPartyASign().equals(IsYesNoEnum.YES.getKey())) {
+                //甲方签署
+                JSONObject object = Auth4FDDUtil.extSignAuto(IdWorker.getIdStr(), signItem.getFadadaContractId(),
+                        signItem.getCaCustomerId(), "甲方签章", "0",
+                        signItem.getPartyASignFiled(), "", "", "");
+                log.info(signItem.getFadadaContractId() + " 甲方签章结果:{}", object);
+
+                // 法大大合同归档
+                JSONObject object1 = Auth4FDDUtil.contractFiling(signItem.getFadadaContractId());
+                log.info(signItem.getFadadaContractId() + " 合同归档结果:{}", object1);
+            }
+            websitContractSignItemService.lambdaUpdate()
+                    .set(WebsitContractSignItem::getContractStatus, SignContractStatusEnum.OK.getKey())
+                    .set(WebsitContractSignItem::getRemark, remark)
+                    .set(WebsitContractSignItem::getConfirmBy, adminUser.getNickName())
+                    .set(WebsitContractSignItem::getConfirmTime, DateUtil.date())
+                    .eq(WebsitContractSignItem::getId, id)
+                    .update();
+        } else {
+            websitContractSignItemService.lambdaUpdate()
+                    .set(WebsitContractSignItem::getContractStatus, SignContractStatusEnum.REJECT.getKey())
+                    .set(WebsitContractSignItem::getRemark, remark)
+                    .set(WebsitContractSignItem::getConfirmBy, adminUser.getNickName())
+                    .set(WebsitContractSignItem::getConfirmTime, DateUtil.date())
+                    .eq(WebsitContractSignItem::getId, id)
+                    .update();
+        }
+        final Integer count = websitContractSignItemService.lambdaQuery()
+                .eq(WebsitContractSignItem::getWebsitContractSignRecordId, signItem.getWebsitContractSignRecordId())
+                .eq(WebsitContractSignItem::getContractStatus, SignContractStatusEnum.OK.getKey())
+                .in(WebsitContractSignItem::getContractStatus, SignContractStatusEnum.WAIT_SIGN.getKey(), SignContractStatusEnum.WAIT.getKey(), SignContractStatusEnum.REJECT.getKey())
+                .count();
+        if (count == 0) {
+            // 合同都已审核,更新记录为审核通过
+            websitContractSignRecordService.lambdaUpdate()
+                    .set(WebsitContractSignRecord::getStatus, SignContractStatusEnum.OK.getKey())
+                    .set(WebsitContractSignRecord::getConfirmBy, adminUser.getNickName())
+                    .set(WebsitContractSignRecord::getConfirmTime, DateUtil.date())
+                    .eq(WebsitContractSignRecord::getId, signItem.getWebsitContractSignRecordId())
+                    .update();
+        }
     }
 }

+ 246 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/fadada/FDDNotifyLogic.java

@@ -4,20 +4,34 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.gree.mall.manager.constant.Constant;
 import com.gree.mall.manager.enums.IsYesNoEnum;
+import com.gree.mall.manager.enums.contract.SignContractStatusEnum;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.plus.entity.AdminWebsit;
 import com.gree.mall.manager.plus.entity.CompanyCaAuth;
+import com.gree.mall.manager.plus.entity.WebsitContractSignItem;
+import com.gree.mall.manager.plus.entity.WebsitContractSignRecord;
 import com.gree.mall.manager.plus.service.AdminWebsitService;
 import com.gree.mall.manager.plus.service.CompanyCaAuthService;
+import com.gree.mall.manager.plus.service.WebsitContractSignItemService;
+import com.gree.mall.manager.plus.service.WebsitContractSignRecordService;
 import com.gree.mall.manager.utils.fadada.Auth4FDDUtil;
 import com.gree.mall.manager.utils.oss.OSSUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.integration.redis.util.RedisLockRegistry;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
 
 @Service
 @Slf4j
@@ -28,6 +42,8 @@ public class FDDNotifyLogic {
     private final OSSUtil ossUtil;
     private final CompanyCaAuthService companyCaAuthService;
     private final AdminWebsitService adminWebsitService;
+    private final WebsitContractSignRecordService websitContractSignRecordService;
+    private final WebsitContractSignItemService websitContractSignItemService;
     @Value("${fadada.company.auth.auto.notify.url}")
     private String fddAuthAutoNotifyUrl;
 
@@ -161,4 +177,234 @@ public class FDDNotifyLogic {
         }
     }
 
+    public void websitAuthResultHandle(AdminWebsit websit) {
+        JSONObject info = Auth4FDDUtil.findCompanyCertInfo(websit.getFadadaWebsitNo());
+        if (!info.containsKey("data")) {
+            log.error("法大大网点企业认证data不存在:" + websit.getFadadaWebsitNo());
+            return;
+        }
+        JSONObject data = info.getJSONObject("data");
+        JSONObject person = data.getJSONObject("company");
+        String status = person.get("status", String.class);
+        String auditFailReason = person.get("auditFailReason", String.class, true);
+        String regFormPath = person.get("regFormPath", String.class, true);
+        String organizationPath = person.get("organizationPath", String.class, true);
+        if (!status.equals("4")) {
+            websit.setFadadaWebsitRealStatus(IsYesNoEnum.NO.getKey())
+                    .setFadadaAuthFailReason(auditFailReason);
+        } else {
+            websit.setFadadaWebsitRealStatus(IsYesNoEnum.YES.getKey())
+                    .setFadadaAuthFailReason("")
+                    .setFadadaRegFormPath(regFormPath)
+                    .setFadadaOrganizationPath(organizationPath);
+        }
+    }
+
+    public void websitPersonAuthResultHandle(AdminWebsit websit) {
+        JSONObject info = Auth4FDDUtil.findPersonCertInfo(websit.getFadadaCustomerNo());
+        if (!info.containsKey("data")) {
+            log.error("法大大网点负责人认证data不存在:" + websit.getFadadaCustomerNo());
+            return;
+        }
+        JSONObject data = info.getJSONObject("data");
+        JSONObject person = data.getJSONObject("person");
+
+        String status = person.get("status", String.class);
+        String auditFailReason = person.get("auditFailReason", String.class, true);
+        String photoUuid = person.get("photoUuid", String.class, true);
+        String headPhotoPath = person.get("headPhotoPath", String.class, true);
+        String backgroundIdCardPath = person.get("backgroundIdCardPath", String.class, true);
+        Date auditorTime = person.get("auditorTime", Date.class, true);
+        if (!status.equals("2")) {
+            websit.setFadadaCustomerRealStatus(IsYesNoEnum.NO.getKey())
+                    .setFadadaAuthFailReason(auditFailReason);
+        } else {
+            websit.setFadadaCustomerRealStatus(IsYesNoEnum.YES.getKey())
+                    .setFadadaAuthFailReason("");
+            websit.setFadadaCustomerHeadPhotoPath(headPhotoPath);
+            if (StringUtils.isNotBlank(photoUuid)) {
+                websit.setFadadaCustomerAuditorTime(auditorTime)
+                        .setFadadaCustomerPhotoUuid(photoUuid);
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void websitAuthResult(Map<String, String> params) {
+        log.info("法大大实名网点企业认证回调通知结果:{}", JSONUtil.toJsonStr(params));
+        this.queryWebsitAuthResult(params.get("serialNo"));
+    }
+
+    private void queryWebsitAuthResult(String transactionNo) {
+        AdminWebsit websit = adminWebsitService.lambdaQuery()
+                .eq(AdminWebsit::getFadadaWebsitNo, transactionNo).last("limit 1")
+                .one();
+
+        if (Objects.isNull(websit)) {
+            log.error("法大大企业认证交易号不存在:" + transactionNo);
+            return;
+        }
+
+        this.websitAuthResultHandle(websit);
+
+        adminWebsitService.lambdaUpdate()
+                .set(AdminWebsit::getFadadaWebsitRealStatus, websit.getFadadaWebsitRealStatus())
+                .set(AdminWebsit::getFadadaAuthFailReason, websit.getFadadaAuthFailReason())
+                .set(AdminWebsit::getFadadaRegFormPath, websit.getFadadaRegFormPath())
+                .set(AdminWebsit::getFadadaOrganizationPath, websit.getFadadaOrganizationPath())
+                .eq(AdminWebsit::getWebsitId, websit.getWebsitId())
+                .update();
+    }
+
+    public void websitPersonAuthResul(Map<String, String> params) {
+        log.info("法大大实名网点负责人认证回调通知结果:{}", JSONUtil.toJsonStr(params));
+        this.websitPersonAuthResul(params.get("serialNo"));
+    }
+
+    public void websitPersonAuthResul(String transactionNo) {
+        AdminWebsit websit = adminWebsitService.lambdaQuery()
+                .eq(AdminWebsit::getFadadaCustomerNo, transactionNo)
+                .one();
+
+        if (Objects.isNull(websit)) {
+            log.error("法大大网点负责人认证交易号不存在:" + transactionNo);
+            return;
+        }
+
+        this.websitPersonAuthResultHandle(websit);
+
+        adminWebsitService.lambdaUpdate()
+                .set(AdminWebsit::getFadadaCustomerRealStatus, websit.getFadadaCustomerRealStatus())
+                .set(AdminWebsit::getFadadaAuthFailReason, websit.getFadadaAuthFailReason())
+                .set(AdminWebsit::getFadadaCustomerHeadPhotoPath, websit.getFadadaCustomerHeadPhotoPath())
+                .set(AdminWebsit::getFadadaCustomerAuditorTime, websit.getFadadaCustomerAuditorTime())
+                .set(AdminWebsit::getFadadaCustomerPhotoUuid, websit.getFadadaCustomerPhotoUuid())
+                .eq(AdminWebsit::getWebsitId, websit.getWebsitId())
+                .update();
+    }
+
+    public void websitBatchSignResult(Map<String, String> params) throws InterruptedException {
+
+        log.info("法大大企业批量签署回调通知结果:{}", JSONUtil.toJsonStr(params));
+        String transactionId = params.get("transaction_id");
+        String contractId = params.get("contract_id");
+        String resultCode = params.get("result_code");
+        String msgDigest = params.get("msg_digest");
+        String timestamp = params.get("timestamp");
+
+        // 验签
+        String newMsgDigest = Auth4FDDUtil.getMsgDigest(transactionId, timestamp);
+
+        if (msgDigest.equals(newMsgDigest) && resultCode.equals("3000")) {
+            // 签署成功执行以下逻辑
+            WebsitContractSignItem websitFile = websitContractSignItemService.lambdaQuery()
+                    .eq(WebsitContractSignItem::getFadadaTransactionId, transactionId)
+                    .or()
+                    .eq(WebsitContractSignItem::getManagerTransactionId, transactionId)
+                    .one();
+
+            if (Objects.isNull(websitFile)) {
+                return;
+            }
+
+            WebsitContractSignRecord record = websitContractSignRecordService.getById(websitFile.getWebsitContractSignRecordId());
+
+            Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.FDD_BATCH_SIGN_NOTIFY + record.getWebsitId());
+            if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+                throw new RemoteServiceException("冻结二级网点");
+            }
+            try {
+                AdminWebsit websit = adminWebsitService.getById(record.getWebsitId());
+
+                if (!record.getStatus().equals(SignContractStatusEnum.WAIT.getKey())) {
+                    log.info("签约流程完结: " + websit.getWebsitId() + websit.getName());
+                    return;
+                }
+
+                List<WebsitContractSignItem> websitFiles = websitContractSignItemService.lambdaQuery()
+                        .eq(WebsitContractSignItem::getWebsitContractSignRecordId, record.getId())
+                        .isNotNull(WebsitContractSignItem::getFadadaTemplateId)
+                        .list();
+
+                // 判断公章签约
+                if (websitFile.getCompanySignStatus().equals(IsYesNoEnum.NO.getKey())) {
+                    // 遍历查询签章状态
+                    boolean sign = false;
+                    for (WebsitContractSignItem file : websitFiles) {
+                        if (file.getNeedCompanySign().equals(IsYesNoEnum.YES.getKey())) {
+                            JSONObject object = Auth4FDDUtil.querySignStatus(file.getFadadaContractId(), websit.getFadadaWebsitId(), file.getFadadaTransactionId());
+                            Integer code = object.get("code", Integer.class);
+                            String msg = object.get("msg", String.class);
+                            JSONObject data = object.getJSONObject("data");
+                            if (code != 1) {
+                                log.error("查询公章签约出错: " + msg);
+                                throw new RemoteServiceException(msg);
+                            }
+                            String result = data.get("result", String.class);
+                            String result_desc = data.get("result_desc", String.class);
+                            sign = result.equals("3000");
+                            if (!result.equals("3000")) {
+                                log.error("查询公章签署状态: " + result + result_desc);
+                                return;
+                            }
+                        }
+                    }
+
+                    if (sign) {
+                        websitContractSignItemService.lambdaUpdate()
+                                .set(WebsitContractSignItem::getCompanySignStatus, IsYesNoEnum.YES.getKey())
+                                .eq(WebsitContractSignItem::getWebsitContractSignRecordId, record.getId())
+                                .update();
+                    }
+                    // 公章签约流程后判断是否还需要负责人签,不需要就继续执行
+                    if (websitFile.getNeedManagerSign().equals(IsYesNoEnum.YES.getKey())) {
+                        return;
+                    }
+                }
+
+                // 判断负责人签约
+                if (websitFile.getNeedManagerSign().equals(IsYesNoEnum.YES.getKey())
+                        && websitFile.getManagerSignStatus().equals(IsYesNoEnum.NO.getKey())) {
+                    boolean sign = false;
+                    for (WebsitContractSignItem file : websitFiles) {
+                        if (file.getNeedManagerSign().equals(IsYesNoEnum.YES.getKey())) {
+                            JSONObject object = Auth4FDDUtil.querySignStatus(file.getFadadaContractId(), websit.getFadadaCustomerId(), file.getManagerTransactionId());
+                            Integer code = object.get("code", Integer.class);
+                            String msg = object.get("msg", String.class);
+                            JSONObject data = object.getJSONObject("data");
+                            if (code != 1) {
+                                log.error("查询法人签约出错: " + msg);
+                                throw new RemoteServiceException(msg);
+                            }
+                            String result = data.get("result", String.class);
+                            String result_desc = data.get("result_desc", String.class);
+                            sign = result.equals("3000");
+                            if (!result.equals("3000")) {
+                                log.error("查询法人签署状态: " + result + result_desc);
+                                return;
+                            }
+                            file.setManagerSignStatus(IsYesNoEnum.YES.getKey());
+                        }
+                    }
+                    if (sign) {
+                        websitContractSignItemService.lambdaUpdate()
+                                .set(WebsitContractSignItem::getManagerSignStatus, IsYesNoEnum.YES.getKey())
+                                .set(WebsitContractSignItem::getContractStatus, SignContractStatusEnum.WAIT.getKey())
+                                .eq(WebsitContractSignItem::getWebsitContractSignRecordId, record.getId())
+                                .update();
+                        record.setFadadaWebsitId(websit.getFadadaWebsitId())
+                                .setFadadaWebsitNo(websit.getFadadaWebsitNo())
+                                .setFadadaCustomerId(websit.getFadadaCustomerId())
+                                .setFadadaCustomerNo(websit.getFadadaCustomerNo())
+                                .setStatus(SignContractStatusEnum.WAIT.getKey())
+                                .updateById();
+                    }
+                }
+
+
+            } finally {
+                obtain.unlock();
+            }
+        }
+    }
 }

+ 2 - 0
mall-server-api/src/main/java/com/gree/mall/manager/schedule/daily/TransferRetrySchedule.java

@@ -4,6 +4,7 @@ import com.gree.mall.manager.logic.settle.repair.DailyTransferLogic;
 import com.gree.mall.manager.utils.DateUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
@@ -13,6 +14,7 @@ import java.util.Date;
  * @author Administrator
  */
 @Slf4j
+@ConditionalOnProperty(name = "schedule.enable", havingValue = "true", matchIfMissing = true)
 @Component
 public class TransferRetrySchedule {
 

+ 6 - 0
mall-server-api/src/main/java/com/gree/mall/manager/utils/oss/OSSUtil.java

@@ -212,4 +212,10 @@ public class OSSUtil {
         client.getObject(getObjectRequest, new File(savePath));
         return true;
     }
+
+    public String replaceLongKeyUrl(String longKey) {
+        String replace1 = longKey.replace("https://", "");
+        String replace2 = replace1.replace(OSS_BUCKET_NAME + ".", "");
+        return replace2.replace(OSS_ENDPOINT_WW, "");
+    }
 }

+ 18 - 0
mall-server-api/src/main/resources/mapper/CommonMapper.xml

@@ -1484,4 +1484,22 @@
         </if>
         ${ex.orderBy}
     </select>
+    <select id="queryNeedContract" resultType="com.gree.mall.manager.plus.entity.ContractTemplate">
+        SELECT
+            b.*
+        FROM
+            contract_websit a,
+            contract_template b
+        WHERE
+            a.company_wechat_id = b.company_wechat_id
+            AND a.contract_template_id = b.contract_template_id
+            AND a.company_wechat_id = #{companyId}
+            AND a.sub_websit_id = #{websitId}
+            AND b.valid_date <![CDATA[ >= ]]> #{onDate}
+            AND b.expire_date <![CDATA[ <= ]]> #{onDate}
+            AND b.contract_type = 'MAIN'
+            AND b.status = 'ON'
+        ORDER BY
+            create_time
+    </select>
 </mapper>