service/src/main/java/com/ruoyi/cwgl/controller/ReceivableFeeManagementController.java
@@ -18,6 +18,7 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.cwgl.domain.ReceivableFeeManagement; import com.ruoyi.cwgl.service.IReceivableFeeManagementService; import com.ruoyi.cwgl.domain.vo.ReceivableBillCreateVo; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; @@ -105,4 +106,27 @@ { return toAjax(receivableFeeManagementService.deleteReceivableFeeManagementByIds(ids)); } /** * 查询应收费用统计信息 */ @PreAuthorize("@ss.hasPermi('cwgl:receivableFeeManagement:statistics')") @GetMapping("/statistics/{ids}") public AjaxResult getStatistics(@PathVariable Integer[] ids) { return AjaxResult.success(receivableFeeManagementService.getReceivableFeeStatistics(ids)); } /** * 创建应收账单 */ @PreAuthorize("@ss.hasPermi('cwgl:receivableFeeManagement:createBill')") @Log(title = "应收账单管理", businessType = BusinessType.INSERT) @PostMapping("/createBill") public AjaxResult createBill(@RequestBody ReceivableBillCreateVo billCreateVo) { Integer billId = receivableFeeManagementService.createReceivableBill(billCreateVo); return AjaxResult.success(billId); } } service/src/main/java/com/ruoyi/cwgl/domain/PayableFeeManagement.java
@@ -1,11 +1,11 @@ package com.ruoyi.cwgl.domain; import java.math.BigDecimal; import java.util.List; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import com.baomidou.mybatisplus.annotation.TableField; import java.util.Date; import lombok.Data; /** * 应付费用管理对象 payable_fee_management @@ -156,5 +156,8 @@ @TableField("deleted") private Integer deleted; /** 应付费用明细列表 */ @TableField(exist = false) private List<PayableFeeDetail> payableFeeDetailList; } service/src/main/java/com/ruoyi/cwgl/domain/ReceivableFeeManagement.java
@@ -2,10 +2,11 @@ import java.math.BigDecimal; import java.util.Date; import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import com.baomidou.mybatisplus.annotation.TableField; import java.util.Date; import com.ruoyi.cwgl.domain.ReceivableFeeDetail; import lombok.Data; /** * 应收费用管理对象 receivable_fee_management @@ -156,5 +157,9 @@ @TableField("deleted") private Integer deleted; /** 应收费用明细列表 */ @TableField(exist = false) private List<ReceivableFeeDetail> receivableFeeDetailList; } service/src/main/java/com/ruoyi/cwgl/domain/vo/ReceivableBillCreateVo.java
New file @@ -0,0 +1,21 @@ package com.ruoyi.cwgl.domain.vo; import lombok.Data; import com.ruoyi.cwgl.domain.vo.ReceivableFeeStatisticsVo; /** * 创建应收账单请求VO */ @Data public class ReceivableBillCreateVo { /** * 账单类型:0=人民币账单,1=港币账单 */ private Integer billType; /** * 应收费用统计数据 */ private ReceivableFeeStatisticsVo statisticsData; } service/src/main/java/com/ruoyi/cwgl/domain/vo/ReceivableFeeStatisticsVo.java
New file @@ -0,0 +1,44 @@ package com.ruoyi.cwgl.domain.vo; import lombok.Data; import java.math.BigDecimal; import java.util.List; import com.ruoyi.cwgl.domain.ReceivableFeeDetail; /** * 应收费用统计结果VO */ @Data public class ReceivableFeeStatisticsVo { /** * 单据数量 */ private int documentCount; /** * 汇率 */ private BigDecimal rate; /** * 总应收金额 */ private BigDecimal totalReceivableAmount; /** * 人民币总金额 */ private BigDecimal totalAmountRmb; /** * 港币总金额 */ private BigDecimal totalAmountHkd; /** * 明细列表 */ private List<ReceivableFeeDetail> detailList; } service/src/main/java/com/ruoyi/cwgl/mapper/ReceivableFeeDetailMapper.java
@@ -84,4 +84,12 @@ * @return 结果 */ public int deleteReceivableFeeDetailByIds(Integer[] ids); /** * 根据应收费用ID数组查询应收费用明细列表 * * @param receivableFeeIds 应收费用ID数组 * @return 应收费用明细集合 */ public List<ReceivableFeeDetail> selectReceivableFeeDetailByReceivableFeeIds(Integer[] receivableFeeIds); } service/src/main/java/com/ruoyi/cwgl/mapper/ReceivableFeeManagementMapper.java
@@ -84,4 +84,12 @@ * @return 结果 */ public int deleteReceivableFeeManagementByIds(Integer[] ids); /** * 根据应收费用ID数组查询应收费用管理列表 * * @param ids 应收费用ID数组 * @return 应收费用管理集合 */ public List<ReceivableFeeManagement> selectReceivableFeeManagementByIds(Integer[] ids); } service/src/main/java/com/ruoyi/cwgl/service/IReceivableFeeDetailService.java
@@ -99,4 +99,12 @@ * @return 结果 */ public int deleteReceivableFeeDetailById(Integer id); /** * 根据应收费用ID数组查询应收费用明细列表 * * @param receivableFeeIds 应收费用ID数组 * @return 应收费用明细集合 */ public List<ReceivableFeeDetail> selectReceivableFeeDetailByReceivableFeeIds(Integer[] receivableFeeIds); } service/src/main/java/com/ruoyi/cwgl/service/IReceivableFeeManagementService.java
@@ -2,6 +2,8 @@ import java.util.List; import com.ruoyi.cwgl.domain.ReceivableFeeManagement; import com.ruoyi.cwgl.domain.vo.ReceivableFeeStatisticsVo; import com.ruoyi.cwgl.domain.vo.ReceivableBillCreateVo; import com.baomidou.mybatisplus.extension.service.IService; /** * 应收费用管理Service接口 @@ -99,4 +101,15 @@ * @return 结果 */ public int deleteReceivableFeeManagementById(Integer id); public ReceivableFeeStatisticsVo getReceivableFeeStatistics(Integer[] ids); /** * 根据统计数据创建应收账单 * * @param billCreateVo 包含统计数据和账单类型的请求对象 * @return 创建的应收账单ID */ public Integer createReceivableBill(ReceivableBillCreateVo billCreateVo); } service/src/main/java/com/ruoyi/cwgl/service/impl/PayableFeeManagementServiceImpl.java
@@ -18,6 +18,7 @@ import com.ruoyi.cwgl.mapper.PayableFeeManagementMapper; import com.ruoyi.cwgl.domain.PayableFeeManagement; import com.ruoyi.cwgl.service.IPayableFeeManagementService; import com.ruoyi.cwgl.service.IPayableFeeDetailService; import com.ruoyi.common.core.text.Convert; /** @@ -33,6 +34,9 @@ protected final Logger logger = LoggerFactory.getLogger(getClass()); @Resource private PayableFeeManagementMapper payableFeeManagementMapper; @Resource private IPayableFeeDetailService payableFeeDetailService; /** @@ -103,7 +107,21 @@ public int insertPayableFeeManagement(PayableFeeManagement payableFeeManagement) { payableFeeManagement.setCreateTime(DateUtils.getNowDate()); return payableFeeManagementMapper.insertPayableFeeManagement(payableFeeManagement); // 保存主实体 int result = payableFeeManagementMapper.insertPayableFeeManagement(payableFeeManagement); Integer payableFeeId = payableFeeManagement.getId(); // 批量保存明细 if (payableFeeManagement.getPayableFeeDetailList() != null && !payableFeeManagement.getPayableFeeDetailList().isEmpty()) { payableFeeManagement.getPayableFeeDetailList().forEach(detail -> { detail.setPayableFeeId(payableFeeId); detail.setCreateTime(DateUtils.getNowDate()); }); payableFeeDetailService.insertPayableFeeDetailBatch(payableFeeManagement.getPayableFeeDetailList()); } return result; } /** service/src/main/java/com/ruoyi/cwgl/service/impl/ReceivableFeeDetailServiceImpl.java
@@ -179,4 +179,17 @@ { return receivableFeeDetailMapper.deleteReceivableFeeDetailById(id); } /** * 根据应收费用ID数组查询应收费用明细列表 * * @param receivableFeeIds 应收费用ID数组 * @return 应收费用明细集合 */ @DataSource(DataSourceType.SLAVE) @Override public List<ReceivableFeeDetail> selectReceivableFeeDetailByReceivableFeeIds(Integer[] receivableFeeIds) { return receivableFeeDetailMapper.selectReceivableFeeDetailByReceivableFeeIds(receivableFeeIds); } } service/src/main/java/com/ruoyi/cwgl/service/impl/ReceivableFeeManagementServiceImpl.java
@@ -1,9 +1,17 @@ package com.ruoyi.cwgl.service.impl; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; import com.ruoyi.common.utils.DateUtils; import javax.annotation.Resource; import com.ruoyi.cwgl.domain.ReceivableFeeDetail; import com.ruoyi.cwgl.domain.vo.ReceivableFeeStatisticsVo; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.system.mapper.SysConfigMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.stereotype.Service; import org.springframework.scheduling.annotation.Async; @@ -17,7 +25,13 @@ import com.ruoyi.cwgl.mapper.ReceivableFeeManagementMapper; import com.ruoyi.cwgl.domain.ReceivableFeeManagement; import com.ruoyi.cwgl.domain.ReceivableBillManagement; import com.ruoyi.cwgl.domain.ReceivableBillSettlementDetail; import com.ruoyi.cwgl.service.IReceivableFeeDetailService; import com.ruoyi.cwgl.service.IReceivableFeeManagementService; import com.ruoyi.cwgl.service.IReceivableBillManagementService; import com.ruoyi.cwgl.service.IReceivableBillSettlementDetailService; import com.ruoyi.cwgl.domain.vo.ReceivableBillCreateVo; import com.ruoyi.common.core.text.Convert; /** @@ -33,6 +47,18 @@ protected final Logger logger = LoggerFactory.getLogger(getClass()); @Resource private ReceivableFeeManagementMapper receivableFeeManagementMapper; @Autowired private IReceivableFeeDetailService receivableFeeDetailService; @Resource private SysConfigMapper sysConfigMapper; @Autowired private IReceivableBillManagementService receivableBillManagementService; @Autowired private IReceivableBillSettlementDetailService receivableBillSettlementDetailService; /** @@ -103,7 +129,26 @@ public int insertReceivableFeeManagement(ReceivableFeeManagement receivableFeeManagement) { receivableFeeManagement.setCreateTime(DateUtils.getNowDate()); return receivableFeeManagementMapper.insertReceivableFeeManagement(receivableFeeManagement); // 保存主表信息 int result = receivableFeeManagementMapper.insertReceivableFeeManagement(receivableFeeManagement); // 获取主表ID Integer receivableFeeId = receivableFeeManagement.getId(); // 批量保存明细列表 if (receivableFeeManagement.getReceivableFeeDetailList() != null && !receivableFeeManagement.getReceivableFeeDetailList().isEmpty()) { // 设置每个明细的应收费用管理ID receivableFeeManagement.getReceivableFeeDetailList().forEach(detail -> { detail.setReceivableFeeId(receivableFeeId); detail.setCreateTime(DateUtils.getNowDate()); // 设置创建时间 }); // 调用批量插入方法 receivableFeeDetailService.insertReceivableFeeDetailBatch(receivableFeeManagement.getReceivableFeeDetailList()); } return result; } /** @@ -179,4 +224,112 @@ { return receivableFeeManagementMapper.deleteReceivableFeeManagementById(id); } /** * 根据应收费用ID数组查询统计信息和明细 * * @param ids 应收费用ID数组 * @return 包含统计信息和明细的结果 */ @DataSource(DataSourceType.SLAVE) @Override public ReceivableFeeStatisticsVo getReceivableFeeStatistics(Integer[] ids) { // 查询应收费用主表记录 List<ReceivableFeeManagement> receivableFeeList = receivableFeeManagementMapper.selectReceivableFeeManagementByIds(ids); // 计算单据数量 int documentCount = receivableFeeList.size(); SysConfig sysConfig = sysConfigMapper.selectConfig(new SysConfig() {{ setConfigKey("sys.hk.rmb.rate"); }}); // 计算总应收金额 BigDecimal totalReceivableAmount = receivableFeeList.stream() .map(ReceivableFeeManagement::getReceivableAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal exchangeRate = new BigDecimal(sysConfig.getConfigValue()); BigDecimal totalAmountHkd = totalReceivableAmount.divide(exchangeRate, 2, RoundingMode.HALF_UP); // 查询应收费用明细 List<ReceivableFeeDetail> detailList = receivableFeeDetailService.selectReceivableFeeDetailByReceivableFeeIds(ids); // 组装返回结果 ReceivableFeeStatisticsVo result = new ReceivableFeeStatisticsVo(); result.setDocumentCount(documentCount); result.setRate(exchangeRate); result.setTotalReceivableAmount(totalReceivableAmount); result.setTotalAmountRmb(totalReceivableAmount); result.setTotalAmountHkd(totalAmountHkd); result.setDetailList(detailList); return result; } /** * 根据统计数据创建应收账单 * * @param billCreateVo 包含统计数据和账单类型的请求对象 * @return 创建的应收账单ID */ @Override public Integer createReceivableBill(ReceivableBillCreateVo billCreateVo) { // 1. 准备数据 ReceivableFeeStatisticsVo statisticsVo = billCreateVo.getStatisticsData(); Integer billType = billCreateVo.getBillType(); // 2. 创建应收账单主记录 ReceivableBillManagement billManagement = new ReceivableBillManagement(); billManagement.setDocumentCount(statisticsVo.getDocumentCount()); billManagement.setExchangeRate(statisticsVo.getRate()); billManagement.setStatus("DRAFT"); // 默认草稿状态 billManagement.setCreateTime(DateUtils.getNowDate()); // 3. 根据账单类型设置币种和总金额 if (billType == 0) { // 人民币账单 billManagement.setCurrency("CNY"); billManagement.setTotalAmount(statisticsVo.getTotalAmountRmb()); } else if (billType == 1) { // 港币账单 billManagement.setCurrency("HKD"); billManagement.setTotalAmount(statisticsVo.getTotalAmountHkd()); } else { throw new IllegalArgumentException("无效的账单类型:" + billType); } // 4. 保存主账单记录 receivableBillManagementService.insertReceivableBillManagement(billManagement); Integer billId = billManagement.getId(); // 5. 创建应收账单结算明细 List<ReceivableBillSettlementDetail> detailList = new java.util.ArrayList<>(); for (ReceivableFeeDetail feeDetail : statisticsVo.getDetailList()) { ReceivableBillSettlementDetail settlementDetail = new ReceivableBillSettlementDetail(); settlementDetail.setBillId(billId); // 根据账单类型设置明细金额 if (billType == 0) { // 人民币账单使用原金额 settlementDetail.setReceiptAmount(feeDetail.getBillingAmount()); } else { // 港币账单转换金额 settlementDetail.setReceiptAmount(feeDetail.getBillingAmount().divide(statisticsVo.getRate(), 2, RoundingMode.HALF_UP)); } // 设置其他明细信息 settlementDetail.setSettlementMethod("0"); // 默认为空,后续可以更新 settlementDetail.setCreateTime(DateUtils.getNowDate()); detailList.add(settlementDetail); } // 6. 批量保存明细记录 if (!detailList.isEmpty()) { receivableBillSettlementDetailService.insertReceivableBillSettlementDetailBatch(detailList); } return billId; } } service/src/main/resources/mapper/cwgl/ReceivableFeeDetailMapper.xml
@@ -179,4 +179,13 @@ </foreach> </delete> <!--根据应收费用ID数组查询明细--> <select id="selectReceivableFeeDetailByReceivableFeeIds" parameterType="Integer" resultMap="ReceivableFeeDetailResult"> <include refid="selectReceivableFeeDetailVo"/> where thisTab.receivable_fee_id in <foreach item="receivableFeeId" collection="array" open="(" separator="," close=")"> #{receivableFeeId} </foreach> </select> </mapper> service/src/main/resources/mapper/cwgl/ReceivableFeeManagementMapper.xml
@@ -203,4 +203,13 @@ </foreach> </delete> <!--根据ID数组查询--> <select id="selectReceivableFeeManagementByIds" parameterType="Integer" resultMap="ReceivableFeeManagementResult"> <include refid="selectReceivableFeeManagementVo"/> where thisTab.id in <foreach item="id" collection="array" open="(" separator="," close=")"> #{id} </foreach> </select> </mapper>