Explorar o código

Merge branch 'master' into feature/ccey

# Conflicts:
#	ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntracePatientFeignClient.java
#	pom.xml
vothin hai 1 ano
pai
achega
3999b31e04
Modificáronse 98 ficheiros con 3230 adicións e 617 borrados
  1. 9 3
      ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/controller/PatientController.java
  2. 17 15
      ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/BoardItemService.java
  3. 2 2
      ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/DoctorAdviceService.java
  4. 119 167
      ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/NursingMarkCategoryService.java
  5. 8 7
      ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/PartTempBedService.java
  6. 8 4
      ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/PatientService.java
  7. 6 0
      ncs-entrace-service/src/main/resources/bootstrap.yml
  8. 2 0
      ncs-message-center/README.md
  9. 109 0
      ncs-message-center/pom.xml
  10. 108 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/ConfigSwagger2.java
  11. 22 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/MessageCenterApplication.java
  12. 93 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/config/DataSourceConfig.java
  13. 99 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessageSendRecordController.java
  14. 77 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessageSendStrategyController.java
  15. 96 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessageTypeController.java
  16. 96 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessagesController.java
  17. 92 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/TemplateMessageParamerController.java
  18. 92 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/TemplateMessageTplController.java
  19. 24 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/MessageCenterCRUDServiceImpl.java
  20. 34 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/MessageSendRecordServiceImpl.java
  21. 16 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/MessageSendStrategyServiceImpl.java
  22. 55 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/MessageTypeServiceImpl.java
  23. 66 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/MessagesServiceImpl.java
  24. 42 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/TemplateMessageParamerServiceImpl.java
  25. 119 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/impl/TemplateMessageTplServiceImpl.java
  26. 15 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/MessageSendRecordService.java
  27. 12 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/MessageSendStrategyService.java
  28. 19 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/MessageTypeService.java
  29. 36 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/MessagesService.java
  30. 16 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/TemplateMessageParamerService.java
  31. 22 0
      ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/service/iservice/TemplateMessageTplService.java
  32. 58 0
      ncs-message-center/src/main/resources/bootstrap.yml
  33. 4 3
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntraceDepartmentFeignClient.java
  34. 2 2
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntraceDoctorAdviceFeignClient.java
  35. 4 3
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntraceEmployeeFeignClient.java
  36. 10 6
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/entrace/EntracePatientFeignClient.java
  37. 3 2
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/open/DoctorAdviceFeignClient.java
  38. 8 0
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/open/NursingMarkCategoryConfigFeignClient.java
  39. 8 1
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/system/CustomerFeignClient.java
  40. 7 0
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/system/NursingMarkFeignClient.java
  41. 16 8
      ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/retryer/MyRetryer.java
  42. 1 1
      ncs-ms-framework/src/main/java/com/wdklian/ncs/ms/framework/mvc/GridParameterParser.java
  43. 1 1
      ncs-ms-framework/src/main/resources/logback.xml
  44. 3 2
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/controller/DoctorAdviceController.java
  45. 25 5
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/controller/NursingMarkCategoryConfigController.java
  46. 42 0
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/mq/DoctorAdviceSyncConsumer.java
  47. 25 0
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/mq/RabbitMQConfig.java
  48. 8 7
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/AdviceReferenceBoardItemServiceImpl.java
  49. 10 9
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/AdviceReferenceNursingMarkOptionServiceImpl.java
  50. 8 7
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/AdviceUniqueContentServiceImpl.java
  51. 5 5
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/BoardItemConfigServiceImpl.java
  52. 1 1
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/DepartmentServiceImpl.java
  53. 8 7
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/DoctorAdviceServiceImpl.java
  54. 4 5
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/EmployeeServiceImpl.java
  55. 57 49
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/NursingMarkCategoryConfigServiceImpl.java
  56. 5 5
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/NursingMarkOptionConfigServiceImpl.java
  57. 7 10
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/impl/PatientServiceImpl.java
  58. 10 1
      ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/iservice/NursingMarkCategoryConfigService.java
  59. 1 1
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/common/DoctorAdviceHelper.java
  60. 9 1
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/controller/NursingMarkController.java
  61. 30 31
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/BoardItemServiceImpl.java
  62. 2 5
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/ClerkServiceImpl.java
  63. 24 1
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/CustomerMappingServiceImpl.java
  64. 66 61
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/CustomerServiceImpl.java
  65. 3 0
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/DeviceServiceImpl.java
  66. 1 1
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/MemberServiceImpl.java
  67. 91 58
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/NurseConfigOptionServiceImpl.java
  68. 171 39
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/NurseConfigServiceImpl.java
  69. 13 12
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/ShopServiceImpl.java
  70. 6 0
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/iservice/CustomerMappingService.java
  71. 6 30
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/iservice/NurseConfigOptionService.java
  72. 7 0
      ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/iservice/NurseConfigService.java
  73. 33 0
      ncs-system-service/src/main/resources/bootstrap.yml
  74. 1 3
      pom.xml
  75. 47 0
      synchrony-scheduled-task/src/main/java/com/wdklian/ncs/ms/scheduled/controller/DataRefreshController.java
  76. 24 4
      synchrony-scheduled-task/src/main/java/com/wdklian/ncs/ms/scheduled/service/DataBaseSyncService.java
  77. 10 2
      synchrony-scheduled-task/src/main/java/com/wdklian/ncs/ms/scheduled/service/DataxEngineHelper.java
  78. 1 1
      synchrony-scheduled-task/src/main/resources/bootstrap.yml
  79. 4 2
      third-part-wn-hl7/pom.xml
  80. 61 16
      third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/config/MyHL7BusinessLogicService.java
  81. 46 0
      third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/mq/DoctorAdviceSyncConsumer.java
  82. 25 0
      third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/mq/RabbitMQConfig.java
  83. 32 0
      third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/stream/DoctorAdviceHandler.java
  84. 25 0
      third-part-wn-hl7/src/main/java/com/wdklian/ncs/ms/wn/hl7/stream/DoctorAdviceSender.java
  85. 47 8
      third-part-wn-hl7/src/main/resources/bootstrap.yml
  86. 4 0
      third-part-wn-hl7/src/test/java/WNServiceTest.java
  87. 137 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/MessageSendRecordDO.java
  88. 69 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/MessageSendStrategyDO.java
  89. 53 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/MessageTypeDO.java
  90. 101 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/MessagesDO.java
  91. 67 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/TemplateMessageParamerDO.java
  92. 63 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/dos/TemplateMessageTplDO.java
  93. 30 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/vos/MessageTypeVO.java
  94. 31 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/msgcenter/vos/TemplateMessageTplVO.java
  95. 1 1
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/open/dos/PatientDO.java
  96. 2 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/system/dos/NurseConfigDO.java
  97. 4 0
      third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/system/vos/CustomerNurseConfigMappingVO.java
  98. 11 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

@@ -49,14 +49,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")
     })
@@ -64,13 +64,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 {
 

+ 17 - 15
ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/BoardItemService.java

@@ -140,23 +140,25 @@ public class BoardItemService {
                 JSONArray manualBeds = JSON.parseArray(p.getManualAddData());
                 if (!manualBeds.isEmpty()) {
                     List<DoctorAdviceMatchBoardItemVO> doctorAdvices = vo.getDoctorAdvices();
-                    List<String> adviceBeds = doctorAdvices.stream().map(d -> d.getCustomerBedNo()).collect(Collectors.toList());
-                    List<String> manualBedArr = manualBeds.stream().map(m -> m.toString()).collect(Collectors.toList());
-                    List<String> nomatchBeds = ListUtils.removeAll(manualBedArr, adviceBeds);
-                    if (nomatchBeds != null && nomatchBeds.size() > 0) {
-                        for (String nomatchBed : nomatchBeds) {
-                            DoctorAdviceMatchBoardItemVO dambiVO = new DoctorAdviceMatchBoardItemVO();
-                            dambiVO.setCustomerBedNo(nomatchBed);
-                            dambiVO.setAdviceContent("手工输入床位");
+                    if(doctorAdvices!=null) {
+                        List<String> adviceBeds = doctorAdvices.stream().filter(d -> StrUtil.isNotEmpty(d.getCustomerBedNo())).map(d -> d.getCustomerBedNo()).collect(Collectors.toList());
+                        List<String> manualBedArr = manualBeds.stream().map(m -> m.toString()).collect(Collectors.toList());
+                        List<String> nomatchBeds = ListUtils.removeAll(manualBedArr, adviceBeds);
+                        if (nomatchBeds != null && nomatchBeds.size() > 0) {
+                            for (String nomatchBed : nomatchBeds) {
+                                DoctorAdviceMatchBoardItemVO dambiVO = new DoctorAdviceMatchBoardItemVO();
+                                dambiVO.setCustomerBedNo(nomatchBed);
+                                dambiVO.setAdviceContent("手工输入床位");
 //                                DoctorAdviceDO doctorAdviceDO = nomatchAdvices.stream().filter(p -> p.getCustomerBedNo().equalsIgnoreCase(nomatchBed)).findFirst().orElse(null);
-                            CustomerFrameVO customerFrameVO = hospitalizedBeds.stream().filter(cf -> !StringUtil.isEmpty(cf.getBedNo()) && cf.getBedNo().equalsIgnoreCase(nomatchBed)).findFirst().orElse(null);
-                            if (customerFrameVO != null) {
-                                dambiVO.setHisKey(customerFrameVO.getId().toString());
-                                dambiVO.setPatientName(customerFrameVO.getNamed());
-                            } else {
-                                dambiVO.setHisKey(ObjectId.next());
+                                CustomerFrameVO customerFrameVO = hospitalizedBeds.stream().filter(cf -> !StringUtil.isEmpty(cf.getBedNo()) && cf.getBedNo().equalsIgnoreCase(nomatchBed)).findFirst().orElse(null);
+                                if (customerFrameVO != null) {
+                                    dambiVO.setHisKey(customerFrameVO.getId().toString());
+                                    dambiVO.setPatientName(customerFrameVO.getNamed());
+                                } else {
+                                    dambiVO.setHisKey(ObjectId.next());
+                                }
+                                doctorAdvices.add(dambiVO);
                             }
-                            doctorAdvices.add(dambiVO);
                         }
                     }
                 }

+ 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);
             };

+ 119 - 167
ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/NursingMarkCategoryService.java

@@ -119,63 +119,9 @@ public class NursingMarkCategoryService {
 
     public JsonResponse foceCopyDefaultToPart() {
 
-        List<NursingMarkCategoryConfigVO> categoryConfigVOS = this.categoryConfigFeignClient.list(-1).getData();
+//        List<NursingMarkCategoryConfigVO> categoryConfigVOS = this.categoryConfigFeignClient.list(-1).getData();
         List<ShopDO> shopDOS = this.shopFeignClient.listShopByType(ShopTypeEnum.PART.value()).getData();
-
-        for (ShopDO shopDO : shopDOS) {
-            NursingMarkCategoryConfigDO categoryConfigDO = new NursingMarkCategoryConfigDO();
-            NursingMarkOptionConfigDO optionConfigDO = new NursingMarkOptionConfigDO();
-            List<NursingMarkCategoryConfigVO> partCategory = this.categoryConfigFeignClient.list(shopDO.getShopId()).getData();
-            for (NursingMarkCategoryConfigVO categoryConfigVO : categoryConfigVOS) {
-                NursingMarkCategoryConfigVO sameNameCategory = partCategory.stream().filter(p -> StrUtil.isNotEmpty(p.getNameMd5()) && p.getNameMd5().equalsIgnoreCase(categoryConfigVO.getNameMd5())).findFirst().orElse(null);
-                if (sameNameCategory != null && !categoryConfigVO.getId().equals(sameNameCategory.getCopyFrom())) { //存在同名分类,但不是从categoryConfigVO拷贝而来,删除这个项目及其子项
-                    this.categoryConfigFeignClient.delete(sameNameCategory.getId());
-                    partCategory.remove(sameNameCategory);
-                }
-                NursingMarkCategoryConfigVO copyFrom = partCategory.stream().filter(p -> p.getCopyFrom() != null && p.getCopyFrom().equals(categoryConfigVO.getId()) && p.getForPartId() != null && p.getForPartId().equals(shopDO.getShopId())).findFirst().orElse(null);
-                List<NursingMarkOptionConfigDO> copyChild = new ArrayList<>();
-                if (copyFrom != null) {
-                    copyChild = copyFrom.getChild();
-                    BeanUtil.copyProperties(copyFrom, categoryConfigDO);
-                    BeanUtil.copyProperties(categoryConfigVO, categoryConfigDO);
-                    categoryConfigDO.setCopyFrom(categoryConfigVO.getId());
-                    categoryConfigDO.setId(copyFrom.getId());
-                    categoryConfigDO.setForPartId(shopDO.getShopId());
-                    categoryConfigDO = this.categoryConfigFeignClient.edit(categoryConfigDO, categoryConfigDO.getId()).getData();
-                } else {
-                    BeanUtil.copyProperties(categoryConfigVO, categoryConfigDO);
-                    categoryConfigDO.setCopyFrom(categoryConfigVO.getId());
-                    categoryConfigDO.setForPartId(shopDO.getShopId());
-                    categoryConfigDO.setId(null);
-                    categoryConfigDO = this.categoryConfigFeignClient.add(categoryConfigDO).getData();
-
-                }
-                List<NursingMarkOptionConfigDO> child = categoryConfigVO.getChild();
-                if (child != null && child.size() > 0) {
-                    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) {
-
-                            BeanUtil.copyProperties(nursingMarkOptionConfigDO, optionConfigDO);
-                            optionConfigDO.setCategoryId(categoryConfigDO.getId());
-                            optionConfigDO.setCopyFrom(nursingMarkOptionConfigDO.getId());
-                            optionConfigDO.setForPartId(shopDO.getShopId());
-                            optionConfigDO.setId(null);
-                            this.nursingMarkOptionConfigFeignClient.add(optionConfigDO);
-                        } else {
-                            BeanUtil.copyProperties(optionConfigDO1, optionConfigDO);
-                            BeanUtil.copyProperties(nursingMarkOptionConfigDO, optionConfigDO);
-                            optionConfigDO.setId(optionConfigDO1.getId());
-                            optionConfigDO.setCopyFrom(nursingMarkOptionConfigDO.getId());
-                            optionConfigDO.setCategoryId(categoryConfigDO.getId());
-                            optionConfigDO.setForPartId(shopDO.getShopId());
-                            this.nursingMarkOptionConfigFeignClient.edit(optionConfigDO, optionConfigDO.getId());
-                        }
-
-                    }
-                }
-            }
-        }
+        this.categoryConfigFeignClient.forceCopyDefaultToPart(shopDOS);
         //拷贝后应用
         this.applyNurseConfig(-1);
         return JsonResponse.successResponse();
@@ -185,117 +131,123 @@ public class NursingMarkCategoryService {
     public JsonResponse applyNurseConfig(Integer partId) {
 
         List<NursingMarkCategoryConfigVO> list = this.categoryConfigFeignClient.listAll().getData();
-        //所有床头屏医嘱分类
-        List<NurseConfigDO> nurseConfigDOS = this.nursingMarkFeignClient.listAllNursingMark().getData();
-        //所有床头屏医嘱分类的选项
-        List<NurseConfigOptionDO> nurseConfigOptionDOS = this.nursingMarkFeignClient.listAllNursingMarkOption().getData();
-        //要处理的科室列表
-        List<ShopDO> shops = new ArrayList<>();
-        if (partId.equals(-1)) {
-            shops.addAll(this.shopFeignClient.listShopByType(ShopTypeEnum.PART.value()).getData());
-        } else {
-            shops.add(this.shopFeignClient.getPartById(partId).getData());
-        }
-
-        if (list.size() > 0) {
-            //删除已经在配置中不存在的床头屏医嘱分类
-            String deleteOptionsSqlTpl = "delete from " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " where find_in_set(MD5(option_name),'%s')=0 and ncfg_id =%d";
-            List<String> clearOptionsSql = new ArrayList<>();
-
-            for (NursingMarkCategoryConfigVO screenAdviceCategoryVO : list) {
-                for (ShopDO shop : shops) {
-                    //删掉已存在的但是配置中没有的记录
-                    String categoryNamesMd5 = list.stream().filter(p -> p.getForPartId().equals(shop.getShopId())).map(p -> p.getNameMd5()).collect(Collectors.joining(","));
-                    if (screenAdviceCategoryVO.getForPartId().equals(shop.getShopId())) { //本科室的分类
-                        List<NurseConfigDO> partNurseConfigDOs = nurseConfigDOS.stream().filter(p -> p.getPartId().equals(shop.getShopId())).collect(Collectors.toList());
-                        List<NurseConfigOptionDO> partOptionDOS = nurseConfigOptionDOS.stream().filter(p -> p.getPartId().equals(shop.getShopId())).collect(Collectors.toList());
-                        //同步分类
-                        NurseConfigDO nurseConfigDO = this.syncPartScreenAdviceCategory(screenAdviceCategoryVO, shop, partNurseConfigDOs);
-                        List<NursingMarkOptionConfigDO> child = screenAdviceCategoryVO.getChild();
-                        if (!screenAdviceCategoryVO.getBoolAuto() && child != null && child.size() > 0) {
-                            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());
-                            clearOptionsSql.add(formatSql);
-                            for (NursingMarkOptionConfigDO settingDO : partScreenAdviceItemSettingDOs) {
-                                this.syncPartScreenAdviceItem(settingDO, nurseConfigDO, partOptionDOS);
-                            }
-                        }
-                    }
-                    //删除配置中没有的分类,及其选项
-                    String sqlNurseConfigClear = " delete config,op from " + NurseConfigDO.class.getAnnotation(Table.class).name() + " as config left join " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " as op on config.id=op.ncfg_id  where not find_in_set(MD5(config.config_name),'" + categoryNamesMd5 + "') and config.part_id =" + shop.getShopId();
-                    //反向删除找不到分类的项目,由于更新用户护理项时是删除重建,这里可以不删除用户护理项mapping记录
-                    String sqlNurseConfigOptionClear = "delete op from " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " as op left join " + NurseConfigDO.class.getAnnotation(Table.class).name() + " as config on config.id=op.ncfg_id where config.id is null ";
-                    clearOptionsSql.add(sqlNurseConfigClear);
-                    clearOptionsSql.add(sqlNurseConfigOptionClear);
-
-                }
-            }
-            //清理已经不在设置中的分类和选项
-            if (clearOptionsSql.size() > 0) {
-                this.nursingMarkFeignClient.batchUpdate(clearOptionsSql.toArray(new String[clearOptionsSql.size()]));
-            }
-
-        } else { //清空配置
-            List<String> clearConfigSqls = new ArrayList<>();
-            for (ShopDO shop : shops) {
-                String sql = "delete config,op from " + NurseConfigDO.class.getAnnotation(Table.class).name() + " as config left join " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " as op on config.id=op.ncfg_id where config.part_id =" + shop.getShopId();
-                clearConfigSqls.add(sql);
-            }
-            if (clearConfigSqls.size() > 0) {
-                this.nursingMarkFeignClient.batchUpdate(clearConfigSqls.toArray(new String[clearConfigSqls.size()]));
-            }
-        }
-        return JsonResponse.successResponse(list);
-    }
-
-    //应用指定科室的指定床头屏医嘱分类
-    private NurseConfigDO syncPartScreenAdviceCategory(NursingMarkCategoryConfigVO screenAdviceCategoryVO, ShopDO shop, List<NurseConfigDO> partNurseConfigDOs) {
-
-        NurseConfigDO nurseConfigDO = partNurseConfigDOs.stream().filter(p -> StringUtil.md5(p.getConfigName()).equalsIgnoreCase(screenAdviceCategoryVO.getNameMd5())).findFirst().orElse(null);
-        if (nurseConfigDO == null) {
-            nurseConfigDO = new NurseConfigDO();
-            nurseConfigDO.setPartId(shop.getShopId());
-            nurseConfigDO.setConfigName(screenAdviceCategoryVO.getCategoryName());
-            nurseConfigDO.setUnionId(ObjectId.next());
-            nurseConfigDO.setBoolCritical(screenAdviceCategoryVO.getCritical());
-            nurseConfigDO.setIndexNo(screenAdviceCategoryVO.getIndexNo());
-            nurseConfigDO.setDefaultColor(screenAdviceCategoryVO.getDefaultColor().replace("#", ""));
-            nurseConfigDO.setBoolManual(screenAdviceCategoryVO.getBoolManual());
-            nurseConfigDO= this.nursingMarkFeignClient.addNursingConfig(nurseConfigDO).getData();
-        } else {
-            nurseConfigDO.setBoolCritical(screenAdviceCategoryVO.getCritical());
-            nurseConfigDO.setIndexNo(screenAdviceCategoryVO.getIndexNo());
-            nurseConfigDO.setDefaultColor(screenAdviceCategoryVO.getDefaultColor().replace("#", ""));
-            nurseConfigDO.setSyncTime(DateUtil.getDateline());
-            nurseConfigDO.setBoolManual(screenAdviceCategoryVO.getBoolManual());
-            this.nursingMarkFeignClient.updateNursingConfig(nurseConfigDO, nurseConfigDO.getId());
-        }
-        return nurseConfigDO;
-    }
-
-
-    //同步应用床头屏医嘱分类选择项
-    private void syncPartScreenAdviceItem(NursingMarkOptionConfigDO settingDO, NurseConfigDO nurseConfigDO, List<NurseConfigOptionDO> partOptionDOS) {
-        //查询是否存在与设置对应的项目
-        NurseConfigOptionDO nurseConfigOptionDO = partOptionDOS.stream().filter(p -> !StringUtil.isEmpty(p.getOptionName()) &&
-                StringUtil.md5(p.getOptionName()).equalsIgnoreCase(settingDO.getItemNameMd5()) && p.getNcfgId().equals(nurseConfigDO.getId())).findFirst().orElse(null);
-        if (nurseConfigOptionDO == null) {
-            nurseConfigOptionDO = new NurseConfigOptionDO();
-            nurseConfigOptionDO.setCreateTime(DateUtil.getDateline());
-            nurseConfigOptionDO.setNcfgId(nurseConfigDO.getId());
-            nurseConfigOptionDO.setUnionId(ObjectId.next());
-            nurseConfigOptionDO.setOptionName(settingDO.getItemName());
-            nurseConfigOptionDO.setColorRgb(settingDO.getColor().replace("#", ""));
-            nurseConfigOptionDO.setPartId(nurseConfigDO.getPartId());
-            this.nursingMarkFeignClient.addNursingOptionConfig(nurseConfigOptionDO);
-        } else {
-            nurseConfigOptionDO.setUpdateTime(DateUtil.getDateline());
-            nurseConfigOptionDO.setOptionName(settingDO.getItemName());
-            nurseConfigOptionDO.setColorRgb(settingDO.getColor().replace("#", ""));
-            nurseConfigOptionDO.setPartId(nurseConfigDO.getPartId());
-            this.nursingMarkFeignClient.updateNursingOptionConfig(nurseConfigOptionDO, nurseConfigOptionDO.getId());
-        }
+//        //所有床头屏医嘱分类
+//        List<NurseConfigDO> nurseConfigDOS = this.nursingMarkFeignClient.listAllNursingMark().getData();
+//        //所有床头屏医嘱分类的选项
+//        List<NurseConfigOptionDO> nurseConfigOptionDOS = this.nursingMarkFeignClient.listAllNursingMarkOption().getData();
+
+         this.nursingMarkFeignClient.applyNursingMark(list,partId);
+
+//
+//
+//        //要处理的科室列表
+//        List<ShopDO> shops = new ArrayList<>();
+//        if (partId.equals(-1)) {
+//            shops.addAll(this.shopFeignClient.listShopByType(ShopTypeEnum.PART.value()).getData());
+//        } else {
+//            shops.add(this.shopFeignClient.getPartById(partId).getData());
+//        }
+//
+//        if (list.size() > 0) {
+//            //删除已经在配置中不存在的床头屏医嘱分类
+//            String deleteOptionsSqlTpl = "delete from " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " where find_in_set(MD5(option_name),'%s')=0 and ncfg_id =%d";
+//
+//
+//            for (NursingMarkCategoryConfigVO screenAdviceCategoryVO : list) {
+//                for (ShopDO shop : shops) {
+//                    List<String> clearOptionsSql = new ArrayList<>();
+//                    //删掉已存在的但是配置中没有的记录
+//                    String categoryNamesMd5 = list.stream().filter(p -> p.getForPartId().equals(shop.getShopId())).map(p -> p.getNameMd5()).collect(Collectors.joining(","));
+//                    if (screenAdviceCategoryVO.getForPartId().equals(shop.getShopId())) { //本科室的分类
+//                        List<NurseConfigDO> partNurseConfigDOs = nurseConfigDOS.stream().filter(p -> p.getPartId().equals(shop.getShopId())).collect(Collectors.toList());
+//                        List<NurseConfigOptionDO> partOptionDOS = nurseConfigOptionDOS.stream().filter(p -> p.getPartId().equals(shop.getShopId())).collect(Collectors.toList());
+//                        //同步分类
+//                        NurseConfigDO nurseConfigDO = this.syncPartScreenAdviceCategory(screenAdviceCategoryVO, shop, partNurseConfigDOs);
+//                        List<NursingMarkOptionConfigDO> child = screenAdviceCategoryVO.getChild();
+//                        if (!screenAdviceCategoryVO.getBoolAuto() && child != null && child.size() > 0) {
+//                            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());
+//                            clearOptionsSql.add(formatSql);
+//                            for (NursingMarkOptionConfigDO settingDO : partScreenAdviceItemSettingDOs) {
+//                                this.syncPartScreenAdviceItem(settingDO, nurseConfigDO, partOptionDOS);
+//                            }
+//                        }
+//                    }
+//                    //删除配置中没有的分类,及其选项
+//                    String sqlNurseConfigClear = " delete config,op from " + NurseConfigDO.class.getAnnotation(Table.class).name() + " as config left join " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " as op on config.id=op.ncfg_id  where not find_in_set(MD5(config.config_name),'" + categoryNamesMd5 + "') and config.part_id =" + shop.getShopId();
+//                    //反向删除找不到分类的项目,由于更新用户护理项时是删除重建,这里可以不删除用户护理项mapping记录
+//                    String sqlNurseConfigOptionClear = "delete op from " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " as op left join " + NurseConfigDO.class.getAnnotation(Table.class).name() + " as config on config.id=op.ncfg_id where config.id is null ";
+//                    clearOptionsSql.add(sqlNurseConfigClear);
+//                    clearOptionsSql.add(sqlNurseConfigOptionClear);
+//                    //清理已经不在设置中的分类和选项
+//                    if (clearOptionsSql.size() > 0) {
+//                        this.nursingMarkFeignClient.batchUpdate(clearOptionsSql.toArray(new String[clearOptionsSql.size()]));
+//                    }
+//                }
+//            }
+//
+//
+//        } else { //清空配置
+//            List<String> clearConfigSqls = new ArrayList<>();
+//            for (ShopDO shop : shops) {
+//                String sql = "delete config,op from " + NurseConfigDO.class.getAnnotation(Table.class).name() + " as config left join " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " as op on config.id=op.ncfg_id where config.part_id =" + shop.getShopId();
+//                clearConfigSqls.add(sql);
+//            }
+//            if (clearConfigSqls.size() > 0) {
+//                this.nursingMarkFeignClient.batchUpdate(clearConfigSqls.toArray(new String[clearConfigSqls.size()]));
+//            }
+//        }
+        return JsonResponse.successResponse();
     }
+//
+//    //应用指定科室的指定床头屏医嘱分类
+//    private NurseConfigDO syncPartScreenAdviceCategory(NursingMarkCategoryConfigVO screenAdviceCategoryVO, ShopDO shop, List<NurseConfigDO> partNurseConfigDOs) {
+//
+//        NurseConfigDO nurseConfigDO = partNurseConfigDOs.stream().filter(p -> StringUtil.md5(p.getConfigName()).equalsIgnoreCase(screenAdviceCategoryVO.getNameMd5())).findFirst().orElse(null);
+//        if (nurseConfigDO == null) {
+//            nurseConfigDO = new NurseConfigDO();
+//            nurseConfigDO.setPartId(shop.getShopId());
+//            nurseConfigDO.setConfigName(screenAdviceCategoryVO.getCategoryName());
+//            nurseConfigDO.setUnionId(ObjectId.next());
+//            nurseConfigDO.setBoolCritical(screenAdviceCategoryVO.getCritical());
+//            nurseConfigDO.setIndexNo(screenAdviceCategoryVO.getIndexNo());
+//            nurseConfigDO.setDefaultColor(screenAdviceCategoryVO.getDefaultColor().replace("#", ""));
+//            nurseConfigDO.setBoolManual(screenAdviceCategoryVO.getBoolManual());
+//            nurseConfigDO= this.nursingMarkFeignClient.addNursingConfig(nurseConfigDO).getData();
+//        } else {
+//            nurseConfigDO.setBoolCritical(screenAdviceCategoryVO.getCritical());
+//            nurseConfigDO.setIndexNo(screenAdviceCategoryVO.getIndexNo());
+//            nurseConfigDO.setDefaultColor(screenAdviceCategoryVO.getDefaultColor().replace("#", ""));
+//            nurseConfigDO.setSyncTime(DateUtil.getDateline());
+//            nurseConfigDO.setBoolManual(screenAdviceCategoryVO.getBoolManual());
+//            this.nursingMarkFeignClient.updateNursingConfig(nurseConfigDO, nurseConfigDO.getId());
+//        }
+//        return nurseConfigDO;
+//    }
+//
+//
+//    //同步应用床头屏医嘱分类选择项
+//    private void syncPartScreenAdviceItem(NursingMarkOptionConfigDO settingDO, NurseConfigDO nurseConfigDO, List<NurseConfigOptionDO> partOptionDOS) {
+//        //查询是否存在与设置对应的项目
+//        NurseConfigOptionDO nurseConfigOptionDO = partOptionDOS.stream().filter(p -> !StringUtil.isEmpty(p.getOptionName()) &&
+//                StringUtil.md5(p.getOptionName()).equalsIgnoreCase(settingDO.getItemNameMd5()) && p.getNcfgId().equals(nurseConfigDO.getId())).findFirst().orElse(null);
+//        if (nurseConfigOptionDO == null) {
+//            nurseConfigOptionDO = new NurseConfigOptionDO();
+//            nurseConfigOptionDO.setCreateTime(DateUtil.getDateline());
+//            nurseConfigOptionDO.setNcfgId(nurseConfigDO.getId());
+//            nurseConfigOptionDO.setUnionId(ObjectId.next());
+//            nurseConfigOptionDO.setOptionName(settingDO.getItemName());
+//            nurseConfigOptionDO.setColorRgb(settingDO.getColor().replace("#", ""));
+//            nurseConfigOptionDO.setPartId(nurseConfigDO.getPartId());
+//            this.nursingMarkFeignClient.addNursingOptionConfig(nurseConfigOptionDO);
+//        } else {
+//            nurseConfigOptionDO.setUpdateTime(DateUtil.getDateline());
+//            nurseConfigOptionDO.setOptionName(settingDO.getItemName());
+//            nurseConfigOptionDO.setColorRgb(settingDO.getColor().replace("#", ""));
+//            nurseConfigOptionDO.setPartId(nurseConfigDO.getPartId());
+//            this.nursingMarkFeignClient.updateNursingOptionConfig(nurseConfigOptionDO, nurseConfigOptionDO.getId());
+//        }
+//    }
 
 }

+ 8 - 7
ncs-entrace-service/src/main/java/com/wdklian/ncs/ms/entrace/service/PartTempBedService.java

@@ -93,7 +93,7 @@ public class PartTempBedService {
                 virtual_room.setType(FrameTypeEnum.ROOM.value());
                 virtual_room.setUnionId(ObjectId.next());
                 virtual_room.setSort(10000);
-                this.frameFeignClient.add(virtual_room);
+                virtual_room= this.frameFeignClient.add(virtual_room).getData();
             } else {
                 throw new ServiceException("科室空间错误!");
             }
@@ -251,13 +251,14 @@ public class PartTempBedService {
                     this.deviceFeignClient.delete(new Integer[]{deviceByEthMac.getId()});
                 }
             }
-
-            FrameDO roomFrame = this.frameFeignClient.getModel(bedFrame.getParentId()).getData();
-            if (!roomFrame.getName().equalsIgnoreCase("v-room")) {
-                throw new ServiceException("床位号[" + model.getBedNo() + "]已经是常用床位,无法删除该记录");
+            if (bedFrame.getParentId() != null) {
+                FrameDO roomFrame = this.frameFeignClient.getModel(bedFrame.getParentId()).getData();
+                if (!roomFrame.getName().equalsIgnoreCase("v-room")) {
+                    throw new ServiceException("床位号[" + model.getBedNo() + "]已经是常用床位,无法删除该记录");
+                }
+                //删除床位
+                this.frameFeignClient.delete(new Integer[]{bedFrame.getId()});
             }
-            //删除床位
-            this.frameFeignClient.delete(new Integer[]{bedFrame.getId()});
         }
         this.partTempBedFeignClient.delete(id);
     }

+ 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();
+    }
 }
 

+ 6 - 0
ncs-entrace-service/src/main/resources/bootstrap.yml

@@ -47,5 +47,11 @@ ribbon:
   MaxAutoRetries: 2
   MaxAutoRetriesNextServer: 3
   OkToRetryOnAllOperations: false
+feign:
+  client:
+    config:
+      patientFeignClient:
+        connectTimeout: 100000 # 连接超时时间(毫秒)
+        readTimeout: 100000
 
 

+ 2 - 0
ncs-message-center/README.md

@@ -0,0 +1,2 @@
+## 推送消息中心
+- 管理推送消息分类,消息内容,消息模板,推送策略等等

+ 109 - 0
ncs-message-center/pom.xml

@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ncs-ms</artifactId>
+        <groupId>com.wdklian</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ncs-message-center</artifactId>
+    <version>1.0.0</version>
+    <dependencies>
+        <dependency>
+            <groupId>com.wdklian</groupId>
+            <artifactId>third-party-common</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-alibaba-commons</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-test</artifactId>
+            <version>2.1.8.RELEASE</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>5.1.9.RELEASE</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.wdklian</groupId>
+            <artifactId>ncs-ms-feign</artifactId>
+            <version>1.0.0</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-loadbalancer</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+            <version>3.1.1</version>
+        </dependency>
+
+
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.7.10</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 108 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/ConfigSwagger2.java

@@ -0,0 +1,108 @@
+package com.wdklian.ncs.ms.message.center;
+
+
+import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties;
+import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
+import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
+import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
+import org.springframework.boot.actuate.endpoint.web.*;
+import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier;
+import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier;
+import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.util.StringUtils;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+@Configuration
+@EnableSwagger2
+public class ConfigSwagger2 implements WebMvcConfigurer {
+    /**
+     * 创建RESTFUL API文档内容
+     * @return
+     */
+    @Bean
+    public Docket createRestApi(){
+        return new Docket(DocumentationType.SWAGGER_2)
+                //此处参数为ApiInfo对象
+                //指定构建api文档的详细信息的方法
+                .apiInfo(apiInfo())
+                .select()
+                //指定构建api接口的包路径-指定具体包路径
+//                .apis(RequestHandlerSelectors.basePackage("com.provider.controller"))
+                //指定构建api接口的包路径-此处为所有包(未指定)
+                .apis(RequestHandlerSelectors.any())
+                //访问路径下面的接口
+//                .paths(PathSelectors.any())
+//                .paths(PathSelectors.ant("/libai/**"))
+//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+                //可根据url路径设置那些请求加入文档,忽略哪些请求
+                .paths(PathSelectors.any())
+                .build()
+                //分组管理可以与哪个访问路径结合使用
+//                .groupName("用户管理")
+                ;
+    }
+
+    /**
+     * 创建API界面的基本信息
+     * @return 返回一个构建好的ApiInfo对象
+     */
+    private ApiInfo apiInfo(){
+        return new ApiInfoBuilder()
+                //界面标题
+                .title("维鼎康联消息中心接口")
+                //接口描述
+                .description("后端消息中心接口文档展示")
+                //联系方式,联系人-网址-邮箱
+                .contact(new Contact("WDKL", "http://www.wdklian.com", "service@wdklian.com"))
+                //版本信息
+                .version("1.0.0")
+                //证书描述
+                .license("访问主页")
+                //以上全部,开始构建
+                .build();
+    }
+
+    @Bean
+    public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
+                                                                         ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier,
+                                                                         EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,
+                                                                         WebEndpointProperties webEndpointProperties, Environment environment) {
+        List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
+        Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
+        allEndpoints.addAll(webEndpoints);
+        allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
+        allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
+        String basePath = webEndpointProperties.getBasePath();
+        EndpointMapping endpointMapping = new EndpointMapping(basePath);
+        boolean shouldRegisterLinksMapping =
+                webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath)
+                        || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
+        return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes,
+                corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath),
+                shouldRegisterLinksMapping, null);
+    }
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
+        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+    }
+
+
+}

+ 22 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/MessageCenterApplication.java

@@ -0,0 +1,22 @@
+package com.wdklian.ncs.ms.message.center;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * @author wuyunfeng
+ * 2024-04-01 12:19
+ * ${description}
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+@ComponentScan("com.wdklian.ncs.ms")
+@ServletComponentScan
+public class MessageCenterApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(MessageCenterApplication.class,args);
+    }
+}

+ 93 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/config/DataSourceConfig.java

@@ -0,0 +1,93 @@
+package com.wdklian.ncs.ms.message.center.config;
+
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
+import com.wdklian.ncs.ms.framework.database.DaoSupport;
+import com.wdklian.ncs.ms.framework.database.impl.DaoSupportImpl;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import javax.sql.DataSource;
+
+
+@Configuration
+public class DataSourceConfig {
+
+    /*----------------------------------------------------------------------------*/
+    /*                           DaoSupport配置                                    */
+    /*----------------------------------------------------------------------------*/
+
+    /**
+     * 系统daoSupport
+     * @param jdbcTemplate 系统 jdbcTemplate
+     * @return
+     */
+    @Primary
+    @Bean(name = "messageCenterDaoSupport")
+    public DaoSupport systemDaoSupport(@Qualifier("messageCenterJdbcTemplate") JdbcTemplate jdbcTemplate) {
+        DaoSupport daosupport = new DaoSupportImpl(jdbcTemplate);
+        return daosupport;
+    }
+
+
+
+    /*----------------------------------------------------------------------------*/
+    /*                           JdbcTemplate 配置                                */
+    /*----------------------------------------------------------------------------*/
+
+
+    /**
+     * 系统jdbcTemplate
+     * @param dataSource 系统数据源
+     * @return
+     */
+    @Primary
+    @Bean(name = "messageCenterJdbcTemplate")
+    public JdbcTemplate systemJdbcTemplate(
+            @Qualifier("messageCenterDataSource") DataSource dataSource) {
+        return new JdbcTemplate(dataSource);
+    }
+
+
+    /*----------------------------------------------------------------------------*/
+    /*                           数据源配置                                        */
+    /*----------------------------------------------------------------------------*/
+
+    /**
+     * 系统数据源
+     * @return
+     */
+    @Primary
+    @Bean(name = "messageCenterDataSource")
+    @Qualifier("messageCenterDataSource")
+    @ConfigurationProperties(prefix="spring.datasource.message-center")
+    public DataSource systemDataSource() {
+        return DruidDataSourceBuilder.create().build();
+    }
+
+
+
+
+
+    /*----------------------------------------------------------------------------*/
+    /*                           事务配置                                         */
+    /*----------------------------------------------------------------------------*/
+
+
+    /**
+     * 系统事务
+     * @param dataSource
+     * @return
+     */
+    @Bean(name = "messageCenterTransactionManager")
+    public PlatformTransactionManager systemTransactionManager(@Qualifier("messageCenterDataSource")DataSource dataSource) {
+        return new DataSourceTransactionManager(dataSource);
+    }
+
+
+}

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

@@ -0,0 +1,99 @@
+package com.wdklian.ncs.ms.message.center.controller;
+
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessageSendRecordDO;
+import com.wdklian.ncs.ms.framework.database.Page;
+import com.wdklian.ncs.ms.framework.mvc.GridParameter;
+import com.wdklian.ncs.ms.framework.mvc.GridParameterParser;
+import com.wdklian.ncs.ms.message.center.service.iservice.MessageSendRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+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
+ * 2024-04-08 16:39
+ * ${description}
+ */
+@RestController
+@Slf4j
+@Api(description = "消息发送记录管理API", tags = "消息发送记录管理API")
+@RequestMapping("/message-send-record")
+@Validated
+public class MessageSendRecordController {
+
+
+    @Autowired
+    private MessageSendRecordService messageSendRecordService;
+
+    @ApiOperation(value = "分页查询消息发送记录", response = MessageSendRecordDO.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page_no", value = "页码", required = true, dataType = "int", paramType = "query"),
+            @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,
+                     HttpServletRequest request) {
+        GridParameter gp = GridParameterParser.parse(MessageSendRecordDO.class, request.getParameterMap());
+
+        return this.messageSendRecordService.list(gp);
+    }
+
+
+    @ApiOperation(value = "添加消息发送记录", response = MessageSendRecordDO.class)
+    @PostMapping
+    public MessageSendRecordDO add(@Valid MessageSendRecordDO messageSendRecordDO) {
+        this.messageSendRecordService.add(messageSendRecordDO);
+        return messageSendRecordDO;
+    }
+
+    @PutMapping(value = "/{id}")
+    @ApiOperation(value = "修改消息类型", response = MessageSendRecordDO.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "int", paramType = "path")})
+    public MessageSendRecordDO edit(@Valid MessageSendRecordDO messageSendRecordDO, @PathVariable Integer id) {
+        this.messageSendRecordService.edit(messageSendRecordDO, id);
+        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({
+            @ApiImplicitParam(name = "ids", value = "要删除的消息类型主键列表", required = true, dataType = "int", paramType = "path", allowMultiple = true)})
+    public String delete(@PathVariable Integer[] ids) {
+        this.messageSendRecordService.delete(ids);
+        return "";
+    }
+
+
+}

+ 77 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessageSendStrategyController.java

@@ -0,0 +1,77 @@
+package com.wdklian.ncs.ms.message.center.controller;
+
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessageSendStrategyDO;
+import com.wdklian.ncs.ms.framework.database.Page;
+import com.wdklian.ncs.ms.framework.mvc.GridParameter;
+import com.wdklian.ncs.ms.framework.mvc.GridParameterParser;
+import com.wdklian.ncs.ms.message.center.service.iservice.MessageSendStrategyService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wuyunfeng
+ * 2024-04-08 16:56
+ * ${description}
+ */
+@RestController
+@Slf4j
+@Api(description = "消息发送策略管理API", tags = "消息发送策略管理API")
+@RequestMapping("/message-send-strategy")
+@Validated
+public class MessageSendStrategyController {
+
+    @Autowired
+    private MessageSendStrategyService messageSendStrategyService;
+
+    @ApiOperation(value = "分页查询消息发送策略", response = MessageSendStrategyDO.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page_no", value = "页码", required = true, dataType = "int", paramType = "query"),
+            @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,
+                     HttpServletRequest request) {
+        GridParameter gp = GridParameterParser.parse(MessageSendStrategyDO.class, request.getParameterMap());
+
+        return this.messageSendStrategyService.list(gp);
+    }
+
+
+    @ApiOperation(value = "添加消息发送策略", response = MessageSendStrategyDO.class)
+    @PostMapping
+    public MessageSendStrategyDO add(@Valid MessageSendStrategyDO messageSendStrategyDO) {
+        this.messageSendStrategyService.add(messageSendStrategyDO);
+        return messageSendStrategyDO;
+    }
+
+    @PutMapping(value = "/{id}")
+    @ApiOperation(value = "修改消息发送策略", response = MessageSendStrategyDO.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "int", paramType = "path")})
+    public MessageSendStrategyDO edit(@Valid MessageSendStrategyDO messageSendStrategyDO, @PathVariable Integer id) {
+        this.messageSendStrategyService.edit(messageSendStrategyDO, id);
+        return messageSendStrategyDO;
+    }
+
+    @DeleteMapping(value = "/{ids}")
+    @ApiOperation(value = "删除消息发送策略")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "ids", value = "要删除的消息类型主键列表", required = true, dataType = "int", paramType = "path", allowMultiple = true)})
+    public String delete(@PathVariable Integer[] ids) {
+        this.messageSendStrategyService.delete(ids);
+        return "";
+    }
+
+}

+ 96 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/MessageTypeController.java

@@ -0,0 +1,96 @@
+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;
+import com.wdklian.ncs.ms.message.center.service.iservice.MessageTypeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+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
+ * 2024-04-08 14:42
+ * ${description}
+ */
+@RestController
+@Slf4j
+@Api(description = "消息分类管理API", tags = "消息分类管理API")
+@RequestMapping("/message-type")
+@Validated
+public class MessageTypeController {
+
+    @Autowired
+    private MessageTypeService messageTypeService;
+
+    @ApiOperation(value = "分页查询消息类型", response = MessageTypeDO.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page_no", value = "页码", required = true, dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "page_size", value = "每页显示数量", required = true, dataType = "int", paramType = "query")
+    })
+    @PostMapping("/page")
+    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());
+
+        return this.messageTypeService.list(gp);
+    }
+
+
+    @ApiOperation(value = "添加消息类型", response = MessageTypeDO.class)
+    @PostMapping
+    public MessageTypeDO add(@Valid MessageTypeDO messageTypeDO) {
+        this.messageTypeService.add(messageTypeDO);
+        return messageTypeDO;
+    }
+
+    @PutMapping(value = "/{id}")
+    @ApiOperation(value = "修改消息类型", response = MessageTypeDO.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "int", paramType = "path")})
+    public MessageTypeDO edit(@Valid MessageTypeDO messageTypeDO, @PathVariable Integer id) {
+        this.messageTypeService.edit(messageTypeDO, id);
+        return messageTypeDO;
+    }
+
+    @DeleteMapping(value = "/{ids}")
+    @ApiOperation(value = "删除消息类型")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "ids", value = "要删除的消息类型主键列表", required = true, dataType = "int", paramType = "path", allowMultiple = true)})
+    public String delete(@PathVariable Integer[] ids) {
+        this.messageTypeService.delete(ids);
+        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();
+    }
+
+
+
+
+}

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

@@ -0,0 +1,96 @@
+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;
+import com.wdklian.ncs.ms.message.center.service.iservice.MessagesService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+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
+ * 2024-04-08 16:22
+ * ${description}
+ */
+@RestController
+@Slf4j
+@Api(description = "消息管理API", tags = "消息管理API")
+@RequestMapping("/messages")
+@Validated
+public class MessagesController {
+
+
+    @Autowired
+    private MessagesService messagesService;
+
+    @ApiOperation(value = "分页查询消息", response = MessagesDO.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page_no", value = "页码", required = true, dataType = "int", paramType = "query"),
+            @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,
+                     HttpServletRequest request) {
+        GridParameter gp = GridParameterParser.parse(MessagesDO.class, request.getParameterMap());
+
+        return this.messagesService.list(gp);
+    }
+
+
+    @ApiOperation(value = "添加消息", response = MessagesDO.class)
+    @PostMapping
+    public MessagesDO add(@Valid MessagesDO messagesDO) {
+        this.messagesService.add(messagesDO);
+        return messagesDO;
+    }
+
+    @PutMapping(value = "/{id}")
+    @ApiOperation(value = "修改消息", response = MessagesDO.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "int", paramType = "path")})
+    public MessagesDO edit(@Valid MessagesDO messagesDO, @PathVariable Integer id) {
+        this.messagesService.edit(messagesDO, id);
+        return messagesDO;
+    }
+
+    @DeleteMapping(value = "/{ids}")
+    @ApiOperation(value = "删除消息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "ids", value = "要删除的消息类型主键列表", required = true, dataType = "int", paramType = "path", allowMultiple = true)})
+    public String delete(@PathVariable Integer[] ids) {
+        this.messagesService.delete(ids);
+        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);
+    }
+
+
+}

+ 92 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/TemplateMessageParamerController.java

@@ -0,0 +1,92 @@
+package com.wdklian.ncs.ms.message.center.controller;
+
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.TemplateMessageParamerDO;
+import com.wdklian.ncs.ms.framework.database.Page;
+import com.wdklian.ncs.ms.framework.mvc.GridParameter;
+import com.wdklian.ncs.ms.framework.mvc.GridParameterParser;
+import com.wdklian.ncs.ms.message.center.service.iservice.TemplateMessageParamerService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+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
+ * 2024-04-08 17:21
+ * ${description}
+ */
+@RestController
+@Slf4j
+@Api(description = "模版消息参数管理API", tags = "模版消息参数管理API")
+@RequestMapping("/template-message-paramer")
+@Validated
+public class TemplateMessageParamerController {
+
+    @Autowired
+    private TemplateMessageParamerService templateMessageParamerService;
+
+    @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")
+    })
+    @PostMapping("/page")
+    public Page list(@ApiIgnore @NotNull(message = "页码不能为空") Integer pageNo,
+                     @ApiIgnore @NotNull(message = "页容量") Integer pageSize,
+                     HttpServletRequest request) {
+        GridParameter gp = GridParameterParser.parse(TemplateMessageParamerDO.class, request.getParameterMap());
+
+        return this.templateMessageParamerService.list(gp);
+    }
+
+
+    @ApiOperation(value = "添加模版消息参数", response = TemplateMessageParamerDO.class)
+    @PostMapping
+    public TemplateMessageParamerDO add(@Valid TemplateMessageParamerDO templateMessageParamerDO) {
+        this.templateMessageParamerService.add(templateMessageParamerDO);
+        return templateMessageParamerDO;
+    }
+
+    @PutMapping(value = "/{id}")
+    @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) {
+        this.templateMessageParamerService.edit(templateMessageParamerDO, id);
+        return templateMessageParamerDO;
+    }
+
+    @DeleteMapping(value = "/{ids}")
+    @ApiOperation(value = "删除模版消息参数")
+    @ApiImplicitParams({
+            @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();
+    }
+
+}

+ 92 - 0
ncs-message-center/src/main/java/com/wdklian/ncs/ms/message/center/controller/TemplateMessageTplController.java

@@ -0,0 +1,92 @@
+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;
+import com.wdklian.ncs.ms.message.center.service.iservice.TemplateMessageTplService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+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
+ * 2024-04-08 17:09
+ * ${description}
+ */
+@RestController
+@Slf4j
+@Api(description = "模板消息管理API", tags = "模板消息管理API")
+@RequestMapping("/template-message-tpl")
+@Validated
+public class TemplateMessageTplController {
+
+
+    @Autowired
+    private TemplateMessageTplService templateMessageTplService;
+
+    @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")
+    })
+    @PostMapping("/page")
+    public Page list(@ApiIgnore @NotNull(message = "页码不能为空") Integer pageNo,
+                     @ApiIgnore @NotNull(message = "页容量") Integer pageSize,
+                     HttpServletRequest request) {
+        GridParameter gp = GridParameterParser.parse(TemplateMessageTplDO.class, request.getParameterMap());
+
+        return this.templateMessageTplService.list(gp);
+    }
+
+
+    @ApiOperation(value = "添加模板消息", response = TemplateMessageTplDO.class)
+    @PostMapping
+    public TemplateMessageTplDO add(@Valid TemplateMessageTplDO templateMessageTplDO) {
+        this.templateMessageTplService.add(templateMessageTplDO);
+        return templateMessageTplDO;
+    }
+
+    @PutMapping(value = "/{id}")
+    @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) {
+        this.templateMessageTplService.edit(templateMessageTplDO, id);
+        return templateMessageTplDO;
+    }
+
+    @DeleteMapping(value = "/{ids}")
+    @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);
+    }
+}

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

@@ -0,0 +1,24 @@
+package com.wdklian.ncs.ms.message.center.service.impl;
+
+import com.wdklian.ncs.ms.framework.database.DaoSupport;
+import com.wdklian.ncs.ms.framework.database.impl.AbstractCRUDBaseManagerImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+public class MessageCenterCRUDServiceImpl<T> extends AbstractCRUDBaseManagerImpl<T> {
+
+    @Override
+    @Autowired
+    public void setDaoSupport(@Qualifier("messageCenterDaoSupport") DaoSupport daoSupport) {
+     this.daoSupport=daoSupport;
+    }
+
+
+    @Override
+    @Transactional(value = "messageCenterTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public void delete(Integer[] ids) {
+        super.delete(ids);
+    }
+}

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

@@ -0,0 +1,34 @@
+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
+ * ${description}
+ */
+@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);
+    }
+}

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

@@ -0,0 +1,16 @@
+package com.wdklian.ncs.ms.message.center.service.impl;
+
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessageSendStrategyDO;
+import com.wdklian.ncs.ms.message.center.service.iservice.MessageSendStrategyService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author wuyunfeng
+ * 2024-04-08 17:06
+ * ${description}
+ */
+@Slf4j
+@Service
+public class MessageSendStrategyServiceImpl extends MessageCenterCRUDServiceImpl<MessageSendStrategyDO> implements MessageSendStrategyService {
+}

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

@@ -0,0 +1,55 @@
+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
+ * ${description}
+ */
+@Service
+@Slf4j
+public class MessageTypeServiceImpl extends MessageCenterCRUDServiceImpl<MessageTypeDO> implements MessageTypeService {
+
+    @Resource
+    MessagesService messagesService;
+    @Override
+    public MessageTypeDO add(MessageTypeDO messageTypeDO) {
+        if(messageTypeDO.getCreateTime()==null){
+            messageTypeDO.setCreateTime(DateUtil.getDateline());
+        }
+        return super.add(messageTypeDO);
+    }
+
+    @Override
+    public MessageTypeDO edit(MessageTypeDO messageTypeDO, Integer id) {
+        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);
+    }
+}

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

@@ -0,0 +1,66 @@
+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
+ * ${description}
+ */
+@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);
+    }
+}

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

@@ -0,0 +1,42 @@
+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
+ * ${description}
+ */
+@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);
+    }
+}

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

@@ -0,0 +1,119 @@
+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
+ * ${description}
+ */
+@Slf4j
+@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);
+    }
+}

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

@@ -0,0 +1,15 @@
+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);
+}

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

@@ -0,0 +1,12 @@
+package com.wdklian.ncs.ms.message.center.service.iservice;
+
+import com.wdklian.ncs.ms.common.entity.msgcenter.dos.MessageSendStrategyDO;
+import com.wdklian.ncs.ms.framework.database.CRUDBaseManager;
+
+/**
+ * @author wuyunfeng
+ * 2024-04-08 17:06
+ * ${description}
+ */
+public interface MessageSendStrategyService extends CRUDBaseManager<MessageSendStrategyDO> {
+}

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

@@ -0,0 +1,19 @@
+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
+ * ${description}
+ */
+public interface MessageTypeService extends CRUDBaseManager<MessageTypeDO> {
+
+    @Override
+    void delete(Integer[] ids);
+
+    List<MessageTypeDO> getAll();
+}

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

@@ -0,0 +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);
+
+}

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

@@ -0,0 +1,16 @@
+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
+ * 2024-04-08 17:28
+ * ${description}
+ */
+public interface TemplateMessageParamerService extends CRUDBaseManager<TemplateMessageParamerDO> {
+    List<TemplateMessageParamerDO> listAll();
+}

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

@@ -0,0 +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);
+}

+ 58 - 0
ncs-message-center/src/main/resources/bootstrap.yml

@@ -0,0 +1,58 @@
+spring:
+  mvc:
+    pathmatch:
+      matching-strategy: ant_path_matcher
+  main:
+    allow-bean-definition-overriding: true
+    allow-circular-references: true
+  cloud:
+    loadbalancer:
+      cache:
+        enabled: true
+      enabled: true
+    nacos:
+      config:
+        server-addr: 192.168.1.198:8848
+        file-extension: yaml
+        username: nacos
+        password: nacos
+        context-path: /nacos
+        shared-configs:
+          - application-common.yaml #公共配置
+      discovery:
+        server-addr: 192.168.1.198:8848
+        username: nacos
+        password: nacos
+        namespace: public
+  config:
+    import: nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}?refresh=true
+  application:
+    name: message-center
+  profiles:
+    active: dev
+server:
+  port: 8033
+
+
+#logging:
+#  config: classpath:logback-wn.xml
+#  level:
+#    com.wdklian.ncs.ms.feignclient.*: debug #开启open-feign调用日志
+#ribbon:
+#  MaxAutoRetries: 2
+#  MaxAutoRetriesNextServer: 3
+#  OkToRetryOnAllOperations: false
+
+
+#graylog:
+#  host: 192.168.1.198
+#  port: 12201
+#
+#feign:
+#  client:
+#    config:
+#      default:
+#        retryer: com.wdklian.ncs.ms.retryer.MyRetryer #超时重试配置
+#        ConnectTimeOut: 10000  #open-feign连接超时时长
+#        ReadTimeOut: 10000 #open-feign读超时时长
+#        loggerLevel: FULL #必须设置为FULL才会打印open-fegin请求日志

+ 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);
 }

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

@@ -25,13 +25,13 @@ 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-list-no-back")
     CommonResult syncDoctorAdviceNoBack(@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

@@ -2,6 +2,7 @@ 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;
@@ -24,22 +25,25 @@ 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-list-no-back")
     CommonResult syncPatientNoBack(@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);

+ 8 - 0
ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/open/NursingMarkCategoryConfigFeignClient.java

@@ -3,6 +3,7 @@ package com.wdklian.ncs.ms.feignclient.open;
 import com.wdklian.ncs.ms.common.entity.open.dos.NursingMarkCategoryConfigDO;
 import com.wdklian.ncs.ms.common.entity.open.vos.NurseCascaderVO;
 import com.wdklian.ncs.ms.common.entity.open.vos.NursingMarkCategoryConfigVO;
+import com.wdklian.ncs.ms.common.entity.system.dos.ShopDO;
 import com.wdklian.ncs.ms.framework.mvc.CommonResult;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.EnableFeignClients;
@@ -46,4 +47,11 @@ public interface NursingMarkCategoryConfigFeignClient {
 
     @GetMapping(value = "/auto-match-category/{part_id}")
     CommonResult<List<NursingMarkCategoryConfigDO>> autoChildrenCategory(@PathVariable("part_id") Integer partId);
+
+    @GetMapping(value = "/delete-not-default")
+    CommonResult<Boolean> deleteNotDefault();
+
+    @PostMapping("/force-copy-default")
+    CommonResult<Boolean> forceCopyDefaultToPart(@RequestBody List<ShopDO> shopDOS);
+
 }

+ 8 - 1
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;
@@ -28,7 +29,7 @@ public interface CustomerFeignClient {
     CommonResult<List<CustomerDO>> syncPatient(@NotEmpty(message = "患者数据不能为空") @RequestBody List<PatientDO> patients);
 
     @PostMapping("/sync-single")
-   CommonResult<List<CustomerDO>> syncSinglePatient(@RequestBody @NotNull(message = "患者数据不能为null") PatientDO patient);
+    CommonResult<List<CustomerDO>> syncSinglePatient(@RequestBody @NotNull(message = "患者数据不能为null") PatientDO patient);
 
     @PostMapping("/patient-out")
     CommonResult<List<CustomerDO>> patientOut(@RequestBody @NotNull(message = "患者信息不能为空") PatientDO patientDO);
@@ -38,4 +39,10 @@ public interface CustomerFeignClient {
 
     @GetMapping("/sync-all")
     CommonResult syncAllPatient();
+
+    @GetMapping("/sync-single/{key}")
+    CommonResult syncSinglePatientByKey(@NotEmpty(message = "患者主键不能为空") @PathVariable("key") String key);
+
+    @GetMapping("/sync-tp-all")
+    CommonResult syncTPAllPatient();
 }

+ 7 - 0
ncs-ms-feign/src/main/java/com/wdklian/ncs/ms/feignclient/system/NursingMarkFeignClient.java

@@ -1,5 +1,6 @@
 package com.wdklian.ncs.ms.feignclient.system;
 
+import com.wdklian.ncs.ms.common.entity.open.vos.NursingMarkCategoryConfigVO;
 import com.wdklian.ncs.ms.common.entity.system.dos.CustomerDO;
 import com.wdklian.ncs.ms.common.entity.system.dos.NurseConfigDO;
 import com.wdklian.ncs.ms.common.entity.system.dos.NurseConfigOptionDO;
@@ -60,4 +61,10 @@ public interface NursingMarkFeignClient {
     CommonResult<NurseConfigDO> updateNursingConfig(@RequestBody NurseConfigDO nurseConfigDO, @PathVariable("id") Integer id);
 
 
+    @PostMapping("/apply-nursing-mark/{partid}")
+    CommonResult<Boolean> applyNursingMark(@RequestBody List<NursingMarkCategoryConfigVO> nursingMarkCategoryConfigVOS, @PathVariable("partid") Integer partId);
+
+
+
+
 }

+ 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);

+ 25 - 5
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/controller/NursingMarkCategoryConfigController.java

@@ -4,6 +4,7 @@ import com.wdklian.ncs.ms.common.entity.open.dos.NursingMarkCategoryConfigDO;
 import com.wdklian.ncs.ms.common.entity.open.vos.NurseCascaderVO;
 import com.wdklian.ncs.ms.common.entity.open.vos.NursingMarkCategoryConfigVO;
 import com.wdklian.ncs.ms.common.entity.system.dos.NurseConfigDisplayDO;
+import com.wdklian.ncs.ms.common.entity.system.dos.ShopDO;
 import com.wdklian.ncs.ms.framework.mvc.CommonResult;
 import com.wdklian.ncs.ms.open.service.iservice.NursingMarkCategoryConfigService;
 import io.swagger.annotations.Api;
@@ -120,6 +121,19 @@ public class NursingMarkCategoryConfigController {
     }
 
 
+    @ApiOperation(value = "删除非默认设置的分类及项目")
+    @GetMapping(value = "/delete-not-default")
+    public CommonResult<Boolean> deleteNotDefault() {
+
+       boolean result = this.nurseCategoryConfigService.deleteNotDefault();
+        if (result) {
+            return CommonResult.success(true);
+        } else {
+            return CommonResult.failed("操作失败!");
+        }
+    }
+
+
     //    @ApiOperation(value = "拷贝默认分类到科室", response = NurseCascaderVO.class, responseContainer = "List")
 //    @PostMapping(value = "/copy-default/{part_id}")
 //    @ApiImplicitParams({
@@ -136,11 +150,17 @@ public class NursingMarkCategoryConfigController {
 //        return this.nurseCategoryConfigService.copyDefaultToPart(categoryIds,partId,true);
 //    }
 //
-//    @ApiOperation(value = "强制拷贝默认分类到科室", response = NurseCascaderVO.class, responseContainer = "List")
-//    @PostMapping(value = "/foce-copy-default")
-//    public JsonResponse forceCopyDefaultToPart() {
-//        return this.nurseCategoryConfigService.foceCopyDefaultToPart();
-//    }
+    @ApiOperation(value = "强制拷贝默认分类到科室")
+    @PostMapping(value = "/force-copy-default")
+    public CommonResult<Boolean> forceCopyDefaultToPart(@RequestBody List<ShopDO> shopDOS) {
+        boolean result = this.nurseCategoryConfigService.forceCopyDefaultToPart(shopDOS);
+        if (result) {
+            return CommonResult.success(true);
+        } else {
+            return CommonResult.failed("操作失败!");
+        }
+
+    }
 //
 //
 //

+ 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;
     }
 }

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

@@ -12,11 +12,14 @@ import com.wdklian.ncs.ms.common.entity.system.dos.ShopDO;
 import com.wdklian.ncs.ms.common.utils.MatchConditionAnalysis;
 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.open.common.ShopHelper;
 import com.wdklian.ncs.ms.open.service.iservice.NursingMarkCategoryConfigService;
 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 javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
@@ -60,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
@@ -133,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());
@@ -278,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";
@@ -352,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) {
@@ -405,32 +408,30 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
 //        }
 //        return this.listAutoChildrenCategory(partId);
 //    }
-//todo 解藕模块 此方法应由上层服务调用
+// todo 解藕模块 此方法应由上层服务调用
 //    @Override
 //    @Transactional(value = "translateConfigTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
 //    public List copyDefaultToPart(Integer[] categoryIds, Integer partId) {
 //        return this.copyDefaultToPart(categoryIds, partId, false);
 //    }
 
-    //todo 解藕模块 此方法应由上层服务调用
-//    @Override
-//    @Transactional(value = "translateConfigTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-//    public JsonResponse foceCopyDefaultToPart() {
-//        List<NursingMarkCategoryConfigVO> categoryConfigVOS = this.listPartCategory(-1);
-//        List<ShopDO> shopDOS = shopService.listShopByType(ShopTypeEnum.PART);
-//
-//        for (ShopDO shopDO : shopDOS) {
-//            NursingMarkCategoryConfigDO categoryConfigDO = new NursingMarkCategoryConfigDO();
-//            NursingMarkOptionConfigDO optionConfigDO = new NursingMarkOptionConfigDO();
-//            List<NursingMarkCategoryConfigVO> partCategory = this.listPartCategory(shopDO.getShopId());
-//            for (NursingMarkCategoryConfigVO categoryConfigVO : categoryConfigVOS) {
+
+    @Override
+    @Transactional(value = "openPlateformTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public boolean forceCopyDefaultToPart(List<ShopDO> shopDOS) {
+        List<NursingMarkCategoryConfigVO> categoryConfigVOS = this.listPartCategory(-1);
+        this.deleteNotDefault();
+        for (ShopDO shopDO : shopDOS) {
+            NursingMarkCategoryConfigDO categoryConfigDO = new NursingMarkCategoryConfigDO();
+            NursingMarkOptionConfigDO optionConfigDO = new NursingMarkOptionConfigDO();
+            for (NursingMarkCategoryConfigVO categoryConfigVO : categoryConfigVOS) {
 //                NursingMarkCategoryConfigVO sameNameCategory = partCategory.stream().filter(p -> StrUtil.isNotEmpty(p.getNameMd5()) && p.getNameMd5().equalsIgnoreCase(categoryConfigVO.getNameMd5())).findFirst().orElse(null);
 //                if (sameNameCategory != null && !categoryConfigVO.getId().equals(sameNameCategory.getCopyFrom())) { //存在同名分类,但不是从categoryConfigVO拷贝而来,删除这个项目及其子项
 //                    this.deleteById(sameNameCategory.getId());
 //                    partCategory.remove(sameNameCategory);
 //                }
 //                NursingMarkCategoryConfigVO copyFrom = partCategory.stream().filter(p -> p.getCopyFrom() != null && p.getCopyFrom().equals(categoryConfigVO.getId()) && p.getForPartId() != null && p.getForPartId().equals(shopDO.getShopId())).findFirst().orElse(null);
-//                List<NursingMarkOptionConfigDO> copyChild = new ArrayList<>();
+                List<NursingMarkOptionConfigDO> copyChild = new ArrayList<>();
 //                if (copyFrom != null) {
 //                    copyChild = copyFrom.getChild();
 //                    BeanUtil.copyProperties(copyFrom, categoryConfigDO);
@@ -440,25 +441,25 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
 //                    categoryConfigDO.setForPartId(shopDO.getShopId());
 //                    categoryConfigDO = this.edit(categoryConfigDO, categoryConfigDO.getId());
 //                } else {
-//                    BeanUtil.copyProperties(categoryConfigVO, categoryConfigDO);
-//                    categoryConfigDO.setCopyFrom(categoryConfigVO.getId());
-//                    categoryConfigDO.setForPartId(shopDO.getShopId());
-//                    categoryConfigDO.setId(null);
-//                    categoryConfigDO = this.add(categoryConfigDO);
-//
+                    BeanUtil.copyProperties(categoryConfigVO, categoryConfigDO);
+                    categoryConfigDO.setCopyFrom(categoryConfigVO.getId());
+                    categoryConfigDO.setForPartId(shopDO.getShopId());
+                    categoryConfigDO.setId(null);
+                    categoryConfigDO = this.add(categoryConfigDO);
+
 //                }
-//                List<NursingMarkOptionConfigDO> child = categoryConfigVO.getChild();
-//                if (child != null && child.size() > 0) {
-//                    for (NursingMarkOptionConfigDO nursingMarkOptionConfigDO : child) {
+                List<NursingMarkOptionConfigDO> child = categoryConfigVO.getChild();
+                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) {
-//
-//                            BeanUtil.copyProperties(nursingMarkOptionConfigDO, optionConfigDO);
-//                            optionConfigDO.setCategoryId(categoryConfigDO.getId());
-//                            optionConfigDO.setCopyFrom(nursingMarkOptionConfigDO.getId());
-//                            optionConfigDO.setForPartId(shopDO.getShopId());
-//                            optionConfigDO.setId(null);
-//                            this.daoSupport.insert(optionConfigDO);
+
+                            BeanUtil.copyProperties(nursingMarkOptionConfigDO, optionConfigDO);
+                            optionConfigDO.setCategoryId(categoryConfigDO.getId());
+                            optionConfigDO.setCopyFrom(nursingMarkOptionConfigDO.getId());
+                            optionConfigDO.setForPartId(shopDO.getShopId());
+                            optionConfigDO.setId(null);
+                            this.daoSupport.insert(optionConfigDO);
 //                        } else {
 //                            BeanUtil.copyProperties(optionConfigDO1, optionConfigDO);
 //                            BeanUtil.copyProperties(nursingMarkOptionConfigDO, optionConfigDO);
@@ -468,14 +469,14 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
 //                            optionConfigDO.setForPartId(shopDO.getShopId());
 //                            this.daoSupport.update(optionConfigDO, optionConfigDO.getId());
 //                        }
-//
-//                    }
-//                }
-//            }
-//        }
-//
-//        return JsonResponse.successResponse();
-//    }
+
+                    }
+                }
+            }
+        }
+
+        return true;
+    }
 
     @Override
     public NursingMarkCategoryConfigDO getPartNursingMarkCategoryByNameMd5(String categoryName, Integer forPartId) {
@@ -575,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 ");
                                 }
 
                             }
@@ -584,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 ");
                                 }
 
                             }
@@ -608,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 {
@@ -639,4 +640,11 @@ public class NursingMarkCategoryConfigServiceImpl extends OpenPlateformCRUDServi
         }
     }
 
+
+    @Override
+    public boolean deleteNotDefault() {
+
+        String sql = "delete  c, o from "+NursingMarkCategoryConfigDO.class.getAnnotation(Table.class).name()+" c left join "+NursingMarkOptionConfigDO.class.getAnnotation(Table.class).name()+" o on c.id=o.category_id where c.for_part_id<>-1";
+        return this.daoSupport.execute(sql)>0;
+    }
 }

+ 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");

+ 10 - 1
ncs-open-service/src/main/java/com/wdklian/ncs/ms/open/service/iservice/NursingMarkCategoryConfigService.java

@@ -97,7 +97,16 @@ public interface NursingMarkCategoryConfigService extends CRUDBaseManager<Nursin
 //
 //    List copyDefaultToPart(Integer[] categoryIds, Integer partId);
 
-//    JsonResponse foceCopyDefaultToPart();
+    boolean forceCopyDefaultToPart(List<ShopDO> shopDOS);
 
     NursingMarkCategoryConfigDO getPartNursingMarkCategoryByNameMd5(String categoryName, Integer forPartId);
+    /**
+     * 删除非默认设置的护理标识分类及项目设置
+     *
+     * @date 2024-04-10 12:15
+     * @author wuyunfeng
+     * @param
+     * @return {@link boolean}
+     */
+    boolean deleteNotDefault();
 }

+ 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()));
 
                         }
                     }

+ 9 - 1
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/controller/NursingMarkController.java

@@ -1,5 +1,6 @@
 package com.wdklian.ncs.ms.system.controller;
 
+import com.wdklian.ncs.ms.common.entity.open.vos.NursingMarkCategoryConfigVO;
 import com.wdklian.ncs.ms.common.entity.system.dos.CustomerDO;
 import com.wdklian.ncs.ms.common.entity.system.dos.NurseConfigDO;
 import com.wdklian.ncs.ms.common.entity.system.dos.NurseConfigOptionDO;
@@ -52,7 +53,7 @@ public class NursingMarkController {
     @PostMapping("/renew-by-his-part-keys")
     @ApiOperation(value = "更新指定科室中患者的护理信息", response = CustomerDO.class, responseContainer = "list")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "ids", value = "科室主键列表", required = true, dataType = "JSONObject", paramType = "body")
+            @ApiImplicitParam(name = "keys", value = "科室主键列表", required = true, dataType = "JSONObject", paramType = "body")
     })
     public CommonResult<List<CustomerDO>> renewDepartNursingByHisPartKeys(@NotEmpty(message = "科室主键列表不能为空") @RequestBody List<String> keys) {
         List<CustomerDO> customers = nurseConfigService.renewDePartments(keys);
@@ -134,4 +135,11 @@ public class NursingMarkController {
         return CommonResult.success(nurseConfigService.edit(nurseConfigDO, id));
     }
 
+
+    @PostMapping("/apply-nursing-mark/{partid}")
+    @ApiOperation(value = "应用科室护理标识设置", response = NurseConfigOptionDO.class)
+    public CommonResult<Boolean> applyNursingMark(@RequestBody List<NursingMarkCategoryConfigVO> nursingMarkCategoryConfigVOS,@PathVariable("partid") Integer partId) {
+        return CommonResult.success(nurseConfigService.applyNursingMark(nursingMarkCategoryConfigVOS,partId));
+    }
+
 }

+ 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);
         }

+ 24 - 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,8 +72,28 @@ 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);
     }
+
+
+    @Override
+    public void deleteNursingMarkMapping() {
+        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);
+    }
 }

+ 66 - 61
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(patient.getKeyval());
+        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(",")));
     }
 }

+ 91 - 58
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/NurseConfigOptionServiceImpl.java

@@ -4,16 +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.vos.DoctorAdviceMatchNursingMarkCategoryVO;
 import com.wdklian.ncs.ms.common.entity.open.vos.DoctorAdviceMatchNursingMarkOptionVO;
 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.vos.CustomerNurseConfigMappingVO;
 import com.wdklian.ncs.ms.common.entity.system.vos.NurseOptionCompareVO;
+import com.wdklian.ncs.ms.common.enums.HospitaliseStatusEnum;
 import com.wdklian.ncs.ms.framework.database.annotation.Table;
+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;
@@ -24,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;
 
 /**
@@ -44,22 +44,6 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
 
 
     @Override
-    public void removeDoctorAdvice(List<DoctorAdviceDO> doctorAdviceDOS) {
-
-    }
-
-    @Override
-    public void updateDoctorAdvice(List<DoctorAdviceDO> doctorAdviceDOS) {
-
-    }
-
-    @Override
-    public void insertDoctorAdvice(List<DoctorAdviceDO> doctorAdviceDOS) {
-
-    }
-
-
-    @Override
     public List<NurseConfigOptionDO> listPartNurseConfigOption(Integer partId) {
         String sql = "select * from ncs_nurse_config_option where part_id = ?";
         return this.daoSupport.queryForList(sql, NurseConfigOptionDO.class, partId);
@@ -68,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));
     }
 
 
@@ -80,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) {
@@ -96,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;
                 }
                 //当前患者自动生成项目的分类匹配医嘱
@@ -112,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);
                     }
                     //仅对比非手动设置的项目
@@ -136,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);
                     }
 
 
@@ -154,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);
+//                    }
+//                }
             }
         }
 
@@ -172,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).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
@@ -199,7 +226,17 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
         this.daoSupport.batchUpdate(sql);
     }
 
+    @Override
+    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)
      *
@@ -217,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());
@@ -243,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) {
@@ -254,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;
@@ -277,4 +308,6 @@ public class NurseConfigOptionServiceImpl extends SystemCRUDManagerImpl<NurseCon
         add.setId(lastId);
         return add;
     }
+
+
 }

+ 171 - 39
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/impl/NurseConfigServiceImpl.java

@@ -2,23 +2,23 @@ package com.wdklian.ncs.ms.system.service.impl;
 
 import cn.hutool.core.lang.ObjectId;
 import cn.hutool.core.util.StrUtil;
+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.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.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.util.DateUtil;
 import com.wdklian.ncs.ms.framework.util.StringUtil;
 import com.wdklian.ncs.ms.system.common.DoctorAdviceHelper;
-import com.wdklian.ncs.ms.system.service.iservice.CustomerService;
-import com.wdklian.ncs.ms.system.service.iservice.NurseConfigOptionService;
-import com.wdklian.ncs.ms.system.service.iservice.NurseConfigService;
-import com.wdklian.ncs.ms.system.service.iservice.ShopService;
+import com.wdklian.ncs.ms.system.service.iservice.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@@ -26,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;
@@ -74,6 +71,9 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
     @Autowired
     private NursingMarkOptionConfigFeignClient nursingMarkOptionConfigFeignClient;
 
+    @Autowired
+    private CustomerMappingService customerMappingService;
+
 
 
     @Override
@@ -92,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
@@ -108,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) {
@@ -121,11 +120,13 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
                                 nurseConfigOptionDO.setPartId(nurseConfigDO.getPartId());
                                 this.nurseConfigOptionService.add(nurseConfigOptionDO);
                             } else {
-                                nurseConfigOptionDO.setUpdateTime(DateUtil.getDateline());
-                                nurseConfigOptionDO.setOptionName(StrUtil.trim(optionName));
-                                nurseConfigOptionDO.setColorRgb(optionGroup.get(optionName).get(0).getBgColor().replace("#", ""));
-                                nurseConfigOptionDO.setPartId(nurseConfigDO.getPartId());
-                                this.nurseConfigOptionService.edit(nurseConfigOptionDO, nurseConfigOptionDO.getId());
+                                String color = optionGroup.get(optionName).get(0).getBgColor().replace("#", "");
+                                if(StrUtil.isNotEmpty(color)&&!color.equalsIgnoreCase(nurseConfigOptionDO.getColorRgb())) { //颜色改变,更新项目颜色,名称一定是一样的
+                                    nurseConfigOptionDO.setUpdateTime(DateUtil.getDateline());
+                                    nurseConfigOptionDO.setColorRgb(color);
+                                    nurseConfigOptionDO.setPartId(nurseConfigDO.getPartId());
+                                    this.nurseConfigOptionService.edit(nurseConfigOptionDO, nurseConfigOptionDO.getId());
+                                }
                             }
                         }
                     }
@@ -136,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);
         //关联科室的在院患者
@@ -145,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);
         //相关科室的所有护理标识分类
@@ -160,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());
             }
 
@@ -180,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();
+//            }
 
         }
 
@@ -218,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);
     }
 
@@ -242,4 +238,140 @@ public class NurseConfigServiceImpl extends SystemCRUDManagerImpl<NurseConfigDO>
         add.setId(lastId);
         return add;
     }
+   @Override
+    public void truncateTable(){
+        String sql = "truncate table " + NurseConfigDO.class.getAnnotation(Table.class).name();
+        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);
+    }
+
+
+
+    @Override
+    @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public Boolean applyNursingMark(List<NursingMarkCategoryConfigVO> list, Integer partId) {
+//        List<NursingMarkCategoryConfigVO> list = this.categoryConfigFeignClient.listAll().getData();
+//        //所有床头屏医嘱分类
+//        List<NurseConfigDO> nurseConfigDOS = this.listAll();
+//        //所有床头屏医嘱分类的选项
+//        List<NurseConfigOptionDO> nurseConfigOptionDOS = this.nurseConfigOptionService.listAll();
+        //要处理的科室列表
+        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));
+        }
+
+
+        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";
+
+
+            for (NursingMarkCategoryConfigVO screenAdviceCategoryVO : list) {
+                for (ShopDO shop : shops) {
+//                    List<String> clearOptionsSql = new ArrayList<>();
+                    //删掉已存在的但是配置中没有的记录
+//                    String categoryNamesMd5 = list.stream().filter(p -> p.getForPartId().equals(shop.getShopId())).map(p -> p.getNameMd5()).collect(Collectors.joining(","));
+                    if (screenAdviceCategoryVO.getForPartId().equals(shop.getShopId())) { //本科室的分类
+//                        List<NurseConfigDO> partNurseConfigDOs = nurseConfigDOS.stream().filter(p -> p.getPartId().equals(shop.getShopId())).collect(Collectors.toList());
+//                        List<NurseConfigOptionDO> partOptionDOS = nurseConfigOptionDOS.stream().filter(p -> p.getPartId().equals(shop.getShopId())).collect(Collectors.toList());
+                        //同步分类
+                        NurseConfigDO nurseConfigDO = this.syncPartScreenAdviceCategory(screenAdviceCategoryVO, shop);
+                        List<NursingMarkOptionConfigDO> child = screenAdviceCategoryVO.getChild();
+                        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());
+//                            clearOptionsSql.add(formatSql);
+                            for (NursingMarkOptionConfigDO settingDO : partScreenAdviceItemSettingDOs) {
+                                this.syncPartScreenAdviceItem(settingDO, nurseConfigDO);
+                            }
+                        }
+                    }
+                }
+                    //删除配置中没有的分类,及其选项
+//                    String sqlNurseConfigClear = " delete config,op from " + NurseConfigDO.class.getAnnotation(Table.class).name() + " as config left join " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " as op on config.id=op.ncfg_id  where not find_in_set(MD5(config.config_name),'" + categoryNamesMd5 + "') and config.part_id =" + shop.getShopId();
+                    //反向删除找不到分类的项目,由于更新用户护理项时是删除重建,这里可以不删除用户护理项mapping记录
+//                    String sqlNurseConfigOptionClear = "delete op from " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " as op left join " + NurseConfigDO.class.getAnnotation(Table.class).name() + " as config on config.id=op.ncfg_id where config.id is null ";
+//                    clearOptionsSql.add(sqlNurseConfigClear);
+//                    clearOptionsSql.add(sqlNurseConfigOptionClear);
+                    //清理已经不在设置中的分类和选项
+//                    if (clearOptionsSql.size() > 0) {
+//                        this.nursingMarkFeignClient.batchUpdate(clearOptionsSql.toArray(new String[clearOptionsSql.size()]));
+//                    }
+                }
+
+
+        }
+//        else { //清空配置
+//            List<String> clearConfigSqls = new ArrayList<>();
+//            for (ShopDO shop : shops) {
+//                String sql = "delete config,op from " + NurseConfigDO.class.getAnnotation(Table.class).name() + " as config left join " + NurseConfigOptionDO.class.getAnnotation(Table.class).name() + " as op on config.id=op.ncfg_id where config.part_id =" + shop.getShopId();
+//                clearConfigSqls.add(sql);
+//            }
+//            if (clearConfigSqls.size() > 0) {
+//                this.nursingMarkFeignClient.batchUpdate(clearConfigSqls.toArray(new String[clearConfigSqls.size()]));
+//            }
+//        }
+//        return JsonResponse.successResponse(list);
+
+        return true;
+    }
+
+
+    //应用指定科室的指定床头屏医嘱分类
+    private NurseConfigDO syncPartScreenAdviceCategory(NursingMarkCategoryConfigVO screenAdviceCategoryVO, ShopDO shop) {
+
+//        NurseConfigDO nurseConfigDO = partNurseConfigDOs.stream().filter(p -> StringUtil.md5(p.getConfigName()).equalsIgnoreCase(screenAdviceCategoryVO.getNameMd5())).findFirst().orElse(null);
+
+        NurseConfigDO nurseConfigDO = new NurseConfigDO();
+            nurseConfigDO.setPartId(shop.getShopId());
+            nurseConfigDO.setConfigName(screenAdviceCategoryVO.getCategoryName());
+            nurseConfigDO.setUnionId(ObjectId.next());
+            nurseConfigDO.setBoolCritical(screenAdviceCategoryVO.getCritical());
+            nurseConfigDO.setIndexNo(screenAdviceCategoryVO.getIndexNo());
+            nurseConfigDO.setDefaultColor(screenAdviceCategoryVO.getDefaultColor().replace("#", ""));
+            nurseConfigDO.setBoolManual(screenAdviceCategoryVO.getBoolManual());
+            nurseConfigDO= this.add(nurseConfigDO);
+        return nurseConfigDO;
+    }
+
+
+    //同步应用床头屏医嘱分类选择项
+    private void syncPartScreenAdviceItem(NursingMarkOptionConfigDO settingDO, NurseConfigDO nurseConfigDO) {
+        //查询是否存在与设置对应的项目
+//        NurseConfigOptionDO nurseConfigOptionDO = partOptionDOS.stream().filter(p -> !StringUtil.isEmpty(p.getOptionName()) &&
+//                StringUtil.md5(p.getOptionName()).equalsIgnoreCase(settingDO.getItemNameMd5()) && p.getNcfgId().equals(nurseConfigDO.getId())).findFirst().orElse(null);
+//        if (nurseConfigOptionDO == null) {
+            NurseConfigOptionDO nurseConfigOptionDO = new NurseConfigOptionDO();
+            nurseConfigOptionDO.setCreateTime(DateUtil.getDateline());
+            nurseConfigOptionDO.setNcfgId(nurseConfigDO.getId());
+            nurseConfigOptionDO.setUnionId(ObjectId.next());
+            nurseConfigOptionDO.setOptionName(settingDO.getItemName());
+            nurseConfigOptionDO.setColorRgb(settingDO.getColor().replace("#", ""));
+            nurseConfigOptionDO.setPartId(nurseConfigDO.getPartId());
+            this.nurseConfigOptionService.add(nurseConfigOptionDO);
+//        } else {
+//            nurseConfigOptionDO.setUpdateTime(DateUtil.getDateline());
+//            nurseConfigOptionDO.setOptionName(settingDO.getItemName());
+//            nurseConfigOptionDO.setColorRgb(settingDO.getColor().replace("#", ""));
+//            nurseConfigOptionDO.setPartId(nurseConfigDO.getPartId());
+//            this.nursingMarkFeignClient.updateNursingOptionConfig(nurseConfigOptionDO, nurseConfigOptionDO.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));
     }
 }

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

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

+ 6 - 30
ncs-system-service/src/main/java/com/wdklian/ncs/ms/system/service/iservice/NurseConfigOptionService.java

@@ -1,14 +1,13 @@
 package com.wdklian.ncs.ms.system.service.iservice;
 
 
-import com.wdklian.ncs.ms.common.entity.open.dos.DoctorAdviceDO;
 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.NurseConfigDO;
 import com.wdklian.ncs.ms.common.entity.system.dos.NurseConfigOptionDO;
-
 import com.wdklian.ncs.ms.framework.database.CRUDBaseManager;
 
 import java.util.List;
@@ -19,35 +18,7 @@ import java.util.List;
  * ${description}
  */
 public interface NurseConfigOptionService extends CRUDBaseManager<NurseConfigOptionDO> {
-    /**
-     * 响应医嘱信息删除变化
-     *
-     * @param doctorAdviceDOS
-     * @return
-     * @date 2023-11-14 18:33
-     * @author wuyunfeng
-     */
-    void removeDoctorAdvice(List<DoctorAdviceDO> doctorAdviceDOS);
-
-    /**
-     * 响应医嘱更新
-     *
-     * @param doctorAdviceDOS
-     * @return
-     * @date 2023-11-14 18:34
-     * @author wuyunfeng
-     */
-    void updateDoctorAdvice(List<DoctorAdviceDO> doctorAdviceDOS);
 
-    /**
-     * 医嘱插入
-     *
-     * @param doctorAdviceDOS
-     * @return
-     * @date 2023-11-14 18:36
-     * @author wuyunfeng
-     */
-    void insertDoctorAdvice(List<DoctorAdviceDO> doctorAdviceDOS);
 
     List<NurseConfigOptionDO> listPartNurseConfigOption(Integer partId);
 
@@ -82,4 +53,9 @@ public interface NurseConfigOptionService extends CRUDBaseManager<NurseConfigOpt
     List<NurseConfigOptionDO> listAll();
 
     void batchUpdate(String[] sql);
+
+
+    void truncateTable();
+
+    void deleteByPartId(Integer partId);
 }

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

@@ -2,6 +2,7 @@ package com.wdklian.ncs.ms.system.service.iservice;
 
 
 import com.wdklian.ncs.ms.common.entity.open.vos.DoctorAdviceMatchNursingMarkCategoryVO;
+import com.wdklian.ncs.ms.common.entity.open.vos.NursingMarkCategoryConfigVO;
 import com.wdklian.ncs.ms.common.entity.system.dos.CustomerDO;
 import com.wdklian.ncs.ms.common.entity.system.dos.NurseConfigDO;
 import com.wdklian.ncs.ms.framework.database.CRUDBaseManager;
@@ -38,4 +39,10 @@ public interface NurseConfigService extends CRUDBaseManager<NurseConfigDO> {
 
     //
     void handleAutoNurseOption(List<DoctorAdviceMatchNursingMarkCategoryVO> doctorAdviceCategoryVOS, Integer partId);
+
+    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:

+ 1 - 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>
@@ -28,6 +25,7 @@
         <module>ncs-ms-feign</module>
         <module>ncs-entrace-service</module>
         <module>third-part-ccey</module>
+        <module>ncs-message-center</module>
     </modules>
 
 

+ 47 - 0
synchrony-scheduled-task/src/main/java/com/wdklian/ncs/ms/scheduled/controller/DataRefreshController.java

@@ -0,0 +1,47 @@
+package com.wdklian.ncs.ms.scheduled.controller;
+
+import com.wdklian.ncs.ms.common.entity.system.dos.CustomerDO;
+import com.wdklian.ncs.ms.framework.mvc.CommonResult;
+import com.wdklian.ncs.ms.scheduled.service.DataBaseSyncService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wuyunfeng
+ * 2024-04-10 10:37
+ * ${description}
+ */
+@RestController
+@Slf4j
+@Api(description = "患者信息即时同步刷新", tags = "患者信息即时同步刷新")
+@RequestMapping("/data-refresh")
+@Validated
+public class DataRefreshController {
+
+
+    @Autowired
+    private DataBaseSyncService dataBaseSyncService;
+
+    @GetMapping("/{patientkey}")
+    @ApiOperation(value = "即时同步单个患者信息", response = CustomerDO.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "patientkey", value = "患者主键", required = true, dataType = "string", paramType = "path")
+    })
+    public CommonResult refreshPatient(@NotNull(message = "patientkey") @PathVariable("patientkey") String patientKey) {
+
+      return  dataBaseSyncService.syncSinglePatient(patientKey);
+
+    }
+
+}

+ 24 - 4
synchrony-scheduled-task/src/main/java/com/wdklian/ncs/ms/scheduled/service/DataBaseSyncService.java

@@ -4,6 +4,7 @@ package com.wdklian.ncs.ms.scheduled.service;
 import com.wdklian.ncs.ms.feignclient.system.CustomerFeignClient;
 import com.wdklian.ncs.ms.framework.config.TaskSchedule;
 import com.wdklian.ncs.ms.framework.database.DaoSupport;
+import com.wdklian.ncs.ms.framework.mvc.CommonResult;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -15,6 +16,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * @author wuyunfeng
@@ -62,11 +65,11 @@ public class DataBaseSyncService {
      * @author wuyunfeng
      */
 
-    public void syncViewData(String[] jobJson) {
+    public void syncViewData(String[] jobJson, Map<String,String> params) {
         try {
             if (jobJson != null) {
                 for (String s : jobJson) {
-                    DataxEngineHelper.entry(s, homePath);
+                    DataxEngineHelper.entry(s, homePath,params);
                 }
 
             }
@@ -94,7 +97,10 @@ public class DataBaseSyncService {
         if (dataxSyncEnable) {
             Runnable syncPatientRunnable = () -> {
                 //同步数据
-                this.syncViewData(patientJob);
+                Map<String,String> params = new HashMap<>();
+                params.put("adviceWhere","1=1");
+                params.put("patientWhere","1=1");
+                this.syncViewData(patientJob,params);
                 //更新到呼叫系统
                 customerFeignClient.syncAllPatient();
                 //处理open数据
@@ -106,7 +112,7 @@ public class DataBaseSyncService {
             this.taskSchedule.scheduleTask("SYNC_PATIENT_DOCTORADVICE", syncPatientRunnable, triggerPatient);
 
             Runnable syncDepartRunnable = () -> {
-                this.syncViewData(departmentJob);
+                this.syncViewData(departmentJob,null);
             };
             new Thread(syncDepartRunnable).start();
             Trigger triggerDepart = triggerContext -> new CronTrigger(dataxSyncDepartPeriod).nextExecutionTime(triggerContext);
@@ -114,4 +120,18 @@ public class DataBaseSyncService {
         }
 
     }
+
+    public CommonResult syncSinglePatient(String patientKey) {
+
+        Runnable syncPatientRunnable = () -> {
+            Map<String,String> params = new HashMap<>();
+            params.put("adviceWhere","patient_key='"+patientKey+"'");
+            params.put("patientWhere","keyval='"+patientKey+"'");
+            this.syncViewData(patientJob,params);
+            //更新到呼叫系统
+            customerFeignClient.syncSinglePatientByKey(patientKey);
+        };
+        new Thread(syncPatientRunnable).start();
+       return CommonResult.success("");
+    }
 }

+ 10 - 2
synchrony-scheduled-task/src/main/java/com/wdklian/ncs/ms/scheduled/service/DataxEngineHelper.java

@@ -4,18 +4,26 @@ import com.alibaba.datax.core.Engine;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
+import java.util.Map;
+
 @Component
 @Slf4j
 public class DataxEngineHelper {
     /**
      * datax任务引擎
-     * @param jobJson   json配置文件路径
+     *
+     * @param jobJson json配置文件路径
      * @throws Throwable
      */
 
 
-    public static void entry(String jobJson,String homePath) throws Throwable {
+    public static void entry(String jobJson, String homePath, Map<String, String> params) throws Throwable {
         DataxHomePathUtil.setDataxHomePath(homePath);
+        if (params != null) {
+            for (Map.Entry<String, String> entry : params.entrySet()) {
+                System.setProperty(entry.getKey(), entry.getValue());
+            }
+        }
         String[] datxArgs2 = {"-job", jobJson, "-mode", "standalone", "-jobid", "-1"};
         Engine.entry(datxArgs2);
     }

+ 1 - 1
synchrony-scheduled-task/src/main/resources/bootstrap.yml

@@ -5,7 +5,7 @@ spring:
   main:
     allow-bean-definition-overriding: true
     allow-circular-references: true
-    web-application-type: none
+#    web-application-type: none
   cloud:
     loadbalancer:
       cache:

+ 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>

+ 61 - 16
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;
@@ -49,7 +56,7 @@ public class MyHL7BusinessLogicService {
     public Message handleA19(Message msg) throws Exception {
 
         if (msg instanceof QRY_A19) {
-            // do processing
+            // dos processing
         }
         return msg;
     }
@@ -140,23 +147,46 @@ public class MyHL7BusinessLogicService {
 
 
                     }
+                    if(status.equalsIgnoreCase("9")||//入院作废
+                            status.equalsIgnoreCase("3")|| //出院
+                            status.equalsIgnoreCase("2")){ //出区
+                        patientFeignClient.patientOut(patientKey);
+                        return;
+                    }
                     //处理患者信息,根据缓存数据判定是否需要提交到数据库更新
-                    if (patient != null&&StrUtil.isNotEmpty(patient.getBedNo())) {
+                    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;
+                       }
+                       //患者再次入院重选分床,要把患者上次的出院日期清除,否则会认为已出院,同步不了
+                        if(StrUtil.isNotEmpty(patient.getOutdate())&&"1".equalsIgnoreCase(status)){
+                            patient.setOutdate(null);
                         }
                         if (cachePatient == null) { //没有缓存,表明患者信息未保存,超过5天没有操作。
+                            if(StrUtil.isEmpty(patient.getStatus())){ //此次消息患者状态为null,不作处理,无法明确患者状态
+                               return;
+                            }
                             entracePatientFeignClient.syncSinglePatient(patient);
-                            cache.put("PATIENT_" + patientKey, patient, 5 * 24 * 60 * 60);
+                            cache.put("PATIENT_" + patientKey, patient, 10 * 24 * 60 * 60);
                         } else { //只有患者信息有变化时才更新,减少数据库访问次数
                             PatientDO patientOld = (PatientDO) cachePatient;
+                            if(StrUtil.isEmpty(patient.getStatus())){ //此次消息患者状态为null,从缓存中获取
+                                patient.setStatus(patientOld.getStatus());
+                            }
                             if (!ObjectUtil.equal(patient, patientOld)) {
                                 entracePatientFeignClient.syncSinglePatient(patient);
                                 //重新缓存
-                                cache.put("PATIENT_" + patientKey, patient, 5 * 24 * 60 * 60);
+                                cache.put("PATIENT_" + patientKey, patient, 10 * 24 * 60 * 60);
                             }
                         }
                     }
@@ -244,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);
                         }
@@ -261,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;
     }
@@ -283,10 +320,18 @@ public class MyHL7BusinessLogicService {
 
     private String statusDecode(String state) {
         switch (state) {
-            case "3":
+            case "2": //出区
+            case "3": //出院
+            case "7": //转科状态
+            case "8": //数据转出
+            case "9": //入院作废
                 return "1";
-            default:
+            case "1": //病区分床
+            case "5":
+            case "6":
                 return "0";
+            default: //其他状态 根据原来的状态处理
+                return null;
         }
     }
 

+ 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("${", "}");
+
 
     }
 

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

@@ -0,0 +1,137 @@
+package com.wdklian.ncs.ms.common.entity.msgcenter.dos;
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import com.wdklian.ncs.ms.framework.database.annotation.Column;
+import com.wdklian.ncs.ms.framework.database.annotation.Id;
+import com.wdklian.ncs.ms.framework.database.annotation.Table;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Table(name = "message_send_record")
+@ApiModel
+@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MessageSendRecordDO implements Serializable {
+
+    /**
+     * null
+     */
+    @Column(name = "id")
+    @ApiModelProperty(value = "null", required = false)
+    @Id(name = "id")
+    private Integer id;
+    /**
+     * 发送时间
+     */
+    @Column(name = "send_time")
+    @ApiModelProperty(value = "发送时间", required = false)
+    private Long sendTime;
+    /**
+     * 发送方式、自动、手动
+     */
+    @Column(name = "send_mode")
+    @ApiModelProperty(value = "发送方式、1-自动、2-手动", required = false)
+    private Integer sendMode;
+    /**
+     * 消息id
+     */
+    @Column(name = "message_id")
+    @ApiModelProperty(value = "消息id", required = false)
+    private Integer messageId;
+    /**
+     * 接收者id
+     */
+    @Column(name = "to_customer_id")
+    @ApiModelProperty(value = "接收者id", required = false)
+    private Integer toCustomerId;
+    /**
+     * 是否已接收
+     */
+    @Column(name = "bool_received")
+    @ApiModelProperty(value = "是否已接收", required = false)
+    private Boolean boolReceived;
+    /**
+     * 是否已读
+     */
+    @Column(name = "bool_readed")
+    @ApiModelProperty(value = "是否已读", required = false)
+    private Boolean boolReaded;
+    /**
+     * 是否发送成功
+     */
+    @Column(name = "bool_sended")
+    @ApiModelProperty(value = "是否发送成功", required = false)
+    private Boolean boolSended;
+    /**
+     * 客户端接收时间
+     */
+    @Column(name = "received_time")
+    @ApiModelProperty(value = "客户端接收时间", required = false)
+    private Long receivedTime;
+
+    /**
+     * 消息已读时间
+     */
+    @Column(name = "read_time")
+    @ApiModelProperty(value = "消息已读时间", required = false)
+    private Long readTime;
+    /**
+     * 消息类型id
+     */
+    @Column(name = "message_type_id")
+    @ApiModelProperty(value = "消息类型id", required = false)
+    private Integer messageTypeId;
+    /**
+     * 消息打开方式
+     */
+    @Column(name = "open_type")
+    @ApiModelProperty(value = "消息打开方式", required = false)
+    private String openType;
+    /**
+     * 是否为模板消息
+     */
+    @Column(name = "bool_template_mesage")
+    @ApiModelProperty(value = "是否为模板消息", required = false)
+    private Boolean boolTemplateMesage;
+    /**
+     * 消息模板
+     */
+    @Column(name = "message_template")
+    @ApiModelProperty(value = "消息模板", required = false)
+    private String messageTemplate;
+    /**
+     * 参数json
+     */
+    @Column(name = "paramer_json")
+    @ApiModelProperty(value = "参数json", required = false)
+    private String paramerJson;
+    /**
+     * 消息内容显示,普通消息为消息的摘要,模板消息直接显示消息内容
+     */
+    @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 = "part_id")
+    @ApiModelProperty(value = "科室Id", required = false)
+    private Integer partId;
+
+
+}

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

@@ -0,0 +1,69 @@
+package com.wdklian.ncs.ms.common.entity.msgcenter.dos;
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import com.wdklian.ncs.ms.framework.database.annotation.Column;
+import com.wdklian.ncs.ms.framework.database.annotation.Id;
+import com.wdklian.ncs.ms.framework.database.annotation.Table;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Table(name = "message_send_strategy")
+@ApiModel
+@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MessageSendStrategyDO implements Serializable {
+
+    /**
+     * null
+     */
+    @Column(name = "id")
+    @ApiModelProperty(value = "null", required = false)
+    @Id(name = "id")
+    private Integer id;
+    /**
+     * 策略名称
+     */
+    @Column(name = "strategy_name")
+    @ApiModelProperty(value = "策略名称", required = false)
+    private String strategyName;
+    /**
+     * 开启状态
+     */
+    @Column(name = "enabled")
+    @ApiModelProperty(value = "开启状态", required = false)
+    private String enabled;
+    /**
+     * 科室id
+     */
+    @Column(name = "part_id")
+    @ApiModelProperty(value = "科室id", required = false)
+    private Integer partId;
+    /**
+     * 要发送的消息ids
+     */
+    @Column(name = "message_ids")
+    @ApiModelProperty(value = "要发送的消息ids", required = false)
+    private String messageIds;
+    /**
+     * 入院后几小时发送
+     */
+    @Column(name = "send_after_inhours")
+    @ApiModelProperty(value = "入院后几小时发送", required = false)
+    private Integer sendAfterInhours;
+    /**
+     * 患者医嘱特征关键字
+     */
+    @Column(name = "doctor_advice_keywords")
+    @ApiModelProperty(value = "患者医嘱特征关键字", required = false)
+    private String doctorAdviceKeywords;
+
+
+}

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

@@ -0,0 +1,53 @@
+package com.wdklian.ncs.ms.common.entity.msgcenter.dos;
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import com.wdklian.ncs.ms.framework.database.annotation.Column;
+import com.wdklian.ncs.ms.framework.database.annotation.Id;
+import com.wdklian.ncs.ms.framework.database.annotation.Table;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+
+@Table(name = "message_type")
+@ApiModel
+@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MessageTypeDO implements Serializable {
+
+    /**
+     * null
+     */
+    @Column(name = "id")
+    @ApiModelProperty(value = "null", required = false)
+    @Id(name = "id")
+    private Integer id;
+    /**
+     * 消息类型名称
+     */
+    @Column(name = "type_name")
+    @ApiModelProperty(value = "消息类型名称", required = false)
+    private String typeName;
+
+    /**
+     * 创建时间
+     */
+    @Column(name = "create_time")
+    @ApiModelProperty(value = "创建时间", required = false)
+    private Long createTime;
+    /**
+     * 更新时间
+     */
+    @Column(name = "update_time")
+    @ApiModelProperty(value = "更新时间", required = false)
+    private Long updateTime;
+
+
+}

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

@@ -0,0 +1,101 @@
+package com.wdklian.ncs.ms.common.entity.msgcenter.dos;
+
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import com.wdklian.ncs.ms.framework.database.annotation.Column;
+import com.wdklian.ncs.ms.framework.database.annotation.Id;
+import com.wdklian.ncs.ms.framework.database.annotation.Table;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Table(name = "messages")
+@ApiModel
+@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MessagesDO implements Serializable {
+
+    /**
+     * null
+     */
+    @Column(name = "id")
+    @ApiModelProperty(value = "null", required = false)
+    @Id(name = "id")
+    private Integer id;
+    /**
+     * 标题
+     */
+    @Column(name = "title")
+    @ApiModelProperty(value = "标题", required = false)
+    private String title;
+    /**
+     * 分类Id
+     */
+    @Column(name = "message_type_id")
+    @ApiModelProperty(value = "分类Id", required = false)
+    private Integer messageTypeId;
+    /**
+     * 消息内容文章富文本,音频、视频、图片生成url列表
+     */
+    @Column(name = "message_body")
+    @ApiModelProperty(value = "消息内容文章富文本,音频、视频、图片生成url列表", required = false)
+    private String messageBody;
+    /**
+     * 创建时间
+     */
+    @Column(name = "create_time")
+    @ApiModelProperty(value = "创建时间", required = false)
+    private Long createTime;
+    /**
+     * 更新时间
+     */
+    @Column(name = "update_time")
+    @ApiModelProperty(value = "更新时间", required = false)
+    private Long updateTime;
+    /**
+     * 科室Id
+     */
+    @Column(name = "part_id")
+    @ApiModelProperty(value = "科室Id", required = false)
+    private Integer partId;
+    /**
+     * 创建人
+     */
+    @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;
+
+}

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

@@ -0,0 +1,67 @@
+package com.wdklian.ncs.ms.common.entity.msgcenter.dos;
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import com.wdklian.ncs.ms.framework.database.annotation.Column;
+import com.wdklian.ncs.ms.framework.database.annotation.Id;
+import com.wdklian.ncs.ms.framework.database.annotation.Table;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+
+@Table(name = "template_message_paramer")
+@ApiModel
+@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
+@Data
+@NoArgsConstructor
+@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;
+
+    /**
+     * 允许自定义输入
+     */
+    @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;
+
+}

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

@@ -0,0 +1,63 @@
+package com.wdklian.ncs.ms.common.entity.msgcenter.dos;
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import com.wdklian.ncs.ms.framework.database.annotation.Column;
+import com.wdklian.ncs.ms.framework.database.annotation.Id;
+import com.wdklian.ncs.ms.framework.database.annotation.Table;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+
+@Table(name = "template_message_tpl")
+@ApiModel
+@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class TemplateMessageTplDO implements Serializable {
+
+    /**
+     * null
+     */
+    @Column(name = "id")
+    @ApiModelProperty(value = "null", required = false)
+    @Id(name = "id")
+    private Integer id;
+    /**
+     * 科室id
+     */
+    @Column(name = "part_id")
+    @ApiModelProperty(value = "科室id", required = false)
+    private Integer partId;
+    /**
+     * 模板标题
+     */
+    @Column(name = "template_title")
+    @ApiModelProperty(value = "模板标题", required = false)
+    private String templateTitle;
+    /**
+     * 模板内容
+     */
+    @Column(name = "template_content")
+    @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;
+}

+ 1 - 1
third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/open/dos/PatientDO.java

@@ -155,7 +155,7 @@ public class PatientDO implements Serializable {
     /**
      * null
      */
-    @Column(name = "outdate")
+    @Column(name = "outdate",allowNullUpdate = true)
     @ApiModelProperty(value = "出院日期",notes = "日期格式:YYYY-MM-DD",example = "2023-11-11", required = false)
     @DateTime(message = "出院日期(outdate)格式错误")
     private String outdate;

+ 2 - 0
third-party-common/src/main/java/com/wdklian/ncs/ms/common/entity/system/dos/NurseConfigDO.java

@@ -12,6 +12,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
+import java.util.Objects;
 
 @Table(name = "ncs_nurse_config")
 @ApiModel("护理信息分类")
@@ -101,4 +102,5 @@ public class NurseConfigDO implements Serializable {
     @ApiModelProperty(value = "分类是否为手动选择项目,如果是手动选择项目,不需要配置医嘱匹配", required = false)
     private Boolean boolManual;
 
+
 }

+ 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;
 
 
 }

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

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
+import java.util.Objects;
 
 /**
  * @author wuyunfeng
@@ -32,14 +33,22 @@ 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
+    public int hashCode() {
+        return Objects.hash(categoryName, optionName);
     }
 }