Compare commits

...

5 Commits

Author SHA1 Message Date
李进才 6772f8942a 建立微信推送git仓库 1 year ago
wangsq 16232b76e6 修改请求路径 3 years ago
wangsq a3df06e02c 对象缓存错误调整 3 years ago
wangsq 68ca8f6e90 对象缓存错误调整 3 years ago
wangsq 40ab0a4fb3 token获取调整 3 years ago
  1. BIN
      .DS_Store
  2. 20
      pom.xml
  3. BIN
      src/main/java/com/ynxbd/push/.DS_Store
  4. 10
      src/main/java/com/ynxbd/push/AppApplication.java
  5. 64
      src/main/java/com/ynxbd/push/config/RabbitMQConfig.java
  6. 25
      src/main/java/com/ynxbd/push/config/TomcatConfig.java
  7. 33
      src/main/java/com/ynxbd/push/controller/ApiController.java
  8. 30
      src/main/java/com/ynxbd/push/controller/BI/BiController.java
  9. 146
      src/main/java/com/ynxbd/push/controller/BusinessController.java
  10. 17
      src/main/java/com/ynxbd/push/controller/RegisteredController.java
  11. 66
      src/main/java/com/ynxbd/push/controller/ReportController.java
  12. 13
      src/main/java/com/ynxbd/push/controller/SendMessageController.java
  13. 3
      src/main/java/com/ynxbd/push/controller/TestController.java
  14. 46
      src/main/java/com/ynxbd/push/entity/response/ResponseResult.java
  15. 17
      src/main/java/com/ynxbd/push/entity/tencent/AllDoctorCode.java
  16. 11
      src/main/java/com/ynxbd/push/entity/tencent/SendMessageTemplate.java
  17. 19
      src/main/java/com/ynxbd/push/entity/tencent/WeChatAllDoctorResponse.java
  18. 5
      src/main/java/com/ynxbd/push/entity/tencent/WeChatResponse.java
  19. 28
      src/main/java/com/ynxbd/push/entity/type/MessageTypeEnum.java
  20. 30
      src/main/java/com/ynxbd/push/entity/type/OrganizeTypeEnum.java
  21. 16
      src/main/java/com/ynxbd/push/entity/xbd/his/HIsWorkLoad.java
  22. 14
      src/main/java/com/ynxbd/push/entity/xbd/wx/AccessToken.java
  23. 16
      src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoad.java
  24. 17
      src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadData.java
  25. 16
      src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadResponse.java
  26. 79
      src/main/java/com/ynxbd/push/helper/AesCodeHelper.java
  27. 25
      src/main/java/com/ynxbd/push/helper/BusinessHelper.java
  28. 43
      src/main/java/com/ynxbd/push/helper/DateHelper.java
  29. 10
      src/main/java/com/ynxbd/push/helper/DesEncryptHelper.java
  30. 804
      src/main/java/com/ynxbd/push/helper/HisResultFormat.java
  31. 124
      src/main/java/com/ynxbd/push/helper/MessageApiHelper.java
  32. 63
      src/main/java/com/ynxbd/push/helper/RedisHelper.java
  33. 32
      src/main/java/com/ynxbd/push/helper/RequestHelper.java
  34. 39
      src/main/java/com/ynxbd/push/helper/StringHelper.java
  35. 6
      src/main/java/com/ynxbd/push/helper/TemplateAllKeyWordJson.java
  36. 6
      src/main/java/com/ynxbd/push/helper/TemplateJsonStringHelper.java
  37. 38
      src/main/java/com/ynxbd/push/helper/TemplateSelectHelper.java
  38. 188
      src/main/java/com/ynxbd/push/helper/TestResult.java
  39. 54
      src/main/java/com/ynxbd/push/httpRequest/tencent/WeChatDataRequest.java
  40. BIN
      src/main/java/com/ynxbd/push/httpRequest/xbd/.DS_Store
  41. 9
      src/main/java/com/ynxbd/push/httpRequest/xbd/his/HisRequest.java
  42. 73
      src/main/java/com/ynxbd/push/httpRequest/xbd/wx/Test.java
  43. 133
      src/main/java/com/ynxbd/push/httpRequest/xbd/wx/WxCacheRequest.java
  44. 97
      src/main/java/com/ynxbd/push/pushJob/BI/BiPush.java
  45. 19
      src/main/java/com/ynxbd/push/quartz/job/WorkLoadJob.java
  46. 1
      src/main/java/com/ynxbd/push/quartz/listener/AppStartQuartzJobListener.java
  47. 21
      src/main/java/com/ynxbd/push/quartz/scheduler/AppQuartzScheduler.java
  48. 187
      src/main/java/com/ynxbd/push/rabbit/receive/RabbitReceiver.java
  49. 33
      src/main/java/com/ynxbd/push/rabbit/send/RabbitSender.java
  50. 20
      src/main/resources/application.yml
  51. 110
      src/main/resources/weChat.ini

BIN
.DS_Store vendored

Binary file not shown.

@ -45,11 +45,24 @@
<artifactId>ehcache</artifactId>
<version>3.9.9</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.3.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.9</version>
</dependency>
<dependency>
@ -127,6 +140,7 @@
<artifactId>ini4j</artifactId>
<version>0.5.4</version>
</dependency>
</dependencies>
<build>
@ -134,7 +148,6 @@
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
@ -144,6 +157,11 @@
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
</plugin>
</plugins>
</build>

Binary file not shown.

@ -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");
}
}

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

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

@ -0,0 +1,33 @@
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 lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("api")
public class ApiController {
@PostMapping("reToken")
public String reToken() {
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";
// }
}

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

@ -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<String,String> 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<String,String> 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<String,String> 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<String,String> 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<String,String> 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();
}
}

@ -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")

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

@ -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()));

@ -1,6 +1,5 @@
package com.ynxbd.push.controller;
import com.ynxbd.push.config.IniConfig;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -11,8 +10,6 @@ public class TestController {
@GetMapping("test01")
public String test01() {
String id = IniConfig.test();
System.out.println(id);
return "success";
}
}

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

@ -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<String> openIds;
}

@ -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() {
}

@ -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<AllDoctorCode> data;
private String message;
private Boolean success;
}

@ -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<String> data;
private String message;
private Boolean success;
}

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

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

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

@ -1,10 +1,16 @@
package com.ynxbd.push.entity.xbd.wx;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
public class AccessToken {
private Integer code;
private String data;
private String message;
@NoArgsConstructor
public class AccessToken implements Serializable {
private static final long serialVersionUID = 36888886677781604L;
// 授权token
private String accessToken;
// 创建时间
private String createTime;
}

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

@ -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<WorkLoad> list;
}

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

@ -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);
// }
}

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

@ -0,0 +1,43 @@
package com.ynxbd.push.helper;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateHelper {
public static final String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";
/**
* [日期字符串]转日期
*
* @param dateStr 日期字符串
* @param format 日期格式
* @return 日期/时间
*/
public static Date strToDate(String dateStr, String format) {
try {
if (dateStr == null || format == null) {
return null;
}
return new SimpleDateFormat(format).parse(dateStr);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 时间点距离当前时间多少秒
*
* @param dateStr 时间点字符串
* @return 日期/时间
*/
public static long differCurSecond(String dateStr) {
Date date = strToDate(dateStr, yyyy_MM_dd_HH_mm_ss);
if (date == null) {
return 0L;
}
return new Date().getTime() - date.getTime();
}
}

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

@ -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<HIsWorkLoad> testDoctors = jsonToList(respData, HIsWorkLoad.class);
System.out.println(testDoctors);
List<String> 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 <T> List<T> jsonToList(String data, Class<T> 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<String> jsonToList(String data, String name) {
List<String> 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> T jsonToBean(String data, Class<T> 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;
}
}
}

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

@ -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<String, String> redis;
private static StatefulRedisConnection<String, String> 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<String,String> 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();
}
}

@ -8,6 +8,7 @@
package com.ynxbd.push.helper;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
@ -74,13 +75,38 @@ public class RequestHelper extends SimpleClientHttpRequestFactory {
* @return ResultVO
*/
public static <T> T get(String url, Map<String, String> params, Class<T> clazz) {
return JSON.parseObject(get(url, params), clazz);
}
/**
* 向目的URL发送get请求
*
* @param url 请求地址
* @param params 请求参数
* @return ResultVO
*/
public static JSONObject getJsonObj(String url, Map<String, String> params) {
return JSON.parseObject(get(url, params));
}
/**
* 向目的URL发送get请求
*
* @param url 请求地址
* @param params 请求参数
* @return ResultVO
*/
public static String get(String url, Map<String, String> params) {
RestTemplate client = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/x-www-form-urlencoded");
HttpEntity<Map<String,String>> request = new HttpEntity<>(params,headers);
HttpEntity<Map<String, String>> request = new HttpEntity<>(params, headers);
ResponseEntity<String> responseEntity = client.getForEntity(url, String.class, request);
String data = responseEntity.getBody();
return JSON.parseObject(data, clazz);
return responseEntity.getBody();
}

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

@ -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);
}
/**

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

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

@ -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<TestDoctor> testDoctors = jsonToList(respData, TestDoctor.class);
System.out.println(testDoctors);
List<String> 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 <T> List<T> jsonToList(String data, Class<T> 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<String> jsonToList(String data, String name) {
List<String> 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> T jsonToBean(String data, Class<T> 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;
}
}
}

@ -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<String> 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<String> 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<String, String> 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<String,String> 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<Template> 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();
}
}

@ -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<String, String> 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&paramsStr={}",null);
}
}

@ -0,0 +1,73 @@
//package com.ynxbd.push.httpRequest.xbd.wx;
//
//import lombok.extern.slf4j.Slf4j;
//
//@Slf4j
//public class Test {
//
// private static int RETRY_INDEX = 0;
// private static final int MAX_RETRY = 3;
//
//
// public static String test02() {
// try {
// if (RETRY_INDEX != MAX_RETRY) {
// System.out.println(1 / 0);
// log.info("请求失败");
// } else {
// log.info("请求成功");
// }
// return "1";
// } catch (Exception e) {
// log.error(e.getMessage());
// RETRY_INDEX++;
// log.error("请求微信获取Token错误:{}", e.getMessage());
// if (RETRY_INDEX > MAX_RETRY) {
// log.error("多次请求后未获取到正确token,抛出异常");
// return null;
// }
// log.error("重试请求第{}次", RETRY_INDEX);
// return test02();
// }
// }
//
// public static void main(String[] args) {
// String s = test02();
// System.out.println(s);
// }
//
//
// public static String test03() {
// try {
// if (RETRY_INDEX != MAX_RETRY) {
// System.out.println(1 / 0);
// log.info("请求失败");
// } else {
// log.info("请求成功");
// }
// return "1";
// } catch (Exception e) {
// log.error(e.getMessage());
// test04();
// }
// return null;
// }
//
//
// public static String test04() {
// try {
// if (RETRY_INDEX != MAX_RETRY) {
// System.out.println(1 / 0);
// log.info("请求失败");
// } else {
// log.info("请求成功");
// }
// return "1";
// } catch (Exception e) {
// log.error(e.getMessage());
// }
// return null;
// }
//
//
//}

@ -1,20 +1,21 @@
package com.ynxbd.push.httpRequest.xbd.wx;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ynxbd.push.config.EhCacheConfig;
import com.ynxbd.push.config.IniConfig;
import com.ynxbd.push.entity.xbd.wx.AccessToken;
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.mzsrmyy.net/wx/api/getWxAccessToken.do";
private static Integer RETRY_INDEX = 0;
private static final Integer MAX_RETRY = 3;
private static final int MAX_RETRY = 3;
static {
createAccessTokenCache();
@ -22,60 +23,128 @@ public class WxCacheRequest {
// 缓存
private static Cache<String, String> ACCESS_TOKEN_CACHE;
private static Cache<String, AccessToken> ACCESS_TOKEN_CACHE;
private static final String CACHE_NAME = "access_token";
private static final long CACHE_TIME = 7100;
private synchronized static void createAccessTokenCache() {
if (ACCESS_TOKEN_CACHE == null) {
// 一个半小时
ACCESS_TOKEN_CACHE = EhCacheConfig.createCacheTTL(String.class, String.class, "wx_access_token_cache", (7100L));
ACCESS_TOKEN_CACHE = EhCacheConfig.createCacheTTL(String.class, AccessToken.class, "wx_access_token_cache", (CACHE_TIME));
}
}
public static String getAccessToken() {
if (ACCESS_TOKEN_CACHE == null) {
createAccessTokenCache();
}
RETRY_INDEX = 0;
String cacheName = "access_token";
String accessToken = ACCESS_TOKEN_CACHE.get(cacheName);
AccessToken accessToken = getWxAccessToken();
if (accessToken == null) {
accessToken = getWxAccessToken(ACCESS_TOKEN_CACHE, cacheName);
if (accessToken != null) {
ACCESS_TOKEN_CACHE.put(cacheName, accessToken);
}
return null;
}
return accessToken;
return accessToken.getAccessToken();
}
/**
* 获取微信token
*/
public synchronized static String getWxAccessToken(Cache<String, String> cache, String cacheName) {
private synchronized static AccessToken getWxAccessToken() {
if (ACCESS_TOKEN_CACHE == null) {
createAccessTokenCache();
}
try {
String accessToken = cache.get(cacheName);
if (accessToken != null) {
return accessToken;
AccessToken token = new AccessToken();
AccessToken cacheToken = ACCESS_TOKEN_CACHE.get(CACHE_NAME);
if (cacheToken != null) {
// 允许100s的旧token存在(5分钟内可以继续使用佬)
if (7200 < DateHelper.differCurSecond(cacheToken.getCreateTime())) {
AccessToken respToken = againGetWxAccessToken();
if (respToken != null) {
token.setAccessToken(respToken.getAccessToken());
token.setCreateTime(respToken.getCreateTime());
ACCESS_TOKEN_CACHE.put(CACHE_NAME, respToken);
}
} else {
token.setAccessToken(cacheToken.getAccessToken());
token.setCreateTime(cacheToken.getCreateTime());
}
return token;
}
log.info("启动医院为:{}", IniConfig.getInstance("name"));
AccessToken messageSendResult = RequestHelper.get(SERVICE_URL, null, AccessToken.class);
log.info("access_code:{}", messageSendResult.getCode());
String token = DesEncryptHelper.deCode(messageSendResult.getData());
log.info("access_token:" + token);
AccessToken respToken = againGetWxAccessToken();
if (respToken != null) {
token.setAccessToken(respToken.getAccessToken());
token.setCreateTime(respToken.getCreateTime());
ACCESS_TOKEN_CACHE.put(CACHE_NAME, respToken);
}
return token;
} catch (Exception e) {
RETRY_INDEX++;
log.error("请求微信获取Token错误:{}", e.getMessage());
if(RETRY_INDEX > MAX_RETRY){
log.error("多次请求后未获取到正确token,抛出异常");
}
return null;
}
/**
* 根据次数循环获取
*/
private static AccessToken againGetWxAccessToken() {
AccessToken accessToken;
for (int i = 0; i < MAX_RETRY; i++) {
accessToken = requestWxAccessToken();
if (i != 0) {
log.error("重试请求第{}次", (i + 1));
}
if (accessToken != null) {
return accessToken;
}
if ((i + 1) == MAX_RETRY) {
log.error("{} 次请求后未获取到正确token", MAX_RETRY);
}
}
return null;
}
/**
* 请求微信token
*/
private static AccessToken requestWxAccessToken() {
try {
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"));
return null;
}
String data = respJson.getString("data");
if (data == null || "".equals(data)) {
return null;
}
log.error("重试请求第{}次",RETRY_INDEX);
getWxAccessToken(ACCESS_TOKEN_CACHE, cacheName);
AccessToken resp = JSON.parseObject(data, AccessToken.class);
System.out.println(resp);
if (resp == null) {
return null;
}
String accessToken = resp.getAccessToken();
if (accessToken == null) {
return null;
}
accessToken = DesEncryptHelper.deCode(accessToken);
if (accessToken == null) {
return null;
}
resp.setAccessToken(accessToken);
return resp;
} catch (Exception e) {
log.error("请求微信获取Token错误:{}", e.getMessage());
}
return null;
}
public synchronized static void clearWxAccessToken() {
if (ACCESS_TOKEN_CACHE != null) {
ACCESS_TOKEN_CACHE.remove(CACHE_NAME);
}
}
}

@ -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<HIsWorkLoad> targetList = HisResultFormat.jsonToList(HisResultFormat.getRespData(HisRequest.getWorkLoad()), HIsWorkLoad.class);
List<AllDoctorCode> allDoctorCodeList = WeChatDataRequest.getAllOpenIdForDoctorCode().getData();
Map<String,String> 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<AllDoctorCode> 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++;
}
}
}
}

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

@ -32,6 +32,7 @@ public class AppStartQuartzJobListener implements ApplicationListener<ContextRef
try {
log.info("[<QUZRTZ DISPATCH>]Starting Quartz task ...");
quartzScheduler.startCrontabJob();
quartzScheduler.startWorkloadJob();
} catch (SchedulerException e) {
log.error("[<QUZRTZ DISPATCH>]ERROR: ", e);
}

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

@ -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<String, String> 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<String,String> 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<String,String> 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<String,String> 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<String,String> 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<String,String> 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<String,String> 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")));
}
}

@ -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<String,String> message){
message.put("count","0");
send(message);
}
public void send(Map<String,String> message) {
String uuid = UUID.randomUUID().toString();
CorrelationData correlationData = new CorrelationData(uuid);
message.put("message_id", uuid);
this.rabbitTemplate.convertAndSend("wxPushExchange","wxPushRouting",message,correlationData);
}
}

@ -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:

@ -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 = /

Loading…
Cancel
Save