Browse Source

Merge remote-tracking branch 'origin/master'

lizeyu 11 months ago
parent
commit
7398d919fa
28 changed files with 811 additions and 243 deletions
  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. 7 7
      h5app/src/router/index.ts
  5. 209 16
      h5app/src/views/pages/company/detail.vue
  6. 10 3
      h5app/src/views/pages/company/editPost.vue
  7. 1 1
      h5app/src/views/pages/company/postList.vue
  8. 40 6
      h5app/src/views/pages/jobUserInfo/jobHuntEdit.vue
  9. 7 1
      h5app/src/views/pages/jobUserInfo/postEdit.vue
  10. 1 1
      h5app/src/views/pages/jobUserInfo/postList.vue
  11. 44 10
      h5app/src/views/pages/jobUserInfo/userEdit.vue
  12. 2 2
      h5app/src/views/pages/jobhunt/detail.vue
  13. 36 13
      h5app/src/views/pages/jobhunt/edit.vue
  14. 39 5
      h5app/src/views/pages/jobhunt/jobHuntEdit.vue
  15. 4 4
      h5app/src/views/sapp/tabMain.vue
  16. 2 1
      src/main/java/com/hz/employmentsite/controller/jobUserManager/JobUserController.java
  17. 8 4
      src/main/java/com/hz/employmentsite/controller/jobUserManager/RecommendMgtController.java
  18. 3 4
      src/main/java/com/hz/employmentsite/mapper/cquery/RecommendMgtCQuery.java
  19. 4 4
      src/main/java/com/hz/employmentsite/model/PcJobuser.java
  20. 4 4
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/RecommendMgtServiceImpl.java
  21. 3 4
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/RecommendMgtService.java
  22. 2 1
      src/main/java/com/hz/employmentsite/vo/jobUserManager/JobUserVo.java
  23. 8 0
      src/main/java/com/hz/employmentsite/vo/jobUserManager/OccupationCategory.java
  24. 35 35
      src/main/resources/mapping/PcJobuserMapper.xml
  25. 3 1
      src/main/resources/mapping/cquery/JobUserCQuery.xml
  26. 10 0
      src/main/resources/mapping/cquery/RecommendMgtCQuery.xml
  27. 3 3
      vue/src/views/jobUserManager/jobuser/index.vue
  28. 10 8
      vue/src/views/jobUserManager/jobuser/vitae.vue

+ 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>

+ 7 - 7
h5app/src/router/index.ts

@@ -110,31 +110,31 @@ const routes: Array<RouteRecordRaw> = [
                 component: () => import('@/views/pages/post/detail.vue')
             },
             {
-                path: 'tabMain/work/log/list',
+                path: 'tabMain/workLog/list',
                 component: () => import('@/views/pages/work/log/list.vue')
             },
             {
-                path: 'tabMain/work/log/edit',
+                path: 'tabMain/workLog/edit',
                 component: () => import('@/views/pages/work/log/edit.vue')
             },
             {
-                path: 'tabMain/work/log/detail',
+                path: 'tabMain/workLog/detail',
                 component: () => import('@/views/pages/work/log/detail.vue')
             },
             {
-                path: 'tabMain/work/task/list',
+                path: 'tabMain/workTask/list',
                 component: () => import('@/views/pages/work/task/list.vue')
             },
             {
-                path: 'tabMain/work/task/edit',
+                path: 'tabMain/workTask/edit',
                 component: () => import('@/views/pages/work/task/edit.vue')
             },
             {
-                path: 'tabMain/work/task/detail',
+                path: 'tabMain/workTask/detail',
                 component: () => import('@/views/pages/work/task/detail.vue')
             },
             {
-                path: 'tabMain/work/task/myTask',
+                path: 'tabMain/workTask/myTask',
                 component: () => import('@/views/pages/work/task/myTask.vue')
             },
             {

+ 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>

+ 40 - 6
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,19 +239,51 @@ 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;
       }
-      jobHuntData.dataModel.loginUserID = curStepData.value.loginUserID;
-      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){
+        jobHuntData.dataModel.loginUserID = curStepData.value.loginUserID;
+        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 = () => {
@@ -260,6 +293,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

@@ -299,6 +299,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;
@@ -334,7 +340,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 - 10
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,
         loginUserID:''
       }});
@@ -544,7 +564,7 @@ export default defineComponent({
       return {baseData:{
           siteID:{required},
           name:{required},
-          identityNumber:{required:true,},
+          identityNumber:{required},
           sex:{required},
           userMobile:{required},
           address:{required},
@@ -676,6 +696,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();
@@ -741,6 +766,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(){
@@ -772,7 +803,6 @@ export default defineComponent({
       pageParams.jobUserID = jobUserID;
       pageParams.openID = openId;
       baseInfoData.baseData.jobUserID = jobUserID;
-      baseInfoData.baseData.openId = openId;
       curStepData.value.statusVal = status;
       curStepData.value.loginUserID = userId;
       console.log("当前curStepData",curStepData.value);
@@ -836,6 +866,9 @@ export default defineComponent({
       siteInfoList,
       genderList,
       nationTypeList,
+      isFullTimeList,
+      //occupationalCategoryList,
+      occupationalLevelList,
       familyNatureList,
       politicsStatusList,
       pageParams,
@@ -861,6 +894,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();

+ 4 - 4
h5app/src/views/sapp/tabMain.vue

@@ -40,7 +40,7 @@
           </div>
           <div class="tool-title">推荐库</div>
         </a>
-        <a class="tool-item box-line"  @click="router.push('/tabs/tabMain/work/task/list')">
+        <a class="tool-item box-line" @click="router.push('/tabs/tabMain/workTask/list')">
           <div class="tool-img">
             <img src="@/assets/icon/gzrw.png">
           </div>
@@ -48,7 +48,7 @@
         </a>
 
 
-        <a class="tool-item box-line"  @click="router.push('/tabs/tabMain/work/log/list')">
+        <a class="tool-item box-line" @click="router.push('/tabs/tabMain/workLog/list')">
           <div class="tool-img">
             <img src="@/assets/icon/gzrz.png">
           </div>
@@ -114,11 +114,11 @@ export default defineComponent({
     }
 
     const onDetail = (doTaskID:string) =>{
-      router.push({path: "/tabs/tabMain/work/task/edit", query: {reload: 1, doTaskID: doTaskID}});
+      router.push({path: "/tabs/tabMain/workTask/edit", query: {reload: 1, doTaskID: doTaskID}});
     }
 
     function onTaskList() {
-      router.push("/tabs/tabMain/work/task/list");
+      router.push("/tabs/tabMain/workTask/list");
     }
 
     const onScroll = (e: any) => {

+ 2 - 1
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());
@@ -164,7 +165,7 @@ public class JobUserController {
                 row.add(item.getName());
                 row.add(item.getIdentityNumber());
                 row.add(item.getGenderName());
-                row.add(item.getNation());
+                row.add(item.getNationName());
                 row.add(item.getUserMobile());
                 row.add(item.siteName);
                 row.add(dateUtils.getAgeForIdCard(item.getIdentityNumber()));

+ 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();

+ 4 - 4
src/main/java/com/hz/employmentsite/model/PcJobuser.java

@@ -17,7 +17,7 @@ public class PcJobuser {
 
     private Integer sex;
 
-    private String nation;
+    private Integer nation;
 
     private Integer politicsStatusID;
 
@@ -147,12 +147,12 @@ public class PcJobuser {
         this.sex = sex;
     }
 
-    public String getNation() {
+    public Integer getNation() {
         return nation;
     }
 
-    public void setNation(String nation) {
-        this.nation = nation == null ? null : nation.trim();
+    public void setNation(Integer nation) {
+        this.nation = nation;
     }
 
     public Integer getPoliticsStatusID() {

+ 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();
 }

+ 2 - 1
src/main/java/com/hz/employmentsite/vo/jobUserManager/JobUserVo.java

@@ -32,7 +32,8 @@ public class JobUserVo {
 
     private Integer sex;
 
-    private String nation;
+    private Integer nation;
+    private String nationName;
 
     private Integer politicsStatusID;
 

+ 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;
+}

+ 35 - 35
src/main/resources/mapping/PcJobuserMapper.xml

@@ -9,7 +9,7 @@
     <result column="PyName" jdbcType="VARCHAR" property="pyName"/>
     <result column="EngName" jdbcType="VARCHAR" property="engName"/>
     <result column="Sex" jdbcType="INTEGER" property="sex"/>
-    <result column="Nation" jdbcType="VARCHAR" property="nation"/>
+    <result column="Nation" jdbcType="INTEGER" property="nation"/>
     <result column="PoliticsStatusID" jdbcType="INTEGER" property="politicsStatusID"/>
     <result column="Birthplace" jdbcType="VARCHAR" property="birthplace"/>
     <result column="BirthDay" jdbcType="TIMESTAMP" property="birthDay"/>
@@ -163,7 +163,7 @@
                             OccupationalCategory, OccupationalLevel)
     values (#{jobuserID,jdbcType=VARCHAR}, #{siteID,jdbcType=VARCHAR}, #{identityNumber,jdbcType=VARCHAR},
             #{name,jdbcType=VARCHAR}, #{pyName,jdbcType=VARCHAR}, #{engName,jdbcType=VARCHAR},
-            #{sex,jdbcType=INTEGER}, #{nation,jdbcType=VARCHAR}, #{politicsStatusID,jdbcType=INTEGER},
+            #{sex,jdbcType=INTEGER}, #{nation,jdbcType=INTEGER}, #{politicsStatusID,jdbcType=INTEGER},
             #{birthplace,jdbcType=VARCHAR}, #{birthDay,jdbcType=TIMESTAMP}, #{familyNatureID,jdbcType=INTEGER},
             #{cultureRank,jdbcType=INTEGER}, #{healthID,jdbcType=INTEGER}, #{bloodTypeID,jdbcType=INTEGER},
             #{height,jdbcType=VARCHAR}, #{vision,jdbcType=VARCHAR}, #{weight,jdbcType=VARCHAR},
@@ -336,7 +336,7 @@
         #{sex,jdbcType=INTEGER},
       </if>
       <if test="nation != null">
-        #{nation,jdbcType=VARCHAR},
+        #{nation,jdbcType=INTEGER},
       </if>
       <if test="politicsStatusID != null">
         #{politicsStatusID,jdbcType=INTEGER},
@@ -479,7 +479,7 @@
         Sex = #{row.sex,jdbcType=INTEGER},
       </if>
       <if test="row.nation != null">
-        Nation = #{row.nation,jdbcType=VARCHAR},
+        Nation = #{row.nation,jdbcType=INTEGER},
       </if>
       <if test="row.politicsStatusID != null">
         PoliticsStatusID = #{row.politicsStatusID,jdbcType=INTEGER},
@@ -597,21 +597,21 @@
   <update id="updateByExample" parameterType="map">
     update pc_jobuser
     set JobuserID = #{row.jobuserID,jdbcType=VARCHAR},
-      SiteID = #{row.siteID,jdbcType=VARCHAR},
-      IdentityNumber = #{row.identityNumber,jdbcType=VARCHAR},
-      Name = #{row.name,jdbcType=VARCHAR},
-      PyName = #{row.pyName,jdbcType=VARCHAR},
-      EngName = #{row.engName,jdbcType=VARCHAR},
-      Sex = #{row.sex,jdbcType=INTEGER},
-      Nation = #{row.nation,jdbcType=VARCHAR},
-      PoliticsStatusID = #{row.politicsStatusID,jdbcType=INTEGER},
-      Birthplace = #{row.birthplace,jdbcType=VARCHAR},
-      BirthDay = #{row.birthDay,jdbcType=TIMESTAMP},
-      FamilyNatureID = #{row.familyNatureID,jdbcType=INTEGER},
-      CultureRank = #{row.cultureRank,jdbcType=INTEGER},
-      HealthID = #{row.healthID,jdbcType=INTEGER},
-      BloodTypeID = #{row.bloodTypeID,jdbcType=INTEGER},
-      Height = #{row.height,jdbcType=VARCHAR},
+    SiteID = #{row.siteID,jdbcType=VARCHAR},
+    IdentityNumber = #{row.identityNumber,jdbcType=VARCHAR},
+    Name = #{row.name,jdbcType=VARCHAR},
+    PyName = #{row.pyName,jdbcType=VARCHAR},
+    EngName = #{row.engName,jdbcType=VARCHAR},
+    Sex = #{row.sex,jdbcType=INTEGER},
+    Nation = #{row.nation,jdbcType=INTEGER},
+    PoliticsStatusID = #{row.politicsStatusID,jdbcType=INTEGER},
+    Birthplace = #{row.birthplace,jdbcType=VARCHAR},
+    BirthDay = #{row.birthDay,jdbcType=TIMESTAMP},
+    FamilyNatureID = #{row.familyNatureID,jdbcType=INTEGER},
+    CultureRank = #{row.cultureRank,jdbcType=INTEGER},
+    HealthID = #{row.healthID,jdbcType=INTEGER},
+    BloodTypeID = #{row.bloodTypeID,jdbcType=INTEGER},
+    Height = #{row.height,jdbcType=VARCHAR},
     Vision = #{row.vision,jdbcType=VARCHAR},
     Weight = #{row.weight,jdbcType=VARCHAR},
     MaritalStatusID = #{row.maritalStatusID,jdbcType=INTEGER},
@@ -666,7 +666,7 @@
         Sex = #{sex,jdbcType=INTEGER},
       </if>
       <if test="nation != null">
-        Nation = #{nation,jdbcType=VARCHAR},
+        Nation = #{nation,jdbcType=INTEGER},
       </if>
       <if test="politicsStatusID != null">
         PoliticsStatusID = #{politicsStatusID,jdbcType=INTEGER},
@@ -781,21 +781,21 @@
   </update>
   <update id="updateByPrimaryKey" parameterType="com.hz.employmentsite.model.PcJobuser">
     update pc_jobuser
-    set SiteID = #{siteID,jdbcType=VARCHAR},
-        IdentityNumber = #{identityNumber,jdbcType=VARCHAR},
-        Name = #{name,jdbcType=VARCHAR},
-        PyName = #{pyName,jdbcType=VARCHAR},
-        EngName = #{engName,jdbcType=VARCHAR},
-        Sex = #{sex,jdbcType=INTEGER},
-        Nation = #{nation,jdbcType=VARCHAR},
-        PoliticsStatusID = #{politicsStatusID,jdbcType=INTEGER},
-        Birthplace = #{birthplace,jdbcType=VARCHAR},
-        BirthDay = #{birthDay,jdbcType=TIMESTAMP},
-        FamilyNatureID = #{familyNatureID,jdbcType=INTEGER},
-        CultureRank = #{cultureRank,jdbcType=INTEGER},
-        HealthID = #{healthID,jdbcType=INTEGER},
-        BloodTypeID = #{bloodTypeID,jdbcType=INTEGER},
-        Height = #{height,jdbcType=VARCHAR},
+    set SiteID               = #{siteID,jdbcType=VARCHAR},
+        IdentityNumber       = #{identityNumber,jdbcType=VARCHAR},
+        Name                 = #{name,jdbcType=VARCHAR},
+        PyName               = #{pyName,jdbcType=VARCHAR},
+        EngName              = #{engName,jdbcType=VARCHAR},
+        Sex                  = #{sex,jdbcType=INTEGER},
+        Nation               = #{nation,jdbcType=INTEGER},
+        PoliticsStatusID     = #{politicsStatusID,jdbcType=INTEGER},
+        Birthplace           = #{birthplace,jdbcType=VARCHAR},
+        BirthDay             = #{birthDay,jdbcType=TIMESTAMP},
+        FamilyNatureID       = #{familyNatureID,jdbcType=INTEGER},
+        CultureRank          = #{cultureRank,jdbcType=INTEGER},
+        HealthID             = #{healthID,jdbcType=INTEGER},
+        BloodTypeID          = #{bloodTypeID,jdbcType=INTEGER},
+        Height               = #{height,jdbcType=VARCHAR},
         Vision               = #{vision,jdbcType=VARCHAR},
         Weight               = #{weight,jdbcType=VARCHAR},
         MaritalStatusID      = #{maritalStatusID,jdbcType=INTEGER},

+ 3 - 1
src/main/resources/mapping/cquery/JobUserCQuery.xml

@@ -10,7 +10,7 @@
         sys_family.name as familyNatureName,sys_full_time.Name as isFullTimeName,occ_cat.OccupationalName as
         occupationalCategoryName,
         sys_occ_level.Name as occupationalLevelName,sys_blood_type.Name as bloodTypeName,sys_marital_status.Name as
-        MaritalStatusName,
+        MaritalStatusName, sys_nation.Name as nationName,
         area_region.name as RegionName,area_street.name as StreetName,
         (select count(*) from pc_recommend recommend where jobuser.JobUserID = recommend.JobuserID and isRead = 1)as
         RecommendedCount
@@ -43,6 +43,8 @@
         jobuser.BloodTypeID = sys_blood_type.Value
         left join (select * from sys_dictionary_item where DictionaryCode ='MaritalStatus') sys_marital_status on
         jobuser.MaritalStatusID = sys_marital_status.Value
+        left join (select * from sys_dictionary_item where DictionaryCode ='NationType') sys_nation on
+        jobuser.Nation = sys_nation.Value
         left join area_code area_region on jobuser.RegionCode = area_region.code
         left join area_code area_street on jobuser.StreetCode = area_street.code
         left join pc_site_institution inSites on site.SiteID = inSites.SiteID

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

@@ -200,6 +200,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,

+ 3 - 3
vue/src/views/jobUserManager/jobuser/index.vue

@@ -74,7 +74,7 @@
           </a-form-item>
         </a-col>
         <a-col :span="6">
-          <a-form-item label="文化程度" :label-col="{ span: 8 }" name="educationId">
+          <a-form-item label="最高学历" :label-col="{ span: 8 }" name="educationId">
             <a-select
               ref="select"
               v-model:value="searchParamsState.educationTypeId"
@@ -188,7 +188,7 @@ export default defineComponent({
       {title: '姓名', dataIndex: 'name', key: 'name', width: 100,align: "center"},
       {title: '公民身份号码', dataIndex: 'identityNumber', key: 'identityNumber', width: 170,align: "center"},
       {title: '性别', dataIndex: 'genderName', key: 'genderName', width: 80,align: "center"},
-      {title: '民族', dataIndex: 'nation', key: 'nation', width: 80,align: "center"},
+      {title: '民族', dataIndex: 'nationName', key: 'nationName', width: 80, align: "center"},
       {title: '联系电话', dataIndex: 'userMobile', key: 'userMobile',align: "center"},
       {title: '所属驿站', dataIndex: 'siteName', key: 'siteName',align: "center"},
       {
@@ -196,7 +196,7 @@ export default defineComponent({
           return calculateAge(item.record.identityNumber);
         }
       },
-      {title: '文化程度', dataIndex: 'cultureName', key: 'cultureName',align: "center"},
+      {title: '最高学历', dataIndex: 'cultureName', key: 'cultureName', align: "center"},
       {title: '地址', dataIndex: 'address', key: 'address',align: "center"},
       {title: '就业状态', dataIndex: 'jobStatusName', key: 'jobStatusName',align: "center"},
       {title: '重点人员类别', dataIndex: 'keyTypeName', key: 'keyTypeName',align: "center"},

+ 10 - 8
vue/src/views/jobUserManager/jobuser/vitae.vue

@@ -8,7 +8,7 @@
           <a-avatar :size="72" :src="avtImg"></a-avatar>
         </div>
         <!-- 姓名 -->
-        <h1>{{ jobUserInfo.name }}</h1>
+        <p class="nameTitle">{{ jobUserInfo.name }}</p>
         <!-- 性别,年龄,民族 -->
         <div class="age-info">
           <span>
@@ -90,8 +90,8 @@
         <a-timeline style="margin-left: 25px;">
           <a-timeline-item v-for="(item, key) in experienceData" :key="key" position="left">
             <p>{{ dayjs(item.startTime).format('YYYY-MM-DD') }}至{{ dayjs(item.endTime).format('YYYY-MM-DD') }}</p>
-            <h1>{{ item.workAddress }}</h1>
-            <h1>{{ item.duties }}</h1>
+            <p>{{ item.workAddress }}</p>
+            <p>{{ item.duties }}</p>
           </a-timeline-item>
         </a-timeline>
       </div>
@@ -219,7 +219,7 @@ const loadExperienceData = (id: any) => {
 
 // 获取教育经历数据
 const getCultureList = () => {
-  getSysDictionaryList('CultureLevel').then((data) => {
+  getSysDictionaryList('HighestDegree').then((data) => {
     cultureList.value = data;
   });
 };
@@ -235,9 +235,11 @@ function getCultureName(value: any) {
 // 页面初始化
 onMounted(() => {
   const id = history.state.params?.id;
-  loadData(id);
-  loadEducation(id);
-  loadExperienceData(id)
+  if (id) {
+    loadData(id);
+    loadEducation(id);
+    loadExperienceData(id)
+  }
   getCultureList()
 })
 </script>
@@ -280,7 +282,7 @@ onMounted(() => {
         }
       }
 
-      h1 {
+      .nameTitle {
         margin-top: 1rem;
         text-align: center;
         font-size: 20px;