Procházet zdrojové kódy

app-企业岗位信息详情页面搭建2

liao-sea před 11 měsíci
rodič
revize
2c48852367
21 změnil soubory, kde provedl 742 přidání a 178 odebrání
  1. 14 0
      h5app/src/api/recommendmgt/index.ts
  2. 0 105
      h5app/src/components/areaPicker.vue
  3. 302 0
      h5app/src/components/ocCategorySelection.vue
  4. 209 16
      h5app/src/views/pages/company/detail.vue
  5. 10 3
      h5app/src/views/pages/company/editPost.vue
  6. 1 1
      h5app/src/views/pages/company/postList.vue
  7. 39 5
      h5app/src/views/pages/jobUserInfo/jobHuntEdit.vue
  8. 7 1
      h5app/src/views/pages/jobUserInfo/postEdit.vue
  9. 1 1
      h5app/src/views/pages/jobUserInfo/postList.vue
  10. 44 9
      h5app/src/views/pages/jobUserInfo/userEdit.vue
  11. 2 2
      h5app/src/views/pages/jobhunt/detail.vue
  12. 36 13
      h5app/src/views/pages/jobhunt/edit.vue
  13. 39 5
      h5app/src/views/pages/jobhunt/jobHuntEdit.vue
  14. 1 0
      src/main/java/com/hz/employmentsite/controller/jobUserManager/JobUserController.java
  15. 8 4
      src/main/java/com/hz/employmentsite/controller/jobUserManager/RecommendMgtController.java
  16. 3 4
      src/main/java/com/hz/employmentsite/mapper/cquery/RecommendMgtCQuery.java
  17. 1 1
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobUserServiceImpl.java
  18. 4 4
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/RecommendMgtServiceImpl.java
  19. 3 4
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/RecommendMgtService.java
  20. 8 0
      src/main/java/com/hz/employmentsite/vo/jobUserManager/OccupationCategory.java
  21. 10 0
      src/main/resources/mapping/cquery/RecommendMgtCQuery.xml

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

@@ -89,4 +89,18 @@ export function getProfessionLevelList() {
             isNew: true,
         },
     );
+}
+
+
+export function getOccupationCategoryList() {
+    return request<object>(
+        {
+            url: "jobusermgr/recommendmgt/getOccupationCategoryList",
+            method: 'get',
+            params: null,
+        },
+        {
+            isNew: true,
+        },
+    );
 }

+ 0 - 105
h5app/src/components/areaPicker.vue

@@ -1,105 +0,0 @@
-<template>
-  <ion-button style="color: #02a6f1;font-size: 15px;" fill="clear" @click="openPicker()">选择</ion-button>
-</template>
-
-<script lang="ts">
-import {ref, watch, defineComponent} from 'vue';
-import {pickerController} from '@ionic/vue';
-import {PickerButton, PickerColumnOption, PickerColumn, PickerOptions} from '@ionic/core';
-import {getRegionCodeList,getStreetCodeList} from "@/api/system/area";
-
-interface PickerColumnOptions extends PickerColumnOption {
-  parent?: any;
-}
-
-export default defineComponent({
-  name: 'areaPicker',
-  props: {
-    code: {type: String, default: ''},
-    },
-  setup(props,context) {
-    const cityList = ref();
-    const areaList = ref();
-    //const pickerOptions = ref<PickerOptions>();
-    const pickerColumns = ref<PickerColumn[]>([]);
-    const pickerButtons = ref<PickerButton[]>([]);
-    const CityOptions = ref<PickerColumnOptions[]>([]);
-    const AreaOptions = ref<PickerColumnOptions[]>([]);
-    const oldCityCode = ref(props.code);
-    const oldAreaCode = ref();
-
-
-    pickerColumns.value = [
-      {name: 'one', selectedIndex: 0, options: CityOptions.value},
-      {name: 'two', selectedIndex: 1, options: AreaOptions.value},
-    ]
-    pickerButtons.value = [
-      {text: '取消', role: 'cancel',},
-      {
-        text: '确定',
-        handler: (value) => {
-          context.emit("SetAreaCode",value.three);
-        },
-      },
-    ];
-
-    getRegionCodeList().then(data => {
-      cityList.value = data;
-
-      CityOptions.value = cityList.value.map((m: any) => ({
-        text: m.name,
-        value: m.code,
-        parent: m.fid,
-        selected: false
-      }));
-      CityOptions.value[0].selected=true;
-      oldCityCode.value = pickerColumns.value[0]?.options[0].value;
-    });
-
-    getStreetCodeList("").then(data=>{
-      AreaOptions.value = areaList.value.map((m: any) => ({
-        text: m.name,
-        value: m.code,
-        parent: m.fid,
-        selected: false
-      }))
-      AreaOptions.value[0].selected=true;
-      oldAreaCode.value = pickerColumns.value[1]?.options[0].value;
-    })
-
-    const picker = ref();
-    const openPicker = async () => {
-      picker.value = await pickerController.create({
-        columns: pickerColumns.value,
-        buttons: pickerButtons.value
-      });
-
-      watch(pickerColumns.value.filter(f=>f.name=="one")[0].options.filter(f=>f.selected==true)[0], () => {
-        const newVal = pickerColumns.value.filter(f=>f.name=="one")[0].options.filter(f=>f.selected==true)[0];
-        if (oldCityCode.value != newVal?.value) {
-          pickerColumns.value.map(x => {
-            if (x.name == "two") {
-              x.options = AreaOptions.value.filter(x => x.parent==newVal?.value);
-              if(x.options.length>0){
-                oldAreaCode.value = x.options[0].value;
-                x.options[0].selected=true;
-              }
-            }
-          })
-
-          pickerController.dismiss().then((e) => {console.log(e)})
-          openPicker()
-          oldCityCode.value = newVal?.value;
-        }
-      });
-
-      await picker.value.present();
-    }
-
-    return {
-      openPicker,
-    }
-  }
-});
-</script>
-

+ 302 - 0
h5app/src/components/ocCategorySelection.vue

@@ -0,0 +1,302 @@
+<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"
+                 :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;">
+              {{ selectOccupationInfo.text }}
+            </ion-label>
+            <ion-buttons slot="end">
+              <ion-button fill="clear" :disabled="selectOccupationInfo.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].occupationList" :key="index">
+                <ion-label :style="{color:item.isSelect?'#1a65eb':'#000000'}"
+                           @click="onSelect(item,selectType.one)">
+                  {{ item.occupationalName }}
+                </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].occupationList" :key="index">
+                <ion-label :style="{color:item.isSelect?'#1a65eb':'#000000'}"
+                           @click="onSelect(item,selectType.two)">
+                  {{ item.occupationalName }}
+                </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 {getOccupationCategoryList} from "@/api/recommendmgt";
+
+export default defineComponent({
+  name: "ocCategorySelection",
+  props: {
+    OccupationalID: {type: String, default: ''},
+  },
+  setup(props, context) {
+    const selectType = {
+      one: 0,
+      two: 1,
+    }
+    const isOpen = ref(false);
+    const selectModelList = reactive([
+      {
+        index: 0,
+        name: '资格类别',
+        isSelect: false,
+        disabled: true,
+        occupationalName: '',
+        occupationalID: '',
+        occupationList: [] as any
+      },
+      {
+        index: 1,
+        name: '资格名称',
+        isSelect: false,
+        disabled: true,
+        occupationalName: '',
+        occupationalID: '',
+        occupationList: [] as any
+      }]);
+    const selectOccupationInfo = reactive({value: '', text: ''})
+    const occupationalCategoryList = ref();
+
+    const loadOccupationalID = () => {
+      getOccupationCategoryList().then(data => {
+        occupationalCategoryList.value = data;
+        if (!props.OccupationalID) {
+          selectModelList[selectType.one].isSelect = true;
+          selectModelList[selectType.one].disabled = false;
+          selectModelList[selectType.one].occupationalName = ''
+          selectModelList[selectType.one].occupationalID = ''
+          selectModelList[selectType.one].occupationList = occupationalCategoryList.value.filter((x: any) => x.occupationalLevel == "1")
+              .map((x: any) => ({
+                ...x,
+                isSelect: false
+              }));
+        }
+        else {
+
+          console.log("当前OccupationalID2",props.OccupationalID);
+          const twoInfo = occupationalCategoryList.value.find((x: any) => x.professionLevel == "2" && x.occupationalID == props.OccupationalID);
+          const oneInfo = occupationalCategoryList.value.find((x: any) => x.professionLevel == "1" && x.occupationalID == twoInfo.parentOccupationalID);
+
+          selectModelList[selectType.one].disabled = false;
+          selectModelList[selectType.one].occupationalName = oneInfo.occupationalName;
+          selectModelList[selectType.one].occupationalID = oneInfo.occupationalID;
+          selectModelList[selectType.one].occupationList = occupationalCategoryList.value.filter((x: any) => x.occupationalLevel == "1")
+              .map((x: any) => ({
+                ...x,
+                isSelect: false
+              }));
+          selectModelList[selectType.one].occupationList.find((x: any) => x.occupationalID == oneInfo.occupationalID).isSelect = true;
+
+          selectModelList[selectType.two].isSelect = true;
+          selectModelList[selectType.two].disabled = false;
+          selectModelList[selectType.two].occupationalName = twoInfo.occupationalName;
+          selectModelList[selectType.two].occupationalID = twoInfo.occupationalID;
+          selectModelList[selectType.two].occupationList = occupationalCategoryList.value.filter((x: any) => x.professionLevel == "2"
+              && x.parentOccupationalID == oneInfo.occupationalID).map((x: any) => ({
+            ...x,
+            isSelect: false
+          }));
+          selectModelList[selectType.two].occupationList.find((x: any) => x.occupationalID == twoInfo.occupationalID).isSelect = true;
+
+          getSelectOccupation();
+        }
+      });
+      isOpen.value = true;
+    }
+
+    const onSelectType = (type: number) => {
+      if (selectType.one == type) {
+        selectModelList.map(x => {
+          x.isSelect = false
+          x.disabled = true
+          x.occupationalName = ''
+          x.occupationalID = ''
+          x.occupationList = []
+        });
+
+        selectModelList[selectType.one].isSelect = true;
+        selectModelList[selectType.one].disabled = false;
+        selectModelList[selectType.one].occupationList = occupationalCategoryList.value.filter((x: any) => x.occupationalLevel == "1")
+            .map((x: any) => ({
+              ...x,
+              isSelect: false
+            }));
+      }
+
+
+      if (selectType.two == type) {
+        selectModelList[selectType.one].isSelect = false;
+
+        selectModelList[selectType.two].isSelect = true;
+        selectModelList[selectType.two].disabled = false;
+        selectModelList[selectType.two].occupationalName = '';
+        selectModelList[selectType.two].occupationalID = '';
+        selectModelList[selectType.two].occupationList = occupationalCategoryList.value.filter((x: any) => x.occupationalLevel == "2"
+            && x.parentOccupationalID == selectModelList[selectType.one].occupationalID).map((x: any) => ({
+          ...x,
+          isSelect: false
+        }));
+
+      }
+
+      getSelectOccupation();
+    }
+
+    const onSelect = (item: any, type: any) => {
+
+      selectModelList[type].occupationList.forEach((x: any) => {
+        x.isSelect = x.occupationalID == item.occupationalID;
+      });
+      selectModelList[type].occupationalName = item.occupationalName;
+      selectModelList[type].occupationalID = item.occupationalID;
+
+      if (type == selectType.one) {
+        onSelectType(selectType.two);
+      }
+
+      getSelectOccupation();
+    }
+
+    const getSelectOccupation = () => {
+      selectOccupationInfo.text = selectModelList.filter(x => x.occupationalName != '').map(x => x.occupationalName).join("-");
+      selectOccupationInfo.value = selectModelList[selectType.two].occupationalID;
+    }
+
+    const onCancel = () => {
+      isOpen.value = false;
+    }
+
+    const onConfirm = () => {
+      isOpen.value = false;
+      context.emit("SetOccupationalID", selectOccupationInfo);
+    }
+    return {
+      isOpen,
+      selectType,
+      selectModelList,
+      selectOccupationInfo,
+      loadOccupationalID,
+      onSelectType,
+      onSelect,
+      onCancel,
+      onConfirm,
+    };
+  }
+})
+</script>

+ 209 - 16
h5app/src/views/pages/company/detail.vue

@@ -11,8 +11,22 @@
       </ion-toolbar>
     </ion-header>
     <ion-content>
+      <div class="tabs-striped tabs-top tabs-background-positive tabs-color-light" v-if="curTabIndex!=3">
+        <div class="tabs">
+          <div :class="curTabIndex==1?'active tab-item':'passive tab-item'">
+            <a @click="onTabChange(1)">
+              企业信息
+            </a>
+          </div>
+          <div :class="curTabIndex==2?'active tab-item':'passive tab-item'">
+            <a  @click="onTabChange(2)">
+              岗位信息
+            </a>
+          </div>
+        </div>
+      </div>
       <div class="bw-vue-form">
-        <div class="menu1">
+        <div v-show="curTabIndex==1">
           <div class="form-detail">
             <ion-label>企业名称</ion-label>
             <ion-text>{{ dataModel.companyName }}</ion-text>
@@ -55,11 +69,11 @@
           </div>
           <div class="form-detail">
             <ion-label>营业执照有效期</ion-label>
-            <ion-text>{{ dayjs(dataModel.validDate).format("YYYY-MM-DD") }}</ion-text>
+            <ion-text v-if="dataModel.validDate!=null">{{ dayjs(dataModel.validDate).format("YYYY-MM-DD") }}</ion-text>
           </div>
           <div class="form-detail">
             <ion-label>成立日期</ion-label>
-            <ion-text>{{ dayjs(dataModel.establishmentTime).format("YYYY-MM-DD") }}</ion-text>
+            <ion-text v-if="dataModel.establishmentTime!=null">{{ dayjs(dataModel.establishmentTime).format("YYYY-MM-DD") }}</ion-text>
           </div>
           <div class="form-detail">
             <ion-label>注册资本(万元)</ion-label>
@@ -91,7 +105,7 @@
           </div>
           <div class="form-detail">
             <ion-label>企业网站</ion-label>
-            <ion-text  style="width: 60%;">{{ dataModel.website }}</ion-text>
+            <ion-text  style="width: 60%;text-align: right;">{{ dataModel.website }}</ion-text>
           </div>
           <div class="form-detail">
             <ion-label>企业福利</ion-label>
@@ -114,7 +128,105 @@
             <ion-text>{{ dataModel.companyDesc }}</ion-text>
           </div>
         </div>
+        <div v-show="curTabIndex==2">
+            <div v-if="!loading" id="postList" >
+              <div v-for="(record,key) in curCompanyPostList" :key="key" >
+                  <ion-item detail @click="onPostEdit(record.postID)" class="ion-item">
+                    <ion-label>
+                      <h2>
+                        {{ record.professionName }}
+                      </h2>
+                      <p v-if="record.startTime!=null&&record.endTime!=null">
+                        {{ dayjs(record.startTime).format("YYYY-MM-DD") }}至{{ dayjs(record.endTime).format("YYYY-MM-DD") }}
+                      </p>
+                      <p v-if="record.startTime==null||record.endTime==null">
+                        暂未设置有效期限
+                      </p>
+                      <p>
+                        招聘人数:{{ record.recruitCount }} 人
+                      </p>
+                    </ion-label>
+                  </ion-item>
+              </div>
+            </div>
+          </div>
+        <div v-show="curTabIndex==3">
+          <div class="form-detail">
+            <ion-label>岗位名称</ion-label>
+            <ion-text>{{ curCompanyPostInfo.professionName }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>招聘数量(人)</ion-label>
+            <ion-text>{{ curCompanyPostInfo.recruitCount }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>招聘日期</ion-label>
+            <ion-text>{{ dayjs(curCompanyPostInfo.startTime).format("YYYY-MM-DD")+"至"+dayjs(curCompanyPostInfo.endTime).format("YYYY-MM-DD") }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>招聘地点</ion-label>
+            <ion-text>{{ curCompanyPostInfo.jobPlace }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>工作性质</ion-label>
+            <ion-text>{{ curCompanyPostInfo.workNatureName }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>岗位月薪(元)</ion-label>
+            <ion-text>{{ curCompanyPostInfo.minSalary+"-"+curCompanyPostInfo.maxSalary }}</ion-text>
+          </div>
+          <div class="form-detail" name="isTrailName">
+            <ion-label>是否有试用期</ion-label>
+            <ion-text>{{ curCompanyPostInfo.isTrailName }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>试用期(月)</ion-label>
+            <ion-text>{{ curCompanyPostInfo.trailMonths }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>试用期月薪(元)</ion-label>
+            <ion-text>{{ curCompanyPostInfo.trailMinSalary+"-"+curCompanyPostInfo.trailMaxSalary }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>工作年限要求</ion-label>
+            <ion-text>{{ curCompanyPostInfo.companyName }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>学历要求</ion-label>
+            <ion-text>{{ curCompanyPostInfo.companyName }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>其他要求</ion-label>
+            <ion-text>{{ curCompanyPostInfo.workYear }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>福利待遇</ion-label>
+            <ion-text>{{ curCompanyPostInfo.welfare }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>岗位联系人</ion-label>
+            <ion-text>{{ curCompanyPostInfo.userName }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>岗位联系电话</ion-label>
+            <ion-text>{{ curCompanyPostInfo.userMobile }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>岗位联系人邮箱</ion-label>
+            <ion-text>{{ curCompanyPostInfo.companyName }}</ion-text>
+          </div>
+          <div class="form-detail" name="tagName">
+            <ion-label>岗位标签</ion-label>
+            <ion-text>{{ curCompanyPostInfo.TagName }}</ion-text>
+          </div>
+        </div>
       </div>
+      <ion-infinite-scroll  threshold="100px" @ionInfinite="onScroll($event)">
+        <ion-infinite-scroll-content
+            :loadingText="pageParams.total>pageParams.pageIndex*pageParams.pageSize?'正在加载...':'暂无更多'"
+            loadingSpinner="bubbles">
+        </ion-infinite-scroll-content>
+      </ion-infinite-scroll>
     </ion-content>
     <ion-footer>
     </ion-footer>
@@ -123,9 +235,9 @@
 <script lang="ts">
 import {defineComponent, ref, reactive, watch, toRefs} from "vue";
 import {useRoute, useRouter} from "vue-router";
-import {getCompanyById} from "@/api/company";
-import {onIonViewDidEnter} from "@ionic/vue";
+import {getCompanyById,getCompanyPostList} from "@/api/company";
 import {arrowBackOutline} from 'ionicons/icons';
+import {onIonViewDidEnter} from '@ionic/vue';
 import dayjs from "dayjs";
 
 interface FormData{
@@ -136,26 +248,49 @@ export default defineComponent({
   setup() {
     const router = useRouter();
     const route = useRoute();
+    const pageParams = reactive({
+      pageIndex: 1,
+      pageSize: 10,
+      total:0,
+      companyID:''
+    });
+    const curTabIndex = ref(1);
     const loading = ref<boolean>(false);
     const formData = reactive<FormData>({
-      dataModel: {
-        companyID:null,
-        companyName:null
-      }
+      dataModel: {}
     });
-    const onBack=()=>{
-      router.push({path:'./list',query:{reload:1}});
-    };
+    const curCompanyPostList = ref<any>([]);
+    const curCompanyPostInfo = ref<any>({});
 
-    const onPathForward = (pathValue:string,statusValue:any)=>{
-      router.push({path: pathValue, query: {reload:1,id:formData.dataModel.companyID,status:statusValue}});
+    const onBack=()=>{
+      if(curTabIndex.value!=3){
+        router.push({path:"./list",query:{reload:1}});
+      }else{
+        curTabIndex.value = 2;
+      }
     };
+    const onScroll = (e: any) => {
+      setTimeout(() => {
+        e.target.complete();
+        if (pageParams.total > pageParams.pageIndex * pageParams.pageSize) {
+          pageParams.pageSize += 10;
+          loadData(pageParams.companyID,route.query.loginUserID);
+        }
+      }, 500);
+    }
 
     const loadData = async (companyID:any,loginUserID:any)=>{
       loading.value = true;
+      curTabIndex.value = 1;
+      pageParams.companyID = companyID;
       const reqData = await getCompanyById(companyID,loginUserID);
       formData.dataModel = reqData;
       console.log("dataModel",formData.dataModel);
+      const result = await getCompanyPostList(pageParams);
+      pageParams.total = result.total;
+      console.log("pageParams",pageParams);
+      curCompanyPostList.value = curCompanyPostList.value.concat(result.list);
+      console.log("postList",curCompanyPostList.value);
       loading.value = false;
     };
 
@@ -163,6 +298,19 @@ export default defineComponent({
       loadData(companyID,loginUserID);
     };
 
+    const onTabChange = (tabIndex:number)=>{
+      curTabIndex.value = tabIndex;
+    }
+
+    const onPostEdit = (curPostID:any)=>{
+      curTabIndex.value = 3;
+      (curCompanyPostList.value as any[]).map(item=>{
+        if(item.postID == curPostID){
+          curCompanyPostInfo.value = item;
+          console.log("curCompanyPostInfo",curCompanyPostInfo.value);
+        }
+      })
+    }
 
     onIonViewDidEnter(() => {
       if (route.query.reload) {
@@ -176,9 +324,15 @@ export default defineComponent({
       arrowBackOutline,
       route,
       router,
+      curTabIndex,
+      pageParams,
+      curCompanyPostList,
+      curCompanyPostInfo,
       loading,
-      onPathForward,
+      onTabChange,
+      onPostEdit,
       onBack,
+      onScroll,
       loadData,
       dayjs,
     }
@@ -187,6 +341,45 @@ export default defineComponent({
 </script>
 
 <style lang="less">
+.active{
+  border-bottom: 4px solid #0aa3e9;
+  a{
+    color:#0aa3e9;
+  }
+}
+.passive{
+  color:black;
+  border-bottom: 2px solid gray;
+  a{
+    color:black;
+  }
+}
+.tab-item{
+  height: 35px;
+  width: 50%;
+  float:left;
+  text-align: center;
+  a {
+    font-size: 22px;
+    text-decoration: none;
+  }
+}
+
+#postList {
+  margin: 40px 10px 10px 10px;
+  background-color: white !important;
+
+  .ion-item {
+    margin-top: 10px;
+    font-size: 14px;
+    border-bottom: 1px solid rgb(242, 242, 245);
+
+    p {
+      font-size: 12px;
+    }
+  }
+}
+
 ion-item {
   --border-width: 0;
   --border-style: none;

+ 10 - 3
h5app/src/views/pages/company/editPost.vue

@@ -62,7 +62,7 @@
             <ion-textarea placeholder="请输入招聘地点" :rows="3" label-placement="stacked" :clear-input="true"
                        v-model="dataModel.jobPlace" class="custom" style="border-bottom: 1px solid #fff2e8;">
             </ion-textarea>
-              <ion-note v-show="isCommit&&v$.dataModel.jobPlace.$error" class="danger"  >请输入招聘数量</ion-note>
+              <ion-note v-show="isCommit&&v$.dataModel.jobPlace.$error" class="danger" >请输入招聘地点</ion-note>
           </div>
         </div>
         <div class="bw-vue-form">
@@ -276,6 +276,8 @@ export default defineComponent({
       });
       await alert.present();
     }
+
+
     const onSetProfessionID = (data: any)=>{
       formState.dataModel.professionID = data.value;
       formState.dataModel.professionName = data.text;
@@ -350,6 +352,12 @@ export default defineComponent({
         errorMessage +="招聘结束日期不能早于开始日期!";
         isCommit.value = false;
       }
+      if(formState.dataModel.recruitCount !=null){
+        if(formState.dataModel.recruitCount<0){
+          errorMessage +="招聘数量不能小于0!";
+          isCommit.value = false;
+        }
+      }
       if (formState.dataModel.minSalary!=null) {
         hasMinSalary = true;
         curMinSalary = formState.dataModel.minSalary;
@@ -385,7 +393,7 @@ export default defineComponent({
         }
         if(hasTrailMinSalary){
           if(formState.dataModel.trailMaxSalary < curTrailMinSalary){
-            errorMessage +="试用期最高月薪不能小于岗位最低月薪!";
+            errorMessage +="试用期最高月薪不能小于试用期最低月薪!";
             isCommit.value = false;
           }
         }
@@ -450,7 +458,6 @@ export default defineComponent({
 </script>
 
 <style lang="less">
-
 .stepFlex {
   margin: 0;
   display: flex;

+ 1 - 1
h5app/src/views/pages/company/postList.vue

@@ -49,7 +49,7 @@
                       暂未设置有效期限
                     </p>
                     <p>
-                      招聘数:{{ record.recruitCount }}
+                      招聘数:{{ record.recruitCount }}
                     </p>
                   </ion-label>
                 </ion-item>

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

@@ -163,6 +163,7 @@ export default defineComponent({
     const router = useRouter();
     const route = useRoute();
     const loading = ref(false);
+    const isCommit = ref(false);
     const editForm = ref();
     const curStepData = ref<StepParams>({
       loginUserID:"",
@@ -238,18 +239,50 @@ export default defineComponent({
       jobHuntData.dataModel.professionID = data.value;
       jobHuntData.dataModel.professionName = data.text;
     }
+    const ifInputAllValid = ()=>{
+      let errorMessage = "";
+      let hasMinSalary = false;
+      let curMinSalary = 0;
+      if (jobHuntData.dataModel.minSalary!=null) {
+        hasMinSalary = true;
+        curMinSalary = jobHuntData.dataModel.minSalary;
+        if(jobHuntData.dataModel.minSalary<0){
+          errorMessage +="最低期望月薪不能小于0!";
+          isCommit.value = false;
+        }
+      }
+      if (jobHuntData.dataModel.maxSalary!=null) {
+        if(jobHuntData.dataModel.maxSalary<0){
+          errorMessage +="最高期望月薪不能小于0!";
+          isCommit.value = false;
+        }
+        if(hasMinSalary){
+          if(jobHuntData.dataModel.maxSalary < curMinSalary){
+            errorMessage +="最高期望月薪不能小于最低期望月薪!";
+            isCommit.value = false;
+          }
+        }
+      }
+      if(!isCommit.value){presentAlert(errorMessage);}
+    }
+
     const onSave = async function (){
+      isCommit.value = true;
       const isFormCorrect = await huntDataValid.value.$validate();
       if(!isFormCorrect){
         console.log("当前求职意向数据",jobHuntData.dataModel);
         await presentAlert("请填写完整的信息!");
         return null;
       }
-      saveJobHunt(jobHuntData.dataModel).then(result => {
-        if (result) {
-          router.push({path: './userEdit', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:4,loginUserId:curStepData.value.loginUserID}});
-        }
-      });
+      ifInputAllValid();
+      if(isCommit.value){
+        saveJobHunt(jobHuntData.dataModel).then(result => {
+          if (result) {
+            router.push({path: './userEdit', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:4,loginUserId:curStepData.value.loginUserID}});
+          }
+        });
+      }
+
     }
 
     const onCancel = () => {
@@ -259,6 +292,7 @@ export default defineComponent({
 
     const loadData = async (jobHuntID: any,jobUserID:any,status:any,userID:any) => {
       loading.value = true;
+      isCommit.value = false;
       await getJobHuntTypeList();
       await getJobUserTypeList();
       await getWorkYearTypeList();

+ 7 - 1
h5app/src/views/pages/jobUserInfo/postEdit.vue

@@ -291,6 +291,12 @@ export default defineComponent({
         errorMessage +="招聘结束日期不能早于开始日期!";
         isCommit.value = false;
       }
+      if(formState.dataModel.recruitCount !=null){
+        if(formState.dataModel.recruitCount<0){
+          errorMessage +="招聘数量不能小于0!<br/>";
+          isCommit.value = false;
+        }
+      }
       if (formState.dataModel.minSalary!=null) {
         hasMinSalary = true;
         curMinSalary = formState.dataModel.minSalary;
@@ -326,7 +332,7 @@ export default defineComponent({
         }
         if(hasTrailMinSalary){
           if(formState.dataModel.trailMaxSalary < curTrailMinSalary){
-            errorMessage +="试用期最高月薪不能小于岗位最低月薪!";
+            errorMessage +="试用期最高月薪不能小于试用期最低月薪!";
             isCommit.value = false;
           }
         }

+ 1 - 1
h5app/src/views/pages/jobUserInfo/postList.vue

@@ -49,7 +49,7 @@
                       暂未设置有效期限
                     </p>
                     <p>
-                      招聘数:{{ record.recruitCount }}
+                      招聘数:{{ record.recruitCount }}
                     </p>
                   </ion-label>
                 </ion-item>

+ 44 - 9
h5app/src/views/pages/jobUserInfo/userEdit.vue

@@ -174,14 +174,22 @@
                   </ion-select-option>
                 </ion-select>
               </div>
-              <div class="form-select">
+              <div class="form-input">
                 <ion-label>职业资格类别</ion-label>
-                <ion-select name="occupationalCategory"  id="occupationalCategory" okText="确定" cancelText="取消" v-model="baseData.occupationalCategory"
-                            interface="action-sheet" placeholder="请选择职业资格类别" style="width:100%;text-align:left;" >
-                  <ion-select-option v-for=" (it,key) in occupationalCategoryList" :key="key" :value="it.value">
-                    {{ it.name }}
-                  </ion-select-option>
-                </ion-select>
+                <div>
+                  <ion-input placeholder="请选择职业资格类别" label-placement="stacked" style="float: left;width:78%;"
+                             v-model="baseData.occupationalCategoryName" class="custom">
+                  </ion-input>
+                  <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
+                    <category-selection  :OccupationalID="baseData.occupationalCategory" @SetOccupationalID="onSetOccupationalID"></category-selection>
+                  </ion-item>
+                </div>
+<!--                <ion-select name="occupationalCategory"  id="occupationalCategory" okText="确定" cancelText="取消" v-model="baseData.occupationalCategory"-->
+<!--                            interface="action-sheet" placeholder="请选择职业资格类别" style="width:100%;text-align:left;" >-->
+<!--                  <ion-select-option v-for=" (it,key) in occupationalCategoryList" :key="key" :value="it.value">-->
+<!--                    {{ it.name }}-->
+<!--                  </ion-select-option>-->
+<!--                </ion-select>-->
               </div>
               <div class="form-select">
                 <ion-label>职业资格等级</ion-label>
@@ -454,6 +462,7 @@ import {getEducationListByJobUserID} from "@/api/education";
 import {getExperienceListByJobUserID} from "@/api/experience";
 import {getJobHuntListByJobUserID} from "@/api/jobHuntInfo";
 import dayjs from "dayjs";
+import CategorySelection from "@/components/ocCategorySelection.vue";
 
 interface SelectProps {
   name: string,
@@ -465,6 +474,7 @@ interface StepParams{
 }
 export default defineComponent({
   name: "jobUserInfoEdit",
+  components:{CategorySelection},
   setup() {
     const route = useRoute();
     const router = useRouter();
@@ -491,6 +501,9 @@ export default defineComponent({
     const maritalStatusList  = ref<SelectProps[]>([]);
     const provinceList  = ref<SelectProps[]>([{name:'广东省',value:'440000000000000'}]);
     const nationTypeList  = ref<SelectProps[]>([]);
+    const isFullTimeList  = ref<SelectProps[]>([]);
+    //const occupationalCategoryList  = ref<SelectProps[]>([]);
+    const occupationalLevelList  = ref<SelectProps[]>([]);
     const familyNatureList = ref([]);
     const politicsStatusList = ref([]);
     const regionList  = ref<SelectProps[]>([]);
@@ -509,7 +522,6 @@ export default defineComponent({
         address: null,
         jobStatusID: null,
         keyPersonTypeID: null,
-        nation:null,
         politicsStatusID:null,
         birthPlace:null,
         birthDay:null,
@@ -530,6 +542,14 @@ export default defineComponent({
         email:'',
         hobby:null,
         personalSkills:null,
+        socialSecurityCard:"",
+        finishSchool:null,
+        profession:null,
+        nativePlace:null,
+        isFullTime:null,
+        occupationalCategory:null,
+        occupationalCategoryName:null,
+        occupationalLevel:null,
         openId:null
       }});
     const pageParams = reactive({
@@ -543,7 +563,7 @@ export default defineComponent({
       return {baseData:{
           siteID:{required},
           name:{required},
-          identityNumber:{required:true,},
+          identityNumber:{required},
           sex:{required},
           userMobile:{required},
           address:{required},
@@ -675,6 +695,11 @@ export default defineComponent({
       }
     };
 
+    const onSetOccupationalID = (data: any)=>{
+      baseInfoData.baseData.occupationalCategory = data.value;
+      baseInfoData.baseData.occupationalCategoryName = data.text;
+    }
+
     const onSave = async function (){
       if (curStepData.value.statusVal==1){
         const isFormCorrect = await baseDataValid.value.$validate();
@@ -739,6 +764,12 @@ export default defineComponent({
       familyNatureList.value = familyNatureResult;
       const nationTypeListResult :any = await getSysDictionaryList("NationType");
       nationTypeList.value = nationTypeListResult;
+      const isFullTimeListResult :any = await getSysDictionaryList("IsFullTime");
+      isFullTimeList.value = isFullTimeListResult;
+      //const occupationalCategoryListResult :any = await getSysDictionaryList("OccupationalCategory");
+      //occupationalCategoryList.value = occupationalCategoryListResult;
+      const occupationalLevelListResult :any = await getSysDictionaryList("OccupationalLevel");
+      occupationalLevelList.value = occupationalLevelListResult;
     }
 
     const getSiteInfoList = async function(){
@@ -833,6 +864,9 @@ export default defineComponent({
       siteInfoList,
       genderList,
       nationTypeList,
+      isFullTimeList,
+      //occupationalCategoryList,
+      occupationalLevelList,
       familyNatureList,
       politicsStatusList,
       pageParams,
@@ -858,6 +892,7 @@ export default defineComponent({
       expandChange,
       provinceChange,
       regionChange,
+      onSetOccupationalID,
       onSave,
       onBack,
       onFinish,

+ 2 - 2
h5app/src/views/pages/jobhunt/detail.vue

@@ -75,7 +75,7 @@
         </div>
         <div class="form-detail">
           <ion-label>职业资格类别</ion-label>
-          <ion-text style="width: 52%;">{{ dataModel.occupationalCategoryName }}</ion-text>
+          <ion-text style="width: 52%;text-align:right;">{{ dataModel.occupationalCategoryName }}</ion-text>
         </div>
         <div class="form-detail">
           <ion-label>职业资格等级</ion-label>
@@ -87,7 +87,7 @@
         </div>
         <div class="form-detail">
           <ion-label>出生日期</ion-label>
-          <ion-text>{{ dayjs(dataModel.birthDay).format("YYYY-MM-DD") }}</ion-text>
+          <ion-text v-if="dataModel.birthDay!=null">{{ dayjs(dataModel.birthDay).format("YYYY-MM-DD") }}</ion-text>
         </div>
         <div class="form-detail">
           <ion-label>户口性质</ion-label>

+ 36 - 13
h5app/src/views/pages/jobhunt/edit.vue

@@ -171,14 +171,22 @@
               </ion-select-option>
             </ion-select>
           </div>
-          <div class="form-select">
+          <div class="form-input">
             <ion-label>职业资格类别</ion-label>
-            <ion-select name="occupationalCategory"  id="occupationalCategory" okText="确定" cancelText="取消" v-model="baseData.occupationalCategory"
-                        interface="action-sheet" placeholder="请选择职业资格类别" style="width:100%;text-align:left;" >
-              <ion-select-option v-for=" (it,key) in occupationalCategoryList" :key="key" :value="it.value">
-                {{ it.name }}
-              </ion-select-option>
-            </ion-select>
+            <div>
+              <ion-input placeholder="请选择职业资格类别" label-placement="stacked" style="float: left;width:78%;"
+                         v-model="baseData.occupationalCategoryName" class="custom">
+              </ion-input>
+              <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
+                <category-selection  :OccupationalID="baseData.occupationalCategory" @SetOccupationalID="onSetOccupationalID"></category-selection>
+              </ion-item>
+            </div>
+<!--            <ion-select name="occupationalCategory"  id="occupationalCategory" okText="确定" cancelText="取消" v-model="baseData.occupationalCategory"-->
+<!--                        interface="action-sheet" placeholder="请选择职业资格类别" style="width:100%;text-align:left;" >-->
+<!--              <ion-select-option v-for=" (it,key) in occupationalCategoryList" :key="key" :value="it.value">-->
+<!--                {{ it.name }}-->
+<!--              </ion-select-option>-->
+<!--            </ion-select>-->
           </div>
           <div class="form-select">
             <ion-label>职业资格等级</ion-label>
@@ -454,6 +462,7 @@ import {getSysDictionaryList} from '@/api/system/dictionary';
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import dayjs from "dayjs";
 import {useUserStore} from "@/store/modules/user";
+import CategorySelection from "@/components/ocCategorySelection.vue";
 
 interface SelectProps {
   name: string,
@@ -465,6 +474,7 @@ interface StepParams{
 }
 export default defineComponent({
   name: 'jobUserEdit',
+  components:{CategorySelection},
   setup() {
     const router = useRouter();
     const route = useRoute();
@@ -494,7 +504,7 @@ export default defineComponent({
     const provinceList  = ref<SelectProps[]>([{name:'广东省',value:'440000000000000'}]);
     const nationTypeList  = ref<SelectProps[]>([]);
     const isFullTimeList  = ref<SelectProps[]>([]);
-    const occupationalCategoryList  = ref<SelectProps[]>([]);
+    //const occupationalCategoryList  = ref<SelectProps[]>([]);
     const occupationalLevelList  = ref<SelectProps[]>([]);
     const familyNatureList = ref([]);
     const politicsStatusList = ref([]);
@@ -514,7 +524,6 @@ export default defineComponent({
         address: null,
         jobStatusID: null,
         keyPersonTypeID: null,
-        nation:null,
         politicsStatusID:null,
         birthPlace:null,
         birthDay:null,
@@ -535,6 +544,14 @@ export default defineComponent({
         email:'',
         hobby:null,
         personalSkills:null,
+        socialSecurityCard:"",
+        finishSchool:null,
+        profession:null,
+        nativePlace:null,
+        isFullTime:null,
+        occupationalCategory:null,
+        occupationalCategoryName:null,
+        occupationalLevel:null
       }});
     const pageParams = reactive({
       pageIndex: 1,
@@ -546,7 +563,7 @@ export default defineComponent({
       return {baseData:{
           siteID:{required},
           name:{required},
-          identityNumber:{required:true,},
+          identityNumber:{required},
           sex:{required},
           userMobile:{required},
           address:{required},
@@ -678,6 +695,11 @@ export default defineComponent({
       }
     };
 
+    const onSetOccupationalID = (data: any)=>{
+      baseInfoData.baseData.occupationalCategory = data.value;
+      baseInfoData.baseData.occupationalCategoryName = data.text;
+    }
+
     const onSave = async function (){
       if (curStepData.value.statusVal==1){
         const isFormCorrect = await baseDataValid.value.$validate();
@@ -745,8 +767,8 @@ export default defineComponent({
       nationTypeList.value = nationTypeListResult;
       const isFullTimeListResult :any = await getSysDictionaryList("IsFullTime");
       isFullTimeList.value = isFullTimeListResult;
-      const occupationalCategoryListResult :any = await getSysDictionaryList("OccupationalCategory");
-      occupationalCategoryList.value = occupationalCategoryListResult;
+      //const occupationalCategoryListResult :any = await getSysDictionaryList("OccupationalCategory");
+      //occupationalCategoryList.value = occupationalCategoryListResult;
       const occupationalLevelListResult :any = await getSysDictionaryList("OccupationalLevel");
       occupationalLevelList.value = occupationalLevelListResult;
     }
@@ -841,7 +863,7 @@ export default defineComponent({
       genderList,
       nationTypeList,
       isFullTimeList,
-      occupationalCategoryList,
+      //occupationalCategoryList,
       occupationalLevelList,
       familyNatureList,
       politicsStatusList,
@@ -868,6 +890,7 @@ export default defineComponent({
       expandChange,
       provinceChange,
       regionChange,
+      onSetOccupationalID,
       onSave,
       onBack,
       onFinish,

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

@@ -163,6 +163,7 @@ export default defineComponent({
     const router = useRouter();
     const route = useRoute();
     const loading = ref(false);
+    const isCommit = ref(false);
     const editForm = ref();
     const curStepData = ref<StepParams>({
       name:"",
@@ -238,18 +239,50 @@ export default defineComponent({
       jobHuntData.dataModel.professionID = data.value;
       jobHuntData.dataModel.professionName = data.text;
     }
+
+    const ifInputAllValid = ()=>{
+      let errorMessage = "";
+      let hasMinSalary = false;
+      let curMinSalary = 0;
+      if (jobHuntData.dataModel.minSalary!=null) {
+        hasMinSalary = true;
+        curMinSalary = jobHuntData.dataModel.minSalary;
+        if(jobHuntData.dataModel.minSalary<0){
+          errorMessage +="最低期望月薪不能小于0!";
+          isCommit.value = false;
+        }
+      }
+      if (jobHuntData.dataModel.maxSalary!=null) {
+        if(jobHuntData.dataModel.maxSalary<0){
+          errorMessage +="最高期望月薪不能小于0!";
+          isCommit.value = false;
+        }
+        if(hasMinSalary){
+          if(jobHuntData.dataModel.maxSalary < curMinSalary){
+            errorMessage +="最高期望月薪不能小于最低期望月薪!";
+            isCommit.value = false;
+          }
+        }
+      }
+      if(!isCommit.value){presentAlert(errorMessage);}
+    }
+
     const onSave = async function (){
+      isCommit.value = true;
       const isFormCorrect = await huntDataValid.value.$validate();
       if(!isFormCorrect){
         console.log("当前求职意向数据",jobHuntData.dataModel);
         await presentAlert("请填写完整的信息!");
         return null;
       }
-      saveJobHunt(jobHuntData.dataModel).then(result => {
-        if (result) {
-          router.push({path: './edit', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:4}});
-        }
-      });
+      ifInputAllValid();
+      if(isCommit.value){
+        saveJobHunt(jobHuntData.dataModel).then(result => {
+          if (result) {
+            router.push({path: './edit', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:4}});
+          }
+        });
+      }
     }
 
     const onCancel = () => {
@@ -259,6 +292,7 @@ export default defineComponent({
 
     const loadData = async (jobHuntID: any,jobUserID:any,status:any) => {
       loading.value = true;
+      isCommit.value = false;
       await getJobHuntTypeList();
       await getJobUserTypeList();
       await getWorkYearTypeList();

+ 1 - 0
src/main/java/com/hz/employmentsite/controller/jobUserManager/JobUserController.java

@@ -63,6 +63,7 @@ public class JobUserController {
         if (data == null) {
             data = new JobUserVo();
             data.setJobUserID(UUID.randomUUID().toString());
+            data.setSocialSecurityCard("");
             PcSiteUserExample siteUserExp = new PcSiteUserExample();
             siteUserExp.or().andUserIDEqualTo(loginUserID);
             //siteUserExp.or().andUserIDEqualTo(accountService.getLoginUserID());

+ 8 - 4
src/main/java/com/hz/employmentsite/controller/jobUserManager/RecommendMgtController.java

@@ -6,10 +6,7 @@ import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.model.PcRecommendMgt;
 import com.hz.employmentsite.services.service.AccountService;
 import com.hz.employmentsite.services.service.jobUserManager.RecommendMgtService;
-import com.hz.employmentsite.vo.jobUserManager.ProfessionLevel;
-import com.hz.employmentsite.vo.jobUserManager.RecommendCompanyPostVo;
-import com.hz.employmentsite.vo.jobUserManager.RecommendJobVo;
-import com.hz.employmentsite.vo.jobUserManager.RecommendMgtVo;
+import com.hz.employmentsite.vo.jobUserManager.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -83,4 +80,11 @@ public class RecommendMgtController {
         List<ProfessionLevel> result = recommendMgtService.getProfessionLevelList();
         return RespGenerstor.success(result);
     }
+
+    @ResponseBody
+    @GetMapping("/getOccupationCategoryList")
+    public BaseResponse getOccupationCategoryList() {
+        List<OccupationCategory> result = recommendMgtService.getOccupationCategoryList();
+        return RespGenerstor.success(result);
+    }
 }

+ 3 - 4
src/main/java/com/hz/employmentsite/mapper/cquery/RecommendMgtCQuery.java

@@ -1,9 +1,6 @@
 package com.hz.employmentsite.mapper.cquery;
 
-import com.hz.employmentsite.vo.jobUserManager.ProfessionLevel;
-import com.hz.employmentsite.vo.jobUserManager.RecommendCompanyPostVo;
-import com.hz.employmentsite.vo.jobUserManager.RecommendJobVo;
-import com.hz.employmentsite.vo.jobUserManager.RecommendMgtVo;
+import com.hz.employmentsite.vo.jobUserManager.*;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.HashMap;
@@ -55,6 +52,8 @@ public interface RecommendMgtCQuery {
 
    List<ProfessionLevel> getProfessionLevelList();
 
+   List<OccupationCategory> getOccupationCategoryList();
+
 
     List<HashMap<String, Object>> getCompanypostToUsermessageList();
     List<HashMap<String, Object>> getUserhuntpostToCompanymessageList();

+ 1 - 1
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobUserServiceImpl.java

@@ -343,7 +343,7 @@ public class JobUserServiceImpl implements JobUserService {
         result += ifRepeatIdentity? 1:0;
         result += ifRepeatMobile? 2:0;
 
-        if(!data.getSocialSecurityCard().equals(null)){
+        if( data.getSocialSecurityCard()!=null && data.getSocialSecurityCard()!=""){
             PcJobuserExample jobUserExp3= new PcJobuserExample();
             jobUserExp3.or().andUserMobileEqualTo(data.getSocialSecurityCard()).andJobuserIDNotEqualTo(data.getJobUserID());
             var ifRepeatSocialCard = pcJobuserMapper.selectByExample(jobUserExp3).size()>0;

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

@@ -11,10 +11,7 @@ import com.hz.employmentsite.model.WxMessagetempsettingField;
 import com.hz.employmentsite.services.service.WechatService;
 import com.hz.employmentsite.services.service.jobUserManager.RecommendMgtService;
 import com.hz.employmentsite.util.StringUtils;
-import com.hz.employmentsite.vo.jobUserManager.ProfessionLevel;
-import com.hz.employmentsite.vo.jobUserManager.RecommendCompanyPostVo;
-import com.hz.employmentsite.vo.jobUserManager.RecommendJobVo;
-import com.hz.employmentsite.vo.jobUserManager.RecommendMgtVo;
+import com.hz.employmentsite.vo.jobUserManager.*;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -126,6 +123,9 @@ public class RecommendMgtServiceImpl implements RecommendMgtService {
         return recommendMgtCQuery.getProfessionLevelList();
     }
 
+    public List<OccupationCategory> getOccupationCategoryList() {
+        return recommendMgtCQuery.getOccupationCategoryList();
+    }
 
     @Override
     public void sendWxMessage() {

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

@@ -2,10 +2,7 @@ package com.hz.employmentsite.services.service.jobUserManager;
 
 import com.github.pagehelper.PageInfo;
 import com.hz.employmentsite.model.PcRecommendMgt;
-import com.hz.employmentsite.vo.jobUserManager.ProfessionLevel;
-import com.hz.employmentsite.vo.jobUserManager.RecommendCompanyPostVo;
-import com.hz.employmentsite.vo.jobUserManager.RecommendJobVo;
-import com.hz.employmentsite.vo.jobUserManager.RecommendMgtVo;
+import com.hz.employmentsite.vo.jobUserManager.*;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.web.bind.annotation.RequestParam;
 
@@ -64,5 +61,7 @@ public interface RecommendMgtService {
 
     List<ProfessionLevel> getProfessionLevelList();
 
+    List<OccupationCategory> getOccupationCategoryList();
+
     void sendWxMessage();
 }

+ 8 - 0
src/main/java/com/hz/employmentsite/vo/jobUserManager/OccupationCategory.java

@@ -0,0 +1,8 @@
+package com.hz.employmentsite.vo.jobUserManager;
+
+
+import com.hz.employmentsite.model.PcOccupational;
+
+public class OccupationCategory extends PcOccupational {
+    public String occupationalLevel;
+}

+ 10 - 0
src/main/resources/mapping/cquery/RecommendMgtCQuery.xml

@@ -196,6 +196,16 @@
                                                  on a.ParentProfessionID = b.ProfessionID) bb
                             on c.ParentProfessionID = bb.ProfessionID
     </select>
+    <select id="getOccupationCategoryList" resultType="com.hz.employmentsite.vo.jobUserManager.OccupationCategory">
+        select OccupationalID, ParentOccupationalID, OccupationalName, '1' as OccupationalLevel
+        from pc_occupational
+        where ParentOccupationalID = '0'
+        union all
+        select a.OccupationalID, a.ParentOccupationalID, a.OccupationalName, '2' as OccupationalLevel
+        from pc_occupational a
+                 inner join (select OccupationalID from pc_occupational where ParentOccupationalID = '0') b
+                            on a.ParentOccupationalID = b.OccupationalID
+    </select>
     <select id="getCompanypostToUsermessageList" resultType="java.util.HashMap">
         select a.recommendmgtid,
                e.openId     as userOpenId,