Procházet zdrojové kódy

Merge remote-tracking branch 'origin/ScrmStores' into ScrmStores

吴树波 před 1 týdnem
rodič
revize
c2eced8dcc

+ 4 - 5
fs-common/src/main/java/com/fs/common/utils/txocr/TxOcrClient.java

@@ -150,7 +150,7 @@ public class TxOcrClient  {
                 result.setSetDate(resp.getSetDate());
                 return result;
             }
-            if(StringUtils.isNotEmpty(keywords) && StringUtils.isEmpty(business)){
+            if(StringUtils.isNotEmpty(keywords) && StringUtils.isNotEmpty(business)){
                 result.setKeywords(keywords);
                 result.setBusinessStr(business);
                 result.setFlag(business.contains(keywords));
@@ -248,10 +248,9 @@ public class TxOcrClient  {
         return null;
     }
 
-//
-//    public static void main(String[] args) {
-//        ExtractDocBasic("https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/fs/20251125/1c3009ab4a964c12b05b8f7fd8e9f7ce.jpg");
-//    }
+    public static void main(String[] args) {
+        ExtractDocBasic("https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/fs/20251113/1843e1df1e14477cb024a928ef9f151a.jpg");
+    }
 
     /**
      * ClassifyDetectOCR

+ 22 - 0
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/AbstractHandler.java

@@ -0,0 +1,22 @@
+package com.fs.hisStore.service.categoryVal;
+
+import com.fs.common.utils.txocr.ContainsResult;
+import org.springframework.beans.factory.InitializingBean;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/11/28 下午2:19
+ */
+public abstract class AbstractHandler implements InitializingBean {
+
+    /**
+     * 校验
+     * @param cateName 分类名称
+     * @param storeId 店铺id
+     */
+    public ContainsResult check(String cateName, Long storeId){
+        throw new UnsupportedOperationException();
+    }
+
+}

+ 73 - 0
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/CommonCheck.java

@@ -0,0 +1,73 @@
+package com.fs.hisStore.service.categoryVal;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.fs.common.utils.txocr.ContainsResult;
+import com.fs.common.utils.txocr.TxOcrClient;
+import com.fs.hisStore.domain.FsStoreScrm;
+import com.fs.hisStore.domain.FsStoreScrmOcr;
+import com.fs.hisStore.mapper.FsStoreScrmOcrMapper;
+import com.fs.hisStore.service.impl.FsStoreScrmServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: 非特殊都直接从公共验证中获取
+ * @author: Guos
+ * @time: 2025/11/28 下午3:24
+ */
+@Component
+public class CommonCheck extends AbstractHandler {
+
+    @Lazy
+    @Autowired
+    private FsStoreScrmServiceImpl fsStoreScrmService;
+
+    @Autowired
+    private FsStoreScrmOcrMapper fsStoreScrmOcrMapper;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        ProductCategoryCheckFactory.register("1101165230", this);
+    }
+
+    /**
+     * 校验
+     *
+     * @param cateName 分类名称
+     * @param storeId  店铺id
+     */
+    public ContainsResult check(String cateName, Long storeId) {
+        FsStoreScrm fsStoreScrm = fsStoreScrmService.selectFsStoreByStoreId(storeId);
+
+        //通过店铺id获取上传的药品经营许可证。
+        String drugLicenseUrl = fsStoreScrm.getDrugLicense();
+
+        FsStoreScrmOcr fsStoreScrmOcr = fsStoreScrmOcrMapper.selectByIdAndUrl(storeId, drugLicenseUrl, null);
+        //没有搜索到就调用一次识别
+        ContainsResult result = new ContainsResult();
+        result.setKeywords(cateName);
+
+        if(ObjectUtil.isEmpty(fsStoreScrmOcr)){
+            String ocrResult = TxOcrClient.ExtractDocBasic(drugLicenseUrl);
+            if(null != ocrResult){
+                boolean equalsR = ocrResult.contains(cateName);
+                result.setFlag(equalsR);
+                result.setMessage(equalsR?"识别成功,包含所属!":"对比失败,不包含你所选类目");
+                result.setBusinessStr(ocrResult);
+            }else{
+                result.setFlag(false);
+                result.setMessage("请上传正确药品经营许可证!");
+            }
+        }else{
+            result.setBusinessStr(fsStoreScrmOcr.getDrugLicenseTxt());
+            boolean equalsR = fsStoreScrmOcr.getDrugLicenseTxt().contains(cateName);
+            result.setFlag(equalsR);
+            result.setMessage(equalsR?"识别成功,包含所属!":"对比失败,不包含你所选类目");
+            return result;
+        }
+        //调用对比,看经营范围是否包含这个类别
+        return result;
+    }
+
+}

+ 29 - 0
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/IIIMedicalDeviceCheck.java

@@ -0,0 +1,29 @@
+package com.fs.hisStore.service.categoryVal;
+
+import com.fs.common.utils.txocr.ContainsResult;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/11/28 下午2:21
+ */
+@Component
+public class IIIMedicalDeviceCheck extends AbstractHandler{
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        ProductCategoryCheckFactory.register("233", this);
+    }
+
+    /**
+     * 校验
+     * @param cateName
+     * @param storeId
+     */
+    public ContainsResult check(String cateName, Long storeId){
+        System.out.println("3类器械验证");
+        return null;
+    }
+
+}

+ 29 - 0
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/IIMedicalDeviceCheck.java

@@ -0,0 +1,29 @@
+package com.fs.hisStore.service.categoryVal;
+
+import com.fs.common.utils.txocr.ContainsResult;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/11/28 下午2:21
+ */
+@Component
+public class IIMedicalDeviceCheck extends AbstractHandler{
+
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        ProductCategoryCheckFactory.register("232", this);
+    }
+
+    /**
+     * 校验
+     * @param cateName
+     * @param storeId
+     */
+    public ContainsResult check(String cateName, Long storeId){
+        System.out.println("2类器械验证");
+        return null;
+    }
+}

+ 62 - 0
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/IMedicalDeviceCheck.java

@@ -0,0 +1,62 @@
+package com.fs.hisStore.service.categoryVal;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.fs.common.utils.txocr.ContainsResult;
+import com.fs.common.utils.txocr.TxOcrClient;
+import com.fs.hisStore.domain.FsStoreScrm;
+import com.fs.hisStore.domain.FsStoreScrmOcr;
+import com.fs.hisStore.mapper.FsStoreScrmOcrMapper;
+import com.fs.hisStore.service.impl.FsStoreScrmServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: 1类器械验证 1类需要验证的时间是经营许可证是否有“第一类医疗器械销售”
+ * @author: Guos
+ * @time: 2025/11/28 下午2:21
+ */
+@Slf4j
+@Component
+public class IMedicalDeviceCheck extends AbstractHandler{
+
+    @Autowired
+    private FsStoreScrmOcrMapper fsStoreScrmOcrMapper;
+
+    @Lazy
+    @Autowired
+    private FsStoreScrmServiceImpl fsStoreScrmService;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        ProductCategoryCheckFactory.register("202", this);
+    }
+
+    private static final String I_MEDICAL_DEVICE = "第一类医疗器械销售";
+
+    /**
+     * 校验
+     * @param cateName
+     * @param storeId
+     */
+    public ContainsResult check(String cateName, Long storeId){
+        FsStoreScrmOcr fsStoreScrmOcr = fsStoreScrmOcrMapper.selectById(storeId);
+        if (ObjectUtil.isEmpty(fsStoreScrmOcr)) {
+            FsStoreScrm fsStoreScrm = fsStoreScrmService.selectFsStoreByStoreId(storeId);
+            //没有就直接去查询,然后调用识别
+            String businessLicense = fsStoreScrm.getBusinessLicense();
+            return TxOcrClient.isContains(businessLicense, I_MEDICAL_DEVICE);
+        }else{
+            String businessLicenseTxt = fsStoreScrmOcr.getBusinessLicenseTxt();
+            boolean containsFlag = businessLicenseTxt.contains(I_MEDICAL_DEVICE);
+            ContainsResult result = new ContainsResult();
+            result.setKeywords(cateName);
+            result.setFlag(containsFlag);
+            result.setMessage(containsFlag?"识别成功,包含所属!":"对比失败,不包含你所选类目");
+            result.setBusinessStr(businessLicenseTxt);
+            return result;
+        }
+    }
+
+}

+ 30 - 0
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/ProductCategoryCheckFactory.java

@@ -0,0 +1,30 @@
+package com.fs.hisStore.service.categoryVal;
+
+import com.fs.common.utils.StringUtils;
+import com.google.common.collect.Maps;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.util.Map;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/11/28 下午2:14
+ */
+public class ProductCategoryCheckFactory {
+
+    private static Map<String, AbstractHandler> strategyMap = Maps.newHashMap();
+
+    public static AbstractHandler getInvokeStrategy(String key){
+        return strategyMap.get(key);
+    }
+
+    public static void register(String key, AbstractHandler handler){
+        if(StringUtils.isEmpty(key) || ObjectUtils.isEmpty(handler)){
+            return;
+        }
+        strategyMap.put(key, handler);
+    }
+
+
+}

+ 43 - 0
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/WellnessFoodCheck.java

@@ -0,0 +1,43 @@
+package com.fs.hisStore.service.categoryVal;
+
+import com.fs.common.utils.txocr.ContainsResult;
+import com.fs.hisStore.domain.FsStoreScrm;
+import com.fs.hisStore.service.impl.FsStoreScrmServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: 保健食品
+ * @author: Guos
+ * @time: 2025/11/28 下午3:06
+ */
+@Component
+public class WellnessFoodCheck extends AbstractHandler{
+
+    @Lazy
+    @Autowired
+    private FsStoreScrmServiceImpl fsStoreScrmService;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        ProductCategoryCheckFactory.register("201", this);
+    }
+
+    /**
+     * 校验
+     * @param cateName 分类名称
+     * @param storeId 店铺id
+     */
+    public ContainsResult check(String cateName, Long storeId){
+        FsStoreScrm fsStoreScrm = fsStoreScrmService.selectFsStoreByStoreId(storeId);
+        ContainsResult result = new ContainsResult();
+        boolean flag = StringUtils.isNotEmpty(fsStoreScrm.getFoodLicense());
+        result.setFlag(flag);
+        result.setMessage(flag ? "已上传健康食品经营许可证" : "未上传健康食品经营许可证");
+        //目前没有办法通过文档抽取保健食品中前面的打勾,只能判断是否上传,当然可以重写TxOcrClient.ExtractDocBasic方法。
+        return result;
+    }
+
+}

+ 11 - 92
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java

@@ -40,6 +40,8 @@ import com.fs.hisStore.dto.FsStoreProductScrmInfoDTO;
 import com.fs.hisStore.mapper.*;
 import com.fs.hisStore.param.FsStoreCartCountParam;
 import com.fs.hisStore.service.IFsStoreProductCategoryScrmService;
+import com.fs.hisStore.service.categoryVal.AbstractHandler;
+import com.fs.hisStore.service.categoryVal.ProductCategoryCheckFactory;
 import com.fs.hisStore.util.ForbiddenDrugListManager;
 import com.fs.hisStore.utils.StoreAuditLogUtil;
 import com.fs.hisStore.util.BusinessScopeProductTypeUtil;
@@ -488,19 +490,6 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         product.setBusinessLink(param.getBusinessLink());
         product.setCreateTime(new Date());
 
-        // 根据经营范围校验商品类型
-//        if (store != null && com.fs.common.utils.StringUtils.isNotEmpty(store.getSelectableProductTypes())) {
-//            String productTypeName = getProductTypeName(product.getCateId());
-//            if (com.fs.common.utils.StringUtils.isNotEmpty(productTypeName)) {
-//                // 直接使用工具类方法校验
-//                //boolean isAllowed = BusinessScopeProductTypeUtil.isProductTypeAllowed(store.getSelectableProductTypes(), productTypeName);
-//                boolean isAllowed = validateShopBusinessScope(store.getBusinessScope(), productTypeName);
-//                if (!isAllowed) {
-//                    return R.error("该商品类型[" + productTypeName + "]不在店铺经营范围允许的商品类型内,请联系管理员核实经营范围");
-//                }
-//            }
-//        }
-
         //判断是否是纯正堂非药品商品不审核
         if(CZT.equals(cloudHostProper.getCompanyName()) || param.getIsDrug() != 1){
             product.setIsAudit("1");
@@ -571,57 +560,6 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         }
     }
 
-    /**
-     * 校验店铺添加药品是否含有祥光资质
-     * @param businessScope
-     * @param productTypeName
-     * @return
-     */
-    public Boolean validateShopBusinessScope(String businessScope, String productTypeName) {
-        Set<String> judgmentSet = new HashSet<>();
-        Boolean res = Boolean.FALSE;
-        switch (productTypeName) {
-            case "中成药":
-                judgmentSet.add("中成药");
-                break;
-            case "处方药":
-                judgmentSet.add("处方药");
-                judgmentSet.add("化学药制剂");
-                break;
-            case "中药饮片":
-                judgmentSet.add("中药饮片");
-                break;
-            case "保健食品":
-                judgmentSet.add("保健食品销售");
-                break;
-            case "I类器械":
-                judgmentSet.add("第一类医疗器械销售");
-                break;
-            case "II类器械":
-                judgmentSet.add("第二类医疗器械销售");
-                break;
-            case "III类器械":
-                judgmentSet.add("第三类医疗器械经营");
-                break;
-            case "甲类非处方":
-                judgmentSet.add("化学药制剂");
-                judgmentSet.add("甲类非处方药");
-                break;
-            case "乙类非处方":
-                judgmentSet.add("化学药制剂");
-                judgmentSet.add("乙类非处方药");
-                break;
-        }
-
-        if(null != judgmentSet && !judgmentSet.isEmpty()){
-           for(String item:judgmentSet){
-               res = businessScope.contains(item);
-               if(res) break;
-           }
-        }
-        return res;
-    }
-
     private void addProductAttr(Long productId, List<ProductArrtDTO> items, List<FsStoreProductAttrValueScrm> values,Long storeId){
         //清空attr
         fsStoreProductAttrMapper.clear(productId);
@@ -1495,7 +1433,7 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
     }
 
     /**
-     * 判断该药店的经营许可证是否允许上架该商品
+     * 判断该药店的经营许可证是否允许上架该商品(店铺和总后端都用到了)
      * @param storeId 店铺Id
      * @param cateId 分类id
      */
@@ -1505,34 +1443,15 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         FsStoreProductCategoryScrm fsStoreProductCategoryScrm = fsStoreProductCategoryService.selectFsStoreProductCategoryById(cateId);
         String cateName = fsStoreProductCategoryScrm.getCateName();//分类名称
         //拿到分类名称,直接调用之前店铺编辑和新增接口中调用识别存到识别表的结果。
-        //通过店铺id获取上传的药品经营许可证。
-        FsStoreScrm fsStoreScrm = fsStoreScrmService.selectFsStoreByStoreId(storeId);
-        String drugLicenseUrl = fsStoreScrm.getDrugLicense();
-        FsStoreScrmOcr fsStoreScrmOcr = fsStoreScrmOcrMapper.selectByIdAndUrl(storeId, drugLicenseUrl, null);
-        //没有搜索到就调用一次识别
-        ContainsResult result = new ContainsResult();
-        result.setKeywords(cateName);
-
-        if(ObjectUtil.isEmpty(fsStoreScrmOcr)){
-            String ocrResult = TxOcrClient.ExtractDocBasic(drugLicenseUrl);
-            if(null != ocrResult){
-                boolean equalsR = ocrResult.contains(cateName);
-                result.setFlag(equalsR);
-                result.setMessage(equalsR?"识别成功,包含所属!":"对比失败,不包含你所选类目");
-                result.setBusinessStr(ocrResult);
-            }else{
-                result.setFlag(false);
-                result.setMessage("请上传正确药品经营许可证!");
-            }
-        }else{
-            result.setBusinessStr(fsStoreScrmOcr.getDrugLicenseTxt());
-            boolean equalsR = fsStoreScrmOcr.getDrugLicenseTxt().contains(cateName);
-            result.setFlag(equalsR);
-            result.setMessage(equalsR?"识别成功,包含所属!":"对比失败,不包含你所选类目");
-            return result;
+        //这里需要区别一下,什么情况下需要识别营业执照,什么情况下识别经营许可证,什么情况下两个都需要,甚至包含食品的证
+        //新增分类校验就去 categoryVal 包下面去新加
+        try{
+            AbstractHandler invokeStrategy = ProductCategoryCheckFactory.getInvokeStrategy(String.valueOf(cateId));
+            return invokeStrategy.check(cateName, storeId);
+        }catch (NullPointerException e){
+            AbstractHandler invokeStrategy = ProductCategoryCheckFactory.getInvokeStrategy(String.valueOf("1101165230"));
+            return invokeStrategy.check(cateName, storeId);
         }
-        //调用对比,看经营范围是否包含这个类别
-        return result;
     }
 
     @Override