浏览代码

检验检查优化判断,以及新增大型项目的申请说明

xiaochan 1 月之前
父节点
当前提交
0d0f7fea48

+ 1 - 1
pom.xml

@@ -10,7 +10,7 @@
     </parent>
     <groupId>thyyxxk</groupId>
     <artifactId>web-server</artifactId>
-    <version>14.0.9</version>
+    <version>14.1.0</version>
     <name>web-server</name>
     <description>server for yibao-web</description>
     <properties>

+ 5 - 1
src/main/java/thyyxxk/webserver/config/exception/ExceptionEnum.java

@@ -54,6 +54,7 @@ public enum ExceptionEnum implements ExceptionEnumInterface {
 
     // 以下是不需要提示的错误
     SLIGHTLY_ERROR(4001, "无需提示的返回。"),
+
     PRE_DISCHARGE_ERROR(4002, "出院预审有可疑数据。"),
     SERVER_IS_UPDATE(5001, "服务器正在升级,请稍后在试一下。"),
     ERROR_MESSAGE(6001, "前端是返回成功的"),
@@ -61,7 +62,10 @@ public enum ExceptionEnum implements ExceptionEnumInterface {
     // 电子病历保存错误信息
     EMR_SAVE(7001, "保存失败"),
     EMR_EXTRACT_OBJECTS(7002, "提取数据元失败,但病历已保存。"),
-    NOT_EL_MESSAGE(8001, "前端没提示的错误信息");
+    NOT_EL_MESSAGE(8001, "前端没提示的错误信息"),
+    JIAN_CHA_JIAN_YAN_FAIL(9001, "检查检验问题"),
+
+    ;
 
     private final Integer code;
     private final String message;

+ 23 - 3
src/main/java/thyyxxk/webserver/dao/his/medicaladvice/common/DictDataDao.java

@@ -1,9 +1,16 @@
 package thyyxxk.webserver.dao.his.medicaladvice.common;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
+import thyyxxk.webserver.entity.zd.TDictData;
+import thyyxxk.webserver.entity.zd.TDictData.TDictDataMap;
+
+import java.util.List;
+
 
 /**
  * @Description:
@@ -11,9 +18,22 @@ import org.apache.ibatis.annotations.Update;
  * @Date: 2024/1/30
  */
 @Mapper
-public interface DictDataDao {
+public interface DictDataDao extends BaseMapper<TDictData> {
     @Select("select dict_value from   t_dict_data where dict_type=#{dictType} and dict_name=#{dictName} and status='0'")
-    String getDictValueByDictName(@Param("dictType") String dictType, @Param("dictName")String dictName);
+    String getDictValueByDictName(@Param("dictType") String dictType, @Param("dictName") String dictName);
+
     @Update(" update t_dict_data set dict_value =#{dictValue} where dict_type=#{dictType} and dict_name=#{dictName} ")
-    int updateDictValue(@Param("dictValue") String dictValue,@Param("dictType") String dictType, @Param("dictName") String dictName);
+    int updateDictValue(@Param("dictValue") String dictValue, @Param("dictType") String dictType, @Param("dictName") String dictName);
+
+    default TDictDataMap selectDictDataList(List<String> typeName) {
+        QueryWrapper<TDictData> wq = TDictData.queryWrapper();
+        wq.in("dict_type + '_' + dict_name", typeName);
+        List<TDictData> rst = this.selectList(wq);
+        if (rst.isEmpty()) {
+            return new TDictDataMap();
+        }
+        return new TDictData.TDictDataMap(rst);
+    }
+
+
 }

+ 13 - 3
src/main/java/thyyxxk/webserver/dao/his/zhuyuanyisheng/JianYanJianChaDao.java

@@ -6,10 +6,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.*;
-import thyyxxk.webserver.entity.CodeName;
 import thyyxxk.webserver.entity.casefrontsheet.YshHzRecord;
 import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
-import thyyxxk.webserver.entity.dictionary.CyComboGrid;
 import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.*;
 import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.dto.JyJcCheckItemDto;
 import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.dto.RepelJyJc;
@@ -574,7 +572,7 @@ public interface JianYanJianChaDao {
     @Select("select note , collection_info as collectionInfo from ${tableName} where zy_order_code= #{orderCode}")
     JSONObject getExamineIllustrate(String orderCode, String tableName);
 
-    @Select("select gender_restriction,\n" +
+    @Select("select gender_restriction,code as id,\n" +
             "       max_age_restriction,\n" +
             "       min_age_restriction,\n" +
             "       zy_order_code as code,rtrim(class) as order_type," +
@@ -636,4 +634,16 @@ public interface JianYanJianChaDao {
             "where ${ew.sqlSegment}")
     List<YshYjReq> selectJcJyRepel(@Param("ew") QueryWrapper<?> ew);
 
+
+    @Select("select count(1) from ysh_yj_req where inpatient_no = '${patNo}'" +
+            "and admiss_times = ${times} and order_code = '${orderCode}' " +
+            "and isnull(inspect_part, '') = '${part}' and sys_date >= DATEADD(MONTH, -1, GETDATE()) and req_type = '3'")
+    boolean handJcProject(String patNo, Integer times, String orderCode, String part);
+
+
+    @Select("select count(1) from ysh_yj_req where inpatient_no = '${patNo}'" +
+            "and admiss_times = ${times} and order_code = '${orderCode}' " +
+            "and sys_date >= DATEADD(MONTH, -3, GETDATE()) and req_type = '2'")
+    boolean handJyProject(String patNo, Integer times, String orderCode);
+
 }

+ 9 - 0
src/main/java/thyyxxk/webserver/dao/his/zhuyuanyisheng/YjReqLargeScaleProjectDao.java

@@ -0,0 +1,9 @@
+package thyyxxk.webserver.dao.his.zhuyuanyisheng;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.dto.YjReqLargeScaleProject;
+
+@Mapper
+public interface YjReqLargeScaleProjectDao extends BaseMapper<YjReqLargeScaleProject> {
+}

+ 2 - 0
src/main/java/thyyxxk/webserver/entity/dictionary/diagnoseReqTemplate/vo/DiagnoseReqTemplateVo.java

@@ -12,4 +12,6 @@ public class DiagnoseReqTemplateVo extends DiagnoseReqTemplate {
     private String partOrSampleName;
     private String classes;
     private String zyOrderCode;
+    private String reqComment;
+    private String reqInstructions;
 }

+ 103 - 0
src/main/java/thyyxxk/webserver/entity/zd/TDictData.java

@@ -0,0 +1,103 @@
+package thyyxxk.webserver.entity.zd;
+
+import java.io.Serializable;
+
+import lombok.Data;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "t_dict_data")
+public class TDictData implements Serializable {
+
+    private static final long serialVersionUID = 5982256016960116064L;
+
+    /**
+     * id
+     */
+    @TableField(value = "id")
+    private Integer id;
+
+    /**
+     * dictType
+     */
+    @TableField(value = "dict_type")
+    private String dictType;
+
+    /**
+     * dictValue
+     */
+    @TableField(value = "dict_value")
+    private String dictValue;
+
+    /**
+     * dictName
+     */
+    @TableField(value = "dict_name")
+    private String dictName;
+
+    /**
+     * remark
+     */
+    @TableField(value = "remark")
+    private String remark;
+
+    /**
+     * createTime
+     */
+    @TableField(fill = FieldFill.INSERT, value = "create_time")
+    private Date createTime;
+
+    /**
+     * status
+     */
+    @TableField(value = "status")
+    private String status;
+
+    public static LambdaQueryWrapper<TDictData> lambdaQueryWrapper() {
+        return new LambdaQueryWrapper<>();
+    }
+
+    public static QueryWrapper<TDictData> queryWrapper() {
+        return new QueryWrapper<>();
+    }
+
+    public static class TDictDataMap {
+        private Map<String, TDictData> config = new HashMap<>();
+
+        public TDictDataMap() {
+        }
+
+        public TDictDataMap(List<TDictData> list) {
+            for (TDictData item : list)
+                config.put(item.getDictType() + "_" + item.getDictName(), item);
+        }
+
+        public <T> T get(String key, Function<String, T> supplier, T defaultValue) {
+            TDictData data = config.get(key);
+            if (data != null) {
+                return supplier.apply(data.getDictValue());
+            }
+            return defaultValue;
+        }
+
+    }
+
+
+}

+ 2 - 2
src/main/java/thyyxxk/webserver/entity/zhuyuanyisheng/jianyanjiancha/YshYjReq.java

@@ -254,8 +254,8 @@ public class YshYjReq implements Serializable {
     private Boolean surchargeFlag;
 
     /**
-     * 循环用的下标,如果有加收的话下标就会和前端页面上的不一致,所以需要保留原始的下标
+     * 大型项目申请说明
      */
-    private Integer foreachIndex;
+    private String reqInstructions;
 
 }

+ 1 - 0
src/main/java/thyyxxk/webserver/entity/zhuyuanyisheng/jianyanjiancha/dto/JyJcCheckItemDto.java

@@ -6,6 +6,7 @@ import java.util.List;
 
 @Data
 public class JyJcCheckItemDto {
+    private String id;
     private String code;
     private String name;
     private Integer genderRestriction;

+ 77 - 0
src/main/java/thyyxxk/webserver/entity/zhuyuanyisheng/jianyanjiancha/dto/YjReqLargeScaleProject.java

@@ -0,0 +1,77 @@
+package thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.dto;
+
+import java.io.Serializable;
+
+import lombok.Data;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "yj_req_large_scale_project")
+public class YjReqLargeScaleProject implements Serializable {
+
+    private static final long serialVersionUID = 5452926782562255452L;
+
+    /**
+     * id
+     */
+    @TableField(value = "id")
+    private String id;
+
+    /**
+     * 申请单号
+     */
+    @TableField(value = "req_no")
+    private Integer reqNo;
+
+    /**
+     * 住院号/门诊号
+     */
+    @TableField(value = "pat_no")
+    private String patNo;
+
+    /**
+     * 住院次数门诊次数
+     */
+    @TableField(value = "times")
+    private Integer times;
+
+    /**
+     * 1-门诊 2-住院
+     */
+    @TableField(value = "source")
+    private String source;
+
+    /**
+     * 申请说明
+     */
+    @TableField(value = "req_instructions")
+    private String reqInstructions;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_date")
+    private Date createDate;
+
+    public static LambdaQueryWrapper<YjReqLargeScaleProject> lambdaQueryWrapper() {
+        return new LambdaQueryWrapper<>();
+    }
+
+    public static QueryWrapper<YjReqLargeScaleProject> queryWrapper() {
+        return new QueryWrapper<>();
+    }
+
+
+}

+ 6 - 1
src/main/java/thyyxxk/webserver/service/dictionary/diagnoseReqTemplate/DiagnoseReqTemplateService.java

@@ -27,6 +27,7 @@ import thyyxxk.webserver.entity.dictionary.diagnoseReqTemplate.vo.DiagnoseToReqV
 import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.TianJiaJianChaJianYan;
 import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.YshYjReq;
 import thyyxxk.webserver.service.zhuyuanyisheng.JianYanJianChaShenQingService;
+import thyyxxk.webserver.service.zhuyuanyisheng.JianYanJianChaVerify;
 import thyyxxk.webserver.utils.*;
 
 import java.util.ArrayList;
@@ -159,7 +160,11 @@ public class DiagnoseReqTemplateService {
             req.setOrderCode(item.getOrderCode());
             req.setOrderCode(item.getZyOrderCode());
             req.setReqTzComment(params.getReqTzComment());
-            req.setReqComment(params.getReqComment());
+
+            //  如果 是检验的话,就需要去本身的申请说明,不然  JianYanJianChaVerify.largeScaleProject() 看注释 111
+            req.setReqComment("2".equals(params.getReqType()) ? item.getReqComment() : params.getReqComment());
+            req.setReqInstructions(item.getReqInstructions());
+
             req.setReqOtherResult(params.getReqOtherResult());
             req.setDiagCode(params.getDiagCode());
             req.setDiagText(params.getDiagName());

+ 26 - 292
src/main/java/thyyxxk/webserver/service/zhuyuanyisheng/JianYanJianChaShenQingService.java

@@ -1,33 +1,28 @@
 package thyyxxk.webserver.service.zhuyuanyisheng;
 
-import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DatePattern;
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.ReflectUtil;
-import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.google.errorprone.annotations.Var;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
-import thyyxxk.webserver.config.exception.BizException;
 import thyyxxk.webserver.config.exception.ExceptionEnum;
 import thyyxxk.webserver.constants.Capacity;
 import thyyxxk.webserver.constants.Message;
 import thyyxxk.webserver.dao.his.zhuyuanyisheng.CheckTheCallbackDao;
 import thyyxxk.webserver.dao.his.zhuyuanyisheng.JianYanJianChaDao;
 import thyyxxk.webserver.dao.his.zhuyuanyisheng.YiZhuLuRuDao;
+import thyyxxk.webserver.dao.his.zhuyuanyisheng.YjReqLargeScaleProjectDao;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
 import thyyxxk.webserver.entity.login.UserInfo;
 import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.*;
-import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.dto.JyJcCheckItemDto;
-import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.dto.RepelJyJc;
+import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.dto.YjReqLargeScaleProject;
 import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.vo.PrintYshReqVo;
 import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.vo.ViewInspectionItemDetailsVo;
 import thyyxxk.webserver.entity.zhuyuanyisheng.query.ChaXunJianChaHeJianYan;
@@ -39,9 +34,7 @@ import thyyxxk.webserver.service.PublicServer;
 import thyyxxk.webserver.service.hutoolcache.UserCache;
 import thyyxxk.webserver.utils.*;
 
-import java.lang.reflect.Array;
 import java.lang.reflect.Field;
-import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -64,6 +57,7 @@ public class JianYanJianChaShenQingService {
     private final SocketV2 socketV2;
     private final UserCache userCache;
     public static final String JC_TYPE = "3";
+    private final YjReqLargeScaleProjectDao scaleProjectDao;
 
     /*-------------------------------------------------------------- 下面是检查的逻辑 -----------------------------------------------------------------------------------------------------*/
 
@@ -462,294 +456,37 @@ public class JianYanJianChaShenQingService {
         }
         XinZhenYiZhu huanZheXinXi = yiZhuLuRuDao.queryPatientInfo(param.getInpatientNo(), param.getAdmissTimes());
         publicServer.huanZheJieSuan(param.getInpatientNo(), param.getAdmissTimes());
-        int index = 1;
-        List<String> content = new ArrayList<>();
-        StringBuilder cuoWuXinXi = new StringBuilder();
 
-        Set<String> jcCodes = new HashSet<>();
-        Set<String> jyCodes = new HashSet<>();
+        JianYanJianChaVerify verify = new JianYanJianChaVerify(param, huanZheXinXi);
 
-        Map<String, Integer> itemCount = new HashMap<>();
-
-        for (YshYjReq item : param.getList()) {
-            boolean isCheck = JC_TYPE.equals(param.getReqType());
-            item.setForeachIndex(index);
-            item.setReqType(param.getReqType());
-
-            if (item.getQuantity() == null) {
-                item.setQuantity(BigDecimal.ONE);
-            }
-            if (StringUtil.notBlank(item.getJzFlag()) && "0".equals(item.getJzFlag())) {
-                item.setJzFlag(null);
-            }
-            if (StringUtil.notBlank(item.getYbSelfFlag()) && "0".equals(item.getYbSelfFlag())) {
-                item.setYbSelfFlag(null);
-            }
-            if (StringUtil.isBlank(item.getOrderCode())) {
-                cuoWuXinXi.append(baoCunCuoWuXinXi(index, "项目编码不能为空"));
-            }
-            if (StringUtil.isBlank(item.getOrderName())) {
-                cuoWuXinXi.append(baoCunCuoWuXinXi(index, "项目名称不能为空"));
-            }
-            if (item.getStartTime() == null) {
-                cuoWuXinXi.append(baoCunCuoWuXinXi(index, "检查时间不能为空"));
-            } else if (DateUtil.shiJianDaXiao(huanZheXinXi.getAdmissDate(), item.getStartTime(), ">")) {
-                cuoWuXinXi.append(baoCunCuoWuXinXi(index, "医嘱时间不能小于入院时间"));
-            }
-            if (StringUtil.isBlank(item.getExecDept())) {
-                cuoWuXinXi.append(baoCunCuoWuXinXi(index, "执行科室不能为空。"));
-            }
-            if (isCheck) {
-                jcCodes.add(item.getOrderCode());
-                if (StringUtil.isBlank(item.getReqComment())) {
-                    cuoWuXinXi.append(baoCunCuoWuXinXi(index, "病室摘要不能为空。"));
-                }
-                if (StringUtil.isBlank(item.getReqTzComment())) {
-                    cuoWuXinXi.append(baoCunCuoWuXinXi(index, "体征信息不能为空。"));
-                }
-                if (StringUtil.isBlank(item.getReqOtherResult())) {
-                    cuoWuXinXi.append(baoCunCuoWuXinXi(index, "相关辅检结果不能为空。"));
-                }
-                if (StringUtil.isBlank(item.getDiagCode())) {
-                    cuoWuXinXi.append(baoCunCuoWuXinXi(index, "临床诊断不能为空。"));
-                }
-            } else {
-                if (StringUtil.isBlank(item.getInspectStuff())) {
-                    cuoWuXinXi.append(baoCunCuoWuXinXi(index, "标本不能为空。"));
-                }
-                jyCodes.add(item.getOrderCode());
-            }
-            if (cuoWuXinXi.length() > 0) {
-                cuoWuXinXi.append("<br>");
-            }
-            content.add(String.format("%s:<span style='color:#409eff'>【%s】</span><br>" +
-                                      "患者姓名:<span style='color:#409eff'>【%s】</span><br>" +
-                                      "床位:<span style='color:#409eff'>【%s】</span>",
-                    JC_TYPE.equals(item.getReqType()) ? "检查名" : "检验名",
-                    item.getOrderName(), huanZheXinXi.getName(), huanZheXinXi.getBedNo()));
-            index++;
+        if (verify.isFail()) {
+            return R.fail(ExceptionEnum.JIAN_CHA_JIAN_YAN_FAIL, JSONObject.toJSONString(verify.getError()));
         }
 
-        Map<String, JyJcCheckItemDto> jc = getItemInfo(jcCodes, true);
-        Map<String, JyJcCheckItemDto> jy = getItemInfo(jyCodes, false);
-
-        List<String> needPart = new ArrayList<>();
-
-        if (JC_TYPE.equals(param.getReqType())) {
-            needPart = dao.selectBuWeiParentCode();
-            List<YshYjReq> yshYjReqs = handleSurcharge(param.getList(), jc);
-            param.getList().addAll(yshYjReqs);
-        }
-
-        for (int i = 0; i < param.getList().size(); i++) {
-            YshYjReq item = param.getList().get(i);
-            int finalI = item.getForeachIndex();
-            if (item.getJzFlag() == null) {
-                item.setJzFlag("0");
-            }
-            JyJcCheckItemDto itemInfo;
-            // 检查
-            if (JC_TYPE.equals(param.getReqType())) {
-                itemInfo = jc.get(item.getOrderCode());
-                if (needPart.contains(itemInfo.getOrderType())) {
-                    if (StringUtil.isBlank(item.getInspectPart())) {
-                        cuoWuXinXi.append(baoCunCuoWuXinXi(finalI, "此项目部位不能为空,请选择。"));
-                    }
-                }
-            } else {
-                // 检验
-                itemInfo = jy.get(item.getOrderCode());
-            }
-
-            if (itemInfo == null) {
-                cuoWuXinXi.append(baoCunCuoWuXinXi(finalI, "未查询到此项目,请删除"));
-                continue;
-            }
-
-            Integer age = huanZheXinXi.patientAge();
-
-            if (itemInfo.getDelFlag()) {
-                cuoWuXinXi.append(baoCunCuoWuXinXi(finalI, "项目已停用:【" + itemInfo.getName() + "】"));
-            }
-
-            if (itemInfo.getZyFlag()) {
-                cuoWuXinXi.append(baoCunCuoWuXinXi(finalI, "项目在住院已停用:【" + itemInfo.getName() + "】"));
-            }
-
-            if (itemInfo.getLimitTimes() != null && itemInfo.getLimitTimes() > 0) {
-                Integer merge = itemCount.merge(item.getOrderCode(), 1, Integer::sum);
-                if (merge > itemInfo.getLimitTimes()) {
-                    item.setChargeFee(BigDecimal.ZERO);
-                    item.setQuantity(BigDecimal.ZERO);
-                } else {
-                    item.setChargeFee(null);
-                }
-            }
-
-            if (itemInfo.getGenderRestriction() != null && !itemInfo.getGenderRestriction().equals(huanZheXinXi.getSex())) {
-                cuoWuXinXi.append(baoCunCuoWuXinXi(finalI, "患者的性别不能开这个项目。"));
-            }
-
-            if (itemInfo.getMaxAgeRestriction() != null && itemInfo.getMaxAgeRestriction() <= age) {
-                cuoWuXinXi.append(baoCunCuoWuXinXi(finalI, "项目最大年龄限制" + itemInfo.getMaxAgeRestriction() + "岁,患者年龄不符合。"));
-            }
-
-            if (itemInfo.getMinAgeRestriction() != null && itemInfo.getMinAgeRestriction() >= age) {
-                cuoWuXinXi.append(baoCunCuoWuXinXi(finalI, "项目最小年龄限制" + itemInfo.getMinAgeRestriction() + "岁,患者年龄不符合。"));
-            }
-
-            if (itemInfo.getItemInfoList() == null) {
-                // 项目里面没有关联任何费用
-                continue;
-            }
+        List<YjReqLargeScaleProject> yjReqLargeScaleProjects = new ArrayList<>();
 
-            itemInfo.getItemInfoList().forEach(value -> {
-                if (value.getItemDelFlag()) {
-                    cuoWuXinXi.append(baoCunCuoWuXinXi(finalI, "项目已停用:【" + value.getName() + "】"));
-                }
-                if (value.getOrderDelFlag()) {
-                    cuoWuXinXi.append(baoCunCuoWuXinXi(finalI, "医嘱已停用:【" + value.getName() + "】"));
-                }
-            });
-            jyjcRepel(huanZheXinXi, param.getList(), finalI, cuoWuXinXi, jcCodes, jyCodes, JC_TYPE.equals(param.getReqType()));
-        }
-
-        if (StringUtil.notBlank(cuoWuXinXi.toString())) {
-            throw new BizException(ExceptionEnum.LOGICAL_HTML_ERROR, String.valueOf(cuoWuXinXi));
-        }
         List<Integer> reqNos = new ArrayList<>();
         // 生成 医嘱号和申请号
-        for (YshYjReq item : param.getList()) {
+        for (int i = 0; i < param.getList().size(); i++) {
+            YshYjReq item = param.getList().get(i);
             item.setActOrderNo(publicServer.getActOrderNo());
             item.setReqNo(publicServer.getReqPageNo());
             reqNos.add(item.getReqNo());
-        }
-        insertData(param, huanZheXinXi, content);
-        return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "操作成功", reqNos);
-    }
-
-    private void jyjcRepel(XinZhenYiZhu huanZheXinXi,
-                           List<YshYjReq> items,
-                           int finalI,
-                           StringBuilder cuoWuXinXi,
-                           Set<String> jcCodes,
-                           Set<String> jyCodes,
-                           boolean isCheck) {
-
-        YshYjReq item = items.get(finalI - 1);
-        List<RepelJyJc> repelJyJcs = dao.selectRepelJyJc(item.getOrderCode());
-
-        if (!repelJyJcs.isEmpty()) {
-            RepelJyJc repelJyJc = repelJyJcs.get(0);
-            String dateTime = DateUtil.formatDate(DateUtil
-                    .date()
-                    .offset(DateField.HOUR, -repelJyJc.getRepelHour()), DateUtil.DEFAULT_PATTERN);
-
-            for (RepelJyJc jyJcRepel : repelJyJcs) {
-                Set<String> tmp;
-                if (isCheck) {
-                    tmp = jcCodes;
-                } else {
-                    tmp = jyCodes;
-                }
-                if (tmp.contains(jyJcRepel.getRepelCode())) {
-                    cuoWuXinXi.append(baoCunCuoWuXinXi(finalI, "两种项目不能同时开具,项目名字:" + getName(items, jyJcRepel.getRepelCode())));
-
-                }
-            }
-
-            QueryWrapper<?> qw = new QueryWrapper<>()
-                    .eq("inpatient_no", huanZheXinXi.getInpatientNo())
-                    .eq("admiss_times", huanZheXinXi.getAdmissTimes())
-                    .in("order_code", repelJyJcs.stream().map(RepelJyJc::getRepelCode).collect(Collectors.toSet()))
-                    .ge("sys_date", dateTime);
-            List<YshYjReq> repelNames = dao.selectJcJyRepel(qw);
-            if (!repelNames.isEmpty()) {
-                for (YshYjReq tmp : repelNames) {
-                    RepelJyJc tmpRepel = repelJyJcs.stream()
-                            .filter(i -> i.getRepelCode().equals(tmp.getOrderCode()))
-                            .findFirst().orElse(new RepelJyJc());
-                    String format = StrUtil.format("当前项目和:【{}】,需要间隔:【{}】小时才能重新开具", tmp.getOrderName(),
-                            tmpRepel.getRepelHour());
-                    cuoWuXinXi.append(baoCunCuoWuXinXi(finalI, format));
-                }
+            YjReqLargeScaleProject scaleProject = verify.getNeedReqReason().get(String.valueOf(i + 1));
+            if (scaleProject != null) {
+                scaleProject.setReqNo(item.getReqNo());
+                yjReqLargeScaleProjects.add(scaleProject);
             }
         }
-    }
-
-    private String getName(List<YshYjReq> data, String code) {
-        return data.stream()
-                .filter(item -> item.getOrderCode().equals(code))
-                .findFirst()
-                .map(YshYjReq::getOrderName)
-                .orElse("");
-    }
 
-
-    private Map<String, JyJcCheckItemDto> getItemInfo(Set<String> itemCodes, Boolean isCheck) {
-        Map<String, JyJcCheckItemDto> collect = new HashMap<>();
-        if (!itemCodes.isEmpty()) {
-            QueryWrapper<?> qw = new QueryWrapper<>();
-            qw.in("zy_order_code", itemCodes);
-            String col = "";
-            String tableName = "jy_zd_item";
-            if (isCheck) {
-                col = ",limit_times,(select rtrim(c.zy_order_code) from jc_zd_item c where c.code = jc_zd_item.surcharge) as surcharge," +
-                      "(select rtrim(c.name) from jc_zd_item c where c.code = jc_zd_item.surcharge) as surcharge_name ";
-                tableName = "jc_zd_item";
-            }
-
-            Map<String, JyJcCheckItemDto> info = dao.selectJyJcCheckItemDtoByOrderCode(qw, tableName, col)
-                    .stream()
-                    .collect(
-                            Collectors
-                                    .toMap(JyJcCheckItemDto::getCode, a -> a, (a, b) -> a)
-                    );
-            collect.putAll(info);
-            QueryWrapper<?> qw2 = new QueryWrapper<>();
-            qw2.in("a.order_code", itemCodes);
-            List<JyJcCheckItemDto.ItemInfo> itemInfos = dao.selectItemDetailsByOrderCode(qw2);
-            for (JyJcCheckItemDto.ItemInfo item : itemInfos) {
-                JyJcCheckItemDto jyJcCheckItemDtos = collect.get(item.getCode());
-                if (jyJcCheckItemDtos != null) {
-                    if (jyJcCheckItemDtos.getItemInfoList() == null) {
-                        jyJcCheckItemDtos.setItemInfoList(new ArrayList<>());
-                    }
-                    jyJcCheckItemDtos.getItemInfoList().add(item);
-                }
-            }
-        }
-        return collect;
-    }
-
-    private List<YshYjReq> handleSurcharge(List<YshYjReq> list, Map<String, JyJcCheckItemDto> jc) {
-        List<YshYjReq> tmp = new ArrayList<>();
-        Set<String> jcCodes = new HashSet<>();
-        for (YshYjReq item : list) {
-            if (!(item.getSurchargeFlag() != null && item.getSurchargeFlag())) {
-                continue;
-            }
-            JyJcCheckItemDto jyJcCheckItemDto = jc.get(item.getOrderCode());
-            if (jyJcCheckItemDto == null) {
-                continue;
-            }
-            if (StrUtil.isBlank(jyJcCheckItemDto.getSurcharge())) {
-                continue;
-            }
-            YshYjReq clone = EntityCopy.Copy(item, YshYjReq.class);
-            jcCodes.add(jyJcCheckItemDto.getSurcharge());
-
-            clone.setOrderCode(jyJcCheckItemDto.getSurcharge());
-            clone.setOrderName(jyJcCheckItemDto.getSurchargeName());
-            clone.setGroupName(jyJcCheckItemDto.getSurchargeName());
-            tmp.add(clone);
-        }
-        Map<String, JyJcCheckItemDto> itemInfo = getItemInfo(jcCodes, true);
-        jc.putAll(itemInfo);
-        return tmp;
+        insertData(param, huanZheXinXi, verify.getMessageContent(), yjReqLargeScaleProjects);
+        return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "操作成功", reqNos);
     }
 
-    public void insertData(TianJiaJianChaJianYan param, XinZhenYiZhu patInfo, List<String> content) {
+    public void insertData(TianJiaJianChaJianYan param,
+                           XinZhenYiZhu patInfo,
+                           List<String> content,
+                           List<YjReqLargeScaleProject> yjReqLargeScaleProjects) {
         String userCode = TokenUtil.getInstance().getTokenUserId();
 
         Date reqDate = new Date();
@@ -776,16 +513,13 @@ public class JianYanJianChaShenQingService {
                 patInfo.getDeptCode(),
                 PublicServer.getInfantFlag(patInfo.getInpatientNo()),
                 reqDate);
-        try {
-            publicServer.faSongXiaoXi(patInfo, content, "新增检查/检验", TokenUtil.getInstance().getTokenUserId());
-        } catch (Exception e) {
-            log.error(e.getMessage());
-        }
-    }
-
 
-    public String baoCunCuoWuXinXi(int index, String xinXi) {
-        return String.format("第【%d】个%s<br>", index, xinXi);
+        if (!yjReqLargeScaleProjects.isEmpty()) {
+            scaleProjectDao.insert(yjReqLargeScaleProjects);
+        }
+        ThreadUtil.execute(() -> {
+            publicServer.faSongXiaoXi(patInfo, content, "新增检查/检验", TokenUtil.getInstance().getTokenUserId());
+        });
     }
 
     /*-------------------------------------------------------------- 下面是检验的逻辑 -----------------------------------------------------------------------------------------------------*/

+ 399 - 0
src/main/java/thyyxxk/webserver/service/zhuyuanyisheng/JianYanJianChaVerify.java

@@ -0,0 +1,399 @@
+package thyyxxk.webserver.service.zhuyuanyisheng;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.Getter;
+import thyyxxk.webserver.dao.his.medicaladvice.common.DictDataDao;
+import thyyxxk.webserver.dao.his.zhuyuanyisheng.JianYanJianChaDao;
+import thyyxxk.webserver.entity.zd.TDictData;
+import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.TianJiaJianChaJianYan;
+import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.YshYjReq;
+import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.dto.JyJcCheckItemDto;
+import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.dto.RepelJyJc;
+import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.dto.YjReqLargeScaleProject;
+import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.XinZhenYiZhu;
+import thyyxxk.webserver.utils.DateUtil;
+import thyyxxk.webserver.utils.EntityCopy;
+import thyyxxk.webserver.utils.SnowFlakeId;
+import thyyxxk.webserver.utils.StringUtil;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class JianYanJianChaVerify {
+
+    private final JianYanJianChaDao dao = SpringUtil.getBean(JianYanJianChaDao.class);
+
+    private final TianJiaJianChaJianYan param;
+    private final XinZhenYiZhu huanZheXinXi;
+
+    private final String jc_repeat_jc_class_code = "jc_repeat_jc_class_code";
+    private final String jc_repeat_jc_item_code = "jc_repeat_jc_item_code";
+    private final String jy_repeat_jy_item_code = "jy_repeat_jy_item_code";
+    private final String JC_TYPE = "3";
+
+    private final boolean isCheck;
+
+    @Getter
+    private Map<String, List<String>> error = new HashMap<>();
+
+    // 项目超出不收费了
+    Map<String, Integer> itemCount = new HashMap<>();
+
+    // 检查的编码
+    Set<String> jcCodes = new HashSet<>();
+    // 检验的编码
+    Set<String> jyCodes = new HashSet<>();
+
+    Map<String, JyJcCheckItemDto> jcItem;
+    Map<String, JyJcCheckItemDto> jyItem;
+
+    // 需要部位的项目
+    List<String> needPart = new ArrayList<>();
+
+    // 向护士发送消息的消息体
+    @Getter
+    List<String> messageContent = new ArrayList<>();
+
+    private final TDictData.TDictDataMap config;
+
+    @Getter
+    private final Map<String, YjReqLargeScaleProject> needReqReason = new HashMap<>();
+
+    private int index = 1;
+
+    public JianYanJianChaVerify(TianJiaJianChaJianYan param, XinZhenYiZhu huanZheXinXi) {
+        this.param = param;
+        this.huanZheXinXi = huanZheXinXi;
+        isCheck = JC_TYPE.equals(param.getReqType());
+        // 查询配置字典
+        config = SpringUtil.getBean(DictDataDao.class)
+                .selectDictDataList(ListUtil.of(jc_repeat_jc_class_code, jc_repeat_jc_item_code, jy_repeat_jy_item_code));
+        init();
+    }
+
+    // 不通过
+    public boolean isFail() {
+        return !error.isEmpty();
+    }
+
+    private void init() {
+        for (YshYjReq item : param.getList()) {
+            item.setReqType(param.getReqType());
+
+            if (item.getQuantity() == null) {
+                item.setQuantity(BigDecimal.ONE);
+            }
+            if (StrUtil.isBlank(item.getJzFlag())) {
+                item.setJzFlag("0");
+            }
+            if (StringUtil.notBlank(item.getJzFlag()) && "0".equals(item.getJzFlag())) {
+                item.setJzFlag(null);
+            }
+            if (StringUtil.notBlank(item.getYbSelfFlag()) && "0".equals(item.getYbSelfFlag())) {
+                item.setYbSelfFlag(null);
+            }
+
+            if (StringUtil.isBlank(item.getOrderCode())) {
+                addError("项目编码不能为空");
+            }
+            if (StringUtil.isBlank(item.getOrderName())) {
+                addError("项目名称不能为空");
+            }
+
+            if (item.getStartTime() == null) {
+                addError("检查时间不能为空");
+            } else if (DateUtil.shiJianDaXiao(huanZheXinXi.getAdmissDate(), item.getStartTime(), ">")) {
+                addError("医嘱时间不能小于入院时间");
+            }
+
+            if (StringUtil.isBlank(item.getExecDept())) {
+                addError("执行科室不能为空");
+            }
+            if (isCheck) {
+                jcCodes.add(item.getOrderCode());
+                if (StringUtil.isBlank(item.getReqComment())) {
+                    addError("病室摘要不能为空");
+                }
+                if (StringUtil.isBlank(item.getReqTzComment())) {
+                    addError("体征信息不能为空");
+                }
+                if (StringUtil.isBlank(item.getReqOtherResult())) {
+                    addError("相关辅检结果不能为空");
+                }
+                if (StringUtil.isBlank(item.getDiagCode())) {
+                    addError("临床诊断不能为空");
+                }
+            } else {
+                if (StringUtil.isBlank(item.getInspectStuff())) {
+                    addError("标本不能为空");
+                }
+                jyCodes.add(item.getOrderCode());
+            }
+            messageContent.add(String.format("%s:<span style='color:#409eff'>【%s】</span><br>" +
+                                             "患者姓名:<span style='color:#409eff'>【%s】</span><br>" +
+                                             "床位:<span style='color:#409eff'>【%s】</span>",
+                    JC_TYPE.equals(item.getReqType()) ? "检查名" : "检验名",
+                    item.getOrderName(), huanZheXinXi.getName(), huanZheXinXi.getBedNo()));
+            index++;
+        }
+        jcItem = getItemInfo(jcCodes, true);
+        jyItem = getItemInfo(jyCodes, false);
+
+        // 如果是检查的话就看哪些检查需要部位
+        if (JC_TYPE.equals(param.getReqType())) {
+            needPart = dao.selectBuWeiParentCode();
+            // 判断是否有需要加收的费用
+            List<YshYjReq> yshYjReqs = handleSurcharge(param.getList(), jcItem);
+            // 在这个地方加收费用
+            param.getList().addAll(yshYjReqs);
+        }
+        checkItemRestriction();
+    }
+
+
+    private void checkItemRestriction() {
+        index = 1;
+        for (YshYjReq item : param.getList()) {
+            JyJcCheckItemDto itemInfo;
+            // 检查
+            if (JC_TYPE.equals(param.getReqType())) {
+                itemInfo = jcItem.get(item.getOrderCode());
+                if (needPart.contains(itemInfo.getOrderType())) {
+                    if (StringUtil.isBlank(item.getInspectPart())) {
+                        addError("此项目部位不能为空,请选择");
+                    }
+                }
+            } else {
+                // 检验
+                itemInfo = jyItem.get(item.getOrderCode());
+            }
+            if (itemInfo == null) {
+                addError("未查询到此项目,请删除");
+                continue;
+            }
+            Integer age = huanZheXinXi.patientAge();
+            if (itemInfo.getDelFlag()) {
+                addError("项目已停用:【" + itemInfo.getName() + "】");
+            }
+            if (itemInfo.getZyFlag()) {
+                addError("项目在住院已停用:【" + itemInfo.getName() + "】");
+            }
+
+            if (itemInfo.getLimitTimes() != null && itemInfo.getLimitTimes() > 0) {
+                Integer merge = itemCount.merge(item.getOrderCode(), 1, Integer::sum);
+                if (merge > itemInfo.getLimitTimes()) {
+                    item.setChargeFee(BigDecimal.ZERO);
+                    item.setQuantity(BigDecimal.ZERO);
+                } else {
+                    item.setChargeFee(null);
+                }
+            }
+
+            if (itemInfo.getGenderRestriction() != null && !itemInfo.getGenderRestriction().equals(huanZheXinXi.getSex())) {
+                addError("患者的性别不能开这个项目。");
+            }
+
+            if (itemInfo.getMaxAgeRestriction() != null && itemInfo.getMaxAgeRestriction() <= age) {
+                addError("项目最大年龄限制" + itemInfo.getMaxAgeRestriction() + "岁,患者年龄不符合。");
+            }
+
+            if (itemInfo.getMinAgeRestriction() != null && itemInfo.getMinAgeRestriction() >= age) {
+                addError("项目最小年龄限制" + itemInfo.getMinAgeRestriction() + "岁,患者年龄不符合。");
+            }
+
+            jyjcRepel(item);
+            largeScaleProject(item, itemInfo);
+
+            if (itemInfo.getItemInfoList() == null) {
+                // 项目里面没有关联任何费用,医生开这个项目然后手动收费
+                continue;
+            }
+
+            itemInfo.getItemInfoList().forEach(value -> {
+                if (value.getItemDelFlag()) {
+                    addError("项目已停用:【" + value.getName() + "】");
+                }
+                if (value.getOrderDelFlag()) {
+                    addError("医嘱已停用:【" + value.getName() + "】");
+                }
+            });
+
+            index++;
+        }
+    }
+
+    private void largeScaleProject(YshYjReq item, JyJcCheckItemDto itemInfo) {
+        YjReqLargeScaleProject build = YjReqLargeScaleProject
+                .builder()
+                .id(SnowFlakeId.instance().nextId())
+                .patNo(huanZheXinXi.getInpatientNo())
+                .times(huanZheXinXi.getAdmissTimes())
+                .reqInstructions(item.getReqInstructions())
+                .source("2")
+                .build();
+
+        item.setReqNo(index);
+
+        if (isCheck) {
+            List<String> largeScaleProjectClass = config.get(jc_repeat_jc_class_code, (val) -> StrUtil.split(val, ","), new ArrayList<>());
+            List<String> largeScaleProjectOrderCode = config.get(jc_repeat_jc_item_code, (val) -> StrUtil.split(val, ","), new ArrayList<>());
+
+            boolean isLargeScaleProject = largeScaleProjectClass.contains(itemInfo.getOrderType()) ||
+                                          largeScaleProjectOrderCode.contains(itemInfo.getId());
+            if (!isLargeScaleProject) {
+                return;
+            }
+            boolean handProject = dao.handJcProject(huanZheXinXi.getInpatientNo(), huanZheXinXi.getAdmissTimes(), item.getOrderCode(), item.getInspectPart());
+            if (handProject && StrUtil.isBlank(item.getReqInstructions())) {
+                addError("按照医务部李志龙要求,患者一个月内开了相同的项目和部位,请填写大型项目申请说明");
+            } else if (handProject) {
+                build.setReqInstructions(item.getReqInstructions());
+                needReqReason.put(String.valueOf(index), build);
+            }
+        } else {
+            List<String> largeScaleProjectOrderCode = config.get(jy_repeat_jy_item_code, (val) -> StrUtil.split(val, ","), new ArrayList<>());
+            boolean isLargeScaleProject = largeScaleProjectOrderCode.contains(itemInfo.getId());
+            if (!isLargeScaleProject) return;
+            boolean handProject = dao.handJyProject(huanZheXinXi.getInpatientNo(), huanZheXinXi.getAdmissTimes(), item.getOrderCode());
+            // 111 不然这个地方的话,会有问题,不能获取到医生真实填写的东西
+            if (handProject && StrUtil.isBlank(item.getReqComment())) {
+                addError("按照医务部李志龙要求,患者三个月内开了相同的项目,请填写申请说明");
+            } else if (handProject) {
+                build.setReqInstructions(item.getReqComment());
+                needReqReason.put(String.valueOf(index), build);
+            }
+        }
+    }
+
+    private void jyjcRepel(YshYjReq item) {
+        List<RepelJyJc> repelJyJcs = dao.selectRepelJyJc(item.getOrderCode());
+        if (repelJyJcs.isEmpty()) {
+            return;
+        }
+        // 获取到时间最长的小时来进行查询
+        RepelJyJc repelJyJc = repelJyJcs.get(0);
+        String dateTime = DateUtil.formatDate(DateUtil
+                .date()
+                .offset(DateField.HOUR, -repelJyJc.getRepelHour()), DateUtil.DEFAULT_PATTERN);
+
+        for (RepelJyJc jyJcRepel : repelJyJcs) {
+            Set<String> tmp;
+            if (isCheck) {
+                tmp = jcCodes;
+            } else {
+                tmp = jyCodes;
+            }
+            if (tmp.contains(jyJcRepel.getRepelCode())) {
+                addError("两种项目不能同时开具,项目名字:" + getName(jyJcRepel.getRepelCode()));
+            }
+        }
+
+        QueryWrapper<?> qw = new QueryWrapper<>()
+                .eq("inpatient_no", huanZheXinXi.getInpatientNo())
+                .eq("admiss_times", huanZheXinXi.getAdmissTimes())
+                .in("order_code", repelJyJcs.stream().map(RepelJyJc::getRepelCode).collect(Collectors.toSet()))
+                .ge("sys_date", dateTime);
+        List<YshYjReq> repelNames = dao.selectJcJyRepel(qw);
+        if (repelNames.isEmpty()) {
+            return;
+        }
+        for (YshYjReq tmp : repelNames) {
+            RepelJyJc tmpRepel = repelJyJcs.stream()
+                    .filter(i -> i.getRepelCode().equals(tmp.getOrderCode()))
+                    .findFirst().orElse(new RepelJyJc());
+            String format = StrUtil.format("当前项目和:【{}】,需要间隔:【{}】小时才能重新开具", tmp.getOrderName(),
+                    tmpRepel.getRepelHour());
+            addError(format);
+        }
+    }
+
+    private String getName(String code) {
+        return param.getList().stream()
+                .filter(item -> item.getOrderCode().equals(code))
+                .findFirst()
+                .map(YshYjReq::getOrderName)
+                .orElse("");
+    }
+
+    private void addError(String msg) {
+        String i = String.valueOf(index);
+        List<String> strings = error.get(i);
+        if (strings == null) {
+            strings = new ArrayList<>();
+            strings.add(msg);
+            error.put(i, strings);
+        } else {
+            strings.add(msg);
+        }
+    }
+
+    private Map<String, JyJcCheckItemDto> getItemInfo(Set<String> itemCodes, Boolean isCheck) {
+        Map<String, JyJcCheckItemDto> collect = new HashMap<>();
+        if (!itemCodes.isEmpty()) {
+            QueryWrapper<?> qw = new QueryWrapper<>();
+            qw.in("zy_order_code", itemCodes);
+            String col = "";
+            String tableName = "jy_zd_item";
+            if (isCheck) {
+                col = ",limit_times,(select rtrim(c.zy_order_code) from jc_zd_item c where c.code = jc_zd_item.surcharge) as surcharge," +
+                      "(select rtrim(c.name) from jc_zd_item c where c.code = jc_zd_item.surcharge) as surcharge_name ";
+                tableName = "jc_zd_item";
+            }
+
+            Map<String, JyJcCheckItemDto> info = dao.selectJyJcCheckItemDtoByOrderCode(qw, tableName, col)
+                    .stream()
+                    .collect(
+                            Collectors
+                                    .toMap(JyJcCheckItemDto::getCode, a -> a, (a, b) -> a)
+                    );
+            collect.putAll(info);
+            QueryWrapper<?> qw2 = new QueryWrapper<>();
+            qw2.in("a.order_code", itemCodes);
+            List<JyJcCheckItemDto.ItemInfo> itemInfos = dao.selectItemDetailsByOrderCode(qw2);
+            for (JyJcCheckItemDto.ItemInfo item : itemInfos) {
+                JyJcCheckItemDto jyJcCheckItemDtos = collect.get(item.getCode());
+                if (jyJcCheckItemDtos != null) {
+                    if (jyJcCheckItemDtos.getItemInfoList() == null) {
+                        jyJcCheckItemDtos.setItemInfoList(new ArrayList<>());
+                    }
+                    jyJcCheckItemDtos.getItemInfoList().add(item);
+                }
+            }
+        }
+        return collect;
+    }
+
+    private List<YshYjReq> handleSurcharge(List<YshYjReq> list, Map<String, JyJcCheckItemDto> jc) {
+        List<YshYjReq> tmp = new ArrayList<>();
+        Set<String> jcCodes = new HashSet<>();
+        for (YshYjReq item : list) {
+            if (!(item.getSurchargeFlag() != null && item.getSurchargeFlag())) {
+                continue;
+            }
+            JyJcCheckItemDto jyJcCheckItemDto = jc.get(item.getOrderCode());
+            if (jyJcCheckItemDto == null) {
+                continue;
+            }
+            if (StrUtil.isBlank(jyJcCheckItemDto.getSurcharge())) {
+                continue;
+            }
+            YshYjReq clone = EntityCopy.Copy(item, YshYjReq.class);
+            jcCodes.add(jyJcCheckItemDto.getSurcharge());
+
+            clone.setOrderCode(jyJcCheckItemDto.getSurcharge());
+            clone.setOrderName(jyJcCheckItemDto.getSurchargeName());
+            clone.setGroupName(jyJcCheckItemDto.getSurchargeName());
+            tmp.add(clone);
+        }
+        Map<String, JyJcCheckItemDto> itemInfo = getItemInfo(jcCodes, true);
+        jc.putAll(itemInfo);
+        return tmp;
+    }
+
+
+}

+ 40 - 0
update/2025-10-20.md

@@ -97,3 +97,43 @@ go
 
 
 ```
+
+# 检验检查的申请理由
+
+```
+create table yj_req_large_scale_project
+(
+    id               varchar(18)                not null,
+    req_no           int                        not null,
+    pat_no           varchar(18)                not null,
+    times            int                        not null,
+    req_tpe          varchar                    not null,
+    req_instructions nvarchar(500)              not null,
+    create_date      datetime default getdate() not null
+)
+go
+
+exec sp_addextendedproperty 'MS_Description', N'医技大型申请说明', 'SCHEMA', 'dbo', 'TABLE',
+     'yj_req_large_scale_project'
+go
+
+exec sp_addextendedproperty 'MS_Description', N'申请单号', 'SCHEMA', 'dbo', 'TABLE', 'yj_req_large_scale_project',
+     'COLUMN', 'req_no'
+go
+
+exec sp_addextendedproperty 'MS_Description', N'住院号/门诊号', 'SCHEMA', 'dbo', 'TABLE', 'yj_req_large_scale_project',
+     'COLUMN', 'pat_no'
+go
+
+exec sp_addextendedproperty 'MS_Description', N'住院次数门诊次数', 'SCHEMA', 'dbo', 'TABLE',
+     'yj_req_large_scale_project', 'COLUMN', 'times'
+go
+
+exec sp_addextendedproperty 'MS_Description', N'1-门诊 2-住院', 'SCHEMA', 'dbo', 'TABLE', 'yj_req_large_scale_project',
+     'COLUMN', 'req_tpe'
+go
+
+exec sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', 'dbo', 'TABLE', 'yj_req_large_scale_project',
+     'COLUMN', 'create_date'
+go
+```