Browse Source

Merge branch 'master' of http://39.98.153.250:9080/bowintek/EmploymentSite

pengjing 10 months ago
parent
commit
79bcf68845
33 changed files with 1922 additions and 340 deletions
  1. 81 0
      h5app/src/App.vue
  2. 26 0
      h5app/src/api/recommendmgt/index.ts
  3. 1 86
      h5app/src/components/industrySelection.vue
  4. 1 86
      h5app/src/components/ocCategorySelection.vue
  5. 2 87
      h5app/src/components/postSelection.vue
  6. 158 0
      h5app/src/components/postSelectionLike.vue
  7. 303 0
      h5app/src/components/workCategorySelection.vue
  8. 0 2
      h5app/src/plugins/ionic.ts
  9. 46 8
      h5app/src/views/pages/company/editPost.vue
  10. 17 5
      h5app/src/views/pages/jobUserInfo/jobHuntEdit.vue
  11. 44 6
      h5app/src/views/pages/jobUserInfo/postEdit.vue
  12. 18 5
      h5app/src/views/pages/jobhunt/jobHuntEdit.vue
  13. 19 11
      h5app/src/views/pages/post/edit.vue
  14. 1 0
      src/main/java/com/hz/employmentsite/config/WebConfiguration.java
  15. 15 0
      src/main/java/com/hz/employmentsite/controller/jobUserManager/RecommendMgtController.java
  16. 38 0
      src/main/java/com/hz/employmentsite/controller/jobUserManager/WorkCategoryController.java
  17. 30 0
      src/main/java/com/hz/employmentsite/mapper/PcWorkcategoryMapper.java
  18. 33 26
      src/main/java/com/hz/employmentsite/mapper/cquery/RecommendMgtCQuery.java
  19. 53 0
      src/main/java/com/hz/employmentsite/model/PcWorkcategory.java
  20. 529 0
      src/main/java/com/hz/employmentsite/model/PcWorkcategoryExample.java
  21. 37 0
      src/main/java/com/hz/employmentsite/services/impl/companyService/PostServiceImpl.java
  22. 20 0
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/RecommendMgtServiceImpl.java
  23. 60 0
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/WorkCategoryServiceImpl.java
  24. 4 0
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/RecommendMgtService.java
  25. 13 0
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/WorkCategoryService.java
  26. 2 0
      src/main/java/com/hz/employmentsite/vo/companyService/PostVo.java
  27. 1 0
      src/main/java/com/hz/employmentsite/vo/jobUserManager/ProfessionLevel.java
  28. 9 0
      src/main/java/com/hz/employmentsite/vo/jobUserManager/WorkCategoryLevel.java
  29. 1 0
      src/main/resources/generatorConfig.xml
  30. 213 0
      src/main/resources/mapping/PcWorkcategoryMapper.xml
  31. 2 1
      src/main/resources/mapping/cquery/PostCQuery.xml
  32. 50 6
      src/main/resources/mapping/cquery/RecommendMgtCQuery.xml
  33. 95 11
      vue/src/views/companyService/post/edit.vue

+ 81 - 0
h5app/src/App.vue

@@ -411,4 +411,85 @@ ion-grid {
 }
 
 
+.cascade-model{
+  --height: 50%;
+  --border-radius: 16px;
+  --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+
+
+  ::part(backdrop) {
+    background: rgba(209, 213, 219);
+    opacity: 1;
+  }
+
+  ion-toolbar {
+    --background: white;
+    --color: white;
+    padding-left: 0 !important;
+    padding-right: 0 !important;
+    --padding-start: 0;
+    --padding-end: 0;
+  }
+
+  ion-toolbar ion-item:first-child {
+    --inner-border-width: 0 0 0 0;
+    text-align: center;
+  }
+
+  ion-toolbar ion-item:last-child {
+    --padding-start: 0;
+    --inner-padding-end: 0;
+  }
+
+  ion-segment {
+    width: 100%;
+    --background: #ffffff;
+  }
+
+  ion-segment-button {
+    --indicator-color: rgba(254, 255, 255, 0.97);
+    --color: #000000;
+    --color-checked: #1a65eb;
+    --background-hover: rgba(47, 107, 215, 0.98);
+    --border-width: 0 0 0 0;
+    --indicator-box-shadow: 0 0 0 0;
+  }
+
+  /*!* Material Design styles *!*/
+  /*ion-segment-button.md {*/
+  /*  --color: #000;*/
+  /*  --color-checked: #1a65eb;*/
+  /*  --border-radius: 0px;*/
+  /*  --border-width: 0 0 0 0;*/
+  /*}*/
+
+  /*!* iOS styles *!*/
+  /*ion-segment-button.ios {*/
+  /*  --color: #000;*/
+  /*  --color-checked: #1a65eb;*/
+  /*  --border-radius: 0px;*/
+  /*  --border-width: 0 0 0 0;*/
+  /*}*/
+
+  .custom-scroll {
+    overflow-y: auto; /* 显示垂直滚动条 */
+    max-height: 200px; /* 设置最大高度,超出部分会出现滚动条 */
+  }
+
+  /* 可以根据需要自定义滚动条的样式 */
+  .custom-scroll::-webkit-scrollbar {
+    width: 8px;
+  }
+
+  .custom-scroll::-webkit-scrollbar-thumb {
+    background-color: #888;
+    border-radius: 4px;
+  }
+
+  .custom-scroll::-webkit-scrollbar-thumb:hover {
+    background-color: #555;
+  }
+
+}
+
 </style>

+ 26 - 0
h5app/src/api/recommendmgt/index.ts

@@ -91,6 +91,32 @@ export function getProfessionLevelList() {
     );
 }
 
+export function getWorkCategoryLevelList() {
+    return request<object>(
+        {
+            url: "jobusermgr/recommendmgt/getWorkCategoryLevelList",
+            method: 'get',
+            params: null,
+        },
+        {
+            isNew: true,
+        },
+    );
+}
+
+export function getProfessionLikeList(params: any) {
+    return request<any>(
+        {
+            url: "jobusermgr/recommendmgt/getProfessionLikeList",
+            method: 'get',
+            params: params,
+        },
+        {
+            isNew: true,
+        },
+    );
+}
+
 
 export function getOccupationCategoryList() {
     return request<object>(

+ 1 - 86
h5app/src/components/industrySelection.vue

@@ -1,94 +1,9 @@
-<style>
-ion-modal {
-  --height: 50%;
-  --border-radius: 16px;
-  --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
-}
-
-ion-modal::part(backdrop) {
-  background: rgba(209, 213, 219);
-  opacity: 1;
-}
-
-ion-modal ion-toolbar {
-  --background: white;
-  --color: white;
-}
-
-ion-toolbar {
-  padding-left: 0 !important;
-  padding-right: 0 !important;
-  --padding-start: 0;
-  --padding-end: 0;
-}
-
-ion-toolbar ion-item:first-child {
-  --inner-border-width: 0 0 0 0;
-  text-align: center;
-}
-
-ion-toolbar ion-item:last-child {
-  --padding-start: 0;
-  --inner-padding-end: 0;
-}
-
-ion-segment {
-  width: 100%;
-  --background: #ffffff;
-}
-
-ion-segment-button {
-  --indicator-color: rgba(254, 255, 255, 0.97);
-  --color: #000000;
-  --color-checked: #1a65eb;
-  --background-hover: rgba(47, 107, 215, 0.98);
-  --border-width: 0 0 0 0;
-  --indicator-box-shadow: 0 0 0 0;
-}
-
-/*!* Material Design styles *!*/
-/*ion-segment-button.md {*/
-/*  --color: #000;*/
-/*  --color-checked: #1a65eb;*/
-/*  --border-radius: 0px;*/
-/*  --border-width: 0 0 0 0;*/
-/*}*/
-
-/*!* iOS styles *!*/
-/*ion-segment-button.ios {*/
-/*  --color: #000;*/
-/*  --color-checked: #1a65eb;*/
-/*  --border-radius: 0px;*/
-/*  --border-width: 0 0 0 0;*/
-/*}*/
-
-.custom-scroll {
-  overflow-y: auto; /* 显示垂直滚动条 */
-  max-height: 200px; /* 设置最大高度,超出部分会出现滚动条 */
-}
-
-/* 可以根据需要自定义滚动条的样式 */
-.custom-scroll::-webkit-scrollbar {
-  width: 8px;
-}
-
-.custom-scroll::-webkit-scrollbar-thumb {
-  background-color: #888;
-  border-radius: 4px;
-}
-
-.custom-scroll::-webkit-scrollbar-thumb:hover {
-  background-color: #555;
-}
-
-</style>
-
 <template>
   <ion-button id="open-modal" style="color: #02a6f1;font-size: 15px;" fill="clear" @click="loadIndustryID">选择
   </ion-button>
   <ion-page>
     <ion-content class="ion-padding">
-      <ion-modal trigger="open-modal" :backdrop-dismiss="false" :is-open="isOpen" :initial-breakpoint="1"
+      <ion-modal class="cascade-model" trigger="open-modal" :backdrop-dismiss="false" :is-open="isOpen" :initial-breakpoint="1"
                  :breakpoints="[0, 1]">
         <ion-toolbar>
           <ion-item>

+ 1 - 86
h5app/src/components/ocCategorySelection.vue

@@ -1,94 +1,9 @@
-<style>
-ion-modal {
-  --height: 50%;
-  --border-radius: 16px;
-  --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
-}
-
-ion-modal::part(backdrop) {
-  background: rgba(209, 213, 219);
-  opacity: 1;
-}
-
-ion-modal ion-toolbar {
-  --background: white;
-  --color: white;
-}
-
-ion-toolbar {
-  padding-left: 0 !important;
-  padding-right: 0 !important;
-  --padding-start: 0;
-  --padding-end: 0;
-}
-
-ion-toolbar ion-item:first-child {
-  --inner-border-width: 0 0 0 0;
-  text-align: center;
-}
-
-ion-toolbar ion-item:last-child {
-  --padding-start: 0;
-  --inner-padding-end: 0;
-}
-
-ion-segment {
-  width: 100%;
-  --background: #ffffff;
-}
-
-ion-segment-button {
-  --indicator-color: rgba(254, 255, 255, 0.97);
-  --color: #000000;
-  --color-checked: #1a65eb;
-  --background-hover: rgba(47, 107, 215, 0.98);
-  --border-width: 0 0 0 0;
-  --indicator-box-shadow: 0 0 0 0;
-}
-
-/*!* Material Design styles *!*/
-/*ion-segment-button.md {*/
-/*  --color: #000;*/
-/*  --color-checked: #1a65eb;*/
-/*  --border-radius: 0px;*/
-/*  --border-width: 0 0 0 0;*/
-/*}*/
-
-/*!* iOS styles *!*/
-/*ion-segment-button.ios {*/
-/*  --color: #000;*/
-/*  --color-checked: #1a65eb;*/
-/*  --border-radius: 0px;*/
-/*  --border-width: 0 0 0 0;*/
-/*}*/
-
-.custom-scroll {
-  overflow-y: auto; /* 显示垂直滚动条 */
-  max-height: 200px; /* 设置最大高度,超出部分会出现滚动条 */
-}
-
-/* 可以根据需要自定义滚动条的样式 */
-.custom-scroll::-webkit-scrollbar {
-  width: 8px;
-}
-
-.custom-scroll::-webkit-scrollbar-thumb {
-  background-color: #888;
-  border-radius: 4px;
-}
-
-.custom-scroll::-webkit-scrollbar-thumb:hover {
-  background-color: #555;
-}
-
-</style>
-
 <template>
   <ion-button id="open-modal" style="color: #02a6f1;font-size: 15px;" fill="clear" @click="loadOccupationalID">选择
   </ion-button>
   <ion-page>
     <ion-content class="ion-padding">
-      <ion-modal trigger="open-modal" :backdrop-dismiss="false" :is-open="isOpen" :initial-breakpoint="1"
+      <ion-modal class="cascade-model" trigger="open-modal" :backdrop-dismiss="false" :is-open="isOpen" :initial-breakpoint="1"
                  :breakpoints="[0, 1]">
         <ion-toolbar>
           <ion-item>

+ 2 - 87
h5app/src/components/postSelection.vue

@@ -1,94 +1,9 @@
-<style>
-ion-modal {
-  --height: 50%;
-  --border-radius: 16px;
-  --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
-}
-
-ion-modal::part(backdrop) {
-  background: rgba(209, 213, 219);
-  opacity: 1;
-}
-
-ion-modal ion-toolbar {
-  --background: white;
-  --color: white;
-}
-
-ion-toolbar {
-  padding-left: 0 !important;
-  padding-right: 0 !important;
-  --padding-start: 0;
-  --padding-end: 0;
-}
-
-ion-toolbar ion-item:first-child {
-  --inner-border-width: 0 0 0 0;
-  text-align: center;
-}
-
-ion-toolbar ion-item:last-child {
-  --padding-start: 0;
-  --inner-padding-end: 0;
-}
-
-ion-segment {
-  width: 100%;
-  --background: #ffffff;
-}
-
-ion-segment-button {
-  --indicator-color: rgba(254, 255, 255, 0.97);
-  --color: #000000;
-  --color-checked: #1a65eb;
-  --background-hover: rgba(47, 107, 215, 0.98);
-  --border-width: 0 0 0 0;
-  --indicator-box-shadow: 0 0 0 0;
-}
-
-/*!* Material Design styles *!*/
-/*ion-segment-button.md {*/
-/*  --color: #000;*/
-/*  --color-checked: #1a65eb;*/
-/*  --border-radius: 0px;*/
-/*  --border-width: 0 0 0 0;*/
-/*}*/
-
-/*!* iOS styles *!*/
-/*ion-segment-button.ios {*/
-/*  --color: #000;*/
-/*  --color-checked: #1a65eb;*/
-/*  --border-radius: 0px;*/
-/*  --border-width: 0 0 0 0;*/
-/*}*/
-
-.custom-scroll {
-  overflow-y: auto; /* 显示垂直滚动条 */
-  max-height: 200px; /* 设置最大高度,超出部分会出现滚动条 */
-}
-
-/* 可以根据需要自定义滚动条的样式 */
-.custom-scroll::-webkit-scrollbar {
-  width: 8px;
-}
-
-.custom-scroll::-webkit-scrollbar-thumb {
-  background-color: #888;
-  border-radius: 4px;
-}
-
-.custom-scroll::-webkit-scrollbar-thumb:hover {
-  background-color: #555;
-}
-
-</style>
-
 <template>
   <ion-button id="open-modal" style="color: #02a6f1;font-size: 15px;" fill="clear" @click="loadProfessionInfo">选择
   </ion-button>
-  <ion-page>
+  <ion-page >
     <ion-content class="ion-padding">
-      <ion-modal trigger="open-modal" :backdrop-dismiss="false" @willPresent="onRest()" :is-open="isOpen" :initial-breakpoint="1"
+      <ion-modal class="cascade-model" trigger="open-modal" :backdrop-dismiss="false" @willPresent="onRest()" :is-open="isOpen" :initial-breakpoint="1"
                  :breakpoints="[0, 1]">
         <ion-toolbar>
           <ion-item>

+ 158 - 0
h5app/src/components/postSelectionLike.vue

@@ -0,0 +1,158 @@
+<template>
+  <ion-button id="postSelectionLike" style="color: #02a6f1;font-size: 15px;" fill="clear" @click="onOpen">选择
+  </ion-button>
+  <ion-page>
+    <ion-content class="ion-padding">
+      <ion-modal trigger="postSelectionLike" :is-open="isOpen" @willPresent="onRest">
+        <ion-header class="header-theme2">
+          <ion-toolbar>
+            <ion-buttons slot="start">
+              <ion-icon :icon="arrowBackOutline" @click="onOpen"></ion-icon>
+            </ion-buttons>
+            <ion-title>岗位名称</ion-title>
+            <ion-buttons slot="end">
+              <ion-button fill="clear" @click="onConfirm">确定</ion-button>
+            </ion-buttons>
+          </ion-toolbar>
+        </ion-header>
+        <ion-content class="ion-padding">
+          <ion-item class="search-item" style="--border-style: unset; --inner-padding-end: 0px;--padding-start: 0px;">
+            <ion-input placeholder="岗位名称" class="custom"
+                       v-model="searchParams.professionName"
+                       @input="reload" :clear-on-edit="true"
+                       style="border: 1px solid #f2f2f5;border-radius: 14px;--padding-start: 10px;height: 35px;">
+              <ion-icon slot="start" :icon="searchOutline" aria-hidden="true"></ion-icon>
+            </ion-input>
+          </ion-item>
+          <div class="bw-vue-list">
+            <div class="list-content">
+              <ion-list>
+                <ion-item v-for="(record,key) in dataList" :key="key">
+                  <ion-label @click="onSelect(record)" >
+                    <span v-html="formatStr(record.professionName)"></span>({{record.parentProfessionName}})
+                  </ion-label>
+                </ion-item>
+              </ion-list>
+              <b-empty v-if="dataList.length<=0" :loading="loading"/>
+              <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
+                <ion-infinite-scroll-content
+                    :loadingText="pagination.total>pagination.current*pagination.pageSize?'正在加载...':'暂无更多'"
+                    loadingSpinner="bubbles">
+                </ion-infinite-scroll-content>
+              </ion-infinite-scroll>
+            </div>
+          </div>
+        </ion-content>
+      </ion-modal>
+    </ion-content>
+  </ion-page>
+</template>
+
+<script lang="ts">
+
+import {computed, defineComponent, reactive, ref} from 'vue';
+import {arrowBackOutline, searchOutline} from 'ionicons/icons';
+import {IonIcon} from '@ionic/vue';
+import BEmpty from "@/components/empty.vue";
+import {getProfessionLikeList} from "@/api/recommendmgt";
+
+export default defineComponent({
+  name: 'postSelectLike',
+  components: {IonIcon, BEmpty},
+  props: {},
+  setup(props, context) {
+    const total = ref(20);
+    const loading = ref(true);
+    const pagination = computed(() => ({
+      total: total,
+      current: searchParams.pageIndex,
+      pageSize: searchParams.pageSize
+    }));
+    const searchParams = reactive({
+      pageIndex: 1,
+      pageSize: 10,
+      professionName: '',
+    });
+    const isOpen = ref(false);
+    const dataList = ref<any>([]);
+    const resultInfo = reactive({value: '', text: ''})
+
+    const loadData = async function () {
+      loading.value = true;
+      getProfessionLikeList(searchParams).then(data => {
+        dataList.value = dataList.value.concat(data.list);
+        total.value = data.total;
+      })
+      loading.value = false;
+    }
+
+    const reload = () => {
+      dataList.value = [];
+      searchParams.pageIndex = 1;
+      loadData();
+    }
+
+    const onScroll = (e: any) => {
+      setTimeout(() => {
+        e.target.complete();
+        if (pagination.value.total.value > pagination.value.current * pagination.value.pageSize) {
+          searchParams.pageIndex += 1;
+          loadData();
+        }
+      }, 500);
+    }
+
+    const onConfirm = () => {
+      resultInfo.text = searchParams.professionName;
+      context.emit("resultInfo", resultInfo);
+      onOpen();
+    }
+
+    const onSelect = (item: any) => {
+      resultInfo.text = item.professionName;
+      resultInfo.value = item.professionID;
+      context.emit("resultInfo", resultInfo);
+      onOpen();
+    }
+
+    const onOpen = () => {
+      isOpen.value = !isOpen.value;
+    }
+
+    const onRest = () => {
+      dataList.value = [];
+      searchParams.professionName = '';
+      searchParams.pageIndex = 1;
+      resultInfo.text = '';
+      resultInfo.value = '';
+    }
+
+    const formatStr = (str: any) => {
+      if(!str){
+        return "";
+      }
+
+      return str.replace(searchParams.professionName,'<span style="color: coral">'+searchParams.professionName+'</span>');
+    }
+
+    return {
+      searchOutline,
+      arrowBackOutline,
+      total,
+      loading,
+      isOpen,
+      dataList,
+      pagination,
+      searchParams,
+      onConfirm,
+      onSelect,
+      onOpen,
+      onScroll,
+      loadData,
+      reload,
+      onRest,
+      formatStr
+    }
+  }
+});
+</script>

+ 303 - 0
h5app/src/components/workCategorySelection.vue

@@ -0,0 +1,303 @@
+<template>
+  <ion-button id="open-modal" style="color: #02a6f1;font-size: 15px;" fill="clear" @click="loadWorkCategoryInfo">选择
+  </ion-button>
+  <ion-page >
+    <ion-content class="ion-padding">
+      <ion-modal class="cascade-model" trigger="open-modal" :backdrop-dismiss="false" @willPresent="onRest()" :is-open="isOpen" :initial-breakpoint="1"
+                 :breakpoints="[0, 1]">
+        <ion-toolbar>
+          <ion-item>
+            <ion-buttons slot="start">
+              <ion-button fill="clear" @click="onCancel">取消</ion-button>
+            </ion-buttons>
+            <ion-label style="font-size: 12px;white-space: pre-wrap; word-wrap: break-word;">
+              {{ selectWorkCategoryInfo.text }}
+            </ion-label>
+            <ion-buttons slot="end">
+              <ion-button fill="clear" :disabled="selectWorkCategoryInfo.value==''" @click="onConfirm">确定</ion-button>
+            </ion-buttons>
+          </ion-item>
+          <ion-item>
+            <ion-segment value="0">
+              <ion-segment-button v-for="(item,key) in selectModelList" :key="key" @click="onSelectType(item.index)"
+                                  :disabled="item.disabled" :value="item.index">
+                <ion-label :style="{color:item.isSelect?'#1a65eb':'#000000'}">{{ item.name }}</ion-label>
+              </ion-segment-button>
+            </ion-segment>
+          </ion-item>
+        </ion-toolbar>
+        <div class="bw-vue-list">
+          <div class="list-content">
+            <ion-list class="custom-scroll" v-show="selectModelList[selectType.one].isSelect">
+              <ion-item v-for="(item, index) in selectModelList[selectType.one].workCategoryList" :key="index">
+                <ion-label :style="{color:item.isSelect?'#1a65eb':'#000000'}"
+                           @click="onSelect(item,selectType.one)">
+                  {{ item.workCategoryName }}
+                </ion-label>
+              </ion-item>
+            </ion-list>
+            <ion-list class="custom-scroll" v-show="selectModelList[selectType.two].isSelect">
+              <ion-item v-for="(item, index) in selectModelList[selectType.two].workCategoryList" :key="index">
+                <ion-label :style="{color:item.isSelect?'#1a65eb':'#000000'}"
+                           @click="onSelect(item,selectType.two)">
+                  {{ item.workCategoryName }}
+                </ion-label>
+              </ion-item>
+            </ion-list>
+            <ion-list class="custom-scroll" v-show="selectModelList[selectType.three].isSelect">
+              <ion-item v-for="(item, index) in selectModelList[selectType.three].workCategoryList" :key="index">
+                <ion-label :style="{color:item.isSelect?'#1a65eb':'#000000'}"
+                           @click="onSelect(item,selectType.three)">
+                  {{ item.workCategoryName }}
+                </ion-label>
+              </ion-item>
+            </ion-list>
+          </div>
+        </div>
+      </ion-modal>
+    </ion-content>
+  </ion-page>
+</template>
+
+<script lang="ts">
+import {defineComponent, reactive, ref} from 'vue';
+import {getWorkCategoryLevelList} from "@/api/recommendmgt";
+
+export default defineComponent({
+  name: "workCategorySelection",
+  props: {
+    WorkCategoryID: {type: String, default: ''},
+  },
+  setup(props, context) {
+    const selectType = {
+      one: 0,
+      two: 1,
+      three: 2
+    }
+    const isOpen = ref(false);
+    const selectModelList = reactive([
+      {
+        index: 0,
+        name: '分类一',
+        isSelect: false,
+        disabled: true,
+        workCategoryName: '',
+        workCategoryID: '',
+        workCategoryList: [] as any
+      },
+      {
+        index: 1,
+        name: '分类二',
+        isSelect: false,
+        disabled: true,
+        workCategoryName: '',
+        workCategoryID: '',
+        workCategoryList: [] as any
+      },
+      {
+        index: 2,
+        name: '工种',
+        isSelect: false,
+        disabled: true,
+        workCategoryName: '',
+        workCategoryID: '',
+        workCategoryList: [] as any
+      }]);
+    const selectWorkCategoryInfo = reactive({value: '', text: ''})
+    const workCategoryLevelList = ref();
+
+    const loadWorkCategoryInfo = () => {
+      getWorkCategoryLevelList().then(data => {
+        workCategoryLevelList.value = data;
+        console.log("工种",workCategoryLevelList.value);
+        if (!props.WorkCategoryID) {
+          selectModelList[selectType.one].isSelect = true;
+          selectModelList[selectType.one].disabled = false;
+          selectModelList[selectType.one].workCategoryName = '';
+          selectModelList[selectType.one].workCategoryID = '';
+          selectModelList[selectType.one].workCategoryList = workCategoryLevelList.value.filter((x: any) => x.workCategoryLevel == "1")
+              .map((x: any) => ({
+                ...x,
+                isSelect: false
+              }));
+        } else {
+
+          const threeInfo = workCategoryLevelList.value.find((x: any) => x.workCategoryLevel == "3" && x.workCategoryID == props.WorkCategoryID);
+          const twoInfo = workCategoryLevelList.value.find((x: any) => x.workCategoryLevel == "2" && x.workCategoryID == threeInfo.parentWorkCategoryID);
+          const oneInfo = workCategoryLevelList.value.find((x: any) => x.workCategoryLevel == "1" && x.workCategoryID == twoInfo.parentWorkCategoryID);
+
+          selectModelList[selectType.one].isSelect = false;
+          selectModelList[selectType.one].disabled = false;
+          selectModelList[selectType.one].workCategoryName = oneInfo.workCategoryName;
+          selectModelList[selectType.one].workCategoryID = oneInfo.workCategoryID;
+          selectModelList[selectType.one].workCategoryList = workCategoryLevelList.value.filter((x: any) => x.workCategoryLevel == "1")
+              .map((x: any) => ({
+                ...x,
+                isSelect: false
+              }));
+          selectModelList[selectType.one].workCategoryList.find((x: any) => x.workCategoryID == oneInfo.workCategoryID).isSelect = true;
+
+          selectModelList[selectType.two].isSelect = false;
+          selectModelList[selectType.two].disabled = false;
+          selectModelList[selectType.two].workCategoryName = twoInfo.workCategoryName;
+          selectModelList[selectType.two].workCategoryID = twoInfo.workCategoryID;
+          selectModelList[selectType.two].workCategoryList = workCategoryLevelList.value.filter((x: any) => x.workCategoryLevel == "2"
+              && x.parentWorkCategoryID == oneInfo.workCategoryID).map((x: any) => ({
+            ...x,
+            isSelect: false
+          }));
+          selectModelList[selectType.two].workCategoryList.find((x: any) => x.workCategoryID == twoInfo.workCategoryID).isSelect = true;
+
+          selectModelList[selectType.three].isSelect = true;
+          selectModelList[selectType.three].disabled = false;
+          selectModelList[selectType.three].workCategoryName = threeInfo.workCategoryName;
+          selectModelList[selectType.three].workCategoryID = threeInfo.workCategoryID;
+          selectModelList[selectType.three].workCategoryList = workCategoryLevelList.value.filter((x: any) => x.workCategoryLevel == "3"
+              && x.parentWorkCategoryID == twoInfo.workCategoryID).map((x: any) => ({
+            ...x,
+            isSelect: false
+          }));
+          selectModelList[selectType.three].workCategoryList.find((x: any) => x.workCategoryID == threeInfo.workCategoryID).isSelect = true;
+
+          getSelectProsession();
+        }
+      });
+      isOpen.value = true;
+    }
+
+    const onSelectType = (type: number) => {
+      if (selectType.one == type) {
+        selectModelList.map(x => {
+          x.isSelect = false,
+          x.disabled = true,
+          x.workCategoryName = '',
+          x.workCategoryID = '',
+          x.workCategoryList = []
+        });
+
+        selectModelList[selectType.one].isSelect = true;
+        selectModelList[selectType.one].disabled = false;
+        selectModelList[selectType.one].workCategoryList = workCategoryLevelList.value.filter((x: any) => x.workCategoryLevel == "1")
+            .map((x: any) => ({
+              ...x,
+              isSelect: false
+            }));
+      }
+
+      if (selectType.two == type) {
+        selectModelList[selectType.one].isSelect = false;
+        selectModelList[selectType.three].isSelect = false;
+        selectModelList[selectType.three].workCategoryName = '';
+        selectModelList[selectType.three].workCategoryID = '';
+        selectModelList[selectType.three].workCategoryList = [];
+
+        selectModelList[selectType.two].isSelect = true;
+        selectModelList[selectType.two].disabled = false;
+        selectModelList[selectType.two].workCategoryName = '';
+        selectModelList[selectType.two].workCategoryID = '';
+        selectModelList[selectType.two].workCategoryList = workCategoryLevelList.value.filter((x: any) => x.workCategoryLevel == "2"
+            && x.parentWorkCategoryID == selectModelList[selectType.one].workCategoryID).map((x: any) => ({
+          ...x,
+          isSelect: false
+        }));
+      }
+
+      if (selectType.three == type) {
+        selectModelList[selectType.one].isSelect = false;
+        selectModelList[selectType.two].isSelect = false;
+
+        selectModelList[selectType.three].isSelect = true;
+        selectModelList[selectType.three].disabled = false;
+        selectModelList[selectType.three].workCategoryName = '';
+        selectModelList[selectType.three].workCategoryID = '';
+        selectModelList[selectType.three].workCategoryList = workCategoryLevelList.value.filter((x: any) => x.workCategoryLevel == "3"
+            && x.parentWorkCategoryID == selectModelList[selectType.two].workCategoryID).map((x: any) => ({
+          ...x,
+          isSelect: false
+        }));
+      }
+
+      getSelectProsession();
+    }
+
+    const onSelect = (item: any, type: any) => {
+      selectModelList[type].workCategoryList.forEach((x: any) => {
+        x.isSelect = x.workCategoryID == item.workCategoryID
+      });
+      selectModelList[type].workCategoryName = item.workCategoryName;
+      selectModelList[type].workCategoryID = item.workCategoryID;
+
+      if (type == selectType.one) {
+        onSelectType(selectType.two);
+      }else if (type == selectType.two) {
+        onSelectType(selectType.three);
+      }else{
+        getSelectProsession();
+      }
+
+    }
+
+    const getSelectProsession = () => {
+      selectWorkCategoryInfo.text = selectModelList.filter(x => x.workCategoryName != '').map(x => x.workCategoryName).join("-");
+      selectWorkCategoryInfo.value = selectModelList[selectType.three].workCategoryID;
+    }
+
+    const onCancel = () => {
+      isOpen.value = false;
+    }
+
+    const onConfirm = () => {
+      isOpen.value = false;
+      context.emit("SetWorkCategoryID", selectWorkCategoryInfo);
+    }
+
+    const onRest = () => {
+      selectModelList.splice(0,1,
+        {
+          index: 0,
+          name: '分类一',
+          isSelect: false,
+          disabled: true,
+          workCategoryName: '',
+          workCategoryID: '',
+          workCategoryList: [] as any
+        });
+      selectModelList.splice(1,1,{
+          index: 1,
+          name: '分类二',
+          isSelect: false,
+          disabled: true,
+          workCategoryName: '',
+          workCategoryID: '',
+          workCategoryList: [] as any
+        });
+
+      selectModelList.splice(2,1,  {
+          index: 2,
+          name: '岗位',
+          isSelect: false,
+          disabled: true,
+          workCategoryName: '',
+          workCategoryID: '',
+          workCategoryList: [] as any
+        });
+      selectWorkCategoryInfo.value = '';
+      selectWorkCategoryInfo.text = '';
+      workCategoryLevelList.value = [];
+    }
+
+    return {
+      isOpen,
+      selectType,
+      selectModelList,
+      selectWorkCategoryInfo,
+      loadWorkCategoryInfo,
+      onSelectType,
+      onSelect,
+      onCancel,
+      onConfirm,
+      onRest
+    };
+  }
+})
+</script>

+ 0 - 2
h5app/src/plugins/ionic.ts

@@ -58,7 +58,6 @@ import type {App} from 'vue';
 import BFileList from "@/components/fileList.vue"
 import BApproveList from "@/components/ApproveList.vue";
 import Approve from "@/components/Approve.vue"
-import PostSelection from "@/components/postSelection.vue";
 import BEmpty from "@/components/empty.vue";
 
 export function setupIonic(app: App<Element>) {
@@ -112,6 +111,5 @@ export function setupIonic(app: App<Element>) {
         .component('BFileList', BFileList)
         .component('BApproveList', BApproveList)
         .component('Approve', Approve)
-        .component('PostSelection', PostSelection)
         .component('BEmpty', BEmpty);
 }

+ 46 - 8
h5app/src/views/pages/company/editPost.vue

@@ -17,14 +17,27 @@
           <div class="form-input">
             <ion-label>岗位名称<span class="danger">*</span></ion-label>
             <div>
-              <ion-input placeholder="请选择岗位" label-placement="stacked" style="float: left;width:78%;"
-              v-model="dataModel.professionName" class="custom" readonly >
+              <ion-input placeholder="请输入岗位" label-placement="stacked" style="float: left;width:78%;"
+                         @click="onOpenPost" v-model="dataModel.professionName" class="custom" readonly >
               </ion-input>
               <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
-                <post-selection  :ProfessionID="dataModel.professionID" @SetProfessionID="onSetProfessionID"></post-selection>
+                <post-selection-like ref="refPostSelectionLike" @resultInfo="onResultInfo"></post-selection-like>
               </ion-item>
             </div>
-            <ion-note v-show="isCommit&&v$.dataModel.professionID.$error" class="danger" >请选择岗位</ion-note>
+            <ion-note v-show="isCommit&&v$.dataModel.professionName.$error" class="danger" >请选择岗位</ion-note>
+          </div>
+          <div style="width: 100%;overflow: hidden;"></div>
+          <div class="form-input">
+            <ion-label>工种名称<span class="danger">*</span></ion-label>
+            <div>
+              <ion-input placeholder="请选择工种" label-placement="stacked" style="float: left;width:78%;"
+                         v-model="dataModel.workCategoryName" class="custom" readonly >
+              </ion-input>
+              <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
+                <work-category-selection  :WorkCategoryID="dataModel.workCode" @SetWorkCategoryID="onSetWorkCategoryID"></work-category-selection>
+              </ion-item>
+            </div>
+            <ion-note v-show="isCommit&&v$.dataModel.workCategoryName.$error" class="danger" >请选择工种</ion-note>
           </div>
           <div style="width: 100%;overflow: hidden;"></div>
           <div class="form-input">
@@ -32,7 +45,7 @@
             <ion-input placeholder="请输入招聘数量" label-placement="stacked" :clear-input="true"
                        v-model="dataModel.recruitCount" class="custom" @ionBlur="recruitCountBlur">
             </ion-input>
-            <ion-note v-show="isCommit&&v$.dataModel.professionName.$error" class="danger"  >请输入招聘数量</ion-note>
+            <ion-note v-show="isCommit&&v$.dataModel.recruitCount.$error" class="danger"  >请输入招聘数量</ion-note>
           </div>
           <div class="form-input">
           <ion-label>招聘日期<span class="danger">*</span></ion-label>
@@ -197,7 +210,8 @@ import {getCompanyById} from "@/api/company";
 import {required} from "@vuelidate/validators";
 import {getSysDictionaryList} from "@/api/system/dictionary";
 import dayjs from "dayjs";
-import PostSelection from "@/components/postSelection.vue";
+import PostSelectionLike from "@/components/postSelectionLike.vue";
+import WorkCategorySelection from "@/components/workCategorySelection.vue";
 import {useUserStore} from "@/store/modules/user";
 
 interface postModel {
@@ -206,7 +220,7 @@ interface postModel {
 
 export default defineComponent({
   name: 'PostEdit',
-  components:{PostSelection},
+  components:{PostSelectionLike,WorkCategorySelection},
   setup() {
     const router = useRouter();
     const route = useRoute();
@@ -220,6 +234,9 @@ export default defineComponent({
         professionName:null,
         professionID:null,
         postName:null,
+        workCategoryName:null,
+        workCode:null,
+        workName:null,
         recruitCount:null,
         startTime:dayjs().format("YYYY-MM-DD"),
         endTime:dayjs().format("YYYY-MM-DD"),
@@ -244,7 +261,7 @@ export default defineComponent({
       return {
         dataModel: {
           professionName: {required},
-          professionID:{required},
+          workCategoryName: {required},
           recruitCount: {required},
           startTime: {required},
           endTime: {required},
@@ -260,6 +277,7 @@ export default defineComponent({
     const workYearList = ref([]);
     const cultureRankList = ref([]);
     const workNatureList = ref([]);
+    const refPostSelectionLike = ref();
 
     const presentAlert = async (message: string) => {
       const alert = await alertController.create({
@@ -277,6 +295,13 @@ export default defineComponent({
       formState.dataModel.professionID = data.value;
       formState.dataModel.professionName = data.text;
     }
+
+    const onSetWorkCategoryID = (data: any)=>{
+      formState.dataModel.workCode = data.value;
+      formState.dataModel.workCategoryName = data.text;
+    }
+
+
     const onSave = async function (){
       isCommit.value = true;
       const isFormCorrect = await v$.value.$validate();
@@ -295,6 +320,15 @@ export default defineComponent({
       }
     }
 
+    const onResultInfo = (data: any)=>{
+      formState.dataModel.professionID = data.value;
+      formState.dataModel.professionName = data.text;
+    }
+
+    const onOpenPost = () => {
+      refPostSelectionLike.value.onOpen();
+    }
+
     const back = () => {
       router.push({path: "./postList", query: {reload:1,id:formState.dataModel.companyID,status: 3}});
     }
@@ -449,8 +483,12 @@ export default defineComponent({
       workNatureList,
       cultureRankList,
       v$,
+      refPostSelectionLike,
+      onOpenPost,
+      onResultInfo,
       recruitCountBlur,
       onIsTrailChange,
+      onSetWorkCategoryID,
       onSetProfessionID,
       onSave,
       back,

+ 17 - 5
h5app/src/views/pages/jobUserInfo/jobHuntEdit.vue

@@ -36,10 +36,10 @@
             <ion-label>求职岗位<span class="danger">*</span></ion-label>
             <div>
               <ion-input placeholder="请选择岗位" label-placement="stacked" style="float: left;width:78%;"
-                         v-model="dataModel.professionName" class="custom" readonly >
+                         @click="onOpenPost" v-model="dataModel.professionName" class="custom" readonly >
               </ion-input>
               <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
-                <post-selection :ProfessionID="dataModel.professionID" @SetProfessionID="onSetProfessionID"></post-selection>
+                <post-selection-like ref="refPostSelectionLike" @resultInfo="onResultInfo"></post-selection-like>
               </ion-item>
             </div>
             <!--            <ion-note slot="error">请选择求职岗位</ion-note>-->
@@ -137,7 +137,7 @@ import {getJobHuntByID,saveJobHunt} from "@/api/jobHuntInfo";
 import {getSysDictionaryList} from '@/api/system/dictionary';
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import dayjs from "dayjs";
-import PostSelection from "@/components/postSelection.vue";
+import PostSelectionLike from "@/components/postSelectionLike.vue";
 import {get} from "@/api/common";
 
 interface huntModel {
@@ -159,7 +159,7 @@ export class ExampleComponent {
 
 export default defineComponent({
   name: 'jobHuntEdit',
-  components:{PostSelection},
+  components:{PostSelectionLike},
   setup() {
     const router = useRouter();
     const route = useRoute();
@@ -197,7 +197,6 @@ export default defineComponent({
       return {dataModel:{
           jobHuntType:{required},
           jobUserType:{required},
-          professionID:{required},
           professionName:{required},
           minSalary:{required},
           maxSalary:{required},
@@ -206,6 +205,7 @@ export default defineComponent({
           inDate:{required}
         }}});
     const huntDataValid = useVuelidate(huntDataRule,jobHuntData);
+    const refPostSelectionLike = ref();
 
     const setOpen = (isOpen: boolean) => {
       loading.value = isOpen;
@@ -298,6 +298,15 @@ export default defineComponent({
 
     }
 
+    const onResultInfo = (data: any)=>{
+      jobHuntData.dataModel.professionID = data.value;
+      jobHuntData.dataModel.professionName = data.text;
+    }
+
+    const onOpenPost = () => {
+      refPostSelectionLike.value.onOpen();
+    }
+
     const onCancel = () => {
       router.push({path: './,loginUserId:curStepData.value.loginUserID', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:4,loginUserId:curStepData.value.loginUserID}});
     }
@@ -345,6 +354,9 @@ export default defineComponent({
       onSave,
       onCancel,
       loadData,
+      refPostSelectionLike,
+      onOpenPost,
+      onResultInfo,
       route,
       router,
       loading,

+ 44 - 6
h5app/src/views/pages/jobUserInfo/postEdit.vue

@@ -18,14 +18,27 @@
           <div class="form-input">
             <ion-label>岗位名称<span class="danger">*</span></ion-label>
             <div>
-              <ion-input placeholder="请选择岗位" label-placement="stacked" style="float: left;width:78%;"
-                         v-model="dataModel.professionName" class="custom" readonly >
+              <ion-input placeholder="请输入岗位" label-placement="stacked" style="float: left;width:78%;"
+                         @click="onOpenPost" v-model="dataModel.professionName" class="custom" readonly >
               </ion-input>
               <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
-                <post-selection  :ProfessionID="dataModel.professionID" @SetProfessionID="onSetProfessionID"></post-selection>
+                <post-selection-like ref="refPostSelectionLike" @resultInfo="onResultInfo"></post-selection-like>
               </ion-item>
             </div>
 <!--            <ion-note v-show="isCommit&&v$.dataModel.professionID.$error" class="danger" >请选择岗位</ion-note>-->
+          </div>
+          <div style="width: 100%;overflow: hidden;"></div>
+          <div class="form-input">
+            <ion-label>工种名称<span class="danger">*</span></ion-label>
+            <div>
+              <ion-input placeholder="请选择工种" label-placement="stacked" style="float: left;width:78%;"
+                         v-model="dataModel.workCategoryName" class="custom" readonly >
+              </ion-input>
+              <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
+                <work-category-selection  :WorkCategoryID="dataModel.workCode" @SetWorkCategoryID="onSetWorkCategoryID"></work-category-selection>
+              </ion-item>
+            </div>
+<!--            <ion-note slot="error" >请选择工种</ion-note>-->
           </div>
           <div style="width: 100%;overflow: hidden;"></div>
           <div class="form-input">
@@ -194,11 +207,12 @@ import {useRoute, useRouter} from "vue-router";
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import {useVuelidate} from "@vuelidate/core";
 import {getPostByID,savePost} from "@/api/post";
+import {getCompanyById} from "@/api/company";
 import {required} from "@vuelidate/validators";
 import {getSysDictionaryList} from "@/api/system/dictionary";
 import dayjs from "dayjs";
-import postSelection from "@/components/postSelection.vue";
-import {getCompanyById} from "@/api/company";
+import PostSelectionLike from "@/components/postSelectionLike.vue";
+import WorkCategorySelection from "@/components/workCategorySelection.vue";
 
 interface StepParams{
   loginUserID: string,
@@ -206,7 +220,7 @@ interface StepParams{
 
 export default defineComponent({
   name: 'PostEdit',
-  components:{postSelection},
+  components:{PostSelectionLike,WorkCategorySelection},
   setup() {
     const router = useRouter();
     const route = useRoute();
@@ -219,6 +233,9 @@ export default defineComponent({
         professionName:null,
         professionID:null,
         postName:null,
+        workCategoryName:null,
+        workCode:null,
+        workName:null,
         recruitCount:null,
         startTime:dayjs().format("YYYY-MM-DD"),
         endTime:dayjs().format("YYYY-MM-DD"),
@@ -244,6 +261,7 @@ export default defineComponent({
       return {
         dataModel: {
           professionName: {required},
+          workCategoryName: {required},
           recruitCount: {required},
           startTime: {required},
           endTime: {required},
@@ -259,6 +277,8 @@ export default defineComponent({
     const workYearList = ref([]);
     const cultureRankList = ref([]);
     const workNatureList = ref([]);
+    const refPostSelectionLike = ref();
+
     const curStepData = ref<StepParams>({
       loginUserID:""
     });
@@ -278,6 +298,11 @@ export default defineComponent({
       formState.dataModel.professionName = data.text;
     }
 
+    const onSetWorkCategoryID = (data: any)=>{
+      formState.dataModel.workCode = data.value;
+      formState.dataModel.workCategoryName = data.text;
+    }
+
     function isStringInteger(value: string) {
       const n = parseInt(value, 10);
       return n.toString() === value && Number.isInteger(n);
@@ -382,6 +407,15 @@ export default defineComponent({
       })
     }
 
+    const onResultInfo = (data: any)=>{
+      formState.dataModel.professionID = data.value;
+      formState.dataModel.professionName = data.text;
+    }
+
+    const onOpenPost = () => {
+      refPostSelectionLike.value.onOpen();
+    }
+
     const back = () => {
       router.push({path: "./postList", query: {reload:1,id:formState.dataModel.companyID,status: 2}});
     }
@@ -442,7 +476,11 @@ export default defineComponent({
       cultureRankList,
       workNatureList,
       v$,
+      refPostSelectionLike,
+      onOpenPost,
+      onResultInfo,
       recruitCountBlur,
+      onSetWorkCategoryID,
       onSetProfessionID,
       onSave,
       back,

+ 18 - 5
h5app/src/views/pages/jobhunt/jobHuntEdit.vue

@@ -35,11 +35,11 @@
           <div class="form-input">
             <ion-label>岗位名称<span class="danger">*</span></ion-label>
             <div>
-              <ion-input placeholder="请选择岗位" label-placement="stacked" style="float: left;width:78%;"
-                         v-model="dataModel.professionName" class="custom" readonly >
+              <ion-input placeholder="请输入岗位" label-placement="stacked" style="float: left;width:78%;"
+                         @click="onOpenPost" v-model="dataModel.professionName" class="custom" readonly >
               </ion-input>
               <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
-                <post-selection :ProfessionID="dataModel.professionID" @SetProfessionID="onSetProfessionID"></post-selection>
+                <post-selection-like ref="refPostSelectionLike" @resultInfo="onResultInfo"></post-selection-like>
               </ion-item>
             </div>
             <!--            <ion-note slot="error">请选择求职岗位</ion-note>-->
@@ -137,7 +137,7 @@ import {getJobHuntByID,saveJobHunt} from "@/api/jobHuntInfo";
 import {getSysDictionaryList} from '@/api/system/dictionary';
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import dayjs from "dayjs";
-import PostSelection from "@/components/postSelection.vue";
+import PostSelectionLike from "@/components/postSelectionLike.vue";
 import {useUserStore} from "@/store/modules/user";
 import {get} from "@/api/common";
 
@@ -160,7 +160,7 @@ export class ExampleComponent {
 
 export default defineComponent({
   name: 'jobHuntEdit',
-  components:{PostSelection},
+  components:{PostSelectionLike},
   setup() {
     const router = useRouter();
     const route = useRoute();
@@ -181,6 +181,7 @@ export default defineComponent({
     const jobUserTypeList = ref<SelectProps[]>([]);
     const workYearTypeList = ref<SelectProps[]>([]);
     const workAreaList = ref([]);
+    const refPostSelectionLike = ref();
 
     const jobHuntData = reactive<huntModel>({dataModel:{
         jobUserID:null,
@@ -300,6 +301,15 @@ export default defineComponent({
       }
     }
 
+    const onResultInfo = (data: any)=>{
+      jobHuntData.dataModel.professionID = data.value;
+      jobHuntData.dataModel.professionName = data.text;
+    }
+
+    const onOpenPost = () => {
+      refPostSelectionLike.value.onOpen();
+    }
+
     const onCancel = () => {
       router.push({path: './edit', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:4}});
     }
@@ -347,6 +357,9 @@ export default defineComponent({
       onSave,
       onCancel,
       loadData,
+      refPostSelectionLike,
+      onOpenPost,
+      onResultInfo,
       route,
       router,
       loading,

+ 19 - 11
h5app/src/views/pages/post/edit.vue

@@ -30,11 +30,11 @@
           <div class="form-input">
             <ion-label>岗位名称<span class="danger">*</span></ion-label>
             <ion-item :class="[v$.dataModel.professionName.$error?'ion-invalid':'ion-valid']">
-              <ion-input readonly placeholder="请选择岗位" label-placement="stacked" :clear-input="true"
-                         v-model="dataModel.professionName" class="custom">
+              <ion-input readonly placeholder="请输入岗位" label-placement="stacked" :clear-input="true"
+                        @click="onOpenPost" v-model="dataModel.professionName" class="custom">
               </ion-input>
-              <post-selection :ProfessionID="dataModel.professionID" @SetProfessionID="onSetProfessionID"></post-selection>
-              <ion-note slot="error">请选择岗位</ion-note>
+              <post-selection-like ref="refPostSelectionLike" @resultInfo="onResultInfo"></post-selection-like>
+              <ion-note slot="error">请输入岗位</ion-note>
             </ion-item>
           </div>
           <div class="form-input">
@@ -199,11 +199,11 @@ import {getSysDictionaryList} from "@/api/system/dictionary";
 import {getCompanyBySiteID} from "@/api/company";
 import {useUserStore} from '@/store/modules/user';
 import dayjs from "dayjs";
-import PostSelection from "@/components/postSelection.vue";
+import PostSelectionLike from "@/components/postSelectionLike.vue";
 
 export default defineComponent({
   name: 'PostEdit',
-  components:{PostSelection},
+  components:{PostSelectionLike},
   setup() {
     const router = useRouter();
     const route = useRoute();
@@ -252,6 +252,7 @@ export default defineComponent({
     const workYearList = ref([]);
     const cultureRankList = ref([]);
     const companyList = ref([]);
+    const refPostSelectionLike = ref();
 
     const presentAlert = async (message: string) => {
       const alert = await alertController.create({
@@ -263,10 +264,6 @@ export default defineComponent({
       });
       await alert.present();
     }
-    const onSetProfessionID = (data: any)=>{
-      formState.dataModel.professionID = data.value;
-      formState.dataModel.professionName = data.text;
-    }
     const onSave = async function () {
       const isFormCorrect = await v$.value.$validate();
       if (!isFormCorrect) {
@@ -280,6 +277,15 @@ export default defineComponent({
       })
     }
 
+    const onResultInfo = (data: any)=>{
+      formState.dataModel.professionID = data.value;
+      formState.dataModel.professionName = data.text;
+    }
+
+    const onOpenPost = () => {
+      refPostSelectionLike.value.onOpen();
+    }
+
     const back = () => {
       router.push({path: "./list", query: {reload: 1}});
     }
@@ -330,7 +336,9 @@ export default defineComponent({
       workYearList,
       cultureRankList,
       v$,
-      onSetProfessionID,
+      refPostSelectionLike,
+      onOpenPost,
+      onResultInfo,
       onSave,
       back,
     }

+ 1 - 0
src/main/java/com/hz/employmentsite/config/WebConfiguration.java

@@ -84,6 +84,7 @@ public class WebConfiguration implements WebMvcConfigurer {
         excludePath.add("/api/system/area/getCityList");//查询相关市区信息
         excludePath.add("/api/system/area/getAreaList");//查询相关街道信息
         excludePath.add("/api/jobusermgr/recommendmgt/getProfessionLevelList");//查询所有求职岗位信息
+        excludePath.add("/api/jobusermgr/recommendmgt/getWorkCategoryLevelList");//查询所有工种信息
         excludePath.add("/api/jobusermgr/recommendmgt/getOccupationCategoryList");//查询所有职业资格类别
         excludePath.add("/api/jobusermgr/recommendmgt/getAllIndustryList");//查询所有企业所属行业信息
         excludePath.add("/api/siteInfo/getDataList");

+ 15 - 0
src/main/java/com/hz/employmentsite/controller/jobUserManager/RecommendMgtController.java

@@ -84,6 +84,21 @@ public class RecommendMgtController {
         return RespGenerstor.success(result);
     }
 
+    @ResponseBody
+    @GetMapping("/getWorkCategoryLevelList")
+    public BaseResponse getWorkCategoryLevelList() {
+        List<WorkCategoryLevel> result = recommendMgtService.getWorkCategoryLevelList();
+        return RespGenerstor.success(result);
+    }
+
+    @ResponseBody
+    @GetMapping("/getProfessionLikeList")
+    public BaseResponse getProfessionLikeList(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize,
+                                              @RequestParam("professionName") String professionName) {
+        PageInfo<ProfessionLevel> result = recommendMgtService.getProfessionLikeList(pageIndex, pageSize, professionName);
+        return RespGenerstor.success(result);
+    }
+
     @ResponseBody
     @GetMapping("/getOccupationCategoryList")
     public BaseResponse getOccupationCategoryList() {

+ 38 - 0
src/main/java/com/hz/employmentsite/controller/jobUserManager/WorkCategoryController.java

@@ -0,0 +1,38 @@
+package com.hz.employmentsite.controller.jobUserManager;
+
+import com.hz.employmentsite.filter.exception.BaseResponse;
+import com.hz.employmentsite.filter.exception.RespGenerstor;
+import com.hz.employmentsite.model.SysDictionaryItem;
+import com.hz.employmentsite.services.service.jobUserManager.WorkCategoryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping(value = "/api/workCategory")
+public class WorkCategoryController {
+
+    @Autowired
+    private WorkCategoryService workCategoryService;
+
+
+    @ResponseBody
+    @GetMapping("/getFirstWorkCategoryList")
+    public BaseResponse<List<SysDictionaryItem>> getList() {
+        return RespGenerstor.success(workCategoryService.getList());
+    }
+
+    @ResponseBody
+    @GetMapping("/getListByParentWorkCategoryID")
+    public BaseResponse<List<SysDictionaryItem>> getListByParentProfessionID(@RequestParam("parentWorkCategoryID") String parentWorkCategoryID) {
+        return RespGenerstor.success(workCategoryService.getListByParentWorkCategoryID(parentWorkCategoryID));
+    }
+
+    @ResponseBody
+    @GetMapping("/getParentWorkCategoryID")
+    public BaseResponse<String> getParentProfessionID(@RequestParam("workCategoryID") String workCategoryID) {
+        return RespGenerstor.success(workCategoryService.getParentWorkCategoryID(workCategoryID));
+    }
+
+}

+ 30 - 0
src/main/java/com/hz/employmentsite/mapper/PcWorkcategoryMapper.java

@@ -0,0 +1,30 @@
+package com.hz.employmentsite.mapper;
+
+import com.hz.employmentsite.model.PcWorkcategory;
+import com.hz.employmentsite.model.PcWorkcategoryExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface PcWorkcategoryMapper {
+    long countByExample(PcWorkcategoryExample example);
+
+    int deleteByExample(PcWorkcategoryExample example);
+
+    int deleteByPrimaryKey(String workCategoryID);
+
+    int insert(PcWorkcategory row);
+
+    int insertSelective(PcWorkcategory row);
+
+    List<PcWorkcategory> selectByExample(PcWorkcategoryExample example);
+
+    PcWorkcategory selectByPrimaryKey(String workCategoryID);
+
+    int updateByExampleSelective(@Param("row") PcWorkcategory row, @Param("example") PcWorkcategoryExample example);
+
+    int updateByExample(@Param("row") PcWorkcategory row, @Param("example") PcWorkcategoryExample example);
+
+    int updateByPrimaryKeySelective(PcWorkcategory row);
+
+    int updateByPrimaryKey(PcWorkcategory row);
+}

+ 33 - 26
src/main/java/com/hz/employmentsite/mapper/cquery/RecommendMgtCQuery.java

@@ -1,5 +1,6 @@
 package com.hz.employmentsite.mapper.cquery;
 
+import com.hz.employmentsite.model.PcProfession;
 import com.hz.employmentsite.vo.jobUserManager.*;
 import org.apache.ibatis.annotations.Param;
 
@@ -23,46 +24,52 @@ public interface RecommendMgtCQuery {
 
     /**
      * 获取推荐岗位信息
-     * @param jobHuntID 求职意向id
-     * @param professionID 岗位id
-     * @param companyName 企业名称
-     * @param type 0-未推荐;1-已推荐
+     *
+     * @param jobHuntID          求职意向id
+     * @param professionID       岗位id
+     * @param companyName        企业名称
+     * @param type               0-未推荐;1-已推荐
      * @param parentProfessionID 岗位父级id
-     * @param cultureRank 学历编号
-     * @param workYear 工作年限
-     * @param minSalary 最低薪资
-     * @param maxSalary 最高薪资
+     * @param cultureRank        学历编号
+     * @param workYear           工作年限
+     * @param minSalary          最低薪资
+     * @param maxSalary          最高薪资
      * @return
-     * */
-    List<RecommendCompanyPostVo> getRecommendCompanyPostList(@Param("jobHuntID")String jobHuntID, @Param("professionID") String professionID,
-                                                             @Param("companyName")String companyName, @Param("type") Integer type,
-                                                             @Param("parentProfessionID")String parentProfessionID, @Param("cultureRank") Integer cultureRank,
-                                                              @Param("workYear") Integer workYear,@Param("minSalary")Integer minSalary,
-                                                             @Param("maxSalary")Integer maxSalary);
+     */
+    List<RecommendCompanyPostVo> getRecommendCompanyPostList(@Param("jobHuntID") String jobHuntID, @Param("professionID") String professionID,
+                                                             @Param("companyName") String companyName, @Param("type") Integer type,
+                                                             @Param("parentProfessionID") String parentProfessionID, @Param("cultureRank") Integer cultureRank,
+                                                             @Param("workYear") Integer workYear, @Param("minSalary") Integer minSalary,
+                                                             @Param("maxSalary") Integer maxSalary);
 
     /**
      * 获取推荐求职人员信息
-     * @param postID 企业岗位id
+     *
+     * @param postID       企业岗位id
      * @param professionID 岗位id
-     * @param userName 求职人员姓名
-     * @param type 0-未推荐;1-已推荐
+     * @param userName     求职人员姓名
+     * @param type         0-未推荐;1-已推荐
      * @return
-     * */
-    List<RecommendJobVo> getRecommendJobList(@Param("postID")String postID, @Param("professionID") String professionID,
-                                             @Param("userName")String userName, @Param("type") Integer type,
+     */
+    List<RecommendJobVo> getRecommendJobList(@Param("postID") String postID, @Param("professionID") String professionID,
+                                             @Param("userName") String userName, @Param("type") Integer type,
                                              @Param("cultureRank") Integer cultureRank, @Param("keyPersonType") Integer keyPersonType,
-                                             @Param("parentProfessionID")String parentProfessionID,
-                                             @Param("workYear") Integer workYear,@Param("minSalary")Integer minSalary,
-                                             @Param("maxSalary")Integer maxSalary);
+                                             @Param("parentProfessionID") String parentProfessionID,
+                                             @Param("workYear") Integer workYear, @Param("minSalary") Integer minSalary,
+                                             @Param("maxSalary") Integer maxSalary);
+
+    List<ProfessionLevel> getProfessionLevelList();
 
-   List<ProfessionLevel> getProfessionLevelList();
+    List<ProfessionLevel> getProfessionLikeList(@Param("professionName") String professionName);
 
-   List<OccupationCategory> getOccupationCategoryList();
+    List<WorkCategoryLevel> getWorkCategoryLevelList();
 
-   List<IndustryLevel> getAllIndustryList();
+    List<OccupationCategory> getOccupationCategoryList();
 
+    List<IndustryLevel> getAllIndustryList();
 
     List<HashMap<String, Object>> getCompanypostToUsermessageList();
+
     List<HashMap<String, Object>> getUserhuntpostToCompanymessageList();
 
 }

+ 53 - 0
src/main/java/com/hz/employmentsite/model/PcWorkcategory.java

@@ -0,0 +1,53 @@
+package com.hz.employmentsite.model;
+
+public class PcWorkcategory {
+    private String workCategoryID;
+
+    private String parentWorkCategoryID;
+
+    private String workCategoryName;
+
+    private Integer orderNo;
+
+    private Integer status;
+
+    public String getWorkCategoryID() {
+        return workCategoryID;
+    }
+
+    public void setWorkCategoryID(String workCategoryID) {
+        this.workCategoryID = workCategoryID == null ? null : workCategoryID.trim();
+    }
+
+    public String getParentWorkCategoryID() {
+        return parentWorkCategoryID;
+    }
+
+    public void setParentWorkCategoryID(String parentWorkCategoryID) {
+        this.parentWorkCategoryID = parentWorkCategoryID == null ? null : parentWorkCategoryID.trim();
+    }
+
+    public String getWorkCategoryName() {
+        return workCategoryName;
+    }
+
+    public void setWorkCategoryName(String workCategoryName) {
+        this.workCategoryName = workCategoryName == null ? null : workCategoryName.trim();
+    }
+
+    public Integer getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(Integer orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+}

+ 529 - 0
src/main/java/com/hz/employmentsite/model/PcWorkcategoryExample.java

@@ -0,0 +1,529 @@
+package com.hz.employmentsite.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PcWorkcategoryExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public PcWorkcategoryExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andWorkCategoryIDIsNull() {
+            addCriterion("WorkCategoryID is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDIsNotNull() {
+            addCriterion("WorkCategoryID is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDEqualTo(String value) {
+            addCriterion("WorkCategoryID =", value, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDNotEqualTo(String value) {
+            addCriterion("WorkCategoryID <>", value, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDGreaterThan(String value) {
+            addCriterion("WorkCategoryID >", value, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDGreaterThanOrEqualTo(String value) {
+            addCriterion("WorkCategoryID >=", value, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDLessThan(String value) {
+            addCriterion("WorkCategoryID <", value, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDLessThanOrEqualTo(String value) {
+            addCriterion("WorkCategoryID <=", value, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDLike(String value) {
+            addCriterion("WorkCategoryID like", value, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDNotLike(String value) {
+            addCriterion("WorkCategoryID not like", value, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDIn(List<String> values) {
+            addCriterion("WorkCategoryID in", values, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDNotIn(List<String> values) {
+            addCriterion("WorkCategoryID not in", values, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDBetween(String value1, String value2) {
+            addCriterion("WorkCategoryID between", value1, value2, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryIDNotBetween(String value1, String value2) {
+            addCriterion("WorkCategoryID not between", value1, value2, "workCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDIsNull() {
+            addCriterion("ParentWorkCategoryID is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDIsNotNull() {
+            addCriterion("ParentWorkCategoryID is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDEqualTo(String value) {
+            addCriterion("ParentWorkCategoryID =", value, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDNotEqualTo(String value) {
+            addCriterion("ParentWorkCategoryID <>", value, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDGreaterThan(String value) {
+            addCriterion("ParentWorkCategoryID >", value, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDGreaterThanOrEqualTo(String value) {
+            addCriterion("ParentWorkCategoryID >=", value, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDLessThan(String value) {
+            addCriterion("ParentWorkCategoryID <", value, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDLessThanOrEqualTo(String value) {
+            addCriterion("ParentWorkCategoryID <=", value, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDLike(String value) {
+            addCriterion("ParentWorkCategoryID like", value, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDNotLike(String value) {
+            addCriterion("ParentWorkCategoryID not like", value, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDIn(List<String> values) {
+            addCriterion("ParentWorkCategoryID in", values, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDNotIn(List<String> values) {
+            addCriterion("ParentWorkCategoryID not in", values, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDBetween(String value1, String value2) {
+            addCriterion("ParentWorkCategoryID between", value1, value2, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentWorkCategoryIDNotBetween(String value1, String value2) {
+            addCriterion("ParentWorkCategoryID not between", value1, value2, "parentWorkCategoryID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameIsNull() {
+            addCriterion("WorkCategoryName is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameIsNotNull() {
+            addCriterion("WorkCategoryName is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameEqualTo(String value) {
+            addCriterion("WorkCategoryName =", value, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameNotEqualTo(String value) {
+            addCriterion("WorkCategoryName <>", value, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameGreaterThan(String value) {
+            addCriterion("WorkCategoryName >", value, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameGreaterThanOrEqualTo(String value) {
+            addCriterion("WorkCategoryName >=", value, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameLessThan(String value) {
+            addCriterion("WorkCategoryName <", value, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameLessThanOrEqualTo(String value) {
+            addCriterion("WorkCategoryName <=", value, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameLike(String value) {
+            addCriterion("WorkCategoryName like", value, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameNotLike(String value) {
+            addCriterion("WorkCategoryName not like", value, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameIn(List<String> values) {
+            addCriterion("WorkCategoryName in", values, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameNotIn(List<String> values) {
+            addCriterion("WorkCategoryName not in", values, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameBetween(String value1, String value2) {
+            addCriterion("WorkCategoryName between", value1, value2, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkCategoryNameNotBetween(String value1, String value2) {
+            addCriterion("WorkCategoryName not between", value1, value2, "workCategoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoIsNull() {
+            addCriterion("OrderNo is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoIsNotNull() {
+            addCriterion("OrderNo is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoEqualTo(Integer value) {
+            addCriterion("OrderNo =", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoNotEqualTo(Integer value) {
+            addCriterion("OrderNo <>", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoGreaterThan(Integer value) {
+            addCriterion("OrderNo >", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoGreaterThanOrEqualTo(Integer value) {
+            addCriterion("OrderNo >=", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoLessThan(Integer value) {
+            addCriterion("OrderNo <", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoLessThanOrEqualTo(Integer value) {
+            addCriterion("OrderNo <=", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoIn(List<Integer> values) {
+            addCriterion("OrderNo in", values, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoNotIn(List<Integer> values) {
+            addCriterion("OrderNo not in", values, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoBetween(Integer value1, Integer value2) {
+            addCriterion("OrderNo between", value1, value2, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoNotBetween(Integer value1, Integer value2) {
+            addCriterion("OrderNo not between", value1, value2, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("Status is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("Status is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(Integer value) {
+            addCriterion("Status =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Integer value) {
+            addCriterion("Status <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Integer value) {
+            addCriterion("Status >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Integer value) {
+            addCriterion("Status >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Integer value) {
+            addCriterion("Status <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Integer value) {
+            addCriterion("Status <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Integer> values) {
+            addCriterion("Status in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Integer> values) {
+            addCriterion("Status not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Integer value1, Integer value2) {
+            addCriterion("Status between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Integer value1, Integer value2) {
+            addCriterion("Status not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 37 - 0
src/main/java/com/hz/employmentsite/services/impl/companyService/PostServiceImpl.java

@@ -6,6 +6,7 @@ import com.hz.employmentsite.filter.exception.BaseException;
 import com.hz.employmentsite.mapper.*;
 import com.hz.employmentsite.mapper.cquery.LabelCQuery;
 import com.hz.employmentsite.mapper.cquery.PostCQuery;
+import com.hz.employmentsite.mapper.cquery.RecommendMgtCQuery;
 import com.hz.employmentsite.model.*;
 import com.hz.employmentsite.services.service.companyService.PostService;
 import com.hz.employmentsite.services.service.system.DictionaryService;
@@ -54,6 +55,9 @@ public class PostServiceImpl implements PostService {
     @Autowired
     private LabelCQuery labelCQuery;
 
+    @Autowired
+    private RecommendMgtCQuery recommendMgtCQuery;
+
     @Override
     public PageInfo<PostVo> getList(Integer page, Integer rows, List<String> postIDList,
                                     String professionName, Integer minCount, Integer maxCount,
@@ -133,6 +137,39 @@ public class PostServiceImpl implements PostService {
             dbData = pcPostMapper.selectByExample(exp).stream().findFirst().orElse(null);
         }
 
+        //判断岗位id是否为空
+        if (stringUtils.IsNullOrEmpty(data.professionID)) {
+            PcProfessionExample proEmp = new PcProfessionExample();
+            PcProfessionExample.Criteria proCia = proEmp.or();
+            proCia.andParentProfessionIDNotEqualTo("");
+            proCia.andProfessionNameEqualTo("其他");
+            //获取二级其他信息
+            PcProfession proOther = pcProfessionMapper.selectByExample(proEmp).stream().findFirst().orElse(null);
+            if (proOther != null) {
+                proEmp = new PcProfessionExample();
+                proEmp.or().andParentProfessionIDEqualTo(proOther.getProfessionID());
+//                proCia.andProfessionNameEqualTo(data.getProfessionName());
+
+                //查询其他岗位
+                List<PcProfession> proOtherSonList = pcProfessionMapper.selectByExample(proEmp);
+                PcProfession proOtherSon = proOtherSonList.stream()
+                        .filter(x -> x.getProfessionName().equals(data.getProfessionName())).findFirst().orElse(null);
+                if (proOtherSon != null) {
+                    data.setProfessionID(proOtherSon.getProfessionID());
+                } else {
+                    data.setProfessionID(UUID.randomUUID().toString());
+                    PcProfession proModel = new PcProfession();
+                    proModel.setProfessionID(data.getProfessionID());
+                    proModel.setParentProfessionID(proOther.getProfessionID());
+                    proModel.setProfessionName(data.getProfessionName());
+                    proModel.setStatus(Integer.parseInt("1"));
+                    proModel.setOrderNo(proOtherSonList.size() + 1);
+
+                    pcProfessionMapper.insert(proModel);
+                }
+            }
+        }
+
         if (dbData == null) {
             dbData = new PcPost();
             dbData.setPostID(UUID.randomUUID().toString());

+ 20 - 0
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/RecommendMgtServiceImpl.java

@@ -124,12 +124,32 @@ public class RecommendMgtServiceImpl implements RecommendMgtService {
         return result;
     }
 
+    @Override
     public List<ProfessionLevel> getProfessionLevelList() {
         return recommendMgtCQuery.getProfessionLevelList();
     }
 
+    @Override
+    public List<WorkCategoryLevel> getWorkCategoryLevelList() {
+        return recommendMgtCQuery.getWorkCategoryLevelList();
+    }
+
+
+    @Override
+    public PageInfo<ProfessionLevel> getProfessionLikeList(Integer page, Integer rows,String professionName) {
+        PageHelper.startPage(page, rows);
+
+        List<ProfessionLevel> list = recommendMgtCQuery.getProfessionLikeList(professionName);
+
+        PageInfo<ProfessionLevel> result = new PageInfo(list);
+
+        return result;
+    }
+
+    @Override
     public List<OccupationCategory> getOccupationCategoryList() {return recommendMgtCQuery.getOccupationCategoryList();}
 
+    @Override
     public List<IndustryLevel> getAllIndustryList() {return recommendMgtCQuery.getAllIndustryList();}
 
     @Override

+ 60 - 0
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/WorkCategoryServiceImpl.java

@@ -0,0 +1,60 @@
+package com.hz.employmentsite.services.impl.jobUserManager;
+
+import com.hz.employmentsite.mapper.PcWorkcategoryMapper;
+import com.hz.employmentsite.model.*;
+import com.hz.employmentsite.services.service.jobUserManager.WorkCategoryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service("WorkCategoryService")
+public class WorkCategoryServiceImpl implements WorkCategoryService {
+
+
+    @Autowired
+    private PcWorkcategoryMapper pcWorkcategoryMapper;
+
+
+    @Override
+    public List<SysDictionaryItem> getList() {
+
+        List<SysDictionaryItem> list =  new ArrayList<>();
+        PcWorkcategoryExample workCategoryExp = new PcWorkcategoryExample();
+        workCategoryExp.or().andParentWorkCategoryIDEqualTo("");
+        var dataList = pcWorkcategoryMapper.selectByExample(workCategoryExp);
+        for(PcWorkcategory curWorkCategory : dataList){
+            SysDictionaryItem item = new SysDictionaryItem();
+            item.setCode(curWorkCategory.getWorkCategoryID());
+            item.setName(curWorkCategory.getWorkCategoryName());
+            list.add(item);
+        }
+        return list;
+    }
+
+
+    @Override
+    public List<SysDictionaryItem> getListByParentWorkCategoryID(String parentworkCategoryID) {
+        List<SysDictionaryItem> list =  new ArrayList<>();
+        PcWorkcategoryExample workCategoryExp = new PcWorkcategoryExample();
+        workCategoryExp.or().andParentWorkCategoryIDEqualTo(parentworkCategoryID);
+        var dataList = pcWorkcategoryMapper.selectByExample(workCategoryExp);
+        for(PcWorkcategory curWorkCategory : dataList){
+            SysDictionaryItem item = new SysDictionaryItem();
+            item.setCode(curWorkCategory.getWorkCategoryID());
+            item.setName(curWorkCategory.getWorkCategoryName());
+            list.add(item);
+        }
+        return list;
+    }
+
+    @Override
+    public String getParentWorkCategoryID(String workCategoryID){
+        PcWorkcategoryExample workCategoryExp = new PcWorkcategoryExample();
+        workCategoryExp.or().andWorkCategoryIDEqualTo(workCategoryID);
+        var curWorkCategory= pcWorkcategoryMapper.selectByExample(workCategoryExp).get(0);
+        return  curWorkCategory.getWorkCategoryID();
+    };
+
+}

+ 4 - 0
src/main/java/com/hz/employmentsite/services/service/jobUserManager/RecommendMgtService.java

@@ -65,6 +65,10 @@ public interface RecommendMgtService {
 
     List<ProfessionLevel> getProfessionLevelList();
 
+    PageInfo<ProfessionLevel> getProfessionLikeList(Integer page, Integer rows,String professionName);
+
+    List<WorkCategoryLevel> getWorkCategoryLevelList();
+
     List<OccupationCategory> getOccupationCategoryList();
 
     List<IndustryLevel> getAllIndustryList();

+ 13 - 0
src/main/java/com/hz/employmentsite/services/service/jobUserManager/WorkCategoryService.java

@@ -0,0 +1,13 @@
+package com.hz.employmentsite.services.service.jobUserManager;
+import com.hz.employmentsite.model.SysDictionaryItem;
+
+import java.util.List;
+
+public interface WorkCategoryService {
+
+    List<SysDictionaryItem> getList();
+
+    List<SysDictionaryItem> getListByParentWorkCategoryID(String workCategoryID);
+
+    String getParentWorkCategoryID(String workCategoryID);
+}

+ 2 - 0
src/main/java/com/hz/employmentsite/vo/companyService/PostVo.java

@@ -32,6 +32,8 @@ public class PostVo {
 
     public String workName;
 
+    public String workCategoryName;
+
     public Integer recruitCount;
 
     public Integer isRead;

+ 1 - 0
src/main/java/com/hz/employmentsite/vo/jobUserManager/ProfessionLevel.java

@@ -5,4 +5,5 @@ import com.hz.employmentsite.model.PcProfession;
 
 public class ProfessionLevel extends PcProfession {
     public String professionLevel;
+    public String parentProfessionName;
 }

+ 9 - 0
src/main/java/com/hz/employmentsite/vo/jobUserManager/WorkCategoryLevel.java

@@ -0,0 +1,9 @@
+package com.hz.employmentsite.vo.jobUserManager;
+
+
+import com.hz.employmentsite.model.PcWorkcategory;
+
+public class WorkCategoryLevel extends PcWorkcategory {
+    public String workCategoryLevel;
+    public String parentWorkCategoryName;
+}

+ 1 - 0
src/main/resources/generatorConfig.xml

@@ -87,6 +87,7 @@
         <table schema="" tableName="pc_jobhunt"><property name="useActualColumnNames" value="true"/></table>
         <table schema="" tableName="pc_jobuser"><property name="useActualColumnNames" value="true"/></table>
         <table schema="" tableName="pc_post"><property name="useActualColumnNames" value="true"/></table>
+        <table schema="" tableName="pc_workcategory"><property name="useActualColumnNames" value="true"/></table>
         <table schema="" tableName="pc_recommend"><property name="useActualColumnNames" value="true"/></table>
         <table schema="" tableName="pc_recruit"><property name="useActualColumnNames" value="true"/></table>
         <table schema="" tableName="pc_site"><property name="useActualColumnNames" value="true"/></table>

+ 213 - 0
src/main/resources/mapping/PcWorkcategoryMapper.xml

@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.hz.employmentsite.mapper.PcWorkcategoryMapper">
+  <resultMap id="BaseResultMap" type="com.hz.employmentsite.model.PcWorkcategory">
+    <id column="WorkCategoryID" jdbcType="VARCHAR" property="workCategoryID" />
+    <result column="ParentWorkCategoryID" jdbcType="VARCHAR" property="parentWorkCategoryID" />
+    <result column="WorkCategoryName" jdbcType="VARCHAR" property="workCategoryName" />
+    <result column="OrderNo" jdbcType="INTEGER" property="orderNo" />
+    <result column="Status" jdbcType="INTEGER" property="status" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    WorkCategoryID, ParentWorkCategoryID, WorkCategoryName, OrderNo, Status
+  </sql>
+  <select id="selectByExample" parameterType="com.hz.employmentsite.model.PcWorkcategoryExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from pc_workcategory
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from pc_workcategory
+    where WorkCategoryID = #{workCategoryID,jdbcType=VARCHAR}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
+    delete from pc_workcategory
+    where WorkCategoryID = #{workCategoryID,jdbcType=VARCHAR}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.hz.employmentsite.model.PcWorkcategoryExample">
+    delete from pc_workcategory
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.hz.employmentsite.model.PcWorkcategory">
+    insert into pc_workcategory (WorkCategoryID, ParentWorkCategoryID, 
+      WorkCategoryName, OrderNo, Status
+      )
+    values (#{workCategoryID,jdbcType=VARCHAR}, #{parentWorkCategoryID,jdbcType=VARCHAR}, 
+      #{workCategoryName,jdbcType=VARCHAR}, #{orderNo,jdbcType=INTEGER}, #{status,jdbcType=INTEGER}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.hz.employmentsite.model.PcWorkcategory">
+    insert into pc_workcategory
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="workCategoryID != null">
+        WorkCategoryID,
+      </if>
+      <if test="parentWorkCategoryID != null">
+        ParentWorkCategoryID,
+      </if>
+      <if test="workCategoryName != null">
+        WorkCategoryName,
+      </if>
+      <if test="orderNo != null">
+        OrderNo,
+      </if>
+      <if test="status != null">
+        Status,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="workCategoryID != null">
+        #{workCategoryID,jdbcType=VARCHAR},
+      </if>
+      <if test="parentWorkCategoryID != null">
+        #{parentWorkCategoryID,jdbcType=VARCHAR},
+      </if>
+      <if test="workCategoryName != null">
+        #{workCategoryName,jdbcType=VARCHAR},
+      </if>
+      <if test="orderNo != null">
+        #{orderNo,jdbcType=INTEGER},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.hz.employmentsite.model.PcWorkcategoryExample" resultType="java.lang.Long">
+    select count(*) from pc_workcategory
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update pc_workcategory
+    <set>
+      <if test="row.workCategoryID != null">
+        WorkCategoryID = #{row.workCategoryID,jdbcType=VARCHAR},
+      </if>
+      <if test="row.parentWorkCategoryID != null">
+        ParentWorkCategoryID = #{row.parentWorkCategoryID,jdbcType=VARCHAR},
+      </if>
+      <if test="row.workCategoryName != null">
+        WorkCategoryName = #{row.workCategoryName,jdbcType=VARCHAR},
+      </if>
+      <if test="row.orderNo != null">
+        OrderNo = #{row.orderNo,jdbcType=INTEGER},
+      </if>
+      <if test="row.status != null">
+        Status = #{row.status,jdbcType=INTEGER},
+      </if>
+    </set>
+    <if test="example != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update pc_workcategory
+    set WorkCategoryID = #{row.workCategoryID,jdbcType=VARCHAR},
+      ParentWorkCategoryID = #{row.parentWorkCategoryID,jdbcType=VARCHAR},
+      WorkCategoryName = #{row.workCategoryName,jdbcType=VARCHAR},
+      OrderNo = #{row.orderNo,jdbcType=INTEGER},
+      Status = #{row.status,jdbcType=INTEGER}
+    <if test="example != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.hz.employmentsite.model.PcWorkcategory">
+    update pc_workcategory
+    <set>
+      <if test="parentWorkCategoryID != null">
+        ParentWorkCategoryID = #{parentWorkCategoryID,jdbcType=VARCHAR},
+      </if>
+      <if test="workCategoryName != null">
+        WorkCategoryName = #{workCategoryName,jdbcType=VARCHAR},
+      </if>
+      <if test="orderNo != null">
+        OrderNo = #{orderNo,jdbcType=INTEGER},
+      </if>
+      <if test="status != null">
+        Status = #{status,jdbcType=INTEGER},
+      </if>
+    </set>
+    where WorkCategoryID = #{workCategoryID,jdbcType=VARCHAR}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.hz.employmentsite.model.PcWorkcategory">
+    update pc_workcategory
+    set ParentWorkCategoryID = #{parentWorkCategoryID,jdbcType=VARCHAR},
+      WorkCategoryName = #{workCategoryName,jdbcType=VARCHAR},
+      OrderNo = #{orderNo,jdbcType=INTEGER},
+      Status = #{status,jdbcType=INTEGER}
+    where WorkCategoryID = #{workCategoryID,jdbcType=VARCHAR}
+  </update>
+</mapper>

+ 2 - 1
src/main/resources/mapping/cquery/PostCQuery.xml

@@ -11,7 +11,7 @@
         workNatureName,item2.`Name` as workYearName
         , IFNULL(count(rmgt.RecommendMgtID),0) as recommendNum
         , company.SiteID, site.SiteName, inSites.InstitutionID, company.RegionCode
-        , pro.ProfessionName, pro.ProfessionID, pro.parentProfessionID, modifyUser.Name as modifyUserName
+        , pro.ProfessionName,category.workCategoryName, pro.ProfessionID, pro.parentProfessionID, modifyUser.Name as modifyUserName
         from pc_post post
         left join pc_company company on post.CompanyID = company.CompanyID
         left join sys_dictionary_item item on item.value=post.CultureRank and item.DictionaryCode='CultureLevel'
@@ -19,6 +19,7 @@
         left join sys_dictionary_item work_nature on work_nature.value=post.WorkNatureID and
         work_nature.DictionaryCode='WorkNature'
         left join pc_profession pro on post.ProfessionID = pro.ProfessionID
+        left join pc_workcategory category on post.WorkCode = category.workCategoryID
         left join pc_recommend_mgt rmgt on post.PostID = rmgt.PostID
         left join pc_site site on company.SiteID = site.SiteID
         left join pc_site_institution inSites on site.SiteID = inSites.SiteID

+ 50 - 6
src/main/resources/mapping/cquery/RecommendMgtCQuery.xml

@@ -87,8 +87,10 @@
         left join pc_company b on a.CompanyID = b.CompanyID
         left join pc_profession c on a.ProfessionID = c.ProfessionID
         left join pc_recommend_mgt d on a.PostID = d.PostID and d.JobHuntID = #{jobHuntID}
-        left join (select `Value`,`Name` from sys_dictionary_item where DictionaryCode='CultureLevel') dic1 on a.CultureRank = dic1.`Value`
-        left join (select `Value`,`Name` from sys_dictionary_item where DictionaryCode='WorkYearType') dic2 on a.WorkYear = dic2.`Value`
+        left join (select `Value`,`Name` from sys_dictionary_item where DictionaryCode='CultureLevel') dic1 on
+        a.CultureRank = dic1.`Value`
+        left join (select `Value`,`Name` from sys_dictionary_item where DictionaryCode='WorkYearType') dic2 on
+        a.WorkYear = dic2.`Value`
         <where>
             <if test="type!=null and type==0">
                 and d.RecommendMgtID is null
@@ -216,6 +218,48 @@
                                                  on a.ParentProfessionID = b.ProfessionID) bb
                             on c.ParentProfessionID = bb.ProfessionID
     </select>
+    <select id="getProfessionLikeList" resultType="com.hz.employmentsite.vo.jobUserManager.ProfessionLevel">
+        select aa.ProfessionID, aa.ParentProfessionID, aa.ProfessionName, bb.ProfessionName as ParentProfessionName
+        from (
+        select c.ProfessionID, c.ParentProfessionID, c.ProfessionName,c.OrderNo
+        from pc_profession c
+        inner join (select a.ProfessionID
+        from pc_profession a
+        inner join (select ProfessionID from pc_profession where ParentProfessionID = '') b
+        on a.ParentProfessionID = b.ProfessionID) bb
+        on c.ParentProfessionID = bb.ProfessionID
+        <where>
+            <choose>
+                <when test="professionName!=null and professionName!=''">
+                    and c.ProfessionName like Concat('%',#{professionName},'%')
+                </when>
+                <otherwise>
+                    and 1!=1
+                </otherwise>
+            </choose>
+        </where>
+        ) aa
+        left join pc_profession bb on aa.ParentProfessionID = bb.ProfessionID
+        order by bb.OrderNo,aa.OrderNo
+    </select>
+    <select id="getWorkCategoryLevelList" resultType="com.hz.employmentsite.vo.jobUserManager.WorkCategoryLevel">
+        select WorkCategoryID, ParentWorkCategoryID, WorkCategoryName, '1' as WorkCategoryLevel
+        from pc_workcategory
+        where ParentWorkCategoryID = ''
+        union all
+        select a.WorkCategoryID, a.ParentWorkCategoryID, a.WorkCategoryName, '2' as WorkCategoryLevel
+        from pc_workcategory a
+                 inner join (select WorkCategoryID from pc_workcategory where ParentWorkCategoryID = '') b
+                            on a.ParentWorkCategoryID = b.WorkCategoryID
+        union all
+        select c.WorkCategoryID, c.ParentWorkCategoryID, c.WorkCategoryName, '3' as WorkCategoryLevel
+        from pc_workcategory c
+                 inner join (select a.WorkCategoryID
+                             from pc_workcategory a
+                                      inner join (select WorkCategoryID from pc_workcategory where ParentWorkCategoryID = '') b
+                                                 on a.ParentWorkCategoryID = b.WorkCategoryID) bb
+                            on c.ParentWorkCategoryID = bb.WorkCategoryID
+    </select>
     <select id="getOccupationCategoryList" resultType="com.hz.employmentsite.vo.jobUserManager.OccupationCategory">
         select OccupationalID, ParentOccupationalID, OccupationalName, '1' as OccupationalLevel
         from pc_occupational
@@ -238,9 +282,9 @@
     </select>
     <select id="getCompanypostToUsermessageList" resultType="java.util.HashMap">
         select a.recommendmgtid,
-               e.openId     as userOpenId,
+               e.openId         as userOpenId,
                c.companyname,
-               c.usermobile as companymobile,
+               c.usermobile     as companymobile,
                f.professionname as postName
         from pc_recommend_mgt a
                  inner join pc_post b on a.PostID = b.PostID
@@ -253,8 +297,8 @@
     </select>
     <select id="getUserhuntpostToCompanymessageList" resultType="java.util.HashMap">
         select a.recommendmgtid,
-               c.openId   as companyOpenId,
-               e.`name`   as userName,
+               c.openId          as companyOpenId,
+               e.`name`          as userName,
                e.usermobile,
                f2.professionname as userHuntPostName
         from pc_recommend_mgt a

+ 95 - 11
vue/src/views/companyService/post/edit.vue

@@ -2,7 +2,7 @@
   <div class="card-edit">
     <a-form :model="dataModel" autocomplete="off" @finish="onFinish">
       <h1>岗位基础信息</h1>
-      <a-row justify="start" :gutter="24" >
+      <a-row justify="start">
         <a-col flex="800px">
           <a-form-item label="企业名称" :label-col="{ span: 3}"
                        name="companyID" :rules="[{ required: true, message: '请选择关联企业!' }]" >
@@ -15,10 +15,7 @@
             </a-select>
           </a-form-item>
         </a-col>
-      </a-row>
-
-      <a-row justify="start">
-        <a-col flex="520px">
+        <a-col flex="530px">
           <a-form-item label="岗位名称" :label-col="{ span: 5 }"
                        name="professionName" :rules="[{ required: true, message: '请选择岗位名称!' }]">
             <a-cascader :load-data="loadLevelProfessionList" v-model:value="dataModel.professionName"
@@ -26,6 +23,17 @@
             </a-cascader>
           </a-form-item>
         </a-col>
+      </a-row>
+
+      <a-row justify="start">
+        <a-col flex="520px">
+          <a-form-item label="工种名称" :label-col="{ span: 5 }"
+                       name="workCategoryName" :rules="[{ required: true, message: '请选择行业工种!' }]">
+            <a-cascader :load-data="loadLevelWorkCategoryList" v-model:value="dataModel.workCategoryName"
+                        :options="firstWorkCategoryList" change-on-select @change="workCategoryChange">
+            </a-cascader>
+          </a-form-item>
+        </a-col>
         <a-col flex="340px">
           <a-form-item label="招聘人数" :label-col="{ span: 8}"
                        name="recruitCount" :rules="[{ required: true, message: '请输入招聘人数!' }]" >
@@ -284,8 +292,23 @@ export default defineComponent(
       const postStatusList = [{name: '启用', value: 1}, {name: '停用', value: 0}];
       const trialStatusList = [{name: '是', value: true}, {name: '否', value: false}];
       const firstProfessionList = ref<CascaderProps['options']>([]);
+      const firstWorkCategoryList = ref<CascaderProps['options']>([]);
       const refSelectModel = ref();
 
+      const getFirstWorkCategoryList = () => {
+        get("workCategory/getFirstWorkCategoryList", null).then(data=>{
+          firstWorkCategoryList.value = (data as any[]).map((x) => {
+            return {
+              label: x.name,
+              value: x.code,
+              isLeaf: false,
+              tag: 'firstLevel'
+            }
+          });
+        });
+        console.log(firstWorkCategoryList.value);
+      }
+
       const getFirstProfessionList = () => {
         get("profession/getFirstProfessionList", null).then(data=>{
           firstProfessionList.value = (data as any[]).map((x) => {
@@ -298,6 +321,41 @@ export default defineComponent(
           });
         });
       }
+
+      const loadLevelWorkCategoryList = (selectedOptions) => {
+        let targetOption = selectedOptions[selectedOptions.length - 1];
+        if (targetOption) {
+          if (targetOption.tag == 'firstLevel') {
+            get("workCategory/getListByParentWorkCategoryID",{parentWorkCategoryID:targetOption.value}).then(data => {
+              targetOption.loading = false;
+              targetOption.children = (data as any[]).map((x) => {
+                return {
+                  label: x.name,
+                  value: x.code,
+                  isLeaf: false,
+                  tag: 'secondLevel'
+                };
+              });
+            });
+            postCompany.dataModel.hasWorkCategory = false;
+          } else if (targetOption.tag == "secondLevel") {
+            get("workCategory/getListByParentWorkCategoryID",{parentWorkCategoryID:targetOption.value}).then(data => {
+              targetOption.loading = false;
+              targetOption.children = (data as any[]).map((x) => {
+                return {
+                  label: x.name,
+                  value: x.code,
+                  isLeaf: true,
+                  tag: 'thirdLevel'
+                };
+              });
+            });
+            postCompany.dataModel.hasWorkCategory = false;
+          }
+
+        }
+      };
+
       const loadLevelProfessionList = (selectedOptions) => {
         let targetOption = selectedOptions[selectedOptions.length - 1];
         if (targetOption) {
@@ -332,6 +390,15 @@ export default defineComponent(
         }
       };
 
+      watch(() => postCompany.dataModel.workCategoryName, (selectedValues) => {
+        console.log("dd",selectedValues);
+        if (selectedValues && selectedValues.length == 3) {
+          postCompany.dataModel.workCode = selectedValues[2];
+          postCompany.dataModel.hasWorkCategory = true;
+        }
+        //console.log("dsd",postCompany.dataModel);
+      });
+
       watch(() => postCompany.dataModel.professionName, (selectedValues) => {
         //console.log("dd",selectedValues);
         if (selectedValues && selectedValues.length == 3) {
@@ -385,11 +452,15 @@ export default defineComponent(
       const onFinish = () => {
         if(!postCompany.dataModel.hasProfession){
           message.error("请选择完整的岗位信息!")
-        }else{
-          if (!inputDataValidate()) {
-            return;
-          }
+        }
+        if(!postCompany.dataModel.hasWorkCategory){
+          message.error("请选择完整的行业工种!");
+          return;
+        }
+        console.log("当前岗位信息",postCompany.dataModel);
+        if (inputDataValidate()) {
           postCompany.dataModel.professionName = null;
+          postCompany.dataModel.workCategoryName = null;
           savePost(postCompany.dataModel).then((result) => {
             if (result) {
               tabsViewStore.closeCurrentTab(fullpath);
@@ -398,9 +469,9 @@ export default defineComponent(
           }).finally(() => {
             // 重新填充,防止请求失败
             postCompany.dataModel.professionName = postCompany.dataModel.postName;
+            postCompany.dataModel.workCategoryName = postCompany.dataModel.workName;
           });
         }
-
       }
 
       const onSelectModel = ()=>{
@@ -413,14 +484,24 @@ export default defineComponent(
 
       const loadData = (id: any) => {
         isEdit.value = id != null;
+        getFirstWorkCategoryList();
         getFirstProfessionList();
         getPostByID(id).then(result => {
+          console.log("初始化岗位信息",result);
           postCompany.dataModel = result;
           postCompany.dataModel.hasProfession = true;
+          postCompany.dataModel.hasWorkCategory = true;
         })
-        console.log("初始化岗位信息",postCompany.dataModel);
       };
 
+
+      // 行业工种选择变更事件
+      function workCategoryChange(value: any, selectedOptions: any) {
+        if (value.length >= 3) {
+          postCompany.dataModel.workName = selectedOptions[2].label;
+        }
+      }
+
       // 岗位名称选择变更事件
       function professionChange(value: any, selectedOptions: any) {
         if (value.length >= 3) {
@@ -443,11 +524,13 @@ export default defineComponent(
         loadData,
         onClose,
         onFinish,
+        loadLevelWorkCategoryList,
         loadLevelProfessionList,
         onSelectModel,
         selectLabelChecks,
         refSelectModel,
         firstProfessionList,
+        firstWorkCategoryList,
         companyList,
         postStatusList,
         trialStatusList,
@@ -456,6 +539,7 @@ export default defineComponent(
         postCompany,
         isEdit,
         jobHuntList,
+        workCategoryChange,
         professionChange,
         companyChange
       }