Эх сурвалжийг харах

Merge branch 'main' into hotfix/v1.0.92.1

lianbingjie 5 сар өмнө
parent
commit
15d089a73e

+ 3 - 3
apps/bigmember_pc/src/components/article-item/ArticleItem.vue

@@ -321,7 +321,7 @@
             <i class="l-d-item-label">报名截止日期:</i>
             {{ article.signEndTimeText }}
           </p>
-          
+
         </div>
         <div
           class="l-d-item"
@@ -472,9 +472,9 @@ export default {
         ['<span class="highlight-text-orange-bd">', '</span>']
       )
       if (this.article.filetext_search) {
-        return `${this.index}. ${hightLightedTitle}${this.calcFileText}`
+        return this.index ? `${this.index}. ${hightLightedTitle}${this.calcFileText}` : `${hightLightedTitle}${this.calcFileText}`
       } else {
-        return `${this.index}. ${hightLightedTitle}`
+        return this.index ? `${this.index}. ${hightLightedTitle}`: `${hightLightedTitle}`
       }
     },
     // 处理正文显示,有匹配词且匹配上才显示正文

+ 123 - 78
apps/bigmember_pc/src/components/collect-info/CollectInfo.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="collect-info">
-    <div class="user-data-dialog" v-if="showForm">
-      <div class="mask"></div>
+    <div v-if="showForm" class="user-data-dialog">
+      <div class="mask" />
       <div class="dialog-container" :class="{ 'use-bg': useImgBg.use }">
-        <div class="dialog-header--use-bg" v-if="useImgBg.use">
+        <div v-if="useImgBg.use" class="dialog-header--use-bg">
           <img
             class="dialog-header-img--bg"
             :src="useImgBg.bg"
@@ -16,58 +16,60 @@
           />
         </div>
         <div
-          class="dialog-header fs18"
           v-if="computedDialogInfo.dialogTitleTop && !useImgBg.use"
+          class="dialog-header fs18"
           v-text="computedDialogInfo.dialogTitleTop"
-        ></div>
+        />
         <div
-          class="dialog-header mt-4"
           v-if="computedDialogInfo.dialogTitle"
+          class="dialog-header mt-4"
           v-html="computedDialogInfo.dialogTitle"
-        ></div>
+        />
         <div class="dialog-content">
           <el-form
+            ref="ruleForm"
             class="user-form"
             :model="form"
             :rules="rules"
-            ref="ruleForm"
           >
             <!-- 基本信息 -->
             <div class="basic clearfix">
-              <div class="form-title">基本信息</div>
-              <div class="form-main clearfix">
-                <div class="short-control fl">
+              <div v-if="showSecondstage" class="form-title">基本信息</div>
+              <div
+                class="form-main clearfix"
+                :class="{ 'form-main-none': !showSecondstage }"
+              >
+                <div class="fl" :class="nameClass">
                   <el-form-item label="姓名 :" prop="name">
                     <el-input
                       v-model.trim="form.name"
                       class="data-short-input item-input"
                       placeholder="请输入姓名"
-                      @focus="nameFocus"
                       required
-                    >
-                    </el-input>
+                      @focus="nameFocus"
+                    />
                   </el-form-item>
                 </div>
-                <div class="short-control fr">
+                <div class="fr" :class="phoneClass">
                   <el-form-item label="手机号 :" prop="phone">
                     <el-input
                       v-model.trim="form.phone"
                       maxlength="11"
-                      @input="inputPhone"
                       class="data-short-input item-input"
                       placeholder="请输入准确的手机号"
+                      @input="inputPhone"
                       @focus="phoneFocus"
-                    ></el-input>
+                    />
                   </el-form-item>
                 </div>
-                <div class="short-control fl" v-if="moduleShow.email">
+                <div v-if="moduleShow.email" class="short-control fl">
                   <el-form-item label="邮箱 :" prop="mail">
                     <el-input
                       v-model.trim="form.mail"
                       class="data-short-input item-input"
                       placeholder="请输入邮箱"
                       @focus="mailFocus"
-                    ></el-input>
+                    />
                   </el-form-item>
                 </div>
                 <!-- <div class="short-control fr" style="display:none;">
@@ -93,52 +95,54 @@
               </div>
             </div>
             <div class="company clearfix">
-              <div class="form-title">公司信息</div>
-              <div class="form-main">
+              <div v-if="showSecondstage" class="form-title">公司信息</div>
+              <div
+                class="form-main"
+                :class="{ 'form-main-none': !showSecondstage }"
+              >
                 <div class="long-control" style="position: relative">
                   <el-form-item label="公司名称 :" prop="companyName">
                     <el-input
                       v-model.trim="form.companyName"
                       class="data-long-input item-input company-name"
+                      placeholder="请输入准确的公司名称"
                       @focus="companyFocus"
                       @input="searchCompany"
-                      placeholder="请输入准确的公司名称"
-                    >
-                    </el-input>
+                    />
                   </el-form-item>
-                  <div class="company-result" v-if="showSearchResult">
+                  <div v-if="showSearchResult" class="company-result">
                     <div
-                      class="company-list"
                       v-for="item in companyList"
                       :key="item"
+                      class="company-list"
                       @click="selectCompany(item)"
                       v-html="item"
-                    ></div>
+                    />
                   </div>
                 </div>
-                <div class="long-control" v-if="moduleShow.companyType">
+                <div v-if="moduleShow.companyType" class="long-control">
                   <el-form-item
                     label="公司类型 :"
                     prop="companyType"
                     class="company-type"
                   >
                     <el-checkbox-group v-model="form.companyType">
-                      <el-checkbox label="投标企业"></el-checkbox>
-                      <el-checkbox label="招标采购单位"></el-checkbox>
-                      <el-checkbox label="厂商"></el-checkbox>
-                      <el-checkbox label="招标代理机构"></el-checkbox>
-                      <el-checkbox label="经销商"></el-checkbox>
-                      <el-checkbox label="服务提供商"></el-checkbox>
-                      <el-checkbox label="其他"></el-checkbox>
+                      <el-checkbox label="投标企业" />
+                      <el-checkbox label="招标采购单位" />
+                      <el-checkbox label="厂商" />
+                      <el-checkbox label="招标代理机构" />
+                      <el-checkbox label="经销商" />
+                      <el-checkbox label="服务提供商" />
+                      <el-checkbox label="其他" />
                     </el-checkbox-group>
                   </el-form-item>
                 </div>
-                <div class="long-control" v-if="moduleShow.job">
+                <div v-if="moduleShow.job" class="long-control">
                   <el-form-item label="职位 :" prop="job">
                     <el-select
+                      v-model="form.job"
                       popper-class="collect-custom-select"
                       :popper-append-to-body="false"
-                      v-model="form.job"
                       placeholder="请选择职位"
                       class="data-short-input item-input job-input"
                       clearable
@@ -148,18 +152,17 @@
                         :key="item.value"
                         :label="item.label"
                         :value="item.value"
-                      >
-                      </el-option>
+                      />
                     </el-select>
                     <!-- <el-input v-if="showOtherJob" v-model.trim="form.otherJob" class="data-short-input item-input job-name-iput"
                       @focus="otherFocus" placeholder="请输入职位名称">
                     </el-input> -->
                     <el-select
-                      style="margin-left: 12px"
                       v-if="showBranch"
+                      v-model="form.branch"
+                      style="margin-left: 12px"
                       :popper-append-to-body="false"
                       popper-class="collect-custom-select"
-                      v-model="form.branch"
                       placeholder="请选择部门"
                       class="data-short-input item-input job-input"
                       clearable
@@ -169,8 +172,7 @@
                         :key="item.value"
                         :label="item.label"
                         :value="item.value"
-                      >
-                      </el-option>
+                      />
                     </el-select>
                   </el-form-item>
                 </div>
@@ -187,47 +189,49 @@
                     <el-input type="textarea" autosize resize="none" v-model="form.business" placeholder="请输入业务范围,让合作伙伴充分了解公司业务内容"></el-input>
                   </el-form-item>
                 </div> -->
-                <div class="long-control" v-if="moduleShow.dataInput">
+                <div v-if="moduleShow.dataInput" class="long-control">
                   <el-form-item label="数据需求 :">
                     <el-input
+                      v-model="form.dataInput"
                       type="textarea"
                       :autosize="{ minRows: 3, maxRows: 4 }"
                       resize="none"
-                      v-model="form.dataInput"
                       placeholder="请描述下您需要的数据"
-                    ></el-input>
+                    />
                   </el-form-item>
                 </div>
               </div>
             </div>
-            <div class="warm-prompt" v-if="moduleShow.tip">
-              <span class="icon-warning"></span>
+            <div v-if="moduleShow.tip" class="warm-prompt">
+              <span class="icon-warning" />
               <span class="warm-text"
                 >温馨提示:请提供准确的信息,我们将为您推荐更准确、更个性化的商机和服务</span
               >
             </div>
-            <div class="agree-service" v-if="moduleShow.agree">
-              <el-checkbox v-model="form.agreeChecked"
-                >&nbsp;我同意剑鱼标讯将业务范围及合作需求提供给潜在合作伙伴搜索、查看</el-checkbox
-              >
+            <div v-if="moduleShow.agree" class="agree-service">
+              <el-checkbox v-model="form.agreeChecked">
+                &nbsp;我同意剑鱼标讯将业务范围及合作需求提供给潜在合作伙伴搜索、查看
+              </el-checkbox>
             </div>
             <div class="dialog-footer">
-              <el-button class="cancel-btn" @click="cancelForm">{{
-                computedDialogInfo.cancelText
-              }}</el-button>
-              <el-button class="submit-btn" @click="submitForm('ruleForm')">{{
-                computedDialogInfo.submitText
-              }}</el-button>
+              <el-button class="cancel-btn" @click="cancelForm">
+                {{ computedDialogInfo.cancelText }}
+              </el-button>
+              <el-button class="submit-btn" @click="submitForm('ruleForm')">
+                {{ computedDialogInfo.submitText }}
+              </el-button>
             </div>
           </el-form>
         </div>
       </div>
     </div>
-    <div id="success-dialog" style="display: none" v-show="showSuccess">
-      <div class="mask"></div>
+    <div v-show="showSuccess" id="success-dialog" style="display: none">
+      <div class="mask" />
       <div class="success-dialog-container">
         <div class="success-title">提交成功</div>
-        <div class="success-content">{{ successText }}</div>
+        <div class="success-content">
+          {{ successText }}
+        </div>
         <div class="success-footer">
           <button type="button" class="custom-btn go-know" @click="knowHandle">
             我知道了
@@ -237,44 +241,45 @@
     </div>
   </div>
 </template>
+
 <script>
 import {
-  industryJson,
-  jobJson,
-  companyScaleJson,
-  branchJson
-} from '@/assets/js/selector.js'
-import {
-  Form,
-  FormItem,
   Button,
-  CheckboxGroup,
+  Cascader,
   Checkbox,
-  Select,
+  CheckboxGroup,
+  Form,
+  FormItem,
   Input,
   Option,
-  Cascader
+  Select
 } from 'element-ui'
 import { mapState } from 'vuex'
+import {
+  branchJson,
+  companyScaleJson,
+  industryJson,
+  jobJson
+} from '@/assets/js/selector.js'
 import { debounce } from '@/utils/'
 import { ajaxGetSourceTitleAndDesc } from '@/api/modules'
 /**
  * 根据keys校验object必填项
  * @param {Array} keys - 待校验字段keys
- * @param {Object} target - 待校验object
+ * @param {object} target - 待校验object
  * @returns {boolean} - 是否通过
  */
 function checkRequiredKeys(keys, target) {
   try {
     // 职位/部门特殊处理, 满足时移除部门校验
-    if (keys.indexOf('branch') !== -1 && keys.indexOf('position') !== -1) {
+    if (keys.includes('branch') && keys.includes('position')) {
       if (target.position === '总裁' || target.position === '总经理') {
         keys.splice(keys.indexOf('branch'), 1)
       }
     }
-    return !keys.some(function (k) {
-      var tempValue = target[k]
-      var result = false
+    return !keys.some((k) => {
+      let tempValue = target[k]
+      let result = false
       if (typeof tempValue === 'number') {
         tempValue = tempValue.toString()
       }
@@ -305,6 +310,12 @@ export default {
     [Option.name]: Option,
     [Cascader.name]: Cascader
   },
+  props: {
+    showSecondstage: {
+      type: Boolean,
+      default: true
+    }
+  },
   data() {
     var validName = (rule, value, callback) => {
       if (value === '') {
@@ -569,6 +580,8 @@ export default {
           '请升级大会员,提前1-3个月获取项目采购计划,获取采购内容,提前运作提高中标率。',
         pc_article_customization:
           '请留下您的联系方式及定制数据字段需求,我们将安排专业的数据经理与您对接,为您打造专属的数据服务方案,可快速交付!',
+        pc_DataExportPayment_IndustryFields:
+          '请留下您的联系方式及定制数据字段需求,我们将安排专业的数据经理与您对接,为您打造专属的数据服务方案,可快速交付!',
         jyarticle_see3_plus_pc:
           '请完善个人信息,即刻享无限次查看标讯的权益,如需查看超前项目请联系客服:400-108-6670',
         article_purchase_intention:
@@ -631,6 +644,7 @@ export default {
         pc_article_project_limit: '申请监控更多项目',
         pc_article_cqxmmore: '申请查看超前项目',
         pc_article_customization: '量身定制专属的数据解决方案',
+        pc_DataExportPayment_IndustryFields: '量身定制专属的数据解决方案',
         jyarticle_see3_plus_pc: '免费享无限次查看标讯体验',
         pc_article_original_one: '申请更多查看原文链接权限',
         pc_article_original_more: '申请更多查看原文链接权限',
@@ -668,6 +682,8 @@ export default {
         pc_article_certificateServices: '标讯详情页-咨询企业认证服务',
         pc_article_CustomerRecommend: '标讯详情页-申请客户推荐',
         pc_article_customization: '标讯详情页-申请数据定制',
+        pc_DataExportPayment_IndustryFields:
+          '数据自助导出-支付订单-数据规格-申请数据定制行业字段-pc',
         jyarticle_see3_plus_pc: '免费享无限次查看标讯体验',
         pc_article_original_one: '标讯详情页-免费用户获取1次查看原文链接机会',
         pc_article_original_more: '标讯详情页-获取更多查看原文链接机会',
@@ -694,6 +710,20 @@ export default {
     ...mapState({
       info: (state) => state.user.info
     }),
+    phoneClass() {
+      if (this.source == 'pc_DataExportPayment_IndustryFields') {
+        return 'long-control'
+      } else {
+        return 'short-control'
+      }
+    },
+    nameClass() {
+      if (this.source == 'pc_DataExportPayment_IndustryFields') {
+        return 'long-control'
+      } else {
+        return 'short-control'
+      }
+    },
     showOtherJob: function () {
       return this.form.job === '其他'
     },
@@ -725,6 +755,12 @@ export default {
             '/common-module/pc-dialog/image/title/api-leave-title-text.png'
           break
         }
+        case 'pc_DataExportPayment_IndustryFields': {
+          result.use = true
+          result.title =
+            '/common-module/pc-dialog/image/title/custom-data-title-text.png'
+          break
+        }
       }
 
       return result
@@ -771,7 +807,10 @@ export default {
         this.source === 'pc_article_project_more'
       ) {
         return '已收到您提交的升级大会员申请,我们会尽快联系您并预约演示时间。'
-      } else if (this.source === 'pc_article_customization') {
+      } else if (
+        this.source === 'pc_article_customization' ||
+        this.source === 'pc_DataExportPayment_IndustryFields'
+      ) {
         return '已收到您提交的数据定制申请,我们的数据经理会尽快联系您~'
       } else if (this.source === 'peugeot_supplier_regist') {
         return '我们会尽快联系您完成供应商报名,请耐心等待。'
@@ -886,6 +925,7 @@ export default {
       this.moduleShow.tip = true
 
       switch (source) {
+        case 'pc_DataExportPayment_IndustryFields':
         case 'pc_article_customization': {
           this.moduleShow.companyType = false
           this.moduleShow.job = false
@@ -919,6 +959,7 @@ export default {
     addMoreParams(source, params, type = true) {
       let result = params
       switch (source) {
+        case 'pc_DataExportPayment_IndustryFields':
         case 'pc_article_customization': {
           if (type) {
             result.data_requirement = this.form.dataInput
@@ -1263,6 +1304,7 @@ export default {
 }
 /* eslint-enable */
 </script>
+
 <style lang="scss">
 /* element-ui reset */
 .custom-cascader {
@@ -1516,6 +1558,9 @@ export default {
   .form-main {
     margin: 10px 0 14px;
   }
+  .form-main-none {
+    margin: 0;
+  }
   .short-control {
     width: calc(50% - 16px);
   }

+ 17 - 0
apps/bigmember_pc/src/views/order/components/data-export/info.vue

@@ -88,6 +88,20 @@
                 预览数据
               </div>
             </div>
+            <div class="datapackage-buy-tip-group tip-red">
+              <span
+                >如需更多行业字段,如资金来源、报价方式、企业资质、人员资质、业绩资格、企业信用、建设规模等字段,您可</span
+              >
+              <span
+                style="color: #2abed1; cursor: pointer"
+                @click="
+                  $refs.collectRef.isNeedSubmit(
+                    'pc_DataExportPayment_IndustryFields'
+                  )
+                "
+                >申请数据定制></span
+              >
+            </div>
           </div>
         </SelectorCard>
         <!--E-个人支付模式下切换字段规格-->
@@ -185,6 +199,7 @@
       </el-dialog>
       <!--E-数据流量包扣除不足提示-->
     </section>
+    <CollectInfo ref="collectRef" :showSecondstage="false"></CollectInfo>
   </div>
 </template>
 
@@ -201,12 +216,14 @@ import { mapState, mapMutations, mapActions, mapGetters } from 'vuex'
 import { formatNumber } from '@/utils'
 import OrderSpecList from '@/views/order/ui/spec/list.vue'
 import SelectorCard from '@/components/selector/SelectorCard.vue'
+import CollectInfo from '@/components/collect-info/CollectInfo.vue'
 import { Loading, Dialog } from 'element-ui'
 import qs from 'qs'
 
 export default {
   name: 'data-export-order-info',
   components: {
+    CollectInfo,
     OrderSpecList,
     SelectorCard,
     [Dialog.name]: Dialog

+ 82 - 1
apps/bigmember_pc/src/views/search/bidding/index.vue

@@ -1,5 +1,5 @@
 <script setup>
-import { ref } from 'vue'
+import { ref, computed } from 'vue'
 import SearchBidHeader from '@/views/search/bidding/components/search-bid-header.vue'
 import SearchBidFilter from '@/views/search/bidding/components/search-bid-filter.vue'
 import searchFilterHeader from '@/views/search/bidding/components/search-filter-header.vue'
@@ -48,6 +48,7 @@ const {
   toDetail,
   list,
   tableList,
+  bdwAdInfo,
   tableFixedTop,
   tagToDetail,
   setExport,
@@ -98,6 +99,11 @@ const articleRef = ref({
   push: false
 })
 
+//P640项目名称/标的物 搜索结果引流广告位
+const bdwAdItem = computed(() => {
+  return  bdwAdInfo.value.sCount > 0 ?  bdwAdInfo.value.sList[0] : {}
+})
+
 // 订阅提交(P643临时注掉,以后要上,勿删)
 // const extractSubRef = ref()
 // const onConfirmSubscribe = (params) => {
@@ -109,6 +115,11 @@ const articleRef = ref({
 //     }
 //   })
 // }
+
+// 跳转到开通超级订阅页面
+function jumpBuySvip() {
+  window.open('/swordfish/page_big_pc/free/svip/buy?type=buy')
+}
 </script>
 
 <template>
@@ -151,7 +162,9 @@ const articleRef = ref({
         :show-pagination="activeItemStyleType !== 'T'"
         :is-table="activeItemStyleType === 'T'"
         :table-fixed-top="tableFixedTop"
+        :show-center-ad="true"
       >
+        {{listState.pageNum}}
         <template #other-action-item v-if="inInjectBI">
           <div class="all-add bi-add-button" @click="onAddInfoOfBI()">添加</div>
         </template>
@@ -170,6 +183,39 @@ const articleRef = ref({
             :table-fixed-top="tableFixedTop"
           ></search-list-table>
         </template>
+        <!--P640新增部分项目名称/标的物引流广告位-->
+        <template #center-insert-ad="{ index }">
+          <div class="list-center-ad" v-if="index===6 &&  !inBIPropertyIframe && !isInBI && !inBITopNet && bdwAdInfo.sCount > 0">
+            <div class="ad-tip-row">
+              <span>信息不够精准?根据“项目名称/标的物”,为您精准匹配到 <strong>{{bdwAdInfo.sCount}}条</strong> 信息</span>
+              <span class="jump-btn-span" @click="jumpBuySvip">开通超级订阅,立享更多搜索权限,寻找商机更精准&nbsp;&gt;</span>
+            </div>
+            <article-item
+              class="list-item"
+              :model="activeItemStyleType"
+              :class="{ visited: bdwAdItem.visited || bdwAdItem.ca_isvisit }"
+              :match-keys="inputKeywordsState.matchKeys"
+              :article="bdwAdItem"
+              index=""
+              :tag-click-list="['area', 'subtype']"
+              @onClick="toDetail(bdwAdItem)"
+              @tag-click="tagToDetail(bdwAdItem, $event)"
+              @onCollect="onClickSingleCollect"
+              @onJoinBid="onJoinBid"
+              :config="{
+                bidding: true,
+                detail: true,
+                gray: true,
+                joinBid: false,
+                table: false,
+                collect: !isInBI.value,
+                push: false
+              }"
+            >
+            </article-item>
+          </div>
+        </template>
+        <!--P640新增部分结束-->
         <template
           v-slot:item="{ item, index }"
           v-if="activeItemStyleType !== 'T'"
@@ -762,4 +808,39 @@ const articleRef = ref({
     color: #f7f9fa;
   }
 }
+::v-deep {
+  .list-center-ad{
+    padding-top:20px;
+    margin-bottom: 4px;
+    width:100%;
+    min-height:132px;
+    padding-left:35px;
+    background: linear-gradient(180deg,rgba(255,199,64,0.12) 0%, rgba(255,199,64, 0) 100%);
+    .ad-tip-row{
+      padding-left:15px;
+
+      span{
+        font-size:14px;
+        line-height:22px;
+      }
+      span:nth-of-type(1) {
+        color:#1d1d1d;
+        font-weight: bold;
+        strong {
+          color: #FF9F40;
+          margin: 0 1px;
+        }
+      }
+      .jump-btn-span{
+        background: #FF9F40;
+        color:#fff;
+        padding: 4px 12px;
+        border-radius: 4px;
+        margin-left:25px;
+        cursor: pointer;
+      }
+    }
+  }
+}
+
 </style>

+ 95 - 3
apps/bigmember_pc/src/views/search/bidding/model/base.js

@@ -9,7 +9,8 @@ import  {
   FilterModel2ViewModel,
   getParam,
   openLinkInWorkspace,
-  InContainer
+  InContainer,
+  extractKeywords
 } from '@/utils'
 import $bus from '@/utils/bus'
 // 筛选条件动态组件方法
@@ -41,6 +42,7 @@ import { beforeSearchModel } from './modules/before-search'
 import { recommendCardModel } from './modules/recommend-card'
 // 搜索历史业务模型
 import useSearchHistoryModel from '@jy/data-models/modules/quick-search-history/model'
+import dayjs from 'dayjs'
 // 订阅弹框业务
 // import { userSubscribeInfoModel } from './modules/data-subscribe'
 
@@ -93,7 +95,7 @@ export default function () {
 
   // 是否在工作台内
   // 本地调试,可改为工作台内isInApp = ref(true),  isInWeb = ref(false)   提交记得改回!
-  const isInApp = ref(InContainer.inApp) // InContainer.inApp
+  const isInApp =  ref(InContainer.inApp) // InContainer.inApp
   const isInWeb = ref(InContainer.inWeb) // InContainer.inWeb
 
   // isInApp.value = true
@@ -339,7 +341,8 @@ export default function () {
   const activeList = computed(() => {
     let arr = []
     if(list.value && list.value.length > 0) {
-      arr = list.value.map((v) => {
+      const sArr = sortListTitleDetail(list.value)
+      arr = sArr.map((v) => {
         v._id = v.id
         v.checked = selectIds.value.includes(v.id)
         // 中标单位联系方式处理
@@ -363,6 +366,53 @@ export default function () {
     }
     return arr
   })
+  // p640需求,如果筛选类型同时包含标题和正文,先展示标题包含关键词,再展示内容包含关键词的数据
+  // 如果不同时包含标题和正文,则不处理
+  function sortListTitleDetail (baseArr) {
+    if(filterBase.value.selectType.includes('title') && filterBase.value.selectType.includes('content')) {
+      // 辅助函数:检查字符串是否包含关键词数组中的任何一个关键词
+      function containsKeyword(str, keywords) {
+        return keywords.some(keyword => str ? str.includes(keyword) : '');
+      }
+      let arr = []
+      const baseTimeMap = {}
+      const baseTimeKeys = []
+      baseArr.forEach(v => {
+        const ymd = dayjs(v.publishTime * 1000).startOf('day').unix()
+        if (!Array.isArray(baseTimeMap[ymd])) {
+          baseTimeMap[ymd] = []
+        }
+        baseTimeMap[ymd].push(v)
+        if (!baseTimeKeys.includes(ymd)) {
+          baseTimeKeys.push(ymd)
+        }
+      })
+
+      const sortBaseTimeKeys = baseTimeKeys.sort((a,b) => b - a)
+
+      function sortItem (arr) {
+        // 筛选对象数组
+        const matchKeys = inputKeywordsState.value.matchKeys
+        const titleMatches = arr.filter(item => containsKeyword(item.title, matchKeys))
+        const contentMatches = arr.filter(item => extractKeywords(item.detail, matchKeys) && !titleMatches.some(tm => tm.title === item.title))
+        const noMatches = arr.filter(item => !containsKeyword(item.title, matchKeys) && !extractKeywords(item.detail, matchKeys));
+        // 合并结果
+        const resultArr = [...titleMatches, ...contentMatches, ...noMatches]
+        return resultArr
+      }
+
+
+      for (let i = 0; i < sortBaseTimeKeys.length; i++) {
+        const baseTimeMapKey = sortBaseTimeKeys[i]
+        const sortItemArr = sortItem(baseTimeMap[baseTimeMapKey])
+        arr = arr.concat(sortItemArr)
+      }
+
+      return arr
+    } else {
+      return baseArr
+    }
+  }
   // 表格展示的数据
   const tableList = ref([])
 
@@ -371,6 +421,11 @@ export default function () {
     interceptOtherWords: '',
     interceptLimit: 0
   })
+  // P640需求-列表中项目名称/标的物广告位数据信息
+  const bdwAdInfo= ref({
+    sCount: 0,
+    sList: []
+  })
 
   // 根据权限处理列表头部的操作按钮展示
   const limitFilterHeaderActions =  computed(() => {
@@ -730,6 +785,9 @@ export default function () {
   }
   // 处理查询请求后的数据以及其他业务
   function afterQueryAjax (res, searchType) {
+    // 处理标的物广告信息(一些数据格式化)
+    calcBdwInfo(res.origin)
+
     // 存储筛选条件
     if(isInApp.value && isLogin.value && listState.pageNum === 1 && !inBIPropertyIframe) {
       saveSearchGroupToLocal()
@@ -821,6 +879,30 @@ export default function () {
       searchMode: Number(inputKeywordsState.value.searchMode)
     })
   }
+  // 处理标的物广告信息(一些数据格式化)
+  function calcBdwInfo(origin) {
+    // P640处理标的物广告信息
+
+    if(origin.sCount > 0) {
+      bdwAdInfo.value.sCount = origin.sCount
+      const sArr = origin.sList.map(item => {
+        // 是否已读字段
+        const visited = that.$visited.check({
+          type: 'articleContent',
+          id: item.id
+        })
+        that.$set(item, 'visited', visited)
+
+        // 收藏字段显示
+        that.$set(item, 'collection', item.isCollected ? 1 : 0)
+
+        // 收录字段
+        that.$set(item, 'isEmploy', false)
+        return item
+      })
+      bdwAdInfo.value.sList = sArr
+    }
+  }
 
   // 是否展示筛选条件
   const showFilter = ref(true)
@@ -1135,6 +1217,15 @@ export default function () {
       }
       return temp
     })
+   // 标的物广告信息收藏操作更新
+    bdwAdInfo.value.sList = bdwAdInfo.value.sList.map(temp => {
+      if (type === 'R' && ids.includes(temp.id)) {
+        that.$set(temp, 'collection', 0)
+      } else if(type === 'C' && ids.includes(temp.id)){
+        that.$set(temp, 'collection', 1)
+      }
+      return temp
+    })
   })
   /********* 标讯收藏部分end ********/
 
@@ -1580,6 +1671,7 @@ export default function () {
     cooperateCode,
     list,
     tableList,
+    bdwAdInfo,
     searchModelOptions,
     searchListProps,
     SearchTabsModel,

+ 31 - 23
apps/bigmember_pc/src/views/search/layout/search-list.vue

@@ -40,7 +40,7 @@ const props = defineProps({
       pageNum: 1, // 当前页
       pageSize: 50, // 每页多少条数据
       total: 0 // 一共多少条数据
-    })
+    }),
   },
   mtb60: {
     type: Boolean,
@@ -59,6 +59,10 @@ const props = defineProps({
   tableFixedTop: {
     type: Boolean,
     default: false
+  },
+  showCenterAd: {
+    type: Boolean,
+    default: false
   }
 })
 const canShowPagination = computed(() => {
@@ -149,30 +153,34 @@ function onCurrentChange($event) {
         ></empty>
       </slot>
       <slot name="list" :list="list" v-if="!listState.loading && !isTable">
-        <div
-          class="search-result-item flex flex-(row)"
-          v-for="(item, index) in list"
-          :key="'search-item' + index"
-        >
-          <slot name="item-checkbox" v-if="showSelect">
-            <!--  选择  -->
-            <el-checkbox
-              class="p-t-18px p-l-16px"
-              :value="item.checked"
-              @change="$emit('doChangeSelect', item)"
-            >
-            </el-checkbox>
-          </slot>
-          <div class="flex-1 max-w-full of-hidden">
-            <slot
-              name="item"
-              :item="item"
-              :index="listState.pageSize * (listState.pageNum - 1) + index + 1"
-            >
-              {{ item }}
+        <template   v-for="(item, index) in list">
+          <!-- P640新增项目名称/标的物引流广告-->
+          <slot name="center-insert-ad" :index="listState.pageSize * (listState.pageNum - 1) + index + 1" v-if="showCenterAd"></slot>
+          <div
+            class="search-result-item flex flex-(row)"
+            :key="'search-item' + index"
+          >
+            <slot name="item-checkbox" v-if="showSelect">
+              <!--  选择  -->
+              <el-checkbox
+                class="p-t-18px p-l-16px"
+                :value="item.checked"
+                @change="$emit('doChangeSelect', item)"
+              >
+              </el-checkbox>
             </slot>
+            <div class="flex-1 max-w-full of-hidden">
+              <slot
+                name="item"
+                :item="item"
+                :index="listState.pageSize * (listState.pageNum - 1) + index + 1"
+              >
+                {{ item }}
+              </slot>
+            </div>
           </div>
-        </div>
+        </template>
+
       </slot>
       <slot
         name="table"

+ 1 - 1
apps/mobile/.env.production

@@ -4,4 +4,4 @@ VITE_APP_BASE_PUBLIC='https://cdn-common.jianyu360.cn/jy_mobile/'
 VITE_APP_IMAGE_BASE=''
 VITE_APP_APP_PROJECT_BASE=''
 VITE_APP_WX_PROJECT_BASE=''
-VITE_APP_GIT_BRANCH='v1.0.74'
+VITE_APP_GIT_BRANCH='v1.0.93'

+ 8 - 1
apps/mobile/scripts/updateGitInfo.js

@@ -18,8 +18,15 @@ const getGitBranch = () => {
 }
 
 const extractVersion = (branch) => {
+  let numberBranch = branch
+  if (numberBranch.indexOf('/')) {
+    numberBranch = numberBranch.split('/')[1]
+  }
+  if (numberBranch.indexOf('_')) {
+    numberBranch = numberBranch.split('_')[0]
+  }
   const versionRegex = /(v.*?)$/
-  const matches = branch.match(versionRegex)
+  const matches = numberBranch.match(versionRegex)
   return matches ? matches[0] : ''
 }
 

+ 5 - 1
apps/mobile/src/views/create-order/components/dataexport/ProductionCard.vue

@@ -94,7 +94,11 @@
         </div>
       </template>
     </SpecList>
-    <QuestionTip v-model="dialog.question" :show-signaturedate="true" />
+    <QuestionTip
+      v-model="dialog.question"
+      :show-signaturedate="true"
+      source="DataExportPayment_IndustryFields"
+    />
     <van-dialog
       v-model="dialog.balance"
       title="对不起,余额不足"

+ 10 - 10
apps/mobile/src/views/create-order/components/datapack/SpecCell.vue

@@ -1,16 +1,16 @@
 <template>
-  <!-- 产品规格组件-->
+  <!-- 产品规格组件 -->
   <div>
-    <spec-list
+    <SpecList
       title="请选择数据规格"
       :list="specList || []"
-      @activeChange="specChange"
       :active="productSpec.id"
+      @activeChange="specChange"
     >
       <template #header>
         <div :style="specInfo.desc === '标准字段包' ? 'margin-top:20px;' : ''">
           <span>{{ specInfo.desc }}</span>
-          <span class="sub-title" v-if="Object.keys(extend).length > 0">
+          <span v-if="Object.keys(extend).length > 0" class="sub-title">
             <span class="sub-text del"
               >{{ extend.originalPrice + extend.priceUnit.toString() }}/{{
                 extend.specsUnit
@@ -24,26 +24,26 @@
           </span>
         </div>
       </template>
-      <template #footer v-if="specInfo.desc === '高级字段包'">
+      <template v-if="specInfo.desc === '高级字段包'" #footer>
         <div class="spec-question">
           <span>标准字段包、高级字段包</span>
-          <van-icon name="question-o" @click="showQuestion"></van-icon>
+          <van-icon name="question-o" @click="showQuestion" />
         </div>
       </template>
-    </spec-list>
-    <QuestionTip v-model="dialog.question" />
+    </SpecList>
+    <QuestionTip v-model="dialog.question" source="dataPack_IndustryFields" />
   </div>
 </template>
 
 <script>
 import { Icon } from 'vant'
+import { mapGetters, mapState } from 'vuex'
 import SpecList from '@/components/create-order/SpecList'
 import QuestionTip from '@/views/order/components/datapack/QuestionTip'
-import { mapGetters, mapState } from 'vuex'
 import { fen2Yuan, getPureNumber } from '@/utils'
 
 export default {
-  name: 'spec-cell',
+  name: 'SpecCell',
   components: {
     [Icon.name]: Icon,
     SpecList,

+ 56 - 52
apps/mobile/src/views/dataexport/LimitPreviewData.vue

@@ -1,22 +1,22 @@
 <template>
   <div class="limit-previewData">
-    <Progress :active="exportInfo.step"></Progress>
+    <Progress :active="exportInfo.step" />
     <div class="data_option">
       <div class="data_total">
         找到 <span style="color: #2abed1">{{ total }}</span> 条数据
       </div>
       <div class="data_field" @click="showQuestion">
         <span>字段包说明</span>
-        <van-icon name="question-o"></van-icon>
+        <van-icon name="question-o" />
       </div>
     </div>
     <div
-      id="previeData_main"
       v-if="isFixed"
+      id="previeData_main"
       class="previeData_main"
       :class="[isFixed ? 'isFixed' : '', isWxFixed ? 'isWxFixed' : '']"
     >
-      <div id="previeData_thead" class="previeData_thead"></div>
+      <div id="previeData_thead" class="previeData_thead" />
     </div>
     <van-tabs
       v-if="result && result.length > 0"
@@ -25,9 +25,9 @@
       color="#2cb7ca"
       line-width="150px"
       line-height="2px"
-      @click="toggle"
       sticky
       :offset-top="offsetTop"
+      @click="toggle"
     >
       <van-tab title="标准字段包" name="1">
         <div class="table-container">
@@ -37,7 +37,7 @@
             cellspacing="0"
             cellpadding="0"
           >
-            <thead class="thead" id="mycanvas_bz">
+            <thead id="mycanvas_bz" class="thead">
               <tr>
                 <td>序号</td>
                 <td>匹配关键词</td>
@@ -77,7 +77,7 @@
       <van-tab title="高级字段包" name="2">
         <div class="table-container tableGJ">
           <table class="table table-gj" cellspacing="0" cellpadding="0">
-            <thead class="thead" id="mycanvas_gj">
+            <thead id="mycanvas_gj" class="thead">
               <tr>
                 <td rowspan="2">序号</td>
                 <td rowspan="2">匹配关键词</td>
@@ -199,15 +199,19 @@
           </table>
         </div>
       </van-tab>
-      <QuestionTip v-model="question" :show-signaturedate="true" />
-      <div class="export-table-footer" v-if="total > 20">
+      <QuestionTip
+        v-model="question"
+        source="DataExportFilter_IndustryFields"
+        :show-signaturedate="true"
+      />
+      <div v-if="total > 20" class="export-table-footer">
         <p class="view-text">导出后可查看更多数据</p>
-        <div @click="setExport" class="export-text">
+        <div class="export-text" @click="setExport">
           <span>立即导出</span>
-          <i class="icon iconfont icon-youbian"></i>
+          <i class="icon iconfont icon-youbian" />
         </div>
       </div>
-      <div class="maxExportTips" v-if="total > 20000">
+      <div v-if="total > 20000" class="maxExportTips">
         <span
           >您选择的数据超过了导出数据最大值20,000,请优化条件后导出。您也可联系客服:400-108-6670,或添加
           <span class="blue" @click="show_wxqr = true">客服微信></span
@@ -219,31 +223,33 @@
           找到 <span style="color: #2abed1">{{ total }}</span> 条数据
         </div>
         <div class="pre-footer-group">
-          <button @click="setLimitData" class="pre-footer-cancel pre-btncom">
+          <button class="pre-footer-cancel pre-btncom" @click="setLimitData">
             修改条件
           </button>
-          <button @click="setExport" class="pre-footer-confirm pre-btncom">
+          <button class="pre-footer-confirm pre-btncom" @click="setExport">
             立即导出
           </button>
         </div>
       </div>
     </van-tabs>
-    <AppEmpty v-else>{{ emptyText }}</AppEmpty>
+    <AppEmpty v-else>
+      {{ emptyText }}
+    </AppEmpty>
     <van-overlay :show="showMask" z-index="100">
       <div class="wrapper">
-        <span class="loading"></span>
+        <span class="loading" />
       </div>
     </van-overlay>
     <van-overlay :show="show_wxqr" z-index="99" @click="show_wxqr = false">
       <div class="wx_box" @click.stop>
-        <div class="wx_box_close" @click="show_wxqr = false"></div>
+        <div class="wx_box_close" @click="show_wxqr = false" />
         <div class="content_box">
           <div class="head">
             <img src="@/assets/image/dataExport/wx_icon.png" alt="" /><span
               >客服微信</span
             >
           </div>
-          <div class="qr-box" v-if="kefuInfo.wxer">
+          <div v-if="kefuInfo.wxer" class="qr-box">
             <img :src="kefuInfo.wxer" alt="" class="qr" />
           </div>
           <p class="text">微信扫一扫</p>
@@ -253,15 +259,17 @@
     </van-overlay>
   </div>
 </template>
+
 <script>
-import { Tab, Tabs, Overlay, Icon } from 'vant'
+import { Icon, Overlay, Tab, Tabs } from 'vant'
+import html2canvas from 'html2canvas'
 import Progress from '@/views/order/components/dataexport/DataExportProgress'
 import QuestionTip from '@/views/order/components/datapack/QuestionTip'
 import { AppEmpty } from '@/ui'
-import { getPreview, getCustomInfo } from '@/api/modules'
-import html2canvas from 'html2canvas'
+import { getCustomInfo, getPreview } from '@/api/modules'
+
 export default {
-  name: 'limit-previewData',
+  name: 'LimitPreviewData',
   components: {
     [Tab.name]: Tab,
     [Tabs.name]: Tabs,
@@ -288,6 +296,16 @@ export default {
     },
     kefuInfo: {}
   }),
+  computed: {},
+  watch: {
+    isFixed(newval, oldval) {
+      if (newval) {
+        this.$nextTick(() => {
+          this.setHtmlCanvas(this.active)
+        })
+      }
+    }
+  },
   created() {
     if (this.$route.query.type === 'senior') {
       this.active = '2'
@@ -303,26 +321,16 @@ export default {
     window.addEventListener('scroll', this.getScroll, true)
     this.getKefuInfo()
   },
-  watch: {
-    isFixed(newval, oldval) {
-      if (newval) {
-        this.$nextTick(() => {
-          this.setHtmlCanvas(this.active)
-        })
-      }
-    }
-  },
-  computed: {},
 
   methods: {
     // 获取客服二维码信息
-    getKefuInfo () {
+    getKefuInfo() {
       const params = {
         type: 'kf'
       }
-      getCustomInfo(params).then(res => {
+      getCustomInfo(params).then((res) => {
         const { error_code: code, data } = res
-        if(code === 0 && data) {
+        if (code === 0 && data) {
           this.kefuInfo = data
         }
       })
@@ -338,7 +346,7 @@ export default {
         ).scrollLeft
       }
       if ($scrollLeft) {
-        $scrollLeft.style.transform = 'translateX(-' + $scrolltable + 'px)'
+        $scrollLeft.style.transform = `translateX(-${$scrolltable}px)`
       }
       if (top > 140) {
         this.isFixed = true
@@ -370,10 +378,10 @@ export default {
       const height = node.offsetHeight // dom高
       const scale = 2 // 放大倍数 这个相当于清晰度 调大一点更清晰一点
       html2canvas(node, {
-        width: width,
-        height: height,
+        width,
+        height,
         backgroundColor: '#EBF5FE',
-        scale: scale,
+        scale,
         X: 0,
         Y: 0,
         // scrollX: -3, // 如果左边多个白边 设置该偏移-3 或者更多
@@ -392,19 +400,15 @@ export default {
     setExport() {
       if (this.active === '2') {
         this.$router.push(
-          '/common/order/create/dataexport?id=' +
-            this.$route.params.id +
-            '&type=senior'
+          `/common/order/create/dataexport?id=${this.$route.params.id}&type=senior`
         )
       } else {
         this.$router.push(
-          '/common/order/create/dataexport?id=' +
-            this.$route.params.id +
-            '&type=standard'
+          `/common/order/create/dataexport?id=${this.$route.params.id}&type=standard`
         )
       }
     },
-    showQuestion: function () {
+    showQuestion() {
       this.question = true
     },
     async getPreviewData(type) {
@@ -422,16 +426,16 @@ export default {
           //   this.total = res.total
           // }
           this.total = res.total
-          let result = res.data
+          const result = res.data
           result.forEach((ele) => {
             if (ele.s_winner) {
               ele.s_winnerlist = ele.s_winner.split(',')
             } else {
               ele.s_winnerlist = []
             }
-            let company_email_list = []
-            let company_phone_list = []
-            let legal_person_list = []
+            const company_email_list = []
+            const company_phone_list = []
+            const legal_person_list = []
             if (ele.winnerMaps && ele.winnerMaps.length > 0) {
               ele.s_winnerlist.forEach((a) => {
                 company_email_list.push('')
@@ -477,7 +481,7 @@ export default {
     textFormatForMosaic(text, phone) {
       if (typeof text === 'string' || typeof text === 'number') {
         if (phone) {
-          return String(text).replace(/([\w\W]*)([\w\W]{4})$/, '$1****')
+          return String(text).replace(/([\s\S]*)([\s\S]{4})$/, '$1****')
         } else {
           return String(text).replace(/^(.)(.*)/, '$1**')
         }
@@ -486,7 +490,7 @@ export default {
     },
     moneyFormatForCover(money) {
       if (typeof money === 'string' || typeof money === 'number') {
-        return String(money).replace(/(\d)(\.){0,1}(\d)/, '$1$2*')
+        return String(money).replace(/(\d)(\.)?(\d)/, '$1$2*')
       }
       return money
     }

+ 157 - 134
apps/mobile/src/views/invoice/Invoicing.vue

@@ -4,7 +4,9 @@
       <div class="item">
         <div class="text_box">
           <p class="title">订单编号:</p>
-          <p class="value">{{ infoMap.code }}</p>
+          <p class="value">
+            {{ infoMap.code }}
+          </p>
         </div>
       </div>
       <div class="item mt-10">
@@ -12,7 +14,7 @@
           <p class="title">开票金额:</p>
           <p class="value">{{ infoMap.price }}元</p>
         </div>
-        <div class="rightBtn" @click="tipShow = true" v-if="!$envs.inApp">
+        <div v-if="!$envs.inApp" class="rightBtn" @click="tipShow = true">
           开票规则
         </div>
       </div>
@@ -21,209 +23,211 @@
       <div class="j-content">
         <div class="item-box-type">
           <div class="item-box-title redstar">发票类型</div>
-          <radioGroup
+          <RadioGroup
             v-model="infoMap.type"
             :list="typelist"
             @change="initshowModule"
-          ></radioGroup>
+          />
         </div>
         <van-field
           v-model.trim="infoMap.content"
           label="发票内容"
           readonly
-          @click="chooseContent"
           right-icon="arrow"
           right-icon-size="14"
-        ></van-field>
+          @click="chooseContent"
+        />
         <div class="item-box-type">
           <div class="item-box-title redstar">发票抬头</div>
-          <radioGroup
+          <RadioGroup
             v-model="infoMap.invoiceHeader"
             :list="invoiceHeaderlist"
             @change="initshowModule"
-          ></radioGroup>
+          />
         </div>
 
         <div class="companybox">
-          <div class="associate-ent-group" v-show="isAssociateShow">
+          <div v-show="isAssociateShow" class="associate-ent-group">
             <div
+              v-for="(item, i) in searchList"
+              :key="i"
               class="associate-ent-item"
               @click="selectEnt(item)"
-              v-for="(item, i) in searchList"
-              v-bind:key="i"
               v-html="highlightText(item.name, infoMap.company)"
-            ></div>
+            />
           </div>
           <van-field
+            v-if="showModule.company"
             v-model.trim="infoMap.company"
             label="公司名称"
             maxlength="50"
-            @focus="infoCheckMap.company = ''"
-            @input="entOnChange('input')"
-            @blur="entOnChange('blur')"
-            :errorMessage="infoCheckMap.company"
+            :error-message="infoCheckMap.company"
             :required="requireds.company"
             placeholder="请输入准确的公司名称"
-            v-if="showModule.company"
             type="textarea"
             rows="1"
             autosize
-          ></van-field>
+            @focus="infoCheckMap.company = ''"
+            @input="entOnChange('input')"
+            @blur="entOnChange('blur')"
+          />
         </div>
 
         <van-field
+          v-if="showModule.dutyparagraph"
           v-model.trim="infoMap.dutyparagraph"
           label="单位税号"
-          @focus="infoCheckMap.dutyparagraph = ''"
-          @blur="getCheckMap('dutyparagraph')"
-          :errorMessage="infoCheckMap.dutyparagraph"
+          :error-message="infoCheckMap.dutyparagraph"
           :required="requireds.dutyparagraph"
           placeholder="请输入纳税人识别号"
-          v-if="showModule.dutyparagraph"
           type="textarea"
           rows="1"
           autosize
-        ></van-field>
+          @focus="infoCheckMap.dutyparagraph = ''"
+          @blur="getCheckMap('dutyparagraph')"
+        />
 
         <van-field
+          v-if="showModule.unitAddress"
           v-model.trim="infoMap.unitAddress"
           label="单位地址"
-          @focus="infoCheckMap.unitAddress = ''"
-          @blur="getCheckMap('unitAddress')"
-          :errorMessage="infoCheckMap.unitAddress"
+          :error-message="infoCheckMap.unitAddress"
           :required="requireds.unitAddress"
           placeholder="请输入单位地址"
-          v-if="showModule.unitAddress"
           type="textarea"
           rows="1"
           autosize
           maxlength="200"
-        ></van-field>
+          @focus="infoCheckMap.unitAddress = ''"
+          @blur="getCheckMap('unitAddress')"
+        />
 
         <van-field
+          v-if="showModule.tel"
           v-model.trim="infoMap.tel"
           label="电话号码"
-          @focus="infoCheckMap.tel = ''"
-          @blur="getCheckMap('tel')"
-          :errorMessage="infoCheckMap.tel"
+          :error-message="infoCheckMap.tel"
           :required="requireds.tel"
           placeholder="请输入电话号码"
-          v-if="showModule.tel"
-        ></van-field>
+          @focus="infoCheckMap.tel = ''"
+          @blur="getCheckMap('tel')"
+        />
 
         <van-field
+          v-if="showModule.bank"
           v-model.trim="infoMap.bank"
           label="开户银行"
-          @focus="infoCheckMap.bank = ''"
-          @blur="getCheckMap('bank')"
-          :errorMessage="infoCheckMap.bank"
+          :error-message="infoCheckMap.bank"
           :required="requireds.bank"
           placeholder="请输入开户银行"
-          v-if="showModule.bank"
           type="textarea"
           rows="1"
           autosize
           maxlength="200"
-        ></van-field>
+          @focus="infoCheckMap.bank = ''"
+          @blur="getCheckMap('bank')"
+        />
 
         <van-field
+          v-if="showModule.bankCode"
           v-model.trim="infoMap.bankCode"
           label="银行账号"
-          @focus="infoCheckMap.bankCode = ''"
-          @blur="getCheckMap('bankCode')"
-          :errorMessage="infoCheckMap.bankCode"
+          :error-message="infoCheckMap.bankCode"
           :required="requireds.bankCode"
           placeholder="请输入银行账号"
-          v-if="showModule.bankCode"
           type="textarea"
           maxlength="50"
           rows="1"
           autosize
-        ></van-field>
+          @focus="infoCheckMap.bankCode = ''"
+          @blur="getCheckMap('bankCode')"
+        />
       </div>
       <div
-        class="j-content-nocolor"
         v-show="!showDesc"
+        class="j-content-nocolor"
         @click="showDesc = !showDesc"
       >
         <div class="showMore">
-          <div class="line" style="margin-right: 12px"></div>
+          <div class="line" style="margin-right: 12px" />
           <span class="showMore-text">开票备注</span>
-          <div class="ic-drop"></div>
-          <div class="line" style="margin-left: 8px"></div>
+          <div class="ic-drop" />
+          <div class="line" style="margin-left: 8px" />
         </div>
       </div>
-      <div class="j-content" v-show="showDesc">
+      <div v-show="showDesc" class="j-content">
         <van-field
+          v-if="showModule.desc"
           v-model.trim="infoMap.desc"
           label="开票备注"
-          @focus="infoCheckMap.desc = ''"
           :required="requireds.desc"
-          :errorMessage="infoCheckMap.desc"
+          :error-message="infoCheckMap.desc"
           placeholder="此部分内容会展示在发票“备注”上,请按照贵司财务要求进行填写"
-          v-if="showModule.desc"
           maxlength="200"
           type="textarea"
           rows="3"
           autosize
-        ></van-field>
+          @focus="infoCheckMap.desc = ''"
+        />
       </div>
       <div class="j-content">
         <van-field
+          v-if="showModule.name"
           v-model.trim="infoMap.name"
           label="收件人"
-          @focus="infoCheckMap.name = ''"
-          @blur="getCheckMap('name')"
-          :errorMessage="infoCheckMap.name"
+          :error-message="infoCheckMap.name"
           :required="requireds.name"
           placeholder="请输入收件人"
-          v-if="showModule.name"
           maxlength="200"
-        ></van-field>
+          @focus="infoCheckMap.name = ''"
+          @blur="getCheckMap('name')"
+        />
 
         <van-field
           v-model.trim="infoMap.phone"
           label="联系电话"
-          @focus="infoCheckMap.phone = ''"
-          @blur="getCheckMap('phone')"
-          :errorMessage="infoCheckMap.phone"
+          :error-message="infoCheckMap.phone"
           :required="requireds.phone"
           placeholder="请输入联系电话"
-        ></van-field>
+          @focus="infoCheckMap.phone = ''"
+          @blur="getCheckMap('phone')"
+        />
 
         <van-field
+          v-if="showModule.deliveryAddress"
           v-model.trim="infoMap.deliveryAddress"
           label="收件地址"
-          @focus="infoCheckMap.deliveryAddress = ''"
-          @blur="getCheckMap('deliveryAddress')"
-          :errorMessage="infoCheckMap.deliveryAddress"
+          :error-message="infoCheckMap.deliveryAddress"
           :required="requireds.deliveryAddress"
           placeholder="请输入收件地址"
           type="textarea"
           rows="1"
           autosize
-          v-if="showModule.deliveryAddress"
           maxlength="200"
-        ></van-field>
+          @focus="infoCheckMap.deliveryAddress = ''"
+          @blur="getCheckMap('deliveryAddress')"
+        />
 
         <van-field
+          v-if="showModule.email"
           v-model.trim="infoMap.email"
           label="电子邮箱"
-          @focus="infoCheckMap.email = ''"
-          @blur="getCheckMap('email')"
-          :errorMessage="infoCheckMap.email"
+          :error-message="infoCheckMap.email"
           :required="requireds.email"
           placeholder="请输入电子邮箱"
           type="textarea"
           rows="1"
           autosize
-          v-if="showModule.email"
           maxlength="50"
-        ></van-field>
+          @focus="infoCheckMap.email = ''"
+          @blur="getCheckMap('email')"
+        />
       </div>
     </div>
     <div class="j-bottom">
-      <p class="b-desc">{{ desc }}</p>
+      <p class="b-desc">
+        {{ desc }}
+      </p>
       <div class="j-button-group">
         <button
           class="j-button-confirm"
@@ -234,45 +238,45 @@
         </button>
       </div>
     </div>
-    <popupTip
+    <PopupTip
       v-model="tipShow"
       text="开票规则:<br>1.平台提供电子普通发票、电子专用发票,发票内容为可选“信息技术服务-技术服务费”、“信息技术服务-会员费”、“信息技术服务-招投标数据服务”;<br>2.您申请的电子发票将在3个工作日内由平台开具并发送至您的邮箱,请注意查收;<br>3.电子发票共有3种格式:PDF、OFD、XML,手机端查看发票默认为PDF格式,如需OFD、XML格式,您可前往邮箱或剑鱼标讯电脑端查看发票并下载;4.如有问题可联系客服,客服电话:400-108-6670。"
-    >
-    </popupTip>
+    />
     <PopupSelect
-      :selectList="selectList"
       ref="PopupSelect"
-      popTitle="发票内容"
+      :select-list="selectList"
+      pop-title="发票内容"
       @changeHandle="changeHandle"
       @confirmHandle="confirmHandle"
-    ></PopupSelect>
+    />
   </div>
 </template>
+
 <script>
+import { Button, Field, Icon } from 'vant'
 import EventBus from '@/utils/eventBus'
 import {
   ajaxGetCompanyAssociation,
-  ajaxInvoiceSubmit,
-  ajaxInvoiceQuery,
-  ajaxInvoiceNewshow,
-  ajaxInvoiceSwitch,
   ajaxInvoiceAavailable,
-  ajaxInvoiceNewReplace
+  ajaxInvoiceNewReplace,
+  ajaxInvoiceNewshow,
+  ajaxInvoiceQuery,
+  ajaxInvoiceSubmit,
+  ajaxInvoiceSwitch
 } from '@/api/modules'
 import { replaceKeyword } from '@/utils/utils'
-import { Field, Icon, Button } from 'vant'
 import popupTip from '@/components/invoice/popupTip'
 import radioGroup from '@/components/invoice/radioGroup'
 import PopupSelect from '@/components/invoice/PopupSelect'
+
 export default {
-  // eslint-disable-next-line vue/multi-word-component-names
   name: 'Invoicing',
   components: {
     [Field.name]: Field,
     [Icon.name]: Icon,
     [Button.name]: Button,
-    popupTip,
-    radioGroup,
+    PopupTip: popupTip,
+    RadioGroup: radioGroup,
     PopupSelect
   },
   data() {
@@ -399,11 +403,11 @@ export default {
       if (this.infoMap.name && this.infoMap.name.length > 10) {
         return false
       }
-      var namereg = /^[\u4E00-\u9FA5A-Za-z\s]+(·[\u4E00-\u9FA5A-Za-z]+)*$/ //中英文或加.的少数民族名字
+      const namereg = /^[\u4E00-\u9FA5A-Z\s]+(·[\u4E00-\u9FA5A-Z]+)*$/i // 中英文或加.的少数民族名字
       return namereg.test(this.infoMap.name)
     },
     checkEmail() {
-      let emailRegExp = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
+      const emailRegExp = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
       if (this.infoMap.email.length > 50) {
         return false
       }
@@ -429,7 +433,7 @@ export default {
       return false
     },
     checkBankcode() {
-      let RegExp = /^\d+$/
+      const RegExp = /^\d+$/
       if (!this.infoMap.bankCode) {
         return false
       }
@@ -465,7 +469,7 @@ export default {
   },
   methods: {
     async initData() {
-      let {
+      const {
         onlyIdentifying,
         invoiceMoney,
         operator,
@@ -473,12 +477,12 @@ export default {
         type,
         invoiceId
       } = this.$route.query
-      this.onlyIdentifying = onlyIdentifying ? onlyIdentifying : ''
-      this.invoiceMoney = invoiceMoney ? invoiceMoney : ''
-      this.operator = operator ? operator : ''
-      this.order_code = order_code ? order_code : ''
-      this.type = type ? type : ''
-      this.invoiceId = invoiceId ? invoiceId : ''
+      this.onlyIdentifying = onlyIdentifying || ''
+      this.invoiceMoney = invoiceMoney || ''
+      this.operator = operator || ''
+      this.order_code = order_code || ''
+      this.type = type || ''
+      this.invoiceId = invoiceId || ''
       if (this.enterSource === 'qrcode') {
         this.urlparms = {
           onlyIdentifying: this.onlyIdentifying,
@@ -502,7 +506,7 @@ export default {
         if (res.data) {
           this.infoMap.code = res.data.orderCodes ? res.data.orderCodes : ''
           this.infoMap.price = res.data.money ? res.data.money / 100 : 0
-          this.initEnt(res.data.company_name)
+          // this.initEnt(res.data.company_name) // 不再根据公司名称初始化税号
           if (
             res.data.invoice &&
             this.type !== 'again' &&
@@ -517,14 +521,22 @@ export default {
             })
           }
           if (
-            res.data.invoice &&
-            (this.type === 'again' || this.type === 'Replace')
+            (res.data.invoice &&
+              (this.type === 'again' || this.type === 'Replace')) ||
+            res.data.showData
           ) {
-            // 换开或重开信息回显
-            this.infoMap.type = this.DigitstoChinese_type(
-              res.data.invoice.invoice_variety
-            )
-            this.infoMap.content = res.data.invoice.invoice_content || ''
+            // 换开或重开信息回显或者有上次发票信息回显
+            let data = {}
+            if (res.data.showData) {
+              // 有上次发票信息回显
+              data = res.data.showData
+            }
+            if (this.type === 'again' || this.type === 'Replace') {
+              // 换开或重开信息回显
+              data = res.data.invoice
+            }
+            this.infoMap.type = this.DigitstoChinese_type(data.invoice_variety)
+            this.infoMap.content = data.invoice_content || ''
             this.selectList.forEach((item) => {
               if (this.infoMap.content.includes(item.title)) {
                 item.checked = true
@@ -533,21 +545,19 @@ export default {
               }
             })
             this.infoMap.invoiceHeader = this.DigitstoChinese_invoiceHeader(
-              res.data.invoice.invoice_type
+              data.invoice_type
             )
-            this.infoMap.company = res.data.invoice.company_name || ''
-            this.infoMap.dutyparagraph =
-              res.data.invoice.taxpayer_identnum || ''
-            this.infoMap.unitAddress = res.data.invoice.company_address || ''
-            this.infoMap.tel = res.data.invoice.company_phone || ''
-            this.infoMap.bank = res.data.invoice.bank_name || ''
-            this.infoMap.bankCode = res.data.invoice.bank_account || ''
-            this.infoMap.desc = res.data.invoice.remark || ''
-            this.infoMap.name = res.data.invoice.recipient || ''
-            this.infoMap.phone = res.data.invoice.phone || ''
-            this.infoMap.email = res.data.invoice.mail || ''
-            this.infoMap.deliveryAddress =
-              res.data.invoice.delivery_address || ''
+            this.infoMap.company = data.company_name || ''
+            this.infoMap.dutyparagraph = data.taxpayer_identnum || ''
+            this.infoMap.unitAddress = data.company_address || ''
+            this.infoMap.tel = data.company_phone || ''
+            this.infoMap.bank = data.bank_name || ''
+            this.infoMap.bankCode = data.bank_account || ''
+            this.infoMap.desc = data.remark || ''
+            this.infoMap.name = data.recipient || ''
+            this.infoMap.phone = data.phone || ''
+            this.infoMap.email = data.mail || ''
+            this.infoMap.deliveryAddress = data.delivery_address || ''
           }
         }
       } else {
@@ -573,9 +583,10 @@ export default {
           duration: 0,
           message: 'loading...'
         })
-        const { status } = await ajaxInvoiceAavailable({
-          order_code: this.order_code
-        })
+        // 移动端开发票手机号校验支持400开头手机号 不在限制
+        // const { status } = await ajaxInvoiceAavailable({
+        //   order_code: this.order_code
+        // })
         // if (status === 0) {
         //   // 不支持开票
         //   if (this.$envs.inWX) {
@@ -589,14 +600,23 @@ export default {
           stype: 1,
           code: this.order_code
         })
-        let data = res.data
-        this.infoMap.price = data.pay_money ? data.pay_money / 100 : 0
-        if (this.type === 'again' || this.type === 'Replace') {
+        this.infoMap.price = res.data.pay_money ? res.data.pay_money / 100 : 0
+        if (
+          this.type === 'again' ||
+          this.type === 'Replace' ||
+          res.data.showData
+        ) {
           const resdata = await ajaxInvoiceNewshow({
             stype: 2,
             code: this.invoiceId
           })
-          let data = resdata.data.invoice
+          let data = {}
+          if (res.data.showData) {
+            data = res.data.showData
+          }
+          if (this.type === 'again' || this.type === 'Replace') {
+            data = resdata.data.invoice
+          }
           if (this.type === 'Replace') {
             this.infoMap.price = data.invoice_money
               ? data.invoice_money / 100
@@ -656,14 +676,14 @@ export default {
           ele.checked = false
         }
       })
-      this.infoMap.content = '信息技术服务-' + item.title
+      this.infoMap.content = `信息技术服务-${item.title}`
     },
     confirmHandle() {
       this.$refs.PopupSelect.visibleHandle(false)
     },
     confirm_ok() {
       const loading = this.$toast.loading({ duration: 0, message: '提交中...' })
-      let parms = {
+      const parms = {
         company_name: this.showModule.company ? this.infoMap.company : '',
         phone: this.showModule.phone ? this.infoMap.phone : '',
         mail: this.showModule.email ? this.infoMap.email : '',
@@ -1090,10 +1110,11 @@ export default {
           this.infoCheckMap.tel = ''
         }
       } else {
-        this.requireds.bankCode = true
-        this.requireds.bank = true
-        this.requireds.unitAddress = true
-        this.requireds.tel = true
+        // 专票不在限制以下几个为必填
+        this.requireds.bankCode = false
+        this.requireds.bank = false
+        this.requireds.unitAddress = false
+        this.requireds.tel = false
       }
     },
     invoiceHeaderFilter(val) {
@@ -1133,13 +1154,15 @@ export default {
       }
     },
     checkPhone(val) {
-      return /^(1[3|4|5|6|7|8|9])\d{9}$|^0\d{2,3}-?\d{7,8}$|^400[016789]\d{6}$|^400-[016789]\d{2}-\d{4}$/.test(val)
+      return /^(1[3-9|])\d{9}$|^0\d{2,3}-?\d{7,8}$|^400[016-9]\d{6}$|^400-[016-9]\d{2}-\d{4}$/.test(
+        val
+      )
     },
     highlightText(value, keyStr) {
       return replaceKeyword(
         value,
         keyStr,
-        '<span class="highlight-text">' + keyStr + '</span>'
+        `<span class="highlight-text">${keyStr}</span>`
       )
     }
   }

+ 35 - 26
apps/mobile/src/views/order/components/dataexport/ProductionCard.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="production-card data-export">
-    <Progress :active="exportInfo.step"></Progress>
+    <Progress :active="exportInfo.step" />
     <div class="msg-count-container bg-white border-line-t">
       <div class="m-c-left">
         已选择 <span class="msg-count">{{ exportInfo.count }}</span> 条数据
@@ -10,23 +10,25 @@
       </div>
     </div>
     <SpecList
+      v-model="payActive"
       class="pay-list"
       title="请选择支付方式"
       :list="payList"
-      activeType="value"
-      v-model="payActive"
+      active-type="value"
       @change="payListChange"
     >
       <template #card-content="{ spec }">
-        <div class="spec-i-label">{{ spec.label }}</div>
-        <div class="spec-i-text color-red" v-if="spec.desc">
+        <div class="spec-i-label">
+          {{ spec.label }}
+        </div>
+        <div v-if="spec.desc" class="spec-i-text color-red">
           {{ spec.desc }}
         </div>
       </template>
       <template #footer>
         <div class="pay-way-tip">
           <span>数据流量包:按条数预充值,价格更优!</span>
-          <span class="arrow-rightx3"></span>
+          <span class="arrow-rightx3" />
           <span id="buy-data-pack-for-link" @click="chargeNow">
             <img src="@/assets/image/area-pack/buy-now.png" alt="" />
           </span>
@@ -35,16 +37,16 @@
     </SpecList>
     <!-- 数据流量包 可选账户列表 -->
     <van-radio-group
-      class="account-list bg-white"
       v-show="payActive === 'pack' && accountList.length > 1"
       v-model="accountListActive"
+      class="account-list bg-white"
       @change="accountListActiveChange"
     >
       <van-cell-group>
         <van-cell
           v-for="(item, index) in accountList"
-          clickable
           :key="index"
+          clickable
           :title="item.title"
           :label="item.tip"
           @click="accountListActive = index"
@@ -55,7 +57,7 @@
                 <span
                   class="j-icon checkbox"
                   :class="{ checked: props.checked }"
-                ></span>
+                />
               </template>
             </van-radio>
           </template>
@@ -64,15 +66,17 @@
     </van-radio-group>
     <!-- 个人支付 -->
     <SpecList
-      class="s-list"
       v-show="payActive === 'pay'"
+      v-model="specActive"
+      class="s-list"
       title="请选择数据规格"
       :list="specList"
-      v-model="specActive"
       @change="personalSpecChange"
     >
       <template #card-content="{ spec }">
-        <div class="spec-i-label">{{ spec.label }}</div>
+        <div class="spec-i-label">
+          {{ spec.label }}
+        </div>
         <div class="spec-i-sub mt8">
           <span class="spec-i-text del">{{ spec.before }}元/条</span>
           <span class="spec-i-text">{{ spec.price }}元/条</span>
@@ -82,7 +86,7 @@
         <div class="b-group">
           <div class="spec-question">
             <span>标准字段包、高级字段包</span>
-            <van-icon name="question-o" @click="showQuestion"></van-icon>
+            <van-icon name="question-o" @click="showQuestion" />
           </div>
           <div class="prev-data">
             <span @click="onPrevdata">预览数据</span>
@@ -90,7 +94,10 @@
         </div>
       </template>
     </SpecList>
-    <QuestionTip v-model="dialog.question" />
+    <QuestionTip
+      v-model="dialog.question"
+      source="DataExportPayment_IndustryFields"
+    />
     <van-dialog
       v-model="dialog.balance"
       title="对不起,余额不足"
@@ -106,28 +113,29 @@
       <div class="balance-tip-content desc-list">
         <div class="desc-list">
           <div
-            class="desc-item"
             v-for="(item, index) in balanceConf.descList"
-            :key="index"
             v-show="item.showInDialog"
+            :key="index"
+            class="desc-item"
           >
             <span class="desc-item-label">{{ item.label }}</span>
             <span class="desc-item-split">{{ item.split }}</span>
             <span class="desc-item-text">{{ item.text }}</span>
           </div>
         </div>
-        <p class="tip-warning" v-show="balanceConf.tipTextSelfShow">
+        <p v-show="balanceConf.tipTextSelfShow" class="tip-warning">
           {{ balanceConf.tipTextSelf }}
         </p>
-        <p class="tip-warning" v-show="balanceConf.tipTextAdminShow">
+        <p v-show="balanceConf.tipTextAdminShow" class="tip-warning">
           {{ balanceConf.tipTextAdmin }}
         </p>
       </div>
     </van-dialog>
   </div>
 </template>
+
 <script>
-import { Icon, Cell, CellGroup, Radio, RadioGroup } from 'vant'
+import { Cell, CellGroup, Icon, Radio, RadioGroup } from 'vant'
 import SpecList from '@/components/create-order/SpecList'
 import Progress from '@/views/order/components/dataexport/DataExportProgress'
 import QuestionTip from '@/views/order/components/datapack/QuestionTip'
@@ -135,15 +143,14 @@ import { mixinHeader } from '@/utils/mixins/header'
 import { yuan2Fen } from '@/utils'
 import { accMul } from '@/utils/math'
 import {
+  getDataExportFilterInfo,
   getDataExportInfo,
-  getDataPackUsage,
   getDataExportPrice,
-  getDataExportFilterInfo
+  getDataPackUsage
 } from '@/api/modules'
 
 export default {
   name: 'DataExportProductionCard',
-  mixins: [mixinHeader],
   components: {
     [Icon.name]: Icon,
     [Cell.name]: Cell,
@@ -154,6 +161,7 @@ export default {
     Progress,
     QuestionTip
   },
+  mixins: [mixinHeader],
   data() {
     return {
       pageLayoutConf: {
@@ -343,10 +351,10 @@ export default {
     onPrevdata() {
       if (this.specActive === 1) {
         this.$router.push(
-          '/dataexport/preview/' + this.exportInfo.id + '?type=senior'
+          `/dataexport/preview/${this.exportInfo.id}?type=senior`
         )
       } else {
-        this.$router.push('/dataexport/preview/' + this.exportInfo.id)
+        this.$router.push(`/dataexport/preview/${this.exportInfo.id}`)
       }
     },
     async payListChange() {
@@ -793,7 +801,7 @@ export default {
       }
     },
     // 支付总金额
-    calcPrice: function () {
+    calcPrice() {
       const { price, before } = this.activeSpec
       const { orderMinPrice } = this.exportConf
       const { count } = this.exportInfo
@@ -852,7 +860,7 @@ export default {
     closeBalanceDialog() {
       this.dialog.balance = false
     },
-    showQuestion: function () {
+    showQuestion() {
       this.dialog.question = true
     },
     backToFilter() {
@@ -868,6 +876,7 @@ export default {
   }
 }
 </script>
+
 <style lang="scss" scoped>
 .msg-count-container {
   margin-bottom: 8px;

+ 24 - 26
apps/mobile/src/views/order/components/datapack/ProductionCard.vue

@@ -5,37 +5,33 @@
         center
         title="充值条数"
         is-link
-        :value="charge.count + '条'"
+        :value="`${charge.count}条`"
         @click="chargeCount.pickerShow = true"
       >
         <template>
           <span
             >{{ charge.count }}条<span
-              class="highlight-text"
               v-if="getNowPopSelectValue"
+              class="highlight-text"
             >
               赠{{ getNowPopSelectValue }}条</span
             ></span
           >
         </template>
       </van-cell>
-      <van-cell
-        center
-        title="有效期"
-        :value="charge.duration + '年'"
-      ></van-cell>
+      <van-cell center title="有效期" :value="`${charge.duration}年`" />
     </van-cell-group>
     <SpecList
+      v-model="specActive"
       title="请选择数据规格"
       :list="specList"
-      v-model="specActive"
       @change="specChange"
     >
       <template #card-content="{ spec }">
         <div class="spec-i-label">
           {{ spec.label }}
-          <div class="activity-badge" v-if="spec.activityInfo">
-            <span class="j-icon icon-crown"></span>&nbsp;{{ spec.activityInfo }}
+          <div v-if="spec.activityInfo" class="activity-badge">
+            <span class="j-icon icon-crown" />&nbsp;{{ spec.activityInfo }}
           </div>
         </div>
         <div class="spec-i-sub">
@@ -46,7 +42,7 @@
       <template #footer>
         <div class="spec-question">
           <span>标准字段包、高级字段包</span>
-          <van-icon name="question-o" @click="showQuestion"></van-icon>
+          <van-icon name="question-o" @click="showQuestion" />
         </div>
       </template>
     </SpecList>
@@ -54,9 +50,9 @@
       v-model="chargeCount.pickerShow"
       round
       position="bottom"
-      @closed="chargeCountPopupClosed"
       get-container="body"
       :style="{ height: '45%' }"
+      @closed="chargeCountPopupClosed"
     >
       <PopupLayout
         title="充值条数"
@@ -64,11 +60,11 @@
       >
         <div class="select-group">
           <div
-            class="select-item"
             v-for="(item, index) in chargeCount.infoList"
             :key="index"
-            @click="selectPop(item)"
+            class="select-item"
             :class="{ active: chargeCount.value === item.value }"
+            @click="selectPop(item)"
           >
             <span class="item-label"
               >{{ item.label
@@ -80,7 +76,7 @@
                 }}条</span
               ></span
             >
-            <span class="j-icon base-icon icon-check"></span>
+            <span class="j-icon base-icon icon-check" />
           </div>
         </div>
         <template #footer>
@@ -92,16 +88,17 @@
         </template>
       </PopupLayout>
     </van-popup>
-    <QuestionTip v-model="dialog.question" />
+    <QuestionTip v-model="dialog.question" source="dataPack_IndustryFields" />
   </div>
 </template>
+
 <script>
-import { Cell, CellGroup, Popup, Icon } from 'vant'
+import { Cell, CellGroup, Icon, Popup } from 'vant'
 import SpecList from '@/components/create-order/SpecList'
 import PopupLayout from '@/components/common/PopupLayout'
 import QuestionTip from '@/views/order/components/datapack/QuestionTip'
 import { mixinHeader } from '@/utils/mixins/header'
-import { yuan2Fen, fen2Yuan } from '@/utils'
+import { fen2Yuan, yuan2Fen } from '@/utils'
 
 import {
   getDataPackGoodsPrice,
@@ -112,7 +109,6 @@ import {
 
 export default {
   name: 'DataPackProductionCard',
-  mixins: [mixinHeader],
   components: {
     [Cell.name]: Cell,
     [Icon.name]: Icon,
@@ -122,6 +118,7 @@ export default {
     QuestionTip,
     SpecList
   },
+  mixins: [mixinHeader],
   data() {
     return {
       pageLayoutConf: {
@@ -218,7 +215,7 @@ export default {
     }
   },
   computed: {
-    getNowPopSelectValue: function () {
+    getNowPopSelectValue() {
       return this.specActive === 1
         ? this.cachePopSelect.senior_num
         : this.cachePopSelect.normal_num
@@ -476,7 +473,7 @@ export default {
       if (Array.isArray(info.packs_showList)) {
         info.packs_showList.forEach((item) => {
           list.push({
-            label: item.packNum + '条',
+            label: `${item.packNum}条`,
             value: item.packNum,
             normal_discount: item.normal_discount,
             senior_discount: item.senior_discount,
@@ -519,7 +516,7 @@ export default {
       this.specList[1].price = info.unitPrice_senior * cDiscount * info.discount
     },
     // 计算卡片展示金额 和 支付总金额
-    calcPrice: function () {
+    calcPrice() {
       // 获取被选中的规格卡片info
       const specItem = this.getSpecItem()
       // 获取被选中的条数info
@@ -541,7 +538,7 @@ export default {
       this.computedPrice.pay = yuan2Fen(afterPrice)
     },
     // 获取被选中的规格卡片info
-    getSpecItem: function () {
+    getSpecItem() {
       let t = {}
       this.specList.some((item) => {
         const gotThis = item.id === this.specActive
@@ -553,7 +550,7 @@ export default {
       return t
     },
     // 获取被选中的条数info
-    getCountItem: function () {
+    getCountItem() {
       let t = {}
       this.chargeCount.infoList.some((item) => {
         const gotThis = item.value === this.charge.count
@@ -564,7 +561,7 @@ export default {
       })
       return t
     },
-    selectPop: function (item) {
+    selectPop(item) {
       this.chargeCount.cache = item
       this.chargeCount.value = item.value
     },
@@ -589,7 +586,7 @@ export default {
       this.chargeCount.pickerShow = false
       this.changeCardBadge()
     },
-    showQuestion: function () {
+    showQuestion() {
       this.dialog.question = true
     },
     /**
@@ -687,6 +684,7 @@ export default {
   }
 }
 </script>
+
 <style lang="scss" scoped>
 .data-pack {
   .van-cell {

+ 63 - 13
apps/mobile/src/views/order/components/datapack/QuestionTip.vue

@@ -9,15 +9,22 @@
     :style="{ top: '50%' }"
     @confirm="onConfirm"
   >
+    <div v-if="source" class="sourceBox">
+      以下数据示例仅为部分字段,如需更多行业字段,如资金来源、报价方式、企业资质、人员资质、业绩资格、企业信用、建设规模等字段,您可<span
+        class="sourceBtn"
+        @click="keepFunds"
+        >申请数据定制></span
+      >
+    </div>
     <div class="content-list">
-      <div class="content-item">
-        <div class="content-label">· 标准字段包</div>
+      <div class="content-item bz-content">
+        <div class="content-label">标准字段包:</div>
         <div class="content-text">
           匹配关键词、省份、城市、公告标题、剑鱼标讯地址、公告类别、发布时间、采购单位、中标单位、中标金额、项目名称、公告内容
         </div>
       </div>
       <div class="content-item">
-        <div class="content-label">· 高级字段包</div>
+        <div class="content-label">高级字段包:</div>
         <div class="content-text">
           匹配关键词、省份、城市、区县、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、行业、项目范围、预算金额、中标金额、报名截止日期、开标日期、投标截止日期、{{
             showSignaturedate ? '合同签订时间、' : ''
@@ -27,9 +34,16 @@
     </div>
   </van-dialog>
 </template>
+
 <script>
+import { openLinkOfOther } from '@/utils'
+
 export default {
   name: 'QuestionTip',
+  model: {
+    prop: 'show',
+    event: 'change'
+  },
   props: {
     show: {
       type: Boolean,
@@ -39,13 +53,24 @@ export default {
     showSignaturedate: {
       type: Boolean,
       default: false
+    },
+    source: {
+      type: String,
+      default: ''
     }
   },
-  model: {
-    prop: 'show',
-    event: 'change'
-  },
   methods: {
+    keepFunds() {
+      let openLink = ''
+      if (this.$envs.inWX) {
+        openLink = `/weixin/frontPage/bigmember/free/perfect_info?source=wx_${this.source}`
+      } else if (this.$envs.inH5) {
+        openLink = `/jyapp/frontPage/bigmember/free/perfect_info?source=h5_${this.source}`
+      } else {
+        openLink = `/jyapp/frontPage/bigmember/free/perfect_info?source=app_${this.source}`
+      }
+      openLinkOfOther(openLink)
+    },
     onConfirm() {
       this.$emit('change', false)
     }
@@ -57,19 +82,44 @@ export default {
 .question-tip {
   ::v-deep {
     .van-dialog__header {
-      font-size: 17px;
-      font-weight: 700;
+      font-size: 18px;
+      color: #171826;
+      line-height: 26px;
+      // font-weight: 700;
     }
+
     .van-dialog__content {
-      padding: 16px;
     }
   }
+
   .content-label {
-    margin: 12px 0;
-    font-weight: 700;
+    margin: 8px 0 4px 0;
+    // font-weight: 700;
+    font-size: 15px;
+    color: #171826;
+    line-height: 20px;
+    font-weight: 500;
   }
+
   .content-text {
-    line-height: 19px;
+    line-height: 20px;
+    font-size: 14px;
+    color: #9b9ca3;
+  }
+  .content-item {
+    margin: 0 30px 24px 30px;
+  }
+  .sourceBox {
+    margin: 8px 20px 0 20px;
+    background-color: #fff4e8;
+    color: #ff9f40;
+    font-size: 13px;
+    padding: 10px;
+    line-height: 20px;
+    border-radius: 8px;
+  }
+  .sourceBtn {
+    color: #2abed1;
   }
 }
 </style>

+ 8 - 4
apps/mobile/src/views/search/layout.vue

@@ -34,16 +34,19 @@ export default {
         input: '',
         placeholder: '',
         searchButton: true
-      }
+      },
     }
   },
   computed: {
-    ...mapGetters('user', ['isLogin']),
+    ...mapGetters('user', ['isLogin', 'isWhiteList']),
     emptySearch() {
       const routeName = this.$route.name
       if (routeName && routeName.includes('bidding-custom')) {
         return true
-      } else {
+      } else if(routeName && routeName.includes('search-middle-bidding') && this.isWhiteList) {
+        // 招标采购搜索白名单用户支持空搜索
+        return true
+      } else{
         return false
       }
     }
@@ -74,6 +77,7 @@ export default {
   },
   created() {
     if (this.isLogin) {
+      this.getWhiteListInfo()
       this.ajaxInfo()
       this.getQueryString()
     }
@@ -87,7 +91,7 @@ export default {
     next()
   },
   methods: {
-    ...mapActions('user', ['getEntPower', 'userVipSwitchState']),
+    ...mapActions('user', ['getEntPower', 'userVipSwitchState', 'getWhiteListInfo']),
     ...mapActions('search', ['setHistory']),
     /**
      * 获取用户信息

+ 241 - 12
apps/mobile/src/views/search/result/bidding/index.vue

@@ -183,6 +183,61 @@
           @do-leave="saveState"
         />
       </div>
+      <!-- P640项目名称/标的物引流广告模块-->
+      <div  class="project-bdw-ad-container" :style="{opacity: pageState.bdwCardLoaded ? 'unset' : '0'}" v-show="pageState.projectBdwInfo.sCount > 0">
+        <div class="project-bdw-ad">
+          <div class="top-tip">信息不够精准?根据“项目名称/标的物”,为您精准匹配到 <strong>{{pageState.projectBdwInfo.sCount}}条</strong> 信息</div>
+          <ProjectCell
+            v-visited:content="pageState.projectBdwInfo.sInfo.id"
+            class="list-item"
+            :class="pageState.projectBdwInfo.sInfo.className"
+            :card-type="calcProjectCardType(pageState.projectBdwInfo.sInfo)"
+            :time-fmt="getTimeFmt"
+            :detail-list="pageState.projectBdwInfo.sInfo.detailList"
+            :title="pageState.projectBdwInfo.sInfo.title"
+            :detail="filters.scope.includes('content') ? pageState.projectBdwInfo.sInfo.detail : null"
+            :filetext_search="pageState.projectBdwInfo.sInfo.filetext_search"
+            :fs_keys="pageState.projectBdwInfo.sInfo.fs_word"
+            :time="pageState.projectBdwInfo.sInfo.dateTime"
+            :is-file="pageState.projectBdwInfo.sInfo.isFile"
+            :keys="pageState.splitKeys"
+            :left-top-badge-text="pageState.projectBdwInfo.sInfo.leftTopBadgeText"
+            :tags="pageState.projectBdwInfo.sInfo.tagList"
+            @click="goToDetail(pageState.projectBdwInfo.sInfo)"
+          >
+            <template #buyerText="{ item }">
+                <span
+                  class="buyer-item link-clickable"
+                  @click.stop="toToBuyerProfile(item.text)"
+                >{{ item.text }}</span
+                >
+            </template>
+            <template #winnerText="{ item }">
+                <span
+                  v-for="(winner, index) in item.children"
+                  :key="index"
+                  class="winner-item highlight-text link-clickable j-splitter"
+                  data-j-splitter="、"
+                  @click.stop="toToEntProfile(winner.id)"
+                >{{ winner.text }}</span
+                >
+            </template>
+            <template slot="icon">
+              <div  @click.stop="doBdwCollection(pageState.projectBdwInfo.sInfo, )">
+                  <span
+                    class="j-icon"
+                    :class="{
+                      'icon-star-fill': pageState.projectBdwInfo.sInfo.star,
+                      'icon-star-streak': !pageState.projectBdwInfo.sInfo.star
+                    }"
+                  />
+                <span>&nbsp;{{ pageState.projectBdwInfo.sInfo.star ? '已收藏' : '收藏' }}</span>
+              </div>
+            </template>
+          </ProjectCell>
+          <div class="follow-text" @click="openSvip">开通超级订阅,立享更多搜索权限,寻找商机更精准 &gt;</div>
+        </div>
+      </div>
       <van-list
         v-show="pageState.listTabActive !== 'table'"
         ref="vanList"
@@ -537,6 +592,7 @@ import {
   searchIndexDataExport,
   selectEnt
 } from '@/api/modules'
+import dayjs from 'dayjs'
 
 export default {
   name: 'SearchResultBidding',
@@ -762,7 +818,15 @@ export default {
           random: 4,
           show: true,
           ad: true
-        }
+        },
+        // 项目名称/标的物标讯信息
+        projectBdwInfo: {
+          sCount: 0,
+          sInfo: {}
+        },
+
+        // 标的物引流广告是否加载完成
+        bdwCardLoaded: false
       },
       BIInfo: {
         ids: []
@@ -804,7 +868,8 @@ export default {
       'isNewSuper', // 新超级订阅
       'isMember',
       'bigMemberPower',
-      'isBusiness'
+      'isBusiness',
+      'isWhiteList'
     ]),
     noLoginOrFree() {
       if (this.isLogin) {
@@ -931,7 +996,7 @@ export default {
         'lately-30': '近30天'
       }
       const tipKey = tipMap[exact] || ''
-      if (keywords || this.additionalWordsArr.length) {
+      if (keywords || this.additionalWordsArr.length || this.isWhiteList) {
         return `对不起,没有找到<span class="highlight-text"> ${tipKey} </span>相关匹配的信息,修改时间范围或换个搜索词试试吧`
       } else {
         return '请输入关键词试试吧'
@@ -1034,11 +1099,19 @@ export default {
         }
       }
       this.moveRecommendCard(n)
+      // 项目名称/标的物引流广告插入到第五条公告后边
+      console.log(666666666)
+      const insertNum = this.listState.list.length > 4 ? 4 : this.listState.list.length
+      this.insertProjectBdwAd(insertNum)
     },
     searchList(list) {
       if (list && list.length && this.pageState.listTabActive === 'list') {
         // 市场分析报告插到第一条数据后面位置
         this.moveRecommendCard('list')
+       // 项目名称/标的物引流广告插入到第五条公告后边
+        console.log(777777)
+        const insertNum = list.length > 4 ? 4 : list.length
+        this.insertProjectBdwAd(insertNum)
       }
     }
   },
@@ -1622,13 +1695,21 @@ export default {
       if (t.pageNum === 1) {
         this.saveSearchGroupToLocal()
       }
-
+      this.pageState.projectBdwInfo.sCount =  0
+      this.pageState.projectBdwInfo.sInfo = {}
+      this.pageState.projectBdwInfo.bdwCardLoaded = false
       try {
         const {
           data = {},
           error_code: code = 0,
           error_msg: msg
         } = await getBiddingSearchList(params, this.restfulApiUserTypeDefault)
+        // P640处理标的物广告位信息
+        this.pageState.projectBdwInfo.sCount = data.sCount || 0
+        this.pageState.projectBdwInfo.sInfo = data.sList && data.sCount > 0 ? data.sList[0]: {}
+        // 计算项目名称标的物广告信息数据
+        this.calcProjectBdwTag()
+
         const isLimited =
           data.isLimit === 1 ||
           data.isLimit === undefined ||
@@ -1637,7 +1718,6 @@ export default {
           this.afterGetList(() => {
             // 搜索完5s后显示订阅设置弹窗
             setTimeout(() => {
-              console.log(this.subInfo)
               if (this.subInfo.isSubscribe && this.sunDialogNum === 0) {
                 this.showSubDialog = true
                 this.sunDialogNum++
@@ -1652,7 +1732,9 @@ export default {
           // 请求完成后的回调
           this.afterSearch(params, data)
           // 列表赋值
-          const list = data.list
+          // 如果筛选范围同时包含标题和正文,那么按照正文包括高亮在前,标题在后
+          const resDataList = data.list && data.list.length > 0 ? JSON.parse(JSON.stringify(data.list)) : []
+          const list =this.sortListTitleDetail(resDataList)
           const count = data.count
           const total = data.total
           if (Array.isArray(list)) {
@@ -1769,11 +1851,75 @@ export default {
         // 保存更多关键词到历史记录中
         this.saveAdditionalWordsToHistory()
         // 关键词为空,则提示,输入关键词
-        if (!params.keyWords && !params.additionalWords) {
+        if (!params.keyWords && !params.additionalWords && !this.isWhiteList) {
           this.$toast('请输入关键词')
         }
       }
     },
+    // p640需求,如果筛选类型同时包含标题和正文,先展示标题包含关键词,再展示内容包含关键词的数据
+    // 如果不同时包含标题和正文,则不处理
+    sortListTitleDetail (baseArr) {
+      const _this = this
+      if( this.filters.scope.includes('title') &&  this.filters.scope.includes('content')) {
+        // 辅助函数:检查字符串是否包含关键词数组中的任何一个关键词
+        function containsKeyword(str, keywords) {
+          return keywords.some(keyword => str ? str.includes(keyword) : '');
+        }
+        // 先按照发布时间倒序分组排序
+        let arr = []
+        const baseTimeMap = {}
+        const baseTimeKeys = []
+        baseArr.forEach(v => {
+          const ymd = dayjs(v.publishTime * 1000).startOf('day').unix()
+          if (!Array.isArray(baseTimeMap[ymd])) {
+            baseTimeMap[ymd] = []
+          }
+          baseTimeMap[ymd].push(v)
+          if (!baseTimeKeys.includes(ymd)) {
+            baseTimeKeys.push(ymd)
+          }
+        })
+
+        const sortBaseTimeKeys = baseTimeKeys.sort((a,b) => b - a)
+        // 再按照标题正文排序
+        function sortItem (arr) {
+          const matchKeys = _this.pageState.splitKeys
+          const titleMatches = arr.filter(item => containsKeyword(item.title, matchKeys))
+          const contentMatches = arr.filter(item => _this.setDetailText(item.detail, matchKeys) && !titleMatches.some(tm => tm.title === item.title))
+          const noMatches = arr.filter(item => !containsKeyword(item.title, matchKeys) && !_this.setDetailText(item.detail, matchKeys));
+          // 合并结果
+          const resultArr = [...titleMatches, ...contentMatches, ...noMatches]
+          return resultArr
+        }
+
+        for (let i = 0; i < sortBaseTimeKeys.length; i++) {
+          const baseTimeMapKey = sortBaseTimeKeys[i]
+          const sortItemArr = sortItem(baseTimeMap[baseTimeMapKey])
+          arr = arr.concat(sortItemArr)
+        }
+        return arr
+      } else {
+        return baseArr
+      }
+    },
+    // 正文开头和高亮词之间,最多保留10个字符
+    setDetailText(detailStr, matchKeys) {
+      // 正则匹配标签置为空
+      if (!detailStr) return ''
+      const detail = detailStr.replace(/<[^>]+>/g, '')
+      const detailLower = detail.toLowerCase()
+      const keyLower = matchKeys[0]?.toLowerCase()
+      let postion = detailLower.indexOf(keyLower)
+      if (postion !== -1) {
+        if (postion - 10 > 0) {
+          return detail.substring(postion - 10)
+        } else {
+          return detail
+        }
+      } else {
+        return ''
+      }
+    },
     /**
      * 检查是否需要切换模糊搜索、是否展示提示
      * 1. 精准搜索无数据 (自动切换模糊搜索)
@@ -2104,7 +2250,7 @@ export default {
       return true
     },
     // 收藏
-    async doCollection(item, index) {
+    async doCollection(item, index, type) {
       if (!this.isLogin) {
         this.pageState.cacheStar = `${index}`
         this.saveState()
@@ -2129,6 +2275,28 @@ export default {
         }
       })
     },
+    // 收藏
+    async doBdwCollection(item) {
+      if (!this.isLogin) {
+        return openLinkOfOther(LINKS.APP登录页.app, {
+          query: {
+            to: 'back'
+          }
+        })
+      }
+      this.$keep.action({
+        status: item.star,
+        id: item.id,
+        beforeRedirect: () => {
+        },
+        complete: ({ type, message }) => {
+          if (type) {
+            item.star = !item.star
+            this.$forceUpdate()
+          }
+        }
+      })
+    },
     // 老接口通用的参数
     getFilterParams2() {
       const { moreKeywordsMode } = this.filters
@@ -2423,7 +2591,6 @@ export default {
     // 获取已存筛选的参数
     getSaveFilterToHistoryParams() {
       const params = this.getFilterParams2()
-
       delete params.scope
       // 存的时候要把<拟建项目>替换成<拟建>
       if (params.subtype) {
@@ -2554,11 +2721,11 @@ export default {
           if (this.topSearch.input) {
             return v && v.text
           } else {
-            return !v.label.includes('搜索范围') && v.text
+            return  v.text
           }
         })
         .map((item) => item.text)
-      if (searchModeText && this.topSearch.input) {
+      if (searchModeText) {
         labelList = [searchModeText].concat(labelList)
       }
       // console.log(formattedList, 'formattedList')
@@ -2942,7 +3109,7 @@ export default {
         // 市场分析报告插到第一条数据后面位置
         this.$nextTick(() => {
           const recommend = document.querySelector('.recommend-card-container')
-          const cellList = document.querySelectorAll('.project-cell')
+          const cellList = document.querySelectorAll('.more-list .list-wrapper>.project-cell')
           const recommendChild = document.querySelector('.recommend-bg')
           if (recommend && cellList[0]) {
             const parentNode = cellList[0].parentNode
@@ -2954,6 +3121,33 @@ export default {
           }
         })
       }
+    },
+    // 在列表第五条插入项目名称/标的物引流广告
+    insertProjectBdwAd(num) {
+      this.$nextTick(() => {
+        const adModule = document.querySelector('.project-bdw-ad-container')
+        const cellList = document.querySelectorAll('.more-list .project-cell')
+        if (adModule && cellList[num]) {
+          const parentNode = cellList[num].parentNode
+          parentNode.insertBefore(adModule, cellList[num].nextSibling)
+          this.pageState.bdwCardLoaded = true
+        }
+      })
+    },
+    // 计算标的物引流标讯的信息(标签信息等)
+    calcProjectBdwTag() {
+      this.preSortItem(this.pageState.projectBdwInfo.sInfo)
+    },
+    // 开通超级订阅
+    openSvip () {
+      if (!this.isLogin) {
+        return openLinkOfOther(LINKS.APP登录页.app, {
+          query: {
+            url: '/jy_mobile/common/order/create/svip'
+          }
+        })
+      }
+      this.$router.push('/common/order/create/svip')
     }
   }
 }
@@ -3429,4 +3623,39 @@ export default {
 .customer-corner {
   z-index: 10;
 }
+.project-bdw-ad-container{
+  border-radius: 12px;
+  background: linear-gradient(180deg, #fff4e8 0%, #fff 100%);
+  padding:12px;
+  margin:8px;
+  .top-tip {
+    font-weight:bold;
+    font-size:13px;
+    line-height:20px;
+    strong {
+      color:#FF9F40;
+      margin:0 2px;
+    }
+  }
+  .follow-text{
+    background: #FF9F40;
+    color: #fff;
+    border-radius: 4px;
+    padding: 2px 11px;
+    font-size:12px;
+    line-height:20px;
+    margin-top:10px;
+    cursor: pointer;
+  }
+  ::v-deep{
+    .project-cell{
+      padding:0;
+      margin:0;
+      background: unset;
+    }
+    .jy-hairline--bottom::after{
+      border: none;
+    }
+  }
+}
 </style>

+ 112 - 47
apps/mobile/src/views/tabbar/Subscribe.vue

@@ -497,31 +497,38 @@
       </div>
     </main>
     <footer class="j-footer">
-      <NoticeBar
-        v-if="pushMaxNoticeBarShow"
-        right-text="了解详情"
-        @clickLeft="noticeBar.pushMaxShow = false"
-        @clickRight="toVipIntroducePage"
-      >
-        本次推送已达150条信息上限!开通超级订阅,支持每天最多推送2000条信息
-      </NoticeBar>
-      <NoticeBar
-        v-if="vipNoticeBarShow"
-        theme="red"
-        :right-text="noticeBar.vipRightText"
-        @clickLeft="onVipNoticeClickLeft"
-        @clickRight="toBuyVip"
-      >
-        {{ noticeBar.vipContentText }}
-      </NoticeBar>
-      <NoticeBar
-        v-if="keywordsSettingNoticeBarShow"
-        right-text="去设置"
-        @clickLeft="noticeBar.settingKeywordsShow = false"
-        @clickRight="toKeysetPage"
-      >
-        您未设置关键词,设置后接收信息更精准!
-      </NoticeBar>
+      <div v-if="urlPushTime" class="lookMoretips">
+        <span>当前筛选查看的为此次推送的信息,</span>
+        <span class="tipsBtn" @click="lookAlldata">点击查看全部></span>
+      </div>
+      <!-- 从模版消息进来其他底部提示不显示 -->
+      <div v-else>
+        <NoticeBar
+          v-if="pushMaxNoticeBarShow"
+          right-text="了解详情"
+          @clickLeft="noticeBar.pushMaxShow = false"
+          @clickRight="toVipIntroducePage"
+        >
+          本次推送已达150条信息上限!开通超级订阅,支持每天最多推送2000条信息
+        </NoticeBar>
+        <NoticeBar
+          v-if="vipNoticeBarShow"
+          theme="red"
+          :right-text="noticeBar.vipRightText"
+          @clickLeft="onVipNoticeClickLeft"
+          @clickRight="toBuyVip"
+        >
+          {{ noticeBar.vipContentText }}
+        </NoticeBar>
+        <NoticeBar
+          v-if="keywordsSettingNoticeBarShow"
+          right-text="去设置"
+          @clickLeft="noticeBar.settingKeywordsShow = false"
+          @clickRight="toKeysetPage"
+        >
+          您未设置关键词,设置后接收信息更精准!
+        </NoticeBar>
+      </div>
     </footer>
     <!--    客服 -->
     <CustomerCorner
@@ -578,14 +585,14 @@ import { mapActions, mapGetters, mapState } from 'vuex'
 import {
   Badge,
   Button,
+  Icon,
   List,
+  Overlay,
+  Popover,
   Popup,
   Tab,
   Tabs,
-  Tag,
-  Overlay,
-  Popover,
-  Icon
+  Tag
 } from 'vant'
 import dayjs from 'dayjs'
 import qs from 'qs'
@@ -632,19 +639,19 @@ import {
 import {
   ajaxCanBiaoAction,
   ajaxCanBiaoStatus,
+  ajaxGetTipInfo,
   checkDataReportTip,
   checkHasReportData,
   getConfiguration,
   getPushListDataExportId,
+  getPushSet,
   getSubscribePageAreaPackTip,
   getUserSubscribeKeywords,
   getUserSubscribeList,
   getUserSubscribeSomeInfo,
   selectEnt,
   setSubscribePageAreaPackTipClose,
-  setUserSubscribeListVisited,
-  ajaxGetTipInfo,
-  getPushSet
+  setUserSubscribeListVisited
 } from '@/api/modules'
 import { leadGetDate } from '@/api/modules/leadGeneration'
 
@@ -946,7 +953,8 @@ export default {
       // 预加载提醒文案
       preloadTipText: '',
       // 市场分析报告是否加载完成
-      cardLoaded: false
+      cardLoaded: false,
+      urlPushTime: ''
     }
   },
   computed: {
@@ -1232,6 +1240,7 @@ export default {
     this.checkIOSCompatible()
     // 检查筛选器权限
     this.changeFiltersPower(this.disabledFilters)
+    this.getStoragepushTime()
     await this.getUserIdentityList()
     if (this.restored) {
       // do something
@@ -1287,6 +1296,11 @@ export default {
     jumpBidPage() {
       this.$router.push('/course/index')
     },
+    lookAlldata() {
+      this.urlPushTime = ''
+      sessionStorage.removeItem('dy-urlPushTime')
+      this.getList()
+    },
     async getConfigurationApi() {
       const { error_code: code, data } = await getConfiguration()
       if (code === 0) {
@@ -1313,6 +1327,11 @@ export default {
         this.popupHeight = 'height: 440px'
       }
     },
+    getStoragepushTime() {
+      if (!this.urlPushTime && sessionStorage.getItem('dy-urlPushTime')) {
+        this.urlPushTime = sessionStorage.getItem('dy-urlPushTime')
+      }
+    },
     // 获取url参数
     async getQueryString() {
       // 参数说明:
@@ -1322,15 +1341,25 @@ export default {
       //   4. advertcode // 广告位代码
       this.cacheQuery = this.$route.query // 缓存一份query参数
       const { f, pushtime, times, t, advertcode, tab } = this.$route.query
+
       if (pushtime) {
-        this.setFirstTimeSelectSearch(false)
-        this.filters.selectTime = dayjs.unix(pushtime).format('YYYY/MM/DD')
+        this.urlPushTime = pushtime
+        sessionStorage.setItem('dy-urlPushTime', this.urlPushTime)
+        // this.setFirstTimeSelectSearch(false)
+        // 不再回显时间筛选
+        // this.filters.selectTime = dayjs.unix(pushtime).format('YYYY/MM/DD')
         // 修改时间筛选文字
-        this.changeDropdownMenuText({ key: 'selectTime' })
+        // this.changeDropdownMenuText({ key: 'selectTime' })
       } else if (times) {
-        this.setFirstTimeSelectSearch(false)
-        this.filters.selectTime = dayjs.unix(times).format('YYYY/MM/DD')
-        this.changeDropdownMenuText({ key: 'selectTime' })
+        this.urlPushTime = times
+        sessionStorage.setItem('dy-urlPushTime', this.urlPushTime)
+        // this.setFirstTimeSelectSearch(false)
+        // 不再回显时间筛选
+        // this.filters.selectTime = dayjs.unix(times).format('YYYY/MM/DD')
+        // this.changeDropdownMenuText({ key: 'selectTime' })
+      } else {
+        this.urlPushTime = ''
+        sessionStorage.removeItem('dy-urlPushTime')
       }
       const { subscribeTypeList } = this.tabConf
       if (tab && subscribeTypeList.includes(tab)) {
@@ -1355,7 +1384,6 @@ export default {
           this.subscribeTypeActive = 'my'
         }
       }
-
       if (f === 'push') {
         // 从推送过来,url参数取完后,把url.query清空
         this.$router.replace({
@@ -1610,7 +1638,8 @@ export default {
       const params = {
         ...query,
         selectTime: selectTime || 'all',
-        vt: isEnt ? 'q' : this.vSwitch
+        vt: isEnt ? 'q' : this.vSwitch,
+        pushTime: this.urlPushTime
       }
       return params
     },
@@ -1672,6 +1701,7 @@ export default {
             params[key] = ''
             if (!firstTimeSelectSearch) {
               if (values) {
+                console.log(values)
                 const sTime = dayjs(values)
                 const start = sTime.startOf('day').unix()
                 const end = sTime.endOf('day').unix()
@@ -1868,16 +1898,30 @@ export default {
           end: dateFormatter(params.selectTime.split('_')[1] * 1000)
         })
       }
-
+      if (this.urlPushTime) {
+        const { data = {} } = await getUserSubscribeList(
+          this.restfulApiUserTypeWitchVSwitch,
+          {
+            ...params,
+            pushTime: this.urlPushTime // 推送信息进入页面时的时间参数
+          }
+        )
+        // 没有数据或者企业版推送全部数据 清空PushTime参数
+        if (!data.count || this.subscribeTypeActive === 'ent') {
+          // 检查是否有数据
+          this.urlPushTime = ''
+          sessionStorage.removeItem('dy-urlPushTime')
+        }
+      }
       try {
         const {
           data = {},
           error_code: code = 0,
           error_msg: msg
-        } = await getUserSubscribeList(
-          this.restfulApiUserTypeWitchVSwitch,
-          params
-        )
+        } = await getUserSubscribeList(this.restfulApiUserTypeWitchVSwitch, {
+          ...params,
+          pushTime: this.urlPushTime // 推送信息进入页面时的时间参数
+        })
         if (code === 0 && data) {
           // 判断是否为刷新
           if (t.refreshing) {
@@ -2440,6 +2484,11 @@ export default {
     },
     // 筛选器确定事件
     onFilterConfirm({ option, index, $ref }) {
+      // 若是从微信推送进入页面,重新确定筛选就移除推送时间参数
+      if (this.urlPushTime) {
+        this.urlPushTime = ''
+        sessionStorage.removeItem('dy-urlPushTime')
+      }
       if (option.key === 'selectTime') {
         this.setFirstTimeSelectSearch(false)
       }
@@ -3285,7 +3334,8 @@ export default {
   border-radius: 8px;
   border: 1px solid transparent;
   background-clip: padding-box, border-box;
-  background-image: linear-gradient(#e8ffff 40%, #ffffff 100%),
+  background-image:
+    linear-gradient(#e8ffff 40%, #ffffff 100%),
     linear-gradient(to right, #2abed1, #4de4f84c, #2abed1);
   background-origin: padding-box, border-box;
 
@@ -3544,4 +3594,19 @@ export default {
     }
   }
 }
+.lookMoretips {
+  width: 100%;
+  background-color: #fff4e8;
+  padding: 12px;
+  font-size: 13px;
+  line-height: 20px;
+  text-align: center;
+  color: #ff9f40;
+  // position: fixed;
+  // left: 0;
+  // bottom: 50px;
+}
+.tipsBtn {
+  color: #2abed1;
+}
 </style>