Ver Fonte

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

# Conflicts:
#	src/views/hisStore/storeProduct/index.vue
yjwang há 1 semana atrás
pai
commit
260cf1c571

+ 10 - 3
src/api/hisStore/storeProduct.js

@@ -164,13 +164,20 @@ export function businessLicenseCheck(imageUrl) {
   })
 }
 
-
 // 检查店铺的经营许可证是否允许上传该类商品
-export function checkStoreLicense(storeId, cateId) {
+export function checkStoreLicense(storeId, cateId, medicalDeviceCode) {
   return request({
     url: '/store/store/storeProduct/checkStoreDrugLicense',
     method: 'post',
-    data: { storeId: storeId, cateId: cateId }
+    data: { storeId: storeId, cateId: cateId, medicalDeviceCode: medicalDeviceCode }
+  })
+}
+
+// 获取器免列表
+export function getExemptSecondMedicalDeviceList() {
+  return request({
+    url: '/store/store/exemptSecondMedicalDevice/getList',
+    method: 'get'
   })
 }
 

+ 70 - 9
src/views/course/coursePlaySourceConfig/index.vue

@@ -40,6 +40,21 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="请选择状态"
+          clearable
+          size="small"
+        >
+          <el-option
+            v-for="item in statusOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -142,6 +157,15 @@
           <el-tag prop="isMall" v-for="(item, index) in isMallOptions" v-if="scope.row.isMall==item.dictValue">{{item.dictLabel}}</el-tag>
         </template>
       </el-table-column>
+      <el-table-column label="状态" align="center" prop="status" width="100px">
+        <template slot-scope="scope">
+          <el-tag
+            :type="scope.row.status === -1 ? 'info' : scope.row.status === 0 ? 'success' : scope.row.status === 1 ? 'warning' : 'danger'"
+          >
+            {{ getStatusLabel(scope.row.status) }}
+          </el-tag>
+        </template>
+      </el-table-column>
       <el-table-column label="创建时间" align="center" prop="createTime" />
       <el-table-column label="修改时间" align="center" prop="updateTime" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@@ -223,14 +247,20 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="商城刷单数据查看权限">
-          <el-select v-model="form.viewPermissions" placeholder="请选择">
+        <el-form-item label="状态" prop="status">
+          <el-select
+            v-model="form.status"
+            placeholder="请选择状态"
+            style="width: 220px"
+            clearable
+            size="small"
+          >
             <el-option
-              v-for="item in authOptions"
-              :key="item.dictValue"
-              :label="item.dictLabel"
-              :value="item.dictValue">
-            </el-option>
+              v-for="item in statusOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
           </el-select>
         </el-form-item>
         <el-form-item label="图标" prop="img">
@@ -316,7 +346,8 @@ export default {
         pageNum: 1,
         pageSize: 10,
         name: null,
-        appid: null
+        appid: null,
+        status: null
       },
       showSearch: true,
       single: true,
@@ -326,6 +357,24 @@ export default {
       list: [],
       total: 0,
       typesOptions: [],
+      statusOptions: [
+        {
+          label: "待审核",
+          value: -1
+        },
+        {
+          label: "正常",
+          value: 0
+        },
+        {
+          label: "半封禁",
+          value: 1
+        },
+        {
+          label: "封禁",
+          value: 2
+        }
+      ],
       isMallOptions:[
         {
           dictLabel: "是",
@@ -621,10 +670,22 @@ export default {
         aesKey: 'HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E',
         msgDataFormat: 'JSON',
         type: '1',
-        isMall: 0
+        isMall: 0,
+        status: 0
+
+
       }
       this.resetForm("form");
     },
+    getStatusLabel(status) {
+      const statusMap = {
+        '-1': '待审核',
+        '0': '正常',
+        '1': '半封禁',
+        '2': '封禁'
+      };
+      return statusMap[status] || '未知';
+    }
   },
 }
 </script>

+ 0 - 58
src/views/hisStore/store/audit.vue

@@ -148,31 +148,6 @@
           </el-button>
         </template>
       </el-table-column>
-<!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="130px" v-if="medicalMallConfig.isAudit">-->
-<!--        <template slot-scope="scope">-->
-<!--          <el-button-->
-<!--            size="mini"-->
-<!--            type="text"-->
-<!--            icon="el-icon-s-promotion"-->
-<!--            @click="handledetails(scope.row)"-->
-<!--          >-->
-<!--            <span v-if="scope.row.isAudit===0">审核</span>-->
-<!--            <span v-else>详情</span>-->
-<!--          </el-button>-->
-<!--        </template>-->
-<!--      </el-table-column>-->
-<!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="130px">-->
-<!--        <template slot-scope="scope">-->
-<!--          <el-button-->
-<!--            size="mini"-->
-<!--            type="text"-->
-<!--            icon="el-icon-s-promotion"-->
-<!--            @click="handleUpdate(scope.row)"-->
-<!--          >-->
-<!--            <span>审核</span>-->
-<!--          </el-button>-->
-<!--        </template>-->
-<!--      </el-table-column>-->
     </el-table>
 
     <pagination
@@ -291,23 +266,6 @@
               </el-col>
             </el-row>
 
-            <el-row>
-              <el-col :span="12">
-                <el-form-item label="1类器械生产备案">
-                  <el-image v-if="dialogForm.medicalDevice1" style="width: 200px" :src="dialogForm.medicalDevice1" :preview-src-list="[dialogForm.medicalDevice1]"></el-image>
-                </el-form-item>
-                <el-form-item label="1类器械生产备案编号" style="margin-left: 5px">
-                  <el-input v-model="dialogForm.medicalDevice1Code" />
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item label="1类生产备案有效期">
-                  <span v-if="dialogForm.isMedicalDevice1ExpiryPermanent == 1">长期有效</span>
-                  <span v-else>{{dialogForm.medicalDevice1ExpiryStart}} - {{dialogForm.medicalDevice1ExpiryEnd}}</span>
-                </el-form-item>
-              </el-col>
-            </el-row>
-
             <el-row>
               <el-col :span="12">
                 <el-form-item label="2类医疗器械备案证书">
@@ -359,22 +317,6 @@
               </el-col>
             </el-row>
 
-            <el-row>
-              <el-col :span="12">
-                <el-form-item label="医疗机构执业许可证">
-                  <el-image v-if="dialogForm.medicalLicense" style="width: 200px" :src="dialogForm.medicalLicense" :preview-src-list="[dialogForm.medicalLicense]"></el-image>
-                </el-form-item>
-                <el-form-item label="医疗机构执业许可证编号" style="margin-left: 5px">
-                  <el-input v-model="dialogForm.medicalCode" />
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item label="医疗机构执业许可证有效期">
-                  <span v-if="dialogForm.isMedicalLicenseExpiryPermanent == 1">长期有效</span>
-                  <span v-else>{{dialogForm.medicalLicenseExpiryStart}} - {{dialogForm.medicalLicenseExpiryEnd}}</span>
-                </el-form-item>
-              </el-col>
-            </el-row>
           </div>
 
           <el-divider content-position="left">店铺配置信息</el-divider>

+ 119 - 297
src/views/hisStore/store/index.vue

@@ -148,28 +148,6 @@
       </el-table-column>
       <el-table-column label="地址" align="center" prop="address" width="200px"/>
       <el-table-column label="店铺电话" align="center" prop="phone" width="120px"/>
-      <!--      <el-table-column label="资质证书" align="center" prop="licenseImages" width="100px">
-              <template slot-scope="scope">
-                <el-popover
-                  placement="right"
-                  title=""
-                  trigger="hover">
-                  <img slot="reference" :src="scope.row.licenseImages" width="80px">
-                  <img :src="scope.row.licenseImages" style="max-width: 150px;">
-                </el-popover>
-              </template>
-            </el-table-column>
-            <el-table-column label="营业执照" align="center" prop="bizLicense" width="100px">
-              <template slot-scope="scope">
-                <el-popover
-                  placement="right"
-                  title=""
-                  trigger="hover">
-                  <img slot="reference" :src="scope.row.bizLicense" width="80px">
-                  <img :src="scope.row.bizLicense" style="max-width: 150px;">
-                </el-popover>
-              </template>
-            </el-table-column>-->
       <el-table-column label="审核状态" align="center" prop="isAudit">
         <template slot-scope="scope">
           <dict-tag :options="isAuditOptions" :value="scope.row.isAudit"/>
@@ -235,6 +213,7 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+
     <!-- 添加或修改店铺管理对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body :close-on-click-modal="false">
       <el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="top" :disabled="isViewMode">
@@ -408,15 +387,7 @@
               </el-col>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="药品经营许可证是否长期有效" prop="isDrugLicensePermanent">
-                <el-switch
-                  @change="switchChange()"
-                  v-model="drugLicenseValue"
-                  active-color="#13ce66"
-                  inactive-color="#ff4949">
-                </el-switch>
-              </el-form-item>
-              <el-form-item label="药品经营许可证有效期" prop="drugLicenseExpiry" v-if="!drugLicenseValue">
+              <el-form-item label="药品经营许可证有效期" prop="drugLicenseExpiry">
                 <el-date-picker
                   v-model="form.drugLicenseExpiry"
                   type="daterange"
@@ -451,12 +422,18 @@
                   <i v-else class="el-icon-plus avatar-uploader-icon"></i>
                 </el-upload>
               </el-form-item>
+
+              <el-col :sapn="24">
+                <el-form-item label="2类器械经营范围" prop="medicalDevice2BusinessScope" style="margin-left: 5px">
+                  <el-input v-model="form.medicalDevice2BusinessScope" placeholder="请输入2类器械经营范围" type="textarea"/>
+                </el-form-item>
+              </el-col>
+
               <el-col :span="14">
                 <el-form-item label="2类器械生产备案编号" prop="medicalDevice2Code" style="margin-left: 5px">
                   <el-input v-model="form.medicalDevice2Code" placeholder="请输入2类器械生产备案编号" />
                 </el-form-item>
               </el-col>
-
             </el-col>
             <el-col :span="12"></el-col>
             <el-col :span="12">
@@ -480,6 +457,7 @@
               </el-form-item>
             </el-col>
           </el-row>
+
           <el-row>
             <el-col :span="12">
               <el-form-item label="3类器械经营许可证上传" prop="medicalDevice3">
@@ -502,21 +480,20 @@
                   <i v-else class="el-icon-plus avatar-uploader-icon"></i>
                 </el-upload>
               </el-form-item>
+
+              <el-col :sapn="24">
+                <el-form-item label="3类器械经营范围" prop="medicalDevice3BusinessScope" style="margin-left: 5px">
+                  <el-input v-model="form.medicalDevice3BusinessScope" placeholder="请输入3类器械经营范围" type="textarea"/>
+                </el-form-item>
+              </el-col>
+
               <el-form-item label="3类器械生产备案编号" prop="medicalDevice3Code" style="margin-left: 5px">
                 <el-input v-model="form.medicalDevice3Code" placeholder="请输入3类器械生产备案编号" />
               </el-form-item>
             </el-col>
             <el-col :span="12"></el-col>
             <el-col :span="12">
-              <el-form-item label="3类器械经营许可证是否长期有效" prop="isMedicalDevice3ExpiryPermanent">
-                <el-switch
-                  @change="switchChange()"
-                  v-model="medicalDevice3ExpiryValue"
-                  active-color="#13ce66"
-                  inactive-color="#ff4949">
-                </el-switch>
-              </el-form-item>
-              <el-form-item label="3类器械经营许可证有效期" prop="medicalDevice3Expiry" v-if="!medicalDevice3ExpiryValue">
+              <el-form-item label="3类器械经营许可证有效期" prop="medicalDevice3Expiry">
                 <el-date-picker
                   v-model="form.medicalDevice3Expiry"
                   type="daterange"
@@ -530,7 +507,7 @@
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="食品经营许可证上传" prop="foodLicense">
+              <el-form-item label="食品经营许可证/备案凭证上传" prop="foodLicense">
                 <el-upload
                   class="avatar-uploader"
                   :action="uploadUrl"
@@ -550,13 +527,13 @@
                   <i v-else class="el-icon-plus avatar-uploader-icon"></i>
                 </el-upload>
               </el-form-item>
-              <el-form-item label="食品经营许可证编号" prop="foodCode" style="margin-left: 5px">
-                <el-input v-model="form.foodCode" placeholder="请输入食品经营许可证编号" />
+              <el-form-item label="食品经营许可证/备案凭证编号" prop="foodCode" style="margin-left: 5px">
+                <el-input v-model="form.foodCode" placeholder="请输入食品经营许可证/备案凭证编号" />
               </el-form-item>
             </el-col>
             <el-col :span="12"></el-col>
             <el-col :span="12">
-              <el-form-item label="食品经营许可证是否长期有效" prop="isFoodLicenseExpiryPermanent">
+              <el-form-item label="食品经营许可证/备案凭证是否长期有效" prop="isFoodLicenseExpiryPermanent">
                 <el-switch
                   @change="switchChange()"
                   v-model="foodLicenseExpiryValue"
@@ -564,7 +541,7 @@
                   inactive-color="#ff4949">
                 </el-switch>
               </el-form-item>
-              <el-form-item label="食品经营许可证有效期" prop="foodLicenseExpiry" v-if="!foodLicenseExpiryValue">
+              <el-form-item label="食品经营许可证/备案凭证有效期" prop="foodLicenseExpiry" v-if="!foodLicenseExpiryValue">
                 <el-date-picker
                   v-model="form.foodLicenseExpiry"
                   type="daterange"
@@ -838,9 +815,6 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <!-- <el-form-item label="分佣比例%" prop="shippingType">
-                   <el-input-number v-model="form.brokerageRate" :min="0" :max="100"></el-input-number>
-              </el-form-item> -->
           </el-col>
         </el-row>
         <el-row>
@@ -923,11 +897,9 @@ export default {
       auditLogs: [],
       switchValue:false,
       switchMedicalValue:false,
-      drugLicenseValue:false,
       medicalDevice2ExpiryValue:false,
-      medicalDevice3ExpiryValue:false,
-      foodLicenseExpiryValue:false,
       medicalLicenseExpiryValue:false,
+      foodLicenseExpiryValue:false,
       medicalLicenseExpiryValue1:false,//协议有效期控制
       medicalLicenseExpiryValue2:false,//协议有效期控制
       medicalLicenseExpiryValue3:false,//协议有效期控制
@@ -985,6 +957,8 @@ export default {
       },
       // 表单参数
       form: {
+        medicalDevice3BusinessScope: null,
+        medicalDevice2BusinessScope: null,
         settlementAgreementFileType: '', // 入驻协议文件类型(如 application/pdf)
         qualityAssuranceAgreementFileType: '', // 质量保证协议文件类型
         otherSpecialQualificationFileType: '', // 其他特殊资质文件类型
@@ -1013,32 +987,32 @@ export default {
         businessCode:[
           { required: true, message: "营业执照编号不能为空", trigger: "blur" }
         ],
-        drugLicense:[
+        drugLicense: [
           { required: true, message: "药品经营许可证不能为空", trigger: "blur" }
         ],
-        drugLicenseExpiry:[
-          { required: true, message: "药品经营许可证有效期不能为空", trigger: "blur" }
-        ],
         drugCode:[
           { required: true, message: "药品经营许可证编号不能为空", trigger: "blur" }
         ],
-        // medicalLicense:[
-        //   { required: true, message: "医疗机构执业许可证不能为空", trigger: "blur" }
-        // ],
-        // medicalCode:[
-        //   { required: true, message: "医疗机构执业许可证编号不能为空", trigger: "blur" }
-        // ],
-        // medicalLicenseExpiry:[
-        //   { required: true, message: "医疗机构执业许可证有效期不能为空", trigger: "blur" }
-        // ],
-        medicalDevice2:[
-          { required: true, message: "2类医疗器械备案证不能为空", trigger: "blur" }
+        drugLicenseExpiry: [
+          { required: true, message: "药品经营许可证有效期不能为空", trigger: "blur" }
+        ],
+        medicalDevice3: [
+          { required: true, message: "3类器械经营许可证不能为空", trigger: "blur" }
+        ],
+        medicalDevice3Code: [
+          { required: true, message: "3类器械生产备案编号不能为空", trigger: "blur" }
         ],
-        medicalDevice2Expiry:[
-          { required: true, message: "2类医疗器械备案证有效期不能为空", trigger: "blur" }
+        medicalDevice3Expiry: [
+          { required: true, message: "3类器械经营许可证有效期不能为空", trigger: "blur" }
         ],
-        medicalDevice2Code:[
-          { required: true, message: "2类医疗器械备案证编号不能为空", trigger: "blur" }
+        foodLicense: [
+          { required: true, message: "食品经营许可证不能为空", trigger: "blur" }
+        ],
+        foodCode: [
+          { required: true, message: "食品经营许可证编号不能为空", trigger: "blur" }
+        ],
+        foodLicenseExpiry: [
+          { required: true, message: "食品经营许可证有效期不能为空", trigger: "blur" }
         ],
         logoUrl: [
           { required: true, message: "店铺LOGO不能为空", trigger: "blur" }
@@ -1369,126 +1343,33 @@ export default {
     },
     // 修复LOGO删除逻辑:确保删除后可重新上传
     handleDeleteLogo() {
-      this.isDeleting = true; // 临时禁用上传组件
-      this.$confirm('确定要删除这张图片吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.form.logoUrl = ''; // 清空图片URL
-        this.$message.success('图片已删除');
-      }).catch(() => {
-        this.$message.info('已取消删除');
-      }).finally(() => {
-        this.isDeleting = false; // 无论操作结果,恢复上传组件可用
-        this.$forceUpdate(); // 强制刷新确保状态同步
-      });
-    },
-    handleDelete1() {
-      this.isDeleting = true; // 临时禁用上传组件
-      this.$confirm('确定要删除这张图片吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.form.medicalDevice1 = ''; // 清空图片URL
-        this.$message.success('图片已删除');
-      }).catch(() => {
-        this.$message.info('已取消删除');
-      }).finally(() => {
-        this.isDeleting = false; // 无论操作结果,恢复上传组件可用
-        this.$forceUpdate(); // 强制刷新确保状态同步
-      });
+      this.deleteImage('logoUrl', 'Logo');
     },
     handleDelete2() {
-      this.isDeleting = true; // 临时禁用上传组件
-      this.$confirm('确定要删除这张图片吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.form.medicalDevice3 = ''; // 清空图片URL
-        this.$message.success('图片已删除');
-      }).catch(() => {
-        this.$message.info('已取消删除');
-      }).finally(() => {
-        this.isDeleting = false; // 无论操作结果,恢复上传组件可用
-        this.$forceUpdate(); // 强制刷新确保状态同步
-      });
+      this.deleteImage('medicalDevice3', '3类器械经营许可证');
     },
     handleDelete3() {
-      this.isDeleting = true; // 临时禁用上传组件
-      this.$confirm('确定要删除这张图片吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.form.foodLicense = ''; // 清空图片URL
-        this.$message.success('图片已删除');
-      }).catch(() => {
-        this.$message.info('已取消删除');
-      }).finally(() => {
-        this.isDeleting = false; // 无论操作结果,恢复上传组件可用
-        this.$forceUpdate(); // 强制刷新确保状态同步
-      });
+      this.deleteImage('foodLicense', '食品经营许可证');
+    },
+    handleDelete5() {
+      this.deleteImage('businessLicense', '营业执照');
+    },
+    handleDelete6() {
+      this.deleteImage('drugLicense', '药品经营许可证');
     },
-    handleDelete4() {
-      this.isDeleting = true; // 临时禁用上传组件
-      this.$confirm('确定要删除这张图片吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.form.medicalLicense = ''; // 清空图片URL
-        this.$message.success('图片已删除');
-      }).catch(() => {
-        this.$message.info('已取消删除');
-      }).finally(() => {
-        this.isDeleting = false; // 无论操作结果,恢复上传组件可用
-        this.$forceUpdate(); // 强制刷新确保状态同步
-      });
-    }
-    , handleDelete5() {
-      this.isDeleting = true; // 临时禁用上传组件
-      this.$confirm('确定要删除这张图片吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.form.businessLicense = ''; // 清空图片URL
-        this.$message.success('图片已删除');
-      }).catch(() => {
-        this.$message.info('已取消删除');
-      }).finally(() => {
-        this.isDeleting = false; // 无论操作结果,恢复上传组件可用
-        this.$forceUpdate(); // 强制刷新确保状态同步
-      });
-    }
-  , handleDelete6() {
-    this.isDeleting = true; // 临时禁用上传组件
-    this.$confirm('确定要删除这张图片吗?', '提示', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
-      type: 'warning'
-    }).then(() => {
-      this.form.drugLicense = ''; // 清空图片URL
-      this.$message.success('图片已删除');
-    }).catch(() => {
-      this.$message.info('已取消删除');
-    }).finally(() => {
-      this.isDeleting = false; // 无论操作结果,恢复上传组件可用
-      this.$forceUpdate(); // 强制刷新确保状态同步
-    });
-  },
     handleDelete7() {
+      this.deleteImage('medicalDevice2', '2类医疗器械备案证书');
+    },
+    // 通用图片删除方法
+    deleteImage(field, itemType) {
       this.isDeleting = true; // 临时禁用上传组件
-      this.$confirm('确定要删除这张图片吗?', '提示', {
+      this.$confirm(`确定要删除这张${itemType}吗?`, '提示', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
-        this.form.medicalDevice2 = ''; // 清空图片URL
-        this.$message.success('图片已删除');
+        this.form[field] = ''; // 清空图片URL
+        this.$message.success(`${itemType}已删除`);
       }).catch(() => {
         this.$message.info('已取消删除');
       }).finally(() => {
@@ -1509,24 +1390,18 @@ export default {
         if(this.form.isMedicalDevice1ExpiryPermanent == 1){
           this.switchMedicalValue = true;
         }
-        if(this.form.isDrugLicensePermanent == 1){
-          this.drugLicenseValue = true;
-        }
         if(this.form.isMedicalDevice2ExpiryPermanent == 1){
           this.medicalDevice2ExpiryValue = true;
         }
-        if(this.form.isMedicalDevice3ExpiryPermanent == 1){
-          this.medicalDevice3ExpiryValue = true;
-        }
-        if(this.form.isFoodLicenseExpiryPermanent == 1){
-          this.foodLicenseExpiryValue = true;
-        }
         if(this.form.isMedicalLicenseExpiryPermanent == 1){
           this.medicalLicenseExpiryValue = true;
         }
         if(this.form.isEffectivePermanent1 == 1){
           this.medicalLicenseExpiryValue1 = true;
         }
+        if(this.form.isFoodLicenseExpiryPermanent == 1){
+          this.foodLicenseExpiryValue = true;
+        }
         if(this.form.isEffectivePermanent2 == 1){
           this.medicalLicenseExpiryValue2 = true;
         }
@@ -1588,128 +1463,75 @@ export default {
         if (valid) {
           // 处理表单数据
           const formData = Object.assign({}, this.form);
-
           // 处理城市ID
           if (formData.cityIds) {
             formData.cityIds = formData.cityIds.toString();
           }
-
           // 处理配送方式
           if (formData.shippingType) {
             formData.shippingType = formData.shippingType.toString();
           }
 
           // 处理日期范围字段
-          if (formData.drugLicenseExpiry && formData.drugLicenseExpiry.length === 2) {
-            formData.drugLicenseExpiryStart = formData.drugLicenseExpiry[0];
-            formData.drugLicenseExpiryEnd = formData.drugLicenseExpiry[1];
-          }
-
-          if (formData.medicalDevice2Expiry && formData.medicalDevice2Expiry.length === 2) {
-            formData.medicalDevice2ExpiryStart = formData.medicalDevice2Expiry[0];
-            formData.medicalDevice2ExpiryEnd = formData.medicalDevice2Expiry[1];
-          }
-
-          if (formData.medicalDevice1Expiry && formData.medicalDevice1Expiry.length === 2) {
-            formData.medicalDevice1ExpiryStart = formData.medicalDevice1Expiry[0];
-            formData.medicalDevice1ExpiryEnd = formData.medicalDevice1Expiry[1];
-          }
-
-          if (formData.medicalDevice3Expiry && formData.medicalDevice3Expiry.length === 2) {
-            formData.medicalDevice3ExpiryStart = formData.medicalDevice3Expiry[0];
-            formData.medicalDevice3ExpiryEnd = formData.medicalDevice3Expiry[1];
-          }
-
-          if (formData.foodLicenseExpiry && formData.foodLicenseExpiry.length === 2) {
-            formData.foodLicenseExpiryStart = formData.foodLicenseExpiry[0];
-            formData.foodLicenseExpiryEnd = formData.foodLicenseExpiry[1];
-          }
-
-          if (formData.medicalLicenseExpiry && formData.medicalLicenseExpiry.length === 2) {
-            formData.medicalLicenseExpiryStart = formData.medicalLicenseExpiry[0];
-            formData.medicalLicenseExpiryEnd = formData.medicalLicenseExpiry[1];
-          }
-          if (formData.businessLicenseExpire && formData.businessLicenseExpire.length === 2) {
-            formData.businessLicenseExpireStart = formData.businessLicenseExpire[0];
-            formData.businessLicenseExpireEnd = formData.businessLicenseExpire[1];
-          }
-
-          if (formData.settlementAgreementExpiry && formData.settlementAgreementExpiry.length === 2) {
-            formData.settlementAgreementStart = formData.settlementAgreementExpiry[0];
-            formData.settlementAgreementEnd = formData.settlementAgreementExpiry[1];
-          }else {
-            if(formData.settlementAgreement != null){
-              return this.$message.warning("其它资质-入驻协议,有效期开始日期或结束日期不能为空!");
+          const dateRangeFields = [
+            'drugLicenseExpiry',
+            'medicalDevice2Expiry',
+            'medicalDevice1Expiry',
+            'medicalDevice3Expiry',
+            'foodLicenseExpiry',
+            'medicalLicenseExpiry',
+            'businessLicenseExpire'
+          ];
+          dateRangeFields.forEach(field => {
+            if (formData[field] && formData[field].length === 2) {
+              formData[`${field}Start`] = formData[field][0];
+              formData[`${field}End`] = formData[field][1];
             }
-          }
-
-          if (formData.qualityAssuranceAgreementExpiry && formData.qualityAssuranceAgreementExpiry.length === 2) {
-            formData.qualityAssuranceAgreementStart = formData.qualityAssuranceAgreementExpiry[0];
-            formData.qualityAssuranceAgreementEnd = formData.qualityAssuranceAgreementExpiry[1];
-          }else {
-            if(formData.qualityAssuranceAgreement != null){
-              return this.$message.warning("质量保证协议,有效期开始日期或结束日期不能为空!");
+          });
+
+          //其他执照处理
+          const agreementFields = [
+            {
+              expiryField: 'settlementAgreementExpiry',
+              startField: 'settlementAgreementStart',
+              endField: 'settlementAgreementEnd',
+              message: '其它资质-入驻协议,有效期开始日期或结束日期不能为空!'
+            },
+            {
+              expiryField: 'qualityAssuranceAgreementExpiry',
+              startField: 'qualityAssuranceAgreementStart',
+              endField: 'qualityAssuranceAgreementEnd',
+              message: '质量保证协议,有效期开始日期或结束日期不能为空!'
+            },
+            {
+              expiryField: 'otherSpecialQualificationExpiry',
+              startField: 'otherSpecialQualificationStart',
+              endField: 'otherSpecialQualificationEnd',
+              message: '其它特殊资质,有效期开始日期或结束日期不能为空!'
             }
-          }
-
-          if (formData.otherSpecialQualificationExpiry && formData.otherSpecialQualificationExpiry.length === 2) {
-            formData.otherSpecialQualificationStart = formData.otherSpecialQualificationExpiry[0];
-            formData.otherSpecialQualificationEnd = formData.otherSpecialQualificationExpiry[1];
-          }else {
-            if(formData.otherSpecialQualification != null){
-              return this.$message.warning("其它特殊资质,有效期开始日期或结束日期不能为空!");
+          ];
+
+          for (const field of agreementFields) {
+            if (formData[field.expiryField] && formData[field.expiryField].length === 2) {
+              formData[field.startField] = formData[field.expiryField][0];
+              formData[field.endField] = formData[field.expiryField][1];
+            } else {
+              if (formData[field.expiryField.replace('Expiry', '')] != null) {
+                return this.$message.warning(field.message);
+              }
             }
           }
-          if(!!this.switchValue){
-              formData.isBusinessLicensePermanent = 1;
-          }else{
-              formData.isBusinessLicensePermanent = 0;
-          }
-          if(!!this.switchMedicalValue){
-            formData.isMedicalDevice1ExpiryPermanent=1;
-          }else {
-            formData.isMedicalDevice1ExpiryPermanent=0;
-          }
-          if(!!this.drugLicenseValue){
-            formData.isDrugLicensePermanent=1;
-          }else {
-            formData.isDrugLicensePermanent=0;
-          }
-          if(!!this.medicalDevice2ExpiryValue){
-            formData.isMedicalDevice2ExpiryPermanent=1;
-          }else {
-            formData.isMedicalDevice2ExpiryPermanent=0;
-          }
-          if(!!this.medicalDevice3ExpiryValue){
-            formData.isMedicalDevice3ExpiryPermanent=1;
-          }else {
-            formData.isMedicalDevice3ExpiryPermanent=0;
-          }
-          if(!!this.foodLicenseExpiryValue){
-            formData.isFoodLicenseExpiryPermanent=1;
-          }else {
-            formData.isFoodLicenseExpiryPermanent=0;
-          }
-          if(!!this.medicalLicenseExpiryValue){
-            formData.isMedicalLicenseExpiryPermanent=1;
-          }else {
-            formData.isMedicalLicenseExpiryPermanent=0;
-          }
-          if(!!this.medicalLicenseExpiryValue1){
-            formData.isEffectivePermanent1=1;
-          }else {
-            formData.isEffectivePermanent1=0;
-          }
-          if(!!this.medicalLicenseExpiryValue2){
-            formData.isEffectivePermanent2=1;
-          }else {
-            formData.isEffectivePermanent2=0;
-          }
-          if(!!this.medicalLicenseExpiryValue3){
-            formData.isEffectivePermanent3=1;
-          }else {
-            formData.isEffectivePermanent3=0;
-          }
+
+          // 处理各类许可证是否永久有效的开关状态
+          formData.isFoodLicenseExpiryPermanent = this.foodLicenseExpiryValue ? 1 : 0;
+          formData.isBusinessLicensePermanent = this.switchValue ? 1 : 0;
+          formData.isMedicalDevice1ExpiryPermanent = this.switchMedicalValue ? 1 : 0;
+          formData.isMedicalDevice2ExpiryPermanent = this.medicalDevice2ExpiryValue ? 1 : 0;
+          formData.isMedicalLicenseExpiryPermanent = this.medicalLicenseExpiryValue ? 1 : 0;
+          formData.isEffectivePermanent1 = this.medicalLicenseExpiryValue1 ? 1 : 0;
+          formData.isEffectivePermanent2 = this.medicalLicenseExpiryValue2 ? 1 : 0;
+          formData.isEffectivePermanent3 = this.medicalLicenseExpiryValue3 ? 1 : 0;
+
           if (formData.storeId != null) {
             updateStore(formData).then(response => {
               this.msgSuccess("修改成功");

+ 402 - 190
src/views/hisStore/storeProduct/index.vue

@@ -48,16 +48,6 @@
           />
         </el-select>
       </el-form-item>
-      <!-- <el-form-item label="所属公司">
-        <el-select style="width: 240px" v-model="companyId" multiple placeholder="请选择企业" clearable size="small" >
-          <el-option
-            v-for="item in companyOptions"
-            :key="item.companyId"
-            :label="item.companyName"
-            :value="item.companyId"
-          />
-        </el-select>
-      </el-form-item> -->
       <el-form-item label="所属店铺" v-if="medicalMallConfig.isStores">
         <el-select style="width: 240px" v-model="queryParams.storeIds" placeholder="请选择店铺" clearable size="small">
           <el-option
@@ -69,12 +59,6 @@
         </el-select>
       </el-form-item>
       <div v-if="medicalMallConfig.isAudit">
-<!--        <el-form-item label="审核状态">-->
-<!--          <el-select style="width: 240px" v-model="queryParams.isAudit" placeholder="请选择审核状态" size="small">-->
-<!--            <el-option value="0" label="待审核" key="isAudit0">待审核</el-option>-->
-<!--            <el-option value="1" label="审核通过" key="isAudit1">审核通过</el-option>-->
-<!--          </el-select>-->
-<!--        </el-form-item>-->
         <el-form-item label="药品注册证书编号" prop="drugRegCertNo">
           <el-input
             v-model="queryParams.drugRegCertNo"
@@ -248,16 +232,6 @@
           />
         </el-form-item>
       </div>
-      <!-- <el-form-item label="状态" prop="isShow">
-         <el-select style="width: 240px" v-model="queryParams.isShow" placeholder="请选择状态" clearable size="small" >
-         <el-option
-                v-for="item in isShowOptions"
-                :key="item.dictValue"
-                :label="item.dictLabel"
-                :value="item.dictValue"
-              />
-        </el-select>
-      </el-form-item> -->
 
       <el-form-item>
         <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -484,16 +458,6 @@
             <el-radio :label="item.dictValue" v-for="item in isDisplayOptions">{{ item.dictLabel }}</el-radio>
           </el-radio-group>
         </el-form-item>
-        <!--        <el-form-item label="所属公司" prop="companyId">-->
-        <!--          <el-select style="width: 220px" filterable multiple v-model="form1.companyId" placeholder="请选择公司名" clearable size="small">-->
-        <!--            <el-option-->
-        <!--              v-for="item in companyOptions"-->
-        <!--              :key="item.companyId"-->
-        <!--              :label="item.companyName"-->
-        <!--              :value="item.companyId"-->
-        <!--            />-->
-        <!--          </el-select>-->
-        <!--        </el-form-item>-->
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm1">确 定</el-button>
@@ -530,10 +494,48 @@
           <el-col :span="12">
             <el-form-item label="商品分类" prop="cateId">
               <treeselect v-model="form.cateId" :options="categoryOptions" :normalizer="normalizer"
-                          placeholder="请选择上级分类"/>
+                          placeholder="请选择上级分类" @input="onCategoryOrStoreChange"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="商品类型" prop="productType">
+              <el-select style="width: 240px" v-model="form.productType" placeholder="请选择商品类型" clearable
+                         size="small">
+                <el-option
+                  v-for="item in productTypeOptions"
+                  :key="item.dictValue"
+                  :label="item.dictLabel"
+                  :value="item.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="所属店铺" prop="storeId" v-if="medicalMallConfig.isStores">
+              <el-select style="width: 240px" v-model="form.storeId" placeholder="请选择店铺" clearable size="small" @change="onCategoryOrStoreChange">
+                <el-option
+                  v-for="item in storeOptions"
+                  :key="item.storeId"
+                  :label="item.storeName"
+                  :value="item.storeId"
+                />
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="器械编码" prop="medicalDeviceCode" v-if="showMedicalDeviceCode">
+              <el-input v-model="form.medicalDeviceCode" placeholder="请输入器械编码" @blur="onCategoryOrStoreChange" style="width: calc(100% - 120px);"/>
+              <el-button type="primary" @click="showExemptDeviceDialog" style="margin-left: 10px;" v-if="shouldShowExemptDeviceButton">显示器免</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
         <el-row>
           <el-col :span="12">
             <el-form-item label="关键字" prop="keyword">
@@ -679,22 +681,7 @@
         <el-form-item label="商品图片" prop="image">
           <Material v-model="imageArr" type="image" :num="1" :width="150" :height="150"/>
         </el-form-item>
-        <!--        <el-form-item label="商品视频" prop="video">
-                  <div>
-                    <el-upload
-                      ref="upload"
-                      class="upload-demo"
-                      :action="uploadUrl"
-                      :on-success="handleSuccess"
-                      :before-upload="beforeUpload"
-                      :limit="1"
-                      :accept="videoAccept"
-                    >
-                      <el-button size="small" type="primary">点击上传视频</el-button>
-                    </el-upload>
-                    <video v-if="form.video" :src="form.video" controls style="max-width: 300px; max-height: 300px; margin-top: 10px"></video>
-                  </div>
-                </el-form-item>-->
+
         <el-form-item label="轮播图" prop="sliderImage">
           <Material v-model="photoArr" type="image" :num="10" :width="150" :height="150"/>
         </el-form-item>
@@ -969,37 +956,7 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="商品类型" prop="productType">
-          <el-select style="width: 240px" v-model="form.productType" placeholder="请选择商品类型" clearable
-                     size="small">
-            <el-option
-              v-for="item in productTypeOptions"
-              :key="item.dictValue"
-              :label="item.dictLabel"
-              :value="item.dictValue"
-            />
-          </el-select>
-        </el-form-item>
-        <!--        <el-form-item label="所属公司">-->
-        <!--          <el-select style="width: 240px" v-model="form.companyIds" multiple placeholder="请选择企业" clearable size="small" >-->
-        <!--            <el-option-->
-        <!--              v-for="item in companyOptions"-->
-        <!--              :key="item.companyId"-->
-        <!--              :label="item.companyName"-->
-        <!--              :value="item.companyId"-->
-        <!--            />-->
-        <!--          </el-select>-->
-        <!--        </el-form-item>-->
-        <el-form-item label="所属店铺" prop="storeId" v-if="medicalMallConfig.isStores">
-          <el-select style="width: 240px" v-model="form.storeId" placeholder="请选择店铺" clearable size="small">
-            <el-option
-              v-for="item in storeOptions"
-              :key="item.storeId"
-              :label="item.storeName"
-              :value="item.storeId"
-            />
-          </el-select>
-        </el-form-item>
+
         <div v-if="form.isDrug === '1'">
         <el-form-item v-if="form.isShow==='1'" label="审核说明" prop="reviewAudit">
           <el-select style="width: 240px" v-model="form.reviewAudit" placeholder="请选择审核说明" clearable
@@ -1021,80 +978,63 @@
           <Material v-model="businessArr" type="image" :num="1" :width="150" :height="150"/>
         </el-form-item>
 
-        <el-form-item v-if="form.isShow === '1' && businessArr.length > 0" label="营业执照有效期" prop="businessExpire">
-          <el-date-picker
-            v-model="form.businessExpire"
-            type="daterange"
-            value-format="yyyy-MM-dd"
-            range-separator="至"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            @change="validateBusinessExpire">
-          </el-date-picker>
-          <div v-if="businessExpireError" style="color: #F56C6C; font-size: 12px; line-height: 1; padding-top: 4px;">
-            <i class="el-icon-warning"></i> {{ businessExpireError }}
-          </div>
+        <el-form-item v-if="form.isShow === '1' && businessArr.length > 0" label="生产企业营业执照是否长期有效" prop="isBusinessPermanent">
+          <el-switch @change="switchChange()" v-model="businessValue" active-color="#13ce66" inactive-color="#ff4949" />
         </el-form-item>
 
+          <el-form-item v-if="form.isShow === '1' && businessArr.length > 0 && !businessValue" prop="businessExpire">
+            <el-date-picker
+              v-model="form.businessExpire"
+              type="daterange"
+              value-format="yyyy-MM-dd"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期">
+            </el-date-picker>
+          </el-form-item>
+
         <!--生产企业的生产许可证/备案凭证-->
         <el-form-item v-if="form.isShow === '1'" label="生产企业的生产许可证/备案凭证" prop="license">
           <Material v-model="licenseArr" type="image" :num="1" :width="150" :height="150"/>
         </el-form-item>
 
-        <el-form-item v-if="form.isShow === '1' && licenseArr.length > 0" label="生产许可证有效期" prop="licenseExpire">
-          <el-date-picker
-            v-model="form.licenseExpire"
-            type="daterange"
-            value-format="yyyy-MM-dd"
-            range-separator="至"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            @change="validateLicenseExpire">
-          </el-date-picker>
-          <div v-if="licenseExpireError" style="color: #F56C6C; font-size: 12px; line-height: 1; padding-top: 4px;">
-            <i class="el-icon-warning"></i> {{ licenseExpireError }}
-          </div>
+        <el-form-item v-if="form.isShow === '1' && licenseArr.length > 0" label="生产企业的生产许可证/备案凭证是否长期有效" prop="isLicensePermanent">
+            <el-switch @change="switchChange()" v-model="licenseValue" active-color="#13ce66" inactive-color="#ff4949" />
         </el-form-item>
 
+          <el-form-item v-if="form.isShow === '1' && licenseArr.length > 0 && !licenseValue" prop="licenseExpire">
+            <el-date-picker
+              v-model="form.licenseExpire"
+              type="daterange"
+              value-format="yyyy-MM-dd"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期">
+            </el-date-picker>
+          </el-form-item>
+
         <!--商品注册证/备案凭证-->
         <el-form-item v-if="form.isShow === '1'" label="商品注册证/备案凭证" prop="certificate">
           <Material v-model="certificateArr" type="image" :num="1" :width="150" :height="150"/>
         </el-form-item>
 
-        <el-form-item v-if="form.isShow === '1' && certificateArr.length > 0" label="注册证有效期" prop="certificateExpire">
+        <el-form-item v-if="form.isShow === '1' && licenseArr.length > 0" label="商品注册证/备案凭证是否长期有效" prop="isCertificatePermanent">
+          <el-switch @change="switchChange()" v-model="certificateValue" active-color="#13ce66" inactive-color="#ff4949" />
+        </el-form-item>
+
+        <el-form-item v-if="form.isShow === '1' && certificateArr.length > 0 && !certificateValue" prop="certificateExpire">
           <el-date-picker
-            v-model="form.certificateExpire"
-            type="daterange"
-            value-format="yyyy-MM-dd"
-            range-separator="至"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            @change="validateCertificateExpire">
+              v-model="form.certificateExpire"
+              type="daterange"
+              value-format="yyyy-MM-dd"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期">
           </el-date-picker>
-          <div v-if="certificateExpireError" style="color: #F56C6C; font-size: 12px; line-height: 1; padding-top: 4px;">
-            <i class="el-icon-warning"></i> {{ certificateExpireError }}
-          </div>
         </el-form-item>
-
-        <!--        <el-form-item v-if="form.isShow === '1' && displayDemo" label="Ⅰ类Ⅱ类备案凭证" prop="voucher">-->
-        <!--          <Material v-model="voucherArr" type="image" :num="1" :width="150" :height="150"/>-->
-        <!--        </el-form-item>-->
-        <!--        <el-form-item v-if="form.isShow === '1' && voucherArr.length > 0 && displayDemo" prop="voucherExpire">-->
-        <!--          <el-date-picker-->
-        <!--            v-model="form.voucherExpire"-->
-        <!--            type="daterange"-->
-        <!--            value-format="yyyy-MM-dd"-->
-        <!--            range-separator="至"-->
-        <!--            start-placeholder="开始日期"-->
-        <!--            end-placeholder="结束日期">-->
-        <!--          </el-date-picker>-->
-        <!--        </el-form-item>-->
-
-        <!--        GMP/GSP认证证书(后续不需要了)-->
-        <!--        <el-form-item v-if="form.isShow === '1'" label="GMP/GSP认证证书" prop="gmpAuth">-->
-        <!--          <Material v-model="gmpAuthArr" type="image" :num="1" :width="150" :height="150"/>-->
-        <!--        </el-form-item>-->
         </div>
+
+
         <el-form-item label="国药准字" v-if="form.productType==2" prop="prescribeCode">
           <el-input v-model="form.prescribeCode" placeholder="请输入国药准字"/>
         </el-form-item>
@@ -1183,10 +1123,40 @@
         </el-table-column>
       </el-table>
       <span slot="footer" class="dialog-footer">
-    <el-button type="primary" @click="authVisible = false">关 闭</el-button>
-  </span>
+        <el-button type="primary" @click="authVisible = false">关 闭</el-button>
+      </span>
     </el-dialog>
 
+<!-- 免于经营备案的第二类医疗器械产品弹窗 -->
+<el-dialog title="免于经营备案的第二类医疗器械产品" :visible.sync="exemptDeviceDialogVisible" width="80%" append-to-body modal-append-to-body="false" z-index="9999" top="5vh" custom-class="exempt-device-dialog">
+  <el-form :model="exemptDeviceQueryParams" ref="exemptDeviceQueryForm" :inline="true" label-width="80px">
+    <el-form-item label="产品名称">
+      <el-input v-model="exemptDeviceQueryParams.productName" placeholder="请输入产品名称" clearable size="small" @keyup.enter.native="handleExemptDeviceQuery" />
+    </el-form-item>
+    <el-form-item>
+      <el-button type="primary" icon="el-icon-search" size="mini" @click="handleExemptDeviceQuery">搜索</el-button>
+      <el-button icon="el-icon-refresh" size="mini" @click="resetExemptDeviceQuery">重置</el-button>
+    </el-form-item>
+  </el-form>
+
+  <el-table v-loading="exemptDeviceLoading" :data="exemptDeviceList" border>
+    <el-table-column label="产品序号" align="center" prop="serialNumber" />
+    <el-table-column label="产品名称" align="center" prop="productName" />
+    <el-table-column label="目录名称" align="center" prop="directoryName" />
+    <el-table-column label="产品描述" align="center" prop="productDescription" />
+    <el-table-column label="产品用途" align="center" prop="usageStr" />
+    <el-table-column label="创建时间" align="center" prop="createTime" width="180" />
+    <el-table-column label="更新时间" align="center" prop="updateTime" width="180" />
+  </el-table>
+
+  <div slot="footer" class="dialog-footer">
+    <el-button @click="exemptDeviceDialogVisible = false">关 闭</el-button>
+  </div>
+</el-dialog>
+
+
+
+
     <!-- 溯源码管理弹窗 -->
     <el-dialog
       :title="titleVisible"
@@ -1215,7 +1185,7 @@ import {
   importTemplate,
   batchModify,
   sync580,
-  updateIsShow, exportDrugProduct,getAuthInfo,copyProduct,selectForbiddenKeywords,checkStoreLicense
+  updateIsShow, exportDrugProduct,getAuthInfo,copyProduct,selectForbiddenKeywords,checkStoreLicense,getExemptSecondMedicalDeviceList
 } from "@/api/hisStore/storeProduct";
 import {getAllStoreProductCategory} from "@/api/hisStore/storeProductCategory";
 import {getAllStoreProductRule} from "@/api/hisStore/storeProductRule";
@@ -1240,6 +1210,7 @@ export default {
     Material,
     singleImg,
     VerifyCode,
+    singleImg
   },
   created() {
     this.$nextTick(() => {
@@ -1289,6 +1260,16 @@ export default {
     this.getTreeselect();
     this.getList();
   },
+  computed: {
+    // 计算属性:是否显示显示器免按钮
+    shouldShowExemptDeviceButton() {
+      // 只有在显示器械编码输入框且不是III类器械时才显示按钮
+      return this.showMedicalDeviceCode &&
+             this.form.cateId &&
+             this.cateIdToNameMap[this.form.cateId] &&
+             !this.cateIdToNameMap[this.form.cateId].includes('III类器械');
+    }
+  },
   watch: {
     licenseArr(val) {
       this.form.license = val.join(',');
@@ -1346,21 +1327,80 @@ export default {
     'form.cateId': {
       handler(newVal, oldVal) {
         // 分类变化时动态修改验证规则
-        if (newVal == 224) {
-          this.rules.indications = [];
-          this.rules.dosage = [];
-        }
         const cateName = this.cateIdToNameMap[newVal];
+
+        // 判断是否包含"器械"
         if(cateName !== undefined && cateName.includes('器械')){
-          this.displayDemo=true;
-        }else {
-          this.displayDemo=false;
+          this.displayDemo = true;
+        } else {
+          this.displayDemo = false;
+        }
+
+        // 判断是否为II类器械或III类器械,如果是则显示器械编码输入框
+        if (cateName !== undefined && (cateName.includes('II类器械') || cateName.includes('III类器械'))) {
+          this.showMedicalDeviceCode = true;
+          // 只有当商品分类为II类器械时才显示显示器免按钮
+          this.showExemptDeviceButton = cateName.includes('II类器械');
+        } else {
+          this.showMedicalDeviceCode = false;
+          this.showExemptDeviceButton = false;
         }
+
+        // 判断是否包含"处方药"
+        const isPrescriptionDrug = cateName !== undefined && cateName.includes('处方药');
+
+        // 如果是处方药,则移除相关字段的必填校验
+        if (isPrescriptionDrug) {
+          // 移除必填校验规则
+          const fieldsToRemoveRequired = ['indications', 'ingredient', 'dosage', 'adverseReactions', 'contraindications', 'precautions'];
+          fieldsToRemoveRequired.forEach(field => {
+            if (this.rules[field]) {
+              // 过滤掉 required 规则
+              this.rules[field] = this.rules[field].filter(rule => rule.required !== true);
+            }
+          });
+        } else {
+          // 如果不是处方药,恢复默认的必填校验规则
+          // 恢复 ingredient 字段的必填规则
+          if (!this.rules.ingredient) {
+            this.rules.ingredient = [];
+          }
+          if (!this.rules.ingredient.some(rule => rule.required)) {
+            this.rules.ingredient.unshift({ required: true, message: "成分不能为空", trigger: "blur" });
+          }
+
+          // 恢复其他字段的必填规则
+          const requiredRules = {
+            indications: [{ required: true, message: "功能主治不能为空", trigger: "blur" }],
+            dosage: [{ required: true, message: "用法用量不能为空", trigger: "blur" }],
+            adverseReactions: [{ required: true, message: "不良反应不能为空", trigger: "blur" }],
+            contraindications: [{ required: true, message: "禁忌不能为空", trigger: "blur" }],
+            precautions: [{ required: true, message: "注意事项不能为空", trigger: "blur" }]
+          };
+
+          Object.keys(requiredRules).forEach(field => {
+            if (!this.rules[field]) {
+              this.rules[field] = [];
+            }
+            // 检查是否已有 required 规则,如果没有就添加
+            if (!this.rules[field].some(rule => rule.required)) {
+              this.rules[field] = [...requiredRules[field], ...this.rules[field]];
+            }
+          });
+        }
+
         this.ingredientError = '';
         // 清除验证状态
         this.$nextTick(() => {
           if (this.$refs.form) {
-            this.$refs.form.clearValidate(['indications', 'dosage']);
+            this.$refs.form.clearValidate([
+              'indications',
+              'ingredient',
+              'dosage',
+              'adverseReactions',
+              'contraindications',
+              'precautions'
+            ]);
           }
         });
 
@@ -1395,6 +1435,9 @@ export default {
   },
   data() {
     return {
+      certificateValue:false,
+      licenseValue:false,
+      businessValue:false,
       // 溯源码弹窗相关
       titleVisible:'溯源管理:',
       verifyDialogVisible: false, // 溯源码弹窗显示状态
@@ -1408,6 +1451,8 @@ export default {
       ingredientError: '', // 成分禁止提示
       displayDemo: false,
       cateIdToNameMap: {},
+      showMedicalDeviceCode: false, // 是否显示器械编码输入框
+      showExemptDeviceButton: false, // 是否显示显示器免按钮
       businessArr: [],
       licenseArr: [],
       certificateArr: [],
@@ -1503,6 +1548,17 @@ export default {
       // 企业列表
       companyOptions: [],
       storeOptions: [],
+      // 防抖定时器
+      categoryOrStoreChangeTimer: null,
+      // 免于经营备案的第二类医疗器械产品相关变量
+      exemptDeviceDialogVisible: false,
+      exemptDeviceList: [],
+      allExemptDeviceList: [], // 保存所有数据用于本地搜索
+      exemptDeviceLoading: false,
+      exemptDeviceTotal: 0,
+      exemptDeviceQueryParams: {
+        productName: null
+      },
       // 遮罩层
       loading: true,
       // 选中数组
@@ -1569,6 +1625,7 @@ export default {
         isCertificatePermanent:null,
         isLicensePermanent:null,
         isBusinessPermanent:null,
+        medicalDeviceCode: null, // 器械编码
       },
       // 表单校验
       rules: {
@@ -1606,6 +1663,9 @@ export default {
         cateId: [
           {required: true, message: "分类id不能为空", trigger: "blur"}
         ],
+        medicalDeviceCode: [
+          {required: true, message: "器械编码不能为空", trigger: "blur"}
+        ],
         price: [
           {required: true, message: "商品价格不能为空", trigger: "blur"}
         ],
@@ -1709,35 +1769,6 @@ export default {
       },
     };
   },
-  // computed: {
-  //   // 动态验证规则 - 返回完整的规则对象
-  //   dynamicRules() {
-  //     // 复制基础规则
-  //     const rules = { ...this.rules };
-  //
-  //     // 判断是否为处方药 (cateId = 224)
-  //     const isPrescriptionDrug = this.form.cateId == 224;
-  //     console.log("分类id"+this.form.cateId);
-  //     // 修改触发时机,只在失去焦点时验证
-  //     Object.keys(rules).forEach(key => {
-  //       if (rules[key] && rules[key].length > 0) {
-  //         rules[key].forEach(rule => {
-  //           rule.trigger = 'blur'; // 只在失去焦点时验证
-  //         });
-  //       }
-  //     });
-  //     // 如果是处方药,取消功能主治和用法用量的校验
-  //     if (isPrescriptionDrug) {
-  //       rules.indications = []; // 空数组表示取消校验
-  //       rules.dosage = []; // 空数组表示取消校验
-  //     }else {
-  //       rules.indications = this.rules.indications
-  //       rules.dosage = this.rules.dosage
-  //     }
-  //
-  //     return rules;
-  //   }
-  // },
   methods: {
     // 防抖检查店铺许可证权限
     debounceCheckStoreLicense() {
@@ -1753,12 +1784,36 @@ export default {
         return;
       }
 
+      // 获取分类名称
+      const cateName = this.cateIdToNameMap[this.form.cateId];
+
+      // 判断是否为II类器械或III类器械
+      const isMedicalDevice = cateName !== undefined && (cateName.includes('II类器械') || cateName.includes('III类器械'));
+
+      // 如果是II类或III类器械,需要检查器械编码是否为空
+      if (isMedicalDevice && (!this.form.medicalDeviceCode || this.form.medicalDeviceCode.trim() === '')) {
+        this.$message.error('请选择II类器械或III类器械分类时,器械编码不能为空');
+        this.storeLicenseCheckFailed = true;
+        this.storeLicenseErrorMessage = '请选择II类器械或III类器械分类时,器械编码不能为空';
+        return;
+      }
+
       // 添加检查中标志,防止重复调用
       if (this.isCheckingLicense) {
         return;
       }
       this.isCheckingLicense = true;
-      checkStoreLicense(this.form.storeId, this.form.cateId).then(response => {
+
+      // 准备请求参数
+      let cateId = this.form.cateId;
+      let medicalDeviceCode = null;
+
+      // 如果是II类或III类器械,传递器械编码
+      if (isMedicalDevice) {
+        medicalDeviceCode = this.form.medicalDeviceCode;
+      }
+
+      checkStoreLicense(this.form.storeId, cateId, medicalDeviceCode).then(response => {
         if (response.code === 200) {
           if (!response.data.flag) {
             // 权限检查失败
@@ -1835,22 +1890,90 @@ export default {
         });
       }
     },
+    // 当商品分类或所属店铺改变时触发
+    onCategoryOrStoreChange() {
+      // 使用防抖机制,避免频繁调用
+      clearTimeout(this.categoryOrStoreChangeTimer);
+      this.categoryOrStoreChangeTimer = setTimeout(() => {
+        this.checkStoreLicensePermission();
+      }, 500);
+    },
+
+    // 显示免于经营备案的第二类医疗器械产品弹窗
+    showExemptDeviceDialog() {
+      this.exemptDeviceDialogVisible = true;
+      // 重置搜索条件
+      this.exemptDeviceQueryParams = {
+        productName: null
+      };
+      // 只有在没有数据时才获取数据
+      if (this.allExemptDeviceList.length === 0) {
+        this.getExemptDeviceList();
+      } else {
+        // 如果已有数据,直接显示
+        this.exemptDeviceList = this.allExemptDeviceList;
+        this.exemptDeviceTotal = this.exemptDeviceList.length;
+      }
+    },
+    // 获取免于经营备案的第二类医疗器械产品列表
+    getExemptDeviceList() {
+      this.exemptDeviceLoading = true;
+      // 调用实际的API接口来获取数据
+      getExemptSecondMedicalDeviceList(this.exemptDeviceQueryParams).then(response => {
+        this.allExemptDeviceList = response.rows || response.data || [];
+        // 根据搜索条件过滤数据
+        if (this.exemptDeviceQueryParams.productName) {
+          const searchTerm = this.exemptDeviceQueryParams.productName.toLowerCase();
+          this.exemptDeviceList = this.allExemptDeviceList.filter(item =>
+            item.productName && item.productName.toLowerCase().includes(searchTerm)
+          );
+        } else {
+          this.exemptDeviceList = this.allExemptDeviceList;
+        }
+        this.exemptDeviceTotal = this.exemptDeviceList.length;
+        this.exemptDeviceLoading = false;
+      }).catch(error => {
+        console.error('获取免于经营备案的第二类医疗器械产品列表失败:', error);
+        this.$message.error('获取免于经营备案的第二类医疗器械产品列表失败');
+        this.exemptDeviceLoading = false;
+        this.exemptDeviceList = [];
+        this.allExemptDeviceList = [];
+        this.exemptDeviceTotal = 0;
+      });
+    },
+    // 搜索免于经营备案的第二类医疗器械产品
+    handleExemptDeviceQuery() {
+      // 在本地数据中搜索
+      if (this.exemptDeviceQueryParams.productName) {
+        const searchTerm = this.exemptDeviceQueryParams.productName.toLowerCase();
+        this.exemptDeviceList = this.allExemptDeviceList.filter(item =>
+          item.productName && item.productName.toLowerCase().includes(searchTerm)
+        );
+      } else {
+        this.exemptDeviceList = this.allExemptDeviceList;
+      }
+      this.exemptDeviceTotal = this.exemptDeviceList.length;
+    },
+    // 重置免于经营备案的第二类医疗器械产品搜索
+    resetExemptDeviceQuery() {
+      this.exemptDeviceQueryParams = {
+        productName: null
+      };
+      // 重置时显示所有数据
+      this.exemptDeviceList = this.allExemptDeviceList;
+      this.exemptDeviceTotal = this.exemptDeviceList.length;
+    },
     handleNoticeInfo() {
       qualifications()
         .then(response => {
-          console.log("noticeInfo接口完整响应:", response);
           if (response.code === 200) {
             this.promptList = response.data;
             if (this.promptList && this.promptList.length > 0) {
               this.dialogVisible = true;
             }
-            console.log("通知信息请求完成!", this.promptList);
-          } else {
-            console.warn("接口返回非成功状态:", response.code);
           }
         })
         .catch(err => {
-          console.error("获取通知信息失败:", err);
           this.$message.error("加载通知信息失败,请稍后重试");
         });
     },
@@ -2097,6 +2220,7 @@ export default {
     },
     // 表单重置
     reset() {
+      this.initPrescriptionDrugRules(); // 重置处方药相关的校验规则
       this.isFormInitialized = false; // 重置初始化标志
       this.ingredientError = '';
       this.form = {
@@ -2302,7 +2426,23 @@ export default {
           this.qualificationArr = this.form.qualificationCertificate.split(",");
         }
 
+        if(this.form.isBusinessPermanent == 1){
+          this.businessValue = true
+        }else {
+          this.businessValue = false
+        }
 
+        if(this.form.isLicensePermanent == 1){
+          this.licenseValue = true
+        }else {
+          this.licenseValue = false
+        }
+
+        if(this.form.isCertificatePermanent == 1){
+          this.certificateValue = true
+        }else {
+          this.certificateValue = false
+        }
 
         const expireFieldMap = [
           { expireKey: 'businessExpire', startKey: 'businessStart', endKey: 'businessEnd' },
@@ -2440,10 +2580,24 @@ export default {
             this.form.qualificationCertificateEnd = this.form.qualificationExpire[1];
           }
 
-          // 删除长期有效标识,所有证书都需要填写有效期
-          this.form.isBusinessPermanent = 0;
-          this.form.isLicensePermanent = 0;
-          this.form.isCertificatePermanent = 0;
+          //无语,有的时候要删除,删除了又要加回来。
+          if(!!this.businessValue){
+            this.form.isBusinessPermanent=1;
+          }else {
+            this.form.isBusinessPermanent=0;
+          }
+
+          if(!!this.licenseValue){
+            this.form.isLicensePermanent=1;
+          }else {
+            this.form.isLicensePermanent=0;
+          }
+
+          if(!!this.certificateValue){
+            this.form.isCertificatePermanent=1;
+          }else {
+            this.form.isCertificatePermanent=0;
+          }
 
           // // 组装companyIds
           // if (this.form.companyIds != null && this.form.companyIds != undefined) {
@@ -2629,6 +2783,50 @@ export default {
       const error = this.checkCertificateExpire(dates, '注册证');
       this.certificateExpireError = error ? error + '!' : '';
     },
+    // 添加一个新的方法用于初始化处方药相关规则
+    initPrescriptionDrugRules() {
+      // 初始化处方药相关字段的校验规则
+      this.$set(this.rules, 'indications', [
+        { required: true, message: "功能主治不能为空", trigger: "blur" }
+      ]);
+
+      this.$set(this.rules, 'ingredient', [
+        { required: true, message: "成分不能为空", trigger: "blur" },
+        {
+          validator: (rule, value, callback) => {
+            if (this.ingredientError) {
+              callback(new Error(this.ingredientError));
+            } else {
+              callback();
+            }
+          },
+          trigger: "blur"
+        }
+      ]);
+
+      this.$set(this.rules, 'dosage', [
+        { required: true, message: "用法用量不能为空", trigger: "blur" }
+      ]);
+
+      this.$set(this.rules, 'adverseReactions', [
+        { required: true, message: "不良反应不能为空", trigger: "blur" }
+      ]);
+
+      this.$set(this.rules, 'contraindications', [
+        { required: true, message: "禁忌不能为空", trigger: "blur" }
+      ]);
+
+      this.$set(this.rules, 'precautions', [
+        { required: true, message: "注意事项不能为空", trigger: "blur" }
+      ]);
+    },
+    // 组件销毁前清理定时器
+    beforeDestroy() {
+      if (this.categoryOrStoreChangeTimer) {
+        clearTimeout(this.categoryOrStoreChangeTimer);
+      }
+    }
+    },
     //打开溯源码页面
     openVerify(row){
       if (row) {
@@ -2662,3 +2860,17 @@ export default {
   }
 };
 </script>
+
+<style scoped>
+.exempt-device-dialog {
+  z-index: 9999 !important;
+}
+
+.exempt-device-dialog .el-dialog {
+  z-index: 9999 !important;
+}
+
+.exempt-device-dialog .el-dialog__wrapper {
+  z-index: 9999 !important;
+}
+</style>