Przeglądaj źródła

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

pengjing 1 rok temu
rodzic
commit
6c75fcfb0e
41 zmienionych plików z 773 dodań i 198 usunięć
  1. 13 0
      h5app/src/api/jobHuntInfo/index.ts
  2. BIN
      h5app/src/assets/icon/qzyx.png
  3. 8 0
      h5app/src/router/index.ts
  4. 7 0
      h5app/src/views/pages/company/edit.vue
  5. 1 3
      h5app/src/views/pages/company/editPost.vue
  6. 5 6
      h5app/src/views/pages/company/list.vue
  7. 101 4
      h5app/src/views/pages/company/postList.vue
  8. 26 17
      h5app/src/views/pages/jobhunt/edit.vue
  9. 68 65
      h5app/src/views/pages/jobhunt/jobHuntEdit.vue
  10. 3 4
      h5app/src/views/pages/jobhunt/list.vue
  11. 171 0
      h5app/src/views/pages/jobhunt/recommend/list.vue
  12. 220 0
      h5app/src/views/pages/jobhunt/recommend/recommend.vue
  13. 2 2
      h5app/src/views/pages/post/edit.vue
  14. 3 4
      h5app/src/views/pages/post/recommendJob.vue
  15. 6 0
      h5app/src/views/sapp/tabMain.vue
  16. 6 0
      h5app/src/views/sapp/tabWork.vue
  17. 7 3
      src/main/java/com/hz/employmentsite/controller/companyService/CompanyController.java
  18. 5 4
      src/main/java/com/hz/employmentsite/controller/companyService/PostController.java
  19. 8 5
      src/main/java/com/hz/employmentsite/controller/jobUserManager/JobHuntController.java
  20. 2 2
      src/main/java/com/hz/employmentsite/controller/jobUserManager/RecommendMgtController.java
  21. 1 1
      src/main/java/com/hz/employmentsite/mapper/cquery/JobHuntCQuery.java
  22. 1 1
      src/main/java/com/hz/employmentsite/mapper/cquery/RecommendMgtCQuery.java
  23. 28 14
      src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteUserImpl.java
  24. 12 10
      src/main/java/com/hz/employmentsite/services/impl/companyService/CompanyServiceImpl.java
  25. 4 6
      src/main/java/com/hz/employmentsite/services/impl/companyService/PostServiceImpl.java
  26. 4 4
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobHuntServiceImpl.java
  27. 22 0
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobUserServiceImpl.java
  28. 2 2
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/RecommendMgtServiceImpl.java
  29. 1 1
      src/main/java/com/hz/employmentsite/services/service/companyService/CompanyService.java
  30. 1 1
      src/main/java/com/hz/employmentsite/services/service/companyService/PostService.java
  31. 1 1
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/JobHuntService.java
  32. 1 1
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/RecommendMgtService.java
  33. 2 0
      src/main/java/com/hz/employmentsite/vo/jobUserManager/RecommendCompanyPostVo.java
  34. 3 3
      src/main/resources/mapping/cquery/JobHuntCQuery.xml
  35. 4 3
      src/main/resources/mapping/cquery/RecommendMgtCQuery.xml
  36. 0 0
      src/main/resources/static/doc/template/站点人员导入模板.xlsx
  37. 1 1
      vue/src/views/baseSettings/siteUser/index.vue
  38. 1 7
      vue/src/views/companyService/post/edit.vue
  39. 14 15
      vue/src/views/jobUserManager/jobhunt/edit.vue
  40. 5 5
      vue/src/views/jobUserManager/jobhunt/index.vue
  41. 3 3
      vue/src/views/jobUserManager/recommendMgt/index.vue

+ 13 - 0
h5app/src/api/jobHuntInfo/index.ts

@@ -1,5 +1,18 @@
 import {request} from '@/utils/request';
 
+export function getJobHuntList(params:any){
+    return request<any>(
+        {
+            url: 'jobUserService/jobHunt/getList',
+            method: 'get',
+            params: params,
+        },
+        {
+            isNew: true,
+        },
+    );
+}
+
 export function getJobHuntListByJobUserID(params:any){
     return request<any>(
         {

BIN
h5app/src/assets/icon/qzyx.png


+ 8 - 0
h5app/src/router/index.ts

@@ -49,6 +49,14 @@ const routes: Array<RouteRecordRaw> = [
                 path: 'tabMain/jobhunt/jobHuntEdit',
                 component: () => import('@/views/pages/jobhunt/jobHuntEdit.vue')
             },
+            {
+                path: 'tabMain/jobhunt/recommend/list',
+                component: () => import('@/views/pages/jobhunt/recommend/list.vue')
+            },
+            {
+                path: 'tabMain/jobhunt/recommend/recommend',
+                component: () => import('@/views/pages/jobhunt/recommend/recommend.vue')
+            },
             {
                 path: 'tabMain/company/list',
                 component: () => import('@/views/pages/company/list.vue')

+ 7 - 0
h5app/src/views/pages/company/edit.vue

@@ -320,6 +320,11 @@ export default defineComponent({
       companyModelList.value = companyModelResult;
     }
 
+    const getCompanyTypeList = async function(){
+      const companyTypeResult :any = await getSysDictionaryList("CompanyType");
+      companyTypeList.value = companyTypeResult;
+    }
+
     const rules = computed(() => {
       return {
         dataModel: {
@@ -499,6 +504,7 @@ export default defineComponent({
       onNext,
       onBack,
       getCompanyModelList,
+      getCompanyTypeList,
       getRegionListData,
       getSiteListData,
       changeCity,
@@ -508,6 +514,7 @@ export default defineComponent({
     }
   },mounted(){
     this.getCompanyModelList();
+    this.getCompanyTypeList();
     this.getRegionListData();
     this.getSiteListData();
   }

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

@@ -151,9 +151,7 @@
     </ion-content>
     <ion-footer>
       <ion-toolbar>
-        <div slot="end">
-          <ion-button shape="round" expand="block" @click="onSave">提交</ion-button>
-        </div>
+          <ion-button style="width: 100%;" @click="onSave">提交</ion-button>
       </ion-toolbar>
     </ion-footer>
   </ion-page>

+ 5 - 6
h5app/src/views/pages/company/list.vue

@@ -91,7 +91,7 @@ import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
 import BEmpty from "@/components/empty.vue";
 import {getCompanyList} from '@/api/company/index';
 import {chevronForwardOutline,buildOutline,trashOutline} from 'ionicons/icons';
-import {get} from "@/api/common";
+import {get, post} from "@/api/common";
 
 export default defineComponent({
   name: 'CompanyList',
@@ -184,10 +184,10 @@ export default defineComponent({
         role: 'confirm',
         handler: () => {
           delLoading.value = true;
-          get("companyService/company/delete",{id:delCompanyID.value}).then((res) => {
-            infoAlterData.title = "提示";
+          post("companyService/company/delete",[delCompanyID.value],"企业信息删除").then((res) => {
+            /*infoAlterData.title = "提示";
             infoAlterData.message = "删除成功";
-            setInfoAlertOpen(true);
+            setInfoAlertOpen(true);*/
           }).finally(()=>{
             delLoading.value = false;
             reload();
@@ -262,8 +262,7 @@ export default defineComponent({
 <style lang="less">
 .custom{
   --placeholder-color: gray;
-  --placeholder-font-style:italic;
-  --placeholder-opacity: 1;
+  --placeholder-opacity: 0.5;
 }
 
 .company-list-page {

+ 101 - 4
h5app/src/views/pages/company/postList.vue

@@ -54,9 +54,9 @@
                   </ion-label>
                 </ion-item>
                 <ion-item-options>
-               <ion-item-option color="danger" @click="setDelAlertOpen(true, record.educationID)">
-               <ion-icon :icon="trashOutline"></ion-icon>
-             </ion-item-option>
+                  <ion-item-option color="danger" @click="setDelAlertOpen(true, record.postID)">
+                    <ion-icon :icon="trashOutline"></ion-icon>
+                  </ion-item-option>
              </ion-item-options>
                 </ion-item-sliding>
               </div>
@@ -78,6 +78,27 @@
         <ion-button style="width: 48%;float:left;margin-right: 1%;" @click="onFinish" >完  成</ion-button>
       </ion-toolbar>
     </ion-footer>
+
+    <ion-alert
+        :is-open="delAlertOpen"
+        header="删除确认"
+        message="确定要删除该岗位吗?"
+        :buttons="delAlertButtons"
+        @didDismiss="setDelAlertOpen(false, null)"
+    ></ion-alert>
+
+    <ion-alert
+        :is-open="infoAlertOpen"
+        :header="infoAlterData.title"
+        :message="infoAlterData.message"
+        :buttons="infoAlertButtons"
+        @didDismiss="setInfoAlertOpen(false)"
+    ></ion-alert>
+    <ion-loading
+        :is-open="delLoading"
+        message="删除中..."
+        @didDismiss="setDelLoadingOpen(false)" >
+    </ion-loading>
   </ion-page>
 </template>
 <script lang="ts">
@@ -87,6 +108,7 @@ import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import {arrowBackOutline, addCircleOutline,trashOutline} from 'ionicons/icons';
 import {getCompanyPostList} from '@/api/company/index'
 import dayjs from "dayjs";
+import {post} from "@/api/common";
 
 interface StepParams{
   name: string,
@@ -144,6 +166,71 @@ export default defineComponent({
       return `${year}-${month}-${day}`;
     };*/
 
+    // 信息弹窗内容
+    const infoAlterData = reactive({
+      title:"",
+      message:""
+    });
+    // 删除警告弹窗开关
+    const delAlertOpen = ref(false);
+    // 删除警告弹窗按钮定义
+    const infoAlertButtons = [
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          reload(pageParams.companyID,curStepData.value.statusVal);
+        },
+      },
+    ];
+
+    // 删除数据
+    const delPostID = ref("");
+    // 删除加载
+    const delLoading = ref(false);
+    // 信息弹窗开关
+    const infoAlertOpen = ref(false);
+    // 删除警告弹窗按钮定义
+    const delAlertButtons = [
+      {
+        text: '取消',
+        role: 'cancel',
+        handler: () => {
+          reload(pageParams.companyID,curStepData.value.statusVal);
+        },
+      },
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          delLoading.value = true;
+          post("companyService/post/delete",[delPostID.value],"岗位信息删除").then((res) => {
+           /* infoAlterData.title = "提示";
+            infoAlterData.message = "删除成功";
+            setInfoAlertOpen(true);*/
+          }).finally(()=>{
+            delLoading.value = false;
+            reload(pageParams.companyID,curStepData.value.statusVal);
+          });
+        },
+      },
+    ];
+    // 设置要删除的求职人员
+    function setDelAlertOpen(value: boolean, postID: any) {
+      delAlertOpen.value = value;
+      if(postID != null) {
+        delPostID.value = postID;
+      }
+    }
+    // 设置信息提示弹窗开关
+    function setInfoAlertOpen(value: boolean) {
+      infoAlertOpen.value = value;
+    }
+    // 设置删除弹窗开启关闭
+    function setDelLoadingOpen(value: boolean) {
+      delLoading.value = value;
+    }
+
     const onAdd = () => {
       router.push({path: './editPost', query: {reload:1,id: null,companyID:pageParams.companyID}});
     };
@@ -203,6 +290,13 @@ export default defineComponent({
       curStepData,
       postList,
       stepList,
+      delPostID,
+      delAlertButtons,
+      infoAlertButtons,
+      delAlertOpen,
+      infoAlertOpen,
+      delLoading,
+      infoAlterData,
       onBack,
       onAdd,
       onEdit,
@@ -211,7 +305,10 @@ export default defineComponent({
       loadData,
       presentAlert,
       /*calculateEndDate,*/
-      dayjs
+      dayjs,
+      setDelAlertOpen,
+      setInfoAlertOpen,
+      setDelLoadingOpen,
     }
   }
 });

+ 26 - 17
h5app/src/views/pages/jobhunt/edit.vue

@@ -306,23 +306,32 @@
           </ion-list>
 
           <ion-list  v-if="curStepData.statusVal==4">
-            <ion-item>
-              <div class="panel-title2"  slot="start">
-                <div class="item-flag"></div>
-                求职意向
+            <div class="form-title">
+              求职意向
+              <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
+                        @click="onPathForward('./jobHuntEdit',null,null,null,4)"></ion-icon>
+            </div>
+            <div class="bw-vue-list">
+              <div class="list-content" v-if="!loading">
+                <ion-list>
+                  <div v-for="(record,key) in jobHuntList" :key="key">
+                    <ion-item-sliding>
+                      <ion-item detail @click="onPathForward('./jobHuntEdit',null,null,record.jobHuntID,4)">
+                        <ion-label>
+                          <h2>{{record.professionName}}</h2>
+                          <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
+                        </ion-label>
+                      </ion-item>
+                      <ion-item-options>
+                        <ion-item-option color="danger" @click="setDelAlertOpen(true, record.jobHuntID)">
+                          <ion-icon :icon="trashOutline"></ion-icon>
+                        </ion-item-option>
+                      </ion-item-options>
+                    </ion-item-sliding>
+                  </div>
+                </ion-list>
               </div>
-              <ion-buttons slot="end">
-                <ion-icon :icon="addCircleOutline" class="iconBtn"
-                          @click="onPathForward('./jobHuntEdit',null,null,null,4)"></ion-icon>
-              </ion-buttons>
-            </ion-item>
-            <ion-item  v-for="(record,key) in jobHuntList" :key="key" detail
-                       @click="onPathForward( './jobHuntEdit',null,null,record.jobHuntID,4)">
-              <ion-label>
-                <h3>{{record.postName}}</h3>
-                <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
-              </ion-label>
-            </ion-item>
+            </div>
             <b-empty  v-if="jobHuntList.length==0"  :loading="loading" />
           </ion-list>
         <!--<ion-refresher pulling-text="下拉刷新" @ionRefresh="onRefresh"></ion-refresher>-->
@@ -544,7 +553,7 @@ export default defineComponent({
           postUrl.value = "jobUserService/education/deleteEducation";
           actionName.value = "删除教育经历";
           if(curStepData.value.statusVal!=2){
-            postUrl.value = curStepData.value.statusVal==3 ?"jobUserService/experience/deleteExperience":"jobUserService/jobHunt/deleteJobHunt";
+            postUrl.value = curStepData.value.statusVal==3 ?"jobUserService/experience/deleteExperience":"jobUserService/jobHunt/delete";
             actionName.value = curStepData.value.statusVal==3 ?"删除工作经验":"删除求职意向";
           }
           post(postUrl.value,[delID.value],actionName.value).then((res) => {

+ 68 - 65
h5app/src/views/pages/jobhunt/jobHuntEdit.vue

@@ -1,6 +1,6 @@
 <template>
   <ion-page>
-    <ion-header>
+    <ion-header class="header-theme2">
       <ion-toolbar>
         <ion-buttons slot="start">
           <ion-icon :icon="arrowBackOutline" @click="onCancel" style="padding-left:10px;width:24px;height:24px;"></ion-icon>
@@ -17,82 +17,84 @@
                :class="[record.val < curStepData?.statusVal ? 'greenLine' : 'grayLine']"></div>
           <div class="stepFlex-item-label">
             <p class="stepFlex-item-label-title">{{ record.title }}</p>
-<!--            <p class="stepFlex-item-label-desc">{{ record.desc }}</p>-->
+            <p class="stepFlex-item-label-desc">{{ record.desc }}</p>
           </div>
         </div>
       </div>
+
+      <form ref="editForm" @submit.prevent="onSave">
+        <div class="bw-vue-form">
         <ion-list class="canvasWrapper" >
-          <ion-item-group>
-            <ion-item>
-              <div class="panel-title2">
-                <div class="item-flag"></div>
-                求职意向
-              </div>
-            </ion-item>
-            <ion-label class="title-item">工种名称<span class="danger">*</span></ion-label>
-            <ion-item :class="[huntDataValid.dataModel.workName.$error?'ion-invalid':'ion-valid']">
-              <ion-input name="workName" id="workName"  style="text-align: left;" class="custom"
-                         placeholder="请输入工种名称" v-model="dataModel.workName" ></ion-input>
-              <ion-note slot="error">工种名称不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">求职类型<span class="danger">*</span></ion-label>
-            <ion-item :class="[huntDataValid.dataModel.jobHuntType.$error?'ion-invalid':'ion-valid']">
+          <div class="form-title">求职意向</div>
+<!--          <div class="form-input">
+            <ion-label>工种名称<span class="danger">*</span></ion-label>
+            <ion-input name="workName" id="workName"  style="text-align: left;" class="custom"
+                       placeholder="请输入工种名称" v-model="dataModel.workName" ></ion-input>
+&lt;!&ndash;            <ion-note slot="error">工种名称不能为空</ion-note>&ndash;&gt;
+          </div>-->
+          <div class="form-select">
+            <ion-label>求职类型<span class="danger">*</span></ion-label>
               <ion-select name="jobHuntType"  id="jobHuntType" okText="确定" cancelText="取消" v-model="dataModel.jobHuntType"
                           interface="action-sheet" placeholder="请选择求职类型" style="width:100%;text-align: left;">
                 <ion-select-option v-for=" (it,key) in jobHuntTypeList" :key="key" :value="it.value">
                   {{ it.name }}
                 </ion-select-option>
               </ion-select>
-              <ion-note slot="error">求职类型不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">求职岗位<span class="danger">*</span></ion-label>
-            <ion-item :class="[huntDataValid.dataModel.postID.$error?'ion-invalid':'ion-valid']">
+<!--              <ion-note slot="error">求职类型不能为空</ion-note>-->
+          </div>
+          <div class="form-select">
+            <ion-label>求职岗位<span class="danger">*</span></ion-label>
               <ion-select name="postID"  id="postID" okText="确定" cancelText="取消" v-model="dataModel.postID"
                           interface="action-sheet" placeholder="请选择求职岗位"  style="width:100%;text-align: left;">
                 <ion-select-option v-for=" (it,key) in allPostList" :key="key" :value="it.postID">
                   {{ it.postName }}
                 </ion-select-option>
               </ion-select>
-              <ion-note slot="error">求职岗位不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">人才类型<span class="danger">*</span></ion-label>
-            <ion-item :class="[huntDataValid.dataModel.jobUserType.$error?'ion-invalid':'ion-valid']">
+<!--              <ion-note slot="error">求职岗位不能为空</ion-note>-->
+          </div>
+          <div class="form-select">
+            <ion-label>人才类型<span class="danger">*</span></ion-label>
               <ion-select name="jobUserType"  id="jobUserType" okText="确定" cancelText="取消" v-model="dataModel.jobUserType"
                           interface="action-sheet" placeholder="请选择人才类型"  style="width:100%;text-align: left;">
                 <ion-select-option v-for=" (it,key) in jobUserTypeList" :key="key" :value="it.value">
                   {{ it.name }}
                 </ion-select-option>
               </ion-select>
-              <ion-note slot="error">人才类型不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">月薪要求(元)<span class="danger">*</span></ion-label>
-            <ion-item :class="[huntDataValid.dataModel.maxSalary.$error||huntDataValid.dataModel.minSalary.$error?'ion-invalid':'ion-valid']">
-              <ion-input inputmode="numeric" name="minSalary" id="minSalary" style="text-align: left;" class="custom"
-                         placeholder="请输入最低薪资" v-model="dataModel.minSalary" ></ion-input>
-              <span style="padding-left:20px;padding-right:20px;">至</span>
-              <ion-input inputmode="numeric" name="maxSalary" id="maxSalary" style="text-align: left;" class="custom"
-                         placeholder="请输入最高薪资" v-model="dataModel.maxSalary" ></ion-input>
-              <ion-note slot="error">月薪要求不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">工作年限<span class="danger">*</span></ion-label>
-            <ion-item :class="[huntDataValid.dataModel.workYear.$error?'ion-invalid':'ion-valid']">
-              <ion-select name="workYear"  id="workYear" okText="确定" cancelText="取消" v-model="dataModel.workYear"
+<!--              <ion-note slot="error">人才类型不能为空</ion-note>-->
+          </div>
+          <div class="form-input">
+            <ion-label>月薪要求(元)<span class="danger">*</span></ion-label>
+            <div>
+              <ion-input placeholder="请输入最低薪资" label-placement="stacked" style="float:left;width:40%;"
+                         v-model="dataModel.minSalary" class="custom">
+              </ion-input>
+              <ion-label style="float:left;width:5%;padding-top: 8px;">至</ion-label>
+              <ion-input placeholder="请输入最高薪资" label-placement="stacked" style="float:left;width:40%;"
+                         v-model="dataModel.maxSalary" class="custom">
+              </ion-input>
+              <!--              <ion-note slot="error">月薪要求不能为空</ion-note>-->
+            </div>
+          </div>
+          <div style="overflow: hidden;width:100%;"></div>
+          <div class="form-select">
+            <ion-label>工作年限<span class="danger">*</span></ion-label>
+            <ion-select name="workYear"  id="workYear" okText="确定" cancelText="取消" v-model="dataModel.workYear"
                           interface="action-sheet" placeholder="请选择工作年限"  style="width:100%;text-align: left;">
                 <ion-select-option v-for=" (it,key) in workYearTypeList" :key="key" :value="it.value">
                   {{ it.name }}
                 </ion-select-option>
               </ion-select>
-              <ion-note slot="error">工作年限不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">期望工作地区<span class="danger">*</span></ion-label>
-            <ion-item :class="[huntDataValid.dataModel.areaWork.$error?'ion-invalid':'ion-valid']">
-              <ion-input name="areaWork" id="areaWork" style="text-align: left;" class="custom"
+<!--              <ion-note slot="error">工作年限不能为空</ion-note>-->
+          </div>
+          <div class="form-input">
+            <ion-label>期望工作地区<span class="danger">*</span></ion-label>
+            <ion-input name="areaWork" id="areaWork" style="text-align: left;" class="custom"
                          placeholder="请输入期望工作地区" v-model="dataModel.areaWork" ></ion-input>
-              <ion-note slot="error">期望工作地区不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">可到职日期<span class="danger">*</span></ion-label>
-            <ion-item  :class="[huntDataValid.dataModel.inDate.$error?'ion-invalid':'ion-valid']">
-              <ion-datetime-button datetime="inDate" style="background-color: white;"></ion-datetime-button>
+<!--              <ion-note slot="error">期望工作地区不能为空</ion-note>-->
+          </div>
+          <div class="form-input">
+            <ion-label>可到职日期<span class="danger">*</span></ion-label>
+              <ion-datetime-button datetime="inDate" style="position: relative;right:110px;"></ion-datetime-button>
               <ion-modal :keep-contents-mounted="true">
                 <ion-datetime name="inDate" id="inDate" placeholder="可到职日期"
                               v-model="dataModel.inDate"  :prefer-wheel="true"
@@ -100,20 +102,20 @@
                               :show-default-buttons="true">
                 </ion-datetime>
               </ion-modal>
-            </ion-item>
-            <ion-label class="title-item">其他信息</ion-label>
-            <ion-item>
-              <ion-textarea name="areaWork" id="otherDemand" style="text-align: left;" class="custom"  rows="4"
-                         placeholder="请输入其他信息" v-model="dataModel.otherDemand" ></ion-textarea>
-            </ion-item>
-          </ion-item-group>
+          </div>
+          <div class="form-input">
+            <ion-label>其他信息</ion-label>
+            <ion-textarea placeholder="请输入其他信息" :rows="3" label-placement="stacked"
+                          v-model="dataModel.otherDemand" class="custom" style="border-bottom: 1px solid #fff2e8;">
+            </ion-textarea>
+          </div>
         </ion-list>
+        </div>
+      </form>
     </ion-content>
     <ion-footer>
       <ion-toolbar>
-        <div slot="end">
-          <ion-button shape="round" expand="block"  @click="onSave">保  存</ion-button>
-        </div>
+          <ion-button style="width: 100%;"  @click="onSave">保  存</ion-button>
       </ion-toolbar>
       <ion-loading
           :is-open="loading"
@@ -164,9 +166,11 @@ export default defineComponent({
       statusVal: 2
     });
     const stepList = ref([
-      {title: '个人基础信息', desc: '个人基础信息', val: 1},
-      {title: '完善教育经历', desc: '完善个人教育经历',val: 2},
-      {title: '个人求职意向', desc: '个人求职意向', val: 3}]);
+      {title: '基础信息', desc: '个人基础信息', val: 1},
+      {title: '教育经历', desc: '完善教育经历',val: 2},
+      {title: '工作经验', desc: '完善工作经验', val: 3},
+      {title: '求职意向', desc: '个人求职意向', val: 4}
+    ]);
     const allPostList = ref([]);
     const jobHuntTypeList = ref<SelectProps[]>([]);
     const jobUserTypeList = ref<SelectProps[]>([]);
@@ -299,10 +303,9 @@ export default defineComponent({
 });
 </script>
 <style lang="less">
-ion-input.custom{
+.custom{
   --placeholder-color: gray;
-  --placeholder-font-style:oblique;
-  --placeholder-opacity: 1;
+  --placeholder-opacity: 0.5;
 }
 
 .title-item{

+ 3 - 4
h5app/src/views/pages/jobhunt/list.vue

@@ -207,9 +207,9 @@ export default defineComponent({
         handler: () => {
           delLoading.value = true;
           post("jobUserService/jobUser/delete",[delJobUserID.value],"求职人员信息删除").then((res) => {
-            infoAlterData.title = "提示";
+            /*infoAlterData.title = "提示";
             infoAlterData.message = "删除成功";
-            setInfoAlertOpen(true);
+            setInfoAlertOpen(true);*/
           }).finally(()=>{
             delLoading.value = false;
             reload();
@@ -281,8 +281,7 @@ export default defineComponent({
 <style lang="less">
 ion-input.custom{
   --placeholder-color: gray;
-  --placeholder-font-style:oblique;
-  --placeholder-opacity: 1;
+  --placeholder-opacity: 0.5;
 }
 
 .search-item{

+ 171 - 0
h5app/src/views/pages/jobhunt/recommend/list.vue

@@ -0,0 +1,171 @@
+<template>
+  <ion-page class="list-page company-list-page">
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
+        </ion-buttons>
+        <ion-title>求职意向</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <ion-item class="search-item">
+        <ion-input placeholder="姓名" class="custom"
+                   v-model="searchParams.jobUserName" style="border: 1px solid #f2f2f5;border-radius: 14px;--padding-start: 10px;height: 35px;"></ion-input>
+        <ion-button slot="end" style="height: 33px;width: 70px;margin-left: 10px;--box-shadow: none;--border-radius: 14px;" @click="reload" >搜索
+        </ion-button>
+      </ion-item>
+      <ion-list class="list-content">
+        <ion-item v-for="(record,key) in dataList" :key="key">
+          <ion-label>
+            <ion-label style="display: flex;justify-content: space-between;">
+            <h2>{{ record.jobUserName}}</h2>
+            <h2>{{ record.professionName }}</h2>
+            </ion-label>
+            <p>人才类型:{{record.jobUserTypeStr}}</p>
+            <ion-label style="display: flex;justify-content: space-between;">
+              <p>
+                工作年限:{{ record.workYear }}
+              </p>
+              <p>
+                求职类型:{{ record.jobHuntTypeStr }}
+              </p>
+            </ion-label>
+            <p>月薪要求:{{ record.minSalary }}至{{ record.maxSalary }}元</p>
+          </ion-label>
+          <ion-avatar @click="onRecommendJob(record);$event.preventDefault();$event.stopPropagation();" aria-hidden="true" class="container" slot="end">
+            <p style="font-size: 14px !important;">推荐</p>
+          </ion-avatar>
+        </ion-item>
+      </ion-list>
+      <b-empty v-if="dataList.length<=0" :loading="loading"/>
+      <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
+        <ion-infinite-scroll-content
+            :loadingText="pagination.total>pagination.current*pagination.pageSize?'正在加载...':'暂无更多'"
+            loadingSpinner="bubbles">
+        </ion-infinite-scroll-content>
+      </ion-infinite-scroll>
+    </ion-content>
+  </ion-page>
+</template>
+
+<script lang="ts">
+
+import {computed, defineComponent, reactive, ref} from 'vue';
+import dayjs from "dayjs";
+import {useRoute, useRouter} from "vue-router";
+import {arrowBackOutline} from 'ionicons/icons';
+import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
+import BEmpty from "@/components/empty.vue";
+import {getJobHuntList} from '@/api/jobHuntInfo/index'
+
+export default defineComponent({
+  name: 'RecommendCompanyPostList',
+  components: {IonIcon, BEmpty},
+  setup() {
+    const router = useRouter();
+    const route = useRoute();
+    const total = ref(10);
+    const loading = ref(true);
+    const pagination = computed(() => ({
+      total: total,
+      current: searchParams.pageIndex,
+      pageSize: searchParams.pageSize
+    }));
+    const searchParams = reactive({
+      pageIndex: 1,
+      pageSize: 5,
+      jobUserName: '',
+    });
+    const dataList = ref<any>([]);
+
+    const loadData = async function () {
+      loading.value = true;
+      getJobHuntList(searchParams).then(data => {
+        dataList.value = dataList.value.concat(data.list);
+        total.value = data.total;
+        console.log(dataList.value);
+      })
+      loading.value = false;
+    }
+
+    const reload = () => {
+      dataList.value = [];
+      searchParams.pageIndex = 1;
+      loadData();
+    }
+
+    const onScroll = (e: any) => {
+      setTimeout(() => {
+        e.target.complete();
+        if (pagination.value.total.value > pagination.value.current * pagination.value.pageSize) {
+          searchParams.pageIndex += 1;
+          loadData();
+        }
+      }, 500);
+    }
+
+    const onRecommendJob = (item: any) =>{
+      router.push({path: './recommend', query: {reload: 1,professionID:item.professionID,professionName:item.professionName,jobHuntID:item.jobHuntID,jobUserName:item.jobUserName,type:0}});
+    }
+
+    const onBack = () => {
+      router.push('../../');
+    }
+
+    onIonViewDidEnter(() => {
+      if(route.query.reload)reload();
+    });
+
+    return {
+      arrowBackOutline,
+      router,
+      total,
+      loading,
+      dataList,
+      pagination,
+      searchParams,
+      onBack,
+      onRecommendJob,
+      onScroll,
+      loadData,
+      reload,
+      dayjs,
+    }
+  },created() {
+    this.loadData();
+  }
+});
+</script>
+
+<style lang="less">
+.custom{
+  --placeholder-color: gray;
+  --placeholder-font-style:italic;
+  --placeholder-opacity: 1;
+}
+
+.company-list-page {
+  .list-content {
+    margin: 0px 15px !important;
+    background-color: white !important;
+    border-radius: 0 !important;
+
+    ion-item {
+      margin-top: 10px;
+      font-size: 14px;
+      border: 1px solid rgb(242, 242, 245);
+
+      p {
+        font-size: 12px;
+      }
+    }
+  }
+}
+
+.container {
+  display: flex;
+  justify-content: center; /* 水平居中 */
+  align-items: center; /* 垂直居中 */
+}
+</style>

+ 220 - 0
h5app/src/views/pages/jobhunt/recommend/recommend.vue

@@ -0,0 +1,220 @@
+<template>
+  <ion-page class="list-page company-list-page">
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
+        </ion-buttons>
+        <ion-title>岗位推荐</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <ion-item class="search-item">
+        <ion-label>
+          <h2>{{ searchParams.jobUserName }}</h2>
+          <br/>
+          <h2>{{ searchParams.professionName }}</h2>
+        </ion-label>
+      </ion-item>
+      <ion-list class="list-content">
+        <ion-item v-for="(record,key) in dataList" detail :key="key">
+          <ion-label>
+            <h2>{{ record.professionName }}</h2>
+            <p>单位:{{ record.companyName }}</p>
+            <p>薪资待遇:{{ record.minSalary }}至{{ record.maxSalary }}元</p>
+          </ion-label>
+          <ion-avatar aria-hidden="true" class="container" slot="end">
+            <ion-text style="text-align:right;" @click="onRecommend(record)">推荐</ion-text>
+          </ion-avatar>
+        </ion-item>
+      </ion-list>
+      <b-empty v-if="dataList.length<=0" :loading="loading"/>
+      <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
+        <ion-infinite-scroll-content
+            :loadingText="pagination.total>pagination.pageIndex*pagination.pageSize?'正在加载...':'暂无更多'"
+            loadingSpinner="bubbles">
+        </ion-infinite-scroll-content>
+      </ion-infinite-scroll>
+    </ion-content>
+    <ion-footer>
+      <ion-button shape="round" expand="block" @click="onBatchRecommend">全部推荐</ion-button>
+    </ion-footer>
+  </ion-page>
+</template>
+
+<script lang="ts">
+import {useRoute, useRouter} from "vue-router";
+import {computed, defineComponent, reactive, ref, watch} from 'vue';
+import {arrowBackOutline, addCircleOutline} from 'ionicons/icons';
+import {alertController, IonIcon, onIonViewDidEnter} from '@ionic/vue';
+import {getRecommendCompanyPostList, addRecommend} from "@/api/recommendmgt";
+
+export default defineComponent({
+  name: 'RecommendCompanyPost',
+  components: {IonIcon},
+  setup() {
+    const loading = ref(true);
+    const router = useRouter();
+    const route = useRoute();
+    const total = ref(10);
+    const pagination = computed(() => ({
+      total: total,
+      pageIndex: searchParams.pageIndex,
+      pageSize: searchParams.pageSize
+    }));
+    const searchParams = reactive({
+      pageIndex: 1,
+      pageSize: 5,
+      jobUserName: null,
+      jobHuntID: '',
+      professionID: '',
+      professionName: null,
+      type: 0
+    })
+    const dataList = ref<any>([]);
+    const addRecommendList = ref<any>([]);
+    const colors = ref(["secondary", "tertiary", "success", "warning"]);
+
+    const loadData = async function () {
+      loading.value = true;
+      searchParams.jobHuntID = route.query.jobHuntID as any;
+      searchParams.jobUserName = route.query.jobUserName as any;
+      searchParams.professionID = route.query.professionID as any;
+      searchParams.professionName = route.query.professionName as any;
+      searchParams.type = route.query.type as any;
+      getRecommendCompanyPostList(searchParams).then((data: any) => {
+        dataList.value = dataList.value.concat(data.list);
+        total.value = data.total;
+      });
+      loading.value = false;
+    }
+
+    const onScroll = (e: any) => {
+      setTimeout(() => {
+        e.target.complete();
+        if (pagination.value.total.value > pagination.value.pageIndex * pagination.value.pageSize) {
+          searchParams.pageIndex += 1;
+          loadData();
+        }
+      }, 500);
+    }
+
+    const onRecommend = (item: any) => {
+      addRecommendList.value.push({
+        recommendMgtID: item.recommendMgtID,
+        jobHuntID: searchParams.jobHuntID,
+        postID: item.postID,
+        recommendType: 1
+      });
+      addRecommend(addRecommendList.value).then(() => {
+        const index = dataList.value.findIndex((x: any) => x.recommendMgtID == item.recommendMgtID);
+        dataList.value.splice(index, 1)
+        addRecommendList.value = [];
+      });
+    };
+
+    const onBatchRecommend = () => {
+      if (dataList.value.length == 0) {
+        presentAlert("没有需要推荐的求职人员!")
+        return;
+      }
+
+      dataList.value.forEach((item: any) => {
+        addRecommendList.value.push({
+          recommendMgtID: item.recommendMgtID,
+          jobHuntID: searchParams.jobHuntID,
+          postID: item.postID,
+          recommendType: 1
+        });
+      })
+      addRecommend(addRecommendList.value).then(() => {
+        loadData();
+        dataList.value = [];
+        addRecommendList.value = [];
+      });
+    };
+
+    const presentAlert = async (message: string) => {
+      const alert = await alertController.create({
+        header: '错误!',
+        message: message,
+        buttons: [
+          '确定'
+        ],
+      });
+
+      await alert.present();
+    }
+
+    const onBack = () => {
+      router.go(-1);
+    }
+
+    const reload = () => {
+      dataList.value = [];
+      searchParams.pageIndex = 1;
+      loadData();
+    }
+    onIonViewDidEnter(() => {
+      reload();
+    });
+
+    return {
+      arrowBackOutline,
+      addCircleOutline,
+      router,
+      route,
+      colors,
+      loading,
+      pagination,
+      searchParams,
+      dataList,
+      onScroll,
+      loadData,
+      reload,
+      onBack,
+      onRecommend,
+      onBatchRecommend,
+    }
+  }
+});
+</script>
+
+<style lang="less">
+.custom {
+  --placeholder-color: gray;
+  --placeholder-font-style: italic;
+  --placeholder-opacity: 1;
+}
+
+.company-list-page {
+  .list-content {
+    margin: 0px 15px !important;
+    background-color: white !important;
+    border-radius: 0 !important;
+
+    ion-item {
+      margin-top: 10px;
+      font-size: 14px;
+      border: 1px solid rgb(242, 242, 245);
+
+      p {
+        font-size: 12px;
+      }
+    }
+  }
+}
+
+.container {
+  display: flex;
+  justify-content: center; /* 水平居中 */
+  align-items: center; /* 垂直居中 */
+}
+
+.footer-ios ion-toolbar:first-of-type{
+  --border-width:0 !important;
+  --background:#ffffff !important;
+}
+
+</style>
+

+ 2 - 2
h5app/src/views/pages/post/edit.vue

@@ -31,7 +31,7 @@
             <ion-label>岗位名称<span class="danger">*</span></ion-label>
             <ion-item :class="[v$.dataModel.professionName.$error?'ion-invalid':'ion-valid']">
               <ion-input placeholder="请选择岗位" label-placement="stacked" :clear-input="true"
-                        aria-disabled="true" v-model="dataModel.professionName" class="custom">
+                        v-model="dataModel.professionName" class="custom">
               </ion-input>
               <picker :ProfessionID="dataModel.professionID" aria-disabled="false"  @SetProfessionID="onSetProfessionID"></picker>
               <ion-note slot="error">请选择岗位</ion-note>
@@ -70,7 +70,7 @@
               <ion-note slot="error">招聘开始日期与结束日期不能为空</ion-note>
             </ion-item>
           </div>
-          <div class="form-input">
+          <div class="form-detail">
             <ion-label>招聘地点<span class="danger">*</span></ion-label>
             <ion-item :class="[v$.dataModel.jobPlace.$error?'ion-invalid':'ion-valid']">
               <ion-textarea placeholder="请输入招聘地点" :rows="3" label-placement="stacked" :clear-input="true"

+ 3 - 4
h5app/src/views/pages/post/recommendJob.vue

@@ -12,7 +12,8 @@
       <ion-item class="search-item">
         <ion-label>
           <h2>{{ searchParams.professionName }}</h2>
-          <p>{{ searchParams.companyName }}</p>
+          <br/>
+          <h2>{{ searchParams.companyName }}</h2>
         </ion-label>
       </ion-item>
       <ion-list class="list-content">
@@ -36,9 +37,7 @@
       </ion-infinite-scroll>
     </ion-content>
     <ion-footer>
-      <ion-toolbar>
-        <ion-button expand="block" @click="onBatchRecommend()" fill="outline">全部推荐</ion-button>
-      </ion-toolbar>
+      <ion-button shape="round" expand="block" @click="onBatchRecommend">全部推荐</ion-button>
     </ion-footer>
   </ion-page>
 </template>

+ 6 - 0
h5app/src/views/sapp/tabMain.vue

@@ -16,6 +16,12 @@
           </div>
           <div class="tool-title">求职人员信息收集</div>
         </a>
+        <a class="tool-item box-line"  @click="router.push('/tabs/tabMain/jobhunt/recommend/list')">
+          <div class="tool-img">
+            <img src="@/assets/icon/qzyx.png">
+          </div>
+          <div class="tool-title">求职意向</div>
+        </a>
         <a class="tool-item box-line"  @click="router.push({path:'/tabs/tabMain/company/list',query:{reload:1}})">
           <div class="tool-img">
             <img src="@/assets/icon/qyxx.png">

+ 6 - 0
h5app/src/views/sapp/tabWork.vue

@@ -84,6 +84,12 @@
                </div>
                <div class="tool-title">求职人员<br/>信息收集</div>
              </a>
+             <a class="tool-item box-line"  @click="router.push('/tabs/tabMain/jobhunt/recommend/list')">
+               <div class="tool-img">
+                 <img src="@/assets/icon/qzyx.png">
+               </div>
+               <div class="tool-title">求职意向</div>
+             </a>
              <a class="tool-item box-line"  @click="router.push({path:'/tabs/tabMain/company/list',query:{reload:1}})">
                <div class="tool-img">
                  <img src="@/assets/icon/qyxx.png">

+ 7 - 3
src/main/java/com/hz/employmentsite/controller/companyService/CompanyController.java

@@ -2,6 +2,7 @@ package com.hz.employmentsite.controller.companyService;
 
 import com.github.pagehelper.PageInfo;
 import com.hz.employmentsite.filter.exception.BaseErrorEnum;
+import com.hz.employmentsite.filter.exception.BaseException;
 import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.model.PcCompany;
@@ -84,9 +85,12 @@ public class CompanyController {
     }
 
     @ResponseBody
-    @GetMapping("/delete")
-    public BaseResponse<Integer> delete(String id) {
-        Integer result = companyService.delete(id);
+    @PostMapping("/delete")
+    public BaseResponse<Integer> delete(@RequestBody List<String> ids) {
+        var result = companyService.delete(ids);
+        if (result <= 0) {
+            throw new BaseException(BaseErrorEnum.DELETE_NOT_DATA_ERROR);
+        }
         return RespGenerstor.success(result);
     }
 

+ 5 - 4
src/main/java/com/hz/employmentsite/controller/companyService/PostController.java

@@ -103,11 +103,12 @@ public class PostController {
 
     @ResponseBody
     @PostMapping("/delete")
-    public BaseResponse<Integer> delete(String id) {
-        Integer result = postService.delete(id);
-        if (result <= 0)
+    public BaseResponse<Integer> delete(@RequestBody List<String> ids) {
+        var result = postService.delete(ids);
+        if (result <= 0) {
             throw new BaseException(BaseErrorEnum.DELETE_NOT_DATA_ERROR);
-        return RespGenerstor.success(1);
+        }
+        return RespGenerstor.success(result);
     }
 
     @ResponseBody

+ 8 - 5
src/main/java/com/hz/employmentsite/controller/jobUserManager/JobHuntController.java

@@ -6,6 +6,7 @@ import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.services.service.AccountService;
 import com.hz.employmentsite.services.service.jobUserManager.JobHuntService;
+import com.hz.employmentsite.util.DateUtils;
 import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.vo.jobUserManager.JobHuntVo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,13 +28,16 @@ public class JobHuntController {
     @Autowired
     private ExcelHelper excelHelper;
 
+    @Autowired
+    private DateUtils dataUtils;
+
     @ResponseBody
     @GetMapping("/getList")
     public BaseResponse getList(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize,
                                     @RequestParam(required = false) List<String> jobHuntIDList,
                                     @RequestParam(required = false) String jobUserID,
                                     @RequestParam(required = false) String jobUserName,
-                                    @RequestParam(required = false) String workName,
+                                    @RequestParam(required = false) String professionName,
                                     @RequestParam(required = false) Integer minWorkYear,
                                     @RequestParam(required = false) Integer maxWorkYear,
                                     @RequestParam(required = false) Integer jobHuntTypeID,
@@ -42,7 +46,7 @@ public class JobHuntController {
                                     @RequestParam(required = false) BigDecimal maxSalary,
                                     @RequestParam(required = false) Integer isAccomplish) {
 
-        PageInfo<JobHuntVo> result = jobhuntService.getList(pageIndex, pageSize,jobHuntIDList,jobUserID,jobUserName,workName,minWorkYear, maxWorkYear, jobHuntTypeID, jobUserTypeID, minSalary, maxSalary, isAccomplish);
+        PageInfo<JobHuntVo> result = jobhuntService.getList(pageIndex, pageSize,jobHuntIDList,jobUserID,jobUserName,professionName,minWorkYear, maxWorkYear, jobHuntTypeID, jobUserTypeID, minSalary, maxSalary, isAccomplish);
         return RespGenerstor.success(result);
     }
 
@@ -89,7 +93,7 @@ public class JobHuntController {
 
         PageInfo<JobHuntVo> result = jobhuntService.getList(pageIndex, pageSize,jobHuntIDList,jobUserID,jobUserName,workName,minWorkYear, maxWorkYear, jobHuntTypeID, jobUserTypeID, minSalary, maxSalary, isAccomplish);
         ExcelHelper.ExcelData data = excelHelper.new ExcelData();
-        data.setTitles(Arrays.asList(new String[]{"序号","姓名","工种名称", "希望工作地区", "可到职日期","工作年限", "求职类型", "人才类型", "月薪要求"}));
+        data.setTitles(Arrays.asList(new String[]{"序号","姓名", "希望工作地区", "可到职日期","工作年限", "求职类型", "人才类型", "月薪要求"}));
         int i = 0;
         List<List<Object>> rowDatas = new ArrayList();
         for (JobHuntVo item : result.getList()) {
@@ -97,9 +101,8 @@ public class JobHuntController {
             ++i;
             row.add(i);
             row.add(item.jobUserName);
-            row.add(item.workName);
             row.add(item.areaWork);
-            row.add(item.inDate);
+            row.add(dataUtils.dateToStrFormat(item.inDate,"yyyy-MM-dd"));
             row.add(item.workYear);
             row.add(item.jobHuntTypeStr);
             row.add(item.jobUserTypeStr);

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

@@ -29,9 +29,9 @@ public class RecommendMgtController {
     public BaseResponse getList(@RequestParam("page") int pageIndex, @RequestParam("limit") int pageSize,
                                 @RequestParam(required = false) String name, @RequestParam(required = false) String companyName,
                                 @RequestParam(required = false) Integer recommendType, @RequestParam(required = false) Integer entryState,
-                                @RequestParam(required = false) String pushName, @RequestParam(required = false) String professionID) {
+                                @RequestParam(required = false) String pushName, @RequestParam(required = false) String professionName) {
 
-        PageInfo<RecommendMgtVo> result = recommendMgtService.getList(pageIndex, pageSize, name, companyName, recommendType, entryState, pushName, professionID);
+        PageInfo<RecommendMgtVo> result = recommendMgtService.getList(pageIndex, pageSize, name, companyName, recommendType, entryState, pushName, professionName);
         return RespGenerstor.success(result);
     }
 

+ 1 - 1
src/main/java/com/hz/employmentsite/mapper/cquery/JobHuntCQuery.java

@@ -7,7 +7,7 @@ import java.util.List;
 
 public interface JobHuntCQuery {
     List<JobHuntVo> getJobHuntList(@Param("jobHuntIDList") String jobHuntIDList,@Param("jobUserID") String jobUserID,
-                                      @Param("jobUserName") String jobUserName,@Param("workName") String workName,
+                                      @Param("jobUserName") String jobUserName,@Param("professionName") String professionName,
                                       @Param("minWorkYear")Integer minWorkYear,@Param("maxWorkYear")Integer maxWorkYear,
                                       @Param("jobHuntTypeID")Integer jobHuntTypeID, @Param("jobUserTypeID")Integer jobUserTypeID,
                                       @Param("minSalary")BigDecimal minSalary, @Param("maxSalary")BigDecimal maxSalary,

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

@@ -14,7 +14,7 @@ public interface RecommendMgtCQuery {
                                              @Param("recommendType") Integer recommendType,
                                              @Param("entryState") Integer entryState,
                                              @Param("pushName") String pushName,
-                                             @Param("professionID") String professionID);
+                                             @Param("professionName") String professionName);
 
     /**
      * 获取推荐企业信息

+ 28 - 14
src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteUserImpl.java

@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.UUID;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 @Service("SiteUserService")
@@ -52,6 +53,11 @@ public class SiteUserImpl implements SiteUserService {
     @Autowired
     private DictionaryService dictionaryService;
 
+    private final String MOBILE_REGEX = "0?(13|14|15|18|17)[0-9]{9}";
+
+    private final String ID_CARD_REGEX = "\\d{17}[\\d|x]|\\d{15}";
+
+
     @Override
     public PageInfo<SiteUserVo> getList(int pageIndex, int pageSize, List<String> siteUserIDList, String siteUserName, String siteID, String roleName, String regionCode, String userNo) {
         PageHelper.startPage(pageIndex, pageSize);
@@ -266,25 +272,33 @@ public class SiteUserImpl implements SiteUserService {
             if (stringUtils.IsNullOrEmpty(item.mobile)) {
                 errorInfo += "请填写联系电话!";
             } else {
-                String siteUserID = pcSiteUsers.stream()
-                        .filter(it -> it.getMobile() != null && it.getMobile().equals(item.getMobile().trim()))
-                        .findFirst()
-                        .orElse(new PcSiteUser())
-                        .getSiteUserID();
-                if (!stringUtils.IsNullOrEmpty(siteUserID)) {
-                    errorInfo += "联系电话已绑定其他驿站人员!";
+                if (Pattern.matches(MOBILE_REGEX, item.mobile)) {
+                    String siteUserID = pcSiteUsers.stream()
+                            .filter(it -> it.getMobile() != null && it.getMobile().equals(item.getMobile().trim()))
+                            .findFirst()
+                            .orElse(new PcSiteUser())
+                            .getSiteUserID();
+                    if (!stringUtils.IsNullOrEmpty(siteUserID)) {
+                        errorInfo += "联系电话已绑定其他驿站人员!";
+                    }
+                } else {
+                    errorInfo += "联系电话格式错误!";
                 }
             }
             if (stringUtils.IsNullOrEmpty(item.idCard)) {
                 errorInfo += "请填写身份证号码!";
             } else {
-                String siteUserID = pcSiteUsers.stream()
-                        .filter(it -> it.getIDCard() != null && it.getIDCard().equals(item.getIdCard().trim()))
-                        .findFirst()
-                        .orElse(new PcSiteUser())
-                        .getSiteUserID();
-                if (!stringUtils.IsNullOrEmpty(siteUserID)) {
-                    errorInfo += "身份证已绑定其他驿站人员!";
+                if (Pattern.matches(ID_CARD_REGEX, item.idCard)) {
+                    String siteUserID = pcSiteUsers.stream()
+                            .filter(it -> it.getIDCard() != null && it.getIDCard().equals(item.getIdCard().trim()))
+                            .findFirst()
+                            .orElse(new PcSiteUser())
+                            .getSiteUserID();
+                    if (!stringUtils.IsNullOrEmpty(siteUserID)) {
+                        errorInfo += "身份证已绑定其他驿站人员!";
+                    }
+                } else {
+                    errorInfo += "身份证格式错误!";
                 }
             }
             if (stringUtils.IsNullOrEmpty(item.roleName)) {

+ 12 - 10
src/main/java/com/hz/employmentsite/services/impl/companyService/CompanyServiceImpl.java

@@ -164,17 +164,19 @@ public class CompanyServiceImpl implements CompanyService {
 
 
     @Override
-    public Integer delete(String id) {
+    public Integer delete(List<String> ids) {
         int result = 0;
-        PcPostExample pcPostExp = new PcPostExample();
-        pcPostExp.or().andCompanyIDEqualTo(id);
-        var curCompanyPostList = pcPostMapper.selectByExample(pcPostExp).stream().toList();
-        if( curCompanyPostList != null && curCompanyPostList.size() > 0){
-            throw new BaseException("10004","所选企业已有关联岗位信息,不允许删除!");
-        }else{
-            PcCompanyExample contactExample = new PcCompanyExample();
-            contactExample.or().andCompanyIDEqualTo(id);
-            result += pcCompanyMapper.deleteByExample(contactExample);
+        for(String curCompanyID : ids){
+            PcPostExample pcPostExp = new PcPostExample();
+            pcPostExp.or().andCompanyIDEqualTo(curCompanyID);
+            var curCompanyPostList = pcPostMapper.selectByExample(pcPostExp).stream().toList();
+            if( curCompanyPostList != null && curCompanyPostList.size() > 0){
+                throw new BaseException("10004","所选企业已有关联岗位信息,不允许删除!");
+            }else{
+                PcCompanyExample contactExample = new PcCompanyExample();
+                contactExample.or().andCompanyIDEqualTo(curCompanyID);
+                result += pcCompanyMapper.deleteByExample(contactExample);
+            }
         }
         return result;
     }

+ 4 - 6
src/main/java/com/hz/employmentsite/services/impl/companyService/PostServiceImpl.java

@@ -183,13 +183,11 @@ public class PostServiceImpl implements PostService {
 
 
     @Override
-    public int delete(String id) {
+    public int delete(List<String> ids) {
         int result = 0;
-        PcPostExample exp = new PcPostExample();
-        PcPostExample.Criteria cro = exp.or();
-        cro.andPostIDEqualTo(id);
-        result = pcPostMapper.deleteByExample(exp);
-
+        PcPostExample postExp = new PcPostExample();
+        postExp.or().andPostIDIn(ids);
+        result = pcPostMapper.deleteByExample(postExp);
         return result;
     }
 

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

@@ -43,11 +43,11 @@ public class JobHuntServiceImpl implements JobHuntService {
     private StringUtils stringUtils;
 
     @Override
-    public PageInfo<JobHuntVo> getList(Integer pageIndex, Integer pageSize, List<String> jobHuntIDList,String jobUserID, String jobUserName, String workName,
+    public PageInfo<JobHuntVo> getList(Integer pageIndex, Integer pageSize, List<String> jobHuntIDList,String jobUserID, String jobUserName, String professionName,
                                        Integer minWorkYear, Integer maxWorkYear, Integer jobHuntTypeID, Integer jobUserTypeID,
                                        BigDecimal minSalary, BigDecimal maxSalary, Integer isAccomplish) {
         PageHelper.startPage(pageIndex, pageSize);
-        List<JobHuntVo> list = jobhuntCQuery.getJobHuntList(stringUtils.ListToInSql(jobHuntIDList),jobUserID,jobUserName,workName,minWorkYear, maxWorkYear, jobHuntTypeID, jobUserTypeID, minSalary, maxSalary, isAccomplish);
+        List<JobHuntVo> list = jobhuntCQuery.getJobHuntList(stringUtils.ListToInSql(jobHuntIDList),jobUserID,jobUserName,professionName,minWorkYear, maxWorkYear, jobHuntTypeID, jobUserTypeID, minSalary, maxSalary, isAccomplish);
 
         PageInfo<JobHuntVo> result = new PageInfo(list);
 
@@ -149,8 +149,8 @@ public class JobHuntServiceImpl implements JobHuntService {
                 if (item.jobUserID == null)
                     errorInfo += "求职人员不存在!";
             }
-            if (stringUtils.IsNullOrEmpty(item.workName))
-                errorInfo += "请填写工种名称!";
+//            if (stringUtils.IsNullOrEmpty(item.workName))
+//                errorInfo += "请填写工种名称!";
 
             if (stringUtils.IsNullOrEmpty(item.jobHuntTypeStr))
                 errorInfo += "请填写求职类型!";

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

@@ -159,7 +159,29 @@ public class JobUserServiceImpl implements JobUserService {
     @Override
     public int save(JobUserVo data, String userId) {
         int result = 0;
+
         PcJobuser dbData = pcJobuserMapper.selectByPrimaryKey(data.getJobUserID());
+        PcJobuserExample emp = new PcJobuserExample();
+        PcJobuserExample.Criteria cir = emp.or();
+        //验证身份证是否已经录入
+        if (dbData != null){
+            cir.andJobuserIDNotEqualTo(data.getJobUserID());
+        }
+        cir.andIdentityNumberEqualTo(data.getIdentityNumber());
+        if(pcJobuserMapper.selectByExample(emp).size()>0){
+            throw new BaseException("500","该身份证号已绑定其他人员");
+        }
+
+        //验证联系电话是否已经录入
+        cir = emp.or();
+        if (dbData != null){
+            cir.andJobuserIDNotEqualTo(data.getJobUserID());
+        }
+        cir.andUserMobileEqualTo(data.getUserMobile());
+        if(pcJobuserMapper.selectByExample(emp).size()>0){
+            throw new BaseException("500","该联系电话已绑定其他人员");
+        }
+
         if (dbData == null) {
             dbData = new PcJobuser();
             dbData.setJobuserID(data.getJobUserID());

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

@@ -27,10 +27,10 @@ public class RecommendMgtServiceImpl implements RecommendMgtService {
     private StringUtils stringUtils;
 
     @Override
-    public PageInfo<RecommendMgtVo> getList(Integer page, Integer rows, String name, String companyName, Integer recommendType, Integer entryState, String pushName, String professionID) {
+    public PageInfo<RecommendMgtVo> getList(Integer page, Integer rows, String name, String companyName, Integer recommendType, Integer entryState, String pushName, String professionName) {
         PageHelper.startPage(page, rows);
 
-        List<RecommendMgtVo> list = recommendMgtCQuery.getRecommendMgtList(name, companyName, recommendType, entryState, pushName, professionID);
+        List<RecommendMgtVo> list = recommendMgtCQuery.getRecommendMgtList(name, companyName, recommendType, entryState, pushName, professionName);
 
         PageInfo<RecommendMgtVo> result = new PageInfo(list);
 

+ 1 - 1
src/main/java/com/hz/employmentsite/services/service/companyService/CompanyService.java

@@ -16,7 +16,7 @@ public interface CompanyService {
 
     Integer save(CompanyVo data, String userId);
 
-    Integer delete(String id);
+    Integer delete(List<String> id);
 
     CompanyVo getDataById(String id);
 

+ 1 - 1
src/main/java/com/hz/employmentsite/services/service/companyService/PostService.java

@@ -10,7 +10,7 @@ public interface PostService {
     PageInfo<RecommendPostVo> getCommendPostList(Integer page, Integer rows, String jobUserID);
     Integer saveCommendPost(RecommendPostVo data, String userId);
     int save(PostVo data, String userId);
-    int delete(String id);
+    int delete(List<String> ids);
     PostVo getDataById(String id);
     List<PcPost> getDataListByCompanyId(String companyID);
     List<PostVo> importPost(List<PostVo> dataList, String userID);

+ 1 - 1
src/main/java/com/hz/employmentsite/services/service/jobUserManager/JobHuntService.java

@@ -7,7 +7,7 @@ import java.util.List;
 
 public interface JobHuntService {
 
-    PageInfo<JobHuntVo> getList(Integer pageIndex, Integer pageSize,List<String> jobHuntIDList, String jobUserID, String jobUserName, String workName,
+    PageInfo<JobHuntVo> getList(Integer pageIndex, Integer pageSize,List<String> jobHuntIDList, String jobUserID, String jobUserName, String professionName,
                                 Integer minWorkYear, Integer maxWorkYear, Integer jobHuntTypeID, Integer jobUserTypeID,
                                 BigDecimal minSalary, BigDecimal maxSalary, Integer isAccomplish);
 

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

@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import java.util.List;
 
 public interface RecommendMgtService {
-    PageInfo<RecommendMgtVo> getList(Integer page, Integer rows, String name, String companyName, Integer recommendType, Integer entryState, String pushName, String professionId);
+    PageInfo<RecommendMgtVo> getList(Integer page, Integer rows, String name, String companyName, Integer recommendType, Integer entryState, String pushName, String professionName);
 
     /**
      * 修改入职状态

+ 2 - 0
src/main/java/com/hz/employmentsite/vo/jobUserManager/RecommendCompanyPostVo.java

@@ -11,4 +11,6 @@ public class RecommendCompanyPostVo {
     public String isRecommend;
     public String companyAddress;
     public String professionID;
+    public String maxSalary;
+    public String minSalary;
 }

+ 3 - 3
src/main/resources/mapping/cquery/JobHuntCQuery.xml

@@ -13,7 +13,7 @@
         left join (select * from sys_dictionary_item where DictionaryCode ='JobHuntType') dic_huntJobType on jobHunt.JobHuntType = dic_huntJobType.value
         where 1=1
         <if test="jobHuntIDList != '' and jobHuntIDList != null">
-            and jobHuntId in (${jobHuntIDList})
+            and jobHunt.JobHuntID in (${jobHuntIDList})
         </if>
         <if test="jobUserID != '' and jobUserID != null">
             and jobHunt.jobUserID = #{jobUserID}
@@ -21,8 +21,8 @@
         <if test="jobUserName != '' and jobUserName != null">
             and jobUser.name like Concat('%',#{jobUserName},'%')
         </if>
-        <if test="workName != '' and workName != null">
-            and jobHunt.workName like Concat('%',#{workName},'%')
+        <if test="professionName != '' and professionName != null">
+            and profession.ProfessionName like Concat('%',#{professionName},'%')
         </if>
         <if test="minWorkYear != '' and minWorkYear != null">
             and jobHunt.workYear <![CDATA[ >= ]]> #{minWorkYear}

+ 4 - 3
src/main/resources/mapping/cquery/RecommendMgtCQuery.xml

@@ -35,8 +35,8 @@
             <if test="pushName != '' and pushName != null">
                 and g.Name like Concat('%',#{pushName},'%')
             </if>
-            <if test="professionID != '' and professionID != null">
-                and b.ProfessionID = #{professionID}
+            <if test="professionName != '' and professionName != null">
+                and f.ProfessionName like Concat('%',#{professionName},'%')
             </if>
         </where>
         order by a.createtime desc
@@ -44,7 +44,8 @@
 <!--    推荐岗位信息-->
     <select id="getRecommendCompanyPostList" resultType="com.hz.employmentsite.vo.jobUserManager.RecommendCompanyPostVo">
         select a.postid,b.companyname,c.professionname,a.recruitcount,a.starttime,a.endtime,b.companyAddress,
-        case when d.recommendmgtid is null then '未推荐' else '已推荐' end as isRecommend,d.recommendMgtID,a.professionid,c.professionname
+        case when d.recommendmgtid is null then '未推荐' else '已推荐' end as isRecommend,
+        d.recommendMgtID,a.professionid,c.professionname,a.maxsalary,a.minsalary
         from pc_post a
         left join pc_company b on a.CompanyID = b.CompanyID
         left join pc_profession c on a.ProfessionID = c.ProfessionID

src/main/resources/static/doc/template/驿站站点人员导入模板.xlsx → src/main/resources/static/doc/template/站点人员导入模板.xlsx


+ 1 - 1
vue/src/views/baseSettings/siteUser/index.vue

@@ -127,7 +127,7 @@ export default defineComponent({
         {cnName: '所属驿站', enName: 'siteName', width: 100},
       ],
       template: {
-        tempFileName: '站点人员信息导入模板.xlsx',
+        tempFileName: '站点人员导入模板.xlsx',
         url: '',
         params: null,
       },

+ 1 - 7
vue/src/views/companyService/post/edit.vue

@@ -258,13 +258,7 @@ export default defineComponent(
             });
             postCompany.dataModel.hasProfession = false;
           }
-          // else if (targetOption.tag == "thirdLevel") {
-          //   targetOption.children = null;
-          //   postCompany.dataModel.professionID = targetOption.value;
-          //   postCompany.dataModel.postName = targetOption.label;
-          //   postCompany.dataModel.hasProfession = true;
-          //   //console.log("xx",postCompany.dataModel);
-          // }
+
         }
       };
 

+ 14 - 15
vue/src/views/jobUserManager/jobhunt/edit.vue

@@ -6,10 +6,6 @@
         <a-col :span="7">
           <a-form-item label="姓名"  name="jobUserID" :label-col="{span:8}"  :rules="[{ required: true, message: '请输选择求职人员!' }]">
             <label v-if="opCategory==3">{{dataModel.name}}</label>
-<!--            <a-select  ref="select"  v-model:value="dataModel.jobUserID" :options="jobUserList"
-                       :field-names="{label:'text',value:'value'}"  :allow-clear="true"  >
-            </a-select>-->
-
             <a-select ref="select" show-search optionFilterProp="label"  v-model:value="dataModel.jobUserID" >
               <a-select-option v-for="item in jobUserList" :label="item.text" :value="item.value"
                                :key="item.value">
@@ -101,7 +97,7 @@
   </div>
 </template>
 <script lang="ts">
-import {defineComponent, reactive, ref, toRefs} from "vue";
+import {defineComponent, reactive, ref, toRefs, watch} from "vue";
 import {useTabsViewStore} from "@/store/modules/tabsView";
 import {getJobHuntByID,saveJobHunt} from "@/api/jobUserManager/jobhunt"
 import {getJobUserDataList} from "@/api/jobUserManager/jobuser";
@@ -145,7 +141,6 @@ export default defineComponent({
       regionList.value = result;
     }
 
-
     const getFirstProfessionList = () => {
       get("profession/getFirstProfessionList", null).then(data=>{
         firstProfessionList.value = (data as any[]).map((x) => {
@@ -173,7 +168,7 @@ export default defineComponent({
               };
             });
           });
-          formData.dataModel.professionID = null;
+          formData.dataModel.hasProfession = false;
         } else if (targetOption.tag == "secondLevel") {
           get("profession/getListByParentProfessionID",{parentProfessionID:targetOption.value}).then(data => {
             targetOption.loading = false;
@@ -181,20 +176,24 @@ export default defineComponent({
               return {
                 label: x.name,
                 value: x.code,
-                isLeaf: false,
+                isLeaf: true,
                 tag: 'thirdLevel'
               };
             });
           });
-          formData.dataModel.professionID = null;
-        }else if (targetOption.tag == "thirdLevel") {
-          targetOption.loading = false;
-          targetOption.children = [];
-          formData.dataModel.professionID = targetOption.value;
-          console.log("xx",formData.dataModel);
+          formData.dataModel.hasProfession = false;
         }
       }
     };
+    watch(() => formData.dataModel.professionName, (selectedValues) => {
+      if (selectedValues && selectedValues.length == 3) {
+        formData.dataModel.professionID = selectedValues[2];
+        formData.dataModel.hasProfession = true;
+      } else {
+        formData.dataModel.professionID = '';
+        formData.dataModel.hasProfession = false;
+      }
+    });
     const getJobUserList = async function() {
       const jobUserResult :any = await getJobUserDataList();
       jobUserList.value = jobUserResult;
@@ -245,7 +244,7 @@ export default defineComponent({
         }
       }
 
-      if(formData.dataModel.professionID==null){
+      if(!formData.dataModel.hasProfession){
         message.error("请选择完整的岗位信息!");
         isAllowCommit.value = false;
       }

+ 5 - 5
vue/src/views/jobUserManager/jobhunt/index.vue

@@ -13,8 +13,8 @@
           </a-form-item>
         </a-col>
         <a-col :span="6">
-          <a-form-item label="工种名称" :label-col="{ span: 8 }" name="workName">
-            <a-input v-model:value="searchParamsState.workName" placeholder="" />
+          <a-form-item label="求职岗位" :label-col="{ span: 8 }" name="professionName">
+            <a-input v-model:value="searchParamsState.professionName" placeholder="" />
           </a-form-item>
         </a-col>
         <a-col :span="8">
@@ -161,7 +161,7 @@ import Recommend from "@/views/jobUserManager/jobhunt/recommend.vue";
         pageIndex: 1,
         pageSize: 20,
         jobUserName: null,
-        workName:null,
+        professionName:null,
         minWorkYear: null,
         maxWorkYear: null,
         jobHuntTypeID: null,
@@ -185,7 +185,7 @@ import Recommend from "@/views/jobUserManager/jobhunt/recommend.vue";
             `${searchParamsState.pageSize * (searchParamsState.pageIndex - 1) + item.index + 1}`,
         },
         { title: '姓名', dataIndex: 'jobUserName', key: 'jobUserName', width: 100,align: "center", },
-        { title: '工种名称', dataIndex: 'workName', key: 'workName', width: 150, align: "center", },
+        // { title: '工种名称', dataIndex: 'workName', key: 'workName', width: 150, align: "center", },
         { title: '希望工作地区', dataIndex: 'areaWork', key: 'areaWork', width: 150, align: "center", },
         { title: '可到职日期', dataIndex: 'inDate', key: 'inDate', width: 100, align: "center",
           customRender: ({ record }) => record.inDate == null?"":dayjs(record.inDate).format('YYYY-MM-DD'), },
@@ -214,7 +214,7 @@ import Recommend from "@/views/jobUserManager/jobhunt/recommend.vue";
         url: '/jobUserService/jobHunt/importJobHunt',
         columns: [
           {cnName: '姓名', enName: 'jobUserName', width: 100},
-          {cnName: '工种名称', enName: 'workName', width: 100},
+          // {cnName: '工种名称', enName: 'workName', width: 100},
           {cnName: '求职类型', enName: 'jobHuntType', width: 100},
           {cnName: '人才类型', enName: 'jobUserType', width: 100},
           {cnName: '最低月薪(元)', enName: 'minSalary', width: 100},

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

@@ -73,8 +73,8 @@
           </a-form-item>
         </a-col>
         <a-col :span="6">
-          <a-form-item label="岗位" :label-col="{ span: 8 }" name="professionId">
-            <a-input v-model:value="searchParamsState.professionId" placeholder=""/>
+          <a-form-item label="岗位" :label-col="{ span: 8 }" name="professionName">
+            <a-input v-model:value="searchParamsState.professionName" placeholder=""/>
           </a-form-item>
         </a-col>
       </a-row>
@@ -135,7 +135,7 @@ export default defineComponent({
       recommendType: null,
       entryState: null,
       pushName: '',
-      professionId: null
+      professionName: ''
     });
     const formState = reactive({
       total: 0,