Преглед изворни кода

feat: 移动端详情页兼容阳光采购

cuiyalong пре 9 месеци
родитељ
комит
7d30ab438c

+ 50 - 9
apps/mobile/src/views/article/components/ContentAbstract.vue

@@ -127,7 +127,8 @@
           <span
             class="ellipsis-2"
             :class="{
-              'highlight-text underline clickable': summaryMap.buyer?.link
+              'highlight-text underline clickable': summaryMap.buyer?.link || summaryMap.buyer?.isFreeView,
+              'free-view': summaryMap.buyer?.isFreeView
             }"
             @click="goToBuyerPortrait(summaryMap.buyer, 'link')"
           >
@@ -140,10 +141,10 @@
         <div class="abstract-line-value">
           <span
             class="abstract-line-value-text ellipsis-2"
-            @click="doCallPhone(summaryMap.buyerContactInfo?.tel)"
+            @click="beforeDoCallPhone(summaryMap.buyerContactInfo?.tel, summaryMap.buyerContactInfo?.isFreeView)"
             :class="{
               'highlight-text': summaryMap.buyerContactInfo?.isFreeView,
-              'free-view': summaryMap.buyerContactInfo?.isFreeView
+              'free-view underline': summaryMap.buyerContactInfo?.isFreeView
             }"
           >
             {{ summaryMap.buyerContactInfo?.value }}
@@ -151,7 +152,7 @@
           <span class="abstract-line-value-actions color-main">
             <span
               class="abstract-line-value-action call-phone clickable"
-              v-if="summaryMap.buyerContactInfo?.tel"
+              v-if="summaryMap.buyerContactInfo?.tel && !summaryMap.buyerContactInfo?.isFreeView"
               @click="doCallPhone(summaryMap.buyerContactInfo?.tel)"
             >
               <span class="j-icon icon-phone-blue"></span>
@@ -180,7 +181,7 @@
         <div class="abstract-line-value">
           <span
             class="abstract-line-value-text ellipsis-2"
-            @click="doCallPhone(summaryMap.agencyContactInfo?.tel)"
+            @click="beforeDoCallPhone(summaryMap.agencyContactInfo?.tel, summaryMap.agencyContactInfo?.isFreeView)"
             :class="{
               'highlight-text': summaryMap.agencyContactInfo?.isFreeView,
               'free-view': summaryMap.agencyContactInfo?.isFreeView
@@ -191,7 +192,7 @@
           <span class="abstract-line-value-actions color-main">
             <span
               class="abstract-line-value-action call-phone clickable"
-              v-if="summaryMap.agencyContactInfo?.tel"
+              v-if="summaryMap.agencyContactInfo?.tel && !summaryMap.agencyContactInfo?.isFreeView"
               @click="doCallPhone(summaryMap.agencyContactInfo?.tel)"
             >
               <span class="j-icon icon-phone-blue"></span>
@@ -207,7 +208,25 @@
           </span>
         </div>
       </div>
-      <div class="abstract-line-container">
+      <div class="abstract-line-container" v-if="IsSunPublishContent">
+        <div class="abstract-line" v-if="summaryMap.signEndTime?.value">
+          <div class="abstract-line-label">报名截止日期</div>
+          <div class="abstract-line-value">
+            <span class="abstract-line-value-text">
+              {{ summaryMap.signEndTime?.value }}
+            </span>
+          </div>
+        </div>
+        <div class="abstract-line" v-if="summaryMap.projectArea?.value">
+          <div class="abstract-line-label">项目地区</div>
+          <div class="abstract-line-value">
+            <span class="abstract-line-value-text">
+              {{ summaryMap.projectArea?.value }}
+            </span>
+          </div>
+        </div>
+      </div>
+      <div class="abstract-line-container" v-else>
         <div class="abstract-line" v-if="summaryMap.signEndTime?.value">
           <div class="abstract-line-label">报名截止日期</div>
           <div class="abstract-line-value">
@@ -255,7 +274,7 @@
           <div class="abstract-line-value">
             <span
               class="abstract-line-value-text ellipsis-2"
-              @click="doCallPhone(winner?.personTel?.tel)"
+              @click="beforeDoCallPhone(winner?.personTel?.tel, winner?.personTel?.isFreeView)"
               :class="{
                 'highlight-text': winner?.personTel?.isFreeView,
                 'free-view': winner?.personTel?.isFreeView
@@ -291,8 +310,17 @@
           </span>
         </div>
       </div>
+      <div class="abstract-line" v-if="summaryMap.jfArea?.value">
+        <div class="abstract-line-label">交付地点</div>
+        <div class="abstract-line-value">
+          <span class="abstract-line-value-text">
+            {{ summaryMap.jfArea?.value || ' ' }}
+          </span>
+        </div>
+      </div>
     </template>
-    <div class="abstract-bottom-desc">
+    <ContentSummaryPurchaseList />
+    <div class="abstract-bottom-desc" :class="{ transparent: IsSunPublishContent }">
       <span>*以上摘要信息由剑鱼标讯智能提取,仅供参考。如有误差,请</span>
       <span class="highlight-text underline" @click="concatKf">联系客服</span>
       <span>进行处理。</span>
@@ -313,10 +341,12 @@ import { mapState } from 'vuex'
 import { LINKS } from '@/data'
 import { openAppOrWxPage } from '@/utils/'
 import { callPhone } from '@/utils/callFn'
+import ContentSummaryPurchaseList from './ContentSummaryPurchaseList'
 
 export default {
   name: 'ContentAbstract',
   components: {
+    ContentSummaryPurchaseList,
     [ActionSheet.name]: ActionSheet,
     [Icon.name]: Icon
   },
@@ -346,6 +376,7 @@ export default {
   },
   computed: {
     ...mapState({
+      content: (state) => state.article.mainModel.content,
       summary: (state) => state.article.mainModel.summary
     }),
     summaryList() {
@@ -354,6 +385,9 @@ export default {
     IsCustomTopNet () {
       return this.customSkip
     },
+    IsSunPublishContent() {
+      return this.content.IsSunPublishContent || false
+    },
     summaryMap() {
       const map = {}
       this.summaryList.forEach((s) => {
@@ -406,6 +440,10 @@ export default {
         }
       })
     },
+    beforeDoCallPhone(tel, freeView) {
+      if (freeView) return
+      this.doCallPhone(tel)
+    },
     doCallPhone(tel) {
       if (!tel) return
       const replacer = /[,,、/]/
@@ -508,6 +546,9 @@ export default {
   color: #9b9ca3;
   font-size: 12px;
   line-height: 20px;
+  &.transparent {
+    background-color: #F5F6F7;
+  }
   .underline {
     white-space: nowrap;
   }

+ 13 - 5
apps/mobile/src/views/article/components/ContentHeader.vue

@@ -22,7 +22,7 @@
         >{{ tag.label }}</a
       >
     </div>
-    <div v-if="collectionTags.length > 0" class="tag-list">
+    <div v-if="showCollection" class="tag-list">
       <span
         v-for="tag in collectionTags"
         :key="tag.id"
@@ -31,7 +31,7 @@
         >{{ tag.label }}</span
       >
     </div>
-    <div class="sub-info-line">
+    <div class="sub-info-line" v-if="!IsSunPublishContent">
       <span class="info-publish-time">{{ content.time }}</span>
       <span v-if="cbPersonText" class="info-canbiao-persons">
         参标人:{{ cbPersonText }}
@@ -46,7 +46,7 @@
         <span class="relationship-text">找人脉</span>
       </div>
     </div>
-    <div class="sub-info-line">
+    <div class="sub-info-line" v-if="!IsSunPublishContent">
       <div class="sub-info-line-l" />
       <div class="sub-info-line-r">
         <!-- 有参标人时候另起一行 -->
@@ -95,12 +95,20 @@ export default {
         return this.content.IsSunPublishContent || false
       },
       showHeaderType() {
+        if (!this.headerType) {
+          return false
+        }
         return this.content.isSelfSite || this.IsSunPublishContent
       },
+      showCollection() {
+        if (this.IsSunPublishContent) {
+          return false
+        }
+        return this.collectionTags.length > 0
+      },
       headerType() {
         if (this.IsSunPublishContent) {
-          return '阳光直采用户发布'
-          // return '阳光直采平台发布'
+          return this.content.publicType
         } else {
           return '业主委托项目'
         }

+ 12 - 1
apps/mobile/src/views/article/components/ContentMainText.vue

@@ -67,7 +67,18 @@ export default {
   },
   methods: {
     toUnlockContent() {
-      console.log('tounlockcontent')
+      this.toLeaveSource()
+    },
+    async toLeaveSource() {
+      if (this.beforeLeavePage) {
+        await this.beforeLeavePage()
+      }
+      openAppOrWxPage(LINKS.留资, {
+        query: {
+          source: `${this.$env.platform}_sunlight_viewdetails`,
+          infoid: this.content.id
+        }
+      })
     },
     async feedback() {
       if (this.beforeLeavePage) {

+ 72 - 0
apps/mobile/src/views/article/components/ContentSummaryPurchaseList.vue

@@ -0,0 +1,72 @@
+<template>
+  <section class="content-summary-purchase-list">
+    <div class="purchase-list-hd">采购清单</div>
+    <div class="purchase-list-bd">
+      <div class="purchase-list-card" v-for="(purchase, index) in purchasingList" :key="index">
+        <div class="purchase-title">
+          {{ index + 1 }} . {{ purchase.itemName || '-' }}
+        </div>
+        <div class="purchase-line purchase-number highlight-text">数量:{{ purchase.number }}</div>
+        <div class="purchase-line purchase-info">
+          <div class="purchase-brand">品牌:{{ purchase.brandName }}</div>
+          <div class="p-divider">|</div>
+          <div class="purchase-brand">规格型号:{{ purchase.model }}</div>
+        </div>
+      </div>
+    </div>
+  </section>
+</template>
+<script>
+import { mapState } from 'vuex'
+
+export default {
+  name: 'ContentSummaryPurchaseList',
+  computed: {
+    ...mapState({
+      summary: (state) => state.article.mainModel.summary
+    }),
+    purchasingList() {
+      return this.summary.purchasingList
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.content-summary-purchase-list {
+  padding-bottom: 8px;
+  background-color: #F5F6F7;
+  .purchase-list-hd {
+    padding: 6px 16px;
+    font-size: 14px;
+    line-height: 20px;
+  }
+  .purchase-list-bd {
+    padding: 0 12px;
+  }
+  .purchase-list-card {
+    padding: 12px;
+    font-size: 12px;
+    line-height: 18px;
+    background: #fff;
+    border-radius: 8px;
+    &:not(:last-of-type) {
+      margin-bottom: 8px;
+    }
+    .purchase-line {
+      margin-top: 2px;
+    }
+    .purchase-title {
+      font-size: 16px;
+      line-height: 24px;
+    }
+    .purchase-info {
+      display: flex;
+      align-items: center;
+    }
+    .p-divider {
+      margin: 0 8px;
+    }
+  }
+}
+</style>

+ 0 - 1
apps/mobile/src/views/search/result/company/index.vue

@@ -293,7 +293,6 @@ export default {
     next()
   },
   created() {
-    window.t = this
     this.listInfo.pageSize = this.getPageSize
     if (this.$store.state.direction !== 'forward') {
       this.doRecovery()

+ 1 - 0
data/data-models/modules/article/transform/content.js

@@ -68,6 +68,7 @@ class CommonContentModel extends BaseModel {
     result.IsCustomTopNet = data?.topnet || false
     result.publicType = baseInfo.publicType
     // 是否阳光采购相关的标讯
+    result.hasPowerToReadSunPublishContent = data?.purchase // 阳光直采-采购信息
     result.IsSunPublishContent = baseInfo.infoAttribute === 'zc_cgxx' // 阳光直采-采购信息
     // 是否有阳光直采权限
 

+ 3 - 2
data/data-models/modules/article/transform/summary2.js

@@ -251,16 +251,17 @@ class SummaryModel extends BaseModel {
     const pDistrict = baseInfo?.district|| ''
     const projectArea = `${pArea}${pCity}${pDistrict}` || ''
     list.push(
-      new SummaryItem('jfArea', '项目地区', projectArea)
+      new SummaryItem('projectArea', '项目地区', projectArea)
     )
 
     // 交付地点
     const jArea = summary?.deliverArea || ''
     const jCity = summary?.deliverCity || ''
     const jDistrict = summary?.deliverDistrict|| ''
+    const jDetail = summary?.deliverDetail || ''
     const jfArea = `${jArea}${jCity}${jDistrict}` || ''
     list.push(
-      new SummaryItem('jfArea', '交付地点', jfArea)
+      new SummaryItem('jfArea', '交付地点', `${jfArea}${jDetail}`)
     )
 
     result.list = list.filter((s) => !!s.value)