Browse Source

店铺管理支持上传PDF、图片、word文档

luolinsong 2 days ago
parent
commit
1037f21ab2
1 changed files with 452 additions and 39 deletions
  1. 452 39
      src/views/hisStore/store/index.vue

+ 452 - 39
src/views/hisStore/store/index.vue

@@ -677,23 +677,54 @@
           <el-divider content-position="left">签署协议与特殊资质信息</el-divider>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="其它资质-入驻协议">
+              <el-input v-model="form.titleNameOne" placeholder="请输入标题" />
+<!--              <el-form-item label="其它资质-入驻协议">回退代码-->
                 <el-upload
-                  class="avatar-uploader"
+                  class="file-uploader"
                   :action="uploadUrl"
                   :show-file-list="false"
-                  :on-success="(response, file) => handleFileSuccess(response, file, 'settlementAgreement')"
-                  :before-upload="beforeAvatarUpload">
-                  <img v-if="form.settlementAgreement" :src="form.settlementAgreement" class="avatar" width="100px" />
-                  <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+                :on-success="(response, file) => handleFileSuccess1(response, file, 'settlementAgreement')"
+                :on-error="handleFileError"
+                :before-upload="beforeFileUpload"
+                :disabled="!!form.settlementAgreement"
+                accept=".jpg,.jpeg,.png,.gif,.doc,.docx,.pdf"
+                >
+                <!-- 已上传文件展示(区分图片和文档) -->
+                <div v-if="form.settlementAgreement" class="uploaded-file">
+                  <!-- 图片文件显示预览图 -->
+                  <img v-if="isImageFile(form.settlementAgreement, 'settlementAgreement')" :src="form.settlementAgreement" class="uploaded-img" width="100px" />
+                  <div v-else class="document-icon">
+                    <i :class="getDocumentIconClass(form.settlementAgreement, 'settlementAgreement')" class="icon"></i>
+                    <span class="file-name">{{ form.settlementAgreementFileName || getFileName(form.settlementAgreement) }}</span>
+                  </div>
+                  <!-- 删除按钮 -->
+                  <i class="el-icon-delete delete-icon" @click.stop="handleFileRemove('settlementAgreement')"></i>
+                </div>
+                <!-- 未上传时的上传按钮 -->
+                  <div v-else class="upload-btn">
+                    <div class="upload-btn-inner">
+                      <i class="el-icon-plus"></i>
+                      <span class="upload-tip">点击上传</span>
+                    </div>
+                  </div>
                 </el-upload>
-              </el-form-item>
-              <el-form-item label="其它资质-入驻协议编号" prop="settlementAgreementCode" style="margin-left: 5px">
-                <el-input v-model="form.settlementAgreementCode" placeholder="请输入其它资质-入驻协议编号" />
+
+              <el-form-item label="备注内容" prop="settlementAgreementCode" style="margin-left: 5px">
+                <el-input v-model="form.settlementAgreementCode" placeholder="请输入备注内容" />
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="其它资质-入驻协议有效期">
+                             <!--  其它资质-入驻协议是否长期有效-->
+              <el-form-item label="协议是否长期有效" prop="isEffectivePermanent1">
+                <el-switch
+                  @change="switchChange()"
+                  v-model="medicalLicenseExpiryValue1"
+                  active-color="#13ce66"
+                  inactive-color="#ff4949">
+                </el-switch>
+              </el-form-item>
+                              <!--其它资质-入驻协议有效期-->
+              <el-form-item label="协议有效期"  prop="medicalLicenseExpiry" v-if="!medicalLicenseExpiryValue1">
                 <el-date-picker
                   v-model="form.settlementAgreementExpiry"
                   type="daterange"
@@ -706,24 +737,56 @@
             </el-col>
           </el-row>
           <el-row>
+
             <el-col :span="12">
-              <el-form-item label="质量保证协议">
-                <el-upload
-                  class="avatar-uploader"
-                  :action="uploadUrl"
-                  :show-file-list="false"
-                  :on-success="(response, file) => handleFileSuccess(response, file, 'qualityAssuranceAgreement')"
-                  :before-upload="beforeAvatarUpload">
-                  <img v-if="form.qualityAssuranceAgreement" :src="form.qualityAssuranceAgreement" class="avatar" width="100px">
-                  <i v-else class="el-icon-plus avatar-uploader-icon"></i>
-                </el-upload>
-              </el-form-item>
-              <el-form-item label="质量保证协议编号" prop="qualityAssuranceAgreementCode" style="margin-left: 5px">
-                <el-input v-model="form.qualityAssuranceAgreementCode" placeholder="请输入质量保证协议编号" />
+              <el-input v-model="form.titleNameTwo" placeholder="请输入标题" />
+              <!--              <el-form-item label="质量保证协议">-->
+              <el-upload
+                class="file-uploader"
+                :action="uploadUrl"
+                :show-file-list="false"
+                :on-success="(response, file) => handleFileSuccess1(response, file, 'qualityAssuranceAgreement')"
+                :on-error="handleFileError"
+                :before-upload="beforeFileUpload"
+                :disabled="!!form.qualityAssuranceAgreement"
+                accept=".jpg,.jpeg,.png,.gif,.doc,.docx,.pdf"
+              >
+                <!-- 已上传文件展示(区分图片和文档) -->
+                <div v-if="form.qualityAssuranceAgreement" class="uploaded-file">
+                  <!-- 图片文件显示预览图 -->
+                  <img v-if="isImageFile(form.qualityAssuranceAgreement, 'qualityAssuranceAgreement')" :src="form.qualityAssuranceAgreement" class="uploaded-img" width="100px" />
+                  <div v-else class="document-icon">
+                    <i :class="getDocumentIconClass(form.qualityAssuranceAgreement, 'qualityAssuranceAgreement')" class="icon"></i>
+                    <span class="file-name">{{ form.qualityAssuranceAgreementFileName || getFileName(form.qualityAssuranceAgreement) }}</span>
+                  </div>
+                  <!-- 删除按钮 -->
+                  <i class="el-icon-delete delete-icon" @click.stop="handleFileRemove('qualityAssuranceAgreement')"></i>
+                </div>
+                <!-- 未上传时的上传按钮 -->
+                <div v-else class="upload-btn">
+                  <div class="upload-btn-inner">
+                    <i class="el-icon-plus"></i>
+                    <span class="upload-tip">点击上传</span>
+                  </div>
+                </div>
+              </el-upload>
+
+              <el-form-item label="备注内容" prop="qualityAssuranceAgreementCode" style="margin-left: 5px">
+                <el-input v-model="form.qualityAssuranceAgreementCode" placeholder="请输入备注内容" />
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="质量保证协议有效期">
+              <!--  质量保证协议是否长期有效-->
+              <el-form-item label="协议是否长期有效" prop="isEffectivePermanent2">
+                <el-switch
+                  @change="switchChange()"
+                  v-model="medicalLicenseExpiryValue2"
+                  active-color="#13ce66"
+                  inactive-color="#ff4949">
+                </el-switch>
+              </el-form-item>
+              <!--质量保证协议有效期-->
+              <el-form-item label="协议有效期"  prop="medicalLicenseExpiry" v-if="!medicalLicenseExpiryValue2">
                 <el-date-picker
                   v-model="form.qualityAssuranceAgreementExpiry"
                   type="daterange"
@@ -734,26 +797,91 @@
                 </el-date-picker>
               </el-form-item>
             </el-col>
+
           </el-row>
+<!--          <el-row>-->
+<!--            <el-col :span="12">-->
+<!--              <el-form-item label="质量保证协议">-->
+<!--                <el-upload-->
+<!--                  class="avatar-uploader"-->
+<!--                  :action="uploadUrl"-->
+<!--                  :show-file-list="false"-->
+<!--                  :on-success="(response, file) => handleFileSuccess(response, file, 'qualityAssuranceAgreement')"-->
+<!--                  :before-upload="beforeAvatarUpload">-->
+<!--                  <img v-if="form.qualityAssuranceAgreement" :src="form.qualityAssuranceAgreement" class="avatar" width="100px">-->
+<!--                  <i v-else class="el-icon-plus avatar-uploader-icon"></i>-->
+<!--                </el-upload>-->
+<!--              </el-form-item>-->
+<!--              <el-form-item label="质量保证协议编号" prop="qualityAssuranceAgreementCode" style="margin-left: 5px">-->
+<!--                <el-input v-model="form.qualityAssuranceAgreementCode" placeholder="请输入质量保证协议编号" />-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
+<!--            <el-col :span="12">-->
+<!--              <el-form-item label="质量保证协议有效期">-->
+<!--                <el-date-picker-->
+<!--                  v-model="form.qualityAssuranceAgreementExpiry"-->
+<!--                  type="daterange"-->
+<!--                  value-format="yyyy-MM-dd"-->
+<!--                  range-separator="至"-->
+<!--                  start-placeholder="开始日期"-->
+<!--                  end-placeholder="结束日期">-->
+<!--                </el-date-picker>-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
+<!--          </el-row>-->
           <el-row>
+
+
             <el-col :span="12">
-              <el-form-item label="其它特殊资质">
-                <el-upload
-                  class="avatar-uploader"
-                  :action="uploadUrl"
-                  :show-file-list="false"
-                  :on-success="(response, file) => handleFileSuccess(response, file, 'otherSpecialQualification')"
-                  :before-upload="beforeAvatarUpload">
-                  <img v-if="form.otherSpecialQualification" :src="form.otherSpecialQualification" class="avatar" width="100px">
-                  <i v-else class="el-icon-plus avatar-uploader-icon"></i>
-                </el-upload>
-              </el-form-item>
-              <el-form-item label="其它特殊资质编号" prop="otherSpecialQualificationCode" style="margin-left: 5px">
-                <el-input v-model="form.otherSpecialQualificationCode" placeholder="请输入其它特殊资质编号" />
+              <el-input v-model="form.titleNameThree" placeholder="请输入标题" />
+              <!--              <el-form-item label="其它资质-入驻协议">-->
+              <el-upload
+                class="file-uploader"
+                :action="uploadUrl"
+                :show-file-list="false"
+                :on-success="(response, file) => handleFileSuccess1(response, file, 'otherSpecialQualification')"
+                :on-error="handleFileError"
+                :before-upload="beforeFileUpload"
+                :disabled="!!form.otherSpecialQualification"
+                accept=".jpg,.jpeg,.png,.gif,.doc,.docx,.pdf"
+              >
+                <!-- 已上传文件展示(区分图片和文档) -->
+                <div v-if="form.otherSpecialQualification" class="uploaded-file">
+                  <!-- 图片文件显示预览图 -->
+                  <img v-if="isImageFile(form.otherSpecialQualification, 'otherSpecialQualification')" :src="form.otherSpecialQualification" class="uploaded-img" width="100px" />
+                  <div v-else class="document-icon">
+                    <i :class="getDocumentIconClass(form.otherSpecialQualification, 'otherSpecialQualification')" class="icon"></i>
+                    <span class="file-name">{{ form.otherSpecialQualificationFileName || getFileName(form.otherSpecialQualification) }}</span>
+                  </div>
+                  <!-- 删除按钮 -->
+
+                  <i class="el-icon-delete delete-icon" @click.stop="handleFileRemove('otherSpecialQualification')"></i>
+                </div>
+                <!-- 未上传时的上传按钮 -->
+                <div v-else class="upload-btn">
+                  <div class="upload-btn-inner">
+                    <i class="el-icon-plus"></i>
+                    <span class="upload-tip">点击上传</span>
+                  </div>
+                </div>
+              </el-upload>
+
+              <el-form-item label="备注内容" prop="otherSpecialQualificationCode" style="margin-left: 5px">
+                <el-input v-model="form.otherSpecialQualificationCode" placeholder="请输入备注内容" />
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="其它特殊资质有效期">
+              <!--  其它资质-入驻协议是否长期有效-->
+              <el-form-item label="协议是否长期有效" prop="isEffectivePermanent3">
+                <el-switch
+                  @change="switchChange()"
+                  v-model="medicalLicenseExpiryValue3"
+                  active-color="#13ce66"
+                  inactive-color="#ff4949">
+                </el-switch>
+              </el-form-item>
+              <!--质量保证协议有效期-->
+              <el-form-item label="协议有效期"  prop="medicalLicenseExpiry" v-if="!medicalLicenseExpiryValue3">
                 <el-date-picker
                   v-model="form.otherSpecialQualificationExpiry"
                   type="daterange"
@@ -764,7 +892,39 @@
                 </el-date-picker>
               </el-form-item>
             </el-col>
+
+
           </el-row>
+<!--          <el-row>-->
+<!--            <el-col :span="12">-->
+<!--              <el-form-item label="其它特殊资质">-->
+<!--                <el-upload-->
+<!--                  class="avatar-uploader"-->
+<!--                  :action="uploadUrl"-->
+<!--                  :show-file-list="false"-->
+<!--                  :on-success="(response, file) => handleFileSuccess(response, file, 'otherSpecialQualification')"-->
+<!--                  :before-upload="beforeAvatarUpload">-->
+<!--                  <img v-if="form.otherSpecialQualification" :src="form.otherSpecialQualification" class="avatar" width="100px">-->
+<!--                  <i v-else class="el-icon-plus avatar-uploader-icon"></i>-->
+<!--                </el-upload>-->
+<!--              </el-form-item>-->
+<!--              <el-form-item label="其它特殊资质编号" prop="otherSpecialQualificationCode" style="margin-left: 5px">-->
+<!--                <el-input v-model="form.otherSpecialQualificationCode" placeholder="请输入其它特殊资质编号" />-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
+<!--            <el-col :span="12">-->
+<!--              <el-form-item label="其它特殊资质有效期">-->
+<!--                <el-date-picker-->
+<!--                  v-model="form.otherSpecialQualificationExpiry"-->
+<!--                  type="daterange"-->
+<!--                  value-format="yyyy-MM-dd"-->
+<!--                  range-separator="至"-->
+<!--                  start-placeholder="开始日期"-->
+<!--                  end-placeholder="结束日期">-->
+<!--                </el-date-picker>-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
+<!--          </el-row>-->
         </div>
         <el-divider content-position="left">店铺配置信息</el-divider>
         <el-form-item label="退货地址" prop="refundAddress">
@@ -891,6 +1051,9 @@ export default {
       medicalDevice3ExpiryValue:false,
       foodLicenseExpiryValue:false,
       medicalLicenseExpiryValue:false,
+      medicalLicenseExpiryValue1:false,//协议有效期控制
+      medicalLicenseExpiryValue2:false,//协议有效期控制
+      medicalLicenseExpiryValue3:false,//协议有效期控制
       show: {
         title: "店铺详情",
         open: false,
@@ -948,7 +1111,18 @@ export default {
         account: null,
       },
       // 表单参数
-      form: {},
+      form: {
+        settlementAgreementFileType: '', // 入驻协议文件类型(如 application/pdf)
+        qualityAssuranceAgreementFileType: '', // 质量保证协议文件类型
+        otherSpecialQualificationFileType: '', // 其他特殊资质文件类型
+        settlementAgreement: null,
+        settlementAgreementFileName: null, // 新增:存储文件名
+        qualityAssuranceAgreement: null,
+        qualityAssuranceAgreementFileName: null, // 新增:存储文件名
+        otherSpecialQualification: null,
+        otherSpecialQualificationFileName: null // 新增:存储文件名
+
+      },
       // 表单校验
       rules: {
         storeName: [
@@ -1244,6 +1418,9 @@ export default {
         medicalLicense: null,  // 医疗机构执业许可证文件
         medicalLicenseExpiry: null, // 医疗机构执业许可证有效期
         settlementAgreement: null,  //其它资质-入驻协议
+        settlementAgreementFileName: null,
+        qualityAssuranceAgreementFileName: null, // 新增:质量保证协议文件名
+        otherSpecialQualificationFileName: null,// 新增:其他特殊资质文件名
         settlementAgreementExpiry: null,//其它资质-有效期
         qualityAssuranceAgreement: null,//质量保证协议
         qualityAssuranceAgreementExpiry: null,//质量保证协议有效期
@@ -1259,6 +1436,13 @@ export default {
         otherSpecialQualificationCode:null,
         qualityAssuranceAgreementCode:null,
         settlementAgreementCode: null,
+        titleNameOne: null,
+        titleNameTwo: null,
+        titleNameThree: null,
+
+        settlementAgreementFileType: '',
+        qualityAssuranceAgreementFileType: '',
+        otherSpecialQualificationFileType: ''
       };
       this.resetForm("form");
     },
@@ -1441,6 +1625,15 @@ export default {
         if(this.form.isMedicalLicenseExpiryPermanent == 1){
           this.medicalLicenseExpiryValue = true;
         }
+        if(this.form.isEffectivePermanent1 == 1){
+          this.medicalLicenseExpiryValue1 = true;
+        }
+        if(this.form.isEffectivePermanent2 == 1){
+          this.medicalLicenseExpiryValue2 = true;
+        }
+        if(this.form.isEffectivePermanent3 == 1){
+          this.medicalLicenseExpiryValue3 = true;
+        }
         this.open = true;
         this.title = "修改店铺";
 
@@ -1603,6 +1796,21 @@ export default {
           }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;
+          }
           if (formData.storeId != null) {
             updateStore(formData).then(response => {
               this.msgSuccess("修改成功");
@@ -1679,11 +1887,216 @@ export default {
     switchChange(){
       console.log(this.form.isBusinessLicensePermanent);
     },
+    // 判断是否为图片文件(根据URL后缀)
+    isImageFile(url, field) {
+      // 若有存储的文件类型,直接用 MIME 类型判断
+      if (this.form[`${field}FileType`]) {
+        return this.form[`${field}FileType`].startsWith('image/');
+      }
+      // 后备:用 URL 后缀判断
+      const imageExts = ['jpg', 'jpeg', 'png', 'gif'];
+      const ext = url.split('.').pop()?.toLowerCase() || '';
+      return imageExts.includes(ext);
+    },
+
+// 根据文件类型获取文档图标(优先用 MIME 类型)
+    getDocumentIconClass(url, field) {
+      // 若有存储的文件类型,直接用 MIME 类型判断
+      if (this.form[`${field}FileType`]) {
+        const fileType = this.form[`${field}FileType`];
+        if (fileType === 'application/msword' || fileType === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
+          return 'el-icon-document';
+        } else if (fileType === 'application/pdf') {
+          return 'el-icon-file-pdf';
+        }
+        return 'el-icon-file';
+      }
+      // 后备:用 URL 后缀判断
+      const ext = url.split('.').pop()?.toLowerCase() || '';
+      if (ext === 'doc' || ext === 'docx') {
+        return 'el-icon-document';
+      } else if (ext === 'pdf') {
+        return 'el-icon-file-pdf';
+      }
+      return 'el-icon-file';
+    },
+
+    // /// 从URL中提取文件名代码回退
+    getFileName(url) {
+      return url.split('/').pop().split('?')[0].slice(-8);
+    },
+
+    // 文件上传前校验
+    beforeFileUpload(file) {
+      // 校验文件类型
+      const acceptTypes = [
+        'image/jpeg',
+        'image/png',
+        'image/gif',
+        'application/msword',
+        'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+        'application/pdf'
+      ];
+      if (!acceptTypes.includes(file.type)) {
+        this.$message.error('请上传JPG、PNG、GIF、Word或PDF格式的文件');
+        return false;
+      }
+
+      // 2. 校验文件大小(10MB)
+      const maxSize = 10 * 1024 * 1024; // 10MB
+      if (file.size > maxSize) {
+        this.$message.error('文件大小不能超过10MB');
+        return false;
+      }
+
+      return true;
+    },
+
+    // 文件上传成功处理(复用原有逻辑,仅优化提示)
+    handleFileSuccess1(response, file, field) {
+      this.form[field] = response.url;
+      this.form[`${field}FileName`] = file.name;
+      this.form[`${field}FileType`] = file.type; // 新增:记录文件 MIME 类型
+      this.$message.success(`文件:${file.name}上传成功`);
+    },
+
+    // 文件上传失败处理
+    handleFileError(err, file) {
+      this.$message.error(`文件《${file.name}》上传失败,请重试`);
+    },
+
+    // 移除已上传文件
+    handleFileRemove(field) {
+      this.form[field] = '';
+      this.form[`${field}FileName`] = ''; // 清空文件名
+      this.$message.info('文件已移除');
+    },
   }
 };
 </script>
 <style>
+.file-uploader {
+  display: inline-block;
+}
+
+/* 已上传文件容器 */
+.uploaded-file {
+  position: relative;
+  display: inline-block;
+  cursor: default;
+}
+
+/* 已上传图片样式 */
+.uploaded-img {
+  width: 150px;
+  height: 150px;
+  border-radius: 4px;
+  border: 1px solid #e4e7ed;
+  vertical-align: middle;
+}
+
+/* 文档图标容器 */
+/* 文档图标容器 */
+.document-icon {
+  width: 150px;
+  height: 150px;
+  border: 1px solid #e4e7ed;
+  border-radius: 4px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  background-color: #f5f7fa;
+  vertical-align: middle;
+}
+
+.document-icon .icon {
+  font-size: 36px;
+  color: #409eff;
+  margin-bottom: 8px;
+  font-family: "element-icons" !important; /* 强制使用 Element 图标字体 */
+  display: inline-block; /* 确保图标正常渲染 */
+  speak: none; /* 消除语音朗读干扰 */
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+  vertical-align: baseline;
+  -webkit-font-smoothing: antialiased; /* 优化渲染 */
+}
+
+.document-icon .file-name {
+  font-size: 12px;
+  color: #606266;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  width: 80%;
+  text-align: center;
+}
+
+/* 删除图标 */
+.delete-icon {
+  position: absolute;
+  top: -8px;
+  right: -8px;
+  width: 20px;
+  height: 20px;
+  line-height: 20px;
+  text-align: center;
+  background-color: #f56c6c;
+  color: #fff;
+  border-radius: 50%;
+  cursor: pointer;
+  font-size: 12px;
+  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+}
+
+/* 上传按钮(外层正方形边框) */
+.upload-btn {
+  width: 150px;
+  height: 150px;
+  /* 正方形边框 - 实线边框,默认灰色 */
+  border: 1px solid #dcdfe6;
+  border-radius: 4px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+  transition: all 0.3s;
+}
+
+/* 上传按钮 hover 效果(边框变色) */
+.upload-btn:hover {
+  border-color: #409eff;
+  background-color: #f0f7ff; /* 轻微背景色变化,增强交互感 */
+}
 
+/* 上传按钮内部内容容器 */
+.upload-btn-inner {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  color: #c0c4cc;
+}
+
+.upload-btn-inner i {
+  font-size: 28px;
+  margin-bottom: 8px;
+}
+
+.upload-btn-inner .upload-tip {
+  font-size: 12px;
+}
+
+/* 上传说明 */
+.upload-desc {
+  margin-top: 8px;
+  font-size: 12px;
+  color: #909399;
+}
 .avatar-uploader .el-upload {
   border: 1px dashed #d9d9d9;
   border-radius: 6px;