Bläddra i källkod

v2024.12.27版本发布

jinhu 7 månader sedan
förälder
incheckning
a4dedefe06
57 ändrade filer med 3046 tillägg och 68 borttagningar
  1. 8 7
      README.md
  2. 0 5
      pom.xml
  3. 93 0
      src/main/java/com/kcim/controller/QualificationApplyController.java
  4. 60 0
      src/main/java/com/kcim/controller/QualificationAuditController.java
  5. 2 2
      src/main/java/com/kcim/controller/QualificationController.java
  6. 160 0
      src/main/java/com/kcim/controller/QualificationManageController.java
  7. 27 0
      src/main/java/com/kcim/controller/request/QualificationApplyRequest.java
  8. 25 0
      src/main/java/com/kcim/controller/request/QualificationAuditRequest.java
  9. 2 2
      src/main/java/com/kcim/controller/request/QualificationHisItemMapRequest.java
  10. 33 0
      src/main/java/com/kcim/controller/request/QualificationManageAdjustRequest.java
  11. 33 0
      src/main/java/com/kcim/controller/request/QualificationReAuthorizeRequest.java
  12. 14 0
      src/main/java/com/kcim/controller/response/MyQualification.java
  13. 17 0
      src/main/java/com/kcim/controller/response/QualificationManage.java
  14. 17 0
      src/main/java/com/kcim/controller/response/QualificationManageForDoctor.java
  15. 9 0
      src/main/java/com/kcim/dao/mapper/DepartmentMapper.java
  16. 10 0
      src/main/java/com/kcim/dao/mapper/DoctorAttachmentMapper.java
  17. 9 0
      src/main/java/com/kcim/dao/mapper/QualificationApplyAdjustMapper.java
  18. 9 0
      src/main/java/com/kcim/dao/mapper/QualificationApplyAttachmentMapper.java
  19. 11 0
      src/main/java/com/kcim/dao/mapper/QualificationApplyMapper.java
  20. 9 0
      src/main/java/com/kcim/dao/mapper/SysDictionaryMapper.java
  21. 12 0
      src/main/java/com/kcim/dao/mapper/UserInfoMapper.java
  22. 39 0
      src/main/java/com/kcim/dao/model/Department.java
  23. 31 0
      src/main/java/com/kcim/dao/model/DoctorAttachment.java
  24. 24 0
      src/main/java/com/kcim/dao/model/Qualification.java
  25. 77 2
      src/main/java/com/kcim/dao/model/QualificationApply.java
  26. 19 0
      src/main/java/com/kcim/dao/model/QualificationApplyAdjust.java
  27. 19 1
      src/main/java/com/kcim/dao/model/QualificationType.java
  28. 24 0
      src/main/java/com/kcim/dao/model/SysDictionary.java
  29. 13 0
      src/main/java/com/kcim/dao/model/UserInfo.java
  30. 20 0
      src/main/java/com/kcim/dao/repository/DepartmentRepository.java
  31. 23 0
      src/main/java/com/kcim/dao/repository/DoctorAttachmentRepository.java
  32. 8 5
      src/main/java/com/kcim/dao/repository/HisItemDicRepository.java
  33. 25 0
      src/main/java/com/kcim/dao/repository/QualificationApplyAdjustRepository.java
  34. 50 0
      src/main/java/com/kcim/dao/repository/QualificationApplyAttachmentRepository.java
  35. 381 0
      src/main/java/com/kcim/dao/repository/QualificationApplyRepository.java
  36. 45 2
      src/main/java/com/kcim/dao/repository/QualificationRepository.java
  37. 29 0
      src/main/java/com/kcim/dao/repository/QualificationTypeRepository.java
  38. 22 0
      src/main/java/com/kcim/dao/repository/SysDictionaryRepository.java
  39. 66 0
      src/main/java/com/kcim/dao/repository/UserInfoRepository.java
  40. 9 0
      src/main/java/com/kcim/endpoint/CenterEndPoint.java
  41. 41 0
      src/main/java/com/kcim/exception/MedicalHandler.java
  42. 10 0
      src/main/java/com/kcim/service/CenterService.java
  43. 23 0
      src/main/java/com/kcim/service/QualificationApplyService.java
  44. 18 0
      src/main/java/com/kcim/service/QualificationAuditService.java
  45. 1 1
      src/main/java/com/kcim/service/QualificationHisItemService.java
  46. 40 0
      src/main/java/com/kcim/service/QualificationManageService.java
  47. 6 1
      src/main/java/com/kcim/service/QualificationService.java
  48. 41 0
      src/main/java/com/kcim/service/impl/CenterServiceImpl.java
  49. 156 0
      src/main/java/com/kcim/service/impl/QualificationApplyServiceImpl.java
  50. 228 0
      src/main/java/com/kcim/service/impl/QualificationAuditServiceImpl.java
  51. 465 0
      src/main/java/com/kcim/service/impl/QualificationManageServiceImpl.java
  52. 171 34
      src/main/java/com/kcim/service/impl/QualificationServiceImpl.java
  53. 48 0
      src/main/java/com/kcim/vo/QualificationAuditVO.java
  54. 3 1
      src/main/java/com/kcim/vo/SessionUserVO.java
  55. 190 0
      src/main/java/com/kcim/vo/UserInfoVO.java
  56. 121 0
      src/main/resources/application-demo.yml
  57. 0 5
      src/main/resources/application-dev.yml

+ 8 - 7
README.md

@@ -1,9 +1,10 @@
-# 工程简介
-此demo 用于深度集成业务中台使用,demo中已添加部分公用功能如需自定义可另个添加
-工程采用微服务体系,接入系统不用另外开发鉴权功能可直接进行业务开发
-
-
-
-
+#打包命令
+mvn clean package -DskipTests;
 
+#部署命令181
+cd /datavdb/app/kcim-medical/target
+./start.sh restart
 
+#部署命令190
+cd /data/app/kcim-medical/target
+./start.sh restart

+ 0 - 5
pom.xml

@@ -188,11 +188,6 @@
             <artifactId>httpmime</artifactId>
             <version>4.5.7</version>
         </dependency>
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
-            <version>${nacos.version}</version>
-        </dependency>
         <dependency>
             <groupId>io.minio</groupId>
             <artifactId>minio</artifactId>

+ 93 - 0
src/main/java/com/kcim/controller/QualificationApplyController.java

@@ -0,0 +1,93 @@
+package com.kcim.controller;
+
+import com.kcim.constants.NumberConstant;
+import com.kcim.controller.request.QualificationApplyRequest;
+import com.kcim.controller.request.QualificationHisItemMapRequest;
+import com.kcim.dao.model.QualificationApply;
+import com.kcim.service.QualificationApplyService;
+import com.kcim.util.Result;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 资质申请
+ * @author jinhu
+ */
+@RestController
+@RequestMapping("/qualificationApply")
+public class QualificationApplyController {
+
+    @Autowired
+    private QualificationApplyService qualificationApplyService;
+
+    /**
+     * 查询资质列表
+     */
+    @ApiOperation("资质字典-查询")
+    @GetMapping("getQualificationList")
+    public Result getQualificationList(@RequestParam(value = "name", required = false) String name,
+                                       @RequestParam(value = "qualificationTypeCode", required = false) String qualificationTypeCode,
+                                       @RequestParam(value = "operationLevelCode", required = false) String operationLevelCode,
+                                       @RequestParam(value = "techFlag", required = false) Integer techFlag,
+                                       @RequestParam(value = "operationFlag", required = false) Integer operationFlag,
+                                       @RequestParam(value = "enableFlag", required = false) Integer enableFlag,
+                                       @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
+                                       @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
+        return Result.ok(qualificationApplyService.getQualificationList(name, qualificationTypeCode, operationLevelCode, techFlag, operationFlag, enableFlag, current, pageSize));
+    }
+
+    /**
+     * 查询资质分类列表
+     */
+    @ApiOperation("资质申请-查询")
+    @GetMapping("list")
+    public Result list(@RequestParam(value = "queryCondition",required = false,defaultValue = "") String queryCondition,
+                       @RequestParam(value = "applyStatus",required = false,defaultValue = "0") Integer applyStatus,
+                       @RequestParam(value = "current",required = false,defaultValue = "1") Integer current,
+                       @RequestParam(value = "pageSize",required = false,defaultValue = "10") Integer pageSize){
+        return Result.ok(qualificationApplyService.list(queryCondition,applyStatus,current,pageSize));
+    }
+
+    /**
+     * 资质申请新增
+     */
+    @ApiOperation("资质申请-新增")
+    @PostMapping("add")
+    public Result add(@RequestBody QualificationApplyRequest request){
+        qualificationApplyService.add(request);
+        return Result.ok();
+    }
+
+    /**
+     * 资质申请修改
+     */
+    @ApiOperation("资质申请-修改")
+    @PostMapping("edit")
+    public Result edit(@RequestParam(value = "applyType",required = true) Integer applyStatus,
+                       @RequestBody QualificationApply request){
+        request.setApplyStatus(applyStatus);
+        qualificationApplyService.edit(request);
+        return Result.ok();
+    }
+
+    /**
+     * 资质申请撤回
+     */
+    @ApiOperation("资质申请-撤回")
+    @PostMapping("withdraw")
+    public Result withdraw(@RequestParam Integer id){
+        qualificationApplyService.withdraw(id);
+        return Result.ok();
+    }
+
+    /**
+     * 资质申请删除
+     */
+    @ApiOperation("资质申请-删除")
+    @PostMapping("delete")
+    public Result delete(@RequestParam Integer id){
+        qualificationApplyService.delete(id);
+        return Result.ok();
+    }
+}

+ 60 - 0
src/main/java/com/kcim/controller/QualificationAuditController.java

@@ -0,0 +1,60 @@
+package com.kcim.controller;
+
+import com.kcim.controller.request.QualificationAuditRequest;
+import com.kcim.dao.model.QualificationApply;
+import com.kcim.service.QualificationAuditService;
+import com.kcim.util.Result;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/qualificationAudit")
+public class QualificationAuditController {
+
+    @Autowired
+    private QualificationAuditService qualificationAuditService;
+
+    /**
+     * 资质审批查询
+     */
+    @ApiOperation("资质审批-查询")
+    @GetMapping("list")
+    public Result list(@RequestParam(value = "role",required = true) Integer role,
+                       @RequestParam(value = "queryCondition",required = false,defaultValue = "") String queryCondition,
+                       @RequestParam(value = "current",required = false,defaultValue = "1") Integer current,
+                       @RequestParam(value = "pageSize",required = false,defaultValue = "10") Integer pageSize){
+        return Result.ok(qualificationAuditService.list(role,queryCondition,current,pageSize));
+    }
+
+    /**
+     * 资质审批-保存
+     */
+    @ApiOperation("资质审批-保存")
+    @PostMapping("save")
+    public Result save(@RequestBody QualificationAuditRequest request){
+        qualificationAuditService.save(request);
+        return Result.ok();
+    }
+
+    /**
+     * 资质批量-保存
+     */
+    @ApiOperation("资质批量授权")
+    @PostMapping("saveBatch")
+    public Result saveBatch(@RequestBody List<QualificationApply> request){
+        qualificationAuditService.saveBatch(request);
+        return Result.ok();
+    }
+
+    /**
+     * 资质批量-校验
+     */
+    @ApiOperation("资质批量授权校验")
+    @PostMapping("saveBatchCheck")
+    public Result saveBatchCheck(@RequestBody List<QualificationApply> request){
+        return Result.ok(qualificationAuditService.saveBatchCheck(request));
+    }
+}

+ 2 - 2
src/main/java/com/kcim/controller/QualificationController.java

@@ -49,7 +49,7 @@ public class QualificationController {
 
     @ApiOperation("资质分类字典-删除")
     @PostMapping("deleteQualificationType")
-    public Result deleteQualificationType(@RequestBody Integer id){
+    public Result deleteQualificationType(@RequestParam Integer id){
         qualificationService.deleteQualificationType(id);
         return Result.ok();
     }
@@ -86,7 +86,7 @@ public class QualificationController {
 
     @ApiOperation("资质字典-删除")
     @PostMapping("deleteQualification")
-    public Result deleteQualification(@RequestBody Integer id){
+    public Result deleteQualification(@RequestParam Integer id){
         qualificationService.deleteQualification(id);
         return Result.ok();
     }

+ 160 - 0
src/main/java/com/kcim/controller/QualificationManageController.java

@@ -0,0 +1,160 @@
+package com.kcim.controller;
+
+import com.kcim.controller.request.QualificationAuditRequest;
+import com.kcim.controller.request.QualificationManageAdjustRequest;
+import com.kcim.controller.request.QualificationReAuthorizeRequest;
+import com.kcim.dao.model.DoctorAttachment;
+import com.kcim.service.QualificationManageService;
+import com.kcim.util.Result;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping("/qualificationManage")
+public class QualificationManageController {
+
+    @Autowired
+    private QualificationManageService qualificationManageService;
+
+    /**
+     * 资质授权查询
+     */
+    @ApiOperation("资质授权-查询")
+    @GetMapping("listByQualification")
+    public Result listByQualification(@RequestParam(value = "name", required = false) String name,
+                                      @RequestParam(value = "qualificationTypeCode", required = false, defaultValue = "0") String qualificationTypeCode,
+                                      @RequestParam(value = "operationLevelCode", required = false) String operationLevelCode,
+                                      @RequestParam(value = "techFlag", required = false) Integer techFlag,
+                                      @RequestParam(value = "operationFlag", required = false) Integer operationFlag,
+                                      @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
+                                      @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize){
+        return Result.ok(qualificationManageService.listByQualification(name,qualificationTypeCode,operationLevelCode,techFlag,operationFlag,current,pageSize));
+    }
+
+    /**
+     * 医师授权查询
+     */
+    @ApiOperation("医师授权-查询")
+    @GetMapping("listByDoctor")
+    public Result listByDoctor(@RequestParam(value = "deptCode", required = false) String deptCode,
+                               @RequestParam(value = "userName", required = false) String userName,
+                               @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
+                               @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize){
+        return Result.ok(qualificationManageService.listByDoctor(deptCode,userName,current,pageSize));
+    }
+
+    /**
+     * 查询所有有效授权
+     */
+    @ApiOperation("有效授权-查询")
+    @GetMapping("listAvailableQualification")
+    public Result listAvailableQualification(@RequestParam(value = "queryCondition",required = false) String queryCondition,
+                                             @RequestParam(value = "expireDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date expireDate,
+                                             @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
+                                             @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize){
+        return Result.ok(qualificationManageService.listAvailableQualification(queryCondition,expireDate,current,pageSize));
+    }
+
+    /**
+     * 查询我的所有有效资质
+     */
+    @ApiOperation("登录人资质-查询")
+    @GetMapping("listMyAvailableQualification")
+    public Result listMyAvailableQualification(@RequestParam(value = "qualificationName", required = false) String qualificationName,
+                                               @RequestParam(value = "operationLevelCode", required = false) String operationLevelCode,
+                                               @RequestParam(value = "techFlag", required = false) Integer techFlag,
+                                               @RequestParam(value = "operationFlag", required = false) Integer operationFlag,
+                                               @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
+                                               @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize){
+        return Result.ok(qualificationManageService.listMyAvailableQualification(qualificationName,operationLevelCode,techFlag,operationFlag,current,pageSize));
+    }
+
+    /**
+     * 授权管理-调整
+     */
+    @ApiOperation("授权管理-调整")
+    @PostMapping("adjust")
+    public Result adjust(@RequestBody QualificationManageAdjustRequest request){
+        qualificationManageService.adjust(request);
+        return Result.ok();
+    }
+
+    /**
+     * 授权管理-批量调整
+     */
+    @ApiOperation("授权管理-批量调整")
+    @PostMapping("adjustBatch")
+    public Result adjustBatch(@RequestBody List<QualificationManageAdjustRequest> request){
+        qualificationManageService.adjustBatch(request);
+        return Result.ok();
+    }
+
+    /**
+     * 授权管理-调整
+     */
+    @ApiOperation("授权管理-重新授权")
+    @PostMapping("reAuthorize")
+    public Result reAuthorize(@RequestBody QualificationReAuthorizeRequest request){
+        qualificationManageService.reAuthorize(request);
+        return Result.ok();
+    }
+
+    /**
+     * 科室信息查询
+     */
+    @ApiOperation("科室信息-查询")
+    @GetMapping("listAllDepartment")
+    public Result listAllDepartment(@RequestParam(value = "queryCondition", required = false) String queryCondition){
+        return Result.ok(qualificationManageService.listAllDepartment(queryCondition));
+    }
+
+    /**
+     * 医师信息查询
+     */
+    @ApiOperation("医师信息-查询")
+    @GetMapping("listAllDoctor")
+    public Result listAllDoctor(@RequestParam(value = "queryCondition", required = false) String queryCondition){
+        return Result.ok(qualificationManageService.listAllDoctor(queryCondition));
+    }
+
+    /**
+     * 获取当前登录人的信息
+     */
+    @ApiOperation("登录人信息-查询")
+    @GetMapping("getMyInfo")
+    public Result getMyInfo() {
+        return Result.ok(qualificationManageService.getMyInfo());
+    }
+
+    /**
+     * 保存当前登录人的附件
+     */
+    @ApiOperation("登录人附件-保存")
+    @PostMapping("saveDoctorAttachment")
+    public Result saveDoctorAttachment(@RequestBody DoctorAttachment doctorAttachments){
+        return Result.ok(qualificationManageService.saveDoctorAttachment(doctorAttachments));
+    }
+
+    /**
+     * 编辑当前登录人的附件
+     */
+    @ApiOperation("登录人附件-编辑")
+    @PostMapping("editDoctorAttachment")
+    public Result editDoctorAttachment(@RequestBody DoctorAttachment doctorAttachments){
+        return Result.ok(qualificationManageService.editDoctorAttachment(doctorAttachments));
+    }
+
+    /**
+     * 删除当前登录人的附件
+     */
+    @ApiOperation("登录人附件-删除")
+    @PostMapping("deleteDoctorAttachment")
+    public Result deleteDoctorAttachment(@RequestParam(value = "id") Integer id){
+        return Result.ok(qualificationManageService.deleteDoctorAttachment(id));
+    }
+}

+ 27 - 0
src/main/java/com/kcim/controller/request/QualificationApplyRequest.java

@@ -0,0 +1,27 @@
+package com.kcim.controller.request;
+
+import com.kcim.dao.model.Qualification;
+import com.kcim.dao.model.QualificationApplyAttachment;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QualificationApplyRequest {
+
+    /**
+     * 申请id
+     */
+    private Integer id;
+
+    /**
+     * 提交类型 1暂存 2提交
+     */
+    private Integer addType;
+
+    private List<Qualification> qualificationList;
+
+    private String applyMemo;
+
+    private List<QualificationApplyAttachment> applyAttachment;
+}

+ 25 - 0
src/main/java/com/kcim/controller/request/QualificationAuditRequest.java

@@ -0,0 +1,25 @@
+package com.kcim.controller.request;
+
+import com.kcim.vo.QualificationAuditVO;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QualificationAuditRequest {
+
+    /**
+     * 角色 1科主任 2医务部 3院领导
+     */
+    private Integer role;
+
+    /**
+     * 1通过 2驳回
+     */
+    private Integer auditType;
+
+    /**
+     * 审批信息
+     */
+    private List<QualificationAuditVO> auditInfo;
+}

+ 2 - 2
src/main/java/com/kcim/controller/request/QualificationHisItemMapRequest.java

@@ -8,7 +8,7 @@ import java.util.List;
 @Data
 public class QualificationHisItemMapRequest {
 
-    public Integer qualificationId;
+    private Integer qualificationId;
 
-    public List<QualificationHisItem> qualificationHisItemMap;
+    private List<QualificationHisItem> qualificationHisItemMap;
 }

+ 33 - 0
src/main/java/com/kcim/controller/request/QualificationManageAdjustRequest.java

@@ -0,0 +1,33 @@
+package com.kcim.controller.request;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class QualificationManageAdjustRequest {
+
+    /**
+     * 资质申请id
+     */
+    private Integer qualificationApplyId;
+    /**
+     * 授权期限 1长期授权 2临时授权 3单次授权
+     */
+    private Integer qualificationPeriod;
+    /**
+     * 授权开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date beginDate;
+    /**
+     * 授权结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+    /**
+     * 调整说明
+     */
+    private String memo;
+}

+ 33 - 0
src/main/java/com/kcim/controller/request/QualificationReAuthorizeRequest.java

@@ -0,0 +1,33 @@
+package com.kcim.controller.request;
+
+import cn.hutool.core.date.DateTime;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+@Data
+public class QualificationReAuthorizeRequest {
+
+    /**
+     * 授权申请id
+     */
+    private Integer QualificationApplyId;
+
+    /**
+     * 授权期限 1长期授权 2临时授权 3单次授权
+     */
+    private Integer qualificationPeriod;
+
+    /**
+     * 授权开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private DateTime beginDate;
+
+    /**
+     * 授权结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private DateTime endDate;
+
+    private String memo;
+}

+ 14 - 0
src/main/java/com/kcim/controller/response/MyQualification.java

@@ -0,0 +1,14 @@
+package com.kcim.controller.response;
+
+import com.kcim.dao.model.Qualification;
+import com.kcim.dao.model.QualificationApply;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class MyQualification {
+    private Qualification qualification;
+
+    private List<QualificationApply> applyList;
+}

+ 17 - 0
src/main/java/com/kcim/controller/response/QualificationManage.java

@@ -0,0 +1,17 @@
+package com.kcim.controller.response;
+
+import com.kcim.dao.model.Qualification;
+import com.kcim.dao.model.QualificationApply;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QualificationManage {
+
+   private Qualification qualification;
+
+    private String doctorList;
+
+    private List<QualificationApply> applyList;
+}

+ 17 - 0
src/main/java/com/kcim/controller/response/QualificationManageForDoctor.java

@@ -0,0 +1,17 @@
+package com.kcim.controller.response;
+
+import com.kcim.dao.model.QualificationApply;
+import com.kcim.dao.model.UserInfo;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QualificationManageForDoctor {
+
+    private UserInfo userInfo;
+
+    private String qualificationList;
+
+    private List<QualificationApply> applyList;
+}

+ 9 - 0
src/main/java/com/kcim/dao/mapper/DepartmentMapper.java

@@ -0,0 +1,9 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.Department;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DepartmentMapper extends BaseMapper<Department> {
+}

+ 10 - 0
src/main/java/com/kcim/dao/mapper/DoctorAttachmentMapper.java

@@ -0,0 +1,10 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.DoctorAttachment;
+import com.kcim.dao.model.UserInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DoctorAttachmentMapper extends BaseMapper<DoctorAttachment> {
+}

+ 9 - 0
src/main/java/com/kcim/dao/mapper/QualificationApplyAdjustMapper.java

@@ -0,0 +1,9 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.QualificationApplyAdjust;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface QualificationApplyAdjustMapper extends BaseMapper<QualificationApplyAdjust> {
+}

+ 9 - 0
src/main/java/com/kcim/dao/mapper/QualificationApplyAttachmentMapper.java

@@ -0,0 +1,9 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.QualificationApplyAttachment;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface QualificationApplyAttachmentMapper extends BaseMapper<QualificationApplyAttachment> {
+}

+ 11 - 0
src/main/java/com/kcim/dao/mapper/QualificationApplyMapper.java

@@ -0,0 +1,11 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.Qualification;
+import com.kcim.dao.model.QualificationApply;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface QualificationApplyMapper extends BaseMapper<QualificationApply> {
+
+}

+ 9 - 0
src/main/java/com/kcim/dao/mapper/SysDictionaryMapper.java

@@ -0,0 +1,9 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.SysDictionary;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysDictionaryMapper extends BaseMapper<SysDictionary> {
+}

+ 12 - 0
src/main/java/com/kcim/dao/mapper/UserInfoMapper.java

@@ -0,0 +1,12 @@
+package com.kcim.dao.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.Qualification;
+import com.kcim.dao.model.UserInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface UserInfoMapper extends BaseMapper<UserInfo> {
+
+}

+ 39 - 0
src/main/java/com/kcim/dao/model/Department.java

@@ -0,0 +1,39 @@
+package com.kcim.dao.model;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("med_department")
+public class Department implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId
+    private Integer id;
+
+    private String code;
+
+    private String parentCode;
+
+    private String name;
+
+    @TableField(exist = false)
+    @JsonIgnore
+    private String filter;
+
+    @TableField(exist = false)
+    private List<Department> children;
+}

+ 31 - 0
src/main/java/com/kcim/dao/model/DoctorAttachment.java

@@ -1,5 +1,6 @@
 package com.kcim.dao.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -7,7 +8,10 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.util.Date;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonGetter;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.kcim.constants.NumberConstant;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -49,6 +53,33 @@ public class DoctorAttachment implements Serializable {
 	 * 附件说明
 	 */
 	private String description;
+
+	/**
+	 * 启用日期
+	 */
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date activeDate;
+
+	/**
+	 * 到期日期
+	 */
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date expireDate;
+
+	@TableField(exist = false)
+	private Integer validFlag;
+
+	@JsonGetter("validFlag")
+	public Integer getValidFlag() {
+		if(activeDate == null || expireDate == null) {
+			return 0;
+		}
+		if(activeDate.before(new Date()) && expireDate.after(new Date())) {
+			return 1;
+		}
+		return 0;
+	}
+
 	/**
 	 * 医院id
 	 */

+ 24 - 0
src/main/java/com/kcim/dao/model/Qualification.java

@@ -1,5 +1,6 @@
 package com.kcim.dao.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -12,6 +13,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
+import org.springframework.boot.context.properties.bind.DefaultValue;
 
 /**
  * 资质字典表
@@ -40,6 +42,18 @@ public class Qualification implements Serializable {
 	 * 资质分类编码
 	 */
 	private String qualificationTypeCode;
+
+	/**
+	 * 资质分类编码,含递归的上级编码,用|分割
+	 */
+	@TableField(exist = false)
+	private String fullQualificationTypeCode;
+
+	/**
+	 * 资质分类名称
+	 */
+	@TableField(exist = false)
+	private String qualificationTypeName;
 	/**
 	 * 资质名称
 	 */
@@ -60,6 +74,10 @@ public class Qualification implements Serializable {
 	 * 手术级别code
 	 */
 	private String operationLevelCode;
+
+	@TableField(exist = false)
+	private String operationLevelName;
+
 	/**
 	 * 创建人
 	 */
@@ -93,6 +111,7 @@ public class Qualification implements Serializable {
 	/**
 	 * 医院id
 	 */
+	@JsonIgnore
 	private Long hospId;
 	/**
 	 * 启用标志 0 停用 1 启用
@@ -105,4 +124,9 @@ public class Qualification implements Serializable {
 	@TableLogic(value = "0",delval = "1")
 	private Integer delFlag;
 
+	/**
+	 * 可勾选 0不可勾选 1可勾选
+	 */
+	@TableField(exist = false)
+	private Integer allowCheck = 1;
 }

+ 77 - 2
src/main/java/com/kcim/dao/model/QualificationApply.java

@@ -1,13 +1,23 @@
 package com.kcim.dao.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.Temporal;
 import java.util.Date;
+import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonGetter;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.kcim.constants.NumberConstant;
+import com.kcim.vo.UserInfoVO;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -48,6 +58,7 @@ public class QualificationApply implements Serializable {
 	/**
 	 * 申请授权时间
 	 */
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
 	private Date applyDate;
 	/**
 	 * 申请备注
@@ -56,10 +67,12 @@ public class QualificationApply implements Serializable {
 	/**
 	 * 授权开始时间
 	 */
+	@JsonFormat(pattern = "yyyy-MM-dd")
 	private Date beginDate;
 	/**
 	 * 授权结束时间
 	 */
+	@JsonFormat(pattern = "yyyy-MM-dd")
 	private Date endDate;
 	/**
 	 * 科主任审批意见
@@ -74,9 +87,51 @@ public class QualificationApply implements Serializable {
 	 */
 	private String masterOpinion;
 	/**
-	 * 申请状态 1草稿 2待科主任审核 3待医务部审核 4待院长审核 5审核通过 6驳回
+	 * 申请状态: 1草稿 2待科主任审核 3待医务部审核 4待院长审核 5审核通过 6驳回
 	 */
 	private Integer applyStatus;
+
+	@TableField(exist = false)
+	private String currentStatus;
+
+	@JsonGetter("currentStatus")
+	public String getCurrentStatus() {
+		if(applyStatus ==null || !applyStatus.equals(NumberConstant.FIVE)){
+			return "";
+		}
+		else{
+			if(beginDate==null || endDate==null){
+				return "";
+			}
+			else{
+				if(beginDate.before(new Date()) && endDate.after(new Date())){
+					return "授权中";
+				}
+				else{
+					return "已过期";
+				}
+			}
+		}
+	}
+
+	/**
+	 * 距离到期天数
+	 */
+	@TableField(exist = false)
+	private Integer daysToExpire;
+
+	@JsonGetter("daysToExpire")
+	public Integer getDaysToExpire() {
+		if(getCurrentStatus().equals("授权中")){
+			LocalDate now = LocalDate.now();
+			LocalDate endDate = getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+			return Math.toIntExact(ChronoUnit.DAYS.between(now, endDate));
+		}
+		else {
+			return -1;
+		}
+	}
+
 	/**
 	 * 医院id
 	 */
@@ -119,4 +174,24 @@ public class QualificationApply implements Serializable {
 	@TableLogic(value = "0",delval = "1")
 	private Integer delFlag;
 
-}
+	@TableField(exist = false)
+	private UserInfo userInfo;
+
+	@TableField(exist = false)
+	private List<DoctorAttachment> userAttachment;
+
+	@TableField(exist = false)
+	private Qualification qualificationInfo;
+
+	@TableField(exist = false)
+	private List<QualificationApplyAttachment> applyAttachment;
+
+	@TableField(exist = false)
+	private List<QualificationApplyAdjust> applyAdjust;
+
+	/**
+	 * 允许重新授权标志
+	 */
+	@TableField(exist = false)
+	private Integer allowReAuthorize = NumberConstant.ZERO;
+}

+ 19 - 0
src/main/java/com/kcim/dao/model/QualificationApplyAdjust.java

@@ -1,5 +1,6 @@
 package com.kcim.dao.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -7,6 +8,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.util.Date;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonGetter;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -40,7 +43,11 @@ public class QualificationApplyAdjust implements Serializable {
 	/**
 	 * 调整人id
 	 */
+	@JsonIgnore
 	private Long userId;
+
+	@TableField(exist = false)
+	private String adjustUserName;
 	/**
 	 * 调整前授权期限 1长期授权 2临时授权 3单次授权
 	 */
@@ -52,18 +59,22 @@ public class QualificationApplyAdjust implements Serializable {
 	/**
 	 * 调整前开始时间
 	 */
+	@JsonFormat(pattern = "yyyy-MM-dd")
 	private Date beginDateBefore;
 	/**
 	 * 调整后开始时间
 	 */
+	@JsonFormat(pattern = "yyyy-MM-dd")
 	private Date beginDateAfter;
 	/**
 	 * 调整前截止时间
 	 */
+	@JsonFormat(pattern = "yyyy-MM-dd")
 	private Date endDateBefore;
 	/**
 	 * 调整后截止时间
 	 */
+	@JsonFormat(pattern = "yyyy-MM-dd")
 	private Date endDateAfter;
 	/**
 	 * 调整原因
@@ -111,4 +122,12 @@ public class QualificationApplyAdjust implements Serializable {
 	@JsonIgnore
 	private Long hospId;
 
+	@TableField(exist = false)
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+	private Date adjustTime;
+
+	@JsonGetter("adjustTime")
+	public Date getAdjustTime() {
+		return this.createTime;
+	}
 }

+ 19 - 1
src/main/java/com/kcim/dao/model/QualificationType.java

@@ -1,11 +1,13 @@
 package com.kcim.dao.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.AllArgsConstructor;
@@ -93,4 +95,20 @@ public class QualificationType implements Serializable {
 	@JsonIgnore
 	@TableLogic(value = "0",delval = "1")
 	private Integer delFlag;
-}
+
+	/**
+	 * 下级节点
+	 */
+	@TableField(exist = false)
+	private List<QualificationType> children;
+
+	/**
+	 * 过滤内容,把所有递归下级需要被过滤的内容拼到这里,用逗号分割,实现搜索这个列就可以搜到递归的所有下级的效果
+	 */
+	@TableField(exist = false)
+	@JsonIgnore
+	private String filter;
+
+	@TableField(exist = false)
+	private Integer allowDelete = 1;
+}

+ 24 - 0
src/main/java/com/kcim/dao/model/SysDictionary.java

@@ -0,0 +1,24 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("sys_dictionary")
+public class SysDictionary implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String type;
+
+    private String code;
+
+    private String name;
+}

+ 13 - 0
src/main/java/com/kcim/dao/model/UserInfo.java

@@ -1,9 +1,11 @@
 package com.kcim.dao.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.AllArgsConstructor;
@@ -11,6 +13,8 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
+import javax.print.Doc;
+
 /**
  * VIEW
  * 
@@ -43,6 +47,10 @@ public class UserInfo implements Serializable {
 	 * 
 	 */
 	private String gender;
+	/**
+	 *
+	 */
+	private String deptCode;
 	/**
 	 * 
 	 */
@@ -75,10 +83,15 @@ public class UserInfo implements Serializable {
 	 * 
 	 */
 	private String major;
+
+	private String avatarUrl;
+
 	/**
 	 * 医院id
 	 */
 	@JsonIgnore
 	private Long hospId;
 
+	@TableField(exist = false)
+	private List<DoctorAttachment> attachments;
 }

+ 20 - 0
src/main/java/com/kcim/dao/repository/DepartmentRepository.java

@@ -0,0 +1,20 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.dao.mapper.DepartmentMapper;
+import com.kcim.dao.model.Department;
+import com.kcim.dao.model.UserInfo;
+import com.kcim.util.BaseUtil;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public class DepartmentRepository extends ServiceImpl<DepartmentMapper, Department> {
+
+    public List<Department> list() {
+        LambdaQueryWrapper<Department> queryWrapper = new LambdaQueryWrapper<>();
+        return this.list(queryWrapper);
+    }
+}

+ 23 - 0
src/main/java/com/kcim/dao/repository/DoctorAttachmentRepository.java

@@ -0,0 +1,23 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.constants.NumberConstant;
+import com.kcim.dao.mapper.DoctorAttachmentMapper;
+import com.kcim.dao.model.DoctorAttachment;
+import com.kcim.util.BaseUtil;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public class DoctorAttachmentRepository extends ServiceImpl<DoctorAttachmentMapper, DoctorAttachment> {
+
+    public List<DoctorAttachment> listByUserId(Long userId) {
+        LambdaQueryWrapper<DoctorAttachment> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DoctorAttachment::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(DoctorAttachment::getUserId, userId);
+        queryWrapper.eq(DoctorAttachment::getDelFlag, NumberConstant.ZERO);
+        return this.list(queryWrapper);
+    }
+}

+ 8 - 5
src/main/java/com/kcim/dao/repository/HisItemDicRepository.java

@@ -9,6 +9,7 @@ import com.kcim.dao.model.HisItemDic;
 
 import com.kcim.util.BaseUtil;
 import org.springframework.stereotype.Repository;
+import org.springframework.util.StringUtils;
 
 @Repository
 public class HisItemDicRepository extends ServiceImpl<HisItemDicMapper, HisItemDic> {
@@ -19,11 +20,13 @@ public class HisItemDicRepository extends ServiceImpl<HisItemDicMapper, HisItemD
         queryWrapper.eq(HisItemDic::getHospId, BaseUtil.getCurrentLoginHospId());
         queryWrapper.eq(HisItemDic::getDelFlag, NumberConstant.ZERO);
 
-        queryWrapper.like(HisItemDic::getHisItemType, queryCondition)
-                    .or()
-                    .like(HisItemDic::getHisItemName, queryCondition)
-                    .or()
-                    .like(HisItemDic::getMemo, queryCondition);
+        if(!StringUtils.isEmpty(queryCondition)) {
+            queryWrapper.like(HisItemDic::getHisItemType, queryCondition)
+                        .or()
+                        .like(HisItemDic::getHisItemName, queryCondition)
+                        .or()
+                        .like(HisItemDic::getMemo, queryCondition);
+        }
 
         Page<HisItemDic> page = new Page<>(current,pageSize);
         return  this.page(page,queryWrapper);

+ 25 - 0
src/main/java/com/kcim/dao/repository/QualificationApplyAdjustRepository.java

@@ -0,0 +1,25 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.constants.NumberConstant;
+import com.kcim.dao.mapper.QualificationApplyAdjustMapper;
+import com.kcim.dao.model.QualificationApply;
+import com.kcim.dao.model.QualificationApplyAdjust;
+import com.kcim.util.BaseUtil;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public class QualificationApplyAdjustRepository extends ServiceImpl<QualificationApplyAdjustMapper, QualificationApplyAdjust> {
+
+    public List<QualificationApplyAdjust> listByApplyId(Integer applyId) {
+        LambdaQueryWrapper<QualificationApplyAdjust> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApplyAdjust::getQualificationApplyId, applyId);
+        queryWrapper.eq(QualificationApplyAdjust::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApplyAdjust::getDelFlag, NumberConstant.ZERO);
+        queryWrapper.orderByDesc(QualificationApplyAdjust::getCreateTime);
+        return this.list(queryWrapper);
+    }
+}

+ 50 - 0
src/main/java/com/kcim/dao/repository/QualificationApplyAttachmentRepository.java

@@ -0,0 +1,50 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.constants.NumberConstant;
+import com.kcim.dao.mapper.QualificationApplyAttachmentMapper;
+import com.kcim.dao.model.DoctorAttachment;
+import com.kcim.dao.model.Qualification;
+import com.kcim.dao.model.QualificationApplyAttachment;
+import com.kcim.util.BaseUtil;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+import java.util.List;
+
+@Repository
+public class QualificationApplyAttachmentRepository extends ServiceImpl<QualificationApplyAttachmentMapper, QualificationApplyAttachment> {
+
+    public List<QualificationApplyAttachment> listByApplyId(Integer applyId) {
+        LambdaQueryWrapper<QualificationApplyAttachment> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApplyAttachment::getQualificationApplyId, applyId);
+        queryWrapper.eq(QualificationApplyAttachment::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApplyAttachment::getDelFlag, NumberConstant.ZERO);
+        return this.list(queryWrapper);
+    }
+
+    public void add(QualificationApplyAttachment attachment) {
+
+        QualificationApplyAttachment newAttachment = new QualificationApplyAttachment();
+
+        newAttachment.setQualificationApplyId(attachment.getQualificationApplyId());
+        newAttachment.setFileName(attachment.getFileName());
+        newAttachment.setUrl(attachment.getUrl());
+
+        newAttachment.setCreateTime(new Date());
+        newAttachment.setCreateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+        newAttachment.setHospId(BaseUtil.getCurrentLoginHospId());
+
+        this.save(newAttachment);
+    }
+
+    public void deleteByApplyId(Integer applyId) {
+        LambdaQueryWrapper<QualificationApplyAttachment> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApplyAttachment::getQualificationApplyId, applyId);
+        queryWrapper.eq(QualificationApplyAttachment::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApplyAttachment::getDelFlag, NumberConstant.ZERO);
+        this.remove(queryWrapper);
+    }
+}

+ 381 - 0
src/main/java/com/kcim/dao/repository/QualificationApplyRepository.java

@@ -0,0 +1,381 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.constants.NumberConstant;
+import com.kcim.controller.response.MyQualification;
+import com.kcim.dao.mapper.QualificationApplyMapper;
+import com.kcim.dao.model.*;
+import com.kcim.util.BaseUtil;
+import com.kcim.util.PageUtils;
+import lombok.val;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.StringUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Repository
+public class QualificationApplyRepository extends ServiceImpl<QualificationApplyMapper, QualificationApply> {
+
+    @Autowired
+    QualificationApplyAttachmentRepository applyAttachmentRepository;
+
+    @Autowired
+    QualificationApplyAdjustRepository applyAdjustRepository;
+
+    @Autowired
+    QualificationRepository qualificationRepository;
+
+    @Autowired
+    UserInfoRepository userInfoRepository;
+
+    @Autowired
+    SysDictionaryRepository sysDictionaryRepository;
+
+    @Autowired
+    QualificationTypeRepository qualificationTypeRepository;
+
+    public Page<QualificationApply> getPage(Integer current, Integer pageSize, LambdaQueryWrapper<QualificationApply> queryWrapper) {
+        Page<QualificationApply> page = new Page<>(current,pageSize);
+        return  this.page(page,queryWrapper);
+    }
+
+    public List<QualificationApply> listByCurrentUser(){
+        LambdaQueryWrapper<QualificationApply> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApply::getUserId, BaseUtil.getCurrentUser().getId());
+        queryWrapper.eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApply::getDelFlag, NumberConstant.ZERO);
+        return this.list(queryWrapper);
+    }
+
+    /**
+     * 科主任待审批列表
+     */
+    public List<QualificationApply> listByDeptDirector(){
+        //ApplyStatus 当前状态 1草稿 2待科主任审核 3待医务部审核 4待院长审核 5审核通过 6驳回
+
+        LambdaQueryWrapper<QualificationApply> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApply::getDelFlag, NumberConstant.ZERO);
+        queryWrapper.eq(QualificationApply::getApplyStatus, NumberConstant.TWO);
+
+        return this.list(queryWrapper);
+    }
+
+    /**
+     * 医务部待审批列表
+     * @return
+     */
+    public List<QualificationApply> listByManager(){
+        LambdaQueryWrapper<QualificationApply> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApply::getApplyStatus, NumberConstant.THREE);
+        queryWrapper.eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApply::getDelFlag, NumberConstant.ZERO);
+        return this.list(queryWrapper);
+    }
+
+    /**
+     * 院领导待审批列表
+     * @return
+     */
+    public List<QualificationApply> listByMaster(){
+        LambdaQueryWrapper<QualificationApply> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApply::getApplyStatus, NumberConstant.FOUR);
+        queryWrapper.eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApply::getDelFlag, NumberConstant.ZERO);
+        return this.list(queryWrapper);
+    }
+
+    public void add(QualificationApply request) {
+
+        //申请
+        this.save(request);
+
+        //申请附件
+        for(QualificationApplyAttachment attachment: request.getApplyAttachment()){
+            attachment.setQualificationApplyId(request.getId());
+            this.applyAttachmentRepository.add(attachment);
+        }
+    }
+
+    public QualificationApply findById(Integer id) {
+        LambdaQueryWrapper<QualificationApply> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApply::getId, id);
+        queryWrapper.eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApply::getDelFlag, NumberConstant.ZERO);
+        return this.getOne(queryWrapper);
+    }
+
+    public void editById(QualificationApply request) {
+        //申请信息
+        QualificationApply old = this.findById(request.getId());
+        old.setApplyStatus(request.getApplyStatus());
+        old.setApplyMemo(request.getApplyMemo());
+        this.updateById(old);
+
+        //附件信息
+        //先删除原有的
+        this.applyAttachmentRepository.deleteByApplyId(request.getId());
+        //再新增
+        for(QualificationApplyAttachment attachment: request.getApplyAttachment()){
+            attachment.setQualificationApplyId(request.getId());
+            this.applyAttachmentRepository.add(attachment);
+        }
+    }
+
+    public void withdrawById(Integer id) {
+        QualificationApply apply = this.getById(id);
+        apply.setApplyStatus(NumberConstant.ONE); //1=草稿
+        apply.setUpdateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+        apply.setUpdateTime(new Date());
+        this.updateById(apply);
+    }
+
+    public void deleteById(Integer id) {
+        //删除申请
+        QualificationApply apply = this.getById(id);
+        apply.setDeleteUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+        apply.setDeleteTime(new Date());
+        this.removeById(id);
+
+        //删除附件
+        this.applyAttachmentRepository.deleteByApplyId(id);
+    }
+
+    /**
+     * 资质管理,按资质查询
+     */
+    public List<QualificationApply> listByQualification()
+    {
+        //用户信息
+        List<UserInfo> userInfos = userInfoRepository.list();
+
+        //ApplyStatus 当前状态 1草稿 2待科主任审核 3待医务部审核 4待院长审核 5审核通过 6驳回
+        LambdaQueryWrapper<QualificationApply> queryWrapper = new LambdaQueryWrapper<>();
+
+        queryWrapper.eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApply::getDelFlag, NumberConstant.ZERO);
+        queryWrapper.eq(QualificationApply::getApplyStatus, NumberConstant.FIVE);
+
+        List<QualificationApply> list = this.list(queryWrapper);
+        for(QualificationApply apply: list){
+
+            //医生信息
+            apply.setUserInfo(userInfos.stream().filter(u -> u.getId().equals(apply.getUserId())).findFirst().orElse(null));
+
+            //资质信息
+            Qualification qualification = qualificationRepository.getByCode(apply.getQualificationCode());
+            //手术级别字典
+            List<SysDictionary> dicOperationLevel = sysDictionaryRepository.listByType("SURGICAL_AND_OPERATIONAL_LEVELS");
+            if(!StringUtils.isEmpty(qualification.getOperationLevelCode())){
+                Optional<SysDictionary> dic = dicOperationLevel.stream()
+                        .filter(d -> d.getCode().equals(qualification.getOperationLevelCode()))
+                        .findFirst();
+                dic.ifPresent(sysDictionary -> qualification.setOperationLevelName(sysDictionary.getName()));
+            }
+            apply.setQualificationInfo(qualification);
+
+            //调整历史
+            apply.setApplyAdjust(applyAdjustRepository.listByApplyId(apply.getId()));
+        }
+
+        list.sort((Comparator.comparing(QualificationApply::getCurrentStatus, Comparator.reverseOrder()).thenComparing(QualificationApply::getApplyDate, Comparator.reverseOrder())));
+        return list;
+    }
+
+    public QualificationApply findByUserIdAndQualificationCode(Long userId,String qualificationCode,Boolean includeDraft){
+        LambdaQueryWrapper<QualificationApply> queryWrapper = new LambdaQueryWrapper<>();
+
+        //当前状态 1草稿 2待科主任审核 3待医务部审核 4待院长审核 5审核通过 6驳回
+        List<Integer> availableApplyStatusList = new ArrayList<>(Arrays.asList(2, 3, 4));
+        if(includeDraft){
+            availableApplyStatusList.add(1);
+        }
+
+        queryWrapper.and(qw -> qw.eq(QualificationApply::getUserId, userId) //申请过程中的,认为存在
+                                 .eq(QualificationApply::getQualificationCode, qualificationCode)
+                                 .eq(QualificationApply::getDelFlag, NumberConstant.ZERO)
+                                 .eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId())
+                                 .in(QualificationApply::getApplyStatus, availableApplyStatusList))
+                    .or(qw -> qw.eq(QualificationApply::getUserId, userId) //已申请成功的,在授权期限内,认为存在
+                                .eq(QualificationApply::getQualificationCode, qualificationCode)
+                                .eq(QualificationApply::getDelFlag, NumberConstant.ZERO)
+                                .eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId())
+                                .eq(QualificationApply::getApplyStatus, NumberConstant.FIVE)
+                                .ge(QualificationApply::getEndDate,new Date())
+                                .le(QualificationApply::getBeginDate,new Date())
+                    );
+        return this.list(queryWrapper).stream().findFirst().orElse(null); //TODO 可能取到多个
+    }
+
+    public QualificationApply findByUserIdAndQualificationCode(Long userId,String qualificationCode){
+        return findByUserIdAndQualificationCode(userId,qualificationCode,false);
+    }
+
+    public QualificationApply findDraftByUserIdAndQualificationCode(Long userId,String qualificationCode){
+        LambdaQueryWrapper<QualificationApply> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApply::getUserId, userId);
+        queryWrapper.eq(QualificationApply::getQualificationCode, qualificationCode);
+        queryWrapper.eq(QualificationApply::getDelFlag, NumberConstant.ZERO);
+        queryWrapper.eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApply::getApplyStatus, NumberConstant.ONE); //草稿
+
+        return this.list(queryWrapper).stream().findFirst().orElse(null); //TODO 可能取到多个
+    }
+
+    /**
+     *
+     */
+    public List<QualificationApply> listAvailableByUserIdAndQualificationCode(Long userId, String qualificationCode){
+        LambdaQueryWrapper<QualificationApply> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApply::getUserId, userId);
+        queryWrapper.eq(QualificationApply::getQualificationCode, qualificationCode);
+        queryWrapper.eq(QualificationApply::getApplyStatus, NumberConstant.FIVE);
+        queryWrapper.eq(QualificationApply::getDelFlag, NumberConstant.ZERO);
+        queryWrapper.eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.orderByDesc(QualificationApply::getApplyDate);
+
+        List<QualificationApply> list = this.list(queryWrapper);
+        for(QualificationApply apply: list){
+            apply.setApplyAdjust(applyAdjustRepository.listByApplyId(apply.getId()));
+        }
+        return list;
+    }
+
+    public PageUtils listAvailableQualification(String queryCondition, Date expireDate, Integer current, Integer pageSize) {
+        LambdaQueryWrapper<QualificationApply> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApply::getDelFlag, NumberConstant.ZERO);
+        queryWrapper.eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApply::getApplyStatus, NumberConstant.FIVE);
+        queryWrapper.le(QualificationApply::getBeginDate, new Date());
+        queryWrapper.ge(QualificationApply::getEndDate, new Date());
+        queryWrapper.le(QualificationApply::getEndDate, expireDate);
+
+        List<QualificationApply> list = this.list(queryWrapper);
+
+        //用户信息
+        List<UserInfo> userInfos = userInfoRepository.list();
+        Map<Long,UserInfo> empMap = userInfos.stream().collect(Collectors.toMap(UserInfo::getId, vo -> vo, (a, b) -> b));
+
+        //资质信息
+        List<Qualification> qualificationList = qualificationRepository.list();
+
+        //资质分类
+        List<QualificationType> qualificationTypeList = qualificationTypeRepository.list();
+
+        for(QualificationApply apply: list){
+            UserInfo userInfo = userInfos.stream().filter(u -> u.getId().equals(apply.getUserId())).findFirst().orElse(null);
+            Qualification qualification = qualificationList.stream().filter(q -> q.getCode().equals(apply.getQualificationCode())).findFirst().orElse(null);
+
+            //资质分类名称
+            if(qualification != null){
+                QualificationType qualificationType = qualificationTypeList.stream().filter(q -> q.getCode().equals(qualification.getQualificationTypeCode())).findFirst().orElse(null);
+                if (qualificationType != null) {
+                    qualification.setQualificationTypeName(qualificationType.getName());
+                }
+            }
+
+            apply.setUserInfo(userInfo);
+            apply.setQualificationInfo(qualification);
+            apply.setApplyAdjust(applyAdjustRepository.listByApplyId(apply.getId()));
+
+            //调整历史-调整人姓名
+            for(QualificationApplyAdjust adjust : apply.getApplyAdjust()){
+                adjust.setAdjustUserName(empMap.get(adjust.getUserId()).getName());
+            }
+        }
+
+        if(!StringUtils.isEmpty(queryCondition)){
+            list = list.stream().filter(a -> a.getUserInfo().getName().contains(queryCondition) ||
+                                             a.getUserInfo().getDeptName().contains(queryCondition) ||
+                                             a.getQualificationInfo().getQualificationTypeName().contains(queryCondition) ||
+                                             a.getQualificationInfo().getName().contains(queryCondition)).collect(Collectors.toList());
+        }
+        return new PageUtils(list,list.size(),pageSize,current);
+    }
+
+    public PageUtils listMyAvailableQualification(String qualificationName, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer current, Integer pageSize)
+    {
+        List<MyQualification> listReturn = new ArrayList<>();
+
+        LambdaQueryWrapper<QualificationApply> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationApply::getDelFlag, NumberConstant.ZERO);
+        queryWrapper.eq(QualificationApply::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationApply::getApplyStatus, NumberConstant.FIVE);
+        queryWrapper.le(QualificationApply::getBeginDate, new Date());
+        queryWrapper.ge(QualificationApply::getEndDate, new Date());
+        queryWrapper.eq(QualificationApply::getUserId, BaseUtil.getCurrentUser().getId());
+        List<QualificationApply> list = this.list(queryWrapper);
+
+        //人员列表
+        List<UserInfo> empList = userInfoRepository.list();
+        Map<Long,UserInfo> empMap = empList.stream().collect(Collectors.toMap(UserInfo::getId, vo -> vo, (a, b) -> b));
+
+        //手术级别名称
+        List<SysDictionary> dicOperationLevel = sysDictionaryRepository.listByType("SURGICAL_AND_OPERATIONAL_LEVELS");
+
+        for(QualificationApply apply: list){
+            //资质信息
+            Qualification qualification = qualificationRepository.getByCode(apply.getQualificationCode());
+
+            //资质名称过滤
+            if(!StringUtils.isEmpty(qualificationName) && !qualification.getName().contains(qualificationName)){
+                continue;
+            }
+
+            //手术标志过滤
+            if(operationFlag !=null && operationFlag.equals(NumberConstant.ONE) && !qualification.getOperationFlag().equals(NumberConstant.ONE)){
+                continue;
+            }
+
+            //手术级别过滤
+            if(!StringUtils.isEmpty(operationLevelCode)){
+                if(qualification.getOperationLevelCode() == null){
+                    continue;
+                }
+                else if(!qualification.getOperationLevelCode().equals(operationLevelCode)){
+                    continue;
+                }
+            }
+
+            //医疗技术标志过滤
+            if(techFlag != null && techFlag.equals(NumberConstant.ONE) && !qualification.getTechFlag().equals(NumberConstant.ONE)){
+                continue;
+            }
+
+            //资质分类名称
+            String typeName = qualificationTypeRepository.getByCode(qualification.getQualificationTypeCode()).getName();
+            qualification.setQualificationTypeName(typeName);
+
+            //手术等级名称
+            if(!StringUtils.isEmpty(qualification.getOperationLevelCode())){
+
+                Optional<SysDictionary> operationLevel = dicOperationLevel.stream().filter(d -> d.getCode().equals(qualification.getOperationLevelCode())).findFirst();
+                if(operationLevel.isPresent()){
+                    qualification.setOperationLevelName(operationLevel.get().getName());
+                }
+            }
+
+            //授权记录
+            List<QualificationApply> applyList = listAvailableByUserIdAndQualificationCode(BaseUtil.getCurrentUser().getId(),qualification.getCode());
+
+            MyQualification myQualification = new MyQualification();
+            myQualification.setQualification(qualification);
+            myQualification.setApplyList(applyList);
+
+            for(QualificationApply a : applyList){
+                //调整历史-调整人姓名
+                for(QualificationApplyAdjust adjust : a.getApplyAdjust()){
+                    adjust.setAdjustUserName(empMap.get(adjust.getUserId()).getName());
+                }
+            }
+
+            listReturn.add(myQualification);
+        }
+
+        return new PageUtils(listReturn,listReturn.size(),pageSize,current);
+    }
+}

+ 45 - 2
src/main/java/com/kcim/dao/repository/QualificationRepository.java

@@ -3,17 +3,60 @@ package com.kcim.dao.repository;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.constants.NumberConstant;
 import com.kcim.dao.mapper.QualificationMapper;
 import com.kcim.dao.model.Qualification;
-import com.kcim.dao.model.Test;
+import com.kcim.dao.model.SysDictionary;
+import com.kcim.util.BaseUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 import org.springframework.util.StringUtils;
 
+import java.util.List;
+import java.util.Optional;
+
 @Repository
 public class QualificationRepository extends ServiceImpl<QualificationMapper, Qualification> {
 
+    @Autowired
+    QualificationTypeRepository qualificationTypeRepository;
+
+    @Autowired
+    SysDictionaryRepository sysDictionaryRepository;
+
     public Page<Qualification> getPage(Integer current, Integer pageSize, LambdaQueryWrapper<Qualification> queryWrapper) {
         Page<Qualification> page = new Page<>(current,pageSize);
         return  this.page(page,queryWrapper);
     }
-}
+
+    public List<Qualification> list(){
+        LambdaQueryWrapper<Qualification> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Qualification::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(Qualification::getDelFlag, NumberConstant.ZERO);
+        List<Qualification> list = this.list(queryWrapper);
+
+        //手术级别名称
+//        List<SysDictionary> dicOperationLevel = sysDictionaryRepository.listByType("SURGICAL_AND_OPERATIONAL_LEVELS");
+//        for (Qualification qualification : list) {
+//            if(!StringUtils.isEmpty(qualification.getOperationLevelCode())){
+//
+//                Optional<SysDictionary> dic = dicOperationLevel.stream()
+//                                                               .filter(d -> d.getCode().equals(qualification.getOperationLevelCode()))
+//                                                               .findFirst();
+//                dic.ifPresent(sysDictionary -> qualification.setOperationLevelName(sysDictionary.getName()));
+//            }
+//        }
+        return list;
+    }
+
+    public Qualification getByCode(String code) {
+        LambdaQueryWrapper<Qualification> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Qualification::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(Qualification::getDelFlag, NumberConstant.ZERO);
+        queryWrapper.eq(Qualification::getCode, code);
+        Qualification qualification = this.getOne(queryWrapper);
+        String typeName = qualificationTypeRepository.getByCode(qualification.getQualificationTypeCode()).getName();
+        qualification.setQualificationTypeName(typeName);
+        return qualification;
+    }
+}

+ 29 - 0
src/main/java/com/kcim/dao/repository/QualificationTypeRepository.java

@@ -1,11 +1,40 @@
 package com.kcim.dao.repository;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.constants.NumberConstant;
 import com.kcim.dao.mapper.QualificationTypeMapper;
+import com.kcim.dao.model.Qualification;
 import com.kcim.dao.model.QualificationType;
+import com.kcim.util.BaseUtil;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public class QualificationTypeRepository extends ServiceImpl<QualificationTypeMapper, QualificationType> {
 
+    public List<QualificationType> getQualificationTypeWithoutRecursion(){
+        LambdaQueryWrapper<QualificationType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationType::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationType::getDelFlag, NumberConstant.ZERO);
+        queryWrapper.orderByAsc(QualificationType::getSort);
+        return this.list(queryWrapper);
+    }
+
+    public QualificationType getByCode(String code) {
+        LambdaQueryWrapper<QualificationType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationType::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationType::getDelFlag, NumberConstant.ZERO);
+        queryWrapper.eq(QualificationType::getCode, code);
+        return this.getOne(queryWrapper);
+    }
+
+    public List<QualificationType> list() {
+        LambdaQueryWrapper<QualificationType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QualificationType::getHospId, BaseUtil.getCurrentLoginHospId());
+        queryWrapper.eq(QualificationType::getDelFlag, NumberConstant.ZERO);
+        queryWrapper.orderByAsc(QualificationType::getSort);
+        return this.list(queryWrapper);
+    }
 }

+ 22 - 0
src/main/java/com/kcim/dao/repository/SysDictionaryRepository.java

@@ -0,0 +1,22 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.dao.mapper.SysDictionaryMapper;
+import com.kcim.dao.mapper.UserInfoMapper;
+import com.kcim.dao.model.SysDictionary;
+import com.kcim.dao.model.UserInfo;
+import com.kcim.util.BaseUtil;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public class SysDictionaryRepository extends ServiceImpl<SysDictionaryMapper, SysDictionary> {
+
+    public List<SysDictionary> listByType(String type) {
+        LambdaQueryWrapper<SysDictionary> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysDictionary::getType, type);
+        return this.list(queryWrapper);
+    }
+}

+ 66 - 0
src/main/java/com/kcim/dao/repository/UserInfoRepository.java

@@ -0,0 +1,66 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.constants.NumberConstant;
+import com.kcim.dao.mapper.QualificationMapper;
+import com.kcim.dao.mapper.UserInfoMapper;
+import com.kcim.dao.model.DoctorAttachment;
+import com.kcim.dao.model.Qualification;
+import com.kcim.dao.model.QualificationApply;
+import com.kcim.dao.model.UserInfo;
+import com.kcim.util.BaseUtil;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+import java.util.List;
+
+@Repository
+public class UserInfoRepository extends ServiceImpl<UserInfoMapper, UserInfo> {
+
+    @Autowired
+    DoctorAttachmentRepository doctorAttachmentRepository;
+
+    public List<UserInfo> list(){
+        LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserInfo::getHospId, BaseUtil.getCurrentLoginHospId());
+        return this.list(queryWrapper);
+    }
+
+    public UserInfo getUserInfoById(Long id){
+        LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserInfo::getId, id);
+        queryWrapper.eq(UserInfo::getHospId, BaseUtil.getCurrentLoginHospId());
+        UserInfo userInfo = this.getOne(queryWrapper);
+
+        //医生附件
+        List<DoctorAttachment> userAttachmentList = doctorAttachmentRepository.listByUserId(userInfo.getId());
+        userInfo.setAttachments(userAttachmentList);
+
+        return userInfo;
+    }
+
+    public UserInfo getCurrentUserInfo(){
+        LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserInfo::getId,BaseUtil.getCurrentUser().getId());
+        queryWrapper.eq(UserInfo::getHospId, BaseUtil.getCurrentLoginHospId());
+        return this.getOne(queryWrapper);
+    }
+
+    public List<UserInfo> listAllDoctor(String queryCondition) {
+        LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
+        if(!StringUtils.isEmpty(queryCondition)){
+            queryWrapper.like(UserInfo::getName, queryCondition)
+                    .or()
+                    .like(UserInfo::getAccount, queryCondition)
+                    .or()
+                    .like(UserInfo::getDeptName, queryCondition);
+        }
+        queryWrapper.eq(UserInfo::getHospId, BaseUtil.getCurrentLoginHospId());
+        return this.list(queryWrapper);
+    }
+}

+ 9 - 0
src/main/java/com/kcim/endpoint/CenterEndPoint.java

@@ -1,5 +1,6 @@
 package com.kcim.endpoint;
 
+import com.kcim.util.Result;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -23,6 +24,14 @@ public interface CenterEndPoint {
     @GetMapping("/api/getUser")
     Object getUserInfo(@RequestParam(required = false,name = "filter") String filter);
 
+    /**
+     * 中台获取用户信息
+     *
+     * @return 用户信息
+     */
+    @GetMapping("/user/getUserByHospId")
+    Result getUserInfo();
+
     @GetMapping("/api/getDict")
     Object getDict(@RequestParam(required = false,name = "dictType")String dictType,
                    @RequestParam(required = false,name="systemId") Long systemId);

+ 41 - 0
src/main/java/com/kcim/exception/MedicalHandler.java

@@ -0,0 +1,41 @@
+package com.kcim.exception;
+
+import cn.dev33.satoken.exception.NotLoginException;
+import com.kcim.util.ErrorResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@Slf4j
+@RestControllerAdvice
+public class MedicalHandler {
+
+    @ExceptionHandler(value = MedicalException.class)
+    public ErrorResult handlerEmosException(MedicalException e) {
+        e.printStackTrace();
+        log.info("GlobalExceptionHandler...");
+        log.info("错误代码:" + e.getMessage());
+        return ErrorResult.errorMsg(500, e.getMessage());
+    }
+
+    @ExceptionHandler(NotLoginException.class)
+    public ErrorResult handlerNotLoginException(NotLoginException nle) {
+        // 不同异常返回不同状态码
+        String message = "";
+        if (nle.getType().equals(NotLoginException.NOT_TOKEN)) {
+            message = "未提供Token";
+        } else if (nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
+            message = "未提供有效的Token";
+        } else if (nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
+            message = "登录信息已过期,请重新登录";
+        } else if (nle.getType().equals(NotLoginException.BE_REPLACED)) {
+            message = "您的账户已在另一台设备上登录,如非本人操作,请立即修改密码";
+        } else if (nle.getType().equals(NotLoginException.KICK_OUT)) {
+            message = "已被系统强制下线";
+        } else {
+            message = "当前会话未登录";
+        }
+        // 返回给前端
+        return ErrorResult.errorMsg(401, message);
+    }
+}

+ 10 - 0
src/main/java/com/kcim/service/CenterService.java

@@ -0,0 +1,10 @@
+package com.kcim.service;
+
+import com.kcim.vo.UserInfoVO;
+
+import java.util.List;
+
+public interface CenterService {
+
+    List<UserInfoVO> getCenterEmployee();
+}

+ 23 - 0
src/main/java/com/kcim/service/QualificationApplyService.java

@@ -0,0 +1,23 @@
+package com.kcim.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.kcim.controller.request.QualificationApplyRequest;
+import com.kcim.dao.model.Qualification;
+import com.kcim.dao.model.QualificationApply;
+
+import java.util.List;
+
+public interface QualificationApplyService extends IService<QualificationApply> {
+
+    Object list(String queryCondition,Integer applyStatus,  Integer current, Integer pageSize);
+
+    void add(QualificationApplyRequest request);
+
+    void edit(QualificationApply apply);
+
+    void withdraw(Integer id);
+
+    void delete(Integer id);
+
+    Object getQualificationList(String name, String qualificationTypeCode, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer enableFlag, Integer current, Integer pageSize);
+}

+ 18 - 0
src/main/java/com/kcim/service/QualificationAuditService.java

@@ -0,0 +1,18 @@
+package com.kcim.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.kcim.controller.request.QualificationAuditRequest;
+import com.kcim.dao.model.QualificationApply;
+
+import java.util.List;
+
+public interface QualificationAuditService extends IService<QualificationApply> {
+
+    Object list(Integer role,String queryCondition,Integer current, Integer pageSize);
+
+    void save(QualificationAuditRequest request);
+
+    void saveBatch(List<QualificationApply> request);
+
+    List<QualificationApply> saveBatchCheck(List<QualificationApply> request);
+}

+ 1 - 1
src/main/java/com/kcim/service/QualificationHisItemService.java

@@ -11,4 +11,4 @@ public interface QualificationHisItemService extends IService<QualificationHisIt
     void saveQualificationHisItemMap(QualificationHisItemMapRequest qualificationHisItemMapRequest);
 
     Object getHisItemDicList(String queryCondition, Integer current, Integer pageSize);
-}
+}

+ 40 - 0
src/main/java/com/kcim/service/QualificationManageService.java

@@ -0,0 +1,40 @@
+package com.kcim.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.kcim.controller.request.QualificationManageAdjustRequest;
+import com.kcim.controller.request.QualificationReAuthorizeRequest;
+import com.kcim.dao.model.DoctorAttachment;
+import com.kcim.dao.model.QualificationApply;
+
+import java.util.Date;
+import java.util.List;
+
+public interface QualificationManageService extends IService<QualificationApply> {
+
+    Object listByQualification(String name, String qualificationTypeCode, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer current, Integer pageSize);
+
+    Object listByDoctor(String deptCode,String userName, Integer current, Integer pageSize);
+
+    void adjust(QualificationManageAdjustRequest request);
+
+    void adjustBatch(List<QualificationManageAdjustRequest> request);
+
+    void reAuthorize(QualificationReAuthorizeRequest request);
+
+    Object listAllDoctor(String queryCondition);
+
+    Object listAvailableQualification(String queryCondition, Date expireDate, Integer current, Integer pageSize);
+
+    Object getMyInfo();
+
+    Object listAllDepartment(String queryCondition);
+
+    Object listMyAvailableQualification(String qualificationName, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer current, Integer pageSize);
+
+    Object saveDoctorAttachment(DoctorAttachment doctorAttachments);
+
+
+    Object editDoctorAttachment(DoctorAttachment doctorAttachments);
+
+    Object deleteDoctorAttachment(Integer id);
+}

+ 6 - 1
src/main/java/com/kcim/service/QualificationService.java

@@ -4,6 +4,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.kcim.controller.request.QualificationHisItemMapRequest;
 import com.kcim.dao.model.QualificationType;
 import com.kcim.dao.model.Qualification;
+import com.kcim.util.PageUtils;
+
+import java.util.List;
 
 /**
  * 资质字典
@@ -34,11 +37,13 @@ public interface QualificationService extends IService<Qualification> {
      */
     QualificationType deleteQualificationType(Integer id);
 
-    Object getQualificationList(String name, String qualificationTypeCode, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer enableFlag, Integer current, Integer pageSize);
+    PageUtils getQualificationList(String name, String qualificationTypeCode, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer enableFlag, Integer current, Integer pageSize);
 
     void addQualification(Qualification qualification);
 
     void editQualification(Qualification qualification);
 
     Qualification deleteQualification(Integer id);
+
+    List<String> getQualificationTypeCodeRecursion(List<QualificationType> typeList, String qualificationCode);
 }

+ 41 - 0
src/main/java/com/kcim/service/impl/CenterServiceImpl.java

@@ -0,0 +1,41 @@
+package com.kcim.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.kcim.endpoint.CenterEndPoint;
+import com.kcim.exception.MedicalException;
+import com.kcim.service.CenterService;
+import com.kcim.util.Result;
+import com.kcim.vo.UserInfoVO;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @program: performance
+ * @description: 中台调用接口集中处理实现类
+ * @author: jinhu
+ * @create: 2024-11-23
+ **/
+@Service("CenterService")
+@Slf4j
+@AllArgsConstructor
+public class CenterServiceImpl implements CenterService {
+
+    CenterEndPoint centerEndpoint;
+
+    @Override
+    public List<UserInfoVO> getCenterEmployee() {
+
+        Result userInfo = centerEndpoint.getUserInfo();
+
+        if(Objects.isNull(userInfo.getData())){
+            throw  new MedicalException("获取中台人员信息失败");
+        }
+
+        return JSON.parseArray(JSON.toJSONString(userInfo.getData()), UserInfoVO.class);
+    }
+}

+ 156 - 0
src/main/java/com/kcim/service/impl/QualificationApplyServiceImpl.java

@@ -0,0 +1,156 @@
+package com.kcim.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.constants.NumberConstant;
+import com.kcim.controller.request.QualificationApplyRequest;
+import com.kcim.dao.mapper.QualificationApplyMapper;
+import com.kcim.dao.model.*;
+import com.kcim.dao.repository.*;
+import com.kcim.service.CenterService;
+import com.kcim.service.QualificationApplyService;
+import com.kcim.service.QualificationService;
+import com.kcim.util.BaseUtil;
+import com.kcim.util.PageUtils;
+import com.kcim.vo.UserInfoVO;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service("QualificationApplyService")
+@AllArgsConstructor
+@Slf4j
+public class QualificationApplyServiceImpl extends ServiceImpl<QualificationApplyMapper, QualificationApply> implements QualificationApplyService {
+
+    QualificationApplyRepository qualificationApplyRepository;
+    QualificationRepository qualificationRepository;
+    UserInfoRepository userInfoRepository;
+    DoctorAttachmentRepository doctorAttachmentRepository;
+    QualificationApplyAttachmentRepository qualificationApplyAttachmentRepository;
+
+    QualificationService qualificationService;
+
+    CenterService centerService;
+
+    @Override
+    public Object list(String queryCondition,Integer applyStatus, Integer current, Integer pageSize) {
+
+        //中台人员
+        //List<UserInfoVO> empList = centerService.getCenterEmployee();
+        //Map<Long,UserInfoVO> empMap = empList.stream().collect(Collectors.toMap(UserInfoVO::getId, vo -> vo, (a, b) -> b));
+
+        //人员列表
+        List<UserInfo> empList = userInfoRepository.list();
+        Map<Long,UserInfo> empMap = empList.stream().collect(Collectors.toMap(UserInfo::getId, vo -> vo, (a, b) -> b));
+
+        //当前用户的申请列表
+        List<QualificationApply> records = qualificationApplyRepository.listByCurrentUser();
+
+        //空则直接返回
+        if(CollectionUtils.isEmpty(records)){
+            return new PageUtils(new ArrayList<>(), NumberConstant.ZERO,pageSize,current);
+        }
+
+        //返回的列表
+        List<QualificationApply> listReturn = new ArrayList<>();
+
+        //遍历列表,给子项赋值
+        for (QualificationApply record : records) {
+
+            //医生信息
+            record.setUserInfo(empMap.get(record.getUserId()));
+
+            //医生附件
+            List<DoctorAttachment> userAttachmentList = doctorAttachmentRepository.listByUserId(record.getUserId());
+            record.setUserAttachment(userAttachmentList);
+
+            //资质字典信息
+            Qualification qualification = qualificationRepository.getByCode(record.getQualificationCode());
+            record.setQualificationInfo(qualification);
+
+            //申请附件
+            List<QualificationApplyAttachment> applyAttachmentList = qualificationApplyAttachmentRepository.listByApplyId(record.getId());
+            record.setApplyAttachment(applyAttachmentList);
+
+            //判断是否符合过滤条件
+            //类型匹配
+            Boolean typeMatch = StringUtils.isEmpty(queryCondition) || !StringUtils.isEmpty(queryCondition) && record.getQualificationInfo().getQualificationTypeName().contains(queryCondition);
+            //名称匹配
+            Boolean nameMatch = StringUtils.isEmpty(queryCondition) || !StringUtils.isEmpty(queryCondition) && record.getQualificationInfo().getName().contains(queryCondition);
+            //状态匹配
+            Boolean statusMatch = record.getApplyStatus().equals(applyStatus) || applyStatus.equals(NumberConstant.ZERO);
+            if( (typeMatch || nameMatch) && statusMatch ){
+                listReturn.add(record);
+            }
+        }
+
+        //按申请时间倒序排序
+        listReturn.sort(Comparator.comparing(QualificationApply::getApplyDate).reversed());
+
+        return new PageUtils(listReturn, Math.toIntExact(listReturn.size()),pageSize,current);
+    }
+
+    @Override
+    public void add(QualificationApplyRequest request){
+        //批量新增,每个资质新增一条申请
+        for(Qualification qualification: request.getQualificationList()){
+
+            //申请信息
+            QualificationApply apply = new QualificationApply();
+            apply.setUserId(BaseUtil.getCurrentUser().getId());
+            apply.setApplyDate(new Date());
+            apply.setApplyStatus(request.getAddType());
+            apply.setApplyMemo(request.getApplyMemo());
+            apply.setQualificationCode(qualification.getCode());
+
+            //附件信息
+            apply.setApplyAttachment(request.getApplyAttachment());
+
+            apply.setCreateTime(new Date());
+            apply.setCreateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+            apply.setHospId(BaseUtil.getCurrentLoginHospId());
+
+            qualificationApplyRepository.add(apply);
+        }
+    }
+
+    @Override
+    public void edit(QualificationApply apply) {
+        qualificationApplyRepository.editById(apply);
+    }
+
+    @Override
+    public void withdraw(Integer id) {
+        qualificationApplyRepository.withdrawById(id);
+    }
+
+    @Override
+    public void delete(Integer id) {
+        qualificationApplyRepository.deleteById(id);
+    }
+
+
+
+    @Override
+    public Object getQualificationList(String name, String qualificationTypeCode, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer enableFlag, Integer current, Integer pageSize) {
+
+        List<QualificationApply> myApplyList = qualificationApplyRepository.listByCurrentUser();
+        PageUtils page = qualificationService.getQualificationList(name,qualificationTypeCode,operationLevelCode,techFlag,operationFlag,enableFlag,current,pageSize);
+        for (Object record : page.getList()) {
+            if(record instanceof Qualification){
+                Qualification qualification = (Qualification) record;
+                Optional<QualificationApply> apply = myApplyList.stream().filter(a -> a.getQualificationCode().equals(qualification.getCode()) && a.getCurrentStatus().equals("授权中")).findFirst();
+                if(apply.isPresent()){
+                    qualification.setAllowCheck(NumberConstant.ZERO);
+                }
+            }
+        }
+        return page;
+    }
+}

+ 228 - 0
src/main/java/com/kcim/service/impl/QualificationAuditServiceImpl.java

@@ -0,0 +1,228 @@
+package com.kcim.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.constants.NumberConstant;
+import com.kcim.controller.request.QualificationAuditRequest;
+import com.kcim.dao.mapper.QualificationApplyMapper;
+import com.kcim.dao.model.*;
+import com.kcim.dao.repository.*;
+import com.kcim.service.QualificationAuditService;
+import com.kcim.util.BaseUtil;
+import com.kcim.util.PageUtils;
+import com.kcim.vo.QualificationAuditVO;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.catalina.User;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service("QualificationAuditService")
+@AllArgsConstructor
+@Slf4j
+public class QualificationAuditServiceImpl extends ServiceImpl<QualificationApplyMapper, QualificationApply> implements QualificationAuditService {
+
+    QualificationApplyRepository qualificationApplyRepository;
+    QualificationRepository qualificationRepository;
+    UserInfoRepository userInfoRepository;
+    DoctorAttachmentRepository doctorAttachmentRepository;
+    QualificationApplyAttachmentRepository qualificationApplyAttachmentRepository;
+
+    @Override
+    public Object list(Integer role, String queryCondition, Integer current, Integer pageSize) {
+
+        //人员列表
+        List<UserInfo> empList = userInfoRepository.list();
+        Map<Long,UserInfo> empMap = empList.stream().collect(Collectors.toMap(UserInfo::getId, vo -> vo, (a, b) -> b));
+
+        List<QualificationApply> records = new ArrayList<>();
+
+        //当前角色 1科主任 2医务部 3院领导
+        switch (role) {
+            case 1:{
+                records = qualificationApplyRepository.listByDeptDirector();
+                break;
+            }
+            case 2:{
+                records = qualificationApplyRepository.listByManager();
+                break;
+            }
+            case 3:{
+                records = qualificationApplyRepository.listByMaster();
+                break;
+            }
+        }
+
+        //空则直接返回
+        if(CollectionUtils.isEmpty(records)){
+            return new PageUtils(new ArrayList<>(), NumberConstant.ZERO,pageSize,current);
+        }
+
+        //返回的列表
+        List<QualificationApply> listReturn = new ArrayList<>();
+
+        //遍历列表,给子项赋值
+        for (QualificationApply record : records) {
+
+            //科主任审批,判断申请人和科主任在同一科室
+            if(role.equals(1)){
+                //当前登录人的科室
+                String currentDept = empList.stream().filter(u -> u.getId().equals(BaseUtil.getCurrentUser().getId())).findFirst().get().getDeptName();
+                //当前登录人的科室!=申请人的科室,则跳过
+                String applyDept = empList.stream().filter(u -> u.getId().equals(record.getUserId())).findFirst().get().getDeptName();
+                if(!currentDept.equals(applyDept)){
+                    continue;
+                }
+            }
+
+            //医生信息
+            UserInfo doctor = empMap.get(record.getUserId());
+            record.setUserInfo(doctor);
+
+            //医生附件
+            List<DoctorAttachment> userAttachmentList = doctorAttachmentRepository.listByUserId(record.getUserId());
+            record.setUserAttachment(userAttachmentList);
+
+            //资质字典信息
+            Qualification qualification = qualificationRepository.getByCode(record.getQualificationCode());
+            record.setQualificationInfo(qualification);
+
+            //申请附件
+            List<QualificationApplyAttachment> applyAttachmentList = qualificationApplyAttachmentRepository.listByApplyId(record.getId());
+            record.setApplyAttachment(applyAttachmentList);
+
+            //判断是否符合过滤条件
+            //申请人匹配
+            Boolean doctorNameMatch = StringUtils.isEmpty(queryCondition) || !StringUtils.isEmpty(queryCondition) && doctor.getName().contains(queryCondition);
+            //资质分类匹配
+            Boolean typeMatch = StringUtils.isEmpty(queryCondition) || !StringUtils.isEmpty(queryCondition) && record.getQualificationInfo().getQualificationTypeName().contains(queryCondition);
+            //资质名称匹配
+            Boolean nameMatch = StringUtils.isEmpty(queryCondition) || !StringUtils.isEmpty(queryCondition) && record.getQualificationInfo().getName().contains(queryCondition);
+
+            if(doctorNameMatch || typeMatch || nameMatch){
+                listReturn.add(record);
+            }
+        }
+
+        //按申请时间倒序排序
+        listReturn.sort(Comparator.comparing(QualificationApply::getApplyDate).reversed());
+
+        return new PageUtils(listReturn, Math.toIntExact(listReturn.size()),pageSize,current);
+    }
+
+    @Override
+    public void save(QualificationAuditRequest request) {
+
+        //ApplyStatus 当前状态 1草稿 2待科主任审核 3待医务部审核 4待院长审核 5审核通过 6驳回
+        for(QualificationAuditVO auditInfo: request.getAuditInfo()){
+            //申请信息
+            QualificationApply qualificationApply = qualificationApplyRepository.getById(auditInfo.getId());
+
+            switch (request.getRole()){
+                //科主任
+                case 1:{
+                    qualificationApply.setDeptOpinion(auditInfo.getDeptOpinion());
+                    if(request.getAuditType().equals(NumberConstant.ONE)) {
+                        qualificationApply.setApplyStatus(NumberConstant.THREE); //3 待医务部审核
+                    }
+                    else{
+                        qualificationApply.setApplyStatus(NumberConstant.SIX); //6 驳回
+                    }
+                    break;
+                }
+                //医务部
+                case 2:{
+                    qualificationApply.setQualificationPeriod(auditInfo.getQualificationPeriod());
+                    qualificationApply.setBeginDate(auditInfo.getBeginDate());
+                    qualificationApply.setEndDate(auditInfo.getEndDate());
+                    qualificationApply.setManagerOpinion(auditInfo.getManagerOpinion());
+
+                    if(request.getAuditType().equals(NumberConstant.ONE)){
+                        if(auditInfo.getNeedMasterAudit().equals(NumberConstant.ONE)) {
+                            qualificationApply.setApplyStatus(NumberConstant.FOUR); //4 待院长审核
+                        }
+                        else{
+                            qualificationApply.setApplyStatus(NumberConstant.FIVE); //5 审核通过
+                        }
+                    }
+                    else{
+                        qualificationApply.setApplyStatus(NumberConstant.SIX); //6 驳回
+                    }
+
+                    break;
+                }
+                //院领导
+                case 3:{
+                    qualificationApply.setMasterOpinion(auditInfo.getMasterOpinion());
+                    if(request.getAuditType().equals(NumberConstant.ONE)) {
+                        qualificationApply.setApplyStatus(NumberConstant.FIVE); //5 审核通过
+                    }
+                    else{
+                        qualificationApply.setApplyStatus(NumberConstant.SIX); //6 驳回
+                    }
+                    break;
+                }
+            }
+
+            qualificationApply.setUpdateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+            qualificationApply.setUpdateTime(new Date());
+            qualificationApplyRepository.updateById(qualificationApply);
+        }
+    }
+
+    @Override
+    public void saveBatch(List<QualificationApply> request) {
+        for(QualificationApply apply: request){
+
+            //是否已有
+            QualificationApply currentApply = qualificationApplyRepository.findByUserIdAndQualificationCode(apply.getUserId(), apply.getQualificationCode(),true);
+
+            //现在没有,则新增
+            if(currentApply == null){
+                apply.setApplyDate(new Date());
+                apply.setApplyMemo("医务部批量授权");
+                apply.setApplyStatus(NumberConstant.FIVE); //5审核通过
+                apply.setUpdateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+                apply.setHospId(BaseUtil.getCurrentUser().getHospId());
+                apply.setCreateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+                apply.setCreateTime(new Date());
+                qualificationApplyRepository.save(apply);
+            }
+            //已有,则更新
+            else{
+                currentApply.setQualificationPeriod(apply.getQualificationPeriod());
+                currentApply.setBeginDate(apply.getBeginDate());
+                currentApply.setEndDate(apply.getEndDate());
+                currentApply.setManagerOpinion(apply.getManagerOpinion());
+                currentApply.setApplyStatus(NumberConstant.FIVE); //5审核通过
+                currentApply.setUpdateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+                currentApply.setUpdateTime(new Date());
+                qualificationApplyRepository.updateById(currentApply);
+            }
+        }
+    }
+
+    @Override
+    public List<QualificationApply> saveBatchCheck(List<QualificationApply> request) {
+        List<QualificationApply> returnList = new ArrayList<>();
+
+        //人员列表
+        List<UserInfo> users = userInfoRepository.list();
+
+        //资质字典列表
+        List<Qualification> qualifications = qualificationRepository.list();
+
+        for(QualificationApply apply: request){
+            QualificationApply currentApply = qualificationApplyRepository.findByUserIdAndQualificationCode(apply.getUserId(), apply.getQualificationCode());
+            if(currentApply != null){
+                currentApply.setUserInfo(users.stream().filter(u -> u.getId().equals(apply.getUserId())).findFirst().get());
+                currentApply.setQualificationInfo(qualifications.stream().filter(q -> q.getCode().equals(apply.getQualificationCode())).findFirst().get());
+                returnList.add(currentApply);
+            }
+        }
+        return returnList;
+    }
+}

+ 465 - 0
src/main/java/com/kcim/service/impl/QualificationManageServiceImpl.java

@@ -0,0 +1,465 @@
+package com.kcim.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.constants.NumberConstant;
+import com.kcim.controller.request.QualificationManageAdjustRequest;
+import com.kcim.controller.request.QualificationReAuthorizeRequest;
+import com.kcim.controller.response.QualificationManage;
+import com.kcim.controller.response.QualificationManageForDoctor;
+import com.kcim.dao.mapper.QualificationApplyMapper;
+import com.kcim.dao.model.*;
+import com.kcim.dao.repository.*;
+import com.kcim.service.CenterService;
+import com.kcim.service.QualificationApplyService;
+import com.kcim.service.QualificationManageService;
+import com.kcim.service.QualificationService;
+import com.kcim.util.BaseUtil;
+import com.kcim.util.PageUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import lombok.val;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service("QualificationManageService")
+@AllArgsConstructor
+@Slf4j
+public class QualificationManageServiceImpl extends ServiceImpl<QualificationApplyMapper, QualificationApply> implements QualificationManageService {
+
+    QualificationRepository qualificationRepository;
+    QualificationTypeRepository qualificationTypeRepository;
+    QualificationApplyRepository qualificationApplyRepository;
+    QualificationApplyAdjustRepository qualificationApplyAdjustRepository;
+    UserInfoRepository userInfoRepository;
+    DepartmentRepository departmentRepository;
+    DoctorAttachmentRepository doctorAttachmentRepository;
+
+    QualificationService qualificationService;
+
+    @Override
+    public Object listByQualification(String name, String qualificationTypeCode, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer current, Integer pageSize) {
+
+        //返回的集合
+        List<QualificationManage> listReturn = new ArrayList<>();
+
+        //资质集合
+        List<Qualification> qualificationList = qualificationRepository.list();
+
+        //资质分类集合
+        List<QualificationType> qualificationTypeList = qualificationTypeRepository.list();
+
+        //人员列表
+        List<UserInfo> empList = userInfoRepository.list();
+        Map<Long,UserInfo> empMap = empList.stream().collect(Collectors.toMap(UserInfo::getId, vo -> vo, (a, b) -> b));
+
+        //有效的资质授权
+        List<QualificationApply> list = qualificationApplyRepository.listByQualification();
+
+        for(QualificationApply qualificationApply : list){
+
+            //医生信息
+            qualificationApply.setUserInfo(empMap.get(qualificationApply.getUserId()));
+
+            //调整历史-调整人姓名
+            for(QualificationApplyAdjust adjust : qualificationApply.getApplyAdjust()){
+                adjust.setAdjustUserName(empMap.get(adjust.getUserId()).getName());
+            }
+
+            //资质字典
+            Qualification qualification = qualificationList.stream().filter(q -> q.getCode().equals(qualificationApply.getQualificationCode())).findFirst().get();
+            //资质名称
+            String qualificationName = qualification.getName();
+            //资质分类
+            QualificationType qualificationType = qualificationTypeList.stream().filter(t -> t.getCode().equals(qualification.getQualificationTypeCode())).findFirst().get();
+            //资质分类编码
+            String typeCode = qualificationType.getCode();
+            //资质分类名称
+            String typeName = qualificationType.getName();
+            qualification.setQualificationTypeName(typeName);
+
+            //名称过滤
+            if(!StringUtils.isEmpty(name) && !qualificationName.contains(name)){
+                continue;
+            }
+            //分类过滤
+            if(!qualificationTypeCode.equals("0")){
+                //List<String> typeCodeList = qualificationServiceImpl.getQualificationTypeCodeRecursion(qualificationTypeList,qualificationTypeCode);
+                List<String> typeCodeList = qualificationService.getQualificationTypeCodeRecursion(qualificationTypeList,qualificationTypeCode);
+                if(!typeCodeList.contains(typeCode)){
+                    continue;
+                }
+            }
+            //手术标志过滤
+            if(operationFlag != null && operationFlag.equals(NumberConstant.ONE) && qualification.getOperationFlag().equals(NumberConstant.ZERO)){
+                continue;
+            }
+            //医疗技术标志过滤
+            if(techFlag != null && techFlag.equals(NumberConstant.ONE) && qualification.getTechFlag().equals(NumberConstant.ZERO)){
+                continue;
+            }
+            //手术级别过滤
+            if(!StringUtils.isEmpty(operationLevelCode) && !qualification.getOperationLevelCode().equals(operationLevelCode)){
+                continue;
+            }
+
+            Optional<QualificationManage> returnItem = listReturn.stream().filter(q -> q.getQualification().getCode().equals(qualificationApply.getQualificationCode())).findFirst();
+            //添加1项
+            if(!returnItem.isPresent()) {
+                QualificationManage newItem = new QualificationManage();
+                //资质字典
+                newItem.setQualification(qualification);
+                //医生列表
+                if(qualificationApply.getCurrentStatus().equals("授权中")){
+                    newItem.setDoctorList(qualificationApply.getUserInfo().getName());
+                }
+                else{
+                    newItem.setDoctorList(""); //新建时如果不是授权中状态,则给一个空字符串,避免出现null文本
+                }
+                //申请列表
+                List<QualificationApply> applyList = new ArrayList<>();
+                applyList.add(qualificationApply);
+                newItem.setApplyList(applyList);
+
+                listReturn.add(newItem);
+            }
+            //更新项
+            else{
+                //医生列表
+                if(qualificationApply.getCurrentStatus().equals("授权中")){
+                    String newDoctorList = returnItem.get().getDoctorList() + "," + qualificationApply.getUserInfo().getName();
+                    newDoctorList = StringUtils.trimLeadingCharacter(newDoctorList,','); //去掉最左边的逗号
+                    returnItem.get().setDoctorList(newDoctorList);
+                }
+                //申请列表
+                returnItem.get().getApplyList().add(qualificationApply);
+            }
+        }
+
+        //设置「允许重新授权状态」,已过期的授权,如果没有对应的授权中的人时,才可以重新授权
+        for(QualificationManage item : listReturn ){
+            for(QualificationApply apply : item.getApplyList()){
+                if(apply.getCurrentStatus().equals("已过期")) {
+                    if(item.getApplyList().stream().filter(a -> a.getCurrentStatus().equals("授权中"))
+                           .noneMatch(a -> a.getUserId().equals(apply.getUserId()))) {
+                        apply.setAllowReAuthorize(NumberConstant.ONE);
+                    }
+                }
+            }
+        }
+
+        return new PageUtils(listReturn, Math.toIntExact(listReturn.size()),pageSize,current);
+    }
+
+    @Override
+    public Object listByDoctor(String deptCode, String userName, Integer current, Integer pageSize) {
+
+        //返回的集合
+        List<QualificationManageForDoctor> listReturn = new ArrayList<>();
+
+        //资质集合
+        List<Qualification> qualificationList = qualificationRepository.list();
+
+        //有效的资质授权
+        List<QualificationApply> list = qualificationApplyRepository.listByQualification();
+
+        //过滤的科室代码和其下级代码组成的列表
+        List<String> listDept = getDepartmentCodeRecursion(departmentRepository.list(),deptCode);
+
+        //人员列表
+        List<UserInfo> empList = userInfoRepository.list();
+        Map<Long,UserInfo> empMap = empList.stream().collect(Collectors.toMap(UserInfo::getId, vo -> vo, (a, b) -> b));
+
+        for(QualificationApply qualificationApply : list){
+
+            //资质字典
+            Qualification qualification = qualificationList.stream().filter(q -> q.getCode().equals(qualificationApply.getQualificationCode())).findFirst().get();
+            //资质名称
+            String qualificationName = qualification.getName();
+
+            //科室过滤
+            if(!StringUtils.isEmpty(deptCode) && !listDept.contains(qualificationApply.getUserInfo().getDeptCode())){
+                continue;
+            }
+            //姓名过滤
+            if(!StringUtils.isEmpty(userName) && !qualificationApply.getUserInfo().getName().contains(userName)){
+                continue;
+            }
+
+            //调整历史-调整人姓名
+            for(QualificationApplyAdjust adjust : qualificationApply.getApplyAdjust()){
+                adjust.setAdjustUserName(empMap.get(adjust.getUserId()).getName());
+            }
+
+            Optional<QualificationManageForDoctor> returnItem = listReturn.stream().filter(q -> q.getUserInfo().getId().equals(qualificationApply.getUserId())).findFirst();
+            //添加1项
+            if(!returnItem.isPresent()) {
+                QualificationManageForDoctor newItem = new QualificationManageForDoctor();
+                //医生信息
+                newItem.setUserInfo(userInfoRepository.getUserInfoById(qualificationApply.getUserId()));
+                //资质名称列表
+                if(qualificationApply.getCurrentStatus().equals("授权中")){
+                    newItem.setQualificationList(qualificationName);
+                }
+                else{
+                    newItem.setQualificationList(""); //新建时如果不是授权中状态,则给一个空字符串,避免出现null文本
+                }
+                //申请列表
+                List<QualificationApply> applyList = new ArrayList<>();
+                applyList.add(qualificationApply);
+                newItem.setApplyList(applyList);
+
+                listReturn.add(newItem);
+            }
+            //更新项
+            else{
+                //资质名称列表
+                if(qualificationApply.getCurrentStatus().equals("授权中")){
+                    String newQualificationList = returnItem.get().getQualificationList() + "," + qualificationName;
+                    newQualificationList = StringUtils.trimLeadingCharacter(newQualificationList,','); //去掉最左边的逗号
+                    returnItem.get().setQualificationList(newQualificationList);
+                }
+                //申请列表
+                returnItem.get().getApplyList().add(qualificationApply);
+            }
+        }
+
+        //设置「允许重新授权状态」,已过期的授权,如果没有对应的授权中的授权时,才可以重新授权
+        for(QualificationManageForDoctor item : listReturn ){
+            for(QualificationApply apply : item.getApplyList()){
+                if(apply.getCurrentStatus().equals("已过期")) {
+                    if(item.getApplyList().stream().filter(a -> a.getCurrentStatus().equals("授权中"))
+                                                   .noneMatch(a -> a.getQualificationInfo().getCode().equals(apply.getQualificationInfo().getCode()))) {
+                        apply.setAllowReAuthorize(NumberConstant.ONE);
+                    }
+                }
+            }
+        }
+
+        return new PageUtils(listReturn, Math.toIntExact(listReturn.size()),pageSize,current);
+    }
+
+    /**
+     * 递归获取的科室编码的下级编码列表
+     */
+    public List<String> getDepartmentCodeRecursion(List<Department> deptList,String deptCode){
+        List<String> list = new ArrayList<>();
+
+        //父节点为传入节点的节点数
+        long count = deptList.stream().filter(t -> t.getParentCode().equals(deptCode)).count();
+
+        //传入的是根节点
+        if(count == 0){
+            list.add(deptCode);
+            return list;
+        }
+
+        //传入的不是根节点
+        for(Department dept : deptList){
+            //传入节点的直接下级
+            if(dept.getParentCode().equals(deptCode)){
+                long childCount = deptList.stream().filter(t -> t.getParentCode().equals(dept.getCode())).count();
+                //是末级节点
+                if(childCount == 0 && !list.contains(dept.getCode())){
+                    list.add(dept.getCode());
+                }
+                //递归
+                else{
+                    list.addAll(getDepartmentCodeRecursion(deptList,dept.getCode()));
+                }
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public void adjust(QualificationManageAdjustRequest request) {
+        QualificationApply apply = qualificationApplyRepository.getById(request.getQualificationApplyId());
+
+        //更新调整记录
+        QualificationApplyAdjust adjust = new QualificationApplyAdjust();
+        adjust.setQualificationApplyId(request.getQualificationApplyId());
+        adjust.setUserId(BaseUtil.getCurrentUser().getId());
+        adjust.setQualificationPeriodBefore(apply.getQualificationPeriod());
+        adjust.setQualificationPeriodAfter(request.getQualificationPeriod());
+        adjust.setBeginDateBefore(apply.getBeginDate());
+        adjust.setBeginDateAfter(request.getBeginDate());
+        adjust.setEndDateBefore(apply.getEndDate());
+        adjust.setEndDateAfter(request.getEndDate());
+        adjust.setMemo(request.getMemo());
+
+        adjust.setCreateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+        adjust.setCreateTime(new Date());
+        adjust.setHospId(BaseUtil.getCurrentLoginHospId());
+
+        qualificationApplyAdjustRepository.save(adjust);
+
+        //更新资质申请
+        apply.setQualificationPeriod(request.getQualificationPeriod());
+        apply.setBeginDate(request.getBeginDate());
+        apply.setEndDate(request.getEndDate());
+
+        apply.setUpdateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+        apply.setUpdateTime(new Date());
+
+        qualificationApplyRepository.updateById(apply);
+    }
+
+    @Override
+    public void adjustBatch(List<QualificationManageAdjustRequest> request) {
+        for(QualificationManageAdjustRequest r : request) {
+            adjust(r);
+        }
+    }
+
+    @Override
+    public void reAuthorize(QualificationReAuthorizeRequest request) {
+
+        //取原来的申请
+        QualificationApply apply = qualificationApplyRepository.getById(request.getQualificationApplyId());
+
+        //拷贝原来的属性
+        QualificationApply newApply = new QualificationApply();
+        newApply.setQualificationCode(apply.getQualificationCode());
+        newApply.setUserId(apply.getUserId());
+        //新授权属性
+        newApply.setQualificationPeriod(request.getQualificationPeriod());
+        newApply.setBeginDate(request.getBeginDate());
+        newApply.setEndDate(request.getEndDate());
+        newApply.setManagerOpinion(request.getMemo());
+
+        newApply.setApplyDate(new Date());
+        newApply.setApplyStatus(NumberConstant.FIVE);
+        newApply.setCreateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+        newApply.setCreateTime(new Date());
+        newApply.setHospId(BaseUtil.getCurrentLoginHospId());
+
+        qualificationApplyRepository.save(newApply);
+    }
+
+    @Override
+    public Object listAllDoctor(String queryCondition) {
+        return userInfoRepository.listAllDoctor(queryCondition);
+    }
+
+    @Override
+    public Object listAvailableQualification(String queryCondition, Date expireDate, Integer current, Integer pageSize) {
+        return qualificationApplyRepository.listAvailableQualification(queryCondition,expireDate, current, pageSize);
+    }
+
+    @Override
+    public Object getMyInfo() {
+        UserInfo myInfo = userInfoRepository.getCurrentUserInfo();
+        myInfo.setAttachments(doctorAttachmentRepository.listByUserId(BaseUtil.getCurrentUser().getId()));
+        return myInfo;
+    }
+
+    @Override
+    public Object listAllDepartment(String queryCondition) {
+        //返回的集合
+        List<Department> listReturn = new ArrayList<>();
+
+        //先把所有科室都查询出来
+        List<Department> listAll = departmentRepository.list();
+
+        //需要检索
+        if(!StringUtils.isEmpty(queryCondition)) {
+            //生成检索字段的值
+            for(Department department : listAll) {
+                department.setFilter(getChildDepartmentFilter(department.getCode(),department.getName(),listAll));
+            }
+
+            //过滤得到子集
+            List<Department> list = listAll.stream().filter(d -> d.getFilter().contains(queryCondition)).collect(Collectors.toList());
+
+            //查无结果
+            if((long) list.size() == 0){
+                return listReturn;
+            }
+
+            //把子集填到返回放列表里
+            //先添加根节点,因为根节点是必须有的
+            Optional<Department> rootNode = list.stream().filter(d -> d.getCode().equals("0")).findFirst();
+            if(rootNode.isPresent()){
+                rootNode.get().setChildren(getChildrenDepartment("0",list));
+                listReturn.add(rootNode.get());
+            }
+        }
+        //不需要检索
+        else{
+            //先添加根节点,因为根节点是必须有的
+            Optional<Department> rooNode = listAll.stream().filter(d -> d.getCode().equals("0")).findFirst();
+            if(rooNode.isPresent()){
+                rooNode.get().setChildren((getChildrenDepartment("0",listAll)));
+                listReturn.add(rooNode.get());
+            }
+        }
+        return listReturn;
+    }
+
+    @Override
+    public Object listMyAvailableQualification(String qualificationName, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer current, Integer pageSize) {
+        return qualificationApplyRepository.listMyAvailableQualification(qualificationName, operationLevelCode, techFlag, operationFlag, current, pageSize);
+    }
+
+    @Override
+    public Object saveDoctorAttachment(DoctorAttachment doctorAttachments) {
+        doctorAttachments.setHospId(BaseUtil.getCurrentLoginHospId());
+        doctorAttachments.setCreateTime(new Date());
+        doctorAttachments.setCreateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+        return doctorAttachmentRepository.save(doctorAttachments);
+    }
+
+    @Override
+    public Object editDoctorAttachment(DoctorAttachment doctorAttachments) {
+        doctorAttachments.setUpdateTime(new Date());
+        doctorAttachments.setUpdateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+        return doctorAttachmentRepository.updateById(doctorAttachments);
+    }
+
+    @Override
+    public Object deleteDoctorAttachment(Integer id){
+        return doctorAttachmentRepository.removeById(id);
+    }
+
+    private String getChildDepartmentFilter(String code,String name,List<Department> list) {
+
+        val filter = new StringBuilder();
+        //先把自己的内容加上
+        filter.append(code).append(",").append(name).append(",");
+        //遍历所有项
+        for(Department department : list) {
+            //是传入code的直接子节点
+            if(department.getParentCode().equals(code)) {
+                //把当前节点的code和name拼到过滤串中
+                filter.append(department.getCode()).append(",").append(department.getName()).append(",");
+                //当前节点的子节点数量
+                long childCount = list.stream().filter(d -> d.getParentCode().equals(department.getCode())).count();
+                //不是末级节点,则递归
+                if(childCount > 0){
+                    filter.append(getChildDepartmentFilter(department.getCode(),department.getName(),list)).append(",");
+                }
+            }
+        }
+        return filter.toString();
+    }
+
+    private List<Department> getChildrenDepartment(String code,List<Department> list){
+        List<Department> listReturn = new ArrayList<>();
+        for (Department department : list) {
+            //如果传入的code是直接下级节点
+            if(department.getParentCode().equals(code)) {
+                //当前节点的子节点数量
+                long childCount = list.stream().filter(d -> d.getParentCode().equals(department.getCode())).count();
+                //不是末级节点,则递归
+                if(childCount > 0) {
+                    department.setChildren(getChildrenDepartment(department.getCode(),list));
+                }
+                listReturn.add(department);
+            }
+        }
+        return listReturn;
+    }
+}

+ 171 - 34
src/main/java/com/kcim/service/impl/QualificationServiceImpl.java

@@ -1,18 +1,17 @@
 package com.kcim.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kcim.constants.NumberConstant;
-import com.kcim.controller.request.QualificationHisItemMapRequest;
-import com.kcim.dao.model.HisItemDic;
 import com.kcim.dao.repository.HisItemDicRepository;
 import com.kcim.dao.repository.QualificationRepository;
 import com.kcim.dao.repository.QualificationTypeRepository;
 import com.kcim.exception.MedicalException;
+import com.kcim.service.CenterService;
 import com.kcim.util.BaseUtil;
 import com.kcim.util.PageUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import lombok.val;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
@@ -24,12 +23,15 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Service("QualificationService")
 @AllArgsConstructor
 @Slf4j
 public class QualificationServiceImpl extends ServiceImpl<QualificationMapper, Qualification> implements QualificationService {
 
+    CenterService centerService;
+
     QualificationTypeRepository qualificationTypeRepository;
     QualificationRepository qualificationRepository;
     HisItemDicRepository hisItemDicRepository;
@@ -39,21 +41,111 @@ public class QualificationServiceImpl extends ServiceImpl<QualificationMapper, Q
      */
     @Override
     public List<QualificationType> getQualificationTypeList(String queryCondition) {
-        LambdaQueryWrapper<QualificationType> queryWrapper = new LambdaQueryWrapper<>();
+        //返回的集合
+        List<QualificationType> listReturn = new ArrayList<>();
+
+        //先把所有资质分类都查询出来
+        List<QualificationType> listAll = qualificationTypeRepository.list();
+
+        //所有资质字典
+        List<Qualification> listQualification = qualificationRepository.list();
+
+        //需要检索
+        if(!StringUtils.isEmpty(queryCondition)) {
 
-        //资质编码或名称作为查询条件
-        if(!StringUtils.isEmpty(queryCondition)){
-            queryWrapper.like(QualificationType::getCode, queryCondition)
-                        .or()
-                        .like(QualificationType::getName, queryCondition);
+            //生成检索字段的值
+            for(QualificationType qt : listAll) {
+                qt.setFilter(getChildFilter(qt.getCode(),qt.getName(), listAll));
+            }
+
+            //过滤得到子集
+            List<QualificationType> list = listAll.stream().filter(q -> q.getFilter().contains(queryCondition)).collect(Collectors.toList());
+
+            //查无结果
+            if((long) list.size() == 0)
+            {
+                return listReturn;
+            }
+
+            //把子集填到返回放列表里
+            //先添加根节点,因为根节点是必须有的
+            Optional<QualificationType> rootNode = list.stream().filter(q -> q.getCode().equals("0")).findFirst();
+            if(rootNode.isPresent()) {
+                rootNode.get().setChildren(getChildren("0",list,listQualification ));
+
+                listReturn.add(rootNode.get());
+            }
         }
+        //不需要检索
+        else{
+            //先添加根节点,因为根节点是必须有的
+            Optional<QualificationType> rootNode = listAll.stream().filter(q -> q.getCode().equals("0")).findFirst();
+            if(rootNode.isPresent()) {
+                rootNode.get().setChildren(getChildren("0",listAll,listQualification ));
+
 
+
+                listReturn.add(rootNode.get());
+            }
+        }
+        return listReturn;
+    }
+
+    private List<QualificationType> getQualificationTypeWithoutRecursion()
+    {
+        LambdaQueryWrapper<QualificationType> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(QualificationType::getHospId, BaseUtil.getCurrentLoginHospId());
         queryWrapper.eq(QualificationType::getDelFlag, NumberConstant.ZERO);
         queryWrapper.orderByAsc(QualificationType::getSort);
         return qualificationTypeRepository.list(queryWrapper);
     }
 
+    private String getChildFilter(String code, String name, List<QualificationType> list){
+
+        val filter = new StringBuilder();
+        //先把自己的过滤内容加上
+        filter.append(code).append(",").append(name).append(",");
+        //遍历所有项
+        for(QualificationType type:list){
+            //是传入code的直接子节点
+            if(type.getParentCode().equals(code)){
+                //把当前节点的code和name拼到过滤串中
+                filter.append(type.getCode()).append(",").append(type.getName()).append(",");
+                //当前节点的子节点数量
+                long childCount = list.stream().filter(t -> t.getParentCode().equals(type.getCode())).count();
+                //不是末级节点,则递归
+                if(childCount > 0){
+                    filter.append(getChildFilter(type.getCode(),type.getName(), list)).append(",");
+                }
+            }
+        }
+        return filter.toString();
+    }
+
+    List<QualificationType> getChildren(String code, List<QualificationType> typeList, List<Qualification> qualificationList){
+        List<QualificationType> listReturn = new ArrayList<>();
+        for(QualificationType type:typeList){
+            //如果是传入code的直接下级节点
+            if(type.getParentCode().equals(code)){
+                //当前节点的子节点数量
+                long childCount = typeList.stream().filter(t -> t.getParentCode().equals(type.getCode())).count();
+                //不是末级节点,则递归
+                if(childCount > 0){
+                    type.setChildren(getChildren(type.getCode(),typeList,qualificationList ));
+                }
+
+                //如果资质分类下有资质字典,则这个资质分类不可删除
+                List<String> typeCodeList = this.getQualificationTypeCodeRecursion(typeList,type.getCode());
+                if(qualificationList.stream().anyMatch(q -> typeCodeList.contains(q.getQualificationTypeCode()))){
+                    type.setAllowDelete(0);
+                }
+
+                listReturn.add(type);
+            }
+        }
+        return listReturn;
+    }
+
     /**
      * 新增资质类型
      */
@@ -84,14 +176,17 @@ public class QualificationServiceImpl extends ServiceImpl<QualificationMapper, Q
      */
     @Override
     public void editQualificationType(QualificationType request) {
-        Integer id = request.getId();
-        QualificationType qualificationType = deleteQualificationType(id);
-        request.setHospId(BaseUtil.getCurrentLoginHospId());
-        request.setUpdateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
-        request.setUpdateTime(new Date());
-        request.setCreateUser(qualificationType.getCreateUser());
-        request.setCreateTime(qualificationType.getCreateTime());
-        qualificationTypeRepository.save(request);
+
+        QualificationType type = qualificationTypeRepository.getById(request.getId());
+
+        type.setName(request.getName());
+        type.setDescription(request.getDescription());
+        type.setSort(request.getSort());
+
+        type.setUpdateTime(new Date());
+        type.setUpdateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
+
+        qualificationTypeRepository.updateById(type);
     }
 
     private void checkQualificationType(QualificationType request) {
@@ -108,7 +203,7 @@ public class QualificationServiceImpl extends ServiceImpl<QualificationMapper, Q
      * 查询资质列表
      */
     @Override
-    public Object getQualificationList(String name, String qualificationTypeCode, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer enableFlag, Integer current, Integer pageSize) {
+    public PageUtils getQualificationList(String name, String qualificationTypeCode, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer enableFlag, Integer current, Integer pageSize) {
         LambdaQueryWrapper<Qualification> queryWrapper = new LambdaQueryWrapper<>();
 
         //资质名称过滤
@@ -117,10 +212,11 @@ public class QualificationServiceImpl extends ServiceImpl<QualificationMapper, Q
         }
 
         //资质分类过滤
-        if(!qualificationTypeCode.equals("0")) //不是”全部“节点
-        {
+        if(!StringUtils.isEmpty(qualificationTypeCode) && !qualificationTypeCode.equals("0")){//不是”全部“节点
+
             //资质分类字典
-            List<QualificationType> typeList = getQualificationTypeList("");
+            List<QualificationType> typeList = getQualificationTypeWithoutRecursion();
+
             //资质分类字典的下级所有递归根节点的code
             List<String> list = getQualificationTypeCodeRecursion(typeList,qualificationTypeCode);
             queryWrapper.in(Qualification::getQualificationTypeCode, list);
@@ -132,28 +228,73 @@ public class QualificationServiceImpl extends ServiceImpl<QualificationMapper, Q
         }
 
         //医疗技术过滤
-        if(techFlag == 1){
+        if(techFlag !=null && techFlag == 1){
             queryWrapper.eq(Qualification::getTechFlag, techFlag);
         }
 
         //手术过滤
-        if(operationFlag == 1){
+        if(operationFlag != null && operationFlag == 1){
             queryWrapper.eq(Qualification::getOperationFlag, operationFlag);
         }
 
         //启用过滤
-        if(enableFlag == 1){
+        if(enableFlag !=null && enableFlag == 1){
             queryWrapper.eq(Qualification::getEnableFlag, enableFlag);
         }
 
         queryWrapper.eq(Qualification::getHospId, BaseUtil.getCurrentLoginHospId());
         queryWrapper.eq(Qualification::getDelFlag, NumberConstant.ZERO);
 
-        Page<Qualification> page = qualificationRepository.getPage(current,pageSize,queryWrapper);
-        if(CollectionUtils.isEmpty(page.getRecords())){
+        List<Qualification> list = qualificationRepository.list(queryWrapper);
+        if(CollectionUtils.isEmpty(list)){
             return new PageUtils(new ArrayList<>(), NumberConstant.ZERO,pageSize,current);
         }
-        return new PageUtils(page.getRecords(), Math.toIntExact(page.getTotal()),pageSize,current);
+
+        //不递归的资质类型字典
+        List<QualificationType> listType = this.getQualificationTypeWithoutRecursion();
+
+        for(Qualification record:list){
+            //给递归上级编码赋值
+            record.setFullQualificationTypeCode(this.getFullParentQualificationTypeCode(record.getQualificationTypeCode(),listType));
+            //给编码名称赋值
+            record.setQualificationTypeName(getQualificationTypeName(record.getQualificationTypeCode(),listType));
+        }
+
+        return new PageUtils(list, Math.toIntExact(list.size()),pageSize,current);
+    }
+
+    private String getQualificationTypeName(String qualificationTypeCode,List<QualificationType> list){
+
+        Optional<QualificationType> type = list.stream().filter(t -> t.getCode().equals(qualificationTypeCode)).findFirst();
+        if(type.isPresent()){
+            return type.get().getName();
+        }
+        else{
+            return "";
+        }
+    }
+
+    /**
+     *
+     * @param qualificationTypeCode
+     * @param listType
+     * @return
+     */
+    private String getFullParentQualificationTypeCode(String qualificationTypeCode,List<QualificationType> listType){
+        //从list中找到传入的type
+        QualificationType qualificationType = listType.stream().filter(t -> t.getCode().equals(qualificationTypeCode)).findFirst().orElse(null);
+
+        if(qualificationType == null){
+            return "";
+        }
+
+        //上级节点不是“全部”,递归
+        if(!qualificationType.getParentCode().equals("0")){
+            return getFullParentQualificationTypeCode(qualificationType.getParentCode(),listType) + "|" + qualificationTypeCode;
+        }
+        else{
+            return "0|" + qualificationTypeCode;
+        }
     }
 
     @Override
@@ -167,14 +308,9 @@ public class QualificationServiceImpl extends ServiceImpl<QualificationMapper, Q
 
     @Override
     public void editQualification(Qualification request) {
-        Integer id = request.getId();
-        Qualification qualification = deleteQualification(id);
-        request.setHospId(BaseUtil.getCurrentLoginHospId());
         request.setUpdateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
         request.setUpdateTime(new Date());
-        request.setCreateUser(qualification.getCreateUser());
-        request.setCreateTime(qualification.getCreateTime());
-        qualificationRepository.save(request);
+        qualificationRepository.updateById(request);
     }
 
     @Override
@@ -200,7 +336,8 @@ public class QualificationServiceImpl extends ServiceImpl<QualificationMapper, Q
     /**
      * 递归获取的资质分类编码的下级编码列表
      */
-    private List<String> getQualificationTypeCodeRecursion(List<QualificationType> typeList, String qualificationCode){
+    @Override
+    public List<String> getQualificationTypeCodeRecursion(List<QualificationType> typeList, String qualificationCode){
 
         List<String> list = new ArrayList<>();
 

+ 48 - 0
src/main/java/com/kcim/vo/QualificationAuditVO.java

@@ -0,0 +1,48 @@
+package com.kcim.vo;
+
+import cn.hutool.core.date.DateTime;
+import lombok.Data;
+
+@Data
+public class QualificationAuditVO{
+
+    /**
+     * 资质申请id
+     */
+    private Integer id;
+
+    /**
+     * 授权期限 1长期授权 2临时授权 3单次授权
+     */
+    private Integer qualificationPeriod;
+
+    /**
+     * 授权开始时间
+     */
+    private DateTime beginDate;
+
+    /**
+     * 授权结束时间
+     */
+    private DateTime endDate;
+
+    /**
+     * 科主任意见
+     */
+    private String deptOpinion;
+
+    /**
+     * 医务部意见
+     */
+    private String managerOpinion;
+
+    /**
+     * 院领导意见
+     */
+    private String masterOpinion;
+
+    /**
+     * 需要院领导审核
+     */
+    private Integer needMasterAudit;
+}

+ 3 - 1
src/main/java/com/kcim/vo/SessionUserVO.java

@@ -38,5 +38,7 @@ public class SessionUserVO {
      */
     private Long currentLoginHospId;
 
-    // TODO: 2022/1/4 按业务需求新增
+    private Long orgnId;
+
+    private String orgnName;
 }

+ 190 - 0
src/main/java/com/kcim/vo/UserInfoVO.java

@@ -0,0 +1,190 @@
+package com.kcim.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.kcim.dao.model.DoctorAttachment;
+import io.swagger.annotations.ApiModel;
+import lombok.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 我的主页 用户信息相关
+ *
+ * @author jinhu
+ * @date 2024/11/23
+ **/
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel
+public class UserInfoVO {
+
+    private Long id;
+    /**
+     * 用户名称
+     */
+    private String name;
+
+    /**
+     * 账号
+     */
+    private String account;
+
+    /**
+     * 头像url
+     */
+    private String avatarUrl;
+    /**
+     * 性别:0.男,1.女
+     */
+    private String gender;
+
+    /**
+     * 人员类别,待定
+     */
+    private String userCate;
+
+    /**
+     * 人员部门id,两者待定,可暂时不存在
+     */
+    private String departmentId;
+    /**
+     * 人员部门名称
+     */
+    private String departmentName;
+
+    /**
+     * 职位
+     */
+    private String jobTitle;
+    /**
+     * 职称
+     */
+    private String title;
+    /**
+     * 医师级别
+     */
+    private String doctorLevel;
+    /**
+     * 执业科目
+     */
+    private String practiceSubject;
+    /**
+     * 执业类别
+     */
+    private String practiceCate;
+    /**
+     * 专业
+     */
+    private String major;
+    /**
+     * 入职时间
+     */
+    private Date entryTime;
+    /**
+     * 资格证号
+     */
+    private String qualificationCertificateNo;
+    /**
+     * 执业证号
+     */
+    private String practiceCertificateNo;
+    /**
+     * 执业状态:(待提供)
+     */
+    private String practiceStatus;
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * '岗位'
+     */
+    private String position;
+
+    /**
+     * '学历'
+     */
+    private String degree;
+
+    /**
+     * '毕业院校'
+     */
+    private String graduateSchool;
+
+    /**
+     * 是否在职 1.不在职;默认0
+     */
+    private Integer isOnService;
+
+    /**
+     * 人员类别,待定
+     */
+
+    private String userCateName;
+
+    /**
+     * 职务
+     */
+
+    private String jobTitleName;
+
+    /**
+     * 职称
+     */
+
+    private String titleName;
+
+    /**
+     * 岗位
+     */
+
+    private String positionName;
+
+    /**
+     * 学历
+     */
+
+    private String degreeName;
+
+    /**
+     * 医师级别
+     */
+
+    private String doctorLevelName;
+
+    /**
+     * 执业科目
+     */
+
+    private String practiceSubjectName;
+
+    /**
+     * 执业类别
+     */
+
+    private String practiceCateName;
+
+    /**
+     * 专业
+     */
+
+    private String majorName;
+
+    /**
+     * 执业状态:(待提供)
+     */
+
+    private String practiceStatusName;
+
+    /**
+     * 是否在职 1.不在职;默认0
+     */
+    private String isOnServiceName;
+
+    List<DoctorAttachment> userAttachment;
+}

+ 121 - 0
src/main/resources/application-demo.yml

@@ -0,0 +1,121 @@
+server:
+  port: 8601
+  servlet:
+    context-path: /medical
+mybatis-plus:
+  mapper-locations: classpath*:/mapper/*.xml
+  type-aliases-package: com.kcim.dao.model
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      id-type: auto
+      logic-not-delete-value: 0
+      logic-delete-value: 1
+    banner: false
+    enable-sql-runner: true
+
+  #mysql 配置
+spring:
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://47.96.149.190:3306/medical?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+    #    url: jdbc:mysql://118.31.245.65:3306/imed_pfm?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+    username: root
+    password: xywl2021!
+    #    password: zjxyxywl2021
+    hikari:
+      maximum-pool-size: 15
+      minimum-idle: 5
+      idle-timeout: 300000
+      connection-timeout: 300000
+      max-lifetime: 180000
+      auto-commit: true
+      connection-test-query: SELECT 1
+  application:
+    name: kcim-medical
+  cloud:
+    nacos: #注册nacos
+      discovery:
+        service: ${spring.application.name}
+        server-addr: 120.27.235.181:8848
+        group: prod
+        namespace: 1814ad0c-58c5-4de8-a786-6f12aee361cd
+
+  #redis
+  redis:
+    database: 1
+    port: 6379
+    host: 47.96.149.190
+    #    host: 118.31.245.65
+    password: xywl2021!
+    #    password: xywl2021#
+    #    jedis:
+    # 使用lettuce 连接池
+    lettuce:
+      pool:
+        max-active: 30
+        max-idle: 10
+        max-wait: -1
+        min-idle: 0
+  cache:
+    type: redis
+  servlet:
+    multipart:
+      #最大限制10MB文件
+      max-file-size: 10MB
+      ##json处理
+  jackson:
+    date-format: yyyy-MM-dd hh:mm:ss
+    time-zone: GMT+8
+    default-property-inclusion: non_null
+    #日志
+    # log config
+
+
+logging:
+
+  #  config: classpath:log4j2.xml
+  level:
+    io.swagger.models.parameters.AbstractSerializableParameter: error
+    org.springframework.web: error
+    org.hibernate.SQL: debug
+    org.hibernate.engine.QueryParameters: debug
+    org.hibernate.engine.query.HQLQueryPlan: debug
+    org.hibernate.type.descriptor.sql.BasicBinder: trace
+
+sa-token:
+  jwt-secret-key: kcim-oauth
+  #  kcim-oauth
+  ## 前后端分离不设置会有奇怪的问题
+  ## 默认采用的获取token 是从请求头默认名称为Sa-token的地方获取,如果没有会从Cookie中获取,会造成奇怪的问题!!
+  token-name: token
+  is-read-cookie: false
+  is-read-body: false
+  ##token 有效期 默认30天,到期强制登录
+  timeout: 2592000
+  ## 30分钟无操作就失效 不适用
+  activity-timeout: 1800
+  # 配置 Sa-Token 单独使用的 Redis 连接
+  alone-redis:
+    # Redis数据库索引(默认为0) 先固定2,后续有钱开另外的单独的db
+    database: 1
+    # Redis服务器地址
+    host: 47.96.149.190
+    # Redis服务器连接端口
+    port: 6379
+    # Redis服务器连接密码(默认为空)
+    password: xywl2021!
+    # 连接超时时间
+    timeout: 10s
+  #    host: 118.31.245.65
+  #    password: xywl2021#
+
+  is-log: false
+minio:
+  url: http://47.97.198.219:9000
+  port: 9000
+  access-key: UOxpxcO0loqZqKzH
+  secret-key: KfHhDLRWL0PtaWW0JTXqz6Gn685P2EWY
+  bucket-name: kcim-medical

+ 0 - 5
src/main/resources/application-dev.yml

@@ -44,11 +44,6 @@ spring:
         #        group: KCIM
         namespace: 060cc0fe-193f-4a94-bbca-6d48a4f95ac2
         group: dev
-    sentinel:
-      enabled: true
-      transport:
-        port: 8719
-        dashboard: 120.27.235.181:8080
 
   #redis
   redis: