skyfffire 1 месяц назад
Родитель
Сommit
7c46bc59fd

+ 4 - 4
src/main/java/common/model/base/BaseWithdraw.java

@@ -37,15 +37,15 @@ public abstract class BaseWithdraw<M extends BaseWithdraw<M>> extends Model<M> i
 	/**
 	 * 10待审批 20审批通过等待放款 30提现完成 40提现被拒绝
 	 */
-	public void setState(java.lang.Integer state) {
-		set("state", state);
+	public void setStatus(java.lang.Integer status) {
+		set("status", status);
 	}
 	
 	/**
 	 * 10待审批 20审批通过等待放款 30提现完成 40提现被拒绝
 	 */
-	public java.lang.Integer getState() {
-		return getInt("state");
+	public java.lang.Integer getStatus() {
+		return getInt("status");
 	}
 	/**
 	 * 提现发起者

+ 98 - 4
src/main/java/modules/withdraw/WithdrawController.java

@@ -53,9 +53,57 @@ public class WithdrawController extends MyController {
         
         renderJson(service.create(amount, user));
     }
+
+    @Before(LoginInterceptor.class)
+    public void list() {
+        JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
+
+        // 页面大小
+        String pageSizeStr = requestBodyJson.getString("page_size");
+        int pageSizeInt;
+        try {
+            pageSizeInt = Integer.parseInt(pageSizeStr);
+
+            if (pageSizeInt <= 0) {
+                renderJson(MyRet.fail("页面大小(page_size)期待是正整数,你传的是: " + pageSizeStr));
+                return;
+            }
+        } catch (Exception e) {
+            renderJson(MyRet.fail("页面大小(page_size)格式不正确: " + e.getMessage()));
+            return;
+        }
+
+        // 页码
+        String pageNumberStr = requestBodyJson.getString("page_number");
+        int pageNumberInt;
+        try {
+            pageNumberInt = Integer.parseInt(pageNumberStr);
+
+            if (pageNumberInt <= 0) {
+                renderJson(MyRet.fail("页码(page_number)期待是正整数,你传的是: " + pageNumberStr));
+                return;
+            }
+        } catch (Exception e) {
+            renderJson(MyRet.fail("页码(page_number)格式不正确: " + e.getMessage()));
+            return;
+        }
+
+        Integer status;
+        try {
+            status = requestBodyJson.getInteger("status");
+        } catch (Exception e) {
+            renderJson(MyRet.fail("你传入的 status 有些问题:" + e.getMessage()).setData(requestBodyJson));
+
+            return;
+        }
+        
+        User user = userService.findUserByMobileNumber(getSessionAttr("mobile_number"));
+        
+        renderJson(service.list(pageNumberInt, pageSizeInt, status, user.getId()));
+    }
     
     @Before(LoginInterceptor.class)
-    @RequiredRoleInterface({UserController.ROLE_CHECK_ADMIN})
+    @RequiredRoleInterface({UserController.ROLE_CHECK_ADMIN, UserController.ROLE_SUPER_ADMIN})
     @EmptyInterface({"withdraw_sn"})
     public void pass() {
         JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
@@ -73,7 +121,7 @@ public class WithdrawController extends MyController {
         }
         
         // 订单状态过滤
-        if (withdraw.getState() != 10) {
+        if (withdraw.getStatus() != 10) {
             renderJson(MyRet.fail("只有未审批的才能进行打款"));
             return;
         }
@@ -85,7 +133,7 @@ public class WithdrawController extends MyController {
     }
 
     @Before(LoginInterceptor.class)
-    @RequiredRoleInterface({UserController.ROLE_CHECK_ADMIN})
+    @RequiredRoleInterface({UserController.ROLE_CHECK_ADMIN, UserController.ROLE_SUPER_ADMIN})
     @EmptyInterface({"withdraw_sn", "reason"})
     public void refuse() {
         JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
@@ -100,7 +148,7 @@ public class WithdrawController extends MyController {
         }
 
         // 订单状态过滤
-        if (withdraw.getState() != 10) {
+        if (withdraw.getStatus() != 10) {
             renderJson(MyRet.fail("只有未审批的才能进行拒绝"));
             return;
         }
@@ -110,4 +158,50 @@ public class WithdrawController extends MyController {
 
         renderJson(service.refuse(withdraw, reason, approverId));
     }
+
+    @Before(LoginInterceptor.class)
+    public void listByAdmin() {
+        JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
+
+        // 页面大小
+        String pageSizeStr = requestBodyJson.getString("page_size");
+        int pageSizeInt;
+        try {
+            pageSizeInt = Integer.parseInt(pageSizeStr);
+
+            if (pageSizeInt <= 0) {
+                renderJson(MyRet.fail("页面大小(page_size)期待是正整数,你传的是: " + pageSizeStr));
+                return;
+            }
+        } catch (Exception e) {
+            renderJson(MyRet.fail("页面大小(page_size)格式不正确: " + e.getMessage()));
+            return;
+        }
+
+        // 页码
+        String pageNumberStr = requestBodyJson.getString("page_number");
+        int pageNumberInt;
+        try {
+            pageNumberInt = Integer.parseInt(pageNumberStr);
+
+            if (pageNumberInt <= 0) {
+                renderJson(MyRet.fail("页码(page_number)期待是正整数,你传的是: " + pageNumberStr));
+                return;
+            }
+        } catch (Exception e) {
+            renderJson(MyRet.fail("页码(page_number)格式不正确: " + e.getMessage()));
+            return;
+        }
+
+        Integer status;
+        try {
+            status = requestBodyJson.getInteger("status");
+        } catch (Exception e) {
+            renderJson(MyRet.fail("你传入的 status 有些问题:" + e.getMessage()).setData(requestBodyJson));
+
+            return;
+        }
+
+        renderJson(service.list(pageNumberInt, pageSizeInt, status, null));
+    }
 }

+ 3 - 3
src/main/java/modules/withdraw/WithdrawMaintenanceTask.java

@@ -29,7 +29,7 @@ public class WithdrawMaintenanceTask implements Runnable {
                 Thread.sleep(TimeUnit.SECONDS.toMillis(10)); // 每 10 秒检查一次
                 
                 // 只处理已通过审批的
-                String sql = "SELECT * FROM t_withdraw WHERE state=20";
+                String sql = "SELECT * FROM t_withdraw WHERE status=20";
                 flushWithdrawState(Withdraw.dao.find(sql));
             } catch (InterruptedException e) {
                 LOGGER.warn("WithdrawMaintenanceTask 因中断而停止。");
@@ -97,7 +97,7 @@ public class WithdrawMaintenanceTask implements Runnable {
                             || distributeStatus == 80 
                             || distributeStatus == 90) {
                         // 1. 处理单据的状态
-                        w.setState(40);
+                        w.setStatus(40);
                         w.setHygOrigin(hygRst.toString());
                         w.setReason(remark);
                         w.setUpdateTime(System.currentTimeMillis());
@@ -123,7 +123,7 @@ public class WithdrawMaintenanceTask implements Runnable {
                     
                     // 这个逻辑视为打款成功的
                     if (distributeStatus == 60) {
-                        w.setState(30);
+                        w.setStatus(30);
                         w.setHygOrigin(hygRst.toString());
                         w.update();
                         

+ 104 - 4
src/main/java/modules/withdraw/WithdrawService.java

@@ -10,6 +10,11 @@ import common.utils.http.MyRet;
 import common.utils.hyg.HygSDK;
 import modules.order.OrderService;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 public class WithdrawService {
     // 提现手续费,750代表万分之750(7.5%)
     public static final long WITHDRAW_FEE = 750;
@@ -40,7 +45,7 @@ public class WithdrawService {
                 Withdraw withdraw = new Withdraw();
                 withdraw.setWithdrawSn(orderSn);
                 withdraw.setAmount((float)amount);
-                withdraw.setState(10);
+                withdraw.setStatus(10);
                 withdraw.setUserId(user.getId());
                 withdraw.setCreateTime(System.currentTimeMillis());
                 withdraw.setUpdateTime(System.currentTimeMillis());
@@ -91,7 +96,7 @@ public class WithdrawService {
             if (!withdrawRst.getString("statusCode").equals("000000")) {
                 withdraw.setHygOrigin(withdrawRst.toString());
                 withdraw.setReason("慧用工提现失败");
-                withdraw.setState(40);
+                withdraw.setStatus(40);
                 
                 // 原子化操作user和withdraw的状态
                 Db.tx(() -> {
@@ -124,7 +129,7 @@ public class WithdrawService {
             
             // 如果是成功提现
             withdraw.setHygOrigin(withdrawRst.toString());
-            withdraw.setState(20);
+            withdraw.setStatus(20);
             if (withdraw.update()) {
                 return MyRet.ok("打款请求已发起").setData(withdraw);
             } else {
@@ -149,7 +154,7 @@ public class WithdrawService {
                 // 记录操作人
                 withdraw.setApproverId(approverId);
                 withdraw.setReason(reason);
-                withdraw.setState(40);
+                withdraw.setStatus(40);
 
                 if (!withdraw.update()) {
                     throw new RuntimeException("提现单据保存失败");
@@ -175,6 +180,101 @@ public class WithdrawService {
         }
     }
     
+    public MyRet list(int pageNumber, int pageSize, Integer status, Long userId) {
+        // 接收 Integer 类型的 orderStatus
+        // 构建用于查询当前页订单列表的 SQL
+        String columns = " * ";
+        String select = "SELECT " + columns;
+        StringBuilder fromWhere = new StringBuilder("FROM t_withdraw"); // 基础 from 子句
+        String orderBy = "ORDER BY update_time DESC";
+        boolean hasWhereClause = false; // 标志位,用于判断是否已经添加了 WHERE 关键字
+
+        List<Object> params = new ArrayList<>(); // 用于 SELECT 列表查询的参数
+
+        // ✅ 根据 status 筛选
+        if (status != null && status >= 0) { // status 通常是枚举,>=0 可能是有效的判断
+            fromWhere.append(hasWhereClause ? " AND" : " WHERE").append(" status = ?");
+            params.add(status);
+            hasWhereClause = true;
+        }
+
+        // ✅ 根据 userId 筛选
+        // 通常 userId 是正整数,如果 userId 可能为 0 需要特别对待
+        if (userId != null && userId > 0) { // 通常 userId 从 1 开始,或者根据你的业务逻辑设定
+            fromWhere.append(hasWhereClause ? " AND" : " WHERE").append(" user_id = ?");
+            params.add(userId);
+            hasWhereClause = true;
+        }
+        
+        // 计算 LIMIT 的 offset (偏移量)
+        int offset = (pageNumber - 1) * pageSize;
+
+        // 构建查询当前页订单列表的最终 SQL (手动添加 LIMIT)
+        String listSql = select + " " + fromWhere + " " + orderBy + " LIMIT ?, ?";
+        params.add(offset);
+        params.add(pageSize);
+        
+        List<Withdraw> withdrawList = Withdraw.dao.find(listSql, params.toArray());
+
+        // 如果列表为空,直接返回
+        if (withdrawList.isEmpty()) {
+            Map<String, Object> response = new HashMap<>(); // 准备返回结构
+            response.put("list", new ArrayList<>());
+            response.put("total_row", 0);
+            response.put("total_page", 0);
+            response.put("page_size", pageSize);
+            response.put("page_number", pageNumber);
+            response.put("total_order_count", 0); // 与你的 total_user_count 对应
+            return MyRet.ok("查询成功").setData(response);
+        }
+
+        // 获取符合条件的条目数量
+        long totalRowLong = countWithdraws(status, userId);
+
+        // 手动计算 total_page
+        int totalPage = (int) Math.ceil((double) totalRowLong / pageSize);
+        if (totalPage == 0 && totalRowLong > 0) { // 解决总行数大于0但总页数为0(pageSize大于totalRow)的问题
+            totalPage = 1;
+        }
+        
+        // 封装最终响应
+        Map<String, Object> response = new HashMap<>();
+        response.put("list", withdrawList);
+        response.put("total_row", totalRowLong); // 符合条件的订单总数
+        response.put("total_page", totalPage); // 手动计算的总页数
+        response.put("page_size", pageSize);
+        response.put("page_number", pageNumber);
+        response.put("total_order_count", totalRowLong); // 对应 total_user_count,这里是符合订单状态筛选的总数
+
+        return MyRet.ok("查询成功").setData(response);
+    }
+
+    public long countWithdraws(Integer status, Long userId) { // 接收 Integer 类型的 status
+        StringBuilder sql = new StringBuilder("SELECT COUNT(*) FROM t_withdraw"); // 使用 COUNT(*),更通用
+        List<Object> params = new ArrayList<>();
+        boolean hasWhereClause = false; // 标志位,用于判断是否已经添加了 WHERE 关键字
+
+        // ✅ 根据 status 筛选
+        if (status != null && status >= 0) { // status 通常是枚举,>=0 可能是有效的判断
+            sql.append(hasWhereClause ? " AND" : " WHERE").append(" status = ?");
+            params.add(status);
+            hasWhereClause = true;
+        }
+
+        // ✅ 根据 userId 筛选
+        // 通常 userId 是正整数,如果 userId 可能为 0 需要特别对待
+        if (userId != null && userId > 0) { // 通常 userId 从 1 开始,或者根据你的业务逻辑设定
+            sql.append(hasWhereClause ? " AND" : " WHERE").append(" user_id = ?");
+            params.add(userId);
+            hasWhereClause = true;
+        }
+
+        // 执行查询并返回结果
+        // Db.queryLong() 如果没有结果会返回 null,如果查询结果行数为 0,则返回 Long 0
+        // 这符合 COUNT() 函数的预期
+        return Db.queryLong(sql.toString(), params.toArray());
+    }
+    
     public Withdraw findByWithdrawSn(String sn) {
         return Withdraw.dao.findFirst("SELECT * FROM t_withdraw WHERE withdraw_sn=?", sn);
     }

+ 39 - 2
src/test/rest/WithdrawControllerTest.http

@@ -10,7 +10,25 @@ dl-token: {{dl_token_var}}
   "amount": 100
 }
 
-### 【超级管理员】 通过提现审批并给用户打款
+### 用户获取自己的提现记录
+### status可以传:10待审批 20审批通过等待放款 30提现完成 40提现被拒绝,留空就不过滤,推荐默认不传
+POST {{ baseUrl }}/withdraw/list
+Content-Type: application/json
+dl-token: {{dl_token_var}}
+
+{
+  "page_number": 1,
+  "page_size": 100
+}
+### 返回值解释
+### list 分页结果的实际列表数据 
+### page_number 当前页码
+### page_size 每页大小
+### total_page 总页数
+### total_row  当前分页的总数
+### total_user_count 符合条件的总记录数
+
+### 【超级管理员、审核管理员】 通过提现审批并给用户打款
 ### 对接之前一定要让管理员多确认一次,不要点pass就直接提交到后台来了,确认给他放款(amount/100)元
 POST {{ baseUrl }}/withdraw/pass
 Content-Type: application/json
@@ -20,7 +38,7 @@ dl-token: {{dl_token_var}}
   "withdraw_sn": "DLTBH_WD_17588834885852582"
 }
 
-### 【超级管理员】 拒绝该用户的提现申请
+### 【超级管理员、审核管理员】 拒绝该用户的提现申请, reason是拒绝理由
 ### 对接之前一定要让管理员多确认一次,不要点pass就直接提交到后台来了,确认给他放款(amount/100)元
 POST {{ baseUrl }}/withdraw/refuse
 Content-Type: application/json
@@ -30,3 +48,22 @@ dl-token: {{dl_token_var}}
   "withdraw_sn": "DLTBH_WD_17588820871315418",
   "reason": "你提的太多了"
 }
+
+### 【超级管理员、审核管理员】 获取list
+### status可以传:10待审批 20审批通过等待放款 30提现完成 40提现被拒绝,留空就不过滤,推荐默认传一个10待审批,方便财务使用
+POST {{ baseUrl }}/withdraw/listByAdmin
+Content-Type: application/json
+dl-token: {{dl_token_var}}
+
+{
+  "page_number": 1,
+  "page_size": 100,
+  "status": 10
+}
+### 返回值解释
+### list 分页结果的实际列表数据 
+### page_number 当前页码
+### page_size 每页大小
+### total_page 总页数
+### total_row  当前分页的总数
+### total_user_count 符合条件的总记录数