Selaa lähdekoodia

新增
1、轮候填写增加常用药
2、增加获取当前日期一个月内合同即将到期的长者和合同信息接口
BUGFIX
1、解决更新账单明细金额,日常费用没有同步更新的问题
2、检查是否能包房接口解决获取床位变更记录没有过滤退住长者的问题
3、应收报表解决续约的账单会重复计算标准金额的问题

liangwenxuan 1 kuukausi sitten
vanhempi
commit
e67407f69e
12 muutettua tiedostoa jossa 123 lisäystä ja 17 poistoa
  1. 3 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/business/vo/BpmCheckInWaitCreateReqVO.java
  2. 1 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/bpm/vo/CheckInWaitCreateReqVO.java
  3. 1 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmCheckInWaitApiImpl.java
  4. 61 11
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/order/OrderApiImpl.java
  5. 7 3
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/ElderlyContractController.java
  6. 1 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/ElderlyCheckInWaitDO.java
  7. 5 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/ElderlyContractMapper.java
  8. 4 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyContractService.java
  9. 20 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyContractServiceImpl.java
  10. 1 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java
  11. 8 3
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/NurseChangeRecordServiceImpl.java
  12. 11 0
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyContractMapper.xml

+ 3 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/business/vo/BpmCheckInWaitCreateReqVO.java

@@ -46,6 +46,9 @@ public class BpmCheckInWaitCreateReqVO {
     @Schema(description = "近期出院小结")
     private String recentDischargeSummary;
 
+    @Schema(description = "常用药")
+    private String commonMedicine;
+
     @Schema(description = "申请类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
     @NotNull(message = "申请类型不能为空")
     private Integer type = BpmBusinessTypeEnum.CHECK_IN_WAIT.getValue();

+ 1 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/bpm/vo/CheckInWaitCreateReqVO.java

@@ -20,6 +20,7 @@ public class CheckInWaitCreateReqVO {
     private String idCardPhoto;
 
     private String recentDischargeSummary;
+    private String commonMedicine;
 
     private Long tenantId;
 

+ 1 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmCheckInWaitApiImpl.java

@@ -60,6 +60,7 @@ public class BpmCheckInWaitApiImpl implements BpmCheckInWaitApi {
         data.setRemark(reqVO.getRemark());
         data.setPhysicalExaminationReport(reqVO.getPhysicalExaminationReport());
         data.setBedId(reqVO.getBedId());
+        data.setCommonMedicine(reqVO.getCommonMedicine());
         checkInWaitMapper.insert(data);
         return data.getId();
     }

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

@@ -25,6 +25,7 @@ import java.time.LocalDate;
 import java.time.YearMonth;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.concurrent.ConcurrentHashMap;
@@ -160,8 +161,8 @@ public class OrderApiImpl implements OrderApi {
                 continue;
             }
 
-            // 月度费用类(expenseSource=EXPENSE_ITEM):一次遍历同时计算“标准应收”和“实际应收”
-            applyMonthlyItems(dto, expenseOrderItemDOS, expenseItemMap);
+            // 月度费用类(expenseSource=EXPENSE_ITEM):按账单月区间计算“标准应收”和“实际应收”
+            applyMonthlyItems(dto, expenseOrderItemDOS, expenseItemMap, billMonth);
 
             // 3) 日常费用的外出/变更等调整:叠加到“实际应收”
             applyDailyAdjustments(dto, expenseOrderItemDOS, dailyExpenseMap, remarkBuilder);
@@ -244,7 +245,19 @@ public class OrderApiImpl implements OrderApi {
      * - 费用分类:按 ExpenseItemDO.type 划分床/膳/护/服务
      */
     private void applyMonthlyItems(OrderItemRespDTO dto, List<ExpenseOrderItemDO> items,
-                                   Map<Long, ExpenseItemDO> expenseItemMap) {
+                                   Map<Long, ExpenseItemDO> expenseItemMap,
+                                   String billMonth) {
+        YearMonth billYm = null;
+        if (StringUtil.isNotEmptyORNull(billMonth)) {
+            try {
+                billYm = YearMonth.parse(billMonth);
+            } catch (Exception ignore) {
+                billYm = null;
+            }
+        }
+        LocalDate billStart = billYm == null ? null : billYm.atDay(1);
+        LocalDate billEnd = billYm == null ? null : billYm.atEndOfMonth();
+
         for (ExpenseOrderItemDO expenseOrderItemDO : items) {
             if (!BusinessConstants.EXPENSE_ITEM.equals(expenseOrderItemDO.getExpenseSource())) {
                 continue;
@@ -259,20 +272,57 @@ public class OrderApiImpl implements OrderApi {
             BigDecimal actualAmount = expenseOrderItemDO.getTotalAmount() == null
                     ? BigDecimal.ZERO : expenseOrderItemDO.getTotalAmount();
 
+            BigDecimal billedStandardAmount = standardAmount;
+            BigDecimal billedActualAmount = actualAmount;
+
+            if (billYm != null) {
+                int daysInBillMonth = billYm.lengthOfMonth();
+                LocalDate changeStartDate = expenseItemDO.getChangeStartDate();
+                LocalDate changeEndDate = expenseItemDO.getChangeEndDate();
+
+                // 费用生效区间与账单月做交集:
+                // - 无开始日:视为本月月初
+                // - 无结束日:视为本月月末
+                LocalDate periodStart = changeStartDate == null ? billStart : changeStartDate;
+                LocalDate periodEnd = changeEndDate == null ? billEnd : changeEndDate;
+
+                LocalDate overlapStart = periodStart.isAfter(billStart) ? periodStart : billStart;
+                LocalDate overlapEnd = periodEnd.isBefore(billEnd) ? periodEnd : billEnd;
+
+                if (overlapEnd.isBefore(overlapStart)) {
+                    // 该费用在账单月无覆盖,跳过
+                    continue;
+                }
+
+                long actualDays = ChronoUnit.DAYS.between(overlapStart, overlapEnd) + 1;
+                if (daysInBillMonth > 0 && actualDays > 0 && actualDays != daysInBillMonth) {
+                    BigDecimal dayStandard = standardAmount
+                            .divide(BigDecimal.valueOf(daysInBillMonth), 8, RoundingMode.DOWN);
+                    BigDecimal dayActual = actualAmount
+                            .divide(BigDecimal.valueOf(daysInBillMonth), 8, RoundingMode.DOWN);
+                    billedStandardAmount = dayStandard
+                            .multiply(BigDecimal.valueOf(actualDays))
+                            .setScale(2, RoundingMode.DOWN);
+                    billedActualAmount = dayActual
+                            .multiply(BigDecimal.valueOf(actualDays))
+                            .setScale(2, RoundingMode.DOWN);
+                }
+            }
+
             Integer type = expenseItemDO.getType();
             if ((type != null  && 1 == type) || expenseItemDO.getItemName().contains("床位费")) {
                 dto.setBedItemName(expenseItemDO.getItemName());
-                dto.setBedAmount(dto.getBedAmount().add(standardAmount));
-                dto.setBedActualAmount(dto.getBedActualAmount().add(actualAmount));
+                dto.setBedAmount(dto.getBedAmount().add(billedStandardAmount));
+                dto.setBedActualAmount(dto.getBedActualAmount().add(billedActualAmount));
             } else if ((type != null  && 2 == type) || expenseItemDO.getItemName().contains("护理费")) {
-                dto.setNurseAmount(dto.getNurseAmount().add(standardAmount));
-                dto.setNurseActualAmount(dto.getNurseActualAmount().add(actualAmount));
+                dto.setNurseAmount(dto.getNurseAmount().add(billedStandardAmount));
+                dto.setNurseActualAmount(dto.getNurseActualAmount().add(billedActualAmount));
             } else if ((type != null  && 3 == type) || expenseItemDO.getItemName().contains("餐饮费")) {
-                dto.setMealAmount(dto.getMealAmount().add(standardAmount));
-                dto.setMealActualAmount(dto.getMealActualAmount().add(actualAmount));
+                dto.setMealAmount(dto.getMealAmount().add(billedStandardAmount));
+                dto.setMealActualAmount(dto.getMealActualAmount().add(billedActualAmount));
             } else if ((type != null  && 7 == type) ||  expenseItemDO.getItemName().contains("服务费")) {
-                dto.setServiceAmount(dto.getServiceAmount().add(standardAmount));
-                dto.setServiceActualAmount(dto.getServiceActualAmount().add(actualAmount));
+                dto.setServiceAmount(dto.getServiceAmount().add(billedStandardAmount));
+                dto.setServiceActualAmount(dto.getServiceActualAmount().add(billedActualAmount));
             }
         }
     }

+ 7 - 3
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/ElderlyContractController.java

@@ -23,6 +23,7 @@ import org.springframework.validation.annotation.Validated;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -97,9 +98,12 @@ public class ElderlyContractController {
         return success(true);
     }
 
-
-
-
+    @GetMapping("/expiring-within-one-month")
+    @Operation(summary = "获取当前日期一个月内合同即将到期的长者和合同信息")
+    @TenantIgnore
+    public CommonResult<List<ElderlyContractDO>> getExpiringWithinOneMonthContracts() {
+        return success(contractService.getExpiringWithinOneMonthContracts());
+    }
 
 //
 //    @GetMapping("/page")

+ 1 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/ElderlyCheckInWaitDO.java

@@ -30,6 +30,7 @@ public class ElderlyCheckInWaitDO extends BaseNoDeleteDO {
     private String idCardPhoto;
 
     private String recentDischargeSummary;
+    private String commonMedicine;
 
     private Long tenantId;
 

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

@@ -12,6 +12,7 @@ import org.apache.ibatis.annotations.Param;
 import java.util.Date;
 import java.util.List;
 
+
 /**
  * 长者合同管理 Mapper
  *
@@ -31,6 +32,10 @@ public interface ElderlyContractMapper extends BaseMapperX<ElderlyContractDO> {
 
     int batchUpdateStatusToExpired(@Param("tenantId") Long tenantId, @Param("nowDate") Date nowDate);
 
+    List<ElderlyContractDO> selectExpiringWithinOneMonth(@Param("tenantId") Long tenantId,
+                                                         @Param("startDate") Date startDate,
+                                                         @Param("endDate") Date endDate);
+
     default ElderlyContractDO selectValidContract(String contractNumber) {
         return selectOne(new LambdaQueryWrapperX<ElderlyContractDO>()
                         .eq(ElderlyContractDO::getContractNumber, contractNumber)

+ 4 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyContractService.java

@@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyContractRes
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyContractVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyContractDO;
 
+import java.util.List;
+
 /**
  * 长者合同管理 Service 接口
  *
@@ -26,4 +28,6 @@ public interface ElderlyContractService {
     void saveContractDetails(ElderlyContractDO contractDO);
 
     void updateContract(ElderlyContractDO updateReqVO);
+
+    List<ElderlyContractDO> getExpiringWithinOneMonthContracts();
 }

+ 20 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyContractServiceImpl.java

@@ -20,6 +20,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -417,4 +418,23 @@ public class ElderlyContractServiceImpl implements ElderlyContractService {
     public void updateContract(ElderlyContractDO updateReqVO) {
         elderlyContractMapper.updateById(updateReqVO);
     }
+
+    @Override
+    public List<ElderlyContractDO> getExpiringWithinOneMonthContracts() {
+        Date startDate = new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startDate);
+        calendar.add(Calendar.MONTH, 1);
+        Date endDate = calendar.getTime();
+
+        List<ElderlyContractDO> contracts = elderlyContractMapper.selectExpiringWithinOneMonth(
+                TenantContextHolder.getTenantId(), startDate, endDate);
+
+        for (ElderlyContractDO contract : contracts) {
+            TenantDO tenant = tenantService.getTenant(contract.getTenantId());
+            contract.setTenantName(tenant == null ? null : tenant.getName());
+            contract.setStatus(1);
+        }
+        return contracts;
+    }
 }

+ 1 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java

@@ -2896,6 +2896,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             expenseOrderItemMapper.updateById(orderItemDO);
             if(editVO.getExpenseSource().equals(BusinessConstants.DAILY_EXPENSES)){
                 DailyExpensesDO update = new DailyExpensesDO();
+                update.setId(editVO.getSourceExpenseItemId());
                 update.setRemarks(editVO.getDescription());
                 update.setCount(editVO.getCount());
                 update.setPrice(editVO.getPrice());

+ 8 - 3
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/NurseChangeRecordServiceImpl.java

@@ -204,13 +204,18 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
             List<ElderlyChangeRecordDO> list = bedChangeRecordMapper.selectList(new LambdaQueryWrapperX<ElderlyChangeRecordDO>()
                     .in(ElderlyChangeRecordDO::getExpectId, idList)
                     .eq(ElderlyChangeRecordDO::getCurrentFlag, 0)
-                    .eq(ElderlyChangeRecordDO::getChangeType, 0));
-            if (null != list && list.size() > 0) {
+                    .eq(ElderlyChangeRecordDO::getChangeType, 0)
+                    .orderByDesc(ElderlyChangeRecordDO::getCreateTime));
+            if (null != list && !list.isEmpty()) {
                 // 若存在当前申请床位之外的最新床位记录,说明房间关联到其他变更,不能包房
                 List<ElderlyChangeRecordDO> otherBedRecordList = list.stream()
                         .filter(item -> !bedId.equals(item.getExpectId()))
                         .collect(Collectors.toList());
-                if (otherBedRecordList.size() > 0) {
+                if (!otherBedRecordList.isEmpty()) {
+                    ElderlyChangeRecordDO elderlyChangeRecordDO = otherBedRecordList.get(0);
+                    if (elderlyInfoMapper.selectById(elderlyChangeRecordDO.getElderlyId()).getInStatus() == 1) {
+                        return Boolean.TRUE;
+                    }
                     return Boolean.FALSE;
                 }
             }

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

@@ -77,4 +77,15 @@
           AND DATE(expire_time) &lt; DATE(#{nowDate})
     </update>
 
+    <select id="selectExpiringWithinOneMonth" resultType="cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyContractDO">
+        SELECT ec.*, ei.in_status_type
+        FROM elderly_contract ec
+                 INNER JOIN elderly_info ei ON ec.elder_id = ei.id
+        WHERE ec.tenant_id = #{tenantId}
+          AND ec.expire_time &gt;= #{startDate}
+          AND ec.expire_time &lt;= #{endDate}
+          AND ei.in_status = 1
+        ORDER BY ec.expire_time ASC, ec.id DESC
+    </select>
+
 </mapper>