Ver código fonte

新增
1、导入消费券自动更新退住结算单

liangwenxuan 2 meses atrás
pai
commit
b985078aac

+ 65 - 16
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyConsumerVouchersServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.system.service.biz;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -8,18 +9,14 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyConsumerVouchersPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyConsumerVouchersSaveReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.excel.ElderlyConsumerVouchersImportExcelVO;
-import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyConsumerVouchersDO;
-import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyInfoDO;
-import cn.iocoder.yudao.module.system.dal.dataobject.biz.ExpenseOrderDO;
-import cn.iocoder.yudao.module.system.dal.dataobject.biz.ExpenseOrderItemDO;
-import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyConsumerVouchersMapper;
-import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyInfoMapper;
-import cn.iocoder.yudao.module.system.dal.mysql.biz.ExpenseOrderItemMapper;
-import cn.iocoder.yudao.module.system.dal.mysql.biz.ExpenseOrderMapper;
+import cn.iocoder.yudao.module.system.dal.dataobject.biz.*;
+import cn.iocoder.yudao.module.system.dal.mysql.biz.*;
 import cn.iocoder.yudao.module.system.enums.change.BusinessConstants;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
@@ -33,6 +30,7 @@ import java.util.Date;
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exceptionCustomMsg;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.COMMON_ERROR;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.COMMON_NOT_FOUND;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.EXPENSE_ORDER_ALREADY_CONFIRMED;
@@ -54,11 +52,18 @@ public class ElderlyConsumerVouchersServiceImpl implements ElderlyConsumerVouche
     @Resource
     private ElderlyInfoMapper elderlyInfoMapper;
 
+    @Autowired
+    private RefundSettlementOrderMapper refundSettlementOrderMapper;
+
+    @Autowired
+    private RefundSettlementOrderItemMapper refundSettlementOrderItemMapper;
+
     @Override
     public Long create(ElderlyConsumerVouchersDO createReqVO) {
         validateBillingMonth(createReqVO.getBillingMonth());
         elderlyConsumerVouchersMapper.insert(createReqVO);
         updateExpenseOrder(createReqVO);
+        updateRefundOrder(createReqVO);
         return createReqVO.getId();
     }
 
@@ -71,8 +76,14 @@ public class ElderlyConsumerVouchersServiceImpl implements ElderlyConsumerVouche
     }
 
     @Override
+    @Transactional
     public void delete(Long id) {
         validateExists(id);
+        ExpenseOrderItemDO expenseOrderItemDO = expenseOrderItemMapper.selectOne(new LambdaQueryWrapperX<ExpenseOrderItemDO>().eq(ExpenseOrderItemDO::getSourceExpenseItemId, id));
+        ExpenseOrderDO expenseOrderDO = expenseOrderMapper.selectById(expenseOrderItemDO.getExpenseOrderId());
+        expenseOrderDO.setActualAmount(expenseOrderDO.getActualAmount().subtract(expenseOrderItemDO.getTotalAmount()));
+        expenseOrderMapper.updateById(expenseOrderDO);
+        expenseOrderItemMapper.deleteById(expenseOrderItemDO);
         elderlyConsumerVouchersMapper.deleteById(id);
     }
 
@@ -90,28 +101,29 @@ public class ElderlyConsumerVouchersServiceImpl implements ElderlyConsumerVouche
     }
 
     @Override
+    @Transactional
     public void importData(List<ElderlyConsumerVouchersImportExcelVO> list) {
         if (list == null || list.isEmpty()) {
-            throw exception(COMMON_ERROR, "导入数据不能为空");
+            throw exceptionCustomMsg(COMMON_ERROR, "导入数据不能为空");
         }
         Long currentTenantId = TenantContextHolder.getTenantId();
         for (int i = 0; i < list.size(); i++) {
             int excelRow = i + 2;
             ElderlyConsumerVouchersImportExcelVO item = list.get(i);
             if (item == null) {
-                throw exception(COMMON_ERROR, "第" + excelRow + "行数据为空");
+                throw exceptionCustomMsg(COMMON_ERROR, "第" + excelRow + "行数据为空");
             }
             if (StringUtils.isBlank(item.getElderName())) {
-                throw exception(COMMON_ERROR, "第" + excelRow + "行【长者姓名】不能为空");
+                throw exceptionCustomMsg(COMMON_ERROR, "第" + excelRow + "行【长者姓名】不能为空");
             }
             if (StringUtils.isBlank(item.getIdCard())) {
-                throw exception(COMMON_ERROR, "第" + excelRow + "行【身份证号】不能为空");
+                throw exceptionCustomMsg(COMMON_ERROR, "第" + excelRow + "行【身份证号】不能为空");
             }
             if (item.getAmount() == null) {
-                throw exception(COMMON_ERROR, "第" + excelRow + "行【消费券金额】不能为空");
+                throw exceptionCustomMsg(COMMON_ERROR, "第" + excelRow + "行【消费券金额】不能为空");
             }
             if (StringUtils.isBlank(item.getBillingMonth())) {
-                throw exception(COMMON_ERROR, "第" + excelRow + "行【账单归属月】不能为空");
+                throw exceptionCustomMsg(COMMON_ERROR, "第" + excelRow + "行【账单归属月】不能为空");
             }
             validateBillingMonth(item.getBillingMonth());
 
@@ -120,7 +132,7 @@ public class ElderlyConsumerVouchersServiceImpl implements ElderlyConsumerVouche
                     .eq(ElderlyInfoDO::getIdCard, item.getIdCard())
                     .eqIfPresent(ElderlyInfoDO::getTenantId, currentTenantId));
             if (elderlyInfo == null) {
-                throw exception(COMMON_ERROR, "第" + excelRow + "行未找到匹配长者(姓名+身份证)");
+                throw exceptionCustomMsg(COMMON_ERROR, "第" + excelRow + "行未找到匹配长者(姓名+身份证)");
             }
 
             ExpenseOrderDO expenseOrder = expenseOrderMapper.selectOne(new LambdaQueryWrapperX<ExpenseOrderDO>()
@@ -133,7 +145,7 @@ public class ElderlyConsumerVouchersServiceImpl implements ElderlyConsumerVouche
                             .eq(ExpenseOrderDO::getBillingMonth, item.getBillingMonth())
                             .in(ExpenseOrderDO::getType, 1, 2));
             if (expenseOrder == null) {
-                throw exception(COMMON_ERROR, "第" + excelRow + "行未找到可抵扣账单(需存在未缴费且可见的对应账单月账单)");
+                throw exceptionCustomMsg(COMMON_ERROR, "第" + excelRow + "行未找到可抵扣账单(需存在未缴费且可见的对应账单月账单)");
             }
             validateExpenseOrderNotConfirmedAndNotLock(expenseOrder);
 
@@ -227,4 +239,41 @@ public class ElderlyConsumerVouchersServiceImpl implements ElderlyConsumerVouche
             throw exception(COMMON_ERROR, "账单归属月格式需为 yyyy-MM,例如 2025-01");
         }
     }
+
+    /**
+     * 更新退住结算单
+     */
+    private void updateRefundOrder(ElderlyConsumerVouchersDO vouchers){
+        //创建长护险的时候要把费用生成对应的账单里面
+        // 查询对应退住的账单,如果不存在则返回
+        List<RefundSettlementOrderDO> refundSettlementOrderDOList = refundSettlementOrderMapper.selectList(new LambdaQueryWrapperX<RefundSettlementOrderDO>()
+                .eq(RefundSettlementOrderDO::getElderId, vouchers.getElderId())
+                .orderByDesc(RefundSettlementOrderDO::getCreatedTime)); // 月度账单
+        if(CollectionUtil.isEmpty(refundSettlementOrderDOList)){
+            return;
+        }
+        RefundSettlementOrderDO refundSettlementOrderDO = refundSettlementOrderDOList.get(0);
+
+        // 创建账单费用项
+        RefundSettlementOrderItemDO orderItem = new RefundSettlementOrderItemDO();
+        orderItem.setRefundSettlementOrderId(refundSettlementOrderDO.getId());
+        orderItem.setType(2);
+        orderItem.setCount(1);
+        orderItem.setItemName("长护险抵扣");
+        orderItem.setRemarks(vouchers.getRemarks());
+        orderItem.setPrice(vouchers.getAmount().negate()); // 单价为负数表示抵扣
+        orderItem.setRefundAmount(vouchers.getAmount().negate()); // 实际单价
+        orderItem.setActualRefundAmount(vouchers.getAmount().negate()); // 总金额为负数表示抵扣
+        orderItem.setTenantId(vouchers.getTenantId());
+        orderItem.setSourceItemId(vouchers.getId());
+        refundSettlementOrderItemMapper.insert(orderItem);
+        // 更新账单总金额
+        BigDecimal currentAmount = refundSettlementOrderDO.getRefundAmount() != null ? refundSettlementOrderDO.getRefundAmount() : BigDecimal.ZERO;
+        BigDecimal newAmount = currentAmount.add(orderItem.getRefundAmount());
+        refundSettlementOrderDO.setRefundAmount(newAmount);
+        refundSettlementOrderMapper.updateById(refundSettlementOrderDO);
+        //更新长护险状态
+        vouchers.setStatus(1);
+        elderlyConsumerVouchersMapper.updateById(vouchers);
+    }
 }