diff --git a/.DS_Store b/.DS_Store
index d340ca1..d370743 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/pom.xml b/pom.xml
index 88ca4fe..67d1f78 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,11 +45,24 @@
ehcache
3.9.9
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
+
+ io.lettuce
+ lettuce-core
+ 5.3.6.RELEASE
+
+
+
ch.qos.logback
logback-classic
+ 1.2.9
@@ -127,6 +140,7 @@
ini4j
0.5.4
+
@@ -134,7 +148,6 @@
org.springframework.boot
spring-boot-maven-plugin
-
@@ -144,6 +157,11 @@
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.4.2
+
diff --git a/src/main/java/com/ynxbd/push/.DS_Store b/src/main/java/com/ynxbd/push/.DS_Store
new file mode 100644
index 0000000..c9e108d
Binary files /dev/null and b/src/main/java/com/ynxbd/push/.DS_Store differ
diff --git a/src/main/java/com/ynxbd/push/AppApplication.java b/src/main/java/com/ynxbd/push/AppApplication.java
index 76a6285..8b942a4 100644
--- a/src/main/java/com/ynxbd/push/AppApplication.java
+++ b/src/main/java/com/ynxbd/push/AppApplication.java
@@ -2,18 +2,24 @@ package com.ynxbd.push;
import com.ynxbd.push.config.IniConfig;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
@Slf4j
@SpringBootApplication()
public class AppApplication extends SpringBootServletInitializer {
- public static void main(String[] args) {
+ public static void main(String[] args) throws IOException, TimeoutException {
SpringApplication.run(AppApplication.class, args);
+ System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow", "^");
+
log.info("启动医院为:{}", IniConfig.getInstance("name"));
+ log.info("token_url路径:{}", StringUtils.isNotBlank(IniConfig.getInstance("token_url")) ? IniConfig.getInstance("token_url") : "http://127.0.0.1:8080/wx/api/getWxAccessToken.do");
}
}
diff --git a/src/main/java/com/ynxbd/push/config/RabbitMQConfig.java b/src/main/java/com/ynxbd/push/config/RabbitMQConfig.java
new file mode 100644
index 0000000..77cae8d
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/config/RabbitMQConfig.java
@@ -0,0 +1,64 @@
+package com.ynxbd.push.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.*;
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author 李进才
+ * @ClassName RabbitMQConfig
+ * @Description TODO
+ * @date 2024/01/23 13:28:00
+ */
+@Configuration
+@EnableRabbit
+@Slf4j
+public class RabbitMQConfig {
+
+ @Autowired
+ private RabbitTemplate rabbitTemplate;
+
+ @Bean
+ public AmqpTemplate amqpTemplate(){
+ rabbitTemplate.setEncoding("UTF-8");
+ rabbitTemplate.setMandatory(true);
+ rabbitTemplate.setReturnCallback(((message, replyCode, replyText, exchange, routingKey) -> {
+ String correlationId = message.getMessageProperties().getCorrelationId();
+ log.info("消息:{} 发送失败, 应答码:{} 原因:{} 交换机: {} 路由键: {}", correlationId, replyCode, replyText, exchange, routingKey);
+ }));
+ //开启消息确认 yml 需要配置 publisher-returns: true
+ rabbitTemplate.setConfirmCallback(((correlationData, ack, cause) ->{
+ if (ack) {
+ assert correlationData != null;
+ log.info("消息发送到交换机成功,correlationId:{}",correlationData.getId());
+ } else {
+ log.info("消息发送到交换机失败,原因:{}",cause);
+ }
+ } ));
+ return rabbitTemplate;
+ }
+ /**
+ * 声明直连交换机 支持持久化.
+ * @return the exchange
+ */
+ @Bean("wxPushExchange")
+ public Exchange wxPushExchange() {
+ return ExchangeBuilder.directExchange("wxPushExchange").durable(true).build();
+ }
+
+ @Bean("wxPushQueue")
+ public Queue wxPushQueue(){
+ return new Queue("wxPushQueue", true, true, true);
+ }
+
+ @Bean
+ public Binding wxPushBinding(){
+ return BindingBuilder.bind(wxPushQueue()).to(wxPushExchange()).with("wxPushRouting").noargs();
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ynxbd/push/config/TomcatConfig.java b/src/main/java/com/ynxbd/push/config/TomcatConfig.java
new file mode 100644
index 0000000..49314f7
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/config/TomcatConfig.java
@@ -0,0 +1,25 @@
+package com.ynxbd.push.config;
+
+import org.apache.catalina.connector.Connector;
+import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author 李进才
+ * @ClassName TomcatConfig
+ * @Description TODO
+ * @date 2023/10/12 10:27:00
+ */
+@Configuration
+public class TomcatConfig {
+ @Bean
+ public TomcatServletWebServerFactory webServerFactory() {
+ TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
+ factory.addConnectorCustomizers((Connector connector) -> {
+ connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
+ connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
+ });
+ return factory;
+ }
+}
diff --git a/src/main/java/com/ynxbd/push/controller/ApiController.java b/src/main/java/com/ynxbd/push/controller/ApiController.java
index 49a09b2..7ae5ca8 100644
--- a/src/main/java/com/ynxbd/push/controller/ApiController.java
+++ b/src/main/java/com/ynxbd/push/controller/ApiController.java
@@ -1,11 +1,14 @@
package com.ynxbd.push.controller;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ynxbd.push.helper.RedisHelper;
import com.ynxbd.push.httpRequest.xbd.wx.WxCacheRequest;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+@Slf4j
@RestController
@RequestMapping("api")
public class ApiController {
@@ -15,4 +18,16 @@ public class ApiController {
WxCacheRequest.clearWxAccessToken();
return "success";
}
+
+ @PostMapping("getRedis")
+ public JSONObject getRedis(String name) {
+ log.info("name-{}",name);
+ return JSON.parseObject(RedisHelper.getRedis().get(name));
+ }
+
+// @GetMapping("getRabbitMq")
+// public String getRabbitMq() throws IOException, TimeoutException {
+// rabbitMqHelper.ReportTipSend();
+// return "success";
+// }
}
diff --git a/src/main/java/com/ynxbd/push/controller/BI/BiController.java b/src/main/java/com/ynxbd/push/controller/BI/BiController.java
new file mode 100644
index 0000000..1b0e6ed
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/controller/BI/BiController.java
@@ -0,0 +1,30 @@
+package com.ynxbd.push.controller.BI;
+
+import com.ynxbd.push.pushJob.BI.BiPush;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author 李进才
+ * @ClassName BiController
+ * @Description description
+ * @date 2022/9/7 14:26
+ */
+@Slf4j
+@RestController
+@RequestMapping("Bi")
+public class BiController {
+ @GetMapping("workLoadPush")
+ public String workLoadPush(String openId) {
+ try {
+ BiPush.runJob(openId);
+ return "Success";
+ }
+ catch (Exception e){
+ log.error(e.toString());
+ return e.getMessage();
+ }
+ }
+}
diff --git a/src/main/java/com/ynxbd/push/controller/BusinessController.java b/src/main/java/com/ynxbd/push/controller/BusinessController.java
new file mode 100644
index 0000000..a388f2a
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/controller/BusinessController.java
@@ -0,0 +1,146 @@
+package com.ynxbd.push.controller;
+
+import com.ynxbd.push.entity.type.MessageTypeEnum;
+import com.ynxbd.push.entity.response.ResponseResult;
+import com.ynxbd.push.helper.BusinessHelper;
+import com.ynxbd.push.rabbit.send.RabbitSender;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import weixin.popular.bean.message.MessageSendResult;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author 李进才
+ * @ClassName BusinessController
+ * @Description 发送lis报告单结果推送
+ * @date 2021/12/6 3:23 下午
+ */
+@Controller
+@Slf4j
+@RequestMapping(value = "business")
+public class BusinessController {
+ @Autowired
+ private RabbitSender rabbitSender;
+
+
+
+
+ @GetMapping(value = "report")
+ @ResponseBody
+ public MessageSendResult reportTip(String organizeName, String patientId,String idCard, String reportId, String itemName, String reportTime, String patientName,String sex, String age, String applyDept, String applyDoctor) {
+ log.info("进入接口-[检验检查报告通知]organizeName-{},patientId-{},idCard-{},reportId-{}, itemName-{},reportTime-{},patientName-{},sex-{},age-{},applyDept-{},applyDoctor-{}",organizeName,patientId,idCard,reportId,itemName,reportTime,patientName,sex,age,applyDept,applyDoctor);
+ MessageSendResult check = BusinessHelper.ParamsCheck(organizeName,patientId,idCard,null);
+ if(!check.getErrcode().equals("0")){
+ return check;
+ }
+ Map message = new HashMap<>();
+ message.put("tip", MessageTypeEnum.REPORT_TIP.CODE);
+ message.put("organizeName",organizeName);
+ message.put("patientId",patientId);
+ message.put("idCard",idCard);
+ message.put("reportId",reportId);
+ message.put("itemName",itemName);
+ message.put("reportTime",reportTime);
+ message.put("patientName",patientName);
+ message.put("sex",sex);
+ message.put("age",age);
+ message.put("applyDept",applyDept);
+ message.put("applyDoctor",applyDoctor);
+ rabbitSender.TipSend(message);
+ return ResponseResult.JOIN_QUEUE.toMessResult();
+ }
+
+ @GetMapping(value = "queue")
+ @ResponseBody
+ public MessageSendResult queueTip(String organizeName, String patientId, String idCard, String patientName, String deptName, String doctorName, String currentNumber, String selfNumber, String waitNumber) {
+ log.info("进入接口-[排队叫号提醒]organizeName-{},patientId-{},idCard-{},patientName-{},deptName-{},doctorName-{},currentNumber-{},selfNumber-{},waitNumber-{}", organizeName, patientId, idCard, patientName, deptName, doctorName, currentNumber, selfNumber, waitNumber);
+ MessageSendResult check = BusinessHelper.ParamsCheck(organizeName, patientId, idCard,null);
+ if (!check.getErrcode().equals("0")) {
+ return check;
+ }
+ Map message = new HashMap<>();
+ message.put("tip",MessageTypeEnum.QUEUE_TIP.CODE);
+ message.put("organizeName", organizeName);
+ message.put("patientId", patientId);
+ message.put("idCard", idCard);
+ message.put("patientName", patientName);
+ message.put("deptName", deptName);
+ message.put("doctorName", doctorName);
+ message.put("currentNumber", currentNumber);
+ message.put("selfNumber", selfNumber);
+ message.put("waitNumber", waitNumber);
+ rabbitSender.TipSend(message);
+ return ResponseResult.JOIN_QUEUE.toMessResult();
+ }
+
+ @PostMapping("medicalRecord")
+ @ResponseBody
+ public MessageSendResult medicalRecord(String organizeName, String patientId, String applyId) {
+ log.info("进入接口-[病历复印] 病历复印可付费通知(医院通知)organizeName-{}, patientId-{} , applyId-{}",organizeName,patientId,applyId);
+ MessageSendResult check = BusinessHelper.ParamsCheck(organizeName, patientId, null,null);
+ if (!check.getErrcode().equals("0")) {
+ return check;
+ }
+ Map message = new HashMap<>();
+ message.put("tip",MessageTypeEnum.MEDICAL_RECORD.CODE);
+ message.put("organizeName", organizeName);
+ message.put("patientId", patientId);
+ message.put("applyId",applyId);
+ rabbitSender.TipSend(message);
+ return ResponseResult.JOIN_QUEUE.toMessResult();
+ }
+
+ @PostMapping("treatPlan")
+ @ResponseBody
+ public MessageSendResult treatPlan(String title, String name, String planTime,String content,String patientId, String organizeName,String remark,String url) {
+ log.info("进入接口-[诊疗计划提醒] organizeName-{}, patientId-{} , title-{},name-{},planTime-{},content-{},remark-{},url-{}",organizeName,patientId,title,name,planTime,content,remark,url);
+ MessageSendResult check = BusinessHelper.ParamsCheck(organizeName, patientId, null,null);
+ if (!check.getErrcode().equals("0")) {
+ return check;
+ }
+ if(name==null||planTime==null||content==null){
+ log.info("[诊疗计划提醒] 必填字段为空,name-{},planTime-{},content-{}",name,planTime,content);
+ return ResponseResult.PARAMETER_IS_NULL.toMessResult();
+ }
+ Map message = new HashMap<>();
+ message.put("tip",MessageTypeEnum.TREAT_PLAN.CODE);
+ message.put("title",title==null?"":title);
+ message.put("name",name);
+ message.put("patientId", patientId);
+ message.put("organizeName", organizeName);
+ message.put("planTime",planTime);
+ message.put("content",content);
+ message.put("url",url==null?"":url);
+ message.put("remark",remark==null?"":remark);
+ rabbitSender.TipSend(message);
+ return ResponseResult.JOIN_QUEUE.toMessResult();
+ }
+
+ @PostMapping("universal")
+ @ResponseBody
+ public MessageSendResult universal(String content,String patientId, String url, String organizeName, String IdCard,String doctorCode){
+ log.info("进入接口-[通用推送接口]-绑定通知,content-{},patientId-{},url-{},organizeName-{},IdCard-{},doctorCode-{}",content,patientId,url,organizeName,IdCard,doctorCode);
+ MessageSendResult check = BusinessHelper.ParamsCheck(organizeName, patientId, null,doctorCode);
+ if (!check.getErrcode().equals("0")) {
+ return check;
+ }
+ if(content==null){
+ log.info("[通用推送接口]-绑定通知, 必填字段为空");
+ return ResponseResult.PARAMETER_IS_NULL.toMessResult();
+ }
+ Map message = new HashMap<>();
+ message.put("tip",MessageTypeEnum.UNIVERSAL.CODE);
+ message.put("organizeName", organizeName);
+ message.put("patientId", patientId);
+ message.put("doctorCode",doctorCode);
+ message.put("IdCard",IdCard);
+ message.put("content",content);
+ message.put("url",url==null?"":url);
+ rabbitSender.TipSend(message);
+ return ResponseResult.JOIN_QUEUE.toMessResult();
+ }
+}
diff --git a/src/main/java/com/ynxbd/push/controller/RegisteredController.java b/src/main/java/com/ynxbd/push/controller/RegisteredController.java
index c7fe414..136cd12 100644
--- a/src/main/java/com/ynxbd/push/controller/RegisteredController.java
+++ b/src/main/java/com/ynxbd/push/controller/RegisteredController.java
@@ -9,9 +9,12 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.util.UriUtils;
import weixin.popular.bean.message.MessageSendResult;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
/**
@@ -43,16 +46,28 @@ public class RegisteredController {
log.info("openid={}, patientName={}, deptName={}, seq={}", openId, patientName, deptName, seq);
+ String patientId =patientName.split("ID:")[1];
+
+ String content =new StringBuilder()
+ .append(patientName.split("ID:")[0])
+ .append(";")
+ .append(doctor)
+ .append(";")
+ .append(deptName)
+ .append(";")
+ .append(sex)
+ .toString();
SendMessageTemplate sendMessageTemplate = SendMessageTemplate.builder()
.template_id(templateId)
- .code(12)
+ .code("12")
.doctor(doctor)
.openId(openId)
.department(deptName)
.patientName(patientName)
.hospitalName(hospital)
.first("预约挂号成功")
+ .url(IniConfig.getInstance("domain")+"wx/"+IniConfig.getInstance("weChatUIPath")+"sign-in.html?patientId="+ ("".equals(patientId)? Base64.getEncoder().encodeToString(patientId.getBytes()): "") + "&content="+Base64.getEncoder().encodeToString(UriUtils.encode(content, StandardCharsets.UTF_8.toString()).getBytes()))
.seq(seq)
.patientSex(sex)
.remarkColor("#fa4028")
diff --git a/src/main/java/com/ynxbd/push/controller/ReportController.java b/src/main/java/com/ynxbd/push/controller/ReportController.java
deleted file mode 100644
index e142816..0000000
--- a/src/main/java/com/ynxbd/push/controller/ReportController.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.ynxbd.push.controller;
-
-import com.ynxbd.push.config.IniConfig;
-import com.ynxbd.push.entity.tencent.SendMessageTemplate;
-import com.ynxbd.push.entity.tencent.WeChatResponse;
-import com.ynxbd.push.helper.DesEncryptHelper;
-import com.ynxbd.push.helper.MessageApiHelper;
-import org.apache.http.Header;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.methods.RequestBuilder;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import weixin.popular.bean.message.MessageSendResult;
-import weixin.popular.client.LocalHttpClient;
-
-import java.io.IOException;
-
-/**
- * @author 李进才
- * @ClassName ReportController
- * @Description 发送lis报告单结果推送
- * @date 2021/12/6 3:23 下午
- */
-@Controller
-public class ReportController {
-
- public static final String NOT_FIND_DATA = "40004";
- protected static Header jsonHeader;
-
- @GetMapping(value = "Report")
- @ResponseBody
- public MessageSendResult ReportTip(String patientId, String itemName, String collectTime, String patientName) throws IOException {
- String reportTemplateId = IniConfig.getInstance("lisReportTemplateId");
- String weChatUrl = IniConfig.getInstance("weChatUrl");
- HttpUriRequest httpUriRequest = RequestBuilder
- .get()
- .setHeader(jsonHeader)
- .setUri(new StringBuilder()
- .append(weChatUrl)
- .append("patient/getOpenIdsByPatientId.do").toString())
- .addParameter("patientId", patientId)
- .addParameter("algorithm", "des")
- .addParameter("isEncryptComma", "false")
- .addParameter("isLastBind", "true")
- .build();
- WeChatResponse weChatResponse = LocalHttpClient.executeJsonResult(httpUriRequest, WeChatResponse.class);
- if (weChatResponse.getData() == null) {
- MessageSendResult messageSendResult = new MessageSendResult();
- messageSendResult.setErrcode(NOT_FIND_DATA);
- messageSendResult.setMsg_status("NOT_FIND_DATA");
- return messageSendResult;
- }
- String openId = DesEncryptHelper.deCode(weChatResponse.getData());
- SendMessageTemplate sendMessageTemplate = SendMessageTemplate.builder()
- .template_id(reportTemplateId)
- .keyword1(itemName)
- .keyword2(patientName)
- .keyword3(collectTime)
- .first("您的检验报告结果已经出来了")
- .openId(openId)
- .url(new StringBuilder().append(weChatUrl).append("web/all-result.html#/lis-report-inspect").toString())
- .build();
- return MessageApiHelper.templateMessageSend(sendMessageTemplate);
- }
-}
diff --git a/src/main/java/com/ynxbd/push/controller/SendMessageController.java b/src/main/java/com/ynxbd/push/controller/SendMessageController.java
index b4a1fa2..477d4d6 100644
--- a/src/main/java/com/ynxbd/push/controller/SendMessageController.java
+++ b/src/main/java/com/ynxbd/push/controller/SendMessageController.java
@@ -2,10 +2,8 @@ package com.ynxbd.push.controller;
import com.ynxbd.push.entity.*;
-import com.ynxbd.push.entity.tencent.AllUser;
-import com.ynxbd.push.entity.tencent.SendMessageTemplate;
-import com.ynxbd.push.entity.tencent.Subscribe;
-import com.ynxbd.push.entity.tencent.WeChatUserInfo;
+import com.ynxbd.push.entity.response.ResponseResult;
+import com.ynxbd.push.entity.tencent.*;
import com.ynxbd.push.helper.DesEncryptHelper;
import com.ynxbd.push.httpRequest.tencent.WeChatDataRequest;
import com.ynxbd.push.helper.MessageApiHelper;
@@ -88,8 +86,11 @@ public class SendMessageController {
@PostMapping(value = "TemplateMessageSend")
@ResponseBody
public MessageSendResult templateMessageSend(SendMessageTemplate sendMessageTemplate) {
- if (StringUtils.isNotBlank(sendMessageTemplate.getDoctor())) {
- sendMessageTemplate.setOpenId(WeChatDataRequest.getOpenIdForDoctorCode(sendMessageTemplate.getDoctorCode()).getData());
+ if (StringUtils.isNotBlank(sendMessageTemplate.getDoctorCode())&& !StringUtils.isNotBlank(sendMessageTemplate.getOpenId())) {
+ if(WeChatDataRequest.getOpenIdForDoctorCode(sendMessageTemplate.getDoctorCode())==null){
+ return ResponseResult.DOCTOR_NOT_BIND.toMessResult();
+ }
+ sendMessageTemplate.setOpenId(WeChatDataRequest.getOpenIdForDoctorCode(sendMessageTemplate.getDoctorCode()).get(0));
}
if (StringUtils.isNotBlank(sendMessageTemplate.getTemplate_name()) && !StringUtils.isNotBlank(sendMessageTemplate.getTemplate_id())) {
sendMessageTemplate.setTemplate_id(WeChatDataRequest.getTemplateId(sendMessageTemplate.getTemplate_name()));
diff --git a/src/main/java/com/ynxbd/push/entity/response/ResponseResult.java b/src/main/java/com/ynxbd/push/entity/response/ResponseResult.java
new file mode 100644
index 0000000..1b7ca3e
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/entity/response/ResponseResult.java
@@ -0,0 +1,46 @@
+package com.ynxbd.push.entity.response;
+
+import weixin.popular.bean.message.MessageSendResult;
+
+/**
+ * @author 李进才
+ * @ClassName ResponseResult
+ * @Description TODO
+ * @date 2023/07/04 14:02:00
+ */
+public enum ResponseResult {
+
+ JOIN_QUEUE("0","已经接收消息,进入处理程序"),
+
+
+
+ ORGANIZE_IS_NULL("50001","组织机构代码无效"),
+
+ PARAMETER_IS_NULL("50003","参数无效"),
+
+
+
+ DOCTOR_NOT_BIND("50004","医生未绑定"),
+
+ CODE_INVALIDATION("40001","token无效"),
+
+ NOT_FIND_DATA("40004","未找到数据"),
+ CODE_EXPIRED("42001","token过期"),
+
+ MESSAGE_RESULT_ERROR_CODE("4002","结果返回错误");
+
+ public final String ERR_CODE;
+ public final String ERR_MSG;
+
+ ResponseResult(String errCode,String errMsg){
+ this.ERR_CODE = errCode;
+ this.ERR_MSG = errMsg;
+ }
+
+ public MessageSendResult toMessResult(){
+ MessageSendResult result = new MessageSendResult();
+ result.setErrmsg(this.ERR_MSG);
+ result.setErrcode(this.ERR_CODE);
+ return result;
+ }
+}
diff --git a/src/main/java/com/ynxbd/push/entity/tencent/AllDoctorCode.java b/src/main/java/com/ynxbd/push/entity/tencent/AllDoctorCode.java
new file mode 100644
index 0000000..22e838b
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/entity/tencent/AllDoctorCode.java
@@ -0,0 +1,17 @@
+package com.ynxbd.push.entity.tencent;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 李进才
+ * @ClassName AllDoctorCode
+ * @Description TODO
+ * @date 2023/08/03 11:35:00
+ */
+@Data
+public class AllDoctorCode {
+ private String doctCode;
+ private List openIds;
+}
diff --git a/src/main/java/com/ynxbd/push/entity/tencent/SendMessageTemplate.java b/src/main/java/com/ynxbd/push/entity/tencent/SendMessageTemplate.java
index fbe895a..3a311da 100644
--- a/src/main/java/com/ynxbd/push/entity/tencent/SendMessageTemplate.java
+++ b/src/main/java/com/ynxbd/push/entity/tencent/SendMessageTemplate.java
@@ -10,10 +10,16 @@ import lombok.experimental.Tolerate;
@Builder
@Data
public class SendMessageTemplate {
- private int code;
+ private String code;
+ //组织机构ID
+ private String organizeName;
+ // 消息类型
+ private String tip;
+ public String message_id;
public String template_id;
public String keyword1;
private String template_name;
+ private String patientId;
private String keyword1Color = "#173177";
public String keyword2;
private String keyword2Color = "#173177";
@@ -72,12 +78,15 @@ public class SendMessageTemplate {
private String followUpStaff;
private Long timestamp;
+ private int count;
/**
* 医生工号
*/
private String doctorCode;
+
+
@Tolerate
SendMessageTemplate() {
}
diff --git a/src/main/java/com/ynxbd/push/entity/tencent/WeChatAllDoctorResponse.java b/src/main/java/com/ynxbd/push/entity/tencent/WeChatAllDoctorResponse.java
new file mode 100644
index 0000000..07a2403
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/entity/tencent/WeChatAllDoctorResponse.java
@@ -0,0 +1,19 @@
+package com.ynxbd.push.entity.tencent;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 李进才
+ * @ClassName WeChatAllDoctResponse
+ * @Description TODO
+ * @date 2023/08/03 10:30:00
+ */
+@Data
+public class WeChatAllDoctorResponse {
+ private String code;
+ private List data;
+ private String message;
+ private Boolean success;
+}
diff --git a/src/main/java/com/ynxbd/push/entity/tencent/WeChatResponse.java b/src/main/java/com/ynxbd/push/entity/tencent/WeChatResponse.java
index 47f2dbc..53d308f 100644
--- a/src/main/java/com/ynxbd/push/entity/tencent/WeChatResponse.java
+++ b/src/main/java/com/ynxbd/push/entity/tencent/WeChatResponse.java
@@ -2,6 +2,8 @@ package com.ynxbd.push.entity.tencent;
import lombok.Data;
+import java.util.List;
+
/**
* @author 李进才
* @ClassName WeChatResponse
@@ -12,6 +14,7 @@ import lombok.Data;
@Data
public class WeChatResponse {
private String code;
- private String data;
+ private List data;
private String message;
+ private Boolean success;
}
diff --git a/src/main/java/com/ynxbd/push/entity/type/MessageTypeEnum.java b/src/main/java/com/ynxbd/push/entity/type/MessageTypeEnum.java
new file mode 100644
index 0000000..695938a
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/entity/type/MessageTypeEnum.java
@@ -0,0 +1,28 @@
+package com.ynxbd.push.entity.type;
+
+/**
+ * @author 李进才
+ * @ClassName MessageTypeEnum
+ * @Description TODO
+ * @date 2023/07/04 14:39:00
+ */
+public enum MessageTypeEnum {
+
+ REPORT_TIP("ReportTip","检验检查报告通知"),
+ QUEUE_TIP("QueueTip","排队叫号提醒"),
+ MEDICAL_RECORD("MedicalRecord","病历复印"),
+ TREAT_PLAN("treatPlan","诊疗计划提醒"),
+
+ UNIVERSAL("Universal","通用模版推送-绑定通知");
+
+
+ public final String CODE;
+ public final String MESSAGE;
+
+
+ MessageTypeEnum(String code,String message){
+ this.CODE=code;
+ this.MESSAGE = message;
+ }
+
+}
diff --git a/src/main/java/com/ynxbd/push/entity/type/OrganizeTypeEnum.java b/src/main/java/com/ynxbd/push/entity/type/OrganizeTypeEnum.java
new file mode 100644
index 0000000..097d061
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/entity/type/OrganizeTypeEnum.java
@@ -0,0 +1,30 @@
+package com.ynxbd.push.entity.type;
+
+/**
+ * @author 李进才
+ * @ClassName OrganizeTypeEnum
+ * @Description TODO
+ * @date 2023/07/04 15:20:00
+ */
+public enum OrganizeTypeEnum {
+
+ HIS("AE8EB2249EDD9093","xbd_his","公司内部对接时使用代码,包含pacs等"),
+
+
+ WEI_MAI("D9113BC820E4C6FF","微脉对接诊疗计划提醒","芒市妇幼微脉对接诊疗计划提醒"),
+
+ CVMS("D7FAEFB46E8F5FEF","危机值管理系统","新八达危机值管理系统"),
+
+ HONGHE01("","深圳市理邦精密仪器股份有限公司","智慧产科系统");
+
+ public final String CODE;
+ public final String NAME;
+
+ public final String DESCRIPTION;
+
+ OrganizeTypeEnum(String code,String name,String description){
+ this.CODE = code;
+ this.NAME = name;
+ this.DESCRIPTION = description;
+ }
+}
diff --git a/src/main/java/com/ynxbd/push/entity/xbd/his/HIsWorkLoad.java b/src/main/java/com/ynxbd/push/entity/xbd/his/HIsWorkLoad.java
new file mode 100644
index 0000000..a4b5839
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/entity/xbd/his/HIsWorkLoad.java
@@ -0,0 +1,16 @@
+package com.ynxbd.push.entity.xbd.his;
+
+import lombok.Data;
+
+/**
+ * @author 李进才
+ * @ClassName WorkLoad
+ * @Description description
+ * @date 2022/8/3 15:06
+ */
+@Data
+public class HIsWorkLoad {
+ private String doc_code;
+ private String doc_name;
+ private String description;
+}
diff --git a/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoad.java b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoad.java
new file mode 100644
index 0000000..61302a6
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoad.java
@@ -0,0 +1,16 @@
+package com.ynxbd.push.entity.xbd.wx;
+
+import lombok.Data;
+
+/**
+ * @author 李进才
+ * @ClassName WorkLoad
+ * @Description description
+ * @date 2022/8/3 15:28
+ */
+@Data
+public class WorkLoad {
+ private String doctCode;
+ private String token;
+ private String openid;
+}
diff --git a/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadData.java b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadData.java
new file mode 100644
index 0000000..16c7293
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadData.java
@@ -0,0 +1,17 @@
+package com.ynxbd.push.entity.xbd.wx;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 李进才
+ * @ClassName WorkLoad
+ * @Description description
+ * @date 2022/8/3 15:26
+ */
+@Data
+public class WorkLoadData {
+ private String link;
+ private List list;
+}
diff --git a/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadResponse.java b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadResponse.java
new file mode 100644
index 0000000..cbf4e79
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadResponse.java
@@ -0,0 +1,16 @@
+package com.ynxbd.push.entity.xbd.wx;
+
+import lombok.Data;
+
+/**
+ * @author 李进才
+ * @ClassName WorkLoadResponse
+ * @Description description
+ * @date 2022/8/3 15:32
+ */
+@Data
+public class WorkLoadResponse {
+ private String code;
+ private String message;
+ private WorkLoadData data;
+}
diff --git a/src/main/java/com/ynxbd/push/helper/AesCodeHelper.java b/src/main/java/com/ynxbd/push/helper/AesCodeHelper.java
new file mode 100644
index 0000000..03a9a39
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/helper/AesCodeHelper.java
@@ -0,0 +1,79 @@
+package com.ynxbd.push.helper;
+
+
+import org.apache.commons.codec.binary.Hex;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * AES加密算法
+ */
+public class AesCodeHelper {
+
+ private final static String KEY = "ynxbdysdssjtwrin";
+
+ private final static String IV = "ynxbdqsdsbjtwrin";
+
+ public static String enCode(String data) {
+ if (data == null) {
+ return null;
+ }
+ return encryptHex(data, KEY, IV);
+ }
+
+ public static String deCode(String data) {
+ if (data == null) {
+ return null;
+ }
+ return decryptHex(data, KEY, IV);
+ }
+
+
+ public static String decryptHex(String data, String key, String iv) {
+ try {
+ SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
+ Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+ cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)));
+
+ return new String(cipher.doFinal(Hex.decodeHex(data.toCharArray())));
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * Aes加密算法( Hex)
+ *
+ * @param data 加密数据
+ * @param key 密钥(16位)
+ * @param iv 密钥偏移量
+ * @return 加密后的数据
+ */
+ public static String encryptHex(String data, String key, String iv) {
+ try {
+ if (key == null || key.length() != 16) {
+ throw new Exception("Key长度不是16位");
+ }
+
+ Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); //"算法/模式/补码方式"
+ cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"), new IvParameterSpec(iv.getBytes()));
+ byte[] encrypted = cipher.doFinal(data.getBytes());
+ String hexPass = Hex.encodeHexString(encrypted);
+ return hexPass.toUpperCase();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+
+
+// public static void main(String[] args) throws Exception {
+// String a = decryptHex("", "wsqysqsdssjtwmaa", "xbzynydykkxxkkbb");
+// System.out.println(a);
+// }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ynxbd/push/helper/BusinessHelper.java b/src/main/java/com/ynxbd/push/helper/BusinessHelper.java
new file mode 100644
index 0000000..f232e11
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/helper/BusinessHelper.java
@@ -0,0 +1,25 @@
+package com.ynxbd.push.helper;
+
+import com.ynxbd.push.entity.response.ResponseResult;
+import weixin.popular.bean.message.MessageSendResult;
+
+/**
+ * @author 李进才
+ * @ClassName BusinessHelper
+ * @Description TODO
+ * @date 2023/05/11 11:54:00
+ */
+public class BusinessHelper {
+
+ public static MessageSendResult ParamsCheck(String organizeName ,String patientId,String idCard,String doctorCode ) {
+ MessageSendResult messageSendResult = new MessageSendResult();
+ if(patientId==null&&idCard==null&&doctorCode==null){
+ return ResponseResult.PARAMETER_IS_NULL.toMessResult();
+ }
+ if(DesEncryptHelper.deCode(organizeName).equals("error:null")){
+ return ResponseResult.ORGANIZE_IS_NULL.toMessResult();
+ }
+ messageSendResult.setErrcode("0");
+ return messageSendResult;
+ }
+}
diff --git a/src/main/java/com/ynxbd/push/helper/DesEncryptHelper.java b/src/main/java/com/ynxbd/push/helper/DesEncryptHelper.java
index e2402d4..f1fd109 100644
--- a/src/main/java/com/ynxbd/push/helper/DesEncryptHelper.java
+++ b/src/main/java/com/ynxbd/push/helper/DesEncryptHelper.java
@@ -10,6 +10,9 @@
*/
package com.ynxbd.push.helper;
+import java.io.File;
+import java.util.regex.Matcher;
+
/**
* @author Administrator
* @version v1.0.0
@@ -69,7 +72,10 @@ public class DesEncryptHelper {
}
public static void main(String[] args) {
- System.out.println(DesEncryptHelper.enCode("oeso-t5DIu2qpb0LJaKeJ06TRgzw", KEY));
- System.out.println(DesEncryptHelper.deCode("19B20D16C09C4064DF385EDB1863A99B0C05CB8D5DA99C08B4C7AC6B6FAE028D89C90AAE3F5F397CDD177F25230726672B9441E369871608D74A40FD40F7EA3C967D1FBFC1ECCBA872A968C523FCB190A9B959AC822536151A508AA491ECF92B109C96E7B304C84284A45A61C476BA9BC833E2D178ADF27E4984AE325A602F6C08070D47695540349CB5F03072B586FB98009E083E8A20A4542BF29EA0BD120B", KEY));
+ String test = "昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术:61人次;微创手术:16人次;四级手术:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512;手术:8816人次,占比:28;四级手术占比:19.01;微创手术占比:17.35;";
+ System.out.println(test.replaceAll("\\\\\\\\r", "\\\\r"));
+ System.out.println(DesEncryptHelper.enCode("xbd_CVMS", KEY));
+
+ System.out.println(DesEncryptHelper.deCode("C23A7500D2C35F9A85B72795B86F02AFD62A5ECBD06DC050DF47EFA26AA846E3E3FF998FFA576283C021712DD1CAA7EEF74898A8CDFE9ABA8C06C1851574CB802FA096B4B0D8ED791559DEEDFE0BD497AC5365E6370223EF3D706F0BC2427619C762C77B776510D566A36F439CB579A5C55674435F0D800BC44B3299BF484B716D121601D32E26E2", KEY));
}
}
diff --git a/src/main/java/com/ynxbd/push/helper/HisResultFormat.java b/src/main/java/com/ynxbd/push/helper/HisResultFormat.java
new file mode 100755
index 0000000..dd70df5
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/helper/HisResultFormat.java
@@ -0,0 +1,804 @@
+package com.ynxbd.push.helper;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ynxbd.push.entity.xbd.his.HIsWorkLoad;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+public class HisResultFormat {
+
+ @Data
+ @NoArgsConstructor
+ @ToString
+ public static class TestDoctor {
+ private String docCode;
+ private String docName;
+ }
+
+
+ public static void main(String[] args) {
+ String json = "{\n" +
+ " \"Code\": \"200\",\n" +
+ " \"Msg\": \"SUCCESS\",\n" +
+ " \"Data\": [\n" +
+ " {\n" +
+ " \"doc_code\": \"0002\",\n" +
+ " \"doc_name\": \"李卫\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0003\",\n" +
+ " \"doc_name\": \"杨淑\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0005\",\n" +
+ " \"doc_name\": \"马晓琳\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0011\",\n" +
+ " \"doc_name\": \"蔡连勇\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0017\",\n" +
+ " \"doc_name\": \"江为民\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0019\",\n" +
+ " \"doc_name\": \"何丽芬\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0023\",\n" +
+ " \"doc_name\": \"龙红\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0030\",\n" +
+ " \"doc_name\": \"向梅\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0036\",\n" +
+ " \"doc_name\": \"杨聪\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0044\",\n" +
+ " \"doc_name\": \"汤进伟\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0050\",\n" +
+ " \"doc_name\": \"王跃强\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0054\",\n" +
+ " \"doc_name\": \"刘炜\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0059\",\n" +
+ " \"doc_name\": \"马刚\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0062\",\n" +
+ " \"doc_name\": \"普伦庆\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0066\",\n" +
+ " \"doc_name\": \"佘艳军\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0068\",\n" +
+ " \"doc_name\": \"孔洁\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0069\",\n" +
+ " \"doc_name\": \"赵悦涛\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0072\",\n" +
+ " \"doc_name\": \"崔金鹏\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0073\",\n" +
+ " \"doc_name\": \"李艳华\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0074\",\n" +
+ " \"doc_name\": \"王俊青\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0114\",\n" +
+ " \"doc_name\": \"霍松\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0134\",\n" +
+ " \"doc_name\": \"丁俊\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0151\",\n" +
+ " \"doc_name\": \"马锦霞\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0156\",\n" +
+ " \"doc_name\": \"陈朝明\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"018 \",\n" +
+ " \"doc_name\": \"张娜\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0194\",\n" +
+ " \"doc_name\": \"钟兴伟\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0199\",\n" +
+ " \"doc_name\": \"沈曼\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0208\",\n" +
+ " \"doc_name\": \"马韬\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0226\",\n" +
+ " \"doc_name\": \"卢俊\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0241\",\n" +
+ " \"doc_name\": \"蒙艳\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0248\",\n" +
+ " \"doc_name\": \"王璟\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0255\",\n" +
+ " \"doc_name\": \"赵德斌\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0269\",\n" +
+ " \"doc_name\": \"普福顺\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0469\",\n" +
+ " \"doc_name\": \"谭永兴\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0473\",\n" +
+ " \"doc_name\": \"白云辉\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0475\",\n" +
+ " \"doc_name\": \"苗蔚\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0705\",\n" +
+ " \"doc_name\": \"吉惠\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0731\",\n" +
+ " \"doc_name\": \"徐俊\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0805\",\n" +
+ " \"doc_name\": \"王长林\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0808\",\n" +
+ " \"doc_name\": \"董艳玲\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1025\",\n" +
+ " \"doc_name\": \"代建能\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1118\",\n" +
+ " \"doc_name\": \"赵悦涛*\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1135\",\n" +
+ " \"doc_name\": \"李桂芬\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1233\",\n" +
+ " \"doc_name\": \"毕燕\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1251\",\n" +
+ " \"doc_name\": \"普虹丽(康\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1349\",\n" +
+ " \"doc_name\": \"蒋俊**\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1460\",\n" +
+ " \"doc_name\": \"赵艳红\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1462\",\n" +
+ " \"doc_name\": \"赵林\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1491\",\n" +
+ " \"doc_name\": \"白建平\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1618\",\n" +
+ " \"doc_name\": \"王蕾\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1669\",\n" +
+ " \"doc_name\": \"胡琳\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1688\",\n" +
+ " \"doc_name\": \"张丽红*\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1737\",\n" +
+ " \"doc_name\": \"沈海荣\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1845\",\n" +
+ " \"doc_name\": \"陈淑媛*\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1951\",\n" +
+ " \"doc_name\": \"赵永贵*\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2079\",\n" +
+ " \"doc_name\": \"田劲猛*\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2280\",\n" +
+ " \"doc_name\": \"赵永贵.\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2337\",\n" +
+ " \"doc_name\": \"郭鹏\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2390\",\n" +
+ " \"doc_name\": \"普兴林\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2423\",\n" +
+ " \"doc_name\": \"魏进云\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2495\",\n" +
+ " \"doc_name\": \"李仁伟\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2641\",\n" +
+ " \"doc_name\": \"赵青\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2676\",\n" +
+ " \"doc_name\": \"袁乔英\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2687\",\n" +
+ " \"doc_name\": \"杨金有\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2747\",\n" +
+ " \"doc_name\": \"何黎\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2754\",\n" +
+ " \"doc_name\": \"李雪梅.\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2784\",\n" +
+ " \"doc_name\": \"张艳.\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2959\",\n" +
+ " \"doc_name\": \"申永林*\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"3553\",\n" +
+ " \"doc_name\": \"孔洁.\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"3717\",\n" +
+ " \"doc_name\": \"王俊青.*\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"3764\",\n" +
+ " \"doc_name\": \"蒙艳.\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"4041\",\n" +
+ " \"doc_name\": \"李始秀\",\n" +
+ " \"titleName\": \"科主任\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0274\",\n" +
+ " \"doc_name\": \"刘翠\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0278\",\n" +
+ " \"doc_name\": \"龙莉\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0297\",\n" +
+ " \"doc_name\": \"毛颖懿\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0313\",\n" +
+ " \"doc_name\": \"王雯秀\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0314\",\n" +
+ " \"doc_name\": \"杨金凤\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0315\",\n" +
+ " \"doc_name\": \"白云芬\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0323\",\n" +
+ " \"doc_name\": \"骆钰玺\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0333\",\n" +
+ " \"doc_name\": \"袁慧\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0339\",\n" +
+ " \"doc_name\": \"王雪华\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0355\",\n" +
+ " \"doc_name\": \"卢宝丽\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0361\",\n" +
+ " \"doc_name\": \"胡海燕\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0381\",\n" +
+ " \"doc_name\": \"高云丽\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0393\",\n" +
+ " \"doc_name\": \"柏雪\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0477\",\n" +
+ " \"doc_name\": \"张翠兰\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0491\",\n" +
+ " \"doc_name\": \"赵文娟\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0521\",\n" +
+ " \"doc_name\": \"钱润润\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0604\",\n" +
+ " \"doc_name\": \"何劲梅\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0608\",\n" +
+ " \"doc_name\": \"官丽亚\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"0789\",\n" +
+ " \"doc_name\": \"沈成荣\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1286\",\n" +
+ " \"doc_name\": \"黄梦诗\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1423\",\n" +
+ " \"doc_name\": \"高姝\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1453\",\n" +
+ " \"doc_name\": \"高丽萍\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1687\",\n" +
+ " \"doc_name\": \"邹婷\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"1985\",\n" +
+ " \"doc_name\": \"王迪一\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2131\",\n" +
+ " \"doc_name\": \"孙海燕\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2175\",\n" +
+ " \"doc_name\": \"邓延华\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2461\",\n" +
+ " \"doc_name\": \"罗艳\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2513\",\n" +
+ " \"doc_name\": \"马兰兰\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2557\",\n" +
+ " \"doc_name\": \"郑虞华.\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2588\",\n" +
+ " \"doc_name\": \"李金艳\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2602\",\n" +
+ " \"doc_name\": \"蒋金芳\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2610\",\n" +
+ " \"doc_name\": \"蒋艳梅\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2651\",\n" +
+ " \"doc_name\": \"李凤.\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2696\",\n" +
+ " \"doc_name\": \"易玲\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"2710\",\n" +
+ " \"doc_name\": \"李艳.\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"3241\",\n" +
+ " \"doc_name\": \"罗效萍\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"doc_code\": \"3550\",\n" +
+ " \"doc_name\": \"王迪一.\",\n" +
+ " \"titleName\": \"护士长\",\n" +
+ " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" +
+ " }\n" +
+ " ],\n" +
+ " \"Note\": {\n" +
+ " \"funcName\": \"DeanSearch_wechatDataPush\",\n" +
+ " \"funcNote\": \"微信推送数据\",\n" +
+ " \"connTime\": 30,\n" +
+ " \"inParams\": {},\n" +
+ " \"isListOutParams\": true,\n" +
+ " \"outParams\": {\n" +
+ " \"doc_code\": \"医生代码\",\n" +
+ " \"doc_name\": \"医生名称\",\n" +
+ " \"titleName\": \"职位\",\n" +
+ " \"description\": \"推送信息描述\"\n" +
+ " }\n" +
+ " }\n" +
+ "}";
+
+ String respData = getRespData(json);
+ List testDoctors = jsonToList(respData, HIsWorkLoad.class);
+ System.out.println(testDoctors);
+
+ List doctCodeList = jsonToList(respData, "docCode");
+ System.out.println(doctCodeList);
+ }
+
+ /**
+ * 获取请求中的数据
+ */
+ public static String getRespData(String respData) {
+ if (respData == null) {
+ return null;
+ }
+ JSONObject jsonResp = JSON.parseObject(respData);
+ String code = jsonResp.getString("Code");
+ String message = jsonResp.getString("Msg");
+ if ("200".equals(code) && "SUCCESS".equals(message)) {
+ String data = jsonResp.getString("Data");
+ return "".equals(data) ? null : data;
+ }
+ log.info("[请求失败]code={}, message={}", code, message);
+ return null;
+ }
+
+ public static List jsonToList(String data, Class clazz) {
+ if (data == null) {
+ return new ArrayList<>();
+ }
+ String jsonStr = JSON.toJSONString(data);
+ if ("".equals(jsonStr)) {
+ return new ArrayList<>();
+ }
+ try {
+ return JSON.parseArray(data, clazz);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ return new ArrayList<>();
+ }
+ }
+
+ /**
+ * 获取对象数组中某个名称的值,加入集合
+ *
+ * @param data json数据
+ * @param name 属性名称
+ * @return 属性List
+ */
+ public static List jsonToList(String data, String name) {
+ List resultList = new ArrayList<>();
+ if (data == null) {
+ return resultList;
+ }
+ String jsonStr = JSON.toJSONString(data);
+ if ("".equals(jsonStr)) {
+ return resultList;
+ }
+
+ try {
+ JSONArray jsonArr = JSON.parseArray(data);
+ JSONObject itemObj;
+ String val;
+ for (int i = 0; i < jsonArr.size(); i++) {
+ itemObj = jsonArr.getJSONObject(i);
+ if (itemObj == null) {
+ continue;
+ }
+ val = itemObj.getString(name);
+ if (val != null && !"".equals(val)) {
+ resultList.add(val);
+ }
+ }
+ return resultList;
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ return resultList;
+ }
+
+ /**
+ * json转实体类
+ * @param data 数据
+ * @param clazz 类型
+ * @return 对象
+ */
+ public static T jsonToBean(String data, Class clazz) {
+ if (data == null) {
+ return null;
+ }
+ String jsonStr = JSON.toJSONString(data);
+ if ("".equals(jsonStr)) {
+ return null;
+ }
+ try {
+ return JSON.parseObject(data, clazz);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ return null;
+ }
+ }
+
+}
diff --git a/src/main/java/com/ynxbd/push/helper/MessageApiHelper.java b/src/main/java/com/ynxbd/push/helper/MessageApiHelper.java
index 48cbfc1..ea0ae3f 100644
--- a/src/main/java/com/ynxbd/push/helper/MessageApiHelper.java
+++ b/src/main/java/com/ynxbd/push/helper/MessageApiHelper.java
@@ -2,9 +2,12 @@ package com.ynxbd.push.helper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.sun.jndi.toolkit.url.UrlUtil;
import com.ynxbd.push.config.IniConfig;
import com.ynxbd.push.entity.*;
+import com.ynxbd.push.entity.response.ResponseResult;
import com.ynxbd.push.entity.tencent.*;
+import com.ynxbd.push.httpRequest.tencent.WeChatDataRequest;
import com.ynxbd.push.httpRequest.xbd.wx.WxCacheRequest;
import com.ynxbd.push.thread.ThreadConfig;
import lombok.SneakyThrows;
@@ -17,6 +20,7 @@ import org.apache.http.concurrent.FutureCallback;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.springframework.beans.BeanUtils;
+import org.springframework.web.util.UriUtils;
import weixin.popular.api.API;
import weixin.popular.api.MessageAPI;
import weixin.popular.api.UserAPI;
@@ -50,8 +54,6 @@ public class MessageApiHelper {
public static final Integer EVERY_OPENID_COUNT = 10000;
- public static final String CODE_INVALIDATION = "40001";
- public static final String CODE_EXPIRED = "42001";
public static final String MESSAGE_RESULT_ERROR_CODE = "4002";
/**
@@ -62,7 +64,7 @@ public class MessageApiHelper {
*/
public static MessageSendResult templateMessageSend(SendMessageTemplate template) {
MessageSendResult messageSendResult = templateMessage(template);
- log.info("TenCent Return Message" + messageSendResult.getErrcode());
+ log.info("消息发送状态:腾讯返回-{},messageId-{},openId-{}", messageSendResult.getErrcode(),template.getMessage_id(),template.getOpenId());
return messageSendResult;
}
@@ -74,13 +76,14 @@ public class MessageApiHelper {
*/
public static MessageSendResult templateMessage(SendMessageTemplate sendMessageTemplate) {
try {
+ sendMessageTemplate.setUrl(UriUtils.decode(sendMessageTemplate.getUrl(),StandardCharsets.UTF_8.toString()));
String jsonMessage = TemplateSelectHelper.select(sendMessageTemplate);
+ jsonMessage = jsonMessage.replaceAll("\\\\\\\\r", "\\\\r");
+ jsonMessage = jsonMessage.replaceAll("\\\\\\\\n", "\\\\n");
log.info("SendTenCentJson:{}", jsonMessage);
return templateMessageSend(jsonMessage);
} catch (Exception e) {
- MessageSendResult messageSendResult = new MessageSendResult();
- messageSendResult.setErrcode(MESSAGE_RESULT_ERROR_CODE);
- return messageSendResult;
+ return ResponseResult.MESSAGE_RESULT_ERROR_CODE.toMessResult();
}
}
@@ -94,7 +97,7 @@ public class MessageApiHelper {
MessageSendResult result = LocalHttpClient.executeJsonResult(httpUriRequest, MessageSendResult.class);
String errCode = result.getErrcode();
- if (CODE_INVALIDATION.equals(errCode) || CODE_EXPIRED.equals(errCode)) {
+ if (ResponseResult.CODE_INVALIDATION.ERR_CODE.equals(errCode) || ResponseResult.CODE_EXPIRED.ERR_CODE.equals(errCode)) {
String errMsg = result.getErrmsg();
log.error("[推送]请求失败 errCode={}, errMsg={}", errCode, errMsg);
}
@@ -118,9 +121,7 @@ public class MessageApiHelper {
return MessageAPI.messageMassSendall(accessToken, textMessage);
} catch (Exception e) {
log.info(e.getMessage());
- MessageSendResult messageSendResult = new MessageSendResult();
- messageSendResult.setErrcode(MESSAGE_RESULT_ERROR_CODE);
- return messageSendResult;
+ return ResponseResult.MESSAGE_RESULT_ERROR_CODE.toMessResult();
}
}
@@ -143,12 +144,105 @@ public class MessageApiHelper {
String jsonTestMessage = new ObjectMapper().writeValueAsString(testMessage);
return messageMassSend(jsonTestMessage);
} catch (Exception e) {
- MessageSendResult messageSendResult = new MessageSendResult();
- messageSendResult.setErrcode(MESSAGE_RESULT_ERROR_CODE);
- return messageSendResult;
+ return ResponseResult.MESSAGE_RESULT_ERROR_CODE.toMessResult();
}
}
+ /**
+ * 根据患者ID或者医生ID推送模版消息
+ * @param organizeName
+ * @param idCard
+ * @param title
+ * @param patientId
+ * @param doctorCode
+ * @param first
+ * @param keyword1
+ * @param keyword2
+ * @param keyword3
+ * @param keyword4
+ * @param keyword5
+ * @param remark
+ * @param url
+ * @return
+ */
+ public static MessageSendResult TemplateMessageForCode(String organizeName,String code, String idCard, String title, String patientId, String doctorCode, String first, String keyword1, String keyword2, String keyword3, String keyword4, String keyword5, String remark, String url,String messageId){
+ if(patientId==null&&idCard==null&&doctorCode==null){
+ log.info("[{}]参数无效",title);
+ return ResponseResult.PARAMETER_IS_NULL.toMessResult();
+ }
+ if(DesEncryptHelper.deCode(organizeName).equals("error:null")){
+ log.info("[{}]组织机构代码无效,organizeName-{}",title,organizeName);
+ return ResponseResult.ORGANIZE_IS_NULL.toMessResult();
+ }
+ String reportTemplateId = WeChatDataRequest.getTemplateId(title);
+ if("绑定通知".equals(title)&&reportTemplateId==null){
+ reportTemplateId = WeChatDataRequest.getTemplateId("医院通知");
+ }
+ if(IniConfig.getInstance("templateVersion")==null){
+ code = "";
+ }
+ if(doctorCode!=null){
+ List allDoctorCodeList = WeChatDataRequest.getAllOpenIdForDoctorCode(doctorCode);
+ if (allDoctorCodeList.isEmpty()){
+ log.info("[{}]{}未绑定微官网,doctorCode:{}",title,DesEncryptHelper.deCode(organizeName),doctorCode);
+ return ResponseResult.NOT_FIND_DATA.toMessResult();
+ }
+ for (String interfaceOpenId:allDoctorCodeList){
+ String openId = AesCodeHelper.deCode(interfaceOpenId);
+ SendMessageTemplate sendMessageTemplate = SendMessageTemplate.builder()
+ .template_id(reportTemplateId)
+ .first(first)
+ .code(code)
+ .message_id(messageId)
+ .keyword1(keyword1)
+ .keyword2(keyword2)
+ .keyword3(keyword3)
+ .keyword4(keyword4)
+ .keyword5(keyword5)
+ .remark(remark)
+ .openId(openId)
+ .url(url)
+ .build();
+ MessageSendResult messageSendResult = templateMessageSend(sendMessageTemplate);
+ log.info("[{}]{}医生账号消息推送,推送结果代码-{},推送结果-{}",title,DesEncryptHelper.deCode(organizeName),messageSendResult.getErrcode(),messageSendResult.getErrmsg());
+ }
+ return ResponseResult.JOIN_QUEUE.toMessResult();
+ }
+ log.info("[外部组织对接推送]"+DesEncryptHelper.deCode(organizeName)+"发送"+title+"消息");
+ String weChatUrl ="http://127.0.0.1/wx/";
+ HttpUriRequest httpUriRequest = RequestBuilder
+ .get()
+ .setHeader(jsonHeader)
+ .setUri(new StringBuilder()
+ .append(weChatUrl)
+ .append(patientId!=null?"patient/getOpenIdsByPatientId.do":"patient/getOpenIdsByCardNo.do").toString())
+ .addParameter(patientId!=null?"patientId":"cardNo", patientId!=null?patientId:idCard)
+ .addParameter("algorithm", "des")
+ .addParameter("isEncryptComma", "false")
+ .addParameter("isLastBind", "true")
+ .build();
+ WeChatResponse weChatResponse = LocalHttpClient.executeJsonResult(httpUriRequest, WeChatResponse.class);
+ if (weChatResponse.getData() == null) {
+ return ResponseResult.NOT_FIND_DATA.toMessResult();
+ }
+ String openId = DesEncryptHelper.deCode(weChatResponse.getData().get(0));
+ SendMessageTemplate sendMessageTemplate = SendMessageTemplate.builder()
+ .template_id(reportTemplateId)
+ .first(first)
+ .code(code)
+ .keyword1(keyword1)
+ .message_id(messageId)
+ .keyword2(keyword2)
+ .keyword3(keyword3)
+ .keyword4(keyword4)
+ .keyword5(keyword5)
+ .remark(remark)
+ .openId(openId)
+ .url(url)
+ .build();
+ return templateMessageSend(sendMessageTemplate);
+ }
+
/**
* 通过客服的方式发送链接信息给用户
*
@@ -173,9 +267,7 @@ public class MessageApiHelper {
String jsonTestMessage = new ObjectMapper().writeValueAsString(linkMessage);
return messageMassSend(jsonTestMessage);
} catch (Exception e) {
- MessageSendResult messageSendResult = new MessageSendResult();
- messageSendResult.setErrcode(MESSAGE_RESULT_ERROR_CODE);
- return messageSendResult;
+ return ResponseResult.MESSAGE_RESULT_ERROR_CODE.toMessResult();
}
}
diff --git a/src/main/java/com/ynxbd/push/helper/RedisHelper.java b/src/main/java/com/ynxbd/push/helper/RedisHelper.java
new file mode 100644
index 0000000..635f5e7
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/helper/RedisHelper.java
@@ -0,0 +1,63 @@
+package com.ynxbd.push.helper;
+
+import com.alibaba.fastjson.JSONObject;
+import io.lettuce.core.RedisClient;
+import io.lettuce.core.api.StatefulRedisConnection;
+import io.lettuce.core.api.sync.RedisCommands;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author 李进才
+ * @ClassName RedisHelper
+ * @Description TODO
+ * @date 2023/05/06 16:33:00
+ */
+public class RedisHelper {
+
+ private static final String PASSWORD = "wx.xbd.cn";
+ private static final String HOST = "127.0.0.1";
+ private static final String PORT = "6379";
+ private static RedisCommands redis;
+
+ private static StatefulRedisConnection connection;
+ private static RedisClient redisClient;
+
+
+ private RedisHelper() {
+ redisClient = RedisClient.create("redis://"+PASSWORD+"@"+HOST+":"+PORT+"/0");
+ connection = redisClient.connect();
+ redis = connection.sync();
+ }
+ public static RedisHelper getRedis() {
+ return Inner.instance;
+ }
+ private static class Inner{
+ private static final RedisHelper instance = new RedisHelper();
+ }
+
+ public String set(String name, String key, Integer expire){
+ String result = redis.set(name,key);
+ redis.expire(name,expire);
+ return result;
+ }
+
+ public String get(String name){
+ return redis.get(name);
+ }
+ public void close() {
+ connection.close();
+ redisClient.shutdown();
+ }
+
+ public static void main(String[] args) {
+ Map params = new HashMap<>();
+ params.put("description", "昨日门诊2217人;非核酸门诊2184人;在院1188人;入院156人;出院186人;手术16台;微创手术4台;四级手术1台;\\\\r\\\\n今年截至昨日门诊286674人;非核酸门诊271307人;出院20271人;实际开放床1224张;病床使用率97.03%;手术5482台,占比28%;四级手术占比20.38%;微创手术占比18.02%;");
+ params.put("url", "https://wx.hhzyy.com//wx3302/tickets/GetPage?t=A95C0ACF523B396D48857B85B82D3A47CA3DC877FEAAE4C6AB1A462C0F18D6BA5757732FA6B8C07234D62391B46725A05152BA217FAB03BAAFEA62592BE23CA74940A3A2CC82F6C4FEA21A67140C1348B1C523EA989469DED47DFD0EE2D029FF9B52C8877A18BF0FC158125764E615376029DD33461D4083C1D1A0CF78FFEAC36F6836E1BB05E7779D165D315EAEEA9EDA71819D3F356436BF59C21FB29EBA4C83DB68514B07BFC951C432A0923F5DD71457F9A9A424400ADB506C43617FF83DEDAB1E337567927557D704325AF06160966B0A66B6F1C5470A3776ACC30730C65994D3B3AB879A728C07268B14E6B7371B1D3EE533018A92C8E871A85C6887285D3A39A660CD87AB6CD5FE759E87445228D519359B1D8C925BECD80FC466FA6C");
+ for(int i = 0; i<200; i++){
+ System.out.println(Integer.toString(i) +":"+ RedisHelper.getRedis().set(Integer.toString(i), JSONObject.toJSONString(params),86400));
+ }
+ RedisHelper.getRedis().close();
+ }
+}
diff --git a/src/main/java/com/ynxbd/push/helper/RequestHelper.java b/src/main/java/com/ynxbd/push/helper/RequestHelper.java
index 16d414d..2e17962 100644
--- a/src/main/java/com/ynxbd/push/helper/RequestHelper.java
+++ b/src/main/java/com/ynxbd/push/helper/RequestHelper.java
@@ -79,6 +79,8 @@ public class RequestHelper extends SimpleClientHttpRequestFactory {
}
+
+
/**
* 向目的URL发送get请求
*
diff --git a/src/main/java/com/ynxbd/push/helper/StringHelper.java b/src/main/java/com/ynxbd/push/helper/StringHelper.java
new file mode 100644
index 0000000..82ab07e
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/helper/StringHelper.java
@@ -0,0 +1,39 @@
+package com.ynxbd.push.helper;
+
+import org.springframework.util.ObjectUtils;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @author 李进才
+ * @ClassName StringHelper
+ * @Description description
+ * @date 2023/1/28 09:41
+ */
+public class StringHelper {
+ /**
+ * 数字倒序排列
+ *
+ * @param num 被排序数字
+ */
+ public static String numDesc(String num) {
+ StringBuilder sb = new StringBuilder();
+ if (ObjectUtils.isEmpty(num)) {
+ return null;
+ }
+ for (int i = num.length() - 1; i >= 0; i--) {
+ sb.append(num.charAt(i));
+ }
+ return sb.toString();
+ }
+ /**
+ * BASE64加密
+ *
+ * @param data 需要加密的字符串
+ * @return 加密后的字符串
+ */
+ public static String encode(String data) {
+ return java.util.Base64.getEncoder().encodeToString(data.getBytes(StandardCharsets.UTF_8));
+ }
+
+}
diff --git a/src/main/java/com/ynxbd/push/helper/TemplateAllKeyWordJson.java b/src/main/java/com/ynxbd/push/helper/TemplateAllKeyWordJson.java
index aecc363..c81d901 100644
--- a/src/main/java/com/ynxbd/push/helper/TemplateAllKeyWordJson.java
+++ b/src/main/java/com/ynxbd/push/helper/TemplateAllKeyWordJson.java
@@ -55,6 +55,7 @@ public class TemplateAllKeyWordJson {
}
+
/**
* 模板请求 拼接data 有小程序跳转
*
@@ -85,15 +86,16 @@ public class TemplateAllKeyWordJson {
if (color != null) {
itemMap.put("color", color);
}
+
itemMap.put("value", item.getValue());
data.put(("keyword" + (i + 1)), itemMap);
}
}
if(StringUtils.isNotBlank(appId)&&StringUtils.isNotBlank(pagePath)){
- return getTemplateJson(templateId, openId, url, data);
+ return getTemplateJson(templateId, openId, url, data, appId, pagePath);
}
- return getTemplateJson(templateId, openId, url, data, appId, pagePath);
+ return getTemplateJson(templateId, openId, url, data);
}
/**
diff --git a/src/main/java/com/ynxbd/push/helper/TemplateJsonStringHelper.java b/src/main/java/com/ynxbd/push/helper/TemplateJsonStringHelper.java
index c2a7b67..d4e4eee 100644
--- a/src/main/java/com/ynxbd/push/helper/TemplateJsonStringHelper.java
+++ b/src/main/java/com/ynxbd/push/helper/TemplateJsonStringHelper.java
@@ -365,6 +365,12 @@ public class TemplateJsonStringHelper {
public static String get16(SendMessageTemplate key) {
return "{\"data\":{\"keyword1\":{\"color\":\"#173177\",\"value\":\"" + key.getDoctor() + "\"},\"keyword2\":{\"color\":\"#173177\",\"value\":\"" + key.getPatientName() + "\"},\"keyword3\":{\"color\":\"#173177\",\"value\":\"" + key.getFollowUpStaff() + "\"},\"first\":{\"color\":\"#173177\",\"value\":\"" + key.getFirst() + "\"},\"remark\":{\"color\":\"#173177\",\"value\":\"" + key.getRemark() + "\"}},\"template_id\":\"" + key.getTemplate_id() + "\",\"touser\":\"" + key.getOpenId() + "\",\"url\":\"" + key.getUrl() + "\"}";
}
+ public static String getReportTip(SendMessageTemplate key) {
+ return "{\"data\":{\"character_string12\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword1() + "\"},\"thing3\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword2() + "\"},\"first\":{\"color\":\"#173177\",\"value\":\"" + key.getFirst() + "\"},\"character_string9\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword3() + "\"},\"time14\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword4() + "\"},\"thing5\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword5() + "\"},\"remark\":{\"color\":\"#173177\",\"value\":\"" + key.getRemark() + "\"}},\"template_id\":\"" + key.getTemplate_id() + "\",\"touser\":\"" + key.getOpenId() + "\",\"url\":\"" + key.getUrl() + "\"}";
+ }
+ public static String getUniversal(SendMessageTemplate key) {
+ return "{\"data\":{\"time13\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword1() + "\"},\"thing16\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword2() + "\"},\"first\":{\"color\":\"#173177\",\"value\":\"" + key.getFirst() + "\"},\"remark\":{\"color\":\"#173177\",\"value\":\"" + key.getRemark() + "\"}},\"template_id\":\"" + key.getTemplate_id() + "\",\"touser\":\"" + key.getOpenId() + "\",\"url\":\"" + key.getUrl() + "\"}";
+ }
diff --git a/src/main/java/com/ynxbd/push/helper/TemplateSelectHelper.java b/src/main/java/com/ynxbd/push/helper/TemplateSelectHelper.java
index 8583d2d..66abb70 100644
--- a/src/main/java/com/ynxbd/push/helper/TemplateSelectHelper.java
+++ b/src/main/java/com/ynxbd/push/helper/TemplateSelectHelper.java
@@ -10,54 +10,60 @@ public class TemplateSelectHelper {
public static String select(SendMessageTemplate sendMessageTemplate) throws JsonProcessingException {
String jsonString = null;
switch (sendMessageTemplate.getCode()) {
- case 1:
+ case "1":
jsonString = TemplateJsonStringHelper.get1(sendMessageTemplate);
break;
- case 2:
+ case "2":
jsonString = TemplateJsonStringHelper.get2(sendMessageTemplate);
break;
- case 3:
+ case "3":
jsonString = TemplateJsonStringHelper.get3(sendMessageTemplate);
break;
- case 4:
+ case "4":
jsonString = TemplateJsonStringHelper.get4(sendMessageTemplate);
break;
- case 5:
+ case "5":
jsonString = TemplateJsonStringHelper.get5(sendMessageTemplate);
break;
- case 6:
+ case "6":
jsonString = TemplateJsonStringHelper.get6(sendMessageTemplate);
break;
- case 7:
+ case "7":
jsonString = TemplateJsonStringHelper.get7(sendMessageTemplate);
break;
- case 8:
+ case "8":
jsonString = TemplateJsonStringHelper.get8(sendMessageTemplate);
break;
- case 9:
+ case "9":
jsonString = TemplateJsonStringHelper.get9(sendMessageTemplate);
break;
- case 10:
+ case "10":
jsonString = TemplateJsonStringHelper.get10(sendMessageTemplate);
break;
- case 11:
+ case "11":
jsonString = TemplateJsonStringHelper.get11(sendMessageTemplate);
break;
- case 12:
+ case "12":
jsonString = TemplateJsonStringHelper.get12(sendMessageTemplate);
break;
- case 13:
+ case "13":
jsonString = TemplateJsonStringHelper.get13(sendMessageTemplate);
break;
- case 14:
+ case "14":
jsonString = TemplateJsonStringHelper.get14(sendMessageTemplate);
break;
- case 15:
+ case "15":
jsonString = TemplateJsonStringHelper.get15(sendMessageTemplate);
break;
- case 16:
+ case "16":
jsonString = TemplateJsonStringHelper.get16(sendMessageTemplate);
break;
+ case "ReportTip":
+ jsonString = TemplateJsonStringHelper.getReportTip(sendMessageTemplate);
+ break;
+ case "Universal":
+ jsonString = TemplateJsonStringHelper.getUniversal(sendMessageTemplate);
+ break;
default:
jsonString = TemplateJsonStringHelper.get(sendMessageTemplate);
}
diff --git a/src/main/java/com/ynxbd/push/helper/TestResult.java b/src/main/java/com/ynxbd/push/helper/TestResult.java
deleted file mode 100755
index 466df43..0000000
--- a/src/main/java/com/ynxbd/push/helper/TestResult.java
+++ /dev/null
@@ -1,188 +0,0 @@
-package com.ynxbd.push.helper;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.ToString;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Slf4j
-public class TestResult {
-
- @Data
- @NoArgsConstructor
- @ToString
- public static class TestDoctor {
- private String docCode;
- private String docName;
- }
-
-
- public static void main(String[] args) {
- String json = "{\n" +
- " \"Code\": \"200\",\n" +
- " \"Msg\": \"SUCCESS\",\n" +
- " \"Data\": [\n" +
- " {\n" +
- " \"docCode\": \"0002\",\n" +
- " \"docName\": \"李卫\"\n" +
- " },\n" +
- " {\n" +
- " \"docCode\": \"0003\",\n" +
- " \"docName\": \"杨淑\"\n" +
- " },\n" +
- " {\n" +
- " \"docCode\": \"0005\",\n" +
- " \"docName\": \"马晓琳\"\n" +
- " },\n" +
- " {\n" +
- " \"docCode\": \"0010\",\n" +
- " \"docName\": \"张永云\"\n" +
- " },\n" +
- " {\n" +
- " \"docCode\": \"0011\",\n" +
- " \"docName\": \"蔡连勇\"\n" +
- " },\n" +
- " {\n" +
- " \"docCode\": \"0012\",\n" +
- " \"docName\": \"罗琳辉\"\n" +
- " },\n" +
- " {\n" +
- " \"docCode\": \"0013\",\n" +
- " \"docName\": \"屈继波\"\n" +
- " },\n" +
- " {\n" +
- " \"docCode\": \"0015\",\n" +
- " \"docName\": \"李瀛\"\n" +
- " },\n" +
- " {\n" +
- " \"docCode\": \"0016\",\n" +
- " \"docName\": \"杨阳\"\n" +
- " },\n" +
- " {\n" +
- " \"docCode\": \"0017\",\n" +
- " \"docName\": \"江为民\"\n" +
- " }\n" +
- " ],\n" +
- " \"Note\": {\n" +
- " \"funcName\": \"DeanSearch_wechatDataPush\",\n" +
- " \"funcNote\": \"微信推送数据\",\n" +
- " \"connTime\": 30,\n" +
- " \"inParams\": {},\n" +
- " \"isListOutParams\": true,\n" +
- " \"outParams\": {\n" +
- " \"docCode\": \"医生code\",\n" +
- " \"docName\": \"医生name\"\n" +
- " }\n" +
- " }\n" +
- "}";
-
- String respData = getRespData(json);
- System.out.println(respData);
- List testDoctors = jsonToList(respData, TestDoctor.class);
- System.out.println(testDoctors);
-
- List doctCodeList = jsonToList(respData, "docCode");
- System.out.println(doctCodeList);
- }
-
- /**
- * 获取请求中的数据
- */
- public static String getRespData(String respData) {
- if (respData == null) {
- return null;
- }
- JSONObject jsonResp = JSON.parseObject(respData);
- String code = jsonResp.getString("Code");
- String message = jsonResp.getString("Msg");
- if ("200".equals(code) && "SUCCESS".equals(message)) {
- String data = jsonResp.getString("Data");
- return "".equals(data) ? null : data;
- }
- log.info("[请求失败]code={}, message={}", code, message);
- return null;
- }
-
- public static List jsonToList(String data, Class clazz) {
- if (data == null) {
- return new ArrayList<>();
- }
- String jsonStr = JSON.toJSONString(data);
- if ("".equals(jsonStr)) {
- return new ArrayList<>();
- }
- try {
- return JSON.parseArray(data, clazz);
- } catch (Exception e) {
- log.error(e.getMessage());
- return new ArrayList<>();
- }
- }
-
- /**
- * 获取对象数组中某个名称的值,加入集合
- *
- * @param data json数据
- * @param name 属性名称
- * @return 属性List
- */
- public static List jsonToList(String data, String name) {
- List resultList = new ArrayList<>();
- if (data == null) {
- return resultList;
- }
- String jsonStr = JSON.toJSONString(data);
- if ("".equals(jsonStr)) {
- return resultList;
- }
-
- try {
- JSONArray jsonArr = JSON.parseArray(data);
- JSONObject itemObj;
- String val;
- for (int i = 0; i < jsonArr.size(); i++) {
- itemObj = jsonArr.getJSONObject(i);
- if (itemObj == null) {
- continue;
- }
- val = itemObj.getString(name);
- if (val != null && !"".equals(val)) {
- resultList.add(val);
- }
- }
- return resultList;
- } catch (Exception e) {
- log.error(e.getMessage());
- }
- return resultList;
- }
-
- /**
- * json转实体类
- * @param data 数据
- * @param clazz 类型
- * @return 对象
- */
- public static T jsonToBean(String data, Class clazz) {
- if (data == null) {
- return null;
- }
- String jsonStr = JSON.toJSONString(data);
- if ("".equals(jsonStr)) {
- return null;
- }
- try {
- return JSON.parseObject(data, clazz);
- } catch (Exception e) {
- log.error(e.getMessage());
- return null;
- }
- }
-
-}
diff --git a/src/main/java/com/ynxbd/push/httpRequest/tencent/WeChatDataRequest.java b/src/main/java/com/ynxbd/push/httpRequest/tencent/WeChatDataRequest.java
index dcd85e5..9f19942 100644
--- a/src/main/java/com/ynxbd/push/httpRequest/tencent/WeChatDataRequest.java
+++ b/src/main/java/com/ynxbd/push/httpRequest/tencent/WeChatDataRequest.java
@@ -1,11 +1,14 @@
package com.ynxbd.push.httpRequest.tencent;
-import com.ynxbd.push.entity.tencent.TemplateList;
-import com.ynxbd.push.entity.tencent.WeChatResponse;
-import com.ynxbd.push.entity.tencent.WeChatUserInfo;
+import com.alibaba.fastjson.JSONObject;
+import com.ynxbd.push.entity.tencent.*;
+import com.ynxbd.push.entity.xbd.wx.WorkLoadResponse;
+import com.ynxbd.push.helper.DesEncryptHelper;
+import com.ynxbd.push.helper.RedisHelper;
import com.ynxbd.push.helper.RequestHelper;
import com.ynxbd.push.httpRequest.xbd.wx.WxCacheRequest;
+import lombok.extern.slf4j.Slf4j;
import org.apache.http.Header;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
@@ -13,6 +16,7 @@ import weixin.popular.api.API;
import weixin.popular.client.LocalHttpClient;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -22,6 +26,7 @@ import java.util.stream.Collectors;
*
* @author 李进才
*/
+@Slf4j
public class WeChatDataRequest {
private WeChatDataRequest() {
}
@@ -33,18 +38,49 @@ public class WeChatDataRequest {
return LocalHttpClient.executeJsonResult(httpUriRequest, WeChatUserInfo.class);
}
- public static WeChatResponse getOpenIdForDoctorCode(String doctorCode) {
+ public static List getOpenIdForDoctorCode(String doctorCode) {
+ return RequestHelper.get("http://127.0.0.1:9090/micro/msg_push/doctor?doctCode="+doctorCode, null, WeChatResponse.class).getData();
+ }
+
+ public static List getAllOpenIdForDoctorCode(String doctorCode) {
+ return RequestHelper.get("http://127.0.0.1:9090/micro/msg_push/doctorOpenIds?doctCode="+doctorCode, null, WeChatResponse.class).getData();
+ }
+
+ public static WeChatAllDoctorResponse getAllOpenIdForDoctorCode() {
+ return RequestHelper.get("http://127.0.0.1:9090/micro/msg_push/doctorOpenIdTree", null, WeChatAllDoctorResponse.class);
+ }
+
+ public static WorkLoadResponse getOpenIdAndTokenToBi() {
+ return RequestHelper.get("http://127.0.0.1:9090/micro/doctor/getDocModuleLink?code=xsjc", null, WorkLoadResponse.class);
+ }
+
+ public static String GetOpenIdForPatientId(String patientId){
+ String wx_openId_url = "http://wx.mzsrmyy.net/wx/patient/getOpenIdsByPatientId.do";
Map params = new HashMap<>();
- params.put("doctCode",doctorCode);
- return RequestHelper.get("http://127.0.0.1/micro/msg_push/doctor", params, WeChatResponse.class);
+ params.put("patientId",patientId);
+ params.put("algorithm","des");
+ params.put("isEncryptComma","false");
+ return DesEncryptHelper.deCode(RequestHelper.get(wx_openId_url,params,WeChatResponse.class).getData().get(0));
}
private static TemplateList getTemplateList() {
- HttpUriRequest httpUriRequest = RequestBuilder.get().setHeader(jsonHeader).setUri("https://api.weixin.qq.com/cgi-bin/template/get_all_private_template").addParameter("access_token", API.accessToken(WxCacheRequest.getAccessToken())).addParameter("lang", "zh_CN").build();
- return LocalHttpClient.executeJsonResult(httpUriRequest, TemplateList.class);
+ if(RedisHelper.getRedis().get("Template")!=null){
+ return JSONObject.parseObject(RedisHelper.getRedis().get("Template"), TemplateList.class);
+ }
+ String tenCentTemplateListUrl = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token="+API.accessToken(WxCacheRequest.getAccessToken());
+ Map params = new HashMap<>();
+ params.put("lang","zh_CN");
+ TemplateList templateList = RequestHelper.get(tenCentTemplateListUrl,params,TemplateList.class);
+ RedisHelper.getRedis().set("Template", JSONObject.toJSONString(templateList),86400);
+ return templateList;
}
public static String getTemplateId(String title) {
- return getTemplateList().getTemplate_list().stream().filter(p -> p.getTitle().equals(title)).collect(Collectors.toList()).get(0).getTemplate_id();
+ List templateList= getTemplateList().getTemplate_list().stream().filter(p -> p.getTitle().equals(title)).collect(Collectors.toList());
+ if(templateList.isEmpty()){
+ log.error("获取模版列表失败,模版名称-{}",title);
+ return null;
+ }
+ return templateList.get(0).getTemplate_id();
}
}
diff --git a/src/main/java/com/ynxbd/push/httpRequest/xbd/.DS_Store b/src/main/java/com/ynxbd/push/httpRequest/xbd/.DS_Store
new file mode 100644
index 0000000..c35a3bb
Binary files /dev/null and b/src/main/java/com/ynxbd/push/httpRequest/xbd/.DS_Store differ
diff --git a/src/main/java/com/ynxbd/push/httpRequest/xbd/his/HisRequest.java b/src/main/java/com/ynxbd/push/httpRequest/xbd/his/HisRequest.java
index 97e5a59..faa0dbf 100644
--- a/src/main/java/com/ynxbd/push/httpRequest/xbd/his/HisRequest.java
+++ b/src/main/java/com/ynxbd/push/httpRequest/xbd/his/HisRequest.java
@@ -1,5 +1,7 @@
package com.ynxbd.push.httpRequest.xbd.his;
+import com.alibaba.fastjson.JSONObject;
+import com.ynxbd.push.config.IniConfig;
import com.ynxbd.push.entity.tencent.WeChatResponse;
import com.ynxbd.push.helper.RequestHelper;
@@ -19,10 +21,7 @@ public class HisRequest {
}
- public static WeChatResponse getWorkLoad(String doctorCode) {
- Map params = new HashMap<>();
- params.put("methodName","DeanSearch_wechatDataPush");
- params.put("paramsStr","{}");
- return RequestHelper.get("http://10.20.10.41:8082/api/SqlContext/ExecMethodByName", params, WeChatResponse.class);
+ public static String getWorkLoad() {
+ return RequestHelper.get("http://"+IniConfig.getInstance("leaderUrl")+"/api/SqlContext/ExecMethodByName?methodName=DeanSearch_wechatDataPush¶msStr={}",null);
}
}
diff --git a/src/main/java/com/ynxbd/push/httpRequest/xbd/wx/WxCacheRequest.java b/src/main/java/com/ynxbd/push/httpRequest/xbd/wx/WxCacheRequest.java
index dd7fffa..86324ef 100644
--- a/src/main/java/com/ynxbd/push/httpRequest/xbd/wx/WxCacheRequest.java
+++ b/src/main/java/com/ynxbd/push/httpRequest/xbd/wx/WxCacheRequest.java
@@ -9,12 +9,11 @@ import com.ynxbd.push.helper.DateHelper;
import com.ynxbd.push.helper.DesEncryptHelper;
import com.ynxbd.push.helper.RequestHelper;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
import org.ehcache.Cache;
@Slf4j
public class WxCacheRequest {
- private static final String SERVICE_URL = "http://127.0.0.1:8080/wx/api/getWxAccessToken.do";
- private static final String LOCALHOST_URL = "http://wx.hhzyy.com/wx/api/getWxAccessToken.do";
private static final int MAX_RETRY = 3;
@@ -32,7 +31,8 @@ public class WxCacheRequest {
private synchronized static void createAccessTokenCache() {
if (ACCESS_TOKEN_CACHE == null) {
- ACCESS_TOKEN_CACHE = EhCacheConfig.createCacheTTL(String.class, AccessToken.class, "wx_access_token_cache", (CACHE_TIME)); // 一个半小时
+ // 一个半小时
+ ACCESS_TOKEN_CACHE = EhCacheConfig.createCacheTTL(String.class, AccessToken.class, "wx_access_token_cache", (CACHE_TIME));
}
}
@@ -51,12 +51,12 @@ public class WxCacheRequest {
if (ACCESS_TOKEN_CACHE == null) {
createAccessTokenCache();
}
- log.info("启动医院为:{}", IniConfig.getInstance("name"));
try {
AccessToken token = new AccessToken();
AccessToken cacheToken = ACCESS_TOKEN_CACHE.get(CACHE_NAME);
if (cacheToken != null) {
- if (7200 > DateHelper.differCurSecond(cacheToken.getCreateTime())) { // 允许100s的旧token存在(5分钟内可以继续使用佬)
+ // 允许100s的旧token存在(5分钟内可以继续使用佬)
+ if (7200 < DateHelper.differCurSecond(cacheToken.getCreateTime())) {
AccessToken respToken = againGetWxAccessToken();
if (respToken != null) {
token.setAccessToken(respToken.getAccessToken());
@@ -109,8 +109,8 @@ public class WxCacheRequest {
*/
private static AccessToken requestWxAccessToken() {
try {
- JSONObject respJson = RequestHelper.getJsonObj(SERVICE_URL, null);
- log.info("[token请求]resp={}", respJson);
+ String token_url = StringUtils.isNotBlank(IniConfig.getInstance("token_url"))?IniConfig.getInstance("token_url"):"http://127.0.0.1:80/wx/api/getWxAccessToken.do";
+ JSONObject respJson = RequestHelper.getJsonObj(token_url, null);
String code = respJson.getString("code");
if (!"200".equals(code)) {
log.info("请求token失败 code={}, message={}", code, respJson.getString("message"));
diff --git a/src/main/java/com/ynxbd/push/pushJob/BI/BiPush.java b/src/main/java/com/ynxbd/push/pushJob/BI/BiPush.java
new file mode 100644
index 0000000..143b6b4
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/pushJob/BI/BiPush.java
@@ -0,0 +1,97 @@
+package com.ynxbd.push.pushJob.BI;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ynxbd.push.config.IniConfig;
+import com.ynxbd.push.entity.tencent.AllDoctorCode;
+import com.ynxbd.push.entity.tencent.SendMessageTemplate;
+import com.ynxbd.push.entity.tencent.WeChatAllDoctorResponse;
+import com.ynxbd.push.entity.xbd.his.HIsWorkLoad;
+import com.ynxbd.push.entity.xbd.wx.WorkLoad;
+import com.ynxbd.push.entity.xbd.wx.WorkLoadData;
+import com.ynxbd.push.helper.*;
+import com.ynxbd.push.httpRequest.tencent.WeChatDataRequest;
+import com.ynxbd.push.httpRequest.xbd.his.HisRequest;
+import lombok.extern.slf4j.Slf4j;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author 李进才
+ * @ClassName BiPush
+ * @Description description
+ * @date 2022/9/7 14:23
+ */
+@Slf4j
+public class BiPush {
+ public static void runJob(String openId){
+ if(IniConfig.getInstance("leaderTemplateId")==null){
+ return;
+ }
+ Boolean isTest = false;
+ if(IniConfig.getInstance("leaderTest")!=null){
+ isTest = true;
+ }
+ SimpleDateFormat sdf = new SimpleDateFormat();
+ sdf.applyPattern("yyyy-MM-dd");
+ Date date = new Date();
+ List targetList = HisResultFormat.jsonToList(HisResultFormat.getRespData(HisRequest.getWorkLoad()), HIsWorkLoad.class);
+ List allDoctorCodeList = WeChatDataRequest.getAllOpenIdForDoctorCode().getData();
+ Map params = new HashMap<>();
+ params.put("description", targetList.get(0).getDescription());
+ SimpleDateFormat formatter = new SimpleDateFormat();
+ formatter.applyPattern("yyyyMMdd");
+ RedisHelper.getRedis().set(formatter.format(date),JSONObject.toJSONString(params),86400);
+ for (HIsWorkLoad target: targetList) {
+ Optional allDoctorCodeStream =allDoctorCodeList.stream().filter(item -> item.getDoctCode().equals(target.getDoc_code())).findFirst();
+ if (!allDoctorCodeStream.isPresent()){
+ log.info("[领导推送工作量]{}未绑定微官网,openId:{}",target.getDoc_name(),target.getDoc_code());
+ continue;
+ }
+ SendMessageTemplate sendMessageTemplate = SendMessageTemplate.builder()
+ .template_id(IniConfig.getInstance("leaderTemplateId"))
+ .keyword1(Objects.equals(IniConfig.getInstance("leaderTemplateMode"), "2") ?target.getDescription():sdf.format(date))
+ .keyword2(Objects.equals(IniConfig.getInstance("leaderTemplateMode"), "2") ?sdf.format(date):target.getDescription())
+// .first(new StringBuilder().append("尊敬的").append(target.getDoc_name()).append("您好").toString())
+ .url(IniConfig.getInstance("domain")+"wx/"+IniConfig.getInstance("weChatUIPath")+"push-info.html#/bi-info")
+// .openId(replenish.getOpenid())
+ .build();
+ if(isTest){
+ for (String testOpenId:IniConfig.getInstance("leaderTest").split(";")) {
+ sendMessageTemplate.setOpenId("");
+ sendMessageTemplate.setOpenId(testOpenId);
+ log.info("[领导推送工作量-测试项目]:openId={}, ErrCode={}, ",
+ sendMessageTemplate.getOpenId(),
+ // 推送
+ MessageApiHelper.templateMessageSend(sendMessageTemplate).getMsg_status());
+ }
+ break;
+ }
+ if(openId!=null){
+ for (String paramsOpenId:openId.split(";")) {
+ sendMessageTemplate.setOpenId("");
+ sendMessageTemplate.setOpenId(paramsOpenId);
+ log.info("[领导推送工作量-接口传参项目]:openId={}, ErrCode={}, ",
+ sendMessageTemplate.getOpenId(),
+ // 推送
+ MessageApiHelper.templateMessageSend(sendMessageTemplate).getMsg_status());
+ }
+ break;
+ }
+ Integer index = 1;
+ for (String interfaceOpenId:allDoctorCodeStream.get().getOpenIds()){
+ sendMessageTemplate.setOpenId(AesCodeHelper.deCode(interfaceOpenId));
+ log.info("[领导推送工作量]:openId={}, DoctorCode-{}-{}, ErrCode={}",
+ sendMessageTemplate.getOpenId(),
+ allDoctorCodeStream.get().getDoctCode(),
+ index,
+ // 推送
+ MessageApiHelper.templateMessageSend(sendMessageTemplate).getMsg_status());
+ index++;
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/ynxbd/push/quartz/job/WorkLoadJob.java b/src/main/java/com/ynxbd/push/quartz/job/WorkLoadJob.java
index 90e6f64..b001c36 100644
--- a/src/main/java/com/ynxbd/push/quartz/job/WorkLoadJob.java
+++ b/src/main/java/com/ynxbd/push/quartz/job/WorkLoadJob.java
@@ -1,23 +1,38 @@
package com.ynxbd.push.quartz.job;
+import com.ynxbd.push.config.IniConfig;
+import com.ynxbd.push.entity.tencent.SendMessageTemplate;
+import com.ynxbd.push.entity.xbd.his.HIsWorkLoad;
+import com.ynxbd.push.entity.xbd.wx.WorkLoad;
+import com.ynxbd.push.entity.xbd.wx.WorkLoadData;
+import com.ynxbd.push.helper.HisResultFormat;
+import com.ynxbd.push.helper.MessageApiHelper;
+import com.ynxbd.push.httpRequest.tencent.WeChatDataRequest;
+import com.ynxbd.push.httpRequest.xbd.his.HisRequest;
+import com.ynxbd.push.pushJob.BI.BiPush;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.regex.Matcher;
+
/**
* @author 李进才
* @ClassName WorkLoadJob
* @Description description
* @date 2022/7/22 11:01
*/
-@Slf4j
public class WorkLoadJob implements Job {
@SneakyThrows
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
-
+ BiPush.runJob(null);
}
}
diff --git a/src/main/java/com/ynxbd/push/quartz/listener/AppStartQuartzJobListener.java b/src/main/java/com/ynxbd/push/quartz/listener/AppStartQuartzJobListener.java
index d588155..3faf79d 100644
--- a/src/main/java/com/ynxbd/push/quartz/listener/AppStartQuartzJobListener.java
+++ b/src/main/java/com/ynxbd/push/quartz/listener/AppStartQuartzJobListener.java
@@ -32,6 +32,7 @@ public class AppStartQuartzJobListener implements ApplicationListener]Starting Quartz task ...");
quartzScheduler.startCrontabJob();
+ quartzScheduler.startWorkloadJob();
} catch (SchedulerException e) {
log.error("[]ERROR: ", e);
}
diff --git a/src/main/java/com/ynxbd/push/quartz/scheduler/AppQuartzScheduler.java b/src/main/java/com/ynxbd/push/quartz/scheduler/AppQuartzScheduler.java
index 47897e1..29be23e 100644
--- a/src/main/java/com/ynxbd/push/quartz/scheduler/AppQuartzScheduler.java
+++ b/src/main/java/com/ynxbd/push/quartz/scheduler/AppQuartzScheduler.java
@@ -1,7 +1,9 @@
package com.ynxbd.push.quartz.scheduler;
+import com.ynxbd.push.config.IniConfig;
import com.ynxbd.push.quartz.job.TimePushJob;
+import com.ynxbd.push.quartz.job.WorkLoadJob;
import org.quartz.*;
import org.springframework.stereotype.Component;
@@ -32,6 +34,10 @@ public class AppQuartzScheduler {
scheduler.start();
}
+ public void startWorkloadJob() throws SchedulerException{
+ startWorkLoadJob(scheduler);
+ scheduler.start();
+ }
/**
* 获取Job信息
*/
@@ -115,6 +121,7 @@ public class AppQuartzScheduler {
private void startNormalJob(Scheduler scheduler) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(TimePushJob.class).withIdentity("TimePush", "WorkLog").build();
SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.repeatMinutelyForever();
+ // 十分钟执行一次
simpleScheduleBuilder.withIntervalInSeconds(10);
SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().withIdentity("TimePush", "WorkLog").withSchedule(simpleScheduleBuilder).build();
scheduler.scheduleJob(jobDetail, simpleTrigger);
@@ -125,9 +132,23 @@ public class AppQuartzScheduler {
*/
private void startCrontabJob(Scheduler scheduler) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(TimePushJob.class).withIdentity("TimePush", "WorkLog").build();
+ // 一天执行一次
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 15 18 * * ?");
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("TimePush", "WorkLog").withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail, cronTrigger);
}
+ /**
+ * 基于 Crontab 的调度器
+ */
+ private void startWorkLoadJob(Scheduler scheduler) throws SchedulerException {
+ JobDetail jobDetail = JobBuilder.newJob(WorkLoadJob.class).withIdentity("WorkLoad", "WorkLog").build();
+ if(IniConfig.getInstance("leaderTime")==null){
+ return;
+ }
+ CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(IniConfig.getInstance("leaderTime"));
+ CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("WorkLoad", "WorkLog").withSchedule(cronScheduleBuilder).build();
+ scheduler.scheduleJob(jobDetail, cronTrigger);
+ }
+
}
diff --git a/src/main/java/com/ynxbd/push/rabbit/receive/RabbitReceiver.java b/src/main/java/com/ynxbd/push/rabbit/receive/RabbitReceiver.java
new file mode 100644
index 0000000..acaba7e
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/rabbit/receive/RabbitReceiver.java
@@ -0,0 +1,187 @@
+package com.ynxbd.push.rabbit.receive;
+
+import com.alibaba.fastjson.JSON;
+import com.ynxbd.push.config.IniConfig;
+import com.ynxbd.push.entity.response.ResponseResult;
+import com.ynxbd.push.helper.MessageApiHelper;
+import com.ynxbd.push.rabbit.send.RabbitSender;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.util.UriUtils;
+import weixin.popular.bean.message.MessageSendResult;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.Base64;
+import java.util.Date;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * @author 李进才
+ * @ClassName RabbitReceiver
+ * @Description TODO
+ * @date 2024/01/23 13:54:00
+ */
+@Component
+@Slf4j
+@RabbitListener(queues = {"wxPushQueue"})
+public class RabbitReceiver {
+
+ @Autowired
+ private RabbitSender rabbitSender;
+
+ private final static String REPORT_TIP = "ReportTip";
+ private final static String QUEUE_TIP = "QueueTip";
+ private final static String MEDICAL_RECORD = "MedicalRecord";
+ private final static String TREAT_PLAN = "treatPlan";
+
+ private final static String UNIVERSAL = "Universal";
+
+
+ @RabbitHandler
+ public void receive(Map receiveMessage) {
+ try {
+ log.info("rabbit开始消费消息,内容-{}", receiveMessage);
+ if (Integer.parseInt(receiveMessage.get("count")) > 2) {
+ return;
+ }
+ switch (receiveMessage.get("tip")) {
+ case REPORT_TIP:
+ reportTip(receiveMessage);
+ break;
+ case QUEUE_TIP:
+ queueTip(receiveMessage);
+ break;
+ case MEDICAL_RECORD:
+ medicalRecord(receiveMessage);
+ break;
+ case TREAT_PLAN:
+ treatPlan(receiveMessage);
+ break;
+ case UNIVERSAL:
+ universal(receiveMessage);
+ break;
+ default:
+ log.info("未找到消息类型进行推送,类型-{}", receiveMessage.get("tip"));
+ break;
+ }
+ }
+
+ catch (Exception e){
+ log.error("消息消费出错:{},内容-{}",e,receiveMessage);
+ }
+ }
+
+ private void reportTip(Map receiveMessage) {
+ String organizeName = receiveMessage.get("organizeName");
+ String messageId = receiveMessage.get("message_id");
+ String code = receiveMessage.get("tip");
+ String patientId = receiveMessage.get("patientId") == null ? "" : receiveMessage.get("patientId");
+ String idCard = receiveMessage.get("idCard") == null ? "" : receiveMessage.get("idCard");
+ String reportId = receiveMessage.get("reportId") == null ? "" : receiveMessage.get("reportId");
+ String itemName = receiveMessage.get("itemName") == null ? "" : receiveMessage.get("itemName");
+ String reportTime = receiveMessage.get("reportTime") == null ? "" : receiveMessage.get("reportTime");
+ String patientName = receiveMessage.get("patientName") == null ? "" : receiveMessage.get("patientName");
+ String sex = receiveMessage.get("sex") == null ? "" : receiveMessage.get("sex");
+ String age = receiveMessage.get("age") == null ? "" : receiveMessage.get("age");
+ String applyDept = receiveMessage.get("applyDept") == null ? "" : receiveMessage.get("applyDept");
+ String applyDoctor = receiveMessage.get("applyDoctor") == null ? "" : receiveMessage.get("applyDoctor");
+ String weChatUrl = IniConfig.getInstance("weChatUrl") == null ? "" : receiveMessage.get("weChatUrl");
+ retry(MessageApiHelper.TemplateMessageForCode(organizeName,code, idCard, "检验检查报告通知",
+ patientId, null, "您有新的报告。" + patientName + (age.equals("") ? "" : "(" + age + ")"),
+ patientId, patientName + (sex.equals("") ? "" : "(" + sex + ")"), reportId, reportTime, itemName,
+ "您的报告结果已经出具。" + (applyDoctor.equals("") ? "" : "申请医生:" + applyDoctor + ";") + (applyDept.equals("") ? "" : "申请科室:" + applyDept),
+ weChatUrl + IniConfig.getInstance("reportUrl") + "/all-result.html", messageId), receiveMessage);
+
+ }
+ private void queueTip(Map receiveMessage) {
+ try {
+ String organizeName = receiveMessage.get("organizeName");
+ String messageId = receiveMessage.get("message_id");
+ String code = receiveMessage.get("tip");
+ String patientId = receiveMessage.get("patientId")==null?"":receiveMessage.get("patientId");
+ String idCard = receiveMessage.get("idCard")==null?"":receiveMessage.get("idCard");
+ String patientName = receiveMessage.get("patientName")==null?"":receiveMessage.get("patientName");
+ String deptName = receiveMessage.get("deptName")==null?"":receiveMessage.get("deptName");
+ String doctorName = receiveMessage.get("doctorName")==null?"":receiveMessage.get("doctorName");
+ String currentNumber = receiveMessage.get("currentNumber")==null?"":receiveMessage.get("currentNumber");
+ String selfNumber = receiveMessage.get("selfNumber")==null?"":receiveMessage.get("selfNumber");
+ String waitNumber = receiveMessage.get("waitNumber")==null?"":receiveMessage.get("waitNumber");
+ retry(MessageApiHelper.TemplateMessageForCode(organizeName,code,idCard,"排队叫号提醒", patientId,null,patientName+",您已进入候诊队列,请及时查看",deptName,doctorName,currentNumber,selfNumber,waitNumber,"请合理安排好时间就诊,以免过号",null,messageId),receiveMessage);
+ }
+ catch (Exception e){
+ log.error("[推送消息组织出错]params-{}, error-{}",receiveMessage, e.toString());
+ }
+ }
+
+ private void medicalRecord(Map receiveMessage) {
+ String organizeName = receiveMessage.get("organizeName");
+ String messageId = receiveMessage.get("message_id");
+ String code = receiveMessage.get("tip");
+ String patientId = receiveMessage.get("patientId");
+ SimpleDateFormat sdf = new SimpleDateFormat();
+ sdf.applyPattern("yyyy-MM-dd");
+ Date date = new Date();
+ String url =IniConfig.getInstance("domain")+"wx/"+IniConfig.getInstance("weChatUIPath")+"medical-record.html#/medical-record-history";
+ retry(MessageApiHelper.TemplateMessageForCode(organizeName,code,null,"医院通知",patientId,null,"病历复印申请已通过",sdf.format(date),"病历复印申请已通过,请点击跳转付费",null,null,null,"查看详情",url,messageId),receiveMessage);
+ }
+
+ private void treatPlan(Map receiveMessage){
+ String messageId = receiveMessage.get("message_id");
+ String code = receiveMessage.get("tip");
+ String organizeName = receiveMessage.get("organizeName");
+ String patientId = receiveMessage.get("patientId");
+ String name = receiveMessage.get("name");
+ String title = receiveMessage.get("title");
+ String planTime = receiveMessage.get("planTime");
+ String content = receiveMessage.get("content");
+ String url = receiveMessage.get("url");
+ String remark = receiveMessage.get("remark");
+ retry(MessageApiHelper.TemplateMessageForCode(organizeName,code,null,"诊疗计划提醒",patientId,null,title,name,planTime,content,null,null,remark,url,messageId),receiveMessage);
+ }
+
+ private void universal(Map receiveMessage) {
+ SimpleDateFormat sdf = new SimpleDateFormat();
+ sdf.applyPattern("yyyy-MM-dd");
+ Date date = new Date();
+ String organizeName = receiveMessage.get("organizeName");
+ String code = receiveMessage.get("tip");
+ String messageId = receiveMessage.get("message_id");
+ String patientId = receiveMessage.get("patientId");
+ String content = receiveMessage.get("content");
+ String url = receiveMessage.get("url");
+ String IdCard = receiveMessage.get("IdCard");
+ String doctorCode = receiveMessage.get("doctorCode");
+ String viewUrl;
+ if(!"".equals(url)){
+ viewUrl = url;
+ }else {
+ viewUrl = IniConfig.getInstance("domain")+"wx/"+IniConfig.getInstance("weChatUIPath")+"push-universal.html?patientId="+ ("".equals(patientId)? Base64.getEncoder().encodeToString(patientId.getBytes()): "") + "&content="+Base64.getEncoder().encodeToString(UriUtils.encode(content, StandardCharsets.UTF_8.toString()).getBytes())+"&time="+Base64.getEncoder().encodeToString(sdf.format(date).getBytes());
+ }
+ if(IniConfig.getInstance("templateVersion")!=null){
+ content = content.substring(0,16)+"……";
+ }
+ retry(MessageApiHelper.TemplateMessageForCode(organizeName,code,IdCard,IniConfig.getInstance("templateVersion")==null?"绑定通知":"工单处理提醒",patientId,doctorCode,null,sdf.format(date),content,null,null,null,null,viewUrl,messageId),receiveMessage);
+ }
+
+ private void retry(MessageSendResult messageSendResult, Map message) {
+ if(!(messageSendResult.getErrcode().equals("0")||messageSendResult.getErrcode().equals(ResponseResult.ORGANIZE_IS_NULL.ERR_CODE)||messageSendResult.getErrcode().equals(ResponseResult.PARAMETER_IS_NULL.ERR_CODE)||messageSendResult.getErrcode().equals(ResponseResult.NOT_FIND_DATA.ERR_CODE))){
+ int count = Integer.parseInt(message.get("count"));
+ log.info("[微信消息推送]进入重试机制,重试次数-{},重试参数-{},失败原因-{}",count,message,messageSendResult.getErrcode());
+ message.put("count",String.valueOf((count+1)));
+ rabbitSender.send(message);
+ }
+
+ }
+
+ public static void main(String[] args) throws IOException, TimeoutException {
+ System.out.println(Base64.getEncoder().encodeToString("尊敬的患者,您本次就诊有如下费用需要支付:\\n 药品处方:\\n 共1张,金额:0.13元;\\n".getBytes(StandardCharsets.UTF_8)));
+ System.out.println(new String(Base64.getDecoder().decode("JUU1JUIwJThBJUU2JTk1JUFDJUU3JTlBJTg0JUU2JTgyJUEzJUU4JTgwJTg1JUU2JTgyJUE4JUU1JUE1JUJEJUVGJUJDJThDJUU2JTgyJUE4JUU3JTlBJTg0JUU1JUE0JTg0JUU2JTk2JUI5JUU1JUI3JUIyJUU3JUJCJThGJUU1JTg3JUJBJUU1JTg1JUI3JUVGJUJDJThDJUU4JUFGJUI3JUU0JUJEJUEwJUU1JTlDJUE4JUU4JUE3JTg0JUU1JUFFJTlBJUU2JTk3JUI2JUU5JTk3JUI0JUU1JTg2JTg1JUU1JTg5JThEJUU1JUJFJTgwJUU1JUE0JTg0JUU2JTk2JUI5JUU4JUJGJTlCJUU4JUExJThDJUU2JTk0JUFGJUU0JUJCJTk4JUVGJUJDJThDJUU4JUIwJUEyJUU4JUIwJUEyJUU5JTg1JThEJUU1JTkwJTg4")));
+ }
+}
diff --git a/src/main/java/com/ynxbd/push/rabbit/send/RabbitSender.java b/src/main/java/com/ynxbd/push/rabbit/send/RabbitSender.java
new file mode 100644
index 0000000..bc9e612
--- /dev/null
+++ b/src/main/java/com/ynxbd/push/rabbit/send/RabbitSender.java
@@ -0,0 +1,33 @@
+package com.ynxbd.push.rabbit.send;
+
+import com.alibaba.fastjson.JSON;
+import org.springframework.amqp.rabbit.connection.CorrelationData;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * @author 李进才
+ * @ClassName RabbitSender
+ * @Description TODO
+ * @date 2024/01/23 13:53:00
+ */
+@Component
+public class RabbitSender {
+ @Autowired
+ private RabbitTemplate rabbitTemplate;
+
+ public void TipSend(Map message){
+ message.put("count","0");
+ send(message);
+ }
+ public void send(Map message) {
+ String uuid = UUID.randomUUID().toString();
+ CorrelationData correlationData = new CorrelationData(uuid);
+ message.put("message_id", uuid);
+ this.rabbitTemplate.convertAndSend("wxPushExchange","wxPushRouting",message,correlationData);
+ }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index ff3453c..23393e3 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -11,6 +11,26 @@ spring:
# 时间格式化
date-format: yyyy/MM/dd HH:mm:ss
time-zone: GMT+8
+ rabbitmq:
+ host: 127.0.0.1
+ port: 5672
+ username: wxPush
+ password: wx.push.rabbit
+ virtual-host: /
+ # 支持发布返回
+ publisher-returns: true
+ listener:
+ simple:
+ # 采用手动应答
+ acknowledge-mode: manual
+ # 当前监听容器数
+ concurrency: 1
+ # 最大数
+ max-concurrency: 1
+ # 是否支持重试
+ retry:
+ enabled: true
+
logging:
level:
diff --git a/src/main/resources/weChat.ini b/src/main/resources/weChat.ini
index 7dd417e..42e2f9a 100644
--- a/src/main/resources/weChat.ini
+++ b/src/main/resources/weChat.ini
@@ -1,12 +1,11 @@
-
+# BI推送模式2 OPENTM207867603
+# 蒙自市人民医院排队叫号机构代码 8A381806ED3F1723CAEF3C827F96DDB635029D1467BF9971
[10.20.10.60]
name=红河州第一人民医院
-appId=41365ADA1DEB6215E21B7982A997865FD6DBA9C41D5CBEF9
-secret=8a6e27b29ab9cdc97f717d924de673ba
speed=20
# 预约挂号成功
templateId12 = FH5B0JwDVrWPaY5IrcGz2Q5vNRBW_-XjU6w35Vf4yeY
-remark12= 1.预约挂号患者请携带病历按时就诊,若无病历本请携带到导医台购买;\n\t2.发票:线上预约挂号不提供纸质发票,如需打印请到收费窗口打印;\n\t3.退号:预约挂号患者请提前24小时在线自助退号,就诊当天不支持在线自助退号,逾期不退;\n\t4.就诊时间:上午08:00-11:30,下午14:00-17:30
+remark12=\n1、门诊就诊时间:\n上午8:00-11:30,\n下午14:00-17:30。\n注意:请您按照预约时间提前签到就诊,否则会按照迟到处理,排到当前签到队列末尾;预约时间仅作为预估接诊时间,不作为实际接诊时间。\n2、退号:预约挂号患者可提前一天在预约记录里取消预约,就诊当天不支持在线退号,逾期不退。
# 缴费成功
templateId4 = X3lmsLfTa9tNDNPAqGyb3Qj96otb9hQ7ib3Oo33uGX0
# 取消预约挂号
@@ -15,48 +14,64 @@ daoYiXunTemplateId = 6hpr5eY-nnCIkFu2ZeuvFjd0YG1ZwlHOo_ikRSXJUg4
daoYiXunAppId=wx0fb39a1dc27c5e6d
daoYiXunSecret=fnAs1mE5HP
daoYiXunHospitalId=opBdKy87Gs
+leaderUrl = 10.20.10.41:8082
+# 领导层BI推送 模版id
+leaderTemplateId = RQjct77hUEVMn_VmMyLHD77t6toXsTrRAWl3gO03afc
+# 测试账号 openid
+# leaderTest = oeso-tyOmZrx7sIphyNFhVDdV5UA
+# 推送时间 每天「倒数第三位」点「倒数第四位」分触发
+leaderTime = 0 00 08 * * ?
+domain = https://wx.hhzyy.com/
+weChatUIPath = web/
-[192.168.0.17]
-name=玉龙县人民医院
-appId = A8DABBEAA807EBD1930F44A3B793D5FC52009C0EF886C7BE
-secret = 5eb5a0ca4b40643e65ecb2b98ff97af4
-speed=20
[200.200.200.161]
name=蒙自市第一人民医院
-appId = 3C14F49D70B731CE6DE8F278533DE3E50204B16F0DEC7EBF
-secret = 7d5d713378e7885c5186c739ba1bcf0c
-speed=20
+weChatUrl = http://wx.mzsrmyy.net/wx/
+reportUrl = web
+leaderUrl = 200.200.200.168:8080
+leaderTemplateId = yN0-xsCzSlDRcGZlMhifWBkziwyGlBHXrK-fzF76EzI
+# 测试账号 openid
+# leaderTest = oX5GuwV9DOhctadDV3OD7vkWQpGE;oX5Guwet_XMH70Nq_fKnFANF3w-8
+# 推送时间 每天「倒数第三位」点「倒数第四位」分触发
+leaderTime = 0 00 09 * * ?
+domain = http://wx.mzsrmyy.net/
+weChatUIPath = web/
+
+[192.168.64.1]
+name = 永胜县人民医院
+weChatUrl = http://www.ysxrmyy901.com/wx/
+leaderTemplateId = uEYM34FWaZBuw-G1Dw9d-qZ5Uyex53NtSEF6_y7_SdY
+leaderTime = 0 00 08 * * ?
+domain = http://www.ysxrmyy901.com/
+token_url= http://www.ysxrmyy901.com/wx/api/getWxAccessToken.do
+templateVersion = new
+weChatUIPath = /
-[10.37.129.2]
-name=(本地)蒙自市第一人民医院
-appId = 3C14F49D70B731CE6DE8F278533DE3E50204B16F0DEC7EBF
-secret = 7d5d713378e7885c5186c739ba1bcf0c
-speed=20
[192.168.0.228]
name=蒙自市中医院
-appId=C7804FA6132669DEE8DF08C62BB685CE1CC0BA1061506647
-secret=abbfa052457204bde3881382ad856a89
speed=20
[200.200.200.60]
name=德宏州中医院
-appId=1431E6E8ACC481D63A9647002C6FDA2497BF7A2BEAD27A5F
-secret=c84241abc2bf53a19946c20ea7d0d166
+leaderUrl = 200.200.200.70:8001
+# 领导层BI推送 模版id
+leaderTemplateId = iTgXzpqIre-0lFw2nq0iDCDAlVl0d2NhIT9X77dS5WY
+# 测试账号 openid
+leaderTest = om5Hqvu8TRg97HzsWjpgiHFqEovk
+# 推送时间 每天「倒数第三位」点「倒数第四位」分触发
+leaderTime = 0 00 08 * * ?
+domain = https://www.dhzzyyy.net/
speed=20
[200.200.200.7]
name=武定中医院
-appId=D7BD353BBDB8588E94CAA6FE94A377B01A4C28C0BC2D5488
-secret=6ff874c9b8d9f59d921be1b432a65b30
speed=20
-[192.168.1.115]
+[192.168.1.116]
name = 华坪县人民医院
-appId = wx18b15dc67fc96f89
-secret = 0126802e43530ccb5ed55822bc7710d6
speed = 20
lisPeople = o8bAwt3AEuIuWjz8EK0tKkzuxM9Q;o8bAwt1FEUsuKHIzqzqwg9roQQ0s;o8bAwt1Qh7376XQUQ4qnWgQP_5LY;o8bAwtzHFRW_zjQkicvN8pImrJYE
lisUrl = http://www.hpxrmyy.com/lis-daily/web/index.html#/
@@ -65,8 +80,6 @@ lisTemplateId = 5QLyEyDZE5aiJ8gh8_SeJgMx3CI-s6Iueq9k5_3QNzc
[200.200.200.29]
name = 元谋县人民医院
-appId = wxfbc586bf4efd5cb9
-secret = a7307d8396e932ea08c1fb97e0822aa8
speed = 20
lisPeople = oH40Av3imJFF_RVjH87c2XeKCAXA;oH40Avx-dDjmL8PUQvXNCRfCjPas;oH40Av5KzDBOjT6p7Zd9S7rFecIw
lisUrl = http://www.ymxrmyy.cn/lis-daily/web/index.html#/
@@ -75,8 +88,6 @@ lisTemplateId = HZ7R71Bj5_SH7IVxb9GdRhLD62ShVQCWDA15z0UPYAQ
[172.168.1.10]
name = 巍山县人民医院
-appId = wx1e30610a28d189a8
-secret = ffe1ebcb84fa0f5ed819612a0ffdd100
speed = 20
# 预约挂号成功
templateId12 = 4dcsihkvVIJPURohSI_pN1CiPCcclkQ87uRe195cA9Q
@@ -88,6 +99,45 @@ lisReportTemplateId = mMCj_r0GFvHdG9vvv8Pxr4z7Agi2ghkx7NxgDUcyQG4
lisPeople = ozup5xIV44_0ZE2FizXc39AMU_e8;ozup5xPFQ_11l6Jl2wCDJQ5vv4pc;ozup5xISKv1NnkEtmQKnqPahRmwA
lisUrl = http://www.wsxrmyy.cn/lis-daily/web/index.html#/
lisTemplateId = t5TWL228wakwhgu0rTI85yjMlk0aYBfcm6vqD447x5k
+leaderTemplateId = VOtFBlFcWWIPuN9uOq8n6Ay5eik1vfkBcfXpBshXepY
+leaderUrl = 200.200.200.9:8080
+leaderTime = 0 00 08 * * ?
+domain = http://www.wsxrmyy.cn/
+weChatUIPath = web/
+
+
+[192.168.33.40]
+name = 玉龙县人民医院
+weChatUrl = http://www.ljylxrmyy.com/wx/
+leaderUrl = 172.16.24.4:8080
+# 领导层BI推送 模版id
+leaderTemplateId = a775Q5ikmGLDuX7rWcT8sRfU5IZZ4cvmjWYNJ36I5e4
+# 绑定通知 的模版
+leaderTemplateMode = 2
+# 测试账号 openid
+# leaderTest = oA1zH1F13oyaVR0Uyav4N4fD3MYA
+# 推送时间 每天「倒数第三位」点「倒数第四位」分触发
+leaderTime = 0 30 07 * * ?
+domain = http://www.ljylxrmyy.com/
+weChatUIPath =
+
+
+[192.168.11.7]
+name = 芒市妇幼保健院
+weChatUrl = http://www.msfyy.com/wx/
+
+
+[192.168.10.10]
+name = 石林县人民医院
+weChatUrl = http://www.slxrmyy.cn/wx/
+[172.28.5.3]
+name = 永胜县人民医院
+weChatUrl = http://www.ysxrmyy901.com/wx/
+leaderTemplateId = Al-pWshj-rlccb155iDCc4CUkzOZUeUah8ORTD08CVg
+leaderTime = 0 00 08 * * ?
+domain = http://www.ysxrmyy901.com/
+templateVersion = new
+weChatUIPath = /