LIJU 2 weeks ago
parent
commit
cb72eb9a9f

+ 106 - 0
src/main/java/cn/hnthyy/thmz/controller/mz/MzPharmacyController.java

@@ -1757,4 +1757,110 @@ public class MzPharmacyController {
         
         return resultMap;
     }
+
+    /**
+     * 根据关联字段查询发药记录
+     * 
+     * 功能说明:通过关联字段查询具体的发药记录,用于医保接口关联发药信息
+     * 
+     * 关联字段说明:
+     * - patientId: 患者ID,来自 mz_charge_detail.patient_id 表
+     * - times: 就诊次数,来自 mz_charge_detail.times 表
+     * - receiptNo: 发票分票号,来自 mz_charge_detail.receipt_no 表
+     * - orderNo: 处方号,来自 mz_charge_detail.order_no 表
+     * - chargeItemCode: 收费项目编码,来自 mz_charge_detail.charge_item_code 表
+     * - realNo: 流水号,来自 mz_charge_detail.real_no 表
+     * 
+     * 查询的数据表:
+     * 1. yp_mz_fytj: 发药统计表
+     *    - 记录发药数量、金额、确认时间等统计信息
+     *    - 通过关联字段查询具体的发药统计记录
+     * 
+     * 2. mz_drug_trac_codg: 药品追溯码表
+     *    - 记录药品追溯码信息
+     *    - 通过关联字段查询具体的追溯码记录
+     * 
+     * 调用场景:
+     * 1. 医保接口调用后,需要查询具体的发药记录进行审计
+     * 2. 系统管理员需要查看特定发药记录的详细信息
+     * 3. 财务对账时,需要核对发药记录与医保记录的一致性
+     * 
+     * 返回数据:
+     * - fytjRecords: 发药统计记录列表
+     * - tracCodgRecords: 追溯码记录列表
+     * - associationKey: 关联键字符串,用于日志记录和后续查询
+     * 
+     * @param request 包含关联字段的请求参数
+     * @param httpServletRequest HTTP请求对象
+     * @return Map<String, Object> 查询结果,包含发药记录和追溯码信息
+     */
+    @UserLoginToken
+    @RequestMapping(value = "/getDispensingRecordByAssociation", method = {RequestMethod.POST})
+    public Map<String, Object> getDispensingRecordByAssociation(@RequestBody Map<String, Object> request, HttpServletRequest httpServletRequest) {
+        Map<String, Object> resultMap = new HashMap<>();
+        try {
+            // 从请求参数中提取关联字段
+            String patientId = (String) request.get("patientId");
+            Integer times = (Integer) request.get("times");
+            Integer receiptNo = (Integer) request.get("receiptNo");
+            Integer orderNo = (Integer) request.get("orderNo");
+            String chargeItemCode = (String) request.get("chargeItemCode");
+            Integer realNo = (Integer) request.get("realNo");
+            
+            // 参数验证:确保所有必要的关联字段都不为空
+            if (StringUtils.isBlank(patientId) || times == null || receiptNo == null || 
+                orderNo == null || StringUtils.isBlank(chargeItemCode)) {
+                resultMap.put("code", -1);
+                resultMap.put("message", "关联字段不能为空");
+                return resultMap;
+            }
+            
+            // 记录查询日志,便于问题排查和审计
+            log.info("查询发药记录 - 关联字段: patientId={}, times={}, receiptNo={}, orderNo={}, chargeItemCode={}, realNo={}", 
+                    patientId, times, receiptNo, orderNo, chargeItemCode, realNo);
+            
+            // 1. 查询发药统计记录(yp_mz_fytj 表)
+            // 该表记录发药的数量、金额、确认时间等统计信息
+            Map<String, Object> fytjQuery = new HashMap<>();
+            fytjQuery.put("patientId", patientId);
+            fytjQuery.put("times", times);
+            fytjQuery.put("receiptNo", receiptNo);
+            fytjQuery.put("orderNo", orderNo);
+            fytjQuery.put("chargeItemCode", chargeItemCode);
+            fytjQuery.put("realNo", realNo);
+            
+            List<Map<String, Object>> fytjRecords = mzPharmacyService.queryDispensingRecordsByAssociation(fytjQuery);
+            
+            // 2. 查询追溯码记录(mz_drug_trac_codg 表)
+            // 该表记录药品追溯码信息,用于药品追溯和监管
+            Map<String, Object> tracCodgQuery = new HashMap<>();
+            tracCodgQuery.put("patientId", patientId);
+            tracCodgQuery.put("times", times);
+            tracCodgQuery.put("receiptNo", receiptNo);
+            tracCodgQuery.put("orderNo", orderNo);
+            tracCodgQuery.put("chargeItemCode", chargeItemCode);
+            tracCodgQuery.put("realNo", realNo);
+            
+            List<Map<String, Object>> tracCodgRecords = mzPharmacyService.queryTracCodgRecordsByAssociation(tracCodgQuery);
+            
+            // 3. 构建返回数据
+            // 包含发药统计记录、追溯码记录和关联键信息
+            Map<String, Object> data = new HashMap<>();
+            data.put("fytjRecords", fytjRecords);
+            data.put("tracCodgRecords", tracCodgRecords);
+            data.put("associationKey", String.format("patientId=%s&times=%s&receiptNo=%s&orderNo=%s&chargeItemCode=%s&realNo=%s",
+                    patientId, times, receiptNo, orderNo, chargeItemCode, realNo));
+            
+            resultMap.put("code", 0);
+            resultMap.put("message", "查询发药记录成功");
+            resultMap.put("data", data);
+            
+        } catch (Exception e) {
+            log.error("查询发药记录失败", e);
+            resultMap.put("code", -1);
+            resultMap.put("message", "查询发药记录失败:" + e.getMessage());
+        }
+        
+        return resultMap;
+    }
 }

+ 60 - 0
src/main/java/cn/hnthyy/thmz/entity/yb/SelinfoSold.java

@@ -280,4 +280,64 @@ public class SelinfoSold {
     @JSONField(name = "drugtracinfo")
     private List<DrugTracCodg> drugtracinfo;
 
+    /**
+     * 关联字段 - 病人ID(用于关联发药记录)
+     * 数据来源:mz_charge_detail.patient_id 表
+     * 关联用途:与发药统计表 yp_mz_fytj 和追溯码表 mz_drug_trac_codg 进行关联查询
+     * 调用接口:/thmz/getDispensingRecordByAssociation - 通过此字段查询发药记录
+     * 业务意义:唯一标识患者,确保发药记录与医保记录的一一对应
+     * */
+    @JSONField(name = "patient_id")
+    private String patientId;
+
+    /**
+     * 关联字段 - 就诊次数(用于关联发药记录)
+     * 数据来源:mz_charge_detail.times 表
+     * 关联用途:与发药统计表 yp_mz_fytj 和追溯码表 mz_drug_trac_codg 进行关联查询
+     * 调用接口:/thmz/getDispensingRecordByAssociation - 通过此字段查询发药记录
+     * 业务意义:区分同一患者的不同就诊记录,确保数据准确性
+     * */
+    @JSONField(name = "times")
+    private Integer times;
+
+    /**
+     * 关联字段 - 发票分票号(用于关联发药记录)
+     * 数据来源:mz_charge_detail.receipt_no 表
+     * 关联用途:与发药统计表 yp_mz_fytj 和追溯码表 mz_drug_trac_codg 进行关联查询
+     * 调用接口:/thmz/getDispensingRecordByAssociation - 通过此字段查询发药记录
+     * 业务意义:标识具体的发票分票,支持多张发票的区分
+     * */
+    @JSONField(name = "receipt_no")
+    private Integer receiptNo;
+
+    /**
+     * 关联字段 - 处方号(用于关联发药记录)
+     * 数据来源:mz_charge_detail.order_no 表
+     * 关联用途:与发药统计表 yp_mz_fytj 和追溯码表 mz_drug_trac_codg 进行关联查询
+     * 调用接口:/thmz/getDispensingRecordByAssociation - 通过此字段查询发药记录
+     * 业务意义:标识具体的处方,支持同一患者多张处方的区分
+     * */
+    @JSONField(name = "order_no")
+    private Integer orderNo;
+
+    /**
+     * 关联字段 - 收费项目编码(用于关联发药记录)
+     * 数据来源:mz_charge_detail.charge_item_code 表
+     * 关联用途:与发药统计表 yp_mz_fytj 和追溯码表 mz_drug_trac_codg 进行关联查询
+     * 调用接口:/thmz/getDispensingRecordByAssociation - 通过此字段查询发药记录
+     * 业务意义:标识具体的药品或服务项目,确保发药记录与收费项目的对应关系
+     * */
+    @JSONField(name = "charge_item_code")
+    private String chargeItemCode;
+
+    /**
+     * 关联字段 - 流水号(用于关联发药记录)
+     * 数据来源:mz_charge_detail.real_no 表
+     * 关联用途:与发药统计表 yp_mz_fytj 和追溯码表 mz_drug_trac_codg 进行关联查询
+     * 调用接口:/thmz/getDispensingRecordByAssociation - 通过此字段查询发药记录
+     * 业务意义:系统内部唯一流水号,确保每条记录的绝对唯一性
+     * */
+    @JSONField(name = "real_no")
+    private Integer realNo;
+
 }

+ 130 - 0
src/main/java/cn/hnthyy/thmz/mapper/his/mz/MzPharmacyMapper.java

@@ -1220,4 +1220,134 @@ public interface MzPharmacyMapper {
             "</where>",
             "</script>"})
     List<Map<String, Object>> selectYpManuBarCodeByTracCodg(Map<String, Object> queryParams);
+
+    /**
+     * @Description 根据关联字段查询发药统计记录
+     * 
+     * 功能说明:通过关联字段查询 yp_mz_fytj 表中的发药统计记录
+     * 
+     * 关联字段说明:
+     * - patientId: 患者ID,来自 mz_charge_detail.patient_id 表
+     * - times: 就诊次数,来自 mz_charge_detail.times 表
+     * - receiptNo: 发票分票号,来自 mz_charge_detail.receipt_no 表
+     * - orderNo: 处方号,来自 mz_charge_detail.order_no 表
+     * - chargeItemCode: 收费项目编码,来自 mz_charge_detail.charge_item_code 表
+     * - realNo: 流水号,来自 mz_charge_detail.real_no 表
+     * 
+     * 查询的数据表:yp_mz_fytj(发药统计表)
+     * 表字段说明:
+     * - patient_id: 患者ID
+     * - times: 就诊次数
+     * - receipt_no: 发票分票号
+     * - order_no: 处方号
+     * - charge_item_code: 收费项目编码
+     * - real_no: 流水号
+     * - quantity: 发药数量
+     * - unit_price: 单价
+     * - confirm_time: 确认时间
+     * - confirm_flag: 确认标志
+     * - drugname: 药品名称
+     * - specification: 规格
+     * 
+     * 调用场景:
+     * 1. 医保接口调用后,需要查询具体的发药统计记录进行审计
+     * 2. 系统管理员需要查看特定发药记录的详细信息
+     * 3. 财务对账时,需要核对发药记录与医保记录的一致性
+     * 
+     * 调用接口:/thmz/getDispensingRecordByAssociation
+     * 
+     * @param queryParams 包含关联字段的查询参数
+     * @return List<Map<String, Object>> 发药统计记录列表
+     * @Author hsh
+     * @Date 2025/2/27 15:30
+     */
+    @Select({"<script>",
+            "SELECT * FROM yp_mz_fytj WITH(NOLOCK)",
+            "<where>",
+            "<when test='patientId != null'>",
+            " and patient_id = #{patientId}",
+            "</when>",
+            "<when test='times != null'>",
+            " and times = #{times}",
+            "</when>",
+            "<when test='receiptNo != null'>",
+            " and receipt_no = #{receiptNo}",
+            "</when>",
+            "<when test='orderNo != null'>",
+            " and order_no = #{orderNo}",
+            "</when>",
+            "<when test='chargeItemCode != null'>",
+            " and charge_item_code = #{chargeItemCode}",
+            "</when>",
+            "<when test='realNo != null'>",
+            " and real_no = #{realNo}",
+            "</when>",
+            "</where>",
+            " ORDER BY confirm_time DESC",
+            "</script>"})
+    List<Map<String, Object>> selectDispensingRecordsByAssociation(Map<String, Object> queryParams);
+
+    /**
+     * @Description 根据关联字段查询追溯码记录
+     * 
+     * 功能说明:通过关联字段查询 mz_drug_trac_codg 表中的药品追溯码记录
+     * 
+     * 关联字段说明:
+     * - patientId: 患者ID,来自 mz_charge_detail.patient_id 表
+     * - times: 就诊次数,来自 mz_charge_detail.times 表
+     * - receiptNo: 发票分票号,来自 mz_charge_detail.receipt_no 表
+     * - orderNo: 处方号,来自 mz_charge_detail.order_no 表
+     * - chargeItemCode: 收费项目编码,来自 mz_charge_detail.charge_item_code 表
+     * - realNo: 流水号,来自 mz_charge_detail.real_no 表
+     * 
+     * 查询的数据表:mz_drug_trac_codg(药品追溯码表)
+     * 表字段说明:
+     * - patient_id: 患者ID
+     * - times: 就诊次数
+     * - receipt_no: 发票分票号
+     * - order_no: 处方号
+     * - charge_item_code: 收费项目编码
+     * - real_no: 流水号
+     * - drug_trac_codg: 药品追溯码
+     * - create_date: 创建时间
+     * - create_id: 创建人ID
+     * - flag: 标志位
+     * 
+     * 调用场景:
+     * 1. 医保接口调用后,需要查询具体的追溯码记录进行审计
+     * 2. 药品监管部门需要查看特定发药记录的追溯码信息
+     * 3. 药品追溯和监管,确保药品来源的可追溯性
+     * 
+     * 调用接口:/thmz/getDispensingRecordByAssociation
+     * 
+     * @param queryParams 包含关联字段的查询参数
+     * @return List<Map<String, Object>> 追溯码记录列表
+     * @Author hsh
+     * @Date 2025/2/27 15:30
+     */
+    @Select({"<script>",
+            "SELECT * FROM mz_drug_trac_codg WITH(NOLOCK)",
+            "<where>",
+            "<when test='patientId != null'>",
+            " and patient_id = #{patientId}",
+            "</when>",
+            "<when test='times != null'>",
+            " and times = #{times}",
+            "</when>",
+            "<when test='receiptNo != null'>",
+            " and receipt_no = #{receiptNo}",
+            "</when>",
+            "<when test='orderNo != null'>",
+            " and order_no = #{orderNo}",
+            "</when>",
+            "<when test='chargeItemCode != null'>",
+            " and charge_item_code = #{chargeItemCode}",
+            "</when>",
+            "<when test='realNo != null'>",
+            " and real_no = #{realNo}",
+            "</when>",
+            "</where>",
+            " ORDER BY create_date DESC",
+            "</script>"})
+    List<Map<String, Object>> selectTracCodgRecordsByAssociation(Map<String, Object> queryParams);
 }

+ 18 - 0
src/main/java/cn/hnthyy/thmz/service/his/mz/MzPharmacyService.java

@@ -232,4 +232,22 @@ public interface MzPharmacyService {
      */
     List<Map<String, Object>> queryYpManuBarCodeByTracCodg(Map<String, Object> queryParams);
 
+    /**
+     * @Description 根据关联字段查询发药统计记录
+     * @Author hsh
+     * @param queryParams 关联字段查询参数
+     * @return
+     * @Date 2025/2/27 15:30
+     */
+    List<Map<String, Object>> queryDispensingRecordsByAssociation(Map<String, Object> queryParams);
+
+    /**
+     * @Description 根据关联字段查询追溯码记录
+     * @Author hsh
+     * @param queryParams 关联字段查询参数
+     * @return
+     * @Date 2025/2/27 15:30
+     */
+    List<Map<String, Object>> queryTracCodgRecordsByAssociation(Map<String, Object> queryParams);
+
 }

+ 10 - 0
src/main/java/cn/hnthyy/thmz/service/impl/his/mz/MzPharmacyServiceImpl.java

@@ -513,4 +513,14 @@ public class MzPharmacyServiceImpl implements MzPharmacyService {
     public List<Map<String, Object>> queryYpManuBarCodeByTracCodg(Map<String, Object> queryParams) {
         return mzPharmacyMapper.selectYpManuBarCodeByTracCodg(queryParams);
     }
+
+    @Override
+    public List<Map<String, Object>> queryDispensingRecordsByAssociation(Map<String, Object> queryParams) {
+        return mzPharmacyMapper.selectDispensingRecordsByAssociation(queryParams);
+    }
+
+    @Override
+    public List<Map<String, Object>> queryTracCodgRecordsByAssociation(Map<String, Object> queryParams) {
+        return mzPharmacyMapper.selectTracCodgRecordsByAssociation(queryParams);
+    }
 }

+ 50 - 0
src/main/java/cn/hnthyy/thmz/service/yb/YbService.java

@@ -31,9 +31,44 @@ public class YbService {
     @Autowired
     private SelinfoSoldMapper selinfoSoldMapper;
 
+    /**
+     * 医保商品销售接口
+     * 功能说明:将发药信息上报给医保系统,实现医保结算
+     * 
+     * 关联字段说明:
+     * - patientId: 患者ID,来自 mz_charge_detail.patient_id
+     * - times: 就诊次数,来自 mz_charge_detail.times  
+     * - receiptNo: 发票分票号,来自 mz_charge_detail.receipt_no
+     * - orderNo: 处方号,来自 mz_charge_detail.order_no
+     * - chargeItemCode: 收费项目编码,来自 mz_charge_detail.charge_item_code
+     * - realNo: 流水号,来自 mz_charge_detail.real_no
+     * 
+     * 关联查询接口:
+     * - /thmz/getDispensingRecordByAssociation: 通过关联字段查询发药记录
+     * 
+     * 关联数据表:
+     * - yp_mz_fytj: 发药统计表,记录发药数量、金额等统计信息
+     * - mz_drug_trac_codg: 药品追溯码表,记录药品追溯码信息
+     * - mz_charge_detail: 收费明细表,记录收费项目详细信息
+     * 
+     * 业务流程:
+     * 1. 前端发药页面调用 /thmz/sendMedicineProcessing 进行发药处理
+     * 2. 发药成功后调用此接口上报医保系统
+     * 3. 医保系统记录关联字段,便于后续查询和审计
+     * 4. 可通过关联字段查询具体的发药记录和追溯码信息
+     * 
+     * @param selInfo 医保销售信息对象,包含关联字段和药品追溯码信息
+     * @return ResultVo 医保接口调用结果
+     */
     public ResultVo saleGoodsItem(SelinfoSold selInfo) {
         ResultVo response = null;
 
+        // 记录关联字段信息(用于关联发药记录)
+        // 这些字段用于后续查询发药记录,确保医保记录与发药记录的一一对应
+        log.info("医保接口调用 - 关联字段: patientId={}, times={}, receiptNo={}, orderNo={}, chargeItemCode={}, realNo={}", 
+                selInfo.getPatientId(), selInfo.getTimes(), selInfo.getReceiptNo(), 
+                selInfo.getOrderNo(), selInfo.getChargeItemCode(), selInfo.getRealNo());
+
         List<DrugTracCodg> drugTracCodgList = selInfo.getDrugtracinfo();
         if(drugTracCodgList == null || drugTracCodgList.isEmpty()) {
             response = new ResultVo(-1, "追溯码不能为空");
@@ -72,6 +107,14 @@ public class YbService {
         String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
         selInfo.setSelRetnTime(now);
 
+        // 构建关联键(用于后续查询发药记录)
+        // 关联键格式:patientId=xxx&times=xxx&receiptNo=xxx&orderNo=xxx&chargeItemCode=xxx&realNo=xxx
+        // 用途:用于日志记录和后续查询发药记录,确保医保记录与发药记录的可追溯性
+        // 查询接口:/thmz/getDispensingRecordByAssociation 可通过此关联键查询具体的发药记录
+        String associationKey = String.format("patientId=%s&times=%s&receiptNo=%s&orderNo=%s&chargeItemCode=%s&realNo=%s",
+                selInfo.getPatientId(), selInfo.getTimes(), selInfo.getReceiptNo(),
+                selInfo.getOrderNo(), selInfo.getChargeItemCode(), selInfo.getRealNo());
+        log.info("医保接口 - 关联键: {}", associationKey);
 
         String realUrl = siInventoryServiceUrl + "/saleGoodsItem";
         try {
@@ -83,9 +126,16 @@ public class YbService {
                 responseCode = ybResultJson.getInteger("code");
             }
             response = new ResultVo(responseCode, ybResultJson.getString("message"));
+            
+            // 记录医保接口调用结果
+            // 通过关联键可以快速定位具体的发药记录,便于问题排查和审计
+            log.info("医保接口调用结果 - 关联键: {}, 结果: {}", associationKey, response);
+            
         } catch (Exception e) {
             e.printStackTrace();
             response = new ResultVo(-1, "商品销售失败");
+            // 记录错误信息时包含关联键,便于快速定位问题
+            log.error("医保接口调用失败 - 关联键: {}, 错误: {}", associationKey, e.getMessage());
         }
         /*String id = UUID.randomUUID().toString().replaceAll("-", "");
         selInfo.setId(id);

+ 19 - 1
src/main/resources/static/js/mz/west_pharmacy_send.js

@@ -3124,6 +3124,16 @@ function callYbSaleGoodsItem(realNo, orderNo, receiptNo, times, patientId, name,
     for (let i = 0; i < tableData.length; i++) {
         let item = tableData[i];
         
+        // 构建关联字段组合(用于关联发药记录)
+        let patientId = item.patientId || patientId;
+        let times = item.times || times;
+        let receiptNo = item.receiptNo || receiptNo;
+        let orderNo = item.orderNo || orderNo;
+        let chargeItemCode = item.chargeItemCode;
+        let realNo = item.realNo || realNo;
+        
+        console.log('发药关联键:', {patientId, times, receiptNo, orderNo, chargeItemCode, realNo});
+        
         // 参数验证
         // 从处方明细数据中获取开方医师姓名
         let doctorName = item.doctorName || item.employeeName || '';
@@ -3137,8 +3147,16 @@ function callYbSaleGoodsItem(realNo, orderNo, receiptNo, times, patientId, name,
             currentUserName = '未知药师';
         }
         
-        // 构建医保接口参数(只传递必需参数)
+        // 构建医保接口参数
         let ybData = {
+            // 关联字段 - 直接传递到医保接口
+            patientId: patientId,
+            times: times,
+            receiptNo: receiptNo,
+            orderNo: orderNo,
+            chargeItemCode: chargeItemCode,
+            realNo: realNo,
+            
             // 医疗目录编码(医保编码)
             medListCodg: item.nationalCode,