Bladeren bron

Merge branch 'dev' of https://git.citupro.com/zhengnaiwen_citu/menduner into dev

Xiao_123 11 maanden geleden
bovenliggende
commit
72b9f03c37

+ 13 - 7
src/components/headSearch/index.vue

@@ -4,17 +4,16 @@
       <template v-slot:activator="{ isActive, props }">
         <v-btn
           style="height: 100%; font-size: 16px;"
-          class="mr-3"
           variant="text"
           density="comfortable"
           :append-icon="isActive ? 'mdi mdi-menu-up' : 'mdi mdi-menu-down'"
           color="primary"
           v-bind="props"
         >
-          {{ text }}
+          {{ defineProps.text }}
         </v-btn>
       </template>
-      <jobTypeCard class="jobTypeCardBox" @handleJobClick="handleClickJob"></jobTypeCard>
+      <jobTypeCard v-if="defineProps.text === '职位类型'" class="jobTypeCardBox" @handleJobClick="handleClickJob"></jobTypeCard>
     </v-menu>
     <!-- <div style="position: relative;">
       <div class="jobBox d-flex pl-5" :class="{'drawer': drawer}" @click.stop="drawer = !drawer">
@@ -30,7 +29,7 @@
       variant="plain"
       density="compact"
       :hide-details="true"
-      class="px-2"
+      class="ml-3 px-2"
       style="height: 100%; line-height: 100%;"
       @keyup.enter="handleSearch"
     ></v-text-field>
@@ -45,10 +44,17 @@ import { ref, watch } from 'vue'
 import { useRoute, useRouter } from 'vue-router'
 defineOptions({ name:'common-components-headSearch'})
 const route = useRoute(); const router = useRouter()
-const emits = defineEmits(['handleSearch', 'handleJobClick'])// 定义一个或多个自定义事件
+const emits = defineEmits(['update:modelValue', 'handleSearch', 'handleJobClick'])// 定义一个或多个自定义事件
+const defineProps = defineProps({
+  modelValue: [String, Number],
+  text: {
+    type: String,
+    default: '职位类型'
+  },
+})
 
-const text = ref('职位类型')
-const value = ref('')
+// const value = ref('')
+const value = ref(defineProps.modelValue)
 let drawer = ref(false)
 
 if (route.query && route.query?.content) value.value = route.query.content

+ 44 - 26
src/views/recruit/position/components/areaCascader/index.vue

@@ -2,6 +2,7 @@
   <div v-if="show">
     <!-- <recursive v-if="items?.length" :items="items"></recursive> -->
     <div v-for="(list, levelIndex) in treeList" :key="`select${levelIndex}`">
+      <!-- 单选级别 -->
       <div v-if="levelIndex < props.multipleLevel">
         <span v-for="(item, itemIndex) in list" :key="item.id">
           <span
@@ -15,6 +16,7 @@
         <!-- 其他 -->
         <span v-if="list?.length > num" class="mx-3" style="line-height: 32px;">其他</span>
       </div>
+      <!-- 多选级别 -->
       <div v-else class="embedded">
         <span
           v-for="item in list" :key="item.id"
@@ -31,10 +33,10 @@
 // import recursive from './recursive'
 import { getDict } from '@/hooks/web/useDictionaries'
 import { inject, reactive, ref } from 'vue'
-import { useRoute } from 'vue-router'
+// import { useRoute } from 'vue-router'
 defineOptions({ name:'common-components-areaTree'})
 const emits = defineEmits(['checkedInput'])
-const route = useRoute()
+// const route = useRoute()
 
 const props = defineProps({
   // items: Object,
@@ -60,32 +62,48 @@ const query = inject('routeQuery')
 getDict('areaTreeData', {}, 'areaTreeData').then(({ data }) => {
   const arr = data?.length && data || []
   treeList.value = [arr]
-  if (query && query.level1) {
-    // 刷新回显
-    Object.keys(query).forEach(key => {
-      if(key.includes('level')) {
-        const levelIndex = key.split('level')[1] - 1
-        if (levelIndex !== -1 && treeList.value[levelIndex]?.length) {
-          const idsStr = route.query[key]?.split(',')[0] || ''
-          if (idsStr) {
-            const arr = idsStr.split('_')
-            if (arr?.length) {
-              arr.forEach(idItem => {
-                const dataItem = treeList.value[levelIndex].find(findItem => (findItem.id - 0) === (idItem - 0))
-                const params = {
-                  item: dataItem,
-                  index: levelIndex,
-                  expand: true,
-                  updateSearch: false
-                }
-                if (dataItem) handleNext(params)
-              })
-            }
+  if (query && query.city) { // 刷新回显
+    const city = query.city
+    const levelCountArr = city.split('__')
+    levelCountArr?.forEach((areaIds, levelIndex) => {
+      const idArr = areaIds.split('_')
+      if (idArr?.length) {
+        idArr.forEach(idItem => {
+          const dataItem = treeList.value[levelIndex].find(findItem => (findItem.id - 0) === (idItem - 0))
+          const params = {
+            item: dataItem,
+            index: levelIndex,
+            expand: true,
+            updateSearch: false
           }
-        }
-
+          if (dataItem) handleNext(params)
+        })
       }
     })
+    // Object.keys(query).forEach(key => {
+    //   if(key.includes('level')) {
+    //     const levelIndex = key.split('level')[1] - 1
+    //     if (levelIndex !== -1 && treeList.value[levelIndex]?.length) {
+    //       const idsStr = route.query[key]?.split(',')[0] || ''
+    //       if (idsStr) {
+    //         const arr = idsStr.split('_')
+    //         if (arr?.length) {
+    //           arr.forEach(idItem => {
+    //             const dataItem = treeList.value[levelIndex].find(findItem => (findItem.id - 0) === (idItem - 0))
+    //             const params = {
+    //               item: dataItem,
+    //               index: levelIndex,
+    //               expand: true,
+    //               updateSearch: false
+    //             }
+    //             if (dataItem) handleNext(params)
+    //           })
+    //         }
+    //       }
+    //     }
+
+    //   }
+    // })
   } else {
     // 默认展开城市到defaultOpen级
     if (props.defaultOpen > 0) {
@@ -126,7 +144,7 @@ const getIdChecked = (item, levelIndex) => {
 // item: 当前操作数据(被点击的数据本身)
 // index: 当前操作数据的层级
 // expand: 展开下级
-// updateSearch: 是否触发搜索职位列表更新(updateCheckedInput)
+// updateSearch: 是否刷新数据(职位列表):回显选中不需要刷新,刷新页面使用的是路由中的参数
 const handleNext = ({ item, index, expand = true, updateSearch = true }) => {
   getIdChecked(item, index)
   if (updateSearch) emits('checkedInput', idChecked)

+ 15 - 11
src/views/recruit/position/components/cityFilter.vue

@@ -12,29 +12,33 @@
 </template>
 <script setup>
 import areaTree from './areaCascader'
-import { reactive, ref, defineExpose } from 'vue'
+// import { reactive, ref, defineExpose } from 'vue'
+import { ref } from 'vue'
 
 defineOptions({name: 'retrieval-components-cityFilter'})
-const emits = defineEmits(['updateCheckedInput'])
-let query = reactive({})
+const emits = defineEmits(['change'])
+// let query = reactive({})
 const checkedInputChange = (idChecked) => {
+  let city = ''
   if (idChecked?.length) {
-    const obj = {}
+    // const obj = {}
     idChecked.forEach((_e, index) => {
       if (_e?.length) {
-        obj[`level${index+1}`] = _e.join('_')
+        // obj[`level${index+1}`] = _e.join('_')
+        // city += `${index ? '%' : ''}CL${index+1}_${_e.join('_')}` // CL: city-level
+        city += `${index ? '__' : ''}${_e.join('_')}` // CL: city-level
       }
     })
-    query = obj
-    emits('updateCheckedInput')
+    // query = obj
+    emits('change', 'city', city)
   }
 }
 
 const tab = ref(1)
 const tabClick = () => {
 }
-const getQuery = () => {
-  return query
-}
-defineExpose({ getQuery })
+// const getQuery = () => {
+//   return query
+// }
+// defineExpose({ getQuery })
 </script>

+ 41 - 36
src/views/recruit/position/components/conditionFilter.vue

@@ -1,13 +1,13 @@
 <template>
   <div class="d-flex">
-    <companyIndustry @inputChange="val => inputChange('industryIds', val)"></companyIndustry>
-    <positionType @inputChange="val => inputChange('positionId', val)"></positionType>
-    <JobType @inputChange="val => inputChange('jobType', val)"></JobType>
-    <expType :isSingle="false" @inputChange="val => inputChange('expType', val)"></expType>
-    <payScope @inputChange="val => inputChange('payType', val)"></payScope>
-    <educationType :isSingle="false" @inputChange="val => inputChange('eduType', val)"></educationType>
-    <scale @inputChange="val => inputChange('scale', val)"></scale>
-    <financingStatus @inputChange="val => inputChange('financingStatus', val)"></financingStatus>
+    <companyIndustry positionIndexPage @inputChange="val => inputChange('industryIds', val)"></companyIndustry>
+    <positionType positionIndexPage @inputChange="val => inputChange('positionId', val)"></positionType>
+    <JobType positionIndexPage @inputChange="val => inputChange('jobType', val)"></JobType>
+    <expType positionIndexPage @inputChange="val => inputChange('expType', val)"></expType>
+    <payScope positionIndexPage @inputChange="val => inputChange('payType', val)"></payScope>
+    <educationType positionIndexPage :isSingle="false" @inputChange="val => inputChange('eduType', val)"></educationType>
+    <scale positionIndexPage @inputChange="val => inputChange('scale', val)"></scale>
+    <financingStatus positionIndexPage @inputChange="val => inputChange('financingStatus', val)"></financingStatus>
   </div>
 </template>
 <script setup>
@@ -19,38 +19,43 @@ import payScope from './conditionFilter/payScope.vue'
 import educationType from './conditionFilter/educationType.vue'
 import scale from './conditionFilter/scale.vue'
 import financingStatus from './conditionFilter/financingStatus.vue'
-import { reactive, defineExpose } from 'vue'
-import { useRoute } from 'vue-router'
+// import { reactive, defineExpose } from 'vue'
+// import { useRoute } from 'vue-router'
 defineOptions({name: 'retrieval-components-conditionFilter'})
-const emits = defineEmits(['conditionFilterChange'])
-const route = useRoute()
+const emits = defineEmits(['change'])
 
-const removeEmptyStringsAndReturnNew = (obj) => {
-  const result = {}
-  Object.keys(obj).forEach(function(key) {
-    if (obj[key]) {
-      result[key] = obj[key]
-    }
-  })
-  return result
+const inputChange = (key, arr) => {
+  const str = arr.length ? arr.join('_') : ''
+  emits('change', key, str)
 }
+// const route = useRoute()
+
+// const removeEmptyStringsAndReturnNew = (obj) => {
+//   const result = {}
+//   Object.keys(obj).forEach(function(key) {
+//     if (obj[key]) {
+//       result[key] = obj[key]
+//     }
+//   })
+//   return result
+// }
  
-const params = reactive({})
-let query = reactive({})
+// const params = reactive({})
+// let query = reactive({})
 
-if (route.query?.content) {
-  query['content'] = route.query.content
-  emits('conditionFilterChange')
-}
+// if (route.query?.content) {
+//   query['content'] = route.query.content
+//   emits('change')
+// }
 
-const inputChange = (key, { values, isEmit}) => {
-  params[key] = values
-  query[key] = Array.isArray(values) ? values.join('_') : values
-  query = removeEmptyStringsAndReturnNew(query)
-  if (isEmit) emits('conditionFilterChange', query.value)
-}
-const getQuery = () => {
-  return query
-}
-defineExpose({ getQuery, params })
+// const inputChange = (key, { values }) => {
+//   params[key] = values
+//   query[key] = Array.isArray(values) ? values.join('_') : values
+//   query = removeEmptyStringsAndReturnNew(query)
+//   emits('change', query.value)
+// }
+// const getQuery = () => {
+//   return query
+// }
+// defineExpose({ getQuery, params })
 </script>

+ 16 - 9
src/views/recruit/position/components/conditionFilter/JobType.vue

@@ -2,9 +2,9 @@
   <commonStyle :btnTitle="title" :close-on-content-click="false" v-if="show">
     <v-list>
       <v-list-item
-        color="primary"
-        :active="selectedItems.includes(item.value)"
         v-for="item in items" :key="item.id" :value="item.value"
+        :active="selectedItems.includes(item.value)"
+        color="primary"
         @click="handle(item.value)"
       >
         <template v-if="selectedItems.includes(item.value)" v-slot:append>
@@ -22,11 +22,18 @@ import { ref, defineEmits, inject } from 'vue';
 
 defineOptions({name: 'conditionFilter-JobType'})
 const emits = defineEmits(['inputChange'])
+const query = inject('routeQuery')
+const props = defineProps({
+  positionIndexPage: { // 职位检索
+    type: Boolean,
+    default: false
+  }
+})
+
+const title = ref('求职类型')
 let show = ref(false)
 let items = ref()
 const selectedItems = ref([])
-const title = ref('求职类型')
-const query = inject('routeQuery')
 
 getDict('menduner_job_type').then(({ data }) => {
   data = data?.length && data || []
@@ -36,22 +43,22 @@ getDict('menduner_job_type').then(({ data }) => {
     const str = query.jobType.split(',')[0]
     const arr = str.split('_')
     if (arr?.length) {
-      title.value = `求职类型(${arr.length})`
       selectedItems.value = arr
-      emits('inputChange', { values: selectedItems.value, isEmit: true })
+      title.value = selectedItems.value.length ? `求职类型(${selectedItems.value.length})` : '求职类型'
+      if (!props.positionIndexPage) emits('inputChange', { values: selectedItems.value, isEmit: true })
     }
   }
   show.value = true
 })
 const handle = (val) => {
   if (selectedItems.value.includes(val)) {
-    title.value = '求职类型'
     selectedItems.value = selectedItems.value.filter(i => i !== val)
   } else {
-    title.value = '求职类型(1)'
     selectedItems.value.push(val)
   }
-  emits('inputChange', { values: selectedItems.value, isEmit: true })
+  title.value = selectedItems.value.length ? `求职类型(${selectedItems.value.length})` : '求职类型'
+  if (props.positionIndexPage) emits('inputChange', selectedItems.value)
+  else emits('inputChange', { values: selectedItems.value, isEmit: true })
 }
 </script>
 <style lang="scss" scoped>

+ 12 - 6
src/views/recruit/position/components/conditionFilter/educationType.vue

@@ -20,20 +20,25 @@ import commonStyle from './commonStyle.vue'
 import { getDict } from '@/hooks/web/useDictionaries'
 import { ref, defineEmits, inject } from 'vue';
 defineOptions({name: 'conditionFilter-educationType'})
+const emits = defineEmits(['inputChange'])
+const query = inject('routeQuery')
 
 const props = defineProps({
   isSingle: {
     type: Boolean,
     default: false
+  },
+  positionIndexPage: { // 职位检索
+    type: Boolean,
+    default: false
   }
 })
 
-const show = ref(false)
-const query = inject('routeQuery')
 const title = ref('学历要求')
-const emits = defineEmits(['inputChange'])
+const show = ref(false)
 let items = ref()
 const selectedItems = ref([])
+
 getDict('menduner_education_type').then(({ data }) => {
   data = data?.length && data || []
   items.value = data
@@ -42,8 +47,8 @@ getDict('menduner_education_type').then(({ data }) => {
     const arr = str.split('_')
     if (arr?.length) {
       selectedItems.value = arr
-      title.value = `学历要求(${arr.length})`
-      emits('inputChange', { values: selectedItems.value, isEmit: true })
+      title.value = selectedItems.value.length ? `学历要求(${selectedItems.value.length})` : '学历要求'
+      if (!props.positionIndexPage) emits('inputChange', { values: selectedItems.value, isEmit: true })
     }
   }
   show.value = true
@@ -61,7 +66,8 @@ const handle = (val) => {
     } else selectedItems.value.push(val)
     title.value = selectedItems.value.length ? `学历要求(${selectedItems.value.length})` : '学历要求'
   }
-  emits('inputChange', { values: selectedItems.value, isEmit: true })
+  if (props.positionIndexPage) emits('inputChange', selectedItems.value)
+  else emits('inputChange', { values: selectedItems.value, isEmit: true })
 }
 </script>
 <style lang="scss" scoped>

+ 16 - 9
src/views/recruit/position/components/conditionFilter/expType.vue

@@ -21,19 +21,23 @@ import { getDict } from '@/hooks/web/useDictionaries'
 import { ref, defineEmits, inject } from 'vue';
 
 defineOptions({name: 'conditionFilter-expType'})
+const emits = defineEmits(['inputChange'])
+const query = inject('routeQuery')
 const props = defineProps({
   isSingle: {
     type: Boolean,
     default: false
+  },
+  positionIndexPage: { // 职位检索
+    type: Boolean,
+    default: false
   }
 })
-
-const show = ref(false)
-const query = inject('routeQuery')
 const title = ref('工作经验')
-const emits = defineEmits(['inputChange'])
+const show = ref(false)
 let items = ref()
 const selectedItems = ref([])
+
 getDict('menduner_exp_type').then(({ data }) => {
   data = data?.length && data || []
   items.value = data
@@ -41,9 +45,9 @@ getDict('menduner_exp_type').then(({ data }) => {
     const str = query.expType.split(',')[0]
     const arr = str.split('_')
     if (arr?.length) {
-      title.value = `工作经验(${arr.length})`
       selectedItems.value = arr
-      emits('inputChange', { values: selectedItems.value, isEmit: true })
+      title.value = selectedItems.value.length ? `工作经验(${selectedItems.value.length})` : '工作经验'
+      if (!props.positionIndexPage) emits('inputChange', { values: selectedItems.value, isEmit: true })
     }
   }
   show.value = true
@@ -53,7 +57,7 @@ const handle = (val) => {
   if (props.isSingle) {
     // 单选
     selectedItems.value = obj ? [] : [val]
-    title.value = (obj || val === '2') ? '工作经验' : '工作经验(1)'
+    // title.value = (obj || val === '2') ? '工作经验' : '工作经验(1)'
   } else {
     // 多选 
     if (obj) {
@@ -66,9 +70,12 @@ const handle = (val) => {
       // 当经验不限已存在时还选中其它项,把经验不限给清掉
       if (val !== '2' && selectedItems.value.find(k => k === '2')) selectedItems.value = selectedItems.value.filter(i => i !== '2')
     }
-    title.value = val === '2' ? '工作经验' : (selectedItems.value.length ? `工作经验(${selectedItems.value.length})` : '工作经验')
+    // title.value = val === '2' ? '工作经验' : (selectedItems.value.length ? `工作经验(${selectedItems.value.length})` : '工作经验')
+    title.value = selectedItems.value.length ? `工作经验(${selectedItems.value.length})` : '工作经验'
+
   }
-  emits('inputChange', { values: selectedItems.value, isEmit: true })
+  if (props.positionIndexPage) emits('inputChange', selectedItems.value)
+  else emits('inputChange', { values: selectedItems.value, isEmit: true })
 }
 </script>
 

+ 19 - 9
src/views/recruit/position/components/conditionFilter/financingStatus.vue

@@ -20,12 +20,18 @@ import commonStyle from './commonStyle.vue'
 import { getDict } from '@/hooks/web/useDictionaries'
 import { ref, defineEmits, inject } from 'vue';
 defineOptions({name: 'conditionFilter-financingStatus'})
-
 const emits = defineEmits(['inputChange'])
-let items = ref()
-const show = ref(false)
 const query = inject('routeQuery')
+const props = defineProps({
+  positionIndexPage: { // 职位检索
+    type: Boolean,
+    default: false
+  }
+})
+
 const title = ref('融资阶段')
+let show = ref(false)
+let items = ref()
 const selectedItems = ref([])
 
 getDict('menduner_financing_status').then(({ data }) => {
@@ -36,17 +42,21 @@ getDict('menduner_financing_status').then(({ data }) => {
     const arr = str.split('_')
     if (arr?.length) {
       selectedItems.value = arr
-      title.value = `融资阶段(${arr.length})`
-      emits('inputChange', { values: selectedItems.value, isEmit: true })
+      title.value = selectedItems.value.length ? `融资阶段(${selectedItems.value.length})` : '融资阶段'
+      if (!props.positionIndexPage) emits('inputChange', { values: selectedItems.value, isEmit: true })
     }
   }
   show.value = true
 })
 const handle = (val) => {
-  if (selectedItems.value.includes(val)) selectedItems.value = selectedItems.value.filter(i => i !== val)
-  else selectedItems.value.push(val)
-  title.value = selectedItems.value.length ? `融资阶段(${selectedItems.value.length})` : '融资阶段'
-  emits('inputChange', { values: selectedItems.value, isEmit: true })
+  if (selectedItems.value.includes(val)) {
+    selectedItems.value = selectedItems.value.filter(i => i !== val)
+  } else {
+    selectedItems.value.push(val)
+  }
+  title.value = selectedItems.value.length ? `融资阶段(${selectedItems.value.length})` : '融资阶段'
+  if (props.positionIndexPage) emits('inputChange', selectedItems.value)
+  else emits('inputChange', { values: selectedItems.value, isEmit: true })
 }
 </script>
 <style lang="scss" scoped>

+ 14 - 7
src/views/recruit/position/components/conditionFilter/payScope.vue

@@ -20,32 +20,39 @@ import commonStyle from './commonStyle.vue'
 import { getDict } from '@/hooks/web/useDictionaries'
 import { ref, defineEmits, inject } from 'vue';
 defineOptions({name: 'conditionFilter-payScope'})
-
-const show = ref(false)
+const emits = defineEmits(['inputChange'])
 const query = inject('routeQuery')
+const props = defineProps({
+  positionIndexPage: { // 职位检索
+    type: Boolean,
+    default: false
+  }
+})
+
 const title = ref('薪资待遇')
-const emits = defineEmits(['inputChange'])
+const show = ref(false)
 let items = ref()
 let selectedItems = ref([])
+
 getDict('menduner_pay_scope').then(({ data }) => {
   data = data?.length && data || []
   items.value = data
   if (query && query.payType) {
     title.value = '薪资待遇(1)'
     selectedItems.value = [query.payType]
-    emits('inputChange', { values: selectedItems.value, isEmit: true })
+    if (!props.positionIndexPage) emits('inputChange', { values: selectedItems.value, isEmit: true })
   }
   show.value = true
 })
 const handle = (val) => {
   if (selectedItems.value.includes(val)) {
-    title.value = '薪资待遇'
     selectedItems.value = selectedItems.value.filter(i => i !== val)
   } else {
-    title.value = '薪资待遇(1)'
     selectedItems.value = [val]
   }
-  emits('inputChange', { values: selectedItems.value, isEmit: true })
+  title.value = selectedItems.value.length ? `薪资待遇(${selectedItems.value.length})` : '薪资待遇'
+  if (props.positionIndexPage) emits('inputChange', selectedItems.value)
+  else emits('inputChange', { values: selectedItems.value, isEmit: true })
 }
 </script>
 <style lang="scss" scoped>

+ 18 - 8
src/views/recruit/position/components/conditionFilter/scale.vue

@@ -22,10 +22,16 @@ import { getDict } from '@/hooks/web/useDictionaries'
 import { ref, defineEmits, inject } from 'vue';
 defineOptions({name: 'conditionFilter-scale'})
 const emits = defineEmits(['inputChange'])
-
-const show = ref(false)
 const query = inject('routeQuery')
+const props = defineProps({
+  positionIndexPage: { // 职位检索
+    type: Boolean,
+    default: false
+  }
+})
+
 const title = ref('公司规模')
+let show = ref(false)
 let items = ref()
 const selectedItems = ref([])
 
@@ -37,17 +43,21 @@ getDict('menduner_scale').then(({ data }) => {
     const arr = str.split('_')
     if (arr?.length) {
       selectedItems.value = arr
-      title.value = `公司规模(${arr.length})`
-      emits('inputChange', { values: selectedItems.value, isEmit: true })
+      title.value = selectedItems.value.length ? `公司规模(${selectedItems.value.length})` : '公司规模'
+      if (!props.positionIndexPage) emits('inputChange', { values: selectedItems.value, isEmit: true })
     }
   }
   show.value = true
 })
 const handle = (val) => {
-  if (selectedItems.value.includes(val)) selectedItems.value = selectedItems.value.filter(i => i !== val)
-  else selectedItems.value.push(val)
-  title.value = selectedItems.value.length ? `公司规模(${selectedItems.value.length})` : '公司规模'
-  emits('inputChange', { values: selectedItems.value, isEmit: true })
+  if (selectedItems.value.includes(val)) {
+    selectedItems.value = selectedItems.value.filter(i => i !== val)
+  } else {
+    selectedItems.value.push(val)
+  }
+  title.value = selectedItems.value.length ? `公司规模(${selectedItems.value.length})` : '公司规模'
+  if (props.positionIndexPage) emits('inputChange', selectedItems.value)
+  else emits('inputChange', { values: selectedItems.value, isEmit: true })
 }
 </script>
 <style lang="scss" scoped>

+ 70 - 71
src/views/recruit/position/index.vue

@@ -3,13 +3,14 @@
   <div class="default-width">
     <div class="py-3" style="z-index: 998; background-color: #fff">
       <div class="stickyBox">
-        <headSearch 
-          @handleJobClick="val => dealParams(val, 'positionId')" 
-          @handleSearch="val => dealParams(val, 'content')"
+        <headSearch
+          v-model="headSearchText"
+          text="中国"
+          @handleSearch="val => handleMounted('content', val)"
         ></headSearch>
       </div>
-      <cityFilter class="mx-5 mb-3" ref="cityFilterRef" @updateCheckedInput="handleMounted"></cityFilter>
-      <conditionFilter class="mx-5 mb-3" ref="conditionFilterRef" @conditionFilterChange="handleMounted"></conditionFilter>
+      <cityFilter class="mx-5 mb-3" ref="cityFilterRef" @change="handleMounted"></cityFilter>
+      <conditionFilter class="mx-5 mb-3" ref="conditionFilterRef" @change="handleMounted"></conditionFilter>
     </div>
     <div class="d-flex mt-3">
       <div class="mr-3" style="min-width: 884px;">
@@ -37,7 +38,7 @@ import PositionLongStrip from '@/components/PositionLongStrip/item.vue'
 import Empty from '@/components/Empty'
 import { getJobAdvertisedSearch } from '@/api/position'
 import CtPagination from '@/components/CtPagination'
-import { provide, reactive, ref, nextTick } from 'vue'
+import { provide, reactive, ref } from 'vue'
 import { dealDictObjData } from '@/views/recruit/position/components/dict'
 
 import { useRoute, useRouter } from 'vue-router'
@@ -48,15 +49,39 @@ const cityFilterRef = ref(); const conditionFilterRef = ref()
 const pageInfo = { pageNo: 1, pageSize: 20}
 const items = ref([])
 const total = ref(0)
-const routeQuery = (route?.query && route.query && Object.keys(route?.query).length) ? route.query : null
+// const routeQuery = (route?.query && route.query && Object.keys(route?.query).length) ? route.query : null
+let routeQuery = (route?.query && route.query && Object.keys(route?.query).length) ? reactive(route.query) : reactive({})
 provide('routeQuery', routeQuery)
 
-let pageReqVO = reactive({
-  ...pageInfo
-})
+const headSearchText = ref(routeQuery?.content || '')
+// let pageReqVO = reactive({
+//   ...pageInfo
+// })
 
 // 职位搜索
-const getPositionList = async () => {
+const getData = async () => {
+  const pageReqVO = { ...pageInfo }
+  // route.query参数
+  if (routeQuery && Object.keys(routeQuery).length) {
+    const passingStrings = ['content'] // 传递字符串
+    Object.keys(routeQuery).forEach(key => {
+      if (key === 'city') { // 工作地区id集合,示例值([])
+        const city = routeQuery[key]
+        const areaIds = []
+        const levelCountArr = city.split('__')
+        levelCountArr?.forEach(levelIds => {
+          const idArr = levelIds.split('_')
+          if (idArr?.length) {
+            idArr.forEach(idItem => areaIds.push(idItem))
+          }
+        })
+        pageReqVO.areaIds = areaIds
+      }
+      else if (passingStrings.includes(key)) pageReqVO[key] = routeQuery[key] // 传给后端字符串
+      else pageReqVO[key] = routeQuery[key].split('_') // 传给后端Arr
+    })
+  }
+  // console.log('pageReqVO', pageReqVO)
   const { list, total: number } = await getJobAdvertisedSearch(pageReqVO)
   items.value = list.map(e => {
     e.job = { ...e.job, ...dealDictObjData({}, e.job) }
@@ -65,76 +90,50 @@ const getPositionList = async () => {
   })
   total.value = number
 }
+getData()
 
-const removeEmptyStringsAndReturnNew = (obj) => {
-  const result = {}
-  Object.keys(obj).forEach(function(key) {
-    if (obj[key]) {
-      result[key] = obj[key]
-    }
-  })
-  return result
-}
-const updateRouteQuery = (val, key) => {
-  const queryObj = { cityFilter: {}, conditionFilter: {} }
-  if (cityFilterRef.value?.getQuery) {
-    queryObj.cityFilter = removeEmptyStringsAndReturnNew(cityFilterRef.value?.getQuery())
-  }
-  if (conditionFilterRef.value?.getQuery) {
-    const objData = conditionFilterRef.value?.getQuery()
-    if (val && key) objData[key] = val
-    queryObj.conditionFilter = removeEmptyStringsAndReturnNew(objData)
-  }
-  let queryArr = []
-  if (queryObj) {
-    Object.keys(queryObj)?.forEach(_k => {
-      const newObj = queryObj[_k]
-      if (newObj) {
-        const arr = Object.keys(newObj).map(itemKey => {
-          return `${itemKey}=${newObj[itemKey]}`
-        })
-        if (arr?.length) queryArr = [ ...queryArr, ...arr]
-      }
-    })
-  }
-  const str = queryArr?.join('&')
-  if (str) router.push(`${route.path}?${str}`)
-  handleSearchPosition(val, key)
+// 刷新路由
+const updateRouter = () => {
+  const str = Object.keys(routeQuery).length ? Object.keys(routeQuery).reduce((res, _key) => {
+    if (routeQuery[_key] !== '') res += `${res ? '&' : ''}${_key}=${routeQuery[_key]}`
+    return res
+  }, '') : ''
+  // console.log('route.path', str)
+  // const str1 = "city=1__140000__140300__140321_140322_140303&jobType=1_3_0"
+  router.push(`${route.path}?${str}`)
+  // router.push(`${route.path}?${str1}`)
+  getData()
 }
 
-const handleMounted = (key, val) => {
-  nextTick(() => {
-    updateRouteQuery(key, val)
-  })
+const handleMounted = (key, val) => { // val为字符串,数组的话用_下划线分隔
+  routeQuery[key] = val
+  // console.log('routeQuery', key, val)
+  updateRouter()
 }
 
-// 职位搜索
-const handleSearchPosition = () => {
-  const conditionParams = conditionFilterRef.value?.params
-  const cityParams = cityFilterRef.value?.getQuery
-  pageReqVO = { ...pageReqVO, ...conditionParams, ...cityParams, content: pageReqVO.content }
-  getPositionList()
-}
+// // 职位搜索
+// const handleSearchPosition = () => {
+//   // const conditionParams = conditionFilterRef.value?.params
+//   // const cityParams = cityFilterRef.value?.getQuery
+//   // pageReqVO = { ...pageReqVO, ...conditionParams, ...cityParams, content: pageReqVO.content }
+//   pageReqVO = { ...pageReqVO }
+//   getData()
+// }
 
-// 职位类型、关键字
-const dealParams = (val, key) => {
-  pageReqVO[key] = val
-  handleMounted(val, key)
-}
 
-// 刷新后有参数则进行搜索
-if (routeQuery) {
-  for (let i in routeQuery) {
-    if (routeQuery[i].indexOf('_') !== -1) pageReqVO[i] = routeQuery[i].split('_')
-    else pageReqVO[i] = routeQuery[i]
-  }
-  if (routeQuery.content) handleMounted(routeQuery.content, 'content')
-  getPositionList()
-} else getPositionList()
+// // 刷新后有参数则进行搜索
+// if (routeQuery) {
+//   for (let i in routeQuery) {
+//     if (routeQuery[i].indexOf('_') !== -1) pageReqVO[i] = routeQuery[i].split('_')
+//     else pageReqVO[i] = routeQuery[i]
+//   }
+//   if (routeQuery.content) handleMounted(routeQuery.content, 'content')
+//   getData()
+// } else getData()
 
 // 分页
 const handleChangePage = (index) => {
   pageInfo.pageNo = index
-  getPositionList()
+  getData()
 }
 </script>