Переглянути джерело

Merge branch 'dev/1.0.36_zsy' of jianyu/web into feature/v1.0.36

zhangsiya 1 рік тому
батько
коміт
9da738b2d6

+ 3 - 3
apps/bigmember_pc/src/assets/js/selector.js

@@ -823,15 +823,15 @@ export const searchScopeData = [
 // 筛选项-附件
 export const attachmentData = [
   {
-    value: '',
+    value: '0',
     label: '全部'
   },
   {
-    value: 1,
+    value: '1',
     label: '有附件'
   },
   {
-    value: -1,
+    value: '-1',
     label: '无附件'
   }
 ]

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

@@ -37,7 +37,7 @@
       </div>
     </div>
     <div
-      v-if="config.push && article.detail && calcDetail"
+      v-if="config.detail && article.detail && calcDetail"
       class="a-i-detail ellipsis"
       v-html="calcDetail"
     ></div>
@@ -66,13 +66,13 @@
         }}</span>
         <span
           class="tag green"
-          v-if="article.buyerclass || article.buyerClass"
+          v-if="calcBuyerclass"
           >{{ article.buyerclass || article.buyerClass }}</span
         >
         <span class="tag dpink" v-if="calcBudget && calcBudget !== '0元'">{{
           calcBudget
         }}</span>
-        <span v-if="config.gray && article.ca_fileExists" class="haveFile"
+        <span v-if="config.gray && (article.ca_fileExists || article.fileExists)" class="haveFile"
           >有附件</span
         >
       </div>
@@ -226,15 +226,15 @@
       </p>
       <p
         class="l-d-item"
-        v-if="article.signendTime || article.bidendTime || article.bidOpenTime"
+        v-if="article.signendTime || article.bidendTime || article.bidEndTime || article.bidOpenTime"
       >
         <span v-if="article.signendTime">
           <i class="l-d-item-label">报名截止日期:</i>
           {{ dateFromNow(article.signendTime * 1000) }}
         </span>
-        <span v-if="article.bidendTime">
+        <span v-if="article.bidendTime || article.bidEndTime">
           <i class="l-d-item-label">投标截止日期:</i>
-          {{ dateFromNow(article.bidendTime * 1000) }}
+          {{ dateFromNow(article.bidendTime * 1000) || dateFromNow(article.bidEndTime * 1000) }}
         </span>
         <span v-if="article.bidOpenTime">
           <i class="l-d-item-label">开标日期:</i>
@@ -287,7 +287,9 @@ export default {
           gray: false,
           table: false,
           collect: false,
-          push: false
+          push: false,
+          detail: false, // 是否展示详情数据
+          bidding: false // 招标采购搜索
         }
       }
     },
@@ -360,10 +362,10 @@ export default {
     calcDetail() {
       const extractDetail = extractKeywords(
         this.article.detail,
-        this.article.matchKeys
+        this.getMatchKeys,
       )
       if (extractDetail) {
-        return replaceKeyword(extractDetail, this.article.matchKeys, [
+        return replaceKeyword(extractDetail, this.getMatchKeys, [
           '<span class="highlight-text">',
           '</span>'
         ])
@@ -414,6 +416,11 @@ export default {
       } else {
         return this.model === 'D' && !subtypeFlag
       }
+    },
+    // 处理采购单位类型是否展示
+    calcBuyerclass () {
+      const buyerClass = this.article.buyerclass || this.article.buyerClass
+      return buyerClass && buyerClass !== '其它' && buyerClass.indexOf("免费注册")<0
     }
   },
   data() {
@@ -425,6 +432,9 @@ export default {
       }
     }
   },
+  created() {
+    console.log(this.article)
+  },
   methods: {
     dateFromNow,
     formatSource(v) {

+ 1 - 0
apps/bigmember_pc/src/router/router-interceptors.js

@@ -6,6 +6,7 @@ import { getEntNicheAuth } from '@/api/modules'
 // 权限控制白名单-路由path
 const powerCheckPathWhiteRegList = [
   /free_*/,
+  /^\/search\//,
   /\/big\/page\/index/,
   /medical/,
   /set-/,

+ 13 - 14
apps/bigmember_pc/src/utils/format/search-bid-filter.js

@@ -69,17 +69,16 @@ export class FilterHistoryAjaxModel2ViewModel {
       buyerTelText,
       winnerTel,
       winnerTelText,
-      notkey: map.notkey,
-      buyer: map.buyer,
-      winner: map.winner,
-      agency: map.agency,
+      notkey: map.notkey ? map.notkey.replace(/,/g, ",") : '',
+      buyer: map.buyer ? map.buyer.replace(/,/g, ",") : '',
+      winner: map.winner ? map.winner.replace(/,/g, ",") : '',
+      agency: map.agency ? map.agency.replace(/,/g, ",") : '',
       fileExists: map.fileExists,
-      fileExiststText: fileExistsText
+      fileExistsText: fileExistsText
     }
-
     // 删去undefined/null的项
     for (const key in formatted) {
-      if (!formatted[key]) {
+      if (formatted[key] === undefined || formatted[key] === null) {
         delete formatted[key]
       }
     }
@@ -453,7 +452,7 @@ export class FilterHistoryAjaxModel2ViewModel {
     })
 
     if (val) {
-      result.basicData = [val]
+      result.basicData = val
       result.basicDataText = map[val]
     }
     return result
@@ -518,7 +517,7 @@ export class FilterHistoryViewModel2AjaxModel {
       buyer: map.buyer ? map.buyer.join(',') : '',  // 采购单位
       winner: map.winner ? map.winner.join(',') : '', // 中标企业
       agency: map.agency ? map.agency.join(',') : '', // 招标代理机构
-      fileExists:  map.fileExists ? map.fileExists.toString() : '', // 附件
+      fileExists: map.fileExists, // 附件
       regionMap: map.regionMap, // 地区
       searchGroup: map.searchGroup, // 搜索分组:默认0:全部;1:招标采购公告;2:超前项目
       searchMode: Number(map.searchMode),  // 搜索模式:0:精准搜索;1:模糊搜索
@@ -529,7 +528,7 @@ export class FilterHistoryViewModel2AjaxModel {
 
     // 删去undefined/null的项
     for (const key in formatted) {
-      if (formatted[key] === '' || formatted[key] === undefined || formatted[key] === null) {
+      if (formatted[key] === undefined || formatted[key] === null) {
         delete formatted[key]
       }
     }
@@ -761,7 +760,7 @@ export class FilterHistoryAjaxModelRestore {
     // wordsMode
     const { additionalWords, wordsMode } = this.formatSelectMoreKey(map.additionalWords, map.wordsMode)
     // 高亮关键词
-    const matchKeys = this.formatMatchKeys(map.keywords, additionalWords, map.wordsMode)
+    const matchKeys = this.formatMatchKeys(map.keywords, additionalWords)
     // 精准匹配/模糊匹配
     const searchMode= this.formatSearchMode(map.searchMode)
     //
@@ -833,12 +832,12 @@ export class FilterHistoryAjaxModelRestore {
    * 处理页面需要匹配的高亮关键词
    */
   static formatMatchKeys (keywords, additionalWords) {
-   const arr = []
+    let arr = []
     if(keywords) {
       arr.push(keywords)
     }
-    if(additionalWords && additionalWords.length > 0) {
-      arr.concat(additionalWords)
+    if(additionalWords?.length > 0) {
+     arr.concat(additionalWords)
     }
     return arr
   }

+ 2 - 2
apps/bigmember_pc/src/utils/globalFunctions.js

@@ -327,7 +327,7 @@ export function moneyUnit(m, type = 'string', lv = 0) {
 
       let result = num / Math.pow(10000, lv)
 
-      if (result > 10000 && lv < 2) {
+      if (result >= 10000 && lv < 2) {
         return this.test(num, type, lv + 1)
       } else {
         if (type === 'string') {
@@ -820,7 +820,7 @@ export function scrollTargetView (targetEvent) {
     // 非工作桌面
     targetTop = document.querySelector(targetEvent)?.offsetTop
     // 因浏览器及模式差异,页面滚动元素存在不同(标准模式:document.documentElement;兼容模式:body)
-    // scrollingElement可获取页面滚动元素 
+    // scrollingElement可获取页面滚动元素
     scrollWrapper = document.scrollingElement
     scrollWrapper.scrollTop = targetTop
     // console.log(`非工作桌面---滚动元素:${scrollWrapper.className ? scrollWrapper.className : scrollWrapper.tagName}, 滚动距离:${targetTop}`)

+ 2 - 1
apps/bigmember_pc/src/views/SubPush.vue

@@ -546,7 +546,8 @@ export default {
         gray: true,
         table: true,
         collect: true,
-        push: true
+        push: true,
+        detail: true,
       },
       withFileList: [
         {

+ 3 - 3
apps/bigmember_pc/src/views/search/bidding/components/history-filter-dialog.vue

@@ -67,14 +67,14 @@ function beforeClose () {
               <p class="f-l-c-item">
                 <span v-if="item.price">价格区间:<em class="i-value">{{ item.priceText }}</em></span>
                 <span v-if="item.publishTimeText">发布时间:<em class="i-value">{{ item.publishTimeText }}</em></span>
-                <span v-if="item.fileExists != 0">附件:<em class="i-value">{{ item.fileExiststText }}</em></span>
+                <span v-if="item.fileExistsText != '全部'">附件:<em class="i-value">{{ item.fileExistsText }}</em></span>
               </p>
               <p class="f-l-c-item" v-if="item.regionMapText">项目地区:<em class="i-value">{{ item.regionMapText }}</em></p>
               <p class="f-l-c-item" v-if="item.infoTypeText">信息类型:<em class="i-value">{{ item.infoTypeText }}</em></p>
               <p class="f-l-c-item" v-if="item.buyerClassText">采购单位类型:<em class="i-value">{{ item.buyerClassText }}</em></p>
               <p class="f-l-c-item">
-                <span v-if="item.buyertel == 'y'">采购单位联系方式:<em class="i-value">{{ item.buyerTelText }}</em></span>
-                <span v-if="item.winnertel == 'y'">中标单位联系方式:<em class="i-value">{{ item.winnerTelText }}</em></span>
+                <span v-if="item.buyerTel === 'y'">采购单位联系方式:<em class="i-value">{{ item.buyerTelText }}</em></span>
+                <span v-if="item.winnerTel === 'y'">中标单位联系方式:<em class="i-value">{{ item.winnerTelText }}</em></span>
                 <span v-if="item.notkey">排除词:<em class="i-value">{{ item.notkey }}</em></span>
               </p>
               <p class="f-l-c-item" v-if="item.buyer">采购单位:<em class="i-value">{{ item.buyer }}</em></p>

+ 25 - 19
apps/bigmember_pc/src/views/search/bidding/components/search-bid-filter.vue

@@ -6,7 +6,11 @@ import {
   SearchBidMoreSchema
 } from '@/views/search/bidding/constant/search-filters'
 
-const { filterState, doQuery } = SearchBidModel
+const {
+  filterState,
+  doQuery,
+  showFilter
+} = SearchBidModel
 
 function doChangeFilter() {
   doQuery()
@@ -14,25 +18,27 @@ function doChangeFilter() {
 </script>
 
 <template>
-  <div class="search-bid-filter">
-    <!--  标准筛选  -->
-    <search-schema-filter
-      v-model="filterState"
-      :schema="SearchBidBaseSchema"
-      @change="doChangeFilter"
-    ></search-schema-filter>
+  <el-collapse-transition >
+    <div class="search-bid-filter" v-show='showFilter'>
+      <!--  标准筛选  -->
+      <search-schema-filter
+        v-model="filterState"
+        :schema="SearchBidBaseSchema"
+        @change="doChangeFilter"
+      ></search-schema-filter>
 
-    <!--  更多筛选  -->
-    <search-schema-filter
-      v-model="filterState"
-      :schema="SearchBidMoreSchema"
-      :show-label="false"
-      style-type="row"
-      @change="doChangeFilter"
-    >
-      <span slot="row-label-text">更多筛选:</span>
-    </search-schema-filter>
-  </div>
+      <!--  更多筛选  -->
+      <search-schema-filter
+        v-model="filterState"
+        :schema="SearchBidMoreSchema"
+        :show-label="false"
+        style-type="row"
+        @change="doChangeFilter"
+      >
+        <span slot="row-label-text">更多筛选:</span>
+      </search-schema-filter>
+    </div>
+  </el-collapse-transition>
 </template>
 
 <style lang="scss" scoped>

+ 61 - 17
apps/bigmember_pc/src/views/search/bidding/components/search-filter-header.vue

@@ -11,11 +11,11 @@ const {
   historyFilterCount,
   saveFilterCancel,
   saveFilterConfirm,
-  onResetFilter
+  onResetFilter,
+  toggleFilter,
+  showFilter,
+  fixedTop
 } = SearchBidModel
-const fixedTop = ref(false)
-const showFilter = ref(true)
-function toggleFilter() {}
 
 function closeHistoryFilterDialog () {
   historyFilterDialogVisible.value = false
@@ -23,19 +23,21 @@ function closeHistoryFilterDialog () {
 </script>
 
 <template>
-  <div class="filter-header-container" :class="fixedTop ? 'fixed' : ''">
-    <div class="filter-header" :class="fixedTop ? 'fixed-top' : ''">
-      <div
-        class="f-h-label"
-        @click="toggleFilter"
-      >
-        <span>筛选条件</span>
-        <i class="iconfont icon-xiala highlight-text" :class="{ 'is-reverse': showFilter}"></i>
-      </div>
-      <div class="f-h-action nologin-hide">
-        <span class="action-item reset-item" @click="onResetFilter">重置筛选条件</span>
-        <span class="action-item has-item" @click="onHasFilter">已存筛选条件 {{ historyFilterCount || ''}}</span>
-        <span class="action-item save-item" @click="onSaveFilter">保存筛选条件</span>
+  <div class='searchTender'>
+    <div class="filter-header-container" :class="{'header-fixed': fixedTop}">
+      <div class="filter-header" :class="{'fixed-top': fixedTop}">
+        <div
+          class="f-h-label"
+          @click="toggleFilter"
+        >
+          <span>筛选条件</span>
+          <i class="iconfont icon-xiala highlight-text" :class="{ 'is-reverse': showFilter}"></i>
+        </div>
+        <div class="f-h-action nologin-hide">
+          <span class="action-item reset-item" @click="onResetFilter">重置筛选条件</span>
+          <span class="action-item has-item" @click="onHasFilter">已存筛选条件 {{ historyFilterCount || ''}}</span>
+          <span class="action-item save-item" @click="onSaveFilter">保存筛选条件</span>
+        </div>
       </div>
     </div>
     <save-filter-dialog
@@ -54,6 +56,48 @@ function closeHistoryFilterDialog () {
 </template>
 
 <style lang="scss" scoped>
+
+  .in-app{
+    .filter-header-container.header-fixed {
+      position: fixed;
+      top: 0;
+      left: 0;
+      width: 100%;
+      padding: 0 24px;
+      box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.05);
+      background: #FFFFFF;
+      z-index: 99;
+    }
+    .filter-header-container.header-fixed .fixed-top {
+      position: relative;
+      width: auto;
+      top: unset;
+      border-bottom: unset;
+    }
+
+   // #searchInner .searchControl .filter-table-container.fixed  .tabTitle {
+   //   border: unset;
+   // }
+   // .filter-table-container.fixed {
+   //   position: fixed;
+   //   top: 0;
+   //   left: 0;
+   //   width: 100%;
+   //   padding: 0 24px;
+   //   z-index: 100;
+   //   background: #FFF;
+   //   box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.05);
+   // }
+   //.filter-table-container.fixed .table-fixed-top {
+   //   position: relative;
+   //   width: auto;
+   //   top: unset;
+   //   border-bottom: unset;
+   // }
+   // .shade_table {
+   //   width: 100%;
+   // }
+  }
   .filter-header{
     width:100%;
     display: flex;

+ 14 - 4
apps/bigmember_pc/src/views/search/bidding/index.vue

@@ -14,6 +14,7 @@ useSearchBidModel()
 
 // 初始化模型 解构业务所需 model \ fn
 const {
+  isInIframe,
   filterState,
   inputKeywordsState,
   listState,
@@ -26,6 +27,7 @@ const {
   doChangePageNum,
   doChangePageSize
 } = SearchBidModel
+
 </script>
 
 <template>
@@ -46,9 +48,9 @@ const {
       @current-change="doChangePageNum"
       @size-change="doChangePageSize"
     >
-      <template #list-before v-if="listState.pageNum === 1">
-        <span>如对搜索结果满意,可直接订阅及时接收项目信息。</span>
-      </template>
+<!--      <template #list-before v-if="listState.pageNum === 1">-->
+<!--        <span>如对搜索结果满意,可直接订阅及时接收项目信息。</span>-->
+<!--      </template>-->
       <template #item-checkbox v-if="activeItemStyleType === 'T'">
         <span></span>
       </template>
@@ -62,6 +64,8 @@ const {
             :article="item"
             :index="index"
             :config="{
+              bidding: true,
+              detail: true,
               gray: true,
               table: false,
               collect: false,
@@ -87,8 +91,14 @@ const {
 </template>
 
 <style lang="scss" scoped>
+.in-app {
+  .search-bidding-page{
+    width: 100%;
+    padding:24px;
+  }
+}
 .search-bidding-page {
-  width: 1180px;
+  width: 1200px;
   margin: 0 auto;
 
   .search-bidding-header-container {

+ 54 - 18
apps/bigmember_pc/src/views/search/bidding/model/base.js

@@ -1,5 +1,5 @@
-import { computed, reactive } from 'vue'
-import { without } from 'lodash'
+import { computed, reactive, ref, onMounted, getCurrentInstance } from 'vue'
+import { without, throttle } from 'lodash'
 // API 业务模型
 import useQuickSearchModel from '@jy/data-models/modules/quick-search/model'
 // 扩展业务模型
@@ -15,6 +15,7 @@ import  { FilterHistoryAjaxModelRestore } from '@/utils'
 
 
 export default function () {
+  const that = getCurrentInstance().proxy
   const router = useRouter()
 
   const isFree = computed(() => {
@@ -63,7 +64,7 @@ export default function () {
     finished,
     loading,
     pageNum: 1,
-    pageSize: 5,
+    pageSize: 50,
     total
   })
 
@@ -188,13 +189,31 @@ export default function () {
    */
   function doQuery(params = {}) {
     return doRunQuery(getParams(params)).then((res) => {
+
+      let matchKeys = []
+      if(inputKeywordsState.value.input) {
+        matchKeys.push(inputKeywordsState.value.input)
+      }
+      if(inputKeywordsState.value.selectMoreKey) {
+        if(inputKeywordsState.value.additionalWords?.length) {
+          matchKeys = matchKeys.concat(inputKeywordsState.value.additionalWords)
+        }
+      }
+
       // 用于搜索关键词高亮
       inputKeywordsState.value.matchKeys = res.origin?.heightWords?.split(
         ' '
-      ) || [inputKeywordsState.value.input]
+      ) || matchKeys
     })
   }
 
+  // 是否展示筛选条件
+  const showFilter = ref(true)
+  // 展开收起筛选条件
+  function toggleFilter() {
+    showFilter.value = !showFilter.value
+  }
+
   /**
    * 保存、重置筛选条件部分
    **/
@@ -287,7 +306,6 @@ export default function () {
       additionalWords: resultFilter.additionalWords,
       selectMoreKey: resultFilter.additionalWords?.length > 0
     }
-    console.log( filterState.value)
     historyFilterDialogVisible.value = false
     doQuery()
   }
@@ -304,11 +322,11 @@ export default function () {
       // 地区
       regionMap: {},
       // 行业
-      industry: {},
+      industry: null,
       // 附件
       fileExists: '',
       // 金额区间
-      price: '',
+      price: null,
       // 采购单位类型
       buyerclass: {},
       // 采购单位联系方式
@@ -324,18 +342,33 @@ export default function () {
       // 招标代理机构
       agency: []
     }
-    inputKeywordsState.value = {
-      input: '',
-      // 关键词筛选模式
-      searchMode: '0',
-      matchKeys: [],
-      // 附加关键词筛选模式
-      wordsMode: 0,
-      // 附件关键词组
-      additionalWords: [],
-      selectMoreKey: false
+    doQuery()
+  }
+
+
+  // 页面滚动方法 用于悬浮吸顶,将【筛选条件】置顶
+  const fixedTop = ref(false)
+  function watchScroll () {
+    const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
+    const watchFilter = document.querySelector('.searchTender').offsetTop - 25// 25为margin-top值
+    const watchTable = document.querySelector('.search-bid-header').offsetTop - 15 // 15为margin-top值
+    if (scrollTop >= watchFilter) {
+      fixedTop.value = true
+    } else {
+      fixedTop.value = false
     }
+    // $(".lucene-table.tabfixed.tababsolute").is(":visible")
+    // if (scrollTop >= watchTable) {
+    //   this.tableFixedTop = true
+    // } else {
+    //   this.tableFixedTop = false
+    // }
   }
+  onMounted(() => {
+   that.$nextTick(function() {
+      window.addEventListener('scroll', watchScroll)
+    })
+  })
 
 
   return {
@@ -365,6 +398,9 @@ export default function () {
     onHasToggle,
     onDeleteFilter,
     onSelectedFilter,
-    onResetFilter
+    onResetFilter,
+    toggleFilter,
+    showFilter,
+    fixedTop
   }
 }

+ 1 - 1
apps/bigmember_pc/src/views/search/bidding/model/modules/filter-keywords.js

@@ -26,7 +26,7 @@ export function useSearchInputKeywordsModel() {
   function getFormatAPIParams() {
     const params = {
       keyWords: inputKeywordsState.value.input,
-      searchMode: Number(inputKeywordsState.value.searchMode)
+      searchMode: Number(inputKeywordsState.value.searchMode),
     }
 
     if (inputKeywordsState.value.selectMoreKey) {

+ 7 - 4
apps/bigmember_pc/src/views/search/bidding/model/modules/filter.js

@@ -17,7 +17,7 @@ export function useSearchFilterModel() {
     // 附件
     fileExists: '',
     // 金额区间
-    price: '',
+    price: null,
     // 采购单位类型
     buyerclass: {},
     // 采购单位联系方式
@@ -35,7 +35,7 @@ export function useSearchFilterModel() {
   })
 
   function getFormatAPIParams() {
-    const { publishTime, regionMap, industry, fileExists, notkey, buyerclass, subtype } = filterState.value
+    const { publishTime, regionMap, industry, notkey, buyerclass, subtype } = filterState.value
     const { area, city, district } = FilterHistoryViewModel2AjaxModel.formatAreaCity(regionMap)
     const rPublishTime = publishTime?.indexOf('_') > -1 ? publishTime.replace(/_/g, '-') :  FilterHistoryViewModel2AjaxModel.formatTime(publishTime, true, '-')
     const rIndustry = FilterHistoryViewModel2AjaxModel.formatIndustry(industry)
@@ -53,8 +53,11 @@ export function useSearchFilterModel() {
       province: area,
       city,
       district,
-      fileExists: fileExists !== '' && fileExists !== undefined ? fileExists.toString() : '',
-      buyerClass: rBuyerClass
+      buyerClass: rBuyerClass,
+      fileExists: filterState.value.fileExists,
+      price: filterState.value.price,
+      buyertel: filterState.buyertel,
+      winnertel: filterState.winnertel
     }
     return params
   }

+ 0 - 1
apps/bigmember_pc/src/views/search/bidding/model/modules/save-filter-actions.js

@@ -97,7 +97,6 @@ export function saveFilterActionsModel () {
             open: index === 0
           }
         })
-        console.log(arr)
         filterHistoryList.value = arr
         if(type === 'delete' && arr.length === 0) {
           historyFilterDialogVisible.value = false