Просмотр исходного кода

修改
1、修改合同状态更新定时任务,增加修复合同状态的功能

liangwenxuan 3 месяцев назад
Родитель
Сommit
6a3c58fb9d

+ 19 - 21
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/order/OrderApiImpl.java

@@ -370,29 +370,27 @@ public class OrderApiImpl implements OrderApi {
 
     /** 处理非外出/变更的日常费用(增值、点餐、护理、服务等) */
     private void handleOtherDailyExpenses(OrderItemRespDTO dto, DailyExpensesDO dailyExpensesDO) {
-        // 增值服务费
-        String itemCategory = dailyExpensesDO.getItemCategory();
-        if (itemCategory != null && itemCategory.contains("增值服务费")) {
-            BigDecimal extraAmount = dailyExpensesDO.getAmount() == null ? BigDecimal.ZERO : dailyExpensesDO.getAmount();
-            dto.setExtraServiceAmount(dto.getExtraServiceAmount().add(extraAmount));
+        String itemName = dailyExpensesDO.getItemName();
+        if (itemName != null) {
+            BigDecimal roundAmount = dailyExpensesDO.getAmount() == null ? BigDecimal.ZERO : dailyExpensesDO.getAmount();
+            if ("点餐".equals(itemName)) {
+                BigDecimal currentAmount = dto.getOrderFoodAmount() == null ? BigDecimal.ZERO : dto.getOrderFoodAmount();
+                dto.setOrderFoodAmount(currentAmount.add(roundAmount));
             }
-            String itemName = dailyExpensesDO.getItemName();
-            if (itemName != null) {
-                BigDecimal roundAmount = dailyExpensesDO.getAmount() == null ? BigDecimal.ZERO : dailyExpensesDO.getAmount();
-                    if ("点餐".equals(itemName)) {
-                        BigDecimal currentAmount = dto.getOrderFoodAmount() == null ? BigDecimal.ZERO : dto.getOrderFoodAmount();
-                        dto.setOrderFoodAmount(currentAmount.add(roundAmount));
-                    }
-                    if (itemName.contains("生命体征") || itemName.contains("医疗护理")) {
-                        BigDecimal currentAmount = dto.getOrderNursingAmount() == null ? BigDecimal.ZERO : dto.getOrderNursingAmount();
-                        dto.setOrderNursingAmount(currentAmount.add(roundAmount));
-                    }
-                    if (itemName.contains("身体护理")) {
-                        BigDecimal currentAmount = dto.getOrderServiceAmount() == null ? BigDecimal.ZERO : dto.getOrderServiceAmount();
-                        dto.setOrderServiceAmount(currentAmount.add(roundAmount));
-                    }
-                }
+            if (itemName.contains("生命体征") || itemName.contains("医疗护理")) {
+                BigDecimal currentAmount = dto.getOrderNursingAmount() == null ? BigDecimal.ZERO : dto.getOrderNursingAmount();
+                dto.setOrderNursingAmount(currentAmount.add(roundAmount));
             }
+            if (itemName.contains("身体护理")) {
+                BigDecimal currentAmount = dto.getOrderServiceAmount() == null ? BigDecimal.ZERO : dto.getOrderServiceAmount();
+                dto.setOrderServiceAmount(currentAmount.add(roundAmount));
+            }
+        }
+        BigDecimal extraAmount = dailyExpensesDO.getAmount() == null ? BigDecimal.ZERO : dailyExpensesDO.getAmount();
+        dto.setExtraServiceAmount(dto.getExtraServiceAmount().add(extraAmount));
+        dto.setAdjustAmount(dto.getAdjustAmount().add(extraAmount));
+        dto.setRemark((dto.getRemark() == null ? "" : dto.getRemark()) + dailyExpensesDO.getRemarks() + itemName + ":" + dailyExpensesDO.getAmount());
+    }
 
     /** 汇总标准/实际合计及占比 */
     private void computeTotals(OrderItemRespDTO dto) {

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/ElderlyContractMapper.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -23,4 +24,8 @@ public interface ElderlyContractMapper extends BaseMapperX<ElderlyContractDO> {
     List<ElderlyContractDO> selectMessageList();
 
     List<ElderlyContractDO> selectInProgressByElderIds(@Param("elderIds") List<Long> elderIds);
+
+    int batchUpdateStatusToNotStarted(@Param("tenantId") Long tenantId, @Param("nowDate") Date nowDate);
+
+    int batchUpdateStatusToExpired(@Param("tenantId") Long tenantId, @Param("nowDate") Date nowDate);
 }

+ 15 - 4
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/ElderContractUpdateJob.java

@@ -41,18 +41,29 @@ public class ElderContractUpdateJob implements JobHandler {
     }
 
     private void updateElderContractStatus(Long tenantId){
-        // 获取该租户所有的长者合同
+        LocalDate nowLocalDate = LocalDate.now();
+
+        // 1) 修复:将“进行中(1)”但日期不匹配的合同纠正为“未开始(2)”或“过期(0)”
+        //    使用批量 SQL,避免逐条 update
+        Date nowDate = Date.from(nowLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
+        int fixToNotStartedCount = elderlyContractMapper.batchUpdateStatusToNotStarted(tenantId, nowDate);
+        int fixToExpiredCount = elderlyContractMapper.batchUpdateStatusToExpired(tenantId, nowDate);
+        if (fixToNotStartedCount > 0 || fixToExpiredCount > 0) {
+            logger.info("租户{}合同状态修复:进行中->未开始 {} 条,进行中->过期 {} 条", tenantId, fixToNotStartedCount, fixToExpiredCount);
+        }
+
+        // 2) 原有逻辑:到期的旧合同置为过期(0),并将符合条件的未开始合同置为进行中(1)
+        //    这里先重新查询一次进行中合同(避免上一步修复后状态已变化造成遗漏/误判)
         List<ElderlyContractDO> elderlyContractDOList = elderlyContractMapper.selectList(new LambdaQueryWrapperX<ElderlyContractDO>()
                 .eq(ElderlyContractDO::getTenantId, tenantId)
                 .eq(ElderlyContractDO::getStatus, 1));
         for (ElderlyContractDO elderlyContractDO : elderlyContractDOList) {
-            LocalDate nowLocalDate = LocalDate.now();
             LocalDate expireLocalDate = elderlyContractDO.getExpireTime().toInstant()
                     .atZone(ZoneId.systemDefault())
                     .toLocalDate();
             // 判断合同今天是否是到期时间
-            if(expireLocalDate.isBefore(nowLocalDate)){   // 当天不属于过期,过了一天才算,所以+1
-                // 查询未开始的合同,并且开始时间大于等于今天
+            if(expireLocalDate.isBefore(nowLocalDate)){   // 到期当日不算过期,次日才算
+                // 查询未开始的合同(同一老人),并且截止时间 >= 今天(意味着该合同今天仍有效或未来有效)
                 List<ElderlyContractDO> futureContractList = elderlyContractMapper.selectList(new LambdaQueryWrapperX<ElderlyContractDO>()
                         .eq(ElderlyContractDO::getElderId, elderlyContractDO.getElderId())
                         .eq(ElderlyContractDO::getStatus, 2)

+ 16 - 0
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyContractMapper.xml

@@ -61,4 +61,20 @@
         ORDER BY ec.elder_id ASC, ec.created_time DESC, ec.id DESC
     </select>
 
+    <update id="batchUpdateStatusToNotStarted">
+        UPDATE elderly_contract
+        SET status = 2
+        WHERE status = 1
+          AND tenant_id = #{tenantId}
+          AND DATE(begin_time) &gt; DATE(#{nowDate})
+    </update>
+
+    <update id="batchUpdateStatusToExpired">
+        UPDATE elderly_contract
+        SET status = 0
+        WHERE status = 1
+          AND tenant_id = #{tenantId}
+          AND DATE(expire_time) &lt; DATE(#{nowDate})
+    </update>
+
 </mapper>