Explorar el Código

新增
1、新增外出登记审批流
修改
1、应收报表部分列统计项目调整

liangwenxuan hace 2 semanas
padre
commit
2a19313e9b
Se han modificado 14 ficheros con 277 adiciones y 18 borrados
  1. 49 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/business/listener/BpmOutboundRegistrationStatusListener.java
  2. 6 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmAskLeaveApi.java
  3. 9 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/order/DTO/OrderItemRespDTO.java
  4. 9 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/order/VO/OrderItemRespVO.java
  5. 25 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmAskLeaveApiImpl.java
  6. 1 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyApiImpl.java
  7. 2 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyExpenseApiImpl.java
  8. 111 14
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/order/OrderApiImpl.java
  9. 17 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/ElderlyAskLeaveController.java
  10. 12 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/CheckInRecordDetailRespVO.java
  11. 2 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyAskLeaveService.java
  12. 26 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyAskLeaveServiceImpl.java
  13. 7 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyInfoServiceImpl.java
  14. 1 0
      yudao-server/src/main/resources/application.yaml

+ 49 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/business/listener/BpmOutboundRegistrationStatusListener.java

@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.bpm.service.business.listener;
+
+import cn.iocoder.yudao.module.bpm.dal.dataobject.business.BpmBusinessFormDO;
+import cn.iocoder.yudao.module.bpm.enums.BpmBusinessTypeEnum;
+import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
+import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
+import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEventListener;
+import cn.iocoder.yudao.module.bpm.service.business.BpmBusinessFormService;
+import cn.iocoder.yudao.module.system.api.bpm.BpmAskLeaveApi;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+public class BpmOutboundRegistrationStatusListener extends BpmProcessInstanceStatusEventListener {
+
+    @Resource
+    private BpmBusinessFormService businessFormService;
+
+    @Resource
+    private BpmAskLeaveApi askLeaveApi;
+
+    @Override
+    protected String getProcessDefinitionKey() {
+        return BpmBusinessTypeEnum.OUTBOUND_REGISTRATION.getKey();
+    }
+
+    @Override
+    protected void onEvent(BpmProcessInstanceStatusEvent event) {
+        BpmBusinessFormDO businessFormDO = businessFormService.getBusinessFormByInstanceId(event.getId());
+        businessFormDO.setStatus(event.getStatus());
+        businessFormService.updateBusinessForm(businessFormDO);
+
+        if (BpmProcessInstanceStatusEnum.APPROVE.getStatus().equals(event.getStatus())) {
+            askLeaveApi.updateLeaveStatus(businessFormDO.getBusinessId(), 1);
+        } else if (BpmProcessInstanceStatusEnum.REJECT.getStatus().equals(event.getStatus())
+                || BpmProcessInstanceStatusEnum.CANCEL.getStatus().equals(event.getStatus())) {
+            askLeaveApi.updateLeaveStatus(businessFormDO.getBusinessId(), 0);
+        }
+
+        if (BpmProcessInstanceStatusEnum.isProcessEndStatus(event.getStatus())) {
+            BpmBusinessFormDO updateDO = new BpmBusinessFormDO();
+            updateDO.setId(businessFormDO.getId());
+            updateDO.setCompleteStatus(1);
+            businessFormService.updateBusinessForm(updateDO);
+        }
+    }
+}
+

+ 6 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmAskLeaveApi.java

@@ -0,0 +1,6 @@
+package cn.iocoder.yudao.module.system.api.bpm;
+
+public interface BpmAskLeaveApi {
+
+    void updateLeaveStatus(Long askLeaveId, Integer leaveStatus);
+}

+ 9 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/order/DTO/OrderItemRespDTO.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.Date;
+import java.util.Map;
 
 /**
  * @Author: jinyd
@@ -128,6 +129,14 @@ public class OrderItemRespDTO {
     // 水电费
     private BigDecimal orderWaterElectricityAmount;
 
+    private BigDecimal orderOtherIncomeAmount;
+
+    private Map<String, BigDecimal> orderNursingItemStats;
+
+    private Map<String, BigDecimal> orderServiceItemStats;
+
+    private Map<String, BigDecimal> orderOtherIncomeItemStats;
+
     // 增值服务费
     private BigDecimal extraServiceAmount;
 

+ 9 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/order/VO/OrderItemRespVO.java

@@ -5,6 +5,7 @@ import lombok.Data;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.Map;
 
 /**
  * @Author: jinyd
@@ -116,6 +117,14 @@ public class OrderItemRespVO {
     // 水电费
     private BigDecimal orderWaterElectricityAmount;
 
+    private BigDecimal orderOtherIncomeAmount;
+
+    private Map<String, BigDecimal> orderNursingItemStats;
+
+    private Map<String, BigDecimal> orderServiceItemStats;
+
+    private Map<String, BigDecimal> orderOtherIncomeItemStats;
+
     // 增值服务费
     private BigDecimal extraServiceAmount;
 

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

@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.system.api.bpm;
+
+import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyAskLeaveDO;
+import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyAskLeaveMapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+@Service
+@Validated
+public class BpmAskLeaveApiImpl implements BpmAskLeaveApi {
+
+    @Resource
+    private ElderlyAskLeaveMapper elderlyAskLeaveMapper;
+
+    @Override
+    public void updateLeaveStatus(Long askLeaveId, Integer leaveStatus) {
+        elderlyAskLeaveMapper.update(null, new LambdaUpdateWrapper<ElderlyAskLeaveDO>()
+                .eq(ElderlyAskLeaveDO::getId, askLeaveId)
+                .set(ElderlyAskLeaveDO::getLeaveStatus, leaveStatus));
+    }
+}
+

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

@@ -256,6 +256,7 @@ public class BpmElderlyApiImpl implements BpmElderlyApi {
     @Override
     public Long addElder(ElderlyInfoReqVO elderlyInfoReqVO) {
         ElderlyInfoDO elderlyInfo = BeanUtils.toBean(elderlyInfoReqVO, ElderlyInfoDO.class);
+        elderlyInfo.setElderName(elderlyInfo.getElderName().trim());
         elderlyInfo.setCreateTime(new Date());
         elderlyInfo.setUserSign(RandomUtil.randomString(18));
         elderlyInfo.setUpdateTime(new Date());

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

@@ -449,7 +449,8 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
         }
         List<ElderlyAskLeaveDO> elderlyAskLeaveDOS = askLeaveMapper.selectList(new LambdaQueryWrapperX<ElderlyAskLeaveDO>()
                 .eq(ElderlyAskLeaveDO::getElderId, elderId)
-                .isNull(ElderlyAskLeaveDO::getUpdateDate));
+                .isNull(ElderlyAskLeaveDO::getUpdateDate)
+                .and(w -> w.ne(ElderlyAskLeaveDO::getLeaveStatus, 0).or().isNull(ElderlyAskLeaveDO::getLeaveStatus)));
         if(CollectionUtil.isNotEmpty(elderlyAskLeaveDOS)){
             throw exception(APPLY_RETREAT_ASK_LEAVE_EXISTS);
         }

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

@@ -59,10 +59,72 @@ public class OrderApiImpl implements OrderApi {
     private final ConcurrentHashMap<String, CacheEntry> receivableCache = new ConcurrentHashMap<>();
     private static final long RECEIVABLE_CACHE_TTL_MS = 1 * 60 * 1000L; // 1 分钟
 
+    private static final Set<String> REPORT_EXTRA_NURSING_ITEMS = buildNormalizedSet(Arrays.asList(
+            "陪护费", "换尿管", "换胃管", "一次性护理费", "开塞露通便", "血糖测量", "压疮护理", "吸氧", "鼻饲喂养", "全辅助进食"
+    ));
+
+    private static final Set<String> REPORT_EXTRA_SERVICE_ITEMS = buildNormalizedSet(Arrays.asList(
+            "代开药", "陪同就医", "收视费", "紧急送医服务", "生活用品", "外出"
+    ));
+
+    private static final Set<String> REPORT_OTHER_INCOME_ITEMS = buildNormalizedSet(Arrays.asList(
+            "一次性安置品", "差额补收", "物品损坏赔偿费", "临终关怀", "一口价费用", "大门损坏赔偿"
+    ));
+
     private String buildReceivableCacheKey(Integer orgType, Long tenantId, String normalizedMonth) {
         return orgType + "|" + tenantId + "|" + normalizedMonth;
     }
 
+    private static Set<String> buildNormalizedSet(List<String> items) {
+        if (items == null || items.isEmpty()) {
+            return Collections.emptySet();
+        }
+        LinkedHashSet<String> set = new LinkedHashSet<>();
+        for (String s : items) {
+            String k = normalizeProjectKey(s);
+            if (k != null && !k.isEmpty()) {
+                set.add(k);
+            }
+        }
+        return Collections.unmodifiableSet(set);
+    }
+
+    private static String normalizeProjectKey(String s) {
+        if (s == null) {
+            return null;
+        }
+        String trimmed = s.trim();
+        if (trimmed.isEmpty()) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder(trimmed.length());
+        for (int i = 0; i < trimmed.length(); i++) {
+            char c = trimmed.charAt(i);
+            if (Character.isWhitespace(c) || c == ' ') {
+                continue;
+            }
+            sb.append(c);
+        }
+        return sb.toString();
+    }
+
+    private static void mergeAmount(Map<String, BigDecimal> map, String key, BigDecimal amount) {
+        if (map == null) {
+            return;
+        }
+        if (amount == null || amount.compareTo(BigDecimal.ZERO) == 0) {
+            return;
+        }
+        if (key == null) {
+            return;
+        }
+        String k = key.trim();
+        if (k.isEmpty()) {
+            return;
+        }
+        map.merge(k, amount, BigDecimal::add);
+    }
+
     private String normalizeMonth(String queryFlag, String billingMonth) {
         if (StringUtil.isEmptyORNull(billingMonth)) return null;
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern(FORMAT_YEAR_MONTH_DAY);
@@ -236,7 +298,15 @@ public class OrderApiImpl implements OrderApi {
         dto.setNurseActualAmount(BigDecimal.ZERO);
         dto.setServiceActualAmount(BigDecimal.ZERO);
         dto.setExtraServiceAmount(BigDecimal.ZERO);
+        dto.setOrderFoodAmount(BigDecimal.ZERO);
+        dto.setOrderShopAmount(BigDecimal.ZERO);
+        dto.setOrderNursingAmount(BigDecimal.ZERO);
+        dto.setOrderServiceAmount(BigDecimal.ZERO);
         dto.setOrderWaterElectricityAmount(BigDecimal.ZERO);
+        dto.setOrderOtherIncomeAmount(BigDecimal.ZERO);
+        dto.setOrderNursingItemStats(new LinkedHashMap<>());
+        dto.setOrderServiceItemStats(new LinkedHashMap<>());
+        dto.setOrderOtherIncomeItemStats(new LinkedHashMap<>());
         dto.setTotalAmount(BigDecimal.ZERO);
         dto.setTotalActualAmount(BigDecimal.ZERO);
         dto.setAdjustAmount(BigDecimal.ZERO);
@@ -423,22 +493,23 @@ public class OrderApiImpl implements OrderApi {
     /** 处理非外出/变更的日常费用(增值、点餐、护理、服务等) */
     private void handleOtherDailyExpenses(OrderItemRespDTO dto, DailyExpensesDO dailyExpensesDO) {
         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));
+        BigDecimal extraAmount = dailyExpensesDO.getAmount() == null ? BigDecimal.ZERO : dailyExpensesDO.getAmount();
+        String normalizedName = normalizeProjectKey(itemName);
+        if (normalizedName != null && !normalizedName.isEmpty()) {
+            if ("点餐".equals(normalizedName)) {
+                dto.setOrderFoodAmount(nz(dto.getOrderFoodAmount()).add(extraAmount));
             }
-            if (itemName.contains("身体护理")) {
-                BigDecimal currentAmount = dto.getOrderServiceAmount() == null ? BigDecimal.ZERO : dto.getOrderServiceAmount();
-                dto.setOrderServiceAmount(currentAmount.add(roundAmount));
+            if (REPORT_EXTRA_NURSING_ITEMS.contains(normalizedName)) {
+                dto.setOrderNursingAmount(nz(dto.getOrderNursingAmount()).add(extraAmount));
+                mergeAmount(dto.getOrderNursingItemStats(), itemName, extraAmount);
+            } else if (REPORT_EXTRA_SERVICE_ITEMS.contains(normalizedName)) {
+                dto.setOrderServiceAmount(nz(dto.getOrderServiceAmount()).add(extraAmount));
+                mergeAmount(dto.getOrderServiceItemStats(), itemName, extraAmount);
+            } else if (REPORT_OTHER_INCOME_ITEMS.contains(normalizedName)) {
+                dto.setOrderOtherIncomeAmount(nz(dto.getOrderOtherIncomeAmount()).add(extraAmount));
+                mergeAmount(dto.getOrderOtherIncomeItemStats(), itemName, extraAmount);
             }
         }
-        BigDecimal extraAmount = dailyExpensesDO.getAmount() == null ? BigDecimal.ZERO : dailyExpensesDO.getAmount();
         if (isWaterElectricityItem(itemName)) {
             BigDecimal currentAmount = dto.getOrderWaterElectricityAmount() == null ? BigDecimal.ZERO : dto.getOrderWaterElectricityAmount();
             dto.setOrderWaterElectricityAmount(currentAmount.add(extraAmount));
@@ -446,7 +517,12 @@ public class OrderApiImpl implements OrderApi {
             dto.setExtraServiceAmount(dto.getExtraServiceAmount().add(extraAmount));
         }
         dto.setAdjustAmount(dto.getAdjustAmount().add(extraAmount));
-        dto.setRemark((dto.getRemark() == null ? "" : dto.getRemark()) + (dailyExpensesDO.getRemarks() == null ? "" :  dailyExpensesDO.getRemarks()) + itemName + ":" + dailyExpensesDO.getAmount().setScale(2,RoundingMode.HALF_UP) + ";");
+        dto.setRemark((dto.getRemark() == null ? "" : dto.getRemark())
+                + (dailyExpensesDO.getRemarks() == null ? "" : dailyExpensesDO.getRemarks())
+                + (itemName == null ? "" : itemName)
+                + ":"
+                + extraAmount.setScale(2, RoundingMode.HALF_UP)
+                + ";");
     }
 
     /** 判断是否为水电费相关项目 */
@@ -1040,6 +1116,7 @@ public class OrderApiImpl implements OrderApi {
                             .eq(ElderlyAskLeaveDO::getElderId, elderId)
                             .eq(ElderlyAskLeaveDO::getOutboundRefundConfigId, outboundConfig.getId())
                             .eq(ElderlyAskLeaveDO::getStatus, 0) // 0表示正常状态
+                            .and(w -> w.ne(ElderlyAskLeaveDO::getLeaveStatus, 0).or().isNull(ElderlyAskLeaveDO::getLeaveStatus))
                             .le(ElderlyAskLeaveDO::getOutDate, monthEndDate) // 外出时间不能晚于月末
                             .and(wrapper -> wrapper
                                     // 返回时间>=月初 或 返回时间为空(还在外出中)
@@ -1096,6 +1173,7 @@ public class OrderApiImpl implements OrderApi {
                         .eq(ElderlyAskLeaveDO::getElderId, elderId)
                         .eq(ElderlyAskLeaveDO::getOutboundRefundConfigId, outboundConfig.getId())
                         .eq(ElderlyAskLeaveDO::getStatus, 0)
+                        .and(w -> w.ne(ElderlyAskLeaveDO::getLeaveStatus, 0).or().isNull(ElderlyAskLeaveDO::getLeaveStatus))
                         // 有时间交集:外出开始<=月底,返回时间>=月初或为空
                         .le(ElderlyAskLeaveDO::getOutDate, monthEndDate)
                         .and(w -> w.ge(ElderlyAskLeaveDO::getUpdateDate, monthStartDate).or().isNull(ElderlyAskLeaveDO::getUpdateDate))
@@ -1490,6 +1568,15 @@ public class OrderApiImpl implements OrderApi {
         vo.setNurseActualAmount(BigDecimal.ZERO);
         vo.setServiceActualAmount(BigDecimal.ZERO);
         vo.setTotalActualAmount(BigDecimal.ZERO);
+        vo.setOrderFoodAmount(BigDecimal.ZERO);
+        vo.setOrderShopAmount(BigDecimal.ZERO);
+        vo.setOrderNursingAmount(BigDecimal.ZERO);
+        vo.setOrderServiceAmount(BigDecimal.ZERO);
+        vo.setOrderWaterElectricityAmount(BigDecimal.ZERO);
+        vo.setOrderOtherIncomeAmount(BigDecimal.ZERO);
+        vo.setOrderNursingItemStats(new LinkedHashMap<>());
+        vo.setOrderServiceItemStats(new LinkedHashMap<>());
+        vo.setOrderOtherIncomeItemStats(new LinkedHashMap<>());
         vo.setExtraServiceAmount(BigDecimal.ZERO);
         vo.setActualProportion("0%");
 
@@ -1531,6 +1618,15 @@ public class OrderApiImpl implements OrderApi {
             return;
         }
         vo.setAdjustAmount(BigDecimal.ZERO);
+        vo.setOrderFoodAmount(BigDecimal.ZERO);
+        vo.setOrderShopAmount(BigDecimal.ZERO);
+        vo.setOrderNursingAmount(BigDecimal.ZERO);
+        vo.setOrderServiceAmount(BigDecimal.ZERO);
+        vo.setOrderWaterElectricityAmount(BigDecimal.ZERO);
+        vo.setOrderOtherIncomeAmount(BigDecimal.ZERO);
+        vo.setOrderNursingItemStats(Collections.emptyMap());
+        vo.setOrderServiceItemStats(Collections.emptyMap());
+        vo.setOrderOtherIncomeItemStats(Collections.emptyMap());
         vo.setExtraServiceAmount(BigDecimal.ZERO);
         BigDecimal total = nz(vo.getBedAmount()).add(nz(vo.getMealAmount())).add(nz(vo.getNurseAmount())).add(nz(vo.getServiceAmount()));
         vo.setTotalAmount(total);
@@ -1594,6 +1690,7 @@ public class OrderApiImpl implements OrderApi {
                         .in(ElderlyAskLeaveDO::getElderId, elderIds)
                         .eq(ElderlyAskLeaveDO::getOutboundRefundConfigId, outboundConfig.getId())
                         .eq(ElderlyAskLeaveDO::getStatus, 0)
+                        .and(w -> w.ne(ElderlyAskLeaveDO::getLeaveStatus, 0).or().isNull(ElderlyAskLeaveDO::getLeaveStatus))
                         .le(ElderlyAskLeaveDO::getOutDate, monthEndDate)
                         .and(w -> w.ge(ElderlyAskLeaveDO::getUpdateDate, monthStartDate).or().isNull(ElderlyAskLeaveDO::getUpdateDate))
                         .orderByAsc(ElderlyAskLeaveDO::getElderId, ElderlyAskLeaveDO::getOutDate)

+ 17 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/ElderlyAskLeaveController.java

@@ -16,6 +16,7 @@ import io.swagger.v3.oas.annotations.Parameter;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.annotation.security.PermitAll;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
@@ -23,7 +24,9 @@ import org.springframework.validation.annotation.Validated;
 import io.swagger.v3.oas.annotations.tags.Tag;
 
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -48,6 +51,19 @@ public class ElderlyAskLeaveController {
         return success(true);
     }
 
+    @PostMapping("/createBpm")
+    @Operation(summary = "创建老人外出请假并发起审批流程")
+    @TenantIgnore
+    @PermitAll
+    public CommonResult<Map<String, Long>> createAskLeaveBpm(@Valid @RequestBody ElderlyAskLeaveDO createReqVO) {
+        createReqVO.setTenantId(createReqVO.getTenantId() == null ? TenantContextHolder.getTenantId() : createReqVO.getTenantId());
+        Long businessFormId = elderlyAskLeaveService.createAskLeaveBpm(createReqVO);
+        Map<String, Long> resp = new HashMap<>();
+        resp.put("askLeaveId", createReqVO.getId());
+        resp.put("businessFormId", businessFormId);
+        return success(resp);
+    }
+
 
     @PostMapping("/edit")
     @Operation(summary = "编辑老人请假管理")
@@ -145,4 +161,4 @@ public class ElderlyAskLeaveController {
 //                        BeanUtils.toBean(list, AskLeaveRespVO.class));
 //    }
 
-}
+}

+ 12 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/CheckInRecordDetailRespVO.java

@@ -123,4 +123,16 @@ public class CheckInRecordDetailRespVO {
 
     private Long tenantId;
 
+    @Schema(description = "证件类型")
+    private Integer papersType;
+
+    @Schema(description = "户籍地址")
+    private String registeredResidenceAddress;
+
+    @Schema(description = "身份证地址")
+    private String papersAddress;
+
+    @Schema(description = "出生日期")
+    private Date birthday;
+
 }

+ 2 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyAskLeaveService.java

@@ -1,7 +1,6 @@
 package cn.iocoder.yudao.module.system.service.biz;
 
 
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.AskLeavePageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyAskLeaveExportExcelVO;
@@ -17,9 +16,10 @@ import java.util.List;
  */
 public interface ElderlyAskLeaveService {
 
-
     void createAskLeave(ElderlyAskLeaveDO createReqVO);
 
+    Long createAskLeaveBpm(ElderlyAskLeaveDO createReqVO);
+
     void editAskLeave(ElderlyAskLeaveDO elderlyAskLeaveDO);
 
     void delete(Long id);

+ 26 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyAskLeaveServiceImpl.java

@@ -6,12 +6,15 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
+import cn.iocoder.yudao.module.bpm.api.business.BpmBusinessFormApi;
+import cn.iocoder.yudao.module.bpm.api.business.dto.BpmBusinessFormCreateReqDTO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.AskLeavePageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyAskLeaveExportExcelVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.*;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.*;
 import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper;
 import cn.iocoder.yudao.module.system.enums.change.BusinessConstants;
+import cn.iocoder.yudao.module.system.enums.change.BusinessTypeEnum;
 import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants;
 import cn.iocoder.yudao.module.system.enums.common.BooleanEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -92,6 +95,9 @@ public class ElderlyAskLeaveServiceImpl implements ElderlyAskLeaveService {
     @Autowired
     private DailyExpensesService dailyExpensesService;
 
+    @Resource
+    private BpmBusinessFormApi bpmBusinessFormApi;
+
 
     @Override
     @LogRecord(type = ELDERLY_ASK_LEAVE_TYPE, subType = ELDERLY_ASK_LEAVE_CREATE_SUB_TYPE, bizNo = "{{#createReqVO.id}}",
@@ -101,6 +107,26 @@ public class ElderlyAskLeaveServiceImpl implements ElderlyAskLeaveService {
         elderlyAskLeaveMapper.insert(createReqVO);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createAskLeaveBpm(ElderlyAskLeaveDO createReqVO) {
+        createReqVO.setCreateDate(new Date());
+        if (createReqVO.getCreateBy() == null) {
+            createReqVO.setCreateBy(SecurityFrameworkUtils.getLoginUserNickname());
+        }
+        if (createReqVO.getLeaveStatus() == null) {
+            createReqVO.setLeaveStatus(0);
+        }
+        elderlyAskLeaveMapper.insert(createReqVO);
+
+        BpmBusinessFormCreateReqDTO bpmReqDTO = new BpmBusinessFormCreateReqDTO();
+        bpmReqDTO.setBusinessId(createReqVO.getId());
+        bpmReqDTO.setBusinessId2(createReqVO.getElderId());
+        bpmReqDTO.setTenantId(createReqVO.getTenantId());
+        bpmReqDTO.setType(BusinessTypeEnum.OUTBOUND_REGISTRATION.getValue());
+        return bpmBusinessFormApi.createBusinessForm(bpmReqDTO);
+    }
+
     @Override
     @Transactional
     public void editAskLeave(ElderlyAskLeaveDO elderlyAskLeaveDO) {

+ 7 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyInfoServiceImpl.java

@@ -951,6 +951,10 @@ public class ElderlyInfoServiceImpl implements ElderlyInfoService {
         detailRespVO.setNurseLevelName(nurseLevelDO == null ? elderlyInfo.getNurseLevelName() : nurseLevelDO.getNurseLevelName());
         detailRespVO.setCheckInTime(toLocalDate(elderlyContract.getBeginTime()));
         detailRespVO.setCheckInDeadlineTime(toLocalDate(elderlyContract.getExpireTime()));
+        detailRespVO.setBirthday(elderlyInfo.getBirthday());
+        detailRespVO.setPapersAddress(elderlyInfo.getPapersAddress());
+        detailRespVO.setRegisteredResidenceAddress(elderlyInfo.getRegisteredResidenceAddress());
+        detailRespVO.setPapersType(elderlyInfo.getPapersType());
 
         CheckInContractReqVO contractReqVO = new CheckInContractReqVO();
         BeanUtils.copyProperties(elderlyContract, contractReqVO);
@@ -1734,11 +1738,13 @@ public class ElderlyInfoServiceImpl implements ElderlyInfoService {
 
         long askLeaveCount = Optional.ofNullable(elderlyAskLeaveMapper.selectCount(new LambdaQueryWrapperX<ElderlyAskLeaveDO>()
                 .in(ElderlyAskLeaveDO::getTenantId, tenantIdList)
+                .and(w -> w.ne(ElderlyAskLeaveDO::getLeaveStatus, 0).or().isNull(ElderlyAskLeaveDO::getLeaveStatus))
                 .le(ElderlyAskLeaveDO::getOutDate, todayEndDate)
                 .and(w -> w.gt(ElderlyAskLeaveDO::getUpdateDate, LocalDateTime.now()).or().isNull(ElderlyAskLeaveDO::getUpdateDate)))).orElse(0L);
 
         long todayAskLeaveCount = Optional.ofNullable(elderlyAskLeaveMapper.selectCount(new LambdaQueryWrapperX<ElderlyAskLeaveDO>()
                 .in(ElderlyAskLeaveDO::getTenantId, tenantIdList)
+                .and(w -> w.ne(ElderlyAskLeaveDO::getLeaveStatus, 0).or().isNull(ElderlyAskLeaveDO::getLeaveStatus))
                 .between(ElderlyAskLeaveDO::getOutDate, todayStartDate, todayEndDate))).orElse(0L);
 
         long checkOutCount = Optional.ofNullable(elderlyRetreatRecordMapper.selectCount(new LambdaQueryWrapperX<ElderlyRetreatRecordDO>()
@@ -1851,6 +1857,7 @@ public class ElderlyInfoServiceImpl implements ElderlyInfoService {
         Date todayEndDate = Date.from(today.atTime(23, 59, 59).atZone(ZoneId.systemDefault()).toInstant());
         Long outOfOfficeCount = elderlyAskLeaveMapper.selectCount(new LambdaQueryWrapperX<ElderlyAskLeaveDO>()
                 .eq(ElderlyAskLeaveDO::getTenantId, tenantId)
+                .and(w -> w.ne(ElderlyAskLeaveDO::getLeaveStatus, 0).or().isNull(ElderlyAskLeaveDO::getLeaveStatus))
                 .le(ElderlyAskLeaveDO::getOutDate, todayEndDate)
                 .and(w -> w.ge(ElderlyAskLeaveDO::getComeDate, todayStartDate).or().isNull(ElderlyAskLeaveDO::getComeDate)));
         updates.add(TodayUpdate.builder().content("当天外出人数: " + outOfOfficeCount).build());

+ 1 - 0
yudao-server/src/main/resources/application.yaml

@@ -248,6 +248,7 @@ yudao:
       - /admin-api/elderly-items-round/batch-create
       - /admin-api/elderly-safe-check/create
       - /admin-api/food-satisfaction-survey/create
+      - /admin-api/elderly/askLeave/createBpm
 #      - /admin-api/bpm/check-in-wait/create
     ignore-tables:
       - system_tenant