Browse Source

时间校验和统计bug

master
zhizhi wu 4 years ago
parent
commit
9918a48971
  1. 64
      src/main/java/com/ccsens/carbasics/service/FirstAidRecordService.java
  2. 103
      src/main/java/com/ccsens/carbasics/util/Constant.java
  3. 9
      src/main/resources/mapper_dao/FirstAidRecordDao.xml

64
src/main/java/com/ccsens/carbasics/service/FirstAidRecordService.java

@ -7,17 +7,14 @@ import cn.hutool.core.util.StrUtil;
import com.ccsens.carbasics.bean.dto.PatientDto;
import com.ccsens.carbasics.bean.po.*;
import com.ccsens.carbasics.bean.vo.PatientVo;
import com.ccsens.carbasics.persist.dao.CodeParentDao;
import com.ccsens.carbasics.persist.dao.FirstAidDao;
import com.ccsens.carbasics.persist.dao.FirstAidLogDao;
import com.ccsens.carbasics.persist.dao.PatientDao;
import com.ccsens.carbasics.persist.dao.*;
import com.ccsens.carbasics.persist.mapper.CodeDictionariesMapper;
import com.ccsens.carbasics.persist.mapper.FirstAidRecordLogMapper;
import com.ccsens.carbasics.persist.mapper.FirstAidRecordMapper;
import com.ccsens.carbasics.util.Constant;
import com.ccsens.carbasics.util.DefaultCodeError;
import com.ccsens.util.CodeEnum;
import com.ccsens.util.StringUtil;
import com.ccsens.util.exception.BaseException;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
@ -43,7 +40,7 @@ public class FirstAidRecordService implements IFirstAidRecordService {
@Resource
private FirstAidRecordLogMapper firstAidRecordLogMapper;
@Resource
private FirstAidRecordMapper firstAidRecordMapper;
private FirstAidRecordDao firstAidRecordDao;
@Resource
private CodeDictionariesMapper dictionariesMapper;
@Resource
@ -104,16 +101,19 @@ public class FirstAidRecordService implements IFirstAidRecordService {
// 判断权限状态
aidStatus(param, firstAid);
//遍历传入的code
// 时间校验
checkTime(param, firstAid);
// 保存
param.getCodeAndAnswerList().forEach(codeAndAnswer -> {
if(StrUtil.isNotEmpty(codeAndAnswer.getQuestionCode())) {
//添加记录表,需要查找之前的记录,删除后重新添加
FirstAidRecordExample recordExample = new FirstAidRecordExample();
recordExample.createCriteria().andFirstAidIdEqualTo(firstAid.getId()).andQuestionCodeEqualTo(codeAndAnswer.getQuestionCode());
List<FirstAidRecord> firstAidRecords = firstAidRecordMapper.selectByExample(recordExample);
List<FirstAidRecord> firstAidRecords = firstAidRecordDao.selectByExample(recordExample);
if (CollectionUtil.isNotEmpty(firstAidRecords)) {
firstAidRecords.forEach(firstAidRecord -> {
firstAidRecord.setRecStatus((byte) 2);
firstAidRecordMapper.updateByPrimaryKeySelective(firstAidRecord);
firstAidRecordDao.updateByPrimaryKeySelective(firstAidRecord);
});
}
//判断答案是否为空
@ -130,6 +130,50 @@ public class FirstAidRecordService implements IFirstAidRecordService {
}
private void checkTime(PatientDto.SaveAidRecordN param, FirstAid firstAid) {
for (PatientDto.CodeAndAnswerN answer: param.getCodeAndAnswerList()) {
// 需要校验的时间
if (!Constant.TimeCheck.compareItems.containsKey(answer.getQuestionCode())
|| CollectionUtil.isEmpty(answer.getAnswer())
|| !StringUtil.checkNum(answer.getAnswer().get(0), false)
) {
continue;
}
// 要保存的时间
long time = Long.parseLong(answer.getAnswer().get(0));
// 查找需要比较的对象
Map<String, Constant.TimeCheckItem> itemMap = Constant.TimeCheck.compareItems.get(answer.getQuestionCode());
FirstAidRecordExample recordExample = new FirstAidRecordExample();
recordExample.createCriteria().andFirstAidIdEqualTo(firstAid.getId()).andQuestionCodeIn(new ArrayList<>(itemMap.keySet()));
List<FirstAidRecord> records = firstAidRecordDao.selectByExample(recordExample);
if (CollectionUtil.isEmpty(records)) {
continue;
}
for (FirstAidRecord record: records) {
if (!StringUtil.checkNum(record.getAnswer(), false)) {
continue;
}
long compareTime = Long.parseLong(record.getAnswer());
Constant.TimeCheckItem timeCheckItem = itemMap.get(record.getQuestionCode());
// 0:小于,1小等于 2:等于 3:大于 4:大等于
boolean format;
String compare = "";
switch (timeCheckItem.getType()) {
case 0: format = time < compareTime; compare = "大等于";break;
case 1: format = time <= compareTime; compare = "大于";break;
case 2: format = time == compareTime; compare = "等于";break;
case 3: format = time > compareTime; compare = "小等于";break;
case 4: format = time >= compareTime; compare = "小于";break;
default: format = true;
}
if (!format) {
log.info("时间校验不通过:{}:{},{}:{}", answer.getQuestionCode(), time, record.getQuestionCode(), record.getAnswer());
throw new BaseException(CodeEnum.PARAM_ERROR.getCode(), "时间"+compare+timeCheckItem.getName());
}
}
}
}
private void aidStatus(PatientDto.SaveAidRecordN param, FirstAid firstAid) {
if (firstAid.getDataStatus() == Constant.DataStatus.Create.status || firstAid.getDataStatus() == Constant.DataStatus.FirstAidRefuse.status) {
// 创建/急救拒绝 不校验,允许修改
@ -196,7 +240,7 @@ public class FirstAidRecordService implements IFirstAidRecordService {
firstAidRecord.setSubmitUserType(userType);
firstAidRecord.setSubmitUserId(userId);
firstAidRecord.setOperator(userId);
firstAidRecordMapper.insertSelective(firstAidRecord);
firstAidRecordDao.insertSelective(firstAidRecord);
// //根据code查找字典表
// CodeDictionariesExample dictionariesExample = new CodeDictionariesExample();
// dictionariesExample.createCriteria().andQuestionCodeEqualTo(code);

103
src/main/java/com/ccsens/carbasics/util/Constant.java

@ -1,5 +1,8 @@
package com.ccsens.carbasics.util;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.File;
import java.util.HashMap;
import java.util.List;
@ -17,6 +20,106 @@ public class Constant {
/**xls*/
public static final String XLS = "xls";
public static final class TimeCheck{
public static final Map<String, Map<String, TimeCheckItem>> compareItems = new HashMap<>();
static {
// 到院时间
String arriveHospitalTime = "JBXX-DYSJ";
// 发病时间
String fbTime = "JBXX-FBTime";
// 最后正常时间
String lastTime = "JBXX-ZHZC";
// 住院时间
String inHospitalTime = "JBXX-ZYSJ";
// 开始静脉溶栓时间
String startVeinTime = "JMRSSJ";
// 穿刺完成时间
String startStabTime = "JRZL-CCSJ";
// 首次血管再通时间
String startRevascularizationTime = "JRZL-ZCKT";
// 手术开始时间
String startOperationTime = "ZYZL-KSSJ";
// 出院时间
String outHospitalTime = "CYQK-CYSJ";
// 烟雾病的手术开始时间
String startMoyamoyaTime = "TSCX-SSSJ";
// AVM治疗时间
String avmTime = "TSCX-AVM-ZLSJ";
// 1. 发病时间 < 到院时间
Map<String, TimeCheckItem> fbTimeMap = new HashMap<>();
fbTimeMap.put(arriveHospitalTime, new TimeCheckItem((byte)0,"到院时间"));
compareItems.put(fbTime, fbTimeMap);
// 到院时间
Map<String, TimeCheckItem> arriveHospitalTimeMap = new HashMap<>();
arriveHospitalTimeMap.put(fbTime, new TimeCheckItem((byte)4,"发病时间"));
arriveHospitalTimeMap.put(lastTime, new TimeCheckItem((byte)4,"最后正常时间"));
arriveHospitalTimeMap.put(inHospitalTime, new TimeCheckItem((byte)0,"住院时间"));
arriveHospitalTimeMap.put(startVeinTime, new TimeCheckItem((byte)1,"开始静脉溶栓时间"));
arriveHospitalTimeMap.put(startStabTime, new TimeCheckItem((byte)1,"穿刺完成时间"));
arriveHospitalTimeMap.put(startOperationTime, new TimeCheckItem((byte)1,"手术开始时间"));
arriveHospitalTimeMap.put(outHospitalTime, new TimeCheckItem((byte)1,"出院时间"));
arriveHospitalTimeMap.put(startMoyamoyaTime, new TimeCheckItem((byte)1,"烟雾病的手术开始时间"));
arriveHospitalTimeMap.put(avmTime, new TimeCheckItem((byte)1,"AVM治疗时间"));
compareItems.put(arriveHospitalTime, arriveHospitalTimeMap);
// 2. 最后正常时间 < 到院时间
Map<String, TimeCheckItem> lastTimeMap = new HashMap<>();
lastTimeMap.put(arriveHospitalTime, new TimeCheckItem((byte)0,"到院时间"));
compareItems.put(lastTime, lastTimeMap);
// 4. 住院时间 ≥ 到院时间
Map<String, TimeCheckItem> inHospitalTimeMap = new HashMap<>();
inHospitalTimeMap.put(arriveHospitalTime, new TimeCheckItem((byte)4,"到院时间"));
compareItems.put(inHospitalTime, inHospitalTimeMap);
// 5. 开始静脉溶栓时间 > 到院时间
Map<String, TimeCheckItem> startVeinTimeMap = new HashMap<>();
startVeinTimeMap.put(arriveHospitalTime, new TimeCheckItem((byte)3,"到院时间"));
compareItems.put(startVeinTime, startVeinTimeMap);
// 6. 穿刺完成时间 > 到院时间
Map<String, TimeCheckItem> startStabTimeMap = new HashMap<>();
startStabTimeMap.put(arriveHospitalTime, new TimeCheckItem((byte)3,"到院时间"));
startStabTimeMap.put(startRevascularizationTime, new TimeCheckItem((byte)1,"首次血管再通时间"));
compareItems.put(startStabTime, startStabTimeMap);
// 7. 首次血管再通时间 > 穿刺完成时间
Map<String, TimeCheckItem> startRevascularizationTimeMap = new HashMap<>();
startRevascularizationTimeMap.put(startStabTime, new TimeCheckItem((byte)3,"穿刺完成时间"));
compareItems.put(startRevascularizationTime, startRevascularizationTimeMap);
// 8. 手术开始时间 > 到院时间
Map<String, TimeCheckItem> startOperationTimeMap = new HashMap<>();
startOperationTimeMap.put(arriveHospitalTime, new TimeCheckItem((byte)3,"到院时间"));
compareItems.put(startOperationTime, startOperationTimeMap);
// 9. 出院时间 > 到院时间
Map<String, TimeCheckItem> outHospitalTimeMap = new HashMap<>();
outHospitalTimeMap.put(arriveHospitalTime, new TimeCheckItem((byte)3,"到院时间"));
compareItems.put(outHospitalTime, outHospitalTimeMap);
// 12. 烟雾病的手术开始时间 > 到院时间
Map<String, TimeCheckItem> startMoyamoyaTimeMap = new HashMap<>();
startMoyamoyaTimeMap.put(arriveHospitalTime, new TimeCheckItem((byte)3,"到院时间"));
compareItems.put(startMoyamoyaTime, startMoyamoyaTimeMap);
// 13. AVM治疗时间 > 到院时间
Map<String, TimeCheckItem> avmTimeMap = new HashMap<>();
avmTimeMap.put(arriveHospitalTime, new TimeCheckItem((byte)3,"到院时间"));
compareItems.put(avmTime, avmTimeMap);
}
}
@Data
public static final class TimeCheckItem{
@ApiModelProperty("比较类型 0:小于,1小等于 2:等于 3:大于 4:大等于 比较对象 < 当前code, 则type=0")
private byte type;
private String name;
public TimeCheckItem() {
}
public TimeCheckItem(byte type, String name) {
this.type = type;
this.name = name;
}
}
public static final class HospitalRank{
/**时间窗患者例数(从大到小)*/
public static final byte TIME_WINDOW_PATIENT = 0;

9
src/main/resources/mapper_dao/FirstAidRecordDao.xml

@ -24,7 +24,7 @@
#{id}
</foreach>
AND a.value_type = 0 and a.data_status in (1, 3, 5, 6)
and a.rec_status = 0 and r1.rec_status = 0
and a.rec_status = 0 and r1.rec_status = 0 and r2.rec_status = 0
</select>
<select id="countDnt" resultType="com.ccsens.carbasics.bean.vo.StatisticalVo$Dnt">
select
@ -133,7 +133,7 @@
#{id}
</foreach>
AND a.value_type = 0 and a.data_status in (1, 3, 5, 6)
and a.rec_status = 0 and r1.rec_status = 0
and a.rec_status = 0 and r1.rec_status = 0 and r2.rec_status = 0
group by
<choose>
<when test="countType == 0">FROM_UNIXTIME(r2.answer/1000,'%Y-%m-%d %H')</when>
@ -226,7 +226,7 @@
</foreach>
AND a.value_type = 0 and a.data_status in (1, 3, 5, 6)
and a.rec_status = 0 and r1.rec_status = 0 and r2.rec_status = 0
order by r1.answer/1000, r1.answer/1000
order by r1.answer/1000, r2.answer/1000
) d
) t1
left join (
@ -340,6 +340,7 @@
AND a.value_type = 0 and a.data_status in (1, 3, 5, 6)
AND a.rec_status = 0
AND r1.rec_status = 0
AND r2.rec_status = 0
GROUP BY
FROM_UNIXTIME( r2.answer / 1000, #{type})
</select>
@ -430,6 +431,7 @@
AND a.value_type = 0 and a.data_status in (1, 3, 5, 6)
AND a.rec_status = 0
AND r1.rec_status = 0
AND r2.rec_status = 0
GROUP BY
a.hospital_id
) t2 ON hospital.id = t2.hospital_id
@ -493,6 +495,7 @@
AND a.value_type = 0 and a.data_status in (1, 3, 5, 6)
AND a.rec_status = 0
AND r1.rec_status = 0
AND r2.rec_status = 0
GROUP BY
a.hospital_id
) t ON hospital.id = t.hospital_id

Loading…
Cancel
Save