diff --git a/.DS_Store b/.DS_Store index d340ca1..d370743 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/pom.xml b/pom.xml index 88ca4fe..67d1f78 100644 --- a/pom.xml +++ b/pom.xml @@ -45,11 +45,24 @@ ehcache 3.9.9 + + org.springframework.boot + spring-boot-starter-amqp + + + + io.lettuce + lettuce-core + 5.3.6.RELEASE + + + ch.qos.logback logback-classic + 1.2.9 @@ -127,6 +140,7 @@ ini4j 0.5.4 + @@ -134,7 +148,6 @@ org.springframework.boot spring-boot-maven-plugin - @@ -144,6 +157,11 @@ + + org.apache.maven.plugins + maven-surefire-plugin + 2.4.2 + diff --git a/src/main/java/com/ynxbd/push/.DS_Store b/src/main/java/com/ynxbd/push/.DS_Store new file mode 100644 index 0000000..c9e108d Binary files /dev/null and b/src/main/java/com/ynxbd/push/.DS_Store differ diff --git a/src/main/java/com/ynxbd/push/AppApplication.java b/src/main/java/com/ynxbd/push/AppApplication.java index 76a6285..8b942a4 100644 --- a/src/main/java/com/ynxbd/push/AppApplication.java +++ b/src/main/java/com/ynxbd/push/AppApplication.java @@ -2,18 +2,24 @@ package com.ynxbd.push; import com.ynxbd.push.config.IniConfig; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import java.io.IOException; +import java.util.concurrent.TimeoutException; + @Slf4j @SpringBootApplication() public class AppApplication extends SpringBootServletInitializer { - public static void main(String[] args) { + public static void main(String[] args) throws IOException, TimeoutException { SpringApplication.run(AppApplication.class, args); + System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow", "^"); + log.info("启动医院为:{}", IniConfig.getInstance("name")); + log.info("token_url路径:{}", StringUtils.isNotBlank(IniConfig.getInstance("token_url")) ? IniConfig.getInstance("token_url") : "http://127.0.0.1:8080/wx/api/getWxAccessToken.do"); } } diff --git a/src/main/java/com/ynxbd/push/config/RabbitMQConfig.java b/src/main/java/com/ynxbd/push/config/RabbitMQConfig.java new file mode 100644 index 0000000..77cae8d --- /dev/null +++ b/src/main/java/com/ynxbd/push/config/RabbitMQConfig.java @@ -0,0 +1,64 @@ +package com.ynxbd.push.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.annotation.EnableRabbit; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author 李进才 + * @ClassName RabbitMQConfig + * @Description TODO + * @date 2024/01/23 13:28:00 + */ +@Configuration +@EnableRabbit +@Slf4j +public class RabbitMQConfig { + + @Autowired + private RabbitTemplate rabbitTemplate; + + @Bean + public AmqpTemplate amqpTemplate(){ + rabbitTemplate.setEncoding("UTF-8"); + rabbitTemplate.setMandatory(true); + rabbitTemplate.setReturnCallback(((message, replyCode, replyText, exchange, routingKey) -> { + String correlationId = message.getMessageProperties().getCorrelationId(); + log.info("消息:{} 发送失败, 应答码:{} 原因:{} 交换机: {} 路由键: {}", correlationId, replyCode, replyText, exchange, routingKey); + })); + //开启消息确认 yml 需要配置 publisher-returns: true + rabbitTemplate.setConfirmCallback(((correlationData, ack, cause) ->{ + if (ack) { + assert correlationData != null; + log.info("消息发送到交换机成功,correlationId:{}",correlationData.getId()); + } else { + log.info("消息发送到交换机失败,原因:{}",cause); + } + } )); + return rabbitTemplate; + } + /** + * 声明直连交换机 支持持久化. + * @return the exchange + */ + @Bean("wxPushExchange") + public Exchange wxPushExchange() { + return ExchangeBuilder.directExchange("wxPushExchange").durable(true).build(); + } + + @Bean("wxPushQueue") + public Queue wxPushQueue(){ + return new Queue("wxPushQueue", true, true, true); + } + + @Bean + public Binding wxPushBinding(){ + return BindingBuilder.bind(wxPushQueue()).to(wxPushExchange()).with("wxPushRouting").noargs(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/ynxbd/push/config/TomcatConfig.java b/src/main/java/com/ynxbd/push/config/TomcatConfig.java new file mode 100644 index 0000000..49314f7 --- /dev/null +++ b/src/main/java/com/ynxbd/push/config/TomcatConfig.java @@ -0,0 +1,25 @@ +package com.ynxbd.push.config; + +import org.apache.catalina.connector.Connector; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author 李进才 + * @ClassName TomcatConfig + * @Description TODO + * @date 2023/10/12 10:27:00 + */ +@Configuration +public class TomcatConfig { + @Bean + public TomcatServletWebServerFactory webServerFactory() { + TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); + factory.addConnectorCustomizers((Connector connector) -> { + connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}"); + connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}"); + }); + return factory; + } +} diff --git a/src/main/java/com/ynxbd/push/controller/ApiController.java b/src/main/java/com/ynxbd/push/controller/ApiController.java index 49a09b2..7ae5ca8 100644 --- a/src/main/java/com/ynxbd/push/controller/ApiController.java +++ b/src/main/java/com/ynxbd/push/controller/ApiController.java @@ -1,11 +1,14 @@ package com.ynxbd.push.controller; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ynxbd.push.helper.RedisHelper; import com.ynxbd.push.httpRequest.xbd.wx.WxCacheRequest; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +@Slf4j @RestController @RequestMapping("api") public class ApiController { @@ -15,4 +18,16 @@ public class ApiController { WxCacheRequest.clearWxAccessToken(); return "success"; } + + @PostMapping("getRedis") + public JSONObject getRedis(String name) { + log.info("name-{}",name); + return JSON.parseObject(RedisHelper.getRedis().get(name)); + } + +// @GetMapping("getRabbitMq") +// public String getRabbitMq() throws IOException, TimeoutException { +// rabbitMqHelper.ReportTipSend(); +// return "success"; +// } } diff --git a/src/main/java/com/ynxbd/push/controller/BI/BiController.java b/src/main/java/com/ynxbd/push/controller/BI/BiController.java new file mode 100644 index 0000000..1b0e6ed --- /dev/null +++ b/src/main/java/com/ynxbd/push/controller/BI/BiController.java @@ -0,0 +1,30 @@ +package com.ynxbd.push.controller.BI; + +import com.ynxbd.push.pushJob.BI.BiPush; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author 李进才 + * @ClassName BiController + * @Description description + * @date 2022/9/7 14:26 + */ +@Slf4j +@RestController +@RequestMapping("Bi") +public class BiController { + @GetMapping("workLoadPush") + public String workLoadPush(String openId) { + try { + BiPush.runJob(openId); + return "Success"; + } + catch (Exception e){ + log.error(e.toString()); + return e.getMessage(); + } + } +} diff --git a/src/main/java/com/ynxbd/push/controller/BusinessController.java b/src/main/java/com/ynxbd/push/controller/BusinessController.java new file mode 100644 index 0000000..a388f2a --- /dev/null +++ b/src/main/java/com/ynxbd/push/controller/BusinessController.java @@ -0,0 +1,146 @@ +package com.ynxbd.push.controller; + +import com.ynxbd.push.entity.type.MessageTypeEnum; +import com.ynxbd.push.entity.response.ResponseResult; +import com.ynxbd.push.helper.BusinessHelper; +import com.ynxbd.push.rabbit.send.RabbitSender; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import weixin.popular.bean.message.MessageSendResult; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author 李进才 + * @ClassName BusinessController + * @Description 发送lis报告单结果推送 + * @date 2021/12/6 3:23 下午 + */ +@Controller +@Slf4j +@RequestMapping(value = "business") +public class BusinessController { + @Autowired + private RabbitSender rabbitSender; + + + + + @GetMapping(value = "report") + @ResponseBody + public MessageSendResult reportTip(String organizeName, String patientId,String idCard, String reportId, String itemName, String reportTime, String patientName,String sex, String age, String applyDept, String applyDoctor) { + log.info("进入接口-[检验检查报告通知]organizeName-{},patientId-{},idCard-{},reportId-{}, itemName-{},reportTime-{},patientName-{},sex-{},age-{},applyDept-{},applyDoctor-{}",organizeName,patientId,idCard,reportId,itemName,reportTime,patientName,sex,age,applyDept,applyDoctor); + MessageSendResult check = BusinessHelper.ParamsCheck(organizeName,patientId,idCard,null); + if(!check.getErrcode().equals("0")){ + return check; + } + Map message = new HashMap<>(); + message.put("tip", MessageTypeEnum.REPORT_TIP.CODE); + message.put("organizeName",organizeName); + message.put("patientId",patientId); + message.put("idCard",idCard); + message.put("reportId",reportId); + message.put("itemName",itemName); + message.put("reportTime",reportTime); + message.put("patientName",patientName); + message.put("sex",sex); + message.put("age",age); + message.put("applyDept",applyDept); + message.put("applyDoctor",applyDoctor); + rabbitSender.TipSend(message); + return ResponseResult.JOIN_QUEUE.toMessResult(); + } + + @GetMapping(value = "queue") + @ResponseBody + public MessageSendResult queueTip(String organizeName, String patientId, String idCard, String patientName, String deptName, String doctorName, String currentNumber, String selfNumber, String waitNumber) { + log.info("进入接口-[排队叫号提醒]organizeName-{},patientId-{},idCard-{},patientName-{},deptName-{},doctorName-{},currentNumber-{},selfNumber-{},waitNumber-{}", organizeName, patientId, idCard, patientName, deptName, doctorName, currentNumber, selfNumber, waitNumber); + MessageSendResult check = BusinessHelper.ParamsCheck(organizeName, patientId, idCard,null); + if (!check.getErrcode().equals("0")) { + return check; + } + Map message = new HashMap<>(); + message.put("tip",MessageTypeEnum.QUEUE_TIP.CODE); + message.put("organizeName", organizeName); + message.put("patientId", patientId); + message.put("idCard", idCard); + message.put("patientName", patientName); + message.put("deptName", deptName); + message.put("doctorName", doctorName); + message.put("currentNumber", currentNumber); + message.put("selfNumber", selfNumber); + message.put("waitNumber", waitNumber); + rabbitSender.TipSend(message); + return ResponseResult.JOIN_QUEUE.toMessResult(); + } + + @PostMapping("medicalRecord") + @ResponseBody + public MessageSendResult medicalRecord(String organizeName, String patientId, String applyId) { + log.info("进入接口-[病历复印] 病历复印可付费通知(医院通知)organizeName-{}, patientId-{} , applyId-{}",organizeName,patientId,applyId); + MessageSendResult check = BusinessHelper.ParamsCheck(organizeName, patientId, null,null); + if (!check.getErrcode().equals("0")) { + return check; + } + Map message = new HashMap<>(); + message.put("tip",MessageTypeEnum.MEDICAL_RECORD.CODE); + message.put("organizeName", organizeName); + message.put("patientId", patientId); + message.put("applyId",applyId); + rabbitSender.TipSend(message); + return ResponseResult.JOIN_QUEUE.toMessResult(); + } + + @PostMapping("treatPlan") + @ResponseBody + public MessageSendResult treatPlan(String title, String name, String planTime,String content,String patientId, String organizeName,String remark,String url) { + log.info("进入接口-[诊疗计划提醒] organizeName-{}, patientId-{} , title-{},name-{},planTime-{},content-{},remark-{},url-{}",organizeName,patientId,title,name,planTime,content,remark,url); + MessageSendResult check = BusinessHelper.ParamsCheck(organizeName, patientId, null,null); + if (!check.getErrcode().equals("0")) { + return check; + } + if(name==null||planTime==null||content==null){ + log.info("[诊疗计划提醒] 必填字段为空,name-{},planTime-{},content-{}",name,planTime,content); + return ResponseResult.PARAMETER_IS_NULL.toMessResult(); + } + Map message = new HashMap<>(); + message.put("tip",MessageTypeEnum.TREAT_PLAN.CODE); + message.put("title",title==null?"":title); + message.put("name",name); + message.put("patientId", patientId); + message.put("organizeName", organizeName); + message.put("planTime",planTime); + message.put("content",content); + message.put("url",url==null?"":url); + message.put("remark",remark==null?"":remark); + rabbitSender.TipSend(message); + return ResponseResult.JOIN_QUEUE.toMessResult(); + } + + @PostMapping("universal") + @ResponseBody + public MessageSendResult universal(String content,String patientId, String url, String organizeName, String IdCard,String doctorCode){ + log.info("进入接口-[通用推送接口]-绑定通知,content-{},patientId-{},url-{},organizeName-{},IdCard-{},doctorCode-{}",content,patientId,url,organizeName,IdCard,doctorCode); + MessageSendResult check = BusinessHelper.ParamsCheck(organizeName, patientId, null,doctorCode); + if (!check.getErrcode().equals("0")) { + return check; + } + if(content==null){ + log.info("[通用推送接口]-绑定通知, 必填字段为空"); + return ResponseResult.PARAMETER_IS_NULL.toMessResult(); + } + Map message = new HashMap<>(); + message.put("tip",MessageTypeEnum.UNIVERSAL.CODE); + message.put("organizeName", organizeName); + message.put("patientId", patientId); + message.put("doctorCode",doctorCode); + message.put("IdCard",IdCard); + message.put("content",content); + message.put("url",url==null?"":url); + rabbitSender.TipSend(message); + return ResponseResult.JOIN_QUEUE.toMessResult(); + } +} diff --git a/src/main/java/com/ynxbd/push/controller/RegisteredController.java b/src/main/java/com/ynxbd/push/controller/RegisteredController.java index c7fe414..136cd12 100644 --- a/src/main/java/com/ynxbd/push/controller/RegisteredController.java +++ b/src/main/java/com/ynxbd/push/controller/RegisteredController.java @@ -9,9 +9,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.util.UriUtils; import weixin.popular.bean.message.MessageSendResult; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Base64; /** @@ -43,16 +46,28 @@ public class RegisteredController { log.info("openid={}, patientName={}, deptName={}, seq={}", openId, patientName, deptName, seq); + String patientId =patientName.split("ID:")[1]; + + String content =new StringBuilder() + .append(patientName.split("ID:")[0]) + .append(";") + .append(doctor) + .append(";") + .append(deptName) + .append(";") + .append(sex) + .toString(); SendMessageTemplate sendMessageTemplate = SendMessageTemplate.builder() .template_id(templateId) - .code(12) + .code("12") .doctor(doctor) .openId(openId) .department(deptName) .patientName(patientName) .hospitalName(hospital) .first("预约挂号成功") + .url(IniConfig.getInstance("domain")+"wx/"+IniConfig.getInstance("weChatUIPath")+"sign-in.html?patientId="+ ("".equals(patientId)? Base64.getEncoder().encodeToString(patientId.getBytes()): "") + "&content="+Base64.getEncoder().encodeToString(UriUtils.encode(content, StandardCharsets.UTF_8.toString()).getBytes())) .seq(seq) .patientSex(sex) .remarkColor("#fa4028") diff --git a/src/main/java/com/ynxbd/push/controller/ReportController.java b/src/main/java/com/ynxbd/push/controller/ReportController.java deleted file mode 100644 index e142816..0000000 --- a/src/main/java/com/ynxbd/push/controller/ReportController.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.ynxbd.push.controller; - -import com.ynxbd.push.config.IniConfig; -import com.ynxbd.push.entity.tencent.SendMessageTemplate; -import com.ynxbd.push.entity.tencent.WeChatResponse; -import com.ynxbd.push.helper.DesEncryptHelper; -import com.ynxbd.push.helper.MessageApiHelper; -import org.apache.http.Header; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.client.methods.RequestBuilder; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import weixin.popular.bean.message.MessageSendResult; -import weixin.popular.client.LocalHttpClient; - -import java.io.IOException; - -/** - * @author 李进才 - * @ClassName ReportController - * @Description 发送lis报告单结果推送 - * @date 2021/12/6 3:23 下午 - */ -@Controller -public class ReportController { - - public static final String NOT_FIND_DATA = "40004"; - protected static Header jsonHeader; - - @GetMapping(value = "Report") - @ResponseBody - public MessageSendResult ReportTip(String patientId, String itemName, String collectTime, String patientName) throws IOException { - String reportTemplateId = IniConfig.getInstance("lisReportTemplateId"); - String weChatUrl = IniConfig.getInstance("weChatUrl"); - HttpUriRequest httpUriRequest = RequestBuilder - .get() - .setHeader(jsonHeader) - .setUri(new StringBuilder() - .append(weChatUrl) - .append("patient/getOpenIdsByPatientId.do").toString()) - .addParameter("patientId", patientId) - .addParameter("algorithm", "des") - .addParameter("isEncryptComma", "false") - .addParameter("isLastBind", "true") - .build(); - WeChatResponse weChatResponse = LocalHttpClient.executeJsonResult(httpUriRequest, WeChatResponse.class); - if (weChatResponse.getData() == null) { - MessageSendResult messageSendResult = new MessageSendResult(); - messageSendResult.setErrcode(NOT_FIND_DATA); - messageSendResult.setMsg_status("NOT_FIND_DATA"); - return messageSendResult; - } - String openId = DesEncryptHelper.deCode(weChatResponse.getData()); - SendMessageTemplate sendMessageTemplate = SendMessageTemplate.builder() - .template_id(reportTemplateId) - .keyword1(itemName) - .keyword2(patientName) - .keyword3(collectTime) - .first("您的检验报告结果已经出来了") - .openId(openId) - .url(new StringBuilder().append(weChatUrl).append("web/all-result.html#/lis-report-inspect").toString()) - .build(); - return MessageApiHelper.templateMessageSend(sendMessageTemplate); - } -} diff --git a/src/main/java/com/ynxbd/push/controller/SendMessageController.java b/src/main/java/com/ynxbd/push/controller/SendMessageController.java index b4a1fa2..477d4d6 100644 --- a/src/main/java/com/ynxbd/push/controller/SendMessageController.java +++ b/src/main/java/com/ynxbd/push/controller/SendMessageController.java @@ -2,10 +2,8 @@ package com.ynxbd.push.controller; import com.ynxbd.push.entity.*; -import com.ynxbd.push.entity.tencent.AllUser; -import com.ynxbd.push.entity.tencent.SendMessageTemplate; -import com.ynxbd.push.entity.tencent.Subscribe; -import com.ynxbd.push.entity.tencent.WeChatUserInfo; +import com.ynxbd.push.entity.response.ResponseResult; +import com.ynxbd.push.entity.tencent.*; import com.ynxbd.push.helper.DesEncryptHelper; import com.ynxbd.push.httpRequest.tencent.WeChatDataRequest; import com.ynxbd.push.helper.MessageApiHelper; @@ -88,8 +86,11 @@ public class SendMessageController { @PostMapping(value = "TemplateMessageSend") @ResponseBody public MessageSendResult templateMessageSend(SendMessageTemplate sendMessageTemplate) { - if (StringUtils.isNotBlank(sendMessageTemplate.getDoctor())) { - sendMessageTemplate.setOpenId(WeChatDataRequest.getOpenIdForDoctorCode(sendMessageTemplate.getDoctorCode()).getData()); + if (StringUtils.isNotBlank(sendMessageTemplate.getDoctorCode())&& !StringUtils.isNotBlank(sendMessageTemplate.getOpenId())) { + if(WeChatDataRequest.getOpenIdForDoctorCode(sendMessageTemplate.getDoctorCode())==null){ + return ResponseResult.DOCTOR_NOT_BIND.toMessResult(); + } + sendMessageTemplate.setOpenId(WeChatDataRequest.getOpenIdForDoctorCode(sendMessageTemplate.getDoctorCode()).get(0)); } if (StringUtils.isNotBlank(sendMessageTemplate.getTemplate_name()) && !StringUtils.isNotBlank(sendMessageTemplate.getTemplate_id())) { sendMessageTemplate.setTemplate_id(WeChatDataRequest.getTemplateId(sendMessageTemplate.getTemplate_name())); diff --git a/src/main/java/com/ynxbd/push/entity/response/ResponseResult.java b/src/main/java/com/ynxbd/push/entity/response/ResponseResult.java new file mode 100644 index 0000000..1b7ca3e --- /dev/null +++ b/src/main/java/com/ynxbd/push/entity/response/ResponseResult.java @@ -0,0 +1,46 @@ +package com.ynxbd.push.entity.response; + +import weixin.popular.bean.message.MessageSendResult; + +/** + * @author 李进才 + * @ClassName ResponseResult + * @Description TODO + * @date 2023/07/04 14:02:00 + */ +public enum ResponseResult { + + JOIN_QUEUE("0","已经接收消息,进入处理程序"), + + + + ORGANIZE_IS_NULL("50001","组织机构代码无效"), + + PARAMETER_IS_NULL("50003","参数无效"), + + + + DOCTOR_NOT_BIND("50004","医生未绑定"), + + CODE_INVALIDATION("40001","token无效"), + + NOT_FIND_DATA("40004","未找到数据"), + CODE_EXPIRED("42001","token过期"), + + MESSAGE_RESULT_ERROR_CODE("4002","结果返回错误"); + + public final String ERR_CODE; + public final String ERR_MSG; + + ResponseResult(String errCode,String errMsg){ + this.ERR_CODE = errCode; + this.ERR_MSG = errMsg; + } + + public MessageSendResult toMessResult(){ + MessageSendResult result = new MessageSendResult(); + result.setErrmsg(this.ERR_MSG); + result.setErrcode(this.ERR_CODE); + return result; + } +} diff --git a/src/main/java/com/ynxbd/push/entity/tencent/AllDoctorCode.java b/src/main/java/com/ynxbd/push/entity/tencent/AllDoctorCode.java new file mode 100644 index 0000000..22e838b --- /dev/null +++ b/src/main/java/com/ynxbd/push/entity/tencent/AllDoctorCode.java @@ -0,0 +1,17 @@ +package com.ynxbd.push.entity.tencent; + +import lombok.Data; + +import java.util.List; + +/** + * @author 李进才 + * @ClassName AllDoctorCode + * @Description TODO + * @date 2023/08/03 11:35:00 + */ +@Data +public class AllDoctorCode { + private String doctCode; + private List openIds; +} diff --git a/src/main/java/com/ynxbd/push/entity/tencent/SendMessageTemplate.java b/src/main/java/com/ynxbd/push/entity/tencent/SendMessageTemplate.java index fbe895a..3a311da 100644 --- a/src/main/java/com/ynxbd/push/entity/tencent/SendMessageTemplate.java +++ b/src/main/java/com/ynxbd/push/entity/tencent/SendMessageTemplate.java @@ -10,10 +10,16 @@ import lombok.experimental.Tolerate; @Builder @Data public class SendMessageTemplate { - private int code; + private String code; + //组织机构ID + private String organizeName; + // 消息类型 + private String tip; + public String message_id; public String template_id; public String keyword1; private String template_name; + private String patientId; private String keyword1Color = "#173177"; public String keyword2; private String keyword2Color = "#173177"; @@ -72,12 +78,15 @@ public class SendMessageTemplate { private String followUpStaff; private Long timestamp; + private int count; /** * 医生工号 */ private String doctorCode; + + @Tolerate SendMessageTemplate() { } diff --git a/src/main/java/com/ynxbd/push/entity/tencent/WeChatAllDoctorResponse.java b/src/main/java/com/ynxbd/push/entity/tencent/WeChatAllDoctorResponse.java new file mode 100644 index 0000000..07a2403 --- /dev/null +++ b/src/main/java/com/ynxbd/push/entity/tencent/WeChatAllDoctorResponse.java @@ -0,0 +1,19 @@ +package com.ynxbd.push.entity.tencent; + +import lombok.Data; + +import java.util.List; + +/** + * @author 李进才 + * @ClassName WeChatAllDoctResponse + * @Description TODO + * @date 2023/08/03 10:30:00 + */ +@Data +public class WeChatAllDoctorResponse { + private String code; + private List data; + private String message; + private Boolean success; +} diff --git a/src/main/java/com/ynxbd/push/entity/tencent/WeChatResponse.java b/src/main/java/com/ynxbd/push/entity/tencent/WeChatResponse.java index 47f2dbc..53d308f 100644 --- a/src/main/java/com/ynxbd/push/entity/tencent/WeChatResponse.java +++ b/src/main/java/com/ynxbd/push/entity/tencent/WeChatResponse.java @@ -2,6 +2,8 @@ package com.ynxbd.push.entity.tencent; import lombok.Data; +import java.util.List; + /** * @author 李进才 * @ClassName WeChatResponse @@ -12,6 +14,7 @@ import lombok.Data; @Data public class WeChatResponse { private String code; - private String data; + private List data; private String message; + private Boolean success; } diff --git a/src/main/java/com/ynxbd/push/entity/type/MessageTypeEnum.java b/src/main/java/com/ynxbd/push/entity/type/MessageTypeEnum.java new file mode 100644 index 0000000..695938a --- /dev/null +++ b/src/main/java/com/ynxbd/push/entity/type/MessageTypeEnum.java @@ -0,0 +1,28 @@ +package com.ynxbd.push.entity.type; + +/** + * @author 李进才 + * @ClassName MessageTypeEnum + * @Description TODO + * @date 2023/07/04 14:39:00 + */ +public enum MessageTypeEnum { + + REPORT_TIP("ReportTip","检验检查报告通知"), + QUEUE_TIP("QueueTip","排队叫号提醒"), + MEDICAL_RECORD("MedicalRecord","病历复印"), + TREAT_PLAN("treatPlan","诊疗计划提醒"), + + UNIVERSAL("Universal","通用模版推送-绑定通知"); + + + public final String CODE; + public final String MESSAGE; + + + MessageTypeEnum(String code,String message){ + this.CODE=code; + this.MESSAGE = message; + } + +} diff --git a/src/main/java/com/ynxbd/push/entity/type/OrganizeTypeEnum.java b/src/main/java/com/ynxbd/push/entity/type/OrganizeTypeEnum.java new file mode 100644 index 0000000..097d061 --- /dev/null +++ b/src/main/java/com/ynxbd/push/entity/type/OrganizeTypeEnum.java @@ -0,0 +1,30 @@ +package com.ynxbd.push.entity.type; + +/** + * @author 李进才 + * @ClassName OrganizeTypeEnum + * @Description TODO + * @date 2023/07/04 15:20:00 + */ +public enum OrganizeTypeEnum { + + HIS("AE8EB2249EDD9093","xbd_his","公司内部对接时使用代码,包含pacs等"), + + + WEI_MAI("D9113BC820E4C6FF","微脉对接诊疗计划提醒","芒市妇幼微脉对接诊疗计划提醒"), + + CVMS("D7FAEFB46E8F5FEF","危机值管理系统","新八达危机值管理系统"), + + HONGHE01("","深圳市理邦精密仪器股份有限公司","智慧产科系统"); + + public final String CODE; + public final String NAME; + + public final String DESCRIPTION; + + OrganizeTypeEnum(String code,String name,String description){ + this.CODE = code; + this.NAME = name; + this.DESCRIPTION = description; + } +} diff --git a/src/main/java/com/ynxbd/push/entity/xbd/his/HIsWorkLoad.java b/src/main/java/com/ynxbd/push/entity/xbd/his/HIsWorkLoad.java new file mode 100644 index 0000000..a4b5839 --- /dev/null +++ b/src/main/java/com/ynxbd/push/entity/xbd/his/HIsWorkLoad.java @@ -0,0 +1,16 @@ +package com.ynxbd.push.entity.xbd.his; + +import lombok.Data; + +/** + * @author 李进才 + * @ClassName WorkLoad + * @Description description + * @date 2022/8/3 15:06 + */ +@Data +public class HIsWorkLoad { + private String doc_code; + private String doc_name; + private String description; +} diff --git a/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoad.java b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoad.java new file mode 100644 index 0000000..61302a6 --- /dev/null +++ b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoad.java @@ -0,0 +1,16 @@ +package com.ynxbd.push.entity.xbd.wx; + +import lombok.Data; + +/** + * @author 李进才 + * @ClassName WorkLoad + * @Description description + * @date 2022/8/3 15:28 + */ +@Data +public class WorkLoad { + private String doctCode; + private String token; + private String openid; +} diff --git a/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadData.java b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadData.java new file mode 100644 index 0000000..16c7293 --- /dev/null +++ b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadData.java @@ -0,0 +1,17 @@ +package com.ynxbd.push.entity.xbd.wx; + +import lombok.Data; + +import java.util.List; + +/** + * @author 李进才 + * @ClassName WorkLoad + * @Description description + * @date 2022/8/3 15:26 + */ +@Data +public class WorkLoadData { + private String link; + private List list; +} diff --git a/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadResponse.java b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadResponse.java new file mode 100644 index 0000000..cbf4e79 --- /dev/null +++ b/src/main/java/com/ynxbd/push/entity/xbd/wx/WorkLoadResponse.java @@ -0,0 +1,16 @@ +package com.ynxbd.push.entity.xbd.wx; + +import lombok.Data; + +/** + * @author 李进才 + * @ClassName WorkLoadResponse + * @Description description + * @date 2022/8/3 15:32 + */ +@Data +public class WorkLoadResponse { + private String code; + private String message; + private WorkLoadData data; +} diff --git a/src/main/java/com/ynxbd/push/helper/AesCodeHelper.java b/src/main/java/com/ynxbd/push/helper/AesCodeHelper.java new file mode 100644 index 0000000..03a9a39 --- /dev/null +++ b/src/main/java/com/ynxbd/push/helper/AesCodeHelper.java @@ -0,0 +1,79 @@ +package com.ynxbd.push.helper; + + +import org.apache.commons.codec.binary.Hex; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; + +/** + * AES加密算法 + */ +public class AesCodeHelper { + + private final static String KEY = "ynxbdysdssjtwrin"; + + private final static String IV = "ynxbdqsdsbjtwrin"; + + public static String enCode(String data) { + if (data == null) { + return null; + } + return encryptHex(data, KEY, IV); + } + + public static String deCode(String data) { + if (data == null) { + return null; + } + return decryptHex(data, KEY, IV); + } + + + public static String decryptHex(String data, String key, String iv) { + try { + SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8))); + + return new String(cipher.doFinal(Hex.decodeHex(data.toCharArray()))); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * Aes加密算法( Hex) + * + * @param data 加密数据 + * @param key 密钥(16位) + * @param iv 密钥偏移量 + * @return 加密后的数据 + */ + public static String encryptHex(String data, String key, String iv) { + try { + if (key == null || key.length() != 16) { + throw new Exception("Key长度不是16位"); + } + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); //"算法/模式/补码方式" + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"), new IvParameterSpec(iv.getBytes())); + byte[] encrypted = cipher.doFinal(data.getBytes()); + String hexPass = Hex.encodeHexString(encrypted); + return hexPass.toUpperCase(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + + +// public static void main(String[] args) throws Exception { +// String a = decryptHex("", "wsqysqsdssjtwmaa", "xbzynydykkxxkkbb"); +// System.out.println(a); +// } +} \ No newline at end of file diff --git a/src/main/java/com/ynxbd/push/helper/BusinessHelper.java b/src/main/java/com/ynxbd/push/helper/BusinessHelper.java new file mode 100644 index 0000000..f232e11 --- /dev/null +++ b/src/main/java/com/ynxbd/push/helper/BusinessHelper.java @@ -0,0 +1,25 @@ +package com.ynxbd.push.helper; + +import com.ynxbd.push.entity.response.ResponseResult; +import weixin.popular.bean.message.MessageSendResult; + +/** + * @author 李进才 + * @ClassName BusinessHelper + * @Description TODO + * @date 2023/05/11 11:54:00 + */ +public class BusinessHelper { + + public static MessageSendResult ParamsCheck(String organizeName ,String patientId,String idCard,String doctorCode ) { + MessageSendResult messageSendResult = new MessageSendResult(); + if(patientId==null&&idCard==null&&doctorCode==null){ + return ResponseResult.PARAMETER_IS_NULL.toMessResult(); + } + if(DesEncryptHelper.deCode(organizeName).equals("error:null")){ + return ResponseResult.ORGANIZE_IS_NULL.toMessResult(); + } + messageSendResult.setErrcode("0"); + return messageSendResult; + } +} diff --git a/src/main/java/com/ynxbd/push/helper/DesEncryptHelper.java b/src/main/java/com/ynxbd/push/helper/DesEncryptHelper.java index e2402d4..f1fd109 100644 --- a/src/main/java/com/ynxbd/push/helper/DesEncryptHelper.java +++ b/src/main/java/com/ynxbd/push/helper/DesEncryptHelper.java @@ -10,6 +10,9 @@ */ package com.ynxbd.push.helper; +import java.io.File; +import java.util.regex.Matcher; + /** * @author Administrator * @version v1.0.0 @@ -69,7 +72,10 @@ public class DesEncryptHelper { } public static void main(String[] args) { - System.out.println(DesEncryptHelper.enCode("oeso-t5DIu2qpb0LJaKeJ06TRgzw", KEY)); - System.out.println(DesEncryptHelper.deCode("19B20D16C09C4064DF385EDB1863A99B0C05CB8D5DA99C08B4C7AC6B6FAE028D89C90AAE3F5F397CDD177F25230726672B9441E369871608D74A40FD40F7EA3C967D1FBFC1ECCBA872A968C523FCB190A9B959AC822536151A508AA491ECF92B109C96E7B304C84284A45A61C476BA9BC833E2D178ADF27E4984AE325A602F6C08070D47695540349CB5F03072B586FB98009E083E8A20A4542BF29EA0BD120B", KEY)); + String test = "昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术:61人次;微创手术:16人次;四级手术:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512;手术:8816人次,占比:28;四级手术占比:19.01;微创手术占比:17.35;"; + System.out.println(test.replaceAll("\\\\\\\\r", "\\\\r")); + System.out.println(DesEncryptHelper.enCode("xbd_CVMS", KEY)); + + System.out.println(DesEncryptHelper.deCode("C23A7500D2C35F9A85B72795B86F02AFD62A5ECBD06DC050DF47EFA26AA846E3E3FF998FFA576283C021712DD1CAA7EEF74898A8CDFE9ABA8C06C1851574CB802FA096B4B0D8ED791559DEEDFE0BD497AC5365E6370223EF3D706F0BC2427619C762C77B776510D566A36F439CB579A5C55674435F0D800BC44B3299BF484B716D121601D32E26E2", KEY)); } } diff --git a/src/main/java/com/ynxbd/push/helper/HisResultFormat.java b/src/main/java/com/ynxbd/push/helper/HisResultFormat.java new file mode 100755 index 0000000..dd70df5 --- /dev/null +++ b/src/main/java/com/ynxbd/push/helper/HisResultFormat.java @@ -0,0 +1,804 @@ +package com.ynxbd.push.helper; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.ynxbd.push.entity.xbd.his.HIsWorkLoad; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class HisResultFormat { + + @Data + @NoArgsConstructor + @ToString + public static class TestDoctor { + private String docCode; + private String docName; + } + + + public static void main(String[] args) { + String json = "{\n" + + " \"Code\": \"200\",\n" + + " \"Msg\": \"SUCCESS\",\n" + + " \"Data\": [\n" + + " {\n" + + " \"doc_code\": \"0002\",\n" + + " \"doc_name\": \"李卫\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0003\",\n" + + " \"doc_name\": \"杨淑\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0005\",\n" + + " \"doc_name\": \"马晓琳\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0011\",\n" + + " \"doc_name\": \"蔡连勇\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0017\",\n" + + " \"doc_name\": \"江为民\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0019\",\n" + + " \"doc_name\": \"何丽芬\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0023\",\n" + + " \"doc_name\": \"龙红\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0030\",\n" + + " \"doc_name\": \"向梅\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0036\",\n" + + " \"doc_name\": \"杨聪\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0044\",\n" + + " \"doc_name\": \"汤进伟\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0050\",\n" + + " \"doc_name\": \"王跃强\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0054\",\n" + + " \"doc_name\": \"刘炜\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0059\",\n" + + " \"doc_name\": \"马刚\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0062\",\n" + + " \"doc_name\": \"普伦庆\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0066\",\n" + + " \"doc_name\": \"佘艳军\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0068\",\n" + + " \"doc_name\": \"孔洁\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0069\",\n" + + " \"doc_name\": \"赵悦涛\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0072\",\n" + + " \"doc_name\": \"崔金鹏\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0073\",\n" + + " \"doc_name\": \"李艳华\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0074\",\n" + + " \"doc_name\": \"王俊青\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0114\",\n" + + " \"doc_name\": \"霍松\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0134\",\n" + + " \"doc_name\": \"丁俊\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0151\",\n" + + " \"doc_name\": \"马锦霞\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0156\",\n" + + " \"doc_name\": \"陈朝明\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"018 \",\n" + + " \"doc_name\": \"张娜\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0194\",\n" + + " \"doc_name\": \"钟兴伟\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0199\",\n" + + " \"doc_name\": \"沈曼\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0208\",\n" + + " \"doc_name\": \"马韬\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0226\",\n" + + " \"doc_name\": \"卢俊\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0241\",\n" + + " \"doc_name\": \"蒙艳\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0248\",\n" + + " \"doc_name\": \"王璟\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0255\",\n" + + " \"doc_name\": \"赵德斌\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0269\",\n" + + " \"doc_name\": \"普福顺\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0469\",\n" + + " \"doc_name\": \"谭永兴\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0473\",\n" + + " \"doc_name\": \"白云辉\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0475\",\n" + + " \"doc_name\": \"苗蔚\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0705\",\n" + + " \"doc_name\": \"吉惠\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0731\",\n" + + " \"doc_name\": \"徐俊\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0805\",\n" + + " \"doc_name\": \"王长林\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0808\",\n" + + " \"doc_name\": \"董艳玲\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1025\",\n" + + " \"doc_name\": \"代建能\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1118\",\n" + + " \"doc_name\": \"赵悦涛*\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1135\",\n" + + " \"doc_name\": \"李桂芬\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1233\",\n" + + " \"doc_name\": \"毕燕\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1251\",\n" + + " \"doc_name\": \"普虹丽(康\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1349\",\n" + + " \"doc_name\": \"蒋俊**\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1460\",\n" + + " \"doc_name\": \"赵艳红\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1462\",\n" + + " \"doc_name\": \"赵林\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1491\",\n" + + " \"doc_name\": \"白建平\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1618\",\n" + + " \"doc_name\": \"王蕾\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1669\",\n" + + " \"doc_name\": \"胡琳\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1688\",\n" + + " \"doc_name\": \"张丽红*\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1737\",\n" + + " \"doc_name\": \"沈海荣\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1845\",\n" + + " \"doc_name\": \"陈淑媛*\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1951\",\n" + + " \"doc_name\": \"赵永贵*\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2079\",\n" + + " \"doc_name\": \"田劲猛*\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2280\",\n" + + " \"doc_name\": \"赵永贵.\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2337\",\n" + + " \"doc_name\": \"郭鹏\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2390\",\n" + + " \"doc_name\": \"普兴林\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2423\",\n" + + " \"doc_name\": \"魏进云\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2495\",\n" + + " \"doc_name\": \"李仁伟\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2641\",\n" + + " \"doc_name\": \"赵青\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2676\",\n" + + " \"doc_name\": \"袁乔英\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2687\",\n" + + " \"doc_name\": \"杨金有\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2747\",\n" + + " \"doc_name\": \"何黎\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2754\",\n" + + " \"doc_name\": \"李雪梅.\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2784\",\n" + + " \"doc_name\": \"张艳.\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2959\",\n" + + " \"doc_name\": \"申永林*\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"3553\",\n" + + " \"doc_name\": \"孔洁.\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"3717\",\n" + + " \"doc_name\": \"王俊青.*\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"3764\",\n" + + " \"doc_name\": \"蒙艳.\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"4041\",\n" + + " \"doc_name\": \"李始秀\",\n" + + " \"titleName\": \"科主任\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0274\",\n" + + " \"doc_name\": \"刘翠\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0278\",\n" + + " \"doc_name\": \"龙莉\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0297\",\n" + + " \"doc_name\": \"毛颖懿\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0313\",\n" + + " \"doc_name\": \"王雯秀\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0314\",\n" + + " \"doc_name\": \"杨金凤\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0315\",\n" + + " \"doc_name\": \"白云芬\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0323\",\n" + + " \"doc_name\": \"骆钰玺\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0333\",\n" + + " \"doc_name\": \"袁慧\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0339\",\n" + + " \"doc_name\": \"王雪华\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0355\",\n" + + " \"doc_name\": \"卢宝丽\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0361\",\n" + + " \"doc_name\": \"胡海燕\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0381\",\n" + + " \"doc_name\": \"高云丽\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0393\",\n" + + " \"doc_name\": \"柏雪\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0477\",\n" + + " \"doc_name\": \"张翠兰\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0491\",\n" + + " \"doc_name\": \"赵文娟\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0521\",\n" + + " \"doc_name\": \"钱润润\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0604\",\n" + + " \"doc_name\": \"何劲梅\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0608\",\n" + + " \"doc_name\": \"官丽亚\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"0789\",\n" + + " \"doc_name\": \"沈成荣\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1286\",\n" + + " \"doc_name\": \"黄梦诗\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1423\",\n" + + " \"doc_name\": \"高姝\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1453\",\n" + + " \"doc_name\": \"高丽萍\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1687\",\n" + + " \"doc_name\": \"邹婷\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"1985\",\n" + + " \"doc_name\": \"王迪一\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2131\",\n" + + " \"doc_name\": \"孙海燕\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2175\",\n" + + " \"doc_name\": \"邓延华\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2461\",\n" + + " \"doc_name\": \"罗艳\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2513\",\n" + + " \"doc_name\": \"马兰兰\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2557\",\n" + + " \"doc_name\": \"郑虞华.\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2588\",\n" + + " \"doc_name\": \"李金艳\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2602\",\n" + + " \"doc_name\": \"蒋金芳\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2610\",\n" + + " \"doc_name\": \"蒋艳梅\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2651\",\n" + + " \"doc_name\": \"李凤.\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2696\",\n" + + " \"doc_name\": \"易玲\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"2710\",\n" + + " \"doc_name\": \"李艳.\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"3241\",\n" + + " \"doc_name\": \"罗效萍\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " },\n" + + " {\n" + + " \"doc_code\": \"3550\",\n" + + " \"doc_name\": \"王迪一.\",\n" + + " \"titleName\": \"护士长\",\n" + + " \"description\": \"昨日门诊:3697人次;非核酸门诊:2302人次;在院:1377人;入院:224人;出院:191人;危重:0人;手术人次:61人次;微创手术人次:16人次;四级手术人次:6人次;\\\\r\\\\n今年截至昨日门诊:794298人次;非核酸门诊:423528人次;出院:32130人;实际开放床:1224张;病床使用率:91.512%;手术:8809人次,占比:28%;四级手术占比:19.01%;微创手术占比:17.31%;\"\n" + + " }\n" + + " ],\n" + + " \"Note\": {\n" + + " \"funcName\": \"DeanSearch_wechatDataPush\",\n" + + " \"funcNote\": \"微信推送数据\",\n" + + " \"connTime\": 30,\n" + + " \"inParams\": {},\n" + + " \"isListOutParams\": true,\n" + + " \"outParams\": {\n" + + " \"doc_code\": \"医生代码\",\n" + + " \"doc_name\": \"医生名称\",\n" + + " \"titleName\": \"职位\",\n" + + " \"description\": \"推送信息描述\"\n" + + " }\n" + + " }\n" + + "}"; + + String respData = getRespData(json); + List testDoctors = jsonToList(respData, HIsWorkLoad.class); + System.out.println(testDoctors); + + List doctCodeList = jsonToList(respData, "docCode"); + System.out.println(doctCodeList); + } + + /** + * 获取请求中的数据 + */ + public static String getRespData(String respData) { + if (respData == null) { + return null; + } + JSONObject jsonResp = JSON.parseObject(respData); + String code = jsonResp.getString("Code"); + String message = jsonResp.getString("Msg"); + if ("200".equals(code) && "SUCCESS".equals(message)) { + String data = jsonResp.getString("Data"); + return "".equals(data) ? null : data; + } + log.info("[请求失败]code={}, message={}", code, message); + return null; + } + + public static List jsonToList(String data, Class clazz) { + if (data == null) { + return new ArrayList<>(); + } + String jsonStr = JSON.toJSONString(data); + if ("".equals(jsonStr)) { + return new ArrayList<>(); + } + try { + return JSON.parseArray(data, clazz); + } catch (Exception e) { + log.error(e.getMessage()); + return new ArrayList<>(); + } + } + + /** + * 获取对象数组中某个名称的值,加入集合 + * + * @param data json数据 + * @param name 属性名称 + * @return 属性List + */ + public static List jsonToList(String data, String name) { + List resultList = new ArrayList<>(); + if (data == null) { + return resultList; + } + String jsonStr = JSON.toJSONString(data); + if ("".equals(jsonStr)) { + return resultList; + } + + try { + JSONArray jsonArr = JSON.parseArray(data); + JSONObject itemObj; + String val; + for (int i = 0; i < jsonArr.size(); i++) { + itemObj = jsonArr.getJSONObject(i); + if (itemObj == null) { + continue; + } + val = itemObj.getString(name); + if (val != null && !"".equals(val)) { + resultList.add(val); + } + } + return resultList; + } catch (Exception e) { + log.error(e.getMessage()); + } + return resultList; + } + + /** + * json转实体类 + * @param data 数据 + * @param clazz 类型 + * @return 对象 + */ + public static T jsonToBean(String data, Class clazz) { + if (data == null) { + return null; + } + String jsonStr = JSON.toJSONString(data); + if ("".equals(jsonStr)) { + return null; + } + try { + return JSON.parseObject(data, clazz); + } catch (Exception e) { + log.error(e.getMessage()); + return null; + } + } + +} diff --git a/src/main/java/com/ynxbd/push/helper/MessageApiHelper.java b/src/main/java/com/ynxbd/push/helper/MessageApiHelper.java index 48cbfc1..ea0ae3f 100644 --- a/src/main/java/com/ynxbd/push/helper/MessageApiHelper.java +++ b/src/main/java/com/ynxbd/push/helper/MessageApiHelper.java @@ -2,9 +2,12 @@ package com.ynxbd.push.helper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.sun.jndi.toolkit.url.UrlUtil; import com.ynxbd.push.config.IniConfig; import com.ynxbd.push.entity.*; +import com.ynxbd.push.entity.response.ResponseResult; import com.ynxbd.push.entity.tencent.*; +import com.ynxbd.push.httpRequest.tencent.WeChatDataRequest; import com.ynxbd.push.httpRequest.xbd.wx.WxCacheRequest; import com.ynxbd.push.thread.ThreadConfig; import lombok.SneakyThrows; @@ -17,6 +20,7 @@ import org.apache.http.concurrent.FutureCallback; import org.apache.http.entity.StringEntity; import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; import org.springframework.beans.BeanUtils; +import org.springframework.web.util.UriUtils; import weixin.popular.api.API; import weixin.popular.api.MessageAPI; import weixin.popular.api.UserAPI; @@ -50,8 +54,6 @@ public class MessageApiHelper { public static final Integer EVERY_OPENID_COUNT = 10000; - public static final String CODE_INVALIDATION = "40001"; - public static final String CODE_EXPIRED = "42001"; public static final String MESSAGE_RESULT_ERROR_CODE = "4002"; /** @@ -62,7 +64,7 @@ public class MessageApiHelper { */ public static MessageSendResult templateMessageSend(SendMessageTemplate template) { MessageSendResult messageSendResult = templateMessage(template); - log.info("TenCent Return Message" + messageSendResult.getErrcode()); + log.info("消息发送状态:腾讯返回-{},messageId-{},openId-{}", messageSendResult.getErrcode(),template.getMessage_id(),template.getOpenId()); return messageSendResult; } @@ -74,13 +76,14 @@ public class MessageApiHelper { */ public static MessageSendResult templateMessage(SendMessageTemplate sendMessageTemplate) { try { + sendMessageTemplate.setUrl(UriUtils.decode(sendMessageTemplate.getUrl(),StandardCharsets.UTF_8.toString())); String jsonMessage = TemplateSelectHelper.select(sendMessageTemplate); + jsonMessage = jsonMessage.replaceAll("\\\\\\\\r", "\\\\r"); + jsonMessage = jsonMessage.replaceAll("\\\\\\\\n", "\\\\n"); log.info("SendTenCentJson:{}", jsonMessage); return templateMessageSend(jsonMessage); } catch (Exception e) { - MessageSendResult messageSendResult = new MessageSendResult(); - messageSendResult.setErrcode(MESSAGE_RESULT_ERROR_CODE); - return messageSendResult; + return ResponseResult.MESSAGE_RESULT_ERROR_CODE.toMessResult(); } } @@ -94,7 +97,7 @@ public class MessageApiHelper { MessageSendResult result = LocalHttpClient.executeJsonResult(httpUriRequest, MessageSendResult.class); String errCode = result.getErrcode(); - if (CODE_INVALIDATION.equals(errCode) || CODE_EXPIRED.equals(errCode)) { + if (ResponseResult.CODE_INVALIDATION.ERR_CODE.equals(errCode) || ResponseResult.CODE_EXPIRED.ERR_CODE.equals(errCode)) { String errMsg = result.getErrmsg(); log.error("[推送]请求失败 errCode={}, errMsg={}", errCode, errMsg); } @@ -118,9 +121,7 @@ public class MessageApiHelper { return MessageAPI.messageMassSendall(accessToken, textMessage); } catch (Exception e) { log.info(e.getMessage()); - MessageSendResult messageSendResult = new MessageSendResult(); - messageSendResult.setErrcode(MESSAGE_RESULT_ERROR_CODE); - return messageSendResult; + return ResponseResult.MESSAGE_RESULT_ERROR_CODE.toMessResult(); } } @@ -143,12 +144,105 @@ public class MessageApiHelper { String jsonTestMessage = new ObjectMapper().writeValueAsString(testMessage); return messageMassSend(jsonTestMessage); } catch (Exception e) { - MessageSendResult messageSendResult = new MessageSendResult(); - messageSendResult.setErrcode(MESSAGE_RESULT_ERROR_CODE); - return messageSendResult; + return ResponseResult.MESSAGE_RESULT_ERROR_CODE.toMessResult(); } } + /** + * 根据患者ID或者医生ID推送模版消息 + * @param organizeName + * @param idCard + * @param title + * @param patientId + * @param doctorCode + * @param first + * @param keyword1 + * @param keyword2 + * @param keyword3 + * @param keyword4 + * @param keyword5 + * @param remark + * @param url + * @return + */ + public static MessageSendResult TemplateMessageForCode(String organizeName,String code, String idCard, String title, String patientId, String doctorCode, String first, String keyword1, String keyword2, String keyword3, String keyword4, String keyword5, String remark, String url,String messageId){ + if(patientId==null&&idCard==null&&doctorCode==null){ + log.info("[{}]参数无效",title); + return ResponseResult.PARAMETER_IS_NULL.toMessResult(); + } + if(DesEncryptHelper.deCode(organizeName).equals("error:null")){ + log.info("[{}]组织机构代码无效,organizeName-{}",title,organizeName); + return ResponseResult.ORGANIZE_IS_NULL.toMessResult(); + } + String reportTemplateId = WeChatDataRequest.getTemplateId(title); + if("绑定通知".equals(title)&&reportTemplateId==null){ + reportTemplateId = WeChatDataRequest.getTemplateId("医院通知"); + } + if(IniConfig.getInstance("templateVersion")==null){ + code = ""; + } + if(doctorCode!=null){ + List allDoctorCodeList = WeChatDataRequest.getAllOpenIdForDoctorCode(doctorCode); + if (allDoctorCodeList.isEmpty()){ + log.info("[{}]{}未绑定微官网,doctorCode:{}",title,DesEncryptHelper.deCode(organizeName),doctorCode); + return ResponseResult.NOT_FIND_DATA.toMessResult(); + } + for (String interfaceOpenId:allDoctorCodeList){ + String openId = AesCodeHelper.deCode(interfaceOpenId); + SendMessageTemplate sendMessageTemplate = SendMessageTemplate.builder() + .template_id(reportTemplateId) + .first(first) + .code(code) + .message_id(messageId) + .keyword1(keyword1) + .keyword2(keyword2) + .keyword3(keyword3) + .keyword4(keyword4) + .keyword5(keyword5) + .remark(remark) + .openId(openId) + .url(url) + .build(); + MessageSendResult messageSendResult = templateMessageSend(sendMessageTemplate); + log.info("[{}]{}医生账号消息推送,推送结果代码-{},推送结果-{}",title,DesEncryptHelper.deCode(organizeName),messageSendResult.getErrcode(),messageSendResult.getErrmsg()); + } + return ResponseResult.JOIN_QUEUE.toMessResult(); + } + log.info("[外部组织对接推送]"+DesEncryptHelper.deCode(organizeName)+"发送"+title+"消息"); + String weChatUrl ="http://127.0.0.1/wx/"; + HttpUriRequest httpUriRequest = RequestBuilder + .get() + .setHeader(jsonHeader) + .setUri(new StringBuilder() + .append(weChatUrl) + .append(patientId!=null?"patient/getOpenIdsByPatientId.do":"patient/getOpenIdsByCardNo.do").toString()) + .addParameter(patientId!=null?"patientId":"cardNo", patientId!=null?patientId:idCard) + .addParameter("algorithm", "des") + .addParameter("isEncryptComma", "false") + .addParameter("isLastBind", "true") + .build(); + WeChatResponse weChatResponse = LocalHttpClient.executeJsonResult(httpUriRequest, WeChatResponse.class); + if (weChatResponse.getData() == null) { + return ResponseResult.NOT_FIND_DATA.toMessResult(); + } + String openId = DesEncryptHelper.deCode(weChatResponse.getData().get(0)); + SendMessageTemplate sendMessageTemplate = SendMessageTemplate.builder() + .template_id(reportTemplateId) + .first(first) + .code(code) + .keyword1(keyword1) + .message_id(messageId) + .keyword2(keyword2) + .keyword3(keyword3) + .keyword4(keyword4) + .keyword5(keyword5) + .remark(remark) + .openId(openId) + .url(url) + .build(); + return templateMessageSend(sendMessageTemplate); + } + /** * 通过客服的方式发送链接信息给用户 * @@ -173,9 +267,7 @@ public class MessageApiHelper { String jsonTestMessage = new ObjectMapper().writeValueAsString(linkMessage); return messageMassSend(jsonTestMessage); } catch (Exception e) { - MessageSendResult messageSendResult = new MessageSendResult(); - messageSendResult.setErrcode(MESSAGE_RESULT_ERROR_CODE); - return messageSendResult; + return ResponseResult.MESSAGE_RESULT_ERROR_CODE.toMessResult(); } } diff --git a/src/main/java/com/ynxbd/push/helper/RedisHelper.java b/src/main/java/com/ynxbd/push/helper/RedisHelper.java new file mode 100644 index 0000000..635f5e7 --- /dev/null +++ b/src/main/java/com/ynxbd/push/helper/RedisHelper.java @@ -0,0 +1,63 @@ +package com.ynxbd.push.helper; + +import com.alibaba.fastjson.JSONObject; +import io.lettuce.core.RedisClient; +import io.lettuce.core.api.StatefulRedisConnection; +import io.lettuce.core.api.sync.RedisCommands; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author 李进才 + * @ClassName RedisHelper + * @Description TODO + * @date 2023/05/06 16:33:00 + */ +public class RedisHelper { + + private static final String PASSWORD = "wx.xbd.cn"; + private static final String HOST = "127.0.0.1"; + private static final String PORT = "6379"; + private static RedisCommands redis; + + private static StatefulRedisConnection connection; + private static RedisClient redisClient; + + + private RedisHelper() { + redisClient = RedisClient.create("redis://"+PASSWORD+"@"+HOST+":"+PORT+"/0"); + connection = redisClient.connect(); + redis = connection.sync(); + } + public static RedisHelper getRedis() { + return Inner.instance; + } + private static class Inner{ + private static final RedisHelper instance = new RedisHelper(); + } + + public String set(String name, String key, Integer expire){ + String result = redis.set(name,key); + redis.expire(name,expire); + return result; + } + + public String get(String name){ + return redis.get(name); + } + public void close() { + connection.close(); + redisClient.shutdown(); + } + + public static void main(String[] args) { + Map params = new HashMap<>(); + params.put("description", "昨日门诊2217人;非核酸门诊2184人;在院1188人;入院156人;出院186人;手术16台;微创手术4台;四级手术1台;\\\\r\\\\n今年截至昨日门诊286674人;非核酸门诊271307人;出院20271人;实际开放床1224张;病床使用率97.03%;手术5482台,占比28%;四级手术占比20.38%;微创手术占比18.02%;"); + params.put("url", "https://wx.hhzyy.com//wx3302/tickets/GetPage?t=A95C0ACF523B396D48857B85B82D3A47CA3DC877FEAAE4C6AB1A462C0F18D6BA5757732FA6B8C07234D62391B46725A05152BA217FAB03BAAFEA62592BE23CA74940A3A2CC82F6C4FEA21A67140C1348B1C523EA989469DED47DFD0EE2D029FF9B52C8877A18BF0FC158125764E615376029DD33461D4083C1D1A0CF78FFEAC36F6836E1BB05E7779D165D315EAEEA9EDA71819D3F356436BF59C21FB29EBA4C83DB68514B07BFC951C432A0923F5DD71457F9A9A424400ADB506C43617FF83DEDAB1E337567927557D704325AF06160966B0A66B6F1C5470A3776ACC30730C65994D3B3AB879A728C07268B14E6B7371B1D3EE533018A92C8E871A85C6887285D3A39A660CD87AB6CD5FE759E87445228D519359B1D8C925BECD80FC466FA6C"); + for(int i = 0; i<200; i++){ + System.out.println(Integer.toString(i) +":"+ RedisHelper.getRedis().set(Integer.toString(i), JSONObject.toJSONString(params),86400)); + } + RedisHelper.getRedis().close(); + } +} diff --git a/src/main/java/com/ynxbd/push/helper/RequestHelper.java b/src/main/java/com/ynxbd/push/helper/RequestHelper.java index 16d414d..2e17962 100644 --- a/src/main/java/com/ynxbd/push/helper/RequestHelper.java +++ b/src/main/java/com/ynxbd/push/helper/RequestHelper.java @@ -79,6 +79,8 @@ public class RequestHelper extends SimpleClientHttpRequestFactory { } + + /** * 向目的URL发送get请求 * diff --git a/src/main/java/com/ynxbd/push/helper/StringHelper.java b/src/main/java/com/ynxbd/push/helper/StringHelper.java new file mode 100644 index 0000000..82ab07e --- /dev/null +++ b/src/main/java/com/ynxbd/push/helper/StringHelper.java @@ -0,0 +1,39 @@ +package com.ynxbd.push.helper; + +import org.springframework.util.ObjectUtils; + +import java.nio.charset.StandardCharsets; + +/** + * @author 李进才 + * @ClassName StringHelper + * @Description description + * @date 2023/1/28 09:41 + */ +public class StringHelper { + /** + * 数字倒序排列 + * + * @param num 被排序数字 + */ + public static String numDesc(String num) { + StringBuilder sb = new StringBuilder(); + if (ObjectUtils.isEmpty(num)) { + return null; + } + for (int i = num.length() - 1; i >= 0; i--) { + sb.append(num.charAt(i)); + } + return sb.toString(); + } + /** + * BASE64加密 + * + * @param data 需要加密的字符串 + * @return 加密后的字符串 + */ + public static String encode(String data) { + return java.util.Base64.getEncoder().encodeToString(data.getBytes(StandardCharsets.UTF_8)); + } + +} diff --git a/src/main/java/com/ynxbd/push/helper/TemplateAllKeyWordJson.java b/src/main/java/com/ynxbd/push/helper/TemplateAllKeyWordJson.java index aecc363..c81d901 100644 --- a/src/main/java/com/ynxbd/push/helper/TemplateAllKeyWordJson.java +++ b/src/main/java/com/ynxbd/push/helper/TemplateAllKeyWordJson.java @@ -55,6 +55,7 @@ public class TemplateAllKeyWordJson { } + /** * 模板请求 拼接data 有小程序跳转 * @@ -85,15 +86,16 @@ public class TemplateAllKeyWordJson { if (color != null) { itemMap.put("color", color); } + itemMap.put("value", item.getValue()); data.put(("keyword" + (i + 1)), itemMap); } } if(StringUtils.isNotBlank(appId)&&StringUtils.isNotBlank(pagePath)){ - return getTemplateJson(templateId, openId, url, data); + return getTemplateJson(templateId, openId, url, data, appId, pagePath); } - return getTemplateJson(templateId, openId, url, data, appId, pagePath); + return getTemplateJson(templateId, openId, url, data); } /** diff --git a/src/main/java/com/ynxbd/push/helper/TemplateJsonStringHelper.java b/src/main/java/com/ynxbd/push/helper/TemplateJsonStringHelper.java index c2a7b67..d4e4eee 100644 --- a/src/main/java/com/ynxbd/push/helper/TemplateJsonStringHelper.java +++ b/src/main/java/com/ynxbd/push/helper/TemplateJsonStringHelper.java @@ -365,6 +365,12 @@ public class TemplateJsonStringHelper { public static String get16(SendMessageTemplate key) { return "{\"data\":{\"keyword1\":{\"color\":\"#173177\",\"value\":\"" + key.getDoctor() + "\"},\"keyword2\":{\"color\":\"#173177\",\"value\":\"" + key.getPatientName() + "\"},\"keyword3\":{\"color\":\"#173177\",\"value\":\"" + key.getFollowUpStaff() + "\"},\"first\":{\"color\":\"#173177\",\"value\":\"" + key.getFirst() + "\"},\"remark\":{\"color\":\"#173177\",\"value\":\"" + key.getRemark() + "\"}},\"template_id\":\"" + key.getTemplate_id() + "\",\"touser\":\"" + key.getOpenId() + "\",\"url\":\"" + key.getUrl() + "\"}"; } + public static String getReportTip(SendMessageTemplate key) { + return "{\"data\":{\"character_string12\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword1() + "\"},\"thing3\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword2() + "\"},\"first\":{\"color\":\"#173177\",\"value\":\"" + key.getFirst() + "\"},\"character_string9\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword3() + "\"},\"time14\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword4() + "\"},\"thing5\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword5() + "\"},\"remark\":{\"color\":\"#173177\",\"value\":\"" + key.getRemark() + "\"}},\"template_id\":\"" + key.getTemplate_id() + "\",\"touser\":\"" + key.getOpenId() + "\",\"url\":\"" + key.getUrl() + "\"}"; + } + public static String getUniversal(SendMessageTemplate key) { + return "{\"data\":{\"time13\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword1() + "\"},\"thing16\":{\"color\":\"#173177\",\"value\":\"" + key.getKeyword2() + "\"},\"first\":{\"color\":\"#173177\",\"value\":\"" + key.getFirst() + "\"},\"remark\":{\"color\":\"#173177\",\"value\":\"" + key.getRemark() + "\"}},\"template_id\":\"" + key.getTemplate_id() + "\",\"touser\":\"" + key.getOpenId() + "\",\"url\":\"" + key.getUrl() + "\"}"; + } diff --git a/src/main/java/com/ynxbd/push/helper/TemplateSelectHelper.java b/src/main/java/com/ynxbd/push/helper/TemplateSelectHelper.java index 8583d2d..66abb70 100644 --- a/src/main/java/com/ynxbd/push/helper/TemplateSelectHelper.java +++ b/src/main/java/com/ynxbd/push/helper/TemplateSelectHelper.java @@ -10,54 +10,60 @@ public class TemplateSelectHelper { public static String select(SendMessageTemplate sendMessageTemplate) throws JsonProcessingException { String jsonString = null; switch (sendMessageTemplate.getCode()) { - case 1: + case "1": jsonString = TemplateJsonStringHelper.get1(sendMessageTemplate); break; - case 2: + case "2": jsonString = TemplateJsonStringHelper.get2(sendMessageTemplate); break; - case 3: + case "3": jsonString = TemplateJsonStringHelper.get3(sendMessageTemplate); break; - case 4: + case "4": jsonString = TemplateJsonStringHelper.get4(sendMessageTemplate); break; - case 5: + case "5": jsonString = TemplateJsonStringHelper.get5(sendMessageTemplate); break; - case 6: + case "6": jsonString = TemplateJsonStringHelper.get6(sendMessageTemplate); break; - case 7: + case "7": jsonString = TemplateJsonStringHelper.get7(sendMessageTemplate); break; - case 8: + case "8": jsonString = TemplateJsonStringHelper.get8(sendMessageTemplate); break; - case 9: + case "9": jsonString = TemplateJsonStringHelper.get9(sendMessageTemplate); break; - case 10: + case "10": jsonString = TemplateJsonStringHelper.get10(sendMessageTemplate); break; - case 11: + case "11": jsonString = TemplateJsonStringHelper.get11(sendMessageTemplate); break; - case 12: + case "12": jsonString = TemplateJsonStringHelper.get12(sendMessageTemplate); break; - case 13: + case "13": jsonString = TemplateJsonStringHelper.get13(sendMessageTemplate); break; - case 14: + case "14": jsonString = TemplateJsonStringHelper.get14(sendMessageTemplate); break; - case 15: + case "15": jsonString = TemplateJsonStringHelper.get15(sendMessageTemplate); break; - case 16: + case "16": jsonString = TemplateJsonStringHelper.get16(sendMessageTemplate); break; + case "ReportTip": + jsonString = TemplateJsonStringHelper.getReportTip(sendMessageTemplate); + break; + case "Universal": + jsonString = TemplateJsonStringHelper.getUniversal(sendMessageTemplate); + break; default: jsonString = TemplateJsonStringHelper.get(sendMessageTemplate); } diff --git a/src/main/java/com/ynxbd/push/helper/TestResult.java b/src/main/java/com/ynxbd/push/helper/TestResult.java deleted file mode 100755 index 466df43..0000000 --- a/src/main/java/com/ynxbd/push/helper/TestResult.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.ynxbd.push.helper; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; -import java.util.List; - -@Slf4j -public class TestResult { - - @Data - @NoArgsConstructor - @ToString - public static class TestDoctor { - private String docCode; - private String docName; - } - - - public static void main(String[] args) { - String json = "{\n" + - " \"Code\": \"200\",\n" + - " \"Msg\": \"SUCCESS\",\n" + - " \"Data\": [\n" + - " {\n" + - " \"docCode\": \"0002\",\n" + - " \"docName\": \"李卫\"\n" + - " },\n" + - " {\n" + - " \"docCode\": \"0003\",\n" + - " \"docName\": \"杨淑\"\n" + - " },\n" + - " {\n" + - " \"docCode\": \"0005\",\n" + - " \"docName\": \"马晓琳\"\n" + - " },\n" + - " {\n" + - " \"docCode\": \"0010\",\n" + - " \"docName\": \"张永云\"\n" + - " },\n" + - " {\n" + - " \"docCode\": \"0011\",\n" + - " \"docName\": \"蔡连勇\"\n" + - " },\n" + - " {\n" + - " \"docCode\": \"0012\",\n" + - " \"docName\": \"罗琳辉\"\n" + - " },\n" + - " {\n" + - " \"docCode\": \"0013\",\n" + - " \"docName\": \"屈继波\"\n" + - " },\n" + - " {\n" + - " \"docCode\": \"0015\",\n" + - " \"docName\": \"李瀛\"\n" + - " },\n" + - " {\n" + - " \"docCode\": \"0016\",\n" + - " \"docName\": \"杨阳\"\n" + - " },\n" + - " {\n" + - " \"docCode\": \"0017\",\n" + - " \"docName\": \"江为民\"\n" + - " }\n" + - " ],\n" + - " \"Note\": {\n" + - " \"funcName\": \"DeanSearch_wechatDataPush\",\n" + - " \"funcNote\": \"微信推送数据\",\n" + - " \"connTime\": 30,\n" + - " \"inParams\": {},\n" + - " \"isListOutParams\": true,\n" + - " \"outParams\": {\n" + - " \"docCode\": \"医生code\",\n" + - " \"docName\": \"医生name\"\n" + - " }\n" + - " }\n" + - "}"; - - String respData = getRespData(json); - System.out.println(respData); - List testDoctors = jsonToList(respData, TestDoctor.class); - System.out.println(testDoctors); - - List doctCodeList = jsonToList(respData, "docCode"); - System.out.println(doctCodeList); - } - - /** - * 获取请求中的数据 - */ - public static String getRespData(String respData) { - if (respData == null) { - return null; - } - JSONObject jsonResp = JSON.parseObject(respData); - String code = jsonResp.getString("Code"); - String message = jsonResp.getString("Msg"); - if ("200".equals(code) && "SUCCESS".equals(message)) { - String data = jsonResp.getString("Data"); - return "".equals(data) ? null : data; - } - log.info("[请求失败]code={}, message={}", code, message); - return null; - } - - public static List jsonToList(String data, Class clazz) { - if (data == null) { - return new ArrayList<>(); - } - String jsonStr = JSON.toJSONString(data); - if ("".equals(jsonStr)) { - return new ArrayList<>(); - } - try { - return JSON.parseArray(data, clazz); - } catch (Exception e) { - log.error(e.getMessage()); - return new ArrayList<>(); - } - } - - /** - * 获取对象数组中某个名称的值,加入集合 - * - * @param data json数据 - * @param name 属性名称 - * @return 属性List - */ - public static List jsonToList(String data, String name) { - List resultList = new ArrayList<>(); - if (data == null) { - return resultList; - } - String jsonStr = JSON.toJSONString(data); - if ("".equals(jsonStr)) { - return resultList; - } - - try { - JSONArray jsonArr = JSON.parseArray(data); - JSONObject itemObj; - String val; - for (int i = 0; i < jsonArr.size(); i++) { - itemObj = jsonArr.getJSONObject(i); - if (itemObj == null) { - continue; - } - val = itemObj.getString(name); - if (val != null && !"".equals(val)) { - resultList.add(val); - } - } - return resultList; - } catch (Exception e) { - log.error(e.getMessage()); - } - return resultList; - } - - /** - * json转实体类 - * @param data 数据 - * @param clazz 类型 - * @return 对象 - */ - public static T jsonToBean(String data, Class clazz) { - if (data == null) { - return null; - } - String jsonStr = JSON.toJSONString(data); - if ("".equals(jsonStr)) { - return null; - } - try { - return JSON.parseObject(data, clazz); - } catch (Exception e) { - log.error(e.getMessage()); - return null; - } - } - -} diff --git a/src/main/java/com/ynxbd/push/httpRequest/tencent/WeChatDataRequest.java b/src/main/java/com/ynxbd/push/httpRequest/tencent/WeChatDataRequest.java index dcd85e5..9f19942 100644 --- a/src/main/java/com/ynxbd/push/httpRequest/tencent/WeChatDataRequest.java +++ b/src/main/java/com/ynxbd/push/httpRequest/tencent/WeChatDataRequest.java @@ -1,11 +1,14 @@ package com.ynxbd.push.httpRequest.tencent; -import com.ynxbd.push.entity.tencent.TemplateList; -import com.ynxbd.push.entity.tencent.WeChatResponse; -import com.ynxbd.push.entity.tencent.WeChatUserInfo; +import com.alibaba.fastjson.JSONObject; +import com.ynxbd.push.entity.tencent.*; +import com.ynxbd.push.entity.xbd.wx.WorkLoadResponse; +import com.ynxbd.push.helper.DesEncryptHelper; +import com.ynxbd.push.helper.RedisHelper; import com.ynxbd.push.helper.RequestHelper; import com.ynxbd.push.httpRequest.xbd.wx.WxCacheRequest; +import lombok.extern.slf4j.Slf4j; import org.apache.http.Header; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.RequestBuilder; @@ -13,6 +16,7 @@ import weixin.popular.api.API; import weixin.popular.client.LocalHttpClient; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -22,6 +26,7 @@ import java.util.stream.Collectors; * * @author 李进才 */ +@Slf4j public class WeChatDataRequest { private WeChatDataRequest() { } @@ -33,18 +38,49 @@ public class WeChatDataRequest { return LocalHttpClient.executeJsonResult(httpUriRequest, WeChatUserInfo.class); } - public static WeChatResponse getOpenIdForDoctorCode(String doctorCode) { + public static List getOpenIdForDoctorCode(String doctorCode) { + return RequestHelper.get("http://127.0.0.1:9090/micro/msg_push/doctor?doctCode="+doctorCode, null, WeChatResponse.class).getData(); + } + + public static List getAllOpenIdForDoctorCode(String doctorCode) { + return RequestHelper.get("http://127.0.0.1:9090/micro/msg_push/doctorOpenIds?doctCode="+doctorCode, null, WeChatResponse.class).getData(); + } + + public static WeChatAllDoctorResponse getAllOpenIdForDoctorCode() { + return RequestHelper.get("http://127.0.0.1:9090/micro/msg_push/doctorOpenIdTree", null, WeChatAllDoctorResponse.class); + } + + public static WorkLoadResponse getOpenIdAndTokenToBi() { + return RequestHelper.get("http://127.0.0.1:9090/micro/doctor/getDocModuleLink?code=xsjc", null, WorkLoadResponse.class); + } + + public static String GetOpenIdForPatientId(String patientId){ + String wx_openId_url = "http://wx.mzsrmyy.net/wx/patient/getOpenIdsByPatientId.do"; Map params = new HashMap<>(); - params.put("doctCode",doctorCode); - return RequestHelper.get("http://127.0.0.1/micro/msg_push/doctor", params, WeChatResponse.class); + params.put("patientId",patientId); + params.put("algorithm","des"); + params.put("isEncryptComma","false"); + return DesEncryptHelper.deCode(RequestHelper.get(wx_openId_url,params,WeChatResponse.class).getData().get(0)); } private static TemplateList getTemplateList() { - HttpUriRequest httpUriRequest = RequestBuilder.get().setHeader(jsonHeader).setUri("https://api.weixin.qq.com/cgi-bin/template/get_all_private_template").addParameter("access_token", API.accessToken(WxCacheRequest.getAccessToken())).addParameter("lang", "zh_CN").build(); - return LocalHttpClient.executeJsonResult(httpUriRequest, TemplateList.class); + if(RedisHelper.getRedis().get("Template")!=null){ + return JSONObject.parseObject(RedisHelper.getRedis().get("Template"), TemplateList.class); + } + String tenCentTemplateListUrl = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token="+API.accessToken(WxCacheRequest.getAccessToken()); + Map params = new HashMap<>(); + params.put("lang","zh_CN"); + TemplateList templateList = RequestHelper.get(tenCentTemplateListUrl,params,TemplateList.class); + RedisHelper.getRedis().set("Template", JSONObject.toJSONString(templateList),86400); + return templateList; } public static String getTemplateId(String title) { - return getTemplateList().getTemplate_list().stream().filter(p -> p.getTitle().equals(title)).collect(Collectors.toList()).get(0).getTemplate_id(); + List