Browse Source

窗口缴费 代码优化

huangpeng 4 months ago
parent
commit
214816efc4

+ 156 - 98
zhsw-common/src/main/java/com/rongwei/zhsw/system/service/impl/SwBillingRecordServiceImpl.java

@@ -2,10 +2,7 @@ package com.rongwei.zhsw.system.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.rongwe.zhsw.system.domain.SwBillManagementPaidDo;
-import com.rongwe.zhsw.system.domain.SwBillManagementUnpaidDo;
-import com.rongwe.zhsw.system.domain.SwBillingRecordDo;
-import com.rongwe.zhsw.system.domain.SwUserManagementDo;
+import com.rongwe.zhsw.system.domain.*;
 import com.rongwe.zhsw.system.dto.PaymentRequestDTO;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.R;
@@ -23,6 +20,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.security.SecureRandom;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -66,161 +64,221 @@ public class SwBillingRecordServiceImpl extends ServiceImpl<SwBillingRecordDao,
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R windowPayment(PaymentRequestDTO paymentRequestDTO) throws Exception {
+
         List<String> ids = paymentRequestDTO.getIds();
         BigDecimal paidIn = paymentRequestDTO.getPaidin();
         String datasource = paymentRequestDTO.getDatasource();
-        //1. 根据户号查询 待缴费 状态 无缴费记录的 的待缴费账单
-        LambdaQueryWrapper<SwBillManagementUnpaidDo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-        lambdaQueryWrapper.in(SwBillManagementUnpaidDo::getId, ids)
-                .eq(SwBillManagementUnpaidDo::getStatus,PENDINGSTATUS)
-                .eq(SwBillManagementUnpaidDo::getDeleted,"0");
 
-        List<SwBillManagementUnpaidDo> list = swBillManagementUnpaidService.list(lambdaQueryWrapper);
+        // 查询待缴费账单
+        List<SwBillManagementUnpaidDo> unpaidBills = queryUnpaidBills(ids);
 
-        //2.校验账单数据
-        checkBillingData(list,ids);
+        // 校验账单数据
+        validateBillingData(unpaidBills, ids);
 
         //生成缴费记录
-         addNewBillRecord(paidIn,datasource,list);
+         addNewBillRecord(paidIn,datasource,unpaidBills);
 
-        //5.删除 待收账单数据
-        swBillManagementUnpaidDao.deleteByIds(ids);
+        //删除 待收账单数据
+        deleteUnpaidBills(ids);
 
         return R.ok();
     }
 
+    /**
+     * 删除 待收账单数据
+     * @param ids
+     */
+    private void deleteUnpaidBills(List<String> ids) {
+        swBillManagementUnpaidDao.deleteByIds(ids);
+    }
 
 
     /**
-     * 生成新的缴费账单
-     *
-     * @param paidin
-     * @param datasource
-     * @param list
+     *  根据户号查询 待缴费 状态 无缴费记录的 的待缴费账单
+     * @param ids
+     * @return
      */
-    private void addNewBillRecord(BigDecimal paidin, String datasource, List<SwBillManagementUnpaidDo> list) {
-        SwBillingRecordDo add = new SwBillingRecordDo();
+    private List<SwBillManagementUnpaidDo> queryUnpaidBills(List<String> ids) {
+        return swBillManagementUnpaidService.list(
+                new LambdaQueryWrapper<SwBillManagementUnpaidDo>()
+                        .in(SwBillManagementUnpaidDo::getId, ids)
+                        .eq(SwBillManagementUnpaidDo::getStatus, PENDINGSTATUS)
+                        .eq(SwBillManagementUnpaidDo::getDeleted, "0")
+        );
+    }
+
+    // 提取公共字段设置
+    private SwBillingRecordDo buildBaseBillingRecord(List<SwBillManagementUnpaidDo> list, BigDecimal paidin, String datasource, SysUserVo currentUser) {
+        SwBillingRecordDo record = new SwBillingRecordDo();
+        SwBillManagementUnpaidDo firstBill = list.get(0);
 
-        add.setId(SecurityUtil.getUUID())
+        return record.setId(SecurityUtil.getUUID())
                 .setChargedate(new Date())
                 .setPayfeesstatus(PAIDSTATUS)
                 .setYear(Calendar.getInstance().get(Calendar.YEAR))
-                .setUsername(list.get(0).getUsername())
-                .setUsernumber(list.get(0).getUsernumber())
-                .setUsertype(list.get(0).getUsertype())
-                .setWatertype(list.get(0).getWatertype())
-                .setAddress(list.get(0).getAddress());
-
-        //生成缴费编号 年月日 + 3位数 随机数
-        CreateBillingNumber(add);
-
-        //当前用户
-        SysUserVo currentUser = ZHSWCommonUtils.getCurrentUser();
-        add.setTollcollectorid(currentUser.getId());
-        add.setTollcollectorname(currentUser.getName());
-        add.setTenantid(currentUser.getTenantid())
+                .setUsername(firstBill.getUsername())
+                .setUsernumber(firstBill.getUsernumber())
+                .setUsertype(firstBill.getUsertype())
+                .setWatertype(firstBill.getWatertype())
+                .setAddress(firstBill.getAddress())
+                .setTollcollectorid(currentUser.getId())
+                .setTollcollectorname(currentUser.getName())
+                .setTenantid(currentUser.getTenantid())
                 .setCreateuserid(currentUser.getId())
                 .setCreateusername(currentUser.getName())
                 .setCreatedate(new Date())
                 .setModifydate(new Date())
                 .setModifyuserid(currentUser.getId())
+                .setTenantid(currentUser.getTenantid())
+                .setDatasource(datasource)
+                 .setPaidin(paidin)
                 .setModifyusername(currentUser.getName());
+    }
 
-        // list 汇总计算
-        BigDecimal allfeewaiver =new BigDecimal(0);
-        BigDecimal oughttohavepaid =new BigDecimal("0");
-        BigDecimal latefees =new BigDecimal(0);
-        List<SwBillManagementPaidDo> paidDos =new ArrayList<>();
-        for (SwBillManagementUnpaidDo unpaidDo : list) {
-            allfeewaiver = allfeewaiver.add(unpaidDo.getFeewaiver()==null?BigDecimal.ZERO:unpaidDo.getFeewaiver());
-            oughttohavepaid =oughttohavepaid.add(unpaidDo.getOughttohavepaid()==null?BigDecimal.ZERO:unpaidDo.getOughttohavepaid());
-            latefees = latefees.add(unpaidDo.getLatefees()==null?BigDecimal.ZERO:unpaidDo.getLatefees());
-
-            SwBillManagementPaidDo paidDo = new SwBillManagementPaidDo();
-            BeanUtils.copyProperties(unpaidDo,paidDo);
-            // 新生成的 已缴费账单
-            paidDo.setStatus(PAIDINSTATUS);
-            //缴费记录ID
-            paidDo.setPaymentrecordid(add.getId());
 
-            paidDo.setCreateuserid(currentUser.getId())
+    /**
+     * 生成新的缴费账单
+     *
+     * @param paidin
+     * @param datasource
+
+     */
+    private void addNewBillRecord(BigDecimal paidin, String datasource, List<SwBillManagementUnpaidDo> list) {
+
+        SysUserVo currentUser = ZHSWCommonUtils.getCurrentUser();
+
+        SwBillingRecordDo add = buildBaseBillingRecord(list,paidin,datasource,currentUser);
+
+        //根据户号获取 用户记录
+        SwUserManagementDo user = swUserManagementService.getBaseMapper().
+                selectOne(new LambdaQueryWrapper<SwUserManagementDo>().eq(SwUserManagementDo::getUsernumber, add.getUsernumber()));
+
+        // 生成缴费编号
+        generateBillingNumber(add);
+
+        // 计算费用
+        calculateFees(list, add,user);
+
+        //生成已缴费账单
+        createBills(list,add,currentUser);
+
+        //更新用户余额
+        updateUserBalance(add,user);
+
+
+    }
+
+    private void createBills(List<SwBillManagementUnpaidDo> list, SwBillingRecordDo add, SysUserVo currentUser) {
+        List<SwBillManagementPaidDo> paidList = new ArrayList<>();
+
+        for (SwBillManagementUnpaidDo unpaid : list) {
+
+
+            SwBillManagementPaidDo paid = new SwBillManagementPaidDo();
+            BeanUtils.copyProperties(unpaid, paid);
+            // 新生成的 已缴费账单
+            paid.setStatus(PAIDINSTATUS)
+                    //缴费记录ID
+                    .setPaymentrecordid(add.getId())
+                    .setCreateuserid(currentUser.getId())
                     .setCreateusername(currentUser.getName())
                     .setCreatedate(new Date())
                     .setModifydate(new Date())
                     .setModifyuserid(currentUser.getId())
                     .setModifyusername(currentUser.getName());
-            paidDos.add(paidDo);
+            paidList.add(paid);
 
         }
-        //生成已经缴费账单
-        swBillManagementPaidService.saveBatch(paidDos);
+        // 保存已缴费账单
+        swBillManagementPaidService.saveBatch(paidList);
+    }
+
+    /**
+     * 更新用户余额
+     *
+     * @param add
+     * @param user
+     */
+    private void updateUserBalance(SwBillingRecordDo add, SwUserManagementDo user) {
+        BigDecimal balanceChange = add.getAfterpaymentbalance().subtract(user.getAccountbalance());
+        swUserManagementService.balanceAdd(user.getId(), balanceChange);
+    }
+
+
+
+    private void calculateFees(List<SwBillManagementUnpaidDo> list, SwBillingRecordDo add, SwUserManagementDo user) {
+
+
+        // 用户 账户余额
+        BigDecimal accountbalance = user.getAccountbalance()==null?BigDecimal.ZERO:user.getAccountbalance();
+
+
+        // 使用Stream API进行汇总计算
+        BigDecimal totalWaivers = list.stream()
+                .map(SwBillManagementUnpaidDo::getFeewaiver)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        BigDecimal totalOught = list.stream()
+                .map(SwBillManagementUnpaidDo::getOughttohavepaid)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        BigDecimal totalLateFees = list.stream()
+                .map(SwBillManagementUnpaidDo::getLatefees)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
         //总减免
-        add.setAllfeewaiver(allfeewaiver);
+        add.setAllfeewaiver(totalWaivers);
         //原应缴
-        add.setOughttohavepaid(oughttohavepaid);
+        add.setOughttohavepaid(totalOught);
         //滞纳金
-        add.setLatefees(latefees);
-        //根据户号获取 用户记录
-        SwUserManagementDo swUserManagement = swUserManagementService.getBaseMapper().
-                selectOne(new LambdaQueryWrapper<SwUserManagementDo>().eq(SwUserManagementDo::getUsernumber, add.getUsernumber()));
-
-        // 用户 账户余额
-        BigDecimal accountbalance = swUserManagement.getAccountbalance()==null?BigDecimal.ZERO:swUserManagement.getAccountbalance();
+        add.setLatefees(totalLateFees);
         // 账户余额
         add.setAccountbalance(accountbalance);
         //原余额(元)   = 用户表 用户余额
         add.setOriginalbalance(accountbalance);
-        //实缴
-        add.setPaidin(paidin);
         //1、当 【余额】 >=【原应缴(元)】-【总减免(元)】 -【滞纳金(元)】  时,【余额抵扣】字段=【原应缴(元)】-【总减免(元)】 -【滞纳金(元)】
         //2、当 【余额】 <【原应缴(元)】-【总减免(元)】 -【滞纳金(元)】  时,【余额抵扣】字段=【账户余额(元)】
-        if(oughttohavepaid.subtract(allfeewaiver).subtract(latefees).compareTo(accountbalance)<0){
-            add.setBalancededuction(oughttohavepaid.subtract(allfeewaiver).subtract(latefees));
+        if(totalOught.subtract(totalWaivers).subtract(totalLateFees).compareTo(accountbalance)<0){
+            add.setBalancededuction(totalOught.subtract(totalWaivers).subtract(totalLateFees));
         }else {
             add.setBalancededuction(accountbalance);
         }
         // 【实际应缴(元)】=【原应缴(元)】-【总减免(元)】 +【滞纳金(元)】-【余额抵扣(元)】
-        add.setActualdue(oughttohavepaid.subtract(allfeewaiver).add(latefees).subtract(add.getBalancededuction()));
+        add.setActualdue(totalOught.subtract(totalWaivers).add(totalLateFees).subtract(add.getBalancededuction()));
         //【实缴后余额(元)】=【账户余额】+【本次实缴(元-整)】- 原应缴 + 总减免 - 滞纳金
-        add.setAfterpaymentbalance(paidin.add(accountbalance).subtract(oughttohavepaid).add(allfeewaiver).subtract(latefees));
-        //数据来源
-        add.setDatasource(datasource);
-        //更新用户表 余额字段
-        swUserManagementService.balanceAdd(swUserManagement.getId(), add.getAfterpaymentbalance().subtract(accountbalance));
+        add.setAfterpaymentbalance(add.getPaidin().add(accountbalance).subtract(totalOught).add(totalWaivers).subtract(totalLateFees));
+
         swBillingRecordService.save(add);
     }
 
     /**
-     * 生成缴费编号  年月日 + 3位数 随机数
-     * @return
+     * 年月日 +
+     * @param add 3位数 随机数
      */
-    private void CreateBillingNumber(SwBillingRecordDo add) {
-        // 获取当前时间并格式化为 "yyyyMMddHHmmss"
+    private void generateBillingNumber(SwBillingRecordDo add) {
+        SecureRandom random = new SecureRandom();
+        int randomNumber = random.nextInt(1000);
+        String randomStr = String.format("%03d", randomNumber);
         LocalDateTime now = LocalDateTime.now();
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
-        String formattedDateTime = now.format(formatter);
-
-        // 生成一个三位数的随机数
-        Random random = new Random();
-        int randomNumber = random.nextInt(1000); // 生成0到999之间的随机数
-        String randomStr = String.format("%03d", randomNumber); // 格式化为三位数,不足三位补零
-        add.setBillingnumber(formattedDateTime + randomStr);
-
-
+        add.setBillingnumber(now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + randomStr);
     }
 
+
     /**
-     * 校验账单数据
-     *
+     * 校验
      * @param list
      * @param ids
+     * @throws Exception
      */
-    private void checkBillingData(List<SwBillManagementUnpaidDo> list,  List<String> ids) throws Exception {
-        //判空
-        if (list.isEmpty()) throw new Exception("该户号下待缴账单已全部缴费,请重新选择户号!");
-        //个别 被缴费
-        if (list.size() < ids.size()) {
-            throw new Exception("当前账单中存在已缴费的,请重新查询用户最新账单在确认缴费");
+    private void validateBillingData(List<SwBillManagementUnpaidDo> list, List<String> ids)  throws Exception {
+        if (list.isEmpty()) {
+            throw new Exception( "没有待缴费账单");
+        }
+        if (list.size() != ids.size()) {
+            throw new Exception("部分账单已缴费");
         }
     }
 }