lizeyu 10 mesi fa
parent
commit
57c60b90cb

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

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

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

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

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