Преглед на файлове

添加消息中心服务

wuyunfeng преди 1 година
родител
ревизия
7763c338d3
променени са 72 файла, в които са добавени 1257 реда и са изтрити 385 реда
  1. 9 3
      ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/controller/PatientController.java
  2. 2 2
      ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/DoctorAdviceService.java
  3. 8 4
      ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/PatientService.java
  4. 20 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessageSendRecordController.java
  5. 21 2
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessageTypeController.java
  6. 18 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessagesController.java
  7. 20 5
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/TemplateMessageParamerController.java
  8. 20 5
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/TemplateMessageTplController.java
  9. 18 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/MessageSendRecordServiceImpl.java
  10. 24 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/MessageTypeServiceImpl.java
  11. 50 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/MessagesServiceImpl.java
  12. 26 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/TemplateMessageParamerServiceImpl.java
  13. 102 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/TemplateMessageTplServiceImpl.java
  14. 3 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/MessageSendRecordService.java
  15. 5 1
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/MessageTypeService.java
  16. 24 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/MessagesService.java
  17. 4 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/TemplateMessageParamerService.java
  18. 10 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/TemplateMessageTplService.java
  19. 4 3
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntraceDepartmentFeignClient.java
  20. 3 2
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntraceDoctorAdviceFeignClient.java
  21. 4 3
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntraceEmployeeFeignClient.java
  22. 10 6
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntracePatientFeignClient.java
  23. 3 2
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/open/DoctorAdviceFeignClient.java
  24. 4 0
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/system/CustomerFeignClient.java
  25. 16 8
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/retryer/MyRetryer.java
  26. 1 1
      ncs-ms-framework/src/main/java/com/wdklian/ncs/ms/framework/mvc/GridParameterParser.java
  27. 1 1
      ncs-ms-framework/src/main/resources/logback.xml
  28. 3 2
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/controller/DoctorAdviceController.java
  29. 42 0
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/mq/DoctorAdviceSyncConsumer.java
  30. 25 0
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/mq/RabbitMQConfig.java
  31. 8 7
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/AdviceReferenceBoardItemServiceImpl.java
  32. 10 9
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/AdviceReferenceNursingMarkOptionServiceImpl.java
  33. 8 7
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/AdviceUniqueContentServiceImpl.java
  34. 5 5
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/BoardItemConfigServiceImpl.java
  35. 1 1
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/DepartmentServiceImpl.java
  36. 8 7
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/DoctorAdviceServiceImpl.java
  37. 4 5
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/EmployeeServiceImpl.java
  38. 12 12
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/NursingMarkCategoryConfigServiceImpl.java
  39. 5 5
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/NursingMarkOptionConfigServiceImpl.java
  40. 7 10
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/PatientServiceImpl.java
  41. 1 1
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/common/DoctorAdviceHelper.java
  42. 30 31
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/BoardItemServiceImpl.java
  43. 2 5
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/ClerkServiceImpl.java
  44. 17 1
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/CustomerMappingServiceImpl.java
  45. 65 60
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/CustomerServiceImpl.java
  46. 3 0
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/DeviceServiceImpl.java
  47. 1 1
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/MemberServiceImpl.java
  48. 85 51
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/NurseConfigOptionServiceImpl.java
  49. 36 37
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/NurseConfigServiceImpl.java
  50. 13 12
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/ShopServiceImpl.java
  51. 4 0
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/iservice/CustomerMappingService.java
  52. 2 0
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/iservice/NurseConfigOptionService.java
  53. 2 0
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/iservice/NurseConfigService.java
  54. 33 0
      ncs-system-service/src/main/resources/bootstrap.yml
  55. 0 3
      pom.xml
  56. 4 2
      third-part-wn-hl7/pom.xml
  57. 34 10
      third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/config/MyHL7BusinessLogicService.java
  58. 46 0
      third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/mq/DoctorAdviceSyncConsumer.java
  59. 25 0
      third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/mq/RabbitMQConfig.java
  60. 32 0
      third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/stream/DoctorAdviceHandler.java
  61. 25 0
      third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/stream/DoctorAdviceSender.java
  62. 47 8
      third-part-wn-hl7/src/main/resources/bootstrap.yml
  63. 4 0
      third-part-wn-hl7/src/test/java/WNServiceTest.java
  64. 29 15
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/MessageSendRecordDO.java
  65. 1 6
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/MessageTypeDO.java
  66. 25 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/MessagesDO.java
  67. 42 22
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/TemplateMessageParamerDO.java
  68. 11 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/TemplateMessageTplDO.java
  69. 30 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/vos/MessageTypeVO.java
  70. 31 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/vos/TemplateMessageTplVO.java
  71. 4 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/system/vos/CustomerNurseConfigMappingVO.java
  72. 5 2
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/system/vos/NurseOptionCompareVO.java

+ 9 - 3
ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/controller/PatientController.java

@@ -42,14 +42,14 @@ public class PatientController {
     }
 
 
-    @GetMapping("/sync-single/{patient_key}")
+    @PostMapping("/sync-single/{patient_key}")
     @ApiOperation(value = "根据患者主键把患者同步到呼叫系统", response = SinglePatientResponse.class)
     public CommonResult<PatientDO> syncSinglePatientByKey(@PathVariable("patient_key") String patientKey) {
         return CommonResult.success(patientService.syncPatientByKey(patientKey));
     }
 
     @PostMapping("/patient-out/{patient_key}")
-    @ApiOperation(value = "指定患者主键出院",response = SinglePatientResponse.class)
+    @ApiOperation(value = "指定患者主键出院", response = SinglePatientResponse.class)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "patient_key", value = "患者主键", required = true, dataType = "String", paramType = "path")
     })
@@ -57,13 +57,19 @@ public class PatientController {
         return CommonResult.success(patientService.patientOut(patientKey));
     }
 
-    @GetMapping("/sync-all")
+    @PostMapping("/sync-all")
     @ApiOperation(value = "更新所有患者信息,his数据库转换到ncs库,仅对视图同步方式有效")
     public void syncAllPatient() {
         patientService.syncAllPatient();
     }
 
 
+    @PostMapping("/sync-all-tp")
+    @ApiOperation(value = "更新所有患者信息,his数据库转换到ncs库,仅对接口数据有有效")
+    public void syncAllPatientTp() {
+        patientService.syncAllPatientTp();
+    }
+
     //以下类为swagger返回示例准备
     private class ListPatientResponse extends CommonResult<List<PatientDO>> implements Serializable {
 

+ 2 - 2
ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/DoctorAdviceService.java

@@ -72,10 +72,10 @@ public class DoctorAdviceService {
     }
 
     private void handleAdviceChange(List<DoctorAdviceDO> changedAdvices) {
-        if (changedAdvices != null && changedAdvices.size() > 0) {//医嘱信息有变化,刷新有变化的科室的护理标识和看板条目内容
+        if (changedAdvices != null && !changedAdvices.isEmpty()) {//医嘱信息有变化,刷新有变化的科室的护理标识和看板条目内容
             //这里无需得到执行结果,开启线程去执行
             Runnable r = () -> {
-                List<String> adviceChangedDepartKeys = changedAdvices.stream().map(p -> p.getHisPartKey()).collect(Collectors.toList());
+                List<String> adviceChangedDepartKeys = changedAdvices.stream().map(DoctorAdviceDO::getHisPartKey).collect(Collectors.toList());
                 this.nursingMarkFeignClient.renewDepartNursingByHisPartKeys(adviceChangedDepartKeys);
                 this.boardItemFeignClient.renewDepartBoardItemByHisPartKeys(adviceChangedDepartKeys);
             };

+ 8 - 4
ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/PatientService.java

@@ -30,11 +30,11 @@ public class PatientService {
     public List<PatientDO> savePatient(List<PatientDO> patients) {
         List<PatientDO> changedPatient = this.patientFeignClient.syncPatient(patients).getData();
         //对有变化的患者,调用system接口更新数据
-        if (changedPatient != null && changedPatient.size() > 0) {
+        if (changedPatient != null && !changedPatient.isEmpty()) {
             //更新呼叫系统数据
             List<CustomerDO> changedCustomer = this.customerFeignClient.syncPatient(changedPatient).getData();
             //更新patient的partId
-            if (changedCustomer != null && changedCustomer.size() > 0) {
+            if (changedCustomer != null && !changedCustomer.isEmpty()) {
                 this.patientFeignClient.updatePatientPartId(changedCustomer);
             }
         }
@@ -46,7 +46,7 @@ public class PatientService {
         if (changedPatient != null) {
             List<CustomerDO> changedCustomer = this.customerFeignClient.syncSinglePatient(changedPatient).getData();
             //更新patient的partId
-            if (changedCustomer != null&&changedCustomer.size()>0) {
+            if (changedCustomer != null&& !changedCustomer.isEmpty()) {
                 this.patientFeignClient.updatePatientPartId(changedCustomer);
             }
         }
@@ -70,7 +70,7 @@ public class PatientService {
         List<CustomerDO> customerDOS = this.customerFeignClient.syncSinglePatient(patientDO).getData();
 
         //更新patient的partId
-        if (customerDOS != null&&customerDOS.size()>0) {
+        if (customerDOS != null&& !customerDOS.isEmpty()) {
             this.patientFeignClient.updatePatientPartId(customerDOS);
         }
         return patientDO;
@@ -79,5 +79,9 @@ public class PatientService {
     public void syncAllPatient() {
         this.customerFeignClient.syncAllPatient();
     }
+
+    public void syncAllPatientTp() {
+        this.customerFeignClient.syncTPAllPatient();
+    }
 }
 

+ 20 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessageSendRecordController.java

@@ -18,6 +18,7 @@ import springfox.documentation.annotations.ApiIgnore;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * @author wuyunfeng
@@ -66,6 +67,25 @@ public class MessageSendRecordController {
         return messageSendRecordDO;
     }
 
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "获取消息发送记录", response = MessageSendRecordDO.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "int", paramType = "path")})
+    public MessageSendRecordDO get(@PathVariable("id") Integer id) {
+        return this.messageSendRecordService.getModel(id);
+    }
+
+
+    @GetMapping(value = "customer/{part_id}/{customer_id}")
+    @ApiOperation(value = "获取指定用户消息记录", response = MessageSendRecordDO.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "customer_id", value = "客户主键", required = true, dataType = "int", paramType = "path"),
+           @ApiImplicitParam(name = "part_id", value = "部门主键", required = true, dataType = "int", paramType = "path")})
+    public List<MessageSendRecordDO> getCustomerRecord(@PathVariable("part_id") Integer partId, @PathVariable("customer_id") Integer customerId) {
+        return this.messageSendRecordService.listByCustomerId(partId,customerId);
+    }
+
+
     @DeleteMapping(value = "/{ids}")
     @ApiOperation(value = "删除消息类型")
     @ApiImplicitParams({

+ 21 - 2
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessageTypeController.java

@@ -1,6 +1,7 @@
 package com.wdklian.ncs.ms.message.center.controller;
 
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessageTypeDO;
+import com.wdklian.ncs.ms.common.entity.msgcenter.vos.MessageTypeVO;
 import com.wdklian.ncs.ms.framework.database.Page;
 import com.wdklian.ncs.ms.framework.mvc.GridParameter;
 import com.wdklian.ncs.ms.framework.mvc.GridParameterParser;
@@ -18,6 +19,7 @@ import springfox.documentation.annotations.ApiIgnore;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * @author wuyunfeng
@@ -40,8 +42,8 @@ public class MessageTypeController {
             @ApiImplicitParam(name = "page_size", value = "每页显示数量", required = true, dataType = "int", paramType = "query")
     })
     @PostMapping("/page")
-    public Page list(@ApiIgnore @NotNull(message = "页码不能为空") Integer pageNo,
-                     @ApiIgnore @NotNull(message = "页容量") Integer pageSize,
+    public Page list(@ApiIgnore @NotNull(message = "页码不能为空") @RequestParam("page_no") Integer pageNo,
+                     @ApiIgnore @NotNull(message = "页容量") @RequestParam("page_size") Integer pageSize,
                      HttpServletRequest request) {
         GridParameter gp = GridParameterParser.parse(MessageTypeDO.class, request.getParameterMap());
 
@@ -74,4 +76,21 @@ public class MessageTypeController {
         return "";
     }
 
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "根据id查询消息类型")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "要查询的消息类型主键", required = true, dataType = "int", paramType = "path")})
+    public MessageTypeDO get(@PathVariable Integer id) {
+        return this.messageTypeService.getModel(id);
+    }
+
+    @GetMapping(value = "/all")
+    @ApiOperation(value = "查询所有消息类型")
+    public List<MessageTypeDO> getAll() {
+        return this.messageTypeService.getAll();
+    }
+
+
+
+
 }

+ 18 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessagesController.java

@@ -1,6 +1,7 @@
 package com.wdklian.ncs.ms.message.center.controller;
 
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessagesDO;
+import com.wdklian.ncs.ms.common.entity.msgcenter.vos.MessageTypeVO;
 import com.wdklian.ncs.ms.framework.database.Page;
 import com.wdklian.ncs.ms.framework.mvc.GridParameter;
 import com.wdklian.ncs.ms.framework.mvc.GridParameterParser;
@@ -18,6 +19,7 @@ import springfox.documentation.annotations.ApiIgnore;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * @author wuyunfeng
@@ -75,4 +77,20 @@ public class MessagesController {
         return "";
     }
 
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "根据id查询消息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "要查询的消息主键", required = true, dataType = "int", paramType = "path")})
+
+    public MessagesDO get(@PathVariable Integer id) {
+        return this.messagesService.getModel(id);
+    }
+
+    @GetMapping(value = "/type-and-messages/{part_id}")
+    @ApiOperation(value = "查询科室下的消息类型和消息列表")
+    public List<MessageTypeVO> listTypeAndMessages(@PathVariable("part_id") Integer partId) {
+        return this.messagesService.listMessageTypeVOByPartId(partId);
+    }
+
+
 }

+ 20 - 5
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/TemplateMessageParamerController.java

@@ -18,6 +18,7 @@ import springfox.documentation.annotations.ApiIgnore;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * @author wuyunfeng
@@ -34,7 +35,7 @@ public class TemplateMessageParamerController {
     @Autowired
     private TemplateMessageParamerService templateMessageParamerService;
 
-    @ApiOperation(value = "分页查询消息类型", response = TemplateMessageParamerDO.class)
+    @ApiOperation(value = "分页查询模版消息参数", response = TemplateMessageParamerDO.class)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "page_no", value = "页码", required = true, dataType = "int", paramType = "query"),
             @ApiImplicitParam(name = "page_size", value = "每页显示数量", required = true, dataType = "int", paramType = "query")
@@ -49,7 +50,7 @@ public class TemplateMessageParamerController {
     }
 
 
-    @ApiOperation(value = "添加消息类型", response = TemplateMessageParamerDO.class)
+    @ApiOperation(value = "添加模版消息参数", response = TemplateMessageParamerDO.class)
     @PostMapping
     public TemplateMessageParamerDO add(@Valid TemplateMessageParamerDO templateMessageParamerDO) {
         this.templateMessageParamerService.add(templateMessageParamerDO);
@@ -57,7 +58,7 @@ public class TemplateMessageParamerController {
     }
 
     @PutMapping(value = "/{id}")
-    @ApiOperation(value = "修改消息类型", response = TemplateMessageParamerDO.class)
+    @ApiOperation(value = "修改模版消息参数", response = TemplateMessageParamerDO.class)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "int", paramType = "path")})
     public TemplateMessageParamerDO edit(@Valid TemplateMessageParamerDO templateMessageParamerDO, @PathVariable Integer id) {
@@ -66,12 +67,26 @@ public class TemplateMessageParamerController {
     }
 
     @DeleteMapping(value = "/{ids}")
-    @ApiOperation(value = "删除消息类型")
+    @ApiOperation(value = "删除模版消息参数")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "ids", value = "要删除的消息类型主键列表", required = true, dataType = "int", paramType = "path", allowMultiple = true)})
+            @ApiImplicitParam(name = "ids", value = "要删除的模版消息参数主键列表", required = true, dataType = "int", paramType = "path", allowMultiple = true)})
     public String delete(@PathVariable Integer[] ids) {
         this.templateMessageParamerService.delete(ids);
         return "";
     }
 
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "根据id查询模版消息参数")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "int", paramType = "path")})
+    public TemplateMessageParamerDO get(@PathVariable Integer id) {
+        return this.templateMessageParamerService.getModel(id);
+    }
+
+    @GetMapping(value = "/all")
+    @ApiOperation(value = "查询所有模版消息参数", response = TemplateMessageParamerDO.class, responseContainer = "list")
+    public List<TemplateMessageParamerDO> listAll() {
+        return this.templateMessageParamerService.listAll();
+    }
+
 }

+ 20 - 5
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/TemplateMessageTplController.java

@@ -1,6 +1,7 @@
 package com.wdklian.ncs.ms.message.center.controller;
 
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.TemplateMessageTplDO;
+import com.wdklian.ncs.ms.common.entity.msgcenter.vos.TemplateMessageTplVO;
 import com.wdklian.ncs.ms.framework.database.Page;
 import com.wdklian.ncs.ms.framework.mvc.GridParameter;
 import com.wdklian.ncs.ms.framework.mvc.GridParameterParser;
@@ -18,6 +19,7 @@ import springfox.documentation.annotations.ApiIgnore;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * @author wuyunfeng
@@ -26,7 +28,7 @@ import javax.validation.constraints.NotNull;
  */
 @RestController
 @Slf4j
-@Api(description = "模版消息管理API", tags = "模版消息管理API")
+@Api(description = "模板消息管理API", tags = "模板消息管理API")
 @RequestMapping("/template-message-tpl")
 @Validated
 public class TemplateMessageTplController {
@@ -35,7 +37,7 @@ public class TemplateMessageTplController {
     @Autowired
     private TemplateMessageTplService templateMessageTplService;
 
-    @ApiOperation(value = "分页查询模消息", response = TemplateMessageTplDO.class)
+    @ApiOperation(value = "分页查询模消息", response = TemplateMessageTplDO.class)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "page_no", value = "页码", required = true, dataType = "int", paramType = "query"),
             @ApiImplicitParam(name = "page_size", value = "每页显示数量", required = true, dataType = "int", paramType = "query")
@@ -50,7 +52,7 @@ public class TemplateMessageTplController {
     }
 
 
-    @ApiOperation(value = "添加模消息", response = TemplateMessageTplDO.class)
+    @ApiOperation(value = "添加模消息", response = TemplateMessageTplDO.class)
     @PostMapping
     public TemplateMessageTplDO add(@Valid TemplateMessageTplDO templateMessageTplDO) {
         this.templateMessageTplService.add(templateMessageTplDO);
@@ -58,7 +60,7 @@ public class TemplateMessageTplController {
     }
 
     @PutMapping(value = "/{id}")
-    @ApiOperation(value = "修改模消息", response = TemplateMessageTplDO.class)
+    @ApiOperation(value = "修改模消息", response = TemplateMessageTplDO.class)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "int", paramType = "path")})
     public TemplateMessageTplDO edit(@Valid TemplateMessageTplDO templateMessageTplDO, @PathVariable Integer id) {
@@ -67,11 +69,24 @@ public class TemplateMessageTplController {
     }
 
     @DeleteMapping(value = "/{ids}")
-    @ApiOperation(value = "删除模消息")
+    @ApiOperation(value = "删除模消息")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "ids", value = "要删除的消息类型主键列表", required = true, dataType = "int", paramType = "path", allowMultiple = true)})
     public String delete(@PathVariable Integer[] ids) {
         this.templateMessageTplService.delete(ids);
         return "";
     }
+
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "根据id查询模板消息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "要查询的消息类型主键", required = true, dataType = "int", paramType = "path")})
+    public TemplateMessageTplDO get(@PathVariable Integer id) {
+        return this.templateMessageTplService.getModel(id);
+    }
+    @GetMapping(value = "/template-message/{part_id}")
+    @ApiOperation(value = "查询科室下的模板消息")
+    public List<TemplateMessageTplVO> listTemplateMessage(@PathVariable("part_id") Integer partId) {
+        return this.templateMessageTplService.listTemplateMessageTplVOByPartId(partId);
+    }
 }

+ 18 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/MessageSendRecordServiceImpl.java

@@ -1,10 +1,13 @@
 package com.wdklian.ncs.ms.message.center.service.impl;
 
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessageSendRecordDO;
+import com.wdklian.ncs.ms.framework.database.annotation.Table;
 import com.wdklian.ncs.ms.message.center.service.iservice.MessageSendRecordService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @author wuyunfeng
  * 2024-04-08 16:44
@@ -13,4 +16,19 @@ import org.springframework.stereotype.Service;
 @Slf4j
 @Service
 public class MessageSendRecordServiceImpl extends MessageCenterCRUDServiceImpl<MessageSendRecordDO> implements MessageSendRecordService {
+
+
+    @Override
+    public MessageSendRecordDO add(MessageSendRecordDO messageSendRecordDO) {
+        MessageSendRecordDO add = super.add(messageSendRecordDO);
+        int lastId = this.daoSupport.getLastId(MessageSendRecordDO.class.getAnnotation(Table.class).name());
+        add.setId(lastId);
+        return add;
+    }
+
+    @Override
+    public List<MessageSendRecordDO> listByCustomerId(Integer partId, Integer customerId) {
+        String sql = "select * from " + MessageSendRecordDO.class.getAnnotation(Table.class).name() + " where customer_id = ? and part_id = ?";
+        return this.daoSupport.queryForList(sql, MessageSendRecordDO.class, customerId, partId);
+    }
 }

+ 24 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/MessageTypeServiceImpl.java

@@ -1,11 +1,18 @@
 package com.wdklian.ncs.ms.message.center.service.impl;
 
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessageTypeDO;
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessagesDO;
+import com.wdklian.ncs.ms.framework.database.annotation.Table;
+import com.wdklian.ncs.ms.framework.exception.ServiceException;
 import com.wdklian.ncs.ms.framework.util.DateUtil;
 import com.wdklian.ncs.ms.message.center.service.iservice.MessageTypeService;
+import com.wdklian.ncs.ms.message.center.service.iservice.MessagesService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.List;
+
 /**
  * @author wuyunfeng
  * 2024-04-08 14:51
@@ -15,6 +22,8 @@ import org.springframework.stereotype.Service;
 @Slf4j
 public class MessageTypeServiceImpl extends MessageCenterCRUDServiceImpl<MessageTypeDO> implements MessageTypeService {
 
+    @Resource
+    MessagesService messagesService;
     @Override
     public MessageTypeDO add(MessageTypeDO messageTypeDO) {
         if(messageTypeDO.getCreateTime()==null){
@@ -28,4 +37,19 @@ public class MessageTypeServiceImpl extends MessageCenterCRUDServiceImpl<Message
         messageTypeDO.setUpdateTime(DateUtil.getDateline());
         return super.edit(messageTypeDO, id);
     }
+
+    @Override
+    public void delete(Integer[] ids) {
+      List<MessagesDO> messagesDOS =  messagesService.listByTypeIds(ids);
+      if(messagesDOS!=null&&!messagesDOS.isEmpty()) {
+          throw new ServiceException("MESSAGE_TYPE_DELETE_FAILED");
+      }
+        super.delete(ids);
+    }
+
+    @Override
+    public List<MessageTypeDO> getAll() {
+        String sql="select * from "+MessageTypeDO.class.getAnnotation(Table.class).name();
+        return this.daoSupport.queryForList(sql,MessageTypeDO.class);
+    }
 }

+ 50 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/MessagesServiceImpl.java

@@ -1,10 +1,21 @@
 package com.wdklian.ncs.ms.message.center.service.impl;
 
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessageTypeDO;
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessagesDO;
+import com.wdklian.ncs.ms.common.entity.msgcenter.vos.MessageTypeVO;
+import com.wdklian.ncs.ms.framework.database.annotation.Table;
+import com.wdklian.ncs.ms.framework.util.BeanUtil;
+import com.wdklian.ncs.ms.message.center.service.iservice.MessageTypeService;
 import com.wdklian.ncs.ms.message.center.service.iservice.MessagesService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * @author wuyunfeng
  * 2024-04-08 16:25
@@ -13,4 +24,43 @@ import org.springframework.stereotype.Service;
 @Slf4j
 @Service
 public class MessagesServiceImpl extends MessageCenterCRUDServiceImpl<MessagesDO> implements MessagesService {
+
+    @Resource
+    MessageTypeService messageTypeService;
+    @Override
+    public List<MessagesDO> listByTypeIds(Integer[] ids) {
+        String sql="select * from "+MessagesDO.class.getAnnotation(Table.class).name()+" where find_in_set(message_type_id,?)";
+        return this.daoSupport.queryForList(sql,MessagesDO.class, String.join(",",Arrays.stream(ids).map(String::valueOf).toArray(String[]::new)));
+    }
+
+
+
+
+    @Override
+    public List<MessageTypeVO> listMessageTypeVOByPartId(Integer partId) {
+        List<MessageTypeVO> messageTypeVOS = new ArrayList<>();
+        List<MessageTypeDO> all = messageTypeService.getAll();
+        if(all!=null&&!all.isEmpty()){
+            List<MessagesDO> messagesDOS = this.listMessagesByPartId(partId);
+            all.forEach(messageTypeDO -> {
+                MessageTypeVO messageTypeVO = new MessageTypeVO();
+                BeanUtil.copyProperties(messageTypeDO,messageTypeVO);
+                if(messagesDOS!=null&&!messagesDOS.isEmpty()){
+                    List<MessagesDO> messages = messagesDOS.stream().filter(messagesDO -> messagesDO.getMessageTypeId().equals(messageTypeDO.getId())).collect(Collectors.toList());
+                    messageTypeVO.setMessages(messages);
+                }
+                messageTypeVOS.add(messageTypeVO);
+            });
+        }
+
+        return messageTypeVOS;
+    }
+
+    @Override
+    public List<MessagesDO> listMessagesByPartId(Integer partId) {
+
+        String sql="select * from "+MessagesDO.class.getAnnotation(Table.class).name()+" where (part_id=? or bool_shared=1) and status=1 ";
+
+        return this.daoSupport.queryForList(sql,MessagesDO.class,partId);
+    }
 }

+ 26 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/TemplateMessageParamerServiceImpl.java

@@ -1,10 +1,17 @@
 package com.wdklian.ncs.ms.message.center.service.impl;
 
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.TemplateMessageParamerDO;
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.TemplateMessageTplDO;
+import com.wdklian.ncs.ms.framework.database.annotation.Table;
+import com.wdklian.ncs.ms.framework.exception.ServiceException;
 import com.wdklian.ncs.ms.message.center.service.iservice.TemplateMessageParamerService;
+import com.wdklian.ncs.ms.message.center.service.iservice.TemplateMessageTplService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.List;
+
 /**
  * @author wuyunfeng
  * 2024-04-08 17:29
@@ -13,4 +20,23 @@ import org.springframework.stereotype.Service;
 @Slf4j
 @Service
 public class TemplateMessageParamerServiceImpl extends MessageCenterCRUDServiceImpl<TemplateMessageParamerDO> implements TemplateMessageParamerService {
+
+    @Resource
+    private TemplateMessageTplService templateMessageTplService;
+    @Override
+    public List<TemplateMessageParamerDO> listAll() {
+        String sql = "select * from "+TemplateMessageParamerDO.class.getAnnotation(Table.class).name();
+        return this.daoSupport.queryForList(sql,TemplateMessageParamerDO.class);
+    }
+
+    @Override
+    public void delete(Integer[] ids) {
+        //校验模版消息参数是否被模版消息引用
+        List<TemplateMessageTplDO> templateMessageTplDOS = templateMessageTplService.listByParamerIds(ids);
+        if(!templateMessageTplDOS.isEmpty()){
+            throw new ServiceException("TEMPLATE_DELETE_FAILED");
+        }
+
+        super.delete(ids);
+    }
 }

+ 102 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/TemplateMessageTplServiceImpl.java

@@ -1,10 +1,27 @@
 package com.wdklian.ncs.ms.message.center.service.impl;
 
+import com.alibaba.fastjson2.JSON;
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.TemplateMessageParamerDO;
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.TemplateMessageTplDO;
+import com.wdklian.ncs.ms.common.entity.msgcenter.vos.TemplateMessageTplVO;
+import com.wdklian.ncs.ms.framework.database.annotation.Table;
+import com.wdklian.ncs.ms.framework.exception.ServiceException;
+import com.wdklian.ncs.ms.framework.util.BeanUtil;
+import com.wdklian.ncs.ms.message.center.service.iservice.TemplateMessageParamerService;
 import com.wdklian.ncs.ms.message.center.service.iservice.TemplateMessageTplService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.rmi.server.ServerCloneException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
 /**
  * @author wuyunfeng
  * 2024-04-08 17:12
@@ -14,4 +31,89 @@ import org.springframework.stereotype.Service;
 @Service
 public class TemplateMessageTplServiceImpl extends MessageCenterCRUDServiceImpl<TemplateMessageTplDO> implements TemplateMessageTplService {
 
+    @Autowired
+    private TemplateMessageParamerService templateMessageParamerService;
+    @Override
+    public TemplateMessageTplDO add(TemplateMessageTplDO templateMessageTplDO) {
+        //校验模版消息参数
+        List<Integer> paramIds=new ArrayList<>();
+        this.validateTemplateMessageParam(templateMessageTplDO,paramIds);
+        templateMessageTplDO.setParamers(JSON.toJSONString(paramIds));
+        this.daoSupport.insert(templateMessageTplDO);
+        int lastId = this.daoSupport.getLastId(TemplateMessageTplDO.class.getAnnotation(Table.class).name());
+        templateMessageTplDO.setId(lastId);
+        return null;
+    }
+
+    @Override
+    public TemplateMessageTplDO edit(TemplateMessageTplDO templateMessageTplDO, Integer id) {
+        //校验模版消息参数
+        List<Integer> paramIds=new ArrayList<>();
+        this.validateTemplateMessageParam(templateMessageTplDO,paramIds);
+        templateMessageTplDO.setParamers(JSON.toJSONString(paramIds));
+        this.daoSupport.update(templateMessageTplDO,id);
+        return templateMessageTplDO;
+    }
+
+    private void validateTemplateMessageParam(TemplateMessageTplDO templateMessageTplDO,List<Integer> paramIds) {
+
+        List<TemplateMessageParamerDO> list = this.templateMessageParamerService.listAll();
+
+        Pattern pattern = Pattern.compile("\\$\\{([^}]+)}");
+        Matcher matcher = pattern.matcher(templateMessageTplDO.getTemplateContent());
+        while (matcher.find()) {
+            String group = matcher.group(1);
+            TemplateMessageParamerDO templateMessageParamerDO = list.stream().filter(p -> p.getParamName().equals(group)).findFirst().orElse(null);
+            if(templateMessageParamerDO!=null){
+                paramIds.add(templateMessageParamerDO.getId());
+            }else{
+                throw new ServiceException("模版消息参数不存在");
+            }
+        }
+
+    }
+
+    @Override
+    public List<TemplateMessageTplDO> listByParamerIds(Integer[] paramerIds) {
+
+        String sql = "select * from "+TemplateMessageTplDO.class.getAnnotation(Table.class).name()+" where concat(replace(replace(paramers,'[',''),']',''), ',') regexp concat(replace(?,',',',|'),',')";
+        return this.daoSupport.queryForList(sql,TemplateMessageTplDO.class,String.join(",", Arrays.stream(paramerIds).map(String::valueOf).toArray(String[]::new)));
+    }
+    /**
+     * 根据部门id查询可用的模版消息及模板消息用的参数列表
+     * @param partId
+     * @return
+     */
+    @Override
+    public List<TemplateMessageTplVO> listTemplateMessageTplVOByPartId(Integer partId) {
+        List<TemplateMessageTplVO> templateMessageTplVOS = new ArrayList<>();
+        List<TemplateMessageTplDO> templateMessageTplDOS = this.listTemplateMessageTplByPartId(partId);
+        List<TemplateMessageParamerDO> paramerDOS = this.templateMessageParamerService.listAll();
+
+        if(templateMessageTplDOS!=null&&!templateMessageTplDOS.isEmpty()){
+            templateMessageTplDOS.forEach(tpl -> {
+                TemplateMessageTplVO templateMessageTplVO = new TemplateMessageTplVO();
+                List<Integer> paramIds = JSON.parseArray(tpl.getParamers(), Integer.class);
+                BeanUtil.copyProperties(tpl,templateMessageTplVO);
+                if(paramerDOS!=null&&!paramerDOS.isEmpty()){
+                    List<TemplateMessageParamerDO> templateMessageParamerDOS = paramerDOS.stream().filter(p -> paramIds.contains(p.getId())).sorted((a, b) -> Integer.compare(paramIds.indexOf(a.getId()), paramIds.indexOf(b.getId()))).collect(Collectors.toList());
+                    templateMessageTplVO.setMessageParamers(templateMessageParamerDOS);
+                }
+                templateMessageTplVOS.add(templateMessageTplVO);
+            });
+
+        }
+        return templateMessageTplVOS;
+    }
+
+    /**
+     * 根据部门id查询可用的模版消息
+     * @param partId
+     * @return
+     */
+    @Override
+    public List<TemplateMessageTplDO> listTemplateMessageTplByPartId(Integer partId) {
+        String sql="select * from "+TemplateMessageTplDO.class.getAnnotation(Table.class).name()+" where (part_id=? or bool_shared=1)";
+        return this.daoSupport.queryForList(sql,TemplateMessageTplDO.class,partId);
+    }
 }

+ 3 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/MessageSendRecordService.java

@@ -3,10 +3,13 @@ package com.wdklian.ncs.ms.message.center.service.iservice;
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessageSendRecordDO;
 import com.wdklian.ncs.ms.framework.database.CRUDBaseManager;
 
+import java.util.List;
+
 /**
  * @author wuyunfeng
  * 2024-04-08 16:43
  * ${description}
  */
 public interface MessageSendRecordService extends CRUDBaseManager<MessageSendRecordDO> {
+    List<MessageSendRecordDO> listByCustomerId(Integer partId, Integer customerId);
 }

+ 5 - 1
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/MessageTypeService.java

@@ -3,6 +3,8 @@ package com.wdklian.ncs.ms.message.center.service.iservice;
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessageTypeDO;
 import com.wdklian.ncs.ms.framework.database.CRUDBaseManager;
 
+import java.util.List;
+
 /**
  * @author wuyunfeng
  * 2024-04-08 14:43
@@ -10,6 +12,8 @@ import com.wdklian.ncs.ms.framework.database.CRUDBaseManager;
  */
 public interface MessageTypeService extends CRUDBaseManager<MessageTypeDO> {
 
+    @Override
+    void delete(Integer[] ids);
 
-
+    List<MessageTypeDO> getAll();
 }

+ 24 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/MessagesService.java

@@ -1,12 +1,36 @@
 package com.wdklian.ncs.ms.message.center.service.iservice;
 
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessagesDO;
+import com.wdklian.ncs.ms.common.entity.msgcenter.vos.MessageTypeVO;
 import com.wdklian.ncs.ms.framework.database.CRUDBaseManager;
 
+import java.util.List;
+
 /**
  * @author wuyunfeng
  * 2024-04-08 16:24
  * ${description}
  */
 public interface MessagesService extends CRUDBaseManager<MessagesDO> {
+    /**
+     * 根据消息类型id数组查询消息
+     * @param ids
+     * @return
+     */
+    List<MessagesDO> listByTypeIds(Integer[] ids);
+
+    /**
+     * 获取科室的消息消息分类和分类下的消息列表
+     * @param partId
+     * @return
+     */
+    List<MessageTypeVO> listMessageTypeVOByPartId(Integer partId);
+
+    /**
+     * 根据科室Id查询科室可用的消息列表
+     * @param partId
+     * @return
+     */
+    List<MessagesDO> listMessagesByPartId(Integer partId);
+
 }

+ 4 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/TemplateMessageParamerService.java

@@ -2,6 +2,9 @@ package com.wdklian.ncs.ms.message.center.service.iservice;
 
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.TemplateMessageParamerDO;
 import com.wdklian.ncs.ms.framework.database.CRUDBaseManager;
+import com.wdklian.ncs.ms.framework.database.Page;
+
+import java.util.List;
 
 /**
  * @author wuyunfeng
@@ -9,4 +12,5 @@ import com.wdklian.ncs.ms.framework.database.CRUDBaseManager;
  * ${description}
  */
 public interface TemplateMessageParamerService extends CRUDBaseManager<TemplateMessageParamerDO> {
+    List<TemplateMessageParamerDO> listAll();
 }

+ 10 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/TemplateMessageTplService.java

@@ -1,12 +1,22 @@
 package com.wdklian.ncs.ms.message.center.service.iservice;
 
 import com.wdklian.ncs.ms.common.entity.msgcenter.dos.TemplateMessageTplDO;
+import com.wdklian.ncs.ms.common.entity.msgcenter.vos.TemplateMessageTplVO;
 import com.wdklian.ncs.ms.framework.database.CRUDBaseManager;
 
+import java.util.List;
+
 /**
  * @author wuyunfeng
  * 2024-04-08 17:11
  * ${description}
  */
 public interface TemplateMessageTplService extends CRUDBaseManager<TemplateMessageTplDO> {
+
+    List<TemplateMessageTplDO> listByParamerIds(Integer[] paramerIds);
+
+
+    List<TemplateMessageTplVO> listTemplateMessageTplVOByPartId(Integer partId);
+
+    List<TemplateMessageTplDO> listTemplateMessageTplByPartId(Integer partId);
 }

+ 4 - 3
ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntraceDepartmentFeignClient.java

@@ -2,6 +2,7 @@ package com.wdklian.ncs.ms.feignclient.entrace;
 
 import com.wdklian.ncs.ms.common.entity.open.dos.DepartmentDO;
 import com.wdklian.ncs.ms.common.entity.system.dos.ShopDO;
+import com.wdklian.ncs.ms.framework.mvc.CommonResult;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.stereotype.Component;
 import org.springframework.validation.annotation.Validated;
@@ -25,11 +26,11 @@ import java.util.List;
 public interface EntraceDepartmentFeignClient {
 
     @PostMapping("/sync-list")
-    List<ShopDO> syncDepartment(@RequestBody @NotEmpty(message = "科室列表不能为空") @Valid List<DepartmentDO> departments);
+    CommonResult<List<ShopDO>> syncDepartment(@RequestBody @NotEmpty(message = "科室列表不能为空") @Valid List<DepartmentDO> departments);
 
     @PostMapping("/sync-single")
-    ShopDO syncSingleDepartment(@RequestBody @NotNull(message = "科室数据不能为null") @Valid DepartmentDO departmentDO);
+    CommonResult<ShopDO> syncSingleDepartment(@RequestBody @NotNull(message = "科室数据不能为null") @Valid DepartmentDO departmentDO);
 
     @GetMapping("/sync-single/{key}")
-    ShopDO syncDepartmentByKey(@PathVariable("key") @NotEmpty(message = "科室主键不能为空") String key);
+    CommonResult<ShopDO> syncDepartmentByKey(@PathVariable("key") @NotEmpty(message = "科室主键不能为空") String key);
 }

+ 3 - 2
ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntraceDoctorAdviceFeignClient.java

@@ -2,6 +2,7 @@ package com.wdklian.ncs.ms.feignclient.entrace;
 
 import com.wdklian.ncs.ms.common.entity.open.dos.DoctorAdviceDO;
 import com.wdklian.ncs.ms.exception.CustomizedConfiguration;
+import com.wdklian.ncs.ms.framework.mvc.CommonResult;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.stereotype.Component;
 import org.springframework.validation.annotation.Validated;
@@ -24,10 +25,10 @@ import java.util.List;
 @FeignClient(value = "entrace-service", path = "/doctor-advice")
 public interface EntraceDoctorAdviceFeignClient {
     @PostMapping("/sync-list")
-    List<DoctorAdviceDO> syncDoctorAdvice(@RequestBody @NotEmpty(message = "医嘱列表不能为空") @Valid List<DoctorAdviceDO> doctoradvices);
+    CommonResult<List<DoctorAdviceDO>> syncDoctorAdvice(@RequestBody @NotEmpty(message = "医嘱列表不能为空") @Valid List<DoctorAdviceDO> doctoradvices);
 
     @PostMapping("/sync-single")
-    DoctorAdviceDO syncSingleDoctorAdvice(@RequestBody @NotNull(message = "医嘱数据不能为null") @Valid DoctorAdviceDO doctorAdvice);
+    CommonResult<DoctorAdviceDO> syncSingleDoctorAdvice(@RequestBody @NotNull(message = "医嘱数据不能为null") @Valid DoctorAdviceDO doctorAdvice);
 
     @DeleteMapping("/{his_keys}")
     Integer deleteDoctorAdvice(@PathVariable(value = "his_keys") @NotEmpty(message = "医嘱主键不能为空") String[] hisKeys);

+ 4 - 3
ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntraceEmployeeFeignClient.java

@@ -2,6 +2,7 @@ package com.wdklian.ncs.ms.feignclient.entrace;
 
 import com.wdklian.ncs.ms.common.entity.open.dos.EmployeeDO;
 import com.wdklian.ncs.ms.common.entity.system.dos.ClerkDO;
+import com.wdklian.ncs.ms.framework.mvc.CommonResult;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.stereotype.Component;
 import org.springframework.validation.annotation.Validated;
@@ -26,11 +27,11 @@ public interface EntraceEmployeeFeignClient {
 
 
     @PostMapping("/sync-list")
-    List<ClerkDO> syncEmployee(@RequestBody @NotEmpty(message = "职员列表不能为空") @Valid List<EmployeeDO> employees);
+    CommonResult<List<ClerkDO>> syncEmployee(@RequestBody @NotEmpty(message = "职员列表不能为空") @Valid List<EmployeeDO> employees);
 
     @PostMapping("/sync-single")
-    ClerkDO syncSingleEmployee(@RequestBody @NotNull(message = "科室数据不能为null") @Valid EmployeeDO employee);
+    CommonResult<ClerkDO> syncSingleEmployee(@RequestBody @NotNull(message = "科室数据不能为null") @Valid EmployeeDO employee);
 
     @GetMapping("/sync-single/{key}")
-    ClerkDO syncSingleEmployeeByKey(@NotEmpty(message = "职工主键不能为空") @PathVariable("key") String key);
+    CommonResult<ClerkDO> syncSingleEmployeeByKey(@NotEmpty(message = "职工主键不能为空") @PathVariable("key") String key);
 }

+ 10 - 6
ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntracePatientFeignClient.java

@@ -1,6 +1,8 @@
 package com.wdklian.ncs.ms.feignclient.entrace;
 
 import com.wdklian.ncs.ms.common.entity.open.dos.PatientDO;
+import com.wdklian.ncs.ms.framework.mvc.CommonResult;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.stereotype.Component;
 import org.springframework.validation.annotation.Validated;
@@ -23,19 +25,21 @@ import java.util.List;
 @FeignClient(value = "entrace-service", path = "/patient")
 public interface EntracePatientFeignClient {
     @PostMapping("/sync-list")
-    List<PatientDO> syncPatient(@RequestBody @NotEmpty(message = "患者列表不能为空") @Valid List<PatientDO> patients);
+    CommonResult<List<PatientDO>> syncPatient(@RequestBody @NotEmpty(message = "患者列表不能为空") @Valid List<PatientDO> patients);
 
     @PostMapping("/sync-single")
-    PatientDO syncSinglePatient(@RequestBody @NotNull(message = "患者数据不能为null") @Valid PatientDO patient);
+    CommonResult<PatientDO> syncSinglePatient(@RequestBody @NotNull(message = "患者数据不能为null") @Valid PatientDO patient);
 
 
-    @GetMapping("/sync-single/{patient_key}")
-    PatientDO syncSinglePatientByKey(@PathVariable("patient_key") String patientKey);
+    @PostMapping("/sync-single/{patient_key}")
+    CommonResult<PatientDO> syncSinglePatientByKey(@PathVariable("patient_key") String patientKey);
 
     @PostMapping("/patient-out/{patient_key}")
-    PatientDO patientOut(@NotEmpty(message = "患者主键不能为空") @PathVariable(value = "patient_key") String patientKey);
+    CommonResult<PatientDO> patientOut(@NotEmpty(message = "患者主键不能为空") @PathVariable(value = "patient_key") String patientKey);
 
-    @GetMapping("/sync-all")
+    @PostMapping("/sync-all")
     void syncAllPatient();
+    @PostMapping("/sync-all-tp")
+   void syncAllPatientTp();
 
 }

+ 3 - 2
ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/open/DoctorAdviceFeignClient.java

@@ -11,6 +11,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.util.List;
@@ -40,10 +41,10 @@ public interface DoctorAdviceFeignClient {
     CommonResult<List<String>> listChangedDepartKeys();
 
     @PostMapping("/save-list")
-    CommonResult<List<DoctorAdviceDO>> syncDoctorAdvice(@RequestBody @NotEmpty(message = "医嘱列表不能为空") @Validated List<DoctorAdviceDO> doctoradvices);
+    CommonResult<List<DoctorAdviceDO>> syncDoctorAdvice(@RequestBody @NotEmpty(message = "医嘱列表不能为空") @Valid List<DoctorAdviceDO> doctoradvices);
 
     @PostMapping("/save-single")
-    CommonResult<DoctorAdviceDO> syncSingleDoctorAdvice(@RequestBody @NotNull(message = "医嘱数据不能为null") @Validated DoctorAdviceDO doctorAdvice);
+    CommonResult<DoctorAdviceDO> syncSingleDoctorAdvice(@RequestBody @NotNull(message = "医嘱数据不能为null") @Valid DoctorAdviceDO doctorAdvice);
 
     @DeleteMapping("/{his_keys}")
     CommonResult<List<DoctorAdviceDO>> deleteDoctorAdvice(@PathVariable(value = "his_keys") @NotEmpty(message = "医嘱主键不能为空") String[] hisKeys);

+ 4 - 0
ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/system/CustomerFeignClient.java

@@ -4,6 +4,7 @@ import com.wdklian.ncs.ms.common.entity.open.dos.PatientDO;
 import com.wdklian.ncs.ms.common.entity.system.dos.CustomerDO;
 import com.wdklian.ncs.ms.common.entity.system.vos.CustomerFrameVO;
 import com.wdklian.ncs.ms.framework.mvc.CommonResult;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -41,4 +42,7 @@ public interface CustomerFeignClient {
 
     @GetMapping("/sync-single/{key}")
     CommonResult syncSinglePatientByKey(@NotEmpty(message = "患者主键不能为空") @PathVariable("key") String key);
+
+    @GetMapping("/sync-tp-all")
+    CommonResult syncTPAllPatient();
 }

+ 16 - 8
ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/retryer/MyRetryer.java

@@ -2,17 +2,25 @@ package com.wdklian.ncs.ms.retryer;
 
 import feign.RetryableException;
 import feign.Retryer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
 import java.util.concurrent.TimeUnit;
 
-public class MyRetryer implements Retryer {
-    @Override
-    public void continueOrPropagate(RetryableException e) {
-        throw e;
-    }
+@Configuration
+public class MyRetryer  {
+//    @Override
+//    public void continueOrPropagate(RetryableException e) {
+//        throw e;
+//    }
+//
+//    @Override
+//    public Retryer clone() {
+//        return new Default(20000, TimeUnit.SECONDS.toMillis(1), 0);
+//    }
 
-    @Override
-    public Retryer clone() {
-        return new Default(100, TimeUnit.SECONDS.toMillis(1), 2);
+    @Bean
+    public Retryer feignRetryer() {
+        return Retryer.NEVER_RETRY; // 根据需要定义重试策略
     }
 }

+ 1 - 1
ncs-ms-framework/src/main/java/com/wdklian/ncs/ms/framework/mvc/GridParameterParser.java

@@ -72,7 +72,7 @@ public class GridParameterParser {
         StringBuffer sb = new StringBuffer(" WHERE 1=1");
 
         //fixedCondition
-        if (formCollection.get("fixedCondition") != null) {
+        if (!StringUtil.isEmpty(formCollection.get("fixedCondition"))) {
             String fixedCondition = formCollection.get("fixedCondition");
             gp.setFixedCondition("where 1=1 and " + fixedCondition);
             sb.append(" AND ").append(fixedCondition);

+ 1 - 1
ncs-ms-framework/src/main/resources/logback.xml

@@ -6,7 +6,7 @@
                 
         <layout class="ch.qos.logback.classic.PatternLayout">
                         
-            <Pattern>%black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable</Pattern>
+            <Pattern>%white(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable</Pattern>
                     
         </layout>
             

+ 3 - 2
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/controller/DoctorAdviceController.java

@@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
@@ -33,13 +34,13 @@ public class DoctorAdviceController {
 
     @PostMapping("/save-list")
     @ApiOperation(value = "批量新增或更新医嘱,返回更新成功的医嘱列表", response = ListDoctorAdviceResponse.class)
-    public CommonResult<List<DoctorAdviceDO>> syncDoctorAdvice(@RequestBody @NotEmpty(message = "医嘱列表不能为空") @Validated List<DoctorAdviceDO> doctoradvices) {
+    public CommonResult<List<DoctorAdviceDO>> syncDoctorAdvice(@RequestBody @NotEmpty(message = "医嘱列表不能为空") @Valid List<DoctorAdviceDO> doctoradvices) {
         return CommonResult.success(doctorAdviceService.saveDoctorAdvice(doctoradvices));
     }
 
     @PostMapping("/save-single")
     @ApiOperation(value = "新增或更新单个医嘱信息,返回更新后的医嘱", response = SingleDoctorAdviceResponse.class)
-    public CommonResult<DoctorAdviceDO> syncSingleDoctorAdvice(@RequestBody @NotNull(message = "医嘱数据不能为null") @Validated DoctorAdviceDO doctorAdvice) {
+    public CommonResult<DoctorAdviceDO> syncSingleDoctorAdvice(@RequestBody @NotNull(message = "医嘱数据不能为null") @Valid DoctorAdviceDO doctorAdvice) {
         DoctorAdviceDO doctorAdviceDO = doctorAdviceService.saveDoctorAdvice(doctorAdvice);
         if (doctorAdviceDO != null) {
             return CommonResult.success(doctorAdviceDO);

+ 42 - 0
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/mq/DoctorAdviceSyncConsumer.java

@@ -0,0 +1,42 @@
+package com.wdklian.ncs.ms.open.mq;
+
+import com.wdklian.ncs.ms.common.entity.open.dos.DoctorAdviceDO;
+import org.springframework.amqp.rabbit.annotation.Exchange;
+import org.springframework.amqp.rabbit.annotation.Queue;
+import org.springframework.amqp.rabbit.annotation.QueueBinding;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.messaging.handler.annotation.Payload;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+
+@Component
+public class DoctorAdviceSyncConsumer {
+
+
+    /** 医嘱同步消息队列
+     *  在同步医嘱时,由于平台会一次性发送多条,在短时间内触发多次医嘱刷新,负载到不同节点上执行
+     *  会存在数据重复插入的问题.这里通过消息队列,设置每10条同步一次,或者在10内未没有达到10条数据,也触发一次
+     * */
+    @RabbitListener(bindings = @QueueBinding(
+            value = @Queue(value ="MS_DOCTOR_ADVICE_SYNC_QUEUE"),
+            exchange = @Exchange(value = "MS_DOCTOR_ADVICE_SYNC"),
+            key = "MS_DOCTOR_ADVICE_SYNC_ROUTING"
+    ),containerFactory = "myContainerFactory")
+    public void doctorAdviceSync(@Payload List<DoctorAdviceDO> adviceDOS) {
+      try {
+          System.out.println("接收到医嘱同步消息:" + adviceDOS.size());
+//          if (adviceDOS != null && !adviceDOS.isEmpty()) {
+//              entraceDoctorAdviceFeignClient.syncDoctorAdvice(adviceDOS);
+//          }
+
+      }catch (Exception e){
+          e.printStackTrace();
+      }
+    }
+
+
+
+}

+ 25 - 0
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/mq/RabbitMQConfig.java

@@ -0,0 +1,25 @@
+package com.wdklian.ncs.ms.open.mq;
+
+import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
+import org.springframework.amqp.rabbit.connection.ConnectionFactory;
+import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class RabbitMQConfig {
+ 
+    @Bean
+    public SimpleRabbitListenerContainerFactory myContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
+        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
+        configurer.configure(factory, connectionFactory);
+//        factory.setPrefetchCount(10); // 设置批量消费的消息数量为10
+        factory.setBatchListener(true);
+        //每次接两条
+        factory.setBatchSize(10);
+        //十秒内没有数据再入队列,也执行
+        factory.setReceiveTimeout(1000L * 10);
+        factory.setConsumerBatchEnabled(true);
+        return factory;
+    }
+}

+ 8 - 7
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/AdviceReferenceBoardItemServiceImpl.java

@@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.validation.constraints.NotEmpty;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -38,7 +39,7 @@ public class AdviceReferenceBoardItemServiceImpl extends OpenPlateformCRUDServic
 
         String sql = "select * from "+ AdviceRefBoardItemDO.class.getAnnotation(Table.class).name()+" where find_in_set(part_id,?)";
 
-        return this.daoSupport.queryForList(sql,AdviceRefBoardItemDO.class,partIds.stream().map(p->p.toString()).collect(Collectors.joining(",")));
+        return this.daoSupport.queryForList(sql,AdviceRefBoardItemDO.class,partIds.stream().map(Object::toString).collect(Collectors.joining(",")));
     }
 
     @Override
@@ -96,10 +97,10 @@ public class AdviceReferenceBoardItemServiceImpl extends OpenPlateformCRUDServic
     @Override
     public String getCaseWhenSql(ShopDO part,Boolean distinct) {
         List<String> hisCodes = this.shopHelper.listPartsRefHisCode(part);
-        if(hisCodes==null||hisCodes.size()==0){
+        if(hisCodes==null|| hisCodes.isEmpty()){
             return "";
         }
-        List<AdviceRefBoardItemDO> adviceReferenceBoardItemDOS = this.listReferBoardItem(Arrays.asList(part.getShopId()));
+        List<AdviceRefBoardItemDO> adviceReferenceBoardItemDOS = this.listReferBoardItem(Collections.singletonList(part.getShopId()));
         StringBuilder sbuilder= new StringBuilder();
         for (AdviceRefBoardItemDO adviceReferenceBoardItemDO : adviceReferenceBoardItemDOS) {
             sbuilder.append(getCaseWhenSql(adviceReferenceBoardItemDO,hisCodes,distinct));
@@ -109,10 +110,10 @@ public class AdviceReferenceBoardItemServiceImpl extends OpenPlateformCRUDServic
     @Override
     public String getCaseWhenSql(List<ShopDO> parts, Boolean distinct) {
 
-        if(parts==null||parts.size()==0){
+        if(parts==null|| parts.isEmpty()){
             return "";
         }
-        List<AdviceRefBoardItemDO> adviceReferenceBoardItemDOS = this.listReferBoardItem(parts.stream().mapToInt(p->p.getShopId()).boxed().collect(Collectors.toList()));
+        List<AdviceRefBoardItemDO> adviceReferenceBoardItemDOS = this.listReferBoardItem(parts.stream().mapToInt(ShopDO::getShopId).boxed().collect(Collectors.toList()));
         StringBuilder sbuilder= new StringBuilder();
         for (AdviceRefBoardItemDO adviceReferenceBoardItemDO : adviceReferenceBoardItemDOS) {
            ShopDO part = parts.stream().filter(p->p.getShopId()!=null&&p.getShopId().equals(adviceReferenceBoardItemDO.getPartId())).findFirst().orElse(null);
@@ -120,8 +121,8 @@ public class AdviceReferenceBoardItemServiceImpl extends OpenPlateformCRUDServic
                continue;
            }
            if(!part.getShopId().equals(-1)) {
-               List<String> hisCode = this.shopHelper.listPartsRefHisCode(Arrays.asList(part));
-               if (hisCode == null || hisCode.size() == 0) {
+               List<String> hisCode = this.shopHelper.listPartsRefHisCode(Collections.singletonList(part));
+               if (hisCode == null || hisCode.isEmpty()) {
                    continue;
                }
                sbuilder.append(getCaseWhenSql(adviceReferenceBoardItemDO, hisCode, distinct));

+ 10 - 9
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/AdviceReferenceNursingMarkOptionServiceImpl.java

@@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.validation.constraints.NotEmpty;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -39,7 +40,7 @@ public class AdviceReferenceNursingMarkOptionServiceImpl extends OpenPlateformCR
 
         String sql = "select * from " + AdviceRefNursingMarkOptionDO.class.getAnnotation(Table.class).name() + " where find_in_set(part_id,?)";
 
-        return this.daoSupport.queryForList(sql, AdviceRefNursingMarkOptionDO.class, partIds.stream().map(p -> p.toString()).collect(Collectors.joining(",")));
+        return this.daoSupport.queryForList(sql, AdviceRefNursingMarkOptionDO.class, partIds.stream().map(Object::toString).collect(Collectors.joining(",")));
     }
 
     @Override
@@ -107,10 +108,10 @@ public class AdviceReferenceNursingMarkOptionServiceImpl extends OpenPlateformCR
     @Override
     public String getCaseWhenSql(ShopDO part, String prop, Boolean distinct) {
         List<String> hisCodes = this.shopHelper.listPartsRefHisCode(part);
-        if (hisCodes == null || hisCodes.size() == 0) {
+        if (hisCodes == null || hisCodes.isEmpty()) {
             return "";
         }
-        List<AdviceRefNursingMarkOptionDO> adviceReferenceNursingMarkOptionDOS = this.listReferNurse(Arrays.asList(part.getShopId()));
+        List<AdviceRefNursingMarkOptionDO> adviceReferenceNursingMarkOptionDOS = this.listReferNurse(Collections.singletonList(part.getShopId()));
         StringBuilder sbuilder = new StringBuilder();
         for (AdviceRefNursingMarkOptionDO adviceReferenceNursingMarkOptionDO : adviceReferenceNursingMarkOptionDOS) {
             sbuilder.append(getCaseWhenSql(adviceReferenceNursingMarkOptionDO, hisCodes, prop, distinct));
@@ -121,18 +122,18 @@ public class AdviceReferenceNursingMarkOptionServiceImpl extends OpenPlateformCR
     @Override
     public String getCaseWhenSql(List<ShopDO> parts, String prop, Boolean distinct) {
 
-        if (parts == null || parts.size() == 0) {
+        if (parts == null || parts.isEmpty()) {
             return "";
         }
-        List<AdviceRefNursingMarkOptionDO> adviceReferenceNursingMarkOptionDOS = this.listReferNurse(parts.stream().mapToInt(p -> p.getShopId()).boxed().collect(Collectors.toList()));
+        List<AdviceRefNursingMarkOptionDO> adviceReferenceNursingMarkOptionDOS = this.listReferNurse(parts.stream().mapToInt(ShopDO::getShopId).boxed().collect(Collectors.toList()));
         StringBuilder sbuilder = new StringBuilder();
         for (AdviceRefNursingMarkOptionDO adviceReferenceNursingMarkOptionDO : adviceReferenceNursingMarkOptionDOS) {
             ShopDO part = parts.stream().filter(p -> p.getShopId() != null && p.getShopId().equals(adviceReferenceNursingMarkOptionDO.getPartId())).findFirst().orElse(null);
             if (part == null) {
                 continue;
             }
-            List<String> hisCode = this.shopHelper.listPartsRefHisCode(Arrays.asList(part));
-            if (hisCode == null || hisCode.size() == 0) {
+            List<String> hisCode = this.shopHelper.listPartsRefHisCode(Collections.singletonList(part));
+            if (hisCode == null || hisCode.isEmpty()) {
                 continue;
             }
             sbuilder.append(getCaseWhenSql(adviceReferenceNursingMarkOptionDO, hisCode, prop, distinct));
@@ -147,11 +148,11 @@ public class AdviceReferenceNursingMarkOptionServiceImpl extends OpenPlateformCR
         }
         List<AdviceRefNursingMarkOptionDO> adviceReferenceNursingMarkOptionDOS = this.listPartNursingMarkOptionReference(categoryNameMd5, itemNameMd5, part.getShopId());
 
-        if (adviceReferenceNursingMarkOptionDOS == null || adviceReferenceNursingMarkOptionDOS.size() == 0) {
+        if (adviceReferenceNursingMarkOptionDOS == null || adviceReferenceNursingMarkOptionDOS.isEmpty()) {
             return "";
         }
         StringBuilder sbuilder = new StringBuilder();
-        List<String> hisCode = this.shopHelper.listPartsRefHisCode(Arrays.asList(part));
+        List<String> hisCode = this.shopHelper.listPartsRefHisCode(Collections.singletonList(part));
         if (!part.getShopId().equals(-1)&&(hisCode == null || hisCode.isEmpty())) {
             return "";
         }

+ 8 - 7
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/AdviceUniqueContentServiceImpl.java

@@ -16,6 +16,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -103,12 +104,12 @@ public class AdviceUniqueContentServiceImpl extends OpenPlateformCRUDServiceImpl
         }
     }
 
-    private String getOptionCaseWhenSql(String categoryNameMd5, String itemNameMd5, String prop, Boolean distinct, ShopDO part) {
+    private String getOptionCaseWhenSql(String categoryNameMd5, String itemNameMd5, String prop, ShopDO part) {
         String defaultSql = " when 1=0 then null ";
         if (part == null) {
             return defaultSql;
         }
-        String itemCaseWhenSql = this.adviceReferenceNursingMarkOptionService.getCaseWhenSql(categoryNameMd5, itemNameMd5, prop, distinct, part);
+        String itemCaseWhenSql = this.adviceReferenceNursingMarkOptionService.getCaseWhenSql(categoryNameMd5, itemNameMd5, prop, true, part);
         if (StrUtil.isNotEmpty(itemCaseWhenSql)) {
             return itemCaseWhenSql;
         }
@@ -117,8 +118,8 @@ public class AdviceUniqueContentServiceImpl extends OpenPlateformCRUDServiceImpl
 
     private String getOptionSelectSql(String categoryNameMd5, String itemNameMd5, ShopDO part) {
         String itemCaseWhenSql = "", categoryCaseWhenSql = "";
-        itemCaseWhenSql = getOptionCaseWhenSql(categoryNameMd5, itemNameMd5, "nurseOptionNameMd5", true, part);
-        categoryCaseWhenSql = getOptionCaseWhenSql(categoryNameMd5, itemNameMd5, "nurseCategoryNameMd5", true, part);
+        itemCaseWhenSql = getOptionCaseWhenSql(categoryNameMd5, itemNameMd5, "nurseOptionNameMd5", part);
+        categoryCaseWhenSql = getOptionCaseWhenSql(categoryNameMd5, itemNameMd5, "nurseCategoryNameMd5", part);
 
         return "SELECT*FROM (\n" +
                 "\tSELECT\n" +
@@ -184,7 +185,7 @@ public class AdviceUniqueContentServiceImpl extends OpenPlateformCRUDServiceImpl
             part = new ShopDO();
             part.setShopId(-1);
         }
-        String caseWhenSql = this.adviceReferenceBoardItemService.getCaseWhenSql(Arrays.asList(part), true);
+        String caseWhenSql = this.adviceReferenceBoardItemService.getCaseWhenSql(Collections.singletonList(part), true);
         if (StrUtil.isNotEmpty(caseWhenSql)) {
             caseWhen = caseWhenSql;
         }
@@ -243,8 +244,8 @@ public class AdviceUniqueContentServiceImpl extends OpenPlateformCRUDServiceImpl
 
                 sqls.add(String.format(sqlUniqueTemplate, StringUtil.md5(StrUtil.trimToEmpty(doctoradvice.getAdviceContent())), StrUtil.trimToEmpty(doctoradvice.getAdviceContent())));
             }
-            if (sqls.size() > 0) {
-                return Arrays.stream(this.daoSupport.batchUpdate(sqls.toArray(new String[sqls.size()]))).boxed().toArray(Integer[]::new);
+            if (!sqls.isEmpty()) {
+                return Arrays.stream(this.daoSupport.batchUpdate(sqls.toArray(new String[0]))).boxed().toArray(Integer[]::new);
             }
         }
         return new Integer[0];

+ 5 - 5
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/BoardItemConfigServiceImpl.java

@@ -49,7 +49,7 @@ public class BoardItemConfigServiceImpl extends OpenPlateformCRUDServiceImpl<Boa
 
         String sql = "select * from " + BoardItemConfigDO.class.getAnnotation(Table.class).name() + " where find_in_set(for_part_id,?)";
 
-        return this.daoSupport.queryForList(sql, BoardItemConfigDO.class, partIds.stream().map(p -> p.toString()).collect(Collectors.joining(",")));
+        return this.daoSupport.queryForList(sql, BoardItemConfigDO.class, partIds.stream().map(Object::toString).collect(Collectors.joining(",")));
     }
 
 
@@ -124,7 +124,7 @@ public class BoardItemConfigServiceImpl extends OpenPlateformCRUDServiceImpl<Boa
     @Override
     public BoardItemConfigDO edit(BoardItemConfigDO boardItemSettingDO, Integer id) {
         List<BoardItemConfigDO> listByName = this.getListByName(boardItemSettingDO.getItemNameMd5().trim());
-        if (listByName != null && listByName.size() > 0) {
+        if (listByName != null && !listByName.isEmpty()) {
             if (boardItemSettingDO.getForPartId().equals(-1)) { //如果是管理员修改项目,有任何一项与自己同名,都不允许修改
                 if (listByName.stream().anyMatch(p -> !p.getId().equals(id))) {
                     throw new ServiceException("已有科室使用同名条目[" + boardItemSettingDO.getItemName() + "],请更换名称");
@@ -236,10 +236,10 @@ public class BoardItemConfigServiceImpl extends OpenPlateformCRUDServiceImpl<Boa
 
     @Override
     public String getAllMatchSql(List<ShopDO> parts) {
-        if (parts == null || parts.size() == 0) {
+        if (parts == null || parts.isEmpty()) {
             return "";
         }
-        List<Integer> partIds = parts.stream().mapToInt(p -> p.getShopId()).boxed().collect(Collectors.toList());
+        List<Integer> partIds = parts.stream().mapToInt(ShopDO::getShopId).boxed().collect(Collectors.toList());
         List<BoardItemConfigDO> settingDOS = this.queryAllSetKeywords();
         settingDOS = settingDOS.stream().filter(p -> p.getForPartId() != null && partIds.contains(p.getForPartId())).collect(Collectors.toList());
         return getMatchString(settingDOS, parts);
@@ -258,7 +258,7 @@ public class BoardItemConfigServiceImpl extends OpenPlateformCRUDServiceImpl<Boa
                 List<String> hisCode = this.shopHelper.listPartsRefHisCode(part);
                 String itemMatchSql = getBoardItemSettingMatchSql(settingDO, hisCode);
                 if (!StringUtil.isEmpty(itemMatchSql)) {
-                    sbuilder.append("(" + itemMatchSql + ") or ");
+                    sbuilder.append("(").append(itemMatchSql).append(") or ");
                 }
             }
             if (sbuilder.length() > 2) {

+ 1 - 1
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/DepartmentServiceImpl.java

@@ -64,6 +64,6 @@ public class DepartmentServiceImpl extends OpenPlateformCRUDServiceImpl<Departme
     @Transactional(value = "openPlateformTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public Boolean delete(String[] departKeys) {
         String sql = "delete from " + DepartmentDO.class.getAnnotation(Table.class).name() + " where find_in_set(keyval,?)";
-        return this.daoSupport.execute(sql, DepartmentDO.class, StrUtil.join(",", departKeys)) > 0;
+        return this.daoSupport.execute(sql, DepartmentDO.class, String.join(",", departKeys)) > 0;
     }
 }

+ 8 - 7
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/DoctorAdviceServiceImpl.java

@@ -25,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -113,7 +114,7 @@ public class DoctorAdviceServiceImpl extends OpenPlateformCRUDServiceImpl<Doctor
                     if (conditon.containsKey("excludeKeywords") && result) { //关键字匹配成功后才需要看是否包含排除的关键字
                         excludeKeywords = conditon.getJSONArray("excludeKeywords");
                         if (!excludeKeywords.isEmpty()) {
-                            result = !excludeKeywords.stream().anyMatch(p -> adviceContent.toLowerCase().contains(p.toString().toLowerCase()));
+                            result = excludeKeywords.stream().noneMatch(p -> adviceContent.toLowerCase().contains(p.toString().toLowerCase()));
 
                         }
                     }
@@ -156,8 +157,8 @@ public class DoctorAdviceServiceImpl extends OpenPlateformCRUDServiceImpl<Doctor
     @Override
     @Transactional(value = "openPlateformTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public DoctorAdviceDO saveDoctorAdvice(DoctorAdviceDO doctorAdvice) {
-        List<DoctorAdviceDO> doctorAdviceDOS = this.saveDoctorAdvice(Arrays.asList(doctorAdvice));
-        if (doctorAdviceDOS != null && doctorAdviceDOS.size() > 0) {
+        List<DoctorAdviceDO> doctorAdviceDOS = this.saveDoctorAdvice(Collections.singletonList(doctorAdvice));
+        if (doctorAdviceDOS != null && !doctorAdviceDOS.isEmpty()) {
             return doctorAdviceDOS.get(0);
         } else {
             return null;
@@ -165,7 +166,7 @@ public class DoctorAdviceServiceImpl extends OpenPlateformCRUDServiceImpl<Doctor
     }
 
     @Override
-    @Transactional(value = "openTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    @Transactional(value = "openPlateformTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<DoctorAdviceDO> deleteDoctorAdvice(String[] hisKeys) {
 
         if (hisKeys.length > 0) {
@@ -197,7 +198,7 @@ public class DoctorAdviceServiceImpl extends OpenPlateformCRUDServiceImpl<Doctor
     @Override
     public List<DoctorAdviceDO> listDoctorAdvices(String[] hisKeys) {
         String sql = "select * from " + DoctorAdviceDO.class.getAnnotation(Table.class).name() + " where find_in_set(his_key,?)";
-        return this.daoSupport.queryForList(sql, DoctorAdviceDO.class, StrUtil.join(",", hisKeys));
+        return this.daoSupport.queryForList(sql, DoctorAdviceDO.class, String.join(",", hisKeys));
     }
 
 
@@ -238,7 +239,7 @@ public class DoctorAdviceServiceImpl extends OpenPlateformCRUDServiceImpl<Doctor
                 "case " + manualCategoryCaseWhen + " end as manual_match_category_name_md5 \n" +
                 "FROM\n" +
                 "\t`doctor_advice` \n" +
-                ") as t where find_in_set(trim(his_part_key),'" + partHisKey.stream().collect(Collectors.joining(",")) + "') and state=1 and ((manual_match_item_md5 is not null) or (" + allMatchSql + "))";
+                ") as t where find_in_set(trim(his_part_key),'" + String.join(",", partHisKey) + "') and state=1 and ((manual_match_item_md5 is not null) or (" + allMatchSql + "))";
         List<DoctorAdviceMatchNursingMarkOptionVO> doctorAdviceMapScreenAdviceItemVOS = this.daoSupport.queryForList(sql, DoctorAdviceMatchNursingMarkOptionVO.class);
 
         return doctorAdviceMapScreenAdviceItemVOS;
@@ -261,7 +262,7 @@ public class DoctorAdviceServiceImpl extends OpenPlateformCRUDServiceImpl<Doctor
                 "\t* \n" +
                 "FROM\n" +
                 "\t`doctor_advice` \n" +
-                ") as t where find_in_set(trim(his_part_key),'" + partHisKey.stream().collect(Collectors.joining(",")) + "') and state=1 and  (" + allMatchSql + ")";
+                ") as t where find_in_set(trim(his_part_key),'" + String.join(",", partHisKey) + "') and state=1 and  (" + allMatchSql + ")";
         List<DoctorAdviceMatchNursingMarkCategoryVO> adviceCategoryVOS = this.daoSupport.queryForList(sql, DoctorAdviceMatchNursingMarkCategoryVO.class);
 
         return adviceCategoryVOS;

+ 4 - 5
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/EmployeeServiceImpl.java

@@ -1,6 +1,5 @@
 package com.wdklian.ncs.ms.open.service.impl;
 
-import cn.hutool.core.util.StrUtil;
 import com.wdklian.ncs.ms.common.entity.open.dos.EmployeeDO;
 import com.wdklian.ncs.ms.framework.database.annotation.Table;
 import com.wdklian.ncs.ms.framework.exception.ServiceException;
@@ -10,7 +9,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -44,8 +43,8 @@ public class EmployeeServiceImpl extends OpenPlateformCRUDServiceImpl<EmployeeDO
     @Override
     @Transactional(value = "openPlateformTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public EmployeeDO saveEmployee(EmployeeDO employee) {
-        List<EmployeeDO> employeeDOS = this.saveEmployee(Arrays.asList(employee));
-        if (employeeDOS != null && employeeDOS.size() > 0) {
+        List<EmployeeDO> employeeDOS = this.saveEmployee(Collections.singletonList(employee));
+        if (employeeDOS != null && !employeeDOS.isEmpty()) {
             return employeeDOS.get(0);
         } else {
             return null;
@@ -56,6 +55,6 @@ public class EmployeeServiceImpl extends OpenPlateformCRUDServiceImpl<EmployeeDO
     @Transactional(value = "openPlateformTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public Boolean delete(String[] employeeKeys) {
         String sql = "delete from " + EmployeeDO.class.getAnnotation(Table.class).name() + " where find_in_set(keyval,?)";
-        return this.daoSupport.execute(sql, StrUtil.join(",", employeeKeys)) > 0;
+        return this.daoSupport.execute(sql, String.join(",", employeeKeys)) > 0;
     }
 }

+ 12 - 12
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/NursingMarkCategoryConfigServiceImpl.java

@@ -63,7 +63,7 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
 
         String sql = "select * from " + NursingMarkCategoryConfigDO.class.getAnnotation(Table.class).name() + " where find_in_set(for_part_id,?)";
 
-        return this.daoSupport.queryForList(sql, NursingMarkCategoryConfigDO.class, partIds.stream().map(p -> p.toString()).collect(Collectors.joining(",")));
+        return this.daoSupport.queryForList(sql, NursingMarkCategoryConfigDO.class, partIds.stream().map(Object::toString).collect(Collectors.joining(",")));
     }
 
     @Override
@@ -136,12 +136,12 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
     @Override
     public List<NurseCascaderVO> getNurseCascader(Integer partId) {
         List<NursingMarkCategoryConfigVO> list = this.listPartCategory(partId);
-        List<NurseCascaderVO> result = list.stream().filter(p -> !p.getBoolManual() && !p.getBoolAuto() && p.getChild().size() > 0).map(p -> {
+        List<NurseCascaderVO> result = list.stream().filter(p -> !p.getBoolManual() && !p.getBoolAuto() && !p.getChild().isEmpty()).map(p -> {
             NurseCascaderVO vo = new NurseCascaderVO();
             vo.setLabel(p.getCategoryName());
             vo.setValue(p.getNameMd5());
             vo.setContainsKeywords("");
-            if (p.getChild().size() > 0) {
+            if (!p.getChild().isEmpty()) {
                 List<NurseCascaderVO> child = p.getChild().stream().map(c -> {
                     NurseCascaderVO co = new NurseCascaderVO();
                     co.setLabel(c.getItemName());
@@ -281,7 +281,7 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
     @Override
     public List<NursingMarkCategoryConfigVO> listAll() {
         StringBuilder sb = new StringBuilder();
-        sb.append("select * from " + NursingMarkCategoryConfigDO.class.getAnnotation(Table.class).name() + "  order by index_no");
+        sb.append("select * from ").append(NursingMarkCategoryConfigDO.class.getAnnotation(Table.class).name()).append("  order by index_no");
         List<NursingMarkCategoryConfigVO> screenAdviceCategoryVOS = this.daoSupport.queryForList(sb.toString(), NursingMarkCategoryConfigVO.class);
         if (!screenAdviceCategoryVOS.isEmpty()) {
             String sql = "select * from " + NursingMarkOptionConfigDO.class.getAnnotation(Table.class).name() + " order by index_no";
@@ -355,7 +355,7 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
             for (NursingMarkCategoryConfigDO categoryConfigDO : nurseCategories) {
                 String settingDOMatchSql = this.getNurseConfigMatchSql(categoryConfigDO, distinct ? null : hisCode);
                 if (!StrUtil.isEmpty(settingDOMatchSql)) {
-                    sbuilder.append("(" + settingDOMatchSql + ") or ");
+                    sbuilder.append("(").append(settingDOMatchSql).append(") or ");
                 }
             }
             if (sbuilder.length() > 2) {
@@ -449,7 +449,7 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
 
 //                }
                 List<NursingMarkOptionConfigDO> child = categoryConfigVO.getChild();
-                if (child != null && child.size() > 0) {
+                if (child != null && !child.isEmpty()) {
                     for (NursingMarkOptionConfigDO nursingMarkOptionConfigDO : child) {
 //                        NursingMarkOptionConfigDO optionConfigDO1 = copyChild.stream().filter(p -> p.getCopyFrom() != null && p.getCopyFrom().equals(nursingMarkOptionConfigDO.getId()) && p.getForPartId() != null && p.getForPartId().equals(shopDO.getShopId())).findFirst().orElse(null);
 //                        if (optionConfigDO1 == null) {
@@ -576,7 +576,7 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
                             containsKeywords = conditon.getJSONArray("containKeywords");
                             if (!containsKeywords.isEmpty()) {
                                 for (Object containsKeyword : containsKeywords) {
-                                    sbuilder.append("locate(LOWER('" + containsKeyword.toString() + "'),LOWER(advice_content))>0 and ");
+                                    sbuilder.append("locate(LOWER('").append(containsKeyword.toString()).append("'),LOWER(advice_content))>0 and ");
                                 }
 
                             }
@@ -585,7 +585,7 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
                             excludeKeywords = conditon.getJSONArray("excludeKeywords");
                             if (!excludeKeywords.isEmpty()) {
                                 for (Object exclude : excludeKeywords) {
-                                    sbuilder.append("locate(LOWER('" + exclude.toString() + "'),LOWER(advice_content))=0 and ");
+                                    sbuilder.append("locate(LOWER('").append(exclude.toString()).append("'),LOWER(advice_content))=0 and ");
                                 }
 
                             }
@@ -609,18 +609,18 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
                         if (sbuilder.length() > 10) {
                             sbuilder.delete(sbuilder.length() - 5, sbuilder.length());
 
-                            if (hiscode != null && hiscode.size() > 0) {
+                            if (hiscode != null && !hiscode.isEmpty()) {
                                 sbuilder.append(" and find_in_set(his_part_key,'")
                                         .append(String.join(",", hiscode))
                                         .append("')");
                             }
 
                             if (filed.equalsIgnoreCase("advice_content")) {
-                                sbuilder.append(")) then " + (replaceBuild.length() == 0 ? filed : replaceBuild.toString()) + " ");
+                                sbuilder.append(")) then ").append(replaceBuild.length() == 0 ? filed : replaceBuild.toString()).append(" ");
                             } else if (filed.equalsIgnoreCase("category_name")) {
-                                sbuilder.append(")) then '" + categoryConfigDO.getCategoryName() + "'");
+                                sbuilder.append(")) then '").append(categoryConfigDO.getCategoryName()).append("'");
                             } else {
-                                sbuilder.append(")) then '" + bgColor + "'");
+                                sbuilder.append(")) then '").append(bgColor).append("'");
                             }
 
                         } else {

+ 5 - 5
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/NursingMarkOptionConfigServiceImpl.java

@@ -73,7 +73,7 @@ public class NursingMarkOptionConfigServiceImpl extends OpenPlateformCRUDService
         List<NursingMarkOptionConfigDO> modelByNameMd5 = this.getListByNameMd5(itemSettingDO.getCategoryNameMd5(), itemSettingDO.getItemNameMd5());
 
 
-        if (modelByNameMd5 != null && modelByNameMd5.size() > 0) {
+        if (modelByNameMd5 != null && !modelByNameMd5.isEmpty()) {
             if (itemSettingDO.getForPartId().equals(-1)) { //如果是管理员修改项目,有任何一项与自己同名,都不允许修改
                 if (modelByNameMd5.stream().anyMatch(p -> !p.getId().equals(id))) {
                     throw new ServiceException("已有科室使用同名条目[" + itemSettingDO.getItemName() + "],请更换名称");
@@ -100,7 +100,7 @@ public class NursingMarkOptionConfigServiceImpl extends OpenPlateformCRUDService
             return new ArrayList<>();
         }
         String sql = "select * from " + NursingMarkOptionConfigDO.class.getAnnotation(Table.class).name() + " where find_in_set(for_part_id,?)";
-        return this.daoSupport.queryForList(sql, NursingMarkOptionConfigDO.class, partIds.stream().map(p -> p.toString()).collect(Collectors.joining(",")));
+        return this.daoSupport.queryForList(sql, NursingMarkOptionConfigDO.class, partIds.stream().map(Object::toString).collect(Collectors.joining(",")));
     }
 
     @Override
@@ -138,7 +138,7 @@ public class NursingMarkOptionConfigServiceImpl extends OpenPlateformCRUDService
                         containsKeywords = conditon.getJSONArray("containKeywords");
                         if (!containsKeywords.isEmpty()) {
                             for (Object containsKeyword : containsKeywords) {
-                                sbuilder.append("locate(LOWER('" + containsKeyword.toString() + "'),LOWER(advice_content))>0 and ");
+                                sbuilder.append("locate(LOWER('").append(containsKeyword.toString()).append("'),LOWER(advice_content))>0 and ");
                             }
 
                         }
@@ -147,7 +147,7 @@ public class NursingMarkOptionConfigServiceImpl extends OpenPlateformCRUDService
                         excludeKeywords = conditon.getJSONArray("excludeKeywords");
                         if (!excludeKeywords.isEmpty()) {
                             for (Object exclude : excludeKeywords) {
-                                sbuilder.append("locate(LOWER('" + exclude.toString() + "'),LOWER(advice_content))=0 and ");
+                                sbuilder.append("locate(LOWER('").append(exclude.toString()).append("'),LOWER(advice_content))=0 and ");
                             }
 
                         }
@@ -215,7 +215,7 @@ public class NursingMarkOptionConfigServiceImpl extends OpenPlateformCRUDService
 
                 String settingDOMatchSql = getSettingDOMatchSql(settingDO,hisCode);
                 if (!StrUtil.isEmpty(settingDOMatchSql)) {
-                    sbuilder.append("(" + settingDOMatchSql + ") or ");
+                    sbuilder.append("(").append(settingDOMatchSql).append(") or ");
                 }
             }
             if (sbuilder.length() > 2) {

+ 7 - 10
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/PatientServiceImpl.java

@@ -14,10 +14,7 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -49,7 +46,7 @@ public class PatientServiceImpl extends OpenPlateformCRUDServiceImpl<PatientDO>
             return new ArrayList<>();
         }
         String sql = "select * from " + PatientDO.class.getAnnotation(Table.class).name() + " where find_in_set(keyval,?)";
-        return this.daoSupport.queryForList(sql, PatientDO.class, patientKeys.stream().collect(Collectors.joining(",")));
+        return this.daoSupport.queryForList(sql, PatientDO.class, String.join(",", patientKeys));
     }
 
     @Override
@@ -122,8 +119,8 @@ public class PatientServiceImpl extends OpenPlateformCRUDServiceImpl<PatientDO>
     @Transactional(value = "openPlateformTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public PatientDO savePatient(PatientDO patient) {
         if (patient != null) {
-            List<PatientDO> patientDOS = this.savePatient(Arrays.asList(patient));
-            if (patientDOS != null && patientDOS.size() > 0) {
+            List<PatientDO> patientDOS = this.savePatient(Collections.singletonList(patient));
+            if (patientDOS != null && !patientDOS.isEmpty()) {
                 return patientDOS.get(0);
             } else {
                 return null;
@@ -191,8 +188,8 @@ public class PatientServiceImpl extends OpenPlateformCRUDServiceImpl<PatientDO>
         for (CustomerDO customerDO : customerAllChange) {
             sqls.add(String.format(sqlTemplate, customerDO.getPartId(), customerDO.getHisKeyval()));
         }
-        if (sqls.size() > 0) {
-            this.daoSupport.batchUpdate(sqls.toArray(new String[sqls.size()]));
+        if (!sqls.isEmpty()) {
+            this.daoSupport.batchUpdate(sqls.toArray(new String[0]));
         }
 
     }
@@ -201,7 +198,7 @@ public class PatientServiceImpl extends OpenPlateformCRUDServiceImpl<PatientDO>
     @Override
     @Transactional(value = "openPlateformTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<PatientDO> patientBatchOut(List<String> patientKeys) {
-        if (patientKeys != null && patientKeys.size() > 0) {
+        if (patientKeys != null && !patientKeys.isEmpty()) {
             List<PatientDO> patients = this.listPatients(patientKeys);
             for (PatientDO patient : patients) {
                 patient.setStatus("1");

+ 1 - 1
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/common/DoctorAdviceHelper.java

@@ -43,7 +43,7 @@ public class DoctorAdviceHelper {
                     if (conditon.containsKey("excludeKeywords") && result) { //关键字匹配成功后才需要看是否包含排除的关键字
                         excludeKeywords = conditon.getJSONArray("excludeKeywords");
                         if (!excludeKeywords.isEmpty()) {
-                            result = !excludeKeywords.stream().anyMatch(p -> adviceContent.toLowerCase().contains(p.toString().toLowerCase()));
+                            result = excludeKeywords.stream().noneMatch(p -> adviceContent.toLowerCase().contains(p.toString().toLowerCase()));
 
                         }
                     }

+ 30 - 31
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/BoardItemServiceImpl.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.wdklian.ncs.ms.common.entity.open.dos.BoardItemConfigDO;
+import com.wdklian.ncs.ms.common.entity.open.dos.DoctorAdviceDO;
 import com.wdklian.ncs.ms.common.entity.open.vos.DoctorAdviceMatchBoardItemVO;
 import com.wdklian.ncs.ms.common.entity.open.vos.PatientDataVO;
 import com.wdklian.ncs.ms.common.entity.system.dos.BoardItemDO;
@@ -99,11 +100,11 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
         List<String> operationSql = new ArrayList<>();
         //科室没有看板项目
         List<BoardItemDO> partItems = this.listPartBoardItems(partId);
-        if (partItems == null || partItems.size() == 0) {
+        if (partItems == null || partItems.isEmpty()) {
             return 0;
         }
         //科室没在住院患者
-        if (hospitalizeBeds == null || hospitalizeBeds.size() == 0) {
+        if (hospitalizeBeds == null || hospitalizeBeds.isEmpty()) {
             return 0;
         }
         String updateSqlTpl = "update ncs_board_item set area_content='%s',manual_add_data='%s' where id =%d";
@@ -113,12 +114,12 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
         for (BoardItemDO partItem : partItems) {
             Set<String> adviceMatchBeds = new HashSet<>();
             // 有匹配的医嘱
-            if (partDoctorAdviceBoardItemMatched != null && partDoctorAdviceBoardItemMatched.size() > 0) {
+            if (partDoctorAdviceBoardItemMatched != null && !partDoctorAdviceBoardItemMatched.isEmpty()) {
                 //改条目的配置项目,包含医嘱匹配条件的设置
                 BoardItemConfigDO boardItemConfigDO = partBoardItemConfig.stream().filter(p -> p.getItemNameMd5().equalsIgnoreCase(StringUtil.md5(partItem.getAreaLabel()))).findFirst().orElse(null);
                 if (boardItemConfigDO != null) {
                     List<DoctorAdviceMatchBoardItemVO> mapAdvices = partDoctorAdviceBoardItemMatched.stream().filter(p ->  doctorAdviceHelper.canMatchAdvice(boardItemConfigDO.getContainsKeywords(), p.getAdviceContent())).collect(Collectors.toList());
-                    if (mapAdvices != null && mapAdvices.size() > 0) {
+                    if (!mapAdvices.isEmpty()) {
                         //把能匹配的医嘱,同时该床位患者在住院的查询出来
                         adviceMatchBeds = mapAdvices.stream().filter(p -> !StringUtil.isEmpty(p.getCustomerBedNo())&&hospitalizeBeds.contains(p.getCustomerBedNo())).map(p -> p.getCustomerBedNo()).collect(Collectors.toSet());
                     }
@@ -135,8 +136,8 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
             if (!StringUtil.isEmpty(partItem.getManualAddData())) {
                 JSONArray manualDatas = JSON.parseArray(partItem.getManualAddData());
                 if (!manualDatas.isEmpty()) {
-                    List<String> manualBeds = manualDatas.stream().filter(p -> hospitalizeBeds.contains(p.toString())).map(p -> p.toString()).collect(Collectors.toList());
-                    adviceMatchBeds.addAll(manualBeds.stream().collect(Collectors.toSet()));
+                    List<String> manualBeds = manualDatas.stream().map(Object::toString).filter(hospitalizeBeds::contains).collect(Collectors.toList());
+                    adviceMatchBeds.addAll(new HashSet<>(manualBeds));
                     manualBedJson = JSON.toJSONString(manualBeds);
                 }
             }
@@ -146,8 +147,8 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
             operationSql.add(String.format(updateSqlTpl, areaContent, manualBedJson, partItem.getId()));
         }
 
-        if (operationSql.size() > 0) {
-            int[] ints = this.daoSupport.batchUpdate(operationSql.toArray(new String[operationSql.size()]));
+        if (!operationSql.isEmpty()) {
+            int[] ints = this.daoSupport.batchUpdate(operationSql.toArray(new String[0]));
             //有任何数据的更新,则需返回true,表示该科室需更新看板显示
             return Arrays.stream(ints).anyMatch(p -> p > 0) ? partId : 0;
         }
@@ -161,7 +162,8 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
         return renewPartBoardItemContent(parts);
     }
 
-    private List<Integer> renewPartBoardItemContent(List<ShopDO> parts) {
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public List<Integer> renewPartBoardItemContent(List<ShopDO> parts) {
 
         List<Integer> partIds = new ArrayList<>();
         List<String> partHisKeys = shopService.listPartsRefHisCode(parts);
@@ -176,7 +178,7 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
         //his数据患者状态信息
         PatientDataVO todayPatients = patientFeignClient.getPatientData(sdf.format(today), sdf.format(today)).getData();
         for (ShopDO part : parts) {
-            List<String> partHisKey = shopService.listPartsRefHisCode(Arrays.asList(part));
+            List<String> partHisKey = shopService.listPartsRefHisCode(Collections.singletonList(part));
             if (partHisKey.isEmpty()) { //当前科室没有对接his
                 continue;
             }
@@ -214,9 +216,7 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
             );
             try {
                 partIds.add(task.get());
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            } catch (ExecutionException e) {
+            } catch (InterruptedException | ExecutionException e) {
                 e.printStackTrace();
             }
 
@@ -226,20 +226,23 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
 
 
     @Override
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<Integer> renewDePartments(List<String> keys) {
         List<ShopDO> shopDOS = shopService.listShopByHisKeys(keys);
         return renewPartBoardItemContent(shopDOS);
     }
 
     @Override
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<Integer> renewPart(Integer id) {
         ShopDO model = shopService.getModel(id);
-        return renewPartBoardItemContent(Arrays.asList(model));
+        return renewPartBoardItemContent(Collections.singletonList(model));
     }
 
     @Override
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<Integer> renewDePartment(String key) {
-        List<ShopDO> shopDOS = shopService.listShopByHisKeys(Arrays.asList(key));
+        List<ShopDO> shopDOS = shopService.listShopByHisKeys(Collections.singletonList(key));
         return renewPartBoardItemContent(shopDOS);
     }
 
@@ -271,7 +274,7 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
         List<BoardItemConfigDO> settingDOS =this.boardItemConfigFeignClient.listAllBoardItemConfig().getData();// this.boardItemConfigService.queryAll();
         List<String> clearDataSql = new ArrayList<>();
 
-        if(settingDOS!=null&&settingDOS.size()>0){
+        if(settingDOS!=null&& !settingDOS.isEmpty()){
 
             for (BoardItemConfigDO partItemDOSetting : settingDOS) {
                 for (ShopDO shop : shops) {
@@ -287,8 +290,8 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
                 }
             }
             //删除配置中已经没有的项目
-            if(clearDataSql.size()>0){
-                this.daoSupport.batchUpdate(clearDataSql.toArray(new String[clearDataSql.size()]));
+            if(!clearDataSql.isEmpty()){
+                this.daoSupport.batchUpdate(clearDataSql.toArray(new String[0]));
             }
         }else{ //配置全为空,删除所有自定义看板条目即可
             for (ShopDO shop : shops) {
@@ -296,8 +299,8 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
                 clearDataSql.add(partClearDataSql);
             }
             //删除配置中已经没有的项目
-            if(clearDataSql.size()>0){
-                this.daoSupport.batchUpdate(clearDataSql.toArray(new String[clearDataSql.size()]));
+            if(!clearDataSql.isEmpty()){
+                this.daoSupport.batchUpdate(clearDataSql.toArray(new String[0]));
             }
         }
 
@@ -309,14 +312,14 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
         Page<BoardItemDO> list = this.list(gp);
         List<BoardItemDO> data = list.getData();
         List<BoardItemDataVO> dataVOS = new ArrayList<>();
-        if (data.size() > 0) {
+        if (!data.isEmpty()) {
             //所有能匹配看板条目设置的医嘱项目
 
             List<DoctorAdviceMatchBoardItemVO> doctorAdviceMapBoardItems = new ArrayList<>();
             if(withDetail>0) {
                 ShopDO part = this.shopService.getModel(data.get(0).getPartId());
 //                List<String> hisCode = shopService.listPartsRefHisCode(Arrays.asList(part));
-                doctorAdviceMapBoardItems = this.doctorAdviceFeignClient.listAdviceReferenceBoardItem(Arrays.asList(part)).getData(); //this.doctorAdviceService.listAdviceReferenceBoardItem(hisCode,Arrays.asList(model));
+                doctorAdviceMapBoardItems = this.doctorAdviceFeignClient.listAdviceReferenceBoardItem(Collections.singletonList(part)).getData(); //this.doctorAdviceService.listAdviceReferenceBoardItem(hisCode,Arrays.asList(model));
             }
 //            Map<String, List<DoctorAdviceMapBoardItemVO>> groups = doctorAdviceMapBoardItems.stream().filter(p->!StringUtil.isEmpty(p.getCustomerBedNo())).sorted(Comparator.comparing(d ->
 //                    Optional.ofNullable(d.getCustomerBedNo()).orElse(""))).collect(Collectors.groupingBy(p -> p.getBoardItemNameMd5()));
@@ -341,11 +344,7 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
 
                     vo.setContainsKeywords(sameNameSetting.getContainsKeywords());
                     List<DoctorAdviceMatchBoardItemVO> matchAdvice = doctorAdviceMapBoardItems.stream().filter(p -> getDoctorAdviceMatchBoardItemSetting(p, sameNameSetting)).sorted(Comparator.comparing(DoctorAdviceMatchBoardItemVO::getCustomerBedNo)).collect(Collectors.toList());
-                    if(matchAdvice!=null){
-                        vo.setDoctorAdvices(matchAdvice);
-                    }else{
-                        vo.setDoctorAdvices(new ArrayList<>());
-                    }
+                    vo.setDoctorAdvices(matchAdvice);
 
                 }
 //                if (groups.containsKey(StringUtil.md5(datum.getAreaLabel()))) {
@@ -359,10 +358,10 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
                     JSONArray manualBeds = JSON.parseArray(datum.getManualAddData());
                     if (!manualBeds.isEmpty()) {
                         List<DoctorAdviceMatchBoardItemVO> doctorAdvices = vo.getDoctorAdvices();
-                        List<String> adviceBeds = doctorAdvices.stream().map(p -> p.getCustomerBedNo()).collect(Collectors.toList());
-                        List<String> manualBedArr = manualBeds.stream().map(p -> p.toString()).collect(Collectors.toList());
+                        List<String> adviceBeds = doctorAdvices.stream().map(DoctorAdviceDO::getCustomerBedNo).collect(Collectors.toList());
+                        List<String> manualBedArr = manualBeds.stream().map(Object::toString).collect(Collectors.toList());
                         List<String> nomatchBeds = ListUtils.removeAll(manualBedArr, adviceBeds);
-                        if (nomatchBeds != null && nomatchBeds.size() > 0) {
+                        if (!nomatchBeds.isEmpty()) {
 
 //                            List<DoctorAdviceDO> nomatchAdvices = this.doctorAdviceManager.getDoctorAdviceByHisPartKeyAndBedNo(datum.getHisPartKeyval(), nomatchBeds.toArray(new String[nomatchBeds.size()]));
                             for (String nomatchBed : nomatchBeds) {
@@ -425,7 +424,7 @@ public class BoardItemServiceImpl extends SystemCRUDManagerImpl<BoardItemDO> imp
             if(conditon.containsKey("excludeKeywords")&&result){ //关键字匹配成功后才需要看是否包含排除的关键字
                 excludeKeywords = conditon.getJSONArray("excludeKeywords");
                 if(!excludeKeywords.isEmpty()){
-                    result =!excludeKeywords.stream().anyMatch(p->advice.getAdviceContent().toLowerCase().contains(p.toString().toLowerCase()));
+                    result = excludeKeywords.stream().noneMatch(p->advice.getAdviceContent().toLowerCase().contains(p.toString().toLowerCase()));
 
                 }
             }

+ 2 - 5
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/ClerkServiceImpl.java

@@ -26,10 +26,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -243,7 +240,7 @@ public class ClerkServiceImpl extends SystemCRUDManagerImpl<ClerkDO> implements
 
     @Override
     public ClerkDO syncEmployee(@NotNull(message = "职员数据不能为null") EmployeeDO employee) {
-        List<ClerkDO> clerkDOS = this.syncEmployee(Arrays.asList(employee));
+        List<ClerkDO> clerkDOS = this.syncEmployee(Collections.singletonList(employee));
         if (!clerkDOS.isEmpty()) {
             return clerkDOS.get(0);
         }

+ 17 - 1
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/CustomerMappingServiceImpl.java

@@ -13,8 +13,11 @@ import com.wdklian.ncs.ms.system.service.iservice.NurseConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -55,7 +58,7 @@ public class CustomerMappingServiceImpl extends SystemCRUDManagerImpl<CustomerMa
 
     @Override
     public List<CustomerNurseConfigMappingVO> listCustomerNurseConfigs(Integer customerId) {
-        String sql = " select map.id mapping_id,map.customer_id,op.id nurseconfig_option_id,op.option_name nurseconfig_option_value,op.his_keyval nurseconfig_option_keyval," +
+        String sql = " select map.id mapping_id,map.part_id part_id,map.customer_id,op.id nurseconfig_option_id,op.option_name nurseconfig_option_value,op.his_keyval nurseconfig_option_keyval," +
                 "op.color_rgb nurseconfig_option_color,config.config_name nurseconfig_name,config.id nurseconfig_id,config.his_keyval nurseconfig_his_keyval,config.bool_manual from " +
                 "ncs_customer_mapping map left join ncs_nurse_config_option op on map.nurse_config_option_id = op.id " +
                 "left join ncs_nurse_config config on op.ncfg_id = config.id " +
@@ -69,6 +72,7 @@ public class CustomerMappingServiceImpl extends SystemCRUDManagerImpl<CustomerMa
     }
 
     @Override
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public void clearCustomerMapping(Integer customerId) {
         String sql="delete from "+CustomerMappingDO.class.getAnnotation(Table.class).name()+" where customer_id=?";
         this.daoSupport.execute(sql,customerId);
@@ -80,4 +84,16 @@ public class CustomerMappingServiceImpl extends SystemCRUDManagerImpl<CustomerMa
         String sql="delete from "+CustomerMappingDO.class.getAnnotation(Table.class).name()+" where nurse_config_option_id is not null";
         this.daoSupport.execute(sql);
     }
+
+    @Override
+    public void deleteCareMappingByCustomerId(Integer customerId, Integer[] clerkIds) {
+        String sql = "delete from ncs_customer_mapping where find_in_set(clerk_id,?) and customer_id = ?";
+        this.daoSupport.execute(sql, Arrays.stream(clerkIds).map(Object::toString).collect(Collectors.joining(",")), customerId);
+    }
+
+    @Override
+    public void deleteNursingMarkMappingByPartId(Integer partId) {
+        String sql="delete from "+CustomerMappingDO.class.getAnnotation(Table.class).name()+" where nurse_config_option_id is not null and part_id=?";
+        this.daoSupport.execute(sql,partId);
+    }
 }

+ 65 - 60
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/CustomerServiceImpl.java

@@ -4,6 +4,7 @@ package com.wdklian.ncs.ms.system.service.impl;
 import cn.hutool.core.lang.ObjectId;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson2.JSON;
 import com.google.common.base.Strings;
 import com.wdklian.ncs.ms.common.entity.open.dos.EmployeeDO;
 import com.wdklian.ncs.ms.common.entity.open.dos.PatientDO;
@@ -96,6 +97,7 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
 
 
     @Override
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public void removePatient(List<PatientDO> patientDOS) {
 
         List<CustomerDO> outCustomers = handPatientOut(patientDOS);
@@ -109,7 +111,7 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
             return handled;
         }
 
-        List<CustomerDO> customerDOS = listCustomerByHisKeys(patientDOS.stream().map(p -> p.getKeyval()).collect(Collectors.toList()));
+        List<CustomerDO> customerDOS = listCustomerByHisKeys(patientDOS.stream().map(PatientDO::getKeyval).collect(Collectors.toList()));
         if (!customerDOS.isEmpty()) {
             for (CustomerDO customerDO : customerDOS) {
                 if (customerDO.getStatus().equals(HospitaliseStatusEnum.HOSPITALIZED.value())) { //这个用户还在住院,设置为出院状态
@@ -127,6 +129,7 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
     }
 
     @Override
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public void updatePatient(List<PatientDO> patientDOS) {
 
         try {
@@ -137,6 +140,7 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
     }
 
     @Override
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public void insertPatient(List<PatientDO> patientDOS) {
 
         try {
@@ -163,13 +167,13 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
         //在住院患者
         List<CustomerDO> patientIn = this.getCustomersByHospitaliseStatus(HospitaliseStatusEnum.HOSPITALIZED);
         //传入患者已经有入住过但已出院的记录
-        List<CustomerDO> patientWasIn = this.listCustomerByHisKeys(patientDOS.stream().map(p -> p.getKeyval()).collect(Collectors.toList())).stream().filter(p->p.getStatus().equals(HospitaliseStatusEnum.DISCHARGED.value())).collect(Collectors.toList());
+        List<CustomerDO> patientWasIn = this.listCustomerByHisKeys(patientDOS.stream().map(PatientDO::getKeyval).collect(Collectors.toList())).stream().filter(p->p.getStatus().equals(HospitaliseStatusEnum.DISCHARGED.value())).collect(Collectors.toList());
         patientWasIn.addAll(patientIn);
         List<MemberDO> patientMemberWasIn = new ArrayList<>();
         List<CustomerCareMappingVO> patientWasInCareMapping = new ArrayList<>();
-        if (patientWasIn != null && patientWasIn.size() > 0) {
-            patientMemberWasIn = this.memberService.listMemberByIds(patientWasIn.stream().mapToInt(p -> p.getMemberId()).boxed().collect(Collectors.toList()));
-            patientWasInCareMapping = this.customerMappingService.listCustomerCareChargeByCustomerIds(patientWasIn.stream().mapToInt(p -> p.getId()).boxed().collect(Collectors.toList()));
+        if (!patientWasIn.isEmpty()) {
+            patientMemberWasIn = this.memberService.listMemberByIds(patientWasIn.stream().mapToInt(CustomerDO::getMemberId).boxed().collect(Collectors.toList()));
+            patientWasInCareMapping = this.customerMappingService.listCustomerCareChargeByCustomerIds(patientWasIn.stream().mapToInt(CustomerDO::getId).boxed().collect(Collectors.toList()));
         }
         //所有角色列表
         List<RoleDO> roles = this.roleService.listRole();
@@ -177,6 +181,7 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
         List<CustomerDO> syncCustomers = new ArrayList<>();
 
         for (PatientDO patientInfo : patientDOS) {
+
             //查找主要科室或附加科室或者会使用本科室部分床位的科室
             List<ShopDO> availableParts = parts.stream().filter(p ->
                     StrUtil.isNotEmpty(p.getHisCode()) && StrUtil.isNotEmpty(patientInfo.getPartKeyval()) && // 主科室匹配条件
@@ -190,7 +195,7 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
                 part = availableParts.get(0);
             } else if (availableParts.size() > 1) { //查出多个科室,根据床位查出有此床位的科室
                 for (ShopDO availablePart : availableParts) {
-                    Boolean bedMatched = allBeds.stream().anyMatch(p -> p.getPartId().equals(availablePart.getShopId()) && StrUtil.isNotEmpty(p.getName()) && p.getName().equalsIgnoreCase(patientInfo.getBedNo()));
+                    boolean bedMatched = allBeds.stream().anyMatch(p -> p.getPartId().equals(availablePart.getShopId()) && StrUtil.isNotEmpty(p.getName()) && p.getName().equalsIgnoreCase(patientInfo.getBedNo()));
                     if (bedMatched) {
                         part = availablePart;
                         break;
@@ -222,7 +227,7 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
                     syncCustomers.add(customerBak);
                     //旧床位设备设置memberId为0,否则485依然显示旧床位患者数据
                     FrameDO oldFrameDO = allBeds.stream().filter(p -> p.getId().equals(customerDO.getFrameId())).findFirst().orElse(null);
-                    if(!patientWasIn.stream().anyMatch(p->p.getFrameId().equals(oldFrameDO.getId())&&p.getStatus().equals(HospitaliseStatusEnum.HOSPITALIZED.value())&&!p.getId().equals(customerDO.getId()))) { //没有人入住旧床位了
+                    if(oldFrameDO!=null&&patientWasIn.stream().noneMatch(p->p.getFrameId().equals(oldFrameDO.getId())&&p.getStatus().equals(HospitaliseStatusEnum.HOSPITALIZED.value())&&!p.getId().equals(customerDO.getId()))) { //没有人入住旧床位了
                         this.deviceService.updateMemberId(customerDO.getFrameId(), new int[]{DeviceTypeEnum.DIGIT_BED_DEVICE.value(), DeviceTypeEnum.RS485_DOOR_DEVICE.value(), DeviceTypeEnum.SIMULATE_BED_DEVICE.value()}, 0);
                     }
                 }
@@ -230,9 +235,9 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
             }
 
             CustomerDO customer = handleSinglePatient(patientInfo, part, bed, customerDO, member, roles, customerCareMappingVOS, patientWasIn);
-            if (customer != null) {
+            if (customer != null&&customer.getStatus().equals(HospitaliseStatusEnum.HOSPITALIZED.value())) {
                 //重要-- 把同步成功的患者加入到已入住列表中,防止同一批次患者有相同床位的,不加入无法判断出上一次已经入住了床位
-                if(!patientWasIn.stream().anyMatch(p->p.getId().equals(customer.getId()))) {
+                if(patientWasIn.stream().noneMatch(p->p.getId().equals(customer.getId()))) {
                     patientWasIn.add(customer);
                 }
                 //把同步成功的患者加入返回列表
@@ -242,7 +247,7 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
         }
 
 
-        if (syncCustomers.size() > 0 && handDevice) { //对有变化的患者设备发送刷新消息,由customer工程负责处理
+        if (!syncCustomers.isEmpty() && handDevice) { //对有变化的患者设备发送刷新消息,由customer工程负责处理
             this.amqpTemplate.convertAndSend("MS_DEVICE_REFRESH", "MS_DEVICE_REFRESH_ROUTING", syncCustomers);
         }
 
@@ -251,9 +256,9 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
 
 
     @Override
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<CustomerDO> syncPatient(List<PatientDO> patientDOS) {
-        List<CustomerDO> customerDOS = this.syncPatient(patientDOS, false);
-        return customerDOS;
+        return this.syncPatient(patientDOS, false);
     }
 
     @Override
@@ -271,7 +276,7 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
             if (member == null) {
                 member = registerMemberDO(patient);
             } else {
-                member = updateMember(patient, member);
+                updateMember(patient, member);
                 member = this.memberService.edit(member, member.getMemberId());
             }
 
@@ -279,7 +284,7 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
             customer.setUnionId(ObjectId.next());
             customer.setCreateTime(DateUtil.getDateline());
             customer.setMemberId(member.getMemberId());
-            customer = updateCustomer(patient, part, bed, customer);
+            updateCustomer(patient, part, bed, customer);
             customer = this.add(customer);
             int lastId = this.daoSupport.getLastId(CustomerDO.class.getAnnotation(Table.class).name());
             customer.setId(lastId);
@@ -294,14 +299,20 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
                 }
             }
             if (patientInfoChanged(patient, customer, member, bed)) {
-                member = updateMember(patient, member);
+                //数据有变化,返回变化后的对象
+                CustomerDO changedCustomer = new CustomerDO();
+                BeanUtil.copyProperties(customer,changedCustomer);
+                updateMember(patient, member);
                 this.memberService.edit(member, member.getMemberId());
                 //更新customer
-                customer = updateCustomer(patient, part, bed, customer);
+                updateCustomer(patient, part, bed, changedCustomer);
                 //提交更新
-                this.edit(customer, customer.getId());
+                this.edit(changedCustomer, changedCustomer.getId());
+
+                return changedCustomer;
             }
         }
+
         return customer;
     }
 
@@ -311,12 +322,13 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
         member.setUnionId(ObjectId.next());
         member.setUname(StringUtil.getPingYin(patient.getName()) + patient.getKeyval());
         member.setBirthday(StringHelper.parseDate(patient.getBirthday()));
-        member = updateMember(patient, member);
+        updateMember(patient, member);
         member = this.memberService.register(member);
         return member;
     }
 
     @Override
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean preparePatientBed(PatientDO patient, ShopDO part, FrameDO bed, CustomerDO inbedCustomer) {
         if (patient == null) {
             return false;
@@ -372,10 +384,10 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
     @Override
     public List<ClerkDO> prepareCareCharge(PatientDO patient, ShopDO part, List<ClerkDO> partClerks, List<RoleDO> roles) {
         List<ClerkDO> charges = new ArrayList<>();
-        List<String> careKeyvals = Arrays.asList(new String[]{
+        List<String> careKeyvals = Arrays.stream(new String[]{
                 Optional.ofNullable(patient.getDoctorKeyval()).orElse(""),
                 Optional.ofNullable(patient.getNurseKeyval()).orElse("")}
-        ).stream().filter(p -> StrUtil.isNotEmpty(p)).collect(Collectors.toList());
+        ).filter(StrUtil::isNotEmpty).collect(Collectors.toList());
         for (String careKey : careKeyvals) { //处理好需要的医生护士
             ClerkDO matched = partClerks.stream().filter(p -> StrUtil.isNotEmpty(p.getHisKeyval()) && p.getHisKeyval().equals(careKey) && p.getShopId().equals(part.getShopId())).findFirst().orElse(null);
             if (matched == null) {//需要的职员不存在,根据careKeyval从open数据库获取
@@ -397,13 +409,13 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
     @Override
     public List<CustomerDO> listCustomerByHisKeys(List<String> hisKeys) {
         String sql = "select * from " + CustomerDO.class.getAnnotation(Table.class).name() + " where find_in_set(his_keyval,?)";
-        return this.daoSupport.queryForList(sql, CustomerDO.class, hisKeys.stream().collect(Collectors.joining(",")));
+        return this.daoSupport.queryForList(sql, CustomerDO.class, String.join(",", hisKeys));
     }
 
     @Override
     public List<CustomerDO> listCustomerByHisDepartKeys(List<String> hisDepartKeys) {
-        String sql = "select * from " + CustomerDO.class.getAnnotation(Table.class).name() + " where find_in_set(his_part_keyval,?)";
-        return this.daoSupport.queryForList(sql, CustomerDO.class, hisDepartKeys.stream().collect(Collectors.joining(",")));
+        String sql = "select * from " + CustomerDO.class.getAnnotation(Table.class).name() + " where find_in_set(his_part_keyval,?) and status=0";
+        return this.daoSupport.queryForList(sql, CustomerDO.class, String.join(",", hisDepartKeys));
     }
 
     @Override
@@ -418,16 +430,13 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
             if ((StrUtil.isNotEmpty(patient.getStatus()) && Integer.parseInt(patient.getStatus()) == (HospitaliseStatusEnum.DISCHARGED.value()))||
                     bed==null //患者转到了一个无法识别的床位
             ) {
-         if(customer.getFrameId().equals(784)){
-             int i=0;
-         }
+
                 customer.setStatus(HospitaliseStatusEnum.DISCHARGED.value());
+
                 this.edit(customer, customer.getId());
                 this.customerMappingService.clearCustomerMapping(customer.getId());
                 if(bed!=null) { //如果患者转到了不存在的床位,不能更新设备的memberId,不然可能有新入住的患者在485上无法显示.只有患者明确出院了才能设置memberId为0
-                    if(bed.getId().equals(784)){
-                        int i=0;
-                    }
+
                     this.deviceService.updateMemberId(customer.getFrameId(), new int[]{DeviceTypeEnum.DIGIT_BED_DEVICE.value(), DeviceTypeEnum.RS485_DOOR_DEVICE.value(), DeviceTypeEnum.SIMULATE_BED_DEVICE.value()}, 0);
                 }
                 return customer;
@@ -455,14 +464,11 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
                 if (changed) {
                     customerDO = ObjectUtil.defaultIfNull(customerDO, customer);
                 }
-
-            }
-            if(customerDO!=null){
                 this.deviceService.updateMemberId(customerDO.getFrameId(), new int[]{DeviceTypeEnum.DIGIT_BED_DEVICE.value(),DeviceTypeEnum.RS485_DOOR_DEVICE.value(),DeviceTypeEnum.SIMULATE_BED_DEVICE.value()}, customerDO.getMemberId());
+                return customerDO.equals(customer)?null:customerDO;
+            } else{
+                return null;
             }
-
-            return customerDO;
-
         } else {
             return null;
         }
@@ -482,15 +488,15 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
      */
     private Boolean updateCustomerCareCharge(CustomerDO customerDO, List<ClerkDO> clerks, List<CustomerCareMappingVO> oldMapping) {
 
-        List<Integer> oldClerkIds = oldMapping.stream().mapToInt(p -> p.getClerkId()).boxed().collect(Collectors.toList());
-        List<Integer> newClerkIds = clerks.stream().mapToInt(p -> p.getClerkId()).boxed().collect(Collectors.toList());
+        List<Integer> oldClerkIds = oldMapping.stream().mapToInt(CustomerCareMappingVO::getClerkId).boxed().collect(Collectors.toList());
+        List<Integer> newClerkIds = clerks.stream().mapToInt(ClerkDO::getClerkId).boxed().collect(Collectors.toList());
         //要添加的医护人员id
         List<Integer> adds = ListUtils.removeAll(newClerkIds, oldClerkIds);
         //要删除的医护人员id
         List<Integer> removes = ListUtils.removeAll(oldClerkIds, newClerkIds);
-        Boolean change = false;
+        boolean change = false;
 
-        if (adds != null && adds.size() > 0) { //要新加的医护人员
+        if (!adds.isEmpty()) { //要新加的医护人员
             for (Integer add : adds) {
                 ClerkDO clerk = clerks.stream().filter(p -> p.getClerkId().equals(add)).findFirst().orElse(null);
                 if (clerk != null) {
@@ -506,23 +512,22 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
             change = true;
         }
 
-        if (removes != null && removes.size() > 0) {//要删除的医护人员
-            this.customerMappingService.delete(removes.toArray(new Integer[removes.size()]));
+        if (!removes.isEmpty()) {//要删除的医护人员
+            this.customerMappingService.deleteCareMappingByCustomerId(customerDO.getId(),removes.toArray(new Integer[0]));
             change = true;
         }
         return change;
     }
 
 
-    private MemberDO updateMember(PatientDO patient, MemberDO memberDO) {
+    private void updateMember(PatientDO patient, MemberDO memberDO) {
         memberDO.setSex(StringHelper.parseSex(patient.getSex()));
         memberDO.setMobile(StrUtil.emptyToDefault(patient.getMobile(),patient.getKeyval()));
         memberDO.setTrueName(patient.getName());
         memberDO.setNickname(patient.getName());
-        return memberDO;
     }
 
-    private CustomerDO updateCustomer(PatientDO patient, ShopDO shop, FrameDO bed, CustomerDO customerDO) {
+    private void updateCustomer(PatientDO patient, ShopDO shop, FrameDO bed, CustomerDO customerDO) {
         String age = patient.getAge();
         Integer patientAge = StringHelper.fetchAge(age);
         customerDO.setAge(patientAge);
@@ -546,13 +551,12 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
         customerDO.setCardNo(Optional.ofNullable(patient.getCardNo()).orElse("").trim());
         customerDO.setIdNo(Optional.ofNullable(patient.getIdNo()).orElse("").trim());
         customerDO.setFrameId(bed.getId());
-        Long indate = DateUtil.getDateline();
+        long indate = DateUtil.getDateline();
         if (StrUtil.isNotEmpty(patient.getIndate())) {
             indate = DateUtil.getDateline(patient.getIndate());
         }
         customerDO.setInDate(indate);
         customerDO.setIdType("身份证");
-        return customerDO;
     }
 
     private boolean patientInfoChanged(PatientDO patient, CustomerDO customerDO, MemberDO memberDO, FrameDO bed) {
@@ -566,29 +570,27 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
                 //系统显示患者出院,而调用该方法比对时,用户肯定是在院的。此时需要把用户重新设置为住院
                 customerDO.getStatus().equals(HospitaliseStatusEnum.HOSPITALIZED.value()) &&
 //                Objects.equals(customerDO.getStatus().toString(),patientInfoDTO.getStatus())&&
-                Objects.equals(customerDO.getAge(), StringHelper.fetchAge(patient.getAge().toString())) && //年龄是否有变化
+                Objects.equals(customerDO.getAge(), StringHelper.fetchAge(patient.getAge())) && //年龄是否有变化
 //                Objects.equals(customerDO.getAgeUnit(), patientInfoDTO.getAgeUnit()) &&
                 Objects.equals(memberDO.getSex(), StringHelper.parseSex(patient.getSex())));
 
-        if (!i) {
-            int b = 1;
-        }
+
 
         if (Strings.isNullOrEmpty(patient.getMobile())) {
             return !i;
         } else {
-            return !(i && Objects.equals(memberDO.getMobile(), patient.getKeyval()));
+            return !(i && (Objects.equals(memberDO.getMobile(), patient.getMobile())||Objects.equals(memberDO.getMobile(), patient.getKeyval())));
         }
     }
 
 
     private boolean careChargeChanged(PatientDO patient, List<CustomerCareMappingVO> doctorNurseMapping) {
-        if (doctorNurseMapping != null && doctorNurseMapping.size() > 0) { //原来有责任医生或护士,返回有没有变更
+        if (doctorNurseMapping != null && !doctorNurseMapping.isEmpty()) { //原来有责任医生或护士,返回有没有变更
             //病人的责任医生、护士、护工主键集合
-            List<String> careKeyval = Arrays.asList(new String[]{
+            List<String> careKeyval = Arrays.stream(new String[]{
                     Optional.ofNullable(patient.getDoctorKeyval()).orElse(""),
                     Optional.ofNullable(patient.getNurseKeyval()).orElse("")}
-            ).stream().filter(p -> StrUtil.isNotEmpty(p)).collect(Collectors.toList());
+            ).filter(StrUtil::isNotEmpty).collect(Collectors.toList());
 
             for (String s : careKeyval) { //比对病人的责任人是否与呼叫系统中的一致,任何一个不一致,返回true,否则返回false
                 boolean matched = doctorNurseMapping.stream().anyMatch(p -> StrUtil.isNotEmpty(p.getClerkHisKeyval()) && p.getClerkHisKeyval().equals(s));
@@ -624,9 +626,9 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
     }
 
     @Override
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<CustomerDO> syncPatient(@NotNull(message = "患者信息不能为null") PatientDO patient) {
-        List<CustomerDO> customers = this.syncPatient(Arrays.asList(patient));
-        return customers;
+        return this.syncPatient(Collections.singletonList(patient));
     }
 
     @Override
@@ -636,8 +638,8 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
             List<CustomerDO> customerDO = this.syncPatient(patient);
             List<CustomerDO> customerDOS = this.nurseConfigService.renewDePartment(patient.getPartKeyval());
             List<CustomerDO> sum = ListUtils.sum(customerDO, customerDOS);
-            if (customerDOS != null && customerDOS.size() > 0) {
-                deviceService.deviceRefreshMQ(sum, Arrays.asList(customerDOS.get(0).getPartId()));
+            if (!customerDOS.isEmpty()) {
+                deviceService.deviceRefreshMQ(sum, Collections.singletonList(customerDOS.get(0).getPartId()));
             }
             return sum;
         }
@@ -653,11 +655,12 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
     }
 
     @Override
+//    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<CustomerDO> syncAllPatient() {
 
         List<PatientDO> patientOuted = this.patientFeignClient.listHisOutedPatients().getData();
         List<CustomerDO> customerOut = this.handPatientOut(patientOuted);
-        List<String> patientKeys = patientOuted.stream().map(p -> p.getKeyval()).collect(Collectors.toList());
+        List<String> patientKeys = patientOuted.stream().map(PatientDO::getKeyval).collect(Collectors.toList());
         this.patientFeignClient.patientBatchOut(patientKeys);
         List<PatientDO> patientHospital = this.patientFeignClient.listHospitaledPatient().getData();
         List<CustomerDO> customerHospital = this.syncPatient(patientHospital, false);
@@ -675,12 +678,14 @@ public class CustomerServiceImpl extends SystemCRUDManagerImpl<CustomerDO> imple
 
 
     @Override
+//    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<CustomerDO> syncTPAllPatient() {
         List<PatientDO> patientHospital = this.patientFeignClient.listHospitaledPatientTp().getData();
         List<CustomerDO> customerHospital = this.syncPatient(patientHospital, false);
 //        List<CustomerDO> sum = ListUtils.sum(customerOut, customerHospital);
         //护理标识发生变化的用户
-        List<String> departKeys = patientHospital.stream().filter(p -> StrUtil.isNotEmpty(p.getPartKeyval())).map(p -> p.getPartKeyval()).collect(Collectors.toList()); //doctorAdviceFeignClient.listChangedDepartKeys().getData(); //doctorAdviceService.listChangedDepartKeys();
+        List<String> departKeys = patientHospital.stream().map(PatientDO::getPartKeyval).filter(StrUtil::isNotEmpty).distinct().collect(Collectors.toList()); //doctorAdviceFeignClient.listChangedDepartKeys().getData(); //doctorAdviceService.listChangedDepartKeys();
+        log.info(JSON.toJSONString(departKeys));
         List<CustomerDO> customerNurseChange = this.nurseConfigService.renewDePartments(departKeys);
         List<CustomerDO> customerAllChange = ListUtils.sum(customerHospital, customerNurseChange);
         //看板条目内容发生变化的科室

+ 3 - 0
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/DeviceServiceImpl.java

@@ -62,6 +62,9 @@ public class DeviceServiceImpl extends SystemCRUDManagerImpl<DeviceDO> implement
     @Override
     public void updateMemberId(Integer frameId, int[] deviceType, int memberId) {
         String sql = "update "+DeviceDO.class.getAnnotation(Table.class).name()+" set member_id =? where frame_id=? and find_in_set(device_type,?)";
+        if(deviceType==null||deviceType.length==0){
+            return;
+        }
         this.daoSupport.execute(sql,memberId,frameId,StrUtil.join(",",deviceType));
     }
 

+ 1 - 1
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/MemberServiceImpl.java

@@ -76,6 +76,6 @@ public class MemberServiceImpl extends SystemCRUDManagerImpl<MemberDO> implement
     @Override
     public List<MemberDO> listMemberByIds(List<Integer> ids) {
         String sql = "select * from "+MemberDO.class.getAnnotation(Table.class).name()+" where find_in_set(member_id,?)";
-        return this.daoSupport.queryForList(sql,MemberDO.class,ids.stream().map(p->p.toString()).collect(Collectors.joining(",")));
+        return this.daoSupport.queryForList(sql,MemberDO.class,ids.stream().map(Object::toString).collect(Collectors.joining(",")));
     }
 }

+ 85 - 51
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/NurseConfigOptionServiceImpl.java

@@ -4,22 +4,18 @@ import cn.hutool.core.lang.ObjectId;
 import cn.hutool.core.util.StrUtil;
 
 
-import com.wdklian.ncs.ms.common.entity.open.dos.DoctorAdviceDO;
-import com.wdklian.ncs.ms.common.entity.open.dos.NursingMarkOptionConfigDO;
 import com.wdklian.ncs.ms.common.entity.open.vos.DoctorAdviceMatchNursingMarkCategoryVO;
 import com.wdklian.ncs.ms.common.entity.open.vos.DoctorAdviceMatchNursingMarkOptionVO;
-import com.wdklian.ncs.ms.common.entity.open.vos.NursingMarkCategoryConfigVO;
 import com.wdklian.ncs.ms.common.entity.open.vos.NursingMarkOptionConfigVO;
 import com.wdklian.ncs.ms.common.entity.system.dos.CustomerDO;
+import com.wdklian.ncs.ms.common.entity.system.dos.CustomerMappingDO;
 import com.wdklian.ncs.ms.common.entity.system.dos.NurseConfigDO;
 import com.wdklian.ncs.ms.common.entity.system.dos.NurseConfigOptionDO;
-import com.wdklian.ncs.ms.common.entity.system.dos.ShopDO;
 import com.wdklian.ncs.ms.common.entity.system.vos.CustomerNurseConfigMappingVO;
 import com.wdklian.ncs.ms.common.entity.system.vos.NurseOptionCompareVO;
-import com.wdklian.ncs.ms.common.enums.ShopTypeEnum;
+import com.wdklian.ncs.ms.common.enums.HospitaliseStatusEnum;
 import com.wdklian.ncs.ms.framework.database.annotation.Table;
-import com.wdklian.ncs.ms.framework.mvc.JsonResponse;
-import com.wdklian.ncs.ms.framework.util.StringUtil;
+import com.wdklian.ncs.ms.framework.util.DateUtil;
 import com.wdklian.ncs.ms.system.service.iservice.CustomerMappingService;
 import com.wdklian.ncs.ms.system.service.iservice.NurseConfigOptionService;
 import lombok.extern.slf4j.Slf4j;
@@ -30,9 +26,7 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.validation.constraints.NotNull;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -49,8 +43,6 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
     private CustomerMappingService customerMappingService;
 
 
-
-
     @Override
     public List<NurseConfigOptionDO> listPartNurseConfigOption(Integer partId) {
         String sql = "select * from ncs_nurse_config_option where part_id = ?";
@@ -60,8 +52,7 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
     @Override
     public List<NurseConfigOptionDO> listNurseConfigOptionByPartIds(List<Integer> partIds) {
         String sql = "select * from ncs_nurse_config_option where find_in_set(part_id,?)";
-        List<NurseConfigOptionDO> nurseConfigOptionDOS = this.daoSupport.queryForList(sql, NurseConfigOptionDO.class, StrUtil.join(",", partIds));
-        return nurseConfigOptionDOS;
+        return this.daoSupport.queryForList(sql, NurseConfigOptionDO.class, StrUtil.join(",", partIds));
     }
 
 
@@ -72,13 +63,28 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
         return this.daoSupport.execute(sql, partId);
     }
 
+    /**
+     * This method handles the process of nursing advice for a specific part.
+     * It takes several parameters including partId, partDoctorAdviceRefOption, partDoctorAdviceRefCategory, partInHospitalCustomers, partNurseConfig, partNurseOptions, and partNurseOptionConfig.
+     * The method returns a list of CustomerDO objects that have been changed.
+     *
+     * @param partId                      The ID of the part.
+     * @param partDoctorAdviceRefOption   The list of DoctorAdviceMatchNursingMarkOptionVO objects related to the part.
+     * @param partDoctorAdviceRefCategory The list of DoctorAdviceMatchNursingMarkCategoryVO objects related to the part.
+     * @param partInHospitalCustomers     The list of CustomerDO objects that are currently in the hospital.
+     * @param partNurseConfig             The list of NurseConfigDO objects related to the part.
+     * @param partNurseOptions            The list of NurseConfigOptionDO objects related to the part.
+     * @param partNurseOptionConfig       The list of NursingMarkOptionConfigVO objects related to the part.
+     * @return The list of CustomerDO objects that have been changed.
+     */
+
     @Override
-    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
     public List<CustomerDO> handleNurseAdviceForPart(Integer partId, List<DoctorAdviceMatchNursingMarkOptionVO> partDoctorAdviceRefOption, List<DoctorAdviceMatchNursingMarkCategoryVO> partDoctorAdviceRefCategory, List<CustomerDO> partInHospitalCustomers, List<NurseConfigDO> partNurseConfig, List<NurseConfigOptionDO> partNurseOptions, List<NursingMarkOptionConfigVO> partNurseOptionConfig) {
 
         List<CustomerDO> nurseChangeCustomers = new ArrayList<>();
         // 当前科室没有医嘱能够匹配上床头屏医嘱项目。那当前科室的所有患者的护理参数都为空,清空ncs_customer_mapping中与护理参数相关的数据
-        if ((partDoctorAdviceRefOption == null || partDoctorAdviceRefOption.size() == 0) && (partDoctorAdviceRefCategory == null || partDoctorAdviceRefCategory.size() == 0)) {
+        if ((partDoctorAdviceRefOption == null || partDoctorAdviceRefOption.isEmpty()) && (partDoctorAdviceRefCategory == null || partDoctorAdviceRefCategory.isEmpty())) {
             // 该科室没有任何能够匹配护理参数的医嘱,不能删手动设置的项目
             int i = this.clearCustomerNurseByPartId(partId);
             if (i > 0) {
@@ -88,11 +94,12 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
             }
         }
 
-        if (partInHospitalCustomers != null && partInHospitalCustomers.size() > 0) {
+        if (partInHospitalCustomers != null && !partInHospitalCustomers.isEmpty()) {
 
             for (CustomerDO customerDO : partInHospitalCustomers) {
-                List<String> operatorSql = new ArrayList<>();
-                if (StrUtil.isEmpty(customerDO.getHisKeyval())) { //患者不是从his对接过来的,没必要匹配,跳过记录
+
+
+                if (StrUtil.isEmpty(customerDO.getHisKeyval())||customerDO.getStatus().equals(HospitaliseStatusEnum.DISCHARGED.value())) { //患者不是从his对接过来的或者已经是出院状态,没必要匹配,跳过记录
                     continue;
                 }
                 //当前患者自动生成项目的分类匹配医嘱
@@ -104,17 +111,17 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
                 List<DoctorAdviceMatchNursingMarkOptionVO> customerDoctorAdviceMapping = partDoctorAdviceRefOption.stream().filter(p -> StrUtil.isNotEmpty(p.getPatientKey()) &&
                         StrUtil.isNotEmpty(customerDO.getHisKeyval()) &&
                         StrUtil.trim(p.getPatientKey()).equalsIgnoreCase(StrUtil.trim(customerDO.getHisKeyval()))).collect(Collectors.toList());
-                if ((customerDoctorAdviceMapping != null && customerDoctorAdviceMapping.size() > 0) || (customAutogenAdvice != null && customAutogenAdvice.size() > 0)) {
+                if (!customerDoctorAdviceMapping.isEmpty() || !customAutogenAdvice.isEmpty()) {
                     //把customerDoctorAdviceMapping 转换成 ncs_customer_mapping 实体,与现有的记录对比,添加新增的,删除不存在的
                     //医嘱内容转换成 CustomerScreenAdviceVO
                     List<NurseOptionCompareVO> doctorAdviceMapping = new ArrayList<>();
                     List<NurseOptionCompareVO> doctorAdviceCategoryRef = getCustomerDoctorAdvice2NurseAdviceVOS(partNurseOptions, partNurseConfig, partNurseOptionConfig, customerDO, customAutogenAdvice);
-                    if (doctorAdviceCategoryRef != null && doctorAdviceCategoryRef.size() > 0) {
+                    if (doctorAdviceCategoryRef != null && !doctorAdviceCategoryRef.isEmpty()) {
                         doctorAdviceMapping.addAll(doctorAdviceCategoryRef);
                     }
                     List<NurseOptionCompareVO> doctorAdviceOptionRef = getCustomerDoctorAdvice2ScreenAdviceVOS(partNurseOptions, partNurseConfig, partNurseOptionConfig, customerDO, customerDoctorAdviceMapping);
 
-                    if (doctorAdviceOptionRef != null && doctorAdviceOptionRef.size() > 0) {
+                    if (doctorAdviceOptionRef != null && !doctorAdviceOptionRef.isEmpty()) {
                         doctorAdviceMapping.addAll(doctorAdviceOptionRef);
                     }
                     //仅对比非手动设置的项目
@@ -128,15 +135,28 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
                     List<NurseOptionCompareVO> removes = ListUtils.removeAll(nurseConfigs, doctorAdviceMapping);
 
 
-                    if (adds != null && adds.size() > 0) {//新增的护理参数,去重,相同项目不重重复添加
+                    if (!adds.isEmpty()) {//新增的护理参数,去重,相同项目不重重复添加
                         for (NurseOptionCompareVO add : new HashSet<>(adds)) {
-                            operatorSql.add(String.format("insert into ncs_customer_mapping(union_id,part_id,customer_id,nurse_config_option_id) values('%s',%d,%d,%d)", ObjectId.next(), add.getPartId(), add.getCustomerId(), add.getOptionId()));
+
+                            CustomerMappingDO mappingDO = new CustomerMappingDO();
+                            mappingDO.setUnionId(ObjectId.next());
+                            mappingDO.setCustomerId(add.getCustomerId());
+                            mappingDO.setPartId(add.getPartId());
+                            mappingDO.setNurseConfigOptionId(add.getOptionId());
+                            mappingDO.setSyncTime(DateUtil.getDateline());
+                            this.customerMappingService.add(mappingDO);
+
+//                            operatorSql.add(String.format("insert into ncs_customer_mapping(union_id,part_id,customer_id,nurse_config_option_id) values('%s',%d,%d,%d)", ObjectId.next(), add.getPartId(), add.getCustomerId(), add.getOptionId()));
                         }
+                        nurseChangeCustomers.add(customerDO);
                     }
-                    if (removes != null && removes.size() > 0) { //需删除的护理参数
-                        for (NurseOptionCompareVO remove : removes) {
-                            operatorSql.add(String.format("delete from ncs_customer_mapping where id=%d", remove.getMappingId()));
-                        }
+                    if (!removes.isEmpty()) { //需删除的护理参数
+//                        for (NurseOptionCompareVO remove : removes) {
+//
+////                            operatorSql.add(String.format("delete from ncs_customer_mapping where id=%d", remove.getMappingId()));
+//                        }
+                        this.customerMappingService.delete(removes.stream().mapToInt(NurseOptionCompareVO::getMappingId).boxed().toArray(Integer[]::new));
+                        nurseChangeCustomers.add(customerDO);
                     }
 
 
@@ -146,12 +166,22 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
 //                    if (i > 0) {
 //                        nurseChangeCustomers.add(customerDO);
 //                    }
-                    operatorSql.add(String.format("delete from ncs_customer_mapping where customer_id=%d and nurse_config_option_id is not null", customerDO.getId()));
-                }
-                if (operatorSql.size() > 0) {
-                    this.daoSupport.batchUpdate(operatorSql.toArray(new String[operatorSql.size()]));
-                    nurseChangeCustomers.add(customerDO);
+                    List<CustomerNurseConfigMappingVO> customerNurseConfigs = this.customerMappingService.listCustomerNurseConfigs(customerDO.getId()).stream().filter(p -> p.getBoolManual() == null || !p.getBoolManual()).collect(Collectors.toList());
+                    if (!customerNurseConfigs.isEmpty()) {
+//                        for (CustomerNurseConfigMappingVO customerNurseConfig : customerNurseConfigs) {
+//                            operatorSql.add(String.format("delete from ncs_customer_mapping where id=%d", customerNurseConfig.getMappingId()));
+//                        }
+                        this.customerMappingService.delete(customerNurseConfigs.stream().mapToInt(CustomerNurseConfigMappingVO::getMappingId).boxed().toArray(Integer[]::new));
+                        nurseChangeCustomers.add(customerDO);
+//                        operatorSql.add(String.format("delete from ncs_customer_mapping where customer_id=%d and nurse_config_option_id is not null", customerDO.getId()));
+                    }
                 }
+//                if (!operatorSql.isEmpty()) {
+//                    int[] ints = this.daoSupport.batchUpdate(operatorSql.toArray(new String[0]));
+//                    if (Arrays.stream(ints).anyMatch(p -> p > 0)) {
+//                        nurseChangeCustomers.add(customerDO);
+//                    }
+//                }
             }
         }
 
@@ -164,20 +194,25 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
             NurseConfigOptionDO nurseConfigOptionDO = partNurseOptions.stream().filter(o -> StrUtil.isNotEmpty(o.getOptionName()) && StrUtil.trim(o.getOptionName()).equalsIgnoreCase(StrUtil.trim(p.getOptionName()))).findFirst().orElse(null);
             NurseConfigDO nurseConfigDO = partNurseConfig.stream().filter(c -> StrUtil.isNotEmpty(c.getConfigName()) && StrUtil.trim(c.getConfigName()).equalsIgnoreCase(StrUtil.trim(p.getCategoryName()))).findFirst().orElse(null);
             if (nurseConfigDO != null && nurseConfigOptionDO != null) {
-                NurseOptionCompareVO customerScreenAdviceVO = new NurseOptionCompareVO();
-                customerScreenAdviceVO.setOptionName(nurseConfigOptionDO.getOptionName());
-                customerScreenAdviceVO.setCategoryName(nurseConfigDO.getConfigName());
-                customerScreenAdviceVO.setCustomerId(customerDO.getId());
-                customerScreenAdviceVO.setPartId(customerDO.getPartId());
-                customerScreenAdviceVO.setCategoryId(nurseConfigDO.getId());
-                customerScreenAdviceVO.setOptionId(nurseConfigOptionDO.getId());
+                NurseOptionCompareVO customerScreenAdviceVO = getNurseOptionCompareVO(nurseConfigOptionDO.getOptionName(), nurseConfigDO.getConfigName(), customerDO, nurseConfigDO, nurseConfigOptionDO);
                 return customerScreenAdviceVO;
             } else {
                 return null;
             }
 
 
-        }).filter(p -> p != null).distinct().collect(Collectors.toList());
+        }).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+    }
+
+    private static NurseOptionCompareVO getNurseOptionCompareVO(String nurseConfigOptionDO, String nurseConfigDO, CustomerDO customerDO, NurseConfigDO nurseConfigDO1, NurseConfigOptionDO nurseConfigOptionDO1) {
+        NurseOptionCompareVO customerScreenAdviceVO = new NurseOptionCompareVO();
+        customerScreenAdviceVO.setOptionName(nurseConfigOptionDO);
+        customerScreenAdviceVO.setCategoryName(nurseConfigDO);
+        customerScreenAdviceVO.setCustomerId(customerDO.getId());
+        customerScreenAdviceVO.setPartId(customerDO.getPartId());
+        customerScreenAdviceVO.setCategoryId(nurseConfigDO1.getId());
+        customerScreenAdviceVO.setOptionId(nurseConfigOptionDO1.getId());
+        return customerScreenAdviceVO;
     }
 
     @Override
@@ -192,11 +227,16 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
     }
 
     @Override
-    public void truncateTable(){
+    public void truncateTable() {
         String sql = "truncate table " + NurseConfigOptionDO.class.getAnnotation(Table.class).name();
         this.daoSupport.execute(sql);
     }
 
+    @Override
+    public void deleteByPartId(Integer partId) {
+        String sql = "delete from " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " where part_id=?";
+        this.daoSupport.execute(sql, partId);
+    }
     /**
      * 把用户的护理信息转换成可比对的对象列表(NurseOptionCompareVO)
      *
@@ -214,7 +254,7 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
             customerScreenAdviceVO.setOptionName(p.getNurseconfigOptionValue());
             customerScreenAdviceVO.setCategoryId(p.getNurseconfigId());
             customerScreenAdviceVO.setCategoryName(p.getNurseconfigName());
-            customerScreenAdviceVO.setPartId(customerDO.getPartId());
+            customerScreenAdviceVO.setPartId(p.getPartId());
             customerScreenAdviceVO.setMappingId(p.getMappingId());
             return customerScreenAdviceVO;
         }).collect(Collectors.toList());
@@ -240,7 +280,7 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
                     StrUtil.isNotEmpty(s.getCategoryNameMd5()) &&
                     s.getCategoryNameMd5().equalsIgnoreCase(p.getCategoryNameMd5())).findFirst().orElse(null);
             return getNurseOptionCompareVO(partNurseOptions, partNurseConfig, customerDO, screenAdviceItemSettingVO);
-        }).filter(p -> p != null).collect(Collectors.toList());
+        }).filter(Objects::nonNull).collect(Collectors.toList());
     }
 
     private NurseOptionCompareVO getNurseOptionCompareVO(List<NurseConfigOptionDO> partNurseOptions, List<NurseConfigDO> partNurseConfig, CustomerDO customerDO, NursingMarkOptionConfigVO screenAdviceItemSettingVO) {
@@ -251,13 +291,7 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
                 if (nurseConfigDO.getBoolManual()) { //如果是手动设置的分类,不参与设定
                     return null;
                 }
-                NurseOptionCompareVO customerScreenAdviceVO = new NurseOptionCompareVO();
-                customerScreenAdviceVO.setOptionName(screenAdviceItemSettingVO.getItemName());
-                customerScreenAdviceVO.setCategoryName(screenAdviceItemSettingVO.getCategoryName());
-                customerScreenAdviceVO.setCustomerId(customerDO.getId());
-                customerScreenAdviceVO.setPartId(customerDO.getPartId());
-                customerScreenAdviceVO.setCategoryId(nurseConfigDO.getId());
-                customerScreenAdviceVO.setOptionId(nurseConfigOptionDO.getId());
+                NurseOptionCompareVO customerScreenAdviceVO = getNurseOptionCompareVO(screenAdviceItemSettingVO.getItemName(), screenAdviceItemSettingVO.getCategoryName(), customerDO, nurseConfigDO, nurseConfigOptionDO);
                 return customerScreenAdviceVO;
             } else {
                 return null;

+ 36 - 37
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/NurseConfigServiceImpl.java

@@ -15,7 +15,6 @@ import com.wdklian.ncs.ms.common.enums.ShopTypeEnum;
 import com.wdklian.ncs.ms.feignclient.open.DoctorAdviceFeignClient;
 import com.wdklian.ncs.ms.feignclient.open.NursingMarkOptionConfigFeignClient;
 import com.wdklian.ncs.ms.framework.database.annotation.Table;
-import com.wdklian.ncs.ms.framework.mvc.JsonResponse;
 import com.wdklian.ncs.ms.framework.util.DateUtil;
 import com.wdklian.ncs.ms.framework.util.StringUtil;
 import com.wdklian.ncs.ms.system.common.DoctorAdviceHelper;
@@ -27,10 +26,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.stream.Collectors;
@@ -96,8 +92,7 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
     @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<CustomerDO> renewParts(List<Integer> ids) {
         List<ShopDO> parts = shopService.listShopByIds(ids);
-        List<CustomerDO> customerDOS = renewPartNurse(parts);
-        return customerDOS;
+        return renewPartNurse(parts);
     }
 
     @Override
@@ -112,7 +107,7 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
                 NurseConfigDO nurseConfigDO = nurseConfigDOS.stream().filter(p -> StrUtil.isNotEmpty(p.getConfigName()) && StrUtil.trim(p.getConfigName()).equalsIgnoreCase(StrUtil.trim(categoryName))).findFirst().orElse(null);
                 if(nurseConfigDO!=null){
                     Map<String, List<DoctorAdviceMatchNursingMarkCategoryVO>> optionGroup = categoryGroup.get(categoryName);
-                    if(optionGroup!=null&&optionGroup.size()>0){
+                    if(optionGroup!=null&& !optionGroup.isEmpty()){
                         for (String optionName : optionGroup.keySet()) {
                             NurseConfigOptionDO nurseConfigOptionDO = nurseConfigOptionDOS.stream().filter(p -> StrUtil.isNotEmpty(p.getOptionName()) && StrUtil.trim(p.getOptionName()).equalsIgnoreCase(StrUtil.trim(optionName))).findFirst().orElse(null);
                             if (nurseConfigOptionDO == null) {
@@ -142,7 +137,8 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
     }
 
 
-    private List<CustomerDO> renewPartNurse(List<ShopDO> parts) {
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public List<CustomerDO> renewPartNurse(List<ShopDO> parts) {
         List<CustomerDO> customers = new ArrayList<>();
         List<String> partHisKeys = shopService.listPartsRefHisCode(parts);
         //关联科室的在院患者
@@ -151,11 +147,7 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
             return customers;
         }
 
-
-
-
-
-        List<Integer> partIds = parts.stream().mapToInt(p -> p.getShopId()).boxed().collect(Collectors.toList());
+        List<Integer> partIds = parts.stream().mapToInt(ShopDO::getShopId).boxed().collect(Collectors.toList());
         //相关科室的所有护理标识项目
 //        List<NurseConfigOptionDO> rangePartNurseOptions = nurseConfigOptionService.listNurseConfigOptionByPartIds(partIds);
         //相关科室的所有护理标识分类
@@ -166,14 +158,14 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
         //为每个科室开启一个线程处理
         for (ShopDO part : parts) {
             //由于各科室的配置可能不同,如果一次查询医嘱可能会导致同名项目匹配错误,所有需要按科室单独查询能匹配的医嘱
-            List<String> hisCodes = shopService.listPartsRefHisCode(Arrays.asList(part));
+            List<String> hisCodes = shopService.listPartsRefHisCode(Collections.singletonList(part));
             //与指定科室的护理标识项目匹配的医嘱
             List<DoctorAdviceMatchNursingMarkOptionVO> partRefDoctorAdvices = doctorAdviceFeignClient.listDoctorAdviceRefNurseByHisPartKey(part,false).getData();
             //todo 这里只取了本科室的,没有取-1的,前端需要把各个科室的设置分开
             List<NursingMarkOptionConfigVO> partNurseOptionConfig = rangePartNurseOptionConfig.stream().filter(p -> p.getForPartId().equals(part.getShopId())).collect(Collectors.toList());
             //能匹配护理标识分类的医嘱列表
             List<DoctorAdviceMatchNursingMarkCategoryVO> doctorAdviceCategoryVOS = doctorAdviceFeignClient.listDoctorAdviceRefNurseCategoryByHisPartKey(part).getData();
-            if(doctorAdviceCategoryVOS!=null&&doctorAdviceCategoryVOS.size()>0){
+            if(doctorAdviceCategoryVOS!=null&& !doctorAdviceCategoryVOS.isEmpty()){
                 this.handleAutoNurseOption(doctorAdviceCategoryVOS,part.getShopId());
             }
 
@@ -186,19 +178,17 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
             List<NurseConfigDO> partNurseConfig = rangePartNurseConfig.stream().filter(p -> p.getPartId().equals(part.getShopId())).collect(Collectors.toList());
             //可能有新的自动生成的项目,取出科室所有的护理标识项目
             List<NurseConfigOptionDO> partNurseOptions = nurseConfigOptionService.listNurseConfigOptionByPartIds(Arrays.asList(part.getShopId())); //rangePartNurseOptions.stream().filter(p -> p.getPartId().equals(part.getShopId())).collect(Collectors.toList());
-            Future<List<CustomerDO>> task = threadPoolTaskExecutor.submit(() -> {
-
-                        return nurseConfigOptionService.handleNurseAdviceForPart(part.getShopId(), partAdviceMap,doctorAdviceCategoryVOS,partInHospitalCustomers, partNurseConfig, partNurseOptions, partNurseOptionConfig);
-                    }
-
-            );
-            try {
-                customers.addAll(task.get());
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            } catch (ExecutionException e) {
-                e.printStackTrace();
-            }
+//            Future<List<CustomerDO>> task = threadPoolTaskExecutor.submit(() -> {
+//
+//                        return nurseConfigOptionService.handleNurseAdviceForPart(part.getShopId(), partAdviceMap,doctorAdviceCategoryVOS,partInHospitalCustomers, partNurseConfig, partNurseOptions, partNurseOptionConfig);
+//                    }
+//
+//            );
+//            try {
+                customers.addAll(nurseConfigOptionService.handleNurseAdviceForPart(part.getShopId(), partAdviceMap,doctorAdviceCategoryVOS,partInHospitalCustomers, partNurseConfig, partNurseOptions, partNurseOptionConfig));
+//            } catch (InterruptedException | ExecutionException e) {
+//                e.printStackTrace();
+//            }
 
         }
 
@@ -224,13 +214,13 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
     @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<CustomerDO> renewPart(Integer id) {
         ShopDO part = shopService.getModel(id);
-        return renewPartNurse(Arrays.asList(part));
+        return renewPartNurse(Collections.singletonList(part));
     }
 
     @Override
     @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<CustomerDO> renewDePartment(String key) {
-        List<ShopDO> parts = shopService.listShopByHisKeys(Arrays.asList(key));
+        List<ShopDO> parts = shopService.listShopByHisKeys(Collections.singletonList(key));
         return renewPartNurse(parts);
     }
 
@@ -254,6 +244,11 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
         this.daoSupport.execute(sql);
     }
 
+    @Override
+    public void deletePartNurseConfig(Integer partId) {
+        String sql = "delete from " + NurseConfigDO.class.getAnnotation(Table.class).name() + " where part_id = ?";
+        this.daoSupport.execute(sql, partId);
+    }
 
 
 
@@ -268,16 +263,20 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
         //要处理的科室列表
         List<ShopDO> shops = new ArrayList<>();
         if (partId.equals(-1)) {
+            //清空所有设置项目,重新生成
+            this.truncateTable();
+            this.nurseConfigOptionService.truncateTable();
+            this.customerMappingService.deleteNursingMarkMapping();
             shops.addAll(this.shopService.listShopByType(ShopTypeEnum.PART));
         } else {
+            this.deletePartNurseConfig(partId);
+            this.nurseConfigOptionService.deleteByPartId(partId);
+            this.customerMappingService.deleteNursingMarkMappingByPartId(partId);
             shops.add(this.shopService.getModel(partId));
         }
-        //清空所有设置项目,重新生成
-        this.truncateTable();
-        this.nurseConfigOptionService.truncateTable();
-        this.customerMappingService.deleteNursingMarkMapping();
 
-        if (list.size() > 0) {
+
+        if (!list.isEmpty()) {
             //删除已经在配置中不存在的床头屏医嘱分类
 //            String deleteOptionsSqlTpl = "delete from " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " where find_in_set(MD5(option_name),'%s')=0 and ncfg_id =%d";
 
@@ -293,7 +292,7 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
                         //同步分类
                         NurseConfigDO nurseConfigDO = this.syncPartScreenAdviceCategory(screenAdviceCategoryVO, shop);
                         List<NursingMarkOptionConfigDO> child = screenAdviceCategoryVO.getChild();
-                        if (!screenAdviceCategoryVO.getBoolAuto() && child != null && child.size() > 0) {
+                        if (!screenAdviceCategoryVO.getBoolAuto() && child != null && !child.isEmpty()) {
                             List<NursingMarkOptionConfigDO> partScreenAdviceItemSettingDOs = child.stream().filter(p -> !StringUtil.isEmpty(p.getItemNameMd5()) && p.getForPartId().equals(shop.getShopId())).collect(Collectors.toList());
 //                            String optionsNameMd5s = partScreenAdviceItemSettingDOs.stream().map(p -> p.getItemNameMd5()).collect(Collectors.joining(","));
 //                            String formatSql = String.format(deleteOptionsSqlTpl, optionsNameMd5s, nurseConfigDO.getId());

+ 13 - 12
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/ShopServiceImpl.java

@@ -12,6 +12,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -30,7 +31,7 @@ public class ShopServiceImpl extends SystemCRUDManagerImpl<ShopDO> implements Sh
     @Override
     public void updateDepartment(List<DepartmentDO> departmentDOS) {
 
-        if (departmentDOS != null && departmentDOS.size() > 0) {
+        if (departmentDOS != null && !departmentDOS.isEmpty()) {
             updateShop(departmentDOS);
         }
 
@@ -38,7 +39,7 @@ public class ShopServiceImpl extends SystemCRUDManagerImpl<ShopDO> implements Sh
 
     @Override
     public void insertDepartment(List<DepartmentDO> departmentDOS) {
-        if (departmentDOS != null && departmentDOS.size() > 0) {
+        if (departmentDOS != null && !departmentDOS.isEmpty()) {
             updateShop(departmentDOS);
         }
     }
@@ -52,22 +53,22 @@ public class ShopServiceImpl extends SystemCRUDManagerImpl<ShopDO> implements Sh
             if (StrUtil.isEmpty(part.getHisCode())) {
                 continue; //呼叫系统没有配置his科室主键 跳过
             }
-            DepartmentDO hispart = departmentDOS.stream().filter(p -> StrUtil.isNotEmpty(p.getKeyval()) && p.getKeyval().equals(part.getHisCode())).findFirst().orElse(null);
-            if (hispart == null) {//his系统中没有对应的科室
+            DepartmentDO hisPart = departmentDOS.stream().filter(p -> StrUtil.isNotEmpty(p.getKeyval()) && p.getKeyval().equals(part.getHisCode())).findFirst().orElse(null);
+            if (hisPart == null) {//his系统中没有对应的科室
                 continue;
             }
             List<String> partNames = new ArrayList<>();
-            partNames.add(hispart.getName());
+            partNames.add(hisPart.getName());
             if (StrUtil.isNotEmpty(part.getAttachHisCodes())) {
                 List<String> attachCodes = Arrays.asList(part.getAttachHisCodes().split(","));
                 List<DepartmentDO> attatchParts = departmentDOS.stream().filter(p -> StrUtil.isNotEmpty(p.getKeyval()) && attachCodes.contains(p.getKeyval())).collect(Collectors.toList());
-                partNames.addAll(attatchParts.stream().map(p -> p.getName()).collect(Collectors.toList()));
+                partNames.addAll(attatchParts.stream().map(DepartmentDO::getName).collect(Collectors.toList()));
             }
 
             //更新科室信息
-            part.setShopName(hispart.getName());
+            part.setShopName(hisPart.getName());
             // part.setFullName(StringUtils.substringBefore(part.getFullName(), "-") + "-" + hispart.getName());
-            part.setFullName(partNames.stream().collect(Collectors.joining("、")));
+            part.setFullName(String.join("、", partNames));
             this.edit(part, part.getShopId());
             updated.add(part);
         }
@@ -82,8 +83,8 @@ public class ShopServiceImpl extends SystemCRUDManagerImpl<ShopDO> implements Sh
 
     @Override
     public ShopDO updateShop(DepartmentDO departmentDO) {
-        List<ShopDO> shopDOS = this.updateShop(Arrays.asList(departmentDO));
-        if (shopDOS.size() > 0) {
+        List<ShopDO> shopDOS = this.updateShop(Collections.singletonList(departmentDO));
+        if (!shopDOS.isEmpty()) {
             return shopDOS.get(0);
         }
         return null;
@@ -130,7 +131,7 @@ public class ShopServiceImpl extends SystemCRUDManagerImpl<ShopDO> implements Sh
         List<String> refHisCodes = new ArrayList<>();
         //对接了his的科室his科室主键集合
         List<String> mainCodes = shopDOS.stream().filter(p -> StrUtil.isNotEmpty(p.getHisCode())).map(p -> p.getHisCode()).collect(Collectors.toList());
-        if (mainCodes != null && mainCodes.size() > 0) {
+        if (!mainCodes.isEmpty()) {
             refHisCodes.addAll(mainCodes);
         }
         //附加his科室对接
@@ -148,6 +149,6 @@ public class ShopServiceImpl extends SystemCRUDManagerImpl<ShopDO> implements Sh
     @Override
     public List<String> listPartsRefHisCode(Integer partId) {
         ShopDO shopDO = this.getModel(partId);
-        return this.listPartsRefHisCode(Arrays.asList(shopDO));
+        return this.listPartsRefHisCode(Collections.singletonList(shopDO));
     }
 }

+ 4 - 0
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/iservice/CustomerMappingService.java

@@ -35,4 +35,8 @@ public interface CustomerMappingService extends CRUDBaseManager<CustomerMappingD
     void clearCustomerMapping(Integer customer);
 
     void deleteNursingMarkMapping();
+
+    void deleteCareMappingByCustomerId(Integer customerId,Integer[] clerkIds);
+
+    void deleteNursingMarkMappingByPartId(Integer partId);
 }

+ 2 - 0
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/iservice/NurseConfigOptionService.java

@@ -56,4 +56,6 @@ public interface NurseConfigOptionService extends CRUDBaseManager<NurseConfigOpt
 
 
     void truncateTable();
+
+    void deleteByPartId(Integer partId);
 }

+ 2 - 0
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/iservice/NurseConfigService.java

@@ -42,5 +42,7 @@ public interface NurseConfigService extends CRUDBaseManager<NurseConfigDO> {
 
     void truncateTable();
 
+    void deletePartNurseConfig(Integer partId);
+
     Boolean applyNursingMark(List<NursingMarkCategoryConfigVO> nursingMarkCategoryConfigVOS, Integer partId);
 }

+ 33 - 0
ncs-system-service/src/main/resources/bootstrap.yml

@@ -17,6 +17,39 @@ spring:
         username: nacos
         password: nacos
         namespace: public
+#    stream:
+#      binders:
+#        rabbit:
+#          type: rabbit
+#          environment:
+#            spring:
+#              rabbitmq:
+#                host: 192.168.1.198
+#                port: 5672
+#                username: guest
+#                password: guest
+#                virtual-host: /
+#      bindings:
+#        adviceHandle-in-0:
+#          binder: rabbit
+#          destination: doctor_advice
+#          group: system-service
+#          content-type: application/json
+#          consumer:
+#            batch-mode: true
+#            concurrency: 1
+#        adviceOut:
+#          binder: rabbit
+#          destination: doctor_advice
+#          group: system-service
+#          content-type: application/json
+#      rabbit:
+#        bindings:
+#          adviceHandle-in-0:
+#            consumer:
+#              enable-batching: true
+#              batch-size: 10
+#              receive-timeout: 10000
   config:
     import: nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}?refresh=true
   profiles:

+ 0 - 3
pom.xml

@@ -13,12 +13,9 @@
     <description>维鼎康联微服务架构主工程</description>
 
     <modules>
-        <!--<module>third-party-entrace</module>-->
-        <!--<module>third-party-data2ncs</module>-->
         <module>third-party-common</module>
         <module>ncs-ms-framework</module>
         <module>third-party-gateway</module>
-        <!--<module>third-party-translate-config</module>-->
         <module>sign-gather</module>
         <module>synchrony-scheduled-task</module>
         <module>third-part-wn-hl7</module>

+ 4 - 2
third-part-wn-hl7/pom.xml

@@ -189,13 +189,15 @@
             <version>1.0.0</version>
             <scope>compile</scope>
         </dependency>
-
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
+        </dependency>
         <dependency>
             <groupId>de.siegmar</groupId>
             <artifactId>logback-gelf</artifactId>
             <version>3.0.0</version>
         </dependency>
-
     </dependencies>
     <build>
         <plugins>

+ 34 - 10
third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/config/MyHL7BusinessLogicService.java

@@ -17,12 +17,15 @@ import com.wdklian.ncs.ms.feignclient.open.PatientFeignClient;
 import com.wdklian.ncs.ms.framework.cache.Cache;
 import com.wdklian.ncs.ms.framework.util.BeanUtil;
 import com.wdklian.ncs.ms.framework.util.StringUtil;
+import com.wdklian.ncs.ms.wn.hl7.stream.DoctorAdviceSender;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.AmqpTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
 import java.util.Calendar;
+import java.util.UUID;
 
 @Component()
 @Slf4j
@@ -34,13 +37,17 @@ public class MyHL7BusinessLogicService {
     @Autowired
     private PatientFeignClient patientFeignClient;
 
-    @Autowired
-    private EntraceDoctorAdviceFeignClient entraceDoctorAdviceFeignClient;
+//    @Autowired
+//    EntraceDoctorAdviceFeignClient entraceDoctorAdviceFeignClient;
+
 
     @Autowired
     Cache cache;
 
-
+    @Autowired
+    AmqpTemplate amqpTemplate;
+    @Autowired
+    DoctorAdviceSender doctorAdviceSender;
 
     @Autowired
     private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@@ -140,16 +147,25 @@ public class MyHL7BusinessLogicService {
 
 
                     }
+                    if(status.equalsIgnoreCase("9")||//入院作废
+                            status.equalsIgnoreCase("3")|| //出院
+                            status.equalsIgnoreCase("2")){ //出区
+                        patientFeignClient.patientOut(patientKey);
+                        return;
+                    }
                     //处理患者信息,根据缓存数据判定是否需要提交到数据库更新
                     if (patient != null) {
                         if (StrUtil.isEmpty(patient.getBedNo())) {
-                            Object o = cache.get(patientKey);
-                            if (o != null) {
-                                patient.setBedNo(o.toString());
-                            }
+
+                                Object o = cache.get(patientKey);
+                                if (o != null&&!status.equalsIgnoreCase("9")) { //不是作废入院
+                                        patient.setBedNo(o.toString());
+
+                                }
                         }
 
                        if(StrUtil.isEmpty(patient.getBedNo())){ //防止接口报错
+
                            return;
                        }
                        //患者再次入院重选分床,要把患者上次的出院日期清除,否则会认为已出院,同步不了
@@ -258,13 +274,18 @@ public class MyHL7BusinessLogicService {
                     }
                     adviceDO.setCustomerBedNo(StrUtil.emptyToNull(bedNo));
                     Object cacheAdvice = cache.get("DOCTOR_ADVICE_" + adviceId);
+
+//                    this.amqpTemplate.convertAndSend("MS_DOCTOR_ADVICE_SYNC", "MS_DOCTOR_ADVICE_SYNC_ROUTING", adviceDO);
                     if (cacheAdvice == null) { //医嘱没有缓存,表明医嘱未保存,或超过24小时没有操作。
-                        entraceDoctorAdviceFeignClient.syncSingleDoctorAdvice(adviceDO);
+//                        entraceDoctorAdviceFeignClient.syncSingleDoctorAdvice(adviceDO);/
+                        //使用stream 分批处理医嘱,防止单条数据处理能力不足
+                        doctorAdviceSender.pushMsg(adviceDO);
                         cache.put("DOCTOR_ADVICE_" + adviceId, adviceDO, 24 * 60 * 60);
                     } else { //只有医嘱有变化时才更新,减少数据库访问次数
                         DoctorAdviceDO adviceOld = (DoctorAdviceDO) cacheAdvice;
                         if (!ObjectUtil.equal(adviceDO, adviceOld)) {
-                            entraceDoctorAdviceFeignClient.syncSingleDoctorAdvice(adviceDO);
+//                            entraceDoctorAdviceFeignClient.syncSingleDoctorAdvice(adviceDO);
+                            doctorAdviceSender.pushMsg(adviceDO);
                             //重新缓存
                             cache.put("DOCTOR_ADVICE_" + adviceId, adviceDO, 24 * 60 * 60);
                         }
@@ -275,9 +296,11 @@ public class MyHL7BusinessLogicService {
             };
 
             threadPoolTaskExecutor.submit(r);
+
 //            log.info(JSON.toJSONString(adviceDO, JSONWriter.Feature.PrettyFormat));
         }
-
+//        messageProvider.send();
+//        this.entracePatientFeignClient.patientOut("54744");
 
         return msg;
     }
@@ -301,6 +324,7 @@ public class MyHL7BusinessLogicService {
             case "3": //出院
             case "7": //转科状态
             case "8": //数据转出
+            case "9": //入院作废
                 return "1";
             case "1": //病区分床
             case "5":

+ 46 - 0
third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/mq/DoctorAdviceSyncConsumer.java

@@ -0,0 +1,46 @@
+//package com.wdklian.ncs.ms.wn.hl7.mq;
+//
+//import com.wdklian.ncs.ms.common.entity.open.dos.DoctorAdviceDO;
+//import com.wdklian.ncs.ms.feignclient.entrace.EntraceDoctorAdviceFeignClient;
+//import org.springframework.amqp.rabbit.annotation.Exchange;
+//import org.springframework.amqp.rabbit.annotation.Queue;
+//import org.springframework.amqp.rabbit.annotation.QueueBinding;
+//import org.springframework.amqp.rabbit.annotation.RabbitListener;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.messaging.handler.annotation.Payload;
+//import org.springframework.stereotype.Component;
+//
+//import java.util.List;
+//
+///**
+// * @author wuyunfeng
+// * 2024/4/22 19:16
+// */
+//@Component
+//public class DoctorAdviceSyncConsumer {
+//    @Autowired
+//    private EntraceDoctorAdviceFeignClient entraceDoctorAdviceFeignClient;
+//    /** 医嘱同步消息队列
+//     *  在同步医嘱时,由于平台会一次性发送多条,在短时间内触发多次医嘱刷新,负载到不同节点上执行
+//     *  会存在数据重复插入的问题.这里通过消息队列,设置每10条同步一次,或者在10内未没有达到10条数据,也触发一次
+//     * */
+//    @RabbitListener(bindings = @QueueBinding(
+//            value = @Queue(value ="MS_DOCTOR_ADVICE_SYNC_QUEUE"),
+//            exchange = @Exchange(value = "MS_DOCTOR_ADVICE_SYNC"),
+//            key = "MS_DOCTOR_ADVICE_SYNC_ROUTING"
+//    ),containerFactory = "myContainerFactory")
+//    public void doctorAdviceSync(@Payload List<DoctorAdviceDO> adviceDOS) {
+//      try {
+//          System.out.println("接收到医嘱同步消息:" + adviceDOS.size());
+////          if (adviceDOS != null && !adviceDOS.isEmpty()) {
+////              entraceDoctorAdviceFeignClient.syncDoctorAdvice(adviceDOS);
+////          }
+//
+//      }catch (Exception e){
+//          e.printStackTrace();
+//      }
+//    }
+//
+//
+//
+//}

+ 25 - 0
third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/mq/RabbitMQConfig.java

@@ -0,0 +1,25 @@
+//package com.wdklian.ncs.ms.wn.hl7.mq;
+//
+//import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
+//import org.springframework.amqp.rabbit.connection.ConnectionFactory;
+//import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//
+//@Configuration
+//public class RabbitMQConfig {
+//
+//    @Bean
+//    public SimpleRabbitListenerContainerFactory myContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
+//        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
+//        configurer.configure(factory, connectionFactory);
+////        factory.setPrefetchCount(10); // 设置批量消费的消息数量为10
+//        factory.setBatchListener(true);
+//        //每次接两条
+//        factory.setBatchSize(10);
+//        //十秒内没有数据再入队列,也执行
+//        factory.setReceiveTimeout(1000L * 10);
+//        factory.setConsumerBatchEnabled(true);
+//        return factory;
+//    }
+//}

+ 32 - 0
third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/stream/DoctorAdviceHandler.java

@@ -0,0 +1,32 @@
+package com.wdklian.ncs.ms.wn.hl7.stream;
+
+import com.wdklian.ncs.ms.common.entity.open.dos.DoctorAdviceDO;
+import com.wdklian.ncs.ms.feignclient.entrace.EntraceDoctorAdviceFeignClient;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+
+@Slf4j
+@Component
+public class DoctorAdviceHandler {
+    @Autowired
+    EntraceDoctorAdviceFeignClient entraceDoctorAdviceFeignClient;
+    /**
+     * 参数也可以是对象,会自动将消息转换为对象
+     */
+    @Bean
+    Consumer<List<DoctorAdviceDO>> adviceHandle() {
+        return payload -> {
+            log.info("Received message: {}", payload);
+            if (payload != null && !payload.isEmpty()) {
+                List<DoctorAdviceDO> doctorAdviceDOS = entraceDoctorAdviceFeignClient.syncDoctorAdvice(payload).getData();
+                int i=0;
+            }
+        };
+    }
+}

+ 25 - 0
third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/stream/DoctorAdviceSender.java

@@ -0,0 +1,25 @@
+package com.wdklian.ncs.ms.wn.hl7.stream;
+
+import com.wdklian.ncs.ms.common.entity.open.dos.DoctorAdviceDO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.stream.function.StreamBridge;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.stereotype.Component;
+
+
+@Component
+@Slf4j
+public class DoctorAdviceSender {
+
+    @Autowired
+    StreamBridge streamBridge;
+
+    public void pushMsg(DoctorAdviceDO adviceDO) {
+        log.info("sending rabbitmq message:{}", adviceDO.toString());
+        streamBridge.send("adviceOut",MessageBuilder.withPayload(adviceDO).build());
+    }
+}
+
+
+

+ 47 - 8
third-part-wn-hl7/src/main/resources/bootstrap.yml

@@ -24,6 +24,41 @@ spring:
         username: nacos
         password: nacos
         namespace: public
+    stream:
+      binders:
+        rabbit:
+          type: rabbit
+          environment:
+            spring:
+              rabbitmq:
+                host: 192.168.1.198
+                port: 5672
+                username: guest
+                password: guest
+                virtual-host: /
+      bindings:
+        adviceHandle-in-0:
+          binder: rabbit
+          destination: doctor_advice
+          group: system-service
+          content-type: application/json
+          consumer:
+            batch-mode: true
+            concurrency: 1
+            max-attempts: 1
+        adviceOut:
+          binder: rabbit
+          destination: doctor_advice
+          group: system-service
+          content-type: application/json
+      rabbit:
+        bindings:
+          adviceHandle-in-0:
+            consumer:
+              enable-batching: true
+              batch-size: 10
+              receive-timeout: 10000
+
   config:
     import: nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}?refresh=true
   application:
@@ -38,10 +73,7 @@ logging:
   config: classpath:logback-wn.xml
   level:
     com.wdklian.ncs.ms.feignclient.*: debug #开启open-feign调用日志
-#ribbon:
-#  MaxAutoRetries: 2
-#  MaxAutoRetriesNextServer: 3
-#  OkToRetryOnAllOperations: false
+
 
 
 graylog:
@@ -52,7 +84,14 @@ feign:
   client:
     config:
       default:
-        retryer: com.wdklian.ncs.ms.retryer.MyRetryer #超时重试配置
-        ConnectTimeOut: 10000  #open-feign连接超时时长
-        ReadTimeOut: 10000 #open-feign读超时时长
-        loggerLevel: FULL #必须设置为FULL才会打印open-fegin请求日志
+        #retryer: com.wdklian.ncs.ms.retryer.MyRetryer #超时重试配置
+        connect-timeout: 1000  #open-feign连接超时时长
+        read-timeout: 1000 #open-feign读超时时长
+        loggerLevel: FULL #必须设置为FULL才会打印open-fegin请求日志
+#entrace-service:
+#  ribbon:
+#    ReadTimeout: 5000
+#    ConnectTimeout: 5000
+#    MaxAutoRetries: 1
+#    MaxAutoRetriesNextServer: 1
+#    OkToRetryOnAllOperations: false #仅针对get请求重试

+ 4 - 0
third-part-wn-hl7/src/test/java/WNServiceTest.java

@@ -8,7 +8,9 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.core.env.PropertyResolver;
 import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.util.PropertyPlaceholderHelper;
 
 import java.net.MalformedURLException;
 
@@ -74,6 +76,8 @@ public class WNServiceTest {
 //        log.info(ObjectUtil.equals(d1,d2)+"");
 
         int i = 0;
+        PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper("${", "}");
+
 
     }
 

+ 29 - 15
third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/MessageSendRecordDO.java

@@ -38,8 +38,8 @@ public class MessageSendRecordDO implements Serializable {
      * 发送方式、自动、手动
      */
     @Column(name = "send_mode")
-    @ApiModelProperty(value = "发送方式、自动、手动", required = false)
-    private String sendMode;
+    @ApiModelProperty(value = "发送方式、1-自动、2-手动", required = false)
+    private Integer sendMode;
     /**
      * 消息id
      */
@@ -71,11 +71,18 @@ public class MessageSendRecordDO implements Serializable {
     @ApiModelProperty(value = "是否发送成功", required = false)
     private Boolean boolSended;
     /**
-     * 重发时间
+     * 客户端接收时间
      */
-    @Column(name = "resend_time")
-    @ApiModelProperty(value = "重发时间", required = false)
-    private Long resendTime;
+    @Column(name = "received_time")
+    @ApiModelProperty(value = "客户端接收时间", required = false)
+    private Long receivedTime;
+
+    /**
+     * 消息已读时间
+     */
+    @Column(name = "read_time")
+    @ApiModelProperty(value = "消息已读时间", required = false)
+    private Long readTime;
     /**
      * 消息类型id
      */
@@ -93,7 +100,7 @@ public class MessageSendRecordDO implements Serializable {
      */
     @Column(name = "bool_template_mesage")
     @ApiModelProperty(value = "是否为模板消息", required = false)
-    private String boolTemplateMesage;
+    private Boolean boolTemplateMesage;
     /**
      * 消息模板
      */
@@ -107,17 +114,24 @@ public class MessageSendRecordDO implements Serializable {
     @ApiModelProperty(value = "参数json", required = false)
     private String paramerJson;
     /**
-     * 模板消息内容
+     * 消息内容显示,普通消息为消息的摘要,模板消息直接显示消息内容
      */
-    @Column(name = "template_message_content")
-    @ApiModelProperty(value = "模板消息内容", required = false)
-    private String templateMessageContent;
+    @Column(name = "message_content_show")
+    @ApiModelProperty(value = "消息内容显示,普通消息为消息的摘要,模板消息直接显示消息内容", required = false)
+    private String messageContentShow;
+    /**
+     * 消息标题
+     */
+    @Column(name = "message_title")
+    @ApiModelProperty(value = "消息标题", required = false)
+    private String messageTitle;
+
     /**
-     * 模板消息标题
+     * 科室Id
      */
-    @Column(name = "template_message_title")
-    @ApiModelProperty(value = "模板消息标题", required = false)
-    private String templateMessageTitle;
+    @Column(name = "part_id")
+    @ApiModelProperty(value = "科室Id", required = false)
+    private Integer partId;
 
 
 }

+ 1 - 6
third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/MessageTypeDO.java

@@ -35,12 +35,7 @@ public class MessageTypeDO implements Serializable {
     @Column(name = "type_name")
     @ApiModelProperty(value = "消息类型名称", required = false)
     private String typeName;
-    /**
-     * 消息打开方式
-     */
-    @Column(name = "open_type")
-    @ApiModelProperty(value = "消息打开方式", required = false)
-    private String openType;
+
     /**
      * 创建时间
      */

+ 25 - 0
third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/MessagesDO.java

@@ -71,6 +71,31 @@ public class MessagesDO implements Serializable {
     @Column(name = "creator")
     @ApiModelProperty(value = "创建人", required = false)
     private String creator;
+    /**
+     * 消息摘要
+     */
+    @Column(name = "description")
+    @ApiModelProperty(value = "消息摘要", required = false)
+    private String description;
 
+    /**
+     * 消息展现方式
+     */
+    @Column(name = "open_type")
+    @ApiModelProperty(value = "消息展现方式", required = false)
+    private String openType;
+    /**
+     * 消息状态
+     */
+    @Column(name="status")
+    @ApiModelProperty(value="状态", example = "0:草稿,1-未发布,2-已发布",required=false)
+    private Integer status;
+
+    /**
+     * 与其他科室共享模板
+     */
+    @Column(name = "bool_shared")
+    @ApiModelProperty(value = "是否共享", required = false)
+    private Boolean boolShared;
 
 }

+ 42 - 22
third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/TemplateMessageParamerDO.java

@@ -14,7 +14,7 @@ import lombok.NoArgsConstructor;
 import java.io.Serializable;
 
 
-@Table(name="template_message_paramer")
+@Table(name = "template_message_paramer")
 @ApiModel
 @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
 @Data
@@ -22,26 +22,46 @@ import java.io.Serializable;
 @AllArgsConstructor
 public class TemplateMessageParamerDO implements Serializable {
 
-  	/**
-	*	null
-	*/	@Column(name = "id" )
-	@ApiModelProperty(value="null",required=false)
-	@Id(name="id")
-  private Integer id;
-  	/**
-	*	参数名称
-	*/	@Column(name = "param_name" )
-	@ApiModelProperty(value="参数名称",required=false)
-  private String paramName;
-  	/**
-	*	参数输入类型select,input
-	*/	@Column(name = "input_type" )
-	@ApiModelProperty(value="参数输入类型select,input",required=false)
-  private String inputType;
-  	/**
-	*	预设参数可用值json数组
-	*/	@Column(name = "pre_input_option" )
-	@ApiModelProperty(value="预设参数可用值json数组",required=false)
-  private String preInputOption;
+    /**
+     * null
+     */
+    @Column(name = "id")
+    @ApiModelProperty(value = "null", required = false)
+    @Id(name = "id")
+    private Integer id;
+    /**
+     * 参数名称
+     */
+    @Column(name = "param_name")
+    @ApiModelProperty(value = "参数名称", required = false)
+    private String paramName;
+
+    /**
+     * 允许自定义输入
+     */
+    @Column(name = "allow_input")
+    @ApiModelProperty(value = "允许自定义输入", required = false)
+    private Boolean allowInput;
+
+    /**
+     * 允许自定义输入
+     */
+    @Column(name = "bool_date")
+    @ApiModelProperty(value = "是日期类型", required = false)
+    private Boolean boolDate;
+
+    /**
+     * 允许自定义输入
+     */
+    @Column(name = "bool_time")
+    @ApiModelProperty(value = "是否时间类型", required = false)
+    private Boolean boolTime;
+
+    /**
+     * 预设参数可用值json数组
+     */
+    @Column(name = "pre_input_option")
+    @ApiModelProperty(value = "预设参数可用值json数组", required = false)
+    private String preInputOption;
 
 }

+ 11 - 0
third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/TemplateMessageTplDO.java

@@ -48,5 +48,16 @@ public class TemplateMessageTplDO implements Serializable {
     @ApiModelProperty(value = "模板内容", required = false)
     private String templateContent;
 
+   /**
+     * 与其他科室共享模板
+     */
+    @Column(name = "bool_shared")
+    @ApiModelProperty(value = "是否共享", required = false)
+    private Boolean boolShared;
+    /** 模板中使用到的参数列表*/
+    @Column(name = "paramers")
+    @ApiModelProperty(value = "参数列表json数组", required = false)
+    private String paramers;
+
 
 }

+ 30 - 0
third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/vos/MessageTypeVO.java

@@ -0,0 +1,30 @@
+package com.wdklian.ncs.ms.common.entity.msgcenter.vos;
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessageTypeDO;
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessagesDO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author wuyunfeng
+ * 2024/4/28 11:12
+ */
+
+@ApiModel
+@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MessageTypeVO extends MessageTypeDO {
+
+    @ApiModelProperty(value = "消息列表", required = false)
+    private List<MessagesDO> messages;
+
+}

+ 31 - 0
third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/vos/TemplateMessageTplVO.java

@@ -0,0 +1,31 @@
+package com.wdklian.ncs.ms.common.entity.msgcenter.vos;
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.TemplateMessageParamerDO;
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.TemplateMessageTplDO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author wuyunfeng
+ * 2024/4/28 12:04
+ */
+@ApiModel("模板消息模板和参数选项")
+@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class TemplateMessageTplVO extends TemplateMessageTplDO {
+
+    /**
+     * 模板中使用到的参数列表
+     */
+    @ApiModelProperty(value = "参数列表", required = false)
+    private List<TemplateMessageParamerDO> messageParamers;
+}

+ 4 - 0
third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/system/vos/CustomerNurseConfigMappingVO.java

@@ -64,6 +64,10 @@ public class CustomerNurseConfigMappingVO implements Serializable {
      * 护理参数值的颜色
      */
     private String nurseconfigOptionColor;
+    /**
+     * 科室Id
+     */
+    private Integer partId;
 
 
 }

+ 5 - 2
third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/system/vos/NurseOptionCompareVO.java

@@ -33,15 +33,18 @@ public class NurseOptionCompareVO implements Serializable {
     //分类id
     private Integer categoryId;
 
-    //只要是同分类同选项,则认为相等。比对时通过集合运算,计算出相同与不同项
+    //只要是同科室同分类同选项,则认为相等。比对时通过集合运算,计算出相同与不同项
     @Override
     public boolean equals(Object obj) {
         return StrUtil.isNotEmpty(this.categoryName) &&
                 StrUtil.isNotEmpty(((NurseOptionCompareVO)obj).getCategoryName()) &&
                 StrUtil.isNotEmpty(this.optionName) &&
                 StrUtil.isNotEmpty(((NurseOptionCompareVO)obj).getOptionName()) &&
+                this.partId!=null &&
+                ((NurseOptionCompareVO)obj).getPartId()!=null &&
                 this.categoryName.equalsIgnoreCase(((NurseOptionCompareVO)obj).getCategoryName()) &&
-                this.optionName.equalsIgnoreCase(((NurseOptionCompareVO)obj).getOptionName());
+                this.optionName.equalsIgnoreCase(((NurseOptionCompareVO)obj).getOptionName())&&
+                this.partId.equals(((NurseOptionCompareVO)obj).getPartId());
     }
 
     @Override