Jelajahi Sumber

feat: 投标企业信用报告购买页

Signed-off-by: tangshizhe <48740614+tangshizhe@users.noreply.github.com>
tangshizhe 4 bulan lalu
induk
melakukan
e0cfdec3dc

+ 9 - 0
apps/mobile/src/api/modules/pay.js

@@ -405,3 +405,12 @@ export function vipGiftDetailAjax(data) {
     data
   })
 }
+
+export function creditReportEntSearch(data) {
+  data = qs.stringify(data)
+  return request({
+    url: '/subscribepay/bidCreditReport/entSearch',
+    method: 'POST',
+    data
+  })
+}

+ 10 - 1
apps/mobile/src/router/modules/common.js

@@ -32,7 +32,7 @@ export default [
       title: '区域'
     }
   },
-  //  
+  //
   {
     path: '/vipsubscribeRights',
     name: 'vipsubscribeRights',
@@ -41,5 +41,14 @@ export default [
       header: true,
       title: '会员服务列表'
     }
+  },
+  {
+    path: '/pdfview',
+    name: 'pdfview',
+    component: () => import('@/views/common/pdfViewExample.vue'),
+    meta: {
+      header: true,
+      title: '投标企业信用报告样例'
+    }
   }
 ]

+ 4 - 2
apps/mobile/src/router/modules/order.js

@@ -119,14 +119,16 @@ export default [
         name: 'createCreditReportOrder',
         meta: {
           header: true,
-          productId: 103,
+          productId: 150,
           title: '购买投标企业信用报告'
         },
         components: createRouterNamedComponents({
           default: () =>
             import('@/views/create-order/components/creditreport/Default'),
           activity: null,
-          form: null
+          form: null,
+          footer: () =>
+            import('@/views/create-order/components/creditreport/Footer')
         })
       },
       {

+ 2 - 0
apps/mobile/src/store/modules/createOrder.js

@@ -69,6 +69,7 @@ const productNameMap = {
   115: '采购单位画像包',
   117: '数据报告',
   118: '剑鱼文库会员',
+  150: '投标企业信用报告',
   203: '市场分析定制报告下载包',
   201: '企业中标分析报告下载包',
   202: '业主采购分析报告下载包'
@@ -130,6 +131,7 @@ export default {
        * 113 省份订阅包
        * 114 附件下载包
        * 115 采购单位画像包
+       * 150 投标企业信用报告
        */
       id: -1,
       // 当前产品请求附加参数信息

+ 55 - 27
apps/mobile/src/views/article/components/ContentHeader.vue

@@ -23,8 +23,7 @@
         class="j-tag-item border gray round"
         :class="[tag.className]"
         :href="tag.link"
-        >{{ tag.label }}</a
-      >
+      >{{ tag.label }}</a>
     </div>
     <div v-if="showCollection" class="tag-list">
       <span
@@ -32,8 +31,7 @@
         :key="tag.id"
         class="j-tag-item blue round text-underline"
         @click="onCollectionTagClick(tag)"
-        >{{ tag.label }}</span
-      >
+      >{{ tag.label }}</span>
     </div>
     <div class="sub-info-line">
       <span class="info-publish-time">{{ content.time }}</span>
@@ -41,19 +39,26 @@
         参标人:{{ cbPersonText }}
       </span>
       <!-- 无参标人和时间一行 -->
-      <div
-        v-else-if="showRenMaiButton"
-        class="relationship-button"
-        @click="findRenMai"
-      >
-        <span class="relationship-icon j-icon j-base-icon icon-renmai" />
-        <span class="relationship-text">找人脉</span>
+      <div v-else-if="showRenMaiButton" class="sub-info-line">
+        <div class="creditreport-button" @click="creditReport">
+          <span class="creditreport-text">投标企业信用报告</span>
+        </div>
+        <div
+          class="relationship-button"
+          @click="findRenMai"
+        >
+          <span class="relationship-icon j-icon j-base-icon icon-renmai" />
+          <span class="relationship-text">找人脉</span>
+        </div>
       </div>
     </div>
     <div v-if="showRenMaiButton2" class="sub-info-line">
       <div class="sub-info-line-l" />
       <div class="sub-info-line-r">
         <!-- 有参标人时候另起一行 -->
+        <div v-if="cbPersonText && showRenMaiButton" class="creditreport-button" @click="creditReport">
+          <span class="creditreport-text">投标企业信用报告</span>
+        </div>
         <div
           v-if="cbPersonText && showRenMaiButton"
           class="relationship-button"
@@ -92,9 +97,9 @@ export default {
   },
   computed: {
     ...mapState({
-      content: (state) => state.article.mainModel.content,
-      summary: (state) => state.article.mainModel.summary,
-      otherModel: (state) => state.article.otherModel,
+      content: state => state.article.mainModel.content,
+      summary: state => state.article.mainModel.summary,
+      otherModel: state => state.article.otherModel,
       IsSunPublishContent() {
         return this.content.IsSunPublishContent || false
       },
@@ -116,7 +121,8 @@ export default {
       headerType() {
         if (this.IsSunPublishContent) {
           return this.content.publicType
-        } else {
+        }
+        else {
           return '业主委托项目'
         }
       }
@@ -128,13 +134,15 @@ export default {
       }
       const { inBiddingPersonList: bList } = this.otherModel
       if (Array.isArray(bList) && bList.length > 0) {
-        const list = bList.map((b) => b.trim()).filter((b) => !!b)
+        const list = bList.map(b => b.trim()).filter(b => !!b)
         if (list.length > 1) {
           return `${list.slice(0, 1).join(',')} 等`
-        } else {
+        }
+        else {
           return list.join(',')
         }
-      } else {
+      }
+      else {
         return ''
       }
     },
@@ -173,12 +181,19 @@ export default {
         if (res && Array.isArray(res.data)) {
           return res.data.includes('bi_rmgl')
         }
-      } catch (error) {
+      }
+      catch (error) {
         console.log(error)
-      } finally {
+      }
+      finally {
         this.renmai.loading = false
       }
     },
+    creditReport() {
+      this.$router.push({
+        path: '/order/create/creditreport'
+      })
+    },
     async findRenMai() {
       const hasPower = await this.checkHasRemMaiPower()
       if (hasPower) {
@@ -189,7 +204,8 @@ export default {
           showCancelButton: false,
           confirmButtonText: '我知道了'
         })
-      } else {
+      }
+      else {
         // 弹窗
         // this.$toast('暂无权限')
         // 跳转大会员落地页
@@ -290,20 +306,32 @@ export default {
 }
 
 .sub-info-line-r {
-  position: relative;
+  display: flex;
+  align-items: center;
+}
+.creditreport-button {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-right: 10px;
+  padding: 2px 8px;
+  line-height: 20px;
+  color: #fff;
+  background: linear-gradient(to right, #5FD4E3, #28C1E2);
+  border-radius: 4px;
 }
 .relationship-button {
-  position: relative;
-  right: -16px;
-  top: 0;
+  // position: relative;
+  // right: -16px;
+  // top: 0;
   display: flex;
   align-items: center;
   justify-content: space-between;
   padding: 2px 12px;
   height: 24px;
   color: #fff;
-  background-color: $main;
-  border-radius: 14px 0 0 14px;
+  background: linear-gradient(to right, #5FD4E3, #28C1E2);
+  border-radius: 4px;
   .j-icon {
     margin-right: 4px;
     width: 12px;

+ 29 - 0
apps/mobile/src/views/common/pdfViewExample.vue

@@ -0,0 +1,29 @@
+<template>
+  <div>
+    <div class="pdf-container">
+      <iframe v-if="pdfUrl" :src="pdfUrl" />
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'PdfViewExample',
+  data() {
+    return {
+      pdfUrl: 'https://www.kdocs.cn/l/co62pOTVms8w'
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.pdf-container {
+  width: 100%;
+  height: 100%;
+  iframe {
+    width: 100%;
+    height: 100%;
+  }
+}
+</style>

+ 102 - 0
apps/mobile/src/views/create-order/components/creditreport/Footer.vue

@@ -0,0 +1,102 @@
+<template>
+  <div>
+    <SubmitBar
+      class="credit-order-footer"
+      :checked="canNextMap.read"
+      :params="params"
+      :confirm-btn-text="confirmBtnText"
+      :confirm-disabled="confirmDisabled"
+      :confirm-btn-tip-text="confirmBtnTipText"
+      cancel-btn-text="报告样例"
+      :show-cancel-btn="showCancelBtn"
+      :show-price="showPrice"
+      @input="checkedChange"
+      @confirmBtn="onConfirm"
+      @cancelBtn="onCancel"
+      @pass="checkedChange"
+    />
+  </div>
+</template>
+
+<script>
+import { mapActions, mapGetters, mapMutations, mapState } from 'vuex'
+import SubmitBar from '@/components/create-order/SubmitBar'
+
+export default {
+  name: 'CreateOrderFooter',
+  components: {
+    SubmitBar
+  },
+  data() {
+    return {
+      showCancelBtn: true
+    }
+  },
+  computed: {
+    ...mapState('createOrder', ['canNextMap', 'hooks']),
+    ...mapGetters('createOrder', [
+      'productOrderAmount',
+      'productUI',
+      'canSubmitOrder'
+    ]),
+    params() {
+      const { pay, origin, discount } = this.productOrderAmount
+      const { deductCount } = this.productUI
+      return {
+        deductCount,
+        pay,
+        origin,
+        discount // 折扣,优惠了多少钱
+      }
+    },
+    confirmDisabled() {
+      return !this.canSubmitOrder
+    },
+    showPrice() {
+      // 个人支付显示价格信息
+      return this.productUI.personalPay
+    },
+    confirmBtnTipText() {
+      return this.productUI.personalPay ? undefined : ''
+    },
+    confirmBtnText() {
+      return this.productUI.submitText || '提交订单'
+    }
+  },
+  methods: {
+    ...mapMutations('createOrder', ['updateCanNextMap']),
+    ...mapActions('createOrder', ['submitCreatedProductOrder']),
+    checkedChange(f) {
+      this.updateCanNextMap({
+        read: f
+      })
+    },
+    onCancel() {
+      this.$router.push({
+        path: '/common/pdfview'
+      })
+    },
+    onConfirm() {
+      this.submitCreatedProductOrder()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.credit-order-footer {
+  ::v-deep {
+    .van-button--default {
+      flex: none;
+      width: 96px;
+      border: 1px solid #2ABED1;
+      background: rgba(42, 190, 209, 0.08);
+      color: #2ABED1;
+    }
+    .van-button--primary {
+      flex: none;
+      width: 96px;
+    }
+  }
+}
+</style>

+ 99 - 43
apps/mobile/src/views/create-order/components/creditreport/ProductionCard.vue

@@ -9,9 +9,9 @@
       </div>
     </div>
     <div class="report-info">
-      <van-form @submit="onSubmit">
+      <van-form ref="formRef">
         <van-field
-          v-model="info.entName"
+          v-model="info.company"
           class="ent-input-field"
           required
           name="pattern"
@@ -23,25 +23,25 @@
             { pattern: /^.{3,}$/, message: '输入内容需大于两个字' }, // 添加正则验证规则
           ]"
           @input="onInput($event, 'ent')"
-          @blur="onBlur"
+          @blur="onBlur('company')"
         >
           <template #extra>
             <!-- 添加联想弹窗 -->
             <div v-if="entList.length" class="ent-popup-container">
               <div class="ent-popup-wrap">
                 <div v-for="(item, index) in entList" :key="index" class="wrap-list" @click="clickAssociation(item, 'ent')">
-                  {{ item.value }}
+                  {{ item.name }}
                 </div>
               </div>
             </div>
           </template>
         </van-field>
         <van-field
-          v-model="info.companyName"
+          v-model="info.buyer"
           class="company-input-field"
           required
           name="pattern"
-          label="标单位名称"
+          label="标单位名称"
           placeholder="必填"
           :show-error="false"
           :rules="[
@@ -49,14 +49,14 @@
             { pattern: /^.{3,}$/, message: '输入内容需大于两个字' }, // 添加正则验证规则
           ]"
           @input="onInput($event, 'company')"
-          @blur="onBlur"
+          @blur="onBlur('buyer')"
         >
           <template #extra>
             <!-- 添加联想弹窗 -->
             <div v-if="companyList.length" class="ent-popup-container">
               <div class="ent-popup-wrap">
                 <div v-for="(item, index) in companyList" :key="index" class="wrap-list" @click="clickAssociation(item, 'company')">
-                  {{ item.value }}
+                  {{ item.name }}
                 </div>
               </div>
             </div>
@@ -73,6 +73,7 @@
             { required: true, message: '请输入邮箱' },
             { pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/, message: '请输入有效的邮箱地址' }, // 邮箱校验正则规则
           ]"
+          @blur="onBlur('email')"
         />
       </van-form>
     </div>
@@ -83,10 +84,10 @@
 </template>
 
 <script>
-import { mapMutations } from 'vuex'
+import { mapActions, mapGetters, mapMutations } from 'vuex'
 import { Field, Form } from 'vant'
 import { debounce } from '@/utils/utils'
-import { getCompanyAssociation } from '@/api/modules/'
+import { creditReportEntSearch } from '@/api/modules/'
 
 export default {
   name: 'CreditReportProductionCard',
@@ -97,44 +98,98 @@ export default {
   data() {
     return {
       pageLayoutConf: {
-        title: '购买投标企业信用报告'
+        title: '投标企业信用报告',
       },
       conf: {
-        productId: 104,
-        productName: '购买投标企业信用报告',
+        productName: '投标企业信用报告',
+        productId: 150,
         linkKey: 'creditReportLink',
       },
       info: {
-        entName: '',
-        companyName: '',
+        company: '',
+        buyer: '',
+        cert_no: '',
         email: ''
       },
       entList: [],
-      companyList: []
+      companyList: [],
+      entNameValid: false,
+      companyNameValid: false,
+      emailValid: false
     }
   },
-  computed: {},
+  computed: {
+    ...mapGetters('createOrder', ['productExtend', 'productId']),
+    allFiledValid() {
+      return this.entNameValid && this.companyNameValid && this.emailValid
+    }
+  },
+  watch: {
+    allFiledValid(newval) {
+      this.updateCanNextMap({
+        spec: newval
+      })
+    }
+  },
+
   mounted() {
     this.updatePayAmount()
   },
   methods: {
-    ...mapMutations('createOrder', ['updateOrderAmount']),
-    updatePayAmount() {
-      // 假设新的支付金额为 100
-      const newPayAmount = 10000
-      this.updateOrderAmount({
-        originalPrice: 12000, // 可根据实际情况修改
-        discountAmount: 2000, // 可根据实际情况修改
-        discountPrice: newPayAmount
+    ...mapActions('createOrder', ['setProductInfo']),
+    ...mapMutations('createOrder', ['updateCanNextMap']),
+    async updatePayAmount() {
+      const { productId } = this.conf
+      this.setProductInfo({
+        id: productId,
+        hooks: {
+          submit: this.onSubmit.bind(this)
+        }
       })
     },
+    async onSubmit(pre, next) {
+      const payload = {
+        product: pre.productName,
+        productId: pre.productSpecId,
+        discountId: pre.offersId,
+        lotteryId: pre.offersId,
+        activityType: pre.activityType,
+        data: {
+          ...this.info
+        }
+      }
+      const res = await next(payload)
+      const { data } = res
+      if (data && data.needPay) {
+        const { linkKey } = this.conf
+        const query = this.getCommonQuery(data.order_code)
+        const orderDetailLinkInfo
+            = this.getProductionLinks(linkKey).orderDetail
+        const payLinkInfo = this.getProductionLinks(linkKey).pay
+        if (this.$envs.inApp || this.$envs.inWX) {
+          this.$storage.set(
+            `${this.$route.path}-redirect`,
+            {
+              urls: orderDetailLinkInfo,
+              query
+            },
+            { storage: sessionStorage }
+          )
+        }
+        openAppOrWxPage(payLinkInfo, {
+          query
+        })
+        return res
+      }
+    },
     clickAssociation(item, type) {
       if (type === 'ent') {
-        this.info.entName = item.value
+        this.info.company = item.name
+        this.info.cert_no = item.cert_no
         this.entList = []
       }
       else {
-        this.info.companyName = item.value
+        this.info.buyer = item.name
         this.companyList = []
       }
     },
@@ -144,32 +199,33 @@ export default {
         return
       this.getCompany(value, type)
     },
-    onBlur() {
-      // setTimeout(() => {
-      //   this.entList = []
-      //   this.companyList = []
-      // }, 300)
+    onBlur(fieldName) {
+      // 投标企业名称必须选择联想内的企业
+      if (fieldName === 'company') {
+        if (!this.info.cert_no) {
+          this.info.company = ''
+        }
+      }
+      // 校验表单字段是否成功
+      this.$refs.formRef.validate(fieldName).then((valid) => {
+        this[`${fieldName}Valid`] = valid
+      }).catch((err) => {
+        console.log(err, 'err')
+      })
     },
     // 获取公司联想数据
     getCompany: debounce(function (val, type) {
       if (val) {
-        getCompanyAssociation({ name: val, num: 10 }).then((res) => {
+        creditReportEntSearch({ entName: val }).then((res) => {
           if (type === 'ent') {
-            this.entList = res.data?.map((item) => {
-              return { label: item, value: item }
-            }) || []
+            this.entList = res.data || []
           }
           else {
-            this.companyList = res.data?.map((item) => {
-              return { label: item, value: item }
-            }) || []
+            this.companyList = res.data || []
           }
         })
       }
-    }, 500),
-    onSubmit(values) {
-      console.log('submit', values)
-    }
+    }, 500)
   }
 }
 </script>

+ 206 - 101
apps/mobile/src/views/reportAnalysis/components/listItem.vue

@@ -1,12 +1,18 @@
 <template>
   <div id="listItem">
-    <div class="tag" :class="tagclass">{{ data.type | typeFilter }}</div>
-    <div class="toptime">{{ data.l_createTime | timeFilter }}</div>
+    <div class="tag" :class="tagclass">
+      {{ data.type | typeFilter }}
+    </div>
+    <div class="toptime">
+      {{ data.l_createTime | timeFilter }}
+    </div>
     <div class="content">
       <!-- 企业 -->
       <div v-if="tagclass === 'green'">
         <div class="item">
-          <p class="label">目标企业:</p>
+          <p class="label">
+            目标企业:
+          </p>
           <p
             class="value heigh_line ellipsis"
             @click="$emit('titleClick', data)"
@@ -15,89 +21,175 @@
           </p>
         </div>
         <div class="item">
-          <p class="label">成交时间:</p>
-          <p class="value">{{ data.timeRange | timeRangeF }}</p>
+          <p class="label">
+            成交时间:
+          </p>
+          <p class="value">
+            {{ data.timeRange | timeRangeF }}
+          </p>
         </div>
-        <div class="item" v-if="data.match">
-          <p class="label">关键词:</p>
-          <p class="value ellipsis">{{ matchF(data.match, data) }}</p>
+        <div v-if="data.match" class="item">
+          <p class="label">
+            关键词:
+          </p>
+          <p class="value ellipsis">
+            {{ matchF(data.match, data) }}
+          </p>
         </div>
-        <div class="item" v-if="data.matchRange">
-          <p class="label">搜索范围:</p>
-          <p class="value ellipsis">{{ data.matchRange | matchRangeF }}</p>
+        <div v-if="data.matchRange" class="item">
+          <p class="label">
+            搜索范围:
+          </p>
+          <p class="value ellipsis">
+            {{ data.matchRange | matchRangeF }}
+          </p>
         </div>
-        <div class="item" v-if="data.area">
-          <p class="label">项目地区:</p>
-          <p class="value ellipsis">{{ data.area | areaF }}</p>
+        <div v-if="data.area" class="item">
+          <p class="label">
+            项目地区:
+          </p>
+          <p class="value ellipsis">
+            {{ data.area | areaF }}
+          </p>
+        </div>
+        <div v-if="data.scopeClass" class="item">
+          <p class="label">
+            行业:
+          </p>
+          <p class="value ellipsis">
+            {{ data.scopeClass | scopeClassF }}
+          </p>
+        </div>
+        <div v-if="data.s_buyerClass" class="item">
+          <p class="label long">
+            采购单位类型:
+          </p>
+          <p class="value ellipsis">
+            {{ data.s_buyerClass | buyerClassF }}
+          </p>
         </div>
-        <div class="item" v-if="data.scopeClass">
-          <p class="label">行业:</p>
-          <p class="value ellipsis">{{ data.scopeClass | scopeClassF }}</p>
+      </div>
+      <div v-if="tagclass === 'blue'">
+        <div v-if="data.scopeClass" class="item">
+          <p class="label">
+            投标企业名称:
+          </p>
+          <p class="value ellipsis">
+            {{ data.scopeClass | scopeClassF }}
+          </p>
         </div>
-        <div class="item" v-if="data.s_buyerClass">
-          <p class="label long">采购单位类型:</p>
-          <p class="value ellipsis">{{ data.s_buyerClass | buyerClassF }}</p>
+        <div v-if="data.s_buyerClass" class="item">
+          <p class="label long">
+            投标单位名称:
+          </p>
+          <p class="value ellipsis">
+            {{ data.s_buyerClass | buyerClassF }}
+          </p>
         </div>
       </div>
       <!-- 业主采购 -->
       <div v-if="tagclass === 'yellow'">
         <div class="item">
-          <p class="label">目标业主:</p>
+          <p class="label">
+            目标业主:
+          </p>
           <p class="value heigh_line" @click="$emit('titleClick', data)">
             {{ data.entName || '-' }}
           </p>
         </div>
         <div class="item">
-          <p class="label">成交时间:</p>
-          <p class="value">{{ data.timeRange | timeRangeF }}</p>
+          <p class="label">
+            成交时间:
+          </p>
+          <p class="value">
+            {{ data.timeRange | timeRangeF }}
+          </p>
         </div>
-        <div class="item" v-if="data.match">
-          <p class="label">关键词:</p>
-          <p class="value ellipsis">{{ matchF(data.match, data) }}</p>
+        <div v-if="data.match" class="item">
+          <p class="label">
+            关键词:
+          </p>
+          <p class="value ellipsis">
+            {{ matchF(data.match, data) }}
+          </p>
         </div>
-        <div class="item" v-if="data.matchRange">
-          <p class="label">搜索范围:</p>
-          <p class="value ellipsis">{{ data.matchRange | matchRangeF }}</p>
+        <div v-if="data.matchRange" class="item">
+          <p class="label">
+            搜索范围:
+          </p>
+          <p class="value ellipsis">
+            {{ data.matchRange | matchRangeF }}
+          </p>
         </div>
-        <div class="item" v-if="data.area">
-          <p class="label">项目地区:</p>
-          <p class="value ellipsis">{{ data.area | areaF }}</p>
+        <div v-if="data.area" class="item">
+          <p class="label">
+            项目地区:
+          </p>
+          <p class="value ellipsis">
+            {{ data.area | areaF }}
+          </p>
         </div>
-        <div class="item" v-if="data.scopeClass">
-          <p class="label">行业:</p>
-          <p class="value ellipsis">{{ data.scopeClass | scopeClassF }}</p>
+        <div v-if="data.scopeClass" class="item">
+          <p class="label">
+            行业:
+          </p>
+          <p class="value ellipsis">
+            {{ data.scopeClass | scopeClassF }}
+          </p>
         </div>
-        <div class="item" v-if="data.s_buyerClass">
-          <p class="label long">采购单位类型:</p>
-          <p class="value ellipsis">{{ data.s_buyerClass | buyerClassF }}</p>
+        <div v-if="data.s_buyerClass" class="item">
+          <p class="label long">
+            采购单位类型:
+          </p>
+          <p class="value ellipsis">
+            {{ data.s_buyerClass | buyerClassF }}
+          </p>
         </div>
       </div>
       <!-- 定制化分析 -->
       <div v-if="tagclass === 'blue'">
         <div class="item">
-          <p class="label">分析内容:</p>
-          <p class="value ellipsis" v-html="formatKeys(data.s_keysItems)"></p>
+          <p class="label">
+            分析内容:
+          </p>
+          <p class="value ellipsis" v-html="formatKeys(data.s_keysItems)" />
         </div>
         <div class="item">
-          <p class="label">匹配方式:</p>
-          <p class="value">{{ formatMatchWay(data.s_matchingMode) }}</p>
+          <p class="label">
+            匹配方式:
+          </p>
+          <p class="value">
+            {{ formatMatchWay(data.s_matchingMode) }}
+          </p>
         </div>
         <div class="item">
-          <p class="label">成交时间:</p>
+          <p class="label">
+            成交时间:
+          </p>
           <p class="value ellipsis">
             {{ data.s_rangeTime | formatTime('yyyy-MM-dd') }}
           </p>
         </div>
-        <div class="item" v-if="formatArea(data.s_area)">
-          <p class="label">项目地区:</p>
-          <p class="value ellipsis">{{ formatArea(data.s_area) }}</p>
+        <div v-if="formatArea(data.s_area)" class="item">
+          <p class="label">
+            项目地区:
+          </p>
+          <p class="value ellipsis">
+            {{ formatArea(data.s_area) }}
+          </p>
         </div>
-        <div class="item" v-if="formatIndustry(data.s_industry)">
-          <p class="label">行业:</p>
-          <p class="value ellipsis">{{ formatIndustry(data.s_industry) }}</p>
+        <div v-if="formatIndustry(data.s_industry)" class="item">
+          <p class="label">
+            行业:
+          </p>
+          <p class="value ellipsis">
+            {{ formatIndustry(data.s_industry) }}
+          </p>
         </div>
-        <div class="item" v-if="formatBuyerclass(data.s_buyerClass)">
-          <p class="label long">采购单位类型:</p>
+        <div v-if="formatBuyerclass(data.s_buyerClass)" class="item">
+          <p class="label long">
+            采购单位类型:
+          </p>
           <p class="value ellipsis">
             {{ formatBuyerclass(data.s_buyerClass) }}
           </p>
@@ -105,29 +197,17 @@
       </div>
     </div>
     <div class="foot_btn" @click="$emit('download', data)">
-      <span class="download_icon"></span>
+      <span class="download_icon" />
       <span class="download">下载</span>
     </div>
   </div>
 </template>
 
 <script>
-import { dateFormatter, FilterHistoryAjaxModel2ViewModel } from '@/utils/'
+import { FilterHistoryAjaxModel2ViewModel, dateFormatter } from '@/utils/'
+
 export default {
-  name: 'listItem',
-  data() {
-    return {}
-  },
-  props: {
-    data: {
-      type: Object,
-      default: () => {}
-    },
-    tagclass: {
-      type: String,
-      default: 'green'
-    }
-  },
+  name: 'ListItem',
   filters: {
     dateFilter(val) {
       return val ? dateFormatter(val * 1000, 'yyyy-MM-dd') : '-'
@@ -138,9 +218,11 @@ export default {
     typeFilter(val) {
       if (val === '1') {
         return '企业中标分析报告'
-      } else if (val === '2') {
+      }
+      else if (val === '2') {
         return '业主采购分析报告'
-      } else if (val === '3') {
+      }
+      else if (val === '3') {
         return '市场分析定制报告'
       }
     },
@@ -159,7 +241,6 @@ export default {
     },
     areaF(val) {
       return val ? val.replace(/,/g, ',') : ''
-
     },
     scopeClassF(val) {
       // if (val) {
@@ -178,41 +259,57 @@ export default {
       //   return '-'
       // }
       if (val) {
-        let text =
-          FilterHistoryAjaxModel2ViewModel.formatIndustry(
+        const text
+          = FilterHistoryAjaxModel2ViewModel.formatIndustry(
             val
           ).industryText.join(',')
         return text
-      } else {
+      }
+      else {
         return '-'
       }
     },
     buyerClassF(val) {
       if (val) {
-        let text =
-          FilterHistoryAjaxModel2ViewModel.formatBuyerClass(
+        const text
+          = FilterHistoryAjaxModel2ViewModel.formatBuyerClass(
             val
           ).buyerClassText.join(',')
         return text
-      } else {
+      }
+      else {
         return '-'
       }
     },
     formatTime(value, fmt) {
-      if (!value) return ''
+      if (!value)
+        return ''
       const rangeTimeArr = value.split('-')
       const start = new Date(rangeTimeArr[0] * 1000).getTime()
       const end = new Date(rangeTimeArr[1] * 1000).getTime()
       console.log(start)
-      return dateFormatter(start, fmt) + '至' + dateFormatter(end, fmt)
+      return `${dateFormatter(start, fmt)}至${dateFormatter(end, fmt)}`
+    }
+  },
+  props: {
+    data: {
+      type: Object,
+      default: () => {}
+    },
+    tagclass: {
+      type: String,
+      default: 'green'
     }
   },
+  data() {
+    return {}
+  },
   methods: {
     matchF(val, item) {
-      return item.exactMatch === '0' ? val + '(模糊)' : val + '(精准)'
+      return item.exactMatch === '0' ? `${val}(模糊)` : `${val}(精准)`
     },
     formatMatchWay(m) {
-      var map = {
+      const map = {
         title: '按标题匹配',
         content: '按全文匹配'
       }
@@ -220,13 +317,14 @@ export default {
       return text
     },
     formatKeys(keys) {
-      var tempStr = '-'
-      if (!keys) return tempStr
+      let tempStr = '-'
+      if (!keys)
+        return tempStr
       try {
-        var tempResult = []
-        var tempList = JSON.parse(keys)
-        tempList.forEach(function (v) {
-          v.a_key.forEach(function (k) {
+        const tempResult = []
+        const tempList = JSON.parse(keys)
+        tempList.forEach((v) => {
+          v.a_key.forEach((k) => {
             tempResult.push({
               key: [].concat(k.key, k.appendkey),
               type: k.matchway === 1 ? '模糊' : '精准'
@@ -234,59 +332,66 @@ export default {
           })
         })
         tempStr = tempResult
-          .map(function (v) {
+          .map((v) => {
             return `[${v.key.join(' ')}]-${v.type}`
           })
           .join('、')
-      } catch (e) {
+      }
+      catch (e) {
         console.log(e)
       }
       return tempStr
     },
     formatBuyerclass(value) {
-      if (!value) return ''
+      if (!value)
+        return ''
       return String(value).replace(/,/g, ',')
     },
     formatArea(value) {
-      if (!value) return '-'
+      if (!value)
+        return '-'
       value = JSON.parse(value)
 
       if (Object.keys(value).length === 0) {
         return ''
       }
 
-      var area = []
-      var citys = []
-      for (var key in value) {
+      const area = []
+      const citys = []
+      for (const key in value) {
         if (!value[key].length) {
           area.push(key)
-        } else {
+        }
+        else {
           citys.push(...value[key])
         }
       }
 
-      var concatList = area.concat(citys)
+      const concatList = area.concat(citys)
 
       if (concatList.length) {
         return concatList.join(',')
-      } else {
+      }
+      else {
         return ''
       }
     },
     formatIndustry(value) {
-      if (!value) return ''
+      if (!value)
+        return ''
       value = JSON.parse(value)
 
       if (Object.keys(value).length === 0) {
         return ''
       }
 
-      var keyArr = []
-      var valueArr = []
-      for (var key in value) {
+      const keyArr = []
+      const valueArr = []
+      for (const key in value) {
         if (!value[key].length) {
           keyArr.push(key)
-        } else {
+        }
+        else {
           valueArr.push(...value[key])
         }
       }

+ 16 - 2
pnpm-lock.yaml

@@ -6850,7 +6850,7 @@ packages:
   /@vueuse/shared@9.13.0(vue@2.7.14):
     resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
     dependencies:
-      vue-demi: 0.14.6(vue@2.7.14)
+      vue-demi: 0.14.7(vue@2.7.14)
     transitivePeerDependencies:
       - '@vue/composition-api'
       - vue
@@ -16937,7 +16937,7 @@ packages:
       '@types/eslint': 8.44.1
       eslint: 8.37.0
       rollup: 2.79.1
-      vite: 4.5.3(less@4.1.3)(sass@1.71.1)(terser@5.19.2)
+      vite: 4.5.3(less@4.1.3)(sass@1.63.2)(terser@5.19.2)
     dev: true
 
   /vite-plugin-externals@0.6.2(vite@4.5.3):
@@ -17516,6 +17516,20 @@ packages:
     dependencies:
       vue: 2.7.14
 
+  /vue-demi@0.14.7(vue@2.7.14):
+    resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    peerDependencies:
+      '@vue/composition-api': ^1.0.0-rc.1
+      vue: ^3.0.0-0 || ^2.6.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+    dependencies:
+      vue: 2.7.14
+
   /vue-demi@0.14.7(vue@3.3.11):
     resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==}
     engines: {node: '>=12'}