Quellcode durchsuchen

```
feat(profit-sharing): 新增分账功能及相关实体服务

新增分账记录表和分账详情表,包括对应的实体类、Mapper、Service 及 XML 配置文件。同时增加微信分账相关接口实现,如分账请求、结果查询、分账回退及回退结果查询。优化微信支付工具类 WechatPayV3Utils 中的 GET 请求方法与参数拼接逻辑。
调整 ReceiverAddForm 默认值及部分常量配置。
更新 sys_depart 表结构,添加商户相关信息字段。
完善 AppOrder 实体,新增分账订单号及微信分账单号字段。
```

wzq vor 3 Wochen
Ursprung
Commit
90afaaa5f2
21 geänderte Dateien mit 490 neuen und 28 gelöschten Zeilen
  1. 13 1
      national-motion-module-system/national-motion-system-biz/pom.xml
  2. 1 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/WeChatPayService.java
  3. 42 7
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/config/WechatPayV3Utils.java
  4. 4 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/config/WechatUrlConstants.java
  5. 2 2
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/entity/ReceiverAddForm.java
  6. 96 2
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/paytest/payController.java
  7. 23 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/routing/WeChatProfitSharingService.java
  8. 1 5
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/unionPay/UnionPayUtils.java
  9. 12 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppOrder.java
  10. 104 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppProfitSharingInfo.java
  11. 98 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppProfitSharingRecords.java
  12. 9 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppProfitSharingInfoMapper.java
  13. 10 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppProfitSharingRecordsMapper.java
  14. 4 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppProfitSharingInfoMapper.xml
  15. 4 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppProfitSharingRecordsMapper.xml
  16. 7 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppProfitSharingInfoService.java
  17. 7 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppProfitSharingRecordsService.java
  18. 11 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppProfitSharingInfoServiceImpl.java
  19. 11 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppProfitSharingRecordsServiceImpl.java
  20. 3 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepart.java
  21. 28 8
      updateSql.md

+ 13 - 1
national-motion-module-system/national-motion-system-biz/pom.xml

@@ -6,7 +6,19 @@
 		<artifactId>national-motion-module-system</artifactId>
 		<version>3.8.1</version>
 	</parent>
-	<modelVersion>4.0.0</modelVersion>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>14</source>
+                    <target>14</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <modelVersion>4.0.0</modelVersion>
 
 	<artifactId>national-motion-system-biz</artifactId>
 

+ 1 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/WeChatPayService.java

@@ -248,7 +248,7 @@ public class WeChatPayService {
         args.put("sp_mchid", WechatConstants.WECHAT_SP_MCH_ID);
         args.put("sub_mchid", WechatConstants.WECHAT_SUB_MCH_ID);
         url = url + "?" + WXPayUtility.urlEncode(args);
-        JSONObject res = wechatPayV3Utils.sendGet(url, null);
+        JSONObject res = wechatPayV3Utils.sendGet(url);
         return res ;
     }
 

+ 42 - 7
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/config/WechatPayV3Utils.java

@@ -25,11 +25,11 @@ import org.springframework.stereotype.Component;
 import javax.servlet.http.HttpServletRequest;
 import java.io.BufferedReader;
 import java.io.InputStream;
+import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.security.PrivateKey;
 import java.security.Signature;
-import java.util.Base64;
-import java.util.Locale;
+import java.util.*;
 
 /**
  * @author wangzhiqiang
@@ -167,7 +167,7 @@ public class WechatPayV3Utils {
      * @param url 请求地址 参数直接在地址上拼接
      * @return
      */
-    public JSONObject sendGet(String url,String urlSuffix) {
+    public JSONObject sendGet(String url) {
         try {
             if (httpClient == null) {
                 setHttpClient();
@@ -175,10 +175,7 @@ public class WechatPayV3Utils {
             URIBuilder uriBuilder = new URIBuilder(url);
             HttpGet httpGet = new HttpGet(uriBuilder.build());
             httpGet.addHeader("Accept", "application/json");
-
-            String authorization = SignUtils.authorization("GET", urlSuffix, WechatConstants.WECHAT_SP_MCH_ID, WechatConstants.WECHAT_MCH_SERIAL_NUM, "", WechatConstants.WECHAT_MCH_PRIVATE_KEY);
-
-            httpGet.addHeader("Authorization", authorization);
+            log.info("微信请求地址:" + httpGet.getURI());
             CloseableHttpResponse response = httpClient.execute(httpGet);
             String bodyAsString = EntityUtils.toString(response.getEntity());
             log.info("微信返回的内容:" + bodyAsString);
@@ -193,6 +190,44 @@ public class WechatPayV3Utils {
         }
     }
 
+    /**
+     *
+     * 遍历集合M,取出全部的参数key,将参数key字典序排列,根据排序后的参数key获取对应的value,将非空的参数key和参数value用"="拼接,多个参数之间用"&"拼接
+     *
+     * @param param   参数
+     * @return
+     */
+    public static String formatUrlParam(Map<String, String> param) {
+        String params = "";
+        try {
+            List<Map.Entry<String, String>> items = new ArrayList<>(param.entrySet());
+
+            //对所有传入的参数按照字段名从小到大排序
+            items.sort(Map.Entry.comparingByKey());
+
+            //构造URL 键值对的形式
+            StringBuffer sb = new StringBuffer();
+            for (Map.Entry<String, String> item : items) {
+                if (org.apache.commons.lang.StringUtils.isNotBlank(item.getKey())) {
+                    String key = item.getKey();
+                    String val = item.getValue();
+                    val = URLEncoder.encode(val, StandardCharsets.UTF_8);
+                    // 跳过空值参数
+                    if (val != null && !val.trim().isEmpty()) {
+                        if (sb.length() > 0) {
+                            sb.append("&");
+                        }
+                        sb.append(key).append("=").append(val);
+                    }
+                }
+            }
+            params = sb.toString().trim();
+        } catch (Exception e) {
+            return "";
+        }
+        return params;
+    }
+
     /**
      * 回调通知验签与解密
      *

+ 4 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/config/WechatUrlConstants.java

@@ -32,9 +32,12 @@ public class WechatUrlConstants {
     public final static String PAY_V3_PROFIT_SHARING = "https://api.mch.weixin.qq.com/v3/profitsharing/orders";
 
     //服务商 查询分账结果
-    public final static String PAY_V3_QUERY_PROFIT_SHARING = "https://api.mch.weixin.qq.com/v3/profitsharing/orders/";
+    public final static String PAY_V3_GET_PROFIT_SHARING = "https://api.mch.weixin.qq.com/v3/profitsharing/orders/";
 
     //服务商 请求分账回退
     public final static String PAY_V3_RETURN_ORDER = "https://api.mch.weixin.qq.com/v3/profitsharing/return-orders";
 
+    //服务商 请求分账回退查询
+    public final static String PAY_V3_GET_RETURN_ORDER = "https://api.mch.weixin.qq.com/v3/profitsharing/return-orders/";
+
 }

+ 2 - 2
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/entity/ReceiverAddForm.java

@@ -23,7 +23,7 @@ public class ReceiverAddForm implements Serializable {
     /**
      * 【子商户公众账号ID】子商户的公众账号ID,分账接收方类型包含PERSONAL_SUB_OPENID时必填。(直连商户不需要,服务商需要)
      */
-    private String sub_appid = WechatConstants.WECHAT_SUB_APPID;
+    private String sub_appid;
     /**
      * 【接收方类型】枚举值:
      * MERCHANT_ID:商户ID
@@ -68,5 +68,5 @@ public class ReceiverAddForm implements Serializable {
      * 当字段relation_type的值为CUSTOM时,本字段必填
      * 当字段relation_type的值不为CUSTOM时,本字段无需填写
      */
-    private String custom_relation;
+    private String custom_relation = "自定义商户";
 }

+ 96 - 2
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/paytest/payController.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.wechat.pay.java.core.certificate.CertificateDownloader;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
@@ -24,16 +25,19 @@ import org.jeecg.modules.pay.routing.WeChatProfitSharingService;
 import org.jeecg.modules.pay.serverPay.HttpClientUtil;
 import org.jeecg.modules.pay.serverPay.PayKit;
 import org.jeecg.modules.pay.serverPay.RsaKit;
+import org.jeecg.modules.pay.unionPay.UnionPayUtils;
 import org.jeecg.modules.system.app.entity.AppOrder;
 import org.jeecg.modules.system.app.service.IAppOrderService;
 import org.springframework.web.bind.annotation.*;
 
+import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.security.PrivateKey;
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 
 @Slf4j
@@ -136,6 +140,39 @@ public class payController {
         return "success";
     }
 
+    /**
+     * 获取分账结果
+     * @param out_order_no
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getResult")
+    public JSONObject getResult(@RequestParam("out_order_no") String out_order_no){
+        AppOrder appOrder = appOrderService.getOne(Wrappers.lambdaQuery(AppOrder.class).eq(AppOrder::getOrderCode, out_order_no).last("limit 1"));
+        HashMap<String, String> map = new HashMap<>();
+        map.put("sub_mchid", WechatConstants.WECHAT_SUB_MCH_ID);
+        map.put("transaction_id", appOrder.getTransactionId());
+
+        String params = WechatPayV3Utils.formatUrlParam(map);
+        try {
+            String url = WechatUrlConstants.PAY_V3_GET_PROFIT_SHARING + "P"+out_order_no + "?" + params;
+//            String url = "https://api.mch.weixin.qq.com/v3/profitsharing/orders/PD202509261128071344?sub_mchid=1726971843&transaction_id=4200002838202509266221070669";
+
+            JSONObject res = wechatPayV3Utils.sendGet(url);
+            log.info("微信服务商分账结果查询--------------------------------------------------wechatPay res:{}", res.toString());
+            return res;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 单次分账测试
+     * @param out_order_no
+     * @return
+     * @throws Exception
+     */
     @GetMapping(value = "/test1")
     public JSONObject test(@RequestParam("out_order_no") String out_order_no) throws Exception {
 
@@ -164,8 +201,9 @@ public class payController {
         profitSharingRequest
                 .setAppid(WechatConstants.WECHAT_SP_APPID)
                 .setSub_mchid(WechatConstants.WECHAT_SUB_MCH_ID)
-                .setTransaction_id("4200002835202509151465989607")
-                .setOut_order_no(out_order_no)
+                .setTransaction_id(appOrder.getTransactionId())
+//                .setOut_order_no(out_order_no)
+                .setOut_order_no("P"+out_order_no)
                 .setReceivers(receivers)
                 .setUnfreeze_unsplit(Boolean.TRUE);
         try {
@@ -177,6 +215,62 @@ public class payController {
         }
         return null;
     }
+
+    /**
+     * 请求分账回退
+     * @param out_order_no
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/returnOrder")
+    public JSONObject returnOrder(@RequestParam("out_order_no") String out_order_no) throws Exception {
+        AppOrder appOrder = appOrderService.getOne(Wrappers.lambdaQuery(AppOrder.class).eq(AppOrder::getOrderCode, out_order_no).last("limit 1"));
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("sub_mchid",WechatConstants.WECHAT_SUB_MCH_ID);
+        map.put("out_order_no ","P"+out_order_no);
+        map.put("order_id",appOrder.getProfitSharingOrderId());
+        map.put("out_return_no","T"+out_order_no);
+        map.put("return_mchid","1723757626");
+        map.put("amount",1);
+        map.put("description","帝释天退还");
+        try {
+            JSONObject res = wechatPayV3Utils.sendPost(WechatUrlConstants.PAY_V3_RETURN_ORDER, JSONObject.from(map));
+            log.info("微信服务商分账回退--------------------------------------------------wechatPay res:{}", res.toString());
+            return res;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 查询分账回退结果
+     * @param out_order_no
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getReturnOrder")
+    public JSONObject getReturnOrder(@RequestParam("out_order_no") String out_order_no) throws Exception {
+
+        HashMap<String, String> map = new HashMap<>();
+        map.put("sub_mchid", WechatConstants.WECHAT_SUB_MCH_ID);
+        map.put("out_order_no", "P" + out_order_no);
+
+        String params = WechatPayV3Utils.formatUrlParam(map);
+        try {
+            String url = WechatUrlConstants.PAY_V3_GET_RETURN_ORDER + "T" + out_order_no + "?" + params;
+//            String url = "https://api.mch.weixin.qq.com/v3/profitsharing/orders/TD202509261128071344?sub_mchid=1726971843&out_order_no=PD202509261128071344";
+
+            JSONObject res = wechatPayV3Utils.sendGet(url);
+            log.info("微信服务商分账结果查询--------------------------------------------------wechatPay res:{}", res.toString());
+            return res;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
     @GetMapping(value = "/test2")
     public void CertificateDownloaderTest() {
         //用于证书解密的密钥

+ 23 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/routing/WeChatProfitSharingService.java

@@ -1,10 +1,15 @@
 package org.jeecg.modules.pay.routing;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.modules.pay.config.WechatPayV3Utils;
 import org.jeecg.modules.pay.config.WechatUrlConstants;
 import org.jeecg.modules.pay.entity.ReceiverAddForm;
+import org.jeecg.modules.system.app.entity.AppOrder;
+import org.jeecg.modules.system.app.entity.AppProfitSharingRecords;
+import org.jeecg.modules.system.app.mapper.AppOrderMapper;
+import org.jeecg.modules.system.app.mapper.AppProfitSharingRecordsMapper;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 
@@ -28,8 +33,14 @@ public class WeChatProfitSharingService {
     @Resource
     private WechatPayV3Utils wechatPayV3Utils;
 
+    @Resource
+    private AppOrderMapper appOrderMapper;
+
+    @Resource
+    private AppProfitSharingRecordsMapper appProfitSharingRecordsMapper;
+
     /**
-     *  添加分账账号
+     *  添加分账接收方
      */
     public JSONObject receiversAdd(ReceiverAddForm receiverAddForm) throws Exception {
         ClassPathResource classPathResource = new ClassPathResource("cert/platform_cert.pem");
@@ -45,6 +56,17 @@ public class WeChatProfitSharingService {
         return body;
     }
 
+    public JSONObject profitSharing(String orderCode){
+        AppOrder appOrder = appOrderMapper.selectOne(Wrappers.lambdaQuery(AppOrder.class).eq(AppOrder::getOrderCode, orderCode).last(
+                "limit 1"));
+        //创建分账记录
+        AppProfitSharingRecords appProfitSharingRecords = new AppProfitSharingRecords();
+        appProfitSharingRecordsMapper.insert(appProfitSharingRecords);
+
+        //调用之后创建分账详情
+        return null;
+    }
+
     /**
      * 获取证书
      *

+ 1 - 5
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/pay/unionPay/UnionPayUtils.java

@@ -304,7 +304,6 @@ public class UnionPayUtils {
      */
     public static String formatUrlParam(Map<String, String> param) {
         String params = "";
-
         try {
             List<Map.Entry<String, String>> items = new ArrayList<>(param.entrySet());
 
@@ -328,10 +327,7 @@ public class UnionPayUtils {
                 }
             }
             // 删除末尾多余的&号和空格
-            params = sb.toString();
-            if (!params.isEmpty()) {
-                params = params.substring(0, params.length() - 1);
-            }
+            params = sb.toString().trim();
         } catch (Exception e) {
             return "";
         }

+ 12 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppOrder.java

@@ -118,6 +118,18 @@ public class AppOrder implements Serializable {
     @Schema(description = "transactionId")
     private String transactionId;
 
+    /**
+     * 商户分账订单号
+     */
+    @Schema(description = "outOrderNo")
+    private String outOrderNo;
+
+    /**
+     * 微信分账单号
+     */
+    @Schema(description = "微信分账单号")
+    private String profitSharingOrderId;
+
 	/**参赛资质*/
 	@Excel(name = "参赛资质", width = 15)
     @Schema(description = "参赛资质")

+ 104 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppProfitSharingInfo.java

@@ -0,0 +1,104 @@
+package org.jeecg.modules.system.app.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@TableName("nm_profit_sharing_info")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description = "分账记录表")
+public class AppProfitSharingInfo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "id")
+    private String id;
+
+    /**
+     * 分账记录ID
+     */
+    @Schema(description = "分账记录ID")
+    private String profitSharingRecordsId;
+
+    /**
+     * 订单ID
+     */
+    @Schema(description = "订单ID")
+    private String orderId;
+
+    /**
+     * 分账接收方所属组织
+     */
+    @Schema(description = "分账接收方所属组织")
+    private String orgCode;
+
+    /**
+     * 分账接收方所属组织
+     */
+    @Schema(description = "商户号")
+    private String mchId;
+
+    /**
+     * 分账接收方所属组织
+     */
+    @Schema(description = "商户全称")
+    private String mchName;
+
+
+    /**
+     * 分账比例
+     */
+    @Schema(description = "分账比例")
+    private BigDecimal ratio;
+
+    /**
+     * 分账金额(分)
+     */
+    @Schema(description = "分账金额(分)")
+    private Integer preAmount;
+
+    /**
+     * 实际分账金额(分)
+     */
+    @Schema(description = "实际分账金额(分)")
+    private Integer amount;
+
+    /**
+     * 分账状态
+     */
+    @Schema(description = "分账状态")
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    @Schema(description = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @Schema(description = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 逻辑删除标识(0-正常,1-已删除)
+     */
+    @Schema(description = "逻辑删除标识(0-正常,1-已删除)")
+    private Integer delFlag;
+}

+ 98 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppProfitSharingRecords.java

@@ -0,0 +1,98 @@
+package org.jeecg.modules.system.app.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("nm_profit_sharing_records")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description = "分账记录表")
+public class AppProfitSharingRecords implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "id")
+    private String id;
+
+    /**
+     * 分账单号
+     */
+    @Schema(description = "分账单号")
+    private String profitSharingNo;
+
+    /**
+     * 订单ID
+     */
+    @Schema(description = "订单ID")
+    private String orderId;
+
+
+    /**
+     * 订单原金额(分)
+     */
+    @Schema(description = "订单原金额(分)")
+    private Integer orderAmount;
+
+    /**
+     * 分账金额(分)
+     */
+    @Schema(description = "分账金额(分)")
+    private Integer amount;
+
+
+    /**
+     * 微信分账手续费(分)0.06%
+     */
+    @Schema(description = "微信分账手续费(分)0.06%")
+    private Integer procedureFee;
+
+    /**
+     * 分账状态
+     */
+    @Schema(description = "分账状态")
+    private Integer status;
+
+    /**
+     * 分账失败原因
+     */
+    @Schema(description = "分账失败原因")
+    private String failReason;
+
+    /**
+     * 分账时间
+     */
+    @Schema(description = "分账时间")
+    private Date profitSharingTime;
+
+    /**
+     * 创建时间
+     */
+    @Schema(description = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @Schema(description = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 逻辑删除标识(0-正常,1-已删除)
+     */
+    @Schema(description = "逻辑删除标识(0-正常,1-已删除)")
+    private Integer delFlag;
+}

+ 9 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppProfitSharingInfoMapper.java

@@ -0,0 +1,9 @@
+package org.jeecg.modules.system.app.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.jeecg.modules.system.app.entity.AppProfitSharingInfo;
+
+@Mapper
+public interface AppProfitSharingInfoMapper extends BaseMapper<AppProfitSharingInfo> {
+}

+ 10 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppProfitSharingRecordsMapper.java

@@ -0,0 +1,10 @@
+package org.jeecg.modules.system.app.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.jeecg.modules.system.app.entity.AppOrder;
+import org.jeecg.modules.system.app.entity.AppProfitSharingRecords;
+
+@Mapper
+public interface AppProfitSharingRecordsMapper extends BaseMapper<AppProfitSharingRecords> {
+}

+ 4 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppProfitSharingInfoMapper.xml

@@ -0,0 +1,4 @@
+<?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="org.jeecg.modules.system.app.mapper.AppProfitSharingInfoMapper">
+</mapper>

+ 4 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppProfitSharingRecordsMapper.xml

@@ -0,0 +1,4 @@
+<?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="org.jeecg.modules.system.app.mapper.AppProfitSharingRecordsMapper">
+</mapper>

+ 7 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppProfitSharingInfoService.java

@@ -0,0 +1,7 @@
+package org.jeecg.modules.system.app.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.system.app.entity.AppProfitSharingInfo;
+
+public interface IAppProfitSharingInfoService extends IService<AppProfitSharingInfo> {
+}

+ 7 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppProfitSharingRecordsService.java

@@ -0,0 +1,7 @@
+package org.jeecg.modules.system.app.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.system.app.entity.AppProfitSharingRecords;
+
+public interface IAppProfitSharingRecordsService extends IService<AppProfitSharingRecords> {
+}

+ 11 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppProfitSharingInfoServiceImpl.java

@@ -0,0 +1,11 @@
+package org.jeecg.modules.system.app.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.system.app.entity.AppProfitSharingInfo;
+import org.jeecg.modules.system.app.mapper.AppProfitSharingInfoMapper;
+import org.jeecg.modules.system.app.service.IAppProfitSharingInfoService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AppProfitSharingInfoServiceImpl extends ServiceImpl<AppProfitSharingInfoMapper, AppProfitSharingInfo> implements IAppProfitSharingInfoService {
+}

+ 11 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppProfitSharingRecordsServiceImpl.java

@@ -0,0 +1,11 @@
+package org.jeecg.modules.system.app.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.system.app.entity.AppProfitSharingRecords;
+import org.jeecg.modules.system.app.mapper.AppProfitSharingRecordsMapper;
+import org.jeecg.modules.system.app.service.IAppProfitSharingRecordsService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AppProfitSharingRecordsServiceImpl extends ServiceImpl<AppProfitSharingRecordsMapper, AppProfitSharingRecords> implements IAppProfitSharingRecordsService {
+}

+ 3 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepart.java

@@ -54,6 +54,9 @@ public class SysDepart implements Serializable {
 	/**机构编码*/
 	@Excel(name="机构编码",width=15)
 	private String orgCode;
+    /**系统商户类别(0-平台 1-商户 2-门店)*/
+    @Excel(name="系统商户类别(0-平台 1-商户 2-门店)",width=15)
+    private String systemType;
 	/**手机号*/
 	@Excel(name="手机号",width=15)
 	private String mobile;

+ 28 - 8
updateSql.md

@@ -1,25 +1,45 @@
 -----------------------------2025.9.19
 
-建表:(分账订单信息表)
+建表:(分账详情表)
 CREATE TABLE `nm_profit_sharing_info` (
 `id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
-`order_id` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单ID',
-`org_code` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商户所属组织',
+`profit_sharing_records_id` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '分账记录ID',
+`order_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单ID',
+`org_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '分账接收方所属组织',
 `mch_id` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商户号',
 `mch_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商户全称',
-`ratio` date DEFAULT NULL COMMENT '分账比例',
-`pre_amount` int NOT NULL COMMENT '应分账金额(分)',
-`amount` int DEFAULT NULL COMMENT '实际分账金额(分)',
-`status` int DEFAULT NULL COMMENT '分账状态(0-待分账 1-分账成功 2-分账失败)',
+`ratio` decimal(10,2) DEFAULT '0.00' COMMENT '分账比例',
+`pre_amount` int NOT NULL COMMENT '分账金额(分)',
+`amount` int DEFAULT NULL COMMENT '实际分账金额(分)',
+`status` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '分账状态',
+`create_time` datetime DEFAULT NULL COMMENT '创建时间',
+`update_time` datetime DEFAULT NULL COMMENT '修改时间',
+`del_flag` int DEFAULT NULL COMMENT '逻辑删除标识(0-正常,1-已删除)',
+PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='分账详情表';
+
+CREATE TABLE `nm_profit_sharing_records` (
+`id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
+`profit_sharing_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '分账单号',
+`order_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单ID',
+`order_amount` int NOT NULL COMMENT '订单原金额(分)',
+`amount` int DEFAULT NULL COMMENT '分账金额(分)',
+`procedure_fee` int DEFAULT NULL COMMENT '微信分账手续费(分)0.06%',
+`status` int DEFAULT NULL COMMENT '分账状态(0-处理中 1-分账完成 2-分账失败)',
+`fail_reason` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '分账失败原因',
 `profit_sharing_time` datetime DEFAULT NULL COMMENT '分账时间',
 `create_time` datetime DEFAULT NULL COMMENT '创建时间',
 `update_time` datetime DEFAULT NULL COMMENT '修改时间',
 `del_flag` int DEFAULT NULL COMMENT '逻辑删除标识(0-正常,1-已删除)',
 PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='分账记录表';
 
 sys_depart增加字段:
 ALTER TABLE sys_depart ADD mch_name varchar(255) COMMENT '商户全称(微信商户号主体)' AFTER org_id_card_num;
 ALTER TABLE sys_depart ADD mch_id varchar(32) COMMENT '商户号' AFTER org_id_card_num;
 ALTER TABLE sys_depart ADD appid varchar(64) COMMENT 'appid' AFTER org_id_card_num;
+ALTER TABLE sys_depart ADD system_type int COMMENT '系统商户类别(0-平台 1-商户 2-门店)' AFTER org_code;
+
+nm_order增加字段:
+ALTER TABLE sys_depart ADD profit_sharing_status tinyint(1) COMMENT '分账状态(0-待分账 1-已分账 2-分账回退)' AFTER or_profit_sharing;