Quellcode durchsuchen

feat:“增加汇聚汇付提现功能,远程制作记录查询"

soobin vor 5 Monaten
Ursprung
Commit
ebb9175ddd
27 geänderte Dateien mit 1012 neuen und 37 gelöschten Zeilen
  1. 3 1
      src/main/java/com/szwl/aspect/MyWebMvcConfigurer.java
  2. 1 1
      src/main/java/com/szwl/constant/JoinpayConstant.java
  3. 64 0
      src/main/java/com/szwl/controller/CallbackController.java
  4. 117 0
      src/main/java/com/szwl/controller/PurseController.java
  5. 0 3
      src/main/java/com/szwl/controller/TJoinpayMchController.java
  6. 132 0
      src/main/java/com/szwl/controller/TNameDictionaryController.java
  7. 25 9
      src/main/java/com/szwl/controller/TSugarDoController.java
  8. 21 0
      src/main/java/com/szwl/controller/WithdrawalRecordController.java
  9. 16 0
      src/main/java/com/szwl/mapper/RechargeRecordMapper.java
  10. 16 0
      src/main/java/com/szwl/mapper/WithdrawalRecordMapper.java
  11. 24 0
      src/main/java/com/szwl/mapper/xml/RechargeRecordMapper.xml
  12. 24 0
      src/main/java/com/szwl/mapper/xml/WithdrawalRecordMapper.xml
  13. 17 0
      src/main/java/com/szwl/model/bo/BalanceBo.java
  14. 34 0
      src/main/java/com/szwl/model/bo/SettlementRecordBo.java
  15. 60 0
      src/main/java/com/szwl/model/entity/RechargeRecord.java
  16. 3 0
      src/main/java/com/szwl/model/entity/TNameDictionary.java
  17. 60 0
      src/main/java/com/szwl/model/entity/WithdrawalRecord.java
  18. 16 0
      src/main/java/com/szwl/model/param/SugarDoParam.java
  19. 16 0
      src/main/java/com/szwl/service/RechargeRecordService.java
  20. 3 0
      src/main/java/com/szwl/service/SysRoleService.java
  21. 8 0
      src/main/java/com/szwl/service/THuifuMchService.java
  22. 27 0
      src/main/java/com/szwl/service/TJoinpayMchService.java
  23. 16 0
      src/main/java/com/szwl/service/WithdrawalRecordService.java
  24. 20 0
      src/main/java/com/szwl/service/impl/RechargeRecordServiceImpl.java
  25. 49 0
      src/main/java/com/szwl/service/impl/THuifuMchServiceImpl.java
  26. 220 23
      src/main/java/com/szwl/service/impl/TJoinpayMchServiceImpl.java
  27. 20 0
      src/main/java/com/szwl/service/impl/WithdrawalRecordServiceImpl.java

+ 3 - 1
src/main/java/com/szwl/aspect/MyWebMvcConfigurer.java

@@ -54,7 +54,9 @@ public class MyWebMvcConfigurer extends WebMvcConfigurationSupport {
                 "/test/**",
                 "/tHotUpdate/**",
                 "/tAlarmClean/**",
-                "/mqtt/**"
+                "/mqtt/**",
+                "/callback/**",
+                "/purse/**"
         };
         registry.addInterceptor(headTokenInterceptor)
                 .addPathPatterns("/**")

+ 1 - 1
src/main/java/com/szwl/constant/JoinpayConstant.java

@@ -48,7 +48,7 @@ public class JoinpayConstant {
     public final static String Notify_Url_PromoCode = "https://sz.sunzee.com.cn/PAY-SERVER/tOrder/promoCodeNotify";
 //    public final static String Notify_Url_PromoCode = "http://slb.sunzee.com.cn/api/order/promoCodeNotify.htm";
 
-    public final static String Jiesuan_Url = "http://app.sunzee.com.cn/api/order/jiesuan.htm";
+    public final static String Jiesuan_Url = "https://sz.sunzee.com.cn/SZWL-SERVER/callback/withdrawJoinPay";
 //    public final static String Jiesuan_Url = "http://slb.sunzee.com.cn/api/order/jiesuan.htm";
 
     public final static Map<String,String> Result_status = new HashMap<>();

+ 64 - 0
src/main/java/com/szwl/controller/CallbackController.java

@@ -0,0 +1,64 @@
+package com.szwl.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.szwl.constant.JoinpayConstant;
+import com.szwl.model.entity.TJoinpayMch;
+import com.szwl.model.entity.WithdrawalRecord;
+import com.szwl.service.TJoinpayMchService;
+import com.szwl.service.WithdrawalRecordService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  回调控制器
+ * </p>
+ *
+ * @author soobin
+ * @since 2024-03-24
+ */
+@RestController
+@RequestMapping("/callback")
+public class CallbackController {
+
+    @Autowired
+    private WithdrawalRecordService withdrawalRecordService;
+
+    @ApiOperation("汇聚提现回调")
+    @GetMapping("/withdrawJoinPay")
+    public Object withdrawJoinPay(HttpServletRequest request) {
+
+        String resp_code = request.getParameter("resp_code");
+        String da = request.getParameter("data");
+        JSONObject data =JSONObject.parseObject(da);
+
+        // 交易状态
+        String orderStatus = data.getString("order_status");
+        // 分账方编号
+        String mchOrderNo = data.getString("mch_order_no");
+        LambdaQueryWrapper<WithdrawalRecord> query = Wrappers.lambdaQuery();
+        query.eq(WithdrawalRecord::getOrderNo, mchOrderNo);
+        WithdrawalRecord withdrawalRecord = withdrawalRecordService.getOne(query);
+        withdrawalRecord.setStatus(2);
+        if (JoinpayConstant.order_status1.equals(orderStatus)) {
+            withdrawalRecord.setStatus(1);
+        }
+        String bizMsg = data.getString("biz_msg");
+        withdrawalRecord.setResultMsg(bizMsg);
+        withdrawalRecordService.updateById(withdrawalRecord);
+
+        ObjectNode jsonNodes = JsonNodeFactory.instance.objectNode();
+        jsonNodes.put("resp_code", "A1000");
+        jsonNodes.put("order_status", "success");
+        return jsonNodes;
+    }
+}

+ 117 - 0
src/main/java/com/szwl/controller/PurseController.java

@@ -0,0 +1,117 @@
+package com.szwl.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.szwl.constant.JoinpayConstant;
+import com.szwl.model.bo.BalanceBo;
+import com.szwl.model.bo.R;
+import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.bo.SettlementRecordBo;
+import com.szwl.model.entity.*;
+import com.szwl.service.TAdminService;
+import com.szwl.service.THuifuMchService;
+import com.szwl.service.TJoinpayMchService;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 钱包 前端控制器
+ * </p>
+ *
+ * @author soobin
+ * @since 2024-03-24
+ */
+@RestController
+@RequestMapping("/purse")
+public class PurseController {
+
+    @Autowired
+    private TJoinpayMchService tJoinpayMchService;
+
+    @Autowired
+    private TAdminService adminService;
+
+    @Autowired
+    private THuifuMchService tHuifuMchService;
+
+    @ApiOperation("余额查询")
+    @GetMapping("/balance")
+    public ResponseModel<?> balance(Long adminId) {
+        TAdmin admin = adminService.getById(adminId);
+        String payPlatform = admin.getPayPlatform();
+        BalanceBo balanceBo = new BalanceBo();
+        if (StringUtils.isEmpty(payPlatform) || payPlatform.equals("0")) {
+            // 汇聚
+            LambdaQueryWrapper<TJoinpayMch> query = Wrappers.lambdaQuery();
+            query.eq(TJoinpayMch::getAdminId, adminId);
+            TJoinpayMch joinpayMch = tJoinpayMchService.getOne(query);
+            if (joinpayMch != null) {
+                balanceBo = tJoinpayMchService.getBalance(joinpayMch);
+            }
+        } else if (payPlatform.equals("1")) {
+            // 汇付
+            LambdaQueryWrapper<THuifuMch> query = Wrappers.lambdaQuery();
+            query.eq(THuifuMch::getAdminId, adminId);
+            THuifuMch huifuMch = tHuifuMchService.getOne(query);
+            if (huifuMch != null) {
+                balanceBo = tHuifuMchService.getBalance(huifuMch);
+            }
+        }
+        return R.ok(balanceBo);
+    }
+
+    @ApiOperation("查询汇聚自动结算记录")
+    @GetMapping("/autoSettlementJoinpay")
+    public ResponseModel<?> autoSettlementJoinpay(Long adminId, String date) {
+        LambdaQueryWrapper<TJoinpayMch> query = Wrappers.lambdaQuery();
+        query.eq(TJoinpayMch::getAdminId, adminId);
+        TJoinpayMch joinpayMch = tJoinpayMchService.getOne(query);
+        List<SettlementRecordBo> recordBos = new ArrayList<>();
+        if (joinpayMch != null) {
+            recordBos = tJoinpayMchService.getAutoSettlement(joinpayMch, date);
+        }
+        return R.ok(recordBos);
+    }
+
+    @ApiOperation("查询提现记录")
+    @GetMapping("/withdrawRecord")
+    public ResponseModel<?> withdrawRecord(Long adminId, String date) {
+
+        return R.ok();
+    }
+
+
+    @ApiOperation("钱包充值")
+    @PostMapping("/recharge")
+    public ResponseModel<?> recharge(@RequestBody RechargeRecord rechargeRecord) {
+
+        return R.ok();
+    }
+
+    @ApiOperation("钱包提现")
+    @PostMapping("/withdraw")
+    public ResponseModel<?> withdraw(@RequestBody WithdrawalRecord withdrawalRecord) {
+        // 判断是汇聚还是汇付的
+        String payPlatform = withdrawalRecord.getPayPlatform();
+        String result = "";
+        if (StringUtils.isEmpty(payPlatform) || payPlatform.equals("0")) {
+            // 汇聚
+            LambdaQueryWrapper<TJoinpayMch> query = Wrappers.lambdaQuery();
+            query.eq(TJoinpayMch::getAdminId, withdrawalRecord.getAdminId());
+            TJoinpayMch joinpayMch = tJoinpayMchService.getOne(query);
+            result = tJoinpayMchService.withdraw(joinpayMch, withdrawalRecord);
+            if (JoinpayConstant.biz_code1.equals(result)) {
+                return R.ok();
+            }
+        } else if (payPlatform.equals("1")) {
+            // 汇付
+        }
+        return R.fail(result);
+    }
+}

+ 0 - 3
src/main/java/com/szwl/controller/TJoinpayMchController.java

@@ -227,9 +227,6 @@ public class TJoinpayMchController {
     @ApiOperation(value = "获取提现信息")
     @GetMapping("/getMch")
     public ResponseModel<TJoinpayMch> getMch(@RequestParam String id) {
-//        UserDetailBO userDetailBO = Optional.ofNullable(tokenManager.getLoginUserDetails())
-//                .orElseThrow(() -> new BizException(ResponseCodesEnum.L0001));
-//        String adminId = userDetailBO.getId().toString();
         TAdmin admin = adminService.getById(id);
         if (admin.getType() <= 1) {
             //公司

+ 132 - 0
src/main/java/com/szwl/controller/TNameDictionaryController.java

@@ -0,0 +1,132 @@
+package com.szwl.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.szwl.model.entity.TNameDictionary;
+import com.szwl.service.TNameDictionaryService;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-12-18
+ */
+@RestController
+@RequestMapping("/tNameDictionary")
+public class TNameDictionaryController {
+    @Autowired
+    private TNameDictionaryService nameDictionaryService;
+
+    @GetMapping("/save")
+    public String save(String nameStr, String lan, String machineType) {
+        String xmlString =
+                "<root>"
+                        + nameStr
+                        + "</root>";
+        String[] noStr = {"A67", "A68", "A69", "A70", "A71", "A72", "A73", "A74", "A75", "A76", "A77",
+                "A78", "A79", "A80", "A81", "A82", "A83", "A84"};
+        List<String> str = new ArrayList<>();
+        try{
+            SAXReader reader = new SAXReader();
+            Document document = reader.read(new ByteArrayInputStream(xmlString.getBytes()));
+            Element root = document.getRootElement();
+            // 获取所有<string>元素
+            List<Element> stringElements = root.elements("string");
+
+            // 遍历<string>元素,输出name属性值和文本内容
+            for (Element stringElement : stringElements) {
+                String name = stringElement.attributeValue("name");
+                String content = stringElement.getText();
+                System.out.println("Name: " + name + ", Content: " + content);
+                str.add(content);
+            }
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        int i = 0;
+        for (String s : str) {
+            TNameDictionary nameDictionary = new TNameDictionary();
+            nameDictionary.setCreateDate(new Date());
+            nameDictionary.setModifyDate(new Date());
+            nameDictionary.setName(s);
+            nameDictionary.setNo(noStr[i]);
+            nameDictionary.setLanguage(lan);
+            nameDictionary.setMachineType(machineType);
+            nameDictionaryService.save(nameDictionary);
+            i++;
+        }
+        return "success";
+    }
+
+
+    @GetMapping("/update")
+    public String update(String nameStr, String lan) {
+        String xmlString =
+                "<root>"
+                        + nameStr
+                        + "</root>";
+        List<String> str = new ArrayList<>();
+        try{
+            SAXReader reader = new SAXReader();
+            Document document = reader.read(new ByteArrayInputStream(xmlString.getBytes()));
+            Element root = document.getRootElement();
+            // 获取所有<string>元素
+            List<Element> stringElements = root.elements("string");
+
+            // 遍历<string>元素,输出name属性值和文本内容
+            for (Element stringElement : stringElements) {
+                String name = stringElement.attributeValue("name");
+                String content = stringElement.getText();
+                System.out.println("Name: " + name + ", Content: " + content);
+                str.add(content);
+            }
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        for (String s : str) {
+            LambdaQueryWrapper<TNameDictionary> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(TNameDictionary::getName, s);
+            TNameDictionary nameDictionary = nameDictionaryService.getOne(wrapper);
+            if (nameDictionary.getLanguage() == null) {
+                nameDictionary.setLanguage(lan);
+            }
+            nameDictionaryService.updateById(nameDictionary);
+        }
+        return "success";
+    }
+
+    @GetMapping("/savePop")
+    public String savePop(String nameStr, String lan) {
+//        String[] noStr = {"B01", "B02", "B03", "B04", "B05", "B06"};
+//        List<String> str = new ArrayList<>();
+        String[] strings = nameStr.split(",");
+        for (String s : strings) {
+            String[] split = s.split("-");
+            TNameDictionary nameDictionary = new TNameDictionary();
+            nameDictionary.setCreateDate(new Date());
+            nameDictionary.setModifyDate(new Date());
+            nameDictionary.setName(split[0]);
+            nameDictionary.setNo(split[1]);
+            nameDictionary.setLanguage(lan);
+            nameDictionary.setMachineType("0");
+            nameDictionaryService.save(nameDictionary);
+        }
+        return "success";
+    }
+}
+

+ 25 - 9
src/main/java/com/szwl/controller/TSugarDoController.java

@@ -4,11 +4,16 @@ package com.szwl.controller;
 import cn.com.crbank.ommo.bean.ResultMessage;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.szwl.model.bo.R;
+import com.szwl.model.bo.ResponseModel;
 import com.szwl.model.entity.TEquipment;
 import com.szwl.model.entity.TNameDictionary;
 import com.szwl.model.entity.TProduct;
 import com.szwl.model.entity.TSugarDo;
+import com.szwl.model.param.SugarDoParam;
 import com.szwl.model.utils.PushUtils;
 import com.szwl.service.*;
 import io.swagger.annotations.Api;
@@ -17,10 +22,7 @@ import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -168,16 +170,13 @@ public class TSugarDoController {
         todayStart.set(Calendar.HOUR_OF_DAY, 0);
         todayStart.set(Calendar.MINUTE, 0);
         todayStart.set(Calendar.SECOND, 0);
-//        criteria.andCreateDateGreaterThanOrEqualTo(todayStart.getTime());
         Calendar todayEnd = Calendar.getInstance();
         todayEnd.set(Calendar.HOUR_OF_DAY, 23);
         todayEnd.set(Calendar.MINUTE, 59);
         todayEnd.set(Calendar.SECOND, 59);
-//        criteria.andCreateDateLessThanOrEqualTo(todayEnd.getTime());
         query.gt(TSugarDo::getCreateDate, todayStart.getTime());
         query.le(TSugarDo::getCreateDate, todayEnd.getTime());
         query.eq(TSugarDo::getStatus, "1");
-//        criteria.andStatusEqualTo("1");
         List<TSugarDo> sugarDoList = tSugarDoService.list(query);
         List<TSugarDo> sugarDos = new ArrayList<>();
         for (TSugarDo sugarDo : sugarDoList) {
@@ -187,12 +186,10 @@ public class TSugarDoController {
             String[] split = format.split(" ");
             String s = split[1];
             if (sugarDo.getStatus().equals("1")) {
-//                sugarDo.setProductName("商品:"+sugarDo.getProductName()+" 时间:"+s+" 已做糖 "+" 设备:"+sugarDo.getClientId().substring(sugarDo.getClientId().length()-6));
                 sugarDos.add(sugarDo);
 
             }
             if (sugarDo.getStatus().equals("2")) {
-//                sugarDo.setProductName("商品:"+sugarDo.getProductName()+" 时间:"+s+ " 异常:"+sugarDo.getNote()+" 设备:"+sugarDo.getClientId().substring(sugarDo.getClientId().length()-6));
                 sugarDos.add(sugarDo);
 
             }
@@ -200,5 +197,24 @@ public class TSugarDoController {
         return ResponseEntity.status(HttpStatus.OK)
                 .body(new ResultMessage().setCode(true).setData(sugarDos).setMessage("SUCCESS"));
     }
+
+    @ApiOperation(value = "远程制作记录")
+    @PostMapping("/selectSugarRecord")
+    public ResponseModel<IPage<?>> selectSugarRecord(@RequestBody SugarDoParam param) {
+        Page<TSugarDo> page = new Page<>(param.getCurrent(), param.getSize(), true);
+        LambdaQueryWrapper<TSugarDo> query = Wrappers.lambdaQuery();
+        if (StringUtils.isNotEmpty(param.getStatus())) {
+            query.eq(TSugarDo::getStatus, param.getStatus());
+        }
+        if (StringUtils.isNotEmpty(param.getStartTime()) && StringUtils.isNotEmpty(param.getEndTime())) {
+            query.between(TSugarDo::getCreateDate, param.getStartTime(), param.getEndTime());
+        }
+        if (StringUtils.isNotEmpty(param.getClientId())) {
+            query.eq(TSugarDo::getClientId, param.getClientId());
+        }
+        query.orderByDesc(TSugarDo::getCreateDate);
+        Page<TSugarDo> sugarDoPage = tSugarDoService.page(page, query);
+        return R.ok(sugarDoPage);
+    }
 }
 

+ 21 - 0
src/main/java/com/szwl/controller/WithdrawalRecordController.java

@@ -0,0 +1,21 @@
+package com.szwl.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 提现记录表 前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-03-05
+ */
+@RestController
+@RequestMapping("/withdrawalRecord")
+public class WithdrawalRecordController {
+
+}
+

+ 16 - 0
src/main/java/com/szwl/mapper/RechargeRecordMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.RechargeRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 充值记录表 Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-03-04
+ */
+public interface RechargeRecordMapper extends BaseMapper<RechargeRecord> {
+
+}

+ 16 - 0
src/main/java/com/szwl/mapper/WithdrawalRecordMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.WithdrawalRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 提现记录表 Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-03-05
+ */
+public interface WithdrawalRecordMapper extends BaseMapper<WithdrawalRecord> {
+
+}

+ 24 - 0
src/main/java/com/szwl/mapper/xml/RechargeRecordMapper.xml

@@ -0,0 +1,24 @@
+<?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.szwl.mapper.RechargeRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.RechargeRecord">
+        <id column="id" property="id" />
+        <result column="create_date" property="createDate" />
+        <result column="admin_id" property="adminId" />
+        <result column="sn" property="sn" />
+        <result column="frp_code" property="frpCode" />
+        <result column="price" property="price" />
+        <result column="pay_date" property="payDate" />
+        <result column="status" property="status" />
+        <result column="pay_platform" property="payPlatform" />
+        <result column="company_type" property="companyType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_date, admin_id, sn, frp_code, price, pay_date, status, pay_platform, company_type
+    </sql>
+
+</mapper>

+ 24 - 0
src/main/java/com/szwl/mapper/xml/WithdrawalRecordMapper.xml

@@ -0,0 +1,24 @@
+<?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.szwl.mapper.WithdrawalRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.WithdrawalRecord">
+        <id column="id" property="id" />
+        <result column="create_date" property="createDate" />
+        <result column="admin_id" property="adminId" />
+        <result column="amount" property="amount" />
+        <result column="order_no" property="orderNo" />
+        <result column="arrival_date" property="arrivalDate" />
+        <result column="status" property="status" />
+        <result column="pay_platform" property="payPlatform" />
+        <result column="company_type" property="companyType" />
+        <result column="result_msg" property="resultMsg" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_date, admin_id, amount, order_no, arrival_date, status, pay_platform, company_type, result_msg
+    </sql>
+
+</mapper>

+ 17 - 0
src/main/java/com/szwl/model/bo/BalanceBo.java

@@ -0,0 +1,17 @@
+package com.szwl.model.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class BalanceBo {
+
+    @ApiModelProperty(value = "当日收款余额")
+    private BigDecimal receivableBalance;
+
+    @ApiModelProperty(value = "可提现余额")
+    private BigDecimal withdrawableBalance;
+
+}

+ 34 - 0
src/main/java/com/szwl/model/bo/SettlementRecordBo.java

@@ -0,0 +1,34 @@
+package com.szwl.model.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class SettlementRecordBo {
+
+    @ApiModelProperty(value = "商户ID")
+    private Long adminId;
+
+    @ApiModelProperty(value = "结算流水号")
+    private String serialNo;
+
+    @ApiModelProperty(value = "结算银行账号")
+    private String bankAccountNo;
+
+    @ApiModelProperty(value = "结算银行账户名")
+    private String bankAccountName;
+
+    @ApiModelProperty(value = "结算金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "结算日期")
+    private String date;
+
+    @ApiModelProperty(value = "结算状态")
+    private Integer status;
+
+    @ApiModelProperty(value = "结算失败原因")
+    private String failReason;
+}

+ 60 - 0
src/main/java/com/szwl/model/entity/RechargeRecord.java

@@ -0,0 +1,60 @@
+package com.szwl.model.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 充值记录表
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-03-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="RechargeRecord对象", description="充值记录表")
+public class RechargeRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "充值订单唯一ID")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createDate;
+
+    @ApiModelProperty(value = "用户ID")
+    private Long adminId;
+
+    @ApiModelProperty(value = "订单编号")
+    private String sn;
+
+    @ApiModelProperty(value = "支付方式")
+    private String frpCode;
+
+    @ApiModelProperty(value = "订单金额")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "支付时间")
+    private Date payDate;
+
+    @ApiModelProperty(value = "支付状态")
+    private Integer status;
+
+    @ApiModelProperty(value = "支付平台  0或null为汇聚,1为杉德支付")
+    private String payPlatform;
+
+    @ApiModelProperty(value = "公司平台,0或空为申泽,1为七云")
+    private String companyType;
+
+
+}

+ 3 - 0
src/main/java/com/szwl/model/entity/TNameDictionary.java

@@ -36,6 +36,9 @@ public class TNameDictionary implements Serializable {
     @ApiModelProperty(value = "花型名称")
     private String name;
 
+    @ApiModelProperty(value = "设备类型,0:棉花糖,1:爆米花,2:冰淇淋")
+    private String machineType;
+
     @ApiModelProperty(value = "商品编号")
     private String no;
 

+ 60 - 0
src/main/java/com/szwl/model/entity/WithdrawalRecord.java

@@ -0,0 +1,60 @@
+package com.szwl.model.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 提现记录表
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-03-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="WithdrawalRecord对象", description="提现记录表")
+public class WithdrawalRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "提现记录唯一ID")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createDate;
+
+    @ApiModelProperty(value = "用户ID")
+    private Long adminId;
+
+    @ApiModelProperty(value = "提现金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "提现订单编号")
+    private String orderNo;
+
+    @ApiModelProperty(value = "到账时间")
+    private Date arrivalDate;
+
+    @ApiModelProperty(value = "提现状态")
+    private Integer status;
+
+    @ApiModelProperty(value = "支付平台  0或null为汇聚,1为汇付支付")
+    private String payPlatform;
+
+    @ApiModelProperty(value = "公司平台,0或空为申泽,1为七云")
+    private String companyType;
+
+    @ApiModelProperty(value = "结果描述")
+    private String resultMsg;
+
+
+}

+ 16 - 0
src/main/java/com/szwl/model/param/SugarDoParam.java

@@ -0,0 +1,16 @@
+package com.szwl.model.param;
+
+import com.szwl.model.entity.TSugarDo;
+import lombok.Data;
+
+@Data
+public class SugarDoParam extends TSugarDo {
+
+    private Long current;
+
+    private Long size;
+
+    private String startTime;
+
+    private String endTime;
+}

+ 16 - 0
src/main/java/com/szwl/service/RechargeRecordService.java

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.RechargeRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 充值记录表 服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-03-04
+ */
+public interface RechargeRecordService extends IService<RechargeRecord> {
+
+}

+ 3 - 0
src/main/java/com/szwl/service/SysRoleService.java

@@ -21,7 +21,10 @@ import java.util.Set;
  * @since 2022-06-17
  */
 public interface SysRoleService extends IService<SysRole> {
+
     Set<String> listAuthMenuByUserId(Long userId);
+
     void addSysRole(AddSysRoleParam param);
+
     void updateSysRole(UpdateSysRoleParam param);
 }

+ 8 - 0
src/main/java/com/szwl/service/THuifuMchService.java

@@ -3,6 +3,7 @@ package com.szwl.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.huifu.bspay.sdk.opps.core.exception.BasePayException;
 import com.szwl.constant.HuifuConstant;
+import com.szwl.model.bo.BalanceBo;
 import com.szwl.model.entity.THuifuMch;
 import com.szwl.model.entity.THuifuMchCheck;
 import org.springframework.web.multipart.MultipartFile;
@@ -114,4 +115,11 @@ public interface THuifuMchService extends IService<THuifuMch> {
      * @return 成功状态
      */
     String withdraw(String cashAmt, String huifuId, String dateType, String tokenNo) throws BasePayException;
+
+    /**
+     * 获取余额
+     * @param huifuMch
+     * @return
+     */
+    BalanceBo getBalance(THuifuMch huifuMch);
 }

+ 27 - 0
src/main/java/com/szwl/service/TJoinpayMchService.java

@@ -1,11 +1,15 @@
 package com.szwl.service;
 
 import com.alibaba.fastjson.JSONArray;
+import com.szwl.model.bo.BalanceBo;
+import com.szwl.model.bo.SettlementRecordBo;
 import com.szwl.model.entity.TJoinpayMch;
+import com.szwl.model.entity.WithdrawalRecord;
 import com.szwl.service.base.MyIService;
 
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * <p>
@@ -58,4 +62,27 @@ public interface TJoinpayMchService extends MyIService<TJoinpayMch> {
      * @return
      */
     String updateApproveStatus(TJoinpayMch mch);
+
+    /**
+     * 获取余额
+     * @param mch
+     * @return
+     */
+    BalanceBo getBalance(TJoinpayMch mch);
+
+    /**
+     * 提现接口
+     * @param mch
+     * @param withdrawalRecord
+     * @return
+     */
+    String withdraw(TJoinpayMch mch, WithdrawalRecord withdrawalRecord);
+
+    /**
+     * 获取自动结算记录
+     * @param joinpayMch
+     * @param date
+     * @return
+     */
+    List<SettlementRecordBo> getAutoSettlement(TJoinpayMch joinpayMch, String date);
 }

+ 16 - 0
src/main/java/com/szwl/service/WithdrawalRecordService.java

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.WithdrawalRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 提现记录表 服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-03-05
+ */
+public interface WithdrawalRecordService extends IService<WithdrawalRecord> {
+
+}

+ 20 - 0
src/main/java/com/szwl/service/impl/RechargeRecordServiceImpl.java

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.RechargeRecord;
+import com.szwl.mapper.RechargeRecordMapper;
+import com.szwl.service.RechargeRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 充值记录表 服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-03-04
+ */
+@Service
+public class RechargeRecordServiceImpl extends ServiceImpl<RechargeRecordMapper, RechargeRecord> implements RechargeRecordService {
+
+}

+ 49 - 0
src/main/java/com/szwl/service/impl/THuifuMchServiceImpl.java

@@ -17,6 +17,7 @@ import com.szwl.common.myAnnotation.HuifuBaseCommon;
 import com.szwl.config.OppsMerchantConfig;
 import com.szwl.constant.HuifuConstant;
 import com.szwl.mapper.THuifuMchMapper;
+import com.szwl.model.bo.BalanceBo;
 import com.szwl.model.entity.TAdmin;
 import com.szwl.model.entity.THuifuMch;
 import com.szwl.model.entity.THuifuMchCheck;
@@ -1088,4 +1089,52 @@ public class THuifuMchServiceImpl extends ServiceImpl<THuifuMchMapper, THuifuMch
         }
         return "";
     }
+
+    @Override
+    public BalanceBo getBalance(THuifuMch huifuMch) {
+        BalanceBo balanceBo = new BalanceBo();
+        // 请求接口
+        String url = "https://api.huifu.com/v2/trade/acctpayment/balance/query";
+//        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        // 请求参数:Data
+        JSONObject request = new JSONObject();
+        // 请求流水号
+        request.put("req_seq_id", SequenceTools.getReqSeqId32());
+        // 请求日期
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        // 汇付ID
+        request.put("huifu_id", huifuMch.getHuifuId());
+
+        // 签名:sign
+        String jsonString = JSON.toJSONString(JSONObject.parseObject(request.toString(), TreeMap.class));
+        String sign = HuifuUtils.sign(jsonString, HuifuConstant.RSA_PRIVATE_KEY);
+
+
+        // 公共参数
+        JSONObject requestData = new JSONObject();
+        requestData.put("sys_id", HuifuConstant.SYS_ID);
+        requestData.put("product_id", HuifuConstant.PRODUCT_ID);
+        requestData.put("sign", sign);
+        requestData.put("data", request);
+
+        String result = null;
+        try {
+            result = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
+            JSONObject jsonObject = JSONObject.parseObject(result);
+            JSONObject dataObject = jsonObject.getJSONObject("data");
+            String acctInfoList = dataObject.getString("acctInfo_list");
+            JSONArray acctInfoArray = JSONArray.parseArray(acctInfoList);
+
+            // 如果 "acctInfo_list" 是数组,遍历数组并获取 "balance_amt" 字段的值
+            String balanceAmt = "0";
+            for (int i = 0; i < acctInfoArray.size(); i++) {
+                JSONObject acctInfoObject = acctInfoArray.getJSONObject(i);
+                balanceAmt = acctInfoObject.getString("balance_amt");
+            }
+            balanceBo.setWithdrawableBalance(new BigDecimal(balanceAmt));
+        } catch (BasePayException e) {
+            throw new RuntimeException(e);
+        }
+        return balanceBo;
+    }
 }

+ 220 - 23
src/main/java/com/szwl/service/impl/TJoinpayMchServiceImpl.java

@@ -1,17 +1,23 @@
 package com.szwl.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.RandomUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.szwl.feign.bean.PayFeign;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.szwl.constant.JoinpayConstant;
-import com.szwl.model.entity.TJoinpayMch;
+import com.szwl.feign.bean.PayFeign;
 import com.szwl.mapper.TJoinpayMchMapper;
+import com.szwl.model.bo.BalanceBo;
+import com.szwl.model.bo.SettlementRecordBo;
+import com.szwl.model.entity.TJoinpayMch;
+import com.szwl.model.entity.WithdrawalRecord;
 import com.szwl.model.utils.AESUtil;
 import com.szwl.model.utils.Constant;
 import com.szwl.model.utils.HttpClientUtils;
 import com.szwl.model.utils.RSAUtil;
 import com.szwl.service.TJoinpayMchService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.szwl.service.WithdrawalRecordService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang.StringUtils;
@@ -39,6 +45,10 @@ import java.util.*;
 @Slf4j
 @Service
 public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoinpayMch> implements TJoinpayMchService {
+
+    @Autowired
+    WithdrawalRecordService withdrawalRecordService;
+
     @Autowired
     PayFeign payFeign;
 
@@ -127,12 +137,10 @@ public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoin
 
         requestJson.put("aes_key", RSAUtil.encrypt(aes_key1 + ":" + aes_key2, JoinpayConstant.publickey));
 
-//        logger.info("请求参数:" + requestJson);
 
         org.json.JSONObject jsonObject;
         try {
             jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
-//            logger.info("响应参数:" + jsonObject);
 
             if (jsonObject.has("resp_code")) {
                 mch.setRespCode(jsonObject.getString("resp_code"));
@@ -217,10 +225,6 @@ public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoin
                 requestData.put("id_card_no", mch.getIdCardNo());
             }
         }
-//        requestData.put("legal_person", AESUtil.encrypt(legal_person, aes_key1 ,  aes_key2 ));
-//        requestData.put("legal_person", mch.getLegalPerson());
-//        requestData.put("id_card_no",  AESUtil.encrypt(id_card_no, aes_key1 , aes_key2 ));
-//        requestData.put("id_card_no",  mch.getIdCardNo());
 
         if (JoinpayConstant.alt_merchant_type2 == mch.getAltMerchantType() || JoinpayConstant.alt_merchant_type3 == mch.getAltMerchantType()) {
             // 企业用对公账户
@@ -240,10 +244,7 @@ public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoin
         }
 
         requestData.put("bank_account_name", mch.getBankAccountName());
-//        requestData.put("bank_account_name",  AESUtil.encrypt(bank_account_name, aes_key1 ,  aes_key2 ));
         requestData.put("bank_account_no", mch.getBankAccountNo());
-//        requestData.put("bank_account_no",  AESUtil.encrypt(bank_account_no, aes_key1 ,  aes_key2 ));
-//        requestData.put("bank_channel_no",  AESUtil.encrypt(bank_channel_no, aes_key1 ,  aes_key2 ));
         requestData.put("bank_channel_no", mch.getBankChannelNo());
         if (mch.getSettMode() != null) {
             requestData.put("sett_mode", mch.getSettMode());
@@ -260,15 +261,8 @@ public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoin
             // 结算周期:1
             requestData.put("risk_day", 1);
         }
-//        mch.setLegal_person(legal_person);
-//        mch.setId_card_no(id_card_no);
-//        mch.setAlt_merchant_type(alt_merchant_type);
-//        mch.setBank_account_name(bank_account_name);
-//        mch.setBank_account_no(bank_account_no);
-//        mch.setBank_channel_no(bank_channel_no);
         if (mch.getAltMerchantType() == 12) {
             String alt_mch_name = mch.getBankAccountName();
-//            mch.setAlt_mch_name(alt_mch_name);
         }
         JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
         requestJson.put("method", "altmch.modify");
@@ -284,12 +278,10 @@ public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoin
         requestJson.put("sign", sign.toUpperCase());
         requestJson.put("aes_key", RSAUtil.encrypt(aes_key1 + ":" + aes_key2, JoinpayConstant.publickey));
 
-//        logger.info("请求参数:" + requestJson);
 
         org.json.JSONObject jsonObject;
         try {
             jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
-//            logger.info("响应参数:" + jsonObject);
 
             if (jsonObject.has("resp_code")) {
                 mch.setRespCode(jsonObject.getString("resp_code"));
@@ -361,13 +353,11 @@ public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoin
 
         String sign = createMD5Sign(requestJson, JoinpayConstant.key);
         requestJson.put("sign", sign.toUpperCase());
-//        logger.info("请求参数:" + requestJson);
         String back = null;
         org.json.JSONObject jsonObject;
         try {
 
             jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
-//            logger.info("响应参数:" + jsonObject);
 
             // 判断请求是否正确,受理成功
             if (jsonObject.has("resp_code")) {
@@ -674,6 +664,213 @@ public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoin
         return back;
     }
 
+    @Override
+    public BalanceBo getBalance(TJoinpayMch mch) {
+        String url = "https://www.joinpay.com/allocFunds";
+        BalanceBo balanceBo = new BalanceBo();
+
+        JSONObject requestData = new JSONObject(new LinkedHashMap());
+        requestData.put("alt_mch_no", mch.getAltMchNo());
+
+        JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
+        requestJson.put("method", "altAccount.get");
+        requestJson.put("version", "1.0");
+        requestJson.put("data", requestData);
+        // 32位随机字符串
+        String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
+        requestJson.put("rand_str", uuid);
+        requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
+        requestJson.put("mch_no", JoinpayConstant.mch_no);
+
+        String sign = createMD5Sign(requestJson, JoinpayConstant.key);
+        requestJson.put("sign", sign.toUpperCase());
+
+        org.json.JSONObject jsonObject;
+        try {
+
+            jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
+            log.info("查询余额返回数据:{}", jsonObject);
+
+            // 判断请求是否正确,受理成功
+            if (jsonObject.has("resp_code")) {
+                String resp_code = jsonObject.getString("resp_code");
+                if (JoinpayConstant.resp_code1.equals(resp_code)) {
+                    // 处理data
+                    if (jsonObject.has("data")) {
+                        org.json.JSONObject data = jsonObject.getJSONObject("data");
+                        // 更新账户的金额
+
+                        if (data.has("alt_avil_balance")) {
+                            // 可提现金额
+                            BigDecimal altAvilBalance = new BigDecimal(data.getString("alt_avil_balance")).divide(new BigDecimal(100));
+                            balanceBo.setWithdrawableBalance(altAvilBalance);
+                            if (data.has("alt_main_balance")) {
+                                BigDecimal altMainBalance = new BigDecimal(data.getString("alt_main_balance")).divide(new BigDecimal(100));
+                                balanceBo.setReceivableBalance(altMainBalance.subtract(altAvilBalance));
+                            }
+                        }
+
+                    }
+                }
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return balanceBo;
+    }
+
+    @Override
+    public String withdraw(TJoinpayMch mch, WithdrawalRecord withdrawalRecord) {
+        String url = "https://www.joinpay.com/allocFunds";
+        JSONObject requestData = new JSONObject(new LinkedHashMap());
+        //分账方编号
+        requestData.put("alt_mch_no", mch.getAltMchNo());
+        //结算金额
+        requestData.put("settle_amount", String.valueOf(withdrawalRecord.getAmount()));
+        //结算请求号
+        String mch_order_no = RandomUtil.randomNumbers(18);
+        requestData.put("mch_order_no", mch_order_no);
+        //通知地址
+        requestData.put("callback_url",JoinpayConstant.Jiesuan_Url);
+        JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
+        requestJson.put("method", "altSettle.launch");
+        requestJson.put("version", "1.1");
+        requestJson.put("data", requestData);
+        // 32位随机字符串
+        String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
+        requestJson.put("rand_str", uuid);
+        requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
+        requestJson.put("mch_no", JoinpayConstant.mch_no);
+        String sign = createMD5Sign(requestJson, JoinpayConstant.key);
+        requestJson.put("sign", sign.toUpperCase());
+        log.info("提现参数:{}", requestJson);
+
+        org.json.JSONObject jsonObject;
+        try {
+            jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
+            log.info("提现结果:{}", jsonObject);
+            // 判断请求是否正确,受理成功
+            if(jsonObject.has("resp_code")){
+                String respCode = jsonObject.getString("resp_code");
+                if(JoinpayConstant.resp_code1.equals(respCode)){
+                    org.json.JSONObject data = jsonObject.getJSONObject("data");
+                    String bizCode = data.getString("biz_code");
+                    if(JoinpayConstant.biz_code1.equals(bizCode)){
+                        // 申请提现成功,保存记录
+                        withdrawalRecord.setCreateDate(new Date());
+                        withdrawalRecord.setOrderNo(mch_order_no);
+                        withdrawalRecord.setStatus(0);
+                        withdrawalRecordService.save(withdrawalRecord);
+                        return bizCode;
+                    }else{
+                        // 提现失败
+                        String bizMsg = data.getString("biz_msg");
+                        return bizMsg;
+                    }
+                } else {
+                    // 受理失败
+                    String respMsg = jsonObject.getString("resp_msg");
+                    return respMsg;
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return "提现失败";
+    }
+
+    @Override
+    public List<SettlementRecordBo> getAutoSettlement(TJoinpayMch joinpayMch, String date) {
+        String url = "https://www.joinpay.com/allocFunds";
+        JSONObject requestData = new JSONObject(new LinkedHashMap());
+        //分账方编号
+        requestData.put("alt_mch_no", joinpayMch.getAltMchNo());
+        //结算日期
+        requestData.put("settle_date", date);
+        JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
+        requestJson.put("method", "altSettle.getAutoSettle");
+        requestJson.put("version", "1.1");
+        requestJson.put("data", requestData);
+        // 32位随机字符串
+        String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
+        requestJson.put("rand_str", uuid);
+        requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
+        requestJson.put("mch_no", JoinpayConstant.mch_no);
+        String sign = createMD5Sign(requestJson, JoinpayConstant.key);
+        requestJson.put("sign", sign.toUpperCase());
+
+        List<SettlementRecordBo> recordBos = new ArrayList<>();
+        org.json.JSONObject jsonObject;
+        try {
+            jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
+            // 判断请求是否正确,受理成功
+            if(jsonObject.has("resp_code")){
+                String respCode = jsonObject.getString("resp_code");
+                if(JoinpayConstant.resp_code1.equals(respCode)){
+                    org.json.JSONObject data = jsonObject.getJSONObject("data");
+                    String bizCode = data.getString("biz_code");
+                    if(JoinpayConstant.biz_code1.equals(bizCode)){
+                        org.json.JSONArray recordList = data.getJSONArray("record_list");
+                        for (int i = 0; i < recordList.length(); i++) {
+                            org.json.JSONObject record = recordList.getJSONObject(i);
+                            if(record.has("order_status")) {
+                                // 结算状态
+                                String orderStatus = record.getString("order_status");
+                                // 结算时间
+                                String settleDate = record.getString("settle_date");
+                                // 结算流水号
+                                String serialNo = record.getString("settle_trx_no");
+                                // 银行账户
+                                String altMchName = record.getString("alt_mch_name");
+                                // 银行账号
+                                String bankAccountNo = record.getString("bank_account_no");
+                                // 结算金额
+                                String settleAmount = record.getString("settle_amount");
+                                // 结算描述
+                                String bizMsg = record.getString("biz_msg");
+                                SettlementRecordBo recordBo = new SettlementRecordBo();
+                                if(JoinpayConstant.order_status2.equals(orderStatus)){
+                                    // 结算成功
+                                    recordBo.setAdminId(joinpayMch.getAdminId());
+                                    recordBo.setSerialNo(serialNo);
+                                    recordBo.setBankAccountNo(bankAccountNo);
+                                    recordBo.setBankAccountName(altMchName);
+                                    recordBo.setAmount(new BigDecimal(settleAmount));
+                                    recordBo.setDate(settleDate);
+                                    recordBo.setStatus(1);
+                                } else if(JoinpayConstant.order_status3.equals(orderStatus)){
+                                    // 结算失败
+                                    recordBo.setAdminId(joinpayMch.getAdminId());
+                                    recordBo.setSerialNo(serialNo);
+                                    recordBo.setBankAccountNo(bankAccountNo);
+                                    recordBo.setBankAccountName(altMchName);
+                                    recordBo.setAmount(new BigDecimal(settleAmount));
+                                    recordBo.setDate(settleDate);
+                                    recordBo.setStatus(2);
+                                    recordBo.setFailReason(bizMsg);
+                                } else if(JoinpayConstant.order_status4.equals(orderStatus)){
+                                    // 结算中
+                                    recordBo.setAdminId(joinpayMch.getAdminId());
+                                    recordBo.setSerialNo(serialNo);
+                                    recordBo.setBankAccountNo(bankAccountNo);
+                                    recordBo.setBankAccountName(altMchName);
+                                    recordBo.setAmount(new BigDecimal(settleAmount));
+                                    recordBo.setDate(settleDate);
+                                    recordBo.setStatus(0);
+                                }
+                                recordBos.add(recordBo);
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return recordBos;
+    }
+
 
     /**
      * 获取随机字符串

+ 20 - 0
src/main/java/com/szwl/service/impl/WithdrawalRecordServiceImpl.java

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.WithdrawalRecord;
+import com.szwl.mapper.WithdrawalRecordMapper;
+import com.szwl.service.WithdrawalRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 提现记录表 服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-03-05
+ */
+@Service
+public class WithdrawalRecordServiceImpl extends ServiceImpl<WithdrawalRecordMapper, WithdrawalRecord> implements WithdrawalRecordService {
+
+}