Переглянути джерело

1、添加计算方式
2、添加护理人员上传死亡信息
3、修改特困人员状态:中转、擅自离院

qinyan 2 місяців тому
батько
коміт
77e1a3ac2b
29 змінених файлів з 1045 додано та 132 видалено
  1. 3 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/care/CareApplicationsController.java
  2. 13 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/care/CareNurseClocksController.java
  3. 83 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeUserController.java
  4. 6 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysWorkConfigController.java
  5. 63 11
      ruoyi-system/src/main/java/com/ruoyi/care/domain/CareApplications.java
  6. 32 1
      ruoyi-system/src/main/java/com/ruoyi/care/domain/CareNurseRecords.java
  7. 32 0
      ruoyi-system/src/main/java/com/ruoyi/care/domain/CarePersonDie.java
  8. 29 0
      ruoyi-system/src/main/java/com/ruoyi/care/domain/CarePersons.java
  9. 2 0
      ruoyi-system/src/main/java/com/ruoyi/care/mapper/CareNurseClocksMapper.java
  10. 2 0
      ruoyi-system/src/main/java/com/ruoyi/care/service/ICareApplicationsService.java
  11. 3 0
      ruoyi-system/src/main/java/com/ruoyi/care/service/ICareNurseClocksService.java
  12. 2 0
      ruoyi-system/src/main/java/com/ruoyi/care/service/impl/CareApplicationsServiceImpl.java
  13. 179 11
      ruoyi-system/src/main/java/com/ruoyi/care/service/impl/CareNurseClocksServiceImpl.java
  14. 2 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysWorkConfigMapper.java
  15. 2 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/ISysWorkConfigService.java
  16. 5 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysWorkConfigServiceImpl.java
  17. 14 6
      ruoyi-system/src/main/resources/mapper/care/CareApplicationsMapper.xml
  18. 10 0
      ruoyi-system/src/main/resources/mapper/care/CareNurseClocksMapper.xml
  19. 9 1
      ruoyi-system/src/main/resources/mapper/care/CareNurseRecordsMapper.xml
  20. 3 0
      ruoyi-system/src/main/resources/mapper/care/CarePersonsMapper.xml
  21. 4 0
      ruoyi-system/src/main/resources/mapper/system/SysWorkConfigMapper.xml
  22. 8 0
      ruoyi-vue/src/api/care/clocks.js
  23. 9 0
      ruoyi-vue/src/api/care/persons.js
  24. 155 68
      ruoyi-vue/src/views/care/applications/index.vue
  25. 39 5
      ruoyi-vue/src/views/care/applications/index_assign_nurse.vue
  26. 61 11
      ruoyi-vue/src/views/care/applications/index_wait_check.vue
  27. 42 7
      ruoyi-vue/src/views/care/clocks/index.vue
  28. 158 9
      ruoyi-vue/src/views/care/clocks/index_task.vue
  29. 75 2
      ruoyi-vue/src/views/care/persons/index.vue

+ 3 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/care/CareApplicationsController.java

@@ -4,6 +4,7 @@ import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
 import com.ruoyi.care.domain.CareApplications;
+import com.ruoyi.care.domain.CarePersonDie;
 import com.ruoyi.care.service.ICareApplicationsService;
 import com.ruoyi.common.annotation.DataScope;
 import com.ruoyi.common.utils.StringUtils;
@@ -189,4 +190,6 @@ public class CareApplicationsController extends BaseController
         Long userId=getUserId();
         return toAjax(careApplicationsService.complete(careApplications,userId));
     }
+
+
 }

+ 13 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/care/CareNurseClocksController.java

@@ -5,6 +5,7 @@ import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
 import com.ruoyi.care.domain.CareApplications;
+import com.ruoyi.care.domain.CarePersonDie;
 import com.ruoyi.care.service.ICareApplicationsService;
 import com.ruoyi.common.config.RuoYiConfig;
 import com.ruoyi.common.constant.Constants;
@@ -110,6 +111,18 @@ public class CareNurseClocksController extends BaseController
         return toAjax(careNurseClocksService.deleteCareNurseClocksByClockIds(clockIds));
     }
 
+    /**
+     * 人员死亡
+     */
+    @PreAuthorize("@ss.hasPermi('care:clocks:die')")
+    @Log(title = "护理申请", businessType = BusinessType.INSERT)
+    @PostMapping(value = "/die")
+    public AjaxResult die(@RequestBody CarePersonDie carePersonDie)
+    {
+        Long userId=getUserId();
+        return toAjax(careNurseClocksService.die(carePersonDie,userId));
+    }
+
     /**
      * 上传打卡图片
      * applyId 护理ip

+ 83 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeUserController.java

@@ -0,0 +1,83 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.SysNotice;
+import com.ruoyi.system.domain.SysNoticeUser;
+import com.ruoyi.system.service.ISysNoticeUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 公告 信息操作处理
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/noticeUser")
+public class SysNoticeUserController extends BaseController
+{
+    @Autowired
+    private ISysNoticeUserService noticeUserService;
+
+    /**
+     * 获取通知公告列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(SysNoticeUser notice)
+    {
+        startPage();
+        List<SysNoticeUser> list = noticeUserService.selectNoticeList(notice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 根据通知公告编号获取详细信息
+     */
+    @GetMapping(value = "/{noticeId}")
+    public AjaxResult getInfo(@PathVariable Long noticeId)
+    {
+        return success(noticeUserService.selectNoticeUserById(noticeId));
+    }
+
+    /**
+     * 新增通知公告
+     */
+    @Log(title = "通知公告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysNoticeUser notice)
+    {
+        notice.setCreateBy(getUsername());
+        return toAjax(noticeUserService.insertNoticeUser(notice));
+    }
+
+    /**
+     * 修改通知公告
+     */
+    @Log(title = "通知公告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody SysNoticeUser notice)
+    {
+        notice.setUpdateBy(getUsername());
+        return toAjax(noticeUserService.updateNoticeUser(notice));
+    }
+
+    /**
+     * 删除通知公告
+     */
+    @Log(title = "通知公告", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{noticeIds}")
+    public AjaxResult remove(@PathVariable Long[] noticeIds)
+    {
+        return toAjax(noticeUserService.deleteNoticeUserByIds(noticeIds));
+    }
+
+
+}

+ 6 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysWorkConfigController.java

@@ -101,4 +101,10 @@ public class SysWorkConfigController extends BaseController
     {
         return toAjax(sysWorkConfigService.deleteSysWorkConfigByIds(ids));
     }
+
+    @GetMapping(value = "/type/{type}")
+    public AjaxResult getInfo(@PathVariable("type") String type)
+    {
+        return success(sysWorkConfigService.selectSysWorkConfigByType(type));
+    }
 }

+ 63 - 11
ruoyi-system/src/main/java/com/ruoyi/care/domain/CareApplications.java

@@ -49,6 +49,10 @@ public class CareApplications extends BaseEntity
     /** 申请日期 */
     @Excel(name = "申请日期")
     private String applyDate;
+    @Excel(name = "出院日期")
+    private String leaveTime;
+    //实际护理天数
+    private String finallyDays;
 
     /** 申请状态(待审核、同意、不同意、待指派、已指派) */
     @Excel(name = "申请状态(待审核、同意、不同意、待指派、已指派)")
@@ -58,15 +62,6 @@ public class CareApplications extends BaseEntity
     @Excel(name = "处理状态(未开始、正在进行、已完成 )")
     private String dealStatus;
     private String NotDealStatus;
-
-    public String getNotDealStatus() {
-        return NotDealStatus;
-    }
-
-    public void setNotDealStatus(String notDealStatus) {
-        NotDealStatus = notDealStatus;
-    }
-
     /** 支付状态(未结算 0、已结算 1) */
     @Excel(name = "支付状态(未结算 0、已结算 1)")
     private String payStatus;
@@ -81,6 +76,40 @@ public class CareApplications extends BaseEntity
     private Long nurseId;
     private String assignRemark;
     private String assignNurseRemark;
+    /** 护理人姓名 */
+    private String nurseName;
+
+    //是否残疾
+    private String disability;
+
+    private String dieTime;
+    private String dieImg;
+
+    public String getDieTime() {
+        return dieTime;
+    }
+
+    public void setDieTime(String dieTime) {
+        this.dieTime = dieTime;
+    }
+
+    public String getDieImg() {
+        return dieImg;
+    }
+
+    public void setDieImg(String dieImg) {
+        this.dieImg = dieImg;
+    }
+
+    public String getNotDealStatus() {
+        return NotDealStatus;
+    }
+
+    public void setNotDealStatus(String notDealStatus) {
+        NotDealStatus = notDealStatus;
+    }
+
+
 
     public String getAssignNurseRemark() {
         return assignNurseRemark;
@@ -90,8 +119,31 @@ public class CareApplications extends BaseEntity
         this.assignNurseRemark = assignNurseRemark;
     }
 
-    /** 护理人姓名 */
-    private String nurseName;
+
+
+    public String getDisability() {
+        return disability;
+    }
+
+    public void setDisability(String disability) {
+        this.disability = disability;
+    }
+
+    public String getLeaveTime() {
+        return leaveTime;
+    }
+
+    public void setLeaveTime(String leaveTime) {
+        this.leaveTime = leaveTime;
+    }
+
+    public String getFinallyDays() {
+        return finallyDays;
+    }
+
+    public void setFinallyDays(String finallyDays) {
+        this.finallyDays = finallyDays;
+    }
 
     public Long getAssignId() {
         return assignId;

+ 32 - 1
ruoyi-system/src/main/java/com/ruoyi/care/domain/CareNurseRecords.java

@@ -5,6 +5,8 @@ import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
 
+import java.math.BigDecimal;
+
 /**
  * 护理任务记录对象 care_nurse_records
  * 
@@ -26,10 +28,39 @@ public class CareNurseRecords extends BaseEntity
     @Excel(name = "护理日期")
     private String nursingTime;
 
+    //实际计算天数
+    private BigDecimal calDays;
+    private String calDayReason;
     /** 删除标志(0代表存在 2代表删除) */
     private String delFlag;
 
-    public void setNursingRecordId(Long nursingRecordId) 
+    private Integer clockNum;
+
+    public String getCalDayReason() {
+        return calDayReason;
+    }
+
+    public void setCalDayReason(String calDayReason) {
+        this.calDayReason = calDayReason;
+    }
+
+    public Integer getClockNum() {
+        return clockNum;
+    }
+
+    public void setClockNum(Integer clockNum) {
+        this.clockNum = clockNum;
+    }
+
+    public BigDecimal getCalDays() {
+        return calDays;
+    }
+
+    public void setCalDays(BigDecimal calDays) {
+        this.calDays = calDays;
+    }
+
+    public void setNursingRecordId(Long nursingRecordId)
     {
         this.nursingRecordId = nursingRecordId;
     }

+ 32 - 0
ruoyi-system/src/main/java/com/ruoyi/care/domain/CarePersonDie.java

@@ -0,0 +1,32 @@
+package com.ruoyi.care.domain;
+
+public class CarePersonDie {
+    /** 护理申请表的唯一标识符 */
+    private Long applyId;
+    private String dieTime;
+    private String imgPaths;
+
+    public Long getApplyId() {
+        return applyId;
+    }
+
+    public void setApplyId(Long applyId) {
+        this.applyId = applyId;
+    }
+
+    public String getDieTime() {
+        return dieTime;
+    }
+
+    public void setDieTime(String dieTime) {
+        this.dieTime = dieTime;
+    }
+
+    public String getImgPaths() {
+        return imgPaths;
+    }
+
+    public void setImgPaths(String imgPaths) {
+        this.imgPaths = imgPaths;
+    }
+}

+ 29 - 0
ruoyi-system/src/main/java/com/ruoyi/care/domain/CarePersons.java

@@ -70,9 +70,38 @@ public class CarePersons extends BaseEntity
     @Excel(name = "关联用户表id")
     private Long userId;
 
+    private String isDie;
+    private String dieTime;
+
+    private  String status;
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
     /** 删除标志(0代表存在 2代表删除) */
     private String delFlag;
 
+    public String getIsDie() {
+        return isDie;
+    }
+
+    public void setIsDie(String isDie) {
+        this.isDie = isDie;
+    }
+
+    public String getDieTime() {
+        return dieTime;
+    }
+
+    public void setDieTime(String dieTime) {
+        this.dieTime = dieTime;
+    }
+
     public Long getAge() {
         return age;
     }

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/care/mapper/CareNurseClocksMapper.java

@@ -58,4 +58,6 @@ public interface CareNurseClocksMapper
      * @return 结果
      */
     public int deleteCareNurseClocksByClockIds(Long[] clockIds);
+
+    CareNurseClocks selectLastClock(Long applyId);
 }

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/care/service/ICareApplicationsService.java

@@ -2,6 +2,7 @@ package com.ruoyi.care.service;
 
 import java.util.List;
 import com.ruoyi.care.domain.CareApplications;
+import com.ruoyi.care.domain.CarePersonDie;
 
 /**
  * 护理申请Service接口
@@ -69,4 +70,5 @@ public interface ICareApplicationsService
     int check(CareApplications careApplications, Long userId);
 
     int complete(CareApplications careApplications, Long userId);
+
 }

+ 3 - 0
ruoyi-system/src/main/java/com/ruoyi/care/service/ICareNurseClocksService.java

@@ -2,6 +2,7 @@ package com.ruoyi.care.service;
 
 import java.util.List;
 import com.ruoyi.care.domain.CareNurseClocks;
+import com.ruoyi.care.domain.CarePersonDie;
 
 /**
  * 护理任务打卡Service接口
@@ -58,4 +59,6 @@ public interface ICareNurseClocksService
      * @return 结果
      */
     public int deleteCareNurseClocksByClockId(Long clockId);
+
+    int die(CarePersonDie carePersonDie, Long userId);
 }

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/care/service/impl/CareApplicationsServiceImpl.java

@@ -3,6 +3,7 @@ package com.ruoyi.care.service.impl;
 import java.util.List;
 
 import com.ruoyi.care.domain.CareAssignments;
+import com.ruoyi.care.domain.CarePersonDie;
 import com.ruoyi.care.domain.CareRecords;
 import com.ruoyi.care.mapper.CareAssignmentsMapper;
 import com.ruoyi.care.mapper.CareRecordsMapper;
@@ -264,4 +265,5 @@ public class CareApplicationsServiceImpl implements ICareApplicationsService
 
         return careApplicationsMapper.updateCareApplications(careApplications);
     }
+
 }

+ 179 - 11
ruoyi-system/src/main/java/com/ruoyi/care/service/impl/CareNurseClocksServiceImpl.java

@@ -2,28 +2,28 @@ package com.ruoyi.care.service.impl;
 
 import java.io.File;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
-import com.ruoyi.care.domain.CareApplications;
-import com.ruoyi.care.domain.CareNurseRecords;
-import com.ruoyi.care.domain.CareRecords;
-import com.ruoyi.care.mapper.CareApplicationsMapper;
-import com.ruoyi.care.mapper.CareNurseRecordsMapper;
-import com.ruoyi.care.mapper.CareRecordsMapper;
+import com.ruoyi.care.domain.*;
+import com.ruoyi.care.mapper.*;
 import com.ruoyi.common.config.RuoYiConfig;
 import com.ruoyi.common.enums.CareApplyStatus;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.system.mapper.SysWorkConfigMapper;
 import org.apache.commons.lang3.time.FastDateFormat;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.ruoyi.care.mapper.CareNurseClocksMapper;
-import com.ruoyi.care.domain.CareNurseClocks;
 import com.ruoyi.care.service.ICareNurseClocksService;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -44,6 +44,11 @@ public class CareNurseClocksServiceImpl implements ICareNurseClocksService
     private CareNurseRecordsMapper careNurseRecordsMapper;
     @Autowired
     private CareRecordsMapper careRecordsMapper;
+    @Autowired
+    private SysWorkConfigMapper sysWorkConfigMapper;
+    @Autowired
+    private CarePersonsMapper carePersonsMapper;
+
     /**
      * 查询护理任务打卡
      * 
@@ -78,6 +83,40 @@ public class CareNurseClocksServiceImpl implements ICareNurseClocksService
     @Transactional
     public int insertCareNurseClocks(CareNurseClocks careNurseClocks,Long userId)
     {
+        //判断当前日期是否可以打卡,非残疾人出院前两天不再护理,残疾人截至到出院当天,若无法打卡,则抛出异常
+        CareApplications careApplications = careApplicationsMapper.selectCareApplicationsByApplyId(Long.parseLong(careNurseClocks.getApplyId()));
+        String leaveTimeStr = careApplications.getLeaveTime();
+
+        // 定义日期格式化器
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        // 将字符串转换为LocalDateTime对象
+        LocalDateTime leaveTime = LocalDateTime.parse(leaveTimeStr, formatter);
+        LocalDateTime currentTime = LocalDateTime.now();
+
+        boolean isDisabled = !careApplications.getDisability().equals("N");
+
+        if (isDisabled) {
+            // 残疾人:截至到出院当天
+            if (currentTime.isAfter(leaveTime)) {
+                throw new ServiceException("无法打卡:当前时间已超过出院时间!");
+            }
+        } else {
+            // 非残疾人:出院前两天不再护理
+            LocalDateTime cutoffTime = leaveTime.minus(2, ChronoUnit.DAYS);
+            if (currentTime.isAfter(cutoffTime)) {
+                throw new ServiceException("无法打卡:非残疾人出院前两天不再提供护理服务!");
+            }
+        }
+
+        //若特困人员在中转或者擅自离院,不提供护理
+        CarePersons carePersons=carePersonsMapper.selectCarePersonsByPersonId(careApplications.getPersonId());
+        if(carePersons.getStatus().equals("02")){
+            throw new ServiceException("无法打卡:当前特困人员处于中转状态!");
+        }else if(carePersons.getStatus().equals("03")){
+            throw new ServiceException("无法打卡:当前特困人员处于擅自离院状态!");
+        }
+
         String psths[]=careNurseClocks.getImgPaths().split(",");
         int result=0;
         //获取当前节点记录
@@ -100,19 +139,28 @@ public class CareNurseClocksServiceImpl implements ICareNurseClocksService
         careNurseRecords.setApplyId(Long.parseLong(careNurseClocks.getApplyId()));
         List<CareNurseRecords> lst=careNurseRecordsMapper.selectCareNurseRecordsList(careNurseRecords);
         if(lst.size()>0){
+            CareNurseRecords careNurseRecord=lst.get(0);
             careRecordsMapper.updateCareRecords(curr);
+
+            //计算计时天数
+            careNurseRecord=calDayApplyRecord(careNurseRecord,careNurseClocks.getNursingTime());
+           careNurseRecordsMapper.updateCareNurseRecords(careNurseRecord);
+
            //已经开始了直接新增打卡记录
            result= careNurseClocksMapper.insertCareNurseClocks(careNurseClocks);
         }else{
            //修改申请状态为正在进行,并添加护理记录及打卡记录
-           CareApplications careApplications=careApplicationsMapper.selectCareApplicationsByApplyId(Long.parseLong(careNurseClocks.getApplyId()));
            careApplications.setDealStatus("in_progress");
            careApplicationsMapper.updateCareApplications(careApplications);
 
            careNurseRecords=new CareNurseRecords();
            careNurseRecords.setNursingTime(careNurseClocks.getNursingTime().substring(0,10));
            careNurseRecords.setApplyId(Long.parseLong(careNurseClocks.getApplyId()));
-           careNurseRecordsMapper.insertCareNurseRecords(careNurseRecords);
+           careNurseRecords.setClockNum(1);//当天第一次打卡
+           careNurseRecords.setCalDays(new BigDecimal(0));//当天第一次打卡,计算天数为0
+            careNurseRecords.setCalDayReason("今天第一次打卡,计算天数暂定为0");
+            careNurseRecords.setCreateTime(DateUtils.getNowDate());
+            careNurseRecordsMapper.insertCareNurseRecords(careNurseRecords);
 
            //获取打卡次数
             CareNurseRecords recordCount=new CareNurseRecords();
@@ -138,6 +186,89 @@ public class CareNurseClocksServiceImpl implements ICareNurseClocksService
 
     }
 
+    @Override
+    @Transactional
+    public int die(CarePersonDie carePersonDie, Long userId) {
+        //特困人员死亡后:1、保存死亡时间及死亡证明 2、修改特困人员表状态 3、计算死亡当天护理天数
+        CareApplications careApplications  =careApplicationsMapper.selectCareApplicationsByApplyId(carePersonDie.getApplyId());
+        careApplications.setDieTime(carePersonDie.getDieTime());
+        careApplications.setDieImg(carePersonDie.getImgPaths());
+        careApplicationsMapper.updateCareApplications(careApplications);
+
+        CarePersons persons=carePersonsMapper.selectCarePersonsByPersonId(careApplications.getPersonId());
+        persons.setDieTime(carePersonDie.getDieTime());
+        persons.setIsDie("01");
+        carePersonsMapper.updateCarePersons(persons);
+
+        //获取最后一次打卡记录
+        CareNurseClocks careNurseClock=careNurseClocksMapper.selectLastClock(careApplications.getApplyId());
+        CareNurseRecords careNurseRecord=careNurseRecordsMapper.selectCareNurseRecordsByNursingRecordId(careNurseClock.getNursingRecordId());
+        //计算计时天数
+        careNurseRecord=calDayApplyRecord(careNurseRecord,careNurseClock.getNursingTime());
+        return careNurseRecordsMapper.updateCareNurseRecords(careNurseRecord);
+    }
+
+    private CareNurseRecords calDayApplyRecord(CareNurseRecords careNurseRecords,String nurseTime) {
+        BigDecimal day=new BigDecimal(0);
+        String reason="";
+        //获取第一次打卡时间 判断是上午开始还是下午开始的
+        Date firstTime=careNurseRecords.getCreateTime();
+
+        // 判断是上午还是下午
+        boolean isFirstClockInMorning = isMorning(firstTime);
+
+        //获取当天打卡次数
+        CareNurseClocks param=new CareNurseClocks();
+        param.setApplyId(careNurseRecords.getApplyId().toString());
+        List<CareNurseClocks> lst=careNurseClocksMapper.selectCareNurseClocksList(param);
+        Integer count=lst.size();
+
+        //获取半天次数和全天次数
+        Long allday=sysWorkConfigMapper.selectSysWorkConfigByType("day_clock_num").getNumber();
+        Long halfday=sysWorkConfigMapper.selectSysWorkConfigByType("half_day_num").getNumber();
+
+        //如果第一次是上午打卡,若当前是上午且次数已经达到半天次数,则返回0.5天,若次数未达到,则等待下午打卡;若当前是下午,且次数达到一天,则返回1天
+        //如果第一次是下午打卡,若当前是上午且次数已经达到半天次数,则返回0.5天,若次数未达到,则返回0
+
+        //判断当前是上午还是下午
+        Date currentTime = new Date(nurseTime);
+        if (isFirstClockInMorning) {// 第一次打卡在上午
+            if (isMorning(currentTime)) {
+                if (count >= halfday) {
+                    day= new BigDecimal(0.5); // 上午已达半天次数
+                    reason="当天从上午开始打卡,截至最后一次打卡已达半天次数,故计算天数0.5天";
+                }
+            } else { // 当前是下午
+                if (count >= allday) {
+                    day= new BigDecimal(1); // 已达全天次数
+                    reason="当天从上午开始打卡,截至最后一次打卡已达全天次数,故计算天数1天";
+                } else {
+                    day= new BigDecimal(0.5); // 未达到全天次数,但已过半天
+                    reason="当天从上午开始打卡,截至最后一次打卡未达到全天次数,但已过半天,故计算天数0.5天";
+                }
+            }
+        } else { // 第一次打卡在下午
+            if (!isMorning(currentTime)) {// 当前也是下午
+                if (count >= halfday) {
+                    day= new BigDecimal(0.5); // 达到半天次数
+                    reason="当天从下午开始打卡,截至最后一次打卡达到半天次数,故计算天数0.5天";
+                }else{
+                    reason="当天从下午开始打卡,截至最后一次打卡未达到半天次数,故计算天数0天";
+                }
+            }
+        }
+        careNurseRecords.setCalDays(day);
+        careNurseRecords.setCalDayReason(reason);
+        return careNurseRecords;
+    }
+
+    private boolean isMorning(Date date) {
+        // 根据日期对象判断是否为上午
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        int hour = cal.get(Calendar.HOUR_OF_DAY);
+        return hour < 12;
+    }
     /**
      * 修改护理任务打卡
      * 
@@ -147,6 +278,39 @@ public class CareNurseClocksServiceImpl implements ICareNurseClocksService
     @Override
     public int updateCareNurseClocks(CareNurseClocks careNurseClocks)
     {
+        //判断当前日期是否可以打卡,非残疾人出院前两天不再护理,残疾人截至到出院当天,若无法打卡,则抛出异常
+        CareApplications careApplications = careApplicationsMapper.selectCareApplicationsByApplyId(Long.parseLong(careNurseClocks.getApplyId()));
+        String leaveTimeStr = careApplications.getLeaveTime();
+
+        // 定义日期格式化器
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        // 将字符串转换为LocalDateTime对象
+        LocalDateTime leaveTime = LocalDateTime.parse(leaveTimeStr, formatter);
+        LocalDateTime currentTime = LocalDateTime.parse(careNurseClocks.getNursingTime(), formatter);
+
+        boolean isDisabled = !careApplications.getDisability().equals("N");
+
+        if (isDisabled) {
+            // 残疾人:截至到出院当天
+            if (currentTime.isAfter(leaveTime)) {
+                throw new ServiceException("无法打卡:当前时间已超过出院时间!");
+            }
+        } else {
+            // 非残疾人:出院前两天不再护理
+            LocalDateTime cutoffTime = leaveTime.minus(2, ChronoUnit.DAYS);
+            if (currentTime.isAfter(cutoffTime)) {
+                throw new ServiceException("无法打卡:非残疾人出院前两天不再提供护理服务!");
+            }
+        }
+
+        //若特困人员在中转或者擅自离院,不提供护理
+        CarePersons carePersons=carePersonsMapper.selectCarePersonsByPersonId(careApplications.getPersonId());
+        if(carePersons.getStatus().equals("02")){
+            throw new ServiceException("无法打卡:当前特困人员处于中转状态!");
+        }else if(carePersons.getStatus().equals("03")){
+            throw new ServiceException("无法打卡:当前特困人员处于擅自离院状态!");
+        }
         String psths[]=careNurseClocks.getImgPaths().split(",");
         int result=0;
 
@@ -159,11 +323,15 @@ public class CareNurseClocksServiceImpl implements ICareNurseClocksService
         careNurseRecords.setApplyId(Long.parseLong(careNurseClocks.getApplyId()));
         List<CareNurseRecords> lst=careNurseRecordsMapper.selectCareNurseRecordsList(careNurseRecords);
         if(lst.size()>0){
+            CareNurseRecords careNurseRecord=lst.get(0);
+            //计算计时天数
+            careNurseRecord=calDayApplyRecord(careNurseRecord,careNurseClocks.getNursingTime());
+            careNurseRecordsMapper.updateCareNurseRecords(careNurseRecord);
+
             //已经开始了直接新增打卡记录
             result= careNurseClocksMapper.updateCareNurseClocks(careNurseClocks);
         }else{
             //修改申请状态为正在进行,并添加护理记录及打卡记录
-            CareApplications careApplications=careApplicationsMapper.selectCareApplicationsByApplyId(Long.parseLong(careNurseClocks.getApplyId()));
             careApplications.setDealStatus("in_progress");
             careApplicationsMapper.updateCareApplications(careApplications);
 

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysWorkConfigMapper.java

@@ -58,4 +58,6 @@ public interface SysWorkConfigMapper
      * @return 结果
      */
     public int deleteSysWorkConfigByIds(Long[] ids);
+
+    public SysWorkConfig selectSysWorkConfigByType(String type);
 }

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysWorkConfigService.java

@@ -58,4 +58,6 @@ public interface ISysWorkConfigService
      * @return 结果
      */
     public int deleteSysWorkConfigById(Long id);
+
+    public SysWorkConfig  selectSysWorkConfigByType(String type);
 }

+ 5 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysWorkConfigServiceImpl.java

@@ -93,4 +93,9 @@ public class SysWorkConfigServiceImpl implements ISysWorkConfigService
     {
         return sysWorkConfigMapper.deleteSysWorkConfigById(id);
     }
+
+    @Override
+    public SysWorkConfig selectSysWorkConfigByType(String type) {
+        return sysWorkConfigMapper.selectSysWorkConfigByType(type);
+    }
 }

+ 14 - 6
ruoyi-system/src/main/resources/mapper/care/CareApplicationsMapper.xml

@@ -30,6 +30,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="nurseId"    column="nurse_id"    />
         <result property="nurseName"    column="nurse_name"    />
         <result property="assignRemark"    column="assign_remark"    />
+        <result property="leaveTime"    column="leave_time"    />
+        <result property="disability" column="disability"/>
     </resultMap>
 
     <sql id="selectCareApplicationsVo">
@@ -53,18 +55,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             a.update_by,
             a.update_time,
             a.remark,
+            a.leave_time,
             s.assign_id assign_id,
             s.company_id,
             n.nurse_id,
-            n.name nurse_name,
+            n.NAME nurse_name,
             h.`name` hospital_name,
-            s.remark assign_remark
+            s.remark assign_remark,
+            p.disability
         FROM
             care_applications a
-                LEFT JOIN care_assignments s on a.apply_id=s.apply_id
-                LEFT JOIN care_nurses n on n.nurse_id=s.apply_id
-                LEFT JOIN care_hospital h on h.hospital_id=s.company_id
-                LEFT JOIN sys_user u on u.user_id=a.create_by
+                left join care_persons p on p.person_id=a.person_id
+                LEFT JOIN care_assignments s ON a.apply_id = s.apply_id
+                LEFT JOIN care_nurses n ON n.nurse_id = s.apply_id
+                LEFT JOIN care_hospital h ON h.hospital_id = s.company_id
+                LEFT JOIN sys_user u ON u.user_id = a.create_by
     </sql>
 
     <select id="selectCareApplicationsList" parameterType="CareApplications" resultMap="CareApplicationsResult">
@@ -122,6 +127,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createTime != null">create_time,</if>
             <if test="updateBy != null">update_by,</if>
             <if test="updateTime != null">update_time,</if>
+            <if test="leaveTime!=null">leave_time,</if>
             <if test="remark != null">remark,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -142,6 +148,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createTime != null">#{createTime},</if>
             <if test="updateBy != null">#{updateBy},</if>
             <if test="updateTime != null">#{updateTime},</if>
+            <if test="leaveTime!=null">#{leaveTime},</if>
             <if test="remark != null">#{remark},</if>
          </trim>
     </insert>
@@ -166,6 +173,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="leaveTime!=null">leave_time=#{leaveTime},</if>
             <if test="remark != null">remark = #{remark},</if>
         </trim>
         where apply_id = #{applyId}

+ 10 - 0
ruoyi-system/src/main/resources/mapper/care/CareNurseClocksMapper.xml

@@ -97,4 +97,14 @@
             #{clockId}
         </foreach>
     </delete>
+
+
+    <select id="selectLastClock"  parameterType="Long" resultMap="CareNurseClocksResult">
+        <include refid="selectCareNurseClocksVo"/>
+        <where>
+            <if test="applyId != null  and applyId != ''"> and apply_id = #{applyId}</if>
+        </where>
+        ORDER BY nursing_time
+        limit 0,1
+    </select>
 </mapper>

+ 9 - 1
ruoyi-system/src/main/resources/mapper/care/CareNurseRecordsMapper.xml

@@ -14,10 +14,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateBy"    column="update_by"    />
         <result property="updateTime"    column="update_time"    />
         <result property="remark"    column="remark"    />
+        <result property="calDays" column="cal_days"/>
+        <result property="clockNum" column="clock_Num"/>
     </resultMap>
 
     <sql id="selectCareNurseRecordsVo">
-        select nursing_record_id, apply_id, nursing_time, del_flag, create_by, create_time, update_by, update_time, remark from care_nurse_records
+        select nursing_record_id, apply_id, nursing_time,cal_days, clock_Num,del_flag, create_by, create_time, update_by, update_time, remark from care_nurse_records
     </sql>
 
     <select id="selectCareNurseRecordsList" parameterType="CareNurseRecords" resultMap="CareNurseRecordsResult">
@@ -44,6 +46,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateBy != null">update_by,</if>
             <if test="updateTime != null">update_time,</if>
             <if test="remark != null">remark,</if>
+            <if test="calDays != null">cal_days,</if>
+            <if test="clockNum != null">clock_num,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="applyId != null">#{applyId},</if>
@@ -54,6 +58,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateBy != null">#{updateBy},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="remark != null">#{remark},</if>
+            <if test="calDays != null">#{calDays},</if>
+            <if test="clockNum != null">#{clockNum},</if>
          </trim>
     </insert>
 
@@ -68,6 +74,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateBy != null">update_by = #{updateBy},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="remark != null">remark = #{remark},</if>
+            <if test="calDays != null">cal_days=#{calDays},</if>
+            <if test="clockNum != null">clock_num=#{clockNum},</if>
         </trim>
         where nursing_record_id = #{nursingRecordId}
     </update>

+ 3 - 0
ruoyi-system/src/main/resources/mapper/care/CarePersonsMapper.xml

@@ -26,6 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateTime"    column="update_time"    />
         <result property="age"    column="age"    />
         <result property="remark"    column="remark"    />
+        <result property="status" column="status"/>
     </resultMap>
 
     <sql id="selectCarePersonsVo">
@@ -36,6 +37,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             c.gender,
             c.id_number,
             c.address,
+            c.status,
             c.phone_number,
             c.emergency_contact,
             c.emergency_phone,
@@ -151,6 +153,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="status != null">status = #{status},</if>
             <if test="remark != null">remark = #{remark},</if>
             <if test="age != null">age = #{age},</if>
         </trim>

+ 4 - 0
ruoyi-system/src/main/resources/mapper/system/SysWorkConfigMapper.xml

@@ -32,6 +32,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectSysWorkConfigVo"/>
         where id = #{id}
     </select>
+    <select id="selectSysWorkConfigByType" parameterType="String" resultMap="SysWorkConfigResult">
+        <include refid="selectSysWorkConfigVo"/>
+        where type = #{type}
+    </select>
 
     <insert id="insertSysWorkConfig" parameterType="SysWorkConfig">
         insert into sys_work_config

+ 8 - 0
ruoyi-vue/src/api/care/clocks.js

@@ -50,3 +50,11 @@ export function removeImg(address) {
     method: 'get'
   })
 }
+
+
+export function getleastNum(data) {
+  return request({
+    url: '/system/workConfig/type/'+data,
+    method: 'get'
+  })
+}

+ 9 - 0
ruoyi-vue/src/api/care/persons.js

@@ -49,4 +49,13 @@ export function listAllPersons(query) {
     method: 'get',
     params: query
   })
+}
+
+// 中转特困人员
+export function transferPerson(data) {
+  return request({
+    url: '/care/persons/tranfer',
+    method: 'post',
+    data: data
+  })
 }

+ 155 - 68
ruoyi-vue/src/views/care/applications/index.vue

@@ -114,6 +114,7 @@
       <el-table-column label="详细地址" align="center" prop="address" show-overflow-tooltip/>
       <el-table-column label="预计天数" align="center" prop="careDays" show-overflow-tooltip/>
       <el-table-column label="申请日期" align="center" prop="applyDate" show-overflow-tooltip/>
+      <el-table-column label="出院时间" align="center" prop="leaveTime" show-overflow-tooltip/>
       <el-table-column label="申请状态" align="center" prop="status" show-overflow-tooltip>
         <template #default="scope">
           <div v-if="scope.row.status == 'disagree'">
@@ -166,67 +167,124 @@
     />
 
     <!-- 添加或修改护理申请对话框 -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+    <el-dialog :title="title" v-model="open" width="800px" append-to-body>
       <el-form ref="applicationsRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="申请人" prop="personId">
-          <el-select v-model="form.personId"
-                     filterable
-                     remote
-                     reserve-keyword
-                     placeholder="请输入特困人员名字进行过滤"
-                     :remote-method="personSelectorData"
-                     :loading="personLoading"
-                     style="width: 200px"  @change="handleSelectChange"
-          >
-            <el-option
-                v-for="item in personList"
-                :key="item.personId"
-                :label="item.name"
-                :value="item.personId"
-            />
-          </el-select>
-          <el-input v-model="form.personName" placeholder="personName" type="hidden"></el-input>
-        </el-form-item>
-        <el-form-item label="护理需求" prop="careNeeds">
-          <el-input v-model="form.careNeeds" type="textarea" placeholder="请输入详细护理需求" />
-        </el-form-item>
-        <el-form-item label="首选性别" prop="nurseGender">
-          <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别">
-            <el-option
-              v-for="dict in sys_user_sex"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="所在医院" prop="hospital">
-          <el-select v-model="form.hospital" placeholder="所在医院">
-            <el-option
-                v-for="dict in hispitalList"
-                :key="dict.name"
-                :label="dict.name"
-                :value="dict.name"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="详细地址" prop="address">
-          <el-input v-model="form.address" placeholder="请输入科室具体楼层房间床号" />
-        </el-form-item>
-        <el-form-item label="预计天数" prop="careDays">
-          <el-input v-model="form.careDays" placeholder="请输入预计天数" />
-        </el-form-item>
-        <el-form-item label="申请日期" prop="applyDate">
-          <el-date-picker clearable
-                          v-model="form.applyDate"
-                          type="date"
-                          value-format="YYYY-MM-DD"
-                          placeholder="请选择申请日期">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="申请人" prop="personId">
+              <el-select v-model="form.personId"
+                         filterable
+                         remote
+                         reserve-keyword
+                         placeholder="请输入特困人员名字进行过滤"
+                         :loading="personLoading"
+                         style="width: 200px" @change="handleSelectChange"
+              >
+                <el-option
+                    v-for="item in personList"
+                    :key="item.personId"
+                    :label="item.name"
+                    :value="item.personId"
+                />
+              </el-select>
+              <el-input v-model="form.personName" placeholder="personName" type="hidden"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="是否残疾" prop="disability">
+              <el-select v-model="form.disability" placeholder="请选择" disabled>
+                <el-option
+                    v-for="dict in sys_yes_no"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="护理需求" prop="careNeeds">
+              <el-input v-model="form.careNeeds" type="textarea" placeholder="请输入详细护理需求" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="所在医院" prop="hospital">
+              <el-select v-model="form.hospital" placeholder="所在医院">
+                <el-option
+                    v-for="dict in hispitalList"
+                    :key="dict.name"
+                    :label="dict.name"
+                    :value="dict.name"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="详细地址" prop="address">
+              <el-input v-model="form.address" placeholder="请输入科室具体楼层房间床号" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="首选性别" prop="nurseGender">
+              <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别">
+                <el-option
+                    v-for="dict in sys_user_sex"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="预计天数" prop="careDays">
+              <el-input v-model="form.careDays" placeholder="请输入预计天数" />
+            </el-form-item>
+          </el-col>
+
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="申请日期" prop="applyDate">
+              <el-date-picker clearable
+                              v-model="form.applyDate"
+                              type="date"
+                              value-format="YYYY-MM-DD"
+                              placeholder="请选择申请日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="出院日期" prop="leaveTime">
+              <el-date-picker clearable
+                              v-model="form.leaveTime"
+                              type="datetime"
+                              value-format="YYYY-MM-DD HH:mm:ss"
+                              placeholder="请选择出院日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+
+
+
       </el-form>
       <template #footer>
         <div class="dialog-footer">
@@ -236,7 +294,7 @@
       </template>
     </el-dialog>
 
-    <el-dialog :title="title" v-model="openDetail" width="500px" append-to-body>
+    <el-dialog :title="title" v-model="openDetail" width="800px" append-to-body>
       <el-form ref="applicationsRef" :model="form" label-width="80px">
         <el-row :gutter="20">
           <el-col :span="12">
@@ -246,9 +304,8 @@
                          remote
                          reserve-keyword
                          placeholder="请输入特困人员名字进行过滤"
-                         :remote-method="personSelectorData"
                          :loading="personLoading"
-                         style="width: 200px"
+                         style="width: 200px" @change="handleSelectChange" disabled
               >
                 <el-option
                     v-for="item in personList"
@@ -257,13 +314,14 @@
                     :value="item.personId"
                 />
               </el-select>
+              <el-input v-model="form.personName" placeholder="personName" type="hidden"></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="首选性别" prop="nurseGender">
-              <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别" disabled>
+            <el-form-item label="是否残疾" prop="disability">
+              <el-select v-model="form.disability" placeholder="请选择" disabled>
                 <el-option
-                    v-for="dict in sys_user_sex"
+                    v-for="dict in sys_yes_no"
                     :key="dict.value"
                     :label="dict.label"
                     :value="dict.value"
@@ -271,6 +329,7 @@
               </el-select>
             </el-form-item>
           </el-col>
+
         </el-row>
         <el-row :gutter="20">
           <el-col :span="24">
@@ -292,16 +351,41 @@
           </el-col>
         </el-row>
         <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="首选性别" prop="nurseGender">
+              <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别" disabled>
+                <el-option
+                    v-for="dict in sys_user_sex"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
           <el-col :span="12">
             <el-form-item label="预计天数" prop="careDays">
               <el-input v-model="form.careDays" placeholder="请输入预计天数" disabled/>
             </el-form-item>
           </el-col>
+
+        </el-row>
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="申请日期" prop="applyDate">
               <el-input v-model="form.applyDate" placeholder="请输入申请日期" disabled/>
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="出院日期" prop="leaveTime">
+              <el-date-picker clearable
+                              v-model="form.leaveTime"
+                              type="datetime"
+                              value-format="YYYY-MM-DD HH:mm:ss"
+                              placeholder="请选择出院日期" disabled>
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="24">
@@ -404,7 +488,7 @@ import {listAllPersons} from "@/api/care/persons";
 import {listCareRecords} from "@/api/care/careRecords";
 
 const { proxy } = getCurrentInstance();
-const { sys_user_sex,care_apply_status,deal_status,pay_status } = proxy.useDict('sys_user_sex','care_apply_status','deal_status','pay_status');
+const { sys_user_sex,care_apply_status,deal_status,pay_status,sys_yes_no } = proxy.useDict('sys_user_sex','care_apply_status','deal_status','pay_status','sys_yes_no');
 
 const applicationsList = ref([]);
 const hispitalList=ref([]);
@@ -498,7 +582,8 @@ function reset() {
     createTime: null,
     updateBy: null,
     updateTime: null,
-    remark: null
+    remark: null,
+    leaveTime:null
   };
   proxy.resetForm("applicationsRef");
 }
@@ -617,6 +702,7 @@ function handleSelectChange(value) {
   if (person) {
     form.value.personId=person.personId
     form.value.personName=person.name
+    form.value.disability=person.disability
   }
 }
 /** 查询医院列表 */
@@ -635,6 +721,7 @@ function personSelectorData(qstr){
     personList.value = response;
   });
 }
+personSelectorData();
 listHispital();
 getList();
 </script>

+ 39 - 5
ruoyi-vue/src/views/care/applications/index_assign_nurse.vue

@@ -93,7 +93,7 @@
 
 
     <!-- 指派对话框 -->
-    <el-dialog :title="title" v-model="openAssign" width="500px" append-to-body>
+    <el-dialog :title="title" v-model="openAssign" width="800px" append-to-body>
       <el-form ref="applicationsRef" :model="form" :rules="rules" label-width="80px">
         <el-row :gutter="20">
           <el-col :span="12">
@@ -109,10 +109,10 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="首选性别" prop="nurseGender">
-              <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别" disabled>
+            <el-form-item label="是否残疾" prop="disability">
+              <el-select v-model="form.disability" placeholder="请选择" disabled>
                 <el-option
-                    v-for="dict in sys_user_sex"
+                    v-for="dict in sys_yes_no"
                     :key="dict.value"
                     :label="dict.label"
                     :value="dict.value"
@@ -120,6 +120,7 @@
               </el-select>
             </el-form-item>
           </el-col>
+
         </el-row>
         <el-row :gutter="20">
           <el-col :span="24">
@@ -148,16 +149,41 @@
           </el-col>
         </el-row>
         <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="首选性别" prop="nurseGender">
+              <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别" disabled>
+                <el-option
+                    v-for="dict in sys_user_sex"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
           <el-col :span="12">
             <el-form-item label="预计天数" prop="careDays">
               <el-input v-model="form.careDays" placeholder="请输入预计天数" disabled/>
             </el-form-item>
           </el-col>
+
+        </el-row>
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="申请日期" prop="applyDate">
               <el-input v-model="form.applyDate" placeholder="请输入申请日期" disabled/>
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="出院日期" prop="leaveTime">
+              <el-date-picker clearable
+                              v-model="form.leaveTime"
+                              type="datetime"
+                              value-format="YYYY-MM-DD HH:mm:ss"
+                              placeholder="请选择出院日期" disabled>
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="24">
@@ -219,7 +245,7 @@ import { listAllHospital } from "@/api/care/hospital";
 import {listAllPersons} from "@/api/care/persons";
 import {listCompanyNurses} from "@/api/care/nurses";
 const { proxy } = getCurrentInstance();
-const { sys_user_sex,care_apply_status } = proxy.useDict('sys_user_sex','care_apply_status');
+const { sys_user_sex,care_apply_status,sys_yes_no } = proxy.useDict('sys_user_sex','care_apply_status','sys_yes_no');
 
 const applicationsAssignList = ref([]);
 const hispitalList=ref([]);
@@ -374,6 +400,14 @@ function listHispital() {
     hispitalList.value = response;
   });
 }
+
+/** 查询所有特困人员 */
+function listPersons() {
+  listAllPersons().then(response => {
+    personList.value = response;
+  });
+}
+listPersons();
 getAssignList();
 companyNurses();
 listHispital();

+ 61 - 11
ruoyi-vue/src/views/care/applications/index_wait_check.vue

@@ -144,7 +144,7 @@
 
 
     <!-- 添加或修改护理申请对话框 -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+    <el-dialog :title="title" v-model="open" width="800px" append-to-body>
       <el-form ref="applicationsRef" :model="form" :rules="rules" label-width="80px">
         <el-row :gutter="20">
           <el-col :span="12">
@@ -160,10 +160,10 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="首选性别" prop="nurseGender">
-              <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别" disabled>
+            <el-form-item label="是否残疾" prop="disability">
+              <el-select v-model="form.disability" placeholder="请选择" disabled>
                 <el-option
-                    v-for="dict in sys_user_sex"
+                    v-for="dict in sys_yes_no"
                     :key="dict.value"
                     :label="dict.label"
                     :value="dict.value"
@@ -171,6 +171,7 @@
               </el-select>
             </el-form-item>
           </el-col>
+
         </el-row>
         <el-row :gutter="20">
           <el-col :span="24">
@@ -199,16 +200,41 @@
           </el-col>
         </el-row>
         <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="首选性别" prop="nurseGender">
+              <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别" disabled>
+                <el-option
+                    v-for="dict in sys_user_sex"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
           <el-col :span="12">
             <el-form-item label="预计天数" prop="careDays">
               <el-input v-model="form.careDays" placeholder="请输入预计天数" disabled/>
             </el-form-item>
           </el-col>
+
+        </el-row>
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="申请日期" prop="applyDate">
               <el-input v-model="form.applyDate" placeholder="请输入申请日期" disabled/>
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="出院日期" prop="leaveTime">
+              <el-date-picker clearable
+                              v-model="form.leaveTime"
+                              type="datetime"
+                              value-format="YYYY-MM-DD HH:mm:ss"
+                              placeholder="请选择出院日期" disabled>
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="24">
@@ -217,7 +243,6 @@
             </el-form-item>
           </el-col>
         </el-row>
-
         <el-divider/>
         <el-form-item label="审核原因" prop="auditReason">
           <el-input v-model="form.auditReason" type="textarea" placeholder="请输入内容"/>
@@ -233,7 +258,7 @@
     </el-dialog>
 
     <!-- 指派对话框 -->
-    <el-dialog :title="title" v-model="openAssign" width="500px" append-to-body>
+    <el-dialog :title="title" v-model="openAssign" width="800px" append-to-body>
       <el-form ref="applicationAssignRef" :model="form" :rules="rules" label-width="80px">
         <el-row :gutter="20">
           <el-col :span="12">
@@ -249,10 +274,10 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="首选性别" prop="nurseGender">
-              <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别" disabled>
+            <el-form-item label="是否残疾" prop="disability">
+              <el-select v-model="form.disability" placeholder="请选择" disabled>
                 <el-option
-                    v-for="dict in sys_user_sex"
+                    v-for="dict in sys_yes_no"
                     :key="dict.value"
                     :label="dict.label"
                     :value="dict.value"
@@ -260,6 +285,7 @@
               </el-select>
             </el-form-item>
           </el-col>
+
         </el-row>
         <el-row :gutter="20">
           <el-col :span="24">
@@ -288,16 +314,41 @@
           </el-col>
         </el-row>
         <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="首选性别" prop="nurseGender">
+              <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别" disabled>
+                <el-option
+                    v-for="dict in sys_user_sex"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
           <el-col :span="12">
             <el-form-item label="预计天数" prop="careDays">
               <el-input v-model="form.careDays" placeholder="请输入预计天数" disabled/>
             </el-form-item>
           </el-col>
+
+        </el-row>
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="申请日期" prop="applyDate">
               <el-input v-model="form.applyDate" placeholder="请输入申请日期" disabled/>
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="出院日期" prop="leaveTime">
+              <el-date-picker clearable
+                              v-model="form.leaveTime"
+                              type="datetime"
+                              value-format="YYYY-MM-DD HH:mm:ss"
+                              placeholder="请选择出院日期" disabled>
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="24">
@@ -306,7 +357,6 @@
             </el-form-item>
           </el-col>
         </el-row>
-
         <el-divider/>
         <el-row :gutter="20">
           <el-col :span="24">
@@ -345,7 +395,7 @@ import { listAllHospital } from "@/api/care/hospital";
 import {listAllPersons} from "@/api/care/persons";
 import {listAllCompany} from "@/api/care/nurses";
 const { proxy } = getCurrentInstance();
-const { sys_user_sex,care_apply_status } = proxy.useDict('sys_user_sex','care_apply_status');
+const { sys_user_sex,care_apply_status,sys_yes_no } = proxy.useDict('sys_user_sex','care_apply_status','sys_yes_no');
 
 const applicationsCheckList = ref([]);
 const applicationsAssignList = ref([]);

+ 42 - 7
ruoyi-vue/src/views/care/clocks/index.vue

@@ -61,7 +61,9 @@
               v-model="form.nursingTime"
               type="datetime"
               value-format="YYYY-MM-DD HH:mm:ss"
-              placeholder="请选择护理时间">
+              placeholder="请选择护理时间"
+              :picker-options="pickerOptions"
+            >
             </el-date-picker>
           </el-form-item>
           <el-form-item label="图片路径" prop="imgPaths">
@@ -81,6 +83,9 @@
           <el-form-item label="备注" prop="remark">
             <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
           </el-form-item>
+          <el-form-item>
+            <span style="color: red">注:图片数量不能少于<cite style="font-weight: bolder;font-style: normal">{{leastNum}}</cite>张</span>
+          </el-form-item>
         </el-form>
         <template #footer>
           <div class="dialog-footer">
@@ -98,8 +103,8 @@
 }
 </style>
 <script setup name="Clocks">
-import { listClocks, getClocks, delClocks, addClocks, updateClocks,removeImg } from "@/api/care/clocks";
-import { ref } from 'vue'
+import { listClocks, getClocks, delClocks, addClocks, updateClocks,removeImg,getleastNum } from "@/api/care/clocks";
+import { ref,computed  } from 'vue'
 import { Plus } from '@element-plus/icons-vue'
 import { getToken } from '@/utils/auth'
 const { proxy } = getCurrentInstance();
@@ -113,17 +118,36 @@ const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
 const title = ref("");
-
+const leastNum=ref(0);
 const fileLists =ref([]);
-
 // 定义 props
 const props = defineProps({
   applyId: {
     type: Number,
     required: true
+  },
+  leaveTime:{
+    type:String,
+    required:true
   }
 });
-console.info("=="+props.hasOwnProperty());
+// 确保 leaveTime 能够被正确解析为 Date 对象
+const specificDate = new Date(props.leaveTime);
+
+const pickerOptions = computed(() => ({
+  disabledDate(time) {
+    const specificDate = new Date(props.leaveTime);
+    console.log('Comparing:', time, 'with', specificDate);
+    if (isNaN(specificDate.getTime())) {
+      console.error("Invalid date format for leaveTime:", props.leaveTime);
+      return false;
+    }
+    const result = time.getTime() > specificDate.getTime();
+    console.log('Disabled:', result);
+    return result;
+  }
+}));
+
 const data = reactive({
   form: {},
   queryParams: {
@@ -249,9 +273,12 @@ function submitForm() {
     }else{
       form.value.imgPaths+=item.url.replaceAll(import.meta.env.VITE_APP_BASE_API,"")+",";
     }
-
   });
 
+  if(form.value.imgNum<leastNum.value){
+    proxy.$modal.msgError('图片至少上传'+leastNum.value+'张!');
+    return false;
+  }
   proxy.$refs["clocksRef"].validate(valid => {
     if (valid) {
       if (form.value.clockId != null) {
@@ -324,5 +351,13 @@ function handleSuccess(response, file, fileList)
   }
 
 }
+
+//获取图片上传最少数量
+function findleastNum() {
+  getleastNum('need_img_num').then(response => {
+    leastNum.value=response.data.number;
+  });
+}
+findleastNum();
 getList();
 </script>

+ 158 - 9
ruoyi-vue/src/views/care/clocks/index_task.vue

@@ -61,7 +61,8 @@
         <template #default="scope">
           <el-button link type="primary" icon="Edit" @click="look(scope.row)" v-hasPermi="['care:applications:look']">查看</el-button>
           <el-button link type="primary" icon="Edit" @click="clock(scope.row)" v-hasPermi="['care:applications:clock']">打卡</el-button>
-          <el-button link type="primary" icon="Edit" @click="finish(scope.row)" v-hasPermi="['care:applications:finish']">完成</el-button>
+          <el-button link type="primary" icon="Edit" @click="die(scope.row)" v-hasPermi="['care:clocks:die']">死亡</el-button>
+          <el-button link type="primary" icon="Edit" @click="finish(scope.row)" v-hasPermi="['care:applications:finish']">结束</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -74,7 +75,7 @@
     />
   </div>
 
-  <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+  <el-dialog :title="title" v-model="open" width="800px" append-to-body>
     <el-form ref="applicationsRef" :model="form" label-width="80px">
       <el-row :gutter="20">
         <el-col :span="12">
@@ -90,10 +91,10 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="首选性别" prop="nurseGender">
-            <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别" disabled>
+          <el-form-item label="是否残疾" prop="disability">
+            <el-select v-model="form.disability" placeholder="请选择" disabled>
               <el-option
-                  v-for="dict in sys_user_sex"
+                  v-for="dict in sys_yes_no"
                   :key="dict.value"
                   :label="dict.label"
                   :value="dict.value"
@@ -122,16 +123,42 @@
         </el-col>
       </el-row>
       <el-row :gutter="20">
+
+        <el-col :span="12">
+          <el-form-item label="首选性别" prop="nurseGender">
+            <el-select v-model="form.nurseGender" placeholder="请选择首选护理人员性别" disabled>
+              <el-option
+                  v-for="dict in sys_user_sex"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
         <el-col :span="12">
           <el-form-item label="预计天数" prop="careDays">
             <el-input v-model="form.careDays" placeholder="请输入预计天数" disabled/>
           </el-form-item>
         </el-col>
+
+      </el-row>
+      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="申请日期" prop="applyDate">
             <el-input v-model="form.applyDate" placeholder="请输入申请日期" disabled/>
           </el-form-item>
         </el-col>
+        <el-col :span="12">
+          <el-form-item label="出院日期" prop="leaveTime">
+            <el-date-picker clearable
+                            v-model="form.leaveTime"
+                            type="datetime"
+                            value-format="YYYY-MM-DD HH:mm:ss"
+                            placeholder="请选择出院日期" disabled>
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
       </el-row>
       <el-row :gutter="20">
         <el-col :span="24">
@@ -156,6 +183,39 @@
     </div>
 
   </el-dialog>
+
+  <el-dialog :title="title" v-model="dieOpen" width="500px" append-to-body>
+    <el-form ref="dieRef" :model="dieForm" :rules="dieRules" label-width="80px">
+      <el-form-item label="死亡时间" prop="dieTime">
+        <el-date-picker clearable
+                        v-model="dieForm.dieTime"
+                        type="datetime"
+                        value-format="YYYY-MM-DD HH:mm:ss"
+                        placeholder="请选择死亡时间"
+        >
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="死亡证明" prop="imgPaths">
+        <el-upload
+            v-model:file-list="fileLists"
+            :action="uploadImgUrl"
+            :headers="uploadHeaders"
+            list-type="picture-card"
+            :on-remove="handleRemove"
+            :on-success="handleSuccess"
+            :data="uploadImgData"
+        >
+          <el-icon><Plus /></el-icon>
+        </el-upload>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </template>
+  </el-dialog>
 </template>
 
 <script setup name="ClocksTask">
@@ -165,9 +225,12 @@ import {
   completeApplications
 } from "@/api/care/applications";
 import clockIndex from './index.vue';
-
+import {listAllPersons} from "@/api/care/persons";
+import {Plus} from "@element-plus/icons-vue";
+import {ref} from "vue";
+import {getToken} from "@/utils/auth";
 const { proxy } = getCurrentInstance();
-const {deal_status,sys_user_sex } = proxy.useDict('deal_status','sys_user_sex');
+const {deal_status,sys_user_sex,sys_yes_no } = proxy.useDict('deal_status','sys_user_sex','sys_yes_no');
 
 const applicationsList = ref([]);
 const hispitalList=ref([]);
@@ -183,8 +246,26 @@ const title = ref("");
 const total=ref(0);
 const open=ref(false);
 const openClock=ref(false);
+
+const dieOpen =ref(false);
+
+const fileLists =ref([]);
+
+const uploadImgUrl = ref(import.meta.env.VITE_APP_BASE_API + "/care/clocks/upload"); // 上传的图片服务器地址
+const uploadImgData=ref({});
+const uploadHeaders={Authorization: 'Bearer ' + getToken()};
+const fileSize=1;
 const data = reactive({
   form: {},
+  dieForm:{},
+  dieRules: {
+    dieTime: [
+      { required: true, message: "死亡时间不能为空", trigger: "blur" }
+    ],
+    imgPaths: [
+      { required: true, message: "图片路径不能为空", trigger: "blur" }
+    ]
+  },
   queryParams: {
     pageNum: 1,
     pageSize: 10,
@@ -203,7 +284,7 @@ const data = reactive({
   }
 });
 
-const { queryParams, form } = toRefs(data);
+const { queryParams, form,dieForm,dieRules } = toRefs(data);
 
 /** 查询护理指派列表 */
 function getList(){
@@ -256,15 +337,30 @@ function look(row) {
 function clock(row){
   const _applyId = row.applyId || ids.value
 
+
   currentComponent.value = clockIndex;
 
   // 传递apply
   componentProps.value = {
-    applyId: _applyId
+    applyId: _applyId,
+    leaveTime:row.leaveTime
   };
+
   openClock.value=true
 }
 
+//死亡
+function die(row) {
+  uploadImgData.value={applyId:row.applyId};
+  dieForm.value.applyId=row.applyId;
+  dieOpen.value=true;
+}
+// 取消按钮
+function cancel() {
+  dieOpen.value = false;
+  reset();
+}
+
 function finish(row){
   proxy.$modal.confirm('是否确认该客户:"' + row.personName + '"已经完成?').then(function() {
     row.dealStatus="complete"
@@ -275,6 +371,59 @@ function finish(row){
     proxy.$modal.msgSuccess("操作成功");
   }).catch(() => {});
 }
+
+/** 查询所有特困人员 */
+function listPersons() {
+  listAllPersons().then(response => {
+    personList.value = response;
+  });
+}
+function handleRemove(file, fileList) {
+  console.log('移除文件:', file, '剩余文件:', fileList);
+}
+
+
+function handleSuccess(response, file, fileList)
+{
+  if(response.code==200){
+    fileLists.value=fileList;
+  }
+
+}
+
+/** 提交按钮 */
+function submitForm() {
+  dieForm.value.imgPaths=""
+  fileLists.value.forEach(item => {
+    if(item.response){
+      dieForm.value.imgPaths+=item.response.imgUrl+",";
+    }else{
+      dieForm.value.imgPaths+=item.url.replaceAll(import.meta.env.VITE_APP_BASE_API,"")+",";
+    }
+  });
+
+  console.info(dieForm.value);
+  // proxy.$refs["dieRef"].validate(valid => {
+  //   if (valid) {
+  //     if (form.value.clockId != null) {
+  //       updateClocks(form.value).then(response => {
+  //         proxy.$modal.msgSuccess("修改成功");
+  //         open.value = false;
+  //         getList();
+  //       });
+  //     } else {
+  //       addClocks(form.value).then(response => {
+  //         proxy.$modal.msgSuccess("新增成功");
+  //         open.value = false;
+  //         getList();
+  //       });
+  //     }
+  //   }
+  // });
+}
+
+
+listPersons();
 getList();
 
 </script>

+ 75 - 2
ruoyi-vue/src/views/care/persons/index.vue

@@ -133,6 +133,11 @@
           <dict-tag :options="sys_yes_no" :value="scope.row.disability"/>
         </template>
       </el-table-column>
+      <el-table-column label="状态" align="center" prop="status" >
+        <template #default="scope">
+          <dict-tag :options="person_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
       <el-table-column label="登记日期" align="center" prop="registeredDate">
         <template #default="scope">
           <span>{{ parseTime(scope.row.registeredDate, '{y}-{m}-{d}') }}</span>
@@ -142,6 +147,10 @@
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template #default="scope">
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['care:persons:edit']">修改</el-button>
+          <el-button link type="primary" icon="Edit" @click="transfer(scope.row)" v-hasPermi="['care:persons:transfer']">中转</el-button>
+          <el-button link type="primary" icon="Edit" @click="endTransfer(scope.row)" v-hasPermi="['care:persons:endTransfer']">结束中转</el-button>
+          <el-button link type="primary" icon="Edit" @click="leave(scope.row)" v-hasPermi="['care:persons:leave']">擅自离院</el-button>
+          <el-button link type="primary" icon="Edit" @click="back(scope.row)" v-hasPermi="['care:persons:back']">回院</el-button>
           <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['care:persons:remove']">删除</el-button>
         </template>
       </el-table-column>
@@ -270,10 +279,10 @@
 </template>
 
 <script setup name="Persons">
-import { listPersons, getPersons, delPersons, addPersons, updatePersons } from "@/api/care/persons";
+import { listPersons, getPersons, delPersons, addPersons, updatePersons,transferPerson } from "@/api/care/persons";
 
 const { proxy } = getCurrentInstance();
-const { sys_user_sex,sys_yes_no } = proxy.useDict('sys_user_sex','sys_yes_no');
+const { sys_user_sex,sys_yes_no,person_status } = proxy.useDict('sys_user_sex','sys_yes_no','person_status');
 
 const personsList = ref([]);
 const open = ref(false);
@@ -437,6 +446,70 @@ function handleDelete(row) {
   }).catch(() => {});
 }
 
+/** 中转钮操作 */
+function transfer(row) {
+  const _personId = row.personId || ids.value
+  getPersons(_personId).then(response => {
+    form.value = response.data;
+    form.value.status='02'
+    proxy.$modal.confirm('是否确定当前特困人员进入中转?').then(function() {
+      updatePersons(form.value).then(response => {
+        proxy.$modal.msgSuccess("操作成功");
+        open.value = false;
+        getList();
+      });
+    })
+  });
+}
+
+/** 结束中转钮操作 */
+function endTransfer(row) {
+  const _personId = row.personId || ids.value
+  getPersons(_personId).then(response => {
+    form.value = response.data;
+    form.value.status='01'
+    proxy.$modal.confirm('是否确定当前特困人员结束中转?').then(function() {
+      updatePersons(form.value).then(response => {
+        proxy.$modal.msgSuccess("操作成功");
+        open.value = false;
+        getList();
+      });
+    })
+  });
+}
+
+/** 擅自离院操作 */
+function leave(row) {
+  const _personId = row.personId || ids.value
+  getPersons(_personId).then(response => {
+    form.value = response.data;
+    form.value.status='03'
+    proxy.$modal.confirm('是否确定当前特困人员擅自离院?').then(function() {
+      updatePersons(form.value).then(response => {
+        proxy.$modal.msgSuccess("操作成功");
+        open.value = false;
+        getList();
+      });
+    })
+  });
+}
+
+/** 回到医院 */
+function back(row) {
+  const _personId = row.personId || ids.value
+  getPersons(_personId).then(response => {
+    form.value = response.data;
+    form.value.status='01'
+    proxy.$modal.confirm('是否确定当前特困人员已回到医院?').then(function() {
+      updatePersons(form.value).then(response => {
+        proxy.$modal.msgSuccess("操作成功");
+        open.value = false;
+        getList();
+      });
+    })
+  });
+}
+
 /** 导出按钮操作 */
 function handleExport() {
   proxy.download('care/persons/export', {