Commit ca382128 by 谢永涛

无锡九院

parents
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.hanyun</groupId>
<artifactId>hip</artifactId>
<version>4.3.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>wxjy-mrqc</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.1.1.RELEASE</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.hanyun</groupId>
<artifactId>mrqc-admin</artifactId>
<version>${project.parent.version}</version>
</dependency>
<!--JSON Path-->
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>8</source>
<target>8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>
package com.hanyun.hip.mrqc.jms;
import com.hanyun.hip.message.annotation.EnableHanyunMessage;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@ComponentScan(value = { "com.ruoyi.*", "com.hanyun.hip.mrqc.**", "com.hanyun.hip.sso.*", "com.hanyun.hip.kgms.*",
"com.hanyun.kgms.*", "com.hanyun.hip.term.*", "com.hanyun.hip.license.*","com.hanyun.hip.knowledge.*",
"com.hanyun.hip.drools.*","com.hanyun.hip.ai.*","com.hanyun.ai.*" })
@MapperScan(value = { "com.ruoyi.*.mapper", "com.hanyun.**.mapper" })
@EnableAsync
@EnableHanyunMessage
public class Wx9yMrqcApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Wx9yMrqcApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(Wx9yMrqcApplication.class, args);
}
}
package com.hanyun.hip.mrqc.jms.api;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.hanyun.hip.mrqc.service.entity.EmrContent;
import com.hanyun.hip.mrqc.service.mapper.IMrqcEmrContentMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import java.util.stream.Collectors;
/**
* ------------------------------------------------------------------------<br>
*
* @描述: ExcelImportUtil
* <br>---------------------------------------------
* @时间: 2024/3/22
* @版本: 1.0
* @创建人: Yurl
*/
@Controller
@RequestMapping("/mrqc/jms/test")
public class ExcelImportTest {
@Autowired
private IMrqcEmrContentMapper mrqcEmrContentMapper;
@GetMapping("/import/userInfo")
public String importUserInfo() throws Exception {
File file = new File("C:\\Users\\16979\\Downloads\\聂佳祥.xls");
// 1.获取上传文件输入流
InputStream inputStream = null;
try {
inputStream = new FileInputStream(file);
} catch (Exception e) {
e.printStackTrace();
}
// 2.应用HUtool ExcelUtil获取ExcelReader指定输入流和sheet
ExcelReader excelReader = ExcelUtil.getReader(inputStream, "Sheet1");
// 可以加上表头验证
// 3.读取第二行到最后一行数据
List<List<Object>> read = excelReader.read(1, excelReader.getRowCount());
if (CollUtil.isNotEmpty(read)){
List<EmrContent> collect = read.stream()
.filter(item-> item.size() > 3)
.map(item -> {
EmrContent var1 = new EmrContent();
var1.setContentId(StrUtil.toString(item.get(0)));
var1.setContentText(null);
var1.setContentXml(StrUtil.toString(item.get(2)));
var1.setStructJson(StrUtil.toString(item.get(3)));
return var1;
}).collect(Collectors.toList());
for (EmrContent emrContent : collect) {
mrqcEmrContentMapper.insertOrUpdateEmrContentDoc(emrContent);
}
}
return read.size() + "条";
}
}
package com.hanyun.hip.mrqc.jms.api;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hanyun.hip.mrqc.jms.constants.JmsConstant;
import com.hanyun.hip.mrqc.jms.entity.MrqcEmrConfig;
import com.hanyun.hip.mrqc.jms.service.IMrqcEmrConfigService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.framework.util.ShiroUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
;
/**
* 通大分配规则数据控制层
*/
@Controller
@RequestMapping("/jms/manageRecord")
public class TdfyManageRecordController extends BaseController {
public static final Logger LOGGER = LoggerFactory.getLogger(TdfyManageRecordController.class);
@Autowired
private IMrqcEmrConfigService mrqcEmrConfigService;
@RequestMapping(value = "/saveDistributeRule", method = RequestMethod.POST)
@ResponseBody
public AjaxResult saveDistributeRule(@RequestBody JSONObject jsonObject) {
AjaxResult ret;
try {
MrqcEmrConfig mrqcEmrConfig = new MrqcEmrConfig();
jsonObject.keySet().forEach(key -> {
mrqcEmrConfig.setConfigKey(key);
if(key.equals(JmsConstant.EMRS_PERDAY)){
mrqcEmrConfig.setConfigValue(jsonObject.getString(key));
mrqcEmrConfig.setCreateTime(DateUtils.getNowDate());
mrqcEmrConfig.setUpdateTime(DateUtils.getNowDate());
mrqcEmrConfig.setCreateBy(ShiroUtils.getLoginName());
}else if(key.equals(JmsConstant.EMS)){
JSONArray value=jsonObject.getJSONArray(key);
mrqcEmrConfig.setConfigValue(value.toJSONString());
mrqcEmrConfig.setCreateTime(DateUtils.getNowDate());
mrqcEmrConfig.setUpdateTime(DateUtils.getNowDate());
mrqcEmrConfig.setCreateBy(ShiroUtils.getLoginName());
}
MrqcEmrConfig mrqcEmrConfigTemp =mrqcEmrConfigService.selectMrqcEmrConfigByKey(key);
if(mrqcEmrConfigTemp!=null){
mrqcEmrConfigService.deleteMrqcEmrConfigByIds(mrqcEmrConfigTemp.getConfigId().toString());
}
mrqcEmrConfigService.insertMrqcEmrConfig(mrqcEmrConfig);
});
ret = AjaxResult.success();
} catch (Exception e) {
logger.error("保存分配规则异常", e);
ret = AjaxResult.error("保存分配规则异常," + e);
}
return ret;
}
}
package com.hanyun.hip.mrqc.jms.constants;
/**
* 常量
*/
public class JmsConstant {
/**质控病历份数**/
public static final String EMRS_PERDAY = "emrsPerDay";
/**质控员列表**/
public static final String EMS ="emrs";
}
package com.hanyun.hip.mrqc.jms.controller;
/**
* @ClassName:HomePigeonholeController
* @author: ouyang0810@foxmail.com
* @CreateDate: 2024/11/5
* @UpdateUser: ouyang0810@foxmail.com
* @UpdateDate: 2024/11/5
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
public class HomePigeonholeController {
}
package com.hanyun.hip.mrqc.jms.controller;
import com.ruoyi.common.core.controller.BaseController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/mrqc/jump")
public class JumpController extends BaseController {
/**
* 跳转到病历模板详情页面
*
* @param recordId
* @return
*/
@GetMapping("/todetail")
public String typeDetail(@RequestParam("recordId") String recordId) {
// 重定向到另一个路径
return "redirect:/mrqc/emrrecord/todetail/" + recordId;
}
}
package com.hanyun.hip.mrqc.jms.entity;
/**
* @ClassName:HomePigeonhole
* @author: ouyang0810@foxmail.com
* @CreateDate: 2024/11/5
* @UpdateUser: ouyang0810@foxmail.com
* @UpdateDate: 2024/11/5
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
public class HomePigeonhole {
private String beginDate;
private String endDate;
private String inpatientArea;
private int hospitCount;
private int twoDayCount;
private int twoDayNotCount;
private String twoDayPigeonhole;
private int threeDayCount;
private String threeDayPigeonhole;
private int fourDayCount;
private String fourDayPigeonhole;
private int fiveDayCount;
private String fiveDayPigeonhole;
private int sevenDayCount;
private String sevenDayPigeonhole;
private int moreThanSevenDayCount;
private String moreThanDayPigeonhole;
public String getBeginDate() {
return beginDate;
}
public void setBeginDate(String beginDate) {
this.beginDate = beginDate;
}
public String getEndDate() {
return endDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
public String getInpatientArea() {
return inpatientArea;
}
public void setInpatientArea(String inpatientArea) {
this.inpatientArea = inpatientArea;
}
public int getHospitCount() {
return hospitCount;
}
public void setHospitCount(int hospitCount) {
this.hospitCount = hospitCount;
}
public int getTwoDayCount() {
return twoDayCount;
}
public void setTwoDayCount(int twoDayCount) {
this.twoDayCount = twoDayCount;
}
public int getTwoDayNotCount() {
return twoDayNotCount;
}
public void setTwoDayNotCount(int twoDayNotCount) {
this.twoDayNotCount = twoDayNotCount;
}
public String getTwoDayPigeonhole() {
return twoDayPigeonhole;
}
public void setTwoDayPigeonhole(String twoDayPigeonhole) {
this.twoDayPigeonhole = twoDayPigeonhole;
}
public int getThreeDayCount() {
return threeDayCount;
}
public void setThreeDayCount(int threeDayCount) {
this.threeDayCount = threeDayCount;
}
public String getThreeDayPigeonhole() {
return threeDayPigeonhole;
}
public void setThreeDayPigeonhole(String threeDayPigeonhole) {
this.threeDayPigeonhole = threeDayPigeonhole;
}
public int getFourDayCount() {
return fourDayCount;
}
public void setFourDayCount(int fourDayCount) {
this.fourDayCount = fourDayCount;
}
public String getFourDayPigeonhole() {
return fourDayPigeonhole;
}
public void setFourDayPigeonhole(String fourDayPigeonhole) {
this.fourDayPigeonhole = fourDayPigeonhole;
}
public int getFiveDayCount() {
return fiveDayCount;
}
public void setFiveDayCount(int fiveDayCount) {
this.fiveDayCount = fiveDayCount;
}
public String getFiveDayPigeonhole() {
return fiveDayPigeonhole;
}
public void setFiveDayPigeonhole(String fiveDayPigeonhole) {
this.fiveDayPigeonhole = fiveDayPigeonhole;
}
public int getSevenDayCount() {
return sevenDayCount;
}
public void setSevenDayCount(int sevenDayCount) {
this.sevenDayCount = sevenDayCount;
}
public String getSevenDayPigeonhole() {
return sevenDayPigeonhole;
}
public void setSevenDayPigeonhole(String sevenDayPigeonhole) {
this.sevenDayPigeonhole = sevenDayPigeonhole;
}
public int getMoreThanSevenDayCount() {
return moreThanSevenDayCount;
}
public void setMoreThanSevenDayCount(int moreThanSevenDayCount) {
this.moreThanSevenDayCount = moreThanSevenDayCount;
}
public String getMoreThanDayPigeonhole() {
return moreThanDayPigeonhole;
}
public void setMoreThanDayPigeonhole(String moreThanDayPigeonhole) {
this.moreThanDayPigeonhole = moreThanDayPigeonhole;
}
}
package com.hanyun.hip.mrqc.jms.entity;
/**
* @ClassName:HomePigeonholeSum
* @author: ouyang0810@foxmail.com
* @CreateDate: 2024/11/5
* @UpdateUser: ouyang0810@foxmail.com
* @UpdateDate: 2024/11/5
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
public class HomePigeonholeSum {
private String hospitCountSum;
private String twoDayCountSum;
private String twoDayNotCountSum;
private String twoDayPigeonholeSum;
private String threeDayCountSum;
private String threeDayPigeonholeSum;
private String fourDayCountSum;
private String fourDayPigeonholeSum;
private String fiveDayCountSum;
private String fiveDayPigeonholeSum;
private String sevenDayCountSum;
private String sevenDayPigeonholeSum;
private String moreThanSevenDayCountSum;
private String moreThanDayPigeonholeSum;
public String getHospitCountSum() {
return hospitCountSum;
}
public void setHospitCountSum(String hospitCountSum) {
this.hospitCountSum = hospitCountSum;
}
public String getTwoDayCountSum() {
return twoDayCountSum;
}
public void setTwoDayCountSum(String twoDayCountSum) {
this.twoDayCountSum = twoDayCountSum;
}
public String getTwoDayNotCountSum() {
return twoDayNotCountSum;
}
public void setTwoDayNotCountSum(String twoDayNotCountSum) {
this.twoDayNotCountSum = twoDayNotCountSum;
}
public String getTwoDayPigeonholeSum() {
return twoDayPigeonholeSum;
}
public void setTwoDayPigeonholeSum(String twoDayPigeonholeSum) {
this.twoDayPigeonholeSum = twoDayPigeonholeSum;
}
public String getThreeDayCountSum() {
return threeDayCountSum;
}
public void setThreeDayCountSum(String threeDayCountSum) {
this.threeDayCountSum = threeDayCountSum;
}
public String getThreeDayPigeonholeSum() {
return threeDayPigeonholeSum;
}
public void setThreeDayPigeonholeSum(String threeDayPigeonholeSum) {
this.threeDayPigeonholeSum = threeDayPigeonholeSum;
}
public String getFourDayCountSum() {
return fourDayCountSum;
}
public void setFourDayCountSum(String fourDayCountSum) {
this.fourDayCountSum = fourDayCountSum;
}
public String getFourDayPigeonholeSum() {
return fourDayPigeonholeSum;
}
public void setFourDayPigeonholeSum(String fourDayPigeonholeSum) {
this.fourDayPigeonholeSum = fourDayPigeonholeSum;
}
public String getFiveDayCountSum() {
return fiveDayCountSum;
}
public void setFiveDayCountSum(String fiveDayCountSum) {
this.fiveDayCountSum = fiveDayCountSum;
}
public String getFiveDayPigeonholeSum() {
return fiveDayPigeonholeSum;
}
public void setFiveDayPigeonholeSum(String fiveDayPigeonholeSum) {
this.fiveDayPigeonholeSum = fiveDayPigeonholeSum;
}
public String getSevenDayCountSum() {
return sevenDayCountSum;
}
public void setSevenDayCountSum(String sevenDayCountSum) {
this.sevenDayCountSum = sevenDayCountSum;
}
public String getSevenDayPigeonholeSum() {
return sevenDayPigeonholeSum;
}
public void setSevenDayPigeonholeSum(String sevenDayPigeonholeSum) {
this.sevenDayPigeonholeSum = sevenDayPigeonholeSum;
}
public String getMoreThanSevenDayCountSum() {
return moreThanSevenDayCountSum;
}
public void setMoreThanSevenDayCountSum(String moreThanSevenDayCountSum) {
this.moreThanSevenDayCountSum = moreThanSevenDayCountSum;
}
public String getMoreThanDayPigeonholeSum() {
return moreThanDayPigeonholeSum;
}
public void setMoreThanDayPigeonholeSum(String moreThanDayPigeonholeSum) {
this.moreThanDayPigeonholeSum = moreThanDayPigeonholeSum;
}
}
package com.hanyun.hip.mrqc.jms.entity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 电子病历规则分配表 mrqc_emr_config
*
* @author ruoyi
* @date 2024-04-22
*/
public class MrqcEmrConfig extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** ID */
private Long configId;
/** 配置key */
private String configKey;
/** 配置内容 */
private String configValue;
/** 配置状态(0正常 1停用) */
private String status;
public void setConfigId(Long configId)
{
this.configId = configId;
}
public Long getConfigId()
{
return configId;
}
public void setConfigKey(String configKey)
{
this.configKey = configKey;
}
public String getConfigKey()
{
return configKey;
}
public void setConfigValue(String configValue)
{
this.configValue = configValue;
}
public String getConfigValue()
{
return configValue;
}
public void setStatus(String status)
{
this.status = status;
}
public String getStatus()
{
return status;
}
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("configId", getConfigId())
.append("configKey", getConfigKey())
.append("configValue", getConfigValue())
.append("status", getStatus())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.toString();
}
}
package com.hanyun.hip.mrqc.jms.entity;
import com.ruoyi.common.annotation.Excel;
/**
* @ClassName:ProcessDTO
* @author: ouyang0810@foxmail.com
* @CreateString: 2024/11/1
* @UpStringUser: ouyang0810@foxmail.com
* @UpStringString: 2024/11/1
* @UpStringRemark:
* @Description:
* @Version: [V1.0]
*/
public class ProcessDTO {
private String recordId;
@Excel(name = "科室", width = 200,type = Excel.Type.IMPORT)
private String inpatientArea;
@Excel(name = "医生", width = 200,type = Excel.Type.IMPORT)
private String hospitDoctor;
@Excel(name = "住院号", width = 200,type = Excel.Type.IMPORT)
private String hospitNum;
@Excel(name = "患者姓名", width = 200,type = Excel.Type.IMPORT)
private String patientName;
@Excel(name = "首页分数", width = 80,type = Excel.Type.IMPORT)
private String homepageScore;
@Excel(name = "出院时间", width = 200,type = Excel.Type.IMPORT)
private String outTime;
private String processName;
@Excel(name = "缺陷名称", width = 800)
private String remark;
@Excel(name = "扣分", width = 80)
private String score;
@Excel(name = "标准名称", width = 200)
private String stdName;
private String type;
@Excel(name = "提交时间", width = 200)
private String commitTime;
@Excel(name = "审核时间", width = 200)
private String auditTime;
@Excel(name = "时间差", width = 400)
private String diffTime;
public String getRecordId() {
return recordId;
}
public void setRecordId(String recordId) {
this.recordId = recordId;
}
public String getInpatientArea() {
return inpatientArea;
}
public void setInpatientArea(String inpatientArea) {
this.inpatientArea = inpatientArea;
}
public String getHospitDoctor() {
return hospitDoctor;
}
public void setHospitDoctor(String hospitDoctor) {
this.hospitDoctor = hospitDoctor;
}
public String getHospitNum() {
return hospitNum;
}
public void setHospitNum(String hospitNum) {
this.hospitNum = hospitNum;
}
public String getPatientName() {
return patientName;
}
public void setPatientName(String patientName) {
this.patientName = patientName;
}
public String getHomepageScore() {
return homepageScore;
}
public void setHomepageScore(String homepageScore) {
this.homepageScore = homepageScore;
}
public String getOutTime() {
return outTime;
}
public void setOutTime(String outTime) {
this.outTime = outTime;
}
public String getProcessName() {
return processName;
}
public void setProcessName(String processName) {
this.processName = processName;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
public String getStdName() {
return stdName;
}
public void setStdName(String stdName) {
this.stdName = stdName;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getCommitTime() {
return commitTime;
}
public void setCommitTime(String commitTime) {
this.commitTime = commitTime;
}
public String getAuditTime() {
return auditTime;
}
public void setAuditTime(String auditTime) {
this.auditTime = auditTime;
}
public String getDiffTime() {
return diffTime;
}
public void setDiffTime(String diffTime) {
this.diffTime = diffTime;
}
}
package com.hanyun.hip.mrqc.jms.entity;
import com.ruoyi.common.annotation.Excel;
/**
* @ClassName:ProcessDTO
* @author: ouyang0810@foxmail.com
* @CreateString: 2024/11/1
* @UpStringUser: ouyang0810@foxmail.com
* @UpStringString: 2024/11/1
* @UpStringRemark:
* @Description:
* @Version: [V1.0]
*/
public class ProcessYWKDTO {
private String recordId;
@Excel(name = "科室", width = 200,type = Excel.Type.IMPORT)
private String inpatientArea;
@Excel(name = "科主任", width = 200,type = Excel.Type.IMPORT)
private String kzr;
@Excel(name = "主治医生", width = 200,type = Excel.Type.IMPORT)
private String zzys;
@Excel(name = "住院医生", width = 200,type = Excel.Type.IMPORT)
private String zyys;
@Excel(name = "住院号", width = 200,type = Excel.Type.IMPORT)
private String hospitNum;
@Excel(name = "患者姓名", width = 200,type = Excel.Type.IMPORT)
private String patientName;
@Excel(name = "全病历分数", width = 80,type = Excel.Type.IMPORT)
private String homepageScore;
@Excel(name = "出院时间", width = 200,type = Excel.Type.IMPORT)
private String outTime;
private String processName;
@Excel(name = "缺陷名称", width = 800)
private String remark;
@Excel(name = "扣分", width = 80)
private String score;
private String stdName;
private String type;
private String commitTime;
private String auditTime;
private String diffTime;
public String getRecordId() {
return recordId;
}
public void setRecordId(String recordId) {
this.recordId = recordId;
}
public String getInpatientArea() {
return inpatientArea;
}
public void setInpatientArea(String inpatientArea) {
this.inpatientArea = inpatientArea;
}
public String getKzr() {
return kzr;
}
public void setKzr(String kzr) {
this.kzr = kzr;
}
public String getZzys() {
return zzys;
}
public void setZzys(String zzys) {
this.zzys = zzys;
}
public String getZyys() {
return zyys;
}
public void setZyys(String zyys) {
this.zyys = zyys;
}
public String getHospitNum() {
return hospitNum;
}
public void setHospitNum(String hospitNum) {
this.hospitNum = hospitNum;
}
public String getPatientName() {
return patientName;
}
public void setPatientName(String patientName) {
this.patientName = patientName;
}
public String getHomepageScore() {
return homepageScore;
}
public void setHomepageScore(String homepageScore) {
this.homepageScore = homepageScore;
}
public String getOutTime() {
return outTime;
}
public void setOutTime(String outTime) {
this.outTime = outTime;
}
public String getProcessName() {
return processName;
}
public void setProcessName(String processName) {
this.processName = processName;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
public String getStdName() {
return stdName;
}
public void setStdName(String stdName) {
this.stdName = stdName;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getCommitTime() {
return commitTime;
}
public void setCommitTime(String commitTime) {
this.commitTime = commitTime;
}
public String getAuditTime() {
return auditTime;
}
public void setAuditTime(String auditTime) {
this.auditTime = auditTime;
}
public String getDiffTime() {
return diffTime;
}
public void setDiffTime(String diffTime) {
this.diffTime = diffTime;
}
}
package com.hanyun.hip.mrqc.jms.entity;
/**
* @ClassName:ReportRecordDTO
* @author: ouyang0810@foxmail.com
* @CreateDate: 2024/11/5
* @UpdateUser: ouyang0810@foxmail.com
* @UpdateDate: 2024/11/5
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
public class ReportRecordDTO {
//SELECT
// distinct
// mr.record_id,
// mr.hospit_num,
// mr.patient_name,
// mr.hospit_doctor,
// mr.diagnosis_name,
// mr.in_time,
// mr.out_time,
// mr.inpatient_area
// FROM
// mrqc_record
private String recordId;
private String hospitNum;
private String patientName;
private String hospitDoctor;
private String diagnosisName;
private String inTime;
private String outTime;
private String inpatientArea;
private String etlTime;
public String getEtlTime() {
return etlTime;
}
public void setEtlTime(String etlTime) {
this.etlTime = etlTime;
}
public String getRecordId() {
return recordId;
}
public void setRecordId(String recordId) {
this.recordId = recordId;
}
public String getHospitNum() {
return hospitNum;
}
public void setHospitNum(String hospitNum) {
this.hospitNum = hospitNum;
}
public String getPatientName() {
return patientName;
}
public void setPatientName(String patientName) {
this.patientName = patientName;
}
public String getHospitDoctor() {
return hospitDoctor;
}
public void setHospitDoctor(String hospitDoctor) {
this.hospitDoctor = hospitDoctor;
}
public String getDiagnosisName() {
return diagnosisName;
}
public void setDiagnosisName(String diagnosisName) {
this.diagnosisName = diagnosisName;
}
public String getInTime() {
return inTime;
}
public void setInTime(String inTime) {
this.inTime = inTime;
}
public String getOutTime() {
return outTime;
}
public void setOutTime(String outTime) {
this.outTime = outTime;
}
public String getInpatientArea() {
return inpatientArea;
}
public void setInpatientArea(String inpatientArea) {
this.inpatientArea = inpatientArea;
}
}
package com.hanyun.hip.mrqc.jms.entity;
/**
* @ClassName:UReportDeathDTO
* @author: ouyang0810@foxmail.com
* @CreateDate: 2024/12/1
* @UpdateUser: ouyang0810@foxmail.com
* @UpdateDate: 2024/12/1
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
public class UReportDeathDTO {
// select hospit_doctor as doctorName,inpatient_area as inpatientArea,out_time as outTime,record_id as recordId,(select lable_id from mrqc_record_label where label_id = '27' and record_id = u.record_id) as lableId, ( select approved from mrqc_operator_record where record_id = u.record_id) approved
private String doctorName;
private String inpatientArea;
private String outTime;
private String recordId;
private String labelId;
private String approved;
public String getDoctorName() {
return doctorName;
}
public void setDoctorName(String doctorName) {
this.doctorName = doctorName;
}
public String getInpatientArea() {
return inpatientArea;
}
public void setInpatientArea(String inpatientArea) {
this.inpatientArea = inpatientArea;
}
public String getOutTime() {
return outTime;
}
public void setOutTime(String outTime) {
this.outTime = outTime;
}
public String getRecordId() {
return recordId;
}
public void setRecordId(String recordId) {
this.recordId = recordId;
}
public String getLabelId() {
return labelId;
}
public void setLabelId(String labelId) {
this.labelId = labelId;
}
public String getApproved() {
return approved;
}
public void setApproved(String approved) {
this.approved = approved;
}
}
package com.hanyun.hip.mrqc.jms.entity;
/**
* @ClassName:UReportDeathDisplayDTO
* @author: ouyang0810@foxmail.com
* @CreateDate: 2024/12/1
* @UpdateUser: ouyang0810@foxmail.com
* @UpdateDate: 2024/12/1
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
public class UReportDeathDisplayDTO {
private String name;
private String beginDate;
private String endDate;
private long sumCount;
private long labelCount;
private String nameType;
public String getNameType() {
return nameType;
}
public void setNameType(String nameType) {
this.nameType = nameType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBeginDate() {
return beginDate;
}
public void setBeginDate(String beginDate) {
this.beginDate = beginDate;
}
public String getEndDate() {
return endDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
public long getSumCount() {
return sumCount;
}
public void setSumCount(long sumCount) {
this.sumCount = sumCount;
}
public long getLabelCount() {
return labelCount;
}
public void setLabelCount(long labelCount) {
this.labelCount = labelCount;
}
public long getApproveCount() {
return approveCount;
}
public void setApproveCount(long approveCount) {
this.approveCount = approveCount;
}
private long approveCount;
}
package com.hanyun.hip.mrqc.jms.entity;
/**
* @ClassName:UReportRectificationDTO
* @author: ouyang0810@foxmail.com
* @CreateDate: 2024/12/2
* @UpdateUser: ouyang0810@foxmail.com
* @UpdateDate: 2024/12/2
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
public class UReportRectificationDTO {
private String recordId;
private String inpatientArea;
private String hospitDoctor;
private Integer historyCount;
private Integer nowRCount;
private Integer nowPCount;
public String getRecordId() {
return recordId;
}
public void setRecordId(String recordId) {
this.recordId = recordId;
}
public String getInpatientArea() {
return inpatientArea;
}
public void setInpatientArea(String inpatientArea) {
this.inpatientArea = inpatientArea;
}
public String getHospitDoctor() {
return hospitDoctor;
}
public void setHospitDoctor(String hospitDoctor) {
this.hospitDoctor = hospitDoctor;
}
public Integer getHistoryCount() {
return historyCount;
}
public void setHistoryCount(Integer historyCount) {
this.historyCount = historyCount;
}
public Integer getNowRCount() {
return nowRCount;
}
public void setNowRCount(Integer nowRCount) {
this.nowRCount = nowRCount;
}
public Integer getNowPCount() {
return nowPCount;
}
public void setNowPCount(Integer nowPCount) {
this.nowPCount = nowPCount;
}
}
package com.hanyun.hip.mrqc.jms.entity;
/**
* @ClassName:UReportRectificationDTO
* @author: ouyang0810@foxmail.com
* @CreateDate: 2024/12/2
* @UpdateUser: ouyang0810@foxmail.com
* @UpdateDate: 2024/12/2
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
public class UReportRectificationDisplayDTO {
private String rectificationRate;
private String name;
private String lastRectificationRate;
private long sunCount;
private long rectificationCount;
private String beginDate;
private String endDate;
private double sort;
public long getSunCount() {
return sunCount;
}
public void setSunCount(long sunCount) {
this.sunCount = sunCount;
}
public long getRectificationCount() {
return rectificationCount;
}
public void setRectificationCount(long rectificationCount) {
this.rectificationCount = rectificationCount;
}
public double getSort() {
return sort;
}
public void setSort(double sort) {
this.sort = sort;
}
public String getRectificationRate() {
return rectificationRate;
}
public void setRectificationRate(String rectificationRate) {
this.rectificationRate = rectificationRate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLastRectificationRate() {
return lastRectificationRate;
}
public void setLastRectificationRate(String lastRectificationRate) {
this.lastRectificationRate = lastRectificationRate;
}
public String getBeginDate() {
return beginDate;
}
public void setBeginDate(String beginDate) {
this.beginDate = beginDate;
}
public String getEndDate() {
return endDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
}
package com.hanyun.hip.mrqc.jms.mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
* @ClassName:AutoAssignMapper
* @author: zgp
* @CreateDate: 2023/2/4
* @UpdateUser: zgp
* @UpdateDate: 2022/4/4
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
@Repository
public interface AutoAssignMapper {
List<Map<String,Object>> selecAllDeptsurgicalOperateList(@Param("qcMonth") String qcMonth,@Param("userId") Long userId,@Param("dataScope") String dataScope);
List<String> selectAllZyRecordId(@Param("department") String department);
}
package com.hanyun.hip.mrqc.jms.mapper;
import com.hanyun.hip.mrqc.jms.entity.MrqcEmrConfig;
import com.hanyun.hip.mrqc.jms.entity.ProcessDTO;
import com.hanyun.hip.mrqc.jms.entity.ProcessYWKDTO;
import com.hanyun.hip.mrqc.service.entity.EmrRecord;
import com.hanyun.hip.mrqc.service.entity.MrqcProcess;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 电子病历规则分配 数据层
*
* @author ruoyi
* @date 2024-04-22
*/
public interface MrqcEmrConfigMapper {
/**
* 根据key查询电子病历分配信息
* @param configKey
* @return
*/
public MrqcEmrConfig selectMrqcEmrConfigByKey(@Param("configKey") String configKey);
/**
* 查询电子病历规则分配信息
*
* @param configId 电子病历规则分配ID
* @return 电子病历规则分配信息
*/
public MrqcEmrConfig selectMrqcEmrConfigById(Long configId);
/**
* 查询电子病历规则分配列表
*
* @param mrqcEmrConfig 电子病历规则分配信息
* @return 电子病历规则分配集合
*/
public List<MrqcEmrConfig> selectMrqcEmrConfigList(MrqcEmrConfig mrqcEmrConfig);
/**
* 新增电子病历规则分配
*
* @param mrqcEmrConfig 电子病历规则分配信息
* @return 结果
*/
public int insertMrqcEmrConfig(MrqcEmrConfig mrqcEmrConfig);
/**
* 修改电子病历规则分配
*
* @param mrqcEmrConfig 电子病历规则分配信息
* @return 结果
*/
public int updateMrqcEmrConfig(MrqcEmrConfig mrqcEmrConfig);
/**
* 删除电子病历规则分配
*
* @param configId 电子病历规则分配ID
* @return 结果
*/
public int deleteMrqcEmrConfigById(Long configId);
/**
* 批量删除电子病历规则分配
*
* @param configIds 需要删除的数据ID
* @return 结果
*/
public int deleteMrqcEmrConfigByIds(String[] configIds);
List<ProcessDTO> getProcessList(MrqcProcess mrqcProcess);
List<ProcessYWKDTO> getProcessListByYWK(MrqcProcess mrqcProcess);
List<EmrRecord> selectEmrRecordList(EmrRecord emrRecord);
List<EmrRecord> selectEmrRecordNotLikeList(EmrRecord emrRecord);
List<EmrRecord> selectEmrRecordCommitList(EmrRecord emrRecord);
}
package com.hanyun.hip.mrqc.jms.mapper;
import com.ruoyi.system.domain.SysDept;
import java.util.List;
import java.util.Map;
public interface TdfyDeptMapper {
Integer insertDeptBackId(SysDept var1);
List<Map<String ,String>> findAllInpatientArea();
}
package com.hanyun.hip.mrqc.jms.mapper;
import com.hanyun.hip.mrqc.jms.entity.UReportDeathDTO;
import com.hanyun.hip.mrqc.jms.entity.UReportRectificationDTO;
import com.hanyun.hip.mrqc.service.entity.EmrRecord;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @ClassName:UReportExportMapper
* @author: ouyang0810@foxmail.com
* @CreateDate: 2024/12/1
* @UpdateUser: ouyang0810@foxmail.com
* @UpdateDate: 2024/12/1
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
@Repository
public interface UReportExportMapper {
List<UReportDeathDTO> selectDeathList(EmrRecord record);
List<EmrRecord> selectEmrRecordList(EmrRecord emrRecord);
List<EmrRecord> selectEmrRecordListByLabelId(EmrRecord emrRecord);
List<EmrRecord> selectEmrRecordListByApproved(EmrRecord emrRecord);
List<UReportRectificationDTO> selectRectificationList(EmrRecord emrRecord);
}
package com.hanyun.hip.mrqc.jms.service;
import java.util.List;
import java.util.Map;
/**
* @ClassName:IAutoAssignService
* @author: zgp
* @CreateDate: 2023/2/4
* @UpdateUser: zgp
* @UpdateDate: 2022/4/4
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
public interface IAutoAssignService {
List<Map<String,Object>> selecAllDeptsurgicalOperateList(String qcMonth,Long userId,String dataScope);
}
package com.hanyun.hip.mrqc.jms.service;
import com.hanyun.hip.mrqc.jms.entity.MrqcEmrConfig;
import com.hanyun.hip.mrqc.jms.entity.ProcessDTO;
import com.hanyun.hip.mrqc.jms.entity.ProcessYWKDTO;
import com.hanyun.hip.mrqc.service.entity.MrqcProcess;
import java.util.List;
/**
* 电子病历规则分配 服务层
*
* @author ruoyi
* @date 2024-04-22
*/
public interface IMrqcEmrConfigService {
/**
* 根据key查询电子病历分配信息
* @param configKey
* @return
*/
public MrqcEmrConfig selectMrqcEmrConfigByKey(String configKey);
/**
* 查询电子病历规则分配信息
*
* @param configId 电子病历规则分配ID
* @return 电子病历规则分配信息
*/
public MrqcEmrConfig selectMrqcEmrConfigById(Long configId);
/**
* 查询电子病历规则分配列表
*
* @param mrqcEmrConfig 电子病历规则分配信息
* @return 电子病历规则分配集合
*/
public List<MrqcEmrConfig> selectMrqcEmrConfigList(MrqcEmrConfig mrqcEmrConfig);
/**
* 新增电子病历规则分配
*
* @param mrqcEmrConfig 电子病历规则分配信息
* @return 结果
*/
public int insertMrqcEmrConfig(MrqcEmrConfig mrqcEmrConfig);
/**
* 修改电子病历规则分配
*
* @param mrqcEmrConfig 电子病历规则分配信息
* @return 结果
*/
public int updateMrqcEmrConfig(MrqcEmrConfig mrqcEmrConfig);
/**
* 删除电子病历规则分配信息
*
* @param ids 需要删除的数据ID
* @return 结果
*/
public int deleteMrqcEmrConfigByIds(String ids);
List<ProcessDTO> getProcessList(MrqcProcess mrqcProcess);
List<ProcessYWKDTO> getProcessListByYWK(MrqcProcess mrqcProcess);
}
package com.hanyun.hip.mrqc.jms.service.extractor;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.hanyun.hip.mrqc.rule.entity.fact.MrqcStructData;
import com.hanyun.hip.mrqc.service.entity.EmrContent;
import com.hanyun.hip.mrqc.service.entity.MrqcStructExtract;
import com.hanyun.hip.mrqc.service.service.CustomStructExtracter;
import com.hanyun.hip.mrqc.service.util.JsonUtil;
import com.hanyun.hip.mrqc.service.util.UUidUtil;
import com.jayway.jsonpath.JsonPath;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* ------------------------------------------------------------------------<br>
* (or): 表示由多个表达式时,如果有一个有值就退出,否则一直往下取值
* --> 表示对结果集需要做额外的出来:
* - [join] 表示对结果集进行全部拼接,获取的值是数组的时候,多个值拼接成一个
* - [PRE] 表示要在结构的前面添加额外的标识,该标识由参数固定
* - [END] 与[PRE]相对,表示要在结果的末尾添加额外的标识,该标识由参数固定
* - [DEL] 后续的表达式,以逗号隔开,进行遍历删除,删除首尾
* - [INDEX[1]] 若取值为列表时,获取指定下标的值,下标从 0 开始
* (and): 表示由多个表达式同时取出结果,并进行结果的拼接
$.ScatterData.Component.Section[?(@.Code.Code=="S004")].Composite[?(@.Code.Code=="V006")].StyleText-->[join](and)$.ScatterData.Component.Section[?(@.Code.Code=="S004")].Composite[?(@.Code.Code=="V006")].StyleText
[AAA,BBB] = AAABBB
*
* @描述: JaywayJsonPathExtractor
* <br>---------------------------------------------
* @时间: 2024/3/26
* @版本: 1.0
* @创建人: Yurl
*/
public class JaywayJsonPathExtractor implements CustomStructExtracter {
private static final String RESULT_ORIENTED_CHARACTERS = "-->";
private static final String MULTIPLE_EXPRESSION = "(and)";
private static final String OR_EXPRESSION = "(or)";
@Override
public MrqcStructData extract(MrqcStructExtract struct, EmrContent content, MrqcStructData parent) {
try {
parent = parent == null ? new MrqcStructData() : parent;
String structJson = content.getStructJson();
String jsonPath = struct.getExtScript();
if (StringUtils.isEmpty(jsonPath) || StringUtils.isEmpty(structJson)) {
return parent;
}
List<String> expressList = new ArrayList<>();
if (jsonPath.contains(OR_EXPRESSION)){
expressList = Arrays.asList(jsonPath.split("\\(or\\)"));
} else {
expressList.add(jsonPath);
}
String resultObj = "";
for (String express : expressList){
List<String> jsonPathList = new ArrayList<>();
if (express.contains(MULTIPLE_EXPRESSION)) {
jsonPathList = Arrays.asList(express.split("\\(and\\)"));
} else {
jsonPathList.add(express);
}
resultObj = getJsonPathValue(structJson, jsonPathList);
// 去除转义等字符
resultObj = StringEscapeUtils.unescapeJava(resultObj);
if (StrUtil.isNotBlank(resultObj) && !StrUtil.equalsIgnoreCase("null", resultObj)){
break;
}
}
parent.setDataValue(resultObj);
parent.setDataId(UUidUtil.getUUID());
parent.setContentId(content.getContentId());
parent.setRecordId(content.getRecordId());
parent.setStructId(struct.getStructId());
} catch (Exception e) {
e.printStackTrace();
}
return parent;
}
public static String getJsonPathValue(String structJson, List<String> jsonPathList) {
StringBuilder resultHandler = new StringBuilder();
for (String jsonPath : jsonPathList) {
String resultHandPath = null;
if (jsonPath.contains(RESULT_ORIENTED_CHARACTERS)) {
String[] split = jsonPath.split(RESULT_ORIENTED_CHARACTERS);
jsonPath = split[0];
resultHandPath = split[1];
}
// 格式化
jsonPath = JsonUtil.transferToJsonPath(jsonPath);
// 读取JSON数据
Object resultObj = JsonPath.read(structJson, jsonPath);
String result = arrayResultHandler(resultObj, resultHandPath);
resultHandler.append(result);
}
return resultHandler.toString();
}
private static String arrayResultHandler(Object resultObj, String resultHandPath) {
// 默认去掉首尾空格、双引号
if (ObjectUtil.isEmpty(resultObj)) {
return "";
}
String resultString = null;
if (resultObj instanceof String) {
resultString = resultObj.toString();
resultString = valueFilter(resultString);
} else if (resultObj instanceof ArrayList) {
ArrayList arrayList = (ArrayList) resultObj;
if (StrUtil.equalsIgnoreCase(resultHandPath, "[join]")) {
StringBuilder stringBuilder = new StringBuilder();
for (Object result : arrayList) {
stringBuilder.append("" + valueFilter(StrUtil.toString(result)));
}
resultString = stringBuilder.toString();
} else if (StrUtil.startWith(resultHandPath, "[INDEX[")){
int index = Integer.parseInt(resultHandPath.substring(7, resultHandPath.length() - 2));
resultString = valueFilter(arrayList.size() < index ? "" : arrayList.get(index).toString());
} else {
resultString = valueFilter(StrUtil.toString(arrayList.get(0)));
}
} else {
resultString = StrUtil.toString(resultObj);
}
if (StrUtil.isNotBlank(resultHandPath)) {
if (resultHandPath.startsWith("[PRE]")) {
// 添加后面的字符
resultString = resultHandPath.substring(5) + resultString;
} else if (resultHandPath.startsWith("[END]")) {
// 添加后面的字符
resultString = resultString + resultHandPath.substring(5);
} else if (resultHandPath.startsWith("[DEL]")) {
String handExpress = resultHandPath.substring(5);
for (String express : handExpress.split(",")) {
resultString = StrUtil.removeSuffix(resultString, express);
resultString = StrUtil.removePrefix(resultString, express);
}
}else if(resultHandPath.startsWith("[SUBSTR]")){
String handExpress = resultHandPath.substring(8);
String[] flag = handExpress.split(",");
if(flag.length>=2){
String start = flag[0];
String end = flag[1];
resultString = resultString.substring(resultString.indexOf(start)+start.length(),resultString.lastIndexOf(end));
}else {
resultString = resultString.substring(resultString.indexOf(flag[0])+flag[0].length(),resultString.length());
}
}
}
return resultString;
}
private static String valueFilter(String resultString) {
if (StrUtil.isBlank(resultString)) {
return "";
}
resultString = StrUtil.removeSuffix(resultString, "\"");
resultString = StrUtil.removePrefix(resultString, "\"");
if (StrUtil.equalsIgnoreCase("null", StrUtil.trim(resultString))) {
return "";
}
return resultString;
}
}
package com.hanyun.hip.mrqc.jms.service.impl;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hanyun.hip.mrqc.jms.mapper.AutoAssignMapper;
import com.hanyun.hip.mrqc.jms.service.IAutoAssignService;
import java.util.List;
import java.util.Map;
/**
* @ClassName:AutoAssignServiceImpl
* @author: zgp
* @CreateDate: 2023/6/27
* @UpdateUser: zgp
* @UpdateDate: 2022/6/27
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
@Service
public class AutoAssignServiceImpl implements IAutoAssignService {
private Logger logger = LogManager.getLogger(AutoAssignServiceImpl.class);
@Autowired
private AutoAssignMapper autoAssignMapper;
@Override
public List<Map<String,Object>> selecAllDeptsurgicalOperateList(String qcMonth,Long userId,String dataScope) {
return autoAssignMapper.selecAllDeptsurgicalOperateList(qcMonth,userId,dataScope);
}
}
package com.hanyun.hip.mrqc.jms.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.hanyun.hip.mrqc.service.engine.EngineHookService;
import com.hanyun.hip.mrqc.service.entity.EmrRecord;
import com.hanyun.hip.mrqc.service.mapper.IMrqcEmrContentMapper;
import com.hanyun.hip.mrqc.service.service.impl.MrqcEmrContentServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @ClassName:EngineHookServiceImpl
* @author: xieyongtao
* @CreateDate: 2024/9/11
* @UpdateUser: xieyongtao
* @UpdateDate: 2024/9/11
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
@Service
public class EngineHookServiceImpl implements EngineHookService {
@Autowired
private IMrqcEmrContentMapper iMrqcEmrContentMapper;
@Override
public boolean hook(EmrRecord emrRecord) {
List<String> strings = iMrqcEmrContentMapper.selectContentIdsByRecordId(emrRecord.getRecordId());
if (CollUtil.isEmpty(strings)) {
return false;
}
return true;
}
}
package com.hanyun.hip.mrqc.jms.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.hanyun.hip.mrqc.common.EmrETLApi;
import com.hanyun.hip.mrqc.common.task.AdmissionAndDaysDischargeETLTask;
import com.hanyun.hip.mrqc.jms.api.JmsEmrETLApi;
import com.hanyun.hip.mrqc.rule.constant.Constant;
import com.hanyun.hip.mrqc.rule.util.SpringUtil;
import com.hanyun.hip.mrqc.service.service.IMrqcEtlService;
import com.hanyun.hip.mrqc.service.util.XmlTool;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import org.apache.commons.collections.CollectionUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.dom4j.DocumentException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import javax.net.ssl.SSLContext;
import java.nio.charset.Charset;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Component("JmsCommonTask")
public class JmsCommonTask {
private static final Logger logger = LoggerFactory.getLogger(JmsCommonTask.class);
@Autowired
IMrqcEtlService mrqcEtlService;
@Autowired
private JdbcTemplate jdbcTemplate;
private static final String WEBSERVICE_XML = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:dhcc=\"http://www.dhcc.com.cn\">\n" +
"<soapenv:Header/>\n" +
"<soapenv:Body>\n" +
" <dhcc:GetHISInfo>\n" +
" <dhcc:action>%s</dhcc:action>\n" +
" <dhcc:Input><![CDATA[%s]]></dhcc:Input>\n" +
" </dhcc:GetHISInfo>\n" +
"</soapenv:Body>\n" +
"</soapenv:Envelope>";
private static String doPostSoap(String postUrl, String requestCode, String requestParam, String soapAction) {
int socketTimeout = 60000;// 请求超时时间
int connectTimeout = 60000;// 传输超时时间
String retStr = "";
// 创建HttpClientBuilder
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
try {
//忽略SSL证书(https时需要证书)
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (arg0, arg1) -> true).build();
httpClientBuilder.setSSLContext(sslContext);
httpClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE);
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
throw new RuntimeException("Could not disable SSL on HttpClient builder.", e);
}
// HttpClient
CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
HttpPost httpPost = new HttpPost(postUrl);
// 设置请求和传输超时时间
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(socketTimeout)
.setConnectTimeout(connectTimeout).build();
httpPost.setConfig(requestConfig);
try {
httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");
httpPost.setHeader("SOAPAction", soapAction);
StringEntity data = new StringEntity(String.format(WEBSERVICE_XML, requestCode, requestParam), Charset.forName("UTF-8"));
httpPost.setEntity(data);
CloseableHttpResponse response = closeableHttpClient
.execute(httpPost);
HttpEntity httpEntity = response.getEntity();
if (httpEntity != null) {
// 打印响应内容
retStr = EntityUtils.toString(httpEntity, "UTF-8");
//LOGGER.info("response:" + retStr);
}
// 释放资源
closeableHttpClient.close();
} catch (Exception e) {
logger.error("文书编号:{};获取文书请求出错! 异常信息:{}", e.getMessage());
}
return retStr;
}
public void refreshEtlTime() {
String querySql = "SELECT record_id FROM mrqc_record WHERE auto is null or auto = ''";
List<String> recordIds = jdbcTemplate.queryForList(querySql, String.class);
List<Map<String,String>> mapList = new ArrayList<>();
for (String recordId : recordIds) {
String response = doPostSoap("http://172.17.0.206/csp/hsb/DHC.Published.PUB0010.BS.PUB0010.CLS", "", recordId, "http://www.dhcc.com.cn/DHC.Published.PUB0010.BS.PUB0010.GetHISInfo");
try {
JSONObject jsonObject = XmlTool.documentToJSONObject(response);
JSONObject serviceResponse = jsonObject.getJSONObject("Body").getJSONObject("GetHISInfoResponse");
if (null != serviceResponse && serviceResponse.size() != 0) {
String resultResponse = serviceResponse.getString("GetHISInfoResult");
JSONObject admFirstPage = XmlTool.documentToJSONObject(resultResponse);
String gdsj = admFirstPage.getString("GDSJ");
if (StrUtil.isNotEmpty(gdsj)) {
Map<String, String> map = new HashMap<>();
map.put("recordId", recordId);
map.put("gdsj", gdsj);
mapList.add(map);
}
}
}catch (DocumentException e) {
logger.error("数据抽提, 病历recordId: {} ,病案数据XML转换异常! ExceptionMsg: {}", recordId, e.getMessage());
}
}
if (CollUtil.isNotEmpty(mapList)) {
String sql = "UPDATE mrqc_record SET etl_time = ? WHERE record_id = ?";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Map<String, String> map = mapList.get(i);
ps.setString(1, map.get("recordId")); // 假设id是主键
ps.setString(2, map.get("gdsj")); // 假设columnName是要更新的字段
}
@Override
public int getBatchSize() {
return mapList.size();
}
});
}
}
@Log(title = "抽提未质控数据", businessType = BusinessType.OTHER)
public void etlAutoisNullTask() {
try {
if (CollectionUtils.isNotEmpty(Constant.ETL_APIS)) {
for (String etlApi : Constant.ETL_APIS) {
EmrETLApi emrETLApi = (EmrETLApi) SpringUtil.getBean(etlApi);
if (emrETLApi != null) {
// 先增量更新
String querySql = "SELECT record_id FROM mrqc_record WHERE auto is null or auto = ''";
List<String> recordIds = jdbcTemplate.queryForList(querySql, String.class);
if (CollectionUtils.isNotEmpty(recordIds)) {
ExecutorService executorService = Executors
.newFixedThreadPool(10);
final CountDownLatch countDownLatch = new CountDownLatch(recordIds.size());
try {
for (int i = 0; i < recordIds.size(); i++) {
String recordId = recordIds.get(i);
try {
emrETLApi.etlEmr(null, recordId, null, null, null, null, true, null, mrqcEtlService, 1, null);
logger.info("==================》增量抽取未质控病历,完成进度:{}/{}", i, recordIds.size());
} catch (Exception e) {
logger.error("电子病历文书抽取异常,recordID={}", recordId);
} finally {
countDownLatch.countDown();
}
}
// 保证所有的检查都完毕后才退出
countDownLatch.await();
} catch (InterruptedException ignore) {
logger.error("抽取未质控电子病历文书被中断。");
} finally {
executorService.shutdownNow();
}
}
}
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
package com.hanyun.hip.mrqc.jms.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.hanyun.hip.mrqc.jms.entity.MrqcEmrConfig;
import com.hanyun.hip.mrqc.jms.entity.ProcessDTO;
import com.hanyun.hip.mrqc.jms.entity.ProcessYWKDTO;
import com.hanyun.hip.mrqc.jms.mapper.MrqcEmrConfigMapper;
import com.hanyun.hip.mrqc.jms.service.IMrqcEmrConfigService;
import com.hanyun.hip.mrqc.service.entity.MrqcProcess;
import com.ruoyi.common.core.text.Convert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* 电子病历规则分配 服务层实现
*
* @author ruoyi
* @date 2024-04-22
*/
@Service
public class MrqcEmrConfigServiceImpl implements IMrqcEmrConfigService {
@Autowired
private MrqcEmrConfigMapper mrqcEmrConfigMapper;
@Override
public MrqcEmrConfig selectMrqcEmrConfigByKey(String configKey) {
return mrqcEmrConfigMapper.selectMrqcEmrConfigByKey(configKey);
}
/**
* 查询电子病历规则分配信息
*
* @param configId 电子病历规则分配ID
* @return 电子病历规则分配信息
*/
@Override
public MrqcEmrConfig selectMrqcEmrConfigById(Long configId) {
return mrqcEmrConfigMapper.selectMrqcEmrConfigById(configId);
}
/**
* 查询电子病历规则分配列表
*
* @param mrqcEmrConfig 电子病历规则分配信息
* @return 电子病历规则分配集合
*/
@Override
public List<MrqcEmrConfig> selectMrqcEmrConfigList(MrqcEmrConfig mrqcEmrConfig) {
return mrqcEmrConfigMapper.selectMrqcEmrConfigList(mrqcEmrConfig);
}
/**
* 新增电子病历规则分配
*
* @param mrqcEmrConfig 电子病历规则分配信息
* @return 结果
*/
@Override
public int insertMrqcEmrConfig(MrqcEmrConfig mrqcEmrConfig) {
return mrqcEmrConfigMapper.insertMrqcEmrConfig(mrqcEmrConfig);
}
/**
* 修改电子病历规则分配
*
* @param mrqcEmrConfig 电子病历规则分配信息
* @return 结果
*/
@Override
public int updateMrqcEmrConfig(MrqcEmrConfig mrqcEmrConfig) {
return mrqcEmrConfigMapper.updateMrqcEmrConfig(mrqcEmrConfig);
}
/**
* 删除电子病历规则分配对象
*
* @param ids 需要删除的数据ID
* @return 结果
*/
@Override
public int deleteMrqcEmrConfigByIds(String ids) {
return mrqcEmrConfigMapper.deleteMrqcEmrConfigByIds(Convert.toStrArray(ids));
}
@Override
public List<ProcessYWKDTO> getProcessListByYWK(MrqcProcess mrqcProcess) {
List<ProcessYWKDTO> processListByYWK = mrqcEmrConfigMapper.getProcessListByYWK(mrqcProcess);
return processListByYWK;
}
@Override
public List<ProcessDTO> getProcessList(MrqcProcess mrqcProcess) {
List<ProcessDTO> processList = mrqcEmrConfigMapper.getProcessList(mrqcProcess);
if (CollUtil.isNotEmpty(processList)) {
for (ProcessDTO process : processList) {
String commitTime = process.getCommitTime();
String auditTime = process.getAuditTime();
if (StrUtil.isEmpty(auditTime) || StrUtil.isEmpty(commitTime)) {
continue;
}
long diffInMillies = DateUtil.parse(commitTime).getTime() - DateUtil.parse(auditTime).getTime();
long diff = Math.abs(diffInMillies);
long days = TimeUnit.MILLISECONDS.toDays(diff);
long hours = TimeUnit.MILLISECONDS.toHours(diff) % 24;
long minutes = TimeUnit.MILLISECONDS.toMinutes(diff) % 60;
String sign = diffInMillies >= 0 ? "+" : "-";
process.setDiffTime("时间差: " + sign + days + " 天, " + hours + " 小时, " + minutes + " 分钟");
}
}
return processList;
}
}
package com.hanyun.hip.mrqc.jms.service.impl;
import com.hanyun.hip.mrqc.jms.entity.ProcessDTO;
import com.hanyun.hip.mrqc.jms.entity.ProcessYWKDTO;
import com.hanyun.hip.mrqc.jms.service.IMrqcEmrConfigService;
import com.hanyun.hip.mrqc.service.entity.MrqcProcess;
import com.hanyun.hip.mrqc.service.service.MrqcAsyncExportService;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.domain.SysUser;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @ClassName:ProcessListExport
* @author: ouyang0810@foxmail.com
* @CreateDate: 2024/11/1
* @UpdateUser: ouyang0810@foxmail.com
* @UpdateDate: 2024/11/1
* @UpdateRemark:
* @Description:
* @Version: [V1.0]
*/
@Service("MrqcAsyncExportService")
public class ProcessListExportService implements MrqcAsyncExportService<MrqcProcess> {
Logger logger = LogManager.getLogger(ProcessListExportService.class);
@Autowired
private IMrqcEmrConfigService iMrqcEmrConfigService;
@Override
public List<?> export(MrqcProcess mrqcProcess) {
SysUser sysUser = ShiroUtils.getSysUser();
List<SysRole> roles = sysUser.getRoles();
boolean anyMatch = roles.stream().anyMatch(o -> "ywkdc".equals(o.getRoleKey()));
if (anyMatch){
List<ProcessYWKDTO> processList = iMrqcEmrConfigService.getProcessListByYWK(mrqcProcess);
return processList;
}else {
List<ProcessDTO> processList = iMrqcEmrConfigService.getProcessList(mrqcProcess);
return processList;
}
}
}
package com.hanyun.hip.mrqc.jms.service.impl.extract;
import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.common.Term;
import com.hanyun.hip.mrqc.rule.entity.fact.MrqcStructData;
import com.hanyun.hip.mrqc.service.entity.EmrContent;
import com.hanyun.hip.mrqc.service.entity.MrqcStructExtract;
import com.hanyun.hip.mrqc.service.service.CustomStructExtracter;
import com.hanyun.hip.mrqc.service.util.UUidUtil;
import com.ruoyi.common.utils.StringUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.StringReader;
import java.util.List;
public class XmlLastIndexStringExtracter implements CustomStructExtracter {
final static String replaceChar1 = "/ ";
final static String replaceChar2 = " /";
@Override
public MrqcStructData extract(MrqcStructExtract struct, EmrContent content, MrqcStructData parent) {
try {
parent = parent == null ? new MrqcStructData() : parent;
String extScript = struct.getExtScript();
String value = null;
if(StringUtils.isNotEmpty(extScript)) {
//如xml不存在,从html提取
String contentXml = StringUtils.isNotBlank(content.getContentXml()) ? content.getContentXml() : content.getContentText();
if(StringUtils.isNotEmpty(contentXml)) {
SAXReader reader = new SAXReader();
StringReader sr = new StringReader(contentXml);
Document document = reader.read(sr);
// 3.获取根节点
Element rootElement = document.getRootElement();
String text = rootElement.getText();
if(text.contains(replaceChar1)) {
text = text.replace(replaceChar1, "/");
}
if(text.contains(replaceChar2)) {
String strLastString = StringUtils.substringBeforeLast(text, replaceChar2);
String[] spiltSignText = strLastString.split("\\s");
String strSign=spiltSignText[spiltSignText.length-1];
List<Term> termList = HanLP.segment(strSign);
if(termList.size()<3 ) {
text = text.replace(replaceChar2, "/");
}
}
String[] spiltText = text.split(extScript);
value=spiltText[spiltText.length-1];
}
}
if (parent.getDataId() == null) {
parent.setDataId(UUidUtil.getUUID());
}
parent.setDataValue(value == null ? "" : String.valueOf(value));
parent.setContentId(content.getContentId());
parent.setRecordId(content.getRecordId());
parent.setStructId(struct.getStructId());
} catch (Exception e) {
e.printStackTrace();
}
return parent;
}
}
package com.hanyun.hip.mrqc.jms.uitls;
import cn.hutool.core.collection.CollUtil;
import com.hanyun.hip.mrqc.service.engine.rule.QcUtil;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DateConverterUtil {
private static final List<String> COMMON_DATE_FORMATS = Arrays.asList(
"yyyy-MM-dd HH:mm:ss",
"yyyy-MM-dd HH:mm",
"yyyy-MM-dd HH",
"yyyy/MM/dd HH:mm:ss",
"yyyy.MM.dd HH:mm:ss",
"yyyy-MM-dd'T'HH:mm:ss",
"yyyy-MM-dd",
"yyyy年MM月dd日",
"yyyy年MM月dd日HH:mm",
"yyyyMMddHHmmss"
);
/**
* 尝试使用正则表达式匹配并转换给定的日期字符串为"yyyy-MM-dd HH:mm:ss"格式。
*
* @param strDate 待转换的日期字符串
* @return 转换后的"yyyy-MM-dd HH:mm:ss"格式的日期字符串,若无法匹配或转换则返回null
*/
public static String convertToDate(String strDate) {
for (String format : COMMON_DATE_FORMATS) {
try {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
LocalDateTime parsedDate = LocalDateTime.parse(strDate, formatter);
return parsedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
} catch (DateTimeParseException ignored) {
// 若当前格式不匹配,则忽略异常并尝试下一个格式
}
}
return null; // 若所有格式都无法匹配,返回null
}
/**
* 尝试使用正则表达式匹配并转换给定的日期字符串为"yyyy-MM-dd HH:mm:ss"格式。
* 这个方法仅作为示例,实际应用中可能效果不佳,建议使用标准日期时间库进行解析。
*
* @param strDate 待转换的日期字符串
* @return 转换后的"yyyy-MM-dd HH:mm:ss"格式的日期字符串,若无法匹配或转换则返回null
*/
@Deprecated
public static String convertToDateRegex(String strDate) {
// 创建一个包含多种常见日期格式的正则表达式
String regex = "(\\d{4})[-/.](\\d{2})[-/.](\\d{2})[ T]?\\s?(\\d{2}):(\\d{2}):(\\d{2})?"; // 示例正则,可能需要根据实际需求调整
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(strDate);
if (matcher.matches()) {
int year = Integer.parseInt(matcher.group(1));
int month = Integer.parseInt(matcher.group(2));
int day = Integer.parseInt(matcher.group(3));
int hour = matcher.group(4) != null ? Integer.parseInt(matcher.group(4)) : 0;
int minute = matcher.group(5) != null ? Integer.parseInt(matcher.group(5)) : 0;
int second = matcher.group(6) != null ? Integer.parseInt(matcher.group(6)) : 0;
// 使用SimpleDateFormat将解析出的日期时间组件组合成"yyyy-MM-dd HH:mm:ss"格式
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(year - 1900, month - 1, day, hour, minute, second); // 注意月份需要减1
return outputFormat.format(date);
} else {
return null; // 若无法匹配,返回null
}
}
/**
* 判断是否含有24小时入院记录
* @param recordId
* @return
*/
public static boolean isHave24HourRyEmrContent(String recordId){
if(recordId == null || recordId.isEmpty()){
return false;
}
List<Map<String, Object>> mapList = QcUtil.queryForList("select record_id from mrqc_emr_content where record_id = '" + recordId + "' and title like '%24小时入%'");
return CollUtil.isNotEmpty(mapList);
}
/**
* 判断是否含有入院记录
* @param recordId
* @return
*/
public static boolean isHaveInEmrContent(String recordId){
if(recordId == null || recordId.isEmpty()){
return false;
}
List<Map<String, Object>> mapList = QcUtil.queryForList("select record_id from mrqc_emr_content where record_id = '" + recordId + "' and title = '入院记录'");
return CollUtil.isNotEmpty(mapList);
}
/**
* 判断是否含有出院记录
* @param recordId
* @return
*/
public static boolean isHaveOutEmrContent(String recordId){
if(recordId == null || recordId.isEmpty()){
return false;
}
List<Map<String, Object>> mapList = QcUtil.queryForList("select record_id from mrqc_emr_content where record_id = '" + recordId + "' and title = '出院记录'");
return CollUtil.isNotEmpty(mapList);
}
}
package com.hanyun.hip.mrqc.jms.uitls;
import cn.hutool.core.collection.CollUtil;
import com.hanyun.hip.mrqc.service.engine.rule.QcUtil;
import java.util.List;
import java.util.Map;
/**
* @ClassName:JmsCommonUtil
* @author: ouyang0810@foxmail.com
* @CreateDate: 2024/10/23
* @UpdateUser: ouyang0810@foxmail.com
* @UpdateDate: 2024/10/23
* @UpdateRemark:统一处理工具类
* @Description:
* @Version: [V1.0]
*/
public class JmsCommonUtil {
/**
* 判断是否含有24小时入院记录
* @param recordId
* @return
*/
public static boolean isHaveRjEmrContent(String recordId){
if(recordId == null || recordId.isEmpty()){
return false;
}
List<Map<String, Object>> mapList = QcUtil.queryForList("select record_id from mrqc_emr_content where record_id = '" + recordId + "' and title like '%入出院记录'");
return CollUtil.isNotEmpty(mapList);
}
}
package com.hanyun.hip.mrqc.jms.uitls;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hanyun.hip.mrqc.service.util.DateUtils;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
import java.util.Date;
public class JsonUtil {
/**
* 将json转化为xml
* @param json
* @return
*/
public static String JsonToXml(Object json) {
if(json==null){
return null;
}else{
Element elements=new Element("xml");
getXMLFromObject(json,"xml",elements);
XMLOutputter xmlOut = new XMLOutputter();
String res=xmlOut.outputString(elements);
return res;
}
}
public static void getXMLFromObject(Object obj,String tag,Element parent) {
if(obj==null)
return;
Element child;
String eleStr;
Object childValue;
if(obj instanceof JSONObject)
{
JSONObject jsonObject=(JSONObject)obj;
for(Object temp:jsonObject.keySet())
{
eleStr=temp.toString();
childValue=jsonObject.get(temp);
child=new Element(eleStr);
if(childValue instanceof JSONArray)
getXMLFromObject(childValue,eleStr,parent);
else{
parent.addContent(child);
getXMLFromObject(childValue,eleStr,child);
}
}
}else if(obj instanceof JSONArray){
JSONArray jsonArray=(JSONArray)obj;
for(int i=0;i<jsonArray.size();i++)
{
childValue=jsonArray.get(i);
child=new Element(tag);
parent.addContent(child);
getXMLFromObject(childValue,tag,child);
}
}else if(obj instanceof Date){
parent.setText(DateUtils.dateToString((Date) obj,DateUtils.DATE_TIME_FORMAT));
}else{
parent.setText(obj.toString());
}
}
/**
*
* @param arr 需要转化为属性结构的arr
* @param id 数据唯一标示
* @param pid 父id唯一标识键
* @param child 子节点键
* @return
*/
public static JSONArray listToTree(JSONArray arr, String id, String pid, String child){
JSONArray r=new JSONArray();
JSONObject hash=new JSONObject();
for(int i=0;i<arr.size();i++){
JSONObject json= (JSONObject) arr.get(i);
hash.put(json.getString(id),json);
}
for(int j=0;j<arr.size();j++){
JSONObject aVal= (JSONObject) arr.get(j);
JSONObject hashVP =null;
if(aVal.getString(pid)!=null){
hashVP = (JSONObject)hash.get(aVal.getString(pid));
}
if(hashVP!=null){
if(hashVP.get(child)!=null){
JSONArray ch= (JSONArray) hashVP.get(child);
ch.add(aVal);
hashVP.put(child,ch);
} else{
JSONArray ch=new JSONArray();
ch.add(aVal);
hashVP.put(child,ch);
}
}else{
r.add(aVal);
}
}
return r;
}
}
package com.hanyun.hip.mrqc.jms.uitls;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import cn.easyes.common.utils.StringUtils;
/**
* @author zgp
* @version V1.0
* @Title:
* @Package
* @Description: 电子病历文书接口
* @date 2022年11月15日 上午15:12:04
*/
public class WsdlToSoapUtil {
public WsdlToSoapUtil() {
// TODO Auto-generated constructor stub
}
public static String sendData(String urlString,String soapActionString,String xml) {
StringBuffer sbXml = new StringBuffer();
try {
URL url = new URL(urlString);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
//Content-Length长度会自动进行计算
httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
if(StringUtils.isNotEmpty(soapActionString)) {
httpConn.setRequestProperty("soapActionString",soapActionString);//Soap1.1使用 其实完全可以不需要
}
httpConn.setRequestMethod("POST");
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
OutputStream out = httpConn.getOutputStream();
out.write(xml.getBytes());
out.close();
if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK)
{
InputStreamReader is = new InputStreamReader(httpConn.getInputStream());
BufferedReader in = new BufferedReader(is);
String inputLine;
while ((inputLine = in.readLine()) != null)
{
sbXml.append(inputLine);
}
in.close();
}
else{
//如果服务器返回的HTTP状态不是HTTP_OK,则表示发生了错误,此时可以通过如下方法了解错误原因。
InputStream is = httpConn.getErrorStream(); //通过getErrorStream了解错误的详情,因为错误详情也以XML格式返回,因此也可以用JDOM来获取。
InputStreamReader isr = new InputStreamReader(is,"utf-8");
BufferedReader in = new BufferedReader(isr);
String inputLine;
while ((inputLine = in.readLine()) != null)
{
System.out.println(inputLine);
}
in.close();
}
httpConn.disconnect();
}catch(Exception e) {
e.printStackTrace();
}
return sbXml.toString();
}
public static void main(String srg[]) {
}
}
baseUrl: http://127.0.0.1:8080/mrqc
#drg相关配置
drg:
version: NJ-CHS-DRG-1.1
monitor:
days: 60
icdConfig: 7:诊断-596954:疾病分类与代码医保版2.0,8:手术-206452:手术操作分类与代码医保版2.0
disease: 7
treat: 8
lowHeightMedicalRecordType: nanjinHeightLowMedicalRecordTypeAlgorithm
\ No newline at end of file
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
#佳木斯市中心医院
url: jdbc:mysql://localhost:3306/mrqc_jms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
# url: jdbc:mysql://192.168.1.27:3306/jms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
username: root
password: 123456
# password: HanYun#2021
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 200
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /monitor/druid/*
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 10000
merge-sql: false
wall:
config:
multi-statement-allow: true
mrqc:
lv1: 甲级|(@{score}>=85)|#60CD96
lv2: 乙级|(@{score}>70&&@{score}<85)|#4290E7
lv3: 丙级|(@{score}<=70)|#F04F5E
#logo的路径
logoPath: mrqc/jms/images/jms-mrqc-logo.png
logoIcoPath: mrqc/jms/images/logoIco.png
logoTitle: 智能病历质控
# 是否过滤敏感姓名
sensitiveFilter: false
sensitiveWord:
noqc-color: D9D9D9
totalscore: 100
#提醒标准
qcstandar:
#扣分标准
qcscorestdorg:
rulelv: 1|-1|#33CCFF,2|-2|#33CCFF,3|-3|#33CCFF,4|-4|#33CCFF,5|-5|#33CCFF,6|-6|#33CCFF,7|-7|#33CCFF
#病历模块过滤规则,格式如下:模块Id#关键词,关键词1...|模块Id1#关键词,关键词1...|...
emrFilter: emr02#入院记录|emr03#病程记录|emr04#出院记录,死亡记录|emr05#知情,同意|emr07#手术,安全核查单
smallDepartOfnewBorn: 儿科
#个人质控选择条件配置,包括住院时间,关键监测指标,手术级别
userEmrFilters:
#入院、出院时间#结构体编码 运算符
hospitTimes: admissionTime#HDSD00_11_085 >= | dischargeTime#HDSD00_11_019 <=
#关键指标#编码及运算结果#中文名称
keyIndices: death#HDSD00_11_057 = '5'#死亡 | operated#HDSD00_11_090 != ''#手术 | critical#HDSD00_11_153 = '1'#危重 | emergency#HDSD00_11_164 > '0'#抢救 | difficult#HDSD00_11_154 = '1'#疑难 | transfusion#HY_ZYYZ_SXSQ != ''#输血 | daySurgery#HDSD00_11_157 = '1'#日间手术
#手术级别#编码 运算符#中文名称
operationLevels: operationLevel6#HDSD00_11_092_6 =#六级 | operationLevel5#HDSD00_11_092_5 =#五级 | operationLevel4#HDSD00_11_092_4 =#四级 | operationLevel3#HDSD00_11_092_3 =#三级 | operationLevel2#HDSD00_11_092_2 =#二级 | operationLevel#HDSD00_11_092 =#一级
etlApi: JmsEmrETLApi
emrAssignApi: JmsAutoAssignEMRImpl
emrAssignRuleHtml: mrqc/jms/assign/jmsAutoAssign
hospitalCodes: 46600264-9
#是否自动拼接头部, content_text字段
emrHead: false
#是否中医院# 判断病案首页
isZyy: false
#显示中医病案首页的科室#
zyks:
aliasMap: department_name#病区 | inpatient_area#科室 | report_title#佳木斯市中心医院
#是否过滤科室
excludeDepts: true
admission:
# 住院登记处所关心的结构体ID,以结构体ID作
structId:
#单项否决 乙级病例和丙级病历的边界数
dxfjCount: 2
#是否为门诊质控
hasOutPatient: false
# 根据标准表二级ID初始化,如:2091:首页,2092:全病历
defaultMRScore: 2092
# 人工质控病历隐藏机器质控缺陷,如果不配置则默认为 false
hiddenDefectsWhenManualQc: false
#质控详情是否显示质控流程
showFlow: true
#是否隐藏主页机构选择下拉框; true: 隐藏; flase: 展示
hospitalListHidden: true
#详情页发送质控消息接收人配置,true:系统所有用户、false:病历相关医师
sendMessageShowAllUser: true
#详情页发送医疗组长配置,南通附属医院,需要在映射表中增加对应的医疗组长
sendRecordDoctor : true
#是否添加水印 true: 显示; flase: 隐藏
showWatermark: false
#水印文字
showWatermarkText: 江苏瀚云医疗信息技术有限公司
process.scene: 环节质控_23790
njwx:
ofdViewInf:
mrqc:
lv1: 甲级|(@{score}>=85)|#60CD96
lv2: 乙级|(@{score}>=70&&@{score}<85)|#4290E7
lv3: 丙级|(@{score}<70)|#F04F5E
#logo的路径
logoPath: /mrqc/images/logo/wxjy.png
# 是否过滤敏感姓名
sensitiveFilter: false
sensitiveWord: 鼓楼,鼓 楼
noqc-color: D9D9D9
totalscore: 100
#提醒标准
qcstandar: 鼓楼标准,江苏省标,书写规范
#扣分标准
qcscorestdorg: 鼓楼标准,江苏省标,书写规范
rulelv: 1|-1|#33CCFF,2|-2|#33CCFF,3|-3|#33CCFF,4|-4|#33CCFF,5|-5|#33CCFF,6|-6|#33CCFF,7|-7|#33CCFF
#病历模块过滤规则,格式如下:模块Id#关键词,关键词1...|模块Id1#关键词,关键词1...|...
emrFilter: emr02#入院记录|emr03#病程记录|emr04#出院记录,死亡记录|emr05#知情,同意|emr07#手术,安全核查单
smallDepartOfnewBorn: 儿科
#个人质控选择条件配置,包括住院时间,关键监测指标,手术级别
userEmrFilters:
#入院、出院时间#结构体编码 运算符
hospitTimes: admissionTime#HDSD00_11_085 >= | dischargeTime#HDSD00_11_019 <=
#关键指标#编码及运算结果#中文名称
keyIndices: death#HDSD00_11_057 = '5'#死亡 | operated#HDSD00_11_090 != ''#手术 | critical#HDSD00_11_153 = '1'#危重 | emergency#HDSD00_11_164 > '0'#抢救 | difficult#HDSD00_11_154 = '1'#疑难 | transfusion#HY_ZYYZ_SXSQ != ''#输血 | daySurgery#HDSD00_11_157 = '1'#日间手术
#手术级别#编码 运算符#中文名称
operationLevels: operationLevel6#HDSD00_11_092_6 =#六级 | operationLevel5#HDSD00_11_092_5 =#五级 | operationLevel4#HDSD00_11_092_4 =#四级 | operationLevel3#HDSD00_11_092_3 =#三级 | operationLevel2#HDSD00_11_092_2 =#二级 | operationLevel#HDSD00_11_092 =#一级
etlApi: Wx9yEmrETLApi
emrAssignApi: WxjyAutoAssignEMRImpl
emrAssignRuleHtml: mrqc/assign/zjsyAutoAssign
hospitalCodes: 1001500
emrHead: false
#是否中医院# 判断病案首页
isZyy: false
#显示中医病案首页的科室#
zyks:
aliasMap: inpatient_area#病区 | department_name#科室 | hospit_doctor#医生
excludeDepts: true
admission:
# 住院登记处所关心的结构体ID,以结构体ID作
structId: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18,20,21,22,23,24,28,29,30,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,187,204,247,248
#单项否决 乙级病例和丙级病历的边界数
dxfjCount: 2
# 根据标准表二级ID初始化,如:2091:首页,2092:全病历
defaultMRScore: 2092
# 根据标准表一级ID初始化,如:2090
defaultRootStandard: 2090
depts: 创伤骨科A,创伤骨科B
njwx:
ofdViewInf: http://10.40.34.191:8080/web-reader/reader?file=http://10.40.36.19:8090/getPdfStream.do?viewType=qc%26fileid=
mrqc:
lv1: 甲级|(@{score}>=85)|#60CD96
lv2: 乙级|(@{score}>=70&&@{score}<85)|#4290E7
lv3: 丙级|(@{score}<70)|#F04F5E
#logo的路径
logoPath: /mrqc/images/logo/wxjy.png
# 是否过滤敏感姓名
sensitiveFilter: false
sensitiveWord: 鼓楼,鼓 楼
noqc-color: D9D9D9
totalscore: 100
#提醒标准
qcstandar: 鼓楼标准,江苏省标,书写规范
#扣分标准
qcscorestdorg: 鼓楼标准,江苏省标,书写规范
rulelv: 1|-1|#33CCFF,2|-2|#33CCFF,3|-3|#33CCFF,4|-4|#33CCFF,5|-5|#33CCFF,6|-6|#33CCFF,7|-7|#33CCFF
#病历模块过滤规则,格式如下:模块Id#关键词,关键词1...|模块Id1#关键词,关键词1...|...
emrFilter: emr02#入院记录|emr03#病程记录|emr04#出院记录,死亡记录|emr05#知情,同意|emr07#手术,安全核查单
smallDepartOfnewBorn: 儿科
#个人质控选择条件配置,包括住院时间,关键监测指标,手术级别
userEmrFilters:
#入院、出院时间#结构体编码 运算符
hospitTimes: admissionTime#HDSD00_11_085 >= | dischargeTime#HDSD00_11_019 <=
#关键指标#编码及运算结果#中文名称
keyIndices: death#HDSD00_11_057 = '5'#死亡 | operated#HDSD00_11_090 != ''#手术 | critical#HDSD00_11_153 = '1'#危重 | emergency#HDSD00_11_164 > '0'#抢救 | difficult#HDSD00_11_154 = '1'#疑难 | transfusion#HY_ZYYZ_SXSQ != ''#输血 | daySurgery#HDSD00_11_157 = '1'#日间手术
#手术级别#编码 运算符#中文名称
operationLevels: operationLevel6#HDSD00_11_092_6 =#六级 | operationLevel5#HDSD00_11_092_5 =#五级 | operationLevel4#HDSD00_11_092_4 =#四级 | operationLevel3#HDSD00_11_092_3 =#三级 | operationLevel2#HDSD00_11_092_2 =#二级 | operationLevel#HDSD00_11_092 =#一级
etlApi: Wx9yEmrETLApiNew
emrAssignApi: WxjyAutoAssignEMRImpl
emrAssignRuleHtml: mrqc/assign/zjsyAutoAssign
hospitalCodes: 1001500
emrHead: false
#是否中医院# 判断病案首页
isZyy: false
#显示中医病案首页的科室#
zyks:
aliasMap: inpatient_area#病区 | department_name#科室 | hospit_doctor#医生
excludeDepts: true
admission:
# 住院登记处所关心的结构体ID,以结构体ID作
structId: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18,20,21,22,23,24,28,29,30,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,187,204,247,248
#单项否决 乙级病例和丙级病历的边界数
dxfjCount: 2
# 根据标准表二级ID初始化,如:2091:首页,2092:全病历
defaultMRScore: 2092
# 根据标准表一级ID初始化,如:2090
defaultRootStandard: 2090
depts: 创伤骨科A,创伤骨科B
njwx:
ofdViewInf: http://10.40.34.191:8080/web-reader/reader?file=http://10.40.36.19:8090/getPdfStream.do?viewType=qc%26fileid=
# 项目相关配置
ruoyi:
# 名称
name: hip
# 版本
version: 4.1.0
# 版权年份
copyrightYear: 2022
# 文件路径
profile: /u01/app/profile/
# 获取ip地址开关
addressEnabled: true
# 开发环境配置
server:
# 服务器的HTTP端口,默认为80
port: 81
servlet:
# 应用的访问路径
context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# tomcat最大线程数,默认为200
max-threads: 800
# Tomcat启动初始化的线程数,默认值25
min-spare-threads: 30
# 日志配置
logging:
level:
com.ruoyi: warn
org.springframework: warn
com.hanyun.hip.mrqc.service: warn
com.hanyun.hip.mrqc.service.mapper: debug
com.hanyun.hip.mrqc.rule.mapper: warn
com.hanyun.hip.mrqc.sdis.mapper: warn
com.hanyun.hip.mrqc.cdss.mapper: warn
com.hanyun.hip.mrqc.rule: warn
com.hanyun.hip.mrqc.drgs: warn
# 用户配置
user:
password:
# 密码错误{maxRetryCount}次锁定10分钟
maxRetryCount: 10
# Spring配置
spring:
# 模板引擎
thymeleaf:
mode: HTML
encoding: utf-8
# 禁用缓存
cache: false
# 资源信息
messages:
# 国际化资源文件路径
basename: static/i18n/messages
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
profiles:
include: druid,wxjy,drg
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
# 服务模块
devtools:
restart:
# 热部署开关
enabled: true
additional-paths: src/main/java
# MyBatis
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.ruoyi.system.domain,com.ruoyi.quartz.domain,com.ruoyi.generator.domain,com.hanyun.hip.kgms.service.tenant.domain,com.hanyun.kgms.maker.domain,com.hanyun.kgms.doc.domain,com.hanyun.hip.kgms.service.doc.domain,com.hanyun.kgms.term.domain,com.hanyun.kgms.term.domain,com.hanyun.hip.mrqc.drgs.domain,com.hanyun.hip.mrqc.service.analysis.domain,com.hanyun.hip.mrqc.sdis.domain,com.hanyun.hip.knowledge,com.ruoyi.activiti.domain,com.hanyun.hip.mrqc.cdss.domain,com.hanyun.hip.mrqc.drgs.entity
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
type-handlers-package: com.hanyun.hip.mrqc.service.handler
# PageHelper分页插件
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
# Shiro
shiro:
user:
# 登录地址
loginUrl: /mrqc/login
# 权限认证失败地址
unauthorizedUrl: /unauth
# 首页地址
indexUrl: /mrqc/index
# 验证码开关
captchaEnabled: false
# 验证码类型 math 数组计算 char 字符
captchaType: math
# 权限白名单
whitelist: /**/css/**,/**/js/**,/**/images/**,/mrqc/main,/mrqc/qualityScore,/mrqc/index/selectStdSourceStat,/mrqc/index/statTable,/mrqc/index/selectRuleTypeStat,/mrqc/index/ruleMonth,/mrqc/index/getEmrLvScoreRules,/mrqc/index/selectAreaAndDepartment,/mrqc/standard/selectAllDeparment,/mrqc/index/selectRecordScoreAvg,/mrqc/standard/**,/mrqc/standard/ksStat,/mrqc/standard/ysStat,/mrqc/hospitalTypeStat/**,/mrqc/mrqcQualityReport,/mrqc/qualityReport/**,/mrqc/findQualityDefectAll,/mrqc/countIndex,/mrqc/homeScreen/selectScreenCache/**,/mrqc/emrrecord/todetail/**,/mrqc/emrrecord/submitaudit/**,/mrqc/emrrecord/homeTracing/**,/mrqc/emrconfig/listemrmodel/**,/mrqc/emrrecord/initdetaildata/**,/mrqc/emrrecord/initdetailmenu/**,/mrqc/emrrecord/manualintervenqc/**,/mrqc/emrrecord/initdetailCount/**,/mrqc/emrrecord/toaddnewdefect/**,/api/refreshEmrScore/**,/api/refreshByRecord/**,/mrqc/emrrecord/toemrmodule/**,/mrqc/emrrecord/selectUrlByEmrIdAndRecordId/**,/mrqc/tempCache/selectScreenCache,/api/**,/sso/login**,/v2/api-docs/**,/ureport/**,/mrqc/notice/list,/kqyyApi/**,/mrqc/emrrecord/loadScoreLv/**,/drgs/groupOneRecord,/drg/drgMonitor/link/reminder/**,/mrqc/process/step/confirm/isModify
cookie:
# 设置Cookie的域名 默认空,即当前访问的域名
domain:
# 设置cookie的有效访问路径
path: /
# 设置HttpOnly属性
httpOnly: true
# 设置Cookie的过期时间,天为单位
maxAge: 30
session:
# Session超时时间(默认30分钟)
expireTime: 300000
# 同步session到数据库的周期(默认1分钟)
dbSyncPeriod: 1
# 相隔多久检查一次session的有效性,默认就是10分钟
validationInterval: 10
conf:
sysanon: /kgms/maker/index
#不拦截的路径
# 防止XSS攻击
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
excludes: /system/notice/*
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
img: #//如果是Windows情况下,格式是 D:\\blog\\image linx 格式"/home/blog/image";
location: /home/blog/image
mrqc:
# demo 模式病历列表查询最新有数据的月份
query: dev
#================License相关配置===============#
license:
#证书名称
subject: hip-mrqc
#公钥别名
publicAlias: publicCert
#公钥库所在的位置
publicKeysStorePath: /publicCerts.store
#公钥库访问密码
storePass: HanYun@2020
#证书所在的位置
licensePath: /license.lic
#================License相关配置===============#
#================消息中心相关配置===============#
spring.rabbitmq.host: 192.168.1.13
spring.rabbitmq.port: 5672
spring.rabbitmq.username: root
spring.rabbitmq.password: root
spring.rabbitmq.virtual-host: /
hanyun.message.enable: false
#================消息中心相关配置===============#
nlp:
cache.enable: false
sso:
login.service: default
# ES 插件配置
easy-es:
enable: false
Application Version: ${ruoyi.version}
Spring Boot Version: ${spring-boot.version}
██╗███╗ ███╗███████╗ ███╗ ███╗██████╗ ██████╗ ██████╗
██║████╗ ████║██╔════╝ ████╗ ████║██╔══██╗██╔═══██╗██╔════╝
██║██╔████╔██║███████╗█████╗██╔████╔██║██████╔╝██║ ██║██║
██ ██║██║╚██╔╝██║╚════██║╚════╝██║╚██╔╝██║██╔══██╗██║▄▄ ██║██║
╚█████╔╝██║ ╚═╝ ██║███████║ ██║ ╚═╝ ██║██║ ██║╚██████╔╝╚██████╗
╚════╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚══▀▀═╝ ╚═════╝
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hanyun.hip.mrqc.jms.mapper.AutoAssignMapper">
<!-- 按四级、三级和住院时长查询数据 -->
<select id="selecAllDeptsurgicalOperateList" parameterType="String" resultType="map">
SELECT
record_id,department_name,inpatient_area,in_time,out_time,hospit_doctor
FROM mrqc_record u
WHERE DATE_FORMAT( out_time, '%Y-%m' ) = #{qcMonth}
AND u.record_id not in (
select mor.record_id from mrqc_operator_record mor,mrqc_report_month mrm
where mor.report_id=mrm.report_id
and mrm.qc_month = #{qcMonth}
)
${dataScope}
</select>
<select id="selectAllZyRecordId" resultType="java.lang.String" parameterType="java.lang.String">
SELECT
record_id
FROM
mrqc_record
WHERE
emr_status = '1'
<if test="department != null and department != ''">
AND inpatient_area IN (${department})
</if>
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hanyun.hip.mrqc.jms.mapper.TdfyDeptMapper">
<insert id="insertDeptBackId" parameterType="com.ruoyi.system.domain.SysDept" useGeneratedKeys="true" keyProperty="deptId">
insert into sys_dept(
<if test="deptId != null and deptId != 0">dept_id,</if>
<if test="parentId != null and parentId != 0">parent_id,</if>
<if test="deptName != null and deptName != ''">dept_name,</if>
<if test="ancestors != null and ancestors != ''">ancestors,</if>
<if test="orderNum != null and orderNum != ''">order_num,</if>
<if test="leader != null and leader != ''">leader,</if>
<if test="phone != null and phone != ''">phone,</if>
<if test="email != null and email != ''">email,</if>
<if test="area != null and area != ''">area,</if>
<if test="status != null">status,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
create_time
)values(
<if test="deptId != null and deptId != 0">#{deptId},</if>
<if test="parentId != null and parentId != 0">#{parentId},</if>
<if test="deptName != null and deptName != ''">#{deptName},</if>
<if test="ancestors != null and ancestors != ''">#{ancestors},</if>
<if test="orderNum != null and orderNum != ''">#{orderNum},</if>
<if test="leader != null and leader != ''">#{leader},</if>
<if test="phone != null and phone != ''">#{phone},</if>
<if test="email != null and email != ''">#{email},</if>
<if test="area != null and area != ''">#{area},</if>
<if test="status != null">#{status},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
sysdate()
)
</insert>
<select id="findAllInpatientArea" resultType="map">
SELECT
IFNULL(inpatient_area,'未知') as inpatientArea,
IFNULL(inpatient_code,'') as inpatientCode,
IFNULL(department_code,'') as departmentCode,
IFNULL(department_name,'未知') as departmentName
from mrqc_record
where inpatient_area IS NOT NULL AND inpatient_area != ''
AND inpatient_code IS NOT NULL AND inpatient_code != ''
AND department_code IS NOT NULL AND department_code != ''
AND department_name IS NOT NULL AND department_name != ''
GROUP BY inpatient_area,department_name
ORDER BY inpatient_code
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hanyun.hip.mrqc.jms.mapper.UReportExportMapper">
<resultMap type="com.hanyun.hip.mrqc.service.entity.EmrRecord" id="EmrRecordResult">
<result property="recordId" column="record_id"/>
<result property="patientNum" column="patient_num"/>
<result property="hospitCode" column="hospit_code"/>
<result property="hospitNum" column="hospit_num"/>
<result property="patientName" column="patient_name"/>
<result property="patientSex" column="patient_sex"/>
<result property="birthday" column="birthday"/>
<result property="age" column="age"/>
<result property="auto" column="auto"/>
<result property="diagnosisCode" column="diagnosis_code"/>
<result property="diagnosisName" column="diagnosis_name"/>
<result property="doctorCode" column="doctor_code"/>
<result property="hospitDoctor" column="hospit_doctor"/>
<result property="hospitTime" column="hospit_time"/>
<result property="recordScore" column="record_score"/>
<result property="homepageScore" column="homepage_score"/>
<result property="inpatientArea" column="inpatient_area"/>
<result property="departmentCode" column="department_code"/>
<result property="departmentName" column="department_name"/>
<result property="creater" column="creater"/>
<result property="createTime" column="create_time"/>
<result property="modifyer" column="modifyer"/>
<result property="modifyTime" column="modify_time"/>
<result property="hospitName" column="hospit_name"/>
<result property="emrStatus" column="emr_status"/>
<result property="inTime" column="in_time"/>
<result property="outTime" column="out_time"/>
<result property="etlTime" column="etl_time"/>
<result property="approved" column="approved"/>
<result property="reportId" column="report_id"/>
<result property="bedNumber" column="bed_number"/>
</resultMap>
<select id="selectDeathList" resultType="com.hanyun.hip.mrqc.jms.entity.UReportDeathDTO">
select hospit_doctor as doctorName,inpatient_area as inpatientArea,out_time as outTime,record_id as recordId,(select label_id from mrqc_record_label where label_id = '27' and record_id = u.record_id) as labelId, ( select approved from mrqc_operator_record where record_id = u.record_id) as approved from mrqc_record u
where 1=1
and inpatient_area is not null and inpatient_area != ''
<if test="hospitDoctor != null and hospitDoctor != ''">
AND u.hospit_doctor like concat('%', #{hospitDoctor}, '%')
</if>
<if test="inpatientArea != null and inpatientArea != ''">
AND u.inpatient_area like concat('%', #{inpatientArea},'%')
</if>
<if test="beginTime != null"><!-- 开始时间检索 -->
AND date_format(u.out_time,'%y%m%d') &gt;=date_format(#{beginTime},'%y%m%d')
</if>
<if test="endTime != null"><!-- 结束时间检索 -->
AND date_format(u.out_time,'%y%m%d') &lt;=date_format(#{endTime},'%y%m%d')
</if>
</select>
<select id="selectEmrRecordList" parameterType="com.hanyun.hip.mrqc.service.entity.EmrRecord" resultMap="EmrRecordResult">
select u.* from mrqc_record u
<if test="dataType != null and dataType == '2'">
left join mrqc_record_label l on u.record_id = l.record_id
</if>
<!-- <if test="dataType != null and dataType == '3'">-->
<!-- left join mrqc_operator_record o on u.record_id = o.record_id-->
<!-- </if>-->
where 1=1
and u.inpatient_area is not null and u.inpatient_area != ''
<if test="dataType != null and dataType == '2'">
and l.label_id = '27'
</if>
<!-- <if test="dataType != null and dataType == '3'">-->
<!-- and o.approved = '1'-->
<!-- </if>-->
<if test="hospitDoctor != null and hospitDoctor != ''">
AND u.hospit_doctor like concat('%', #{hospitDoctor}, '%')
</if>
<if test="inpatientArea != null and inpatientArea != ''">
AND u.inpatient_area = #{inpatientArea}
</if>
<if test="beginTime != null"><!-- 开始时间检索 -->
AND date_format(u.out_time,'%y%m%d') &gt;=date_format(#{beginTime},'%y%m%d')
</if>
<if test="endTime != null"><!-- 结束时间检索 -->
AND date_format(u.out_time,'%y%m%d') &lt;=date_format(#{endTime},'%y%m%d')
</if>
</select>
<select id="selectEmrRecordListByLabelId" parameterType="com.hanyun.hip.mrqc.service.entity.EmrRecord" resultMap="EmrRecordResult">
select u.* from mrqc_record u
left join mrqc_record_label l on u.record_id = l.record_id
<!-- <if test="dataType != null and dataType == '3'">-->
<!-- left join mrqc_operator_record o on u.record_id = o.record_id-->
<!-- </if>-->
where 1=1
and u.inpatient_area is not null and u.inpatient_area != ''
and l.label_id = '27'
<!-- <if test="dataType != null and dataType == '3'">-->
<!-- and o.approved = '1'-->
<!-- </if>-->
<if test="hospitDoctor != null and hospitDoctor != ''">
AND u.hospit_doctor like concat('%', #{hospitDoctor}, '%')
</if>
<if test="inpatientArea != null and inpatientArea != ''">
AND u.inpatient_area = #{inpatientArea}
</if>
<if test="beginTime != null"><!-- 开始时间检索 -->
AND date_format(u.out_time,'%y%m%d') &gt;=date_format(#{beginTime},'%y%m%d')
</if>
<if test="endTime != null"><!-- 结束时间检索 -->
AND date_format(u.out_time,'%y%m%d') &lt;=date_format(#{endTime},'%y%m%d')
</if>
</select>
<select id="selectEmrRecordListByApproved" parameterType="com.hanyun.hip.mrqc.service.entity.EmrRecord" resultMap="EmrRecordResult">
select u.* from mrqc_record u
left join mrqc_operator_record o on u.record_id = o.record_id
where 1=1
and u.inpatient_area is not null and u.inpatient_area != ''
and o.approved = '1'
<if test="hospitDoctor != null and hospitDoctor != ''">
AND u.hospit_doctor like concat('%', #{hospitDoctor}, '%')
</if>
<if test="inpatientArea != null and inpatientArea != ''">
AND u.inpatient_area = #{inpatientArea}
</if>
<if test="beginTime != null"><!-- 开始时间检索 -->
AND date_format(u.out_time,'%y%m%d') &gt;=date_format(#{beginTime},'%y%m%d')
</if>
<if test="endTime != null"><!-- 结束时间检索 -->
AND date_format(u.out_time,'%y%m%d') &lt;=date_format(#{endTime},'%y%m%d')
</if>
</select>
<select id="selectRectificationList" resultType="com.hanyun.hip.mrqc.jms.entity.UReportRectificationDTO">
select r.record_id as recordId ,r.inpatient_area as inpatientArea,r.hospit_doctor as hospitDoctor,
(select count(*) from mrqc_result_history mh where mh.record_id = r.record_id) as historyCount,
(select count(*) from mrqc_rule_result mh where mh.record_id = r.record_id) as nowRCount,
(select count(*) from mrqc_manual_defect mh where mh.record_id = r.record_id and status =2) as nowPCount
from mrqc_record r
where 1=1
<if test="hospitDoctor != null and hospitDoctor != ''">
AND r.hospit_doctor like concat('%', #{hospitDoctor}, '%')
</if>
<if test="inpatientArea != null and inpatientArea != ''">
AND r.inpatient_area = #{inpatientArea}
</if>
<if test="beginTime != null"><!-- 开始时间检索 -->
AND date_format(r.out_time,'%y%m%d') &gt;=date_format(#{beginTime},'%y%m%d')
</if>
<if test="endTime != null"><!-- 结束时间检索 -->
AND date_format(r.out_time,'%y%m%d') &lt;=date_format(#{endTime},'%y%m%d')
</if>
</select>
</mapper>
<style id="CaseStyle">.doc-header {
<style id="CaseStyle">.doc-header {
position: relative;
padding-top: 10px;
padding-bottom: 20px;
}
.doc-header .hospital-name {
font-family: KaiTi;
font-weight: bold;
text-align: center;
font-size: 22px;
margin-bottom: 10px;
}
.doc-header .organization-id {
vertical-align: middle;
font-size: 14px;
position: absolute;
right: 10px;
top: 10px;
text-align: center;
margin-bottom: 10px;
}
.doc-header .doc-title {
font-weight: bold;
text-align: center;
font-size: 24px;
}
.doc-header .sub-title {
font-weight: bold;
text-align: center;
font-size: 16px;
}
.doc-header .patient-info {
margin-top: 15px;
margin-bottom: 10px;
display: flex;
}
.doc-header .patient-info > div {
flex-grow: 1;
}
.doc-body .base-info {
margin-top: 20px;
}
.doc-body .base-info > div {
margin-bottom: 20px;
float: left;
width: 50%;
}
.doc-body .base-info > div.whole {
width: 100%;
}
.doc-body .base-info > div.line {
background: #e0e0e0;
height: 1px;
}
.doc-body .base-info::after {
content: " ";
display: table;
clear: both;
}
.doc-body .base-info > div.whole table{
border-collapse: collapse;
border: 1px solid #e0e0e0;
}
.doc-body .base-info > div.whole table th,.doc-body .base-info > div.whole table td{
border: 1px solid #e0e0e0;
padding: 5px 10px;
}
.doc-body .base-info .widget-label {
display: inline-block;
}
.doc-body .chief-complaint,
.doc-body .present-history {
margin-top: 20px;
}
.doc-body .chief-complaint .widget-label,
.doc-body .present-history .widget-label {
font-weight: bold;
display: inline-block;
}
.doc-body .autograph,
.doc-body .diagnosis {
text-align: right;
margin-top: 40px;
margin-right: 20px;
}
.doc-body .autograph > div{
margin-bottom: 20px;
}</style>
<div class="doc-container">
<include src="mrqc/customCaseTpl/public/head.tpl"/>
<div class="doc-body">
<div class="present-history" >
<span class="widget-label">主诉:</span>
<widget type="textarea" width="650" wid="HDSD00_05_077" placeholder="-"></widget>
</div>
<div class="present-history" >
<span class="widget-label">入院情况:</span>
<widget type="textarea" width="650" wid="HDSD00_13_056" placeholder="-"></widget>
</div>
<div class="present-history" >
<span class="widget-label">入院诊断:</span>
<widget type="textarea" width="650" wid="HDSD00_13_060" placeholder="-"></widget>
</div>
<div class="present-history">
<span class="widget-label">诊疗经过:</span>
<widget type="textarea" width="650" wid="HDSD00_13_107" placeholder="-"></widget>
</div>
<div class="present-history">
<span class="widget-label">死亡原因:</span>
<widget type="textarea" width="650" wid="HDSD00_13_068" placeholder="-"></widget>
</div>
<div class="present-history" >
<span class="widget-label">死亡诊断:</span>
<widget type="textarea" width="650" wid="HDSD00_13_070" placeholder="-"></widget>
</div>
<div class="autograph">
<div>
<span class="widget-label">医师签名: </span>
<widget wid="HDSD00_13_113" type="input" width="180"></widget>
</div>
<div>
<span class="widget-label">记录时间: </span>
<widget wid="HDSD00_13_JLSJ" type="input" width="180"></widget>
</div>
</div>
</div>
</div>
<style id="CaseStyle">.doc-header {
position: relative;
padding-top: 10px;
padding-bottom: 20px;
}
.doc-header .hospital-name {
font-family: KaiTi;
font-weight: bold;
text-align: center;
font-size: 22px;
margin-bottom: 10px;
}
.doc-header .organization-id {
vertical-align: middle;
font-size: 14px;
position: absolute;
right: 10px;
top: 10px;
text-align: center;
margin-bottom: 10px;
}
.doc-header .doc-title {
font-weight: bold;
text-align: center;
font-size: 24px;
}
.doc-header .sub-title {
font-weight: bold;
text-align: center;
font-size: 16px;
}
.doc-header .patient-info {
margin-top: 15px;
margin-bottom: 10px;
display: flex;
}
.doc-header .patient-info > div {
flex-grow: 1;
}
.doc-body .base-info {
margin-top: 20px;
}
.doc-body .base-info > div {
margin-bottom: 20px;
float: left;
width: 50%;
}
.doc-body .base-info > div.whole {
width: 100%;
}
.doc-body .base-info > div.line {
background: #e0e0e0;
height: 1px;
}
.doc-body .base-info::after {
content: " ";
display: table;
clear: both;
}
.doc-body .base-info > div.whole table {
border-collapse: collapse;
border: 1px solid #e0e0e0;
}
.doc-body .base-info > div.whole table th, .doc-body .base-info > div.whole table td {
border: 1px solid #e0e0e0;
padding: 5px 10px;
}
.doc-body .base-info .widget-label {
display: inline-block;
}
.doc-body .chief-complaint, .doc-body .present-history {
margin-top: 20px;
}
.doc-body .chief-complaint .widget-label, .doc-body .present-history .widget-label {
font-weight: bold;
display: inline-block;
}
.doc-body .autograph, .doc-body .diagnosis {
text-align: right;
margin-top: 40px;
margin-right: 20px;
}
.doc-body .autograph > div {
margin-bottom: 20px;
}</style>
<div class="doc-container">
<include src="mrqc/customCaseTpl/public/head.tpl"/>
<div class="doc-body">
<div class="present-history" >
<span class="widget-label">讨论时间:</span>
<widget wid="HDSD00_YN_TLSJ" type="textarea" width="300" placeholder="讨论时间">
</widget>
</div>
<div class="present-history" >
<span class="widget-label">讨论地点:</span>
<widget wid="HDSD00_YN_TLDD" type="textarea" width="600">
</widget>
</div>
<div class="present-history" >
<span class="widget-label">主持人姓名及专业技术职务:</span>
<widget wid="HDSD00_YN_ZCR" type="textarea" width="600" placeholder="">
</widget>
</div>
<div class="present-history" >
<span class="widget-label">参加讨论人员的姓名及专业技术职务:</span>
<widget wid="HDSD00_YN_TLR" type="textarea" width="600" placeholder="">
</widget>
</div>
<div class="present-history" >
<span class="widget-label">讨论结论:</span>
<widget wid="HDSD00_YN_JL" type="textarea" width="600" placeholder="">
</widget>
</div>
<div class="autograph">
<div >
<span class="widget-label">主持人签名:</span>
<widget wid="HDSD00_YN_ZCRQM" type="input" width="200">
</widget>
</div>
<div >
<span class="widget-label">记录医师签名:</span>
<widget wid="HDSD00_YN_JLQM" type="input" width="200">
</widget>
</div>
</div>
</div>
</div>
<style id="CaseStyle">.doc-header {
<style id="CaseStyle">.doc-header {
position: relative;
padding-top: 10px;
padding-bottom: 20px;
}
.doc-header .hospital-name {
font-family: KaiTi;
font-weight: bold;
text-align: center;
font-size: 22px;
margin-bottom: 10px;
}
.doc-header .organization-id {
vertical-align: middle;
font-size: 14px;
position: absolute;
right: 10px;
top: 10px;
text-align: center;
margin-bottom: 10px;
}
.doc-header .doc-title {
font-weight: bold;
text-align: center;
font-size: 24px;
}
.doc-header .sub-title {
font-weight: bold;
text-align: center;
font-size: 16px;
}
.doc-header .patient-info {
margin-top: 15px;
margin-bottom: 10px;
display: flex;
}
.doc-header .patient-info > div {
flex-grow: 1;
}
.doc-body .base-info {
margin-top: 20px;
}
.doc-body .base-info > div {
margin-bottom: 20px;
float: left;
width: 50%;
}
.doc-body .base-info > div.whole {
width: 100%;
}
.doc-body .base-info > div.line {
background: #e0e0e0;
height: 1px;
}
.doc-body .base-info::after {
content: " ";
display: table;
clear: both;
}
.doc-body .base-info > div.whole table {
border-collapse: collapse;
border: 1px solid #e0e0e0;
}
.doc-body .base-info > div.whole table th, .doc-body .base-info > div.whole table td {
border: 1px solid #e0e0e0;
padding: 5px 10px;
}
.doc-body .base-info .widget-label {
display: inline-block;
}
.doc-body .chief-complaint, .doc-body .present-history {
margin-top: 20px;
}
.doc-body .chief-complaint .widget-label, .doc-body .present-history .widget-label {
font-weight: bold;
display: inline-block;
}
.doc-body .autograph, .doc-body .diagnosis {
text-align: right;
margin-top: 40px;
margin-right: 20px;
}
.doc-body .autograph > div {
margin-bottom: 20px;
}</style>
<div class="doc-container">
<include src="mrqc/customCaseTpl/public/head.tpl"/>
<div class="doc-body">
<div class="present-history" >
<span class="widget-label">查房情况:</span>
<widget wid="HDSD00_BC_CFQK" type="textarea" width="600" >
</widget>
</div>
<div class="present-history" >
<span class="widget-label">病情分析:</span>
<widget wid="HDSD00_BC_BQFX" type="textarea" width="600">
</widget>
</div>
<div class="present-history" >
<span class="widget-label">诊疗意见:</span>
<widget wid="HDSD00_BC_ZLYJ" type="textarea" width="600" placeholder="">
</widget>
</div>
<div class="autograph">
<div >
<span class="widget-label">主治医师签名:</span>
<widget wid="HDSD00_BC_ZZQM" type="input" width="200">
</widget>
</div>
<div >
<span class="widget-label">主任医师签名:</span>
<widget wid="HDSD00_BC_ZRQM" type="input" width="200">
</widget>
</div>
<div >
<span class="widget-label">住院医师:</span>
<widget wid="HDSD00_BC_ZYQM" type="input" width="200">
</widget>
</div>
</div>
</div>
</div>
<style id="CaseStyle">.doc-header {
<style id="CaseStyle">.doc-header {
position: relative;
padding-top: 10px;
padding-bottom: 20px;
}
.doc-header .hospital-name {
font-family: KaiTi;
font-weight: bold;
text-align: center;
font-size: 22px;
margin-bottom: 10px;
}
.doc-header .organization-id {
vertical-align: middle;
font-size: 14px;
position: absolute;
right: 10px;
top: 10px;
text-align: center;
margin-bottom: 10px;
}
.doc-header .doc-title {
font-weight: bold;
text-align: center;
font-size: 24px;
}
.doc-header .sub-title {
font-weight: bold;
text-align: center;
font-size: 16px;
}
.doc-header .patient-info {
margin-top: 15px;
margin-bottom: 10px;
display: flex;
}
.doc-header .patient-info > div {
flex-grow: 1;
}
.doc-body .base-info {
margin-top: 20px;
}
.doc-body .base-info > div {
margin-bottom: 20px;
float: left;
width: 50%;
}
.doc-body .base-info > div.whole {
width: 100%;
}
.doc-body .base-info > div.line {
background: #e0e0e0;
height: 1px;
}
.doc-body .base-info::after {
content: " ";
display: table;
clear: both;
}
.doc-body .base-info > div.whole table {
border-collapse: collapse;
border: 1px solid #e0e0e0;
}
.doc-body .base-info > div.whole table th, .doc-body .base-info > div.whole table td {
border: 1px solid #e0e0e0;
padding: 5px 10px;
}
.doc-body .base-info .widget-label {
display: inline-block;
}
.doc-body .chief-complaint, .doc-body .present-history {
margin-top: 20px;
}
.doc-body .chief-complaint .widget-label, .doc-body .present-history .widget-label {
font-weight: bold;
display: inline-block;
}
.doc-body .autograph, .doc-body .diagnosis {
text-align: right;
margin-top: 40px;
margin-right: 20px;
}
.doc-body .autograph > div {
margin-bottom: 20px;
}</style>
<div class="doc-container">
<include src="mrqc/customCaseTpl/public/head.tpl"/>
<div class="doc-body">
<div class="present-history" >
<span class="widget-label">查房情况:</span>
<widget wid="HDSD00_BC_CFQK" type="textarea" width="300" placeholder="讨论时间">
</widget>
</div>
<div class="present-history" >
<span class="widget-label">病情分析:</span>
<widget wid="HDSD00_BC_BQFX" type="textarea" width="600">
</widget>
</div>
<div class="present-history" >
<span class="widget-label">诊疗意见:</span>
<widget wid="HDSD00_BC_ZLYJ" type="textarea" width="600" placeholder="">
</widget>
</div>
<div class="autograph">
<div >
<span class="widget-label">主治医师签名:</span>
<widget wid="HDSD00_BC_ZZQM" type="input" width="200">
</widget>
</div>
<div >
<span class="widget-label">住院医师:</span>
<widget wid="HDSD00_BC_ZYQM" type="input" width="200">
</widget>
</div>
</div>
</div>
</div>
<style id="CaseStyle">.doc-header {
<style id="CaseStyle">.doc-header {
position: relative;
padding-top: 10px;
padding-bottom: 20px;
}
.doc-header .hospital-name {
font-family: KaiTi;
font-weight: bold;
text-align: center;
font-size: 22px;
margin-bottom: 10px;
}
.doc-header .organization-id {
vertical-align: middle;
font-size: 14px;
position: absolute;
right: 10px;
top: 10px;
text-align: center;
margin-bottom: 10px;
}
.doc-header .doc-title {
font-weight: bold;
text-align: center;
font-size: 24px;
}
.doc-header .sub-title {
font-weight: bold;
text-align: center;
font-size: 16px;
}
.doc-header .patient-info {
margin-top: 15px;
margin-bottom: 10px;
display: flex;
}
.doc-header .patient-info > div {
flex-grow: 1;
}
.doc-body .base-info {
margin-top: 20px;
}
.doc-body .base-info > div {
margin-bottom: 20px;
float: left;
width: 50%;
}
.doc-body .base-info > div.whole {
width: 100%;
}
.doc-body .base-info > div.line {
background: #e0e0e0;
height: 1px;
}
.doc-body .base-info::after {
content: " ";
display: table;
clear: both;
}
.doc-body .base-info > div.whole table{
border-collapse: collapse;
border: 1px solid #e0e0e0;
}
.doc-body .base-info > div.whole table th,.doc-body .base-info > div.whole table td{
border: 1px solid #e0e0e0;
padding: 5px 10px;
}
.doc-body .base-info .widget-label {
display: inline-block;
}
.doc-body .chief-complaint,
.doc-body .present-history {
margin-top: 20px;
}
.doc-body .chief-complaint .widget-label,
.doc-body .present-history .widget-label {
font-weight: bold;
display: inline-block;
}
.doc-body .autograph,
.doc-body .diagnosis {
text-align: left;
margin-top: 10px;
}
.doc-body .autograph > div{
margin-bottom: 20px;
}</style>
<div class="doc-container">
<include src="mrqc/customCaseTpl/public/head.tpl"></include>
<div>
<div>
<div>
<div style="width:30%;display:inline-block">
<span class="widget-label">年龄:</span>
<widget wid="HDSD00_10_030_01" type="input"></widget>
</div>
<div style="width:30%;display:inline-block">
<span class="widget-label">病室:</span>
<widget wid="HDSD00_10_004_01" type="input" ></widget>
</div>
<div style="width:30%;display:inline-block">
<span class="widget-label">床号:</span>
<widget wid="HDSD00_10_001_01" type="input" </widget>
</div>
</div>
<div>
<div>
<span class="widget-label">诊断:</span>
<widget wid="HDSD00_10_018_01" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">医患沟通时间:</span>
<widget wid="HDSD00_10_GTSJ_01" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">医患沟通地点:</span>
<widget wid="HDSD00_10_GTDD_01" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">参加人员:</span>
<widget wid="HDSD00_10_CYRY_01" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">沟通内容:</span>
<widget wid="HDSD00_10_GTNR_01" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">沟通记录:</span>
<widget wid="HDSD00_10_GTJL_01" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">沟通结果:</span>
<widget wid="HDSD00_10_GTJG_01" type="textarea" ></widget>
</div>
</div>
<div>
<div style="text-align: right;">
<span class="widget-label">记录及沟通医师签名:</span>
<widget wid="HDSD00_10_JLZQM_01" type="textarea" ></widget>
</div>
</div>
<div>
<div style="text-align: right;">
<span class="widget-label">沟通时间:</span>
<widget wid="HDSD00_10_GTSJ_02" type="textarea" ></widget>
</div>
</div>
</div>
</div>
</div>
<style id="CaseStyle">.doc-header {
<style id="CaseStyle">.doc-header {
position: relative;
padding-top: 10px;
padding-bottom: 20px;
}
.doc-header .hospital-name {
font-family: KaiTi;
font-weight: bold;
text-align: center;
font-size: 22px;
margin-bottom: 10px;
}
.doc-header .organization-id {
vertical-align: middle;
font-size: 14px;
position: absolute;
right: 10px;
top: 10px;
text-align: center;
margin-bottom: 10px;
}
.doc-header .doc-title {
font-weight: bold;
text-align: center;
font-size: 24px;
}
.doc-header .sub-title {
font-weight: bold;
text-align: center;
font-size: 16px;
}
.doc-header .patient-info {
margin-top: 15px;
margin-bottom: 10px;
display: flex;
}
.doc-header .patient-info > div {
flex-grow: 1;
}
.doc-body .base-info {
margin-top: 20px;
}
.doc-body .base-info > div {
margin-bottom: 20px;
float: left;
width: 50%;
}
.doc-body .base-info > div.whole {
width: 100%;
}
.doc-body .base-info > div.line {
background: #e0e0e0;
height: 1px;
}
.doc-body .base-info::after {
content: " ";
display: table;
clear: both;
}
.doc-body .base-info > div.whole table{
border-collapse: collapse;
border: 1px solid #e0e0e0;
}
.doc-body .base-info > div.whole table th,.doc-body .base-info > div.whole table td{
border: 1px solid #e0e0e0;
padding: 5px 10px;
}
.doc-body .base-info .widget-label {
display: inline-block;
}
.doc-body .chief-complaint,
.doc-body .present-history {
margin-top: 20px;
}
.doc-body .chief-complaint .widget-label,
.doc-body .present-history .widget-label {
font-weight: bold;
display: inline-block;
}
.doc-body .autograph,
.doc-body .diagnosis {
text-align: left;
margin-top: 10px;
}
.doc-body .autograph > div{
margin-bottom: 20px;
}</style>
<div class="doc-container">
<include src="mrqc/customCaseTpl/public/head.tpl"></include>
<div>
<div>
<div>
<div style="width:30%;display:inline-block">
<span class="widget-label">年龄:</span>
<widget wid="HDSD00_10_030" type="input"></widget>
</div>
<div style="width:30%;display:inline-block">
<span class="widget-label">病室:</span>
<widget wid="HDSD00_10_004" type="input" ></widget>
</div>
<div style="width:30%;display:inline-block">
<span class="widget-label">床号:</span>
<widget wid="HDSD00_10_001" type="input" </widget>
</div>
</div>
<div>
<div>
<span class="widget-label">诊断:</span>
<widget wid="HDSD00_10_018" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">医患沟通时间:</span>
<widget wid="HDSD00_10_GTSJ_00" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">医患沟通地点:</span>
<widget wid="HDSD00_10_GTDD" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">参加人员:(医护人员、患者或家属姓名)</span>
<widget wid="HDSD00_10_CYRY" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">沟通内容:</span>
<widget wid="HDSD00_10_GTNR" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">沟通记录:</span>
<widget wid="HDSD00_10_GTJL" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">疾病变化:</span>
<widget wid="HDSD00_10_JBBH" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">治疗方案:</span>
<widget wid="HDSD00_10_ZLFA" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">药物不良反应:</span>
<widget wid="HDSD00_10_YWBLFY" type="textarea" ></widget>
</div>
</div>
<div>
<div style="text-align: right;">
<span class="widget-label">记录人签名:</span>
<widget wid="HDSD00_10_JLZQM" type="textarea" ></widget>
</div>
</div>
<div style="text-align: right;">
<div>
<span class="widget-label">沟通医师签名:</span>
<widget wid="HDSD00_10_GTYSQM" type="textarea" ></widget>
</div>
</div>
<div style="text-align: right;">
<div>
<span class="widget-label">沟通时间:</span>
<widget wid="HDSD00_10_GTSJ" type="textarea" ></widget>
</div>
</div>
</div>
</div>
</div>
<style id="CaseStyle">.doc-header {
<style id="CaseStyle">.doc-header {
position: relative;
padding-top: 10px;
padding-bottom: 20px;
}
.doc-header .hospital-name {
font-family: KaiTi;
font-weight: bold;
text-align: center;
font-size: 22px;
margin-bottom: 10px;
}
.doc-header .organization-id {
vertical-align: middle;
font-size: 14px;
position: absolute;
right: 10px;
top: 10px;
text-align: center;
margin-bottom: 10px;
}
.doc-header .doc-title {
font-weight: bold;
text-align: center;
font-size: 24px;
}
.doc-header .sub-title {
font-weight: bold;
text-align: center;
font-size: 16px;
}
.doc-header .patient-info {
margin-top: 15px;
margin-bottom: 10px;
display: flex;
}
.doc-header .patient-info > div {
flex-grow: 1;
}
.doc-body .base-info {
margin-top: 20px;
}
.doc-body .base-info > div {
margin-bottom: 20px;
float: left;
width: 50%;
}
.doc-body .base-info > div.whole {
width: 100%;
}
.doc-body .base-info > div.line {
background: #e0e0e0;
height: 1px;
}
.doc-body .base-info::after {
content: " ";
display: table;
clear: both;
}
.doc-body .base-info > div.whole table{
border-collapse: collapse;
border: 1px solid #e0e0e0;
}
.doc-body .base-info > div.whole table th,.doc-body .base-info > div.whole table td{
border: 1px solid #e0e0e0;
padding: 5px 10px;
}
.doc-body .base-info .widget-label {
display: inline-block;
}
.doc-body .chief-complaint,
.doc-body .present-history {
margin-top: 20px;
}
.doc-body .chief-complaint .widget-label,
.doc-body .present-history .widget-label {
font-weight: bold;
display: inline-block;
}
.doc-body .autograph,
.doc-body .diagnosis {
text-align: left;
margin-top: 10px;
}
.doc-body .autograph > div{
margin-bottom: 20px;
}</style>
<div class="doc-container">
<include src="mrqc/customCaseTpl/public/head.tpl"></include>
<div>
<div>
<div>
<div style="width:30%;display:inline-block">
<span class="widget-label">年龄:</span>
<widget wid="HDSD00_10_ZR_NL" type="input"></widget>
</div>
<div style="width:30%;display:inline-block">
<span class="widget-label">病室:</span>
<widget wid="HDSD00_10_ZR_BS" type="input" ></widget>
</div>
<div style="width:30%;display:inline-block">
<span class="widget-label">床号:</span>
<widget wid="HDSD00_10_ZR_CH" type="input" </widget>
</div>
</div>
<div>
<div style="width:50%;display:inline-block">
<span class="widget-label">术前诊断:</span>
<widget wid="HDSD00_10_ZR_SQZD" type="textarea" ></widget>
</div>
<div style="width:50%;display:inline-block">
<span class="widget-label">拟行手术:</span>
<widget wid="HDSD00_10_ZR_SS" type="input" ></widget>
</div>
</div>
<div>
<div style="width:50%;display:inline-block">
<span class="widget-label">拟行麻醉:</span>
<widget wid="HDSD00_10_ZR_MZ" type="input" ></widget>
</div>
<div style="width:50%;display:inline-block">
<span class="widget-label">拟定手术时间:</span>
<widget wid="HDSD00_10_ZR_SSSJ" type="input" ></widget>
</div>
</div>
<div>
<div style="width:30%;display:inline-block">
<span class="widget-label">手术负责人:</span>
<widget wid="HDSD00_10_ZR_SSFZR" type="input" ></widget>
</div>
<div style="width:30%;display:inline-block">
<span class="widget-label">术者:</span>
<widget wid="HDSD00_10_ZR_SZ" type="input" ></widget>
</div>
<div style="width:30%;display:inline-block">
<span class="widget-label">助手:</span>
<widget wid="HDSD00_10_ZR_ZS" type="input" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">一 使用植入物名称:</span>
<widget wid="HDSD00_10_ZR_MC" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">二 使用植入物的目的:</span>
<widget wid="HDSD00_10_ZR_MD" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">三 术中和术后可能出现的主要并发症、意外情况:</span>
<widget wid="HDSD00_10_ZR_BFZ" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">四 其他:</span>
<widget wid="HDSD00_10_ZR_QT" type="textarea" ></widget>
</div>
</div>
<div>
<div>
<span class="widget-label">五 患者意见:</span>
<widget wid="HDSD00_10_ZR_HZYJ" type="textarea" ></widget>
</div>
</div>
<div style="width:50%;display:inline-block">
<div style="width:50%;display:inline-block">
<span class="widget-label">惠者或被委托人签字:</span>
<widget wid="HDSD00_10_ZR_HZQM" type="input" ></widget>
</div>
<div style="width:50%;display:inline-block">
<span class="widget-label">与患者关系:</span>
<widget wid="HDSD00_10_ZR_HZGX" type="input" ></widget>
</div>
</div>
<div style="width:50%;display:inline-block">
<div style="width:50%;display:inline-block">
<span class="widget-label">术者签字:</span>
<widget wid="HDSD00_10_ZR_SZQM" type="input" ></widget>
</div>
<div style="width:50%;display:inline-block">
<span class="widget-label">经治医师签字:</span>
<widget wid="HDSD00_10_ZR_YSQM" type="input" ></widget>
</div>
</div>
<div>
<div style="text-align: right;">
<span class="widget-label">手术前签字时间:</span>
<widget wid="HDSD00_10_ZR_SSQQMSJ" type="input" ></widget>
</div>
</div>
</div>
</div>
</div>
<style id="CaseStyle">.doc-header {
<style id="CaseStyle">.doc-header {
position: relative;
padding-top: 10px;
padding-bottom: 20px;
}
.doc-header .hospital-name {
font-family: KaiTi;
font-weight: bold;
text-align: center;
font-size: 22px;
margin-bottom: 10px;
}
.doc-header .organization-id {
vertical-align: middle;
font-size: 14px;
position: absolute;
right: 10px;
top: 10px;
text-align: center;
margin-bottom: 10px;
}
.doc-header .doc-title {
font-weight: bold;
text-align: center;
font-size: 24px;
}
.doc-header .sub-title {
font-weight: bold;
text-align: center;
font-size: 16px;
}
.doc-header .patient-info {
margin-top: 15px;
margin-bottom: 10px;
display: flex;
}
.doc-header .patient-info > div {
flex-grow: 1;
}
.doc-body .base-info {
margin-top: 20px;
}
.doc-body .base-info > div {
margin-bottom: 20px;
float: left;
width: 50%;
}
.doc-body .base-info > div.whole {
width: 100%;
}
.doc-body .base-info > div.line {
background: #e0e0e0;
height: 1px;
}
.doc-body .base-info::after {
content: " ";
display: table;
clear: both;
}
.doc-body .base-info > div.whole table{
border-collapse: collapse;
border: 1px solid #e0e0e0;
}
.doc-body .base-info > div.whole table th,.doc-body .base-info > div.whole table td{
border: 1px solid #e0e0e0;
padding: 5px 10px;
}
.doc-body .base-info .widget-label {
display: inline-block;
}
.doc-body .chief-complaint,
.doc-body .present-history {
margin-top: 20px;
}
.doc-body .chief-complaint .widget-label,
.doc-body .present-history .widget-label {
font-weight: bold;
display: inline-block;
}
.doc-body .autograph,
.doc-body .diagnosis {
text-align: right;
margin-top: 40px;
margin-right: 20px;
}
.doc-body .autograph > div{
margin-bottom: 20px;
}</style>
<div class="doc-container">
<include src="mrqc/customCaseTpl/public/head.tpl"></include>
<div class="doc-body">
<div class="base-info">
<!--div>
<span class="widget-label">委托人(患者本人):</span>
<widget wid="HDSD00_10_016" type="date" width="200" width="200"></widget>
</div>
<div>
<span class="widget-label">性别:</span>
<widget wid="HDSD00_10_051" type="date" width="200" width="200"></widget>
</div>
<div>
<span class="widget-label">年龄:</span>
<widget wid="HDSD00_10_030" type="date" width="200" width="200"></widget>
</div>
<div>
<span class="widget-label">有效证件号码: </span>
<widget wid="HDSD00_10_ZJHM" type="input" width="200"></widget>
</div>
<div>
<span class="widget-label">住址: </span>
<widget wid="HDSD00_10_ZZ" type="input" width="200"></widget>
</div>
<div>
<span class="widget-label">受委托人姓名: </span>
<widget wid="HDSD00_10_WTRXM" type="input" width="200"></widget>
</div>
<div>
<span class="widget-label">性别: </span>
<widget wid="HDSD00_10_WTRXB" type="input" width="200"></widget>
</div>
<div>
<span class="widget-label">年龄: </span>
<widget wid="HDSD00_10_WTRNL" type="input" width="200"></widget>
</div>
<div>
<span class="widget-label">联系电话: </span>
<widget wid="HDSD00_10_WTRLXDH" type="input" width="200"></widget>
</div>
<div>
<span class="widget-label">有效证件号码: </span>
<widget wid="HDSD00_10_WTRZJHM" type="input" width="200"></widget>
</div>
<div>
<span class="widget-label">住址: </span>
<widget wid="HDSD00_10_WTRZZ" type="input" width="200"></widget>
</div>
<div>
<span class="widget-label">与患者关系: </span>
<widget wid="HDSD00_10_010" type="input" width="200"></widget>
</div-->
<div>
<span class="widget-label"> </span>
<widget wid="HDSD00_10_NR" type="textarea" width="650"></widget>
</div>
</div>
</div>
</div>
<style id="CaseStyle">.doc-header {
<style id="CaseStyle">.doc-header {
position: relative;
padding-top: 10px;
padding-bottom: 20px;
}
.doc-header .hospital-name {
font-family: KaiTi;
font-weight: bold;
text-align: center;
font-size: 22px;
margin-bottom: 10px;
}
.doc-header .organization-id {
vertical-align: middle;
font-size: 14px;
position: absolute;
right: 10px;
top: 10px;
text-align: center;
margin-bottom: 10px;
}
.doc-header .doc-title {
font-weight: bold;
text-align: center;
font-size: 24px;
}
.doc-header .sub-title {
font-weight: bold;
text-align: center;
font-size: 16px;
}
.doc-header .patient-info {
margin-top: 15px;
margin-bottom: 10px;
display: flex;
}
.doc-header .patient-info > div {
flex-grow: 1;
}
.doc-body .base-info {
margin-top: 20px;
}
.doc-body .base-info > div {
margin-bottom: 20px;
float: left;
width: 50%;
}
.doc-body .base-info > div.whole {
width: 100%;
}
.doc-body .base-info > div.line {
background: #e0e0e0;
height: 1px;
}
.doc-body .base-info::after {
content: " ";
display: table;
clear: both;
}
.doc-body .base-info > div.whole table{
border-collapse: collapse;
border: 1px solid #e0e0e0;
}
.doc-body .base-info > div.whole table th,.doc-body .base-info > div.whole table td{
border: 1px solid #e0e0e0;
padding: 5px 10px;
}
.doc-body .base-info .widget-label {
display: inline-block;
}
.doc-body .chief-complaint,
.doc-body .present-history {
margin-top: 20px;
}
.doc-body .chief-complaint .widget-label,
.doc-body .present-history .widget-label {
font-weight: bold;
display: inline-block;
}
.doc-body .autograph,
.doc-body .diagnosis {
text-align: right;
margin-top: 40px;
margin-right: 20px;
}
.doc-body .autograph > div{
margin-bottom: 20px;
}</style>
<div class="doc-container">
<include src="mrqc/customCaseTpl/public/head.tpl" />
<div>
<div>
<div style="width:40%;display:inline-block">
<span class="widget-label">
手术开始日期时间:
</span>
<widget wid="HDSD00_06_078" type="input" >
</widget>
</div>
<div style="width:40%;display:inline-block">
<span class="widget-label">
手术结束日期时间:
</span>
<widget wid="HDSD00_06_077" type="input" >
</widget>
</div>
</div>
<div>
<div style="width:40%;display:inline-block">
<span class="widget-label">
术前诊断:
</span>
<widget wid="HDSD00_07_118" type="input" >
</widget>
</div>
<div>
<span class="widget-label">
术后诊断:
</span>
<widget wid="HDSD00_07_145_1" type="input" >
</widget>
</div>
</div>
</div>
<div>
<div style="width:40%;display:inline-block" tpl-show="showStruct('HDSD00_06_079')">
<span class="widget-label">
手术名称:
</span>
<widget wid="HDSD00_06_079" type="input">
</widget>
</div>
<div style="width:40%;display:inline-block" tpl-show="showStruct('HDSD00_06_085')">
<span class="widget-label">
手术人员:
</span>
<widget wid="HDSD00_06_085" type="input">
</widget>
</div>
</div>
<div>
<div style="width:40%;display:inline-block" tpl-show="showStruct('HDSD00_06_044')">
<span class="widget-label">
麻醉方式:
</span>
<widget wid="HDSD00_06_044" type="input">
</widget>
</div>
<div style="width:40%;display:inline-block" tpl-show="showStruct('HDSD00_06_055')">
<span class="widget-label">
麻醉医师:
</span>
<widget wid="HDSD00_06_055" type="input">
</widget>
</div>
</div>
<div>
<div style="width:40%;display:inline-block" tpl-show="showStruct('HDSD00_06_QCBB')">
<span class="widget-label">
手术切除标本:
</span>
<widget wid="HDSD00_06_QCBB" type="input">
</widget>
</div>
<div style="width:40%;display:inline-block" tpl-show="showStruct('HDSD00_06_QCBBJG')">
<span class="widget-label">
冰冻切片结果:
</span>
<widget wid="HDSD00_06_QCBBJG" type="input">
</widget>
</div>
</div>
<div tpl-show="showStruct('HDSD00_06_SHSJ')">
<span class="widget-label">
术后送检:
</span>
<widget wid="HDSD00_06_SHSJ" type="input">
</widget>
</div>
<div>
<div style="width:30%;display:inline-block" tpl-show="showStruct('HDSD00_06_SHBFZ')">
<span class="widget-label">
术中并发症:
</span>
<widget wid="HDSD00_06_SHBFZ" type="input">
</widget>
</div>
<div style="width:30%;display:inline-block" tpl-show="showStruct('HDSD00_06_022')">
<span class="widget-label">
术中失血量:
</span>
<widget wid="HDSD00_06_022" type="input">
ml
</widget>
</div>
<div style="width:30%;display:inline-block" tpl-show="showStruct('HDSD00_06_091')">
<span class="widget-label">
术中输血量:
</span>
<widget wid="HDSD00_06_091" type="input">
ml
</widget>
</div>
</div>
<div tpl-show="showStruct('HDSD00_06_073')">
<span class="widget-label">
手术过程描述:
</span>
<widget type="textarea" wid="HDSD00_06_073" placeholder="-">
</widget>
</div>
<div tpl-show="showStruct('HDSD00_06_SHQK')">
<span class="widget-label">
术后情况及诊疗计划:
</span>
<widget wid="HDSD00_06_SHQK" type="textarea">
</widget>
</div>
<div tpl-show="showStruct('HY_SQTL_ZYSX')">
<span class="widget-label">
术后注意事项:
</span>
<widget wid="HY_SQTL_ZYSX" type="textarea">
</widget>
</div>
<div>
<div style="text-align: right;">
<div>
<span class="widget-label">
医师签名:
</span>
<widget wid="HDSD00_06_084" type="input">
</widget>
</div>
<div tpl-show="showStruct('HDSD00_06_068')">
<span class="widget-label">
日期时间:
</span>
<widget wid="HDSD00_06_068" type="input">
</widget>
</div>
<div tpl-show="showStruct('HDSD00_06_HZQM')">
<span class="widget-label">
患者或代理人签名:
</span>
<widget wid="HDSD00_06_HZQM" type="input">
</widget>
</div>
<div tpl-show="showStruct('HDSD00_06_068')">
<span class="widget-label">
日期时间:
</span>
<widget wid="HDSD00_06_068" type="input">
</widget>
</div>
</div>
</div>
</div>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment