From 2dde58dfb3ac4e1824fc864142d1d5dc1f132570 Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Thu, 16 Oct 2025 13:53:06 +0800 Subject: [PATCH 01/10] =?UTF-8?q?10.16=E4=BF=AE=E6=94=B9=E5=9C=B0=E5=8C=BA?= =?UTF-8?q?=E4=BC=A0=E8=BE=93id=E4=B8=8E=E5=90=8D=E7=A7=B0=E6=98=A0?= =?UTF-8?q?=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java | 4 ++++ src/main/resources/cashMapper/CashRecordMapper.xml | 5 ----- src/main/resources/cashMapper/CashRefundMapper.xml | 6 +++--- 3 files changed, 7 insertions(+), 8 deletions(-) delete mode 100644 src/main/resources/cashMapper/CashRecordMapper.xml 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 a3b192c..4a0be2e 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java @@ -5,6 +5,7 @@ import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashRecordDone; import com.example.demo.domain.vo.coin.Result; import com.example.demo.mapper.cash.CashRefundMapper; +import com.example.demo.service.cash.MarketService; import com.example.demo.service.cash.RefundService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -28,10 +29,13 @@ public class CashRefundServiceImpl implements RefundService { @Autowired private CashRefundMapper cashRefundMapper; + @Autowired + private MarketService marketService; @Override public PageInfo select(Integer pageNum, Integer pageSize,CashRecordDone cashRecordDone) { PageHelper.startPage(pageNum, pageSize); // System.out.println(goldDetail.getMarkets()); + cashRecordDone.setMarket(String.valueOf(marketService.getMarketById(Integer.valueOf(cashRecordDone.getMarket())))); List list = cashRefundMapper.select(cashRecordDone); return new PageInfo<>(list); } diff --git a/src/main/resources/cashMapper/CashRecordMapper.xml b/src/main/resources/cashMapper/CashRecordMapper.xml deleted file mode 100644 index 3a018e2..0000000 --- a/src/main/resources/cashMapper/CashRecordMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/main/resources/cashMapper/CashRefundMapper.xml b/src/main/resources/cashMapper/CashRefundMapper.xml index 6aaa514..ff7bcd0 100644 --- a/src/main/resources/cashMapper/CashRefundMapper.xml +++ b/src/main/resources/cashMapper/CashRefundMapper.xml @@ -81,11 +81,11 @@ update cash_record set status = 11 - where order_code =2 and id = #{id} + where order_type =2 and id = #{id} update cash_record set status = #{status},executor = #{executor},reject_reason = #{rejectReason} - where order_code =2 and id = #{id} + where order_type =2 and id = #{id} update cash_record set refund_currency = #{refundCurrency}, @@ -95,7 +95,7 @@ refund_remark = #{refundRemark}, refund_voucher = #{refundVoucher}, status = #{status} - where order_code =2 and id = #{id} + where order_type =2 and id = #{id} From d7e324acec16d265ece3531691372d91b5839da0 Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Thu, 16 Oct 2025 14:52:44 +0800 Subject: [PATCH 02/10] =?UTF-8?q?10.16=E4=BF=AE=E6=94=B9=E5=9C=B0=E5=8C=BA?= =?UTF-8?q?=E4=BC=A0=E8=BE=93id=E4=B8=8E=E5=90=8D=E7=A7=B0=E6=98=A0?= =?UTF-8?q?=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java | 1 + .../java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java | 4 ---- src/main/resources/cashMapper/CashRefundMapper.xml | 2 ++ 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java b/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java index b171961..0adb9aa 100644 --- a/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java +++ b/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java @@ -97,6 +97,7 @@ public class CashRecordDone { private String executorName; private String refundCurrency; private String refundAmount; + private String marketName; private String processInstanceId; // 流程实例ID private String currentTaskId; // 当前任务ID 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 4a0be2e..a3b192c 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java @@ -5,7 +5,6 @@ import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashRecordDone; import com.example.demo.domain.vo.coin.Result; import com.example.demo.mapper.cash.CashRefundMapper; -import com.example.demo.service.cash.MarketService; import com.example.demo.service.cash.RefundService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -29,13 +28,10 @@ public class CashRefundServiceImpl implements RefundService { @Autowired private CashRefundMapper cashRefundMapper; - @Autowired - private MarketService marketService; @Override public PageInfo select(Integer pageNum, Integer pageSize,CashRecordDone cashRecordDone) { PageHelper.startPage(pageNum, pageSize); // System.out.println(goldDetail.getMarkets()); - cashRecordDone.setMarket(String.valueOf(marketService.getMarketById(Integer.valueOf(cashRecordDone.getMarket())))); List list = cashRefundMapper.select(cashRecordDone); return new PageInfo<>(list); } diff --git a/src/main/resources/cashMapper/CashRefundMapper.xml b/src/main/resources/cashMapper/CashRefundMapper.xml index ff7bcd0..7532bc6 100644 --- a/src/main/resources/cashMapper/CashRefundMapper.xml +++ b/src/main/resources/cashMapper/CashRefundMapper.xml @@ -139,10 +139,12 @@ a1.admin_name as submitterName, a2.admin_name as auditName, a3.admin_name as executorName + m.name as marketName, from cash_record cr left join admin a1 on submitter_id = a1.id left join admin a2 on audit_id = a2.id left join admin a3 on executor = a3.account + left join market m on m.id = cr.market cr.order_type = 2 From 4b0ee73755422adb59bf3aba6ed50b25dfb44e05 Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Thu, 16 Oct 2025 14:54:55 +0800 Subject: [PATCH 03/10] =?UTF-8?q?10.16=E4=BF=AE=E6=94=B9=E5=9C=B0=E5=8C=BA?= =?UTF-8?q?=E4=BC=A0=E8=BE=93id=E4=B8=8E=E5=90=8D=E7=A7=B0=E6=98=A0?= =?UTF-8?q?=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/cashMapper/CashRefundMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/cashMapper/CashRefundMapper.xml b/src/main/resources/cashMapper/CashRefundMapper.xml index 7532bc6..a2524ad 100644 --- a/src/main/resources/cashMapper/CashRefundMapper.xml +++ b/src/main/resources/cashMapper/CashRefundMapper.xml @@ -138,8 +138,8 @@ cr.audit_time, a1.admin_name as submitterName, a2.admin_name as auditName, - a3.admin_name as executorName - m.name as marketName, + a3.admin_name as executorName, + m.name as marketName from cash_record cr left join admin a1 on submitter_id = a1.id left join admin a2 on audit_id = a2.id From 09b876697e2245a50e049db836bc12feb7bc7a3f Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Thu, 16 Oct 2025 15:54:03 +0800 Subject: [PATCH 04/10] =?UTF-8?q?10.16=E4=BF=AE=E6=94=B9=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/demo/controller/coin/AdminController.java | 2 -- src/main/java/com/example/demo/domain/entity/Admin.java | 2 +- .../java/com/example/demo/domain/vo/cash/CashRecordDone.java | 1 + src/main/resources/cashMapper/CashRefundMapper.xml | 9 +++++++++ 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/demo/controller/coin/AdminController.java b/src/main/java/com/example/demo/controller/coin/AdminController.java index 0b6f52e..704c7ef 100644 --- a/src/main/java/com/example/demo/controller/coin/AdminController.java +++ b/src/main/java/com/example/demo/controller/coin/AdminController.java @@ -64,8 +64,6 @@ public class AdminController { String token = token1; try { - - return JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); } catch (Exception e) { throw new RuntimeException(e); diff --git a/src/main/java/com/example/demo/domain/entity/Admin.java b/src/main/java/com/example/demo/domain/entity/Admin.java index ca18e81..495193e 100644 --- a/src/main/java/com/example/demo/domain/entity/Admin.java +++ b/src/main/java/com/example/demo/domain/entity/Admin.java @@ -27,7 +27,7 @@ public class Admin implements UserDetails, Serializable { private Byte adminStatus; // 状态(启用/不启用) private List market; // 地区列表 private String markets; // 地区 - + private String roleKey; private String postiton; // 职位 private String remark; // 备注 diff --git a/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java b/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java index 0adb9aa..b9afe75 100644 --- a/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java +++ b/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java @@ -98,6 +98,7 @@ public class CashRecordDone { private String refundCurrency; private String refundAmount; private String marketName; + private List statuses; private String processInstanceId; // 流程实例ID private String currentTaskId; // 当前任务ID diff --git a/src/main/resources/cashMapper/CashRefundMapper.xml b/src/main/resources/cashMapper/CashRefundMapper.xml index a2524ad..e4386fd 100644 --- a/src/main/resources/cashMapper/CashRefundMapper.xml +++ b/src/main/resources/cashMapper/CashRefundMapper.xml @@ -165,6 +165,12 @@ #{markets} + + AND cr.status IN + + #{statuses} + + AND cr.payment_currency = #{paymentCurrency} @@ -181,6 +187,9 @@ and cr.`pay_time` BETWEEN #{startTime} AND #{endTime} + + and cr.submitter_id = #{submitterId} + \ No newline at end of file From 3b94650a2b797adb335b9cf9e93721749d26dc33 Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Fri, 17 Oct 2025 13:51:58 +0800 Subject: [PATCH 05/10] =?UTF-8?q?10.17=E6=96=B0=E5=A2=9E=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/cash/CashRefundController.java | 10 +++++----- src/main/resources/cashMapper/CashRefundMapper.xml | 15 ++++----------- 2 files changed, 9 insertions(+), 16 deletions(-) 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 0d00026..e845825 100644 --- a/src/main/java/com/example/demo/controller/cash/CashRefundController.java +++ b/src/main/java/com/example/demo/controller/cash/CashRefundController.java @@ -92,7 +92,7 @@ public class CashRefundController { try { return Result.success(refundService.add(cashRecordDone)); } catch (Exception e) { - return Result.error("请检查数据的格式"); + return Result.error(e.getMessage()); } } @@ -111,10 +111,10 @@ public class CashRefundController { public Result review(@RequestBody CashRecordDone cashRecordDone) { return Result.success(refundService.review(cashRecordDone)); } -// @PostMapping("/finalReview") -// public Result finalReview(@RequestBody CashRecordDone cashRecordDone) { -// return Result.success(refundService.review(cashRecordDone)); -// } + @PostMapping("/finalReview") + public Result finalReview(@RequestBody CashRecordDone cashRecordDone) { + return Result.success(refundService.review(cashRecordDone)); + } @PostMapping("/executor") public Result executor(@RequestBody CashRecordDone cashRecordDone) { return Result.success(refundService.executor(cashRecordDone)); diff --git a/src/main/resources/cashMapper/CashRefundMapper.xml b/src/main/resources/cashMapper/CashRefundMapper.xml index e4386fd..949c877 100644 --- a/src/main/resources/cashMapper/CashRefundMapper.xml +++ b/src/main/resources/cashMapper/CashRefundMapper.xml @@ -31,9 +31,7 @@ refund_channels, refund_time, refund_remark, - refund_voucher, - create_time, - update_time + refund_voucher ) VALUES ( #{orderType}, #{jwcode}, @@ -43,7 +41,7 @@ #{orderCode}, #{bankCode}, #{goodsName}, - #{goodsNum}, + #{goodNum}, #{paymentCurrency}, #{paymentAmount}, #{receivedCurrency}, @@ -53,23 +51,18 @@ #{payType}, #{payTime}, #{receivedTime}, + #{status}, #{submitterId}, #{voucher}, #{remark}, - #{status}, #{refundReason}, #{refundModel}, #{executor}, #{refundChannels}, - #{refundCurrency}, - #{refundAmount}, #{refundTime}, #{refundRemark}, - #{refundVoucher}, - #{createTime}, - #{updateTime}, + #{refundVoucher} ); - update cash_record From 2457e239264bc9dd2becf3911db2b7a7a2b679e1 Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Fri, 17 Oct 2025 14:40:57 +0800 Subject: [PATCH 06/10] =?UTF-8?q?10.17=E6=96=B0=E5=A2=9E=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 a3b192c..55e1b8c 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java @@ -57,6 +57,7 @@ public class CashRefundServiceImpl implements RefundService { throw new Exception("请填写退款理由") ; } cashRecordDone.setOrderType(2); + cashRecordDone.setStatus(10); //生成订单号后半部分 String orderNumber = UUID.randomUUID().toString().replaceAll("-", ""); //构建订单信息 @@ -81,7 +82,7 @@ public class CashRefundServiceImpl implements RefundService { throw new RuntimeException("请填写退款理由"); } int result = cashRefundMapper.update(cashRecordDone); - return (result > 0 ? Result.success("重新提交成功") : Result.error("重新提交失败")).getCode(); + return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode(); } @Override @@ -92,7 +93,7 @@ public class CashRefundServiceImpl implements RefundService { @Override public int review(CashRecordDone cashRecordDone) { int result = cashRefundMapper.review(cashRecordDone); - return (result > 0 ? Result.success("重新提交成功") : Result.error("重新提交失败")).getCode(); + return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode(); } @Override @@ -116,6 +117,6 @@ public class CashRefundServiceImpl implements RefundService { throw new RuntimeException("未输入退款金额"); } int result = cashRefundMapper.executor(cashRecordDone); - return (result > 0 ? Result.success("重新提交成功") : Result.error("重新提交失败")).getCode(); + return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode(); } } From c69c0825347c0aff7fa66ad3f5caf283b52a959f Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Fri, 17 Oct 2025 15:04:12 +0800 Subject: [PATCH 07/10] =?UTF-8?q?10.17=E4=BF=AE=E6=94=B9=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E7=B1=BB=E7=B2=BE=E7=AE=80=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/config/cash/DataInitializer.java | 70 ------ .../demo/config/cash/RefundApprovalFlowConfig.java | 92 ------- .../controller/cash/RefundApprovalController.java | 117 --------- .../demo/domain/DTO/RefundApprovalRequest.java | 27 --- .../example/demo/domain/vo/cash/CashRecord.java | 244 ------------------- .../demo/domain/vo/cash/CashRecordDone.java | 8 +- .../com/example/demo/domain/vo/cash/Market.java | 43 ---- .../demo/domain/vo/cash/RefundApprovalRecord.java | 43 ---- .../java/com/example/demo/domain/vo/cash/User.java | 84 ------- .../example/demo/mapper/cash/CashRefundMapper.java | 2 +- .../example/demo/service/cash/MarketService.java | 173 -------------- .../demo/service/cash/RefundApprovalService.java | 266 --------------------- .../example/demo/service/cash/RefundService.java | 3 +- .../serviceImpl/cash/CashRefundServiceImpl.java | 8 +- 14 files changed, 10 insertions(+), 1170 deletions(-) delete mode 100644 src/main/java/com/example/demo/config/cash/DataInitializer.java delete mode 100644 src/main/java/com/example/demo/config/cash/RefundApprovalFlowConfig.java delete mode 100644 src/main/java/com/example/demo/controller/cash/RefundApprovalController.java delete mode 100644 src/main/java/com/example/demo/domain/DTO/RefundApprovalRequest.java delete mode 100644 src/main/java/com/example/demo/domain/vo/cash/CashRecord.java delete mode 100644 src/main/java/com/example/demo/domain/vo/cash/Market.java delete mode 100644 src/main/java/com/example/demo/domain/vo/cash/RefundApprovalRecord.java delete mode 100644 src/main/java/com/example/demo/domain/vo/cash/User.java delete mode 100644 src/main/java/com/example/demo/service/cash/MarketService.java delete mode 100644 src/main/java/com/example/demo/service/cash/RefundApprovalService.java diff --git a/src/main/java/com/example/demo/config/cash/DataInitializer.java b/src/main/java/com/example/demo/config/cash/DataInitializer.java deleted file mode 100644 index 15ceb0f..0000000 --- a/src/main/java/com/example/demo/config/cash/DataInitializer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.example.demo.config.cash; - - - -import com.example.demo.domain.vo.cash.Market; -import com.example.demo.service.cash.MarketService; -import com.example.demo.service.cash.RefundApprovalService; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.CommandLineRunner; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.List; - -@Component -@RequiredArgsConstructor -public class DataInitializer implements CommandLineRunner { - - private final MarketService marketService; - private final RefundApprovalService refundApprovalService; - - @Override - public void run(String... args) throws Exception { - // 初始化地区数据 - initializeMarketData(); - } - - private void initializeMarketData() { - List markets = Arrays.asList( - createMarket(1, "Capt", -1, "Capt-Capt-Capt-Capt", 0), - createMarket(2, "公司", 1, "Capt-公司-公司-公司", 1), - createMarket(3, "市场", 1, "Capt-市场部-市场部-市场部", 1), - createMarket(4, "新加坡", 3, "Capt-市场部-新加坡-新加坡", 2), - createMarket(5, "马来西亚", 3, "Capt-市场部-马来西亚-马来西亚", 2), - createMarket(9, "研发部", 2, "Capt-公司-研发部-研发部", 2), - createMarket(13, "香港", 3, "Capt-市场部-香港-香港", 2), - createMarket(9999, "总部", 2, "Capt-公司-总部-总部", 2), - createMarket(24016, "加拿大", 3, "Capt-市场部-加拿大-加拿大", 2), - createMarket(24018, "泰国", 3, "Capt-市场部-泰国-泰国", 2), - createMarket(24022, "越南HCM", 3, "Capt-市场部-越南HCM-越南HCM", 2), - createMarket(24027, "韩国", 3, "Capt-市场部-韩国-韩国", 2), - createMarket(24028, "深圳运营", 3, "Capt-市场部-深圳运营-深圳运营", 2), - createMarket(24030, "未知", 3, "Capt-市场部-未知", 2), - createMarket(24031, "其他", 3, "Capt-市场部-其他", 2), - createMarket(24032, "市场部", 3, "Capt-市场部-市场部", 2) - ); - - marketService.initializeMarkets(markets); - - // 为特定市场初始化审批流程 - refundApprovalService.initializeFlowForMarketName("新加坡"); - refundApprovalService.initializeFlowForMarketName("马来西亚"); - refundApprovalService.initializeFlowForMarketName("香港"); - refundApprovalService.initializeFlowForMarketName("加拿大"); - refundApprovalService.initializeFlowForMarketName("泰国"); - refundApprovalService.initializeFlowForMarketName("越南HCM"); - refundApprovalService.initializeFlowForMarketName("韩国"); - refundApprovalService.initializeFlowForMarketName("深圳运营"); - } - - private Market createMarket(Integer id, String name, Integer parentId, String treelist, Integer type) { - Market market = new Market(); - market.setId(id); - market.setName(name); - market.setParentId(parentId); - market.setTreelist(treelist); - market.setType(type); - return market; - } -} \ No newline at end of file diff --git a/src/main/java/com/example/demo/config/cash/RefundApprovalFlowConfig.java b/src/main/java/com/example/demo/config/cash/RefundApprovalFlowConfig.java deleted file mode 100644 index e1014ff..0000000 --- a/src/main/java/com/example/demo/config/cash/RefundApprovalFlowConfig.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.example.demo.config.cash; - -import com.example.demo.Node.RefundApprovalNode; -import com.example.demo.domain.vo.cash.User; -import lombok.Data; -import java.util.ArrayList; -import java.util.List; - -@Data -public class RefundApprovalFlowConfig { - private String flowName; - private List nodes; - - public RefundApprovalFlowConfig() { - this.nodes = new ArrayList<>(); - } - - public RefundApprovalFlowConfig(String flowName, List nodes) { - this.flowName = flowName; - this.nodes = nodes != null ? nodes : new ArrayList<>(); - } - - // 获取用户可见的状态列表(基于角色和地区ID权限) - public List getVisibleStatuses(User user, Integer orderMarketId) { - List visibleStatuses = new ArrayList<>(); - - for (RefundApprovalNode node : nodes) { - if (isNodeVisibleToUser(node, user, orderMarketId)) { - visibleStatuses.add(node.getLevel()); - } - } - return visibleStatuses; - } - - // 判断节点对用户是否可见(基于角色和地区ID权限) - public boolean isNodeVisibleToUser(RefundApprovalNode node, User user, Integer orderMarketId) { - if (node == null || user == null) return false; - - // 检查角色权限 - boolean hasRolePermission = true; - if (node.getRoles() != null && !node.getRoles().isEmpty()) { - hasRolePermission = user.hasAnyRole(node.getRoles()); - } - - // 检查地区权限 - boolean hasMarketPermission = true; - if (node.getAllowedMarketIds() != null && !node.getAllowedMarketIds().isEmpty()) { - // 如果节点限制了地区,用户需要在这些地区有权限 - hasMarketPermission = user.canApproveAnyMarket(node.getAllowedMarketIds()); - } else if (orderMarketId != null) { - // 如果节点没有限制地区,但订单有地区,用户需要在该订单地区有权限 - hasMarketPermission = user.canApproveMarket(orderMarketId); - } - - return hasRolePermission && hasMarketPermission; - } - - // 判断用户是否可以审批某个节点的订单 - public boolean canUserApproveNode(User user, Integer level, Integer orderMarketId) { - RefundApprovalNode node = findNodeByLevel(level); - if (node == null) return false; - - return isNodeVisibleToUser(node, user, orderMarketId); - } - - // 根据级别查找节点 - public RefundApprovalNode findNodeByLevel(Integer level) { - if (nodes == null) return null; - return nodes.stream() - .filter(node -> level.equals(node.getLevel())) - .findFirst() - .orElse(null); - } - - // 获取下一个审批节点 - public RefundApprovalNode getNextNode(Integer currentLevel) { - if (nodes == null || nodes.isEmpty()) return null; - - return nodes.stream() - .filter(node -> node.getLevel() > currentLevel) - .min((a, b) -> a.getLevel().compareTo(b.getLevel())) - .orElse(null); - } - - // 获取所有涉及的市场ID - public java.util.Set getAllInvolvedMarketIds() { - return nodes.stream() - .filter(node -> node.getAllowedMarketIds() != null) - .flatMap(node -> node.getAllowedMarketIds().stream()) - .collect(java.util.stream.Collectors.toSet()); - } -} \ No newline at end of file diff --git a/src/main/java/com/example/demo/controller/cash/RefundApprovalController.java b/src/main/java/com/example/demo/controller/cash/RefundApprovalController.java deleted file mode 100644 index 022edcc..0000000 --- a/src/main/java/com/example/demo/controller/cash/RefundApprovalController.java +++ /dev/null @@ -1,117 +0,0 @@ -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("/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 deleted file mode 100644 index 816c78e..0000000 --- a/src/main/java/com/example/demo/domain/DTO/RefundApprovalRequest.java +++ /dev/null @@ -1,27 +0,0 @@ -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/CashRecord.java b/src/main/java/com/example/demo/domain/vo/cash/CashRecord.java deleted file mode 100644 index d81312f..0000000 --- a/src/main/java/com/example/demo/domain/vo/cash/CashRecord.java +++ /dev/null @@ -1,244 +0,0 @@ -package com.example.demo.domain.vo.cash; - -import com.alibaba.excel.annotation.ExcelIgnore; -import com.alibaba.excel.annotation.ExcelProperty; -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Data; - -import java.math.BigDecimal; -import java.util.Date; - -@Data -public class CashRecord { - @ExcelProperty("序号") - private Integer id; - - @ExcelProperty("订单类型") - private Integer orderType; // 1:收款,2:退款 - - @ExcelProperty("精网号") - private Integer jwcode; - - @ExcelProperty("姓名") - private String name; - - @ExcelProperty("所属地区") - private String market; - - @ExcelProperty("活动名称") - private String activity; - - @ExcelProperty("金币订单号") - private String orderCode; - - @ExcelProperty("银行流水订单号") - private String bankCode; - - @ExcelProperty("商品名称") - private String goodsName; - - @ExcelProperty("产品数量") - private Integer goodNum; - - @ExcelProperty("币种") - private String paymentCurrency; - - @ExcelProperty("金额") - private BigDecimal paymentAmount; - - @ExcelProperty("到账币种") - private String receivedCurrency; - - @ExcelProperty("到账金额") - private BigDecimal receivedAmount; - - @ExcelProperty("手续费") - private BigDecimal handlingCharge; - - @ExcelProperty("支付方式") - private String payType; - - @ExcelProperty("到账地区") - private String receivedMarket; - - @ExcelProperty("付款日期") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") - private Date payTime; - - @ExcelProperty("到账日期") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") - private Date receivedTime; - - @ExcelIgnore - private Integer auditId; - - @ExcelProperty("订单状态") - private Integer status; - - @ExcelIgnore - private Integer submitterId; - - @ExcelProperty("转账凭证") - private String voucher; - - @ExcelProperty("备注") - private String remark; - - @ExcelProperty("驳回理由") - private String rejectReason; - - @ExcelProperty("退款理由") - private String refundReason; - - @ExcelProperty("退款方式") - private Integer refundModel; - - @ExcelProperty("退款执行人") - private Integer executor; - - @ExcelProperty("退款途径") - private String refundChannels; - - @ExcelProperty("退款日期") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai") - private Date refundTime; - - @ExcelProperty("退款备注") - private String refundRemark; - - @ExcelProperty("退款截图") - private String refundVoucher; - - @ExcelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") - private Date createTime; - - @ExcelProperty("更新时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") - private Date updateTime; - - @ExcelProperty("审核时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") - private Date auditTime; - - @ExcelProperty("收款备注") - private String receivedRemark; - - @ExcelIgnore - private Integer marketId; // 关联market表的id - - - @ExcelIgnore - private Integer receivedMarketId; // 到账地区ID - - // 获取订单的主要地区ID(用于审批权限判断) - public Integer getPrimaryMarketId() { - return marketId != null ? marketId : (receivedMarketId != null ? receivedMarketId : null); - } - - // 获取订单的主要地区名称 - public String getPrimaryMarketName() { - return market != null ? market : (receivedMarket != null ? receivedMarket : null); - } - - // 退款状态常量 - public static final Integer STATUS_REFUND_REGIONAL_FINANCE_PENDING = 10; // 地区财务待审核 - public static final Integer STATUS_REFUND_WITHDRAWN = 11; // 手动撤回待编辑提交 - public static final Integer STATUS_REFUND_REGIONAL_FINANCE_REJECTED = 12; // 地区财务驳回 - public static final Integer STATUS_REFUND_REGIONAL_MANAGER_PENDING = 20; // 地区负责人待审核 - public static final Integer STATUS_REFUND_REGIONAL_MANAGER_REJECTED = 22; // 地区负责人驳回 - public static final Integer STATUS_REFUND_HEADQUARTERS_FINANCE_PENDING = 30; // 总部财务待审核 - public static final Integer STATUS_REFUND_HEADQUARTERS_FINANCE_REJECTED = 32; // 总部财务驳回 - public static final Integer STATUS_REFUND_EXECUTOR_PENDING = 40; // 执行人待处理 - public static final Integer STATUS_REFUND_COMPLETED = 41; // 执行人已处理,退款结束 - - // 获取当前审批级别(只处理退款订单) - public Integer getCurrentApprovalLevel() { - if (!isRefundOrder()) { - return 0; - } - - switch (status) { - case 10: return 1; // 地区财务待审核 - case 11: return 0; // 手动撤回待编辑提交 - case 12: return -1; // 地区财务驳回 - case 20: return 2; // 地区负责人待审核 - case 22: return -2; // 地区负责人驳回 - case 30: return 3; // 总部财务待审核 - case 32: return -3; // 总部财务驳回 - case 40: return 4; // 执行人待处理 - case 41: return 5; // 退款结束 - default: return 0; - } - } - - // 检查是否为退款订单 - public boolean isRefundOrder() { - return orderType != null && orderType == 2; - } - - // 检查是否可以撤回(只有在地区财务待审核状态可以撤回) - public boolean canWithdraw() { - return isRefundOrder() && status != null && status == STATUS_REFUND_REGIONAL_FINANCE_PENDING; - } - - // 检查是否可以重新提交(只有在撤回状态可以重新提交) - public boolean canResubmit() { - return isRefundOrder() && status != null && status == STATUS_REFUND_WITHDRAWN; - } - - // 检查是否在审批流程中 - public boolean isInApprovalProcess() { - return isRefundOrder() && status != null && - (status == STATUS_REFUND_REGIONAL_FINANCE_PENDING || - status == STATUS_REFUND_REGIONAL_MANAGER_PENDING || - status == STATUS_REFUND_HEADQUARTERS_FINANCE_PENDING || - status == STATUS_REFUND_EXECUTOR_PENDING); - } - - // 获取下一个状态 - public Integer getNextStatus(boolean approved) { - if (!isRefundOrder()) { - return status; - } - - if (!approved) { - // 驳回状态 - switch (status) { - case 10: return STATUS_REFUND_REGIONAL_FINANCE_REJECTED; - case 20: return STATUS_REFUND_REGIONAL_MANAGER_REJECTED; - case 30: return STATUS_REFUND_HEADQUARTERS_FINANCE_REJECTED; - default: return status; - } - } - - // 审批通过状态 - switch (status) { - case 10: return STATUS_REFUND_REGIONAL_MANAGER_PENDING; - case 20: return STATUS_REFUND_HEADQUARTERS_FINANCE_PENDING; - case 30: return STATUS_REFUND_EXECUTOR_PENDING; - case 40: return STATUS_REFUND_COMPLETED; - default: return status; - } - } - - // 撤回订单 - public boolean withdraw() { - if (!canWithdraw()) { - return false; - } - this.status = STATUS_REFUND_WITHDRAWN; - this.updateTime = new Date(); - return true; - } - - // 重新提交订单 - public boolean resubmit() { - if (!canResubmit()) { - return false; - } - this.status = STATUS_REFUND_REGIONAL_FINANCE_PENDING; - this.updateTime = new Date(); - return true; - } -} \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java b/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java index b9afe75..de0b646 100644 --- a/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java +++ b/src/main/java/com/example/demo/domain/vo/cash/CashRecordDone.java @@ -38,13 +38,13 @@ public class CashRecordDone { /** 币种 */ private String paymentCurrency; /** 金额 */ - private BigDecimal paymentAmount; + private Integer paymentAmount; /** 到账币种 */ private String receivedCurrency; /** 到账金额 */ - private BigDecimal receivedAmount; + private Integer receivedAmount; /** 手续费 */ - private BigDecimal handlingCharge; + private Integer handlingCharge; /** 支付方式 */ private String payType; /** 到账地区 */ @@ -96,7 +96,7 @@ public class CashRecordDone { private String auditName; private String executorName; private String refundCurrency; - private String refundAmount; + private Integer refundAmount; private String marketName; private List statuses; diff --git a/src/main/java/com/example/demo/domain/vo/cash/Market.java b/src/main/java/com/example/demo/domain/vo/cash/Market.java deleted file mode 100644 index 6f62701..0000000 --- a/src/main/java/com/example/demo/domain/vo/cash/Market.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.example.demo.domain.vo.cash; - -import lombok.Data; -import java.util.Date; - -@Data -public class Market { - private Integer id; - private String name; // 地区名称 - private Integer parentId; // 父级ID - private Date createTime; // 创建时间 - private String treelist; // 树形路径 - private Integer type; // 等级类型 - - // 获取地区层级 - public Integer getLevel() { - if (treelist == null) return 0; - String[] levels = treelist.split("-"); - return levels.length - 1; // 减去根节点 - } - - // 判断是否为根节点 - public boolean isRoot() { - return parentId == -1; - } - - // 判断是否为市场部节点 - public boolean isMarketDepartment() { - return parentId != null && parentId == 3; // 市场部的父ID是3 - } - - // 判断是否为具体市场(叶子节点) - public boolean isSpecificMarket() { - return type != null && type == 2; // 等级类型为2的是具体市场 - } - - // 获取根节点名称 - public String getRootName() { - if (treelist == null) return null; - String[] levels = treelist.split("-"); - return levels.length > 0 ? levels[0] : null; - } -} \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/vo/cash/RefundApprovalRecord.java b/src/main/java/com/example/demo/domain/vo/cash/RefundApprovalRecord.java deleted file mode 100644 index f186d7d..0000000 --- a/src/main/java/com/example/demo/domain/vo/cash/RefundApprovalRecord.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.example.demo.domain.vo.cash; - -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Data; -import java.util.Date; - -@Data -public class RefundApprovalRecord { - private Integer id; - private Integer cashRecordId; - private Integer approvalLevel; - private String approvalNode; - private Integer approverId; - private String approverName; - private String approvalResult; // APPROVED, REJECTED - private String comments; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") - private Date approvalTime; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") - private Date createTime; - - // 撤回记录相关字段 - private Boolean isWithdrawal = false; - private Integer withdrawnBy; - private String withdrawReason; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") - private Date withdrawTime; - - public RefundApprovalRecord() {} - - public RefundApprovalRecord(Integer cashRecordId, Integer approvalLevel, String approvalNode, - Integer approverId, String approverName) { - this.cashRecordId = cashRecordId; - this.approvalLevel = approvalLevel; - this.approvalNode = approvalNode; - this.approverId = approverId; - this.approverName = approverName; - this.createTime = new Date(); - } -} \ No newline at end of file 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 deleted file mode 100644 index 42c1cb0..0000000 --- a/src/main/java/com/example/demo/domain/vo/cash/User.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.example.demo.domain.vo.cash; - -import lombok.Data; -import java.util.HashSet; -import java.util.Set; - -@Data -public class User { - private Integer id; - private String name; - private Integer marketId; // 关联market表的id - private String market; // 地区名称 - private Set roles = new HashSet<>(); - private Set managedMarketIds = new HashSet<>(); // 管辖的地区ID列表 - private Set managedMarketNames = new HashSet<>(); // 管辖的地区名称列表 - - // 角色权限检查 - public boolean hasRole(String role) { - return roles != null && roles.contains(role); - } - - public boolean hasAnyRole(Set requiredRoles) { - if (roles == null || requiredRoles == null) return false; - return requiredRoles.stream().anyMatch(roles::contains); - } - - // 地区权限检查 - 基于地区ID - public boolean canApproveMarket(Integer targetMarketId) { - if (targetMarketId == null) return false; - - // 优先检查管辖地区ID列表 - if (managedMarketIds != null && !managedMarketIds.isEmpty()) { - return managedMarketIds.contains(targetMarketId); - } - - // 如果没有管辖地区列表,使用单个marketId字段 - return targetMarketId.equals(this.marketId); - } - - public boolean canApproveAnyMarket(Set targetMarketIds) { - if (targetMarketIds == null || targetMarketIds.isEmpty()) return false; - - if (managedMarketIds != null && !managedMarketIds.isEmpty()) { - return targetMarketIds.stream().anyMatch(managedMarketIds::contains); - } - - return targetMarketIds.contains(this.marketId); - } - - // 地区权限检查 - 基于地区名称(向后兼容) - public boolean canApproveMarketByName(String targetMarketName) { - if (targetMarketName == null) return false; - - if (managedMarketNames != null && !managedMarketNames.isEmpty()) { - return managedMarketNames.contains(targetMarketName); - } - - return targetMarketName.equals(this.market); - } - - // 获取用户的所有管辖地区ID - public Set getAllManagedMarketIds() { - Set allMarketIds = new HashSet<>(); - if (managedMarketIds != null && !managedMarketIds.isEmpty()) { - allMarketIds.addAll(managedMarketIds); - } - if (marketId != null) { - allMarketIds.add(marketId); - } - return allMarketIds; - } - - // 获取用户的所有管辖地区名称 - public Set getAllManagedMarketNames() { - Set allMarketNames = new HashSet<>(); - if (managedMarketNames != null && !managedMarketNames.isEmpty()) { - allMarketNames.addAll(managedMarketNames); - } - if (market != null) { - allMarketNames.add(market); - } - return allMarketNames; - } -} \ No newline at end of file diff --git a/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java b/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java index 5f06529..6e1a34b 100644 --- a/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java +++ b/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java @@ -17,7 +17,7 @@ import java.util.List; **/ @Mapper public interface CashRefundMapper { - List select(CashRecordDone cashRecordDone); + List select(CashRecordDone cashRecordDone); int update(CashRecordDone cashRecordDone); int insert(CashRecordDone cashRecordDone); int withdraw(Integer id); diff --git a/src/main/java/com/example/demo/service/cash/MarketService.java b/src/main/java/com/example/demo/service/cash/MarketService.java deleted file mode 100644 index e7c32fc..0000000 --- a/src/main/java/com/example/demo/service/cash/MarketService.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.example.demo.service.cash; - - -import com.example.demo.domain.vo.cash.Market; -import com.example.demo.domain.vo.cash.User; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -@Slf4j -@Service -public class MarketService { - - // 地区数据缓存 - private final Map marketCache = new ConcurrentHashMap<>(); - private final Map marketNameToIdCache = new ConcurrentHashMap<>(); - private final Map> childrenCache = new ConcurrentHashMap<>(); - - // 初始化地区数据(实际项目中应从数据库加载) - public void initializeMarkets(List markets) { - marketCache.clear(); - marketNameToIdCache.clear(); - childrenCache.clear(); - - for (Market market : markets) { - marketCache.put(market.getId(), market); - marketNameToIdCache.put(market.getName(), market.getId()); - } - - // 构建父子关系 - for (Market market : markets) { - Integer parentId = market.getParentId(); - if (!childrenCache.containsKey(parentId)) { - childrenCache.put(parentId, new ArrayList<>()); - } - childrenCache.get(parentId).add(market); - } - - log.info("地区数据初始化完成,共加载{}个地区", markets.size()); - } - - // 根据ID获取地区 - public Market getMarketById(Integer id) { - return marketCache.get(id); - } - - // 根据名称获取地区 - public Market getMarketByName(String name) { - Integer id = marketNameToIdCache.get(name); - return id != null ? marketCache.get(id) : null; - } - - // 根据名称获取地区ID - public Integer getMarketIdByName(String name) { - return marketNameToIdCache.get(name); - } - - // 获取所有子地区(包括所有后代) - public List getAllChildren(Integer parentId) { - List allChildren = new ArrayList<>(); - List directChildren = childrenCache.get(parentId); - - if (directChildren != null) { - allChildren.addAll(directChildren); - for (Market child : directChildren) { - allChildren.addAll(getAllChildren(child.getId())); - } - } - - return allChildren; - } - - // 获取所有子地区ID(包括所有后代) - public Set getAllChildrenIds(Integer parentId) { - return getAllChildren(parentId).stream() - .map(Market::getId) - .collect(Collectors.toSet()); - } - - // 获取所有子地区名称(包括所有后代) - public Set getAllChildrenNames(Integer parentId) { - return getAllChildren(parentId).stream() - .map(Market::getName) - .collect(Collectors.toSet()); - } - - // 获取直接子地区 - public List getDirectChildren(Integer parentId) { - return childrenCache.getOrDefault(parentId, new ArrayList<>()); - } - - // 获取市场部下的所有具体市场 - public List getSpecificMarketsUnderMarketDepartment() { - List specificMarkets = new ArrayList<>(); - - // 市场部的ID是3 - List marketDepartmentChildren = getDirectChildren(3); - for (Market market : marketDepartmentChildren) { - if (market.isSpecificMarket()) { - specificMarkets.add(market); - } - } - - return specificMarkets; - } - - // 获取市场部下的所有具体市场ID - public Set getSpecificMarketIdsUnderMarketDepartment() { - return getSpecificMarketsUnderMarketDepartment().stream() - .map(Market::getId) - .collect(Collectors.toSet()); - } - - // 获取用户管辖的所有具体市场ID(包括子地区) - public Set getUserManagedSpecificMarketIds(User user) { - Set allSpecificMarketIds = new HashSet<>(); - - Set userMarketIds = user.getAllManagedMarketIds(); - for (Integer marketId : userMarketIds) { - Market market = getMarketById(marketId); - if (market != null && market.isSpecificMarket()) { - allSpecificMarketIds.add(marketId); - } else { - // 如果不是具体市场,获取其下的所有具体市场 - allSpecificMarketIds.addAll(getAllChildrenIds(marketId).stream() - .filter(id -> { - Market child = getMarketById(id); - return child != null && child.isSpecificMarket(); - }) - .collect(Collectors.toSet())); - } - } - - return allSpecificMarketIds; - } - - // 验证地区是否存在 - public boolean marketExists(Integer marketId) { - return marketCache.containsKey(marketId); - } - - // 验证地区名称是否存在 - public boolean marketNameExists(String marketName) { - return marketNameToIdCache.containsKey(marketName); - } - - // 获取所有地区 - public List getAllMarkets() { - return new ArrayList<>(marketCache.values()); - } - - // 获取所有具体市场(叶子节点) - public List getAllSpecificMarkets() { - return marketCache.values().stream() - .filter(Market::isSpecificMarket) - .collect(Collectors.toList()); - } - - // 根据地区ID获取完整路径 - public String getMarketFullPath(Integer marketId) { - Market market = marketCache.get(marketId); - return market != null ? market.getTreelist() : null; - } - - // 根据地区名称获取完整路径 - public String getMarketFullPathByName(String marketName) { - Integer marketId = marketNameToIdCache.get(marketName); - return marketId != null ? getMarketFullPath(marketId) : null; - } -} \ No newline at end of file diff --git a/src/main/java/com/example/demo/service/cash/RefundApprovalService.java b/src/main/java/com/example/demo/service/cash/RefundApprovalService.java deleted file mode 100644 index f5dda0b..0000000 --- a/src/main/java/com/example/demo/service/cash/RefundApprovalService.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.example.demo.service.cash; - - -import com.example.demo.Node.RefundApprovalNode; -import com.example.demo.config.cash.RefundApprovalFlowConfig; -import com.example.demo.domain.vo.cash.CashRecord; -import com.example.demo.domain.vo.cash.Market; -import com.example.demo.domain.vo.cash.RefundApprovalRecord; -import com.example.demo.domain.vo.cash.User; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -@Slf4j -@Service -public class RefundApprovalService { - - private final MarketService marketService; - - // 退款审批流程配置缓存 - private static final Map REFUND_APPROVAL_FLOW_CONFIG = new ConcurrentHashMap<>(); - - // 角色定义 - public static final String ROLE_REGIONAL_FINANCE = "REGIONAL_FINANCE"; - public static final String ROLE_REGIONAL_MANAGER = "REGIONAL_MANAGER"; - public static final String ROLE_HEADQUARTERS_FINANCE = "HEADQUARTERS_FINANCE"; - public static final String ROLE_EXECUTOR = "EXECUTOR"; - public static final String ROLE_SUBMITTER = "SUBMITTER"; - - public RefundApprovalService(MarketService marketService) { - this.marketService = marketService; - initializeRefundFlowConfigs(); - } - - // 初始化退款审批流程配置(基于地区ID) - private void initializeRefundFlowConfigs() { - // 获取市场部下的所有具体市场ID - Set specificMarketIds = marketService.getSpecificMarketIdsUnderMarketDepartment(); - - // 为每个具体市场创建审批流程 - for (Integer marketId : specificMarketIds) { - Market market = marketService.getMarketById(marketId); - if (market != null) { - List flowNodes = createRefundFlowForMarket(market); - REFUND_APPROVAL_FLOW_CONFIG.put(marketId.toString(), - new RefundApprovalFlowConfig(market.getName() + "退款审批流程", flowNodes)); - } - } - - // 创建通用审批流程(用于没有特定配置的市场) - List commonRefundFlow = createCommonRefundFlow(); - REFUND_APPROVAL_FLOW_CONFIG.put("COMMON", new RefundApprovalFlowConfig("通用退款审批流程", commonRefundFlow)); - - log.info("退款审批流程配置初始化完成,共配置{}个流程", REFUND_APPROVAL_FLOW_CONFIG.size()); - } - - private List createRefundFlowForMarket(Market market) { - Set marketAndChildrenIds = new HashSet<>(); - marketAndChildrenIds.add(market.getId()); - marketAndChildrenIds.addAll(marketService.getAllChildrenIds(market.getId())); - - List nodes = new ArrayList<>(); - nodes.add(new RefundApprovalNode("地区财务审核", 1, new String[]{ROLE_REGIONAL_FINANCE}, marketAndChildrenIds, true)); - nodes.add(new RefundApprovalNode("地区负责人审核", 2, new String[]{ROLE_REGIONAL_MANAGER}, marketAndChildrenIds, true)); - nodes.add(new RefundApprovalNode("总部财务审核", 3, new String[]{ROLE_HEADQUARTERS_FINANCE}, null, true)); // 总部不限制地区 - nodes.add(new RefundApprovalNode("执行人处理", 4, new String[]{ROLE_EXECUTOR}, null, true)); // 执行人不限制地区 - - return nodes; - } - - private List createCommonRefundFlow() { - List nodes = new ArrayList<>(); - nodes.add(new RefundApprovalNode("地区财务审核", 1, new String[]{ROLE_REGIONAL_FINANCE}, null, true)); - nodes.add(new RefundApprovalNode("地区负责人审核", 2, new String[]{ROLE_REGIONAL_MANAGER}, null, true)); - nodes.add(new RefundApprovalNode("总部财务审核", 3, new String[]{ROLE_HEADQUARTERS_FINANCE}, null, true)); - nodes.add(new RefundApprovalNode("执行人处理", 4, new String[]{ROLE_EXECUTOR}, null, true)); - - return nodes; - } - - // 获取适合订单的审批流程(基于地区ID) - private RefundApprovalFlowConfig getSuitableFlowConfig(CashRecord cashRecord) { - Integer marketId = cashRecord.getPrimaryMarketId(); - if (marketId != null) { - // 优先根据具体地区ID获取流程 - RefundApprovalFlowConfig specificConfig = REFUND_APPROVAL_FLOW_CONFIG.get(marketId.toString()); - if (specificConfig != null) { - return specificConfig; - } - - // 如果该市场没有特定配置,查找父级市场的配置 - Market market = marketService.getMarketById(marketId); - if (market != null && market.getParentId() != null) { - RefundApprovalFlowConfig parentConfig = REFUND_APPROVAL_FLOW_CONFIG.get(market.getParentId().toString()); - if (parentConfig != null) { - return parentConfig; - } - } - } - - // 默认返回通用流程 - return REFUND_APPROVAL_FLOW_CONFIG.get("COMMON"); - } - - // 获取用户有权限审批的订单状态(基于地区ID) - public List getUserVisibleStatuses(User user, CashRecord cashRecord) { - if (!cashRecord.isRefundOrder()) { - return new ArrayList<>(); - } - - RefundApprovalFlowConfig flowConfig = getSuitableFlowConfig(cashRecord); - if (flowConfig != null) { - return flowConfig.getVisibleStatuses(user, cashRecord.getPrimaryMarketId()); - } - - log.warn("未找到适合订单地区{}的退款审批流程配置", cashRecord.getPrimaryMarketId()); - return new ArrayList<>(); - } - - // 检查用户是否有权限审批指定订单(基于地区ID) - public boolean canUserApproveOrder(User user, CashRecord cashRecord) { - if (!cashRecord.isRefundOrder() || !cashRecord.isInApprovalProcess()) { - return false; - } - - RefundApprovalFlowConfig flowConfig = getSuitableFlowConfig(cashRecord); - if (flowConfig != null) { - return flowConfig.canUserApproveNode(user, cashRecord.getCurrentApprovalLevel(), cashRecord.getPrimaryMarketId()); - } - - return false; - } - - // 检查用户是否可以撤回订单(只有提交人可以在第一个审批节点前撤回) - public boolean canUserWithdrawOrder(User user, CashRecord cashRecord) { - if (!cashRecord.isRefundOrder()) { - return false; - } - - // 只有订单提交人才能撤回 - boolean isSubmitter = cashRecord.getSubmitterId() != null && - cashRecord.getSubmitterId().equals(user.getId()); - - return isSubmitter && cashRecord.canWithdraw(); - } - - // 提交退款审批 - public boolean submitRefundApproval(User user, CashRecord cashRecord, String approvalResult, String comments) { - if (!canUserApproveOrder(user, cashRecord)) { - log.warn("用户{}没有权限审批退款订单{}", user.getId(), cashRecord.getId()); - return false; - } - - // 创建审批记录 - RefundApprovalRecord record = new RefundApprovalRecord(); - record.setCashRecordId(cashRecord.getId()); - record.setApprovalLevel(cashRecord.getCurrentApprovalLevel()); - record.setApproverId(user.getId()); - record.setApproverName(user.getName()); - record.setApprovalResult(approvalResult); - record.setComments(comments); - record.setApprovalTime(new Date()); - - // 更新订单状态 - boolean approved = "APPROVED".equals(approvalResult); - Integer nextStatus = cashRecord.getNextStatus(approved); - cashRecord.setStatus(nextStatus); - cashRecord.setUpdateTime(new Date()); - cashRecord.setAuditId(user.getId()); - cashRecord.setAuditTime(new Date()); - - if (!approved) { - cashRecord.setRejectReason(comments); - } - - log.info("用户{}审批退款订单{},结果:{},新状态:{}", - user.getName(), cashRecord.getId(), approvalResult, nextStatus); - return true; - } - - // 撤回退款订单(在第一个审批节点前) - public boolean withdrawRefundOrder(User user, CashRecord cashRecord, String withdrawReason) { - if (!canUserWithdrawOrder(user, cashRecord)) { - log.warn("用户{}不能撤回退款订单{}", user.getId(), cashRecord.getId()); - return false; - } - - // 创建撤回记录 - RefundApprovalRecord record = new RefundApprovalRecord(); - record.setCashRecordId(cashRecord.getId()); - record.setApprovalLevel(cashRecord.getCurrentApprovalLevel()); - record.setApproverId(user.getId()); - record.setApproverName(user.getName()); - record.setIsWithdrawal(true); - record.setWithdrawnBy(user.getId()); - record.setWithdrawReason(withdrawReason); - record.setWithdrawTime(new Date()); - - // 更新订单状态为撤回 - boolean success = cashRecord.withdraw(); - if (success) { - cashRecord.setUpdateTime(new Date()); - log.info("用户{}撤回退款订单{},原因:{}", user.getName(), cashRecord.getId(), withdrawReason); - } - - return success; - } - - // 重新提交撤回的退款订单 - public boolean resubmitRefundOrder(User user, CashRecord cashRecord) { - if (!cashRecord.canResubmit()) { - log.warn("退款订单{}不能重新提交", cashRecord.getId()); - return false; - } - - // 检查用户是否是原提交人 - boolean isSubmitter = cashRecord.getSubmitterId() != null && - cashRecord.getSubmitterId().equals(user.getId()); - if (!isSubmitter) { - log.warn("用户{}不是订单{}的提交人,不能重新提交", user.getId(), cashRecord.getId()); - return false; - } - - boolean success = cashRecord.resubmit(); - if (success) { - cashRecord.setUpdateTime(new Date()); - log.info("用户{}重新提交退款订单{}", user.getName(), cashRecord.getId()); - } - - return success; - } - - // 获取下一个审批节点信息 - public RefundApprovalNode getNextApprovalNode(CashRecord cashRecord) { - RefundApprovalFlowConfig flowConfig = getSuitableFlowConfig(cashRecord); - if (flowConfig != null) { - return flowConfig.getNextNode(cashRecord.getCurrentApprovalLevel()); - } - return null; - } - - // 动态添加退款审批流程配置 - public void addRefundFlowConfig(String marketId, RefundApprovalFlowConfig flowConfig) { - REFUND_APPROVAL_FLOW_CONFIG.put(marketId, flowConfig); - log.info("成功添加地区{}的退款审批流程配置:{}", marketId, flowConfig.getFlowName()); - } - - // 获取所有退款审批流程配置 - public Map getAllRefundFlowConfigs() { - return new HashMap<>(REFUND_APPROVAL_FLOW_CONFIG); - } - - // 根据地区名称初始化审批流程配置 - public void initializeFlowForMarketName(String marketName) { - Market market = marketService.getMarketByName(marketName); - if (market != null) { - List flowNodes = createRefundFlowForMarket(market); - REFUND_APPROVAL_FLOW_CONFIG.put(market.getId().toString(), - new RefundApprovalFlowConfig(market.getName() + "退款审批流程", flowNodes)); - log.info("为地区{}初始化退款审批流程配置", marketName); - } - } -} \ No newline at end of file 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 2875e08..df71c71 100644 --- a/src/main/java/com/example/demo/service/cash/RefundService.java +++ b/src/main/java/com/example/demo/service/cash/RefundService.java @@ -1,6 +1,5 @@ package com.example.demo.service.cash; -import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashRecordDone; import com.github.pagehelper.PageInfo; @@ -13,7 +12,7 @@ import com.github.pagehelper.PageInfo; * @Version 1.0 **/ public interface RefundService { - PageInfo select(Integer pageNum, Integer pageSize, CashRecordDone cashRecordDone); + PageInfo select(Integer pageNum, Integer pageSize, CashRecordDone cashRecordDone); int add(CashRecordDone cashRecordDone) throws Exception; int update(CashRecordDone cashRecordDone); int withdraw(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 55e1b8c..f22cfa4 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java @@ -1,6 +1,5 @@ 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.domain.vo.coin.Result; @@ -29,10 +28,10 @@ public class CashRefundServiceImpl implements RefundService { @Autowired private CashRefundMapper cashRefundMapper; @Override - public PageInfo select(Integer pageNum, Integer pageSize,CashRecordDone cashRecordDone) { + public PageInfo select(Integer pageNum, Integer pageSize, CashRecordDone cashRecordDone) { PageHelper.startPage(pageNum, pageSize); // System.out.println(goldDetail.getMarkets()); - List list = cashRefundMapper.select(cashRecordDone); + List list = cashRefundMapper.select(cashRecordDone); return new PageInfo<>(list); } @@ -74,7 +73,8 @@ public class CashRefundServiceImpl implements RefundService { throw new RuntimeException("未输入付款金额"); } if (cashRecordDone.getPaymentCurrency()== null){ - throw new RuntimeException("未输入付款币种");} + throw new RuntimeException("未输入付款币种"); + } if (cashRecordDone.getRefundModel()== null) { throw new RuntimeException("请填写退款类型"); } From bd3cfe573cb9f149d8c1e09892c39757ec086b95 Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Fri, 17 Oct 2025 18:09:33 +0800 Subject: [PATCH 08/10] =?UTF-8?q?10.17=E4=BF=AE=E6=94=B9=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E7=B1=BB=E7=B2=BE=E7=AE=80=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java | 2 ++ src/main/java/com/example/demo/service/cash/RefundService.java | 9 ++++++++- .../com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java | 6 +++++- src/main/resources/cashMapper/CashRefundMapper.xml | 7 ++++++- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java b/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java index 6e1a34b..6b7618d 100644 --- a/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java +++ b/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java @@ -25,4 +25,6 @@ public interface CashRefundMapper { int review(CashRecordDone cashRecordDone); int executor(CashRecordDone cashRecordDone); + + int updateStatus(CashRecordDone cashRecordDone); } 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 df71c71..ef74817 100644 --- a/src/main/java/com/example/demo/service/cash/RefundService.java +++ b/src/main/java/com/example/demo/service/cash/RefundService.java @@ -12,11 +12,18 @@ import com.github.pagehelper.PageInfo; * @Version 1.0 **/ public interface RefundService { + //多条件查询 PageInfo select(Integer pageNum, Integer pageSize, CashRecordDone cashRecordDone); + //添加 int add(CashRecordDone cashRecordDone) throws Exception; + //修改 int update(CashRecordDone cashRecordDone); + // int withdraw(CashRecordDone cashRecordDone); + //审核 int review(CashRecordDone cashRecordDone); - + // 执行 int executor(CashRecordDone cashRecordDone); + //修改原数据状态 + int updateStatus(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 f22cfa4..0a3e3a6 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java @@ -1,6 +1,5 @@ package com.example.demo.serviceImpl.cash; -import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashRecordDone; import com.example.demo.domain.vo.coin.Result; import com.example.demo.mapper.cash.CashRefundMapper; @@ -119,4 +118,9 @@ public class CashRefundServiceImpl implements RefundService { int result = cashRefundMapper.executor(cashRecordDone); return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode(); } + + @Override + public int updateStatus(CashRecordDone cashRecordDone) { + return cashRefundMapper.updateStatus(cashRecordDone); + } } diff --git a/src/main/resources/cashMapper/CashRefundMapper.xml b/src/main/resources/cashMapper/CashRefundMapper.xml index 949c877..8185f5a 100644 --- a/src/main/resources/cashMapper/CashRefundMapper.xml +++ b/src/main/resources/cashMapper/CashRefundMapper.xml @@ -90,6 +90,11 @@ status = #{status} where order_type =2 and id = #{id} + + update cash_record_done + set status = #{status} + where id = #{id} +