From d316bb675645f8713702f5608696c582628aa916 Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Wed, 15 Oct 2025 14:29:24 +0800 Subject: [PATCH] =?UTF-8?q?10.15=E9=80=80=E6=AC=BE=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/cash/CashRefundController.java | 17 ++- .../controller/cash/RefundApprovalController.java | 142 +++++++++++++++++++++ .../demo/domain/DTO/RefundApprovalRequest.java | 27 ++++ .../java/com/example/demo/domain/vo/cash/User.java | 8 +- .../demo/service/cash/RefundApprovalService.java | 39 +++--- .../example/demo/service/cash/RefundService.java | 2 +- .../serviceImpl/cash/CashRefundServiceImpl.java | 24 +++- src/main/resources/cashMapper/CashRefundMapper.xml | 2 - 8 files changed, 228 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/example/demo/controller/cash/RefundApprovalController.java create mode 100644 src/main/java/com/example/demo/domain/DTO/RefundApprovalRequest.java diff --git a/src/main/java/com/example/demo/controller/cash/CashRefundController.java b/src/main/java/com/example/demo/controller/cash/CashRefundController.java index b2fd794..d4895a9 100644 --- a/src/main/java/com/example/demo/controller/cash/CashRefundController.java +++ b/src/main/java/com/example/demo/controller/cash/CashRefundController.java @@ -6,8 +6,9 @@ import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.cash.CashRecordDone; import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Result; +import com.example.demo.service.cash.RefundService; import com.example.demo.service.coin.MarketService; -import com.example.demo.serviceImpl.cash.CashRefundServiceImpl; + import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; @@ -38,7 +39,7 @@ import java.util.List; @CrossOrigin public class CashRefundController { @Autowired - private CashRefundServiceImpl cashRefundServiceImpl; + private RefundService refundService; @Autowired MarketService marketService; @@ -82,14 +83,18 @@ public class CashRefundController { } // 校验通过,保持 requestedMarkets 不变 } - return Result.success(cashRefundServiceImpl.select(page.getPageNum(),page.getPageSize(),page.getCashRecordDone())); + return Result.success(refundService.select(page.getPageNum(),page.getPageSize(),page.getCashRecordDone())); } @PostMapping("/add") - public Result add(@RequestBody CashRecordDone cashCollection){ - return Result.success(cashRefundServiceImpl.add(cashCollection)); + public Result add(@RequestBody CashRecordDone cashRecordDone){ + try { + return Result.success(refundService.add(cashRecordDone)); + } catch (Exception e) { + return Result.error("请检查数据的格式"); + } } @PostMapping("/update") public Result update(@RequestBody CashRecordDone cashRecordDone){ - return Result.success(cashRefundServiceImpl.update(cashRecordDone)); + return Result.success(refundService.update(cashRecordDone)); } } diff --git a/src/main/java/com/example/demo/controller/cash/RefundApprovalController.java b/src/main/java/com/example/demo/controller/cash/RefundApprovalController.java new file mode 100644 index 0000000..a86c889 --- /dev/null +++ b/src/main/java/com/example/demo/controller/cash/RefundApprovalController.java @@ -0,0 +1,142 @@ +package com.example.demo.controller.cash; + + + +import com.example.demo.domain.DTO.RefundApprovalRequest; +import com.example.demo.domain.vo.cash.CashRecord; +import com.example.demo.domain.vo.cash.User; +import com.example.demo.service.cash.RefundApprovalService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/refund-approval") +@RequiredArgsConstructor +public class RefundApprovalController { + + private final RefundApprovalService refundApprovalService; + + /** + * 获取用户可审批的退款订单列表 + */ + @PostMapping("/approvable-orders") + public Map getApprovableRefundOrders(@RequestBody User user) { + try { + List approvableOrders = refundApprovalService.getApprovableRefundOrders(user); + + Map response = new HashMap<>(); + response.put("success", true); + response.put("message", "获取可审批订单成功"); + response.put("data", approvableOrders); + response.put("total", approvableOrders.size()); + + return response; + + } catch (Exception e) { + Map response = new HashMap<>(); + response.put("success", false); + response.put("message", "获取可审批订单失败: " + e.getMessage()); + response.put("data", new ArrayList<>()); + response.put("total", 0); + return response; + } + } + /** + * 提交退款审批 + */ + @PostMapping("/submit") + public Map submitRefundApproval(@RequestBody RefundApprovalRequest request) { + boolean success = refundApprovalService.submitRefundApproval( + request.getUser(), + request.getCashRecord(), + request.getApprovalResult(), + request.getComments() + ); + + Map response = new HashMap<>(); + response.put("success", success); + response.put("message", success ? "退款审批提交成功" : "退款审批提交失败,无权限"); + response.put("orderStatus", request.getCashRecord().getStatus()); + response.put("currentLevel", request.getCashRecord().getCurrentApprovalLevel()); + + return response; + } + + /** + * 撤回退款订单(在第一个审批节点前) + */ + @PostMapping("/withdraw") + public Map withdrawRefundOrder(@RequestBody RefundApprovalRequest request) { + + boolean success = refundApprovalService.withdrawRefundOrder(request.getUser(),request.getCashRecord(), request.getWithdrawReason()); + + return Map.of( + "success", success, + "message", success ? "退款订单撤回成功" : "退款订单撤回失败", + "orderStatus", request.getCashRecord().getStatus() + ); + } + + /** + * 重新提交撤回的退款订单 + */ + @PostMapping("/resubmit") + public Map resubmitRefundOrder(@RequestBody RefundApprovalRequest request) { + + boolean success = refundApprovalService.resubmitRefundOrder(request.getUser(), request.getCashRecord()); + + return Map.of( + "success", success, + "message", success ? "退款订单重新提交成功" : "退款订单重新提交失败", + "orderStatus", request.getCashRecord().getStatus() + ); + } + + /** + * 检查退款审批权限 + */ + @GetMapping("/check-permission") + public Map checkPermission(@RequestBody RefundApprovalRequest request) { + + + boolean hasPermission = refundApprovalService.canUserApproveOrder(request.getUser(), request.getCashRecord()); + boolean canWithdraw = refundApprovalService.canUserWithdrawOrder(request.getUser(), request.getCashRecord()); + List visibleStatuses = refundApprovalService.getUserVisibleStatuses(request.getUser(), request.getCashRecord()); + + return Map.of( + "hasApprovalPermission", hasPermission, + "canWithdraw", canWithdraw, + "visibleStatuses", visibleStatuses, + "currentLevel", request.getCashRecord().getCurrentApprovalLevel(), + "orderStatus", request.getCashRecord().getStatus() + ); + } + + /** + * 获取用户可见的退款审批状态 + */ + @GetMapping("/visible-statuses") + public List getVisibleStatuses(@RequestBody RefundApprovalRequest request) { + + + return refundApprovalService.getUserVisibleStatuses(request.getUser(), request.getCashRecord()); + } + +// // 创建模拟用户(实际项目中应从数据库获取) +// private User createMockUser(Integer userId) { +// User user = new User(); +// user.setId(userId); +// user.setName("测试用户"); +// user.setMarket("北京"); +// user.setMarketId(4); // 假设4是北京的地区ID +// user.setRoles(Set.of(RefundApprovalService.ROLE_REGIONAL_FINANCE)); +// user.setManagedMarketIds(Set.of(4)); // 管辖北京地区 +// user.setManagedMarketNames(Set.of("北京")); +// return user; +// } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/DTO/RefundApprovalRequest.java b/src/main/java/com/example/demo/domain/DTO/RefundApprovalRequest.java new file mode 100644 index 0000000..816c78e --- /dev/null +++ b/src/main/java/com/example/demo/domain/DTO/RefundApprovalRequest.java @@ -0,0 +1,27 @@ +package com.example.demo.domain.DTO; + +import com.example.demo.domain.vo.cash.CashRecord; +import com.example.demo.domain.vo.cash.User; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @program: GOLD + * @ClassName RefundApprovalRequest + * @description: + * @author: huangqizhen + * @create: 2025−10-14 15:02 + * @Version 1.0 + **/ +@Data +@NoArgsConstructor +public class RefundApprovalRequest { + private User user; + private CashRecord cashRecord; + private String approvalResult; + private String comments; + private String withdrawReason; + private List orders; +} diff --git a/src/main/java/com/example/demo/domain/vo/cash/User.java b/src/main/java/com/example/demo/domain/vo/cash/User.java index 92ebd8c..42c1cb0 100644 --- a/src/main/java/com/example/demo/domain/vo/cash/User.java +++ b/src/main/java/com/example/demo/domain/vo/cash/User.java @@ -9,7 +9,7 @@ public class User { private Integer id; private String name; private Integer marketId; // 关联market表的id - private String marketName; // 地区名称 + private String market; // 地区名称 private Set roles = new HashSet<>(); private Set managedMarketIds = new HashSet<>(); // 管辖的地区ID列表 private Set managedMarketNames = new HashSet<>(); // 管辖的地区名称列表 @@ -55,7 +55,7 @@ public class User { return managedMarketNames.contains(targetMarketName); } - return targetMarketName.equals(this.marketName); + return targetMarketName.equals(this.market); } // 获取用户的所有管辖地区ID @@ -76,8 +76,8 @@ public class User { if (managedMarketNames != null && !managedMarketNames.isEmpty()) { allMarketNames.addAll(managedMarketNames); } - if (marketName != null) { - allMarketNames.add(marketName); + if (market != null) { + allMarketNames.add(market); } return allMarketNames; } diff --git a/src/main/java/com/example/demo/service/cash/RefundApprovalService.java b/src/main/java/com/example/demo/service/cash/RefundApprovalService.java index 2d7bb45..09eea6a 100644 --- a/src/main/java/com/example/demo/service/cash/RefundApprovalService.java +++ b/src/main/java/com/example/demo/service/cash/RefundApprovalService.java @@ -147,26 +147,27 @@ public class RefundApprovalService { return isSubmitter && cashRecord.canWithdraw(); } - // 获取用户可审批的退款订单列表(基于地区ID) - public List getApprovableRefundOrders(User user, List allOrders) { - List approvableOrders = new ArrayList<>(); - - // 获取用户管辖的所有具体市场ID - Set userManagedMarketIds = marketService.getUserManagedSpecificMarketIds(user); - - for (CashRecord order : allOrders) { - if (order.isRefundOrder() && canUserApproveOrder(user, order)) { - // 额外检查地区权限 - Integer orderMarketId = order.getPrimaryMarketId(); - if (orderMarketId != null && userManagedMarketIds.contains(orderMarketId)) { - approvableOrders.add(order); - } - } - } - - return approvableOrders; + public List getApprovableRefundOrders(User user) { +// // 1. 获取用户管辖的所有具体市场ID +// Set userManagedMarketIds = marketService.getUserManagedSpecificMarketIds(user); +// +// if (userManagedMarketIds.isEmpty()) { +// log.warn("用户{}没有管辖的市场", user.getId()); +// return new ArrayList<>(); +// } +// +// // 2. 从数据库查询待审批的退款订单 +// List pendingOrders = cashRecordRepository.findByStatusAndMarketIdIn( +// "PENDING_APPROVAL", +// userManagedMarketIds +// ); +// +// // 3. 过滤出用户有权限审批的订单 +// return pendingOrders.stream() +// .filter(order -> order.isRefundOrder() && canUserApproveOrder(user, order)) +// .collect(Collectors.toList()); + return null; } - // 提交退款审批 public boolean submitRefundApproval(User user, CashRecord cashRecord, String approvalResult, String comments) { if (!canUserApproveOrder(user, cashRecord)) { diff --git a/src/main/java/com/example/demo/service/cash/RefundService.java b/src/main/java/com/example/demo/service/cash/RefundService.java index d2a9098..76eec8b 100644 --- a/src/main/java/com/example/demo/service/cash/RefundService.java +++ b/src/main/java/com/example/demo/service/cash/RefundService.java @@ -14,7 +14,7 @@ import com.github.pagehelper.PageInfo; **/ public interface RefundService { PageInfo select(Integer pageNum, Integer pageSize, CashRecordDone cashRecordDone); - int add(CashRecordDone cashRecordDone); + int add(CashRecordDone cashRecordDone) throws Exception; int update(CashRecordDone cashRecordDone); } diff --git a/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java index 51efebe..9a1e48e 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java @@ -1,5 +1,6 @@ package com.example.demo.serviceImpl.cash; +import com.example.demo.domain.entity.CashRecord; import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashRecordDone; import com.example.demo.mapper.cash.CashRefundMapper; @@ -10,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import java.util.UUID; /** * @program: GOLD @@ -34,7 +36,27 @@ public class CashRefundServiceImpl implements RefundService { } @Override - public int add(CashRecordDone cashRecordDone) { + public int add(CashRecordDone cashRecordDone) throws Exception { + if(cashRecordDone.getJwcode()==null){ + throw new Exception("未输入精网号") ; + } + if(cashRecordDone.getPaymentAmount()== null){ + throw new Exception("未输入付款金额") ; + } + if(cashRecordDone.getPaymentCurrency()== null){ + throw new Exception("未输入付款币种") ; + } + if(cashRecordDone.getRefundModel()== null){ + throw new Exception("请填充退款类型") ; + } + if(cashRecordDone.getRefundReason()== null){ + throw new Exception("请填写退款理由") ; + } + cashRecordDone.setOrderType(2); + //生成订单号后半部分 + String orderNumber = UUID.randomUUID().toString().replaceAll("-", ""); + //构建订单信息 + cashRecordDone.setOrderCode("TKXJ_" + orderNumber); //订单号 return cashRefundMapper.insert(cashRecordDone); } diff --git a/src/main/resources/cashMapper/CashRefundMapper.xml b/src/main/resources/cashMapper/CashRefundMapper.xml index e71968e..b5f5650 100644 --- a/src/main/resources/cashMapper/CashRefundMapper.xml +++ b/src/main/resources/cashMapper/CashRefundMapper.xml @@ -28,8 +28,6 @@ refund_model, executor, refund_channels, - refund_currency, - refund_amount, refund_time, refund_remark, refund_voucher,