Quellcode durchsuchen

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

zhangsiya vor 1 Jahr
Ursprung
Commit
7da5569c34

+ 8 - 0
apps/bigmember_pc/src/api/modules/bi.js

@@ -16,3 +16,11 @@ export function ajaxSetInfoId(data) {
     data
   })
 }
+
+// 获取物业专版的筛选条件
+export function getPropertyFilters() {
+  return request({
+    url: '/jyapi/jybx/core/property/searchCriteria',
+    method: 'post'
+  })
+}

+ 8 - 150
apps/bigmember_pc/src/assets/js/selector.js

@@ -241,156 +241,14 @@ export const infoTypeListExp = (function () {
   return arr
 })()
 
-// export const infoTypeListExp = [
-//   {
-//     name: '全部',
-//     value: '',
-//     level: 0,
-//     children: []
-//   },
-//   {
-//     name: '拟建项目',
-//     value: '拟建',
-//     showHelp: true,
-//     level: 1,
-//     children: []
-//   },
-//   {
-//     name: '采购意向',
-//     value: '采购意向',
-//     showHelp: true,
-//     level: 1,
-//     children: []
-//   },
-//   {
-//     name: '招标预告',
-//     value: '',
-//     level: 1,
-//     children: [
-//       {
-//         name: '预告',
-//         value: '预告',
-//         level: 2
-//       },
-//       {
-//         name: '预审',
-//         value: '预审',
-//         level: 2
-//       },
-//       {
-//         name: '预审结果',
-//         value: '预审结果',
-//         level: 2
-//       },
-//       {
-//         name: '论证意见',
-//         value: '论证意见',
-//         level: 2
-//       },
-//       {
-//         name: '需求公示',
-//         value: '需求公示',
-//         level: 2
-//       }
-//     ]
-//   },
-//   {
-//     name: '招标公告',
-//     value: '',
-//     level: 1,
-//     children: [
-//       {
-//         name: '招标',
-//         value: '招标',
-//         level: 2
-//       },
-//       {
-//         name: '邀标',
-//         value: '邀标',
-//         level: 2
-//       },
-//       {
-//         name: '询价',
-//         value: '询价',
-//         level: 2
-//       },
-//       {
-//         name: '竞谈',
-//         value: '竞谈',
-//         level: 2
-//       },
-//       {
-//         name: '单一',
-//         value: '单一',
-//         level: 2
-//       },
-//       {
-//         name: '竞价',
-//         value: '竞价',
-//         level: 2
-//       },
-//       {
-//         name: '变更',
-//         value: '变更',
-//         level: 2
-//       }
-//       // {
-//       //   name: '其它',
-//       //   value: '其它',
-//       //   level: 2
-//       // }
-//     ]
-//   },
-//   {
-//     name: '招标结果',
-//     value: '',
-//     level: 1,
-//     children: [
-//       {
-//         name: '中标',
-//         value: '中标',
-//         level: 2
-//       },
-//       {
-//         name: '成交',
-//         value: '成交',
-//         level: 2
-//       },
-//       {
-//         name: '废标',
-//         value: '废标',
-//         level: 2
-//       },
-//       {
-//         name: '流标',
-//         value: '流标',
-//         level: 2
-//       }
-//     ]
-//   },
-//   {
-//     name: '招标信用信息',
-//     value: '',
-//     level: 1,
-//     children: [
-//       {
-//         name: '合同',
-//         value: '合同',
-//         level: 2
-//       },
-//       {
-//         name: '验收',
-//         value: '验收',
-//         level: 2
-//       },
-//       {
-//         name: '违规',
-//         value: '违规',
-//         level: 2
-//       }
-//     ]
-//   }
-// ]
+export const infoTypeListMapExp = {
+  拟建项目: ['拟建项目'],
+  采购意向: ['采购意向'],
+  招标预告: ['预告', '预审', '预审结果', '论证意见', '需求公示'],
+  招标公告: ['招标', '邀标', '询价', '竞谈', '单一', '竞价', '变更'],
+  招标结果: ['中标', '成交', '废标', '流标'],
+  招标信用信息: ['合同', '验收', '违规'],
+}
 
 // 行业分类数据
 // 在[@/components/selector/IndustrySelectorCard.vue]中使用

+ 10 - 3
apps/bigmember_pc/src/components/filter-items/CascadeContent.vue

@@ -18,7 +18,10 @@
               @change="onFirstChange($event, first, fIndex)"
             >
             </el-checkbox>
-            <span class="item-name" @click.self="onOpenSecond(first, fIndex)">{{ first.name }}</span>
+            <span class="item-name" @click.self="onOpenSecond(first, fIndex)">
+              {{ first.name }}
+              <slot name="expend-first" :first="first"></slot>
+            </span>
             <i class="el-icon-arrow-right"></i>
           </li>
         </ul>
@@ -66,7 +69,8 @@ export default {
       default: () => {
         return null
       }
-    }
+    },
+
   },
   data () {
     return {
@@ -84,6 +88,7 @@ export default {
   },
   watch: {
     value (val) {
+      console.log(val)
       this.setState(val)
     }
   },
@@ -269,7 +274,7 @@ export default {
           }
         }
       })
-      
+
       return levelArray
     },
     // 一级分类_二级分类 to {一级分类: [二级分类]}
@@ -400,6 +405,8 @@ export default {
       .item-name{
         flex: 1;
         margin-left: 4px;
+        display: flex;
+        align-items: center;
       }
     }
     .module-main::-webkit-scrollbar{

+ 177 - 0
apps/bigmember_pc/src/components/filter-items/ChangeHandsDropdown.vue

@@ -0,0 +1,177 @@
+<template>
+  <div class="change-hands-dropdown">
+    <Layout
+      ref="layoutRef"
+      :type="type"
+      :placeholder="placeholder"
+      :trigger="trigger"
+      :value="computedVal"
+    >
+      <div slot="empty" class="filter-list">
+        <div class="filter-item"
+             :class="{'active': selected.value === item.value}"
+             v-for="item in options"
+             :key="item.label"
+             :label="item.label"
+             :value="item.value"
+             @click="handleChange(item)"
+        >
+          {{ item.label }}
+        </div>
+      </div>
+    </Layout>
+    <el-tooltip  effect="dark"  placement="top">
+      <div slot="content" style="width:300px; font-size: 14px;line-height: 24px;">
+        <span>"换手率说明:采购单位的历史物业项目中标单位更换频次统计。</span>
+      </div>
+      <i class="icon-help-img" ></i>
+    </el-tooltip>
+  </div>
+</template>
+
+<script>
+import Layout from '@/components/filter-items/Layout.vue'
+export default {
+    name: 'ChangeHands',
+  props: {
+    type: {
+      type: String,
+      default: 'dropdown'
+    },
+    trigger: {
+      type: String,
+      default: 'hover'
+    },
+    placeholder: {
+      type: String,
+      default: '换手率'
+    },
+    value: {
+      type: [String, Number],
+      default: null
+    },
+    beforeChange: Function
+  },
+  components: {
+    Layout
+  },
+  data () {
+    return {
+      options: [
+        {
+          label: "不限",
+          value: "1"
+        },
+        {
+          label: "到期换手率高",
+          value: "2"
+        }
+      ],
+      selected: {
+        label: '',
+        value: this.value
+      }
+    }
+  },
+  computed: {
+    computedVal () {
+      if (this.selected.value) {
+        return this.selected.label
+      } else {
+        return ''
+      }
+    }
+  },
+  model: {
+    prop: 'value',
+    event: 'change'
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler(n) {
+        this.setState(n)
+      }
+    }
+  },
+  methods: {
+    handleChange (item) {
+      const beforeChange = this.beforeChange
+      if (beforeChange) {
+        const pass = beforeChange(item)
+        if (pass) {
+          this.onChange(item)
+        }
+      } else {
+        this.onChange(item)
+      }
+    },
+    onChange (item) {
+      const { layoutRef } = this.$refs
+      try {
+        layoutRef.$refs.dropdownRef.hide()
+      } catch (error) {}
+      this.$emit('change', item.value)
+      this.selected.value = item.value
+      this.selected.label = item.label
+    },
+    getState () {
+      return this.selected.value
+    },
+    setState (value = this.selected.value) {
+      this.selected.value = value
+      this.options.forEach(option => {
+        if (option.value === value) {
+          this.selected.label = option.label
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.change-hands-dropdown{
+  min-width:96px;
+  display: flex;
+  height: 24px;
+}
+.filter-list{
+  min-width: 140px;
+  padding: 8px 0;
+  border: 1px solid $color_main;
+  background: #fff;
+  border-radius: 5px;
+  margin-top: 2px;
+  .filter-item{
+    padding: 4px 16px;
+    font-size: 14px;
+    line-height: 22px;
+    color: #1d1d1d;
+    text-align: left;
+    cursor: pointer;
+    white-space: nowrap;
+    &:hover{
+      background: #ECECEC;
+    }
+    &.active{
+      // color: $color_main;
+      background: #ECECEC;
+    }
+    span{
+      display: inline-block;
+      width: 100%;
+    }
+  }
+}
+.icon-help-img {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  margin-top:6px;
+  margin-left: 6px;
+  background: url("~@/assets/images/icon/help.png") no-repeat center;
+  background-size: contain;
+  cursor: pointer;
+}
+</style>

+ 103 - 0
apps/bigmember_pc/src/components/filter-items/InfoTypeDropdown.vue

@@ -0,0 +1,103 @@
+<template>
+  <Layout
+    :type="type"
+    :placeholder="placeholder"
+    :trigger="trigger"
+    :value="computedVal"
+  >
+    <CascadeContent
+      ref="infoTypeDropdown"
+      slot="empty"
+      :options="dataMap"
+      :value="value"
+      @change="onChange"
+    >
+      <template #expend-first="{ first }" >
+        <el-tooltip  effect="dark"  placement="right" v-if="first.name === '采购意向'">
+          <div slot="content" style="width:300px; font-size: 14px;line-height: 24px;">
+            <span>"采购意向"是指提供未发布招标公告前1-3个月,政府单位的采购意向信息,包含采购内容、预算金额、预计采购时间、采购联系人及联系方式等相关信息。</span>
+          </div>
+          <i class="icon-help-img" ></i>
+        </el-tooltip>
+      </template>
+    </CascadeContent>
+  </Layout>
+</template>
+
+<script>
+import { Tooltip } from 'element-ui'
+import Layout from '@/components/filter-items/Layout.vue'
+import CascadeContent from '@/components/filter-items/CascadeContent.vue'
+import { infoTypeListMapExp } from '@/assets/js/selector.js'
+export default {
+  name: 'InfoTypeDropdown',
+  props: {
+    type: {
+      type: String,
+      default: 'dropdown'
+    },
+    trigger: {
+      type: String,
+      default: 'hover'
+    },
+    placeholder: {
+      type: String,
+      default: '信息类型'
+    },
+    value: {
+      type: Object,
+      default: () => {}
+    },
+    // 不需要拟建筛选条件
+    notNJ:  {
+      type: Boolean,
+      default: false
+    }
+  },
+  components: {
+    [Tooltip.name]: Tooltip,
+    Layout,
+    CascadeContent
+  },
+  watch: {
+    value (val) {
+      this.selectedVal = this.$refs.infoTypeDropdown.levelMapToArray(val)
+      this.$refs.infoTypeDropdown.setState(val)
+    }
+  },
+  data () {
+    return {
+      options: infoTypeListMapExp,
+      selectedVal: []
+    }
+  },
+  computed: {
+    computedVal () {
+      return this.selectedVal.length ? `${this.placeholder}${this.selectedVal.length}个` : ''
+    },
+    dataMap () {
+      const map = infoTypeListMapExp
+      if(this.notNJ) {
+        delete map['拟建项目']
+      }
+      return map
+    }
+  },
+  methods: {
+    onChange (value) {
+      this.$emit('change', value)
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.icon-help-img {
+  display: inline-block;
+  width: 18px;
+  height: 18px;
+  margin-left: 6px;
+  background: url("~@/assets/images/icon/help.png") no-repeat center;
+  background-size: contain;
+  cursor: pointer;
+}
+</style>

+ 14 - 4
apps/bigmember_pc/src/components/filter-items/RegionCollapseSelector.vue

@@ -401,6 +401,8 @@ export default {
         // line状态下 ,城市全部选中,则只选中省份即可
         province.selectedState = 'checked'
         province.children.forEach((item) => (item.selected = false))
+      } else if(count < cityLength) {
+        province.selectedState = 'half'
       }
     },
     // 省份点击事件(城市列表中的省份按钮)(line)
@@ -502,7 +504,7 @@ export default {
                     iitem.selected = true
                   }
                 })
-                // item.selectedState = 'half'
+                item.selectedState = 'half'
               }
             }
 
@@ -534,7 +536,7 @@ export default {
               selectedCityArr.push(iitem.city)
             }
           })
-          
+
           // 先看是否有城市被选,再看是否省份被选
           if (selectedCityArr.length) {
             counter[item.name] = selectedCityArr
@@ -543,7 +545,7 @@ export default {
               counter[item.name] = []
             }
           }
-          
+
         })
       }
       return counter
@@ -723,7 +725,15 @@ export default {
         position: relative;
         z-index: 2;
       }
-      
+      &.checked {
+        color: #fff;
+        background-color: $color-text--highlight;
+        border: 1px solid $color-text--highlight;
+      }
+      &.half {
+        color: #2abed1;
+        border: 1px dashed #2abed1;
+      }
     }
   }
   .city-list {

+ 148 - 0
apps/bigmember_pc/src/components/filter-items/SearchRangeDropdown.vue

@@ -0,0 +1,148 @@
+<template>
+  <Layout
+    :type="type"
+    :placeholder="placeholder"
+    :trigger="trigger"
+    :value="computedVal"
+  >
+    <div slot="empty" class="search-range-container">
+      <el-checkbox-group
+        v-model="selectVal"
+        @change="checkboxChange">
+        <el-checkbox
+          v-for="oItem in options"
+          :label="oItem.key"
+          :key="oItem.key">
+          {{oItem.label ? oItem.label.replace('搜索', '') : ''}}
+          <template v-for="tip in needTipList">
+             <el-tooltip  effect="dark"  placement="right" v-if="tip.name === oItem.label">
+              <div slot="content" style="width:300px; font-size: 14px;line-height: 24px;">
+                <span>{{tip.tip}}</span>
+              </div>
+              <i class="icon-help-img" ></i>
+            </el-tooltip>
+          </template>
+        </el-checkbox>
+      </el-checkbox-group>
+    </div>
+
+  </Layout>
+</template>
+
+<script>
+import { Tooltip } from 'element-ui'
+import Layout from '@/components/filter-items/Layout.vue'
+import CascadeContent from '@/components/filter-items/CascadeContent.vue'
+import { biddingSearchScope } from '@/assets/js/selector.js'
+export default {
+  name: 'InfoTypeDropdown',
+  components: {
+    [Tooltip.name]: Tooltip,
+    Layout,
+    CascadeContent
+  },
+  props: {
+    type: {
+      type: String,
+      default: 'dropdown'
+    },
+    trigger: {
+      type: String,
+      default: 'hover'
+    },
+    placeholder: {
+      type: String,
+      default: '搜索范围'
+    },
+    value: {
+      type: Array,
+      default: () => []
+    }
+  },
+  model: {
+    prop: 'value',
+    event: 'change'
+  },
+  data () {
+    return {
+      needTipList: [
+        {
+          name: '采购单位',
+          tip: '“采购单位”采购单位名称中包含输入关键词的会展示出来'
+        },
+        {
+          name: '中标企业',
+          tip: '“中标企业”中标企业名称中包含输入关键词的会展示出来'
+        },
+        {
+          name: '招标代理机构',
+          tip: '“招标代理机构”招标代理机构中包含输入关键词的会展示出来'
+        }
+      ],
+      options: biddingSearchScope,
+      selectVal: []
+    }
+  },
+  watch: {
+    value: {
+      handler(val) {
+        this.selectVal = val
+      },
+      deep: true
+    }
+  },
+  computed: {
+    computedVal () {
+      return this.selectVal.length ? `${this.placeholder}${this.selectVal.length}个` : ''
+    }
+  },
+  created() {
+    this.selectVal = this.value
+  },
+  methods: {
+    checkboxChange () {
+      this.$emit('change', this.selectVal)
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.search-range-container {
+  min-width: 140px;
+  padding: 8px;
+  border: 1px solid #2cb7ca;
+  background: #fff;
+  border-radius: 5px;
+  margin-top: 2px;
+
+  .el-checkbox{
+    display: flex;
+    align-items: center;
+    margin-right: 20px;
+    color: #606266;
+    font-weight: 500;
+    font-size: 14px;
+    cursor: pointer;
+    user-select: none;
+    height: 30px;
+    line-height: 30px;
+  }
+
+}
+::v-deep {
+  .el-checkbox__label{
+    display: flex;
+    align-items: center;
+  }
+}
+.icon-help-img {
+  display: inline-block;
+  width: 18px;
+  height: 18px;
+  margin-left: 6px;
+  background: url("~@/assets/images/icon/help.png") no-repeat center;
+  background-size: contain;
+  cursor: pointer;
+}
+
+</style>

+ 32 - 0
apps/bigmember_pc/src/components/selector/TimeSelectorContent.vue

@@ -207,6 +207,38 @@ const timeSelectMap = {
       value: 'lately90',
       selected: false
     }
+  ],
+  expire: [
+    {
+      name: '全部',
+      value: 'all',
+      selected: true
+    },
+    {
+      name: '本月到期',
+      value: '1',
+      selected: false
+    },
+    {
+      name: '1-3个月到期',
+      value: '1-3',
+      selected: false
+    },
+    {
+      name: '3-6个月到期',
+      value: '3-6',
+      selected: false
+    },
+    {
+      name: '6-12个月到期',
+      value: '6-12',
+      selected: false
+    },
+    {
+      name: '12个月后到期',
+      value: '12',
+      selected: false
+    }
   ]
 }
 

+ 27 - 3
apps/bigmember_pc/src/views/search/bidding/components/search-bid-filter.vue

@@ -1,6 +1,7 @@
 <script setup>
-import { ref, computed, watch } from 'vue'
+import { computed, watch } from 'vue'
 import { SearchBidModel } from '../model/index'
+import { getPropertyFilters } from '@/api/modules/bi'
 import SearchSchemaFilter from '@/views/search/components/search-schema-filter.vue'
 import SelectorWithBasePower from '@/components/filter-items/SelectorWithBasePower.vue'
 import $bus from '@/utils/bus'
@@ -10,6 +11,7 @@ const {
   isLogin,
   isInApp,
   isInWeb,
+  inBIPropertyIframe,
   activeTab,
   guideGoWorkSpace,
   filterState,
@@ -26,12 +28,35 @@ const  {
   searchBidMoreFreeSchema,
   searchBidMoreVipSchema,
   doUpdateData
-} = disposeFilterSchema()
+} =  disposeFilterSchema()
 
 watch(activeTab, (newVal) => {
   doUpdateData()
 })
 
+// 物业专版获取筛选条件,更新视图
+async function getBiPropertyFilters () {
+  const { error_code: code, data} = await getPropertyFilters()
+  if(code === 0) {
+    let newData = {}
+    Object.keys(data).forEach(v => {
+      newData[v] = []
+      data[v].forEach(s => {
+        let sArr = s.split('#')
+        s = {
+          label: sArr[0],
+          value: sArr[1]
+        }
+        newData[v].push(s)
+      })
+    })
+    doUpdateData(newData)
+  }
+}
+if(inBIPropertyIframe) {
+  getBiPropertyFilters()
+}
+
 const customMoreSchema = computed(() => {
   return {
     vipModuleShow: true,
@@ -63,7 +88,6 @@ function doChangeFilter() {
   doQuery()
 }
 
-
 </script>
 
 <template>

+ 17 - 0
apps/bigmember_pc/src/views/search/bidding/constant/index.js

@@ -0,0 +1,17 @@
+import { createBiSearchBidBaseSchema, createBiSearchBidMoreSchema } from '@/views/search/bidding/constant/search-filters-bi.js'
+import { createSearchBidBaseSchema, createSearchBidMoreSchema  } from '@/views/search/bidding/constant/search-filters.js'
+
+export function getCreateSearchSchema(conf) {
+  const { bi } = conf
+  if(bi) {
+    return {
+      createSearchBidBaseSchema: createBiSearchBidBaseSchema,
+      createSearchBidMoreSchema: createBiSearchBidMoreSchema
+    }
+  } else {
+    return {
+      createSearchBidBaseSchema,
+      createSearchBidMoreSchema
+    }
+  }
+}

+ 261 - 0
apps/bigmember_pc/src/views/search/bidding/constant/search-filters-bi.js

@@ -0,0 +1,261 @@
+import RegionCollapseSelector from '@/components/filter-items/RegionCollapseSelector'
+import CommonCheckboxSelector from '@/components/filter-items/CommonCheckboxSelector'
+import PriceSelector from '@/components/selector/PriceSelector'
+// 信息类型
+import InfoTypeDropdown from '@/components/filter-items/InfoTypeDropdown.vue'
+// 搜索范围
+import SearchRangeDropdown from '@/components/filter-items/SearchRangeDropdown.vue'
+// 发布时间
+import TimeDropdown from '@/components/selector/timeDropdown'
+// 附件
+import AttachmentSelector from '@/components/filter-items/AttachmentSelector.vue'
+// 换手率
+import ChangeHandsDropdown from '@/components/filter-items/ChangeHandsDropdown.vue'
+import SearchTimeScopeSelector from '@/components/selector/SearchTimeScopeSelector.vue'
+import ContactSelector from '@/components/filter-items/ContactSelector.vue'
+import KeywordTagsSelector from '@/components/filter-items/KeywordTagsSelector'
+
+
+function createBiSearchBidBaseSchema(propertyListData = {}) {
+  const businessList = propertyListData['业务类型'] || []
+  const priceList =  propertyListData['价格区间'] || []
+  const periodList =  propertyListData['合同周期'] || []
+  const propertyList =  propertyListData['物业业态'] || []
+  const SearchBidBaseSchema = [
+    {
+      key: 'regionMap',
+      label: '地区:',
+      defaultVal: {},
+      _name: 'regionMap',
+      _type: 'component',
+      expand: {
+        component: RegionCollapseSelector,
+        props: {
+          showSelectedList: false
+        },
+        hooks: {}
+      }
+    },
+    {
+      key: 'expireTime',
+      label: '到期时间:',
+      defaultVal: '',
+      _name: 'expireTime',
+      _type: 'component',
+      expand: {
+        component: SearchTimeScopeSelector,
+        props: {
+          type: 'expire'
+        },
+        hooks: {}
+      }
+    },
+    {
+      key: 'subinformation',
+      label: '业务类型:',
+      defaultVal: [],
+      _name: 'subinformation',
+      _type: 'component',
+      expand: {
+        component: CommonCheckboxSelector,
+        props: {
+          field: 'value',
+          options: {
+            value: businessList
+          }
+        },
+        hooks: {}
+      }
+    },
+    {
+      key: 'scale',
+      label: '价格区间:',
+      defaultVal: '',
+      _name: 'scale',
+      _type: 'component',
+      expand: {
+        component: CommonCheckboxSelector,
+        props: {
+          field: 'value',
+          options: {
+            value: priceList
+          }
+        },
+        hooks: {}
+      }
+    },
+    {
+      key: 'period',
+      label: '合同周期:',
+      defaultVal: '',
+      _name: 'period',
+      _type: 'component',
+      expand: {
+        component: CommonCheckboxSelector,
+        props: {
+          single: true,
+          field: 'value',
+          options: {
+            value: periodList
+          }
+        },
+        hooks: {}
+      }
+    },
+    {
+      key: 'propertyForm',
+      label: '物业业态:',
+      defaultVal: '',
+      _name: 'propertyForm',
+      _type: 'component',
+      expand: {
+        component: CommonCheckboxSelector,
+        props: {
+          field: 'value',
+          options: {
+            value: propertyList
+          }
+        },
+        hooks: {}
+      }
+    }
+  ]
+
+  return SearchBidBaseSchema
+}
+
+function createBiSearchBidMoreSchema() {
+  const SearchBidMoreSchema = [
+    {
+      key: 'selectType',
+      label: '搜索范围',
+      defaultVal: ['title', 'content'],
+      _name: 'selectType',
+      _type: 'component',
+      expand: {
+        component: SearchRangeDropdown,
+        hooks: {}
+      }
+    },
+    {
+      key: 'subtype',
+      label: '信息类型',
+      defaultVal: '',
+      _name: 'subtype',
+      _type: 'component',
+      expand: {
+        component: InfoTypeDropdown,
+        props: {
+          notNJ: true
+        },
+        hooks: {}
+      }
+    },
+    {
+      key: 'publishTime',
+      label: '发布时间',
+      defaultVal: 'fiveyear',
+      _name: 'publishTime',
+      _type: 'component',
+      expand: {
+        component: TimeDropdown,
+        props: {
+          placeholder: '发布时间',
+          selectData: [{
+            value: 'lately-7',
+            label: '最近7天'
+          }, {
+            value: 'lately-30',
+            label: '最近30天'
+          }, {
+            value: 'thisyear',
+            label: '最近1年'
+          }, {
+            value: 'threeyear',
+            label: '最近3年'
+          }, {
+            value: 'fiveyear',
+            label: '最近5年'
+          }, {
+            value: '0',
+            label: '自定义',
+            disabled: true
+          }],
+          selectorType: 'line',
+          singleChoice: true,
+
+        },
+        hooks: {}
+      }
+    },
+    {
+      key: 'changehand',
+      label: '换手率',
+      defaultVal: '',
+      _name: 'changehand',
+      _type: 'component',
+      expand: {
+        component: ChangeHandsDropdown,
+        hooks: {}
+      }
+    },
+    {
+      key: 'fileExists',
+      label: '附件',
+      defaultVal: '',
+      _name: 'fileExists',
+      _type: 'component',
+      expand: {
+        component: AttachmentSelector,
+        hooks: {}
+      }
+    },
+    {
+      key: 'buyertel',
+      label: '采购单位联系方式',
+      defaultVal: '',
+      _name: 'buyertel',
+      _type: 'component',
+      expand: {
+        component: ContactSelector,
+        props: {
+          source: 'buyer'
+        },
+        hooks: {}
+      }
+    },
+    {
+      key: 'winnertel',
+      label: '中标企业联系方式',
+      defaultVal: '',
+      _name: 'winnertel',
+      _type: 'component',
+      expand: {
+        component: ContactSelector,
+        props: {
+          source: 'winner'
+        },
+        hooks: {}
+      }
+    },
+    {
+      key: 'notkey',
+      label: '排除词',
+      defaultVal: [],
+      _name: 'notKeyComponent',
+      _type: 'component',
+      expand: {
+        component: KeywordTagsSelector,
+        props: {
+          placeholder: '排除词',
+          inputPlaceholder: '请输入不希望包含的关键词',
+          maxTip: '排除词个数已达上限'
+        },
+        hooks: {}
+      }
+    }
+  ]
+  return SearchBidMoreSchema
+}
+
+export { createBiSearchBidBaseSchema, createBiSearchBidMoreSchema }

+ 30 - 12
apps/bigmember_pc/src/views/search/bidding/model/base.js

@@ -7,7 +7,7 @@ import { mixinVisited } from '@/utils/mixins/visited-setup.js'
 import  { FilterHistoryAjaxModelRestore, getParam, openLinkInWorkspace, InContainer} from '@/utils'
 import $bus from '@/utils/bus'
 // 筛选条件动态组件方法
-import { createSearchBidBaseSchema, createSearchBidMoreSchema } from '@/views/search/bidding/constant/search-filters'
+import { getCreateSearchSchema } from '@/views/search/bidding/constant/index'
 // API 业务模型
 import useQuickSearchModel from '@jy/data-models/modules/quick-search/model'
 // 扩展业务模型
@@ -68,8 +68,8 @@ export default function () {
 
 
   // 是否在工作台内
-  const isInApp = ref(InContainer.inApp)
-  const isInWeb = ref(InContainer.inWeb)
+  const isInApp = ref(true) || ref(InContainer.inApp)
+  const isInWeb = ref(false) || ref(InContainer.inWeb)
 
   // 是否是渠道商
   const cooperateCode = ref(false)
@@ -127,8 +127,10 @@ export default function () {
     searchModelOptions,
     getFormatAPIParams: getFormatOfInputKeywords
   } = useSearchInputKeywordsModel()
-  const { filterState, getFormatAPIParams: getFormatOfFilter } =
-    useSearchFilterModel()
+  const {
+    filterState,
+    getFormatAPIParams: getFormatOfFilter,
+  } = useSearchFilterModel({ inBIPropertyIframe })
   const {
     limitActions,
     headerActions,
@@ -156,7 +158,11 @@ export default function () {
       }
     }
   }
-
+  // 筛选条件动态配置处理
+  const {
+    createSearchBidBaseSchema,
+    createSearchBidMoreSchema
+  } = getCreateSearchSchema({ bi: inBIPropertyIframe })
   // 处理当前信息类型--展示数据类型
   const  infoTypeDataType = computed(() =>  {
     let result = 'all'
@@ -193,7 +199,7 @@ export default function () {
     const searchBidMoreFreeSchema = ref([])
     const searchBidMoreVipSchema = ref([])
 
-    SearchBidBaseSchema.value =  createSearchBidBaseSchema(conf.value)
+    SearchBidBaseSchema.value = createSearchBidBaseSchema(conf.value)
     SearchBidMoreSchema.value =  createSearchBidMoreSchema()
 
     searchBidMoreFreeSchema.value = SearchBidMoreSchema.value?.filter(
@@ -203,8 +209,10 @@ export default function () {
       (s) => s.vipMark
     )
 
-    function doUpdateData() {
-      SearchBidBaseSchema.value = createSearchBidBaseSchema(conf.value)
+
+    function doUpdateData(schema) {
+      const payload = schema || conf.value
+      SearchBidBaseSchema.value = createSearchBidBaseSchema(payload)
     }
 
     return {
@@ -456,6 +464,8 @@ export default function () {
    */
 
   function getParams(params = {}) {
+    // 物业专版筛选条件待处理
+    // filterProperty
     // 合并所有模型的搜索筛选项
     const result = Object.assign(
       {
@@ -549,6 +559,7 @@ export default function () {
       filterState.value,
       inputKeywordsState.value
     )
+
     return originParams
   }
 
@@ -604,11 +615,18 @@ export default function () {
   }
   // 监听路由事件
   onMounted(() => {
-    if(useRoute().query.goback) {
+    const { goback, searchGroup, subtype } = useRoute().query
+    if(goback) {
       goBackFilter()
-    } else if(useRoute().query.searchGroup) {
-      const key = Number(useRoute().query.searchGroup)
+    } else if(searchGroup) {
+      // 进入页面,默认回显tab
+      const key = Number(searchGroup)
       doChangeTab({ key})
+    } else if(subtype && subtype ==='采购意向' && inBIPropertyIframe) {
+      // 物业专版,采购意向回显
+      filterState.value = Object.assign(filterState.value, {
+        subtype: {采购意向: ['采购意向']}
+      })
     }
   })
   // 回显筛选条件

+ 57 - 13
apps/bigmember_pc/src/views/search/bidding/model/modules/filter.js

@@ -1,9 +1,10 @@
 import { ref } from 'vue'
 import  { FilterHistoryViewModel2AjaxModel } from '@/utils'
 
-export function useSearchFilterModel() {
+export function useSearchFilterModel(conf) {
+  const { inBIPropertyIframe } = conf
   // 筛选组件状态
-  const filterState = ref({
+  const filterBase = ref({
     // 发布时间
     publishTime: 'thisyear',
     // 搜索范围
@@ -31,11 +32,48 @@ export function useSearchFilterModel() {
     // 中标企业
     winner: [],
     // 招标代理机构
-    agency: []
+    agency: [],
   })
+  const filterProperty = ref({
+    bidField: 'BIProperty',
+    // 地区
+    regionMap: {},
+    // 到期时间
+    expireTime: '',
+    // 业务类型
+    subinformation: [],
+    // 价格区间
+    scale: [],
+    // 合同周期
+    period: [],
+    // 物业业态
+    propertyForm: [],
+    // 搜索范围
+    selectType: ['title', 'content'],
+    // 信息类型
+    subtype: {},
+    // 发布时间
+    publishTime: 'fiveyear',
+    // 换手率
+    changehand: '',
+    // 附件
+    fileExists: '',
+    // 采购单位联系方式
+    buyertel: '',
+    // 中标企业联系方式
+    winnertel: '',
+    // 排除词
+    notkey: []
+  })
+  const filterState = ref({})
+  if(inBIPropertyIframe) {
+    filterState.value = filterProperty.value
+  } else {
+    filterState.value = filterBase.value
+  }
 
   function getFormatAPIParams() {
-    const { publishTime, regionMap, industry, notkey, buyerclass, subtype } = filterState.value
+    const { publishTime, regionMap, industry, notkey, buyerclass, subtype } = filterBase.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)
@@ -43,27 +81,33 @@ export function useSearchFilterModel() {
     const rSubtype = FilterHistoryViewModel2AjaxModel.formatInfoType(subtype)
     const params = {
       publishTime: rPublishTime,
-      selectType: filterState.value.selectType.join(','),
+      selectType: filterBase.value.selectType.join(','),
       subtype: rSubtype,
       exclusionWords: notkey.join(','), // 排除词
-      buyer: filterState.value.buyer.join(','),
-      winner: filterState.value.winner.join(','),
-      agency: filterState.value.agency.join(','),
+      buyer: filterBase.value.buyer.join(','),
+      winner: filterBase.value.winner.join(','),
+      agency: filterBase.value.agency.join(','),
       industry: rIndustry,
       province: area,
       city,
       district,
       buyerClass: rBuyerClass,
-      fileExists: filterState.value.fileExists,
-      price: filterState.value.price,
-      buyertel: filterState.value.buyertel,
-      winnertel: filterState.value.winnertel
+      fileExists: filterBase.value.fileExists,
+      price: filterBase.value.price,
+      buyerTel: filterBase.value.buyertel,
+      winnerTel: filterBase.value.winnertel
     }
     return params
   }
 
+  function getFormatAPIPropertyParams() {
+    return filterProperty.value
+  }
+
   return {
     filterState,
-    getFormatAPIParams
+    filterProperty,
+    getFormatAPIParams,
+    getFormatAPIPropertyParams
   }
 }

+ 2 - 1
apps/bigmember_pc/src/views/search/bidding/model/modules/tabs.js

@@ -2,7 +2,8 @@ import { computed, ref } from 'vue'
 
 export function useSearchTabsModel(conf) {
   const { showTabs2 } = conf
-  const activeTab = ref(0)
+  const defaultTab = showTabs2 ? 1 : 0
+  const activeTab = ref(defaultTab)
   const Tabs = [
     {
       label: '全部',

+ 1 - 0
apps/bigmember_pc/src/views/search/components/search-schema-filter.vue

@@ -122,6 +122,7 @@ const getPrefix = {
     font-size: 14px;
     line-height: 22px;
     margin-right: 12px;
+    text-align: right;
   }
 }
 </style>