Ver Fonte

580开方兼容优化

yjwang há 1 dia atrás
pai
commit
c267c7a8a2

+ 2 - 2
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java

@@ -285,8 +285,8 @@ public class FsStoreProductScrmController extends BaseController {
             logParamExpression = "#p0.length>1?new String[]{'商品','同步商品到580医院'}: new String[]{'商品','同步商品到580医院'}")
     @PostMapping("/sync580/{productIds}")
     public R sync(@PathVariable Long[] productIds) {
-        fsStoreHospital580ScrmService.SynDrugToHospital580(productIds);
-        return R.ok("同步成功");
+        String msg = fsStoreHospital580ScrmService.syncDrugsWithAuditCheck(productIds);
+        return R.ok(msg);
     }
 
     /**

+ 20 - 0
fs-service/src/main/java/com/fs/hospital580/dto/MedicineAuditQueryDto.java

@@ -0,0 +1,20 @@
+package com.fs.hospital580.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 4.8 查询药品审核信息接口请求DTO
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MedicineAuditQueryDto extends CommonDto implements Serializable {
+
+    /**
+     * 三方药品ID集合,根据三方提供的药品编码查询审核状态。如果List为空,则查询全部。
+     */
+    private List<String> medicineIdList;
+}

+ 11 - 0
fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580ProductPushScrmMapper.java

@@ -3,6 +3,10 @@ package com.fs.hospital580.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.hospital580.entity.Hospital580ProductPushScrmEntity;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Collection;
+import java.util.List;
 
 /**
  * <p>
@@ -15,4 +19,11 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface Hospital580ProductPushScrmMapper extends BaseMapper<Hospital580ProductPushScrmEntity> {
 
+    /**
+     * 批量查询每个商品的最新一条推送记录(数据库层面去重,避免全量加载)
+     *
+     * @param productIds 商品ID集合
+     * @return 每个商品最新的推送记录列表
+     */
+    List<Hospital580ProductPushScrmEntity> selectLatestByProductIds(@Param("productIds") Collection<Long> productIds);
 }

+ 10 - 0
fs-service/src/main/java/com/fs/hospital580/service/Hospital580ProductPushScrmService.java

@@ -3,6 +3,9 @@ package com.fs.hospital580.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.hospital580.entity.Hospital580ProductPushScrmEntity;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * <p>
  * 商品推送记录 服务类
@@ -13,4 +16,11 @@ import com.fs.hospital580.entity.Hospital580ProductPushScrmEntity;
  */
 public interface Hospital580ProductPushScrmService extends IService<Hospital580ProductPushScrmEntity> {
 
+    /**
+     * 批量查询每个商品的最新一条推送记录(数据库层面去重)
+     *
+     * @param productIds 商品ID集合
+     * @return 每个商品最新的推送记录列表
+     */
+    List<Hospital580ProductPushScrmEntity> selectLatestByProductIds(Collection<Long> productIds);
 }

+ 12 - 0
fs-service/src/main/java/com/fs/hospital580/service/Hospital580ScrmService.java

@@ -17,4 +17,16 @@ public interface Hospital580ScrmService extends IService<Hospital580ScrmEntity>
      */
     void SynDrugToHospital580(Long[] productIds);
     // void SynDrugToHospital580(List<FsStoreProductScrm> productScrms);
+
+    /**
+     * 同步药品到580医院(带审核状态校验)
+     * 1. 调用580查询药品审核信息接口,获取580审核状态
+     * 2. 查询本地最新推送记录,找出push_status=2(失败)的商品
+     * 3. 对580审核通过但本地标记为失败的记录,更新push_status为1
+     * 4. 过滤掉同步状态不为2的商品,只重新同步push_status=2且580未审核通过的商品
+     *
+     * @param productIds 待同步的商品ID数组
+     * @return 处理结果描述
+     */
+    String syncDrugsWithAuditCheck(Long[] productIds);
 }

+ 8 - 0
fs-service/src/main/java/com/fs/hospital580/service/Hospital580Service.java

@@ -2,6 +2,9 @@ package com.fs.hospital580.service;
 
 
 import com.fs.hospital580.dto.*;
+import com.fs.hospital580.vo.MedicineAuditStatusVo;
+
+import java.util.List;
 
 public interface Hospital580Service {
     /**
@@ -23,4 +26,9 @@ public interface Hospital580Service {
      * 查询聊天记录
      */
     Result580 textRecord(TextRecordDto dto);
+
+    /**
+     * 4.8 查询药品审核信息接口-580提供
+     */
+    List<MedicineAuditStatusVo> queryAuditStatus(MedicineAuditQueryDto dto);
 }

+ 10 - 0
fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580ProductPushScrmServiceImpl.java

@@ -6,6 +6,9 @@ import com.fs.hospital580.mapper.Hospital580ProductPushScrmMapper;
 import com.fs.hospital580.service.Hospital580ProductPushScrmService;
 import org.springframework.stereotype.Service;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * <p>
  * 商品推送记录 服务实现类
@@ -17,4 +20,11 @@ import org.springframework.stereotype.Service;
 @Service
 public class Hospital580ProductPushScrmServiceImpl extends ServiceImpl<Hospital580ProductPushScrmMapper, Hospital580ProductPushScrmEntity> implements Hospital580ProductPushScrmService {
 
+    @Override
+    public List<Hospital580ProductPushScrmEntity> selectLatestByProductIds(Collection<Long> productIds) {
+        if (productIds == null || productIds.isEmpty()) {
+            return java.util.Collections.emptyList();
+        }
+        return baseMapper.selectLatestByProductIds(productIds);
+    }
 }

+ 71 - 0
fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580ScrmServiceImpl.java

@@ -1,9 +1,11 @@
 package com.fs.hospital580.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.hisStore.domain.FsStoreProductScrm;
 import com.fs.hisStore.service.IFsStoreProductScrmService;
 import com.fs.hospital580.dto.Medicine;
+import com.fs.hospital580.dto.MedicineAuditQueryDto;
 import com.fs.hospital580.dto.MedicineDto;
 import com.fs.hospital580.dto.Result580;
 import com.fs.hospital580.entity.Hospital580ProductPushScrmEntity;
@@ -13,11 +15,17 @@ import com.fs.hospital580.mapper.MedicineMapper;
 import com.fs.hospital580.service.Hospital580ProductPushScrmService;
 import com.fs.hospital580.service.Hospital580ScrmService;
 import com.fs.hospital580.service.Hospital580Service;
+import com.fs.hospital580.vo.MedicineAuditStatusVo;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -29,6 +37,7 @@ import java.util.stream.Collectors;
  * @since 2025-09-25
  */
 @Service
+@Slf4j
 public class Hospital580ScrmServiceImpl extends ServiceImpl<Hospital580ScrmMapper, Hospital580ScrmEntity> implements Hospital580ScrmService {
 
     @Autowired
@@ -80,4 +89,66 @@ public class Hospital580ScrmServiceImpl extends ServiceImpl<Hospital580ScrmMappe
                 .map(MedicineMapper.INSTANCE::toMedicine)
                 .collect(Collectors.toList());
     }
+
+    @Override
+    public String syncDrugsWithAuditCheck(Long[] productIds) {
+        if (productIds == null || productIds.length == 0) {
+            return "同步成功";
+        }
+
+        List<Long> productIdList = Arrays.asList(productIds);
+
+        //调用580查询药品审核信息接口
+        List<String> medicineIdList = productIdList.stream()
+                .map(String::valueOf)
+                .collect(Collectors.toList());
+        MedicineAuditQueryDto auditQueryDto = new MedicineAuditQueryDto();
+        auditQueryDto.setMedicineIdList(medicineIdList);
+        List<MedicineAuditStatusVo> auditStatusList = hospital580Service.queryAuditStatus(auditQueryDto);
+
+        //获取580审核通过的药品ID集合(auditStatus=1)
+        Set<String> approvedMedicineIds = auditStatusList.stream()
+                .filter(vo -> vo.getAuditStatus() != null && vo.getAuditStatus() == 1)
+                .map(MedicineAuditStatusVo::getMedicineId)
+                .collect(Collectors.toSet());
+
+        //查询本地最新推送状态
+        List<Hospital580ProductPushScrmEntity> latestPushRecords = pushScrmService.selectLatestByProductIds(productIdList);
+        Map<Long, Hospital580ProductPushScrmEntity> latestPushMap = latestPushRecords.stream()
+                .collect(Collectors.toMap(
+                        Hospital580ProductPushScrmEntity::getProductId,
+                        Function.identity(),
+                        (existing, replacement) -> existing
+                ));
+
+        //对push_status=2(失败)且580审核通过(auditStatus=1)的记录,更新push_status为1
+        List<Long> idsToUpdate = latestPushMap.values().stream()
+                .filter(entity -> entity.getPushStatus() != null && entity.getPushStatus() == 2)
+                .filter(entity -> approvedMedicineIds.contains(String.valueOf(entity.getProductId())))
+                .map(Hospital580ProductPushScrmEntity::getId)
+                .collect(Collectors.toList());
+        if (!idsToUpdate.isEmpty()) {
+            pushScrmService.update(new LambdaUpdateWrapper<Hospital580ProductPushScrmEntity>()
+                    .in(Hospital580ProductPushScrmEntity::getId, idsToUpdate)
+                    .set(Hospital580ProductPushScrmEntity::getPushStatus, (byte) 1)
+                    .set(Hospital580ProductPushScrmEntity::getUpdateTime, LocalDateTime.now())
+            );
+            log.info("已更新{}条580审核通过但本地标记为失败的推送记录为成功", idsToUpdate.size());
+        }
+
+        //过滤掉同步状态不为2的商品,只保留push_status=2且580未审核通过的商品进行重新同步
+        List<Long> productIdsToSync = latestPushMap.values().stream()
+                .filter(entity -> entity.getPushStatus() != null && entity.getPushStatus() == 2)
+                .filter(entity -> !approvedMedicineIds.contains(String.valueOf(entity.getProductId())))
+                .map(Hospital580ProductPushScrmEntity::getProductId)
+                .collect(Collectors.toList());
+
+        if (productIdsToSync.isEmpty()) {
+            return "没有需要同步的商品(已过滤掉非失败状态及580已审核通过的商品)";
+        }
+
+        Long[] syncArray = productIdsToSync.toArray(new Long[0]);
+        SynDrugToHospital580(syncArray);
+        return "同步成功";
+    }
 }

+ 55 - 0
fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580ServiceImpl.java

@@ -2,11 +2,14 @@ package com.fs.hospital580.service.impl;
 
 
 import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.fs.hospital580.config.Hospital580Config;
 import com.fs.hospital580.dto.*;
 import com.fs.hospital580.entity.Hospital580ScrmEntity;
 import com.fs.hospital580.service.Hospital580Service;
+import com.fs.hospital580.vo.MedicineAuditStatusVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -14,6 +17,8 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
 
 @Service
 @Slf4j
@@ -36,6 +41,10 @@ public class Hospital580ServiceImpl implements Hospital580Service {
     private static final String DISEASE_PATH = "/v2_0/ehospital/openapi/diagnosis/disease/query";
 
     private static final String TEXTRECORD_PATH = "/v1_0/ehospital/openapi/kz/textRecord/list";
+    /**
+     * 4.8 查询药品审核信息接口-580提供
+     */
+    private static final String MEDICINE_AUDIT_QUERY_PATH = "/v1_0/ehospital/openapi/kz/medicine/queryAuditStatus";
 
     @Override
     @Transactional(propagation = Propagation.NOT_SUPPORTED)
@@ -66,6 +75,52 @@ public class Hospital580ServiceImpl implements Hospital580Service {
         return requestResult580(dto, TEXTRECORD_PATH);
     }
 
+    @Override
+    @Transactional(propagation = Propagation.NOT_SUPPORTED)
+    public List<MedicineAuditStatusVo> queryAuditStatus(MedicineAuditQueryDto dto) {
+        dto.initCommonDto(hospital580Config.getClientId(), hospital580Config.getSecretKey());
+        String url = hospital580Config.getUrl() + MEDICINE_AUDIT_QUERY_PATH;
+        String body = JSONUtil.toJsonStr(dto);
+        String result;
+        List<MedicineAuditStatusVo> auditStatusList;
+        boolean requestStatus;
+        try {
+            log.info("请求580查询药品审核信息接口:{}", body);
+            result = HttpRequest.post(url)
+                    .body(body)
+                    .timeout(10000)
+                    .execute().body();
+            log.info("请求580查询药品审核信息接口返回:{}", result);
+            JSONObject jsonObject = JSONUtil.parseObj(result);
+            Integer err = jsonObject.getInt("err");
+            if (err != null && err == 0) {
+                JSONArray dataArr = jsonObject.getJSONArray("data");
+                auditStatusList = dataArr != null
+                        ? JSONUtil.toList(dataArr, MedicineAuditStatusVo.class)
+                        : Collections.emptyList();
+            } else {
+                log.warn("查询580药品审核信息失败:{}", result);
+                auditStatusList = Collections.emptyList();
+            }
+            requestStatus = true;
+        } catch (Exception e) {
+            log.error("请求580查询药品审核信息接口异常:", e);
+            auditStatusList = Collections.emptyList();
+            requestStatus = false;
+            result = "";
+        }
+        // 保存调用记录
+        Hospital580ScrmEntity build = Hospital580ScrmEntity.builder()
+                .request(url)
+                .requestParm(body)
+                .response(result)
+                .requestStatus(requestStatus)
+                .createTime(LocalDateTime.now())
+                .build();
+        build.insert();
+        return auditStatusList;
+    }
+
     private <T extends CommonDto> Result580 requestResult580(T t, String path) {
         t.initCommonDto(hospital580Config.getClientId(), hospital580Config.getSecretKey());
         String url = hospital580Config.getUrl() + path;

+ 22 - 0
fs-service/src/main/java/com/fs/hospital580/vo/MedicineAuditStatusVo.java

@@ -0,0 +1,22 @@
+package com.fs.hospital580.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 580药品审核状态VO
+ */
+@Data
+public class MedicineAuditStatusVo implements Serializable {
+
+    /**
+     * 三方药品ID
+     */
+    private String medicineId;
+
+    /**
+     * 审核状态:0为审核不通过,1为审核通过
+     */
+    private Integer auditStatus;
+}

+ 15 - 0
fs-service/src/main/resources/mapper/hospital580/Hospital580ProductPushScrmMapper.xml

@@ -18,4 +18,19 @@
         id, product_id, push_status, err_msg, create_time, update_time, request_id
     </sql>
 
+    <!-- 批量查询每个商品的最新一条推送记录,数据库层面去重 -->
+    <select id="selectLatestByProductIds" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List" />
+        FROM fs_store_hospital580_product_push_scrm
+        WHERE id IN (
+            SELECT MAX(id)
+            FROM fs_store_hospital580_product_push_scrm
+            WHERE product_id IN
+            <foreach collection="productIds" item="productId" open="(" separator="," close=")">
+                #{productId}
+            </foreach>
+            GROUP BY product_id
+        )
+    </select>
+
 </mapper>