Browse Source

增加3类验证,2类验证,同时增加器免查询列表,增加解释说明

Guos 1 week ago
parent
commit
e882bbcecc
17 changed files with 463 additions and 37 deletions
  1. 75 22
      README.md
  2. 35 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsExemptSecondMedicalDeviceController.java
  3. 2 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java
  4. 1 1
      fs-common/src/main/java/com/fs/common/utils/txocr/TxOcrClient.java
  5. 55 0
      fs-service/src/main/java/com/fs/hisStore/domain/ExemptSecondMedicalDevice.java
  6. 72 0
      fs-service/src/main/java/com/fs/hisStore/mapper/ExemptSecondMedicalDeviceMapper.java
  7. 5 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreProductAddEditParam.java
  8. 16 0
      fs-service/src/main/java/com/fs/hisStore/service/IExemptSecondMedicalDeviceService.java
  9. 2 1
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductScrmService.java
  10. 2 1
      fs-service/src/main/java/com/fs/hisStore/service/categoryVal/CommonCheck.java
  11. 34 3
      fs-service/src/main/java/com/fs/hisStore/service/categoryVal/IIIMedicalDeviceCheck.java
  12. 47 3
      fs-service/src/main/java/com/fs/hisStore/service/categoryVal/IIMedicalDeviceCheck.java
  13. 3 1
      fs-service/src/main/java/com/fs/hisStore/service/categoryVal/IMedicalDeviceCheck.java
  14. 2 1
      fs-service/src/main/java/com/fs/hisStore/service/categoryVal/WellnessFoodCheck.java
  15. 27 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/ExemptSecondMedicalDeviceServiceImpl.java
  16. 4 3
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  17. 81 0
      fs-service/src/main/resources/mapper/hisStore/ExemptSecondMedicalDeviceMapper.xml

+ 75 - 22
README.md

@@ -14,39 +14,92 @@
 | fs-service   | 所有的链接配置文件都在里面 | /                       |
 
 
-#### 安装教程
+#### 分支说明
 
-1.  xxxx
-2.  xxxx
+1.  ScrmStores 对应医健宝项目
 
 #### 使用说明
 
 1.  注意调整Memory的大小,以及堆内存大小
 2.  对于maven仓库缺少的jar包引用,需要拷贝现有的文件(拷贝后依然出现错误,直接删除错误包下的_remote.repositories文件)。
 
-#### 参与贡献
-
-1.  Fork 本仓库
-2.  新建 Feat_xxx 分支
-3.  提交代码
-4.  新建 Pull Request
 
 
 #### sql更新
 
--- 添加字段(修改企微的备注手机号码搜索时用到)
+```sql 
+    -- 添加字段(修改企微的备注手机号码搜索时用到)
+    ALTER TABLE qw_external_contact
+        ADD COLUMN search_mobile char(44)
+        GENERATED ALWAYS AS (
+            CAST(
+                    REGEXP_REPLACE(
+                            COALESCE(JSON_UNQUOTE(JSON_EXTRACT(remark_mobiles, '$[0]')), ''),
+                            '[^0-9]', ''
+                    ) AS CHAR(44)
+            )
+            ) VIRTUAL;
+
+    -- 创建索引
+    CREATE INDEX idx_search_mobile ON qw_external_contact(search_mobile);
+```
+
+
+
+##### 医疗器免(ScrmStores分支)
+```sql 
+    -- 1. 删表重建(确保数据全量覆盖)
+DROP TABLE IF EXISTS fs_exempt_second_medical_device;
+
+-- 2. 创建表(MySQL)
+CREATE TABLE IF NOT EXISTS fs_exempt_second_medical_device (
+                                                               id BIGINT AUTO_INCREMENT COMMENT '自增主键ID',
+                                                               serial_number INT NOT NULL COMMENT '产品序号(目录原始序号1-13)',
+                                                               product_name VARCHAR(100) NOT NULL COMMENT '产品名称',
+    directory_name VARCHAR(100) NOT NULL COMMENT '目录名称(含分类编号)',
+    product_description TEXT COMMENT '产品描述',
+    usage_str TEXT COMMENT '产品用途',
+    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (id)
+    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='免于经营备案的第二类医疗器械产品表';
+
+-- 3. 插入全量数据(序号1-13)
+INSERT INTO fs_exempt_second_medical_device (serial_number, product_name, directory_name, product_description, usage_str) VALUES
+-- 序号1:电子血压计
+(1, '电子血压计', '07 医用诊察和监护器械', '通常由阻塞袖带、传感器、充气泵、测量电路组成。采用示波法、柯式音法或类似的无创血压间接测量原理进行血压测量的电子设备。', '用于在手臂或手腕部位测量患者血压。'),
+-- 序号2:水银血压表
+(2, '水银血压表', '07 医用诊察和监护器械', '通常由阻塞袖带、听诊器、压力表组成。通过水银或机械表显示,采用柯式音法或类似的无创血压间接测量原理进行血压测量的设备。', '用于在手臂或手腕部位测量患者血压。'),
+-- 序号3:医用脱脂棉(无菌)
+(3, '医用脱脂棉(无菌)', '14 注输、护理和防护器械', '通常包括吸水性材料。为了方便使用,部分产品有供手持的组件。不含消毒剂。无菌提供,一次性使用。', '用于对皮肤、创面进行清洁处理。'),
+-- 序号4:医用脱脂纱布
+(4, '医用脱脂纱布', '14 注输、护理和防护器械', '通常为由医用脱脂棉纱布或脱脂棉与粘胶纤维混纺纱布经过裁切、折叠、包装、灭菌步骤加工制成的敷料。', '用于吸收手术过程中的体内渗出液,手术过程中承托器官、组织等。'),
+-- 序号5:脱脂棉纱布
+(5, '脱脂棉纱布', '14 注输、护理和防护器械', '通常为由医用脱脂棉纱布或脱脂棉与粘胶纤维混纺纱布经过裁切、折叠、包装、灭菌步骤加工制成的敷料。', '用于吸收手术过程中的体内渗出液,手术过程中承托器官、组织等。'),
+-- 序号6:避孕套
+(6, '避孕套', '18 妇产科、辅助生殖和避孕器械', '通常由天然胶乳或合成乳胶或聚氨酯薄膜制成,开口端为完整卷边的鞘套物。非无菌提供。', '用于生殖道局部范围内,用物理方法(机械阻挡)不让精子到达子宫口处,以此阻断精子和卵子相遇而达到避孕目的。'),
+-- 序号7:避孕帽
+(7, '避孕帽', '18 妇产科、辅助生殖和避孕器械', '通常由天然胶乳或合成乳胶或聚氨酯薄膜制成,开口端为完整卷边的鞘套物。非无菌提供。', '用于生殖道局部范围内,用物理方法(机械阻挡)不让精子到达子宫口处,以此阻断精子和卵子相遇而达到避孕目的。'),
+-- 序号8:电动轮椅
+(8, '电动轮椅', '19 医用康复器械', '通常由电机、蓄电池、控制系统、车轮、座椅、扶手、脚踏板等组成。可由乘坐者或护理者操作的、有一个或多个电机驱动,有座椅支撑。分为手动转向和动力转向。', '用于行动障碍患者转运、行走功能补偿。'),
+-- 序号9:手动轮椅
+(9, '手动轮椅', '19 医用康复器械', '通常由车轮、座椅、扶手、脚踏板等组成。以乘坐者手驱动、脚踏驱动或护理者手推为动力。至少有三个车轮。', '用于行动障碍患者转运、行走功能补偿。'),
+-- 序号10:血糖分析仪
+(10, '血糖分析仪', '22 临床检验器械', '通常由主机模块、电源模块、软件模块等组成。原理一般为电化学法、光反射技术、比色法等。不包含采血器具及适配试剂。', '与适配试剂配合使用,用于人体样本中待测物的定性和/或定量分析。'),
+-- 序号11:自测用血糖监测系统(血糖试纸)
+(11, '自测用血糖监测系统(血糖试纸)', '6840 体外诊断试剂', '产品用于定量检测新鲜毛细血管全血中的葡萄糖浓度(如可用于静脉血、动脉血、新生儿血检测也可进行详细描述),检测部位可以是手指、手掌及上臂等。', '只用于监测糖尿病人血糖控制的效果,而不能用于糖尿病的诊断和筛查,也不能作为治疗药物调整的依据。'),
+-- 序号12:人绒毛膜促性腺激素检测试剂(妊娠诊断试纸)
+(12, '人绒毛膜促性腺激素检测试剂(妊娠诊断试纸)', '6840 体外诊断试剂', '运用双抗体夹心免疫胶体金层析等技术实现对人尿液中人绒毛膜促性腺激素体外定性检测。', '不可用于滋养细胞肿瘤的检测。'),
+-- 序号13:促黄体生成素检测试剂(排卵检测试纸)
+(13, '促黄体生成素检测试剂(排卵检测试纸)', '6840 体外诊断试剂', '通过定性或半定量检测女性尿液中促黄体生成素的水平,以预测排卵时间。', '用于指导育龄女性选择最佳受孕时机或指导安全期避孕。');
+```
+
+
+
+
+
+
+
 
-ALTER TABLE qw_external_contact
-ADD COLUMN search_mobile char(44)
-GENERATED ALWAYS AS (
-CAST(
-REGEXP_REPLACE(
-COALESCE(JSON_UNQUOTE(JSON_EXTRACT(remark_mobiles, '$[0]')), ''),
-'[^0-9]', ''
-) AS CHAR(44)
-)
-) VIRTUAL;
 
--- 创建索引
 
-CREATE INDEX idx_search_mobile ON qw_external_contact(search_mobile);

+ 35 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsExemptSecondMedicalDeviceController.java

@@ -0,0 +1,35 @@
+package com.fs.hisStore.controller;
+
+import com.fs.common.core.domain.R;
+
+import com.fs.hisStore.domain.ExemptSecondMedicalDevice;
+import com.fs.hisStore.service.IExemptSecondMedicalDeviceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/11/29 上午9:43
+ */
+@RestController
+@RequestMapping("/store/store/exemptSecondMedicalDevice")
+public class FsExemptSecondMedicalDeviceController {
+
+    @Autowired
+    private IExemptSecondMedicalDeviceService fsExemptSecondMedicalDeviceService;
+
+    /**
+     * 查询列表
+     */
+    @GetMapping("/getList")
+    public R list() {
+        List<ExemptSecondMedicalDevice> exemptSecondMedicalDevices = fsExemptSecondMedicalDeviceService.selectAll();
+        return R.ok().put("data", exemptSecondMedicalDevices);
+    }
+
+}

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

@@ -92,7 +92,8 @@ public class FsStoreProductScrmController extends BaseController {
      */
     @PostMapping("/checkStoreDrugLicense")
     public R checkStoreDrugLicense(@RequestBody FsStoreProductAddEditParam fsStoreProduct) {
-        return R.ok().put("data", fsStoreProductService.checkStoreDrugLicense(fsStoreProduct.getStoreId(), fsStoreProduct.getCateId()));
+        return R.ok().put("data", fsStoreProductService.checkStoreDrugLicense(fsStoreProduct.getStoreId(), fsStoreProduct.getCateId(),
+                org.apache.commons.lang3.StringUtils.isEmpty(fsStoreProduct.getMedicalDeviceCode())?null:fsStoreProduct.getMedicalDeviceCode()));
     }
 
     /**

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

@@ -249,7 +249,7 @@ public class TxOcrClient  {
     }
 
     public static void main(String[] args) {
-        ExtractDocBasic("https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/fs/20251113/1843e1df1e14477cb024a928ef9f151a.jpg");
+        ExtractDocBasic("https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/fs/20251118/d175ed9771324c56a126779ef89bb1e3.jpg");
     }
 
     /**

+ 55 - 0
fs-service/src/main/java/com/fs/hisStore/domain/ExemptSecondMedicalDevice.java

@@ -0,0 +1,55 @@
+package com.fs.hisStore.domain;
+
+import lombok.Data;
+import java.time.LocalDateTime;
+
+
+/**
+ *
+ * @description: 免于经营备案的第二类医疗器械产品实体类
+ * @author: Guos
+ * @time: 2025/11/29 上午9:35
+ */
+@Data
+public class ExemptSecondMedicalDevice {
+    /**
+     * 自增主键ID
+     */
+    private Long id;
+
+    /**
+     * 产品序号(目录原始序号1-13)
+     */
+    private Integer serialNumber;
+
+    /**
+     * 产品名称
+     */
+    private String productName;
+
+    /**
+     * 目录名称(含分类编号,如“07 医用诊察和监护器械”)
+     */
+    private String directoryName;
+
+    /**
+     * 产品描述
+     */
+    private String productDescription;
+
+    /**
+     * 产品用途
+     */
+    private String usageStr;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+}

+ 72 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/ExemptSecondMedicalDeviceMapper.java

@@ -0,0 +1,72 @@
+package com.fs.hisStore.mapper;
+
+
+import com.fs.hisStore.domain.ExemptSecondMedicalDevice;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @description: 免于经营备案的第二类医疗器械产品Mapper
+ * @author: Guos
+ * @time: 2025/11/29 上午9:36
+ */
+@Mapper
+public interface ExemptSecondMedicalDeviceMapper {
+
+    /**
+     * 新增产品
+     * @param device 产品实体
+     * @return 影响行数
+     */
+    int insert(ExemptSecondMedicalDevice device);
+
+    /**
+     * 批量新增产品
+     * @param devices 产品列表
+     * @return 影响行数
+     */
+    int batchInsert(@Param("devices") List<ExemptSecondMedicalDevice> devices);
+
+    /**
+     * 根据ID查询产品
+     * @param id 主键ID
+     * @return 产品实体
+     */
+    ExemptSecondMedicalDevice selectById(Long id);
+
+    /**
+     * 根据产品名称查询产品(模糊)
+     * @param productName 产品名称
+     * @return 产品列表
+     */
+    List<ExemptSecondMedicalDevice> selectByProductName(String productName);
+
+    /**
+     * 根据目录名称查询产品(模糊,支持按分类编号检索,如“07%”“14%”)
+     * @param directoryName 目录名称
+     * @return 产品列表
+     */
+    List<ExemptSecondMedicalDevice> selectByDirectoryName(String directoryName);
+
+    /**
+     * 查询所有产品(按序号1-13升序)
+     * @return 产品列表
+     */
+    List<ExemptSecondMedicalDevice> selectAll();
+
+    /**
+     * 根据ID更新产品
+     * @param device 产品实体
+     * @return 影响行数
+     */
+    int updateById(ExemptSecondMedicalDevice device);
+
+    /**
+     * 根据ID删除产品
+     * @param id 主键ID
+     * @return 影响行数
+     */
+    int deleteById(Long id);
+}

+ 5 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreProductAddEditParam.java

@@ -373,5 +373,10 @@ public class FsStoreProductAddEditParam implements Serializable
      * **/
     private String ingredient;
 
+    /**
+     * 器械编号
+     * **/
+    private String medicalDeviceCode;
+
 
 }

+ 16 - 0
fs-service/src/main/java/com/fs/hisStore/service/IExemptSecondMedicalDeviceService.java

@@ -0,0 +1,16 @@
+package com.fs.hisStore.service;
+
+import com.fs.hisStore.domain.ExemptSecondMedicalDevice;
+
+import java.util.List;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/11/29 上午9:41
+ */
+public interface IExemptSecondMedicalDeviceService {
+
+    List<ExemptSecondMedicalDevice> selectAll();
+
+}

+ 2 - 1
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductScrmService.java

@@ -196,8 +196,9 @@ public interface IFsStoreProductScrmService
      * 判断该药店的经营许可证是否允许上架该商品
      * @param storeId 店铺Id
      * @param cateId 分类id
+     * @param medicalDeviceCode 器械编码
      */
-    ContainsResult checkStoreDrugLicense(Long storeId, Long cateId);
+    ContainsResult checkStoreDrugLicense(Long storeId, Long cateId, String medicalDeviceCode);
 
     /**
      * 普通商品查询

+ 2 - 1
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/CommonCheck.java

@@ -36,8 +36,9 @@ public class CommonCheck extends AbstractHandler {
      *
      * @param cateName 分类名称
      * @param storeId  店铺id
+     * @param medicalDeviceCode 器械编码
      */
-    public ContainsResult check(String cateName, Long storeId) {
+    public ContainsResult check(String cateName, Long storeId, String medicalDeviceCode) {
         FsStoreScrm fsStoreScrm = fsStoreScrmService.selectFsStoreByStoreId(storeId);
 
         //通过店铺id获取上传的药品经营许可证。

+ 34 - 3
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/IIIMedicalDeviceCheck.java

@@ -1,6 +1,14 @@
 package com.fs.hisStore.service.categoryVal;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.txocr.ContainsResult;
+import com.fs.common.utils.txocr.TxOcrClient;
+import com.fs.hisStore.domain.FsStoreScrm;
+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;
 
 /**
@@ -8,9 +16,14 @@ import org.springframework.stereotype.Component;
  * @author: Guos
  * @time: 2025/11/28 下午2:21
  */
+@Slf4j
 @Component
 public class IIIMedicalDeviceCheck extends AbstractHandler{
 
+    @Lazy
+    @Autowired
+    private FsStoreScrmServiceImpl fsStoreScrmService;
+
     @Override
     public void afterPropertiesSet() throws Exception {
         ProductCategoryCheckFactory.register("233", this);
@@ -20,10 +33,28 @@ public class IIIMedicalDeviceCheck extends AbstractHandler{
      * 校验
      * @param cateName
      * @param storeId
+     * @param medicalDeviceCode 器械编码
      */
-    public ContainsResult check(String cateName, Long storeId){
-        System.out.println("3类器械验证");
-        return null;
+    public ContainsResult check(String cateName, Long storeId, String medicalDeviceCode){
+        log.info("3类器械验证");
+        FsStoreScrm fsStoreScrm = fsStoreScrmService.selectFsStoreByStoreId(storeId);
+        ContainsResult result = new ContainsResult();
+        if(ObjectUtil.isEmpty(fsStoreScrm)){
+            result.setFlag(false);
+            result.setMessage("店铺不存在!");
+            return result;
+        }
+        if(StringUtils.isEmpty(fsStoreScrm.getMedicalDevice3())){
+            result.setFlag(false);
+            result.setMessage("没有上传3类证书不允许选择该分类!");
+            return result;
+        }
+        String medicalDevice3 = fsStoreScrm.getMedicalDevice3();
+        String ocrStr = TxOcrClient.ExtractDocBasic(medicalDevice3);
+        boolean contains = ocrStr.contains(medicalDeviceCode);
+        result.setFlag(contains);
+        result.setMessage(contains ? "符合所选商品分类标准" : "不符合所选商品分类标准");
+        return result;
     }
 
 }

+ 47 - 3
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/IIMedicalDeviceCheck.java

@@ -1,16 +1,37 @@
 package com.fs.hisStore.service.categoryVal;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.txocr.ContainsResult;
+import com.fs.common.utils.txocr.TxOcrClient;
+import com.fs.hisStore.domain.FsStoreScrm;
+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;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 /**
  * @description:
  * @author: Guos
  * @time: 2025/11/28 下午2:21
  */
+@Slf4j
 @Component
 public class IIMedicalDeviceCheck extends AbstractHandler{
 
+    @Lazy
+    @Autowired
+    private FsStoreScrmServiceImpl fsStoreScrmService;
+
+    private static final List<String> medicalDeviceCodes = Arrays.asList("07", "14", "6840", "18", "19", "22");
+
+
+
 
     @Override
     public void afterPropertiesSet() throws Exception {
@@ -21,9 +42,32 @@ public class IIMedicalDeviceCheck extends AbstractHandler{
      * 校验
      * @param cateName
      * @param storeId
+     * @param medicalDeviceCode 器械编码
      */
-    public ContainsResult check(String cateName, Long storeId){
-        System.out.println("2类器械验证");
-        return null;
+    public ContainsResult check(String cateName, Long storeId, String medicalDeviceCode){
+        log.info("2类器械验证");
+        FsStoreScrm fsStoreScrm = fsStoreScrmService.selectFsStoreByStoreId(storeId);
+        ContainsResult result = new ContainsResult();
+        if(ObjectUtil.isEmpty(fsStoreScrm)){
+            result.setFlag(false);
+            result.setMessage("店铺不存在!");
+            return result;
+        }
+        if(StringUtils.isEmpty(fsStoreScrm.getMedicalDevice2())){
+            result.setFlag(false);
+            result.setMessage("没有上传2类证书不允许选择该分类!");
+            return result;
+        }
+        if(medicalDeviceCodes.contains(medicalDeviceCode)){
+            result.setFlag(true);
+            result.setMessage("符合所选商品分类标准");
+            return result;
+        }
+        String medicalDevice2 = fsStoreScrm.getMedicalDevice2();
+        String ocrStr = TxOcrClient.ExtractDocBasic(medicalDevice2);
+        boolean contains = ocrStr.contains(medicalDeviceCode);
+        result.setFlag(contains);
+        result.setMessage(contains ? "符合所选商品分类标准" : "不符合所选商品分类标准");
+        return result;
     }
 }

+ 3 - 1
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/IMedicalDeviceCheck.java

@@ -39,8 +39,10 @@ public class IMedicalDeviceCheck extends AbstractHandler{
      * 校验
      * @param cateName
      * @param storeId
+     * @param medicalDeviceCode 器械编码
      */
-    public ContainsResult check(String cateName, Long storeId){
+    public ContainsResult check(String cateName, Long storeId, String medicalDeviceCode){
+        log.info("第一类医疗器械销售检查");
         FsStoreScrmOcr fsStoreScrmOcr = fsStoreScrmOcrMapper.selectById(storeId);
         if (ObjectUtil.isEmpty(fsStoreScrmOcr)) {
             FsStoreScrm fsStoreScrm = fsStoreScrmService.selectFsStoreByStoreId(storeId);

+ 2 - 1
fs-service/src/main/java/com/fs/hisStore/service/categoryVal/WellnessFoodCheck.java

@@ -29,8 +29,9 @@ public class WellnessFoodCheck extends AbstractHandler{
      * 校验
      * @param cateName 分类名称
      * @param storeId 店铺id
+     * @param medicalDeviceCode 器械编码
      */
-    public ContainsResult check(String cateName, Long storeId){
+    public ContainsResult check(String cateName, Long storeId, String medicalDeviceCode){
         FsStoreScrm fsStoreScrm = fsStoreScrmService.selectFsStoreByStoreId(storeId);
         ContainsResult result = new ContainsResult();
         boolean flag = StringUtils.isNotEmpty(fsStoreScrm.getFoodLicense());

+ 27 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/ExemptSecondMedicalDeviceServiceImpl.java

@@ -0,0 +1,27 @@
+package com.fs.hisStore.service.impl;
+
+import com.fs.hisStore.domain.ExemptSecondMedicalDevice;
+import com.fs.hisStore.service.IExemptSecondMedicalDeviceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.hisStore.mapper.ExemptSecondMedicalDeviceMapper;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/11/29 上午9:42
+ */
+@Service
+public class ExemptSecondMedicalDeviceServiceImpl implements IExemptSecondMedicalDeviceService {
+
+    @Autowired
+    private ExemptSecondMedicalDeviceMapper exemptSecondMedicalDeviceMapper;
+
+    @Override
+    public List<ExemptSecondMedicalDevice> selectAll() {
+        return exemptSecondMedicalDeviceMapper.selectAll();
+    }
+}

+ 4 - 3
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java

@@ -1436,9 +1436,10 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
      * 判断该药店的经营许可证是否允许上架该商品(店铺和总后端都用到了)
      * @param storeId 店铺Id
      * @param cateId 分类id
+     * @param medicalDeviceCode 器械编码
      */
     @Override
-    public ContainsResult checkStoreDrugLicense(Long storeId, Long cateId) {
+    public ContainsResult checkStoreDrugLicense(Long storeId, Long cateId, String medicalDeviceCode) {
         //先通过分类id获取具体的分类名称
         FsStoreProductCategoryScrm fsStoreProductCategoryScrm = fsStoreProductCategoryService.selectFsStoreProductCategoryById(cateId);
         String cateName = fsStoreProductCategoryScrm.getCateName();//分类名称
@@ -1447,10 +1448,10 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         //新增分类校验就去 categoryVal 包下面去新加
         try{
             AbstractHandler invokeStrategy = ProductCategoryCheckFactory.getInvokeStrategy(String.valueOf(cateId));
-            return invokeStrategy.check(cateName, storeId);
+            return invokeStrategy.check(cateName, storeId, medicalDeviceCode);
         }catch (NullPointerException e){
             AbstractHandler invokeStrategy = ProductCategoryCheckFactory.getInvokeStrategy(String.valueOf("1101165230"));
-            return invokeStrategy.check(cateName, storeId);
+            return invokeStrategy.check(cateName, storeId, medicalDeviceCode);
         }
     }
 

+ 81 - 0
fs-service/src/main/resources/mapper/hisStore/ExemptSecondMedicalDeviceMapper.xml

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.hisStore.mapper.ExemptSecondMedicalDeviceMapper">
+
+    <!-- 基础字段查询 -->
+    <sql id="baseColumnList">
+        id, serial_number, product_name, directory_name, product_description, usage_str, create_time, update_time
+    </sql>
+
+    <!-- 新增产品 -->
+    <insert id="insert" parameterType="com.fs.hisStore.domain.ExemptSecondMedicalDevice" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO fs_exempt_second_medical_device (
+            serial_number, product_name, directory_name, product_description, usage_str, create_time, update_time
+        ) VALUES (
+                     #{serialNumber}, #{productName}, #{directoryName}, #{productDescription}, #{usageStr},
+                     NOW(), NOW()
+                 )
+    </insert>
+
+    <!-- 批量新增产品 -->
+    <insert id="batchInsert" parameterType="java.util.List">
+        INSERT INTO fs_exempt_second_medical_device (
+        serial_number, product_name, directory_name, product_description, usage_str, create_time, update_time
+        ) VALUES
+        <foreach collection="devices" item="device" separator=",">
+            (
+            #{device.serialNumber}, #{device.productName}, #{device.directoryName},
+            #{device.productDescription}, #{device.usageStr}, NOW(), NOW()
+            )
+        </foreach>
+    </insert>
+
+    <!-- 根据ID查询产品 -->
+    <select id="selectById" parameterType="java.lang.Long" resultType="com.fs.hisStore.domain.ExemptSecondMedicalDevice">
+        SELECT <include refid="baseColumnList"/>
+        FROM fs_exempt_second_medical_device
+        WHERE id = #{id}
+    </select>
+
+    <!-- 根据产品名称查询产品(模糊) -->
+    <select id="selectByProductName" parameterType="java.lang.String" resultType="com.fs.hisStore.domain.ExemptSecondMedicalDevice">
+        SELECT <include refid="baseColumnList"/>
+        FROM fs_exempt_second_medical_device
+        WHERE product_name LIKE CONCAT('%', #{productName}, '%')
+    </select>
+
+    <!-- 根据目录名称查询产品(模糊,支持按分类编号检索) -->
+    <select id="selectByDirectoryName" parameterType="java.lang.String" resultType="com.fs.hisStore.domain.ExemptSecondMedicalDevice">
+        SELECT <include refid="baseColumnList"/>
+        FROM fs_exempt_second_medical_device
+        WHERE directory_name LIKE CONCAT('%', #{directoryName}, '%')
+    </select>
+
+    <!-- 查询所有产品(按序号1-13升序) -->
+    <select id="selectAll" resultType="com.fs.hisStore.domain.ExemptSecondMedicalDevice">
+        SELECT <include refid="baseColumnList"/>
+        FROM fs_exempt_second_medical_device
+        ORDER BY serial_number ASC
+    </select>
+
+    <!-- 根据ID更新产品 -->
+    <update id="updateById" parameterType="com.fs.hisStore.domain.ExemptSecondMedicalDevice">
+        UPDATE fs_exempt_second_medical_device
+        <set>
+            <if test="serialNumber != null">serial_number = #{serialNumber},</if>
+            <if test="productName != null and productName != ''">product_name = #{productName},</if>
+            <if test="directoryName != null and directoryName != ''">directory_name = #{directoryName},</if>
+            <if test="productDescription != null">product_description = #{productDescription},</if>
+            <if test="usageStr != null">usage_str = #{usageStr},</if>
+            update_time = NOW()
+        </set>
+        WHERE id = #{id}
+    </update>
+
+    <!-- 根据ID删除产品 -->
+    <delete id="deleteById" parameterType="java.lang.Long">
+        DELETE FROM fs_exempt_second_medical_device
+        WHERE id = #{id}
+    </delete>
+
+</mapper>