瀏覽代碼

Merge branch 'master' into 'master'

门诊配药扫码优化,住院入院/出院增加定时任务上传诊疗活动

See merge request lighter/web-server!191
huangshuhua 1 月之前
父節點
當前提交
dc477fcd2f

+ 11 - 1
src/main/java/thyyxxk/webserver/controller/crbmanagement/CrbBaseController.java

@@ -12,6 +12,7 @@ import thyyxxk.webserver.service.crbmanagement.CrbBaseService;
 import thyyxxk.webserver.service.crbmanagement.CrbExService;
 import thyyxxk.webserver.service.crbmanagement.CrbSheetService;
 import thyyxxk.webserver.service.crbmanagement.CrbUpdateByEmr;
+import thyyxxk.webserver.service.crbmanagement.EmrActivityInfoService;
 import thyyxxk.webserver.service.crbmanagement.EmrOutpatientRecordService;
 
 import java.util.List;
@@ -32,14 +33,16 @@ public class CrbBaseController {
     private final CrbExService crbExService;
     private final CrbUpdateByEmr crbUpdateByEmr;
     private final EmrOutpatientRecordService outpatientRecordService;
+    private final EmrActivityInfoService emrActivityInfoService;
 
     @Autowired
-    public CrbBaseController(CrbBaseService service, CrbSheetService crbSheetService, CrbExService crbExService, CrbUpdateByEmr crbUpdateByEmr, EmrOutpatientRecordService outpatientRecordService) {
+    public CrbBaseController(CrbBaseService service, CrbSheetService crbSheetService, CrbExService crbExService, CrbUpdateByEmr crbUpdateByEmr, EmrOutpatientRecordService outpatientRecordService, EmrActivityInfoService emrActivityInfoService) {
         this.service = service;
         this.crbSheetService = crbSheetService;
         this.crbExService = crbExService;
         this.crbUpdateByEmr = crbUpdateByEmr;
         this.outpatientRecordService = outpatientRecordService;
+        this.emrActivityInfoService = emrActivityInfoService;
     }
 
     @PassToken
@@ -89,4 +92,11 @@ public class CrbBaseController {
         outpatientRecordService.uploadEmrOutpatientRecordByClock();
     }
 
+    @PassToken
+    @GetMapping("uploadEmrActivityInfoByZy")
+    public void uploadEmrActivityInfoByZy(){
+        // 每个4小时定时上传入院/出院诊疗活动
+        emrActivityInfoService.uploadEmrActivityInfoByZy();
+    }
+
 }

+ 3 - 2
src/main/java/thyyxxk/webserver/controller/medicine/YpCodgMatchController.java

@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RestController;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.medicine.MzDrugTracCodg;
 import thyyxxk.webserver.entity.medicine.vo.YpCodgVo;
+import thyyxxk.webserver.service.medicine.MatchCodgRequest;
 import thyyxxk.webserver.service.medicine.YpCodgMatchService;
 
 import java.util.List;
@@ -42,8 +43,8 @@ public class YpCodgMatchController {
     }
 
     @PostMapping("/selectMatchCodgInfo")
-    public ResultVo<Map<String, Object>> selectMatchCodgInfo(@RequestBody @Validated YpCodgVo vo){
-        return service.selectMatchCodgInfo(vo);
+    public ResultVo<Map<String, Object>> selectMatchCodgInfo(@RequestBody @Validated MatchCodgRequest request){
+        return service.selectMatchCodgInfo(request.getYpCodgVo(), request.getMzCfDetail());
     }
 
     @PostMapping("/updateMzDrugCodgData")

+ 8 - 4
src/main/java/thyyxxk/webserver/dao/his/crbmanagement/EmrActivityInfoDao.java

@@ -45,7 +45,7 @@ public interface EmrActivityInfoDao extends BaseMapper<EmrActivityInfoVo> {
             "  and mz.patient_id = bl.patient_id and mz.times = bl.times " +
             "  and mz.patient_id = mi.patient_id " +
             "  and bl.doctor_code = emp.code and bl.dept_code = dt.code " +
-            "  and ${ew.sqlSegment} ")
+            "  and ${ew.sqlSegment} order by mz.visit_date desc ")
     List<EmrActivityInfoVo> selectEmrActivityInfoByMz(@Param("orgCode") String orgCode, @Param("orgName") String orgName, @Param(Constants.WRAPPER) QueryWrapper<?> qw);
 
     @Select(" select rtrim(zy.inpatient_no) + '_' + cast(zy.admiss_times as varchar(4)) as id, rtrim(zy.inpatient_no) as patientId, " +
@@ -60,7 +60,7 @@ public interface EmrActivityInfoDao extends BaseMapper<EmrActivityInfoVo> {
             " from zy_actpatient as zy, a_patient_mi as mi, zd_unit_code as dt " +
             " where zy.inpatient_no = mi.inpatient_no " +
             "  and zy.admiss_ward = dt.code " +
-            "  and ${ew.sqlSegment} ")
+            "  and ${ew.sqlSegment} order by zy.admiss_date desc ")
     List<EmrActivityInfoVo> selectEmrActivityInfoByZy(@Param("orgCode") String orgCode, @Param("orgName") String orgName,
                                                       @Param("activityTypeCode") String activityTypeCode, @Param("activityTypeName") String activityTypeName,
                                                       @Param(Constants.WRAPPER) QueryWrapper<?> qw);
@@ -76,7 +76,7 @@ public interface EmrActivityInfoDao extends BaseMapper<EmrActivityInfoVo> {
             " from zy_inactpatient as zy, a_patient_mi as mi, zd_unit_code as dt " +
             " where zy.inpatient_no = mi.inpatient_no " +
             "  and zy.dis_ward = dt.code " +
-            "  and ${ew.sqlSegment} ")
+            "  and ${ew.sqlSegment} order by zy.admiss_date desc ")
     List<EmrActivityInfoVo> selectEmrActivityInfoByCy(@Param("orgCode") String orgCode, @Param("orgName") String orgName, @Param(Constants.WRAPPER) QueryWrapper<?> qw);
 
     @Select("<script> " +
@@ -88,8 +88,12 @@ public interface EmrActivityInfoDao extends BaseMapper<EmrActivityInfoVo> {
             "</script>")
     List<Map<String, String>> selectIcdNewDataList(List<String> icdList);
 
-    @Select(" select distinct rtrim(code) as code, rtrim(name) as name, rtrim(yb_code) as ybCode, rtrim(yb_name) as ybName, cast(infectiousdiseases_flag as varchar) as infectiousdiseasesFlag " +
+    @Select(" select distinct rtrim(yb_code) as ybCode, rtrim(yb_name) as ybName, cast(infectiousdiseases_flag as varchar) as infectiousdiseasesFlag " +
             " from zd_icd_code_new where del_flag = '0' and code = #{code} ")
     Map<String, String> selectIcdNewDataByCode(@Param("code") String code);
 
+    @Select(" select distinct rtrim(yb_code) as ybCode, rtrim(yb_name) as ybName, cast(infectiousdiseases_flag as varchar) as infectiousdiseasesFlag " +
+            " from zd_icd_code_new where del_flag = '0' and yb_code = #{code} ")
+    Map<String, String> selectIcdNewDataByYbCode(@Param("code") String code);
+
 }

+ 4 - 1
src/main/java/thyyxxk/webserver/dao/his/medicine/YpCodgMatchDao.java

@@ -3,6 +3,7 @@ package thyyxxk.webserver.dao.his.medicine;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import thyyxxk.webserver.entity.medicine.YpZdDictVo;
 import thyyxxk.webserver.entity.medicine.vo.YpCodgVo;
 
 import java.util.List;
@@ -55,7 +56,7 @@ public interface YpCodgMatchDao {
             " mz.warn_dept as warnDept, rtrim(mz.serial_no) as serialNo, mz.print_flag as printFlag, " +
             " mz.quantity, mz.supply_code as supplyCode, mz.manu_no as manuNo, rtrim(mz.charge_item_code) as chargeCode, " +
             " rtrim(c.name) as deptName, yp.drug_flag as drugFlag, yp.name as chargeName, yp.location, yp.retprice, " +
-            " rtrim(yp.specification) as specification, rtrim(cj.name) as factory, mz.serial " +
+            " rtrim(yp.specification) as specification, rtrim(cj.name) as factory, mz.serial, '0' as trdnFlag " +
             " from mz_charge_detail as mz with(nolock) " +
             " left join zd_unit_code as c on mz.warn_dept = c.code " +
             " inner join yp_zd_dict as yp with(nolock) on mz.charge_item_code = yp.code and mz.serial = yp.serial " +
@@ -80,4 +81,6 @@ public interface YpCodgMatchDao {
     @Select(" select name from sys_parameters where code = 'isOpenTaoBaoMatch' ")
     String selectIsOpenTb();
 
+    @Select(" select * from yp_zd_dict where code = #{code} and serial = #{serial} ")
+    YpZdDictVo selectYpZdDictByCode(@Param("code") String code, @Param("serial") String serial);
 }

+ 2 - 2
src/main/java/thyyxxk/webserver/dao/his/medicine/YpInDetlDao.java

@@ -58,7 +58,7 @@ public interface YpInDetlDao extends BaseMapper<YpInDetlVo> {
             " where d.confirm_flag = '1' " +
             " and d.buy_amt > 0 " +
             " and d.manu_no = #{manuNo} " +
-            " and s.name like '%${drugName}%' " +
+//            " and s.name like '%${drugName}%' " +
             " order by d.in_date desc ")
-    List<YpInDetlVo> selectYpInDetlListByName(@Param("manuNo") String manuNo, @Param("drugName") String drugName);
+    List<YpInDetlVo> selectYpInDetlListByName(@Param("manuNo") String manuNo);
 }

+ 3 - 3
src/main/java/thyyxxk/webserver/dao/his/medicine/YpTracCodgDao.java

@@ -108,17 +108,17 @@ public interface YpTracCodgDao {
             " fy.doctor_name as prscDrName, fy.confirm_name as pharName, mi.yb_code as pharPracCertNo, mi.yb_code as pharNo, " +
             " isnull(si.setl_id, (rtrim(fy.patient_id)  + '_' + cast(fy.times as varchar(4)))) as setlId, isnull(si.mdtrt_id, (rtrim(fy.patient_id)  + '_' + cast(fy.times as varchar(4)))) as mdtrtSn, " +
             " case when si.setl_id is null then '2' else '1' end as mdtrtSetlType, mi1.yb_code as prscDrNo, rtrim(fy.patient_id) as rxno,  " +
-            " '' as manuLotnum, '' as manuDate, '' as expyEnd, isnull(yp.rx_flag, '1') as rxFlag, '' as trdnFlag, rtrim(fy.charge_item_code) as chargeCode, " +
+            " '' as manuLotnum, '' as manuDate, '' as expyEnd, isnull(yp.rx_flag, '1') as rxFlag, rtrim(fy.charge_item_code) as chargeCode, " +
             " yp.retprice as finlTrnsPric, fy.real_no as rtalDocno, '' as drugTracCodg, isnull(yp.bar_code, 'NDPB999') as drugProdBarc, fy.manu_no as manuNo, " +
             " fy.quantity as selRetnCnt, convert(varchar(100), fy.charge_date, 20) as selRetnTime, fy.confirm_name as selRetnOpterName, " +
-            " rtrim(yp.code) as chargeCode, rtrim(yp.name) as chargeName, fy.serial, rtrim(fy.patient_id) as patNo, fy.times, fy.group_no as groupNo, " +
+            " isnull(cd.trdn_flag, '0') as trdnFlag, rtrim(yp.name) as chargeName, fy.serial, rtrim(fy.patient_id) as patNo, fy.times, fy.group_no as groupNo, " +
             " fy.receipt_no as receiptNo, fy.order_no as orderNo, fy.item_no as itemNo, fy.serial_no as serialNo, fy.real_no as realNo " +
             "from yp_mz_fytj as fy " +
             "left join yp_zd_dict as yp on fy.charge_item_code = yp.code and fy.serial = yp.serial " +
             "left join a_employee_mi as mi on fy.confirm_id = mi.code " +
             "left join a_employee_mi as mi1 on fy.doctor_id = mi1.code " +
             "left join t_si_setlinfo as si on si.revoked = '0' and fy.patient_id = si.pat_no and fy.times = si.times " +
-            "inner join (select distinct patient_id, times, receipt_no, order_no, item_no from mz_drug_trac_codg where flag = '0') as cd " +
+            "inner join (select distinct patient_id, times, receipt_no, order_no, item_no, trdn_flag from mz_drug_trac_codg where flag = '0') as cd " +
             " on fy.patient_id = cd.patient_id and fy.times = cd.times " +
             " and fy.order_no = cd.order_no and fy.item_no = cd.item_no " +
             "where not exists ( select 1 from yp_selinfo_sold so " +

+ 1 - 0
src/main/java/thyyxxk/webserver/entity/crbmanagement/ParamVo.java

@@ -19,5 +19,6 @@ public class ParamVo {
     private String idCard; // 身份证号码
     private String tjType; // 统计类型: 0:全部;1:门诊;2:住院
     private String isCrb;
+    private Integer times; // 门诊次数/住院次数
 
 }

+ 88 - 4
src/main/java/thyyxxk/webserver/service/crbmanagement/EmrActivityInfoService.java

@@ -11,6 +11,7 @@ import org.springframework.stereotype.Service;
 import thyyxxk.webserver.config.exception.ExceptionEnum;
 import thyyxxk.webserver.dao.his.crbmanagement.EmrActivityInfoDao;
 import thyyxxk.webserver.dao.his.zhuyuanyisheng.emr.EmrPatientDao;
+import thyyxxk.webserver.dao.his.zygl.ZyActpatientDao;
 import thyyxxk.webserver.entity.CodeName;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.crbmanagement.EmrActivityInfo;
@@ -21,12 +22,15 @@ import thyyxxk.webserver.entity.crbmanagement.emr.EmrDailyCourse;
 import thyyxxk.webserver.entity.crbmanagement.emr.EmrDischargeInfo;
 import thyyxxk.webserver.entity.crbmanagement.emr.EmrFirstCourse;
 import thyyxxk.webserver.entity.dictionary.EmployeeMi;
+import thyyxxk.webserver.entity.inpatient.ZyActpatient;
 import thyyxxk.webserver.entity.zhuyuanyisheng.emr.EmrPatientData;
 import thyyxxk.webserver.service.externalhttp.CrbUploadService;
 import thyyxxk.webserver.utils.EmrJsonUtils2;
 import thyyxxk.webserver.utils.ResultVoUtil;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -58,6 +62,9 @@ public class EmrActivityInfoService {
     @Resource
     private EmrPatientDao emrDao;
 
+    @Resource
+    private ZyActpatientDao zyActpatientDao;
+
     @Value("${si-crb-url}")
     private String siCrbUrl;
 
@@ -134,7 +141,7 @@ public class EmrActivityInfoService {
             // 在院病人
             List<EmrActivityInfoVo> zyList = dao.selectEmrActivityInfoByZy(orgCode, orgName, "5", "入院", zyQw);
             List<EmrActivityInfoVo> adZy = assembleEmrActivityInfoByZy(zyQw, orgCode, orgName, zyList, isCrb);
-            if(null != adZy && !adZy.isEmpty()){
+            if(!adZy.isEmpty()){
                 result.addAll(adZy);
             }
         } else if("3".equals(tjType)){
@@ -272,6 +279,7 @@ public class EmrActivityInfoService {
 
     private List<EmrActivityInfoVo> assembleEmrActivityInfoByZy(QueryWrapper<EmrActivityInfoVo> zyQw, String orgCode, String orgName, List<EmrActivityInfoVo> zyList, String isCrb) {
         List<EmrActivityInfoVo> result = new ArrayList<>();
+        List<EmrActivityInfoVo> list = new ArrayList<>();
         if(null != zyList && !zyList.isEmpty()){
             // crbUpdateByEmr.getEmrAdmissionInfo()
             for(EmrActivityInfoVo infoVo : zyList){
@@ -304,9 +312,28 @@ public class EmrActivityInfoService {
                         infoVo.setUploadType(upVo.getUploadType());
                         infoVo.setUploadMsg(upVo.getUploadMsg());
                     }
+                    list.add(infoVo);
                 } else {
-                    // 默认没有诊断的不是传染病
-                    infoVo.setIsCrb("0");
+                    // 没有入院诊断去获取入院登记的诊断(zy_actpatient)
+                    ZyActpatient patInfo = zyActpatientDao.selectByInpatientNo("zy_actpatient", infoVo.getPatientId(), infoVo.getTimes());
+                    if(!StringUtils.isEmpty(patInfo.getAdmissDiag())){
+                        Map<String, String> m = crbBaseService.selectDeptYbInfoByCode(patInfo.getSmallDept());
+                        if(null != m){
+                            infoVo.setDeptCode(Convert.toStr(m.get("siCaty"), infoVo.getDeptCode()));
+                            infoVo.setDeptName(Convert.toStr(m.get("siCatyName"), infoVo.getDeptName()));
+                        }
+                        infoVo.setOperatorId("99999");
+                        infoVo.setFillDoctor("-");
+                        infoVo.setWmDiseaseCode(StringUtils.trim(patInfo.getAdmissDiag()));
+                        infoVo.setWmDiseaseName(StringUtils.trim(patInfo.getAdmissDiagStr()));
+                        List<CodeName> zdList = new ArrayList<>();
+                        CodeName ne = new CodeName();
+                        ne.setCode(infoVo.getWmDiseaseCode());
+                        ne.setName(infoVo.getWmDiseaseName());
+                        zdList.add(ne);
+                        assembleIllIcdCategory(infoVo, zdList);
+                        list.add(infoVo);
+                    }
                 }
 
                 if("1".equals(infoVo.getIsCrb())){
@@ -317,7 +344,7 @@ public class EmrActivityInfoService {
                 return result;
             }
         }
-        return zyList;
+        return list;
     }
 
     /**
@@ -335,6 +362,12 @@ public class EmrActivityInfoService {
             StringBuilder crbZdName = new StringBuilder();
             for(CodeName cd : zdList){
                 Map<String, String> map = dao.selectIcdNewDataByCode(cd.getCode());
+                if(null == map){
+                    map = dao.selectIcdNewDataByYbCode(cd.getCode());
+                }
+                if(null == map){
+                    continue;
+                }
                 String crbFlag = map.get("infectiousdiseasesFlag");
                 if("1".equals(crbFlag)){
                     crbZd.append(map.get("ybCode")).append("||");
@@ -508,4 +541,55 @@ public class EmrActivityInfoService {
         return ResultVoUtil.success(object);
     }
 
+    public void uploadEmrActivityInfoByZy(){
+        QueryWrapper<EmrActivityInfoVo> zyQw = new QueryWrapper<>();
+        QueryWrapper<EmrActivityInfoVo> cyQw = new QueryWrapper<>();
+        List<EmrActivityInfoVo> result = new ArrayList<>();
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime oneHoursAgo = now.minusHours(1);
+        LocalDateTime fiveHoursAgo = now.minusHours(5);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
+        String startHour = fiveHoursAgo.format(formatter);
+        String endHour = oneHoursAgo.format(formatter);
+        zyQw.ge("zy.admiss_date", startHour + ":00:00");
+        zyQw.le("zy.admiss_date", endHour + ":59:59");
+        cyQw.ge("zy.dis_date", startHour + ":00:00");
+        cyQw.le("zy.dis_date", endHour + ":59:59");
+        String orgCode = crbBaseService.sysParametersByCode("orgCode");
+        String orgName = crbBaseService.sysParametersByCode("orgName");
+        //入院病人
+        List<EmrActivityInfoVo> zyList = dao.selectEmrActivityInfoByZy(orgCode, orgName, "5", "入院", zyQw);
+        List<EmrActivityInfoVo> adZy = assembleEmrActivityInfoByZy(zyQw, orgCode, orgName, zyList, "0");
+        if(!adZy.isEmpty()){
+            result.addAll(adZy);
+        }
+        // 出院病人
+        List<EmrActivityInfoVo> adCy = assembleEmrActivityInfoByCy(cyQw, orgCode, orgName, "0");
+        if(null != adCy && !adCy.isEmpty()){
+            result.addAll(adCy);
+        }
+//        log.info("总共上传: " + result.size() + "条。");
+        if(!result.isEmpty()) {
+            for (EmrActivityInfoVo vo : result) {
+                EmrActivityInfo info = new EmrActivityInfo();
+                BeanUtils.copyProperties(vo, info);
+                JSONObject object = crbUploadService.uploadEmrActivityInfo(siCrbUrl, info);
+                boolean r = (boolean) object.get("result");
+                if(!r){
+                    vo.setUploadFlag(0);
+                    vo.setUploadType((String) object.get("errorCode"));
+                    vo.setUploadMsg(crbBaseService.errInfoTips(object));
+                    object.put("desc", crbBaseService.errInfoTips(object));
+                } else {
+                    vo.setUploadFlag(1);
+                    vo.setUploadType((String) object.get("id"));
+                    vo.setUploadMsg((String) object.get("desc"));
+                }
+                // 保存上传患者诊疗活动信息
+                saveActivityInfoData(vo);
+            }
+        }
+    }
+
+
 }

+ 24 - 0
src/main/java/thyyxxk/webserver/service/medicine/MatchCodgRequest.java

@@ -0,0 +1,24 @@
+package thyyxxk.webserver.service.medicine;
+
+import lombok.Data;
+import thyyxxk.webserver.entity.medicine.vo.YpCodgVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName MatchCodgRequest
+ * @Author hsh
+ * @Date 2025/10/17 0017 16:11
+ * @Version 1.0
+ * @Description 追溯码匹配实体
+ **/
+@Data
+public class MatchCodgRequest {
+
+    // 匹配处方信息
+    private YpCodgVo ypCodgVo;
+    // 匹配处方明细信息
+    private List<Map<String, Object>> mzCfDetail;
+
+}

+ 66 - 94
src/main/java/thyyxxk/webserver/service/medicine/YpCodgMatchService.java

@@ -19,7 +19,6 @@ import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.login.UserInfo;
 import thyyxxk.webserver.entity.medicine.MzDrugTracCodg;
 import thyyxxk.webserver.entity.medicine.YpCodgLine;
-import thyyxxk.webserver.entity.medicine.YpDictConstant;
 import thyyxxk.webserver.entity.medicine.YpInDetlVo;
 import thyyxxk.webserver.entity.medicine.YpSelinfoSold;
 import thyyxxk.webserver.entity.medicine.YpZdSupply;
@@ -127,21 +126,20 @@ public class YpCodgMatchService {
      * @Description 查询获取的追溯码匹配信息
      * @Author hsh
      * @param vo 处方信息
+     * @param cfDetail 处方明细信息
      * @return map
      * @Date 2025/7/7 0007 14:48
      */
-    public ResultVo<Map<String, Object>> selectMatchCodgInfo(YpCodgVo vo){
+    public ResultVo<Map<String, Object>> selectMatchCodgInfo(YpCodgVo vo, List<Map<String, Object>> cfDetail){
         String codgLine = vo.getCodeLine();
         if(StringUtils.isBlank(codgLine)){
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "药品追溯码信息不存在,请检查!");
         }
-        // 查询处方明细
-        List<Map<String, Object>> cfDetail = matchDao.selectMzCfDetail(vo);
-        // 查询是否开放码上放心平台核对校验功能(0:否; 1:是)
-        String isOpenTb = matchDao.selectIsOpenTb();
         if(cfDetail.isEmpty()){
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人处方信息不存在,请检查!");
         }
+        // 查询是否开放码上放心平台核对校验功能(0:否; 1:是)
+        String isOpenTb = matchDao.selectIsOpenTb();
         Map<String, Object> resultMap = new HashMap<>();
         List<MzDrugTracCodg> resultList = new ArrayList<>();
         UserInfo us = userCache.getUserInfoByToken();
@@ -256,7 +254,8 @@ public class YpCodgMatchService {
             // 生产企业名称
             String factory = pUserEntDto.getEntName();
             // 模糊查询入库信息(根据追溯码只能模糊匹配) 2025.07.25 暂时不根据批准文号匹配,因院内维护原因会有很多不一致
-            List<YpInDetlVo> detlVoList = inDao.selectYpInDetlListByName(manuNo, chargeName);
+            // 2025.10.16 进一步取消药品名称匹配,因院内药品名称与淘宝名称会有不一致的情况
+            List<YpInDetlVo> detlVoList = inDao.selectYpInDetlListByName(manuNo);
             if(null == detlVoList || detlVoList.isEmpty()){
                 codg.setFlag("-1");
                 codg.setMatchFlag("-1");
@@ -268,53 +267,49 @@ public class YpCodgMatchService {
                 codg.setExpyEnd(expyEnd);
                 codg.setMatchMessage("未匹配到入库信息:扫码药品【" + chargeName + "】,请核对!");
             } else {
-                List<Map<String, Object>> l = m.get(detlVoList.get(0).getChargeCode());
-                if(null != l && !l.isEmpty()){
-                    String drugName = Convert.toStr(l.get(0).get("chargeName"));
-                    String serial = Convert.toStr(l.get(0).get("serial"));
-                    if(serial.equals(detlVoList.get(0).getSerial())){
-                        codg.setFlag("0");
-                        codg.setMatchFlag("1");
-                        codg.setMatchMessage("匹配码上放心平台药品信息成功");
-                        // 补全处方信息
-                        codg.setItemNo(Convert.toInt(l.get(0).get("itemNo")));
-                        codg.setDrugName(drugName);
-                        codg.setChargeItemCode(Convert.toStr(l.get(0).get("chargeCode")));
-                        codg.setSerial(Convert.toStr(l.get(0).get("serial")));
-                        codg.setChargeDate(Convert.toStr(l.get(0).get("chargeDate")));
-                        codg.setWarnDeptName(Convert.toStr(l.get(0).get("deptName")));
-                        codg.setSpecification(Convert.toStr(l.get(0).get("specification")));
-                        codg.setAbbrName(Convert.toStr(l.get(0).get("factory")));
-                        codg.setUnitPrice(Convert.toBigDecimal(l.get(0).get("retprice")));
-                        codg.setManuNo(manuNo);
-                        codg.setManuDate(manuDate);
-                        codg.setExpyEnd(expyEnd);
+                Map<String, List<YpInDetlVo>> detlVoMap = detlVoList.stream().collect(Collectors.groupingBy(YpInDetlVo::getChargeCode, Collectors.toList()));
+                Map<String, Object> m1 = new HashMap<>();
+                YpInDetlVo m2 = new YpInDetlVo();
+                for (Map.Entry<String, List<YpInDetlVo>> entry : detlVoMap.entrySet()) {
+                    String chargeCode = entry.getKey();
+                    List<YpInDetlVo> l2 = entry.getValue();
+                    List<Map<String, Object>> l1 = m.get(chargeCode);
+                    if(null != l1 && !l1.isEmpty()){
+                        m1 = l1.get(0);
+                        m2 = l2.get(0);
+                        break;
+                    }
+                }
+                if(null != m1 && !m1.isEmpty()){
+                    codg.setFlag("0");
+                    codg.setMatchFlag("1");
+                    codg.setMatchMessage("匹配码上放心平台药品信息成功");
+                    // 补全处方信息
+                    codg.setItemNo(Convert.toInt(m1.get("itemNo")));
+                    codg.setDrugName(Convert.toStr(m1.get("chargeName")));
+                    codg.setChargeItemCode(Convert.toStr(m1.get("chargeCode")));
+                    codg.setSerial(Convert.toStr(m1.get("serial")));
+                    codg.setChargeDate(Convert.toStr(m1.get("chargeDate")));
+                    codg.setWarnDeptName(Convert.toStr(m1.get("deptName")));
+                    codg.setSpecification(Convert.toStr(m1.get("specification")));
+                    codg.setAbbrName(Convert.toStr(m1.get("factory")));
+                    codg.setUnitPrice(Convert.toBigDecimal(m1.get("retprice")));
+                    codg.setManuNo(manuNo);
+                    codg.setManuDate(manuDate);
+                    codg.setExpyEnd(expyEnd);
+                    if("1".equals(String.valueOf(m1.get("trdnFlag")))){
+                        codg.setTrdnFlag("1");
+                        codg.setMatchMessage("拆零药品," + codg.getMatchMessage());
+                        codg.setDrugTracCodg(codg.getDrugTracCodg() + "_CL" + UUID.randomUUID().toString().replace("-", ""));
                     } else {
-                        if(YpDictConstant.SERIAL_01.equals(serial)){
-                            codg.setTrdnFlag("1");
-                            codg.setFlag("0");
-                            codg.setMatchFlag("1");
-                            // 补全处方信息
-                            codg.setItemNo(Convert.toInt(l.get(0).get("itemNo")));
-                            codg.setChargeItemCode(Convert.toStr(l.get(0).get("chargeCode")));
-                            codg.setSerial(Convert.toStr(l.get(0).get("serial")));
-                            codg.setChargeDate(Convert.toStr(l.get(0).get("chargeDate")));
-                            codg.setWarnDeptName(Convert.toStr(l.get(0).get("deptName")));
-                            codg.setSpecification(Convert.toStr(l.get(0).get("specification")));
-                            codg.setAbbrName(Convert.toStr(l.get(0).get("factory")));
-                            codg.setUnitPrice(Convert.toBigDecimal(l.get(0).get("retprice")));
-                            codg.setMatchMessage("拆零药品,匹配码上放心平台药品信息成功");
-                            codg.setDrugTracCodg(codg.getDrugTracCodg() + "_CL" + UUID.randomUUID().toString().replace("-", ""));
-                        } else {
+                        String serial = codg.getSerial();
+                        if(!serial.equals(m2.getSerial())){
                             codg.setFlag("-1");
                             codg.setMatchFlag("-1");
-                            codg.setMatchMessage("未匹配到药品信息,药品大小包装规格【" + serial + "】不对,请核对是否拆零");
+                            codg.setMatchMessage("检查发现发药与入库包装规格不一致,也未标识成拆零药品,请核对!");
+                        } else {
+                            codg.setTrdnFlag("0");
                         }
-                        codg.setDrugName(chargeName);
-                        codg.setManuNo(manuNo);
-                        codg.setManuDate(manuDate);
-                        codg.setAbbrName(factory);
-                        codg.setExpyEnd(expyEnd);
                     }
                 } else {
                     codg.setFlag("-1");
@@ -375,51 +370,28 @@ public class YpCodgMatchService {
             } else {
                 List<Map<String, Object>> l = m.get(StringUtils.trim(detlVo.getChargeCode()));
                 if(null != l && !l.isEmpty()){
-                    String chargeName = Convert.toStr(l.get(0).get("chargeName"));
-                    String serial = Convert.toStr(l.get(0).get("serial"));
-                    if(serial.equals(detlVo.getSerial())){
-                        codg.setFlag("0");
-                        codg.setMatchFlag("0");
-                        codg.setMatchMessage("匹配企业追溯下载信息成功");
-                        // 补全处方信息
-                        codg.setItemNo(Convert.toInt(l.get(0).get("itemNo")));
-                        codg.setDrugName(chargeName);
-                        codg.setChargeItemCode(Convert.toStr(l.get(0).get("chargeCode")));
-                        codg.setSerial(Convert.toStr(l.get(0).get("serial")));
-                        codg.setChargeDate(Convert.toStr(l.get(0).get("chargeDate")));
-                        codg.setWarnDeptName(Convert.toStr(l.get(0).get("deptName")));
-                        codg.setSpecification(Convert.toStr(l.get(0).get("specification")));
-                        codg.setAbbrName(Convert.toStr(l.get(0).get("factory")));
-                        codg.setUnitPrice(Convert.toBigDecimal(l.get(0).get("retprice")));
-                        codg.setManuNo(line.getManuBchno());
-                        codg.setManuDate(line.getManuDate());
-                        codg.setExpyEnd(line.getExpyEnd());
+                    codg.setFlag("0");
+                    codg.setMatchFlag("0");
+                    codg.setMatchMessage("匹配企业追溯下载信息成功");
+                    // 补全处方信息
+                    codg.setItemNo(Convert.toInt(l.get(0).get("itemNo")));
+                    codg.setDrugName(Convert.toStr(l.get(0).get("chargeName")));
+                    codg.setChargeItemCode(Convert.toStr(l.get(0).get("chargeCode")));
+                    codg.setSerial(Convert.toStr(l.get(0).get("serial")));
+                    codg.setChargeDate(Convert.toStr(l.get(0).get("chargeDate")));
+                    codg.setWarnDeptName(Convert.toStr(l.get(0).get("deptName")));
+                    codg.setSpecification(Convert.toStr(l.get(0).get("specification")));
+                    codg.setAbbrName(Convert.toStr(l.get(0).get("factory")));
+                    codg.setUnitPrice(Convert.toBigDecimal(l.get(0).get("retprice")));
+                    codg.setManuNo(line.getManuBchno());
+                    codg.setManuDate(StringUtils.substring(line.getManuDate(), 0, 10));
+                    codg.setExpyEnd(StringUtils.substring(line.getExpyEnd(), 0, 10));
+                    if("1".equals(String.valueOf(l.get(0).get("trdnFlag")))){
+                        codg.setTrdnFlag("1");
+                        codg.setMatchMessage("拆零药品," + codg.getMatchMessage());
+                        codg.setDrugTracCodg(codg.getDrugTracCodg() + "_CL" + UUID.randomUUID().toString().replace("-", ""));
                     } else {
-                        if(YpDictConstant.SERIAL_01.equals(serial)){
-                            codg.setTrdnFlag("1");
-                            codg.setFlag("0");
-                            codg.setMatchFlag("1");
-                            // 补全处方信息
-                            codg.setItemNo(Convert.toInt(l.get(0).get("itemNo")));
-                            codg.setChargeItemCode(Convert.toStr(l.get(0).get("chargeCode")));
-                            codg.setSerial(Convert.toStr(l.get(0).get("serial")));
-                            codg.setChargeDate(Convert.toStr(l.get(0).get("chargeDate")));
-                            codg.setWarnDeptName(Convert.toStr(l.get(0).get("deptName")));
-                            codg.setSpecification(Convert.toStr(l.get(0).get("specification")));
-                            codg.setAbbrName(Convert.toStr(l.get(0).get("factory")));
-                            codg.setUnitPrice(Convert.toBigDecimal(l.get(0).get("retprice")));
-                            codg.setMatchMessage("拆零药品,匹配码上放心平台药品信息成功");
-                            codg.setDrugTracCodg(codg.getDrugTracCodg() + "_CL" + UUID.randomUUID().toString().replace("-", ""));
-                        } else {
-                            codg.setFlag("-1");
-                            codg.setMatchFlag("-1");
-                            codg.setMatchMessage("未匹配到药品信息,药品大小包装规格【" + serial + "】不对,请核对是否拆零");
-                        }
-                        codg.setDrugName(line.getDrugProdname());
-                        codg.setManuNo(line.getManuBchno());
-                        codg.setManuDate(line.getManuDate());
-                        codg.setAbbrName(line.getProdentpName());
-                        codg.setExpyEnd(line.getExpyEnd());
+                        codg.setTrdnFlag("0");
                     }
                 } else {
                     codg.setFlag("-1");

+ 61 - 41
src/main/java/thyyxxk/webserver/service/medicine/YpTracCodgService.java

@@ -583,11 +583,15 @@ public class YpTracCodgService {
                 yp.setDrugTracCodg(String.valueOf(strCodg));
             }
             // 0 是匹配企业追溯码下载信息; 1 是匹配码上放心平台
+            boolean f = false;
             if("0".equals(matchFlag)){
                 ResultVo<YpCodgLine> resultVo = lineService.selectYpCodgLineByCode(ypCodg);
                 YpCodgLine line = resultVo.getData();
-                if(null == line){
-                    return "根据追溯码【" + ypCodg + "】查询企业追溯码下载信息有误,请检查!";
+                if(null == line || (null != line.getMedListCodg() && line.getMedListCodg().length() > 30)){
+                    f = true;
+                }
+                if(f){
+                    return callTaoBaoMatchMethod(ypCodg, yp, confirmTime, trdnFlag);
                 }
                 yp.setManuDate(StringUtils.substring(line.getManuDate(), 0, 10));
                 yp.setManuLotnum(line.getManuBchno());
@@ -614,47 +618,10 @@ public class YpTracCodgService {
                 yp.setFixmedinsHilistName(line.getMedinsListName());
                 yp.setRxFlag(line.getRxFlag());
                 yp.setDrugProdBarc(line.getBarcode());
+                yp.setDrugTracCodg(ypCodg);
             } else {
-                ResultVo<Map<String, Object>> resultVo = tbService.queryCodeDetail(ypCodg);
-                Map<String, Object> map = resultVo.getData();
-                if(null == map){
-                    return resultVo.getMessage();
-                }
-                List<AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse.CodeFullInfoDto> ss = (List<AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse.CodeFullInfoDto>) map.get("data");
-                yp.setManuDate(ss.get(0).getCodeProduceInfoDTO().getProduceInfoList().get(0).getProduceDateStr());
-                yp.setManuLotnum(ss.get(0).getCodeProduceInfoDTO().getProduceInfoList().get(0).getBatchNo());
-                yp.setExpyEnd(ss.get(0).getCodeProduceInfoDTO().getProduceInfoList().get(0).getExpireDate());
-                YpInDetl inDetl = dao.selectCodgInfoProdTime(yp.getChargeCode(), yp.getSerial(), yp.getManuLotnum(), confirmTime);
-                if(null == inDetl){
-                    // 选择就近批次号匹配
-                    List<YpInDetl> frList = dao.selectCodgInfoProdTimeByNotManuLotnum(yp.getChargeCode(), yp.getSerial(), confirmTime);
-                    for(YpInDetl yid : frList){
-                        if(yp.getManuLotnum().contains(StringUtils.trim(yid.getManuNo()))){
-                            inDetl = yid;
-                            break;
-                        }
-                    }
-                    if(null == inDetl){
-                        if(YpDictConstant.SERIAL_01.equals(yp.getSerial())){
-                            inDetl = dao.selectCodgInfoProdTime(yp.getChargeCode(), YpDictConstant.SERIAL_99, yp.getManuLotnum(), confirmTime);
-                            if(null == inDetl){
-                                return "批量上传药品销售失败,根据追溯码【" + ypCodg +
-                                        "】查出药品【" + ss.get(0).getDrugEntBaseDTO().getPhysicName() + "】品名,生产批号【"
-                                        + ss.get(0).getCodeProduceInfoDTO().getProduceInfoList().get(0).getBatchNo()
-                                        + "】与销售药品【" + yp.getChargeName() + "】品名不符合或者生产批号不存在,请核对!" ;
-                            }
-                        } else {
-                            return "批量上传药品销售失败,根据追溯码【" + ypCodg +
-                                    "】查出药品【" + ss.get(0).getDrugEntBaseDTO().getPhysicName() + "】品名,生产批号【"
-                                    + ss.get(0).getCodeProduceInfoDTO().getProduceInfoList().get(0).getBatchNo()
-                                    + "】与销售药品【" + yp.getChargeName() + "】品名不符合或者生产批号不存在,请核对!" ;
-                        }
-                    }
-                }
-                yp.setTrdnFlag(trdnFlag);
-                yp.setFixmedinsBchno(StringUtils.trim(inDetl.getInDocuNo()) + "_" + inDetl.getInSeri());
+                return callTaoBaoMatchMethod(ypCodg, yp, confirmTime, trdnFlag);
             }
-            yp.setDrugTracCodg(ypCodg);
         } else {
             YpOutDetl outDetl = dao.selectCodgInfoManu(yp.getChargeCode(), yp.getGroupNo());
             if(null != outDetl){
@@ -674,6 +641,59 @@ public class YpTracCodgService {
         return "";
     }
 
+    /**
+     * @Description 根据供应商下载匹配的追溯码有问题无奈采取的措施,与淘宝开放平台进行匹配
+     * @Author hsh
+     * @param ypCodg 追溯码
+     * @param yp 追溯码上传信息
+     * @param confirmTime 发药确认时间
+     * @param trdnFlag 拆零标志
+     * @return str 返回信息
+     * @Date 2025/10/15 0015 22:14
+     */
+    private String callTaoBaoMatchMethod(String ypCodg, YpSelinfoSold yp, String confirmTime, String trdnFlag) {
+        ResultVo<Map<String, Object>> resultVo = tbService.queryCodeDetail(ypCodg);
+        Map<String, Object> map = resultVo.getData();
+        if(null == map){
+            return resultVo.getMessage();
+        }
+        List<AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse.CodeFullInfoDto> ss = (List<AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse.CodeFullInfoDto>) map.get("data");
+        yp.setManuDate(ss.get(0).getCodeProduceInfoDTO().getProduceInfoList().get(0).getProduceDateStr());
+        yp.setManuLotnum(ss.get(0).getCodeProduceInfoDTO().getProduceInfoList().get(0).getBatchNo());
+        yp.setExpyEnd(ss.get(0).getCodeProduceInfoDTO().getProduceInfoList().get(0).getExpireDate());
+        YpInDetl inDetl = dao.selectCodgInfoProdTime(yp.getChargeCode(), yp.getSerial(), yp.getManuLotnum(), confirmTime);
+        if(null == inDetl){
+            // 选择就近批次号匹配
+            List<YpInDetl> frList = dao.selectCodgInfoProdTimeByNotManuLotnum(yp.getChargeCode(), yp.getSerial(), confirmTime);
+            for(YpInDetl yid : frList){
+                if(yp.getManuLotnum().contains(StringUtils.trim(yid.getManuNo()))){
+                    inDetl = yid;
+                    break;
+                }
+            }
+            if(null == inDetl){
+                if(YpDictConstant.SERIAL_01.equals(yp.getSerial())){
+                    inDetl = dao.selectCodgInfoProdTime(yp.getChargeCode(), YpDictConstant.SERIAL_99, yp.getManuLotnum(), confirmTime);
+                    if(null == inDetl){
+                        return "批量上传药品销售失败,根据追溯码【" + ypCodg +
+                                "】查出药品【" + ss.get(0).getDrugEntBaseDTO().getPhysicName() + "】品名,生产批号【"
+                                + ss.get(0).getCodeProduceInfoDTO().getProduceInfoList().get(0).getBatchNo()
+                                + "】与销售药品【" + yp.getChargeName() + "】品名不符合或者生产批号不存在,请核对!" ;
+                    }
+                } else {
+                    return "批量上传药品销售失败,根据追溯码【" + ypCodg +
+                            "】查出药品【" + ss.get(0).getDrugEntBaseDTO().getPhysicName() + "】品名,生产批号【"
+                            + ss.get(0).getCodeProduceInfoDTO().getProduceInfoList().get(0).getBatchNo()
+                            + "】与销售药品【" + yp.getChargeName() + "】品名不符合或者生产批号不存在,请核对!" ;
+                }
+            }
+        }
+        yp.setTrdnFlag(trdnFlag);
+        yp.setFixmedinsBchno(StringUtils.trim(inDetl.getInDocuNo()) + "_" + inDetl.getInSeri());
+        yp.setDrugTracCodg(ypCodg);
+        return "";
+    }
+
     /**
      * @Description 批量撤销药品销售或者销售退货信息
      * @Author hsh

+ 29 - 0
src/main/java/thyyxxk/webserver/service/zygl/ZyActpatientService.java

@@ -28,6 +28,8 @@ import thyyxxk.webserver.dao.his.zygl.ZyBedMiDao;
 import thyyxxk.webserver.dao.his.zygl.ZyDepositFileDao;
 import thyyxxk.webserver.dao.his.zygl.ZyLedgerFileDao;
 import thyyxxk.webserver.entity.ResultVo;
+import thyyxxk.webserver.entity.crbmanagement.EmrPatientInfoVo;
+import thyyxxk.webserver.entity.crbmanagement.ParamVo;
 import thyyxxk.webserver.entity.dictionary.ZdUnitCode;
 import thyyxxk.webserver.entity.executeItem.NumberEnum;
 import thyyxxk.webserver.entity.executeItem.ZyLedgerFile;
@@ -41,6 +43,7 @@ import thyyxxk.webserver.entity.zygl.CodeNameEntity;
 import thyyxxk.webserver.entity.zygl.ZyAdt;
 import thyyxxk.webserver.entity.zygl.ZyConfig;
 import thyyxxk.webserver.entity.zygl.ZyWorkLog;
+import thyyxxk.webserver.service.crbmanagement.EmrPatientInfoService;
 import thyyxxk.webserver.service.hutoolcache.UserCache;
 import thyyxxk.webserver.utils.AssertUtil;
 import thyyxxk.webserver.utils.CommonUtil;
@@ -95,6 +98,8 @@ public class ZyActpatientService {
     private ZdUnitCodeDao zdUnitCodeDao;
     @Resource
     private ZyDepositFileDao zyDepositFileDao;
+    @Resource
+    private EmrPatientInfoService patientInfoService;
 
     /**
      * @description: 保存入院信息
@@ -281,9 +286,33 @@ public class ZyActpatientService {
             zyLedgerFile.setZySerialNo(zyActpatient.getZySerialNo());
             zyLedgerFileMapper.insetZyLedgerFile(zyLedgerFile);
         }
+
+        // 保存病人传染病基本信息
+        try {
+            saveEmrPatientInfoByCode(zyActpatient);
+        } catch (Exception e){
+            log.error("保存病人传染病基本信息失败:" + e.fillInStackTrace());
+        }
+
         return num;
     }
 
+    /**
+     * @Description 保存病人的传染病基本信息
+     * @Author hsh
+     * @param zyActpatient 病人基本信息
+     * @Date 2025/10/15 0015 11:09
+     */
+    private void saveEmrPatientInfoByCode(ZyActpatient zyActpatient) {
+        ParamVo vo = new ParamVo();
+        vo.setPatNo(zyActpatient.getInpatientNo());
+        ResultVo<List<EmrPatientInfoVo>> data = patientInfoService.selectPatientInfo(vo);
+        List<EmrPatientInfoVo> infoList = data.getData();
+        if(null != infoList && !infoList.isEmpty()){
+            patientInfoService.savePatientInfoData(infoList.get(0));
+        }
+    }
+
     private Integer getLastadmissTimes(Integer lastadmissTimes, String inpatientNo) {
         Integer maxTimes = zyActpatientMapper.selectMaxTimes(inpatientNo);
         return Convert.toInt(lastadmissTimes, 0) <= Convert.toInt(maxTimes, 0) ? Convert.toInt(maxTimes, 0) : Convert.toInt(lastadmissTimes, 0);