guomengjiao месяцев назад: 4
Родитель
Сommit
172fe60743

+ 39 - 0
ruoyi-admin/src/main/java/com/ruoyi/schedule/BusinessSchedule.java

@@ -0,0 +1,39 @@
+package com.ruoyi.schedule;
+
+import com.ruoyi.business.domain.Business;
+import com.ruoyi.business.service.IBusinessService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@Configuration
+@EnableScheduling
+@Lazy(false)
+@Slf4j
+@RequiredArgsConstructor
+public class BusinessSchedule {
+
+    private final IBusinessService businessService;
+
+    // 每晚一点钏执行一次 店铺过期
+    @Scheduled(cron = "${task1h}")
+    public void autoExpires() {
+        List<Business> list = businessService.needAutoExpires();
+        list.forEach(v -> {
+            try {
+                log.info(String.format("商家:%s,开始执行过期", v.getBusinessName()));
+                businessService.autoExpires(v);
+                log.info(String.format("商家:%s,结束执行过期", v.getBusinessName()));
+            } catch (Exception ex) {
+                log.info(String.format("商家:%s,执行过期失败", v.getBusinessName()));
+            }
+        });
+    }
+}

+ 0 - 12
ruoyi-api/src/main/java/com/ruoyi/api/controller/shop/ApiBusinessApplyController.java

@@ -44,18 +44,6 @@ public class ApiBusinessApplyController extends AbstractApiController {
         return R.ok(iBusinessApplyService.queryByUserId(getUserId(true)));
     }
 
-    /**
-     * 获取商家申请详细信息
-     */
-    @FilePathSplicing(type = FilePathSplicingType.RESPONSE)
-    @ApiOperation("获取商家申请详细信息")
-    @GetMapping("/info/{businessAuditId}")
-    public R<BusinessApplyVo> getInfo(@ApiParam("主键")
-                                                  @NotNull(message = "主键不能为空")
-                                                  @PathVariable("businessAuditId") Long businessAuditId) {
-        return R.ok(iBusinessApplyService.queryById(businessAuditId));
-    }
-
     /**
      * 新增商家申请
      */

+ 4 - 2
ruoyi-business/src/main/java/com/ruoyi/agent/service/IAgentAccountCodeService.java

@@ -1,11 +1,11 @@
 package com.ruoyi.agent.service;
 
 import com.ruoyi.agent.domain.AgentAccountCode;
-import com.ruoyi.agent.domain.vo.AgentAccountCodeVo;
 import com.ruoyi.agent.domain.bo.AgentAccountCodeBo;
+import com.ruoyi.agent.domain.vo.AgentAccountCodeVo;
 import com.ruoyi.agent.enums.AccountCodeStatus;
-import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.domain.PageQuery;
+import com.ruoyi.common.core.page.TableDataInfo;
 
 import java.util.Collection;
 import java.util.List;
@@ -84,4 +84,6 @@ public interface IAgentAccountCodeService {
     TableDataInfo<AgentAccountCodeVo> queryUserPageList(AgentAccountCodeBo bo, PageQuery pageQuery);
 
     void provinceIssue(Long agentId, Long parentAgentId, Integer issuedQuantity);
+
+    AgentAccountCodeVo availableByAccountCode(String accountCode);
 }

+ 7 - 0
ruoyi-business/src/main/java/com/ruoyi/agent/service/impl/AgentAccountCodeServiceImpl.java

@@ -274,4 +274,11 @@ public class AgentAccountCodeServiceImpl implements IAgentAccountCodeService {
         baseMapper.updateBatchById(updateList);
     }
 
+    @Override
+    public AgentAccountCodeVo availableByAccountCode(String accountCode) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<AgentAccountCode>()
+            .eq(AgentAccountCode::getStatus, Arrays.asList(AccountCodeStatus.UNUSED, AccountCodeStatus.WAIT_USE))
+            .eq(AgentAccountCode::getAccountCode, accountCode));
+    }
+
 }

+ 2 - 0
ruoyi-business/src/main/java/com/ruoyi/business/domain/bo/BusinessBo.java

@@ -367,4 +367,6 @@ public class BusinessBo extends BaseEntity {
     @ApiModelProperty(value = "余额")
     private BigDecimal balance;
 
+    @ApiModelProperty(value = "手写签名")
+    private String signImage;
 }

+ 3 - 1
ruoyi-business/src/main/java/com/ruoyi/business/exception/BusinessApplyExceptionEnum.java

@@ -16,7 +16,9 @@ public enum BusinessApplyExceptionEnum implements IIntegerEnum {
     BusinessApply_STATUS_NOT_FINAL(1000003, "审核状态不是终态"),
     BusinessApply_RESULT_IS_NULL(1000004, "审核不通过 原因为空"),
     BusinessApply_NOT_AUDITING(1000005, "审核记录不是审核中状态"),
-    ACCOUNT_AUDIT_PASS(1000006, "商家已审核通过,请勿重复申请!");
+    ACCOUNT_AUDIT_PASS(1000006, "商家已审核通过,请勿重复申请!"),
+    ACCOUNT_CODE_NOT_EXISTS(1000007, "账户码不可用!"),
+    PARENT_BUSINESS_NOT_EXISTS(1000008, "总店邀请码不存在!");
 
     private Integer code;
 

+ 4 - 2
ruoyi-business/src/main/java/com/ruoyi/business/exception/BusinessExceptionEnum.java

@@ -15,9 +15,11 @@ public enum BusinessExceptionEnum implements IIntegerEnum {
     BUSINESS_NAME_EXISTS(500002, "商家名称已存在"),
     BUSINESS_CATEGORY_EXISTS(500003, "该商家分类已存在商家不能删除"),
     BUSINESS_PRODUCT_CATEGORY_EXISTS(500004, "该商家下的商品分类已存在商品不能删除"),
-
     BUSINESS_STATUS_NOT_OPEN( 500005, "商家已被关闭或已过期"),
-    BUSINESS_BALANCE_NOT_ENOUGH(500006, "商家余额不足");
+    BUSINESS_BALANCE_NOT_ENOUGH(500006, "商家余额不足"),
+    Business_SIGN_FAIL( 500007, "商家签合同手写签名无效"),
+    Business_SIGN_CONTRACT_FAIL( 500008, "商家签合同失败"),
+    ;
 
     private Integer code;
 

+ 6 - 0
ruoyi-business/src/main/java/com/ruoyi/business/service/IBusinessService.java

@@ -129,4 +129,10 @@ public interface IBusinessService {
      * @param build
      */
     void changeBalance(BusinessBalanceRecordBo build);
+
+    BusinessVo queryByInviteCode(String inviteCode);
+
+    List<Business> needAutoExpires();
+
+    void autoExpires(Business business);
 }

+ 52 - 13
ruoyi-business/src/main/java/com/ruoyi/business/service/impl/BusinessApplyServiceImpl.java

@@ -5,20 +5,28 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.core.domain.PageQuery;
-import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.common.enums.AuditStatus;
-import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.BeanCopyUtils;
-import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.agent.domain.Agent;
+import com.ruoyi.agent.domain.bo.AgentAccountCodeBo;
+import com.ruoyi.agent.domain.vo.AgentAccountCodeVo;
+import com.ruoyi.agent.enums.AccountCodePurposeType;
+import com.ruoyi.agent.enums.AccountCodeStatus;
+import com.ruoyi.agent.service.IAgentAccountCodeService;
+import com.ruoyi.agent.service.IAgentService;
 import com.ruoyi.business.domain.BusinessApply;
 import com.ruoyi.business.domain.bo.BusinessApplyBo;
 import com.ruoyi.business.domain.bo.BusinessBo;
 import com.ruoyi.business.domain.vo.BusinessApplyVo;
+import com.ruoyi.business.domain.vo.BusinessVo;
 import com.ruoyi.business.exception.BusinessApplyExceptionEnum;
 import com.ruoyi.business.mapper.BusinessApplyMapper;
 import com.ruoyi.business.service.IBusinessApplyService;
 import com.ruoyi.business.service.IBusinessService;
+import com.ruoyi.common.core.domain.PageQuery;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.AuditStatus;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.BeanCopyUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.user.service.IUserService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Lazy;
@@ -46,6 +54,12 @@ public class BusinessApplyServiceImpl implements IBusinessApplyService {
     @Lazy
     @Resource
     private IBusinessService businessService;
+    @Lazy
+    @Resource
+    private IAgentService agentService;
+    @Lazy
+    @Resource
+    private IAgentAccountCodeService agentAccountCodeService;
 
     /**
      * 查询商家申请分页
@@ -149,9 +163,19 @@ public class BusinessApplyServiceImpl implements IBusinessApplyService {
      * @param bo 商家申请
      * @return 结果
      */
+    @Transactional
     @Override
     public Boolean insertByBo(BusinessApplyBo bo) {
-
+        AgentAccountCodeVo agentAccountCodeVo = agentAccountCodeService.availableByAccountCode(bo.getAccountCode());
+        if (ObjectUtil.isNull(agentAccountCodeVo)) {
+            throw new ServiceException(BusinessApplyExceptionEnum.ACCOUNT_CODE_NOT_EXISTS);
+        }
+        if (StringUtils.isNotEmpty(bo.getParentBusinessCode())) {
+            BusinessVo businessVo = businessService.queryByInviteCode(bo.getParentBusinessCode());
+            if (ObjectUtil.isNull(businessVo)) {
+                throw new ServiceException(BusinessApplyExceptionEnum.PARENT_BUSINESS_NOT_EXISTS);
+            }
+        }
         BusinessApply businessApply = baseMapper.selectOne(new LambdaQueryWrapper<BusinessApply>().eq(BusinessApply::getUserId, bo.getUserId()).last("limit 1"));
         BusinessApply saveOrUpdate;
         if(ObjectUtil.isNotNull(businessApply)){
@@ -223,13 +247,33 @@ public class BusinessApplyServiceImpl implements IBusinessApplyService {
         if (!AuditStatus.WAIT_AUDIT.getCode().equals(businessApply.getAuditStatus())) {
             throw new ServiceException(BusinessApplyExceptionEnum.BusinessApply_NOT_AUDITING);
         }
+        AgentAccountCodeVo agentAccountCodeVo = agentAccountCodeService.availableByAccountCode(bo.getAccountCode());
+        if (ObjectUtil.isNull(agentAccountCodeVo)) {
+            throw new ServiceException(BusinessApplyExceptionEnum.ACCOUNT_CODE_NOT_EXISTS);
+        }
+        Agent agent = agentService.loadById(agentAccountCodeVo.getAgentId(), true);
+        BusinessVo businessVo = businessService.queryByInviteCode(bo.getParentBusinessCode());
+        if (ObjectUtil.isNull(businessVo)) {
+            throw new ServiceException(BusinessApplyExceptionEnum.PARENT_BUSINESS_NOT_EXISTS);
+        }
         Long businessId = businessService.queryIdByUserId(businessApply.getUserId());
         if (AuditStatus.AUDIT_PASS.getCode().equals(bo.getAuditStatus())) {
             //通过
             BusinessBo businessBo = BeanCopyUtils.copy(businessApply, BusinessBo.class);
             businessBo.setBusinessId(businessId);
             businessBo.setRelationUserId(businessApply.getUserId());
+            businessBo.setAgentId(agentAccountCodeVo.getAgentId());
+            businessBo.setParentAgentId(agent.getParentAgentId());
+            businessBo.setParentBusinessId(businessVo.getBusinessId());
             businessId = businessService.insertOrUpdate(businessBo);
+            //更新账户码
+            AgentAccountCodeBo updateCodeBo = new AgentAccountCodeBo();
+            updateCodeBo.setId(agentAccountCodeVo.getId());
+            updateCodeBo.setStatus(AccountCodeStatus.USED);
+            updateCodeBo.setPurposeId(businessId);
+            updateCodeBo.setPurposeType(AccountCodePurposeType.BUSINESS);
+            updateCodeBo.setPurposeTime(new Date());
+            agentAccountCodeService.updateByBo(updateCodeBo);
         }
         businessApply.setAuditStatus(bo.getAuditStatus());
         businessApply.setAuditTime(new Date());
@@ -242,11 +286,6 @@ public class BusinessApplyServiceImpl implements IBusinessApplyService {
 
     @Override
     public BusinessApplyVo queryByUserId(Long userId) {
-        BusinessApply businessApply = baseMapper.selectOne(new LambdaQueryWrapper<BusinessApply>().eq(BusinessApply::getUserId, userId).last("limit 1"));
-        BusinessApplyVo businessApplyVo = BeanCopyUtils.copy(businessApply, BusinessApplyVo.class);
-        if (ObjectUtil.isNotNull(businessApplyVo)) {
-            businessApplyVo.setBusinessVo(businessService.queryById(businessApplyVo.getBusinessId()));
-        }
-        return businessApplyVo;
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<BusinessApply>().eq(BusinessApply::getUserId, userId).last("limit 1"));
     }
 }

+ 85 - 5
ruoyi-business/src/main/java/com/ruoyi/business/service/impl/BusinessServiceImpl.java

@@ -3,10 +3,14 @@ package com.ruoyi.business.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.junziqian.sdk.bean.req.sign.ext.SignatoryReq;
+import com.ruoyi.base.platform.domain.vo.PlatformInfoVo;
+import com.ruoyi.base.platform.service.IPlatformInfoService;
 import com.ruoyi.business.domain.Business;
 import com.ruoyi.business.domain.bo.BusinessBalanceRecordBo;
 import com.ruoyi.business.domain.bo.BusinessBo;
@@ -23,13 +27,18 @@ import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.ExceptionEnum;
+import com.ruoyi.common.enums.InviteType;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanCopyUtils;
 import com.ruoyi.common.utils.MapTools;
+import com.ruoyi.common.utils.ShareCodeUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.shop.product.IProductInnerApi;
 import com.ruoyi.shop.product.IUserShoppingCartApi;
 import com.ruoyi.system.service.ISysDeptService;
+import com.ruoyi.tool.service.JzqService;
+import com.ruoyi.user.domain.User;
+import com.ruoyi.user.service.IUserService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -50,12 +59,12 @@ public class BusinessServiceImpl implements IBusinessService {
 
     private final BusinessMapper baseMapper;
     private final ISysDeptService  sysDeptService;
-
     private final IProductInnerApi iProductInnerApi;
-
     private final IUserShoppingCartApi iUserShoppingCartApi;
-
     private final IBusinessVerifierService businessVerifierService;
+    private final JzqService jzqService;
+    private final IPlatformInfoService platformInfoService;
+    private final IUserService userService;
 
     private final IBusinessBalanceRecordService iBusinessBalanceRecordService;
 
@@ -207,14 +216,31 @@ public class BusinessServiceImpl implements IBusinessService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean insertByBo(BusinessBo bo) {
-
         SysDept sysDept = insertDept(bo);
 
         validEntityBeforeSave(bo);
         Business add = BeanUtil.toBean(bo, Business.class);
         add.setDeptId(sysDept.getDeptId());
+        add.setBusinessStatus(true);
+        //到期时间 1年后到期
+        add.setExpiresTime(DateUtil.offsetDay(new Date(), 365));
+        //签合同 TODO
+//        Boolean signFlag = jzqService.uploadPersSign(bo.getLegalIdCard(), bo.getSignImage());
+//        if(!signFlag){
+//            throw new ServiceException(BusinessExceptionEnum.Business_SIGN_FAIL);
+//        }
+//        String contractNo = jzqService.applySign(buildSignatories(add));
+//        if (StringUtils.isEmpty(contractNo)) {
+//            throw new ServiceException(BusinessExceptionEnum.Business_SIGN_CONTRACT_FAIL);
+//        }
+//        add.setContractNo(contractNo);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
+            //生成邀请码
+            String inviteCode = ShareCodeUtils.idToCode(add.getBusinessId());
+            add.setInviteCode(InviteType.SHOP.getCode() + inviteCode);
+            baseMapper.updateById(add);
+
             bo.setBusinessId(add.getBusinessId());
             //添加核销员
             BusinessVerifierBo verifierBo = new BusinessVerifierBo();
@@ -226,6 +252,42 @@ public class BusinessServiceImpl implements IBusinessService {
         return flag;
     }
 
+    private JSONArray buildSignatories(Business business) {
+        /**
+         * 签约方1(个人)
+         */
+        User user = userService.getById(business.getRelationUserId(), true);
+        JSONArray signatories = new JSONArray();
+        SignatoryReq sReq = new SignatoryReq();
+        sReq.setFullName(business.getLegalName()); //姓名
+        sReq.setIdentityType(1); //证件类型
+        sReq.setIdentityCard(business.getLegalIdCard());//身份证号
+        sReq.setMobile(user.getMobile()); //手机号
+        sReq.setChapteJson("[{\"page\":0,\"chaptes\":[{\"offsetX\":0.3047,\"offsetY\":0.2677}]},{\"page\":4,\"chaptes\":[{\"offsetX\":0.2378,\"offsetY\":0.1681}]}]");//坐标(X Y)定位签字位置
+        // sReq.setSearchKey("服务组件");//关键字定位签字位置
+        sReq.setNoNeedVerify(1); //取消签约前短信校验
+        sReq.setServerCaAuto(0);//是否使用自动签署完成,0或null不使用,1自动(当且只当合同处理方式为部份自动或收集批量签时有效)
+        sReq.setSignLevel(1);//签字类型,标准图形章或公章:0标准图形章,1公章或手写,2公章手写或手写,3个人方形标准章(用户类型是个人且姓名2-4个字符生效,其他情况默认使用系统标准图形章)
+        signatories.add(sReq);
+
+        PlatformInfoVo platformInfoVo = platformInfoService.getInfo();
+        /**
+         * 签约方2(企业)
+         */
+        SignatoryReq eReq = new SignatoryReq();
+        eReq.setFullName(platformInfoVo.getEnterpriseFullName()); //企业姓名
+        eReq.setIdentityType(12); //证件类型
+        eReq.setIdentityCard(platformInfoVo.getUscCode());//统一社会信用代码
+        eReq.setEmail(platformInfoVo.getEmail()); //在君子签注册认证的邮箱
+        eReq.setChapteJson("[{\"page\":4,\"chaptes\":[{\"offsetX\":0.121,\"offsetY\":0.3941}]}]");//坐标(X Y)定位签字位置
+        // eReq.setSearchKey("服务组件");//关键字定位签字位置
+        eReq.setSignLevel(0);
+        eReq.setNoNeedVerify(1);
+        eReq.setServerCaAuto(1);//当前签约方自动签署
+        signatories.add(eReq);
+        return signatories;
+    }
+
     /**
      * 修改商家
      *
@@ -379,7 +441,6 @@ public class BusinessServiceImpl implements IBusinessService {
             insertByBo(businessBo);
         } else {
             updateByBo(businessBo);
-
         }
         return businessBo.getBusinessId();
     }
@@ -447,4 +508,23 @@ public class BusinessServiceImpl implements IBusinessService {
         build.setEntryAfterBalance(business.getBalance());
         iBusinessBalanceRecordService.insertByBo(build);
     }
+
+    @Override
+    public BusinessVo queryByInviteCode(String inviteCode) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<Business>().eq(Business::getInviteCode, inviteCode));
+    }
+
+    @Override
+    public List<Business> needAutoExpires() {
+        return baseMapper.selectList(new LambdaQueryWrapper<Business>()
+            .eq(Business::getCloseStatus, false)
+            .eq(Business::getExpiresStatus, false)
+            .le(Business::getExpiresTime, DateUtil.date()));
+    }
+
+    @Override
+    public void autoExpires(Business business) {
+        business.setExpiresStatus(true);
+        baseMapper.updateById(business);
+    }
 }