Browse Source

10.15退款新增查询

lijianlin/feature-202509231533026-现金管理-收款管理
huangqizhen 1 month ago
parent
commit
d316bb6756
  1. 17
      src/main/java/com/example/demo/controller/cash/CashRefundController.java
  2. 142
      src/main/java/com/example/demo/controller/cash/RefundApprovalController.java
  3. 27
      src/main/java/com/example/demo/domain/DTO/RefundApprovalRequest.java
  4. 8
      src/main/java/com/example/demo/domain/vo/cash/User.java
  5. 39
      src/main/java/com/example/demo/service/cash/RefundApprovalService.java
  6. 2
      src/main/java/com/example/demo/service/cash/RefundService.java
  7. 24
      src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java
  8. 2
      src/main/resources/cashMapper/CashRefundMapper.xml

17
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));
}
}

142
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<String, Object> getApprovableRefundOrders(@RequestBody User user) {
try {
List<CashRecord> approvableOrders = refundApprovalService.getApprovableRefundOrders(user);
Map<String, Object> 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<String, Object> 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<String, Object> submitRefundApproval(@RequestBody RefundApprovalRequest request) {
boolean success = refundApprovalService.submitRefundApproval(
request.getUser(),
request.getCashRecord(),
request.getApprovalResult(),
request.getComments()
);
Map<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> checkPermission(@RequestBody RefundApprovalRequest request) {
boolean hasPermission = refundApprovalService.canUserApproveOrder(request.getUser(), request.getCashRecord());
boolean canWithdraw = refundApprovalService.canUserWithdrawOrder(request.getUser(), request.getCashRecord());
List<Integer> 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<Integer> 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;
// }
}

27
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: 202510-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<CashRecord> orders;
}

8
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<String> roles = new HashSet<>();
private Set<Integer> managedMarketIds = new HashSet<>(); // 管辖的地区ID列表
private Set<String> 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;
}

39
src/main/java/com/example/demo/service/cash/RefundApprovalService.java

@ -147,26 +147,27 @@ public class RefundApprovalService {
return isSubmitter && cashRecord.canWithdraw();
}
// 获取用户可审批的退款订单列表基于地区ID
public List<CashRecord> getApprovableRefundOrders(User user, List<CashRecord> allOrders) {
List<CashRecord> approvableOrders = new ArrayList<>();
// 获取用户管辖的所有具体市场ID
Set<Integer> 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<CashRecord> getApprovableRefundOrders(User user) {
// // 1. 获取用户管辖的所有具体市场ID
// Set<Integer> userManagedMarketIds = marketService.getUserManagedSpecificMarketIds(user);
//
// if (userManagedMarketIds.isEmpty()) {
// log.warn("用户{}没有管辖的市场", user.getId());
// return new ArrayList<>();
// }
//
// // 2. 从数据库查询待审批的退款订单
// List<CashRecord> 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)) {

2
src/main/java/com/example/demo/service/cash/RefundService.java

@ -14,7 +14,7 @@ import com.github.pagehelper.PageInfo;
**/
public interface RefundService {
PageInfo<CashCollection> select(Integer pageNum, Integer pageSize, CashRecordDone cashRecordDone);
int add(CashRecordDone cashRecordDone);
int add(CashRecordDone cashRecordDone) throws Exception;
int update(CashRecordDone cashRecordDone);
}

24
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);
}

2
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,

Loading…
Cancel
Save