Explorar el Código

Merge remote-tracking branch 'origin/master'

xiahan hace 4 meses
padre
commit
480718bc55

+ 1 - 1
zhsw-common/src/main/java/com/rongwei/zhsw/system/service/SwRefundRequestRecordService.java

@@ -15,5 +15,5 @@ import com.rongwei.rwcommon.base.R;
 public interface SwRefundRequestRecordService  extends IService<SwRefundRequestRecordDO> {
 
 
-    R refundApplication( String id);
+    R refundApplication( String id) throws Exception;
 }

+ 83 - 46
zhsw-common/src/main/java/com/rongwei/zhsw/system/service/impl/SwRefundRequestRecordServiceImpl.java

@@ -1,5 +1,5 @@
 package com.rongwei.zhsw.system.service.impl;
- 
+
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -49,21 +49,37 @@ public class SwRefundRequestRecordServiceImpl extends ServiceImpl<SwRefundReques
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public R refundApplication(String id) {
+    public R refundApplication(String id) throws Exception {
 
         //当前用户
         SysUserVo currentUser = ZHSWCommonUtils.getCurrentUser();
 
-        //1.获取退款记录
+        //获取退款记录
         SwRefundRequestRecordDO refundRequestRecordDO = swRefundRequestRecordService.getById(id);
 
-        // 缴费记录表更新:
+        //用户表获取
+        SwUserManagementDo user = swUserManagementService.getBaseMapper().
+                selectOne(new LambdaQueryWrapper<SwUserManagementDo>().eq(SwUserManagementDo::getUsernumber, refundRequestRecordDO.getUsernumber()));
+
+        //校验 退款金额
+        validateRefundAmount(refundRequestRecordDO,user);
+
+        // 1.缴费记录表更新:
         updateBillRecord(refundRequestRecordDO,currentUser);
 
-        BigDecimal balanceAdd =BigDecimal.ZERO;
+        //2. 更新退款记录
+        processRefund(refundRequestRecordDO, currentUser);
 
-        //全额 退款
-        if (refundRequestRecordDO.getRefundmethod().equals(REFUNDMETHODALL)){
+        // 已缴账单记录表更新
+        migratePaidBillsToUnpaid(refundRequestRecordDO);
+
+        // 更新用户余额
+        updateUserBalance(refundRequestRecordDO,user);
+
+        return R.ok();
+    }
+
+    private void processRefund(SwRefundRequestRecordDO refundRequestRecordDO, SysUserVo currentUser) {
             // 退款记录表更新 实退金额 退款操作人,操作时间
             swRefundRequestRecordService.update(new LambdaUpdateWrapper<SwRefundRequestRecordDO>()
                     .eq(SwRefundRequestRecordDO::getId, refundRequestRecordDO.getId())
@@ -73,58 +89,79 @@ public class SwRefundRequestRecordServiceImpl extends ServiceImpl<SwRefundReques
                     .set(SwRefundRequestRecordDO::getRefundoperatorname, currentUser.getName())
                     .set(SwRefundRequestRecordDO::getRefundtime,new Date())
             );
+    }
 
-            //预收账单记录表更新: 已缴账单记录表更新
-            updateOrSaveBills(refundRequestRecordDO.getPaymentrecordid());
-
-            //用户表更新:系统需要 将 对应用户信息中的【余额】进行更新,余额 =  当前用户余额 + 【余额抵扣 balancededuction
-            balanceAdd = refundRequestRecordDO.getBalancededuction();
-
-
-        } else if (refundRequestRecordDO.getRefundmethod().equals(REFUNDMETHODBALANCE)) {
-             // 差额退款
+    /**
+     * 更新用户表月
+     * @param refundRequestRecordDO
+     * @param user
+     */
+    private void updateUserBalance(SwRefundRequestRecordDO refundRequestRecordDO, SwUserManagementDo user) {
+        BigDecimal balanceChange = calculateBalanceChange(refundRequestRecordDO);
+        swUserManagementService.balanceAdd(user.getId(), balanceChange);
+    }
 
-           // 用户表更新:系统需要 将 对应用户信息中的【余额】进行更新,余额 =  当前用户余额 - 【退款金额】
-            balanceAdd = BigDecimal.ZERO.subtract(refundRequestRecordDO.getRefundamount());
+    /**
+     *   全额 用户表更新:系统需要 将 对应用户信息中的【余额】进行更新,余额 =  当前用户余额 + 【余额抵扣 balancededuction
+     *   差额   系统需要 将 对应用户信息中的【余额】进行更新,余额 =  当前用户余额 - 【退款金额】
+     *   negate 数值取反
+     * @param refundRequest
+     * @return
+     */
+    private BigDecimal calculateBalanceChange(SwRefundRequestRecordDO refundRequest) {
+        if (REFUNDMETHODALL.equals(refundRequest.getRefundmethod())) {
+            return refundRequest.getBalancededuction();
         }
+        return refundRequest.getRefundamount().negate();
+    }
 
-        //用户表更新
-        SwUserManagementDo swUserManagement = swUserManagementService.getBaseMapper().
-                selectOne(new LambdaQueryWrapper<SwUserManagementDo>().eq(SwUserManagementDo::getUsernumber, refundRequestRecordDO.getUsernumber()));
-        swUserManagementService.balanceAdd(swUserManagement.getId(), balanceAdd);
-
-
-        return R.ok();
+    /**
+     * 校验 退款金额 差额退款时候 退款金额不能大于用户余额
+     * @param refundRequestRecordDO
+     * @param user
+     */
+    private void validateRefundAmount(SwRefundRequestRecordDO refundRequestRecordDO, SwUserManagementDo user) {
+        if (REFUNDMETHODBALANCE.equals(refundRequestRecordDO.getRefundmethod())) {
+            if (refundRequestRecordDO.getRefundamount().compareTo(user.getAccountbalance()) > 0) {
+                throw new IllegalArgumentException("本次退款月不足,无法退款");
+            }
+        }
     }
 
     /**
      * 预收账单记录表更新:系统需要 将 对应的 缴费记录对应账单 信息 复制一份到  预收账单记录表中,并且 缴费状态标记状态为“待缴费”
      * 已缴账单记录表更新:系统需要 将 对应的 缴费记录对应账单 标记为删除
-     * @param paymentrecordid
+     * @param
      */
-    private void updateOrSaveBills(String paymentrecordid) {
-        List<SwBillManagementUnpaidDo> unpaidDoList =new ArrayList<>();
-        List<String> paidIds =new ArrayList<>();
-        List<SwBillManagementPaidDo> list = swBillManagementPaidService.list(new LambdaQueryWrapper<SwBillManagementPaidDo>()
-                .eq(SwBillManagementPaidDo::getPaymentrecordid,paymentrecordid)
-                .eq(SwBillManagementPaidDo::getDeleted,"0")
-        );
-        if (!list.isEmpty()){
-            for (SwBillManagementPaidDo paidDo : list){
-                // 已缴账单记录
-                paidIds.add(paidDo.getId());
-                //预收账单记录
-                SwBillManagementUnpaidDo unpaidDo = new SwBillManagementUnpaidDo();
-                BeanUtils.copyProperties(paidDo,unpaidDo);
-                unpaidDo.setId(SecurityUtil.getUUID());
-                unpaidDo.setStatus(PENDINGSTATUS);
-                unpaidDoList.add(unpaidDo);
+    private void migratePaidBillsToUnpaid(SwRefundRequestRecordDO swRefundRequestRecordDO) {
+        if (swRefundRequestRecordDO.getRefundmethod().equals(REFUNDMETHODALL)){
+
+            List<SwBillManagementPaidDo> paidBills = swBillManagementPaidService.list(new LambdaQueryWrapper<SwBillManagementPaidDo>()
+                    .eq(SwBillManagementPaidDo::getPaymentrecordid,swRefundRequestRecordDO.getPaymentrecordid())
+                    .eq(SwBillManagementPaidDo::getDeleted,"0")
+            );
+            if (!paidBills.isEmpty()){
+                List<SwBillManagementUnpaidDo> unpaidDoList =new ArrayList<>();
+                List<String> paidIds =new ArrayList<>();
+                for (SwBillManagementPaidDo paidDo : paidBills){
+                    // 已缴账单记录
+                    paidIds.add(paidDo.getId());
+                    //预收账单记录
+                    SwBillManagementUnpaidDo unpaidBill = new SwBillManagementUnpaidDo();
+                    BeanUtils.copyProperties(paidDo,unpaidBill);
+                    unpaidBill.setId(SecurityUtil.getUUID());
+                    unpaidBill.setStatus(PENDINGSTATUS);
+                    unpaidDoList.add(unpaidBill);
+                }
+
+                swBillManagementUnpaidService.saveBatch(unpaidDoList,200);
+                swBillManagementPaidService.getBaseMapper().selectBatchIds(paidIds);
             }
 
-            swBillManagementUnpaidService.saveBatch(unpaidDoList,200);
-            swBillManagementPaidService.getBaseMapper().selectBatchIds(paidIds);
+
         }
 
+
     }
 
     /**
@@ -134,7 +171,7 @@ public class SwRefundRequestRecordServiceImpl extends ServiceImpl<SwRefundReques
      * @param currentUser
      */
     private void updateBillRecord(SwRefundRequestRecordDO refundRequestRecordDO, SysUserVo currentUser) {
-        // 将对应的 【退款金额】【退款人】【退款时间】记录到 缴费记录表中,
+        // 将对应的 【退款金额】【退款人】【退款时间】记录到 缴费记录表中, 当前用户
         SwBillingRecordDo swBillingRecordUpdateDo = new SwBillingRecordDo();
         swBillingRecordUpdateDo.setId(refundRequestRecordDO.getPaymentrecordid());
         swBillingRecordUpdateDo.setRefundtime(new Date());