Przeglądaj źródła

Merge branch 'master' of http://115.29.66.169:10080/yiyao_shop/api

lubo 4 miesięcy temu
rodzic
commit
8f1c751d22
33 zmienionych plików z 2016 dodań i 167 usunięć
  1. 52 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/JzqOcrController.java
  2. 67 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/info/PlatformInfoController.java
  3. 56 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/info/RevenueSharingConfigController.java
  4. 0 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/shop/agent/AgentApplyController.java
  5. 3 7
      ruoyi-agent/pom.xml
  6. 43 0
      ruoyi-agent/src/main/java/com/ruoyi/agent/domain/bo/AgentChangeBalanceBo.java
  7. 18 0
      ruoyi-agent/src/main/java/com/ruoyi/agent/domain/vo/AgentApplyVo.java
  8. 3 1
      ruoyi-agent/src/main/java/com/ruoyi/agent/exception/AgentApplyExceptionEnum.java
  9. 2 0
      ruoyi-agent/src/main/java/com/ruoyi/agent/service/IAgentApplyService.java
  10. 6 0
      ruoyi-agent/src/main/java/com/ruoyi/agent/service/IAgentService.java
  11. 35 4
      ruoyi-agent/src/main/java/com/ruoyi/agent/service/impl/AgentApplyServiceImpl.java
  12. 96 12
      ruoyi-agent/src/main/java/com/ruoyi/agent/service/impl/AgentServiceImpl.java
  13. 3 5
      ruoyi-api/src/main/java/com/ruoyi/api/controller/shop/ApiAgentApplyController.java
  14. 1 1
      ruoyi-common/src/main/java/com/ruoyi/common/enums/ExceptionEnum.java
  15. 4 0
      ruoyi-info/pom.xml
  16. 132 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/domain/PlatformInfo.java
  17. 67 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/domain/RevenueSharingConfig.java
  18. 215 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/domain/bo/PlatformInfoBo.java
  19. 97 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/domain/bo/RevenueSharingConfigBo.java
  20. 217 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/domain/vo/PlatformInfoVo.java
  21. 98 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/domain/vo/RevenueSharingConfigVo.java
  22. 53 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/exception/PlatformInfoExceptionEnum.java
  23. 53 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/exception/RevenueSharingConfigExceptionEnum.java
  24. 15 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/mapper/PlatformInfoMapper.java
  25. 15 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/mapper/RevenueSharingConfigMapper.java
  26. 80 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/service/IPlatformInfoService.java
  27. 78 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/service/IRevenueSharingConfigService.java
  28. 196 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/service/impl/PlatformInfoServiceImpl.java
  29. 172 0
      ruoyi-info/src/main/java/com/ruoyi/info/base/service/impl/RevenueSharingConfigServiceImpl.java
  30. 41 0
      ruoyi-info/src/main/resources/mapper/PlatformInfoMapper.xml
  31. 25 0
      ruoyi-info/src/main/resources/mapper/RevenueSharingConfigMapper.xml
  32. 0 107
      ruoyi-tool/src/main/java/com/ruoyi/tool/service/ApplySignService.java
  33. 73 28
      ruoyi-tool/src/main/java/com/ruoyi/tool/controller/JzqOcrController.java

+ 52 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/JzqOcrController.java

@@ -0,0 +1,52 @@
+package com.ruoyi.web.controller.base;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.tool.request.OcrRequest;
+import com.ruoyi.tool.response.OcrBankResponse;
+import com.ruoyi.tool.response.OcrBusinessLicResponse;
+import com.ruoyi.tool.response.OcrIdentityResponse;
+import com.ruoyi.tool.service.JzqService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api("君子签")
+@RestController
+@RequestMapping("/jzq/ocr")
+@AllArgsConstructor
+public class JzqOcrController {
+
+    private final JzqService jzqService;
+
+    /**
+     * 身份证识别
+     */
+    @ApiOperation("身份证识别")
+    @GetMapping("/idcard")
+    public R<OcrIdentityResponse> idcard(OcrRequest request) {
+        return R.ok(jzqService.idcard(request));
+    }
+
+    /**
+     * 银行卡识别
+     */
+    @ApiOperation("银行卡识别")
+    @GetMapping("/bank")
+    public R<OcrBankResponse> bank(OcrRequest request) {
+        return R.ok(jzqService.bank(request));
+    }
+
+    /**
+     * 营业执照识别
+     */
+    @ApiOperation("营业执照识别")
+    @GetMapping("/businessLic")
+    public R<OcrBusinessLicResponse> businessLic(OcrRequest request) {
+        return R.ok(jzqService.businessLic(request));
+    }
+
+}
+

+ 67 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/info/PlatformInfoController.java

@@ -0,0 +1,67 @@
+package com.ruoyi.web.controller.info;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.info.base.domain.bo.PlatformInfoBo;
+import com.ruoyi.info.base.domain.vo.PlatformInfoVo;
+import com.ruoyi.info.base.service.IPlatformInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 平台信息管理Controller
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+@Validated
+@Api(value = "平台信息管理控制器", tags = {"平台信息管理管理"})
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/base/platformInfo")
+public class PlatformInfoController extends BaseController {
+
+    private final IPlatformInfoService iPlatformInfoService;
+
+    /**
+     * 获取平台信息管理详细信息
+     */
+    @ApiOperation("获取平台信息管理详细信息")
+    @SaCheckPermission("base:platformInfo:query")
+    @GetMapping("/info")
+    public R<PlatformInfoVo> getInfo() {
+        return R.ok(iPlatformInfoService.getInfo());
+    }
+
+    /**
+     * 新增平台信息管理
+     */
+    @ApiOperation("新增平台信息管理")
+    @SaCheckPermission("base:platformInfo:add")
+    @Log(title = "平台信息管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/add")
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody PlatformInfoBo bo) {
+        return toAjax(iPlatformInfoService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 君子签-企业实名认证上传
+     */
+    @ApiOperation("君子签-企业实名认证上传")
+    @SaCheckPermission("base:platformInfo:organizationCreate")
+    @RepeatSubmit()
+    @PostMapping("/organizationCreate")
+    public R<Void> organizationCreate() {
+        iPlatformInfoService.organizationCreate();
+        return R.ok();
+    }
+}

+ 56 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/info/RevenueSharingConfigController.java

@@ -0,0 +1,56 @@
+package com.ruoyi.web.controller.info;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.info.base.domain.bo.RevenueSharingConfigBo;
+import com.ruoyi.info.base.domain.vo.RevenueSharingConfigVo;
+import com.ruoyi.info.base.service.IRevenueSharingConfigService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 平台分账配置Controller
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+@Validated
+@Api(value = "平台分账配置控制器", tags = {"平台分账配置管理"})
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/base/revenueSharingConfig")
+public class RevenueSharingConfigController extends BaseController {
+
+    private final IRevenueSharingConfigService iRevenueSharingConfigService;
+
+    /**
+     * 获取平台分账配置详细信息
+     */
+    @ApiOperation("获取平台分账配置详细信息")
+    @SaCheckPermission("base:revenueSharingConfig:query")
+    @GetMapping("/info")
+    public R<RevenueSharingConfigVo> getInfo() {
+        return R.ok(iRevenueSharingConfigService.getInfo());
+    }
+
+    /**
+     * 新增平台分账配置
+     */
+    @ApiOperation("新增平台分账配置")
+    @SaCheckPermission("base:revenueSharingConfig:add")
+    @Log(title = "平台分账配置", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/add")
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RevenueSharingConfigBo bo) {
+        return toAjax(iRevenueSharingConfigService.insertByBo(bo) ? 1 : 0);
+    }
+
+}

+ 0 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/shop/agent/AgentApplyController.java

@@ -48,7 +48,6 @@ public class AgentApplyController extends BaseController {
     @GetMapping("/waitPage")
     public TableDataInfo<AgentApplyVo> waitPage(@Validated(QueryGroup.class) AgentApplyBo bo, PageQuery pageQuery) {
         bo.setAuditStatus(AuditStatus.WAIT_AUDIT);
-        bo.setAgentLevel(AgentLevel.PROVINCE_AGENT);
         return iAgentApplyService.queryPageList(bo, pageQuery);
     }
 
@@ -60,7 +59,6 @@ public class AgentApplyController extends BaseController {
     @GetMapping("/auditPage")
     public TableDataInfo<AgentApplyVo> auditPage(@Validated(QueryGroup.class) AgentApplyBo bo, PageQuery pageQuery) {
         bo.setAuditStatusList(Arrays.asList(AuditStatus.AUDIT_PASS.getCode(), AuditStatus.AUDIT_NOT_PASS.getCode()));
-        bo.setAgentLevel(AgentLevel.PROVINCE_AGENT);
         return iAgentApplyService.queryPageList(bo, pageQuery);
     }
 

+ 3 - 7
ruoyi-agent/pom.xml

@@ -14,19 +14,15 @@
     <dependencies>
         <dependency>
             <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-tool</artifactId>
+            <artifactId>ruoyi-user</artifactId>
         </dependency>
         <dependency>
             <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-user</artifactId>
+            <artifactId>ruoyi-business</artifactId>
         </dependency>
         <dependency>
             <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-business</artifactId>
+            <artifactId>ruoyi-info</artifactId>
         </dependency>
     </dependencies>
 </project>

+ 43 - 0
ruoyi-agent/src/main/java/com/ruoyi/agent/domain/bo/AgentChangeBalanceBo.java

@@ -0,0 +1,43 @@
+package com.ruoyi.agent.domain.bo;
+
+import com.ruoyi.agent.enums.BalanceSourceType;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@Builder
+public class AgentChangeBalanceBo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 代理id
+     */
+    private Long agentId;
+    /**
+     * 变动余额
+     */
+    private BigDecimal entryValue;
+    /**
+     * 是否增加
+     */
+    private Boolean isAdd;
+    /**
+     * 业务来源
+     */
+    private BalanceSourceType sourceType;
+    /**
+     * 业务id
+     */
+    private Long sourceId;
+    /**
+     * 业务code
+     */
+    private String sourceCode;
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 18 - 0
ruoyi-agent/src/main/java/com/ruoyi/agent/domain/vo/AgentApplyVo.java

@@ -40,6 +40,18 @@ public class AgentApplyVo {
      */
     private Long userId;
 
+    /**
+     * 手机号
+     */
+    @ApiModelProperty(value = "会员账号", required = true)
+    private String userMobile;
+
+    /**
+     * 昵称
+     */
+    @ApiModelProperty(value = "会员昵称", required = true)
+    private String userNickname;
+
     /**
      * 代理ID
      */
@@ -173,5 +185,11 @@ public class AgentApplyVo {
     @ApiModelProperty("手写签名")
     private String signImage;
 
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    @ApiModelProperty("创建时间")
+    private Date createTime;
 
 }

+ 3 - 1
ruoyi-agent/src/main/java/com/ruoyi/agent/exception/AgentApplyExceptionEnum.java

@@ -18,7 +18,9 @@ public enum AgentApplyExceptionEnum implements IIntegerEnum {
     AGENT_APPLY_NOT_WAIT_AUDIT(420006, "代理申请在审核拒绝才能修改申请"),
     AgentApply_STATUS_NOT_FINAL(420007, "审核状态不是终态"),
     AgentApply_RESULT_IS_NULL(420008, "审核不通过 原因为空"),
-    AgentApply_STATUS_NOT_WAIT_AUDIT(420009, "代理申请状态不是待审核");
+    AgentApply_STATUS_NOT_WAIT_AUDIT(420009, "代理申请状态不是待审核"),
+    AgentApply_AUDIT_TYPE_NOT_PROVINCE_AUDIT(420010, "平台才能审核省级"),
+    AgentApply_AUDIT_TYPE_NOT_COUNTY_AUDIT(420011, "省级才能审核地代");
 
     private Integer code;
 

+ 2 - 0
ruoyi-agent/src/main/java/com/ruoyi/agent/service/IAgentApplyService.java

@@ -75,4 +75,6 @@ public interface IAgentApplyService {
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     Boolean audit(AgentApplyBo bo);
+
+    AgentApplyVo queryByUserId(Long userId);
 }

+ 6 - 0
ruoyi-agent/src/main/java/com/ruoyi/agent/service/IAgentService.java

@@ -2,6 +2,7 @@ package com.ruoyi.agent.service;
 
 import com.ruoyi.agent.domain.Agent;
 import com.ruoyi.agent.domain.bo.AgentBo;
+import com.ruoyi.agent.domain.bo.AgentChangeBalanceBo;
 import com.ruoyi.agent.domain.vo.AgentAmountStatisticsVo;
 import com.ruoyi.agent.domain.vo.AgentVo;
 import com.ruoyi.common.core.domain.PageQuery;
@@ -96,4 +97,9 @@ public interface IAgentService {
     List<Long> queryIdList(AgentBo agentBo);
 
     String queryNameById(Long purposeId);
+
+    /**
+     * 修改代理的余额
+     */
+    void changeAgentBalance(AgentChangeBalanceBo bo);
 }

+ 35 - 4
ruoyi-agent/src/main/java/com/ruoyi/agent/service/impl/AgentApplyServiceImpl.java

@@ -12,6 +12,7 @@ import com.ruoyi.agent.domain.bo.AgentApplyBo;
 import com.ruoyi.agent.domain.bo.AgentBo;
 import com.ruoyi.agent.domain.vo.AgentApplyVo;
 import com.ruoyi.agent.domain.vo.AgentVo;
+import com.ruoyi.agent.enums.AgentAuditType;
 import com.ruoyi.agent.enums.AgentLevel;
 import com.ruoyi.agent.exception.AgentApplyExceptionEnum;
 import com.ruoyi.agent.mapper.AgentApplyMapper;
@@ -23,6 +24,7 @@ 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.domain.User;
 import com.ruoyi.user.domain.bo.UserBo;
 import com.ruoyi.user.service.IUserService;
 import lombok.RequiredArgsConstructor;
@@ -35,6 +37,7 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 代理申请Service业务层处理
@@ -70,6 +73,7 @@ public class AgentApplyServiceImpl implements IAgentApplyService {
         }
         LambdaQueryWrapper<AgentApply> lqw = buildQueryWrapper(bo);
         Page<AgentApplyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        result.setRecords(convertList(result.getRecords()));
         return TableDataInfo.build(result);
     }
 
@@ -85,6 +89,17 @@ public class AgentApplyServiceImpl implements IAgentApplyService {
         return baseMapper.selectVoList(lqw);
     }
 
+    private List<AgentApplyVo> convertList(List<AgentApplyVo> voList) {
+        return voList.stream().map(vo -> {
+            User user = userService.loadByIdForLock(vo.getUserId(), false);
+            if (ObjectUtil.isNotNull(user)) {
+                vo.setUserNickname(user.getNickname());
+                vo.setUserMobile(user.getMobile());
+            }
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
     private LambdaQueryWrapper<AgentApply> buildQueryWrapper(AgentApplyBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<AgentApply> lqw = Wrappers.lambdaQuery();
@@ -93,12 +108,18 @@ public class AgentApplyServiceImpl implements IAgentApplyService {
             userBo.setMobile(bo.getUserMobile());
             userBo.setNickname(bo.getUserNickname());
             List<Long> userIds = userService.queryIdList(userBo);
+            if (CollUtil.isEmpty(userIds)) {
+                lqw.eq(AgentApply::getUserId, -1);
+            }
             lqw.in(CollUtil.isNotEmpty(userIds), AgentApply::getUserId, userIds);
         }
         if (StringUtils.isNotEmpty(bo.getParentAgentPhone())) {
             AgentBo agentBo = new AgentBo();
             agentBo.setPhone(bo.getParentAgentPhone());
             List<Long> agentIds = agentService.queryIdList(agentBo);
+            if (CollUtil.isEmpty(agentIds)) {
+                lqw.eq(AgentApply::getParentAgentId, -1);
+            }
             lqw.in(CollUtil.isNotEmpty(agentIds), AgentApply::getParentAgentId, agentIds);
         }
         lqw.eq(bo.getAgentId() != null, AgentApply::getAgentId, bo.getAgentId());
@@ -235,17 +256,22 @@ public class AgentApplyServiceImpl implements IAgentApplyService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean audit(AgentApplyBo bo) {
-        if (AuditStatus.WAIT_AUDIT.getCode().equals(bo.getAuditStatus())) {
+        if (AuditStatus.WAIT_AUDIT.equals(bo.getAuditStatus())) {
             throw new ServiceException(AgentApplyExceptionEnum.AgentApply_STATUS_NOT_FINAL);
         }
-        if (AuditStatus.AUDIT_NOT_PASS.getCode().equals(bo.getAuditStatus()) && StringUtils.isEmpty(bo.getAuditResult())) {
+        if (AuditStatus.AUDIT_NOT_PASS.equals(bo.getAuditStatus()) && StringUtils.isEmpty(bo.getAuditResult())) {
             throw new ServiceException(AgentApplyExceptionEnum.AgentApply_RESULT_IS_NULL);
         }
         AgentApply agentApply = loadById(bo.getAgentApplyId(), true);
-        if (!AuditStatus.WAIT_AUDIT.getCode().equals(agentApply.getAuditStatus())) {
+        if (!AuditStatus.WAIT_AUDIT.equals(agentApply.getAuditStatus())) {
             throw new ServiceException(AgentApplyExceptionEnum.AgentApply_STATUS_NOT_WAIT_AUDIT);
         }
-        if (AuditStatus.AUDIT_PASS.getCode().equals(bo.getAuditStatus())) {
+        if (AgentLevel.PROVINCE_AGENT.equals(agentApply.getAgentLevel()) && !AgentAuditType.PLATFORM_AUDIT.equals(bo.getAuditType())) {
+            throw new ServiceException(AgentApplyExceptionEnum.AgentApply_AUDIT_TYPE_NOT_PROVINCE_AUDIT);
+        } else if (AgentLevel.COUNTY_AGENT.equals(agentApply.getAgentLevel()) && !AgentAuditType.PROVINCE_AUDIT.equals(bo.getAuditType())) {
+            throw new ServiceException(AgentApplyExceptionEnum.AgentApply_AUDIT_TYPE_NOT_COUNTY_AUDIT);
+        }
+        if (AuditStatus.AUDIT_PASS.equals(bo.getAuditStatus())) {
             AgentBo agentBo = BeanCopyUtils.copy(agentApply, AgentBo.class);
             agentService.insertByBo(agentBo);
             agentApply.setAgentId(agentBo.getAgentId());
@@ -259,4 +285,9 @@ public class AgentApplyServiceImpl implements IAgentApplyService {
         return true;
     }
 
+    @Override
+    public AgentApplyVo queryByUserId(Long userId) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<AgentApply>().eq(AgentApply::getUserId, userId).last("limit 1"));
+    }
+
 }

+ 96 - 12
ruoyi-agent/src/main/java/com/ruoyi/agent/service/impl/AgentServiceImpl.java

@@ -2,11 +2,15 @@ package com.ruoyi.agent.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONArray;
 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.junziqian.sdk.bean.req.sign.ext.SignatoryReq;
 import com.ruoyi.agent.domain.Agent;
+import com.ruoyi.agent.domain.bo.AgentBalanceRecordBo;
 import com.ruoyi.agent.domain.bo.AgentBo;
+import com.ruoyi.agent.domain.bo.AgentChangeBalanceBo;
 import com.ruoyi.agent.domain.vo.AgentAmountStatisticsVo;
 import com.ruoyi.agent.domain.vo.AgentVo;
 import com.ruoyi.agent.enums.AgentLevel;
@@ -20,18 +24,24 @@ import com.ruoyi.agent.service.IAgentService;
 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.ExceptionEnum;
 import com.ruoyi.common.enums.InviteType;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanCopyUtils;
 import com.ruoyi.common.utils.ShareCodeUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.tool.service.ApplySignService;
+import com.ruoyi.info.base.domain.vo.PlatformInfoVo;
+import com.ruoyi.info.base.service.IPlatformInfoService;
+import com.ruoyi.tool.service.JzqService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -47,9 +57,10 @@ import java.util.stream.Collectors;
 public class AgentServiceImpl implements IAgentService {
 
     private final AgentMapper baseMapper;
-    private final ApplySignService applySignService;
+    private final JzqService jzqService;
     private final IAgentBalanceRecordService agentBalanceRecordService;
     private final IAgentAccountCodeService agentAccountCodeService;
+    private final IPlatformInfoService platformInfoService;
     @Lazy
     @Resource
     private IBusinessService businessService;
@@ -157,16 +168,16 @@ public class AgentServiceImpl implements IAgentService {
         //生成邀请码
         String inviteCode = ShareCodeUtils.idToCode(Long.parseLong(add.getPhone()));
         add.setInviteCode(InviteType.AGENT.getCode() + inviteCode);
-        //签合同
-        Boolean signFlag = applySignService.uploadPersSign(bo.getIdCard(), bo.getSignImage());
-        if(!signFlag){
-            throw new ServiceException(AgentExceptionEnum.Agent_SIGN_FAIL);
-        }
-        String contractNo = applySignService.applySign();
-        if (StringUtils.isEmpty(contractNo)) {
-            throw new ServiceException(AgentExceptionEnum.Agent_SIGN_CONTRACT_FAIL);
-        }
-        add.setContractNo(contractNo);
+        //签合同 TODO
+//        Boolean signFlag = jzqService.uploadPersSign(bo.getIdCard(), bo.getSignImage());
+//        if(!signFlag){
+//            throw new ServiceException(AgentExceptionEnum.Agent_SIGN_FAIL);
+//        }
+//        String contractNo = jzqService.applySign(buildSignatories(add));
+//        if (StringUtils.isEmpty(contractNo)) {
+//            throw new ServiceException(AgentExceptionEnum.Agent_SIGN_CONTRACT_FAIL);
+//        }
+//        add.setContractNo(contractNo);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setAgentId(add.getAgentId());
@@ -174,6 +185,41 @@ public class AgentServiceImpl implements IAgentService {
         return flag;
     }
 
+    private JSONArray buildSignatories(Agent agent) {
+        /**
+         * 签约方1(个人)
+         */
+        JSONArray signatories = new JSONArray();
+        SignatoryReq sReq = new SignatoryReq();
+        sReq.setFullName(agent.getRealName()); //姓名
+        sReq.setIdentityType(1); //证件类型
+        sReq.setIdentityCard(agent.getIdCard());//身份证号
+        sReq.setMobile(agent.getPhone()); //手机号
+        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;
+    }
+
     /**
      * 修改代理
      *
@@ -273,4 +319,42 @@ public class AgentServiceImpl implements IAgentService {
         return null;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeAgentBalance(AgentChangeBalanceBo bo) {
+        Agent agent = loadById(bo.getAgentId(), true);
+        BigDecimal entryValue = bo.getEntryValue();
+        if (entryValue.compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        BigDecimal balance = agent.getBalance();
+        if (bo.getIsAdd()) {
+            //收入
+            agent.setBalance(balance.add(entryValue));
+            agent.setTotalAmount(agent.getTotalAmount().add(entryValue));
+        } else {
+            //支出
+            BigDecimal subtract = balance.subtract(entryValue);
+            if (subtract.compareTo(BigDecimal.ZERO) < 0) {
+                throw new ServiceException(ExceptionEnum.AGENT_BALANCE_IS_LACK);
+            }
+            agent.setBalance(subtract);
+        }
+        this.baseMapper.updateById(agent);
+        //新增积分记录
+        AgentBalanceRecordBo recordBo = new AgentBalanceRecordBo();
+        recordBo.setAgentId(agent.getAgentId());
+        recordBo.setBillType(bo.getIsAdd() ? BillType.INNER : BillType.OUTER);
+        recordBo.setEntryValue(entryValue);
+        // 保存收入积分记录
+        recordBo.setEntryBeforeBalance(balance);
+        recordBo.setEntryAfterBalance(agent.getBalance());
+        recordBo.setCreateTime(new Date());
+        recordBo.setSourceType(bo.getSourceType());
+        recordBo.setSourceId(bo.getSourceId());
+        recordBo.setSourceCode(bo.getSourceCode());
+        recordBo.setRemark(bo.getRemark());
+        agentBalanceRecordService.insertByBo(recordBo);
+    }
+
 }

+ 3 - 5
ruoyi-api/src/main/java/com/ruoyi/api/controller/shop/ApiAgentApplyController.java

@@ -49,11 +49,9 @@ public class ApiAgentApplyController extends AbstractApiController {
      * 获取代理申请详细信息
      */
     @ApiOperation("获取代理申请详细信息")
-    @GetMapping("/info/{agentApplyId}")
-    public R<AgentApplyVo> getInfo(@ApiParam("主键")
-                                                  @NotNull(message = "主键不能为空")
-                                                  @PathVariable("agentApplyId") Long agentApplyId) {
-        return R.ok(iAgentApplyService.queryById(agentApplyId));
+    @GetMapping("/info")
+    public R<AgentApplyVo> getInfo() {
+        return R.ok(iAgentApplyService.queryByUserId(getUserId(true)));
     }
 
     /**

+ 1 - 1
ruoyi-common/src/main/java/com/ruoyi/common/enums/ExceptionEnum.java

@@ -18,7 +18,7 @@ public enum ExceptionEnum implements IIntegerEnum{
     SAVE_DATA_IS_NULL(100010, "保存数据不能为空"),
     USER_INTEGRAL_IS_LACK(100091, "用户积分不足"),
     USER_BALANCE_IS_LACK(100092, "用户余额不足"),
-    ;
+    AGENT_BALANCE_IS_LACK(100093, "代理余额不足");
 
     private Integer code;
     private String msg;

+ 4 - 0
ruoyi-info/pom.xml

@@ -27,6 +27,10 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>ruoyi-system</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-tool</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 132 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/domain/PlatformInfo.java

@@ -0,0 +1,132 @@
+package com.ruoyi.info.base.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 平台信息管理对象 tb_platform_info
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+@Data
+@TableName("tb_platform_info")
+public class PlatformInfo extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Integer id;
+    /**
+     * 企业全称
+     */
+    private String enterpriseFullName;
+    /**
+     * 企业简称
+     */
+    private String enterpriseAbbreviation;
+    /**
+     * 统一社会信用代码
+     */
+    private String uscCode;
+    /**
+     * 企业类型
+     */
+    private String enterpriseType;
+    /**
+     * 成立日期
+     */
+    private Date establishmentDate;
+    /**
+     * 注册地址
+     */
+    private String registeredAddress;
+    /**
+     * 营业期限开始日期
+     */
+    private Date businessTermStart;
+    /**
+     * 营业期限结束日期
+     */
+    private Date businessTermEnd;
+    /**
+     * 邮箱
+     */
+    private String email;
+    /**
+     * 营业执照图片
+     */
+    private String businessLicenseImg;
+    /**
+     * 身份证正面照片URL
+     */
+    private String idCardFrontUrl;
+    /**
+     * 身份证反面照片URL
+     */
+    private String idCardBackUrl;
+    /**
+     * 法人姓名
+     */
+    private String legalPersonName;
+    /**
+     * 身份证号码
+     */
+    private String idCardNumber;
+    /**
+     * 身份证有效期开始日期
+     */
+    private Date idCardValidStart;
+    /**
+     * 身份证有效期结束日期
+     */
+    private Date idCardValidEnd;
+    /**
+     * 开户人姓名
+     */
+    private String accountHolderName;
+    /**
+     * 开户行名称
+     */
+    private String bankName;
+    /**
+     * 银行卡号
+     */
+    private String bankCardNumber;
+    /**
+     * 支行名称
+     */
+    private String subBranchName;
+    /**
+     * 第三方收款商户ID
+     */
+    private String thirdMerchantId;
+    /**
+     * 平台公章图片URL
+     */
+    private String platformSealUrl;
+    /**
+     * 法人私章图片URL
+     */
+    private String legalPersonSealUrl;
+    /**
+     * 合同签署人
+     */
+    private String contractSigner;
+    /**
+     * 签署人手机号
+     */
+    private String signerMobile;
+
+}

+ 67 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/domain/RevenueSharingConfig.java

@@ -0,0 +1,67 @@
+package com.ruoyi.info.base.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.math.BigDecimal;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 平台分账配置对象 tb_revenue_sharing_config
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+@Data
+@TableName("tb_revenue_sharing_config")
+public class RevenueSharingConfig extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Integer id;
+    /**
+     * 省级分直系店铺到店支付收益  单位%
+     */
+    private BigDecimal provinceBusinessRatio;
+    /**
+     * 省级分下级代理店铺支付收益  单位%
+     */
+    private BigDecimal provinceRegionRatio;
+    /**
+     * 地代分直系店铺到店支付收益 单位%
+     */
+    private BigDecimal regionBusinessRatio;
+    /**
+     * 店铺结算手续费 单位%
+     */
+    private BigDecimal businessWithdrawRatio;
+    /**
+     * 代理提现手续费 单位%
+     */
+    private BigDecimal agentWithdrawRatio;
+    /**
+     * 用户提现手续费 单位%
+     */
+    private BigDecimal userWithdrawRatio;
+    /**
+     * 扫码订单服务费 单位%
+     */
+    private BigDecimal onlineOrderServiceFeeRatio;
+    /**
+     * 商城订单服务费 单位%
+     */
+    private BigDecimal orderServiceFeeRatio;
+    /**
+     * 扫码订单用户年累计消费额度限制
+     */
+    private BigDecimal onlineOrderUserYearConsumptionLimit;
+
+}

+ 215 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/domain/bo/PlatformInfoBo.java

@@ -0,0 +1,215 @@
+package com.ruoyi.info.base.domain.bo;
+
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.filepathsplicing.FilePathValue;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 平台信息管理业务对象 tb_platform_info
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("平台信息管理业务对象")
+public class PlatformInfoBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @ApiModelProperty(value = "", required = true)
+    private Integer id;
+
+    /**
+     * 企业全称
+     */
+    @ApiModelProperty(value = "企业全称", required = true)
+    @NotBlank(message = "企业全称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String enterpriseFullName;
+
+    /**
+     * 企业简称
+     */
+    @ApiModelProperty(value = "企业简称", required = true)
+    @NotBlank(message = "企业简称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String enterpriseAbbreviation;
+
+    /**
+     * 统一社会信用代码
+     */
+    @ApiModelProperty(value = "统一社会信用代码", required = true)
+    @NotBlank(message = "统一社会信用代码不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String uscCode;
+
+    /**
+     * 企业类型
+     */
+    @ApiModelProperty(value = "企业类型", required = true)
+    @NotBlank(message = "企业类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String enterpriseType;
+
+    /**
+     * 成立日期
+     */
+    @ApiModelProperty(value = "成立日期", required = true)
+    @NotNull(message = "成立日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date establishmentDate;
+
+    /**
+     * 注册地址
+     */
+    @ApiModelProperty(value = "注册地址", required = true)
+    @NotBlank(message = "注册地址不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String registeredAddress;
+
+    /**
+     * 营业期限开始日期
+     */
+    @ApiModelProperty(value = "营业期限开始日期", required = true)
+    @NotNull(message = "营业期限开始日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date businessTermStart;
+
+    /**
+     * 营业期限结束日期
+     */
+    @ApiModelProperty(value = "营业期限结束日期", required = true)
+    @NotNull(message = "营业期限结束日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date businessTermEnd;
+
+    /**
+     * 邮箱
+     */
+    @ApiModelProperty(value = "邮箱", required = true)
+    private String email;
+
+    /**
+     * 营业执照图片
+     */
+    @FilePathValue
+    @ApiModelProperty(value = "营业执照图片", required = true)
+    @NotBlank(message = "营业执照图片不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String businessLicenseImg;
+
+    /**
+     * 身份证正面照片URL
+     */
+    @FilePathValue
+    @ApiModelProperty(value = "身份证正面照片URL", required = true)
+    @NotBlank(message = "身份证正面照片URL不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String idCardFrontUrl;
+
+    /**
+     * 身份证反面照片URL
+     */
+    @FilePathValue
+    @ApiModelProperty(value = "身份证反面照片URL", required = true)
+    @NotBlank(message = "身份证反面照片URL不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String idCardBackUrl;
+
+    /**
+     * 法人姓名
+     */
+    @ApiModelProperty(value = "法人姓名", required = true)
+    @NotBlank(message = "法人姓名不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String legalPersonName;
+
+    /**
+     * 身份证号码
+     */
+    @ApiModelProperty(value = "身份证号码", required = true)
+    @NotBlank(message = "身份证号码不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String idCardNumber;
+
+    /**
+     * 身份证有效期开始日期
+     */
+    @ApiModelProperty(value = "身份证有效期开始日期", required = true)
+    @NotNull(message = "身份证有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date idCardValidStart;
+
+    /**
+     * 身份证有效期结束日期
+     */
+    @ApiModelProperty(value = "身份证有效期结束日期", required = true)
+    @NotNull(message = "身份证有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date idCardValidEnd;
+
+    /**
+     * 开户人姓名
+     */
+    @ApiModelProperty(value = "开户人姓名", required = true)
+    @NotBlank(message = "开户人姓名不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String accountHolderName;
+
+    /**
+     * 开户行名称
+     */
+    @ApiModelProperty(value = "开户行名称", required = true)
+    @NotBlank(message = "开户行名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String bankName;
+
+    /**
+     * 银行卡号
+     */
+    @ApiModelProperty(value = "银行卡号", required = true)
+    @NotBlank(message = "银行卡号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String bankCardNumber;
+
+    /**
+     * 支行名称
+     */
+    @ApiModelProperty(value = "支行名称", required = true)
+    @NotBlank(message = "支行名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String subBranchName;
+
+    /**
+     * 第三方收款商户ID
+     */
+    @ApiModelProperty(value = "第三方收款商户ID", required = true)
+    @NotBlank(message = "第三方收款商户ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String thirdMerchantId;
+
+    /**
+     * 平台公章图片URL
+     */
+    @FilePathValue
+    @ApiModelProperty(value = "平台公章图片URL", required = true)
+    @NotBlank(message = "平台公章图片URL不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String platformSealUrl;
+
+    /**
+     * 法人私章图片URL
+     */
+    @FilePathValue
+    @ApiModelProperty(value = "法人私章图片URL", required = true)
+    @NotBlank(message = "法人私章图片URL不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String legalPersonSealUrl;
+
+    /**
+     * 合同签署人
+     */
+    @ApiModelProperty(value = "合同签署人", required = true)
+    @NotBlank(message = "合同签署人不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String contractSigner;
+
+    /**
+     * 签署人手机号
+     */
+    @ApiModelProperty(value = "签署人手机号", required = true)
+    @NotBlank(message = "签署人手机号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String signerMobile;
+
+
+}

+ 97 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/domain/bo/RevenueSharingConfigBo.java

@@ -0,0 +1,97 @@
+package com.ruoyi.info.base.domain.bo;
+
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import java.math.BigDecimal;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 平台分账配置业务对象 tb_revenue_sharing_config
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("平台分账配置业务对象")
+public class RevenueSharingConfigBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @ApiModelProperty(value = "", required = true)
+    private Integer id;
+
+    /**
+     * 省级分直系店铺到店支付收益  单位%
+     */
+    @ApiModelProperty(value = "省级分直系店铺到店支付收益  单位%", required = true)
+    @NotNull(message = "省级分直系店铺到店支付收益  单位%不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal provinceBusinessRatio;
+
+    /**
+     * 省级分下级代理店铺支付收益  单位%
+     */
+    @ApiModelProperty(value = "省级分下级代理店铺支付收益  单位%", required = true)
+    @NotNull(message = "省级分下级代理店铺支付收益  单位%不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal provinceRegionRatio;
+
+    /**
+     * 地代分直系店铺到店支付收益 单位%
+     */
+    @ApiModelProperty(value = "地代分直系店铺到店支付收益 单位%", required = true)
+    @NotNull(message = "地代分直系店铺到店支付收益 单位%不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal regionBusinessRatio;
+
+    /**
+     * 店铺结算手续费 单位%
+     */
+    @ApiModelProperty(value = "店铺结算手续费 单位%", required = true)
+    @NotNull(message = "店铺结算手续费 单位%不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal businessWithdrawRatio;
+
+    /**
+     * 代理提现手续费 单位%
+     */
+    @ApiModelProperty(value = "代理提现手续费 单位%", required = true)
+    @NotNull(message = "代理提现手续费 单位%不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal agentWithdrawRatio;
+
+    /**
+     * 用户提现手续费 单位%
+     */
+    @ApiModelProperty(value = "用户提现手续费 单位%", required = true)
+    @NotNull(message = "用户提现手续费 单位%不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal userWithdrawRatio;
+
+    /**
+     * 扫码订单服务费 单位%
+     */
+    @ApiModelProperty(value = "扫码订单服务费 单位%", required = true)
+    @NotNull(message = "扫码订单服务费 单位%不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal onlineOrderServiceFeeRatio;
+
+    /**
+     * 商城订单服务费 单位%
+     */
+    @ApiModelProperty(value = "商城订单服务费 单位%", required = true)
+    @NotNull(message = "商城订单服务费 单位%不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal orderServiceFeeRatio;
+
+    /**
+     * 扫码订单用户年累计消费额度限制
+     */
+    @ApiModelProperty(value = "扫码订单用户年累计消费额度限制", required = true)
+    @NotNull(message = "扫码订单用户年累计消费额度限制不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal onlineOrderUserYearConsumptionLimit;
+
+
+}

+ 217 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/domain/vo/PlatformInfoVo.java

@@ -0,0 +1,217 @@
+package com.ruoyi.info.base.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import com.ruoyi.common.filepathsplicing.FilePathValue;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 平台信息管理视图对象 tb_platform_info
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+@Data
+@ApiModel("平台信息管理视图对象")
+@ExcelIgnoreUnannotated
+public class PlatformInfoVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    @ApiModelProperty("")
+    private Integer id;
+
+    /**
+     * 企业全称
+     */
+    @ExcelProperty(value = "企业全称")
+    @ApiModelProperty("企业全称")
+    private String enterpriseFullName;
+
+    /**
+     * 企业简称
+     */
+    @ExcelProperty(value = "企业简称")
+    @ApiModelProperty("企业简称")
+    private String enterpriseAbbreviation;
+
+    /**
+     * 统一社会信用代码
+     */
+    @ExcelProperty(value = "统一社会信用代码")
+    @ApiModelProperty("统一社会信用代码")
+    private String uscCode;
+
+    /**
+     * 企业类型
+     */
+    @ExcelProperty(value = "企业类型")
+    @ApiModelProperty("企业类型")
+    private String enterpriseType;
+
+    /**
+     * 成立日期
+     */
+    @ExcelProperty(value = "成立日期")
+    @ApiModelProperty("成立日期")
+    private Date establishmentDate;
+
+    /**
+     * 注册地址
+     */
+    @ExcelProperty(value = "注册地址")
+    @ApiModelProperty("注册地址")
+    private String registeredAddress;
+
+    /**
+     * 营业期限开始日期
+     */
+    @ExcelProperty(value = "营业期限开始日期")
+    @ApiModelProperty("营业期限开始日期")
+    private Date businessTermStart;
+
+    /**
+     * 营业期限结束日期
+     */
+    @ExcelProperty(value = "营业期限结束日期")
+    @ApiModelProperty("营业期限结束日期")
+    private Date businessTermEnd;
+
+    /**
+     * 邮箱
+     */
+    @ExcelProperty(value = "邮箱")
+    @ApiModelProperty("邮箱")
+    private String email;
+
+    /**
+     * 营业执照图片
+     */
+    @FilePathValue
+    @ExcelProperty(value = "营业执照图片")
+    @ApiModelProperty("营业执照图片")
+    private String businessLicenseImg;
+
+    /**
+     * 身份证正面照片URL
+     */
+    @FilePathValue
+    @ExcelProperty(value = "身份证正面照片URL")
+    @ApiModelProperty("身份证正面照片URL")
+    private String idCardFrontUrl;
+
+    /**
+     * 身份证反面照片URL
+     */
+    @FilePathValue
+    @ExcelProperty(value = "身份证反面照片URL")
+    @ApiModelProperty("身份证反面照片URL")
+    private String idCardBackUrl;
+
+    /**
+     * 法人姓名
+     */
+    @ExcelProperty(value = "法人姓名")
+    @ApiModelProperty("法人姓名")
+    private String legalPersonName;
+
+    /**
+     * 身份证号码
+     */
+    @ExcelProperty(value = "身份证号码")
+    @ApiModelProperty("身份证号码")
+    private String idCardNumber;
+
+    /**
+     * 身份证有效期开始日期
+     */
+    @ExcelProperty(value = "身份证有效期开始日期")
+    @ApiModelProperty("身份证有效期开始日期")
+    private Date idCardValidStart;
+
+    /**
+     * 身份证有效期结束日期
+     */
+    @ExcelProperty(value = "身份证有效期结束日期")
+    @ApiModelProperty("身份证有效期结束日期")
+    private Date idCardValidEnd;
+
+    /**
+     * 开户人姓名
+     */
+    @ExcelProperty(value = "开户人姓名")
+    @ApiModelProperty("开户人姓名")
+    private String accountHolderName;
+
+    /**
+     * 开户行名称
+     */
+    @ExcelProperty(value = "开户行名称")
+    @ApiModelProperty("开户行名称")
+    private String bankName;
+
+    /**
+     * 银行卡号
+     */
+    @ExcelProperty(value = "银行卡号")
+    @ApiModelProperty("银行卡号")
+    private String bankCardNumber;
+
+    /**
+     * 支行名称
+     */
+    @ExcelProperty(value = "支行名称")
+    @ApiModelProperty("支行名称")
+    private String subBranchName;
+
+    /**
+     * 第三方收款商户ID
+     */
+    @ExcelProperty(value = "第三方收款商户ID")
+    @ApiModelProperty("第三方收款商户ID")
+    private String thirdMerchantId;
+
+    /**
+     * 平台公章图片URL
+     */
+    @FilePathValue
+    @ExcelProperty(value = "平台公章图片URL")
+    @ApiModelProperty("平台公章图片URL")
+    private String platformSealUrl;
+
+    /**
+     * 法人私章图片URL
+     */
+    @FilePathValue
+    @ExcelProperty(value = "法人私章图片URL")
+    @ApiModelProperty("法人私章图片URL")
+    private String legalPersonSealUrl;
+
+    /**
+     * 合同签署人
+     */
+    @ExcelProperty(value = "合同签署人")
+    @ApiModelProperty("合同签署人")
+    private String contractSigner;
+
+    /**
+     * 签署人手机号
+     */
+    @ExcelProperty(value = "签署人手机号")
+    @ApiModelProperty("签署人手机号")
+    private String signerMobile;
+
+
+}

+ 98 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/domain/vo/RevenueSharingConfigVo.java

@@ -0,0 +1,98 @@
+package com.ruoyi.info.base.domain.vo;
+
+import java.math.BigDecimal;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 平台分账配置视图对象 tb_revenue_sharing_config
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+@Data
+@ApiModel("平台分账配置视图对象")
+@ExcelIgnoreUnannotated
+public class RevenueSharingConfigVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @ExcelProperty(value = "")
+    @ApiModelProperty("")
+    private Integer id;
+
+    /**
+     * 省级分直系店铺到店支付收益  单位%
+     */
+    @ExcelProperty(value = "省级分直系店铺到店支付收益  单位%")
+    @ApiModelProperty("省级分直系店铺到店支付收益  单位%")
+    private BigDecimal provinceBusinessRatio;
+
+    /**
+     * 省级分下级代理店铺支付收益  单位%
+     */
+    @ExcelProperty(value = "省级分下级代理店铺支付收益  单位%")
+    @ApiModelProperty("省级分下级代理店铺支付收益  单位%")
+    private BigDecimal provinceRegionRatio;
+
+    /**
+     * 地代分直系店铺到店支付收益 单位%
+     */
+    @ExcelProperty(value = "地代分直系店铺到店支付收益 单位%")
+    @ApiModelProperty("地代分直系店铺到店支付收益 单位%")
+    private BigDecimal regionBusinessRatio;
+
+    /**
+     * 店铺结算手续费 单位%
+     */
+    @ExcelProperty(value = "店铺结算手续费 单位%")
+    @ApiModelProperty("店铺结算手续费 单位%")
+    private BigDecimal businessWithdrawRatio;
+
+    /**
+     * 代理提现手续费 单位%
+     */
+    @ExcelProperty(value = "代理提现手续费 单位%")
+    @ApiModelProperty("代理提现手续费 单位%")
+    private BigDecimal agentWithdrawRatio;
+
+    /**
+     * 用户提现手续费 单位%
+     */
+    @ExcelProperty(value = "用户提现手续费 单位%")
+    @ApiModelProperty("用户提现手续费 单位%")
+    private BigDecimal userWithdrawRatio;
+
+    /**
+     * 扫码订单服务费 单位%
+     */
+    @ExcelProperty(value = "扫码订单服务费 单位%")
+    @ApiModelProperty("扫码订单服务费 单位%")
+    private BigDecimal onlineOrderServiceFeeRatio;
+
+    /**
+     * 商城订单服务费 单位%
+     */
+    @ExcelProperty(value = "商城订单服务费 单位%")
+    @ApiModelProperty("商城订单服务费 单位%")
+    private BigDecimal orderServiceFeeRatio;
+
+    /**
+     * 扫码订单用户年累计消费额度限制
+     */
+    @ExcelProperty(value = "扫码订单用户年累计消费额度限制")
+    @ApiModelProperty("扫码订单用户年累计消费额度限制")
+    private BigDecimal onlineOrderUserYearConsumptionLimit;
+
+
+}

+ 53 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/exception/PlatformInfoExceptionEnum.java

@@ -0,0 +1,53 @@
+package com.ruoyi.info.base.exception;
+
+import com.ruoyi.common.enums.IIntegerEnum;
+import java.util.Objects;
+
+
+/**
+ * 异常枚举
+ */
+public enum PlatformInfoExceptionEnum implements IIntegerEnum {
+
+    // TODO 注意检查错误码,保证系统内唯一
+    PlatformInfo_IS_NOT_EXISTS(460001, "平台信息管理不存在"),
+
+    ;
+
+    private Integer code;
+
+    private String msg;
+
+    PlatformInfoExceptionEnum(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    @Override
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public static PlatformInfoExceptionEnum getByCode(int code, PlatformInfoExceptionEnum[] values) {
+        for (PlatformInfoExceptionEnum value : values) {
+            if (Objects.equals(code, value.getCode())) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+}

+ 53 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/exception/RevenueSharingConfigExceptionEnum.java

@@ -0,0 +1,53 @@
+package com.ruoyi.info.base.exception;
+
+import com.ruoyi.common.enums.IIntegerEnum;
+import java.util.Objects;
+
+
+/**
+ * 异常枚举
+ */
+public enum RevenueSharingConfigExceptionEnum implements IIntegerEnum {
+
+    // TODO 注意检查错误码,保证系统内唯一
+    RevenueSharingConfig_IS_NOT_EXISTS(470001, "平台分账配置不存在"),
+
+    ;
+
+    private Integer code;
+
+    private String msg;
+
+    RevenueSharingConfigExceptionEnum(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    @Override
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public static RevenueSharingConfigExceptionEnum getByCode(int code, RevenueSharingConfigExceptionEnum[] values) {
+        for (RevenueSharingConfigExceptionEnum value : values) {
+            if (Objects.equals(code, value.getCode())) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+}

+ 15 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/mapper/PlatformInfoMapper.java

@@ -0,0 +1,15 @@
+package com.ruoyi.info.base.mapper;
+
+import com.ruoyi.info.base.domain.PlatformInfo;
+import com.ruoyi.info.base.domain.vo.PlatformInfoVo;
+import com.ruoyi.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 平台信息管理Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+public interface PlatformInfoMapper extends BaseMapperPlus<PlatformInfoMapper, PlatformInfo, PlatformInfoVo> {
+
+}

+ 15 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/mapper/RevenueSharingConfigMapper.java

@@ -0,0 +1,15 @@
+package com.ruoyi.info.base.mapper;
+
+import com.ruoyi.info.base.domain.RevenueSharingConfig;
+import com.ruoyi.info.base.domain.vo.RevenueSharingConfigVo;
+import com.ruoyi.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 平台分账配置Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+public interface RevenueSharingConfigMapper extends BaseMapperPlus<RevenueSharingConfigMapper, RevenueSharingConfig, RevenueSharingConfigVo> {
+
+}

+ 80 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/service/IPlatformInfoService.java

@@ -0,0 +1,80 @@
+package com.ruoyi.info.base.service;
+
+import com.ruoyi.info.base.domain.PlatformInfo;
+import com.ruoyi.info.base.domain.vo.PlatformInfoVo;
+import com.ruoyi.info.base.domain.bo.PlatformInfoBo;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.domain.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 平台信息管理Service接口
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+public interface IPlatformInfoService {
+
+    /**
+     * 查询平台信息管理分页
+     *
+     * @param bo 平台信息管理
+     * @return 平台信息管理集合
+     */
+    TableDataInfo<PlatformInfoVo> queryPageList(PlatformInfoBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询平台信息管理列表
+     *
+     * @param bo 平台信息管理
+     * @return 平台信息管理集合
+     */
+    List<PlatformInfoVo> queryList(PlatformInfoBo bo);
+
+    /**
+     * 查询平台信息管理
+     *
+     * @param id 平台信息管理主键
+     * @return 平台信息管理
+     */
+    PlatformInfoVo queryById(Integer id);
+
+    /**
+     * 详情平台信息管理
+     *
+     * @param id 平台信息管理主键
+     * @return 平台信息管理
+     */
+    PlatformInfo loadById(Integer id, Boolean tw);
+
+    /**
+     * 新增平台信息管理
+     *
+     * @param bo 平台信息管理
+     * @return 结果
+     */
+    Boolean insertByBo(PlatformInfoBo bo);
+
+    /**
+     * 修改平台信息管理
+     *
+     * @param bo 平台信息管理
+     * @return 结果
+     */
+    Boolean updateByBo(PlatformInfoBo bo);
+
+    /**
+     * 校验并批量删除平台信息管理信息
+     *
+     * @param ids 需要删除的平台信息管理主键集合
+     * @param isValid 是否校验,true-删除前校验,false-不校验
+     * @return 结果
+     */
+    Boolean deleteWithValidByIds(Collection<Integer> ids, Boolean isValid);
+
+    PlatformInfoVo getInfo();
+
+    void organizationCreate();
+}

+ 78 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/service/IRevenueSharingConfigService.java

@@ -0,0 +1,78 @@
+package com.ruoyi.info.base.service;
+
+import com.ruoyi.info.base.domain.RevenueSharingConfig;
+import com.ruoyi.info.base.domain.vo.RevenueSharingConfigVo;
+import com.ruoyi.info.base.domain.bo.RevenueSharingConfigBo;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.domain.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 平台分账配置Service接口
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+public interface IRevenueSharingConfigService {
+
+    /**
+     * 查询平台分账配置分页
+     *
+     * @param bo 平台分账配置
+     * @return 平台分账配置集合
+     */
+    TableDataInfo<RevenueSharingConfigVo> queryPageList(RevenueSharingConfigBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询平台分账配置列表
+     *
+     * @param bo 平台分账配置
+     * @return 平台分账配置集合
+     */
+    List<RevenueSharingConfigVo> queryList(RevenueSharingConfigBo bo);
+
+    /**
+     * 查询平台分账配置
+     *
+     * @param id 平台分账配置主键
+     * @return 平台分账配置
+     */
+    RevenueSharingConfigVo queryById(Integer id);
+
+    /**
+     * 详情平台分账配置
+     *
+     * @param id 平台分账配置主键
+     * @return 平台分账配置
+     */
+    RevenueSharingConfig loadById(Integer id, Boolean tw);
+
+    /**
+     * 新增平台分账配置
+     *
+     * @param bo 平台分账配置
+     * @return 结果
+     */
+    Boolean insertByBo(RevenueSharingConfigBo bo);
+
+    /**
+     * 修改平台分账配置
+     *
+     * @param bo 平台分账配置
+     * @return 结果
+     */
+    Boolean updateByBo(RevenueSharingConfigBo bo);
+
+    /**
+     * 校验并批量删除平台分账配置信息
+     *
+     * @param ids 需要删除的平台分账配置主键集合
+     * @param isValid 是否校验,true-删除前校验,false-不校验
+     * @return 结果
+     */
+    Boolean deleteWithValidByIds(Collection<Integer> ids, Boolean isValid);
+
+    RevenueSharingConfigVo getInfo();
+}

+ 196 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/service/impl/PlatformInfoServiceImpl.java

@@ -0,0 +1,196 @@
+package com.ruoyi.info.base.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+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.exception.ServiceException;
+import com.ruoyi.common.utils.BeanCopyUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.info.base.domain.PlatformInfo;
+import com.ruoyi.info.base.domain.bo.PlatformInfoBo;
+import com.ruoyi.info.base.domain.vo.PlatformInfoVo;
+import com.ruoyi.info.base.exception.PlatformInfoExceptionEnum;
+import com.ruoyi.info.base.mapper.PlatformInfoMapper;
+import com.ruoyi.info.base.service.IPlatformInfoService;
+import com.ruoyi.tool.service.JzqService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 平台信息管理Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+@RequiredArgsConstructor
+@Service
+public class PlatformInfoServiceImpl implements IPlatformInfoService {
+
+    private final PlatformInfoMapper baseMapper;
+    private final JzqService jzqService;
+
+    /**
+     * 查询平台信息管理分页
+     *
+     * @param bo 平台信息管理
+     * @return 平台信息管理
+     */
+    @Override
+    public TableDataInfo<PlatformInfoVo> queryPageList(PlatformInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<PlatformInfo> lqw = buildQueryWrapper(bo);
+        Page<PlatformInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询平台信息管理列表
+     *
+     * @param bo 平台信息管理
+     * @return 平台信息管理
+     */
+    @Override
+    public List<PlatformInfoVo> queryList(PlatformInfoBo bo) {
+        LambdaQueryWrapper<PlatformInfo> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<PlatformInfo> buildQueryWrapper(PlatformInfoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<PlatformInfo> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getEnterpriseFullName()), PlatformInfo::getEnterpriseFullName, bo.getEnterpriseFullName());
+        lqw.eq(StringUtils.isNotBlank(bo.getEnterpriseAbbreviation()), PlatformInfo::getEnterpriseAbbreviation, bo.getEnterpriseAbbreviation());
+        lqw.eq(StringUtils.isNotBlank(bo.getUscCode()), PlatformInfo::getUscCode, bo.getUscCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getEnterpriseType()), PlatformInfo::getEnterpriseType, bo.getEnterpriseType());
+        lqw.eq(bo.getEstablishmentDate() != null, PlatformInfo::getEstablishmentDate, bo.getEstablishmentDate());
+        lqw.eq(StringUtils.isNotBlank(bo.getRegisteredAddress()), PlatformInfo::getRegisteredAddress, bo.getRegisteredAddress());
+        lqw.eq(bo.getBusinessTermStart() != null, PlatformInfo::getBusinessTermStart, bo.getBusinessTermStart());
+        lqw.eq(bo.getBusinessTermEnd() != null, PlatformInfo::getBusinessTermEnd, bo.getBusinessTermEnd());
+        lqw.eq(StringUtils.isNotBlank(bo.getEmail()), PlatformInfo::getEmail, bo.getEmail());
+        lqw.eq(StringUtils.isNotBlank(bo.getBusinessLicenseImg()), PlatformInfo::getBusinessLicenseImg, bo.getBusinessLicenseImg());
+        lqw.eq(StringUtils.isNotBlank(bo.getIdCardFrontUrl()), PlatformInfo::getIdCardFrontUrl, bo.getIdCardFrontUrl());
+        lqw.eq(StringUtils.isNotBlank(bo.getIdCardBackUrl()), PlatformInfo::getIdCardBackUrl, bo.getIdCardBackUrl());
+        lqw.like(StringUtils.isNotBlank(bo.getLegalPersonName()), PlatformInfo::getLegalPersonName, bo.getLegalPersonName());
+        lqw.eq(StringUtils.isNotBlank(bo.getIdCardNumber()), PlatformInfo::getIdCardNumber, bo.getIdCardNumber());
+        lqw.eq(bo.getIdCardValidStart() != null, PlatformInfo::getIdCardValidStart, bo.getIdCardValidStart());
+        lqw.eq(bo.getIdCardValidEnd() != null, PlatformInfo::getIdCardValidEnd, bo.getIdCardValidEnd());
+        lqw.like(StringUtils.isNotBlank(bo.getAccountHolderName()), PlatformInfo::getAccountHolderName, bo.getAccountHolderName());
+        lqw.like(StringUtils.isNotBlank(bo.getBankName()), PlatformInfo::getBankName, bo.getBankName());
+        lqw.eq(StringUtils.isNotBlank(bo.getBankCardNumber()), PlatformInfo::getBankCardNumber, bo.getBankCardNumber());
+        lqw.like(StringUtils.isNotBlank(bo.getSubBranchName()), PlatformInfo::getSubBranchName, bo.getSubBranchName());
+        lqw.eq(StringUtils.isNotBlank(bo.getThirdMerchantId()), PlatformInfo::getThirdMerchantId, bo.getThirdMerchantId());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformSealUrl()), PlatformInfo::getPlatformSealUrl, bo.getPlatformSealUrl());
+        lqw.eq(StringUtils.isNotBlank(bo.getLegalPersonSealUrl()), PlatformInfo::getLegalPersonSealUrl, bo.getLegalPersonSealUrl());
+        lqw.eq(StringUtils.isNotBlank(bo.getContractSigner()), PlatformInfo::getContractSigner, bo.getContractSigner());
+        lqw.eq(StringUtils.isNotBlank(bo.getSignerMobile()), PlatformInfo::getSignerMobile, bo.getSignerMobile());
+        return lqw;
+    }
+
+    /**
+     * 查询平台信息管理
+     *
+     * @param id 平台信息管理主键
+     * @return 平台信息管理
+     */
+    @Override
+    public PlatformInfoVo queryById(Integer id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 详情平台信息管理
+     *
+     * @param id 平台信息管理主键
+     * @return 平台信息管理
+     */
+    @Override
+    public PlatformInfo loadById(Integer id, Boolean tw){
+        PlatformInfo info = this.baseMapper.selectById(id);
+        if(ObjectUtil.isEmpty(info) && tw){
+            throw new ServiceException(PlatformInfoExceptionEnum.PlatformInfo_IS_NOT_EXISTS);
+        }
+        return info;
+    }
+
+    /**
+     * 新增平台信息管理
+     *
+     * @param bo 平台信息管理
+     * @return 结果
+     */
+    @Override
+    public Boolean insertByBo(PlatformInfoBo bo) {
+        PlatformInfoVo info = getInfo();
+        boolean flag;
+        if (ObjectUtil.isNull(info)) {
+            PlatformInfo add = BeanUtil.toBean(bo, PlatformInfo.class);
+            validEntityBeforeSave(add);
+            flag = baseMapper.insert(add) > 0;
+            if (flag) {
+                bo.setId(add.getId());
+            }
+        } else {
+            bo.setId(info.getId());
+
+            PlatformInfo update = BeanUtil.toBean(bo, PlatformInfo.class);
+            validEntityBeforeSave(update);
+            flag = baseMapper.updateById(update) > 0;
+        }
+        return flag;
+    }
+
+    /**
+     * 修改平台信息管理
+     *
+     * @param bo 平台信息管理
+     * @return 结果
+     */
+    @Override
+    public Boolean updateByBo(PlatformInfoBo bo) {
+        PlatformInfo platformInfo = baseMapper.selectById(bo.getId());
+        PlatformInfo update = BeanCopyUtils.copy(bo, platformInfo);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(PlatformInfo entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 批量删除平台信息管理
+     *
+     * @param ids 需要删除的平台信息管理主键
+     * @return 结果
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Integer> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    @Override
+    public PlatformInfoVo getInfo() {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<PlatformInfo>().last("limit 1"));
+    }
+
+    @Override
+    public void organizationCreate() {
+
+    }
+
+}

+ 172 - 0
ruoyi-info/src/main/java/com/ruoyi/info/base/service/impl/RevenueSharingConfigServiceImpl.java

@@ -0,0 +1,172 @@
+package com.ruoyi.info.base.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+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.exception.ServiceException;
+import com.ruoyi.common.utils.BeanCopyUtils;
+import com.ruoyi.info.base.domain.RevenueSharingConfig;
+import com.ruoyi.info.base.domain.bo.RevenueSharingConfigBo;
+import com.ruoyi.info.base.domain.vo.RevenueSharingConfigVo;
+import com.ruoyi.info.base.exception.RevenueSharingConfigExceptionEnum;
+import com.ruoyi.info.base.mapper.RevenueSharingConfigMapper;
+import com.ruoyi.info.base.service.IRevenueSharingConfigService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 平台分账配置Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-11-21
+ */
+@RequiredArgsConstructor
+@Service
+public class RevenueSharingConfigServiceImpl implements IRevenueSharingConfigService {
+
+    private final RevenueSharingConfigMapper baseMapper;
+
+    /**
+     * 查询平台分账配置分页
+     *
+     * @param bo 平台分账配置
+     * @return 平台分账配置
+     */
+    @Override
+    public TableDataInfo<RevenueSharingConfigVo> queryPageList(RevenueSharingConfigBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<RevenueSharingConfig> lqw = buildQueryWrapper(bo);
+        Page<RevenueSharingConfigVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询平台分账配置列表
+     *
+     * @param bo 平台分账配置
+     * @return 平台分账配置
+     */
+    @Override
+    public List<RevenueSharingConfigVo> queryList(RevenueSharingConfigBo bo) {
+        LambdaQueryWrapper<RevenueSharingConfig> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<RevenueSharingConfig> buildQueryWrapper(RevenueSharingConfigBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<RevenueSharingConfig> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getProvinceBusinessRatio() != null, RevenueSharingConfig::getProvinceBusinessRatio, bo.getProvinceBusinessRatio());
+        lqw.eq(bo.getProvinceRegionRatio() != null, RevenueSharingConfig::getProvinceRegionRatio, bo.getProvinceRegionRatio());
+        lqw.eq(bo.getRegionBusinessRatio() != null, RevenueSharingConfig::getRegionBusinessRatio, bo.getRegionBusinessRatio());
+        lqw.eq(bo.getBusinessWithdrawRatio() != null, RevenueSharingConfig::getBusinessWithdrawRatio, bo.getBusinessWithdrawRatio());
+        lqw.eq(bo.getAgentWithdrawRatio() != null, RevenueSharingConfig::getAgentWithdrawRatio, bo.getAgentWithdrawRatio());
+        lqw.eq(bo.getUserWithdrawRatio() != null, RevenueSharingConfig::getUserWithdrawRatio, bo.getUserWithdrawRatio());
+        lqw.eq(bo.getOnlineOrderServiceFeeRatio() != null, RevenueSharingConfig::getOnlineOrderServiceFeeRatio, bo.getOnlineOrderServiceFeeRatio());
+        lqw.eq(bo.getOrderServiceFeeRatio() != null, RevenueSharingConfig::getOrderServiceFeeRatio, bo.getOrderServiceFeeRatio());
+        lqw.eq(bo.getOnlineOrderUserYearConsumptionLimit() != null, RevenueSharingConfig::getOnlineOrderUserYearConsumptionLimit, bo.getOnlineOrderUserYearConsumptionLimit());
+        return lqw;
+    }
+
+    /**
+     * 查询平台分账配置
+     *
+     * @param id 平台分账配置主键
+     * @return 平台分账配置
+     */
+    @Override
+    public RevenueSharingConfigVo queryById(Integer id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 详情平台分账配置
+     *
+     * @param id 平台分账配置主键
+     * @return 平台分账配置
+     */
+    @Override
+    public RevenueSharingConfig loadById(Integer id, Boolean tw){
+        RevenueSharingConfig info = this.baseMapper.selectById(id);
+        if(ObjectUtil.isEmpty(info) && tw){
+            throw new ServiceException(RevenueSharingConfigExceptionEnum.RevenueSharingConfig_IS_NOT_EXISTS);
+        }
+        return info;
+    }
+
+    /**
+     * 新增平台分账配置
+     *
+     * @param bo 平台分账配置
+     * @return 结果
+     */
+    @Override
+    public Boolean insertByBo(RevenueSharingConfigBo bo) {
+        RevenueSharingConfigVo info = getInfo();
+        boolean flag;
+        if (ObjectUtil.isNull(info)) {
+            RevenueSharingConfig add = BeanUtil.toBean(bo, RevenueSharingConfig.class);
+            validEntityBeforeSave(add);
+            flag = baseMapper.insert(add) > 0;
+            if (flag) {
+                bo.setId(add.getId());
+            }
+        } else {
+            bo.setId(info.getId());
+
+            RevenueSharingConfig update = BeanUtil.toBean(bo, RevenueSharingConfig.class);
+            validEntityBeforeSave(update);
+            flag = baseMapper.updateById(update) > 0;
+        }
+        return flag;
+    }
+
+    /**
+     * 修改平台分账配置
+     *
+     * @param bo 平台分账配置
+     * @return 结果
+     */
+    @Override
+    public Boolean updateByBo(RevenueSharingConfigBo bo) {
+        RevenueSharingConfig revenueSharingConfig = baseMapper.selectById(bo.getId());
+        RevenueSharingConfig update = BeanCopyUtils.copy(bo, revenueSharingConfig);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(RevenueSharingConfig entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 批量删除平台分账配置
+     *
+     * @param ids 需要删除的平台分账配置主键
+     * @return 结果
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Integer> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    @Override
+    public RevenueSharingConfigVo getInfo() {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<RevenueSharingConfig>().last("limit 1"));
+    }
+
+}

+ 41 - 0
ruoyi-info/src/main/resources/mapper/PlatformInfoMapper.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.info.base.mapper.PlatformInfoMapper">
+
+    <resultMap type="com.ruoyi.info.base.domain.PlatformInfo" id="PlatformInfoResult">
+        <result property="id" column="id"/>
+        <result property="enterpriseFullName" column="enterprise_full_name"/>
+        <result property="enterpriseAbbreviation" column="enterprise_abbreviation"/>
+        <result property="uscCode" column="usc_code"/>
+        <result property="enterpriseType" column="enterprise_type"/>
+        <result property="establishmentDate" column="establishment_date"/>
+        <result property="registeredAddress" column="registered_address"/>
+        <result property="businessTermStart" column="business_term_start"/>
+        <result property="businessTermEnd" column="business_term_end"/>
+        <result property="email" column="email"/>
+        <result property="businessLicenseImg" column="business_license_img"/>
+        <result property="idCardFrontUrl" column="id_card_front_url"/>
+        <result property="idCardBackUrl" column="id_card_back_url"/>
+        <result property="legalPersonName" column="legal_person_name"/>
+        <result property="idCardNumber" column="id_card_number"/>
+        <result property="idCardValidStart" column="id_card_valid_start"/>
+        <result property="idCardValidEnd" column="id_card_valid_end"/>
+        <result property="accountHolderName" column="account_holder_name"/>
+        <result property="bankName" column="bank_name"/>
+        <result property="bankCardNumber" column="bank_card_number"/>
+        <result property="subBranchName" column="sub_branch_name"/>
+        <result property="thirdMerchantId" column="third_merchant_id"/>
+        <result property="platformSealUrl" column="platform_seal_url"/>
+        <result property="legalPersonSealUrl" column="legal_person_seal_url"/>
+        <result property="contractSigner" column="contract_signer"/>
+        <result property="signerMobile" column="signer_mobile"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="updateBy" column="update_by"/>
+    </resultMap>
+
+
+</mapper>

+ 25 - 0
ruoyi-info/src/main/resources/mapper/RevenueSharingConfigMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.info.base.mapper.RevenueSharingConfigMapper">
+
+    <resultMap type="com.ruoyi.info.base.domain.RevenueSharingConfig" id="RevenueSharingConfigResult">
+        <result property="id" column="id"/>
+        <result property="provinceBusinessRatio" column="province_business_ratio"/>
+        <result property="provinceRegionRatio" column="province_region_ratio"/>
+        <result property="regionBusinessRatio" column="region_business_ratio"/>
+        <result property="businessWithdrawRatio" column="business_withdraw_ratio"/>
+        <result property="agentWithdrawRatio" column="agent_withdraw_ratio"/>
+        <result property="userWithdrawRatio" column="user_withdraw_ratio"/>
+        <result property="onlineOrderServiceFeeRatio" column="online_order_service_fee_ratio"/>
+        <result property="orderServiceFeeRatio" column="order_service_fee_ratio"/>
+        <result property="onlineOrderUserYearConsumptionLimit" column="online_order_user_year_consumption_limit"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="updateBy" column="update_by"/>
+    </resultMap>
+
+
+</mapper>

+ 0 - 107
ruoyi-tool/src/main/java/com/ruoyi/tool/service/ApplySignService.java

@@ -1,107 +0,0 @@
-package com.ruoyi.tool.service;
-
-import cn.hutool.json.JSONArray;
-import com.junziqian.sdk.bean.ResultInfo;
-import com.junziqian.sdk.bean.req.sign.ext.SignatoryReq;
-import com.junziqian.sdk.util.RequestUtils;
-import com.ruoyi.tool.config.JzqProperties;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.http.entity.mime.content.FileBody;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Base64;
-import java.util.HashMap;
-import java.util.Map;
-
-@Slf4j
-@Component
-public class ApplySignService {
-
-    @Resource
-    private JzqProperties jzqProperties;
-
-    /**
-     * 上传个人自定义印章图片
-     */
-    public Boolean uploadPersSign(String identityCard, String signImgFile) {
-        RequestUtils requestUtils = RequestUtils.init(jzqProperties.getBaseUrl(), jzqProperties.getAppKey(), jzqProperties.getAppSecret());
-        //构建请求参数
-        Map<String, Object> params = new HashMap<>();
-        params.put("identityCard", identityCard);
-        // 解码Base64
-        byte[] imageBytes = Base64.getDecoder().decode(signImgFile);
-        Path tempFile = null;
-        try {
-            tempFile = Files.createTempFile("sign", ".png");
-            Files.write(tempFile, imageBytes);
-            params.put("signImgFile", new FileBody(tempFile.toFile()));
-            ResultInfo<Void> ri = requestUtils.doPost(jzqProperties.getUploadPersSign(), params);
-            return ri.isSuccess();
-        } catch (Exception e) {
-            //不处理
-        } finally {
-            // 使用后删除临时文件(重要!)
-            if (tempFile != null) {
-                tempFile.toFile().deleteOnExit();
-            }
-        }
-        return false;
-    }
-
-    /**
-     * 签约发起-模板类API TODO 待完善
-     */
-    public String applySign() {
-        RequestUtils requestUtils = RequestUtils.init(jzqProperties.getBaseUrl(), jzqProperties.getAppKey(), jzqProperties.getAppSecret());
-        //构建请求参数
-        Map<String, Object> params = new HashMap<>();
-        params.put("contractName", "合同名称"); //合同名称
-        params.put("serverCa", 1); //使用云证书
-        params.put("fileType", 2);
-        params.put("templateNo", "00154");
-        params.put("templateParams", "{xx:xxx}");//可以传json_string:{xx:xxx}
-        params.put("positionType", 0); //指定签字位置类型(0签字坐标,1表单域,2关键字)
-
-        /**
-         * 签约方1(个人)
-         */
-        JSONArray signatories = new JSONArray();
-        SignatoryReq sReq = new SignatoryReq();
-        sReq.setFullName("测试"); //姓名
-        sReq.setIdentityType(1); //证件类型
-        sReq.setIdentityCard("500225xxxx");//身份证号
-        sReq.setMobile("186235xxx"); //手机号
-        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);
-
-        /**
-         * 签约方2(企业)
-         */
-        SignatoryReq eReq = new SignatoryReq();
-        eReq.setFullName("重庆小熊文化有限公司"); //企业姓名
-        eReq.setIdentityType(11); //证件类型
-        eReq.setIdentityCard("9999999XXXXX9");//营业执照号
-        eReq.setEmail("1XXXX@111.com"); //在君子签注册认证的邮箱
-        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);
-
-        params.put("signatories", signatories.toString());
-
-        ResultInfo<String> ri = requestUtils.doPost(jzqProperties.getApplySign(), params);
-        if (ri.isSuccess()) {
-            return ri.getData();
-        }
-        return null;
-    }
-}

+ 73 - 28
ruoyi-tool/src/main/java/com/ruoyi/tool/controller/JzqOcrController.java

@@ -1,37 +1,88 @@
-package com.ruoyi.tool.controller;
+package com.ruoyi.tool.service;
 
+import cn.hutool.json.JSONArray;
 import com.junziqian.sdk.bean.ResultInfo;
 import com.junziqian.sdk.util.RequestUtils;
-import com.ruoyi.common.core.domain.R;
 import com.ruoyi.tool.config.JzqProperties;
 import com.ruoyi.tool.request.OcrRequest;
 import com.ruoyi.tool.response.OcrBankResponse;
 import com.ruoyi.tool.response.OcrBusinessLicResponse;
 import com.ruoyi.tool.response.OcrIdentityResponse;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.entity.mime.content.FileBody;
+import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Base64;
 import java.util.HashMap;
 import java.util.Map;
 
-@Api("君子签")
-@RestController
-@RequestMapping("/jzq/ocr")
-@AllArgsConstructor
-public class JzqOcrController {
+@Slf4j
+@Component
+public class JzqService {
 
-    private final JzqProperties jzqProperties;
+    @Resource
+    private JzqProperties jzqProperties;
+
+    /**
+     * 上传个人自定义印章图片
+     */
+    public Boolean uploadPersSign(String identityCard, String signImgFile) {
+        RequestUtils requestUtils = RequestUtils.init(jzqProperties.getBaseUrl(), jzqProperties.getAppKey(), jzqProperties.getAppSecret());
+        //构建请求参数
+        Map<String, Object> params = new HashMap<>();
+        params.put("identityCard", identityCard);
+        // 解码Base64
+        String base64Data = signImgFile.split(",", 2)[1];
+        byte[] imageBytes = Base64.getDecoder().decode(base64Data);
+        Path tempFile = null;
+        try {
+            tempFile = Files.createTempFile("sign", ".png");
+            Files.write(tempFile, imageBytes);
+            params.put("signImgFile", new FileBody(tempFile.toFile()));
+            ResultInfo<Void> ri = requestUtils.doPost(jzqProperties.getUploadPersSign(), params);
+            log.info("上传个人自定义印章图片:{}", ri.getMsg());
+            return ri.isSuccess();
+        } catch (Exception e) {
+            //不处理
+        } finally {
+            // 使用后删除临时文件(重要!)
+            if (tempFile != null) {
+                tempFile.toFile().deleteOnExit();
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 签约发起-模板类API TODO 待完善
+     */
+    public String applySign(JSONArray signatories) {
+        RequestUtils requestUtils = RequestUtils.init(jzqProperties.getBaseUrl(), jzqProperties.getAppKey(), jzqProperties.getAppSecret());
+        //构建请求参数
+        Map<String, Object> params = new HashMap<>();
+        params.put("contractName", "合同名称"); //合同名称
+        params.put("serverCa", 1); //使用云证书
+        params.put("fileType", 2);
+        params.put("templateNo", "00154");
+        params.put("templateParams", "{xx:xxx}");//可以传json_string:{xx:xxx}
+        params.put("positionType", 0); //指定签字位置类型(0签字坐标,1表单域,2关键字)
+        params.put("signatories", signatories.toString());
+
+        ResultInfo<String> ri = requestUtils.doPost(jzqProperties.getApplySign(), params);
+        log.info("签约发起-模板类API:{}", ri.getMsg());
+        if (ri.isSuccess()) {
+            return ri.getData();
+        }
+        return null;
+    }
 
     /**
      * 身份证识别
      */
-    @ApiOperation("身份证识别")
-    @GetMapping("/idcard")
-    public R<OcrIdentityResponse> idcard(OcrRequest request) {
+    public OcrIdentityResponse idcard(OcrRequest request) {
         RequestUtils requestUtils = RequestUtils.init(jzqProperties.getBaseUrl(), jzqProperties.getAppKey(), jzqProperties.getAppSecret());
         //构建请求参数
         Map<String, Object> params = new HashMap<>();
@@ -54,15 +105,13 @@ public class JzqOcrController {
             response.setOverdueTime(data.get("overdueTime") != null ? data.get("overdueTime").toString() : null);
             response.setOrderNo(data.get("orderNo") != null ? data.get("orderNo").toString() : null);
         }
-        return R.ok(response);
+        return response;
     }
 
     /**
      * 银行卡识别
      */
-    @ApiOperation("银行卡识别")
-    @GetMapping("/bank")
-    public R<OcrBankResponse> bank(OcrRequest request) {
+    public OcrBankResponse bank(OcrRequest request) {
         RequestUtils requestUtils = RequestUtils.init(jzqProperties.getBaseUrl(), jzqProperties.getAppKey(), jzqProperties.getAppSecret());
         //构建请求参数
         Map<String, Object> params = new HashMap<>();
@@ -78,15 +127,13 @@ public class JzqOcrController {
             response.setOrderNo(data.get("orderNo") != null ? data.get("orderNo").toString() : null);
             response.setValidDate(data.get("validDate") != null ? data.get("validDate").toString() : null);
         }
-        return R.ok(response);
+        return response;
     }
 
     /**
      * 营业执照识别
      */
-    @ApiOperation("营业执照识别")
-    @GetMapping("/businessLic")
-    public R<OcrBusinessLicResponse> businessLic(OcrRequest request) {
+    public OcrBusinessLicResponse businessLic(OcrRequest request) {
         RequestUtils requestUtils = RequestUtils.init(jzqProperties.getBaseUrl(), jzqProperties.getAppKey(), jzqProperties.getAppSecret());
         //构建请求参数
         Map<String, Object> params = new HashMap<>();
@@ -104,8 +151,6 @@ public class JzqOcrController {
             response.setName(data.get("name") != null ? data.get("name").toString() : null);
             response.setValidity(data.get("validity") != null ? data.get("validity").toString() : null);
         }
-        return R.ok(response);
+        return response;
     }
-
 }
-