소스 검색

web-岗位信息管理-推荐求职人员调整

liao-sea 8 달 전
부모
커밋
fb5838393e

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

@@ -66,7 +66,7 @@ public class RecommendMgtController {
                                                     @RequestParam(required = false) String companyName,@RequestParam(required = false) String inviteProfessionName, @RequestParam("type") Integer type,
                                                     @RequestParam(required = false) String parentProfessionID, @RequestParam(required = false) Integer cultureRank,
                                                     @RequestParam(required = false) Integer workYear, @RequestParam(required = false) Integer minSalary,@RequestParam(required = false) Integer maxSalary,
-                                                    @RequestParam(required = false) List<String> regionNameList,@RequestParam(required = false) List<String>  siteNameList) {
+                                                    @RequestParam(required = false) List<String> regionNameList,@RequestParam(required = false) List<String> siteNameList) {
         PageInfo<RecommendCompanyPostVo> result = recommendMgtService.getRecommendCompanyPostList(pageIndex, pageSize, jobHuntID, professionID, companyName,inviteProfessionName, type, parentProfessionID, cultureRank, workYear, minSalary, maxSalary,regionNameList,siteNameList);
         return RespGenerstor.success(result);
     }
@@ -79,9 +79,9 @@ public class RecommendMgtController {
                                             @RequestParam(required = false) String userName, @RequestParam("type") Integer type,
                                             @RequestParam(required = false) Integer cultureRank, @RequestParam(required = false) Integer keyPersonType,
                                             @RequestParam(required = false) String parentProfessionID, @RequestParam(required = false) Integer workYear,
-                                            @RequestParam(required = false) String regionCode, @RequestParam(required = false) String siteID,
+                                            @RequestParam(required = false) List<String> regionNameList, @RequestParam(required = false) List<String> siteNameList,
                                             @RequestParam(required = false) Integer minSalary,@RequestParam(required = false) Integer maxSalary) {
-        PageInfo<RecommendJobVo> result = recommendMgtService.getRecommendJobList(pageIndex, pageSize, postID, professionID,huntProfessionName, userName, type, cultureRank, keyPersonType, parentProfessionID, workYear,regionCode,siteID, minSalary, maxSalary);
+        PageInfo<RecommendJobVo> result = recommendMgtService.getRecommendJobList(pageIndex, pageSize, postID, professionID,huntProfessionName, userName, type, cultureRank, keyPersonType, parentProfessionID, workYear,regionNameList,siteNameList, minSalary, maxSalary);
         return RespGenerstor.success(result);
     }
 

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

@@ -55,7 +55,7 @@ public interface RecommendMgtCQuery {
                                              @Param("userName") String userName, @Param("type") Integer type,
                                              @Param("cultureRank") Integer cultureRank, @Param("keyPersonType") Integer keyPersonType,
                                              @Param("parentProfessionID") String parentProfessionID, @Param("workYear") Integer workYear,
-                                             @Param("regionCode") String regionCode, @Param("siteID") String siteID,
+                                             @Param("regionNameList") String regionNameList, @Param("siteNameList") String siteNameList,
                                              @Param("minSalary") Integer minSalary,@Param("maxSalary") Integer maxSalary,@Param("recommendedJobHuntIDList") String recommendedJobHuntIDList);
 
     List<ProfessionLevel> getProfessionLevelList();

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

@@ -187,6 +187,7 @@ public class JobUserServiceImpl implements JobUserService {
     @Override
     public List<PcEducation> getJobUserEducationList(String jobuserID) {
         PcEducationExample exp = new PcEducationExample();
+        exp.setOrderByClause("SchoolTime DESC");
         PcEducationExample.Criteria cro = exp.or();
         cro.andJobuserIDEqualTo(jobuserID);
         List<PcEducation> educationList = pcEducationMapper.selectByExample(exp);
@@ -196,10 +197,11 @@ public class JobUserServiceImpl implements JobUserService {
     @Override
     public List<PcExperience> getJobUserPcExperienceList(String jobuserID) {
         PcExperienceExample exp = new PcExperienceExample();
+        exp.setOrderByClause("StartTime DESC");
         PcExperienceExample.Criteria cro = exp.or();
         cro.andJobuserIDEqualTo(jobuserID);
-        List<PcExperience> educationList = pcExperienceMapper.selectByExample(exp);
-        return educationList;
+        List<PcExperience> experienceList = pcExperienceMapper.selectByExample(exp);
+        return experienceList;
     }
 
     @Override

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

@@ -197,7 +197,7 @@ public class RecommendMgtServiceImpl implements RecommendMgtService {
     @Override
     public PageInfo<RecommendJobVo> getRecommendJobList(Integer page, Integer rows, String postID, String professionID,String huntProfessionName,
                                                         String userName, Integer type, Integer cultureRank, Integer keyPersonType, String parentProfessionID,
-                                                        Integer workYear,String regionCode,String siteID,Integer minSalary,Integer maxSalary) {
+                                                        Integer workYear, List<String> regionNameList, List<String> siteNameList,Integer minSalary,Integer maxSalary) {
         PageHelper.startPage(page, rows);
         List<String> recommendedJobHuntIDList = new ArrayList<>();
         PcRecommendMgtExample recommendMgtExp = new PcRecommendMgtExample();
@@ -208,7 +208,7 @@ public class RecommendMgtServiceImpl implements RecommendMgtService {
                 recommendedJobHuntIDList.add(curRecommended.getJobHuntID());
             }
         }
-        List<RecommendJobVo> list = recommendMgtCQuery.getRecommendJobList(postID, professionID, huntProfessionName, userName, type, cultureRank, keyPersonType, parentProfessionID, workYear,regionCode,siteID, minSalary, maxSalary,stringUtils.ListToInSql(recommendedJobHuntIDList));
+        List<RecommendJobVo> list = recommendMgtCQuery.getRecommendJobList(postID, professionID, huntProfessionName, userName, type, cultureRank, keyPersonType, parentProfessionID, workYear,stringUtils.ListToInSql(regionNameList),stringUtils.ListToInSql(siteNameList), minSalary, maxSalary,stringUtils.ListToInSql(recommendedJobHuntIDList));
         List<RecommendJobVo> resultList = new ArrayList<>();
         list.forEach(x -> {
             if (stringUtils.IsNullOrEmpty(x.getRecommendMgtID())) {

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

@@ -63,7 +63,7 @@ public interface RecommendMgtService {
      * */
     PageInfo<RecommendJobVo> getRecommendJobList(Integer page, Integer rows, String postID, String professionID,String huntProfessionName, String userName,
                                                  Integer type, Integer cultureRank, Integer keyPersonType, String parentProfessionID, Integer workYear,
-                                                 String regionCode,String siteID,Integer minSalary,Integer maxSalary);
+                                                 List<String> regionNameList,List<String> siteNameList,Integer minSalary,Integer maxSalary);
 
     List<ProfessionLevel> getProfessionLevelList();
 

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

@@ -7,6 +7,7 @@ import java.math.BigDecimal;
 @Data
 public class RecommendJobVo {
     public String recommendMgtID;
+    public String jobUserID;
     public String jobhuntID;
     public String userName;
     public String userMobile;

+ 5 - 5
src/main/resources/mapping/cquery/RecommendMgtCQuery.xml

@@ -168,7 +168,7 @@
     </select>
     <!--    推荐求职人员信息-->
     <select id="getRecommendJobList" resultType="com.hz.employmentsite.vo.jobUserManager.RecommendJobVo">
-        select a.jobhuntid,b.name as userName,b.usermobile,e.sitename,dic1.`name` as culturerankname,dic2.`name` as
+        select a.jobhuntid,b.jobUserID,b.name as userName,b.usermobile,e.sitename,dic1.`name` as culturerankname,dic2.`name` as
         keypersontypename,a.workyear,a.minsalary,a.maxsalary,area.name as regionName,
         case when d.recommendmgtid is null then '未推荐' else '已推荐' end as
         isrecommend,d.recommendMgtID,a.professionid,c.professionname
@@ -198,12 +198,12 @@
             <if test="cultureRank!=null and cultureRank!=''">
                 and b.CultureRank <![CDATA[<=]]> #{cultureRank}
             </if>
-            <if test="regionCode!=null and regionCode!=''">
-                and b.regionCode = #{regionCode}
+            <if test="regionNameList !=null and regionNameList!=''">
+                and area.name in (${regionNameList})
             </if>
 
-            <if test="siteID!=null and siteID!=''">
-                and b.siteID =  #{siteID}
+            <if test="siteNameList!=null and siteNameList!=''">
+                and e.siteName in  (${siteNameList})
             </if>
             <choose>
                 <when test="parentProfessionID!=null and parentProfessionID!=''">

+ 353 - 0
vue/src/views/companyService/post/jobUserDetail.vue

@@ -0,0 +1,353 @@
+<template>
+  <a-modal
+    :width="1200"
+    v-model:visible="visible"
+    title="查看求职人员信息"
+    :closable="true"
+    :keyboard="false"
+    :mask-closable="true"
+    ok-text="确定"
+    @ok="onCommit"
+  >
+    <div class="jl-content">
+      <!-- 基本信息与学历,工作经历 -->
+      <div class="info-content">
+        <a-divider orientation="left">基本信息</a-divider>
+        <a-descriptions :column="4" bordered style="text-align: center;">
+          <a-descriptions-item label="姓名">{{ dataModel.name }}</a-descriptions-item>
+          <a-descriptions-item label="性别">{{ dataModel.genderName }}</a-descriptions-item>
+          <a-descriptions-item label="年龄">{{ dataModel.age }}</a-descriptions-item>
+          <a-descriptions-item label="民族">{{ dataModel.nationName }}</a-descriptions-item>
+          <a-descriptions-item label="政治面貌">{{ dataModel.politicsStatusName }}</a-descriptions-item>
+          <a-descriptions-item label="学历">{{ dataModel.cultureName }}</a-descriptions-item>
+          <a-descriptions-item label="手机">{{ dataModel.userMobile }}</a-descriptions-item>
+          <a-descriptions-item label="重点人员类别">{{ dataModel.keyTypeName }}</a-descriptions-item>
+          <a-descriptions-item label="健康状况">{{ dataModel.healthName }}</a-descriptions-item>
+          <a-descriptions-item label="就业状态">{{ dataModel.jobStatusName }}</a-descriptions-item>
+          <a-descriptions-item :span="2" label="住址">{{ dataModel.address }}</a-descriptions-item>
+          <a-descriptions-item :span="4" label="标签">
+            <a-tag v-for="(item, index) in dataModel.listLabel" :key="index">
+            {{ item.labelName }}
+            </a-tag>
+          </a-descriptions-item>
+          <a-descriptions-item :span="4" label="兴趣爱好">{{ dataModel.hobby }}</a-descriptions-item>
+          <a-descriptions-item :span="4" label="专业技术特长">{{ dataModel.personalSkills }}</a-descriptions-item>
+        </a-descriptions>
+        <a-divider orientation="left">教育经历</a-divider>
+        <a-table :columns="educationColumns" :data-source="educationData" :pagination="false" bordered
+                 style="margin-left: 11px;">
+          <template #bodyCell="{ column, index, record}">
+            <template v-if="column.key === 'cultureRank'">
+              <div>
+                {{
+                  getCultureName(record.cultureRank)
+                }}
+              </div>
+            </template>
+            <template v-if="column.key === 'schoolTime'">
+              <div>
+                {{
+                  dayjs(record.schoolTime).format('YYYY-MM-DD')
+                }}
+              </div>
+            </template>
+            <template v-if="column.key === 'overTime'">
+              <div>
+                {{
+                  dayjs(record.overTime).format('YYYY-MM-DD')
+                }}
+              </div>
+            </template>
+          </template>
+        </a-table>
+        <a-divider orientation="left">求职意向</a-divider>
+        <a-table :columns="jobHuntColumns" :data-source="jobHuntListData" bordered :pagination="false"
+                 style="margin-left: 11px">
+        </a-table>
+        <a-divider orientation="left">工作经历</a-divider>
+        <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>
+            <p>工作单位:{{ item.workAddress }}</p>
+            <p>职务:{{ item.duties }}</p>
+          </a-timeline-item>
+        </a-timeline>
+        <a-divider orientation="left">附件</a-divider>
+        <b-upload-file :fileRefId="dataModel.jobUserID" :readonly="true" :multiple="true" style="width: 100%;"
+                       :setFileList="setFileList" :accept="'.pdf,.png,.jpg'"></b-upload-file>
+      </div>
+    </div>
+  </a-modal>
+</template>
+
+<script lang="ts">
+import {defineComponent, reactive, ref, toRefs} from "vue";
+import {getDataById, getEducationList, getExperienceList} from "@/api/jobUserManager/jobuser";
+import type {SelectProps, TableColumnsType} from "ant-design-vue";
+import dayjs from "dayjs";
+import {getSysDictionaryList} from "@/api/system/dictionary";
+import {getJobHuntList} from "@/api/jobUserManager/jobhunt";
+import {useUserStore} from "@/store/modules/user";
+import crtyptoHelp from "@/utils/crypto";
+import BUploadFile from "@/components/file/uploadFile.vue";
+
+interface jobUserModel {
+  dataModel: any;
+}
+
+export default defineComponent({
+  props: {
+    loadData: {
+      type: Function,
+      default: null
+    }
+  },
+  components:{BUploadFile},
+  setup() {
+    const visible = ref(false);
+    const userStore = useUserStore();
+    const userInfo = ref(userStore.getUserInfo)
+
+    // 求职人员信息
+    const jobUserInfo = reactive<jobUserModel>({dataModel:{}});
+    // 受教育经历
+    const educationData = ref<Array<any>>([]);
+    // 受教育经历表格定义
+    const educationColumns: TableColumnsType = [
+      {title: '序号', align: "center", key: 'educationID', width: 120,
+        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`
+      },
+      {title: '学校名', dataIndex: 'schoolName', key: 'schoolName', align: "center", width: 120},
+      {title: '文化程度', dataIndex: 'cultureRank', key: 'cultureRank', align: "center", width: 120},
+      {title: '就读时间', dataIndex: 'schoolTime', key: 'schoolTime', align: "center", width: 120},
+      {title: '毕业时间', dataIndex: 'overTime', key: 'overTime', align: "center", width: 120},
+      {title: '专业', dataIndex: 'major', key: 'major', align: "center", width: 120},];
+
+    const searchParams = reactive({
+      pageIndex: 1,
+      pageSize: 99
+    });
+    // 工作经验数据
+    const experienceData = ref<Array<any>>([]);
+    // 求职意向数据
+    const jobHuntListData = ref<Array<any>>([]);
+    // 求职意向表格定义
+    const jobHuntColumns: TableColumnsType = [
+      {
+        title: '序号',
+        align: 'center',
+        width: 80,
+        key: 'jobHuntID',
+        customRender: (item) =>
+          `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`,
+      },
+      {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'),
+      },
+      {title: '工作年限', dataIndex: 'workYear', key: 'workYear', align: "center",},
+      {title: '求职类型', dataIndex: 'jobHuntTypeStr', key: 'jobHuntTypeStr', align: "center",},
+      {title: '求职岗位', dataIndex: 'professionName', key: 'professionName', align: "center",},
+      {title: '人才类型', dataIndex: 'jobUserTypeStr', key: 'jobUserTypeStr', align: "center",},
+      {
+        title: '月薪要求', dataIndex: 'salary', key: 'salary', align: "center",
+        customRender: (item) => {
+          const salary = showSalary(item.record.minSalary, item.record.maxSalary);
+          return salary;
+        }
+      },
+    ];
+    // 期望月薪显示优化方法
+    const showSalary = (minSalary: any, maxSalary: any) => {
+      if (minSalary != null) {
+        if (maxSalary != null) {
+          return minSalary.toString() + "-" + maxSalary.toString();
+        } else {
+          return "≥" + minSalary.toString();
+        }
+      } else {
+        if (maxSalary != null) {
+          return "≤" + maxSalary.toString();
+        } else {
+          return "";
+        }
+      }
+    }
+    // 教育经历数据
+    const cultureList = ref<SelectProps['options']>();
+
+    // 加载求职人员数据
+    const show = async function (id: any)  {
+      await getCultureList();
+      await loadJobHuntData(id);
+      await loadEducationData(id);
+      await loadExperienceData(id);
+      getDataById(id, userInfo.value.userID, 1).then(data => {
+        jobUserInfo.dataModel = data;
+        jobUserInfo.dataModel.userMobile = crtyptoHelp.decryptDesText(jobUserInfo.dataModel.userMobile);
+        jobUserInfo.dataModel.identityNumber = crtyptoHelp.decryptDesText(jobUserInfo.dataModel.identityNumber);
+        visible.value = true;
+      });
+    };
+
+    const onCommit = ()=>{
+      visible.value = false;
+    }
+    // 加载教育经历
+    const loadEducationData = (id: any) => {
+      getEducationList(id).then(data => {
+        if (data) {
+          educationData.value = data;
+        }
+      });
+    }
+    // 加载工作经历
+    const loadExperienceData = (id: any) => {
+      getExperienceList(id).then(data => {
+        if (data) {
+          experienceData.value = data;
+        }
+      })
+    }
+    // 加载求职意向数据
+    const loadJobHuntData = (id: any)=> {
+      let params = {
+        pageIndex: 1,
+        pageSize: 999,
+        jobUserID:id
+      }
+      getJobHuntList(params).then(result => {
+        jobHuntListData.value = result.list
+      })
+    }
+
+    // 获取教育经历数据
+    const getCultureList = async function () {
+      getSysDictionaryList('HighestDegree').then((data) => {
+        cultureList.value = data;
+      });
+    };
+
+    function getCultureName(value: any) {
+      let filter = cultureList.value?.filter(item => item.value == value);
+      if (filter && filter.length > 0) {
+        return filter[0].name
+      }
+      return "";
+    }
+
+    const fileList = ref();
+    const setFileList = (files) => {
+      fileList.value = files;
+    };
+
+    return {
+      ...toRefs(jobUserInfo),
+      visible,
+      fileList,
+      educationData,
+      loadEducationData,
+      jobHuntListData,
+      loadJobHuntData,
+      experienceData,
+      loadExperienceData,
+      educationColumns,
+      jobHuntColumns,
+      show,
+      showSalary,
+      onCommit,
+      setFileList,
+      getCultureName,
+      dayjs
+    };
+  },
+  created() {
+
+  }
+});
+</script>
+
+<style lang="less" scoped>
+.card-search {
+
+  .jl-content {
+    min-height: calc(100vh - 240px);
+    width: 100%;
+    display: flex;
+
+    .avt-content {
+      width: 20%;
+      background-color: #e7e7e7;
+      padding: 10px;
+
+      .avt-image {
+        display: flex;
+        flex-wrap: wrap;
+        justify-content: center;
+        img{
+          width:120px;
+          height:120px;
+        }
+      }
+
+      .age-info {
+        width: 100%;
+        display: flex;
+        justify-content: space-between;
+        margin-top: 15px;
+        padding: 0 20%;
+      }
+
+      .politics-info {
+        margin-top: 25px;
+        display: grid;
+        row-gap: 22px;
+        grid-template-columns: repeat(2, minmax(0, 1fr));
+
+        .label-span {
+          text-align: right;
+        }
+      }
+
+      .nameTitle {
+        margin-top: 1rem;
+        text-align: center;
+        font-size: 20px;
+        font-weight: 700;
+      }
+
+      .label-info {
+        margin-top: 15px;
+        padding: 0 5%;
+
+        .title {
+          margin-bottom: 10px;
+        }
+
+        .flex-box {
+          display: flex;
+          flex-wrap: wrap;
+
+          .ant-tag {
+            text-align: center;
+            margin-bottom: 8px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+          }
+        }
+      }
+
+    }
+
+    .info-content {
+      width: 80%;
+      height: 100%;
+      margin-left: 10px;
+    }
+  }
+}
+
+
+</style>

+ 91 - 37
vue/src/views/companyService/post/recommend.vue

@@ -122,45 +122,54 @@
           </a-col>
         </a-row>
         <a-row :gutter="24" v-show="expand">
-          <a-col :span="6">
-            <a-form-item label="所属区县" :label-col="{ span: 8 }" name="regionCode">
+          <a-col :span="12" style="padding-left: 37px;">
+            <a-form-item label="所属区县" :label-col="{ span: 3 }" name="regionCode">
               <a-select
-                ref="select"
-                v-model:value="searchParams.regionCode"
+                v-model:value="curRegionNameList"
                 :options="regionList"
-                :field-names="{ label: 'name', value: 'code' }"
-                :allow-clear="true"
-                @change="loadData"
+                mode="multiple"
+                size="middle"
+                @change="curRegionNameListChange"
               >
               </a-select>
             </a-form-item>
           </a-col>
-          <a-col :span="6">
-            <a-form-item label="所属驿站" :label-col="{ span: 8 }" name="siteID">
+          <a-col :span="12" style="padding-left: 37px;">
+            <a-form-item label="所属驿站" :label-col="{ span: 3 }" name="siteID">
               <a-select
-                ref="select"
-                v-model:value="searchParams.siteID"
+                v-model:value="curSiteNameList"
                 :options="siteList"
-                :field-names="{ label: 'siteName', value: 'siteID' }"
-                :allow-clear="true"
-                @change="loadData"
+                mode="multiple"
+                size="middle"
+                @change="onSearch"
               >
               </a-select>
             </a-form-item>
           </a-col>
-          <a-col :span="12">
-            <a-form-item label="薪资要求" :label-col="{span:4}" name="maxSalary">
-              <a-input type="number" v-model:value="searchParams.minSalary" style="width:120px;" placeholder=""/>
-              <label style="margin:10px;">-</label>
-              <a-input type="number" v-model:value="searchParams.maxSalary" style="width:120px;" placeholder=""/>
-              <a-checkbox  v-if="searchParams.type===0" style="float: right;"
-                           v-model:checked="searchParams.checkParentProfessionID"
-                           @change="onSearch">
-                相关行业
-              </a-checkbox>
+        </a-row>
+
+        <a-row :gutter="24" v-show="expand">
+          <a-col :span="9" >
+            <a-form-item label="薪资要求" :label-col="{span:5}" name="maxSalary">
+              <a-input-group compact>
+                <a-input :min="0" :controls="false" v-model:value="searchParams.minSalary"
+                         style="width:110px;" placeholder=""/>
+                <a-input placeholder="——" disabled style="width: 30px; border-left: 0;border-right: 0;
+                       pointer-events: none;background: #fff;margin-left: 1px; "/>
+                <a-input :min="searchParams.minSalary" :controls="false" v-model:value="searchParams.maxSalary"
+                         style="width:110px;" placeholder=""/>
+              </a-input-group>
             </a-form-item>
           </a-col>
+          <a-col  :span="15">
+            <a-checkbox  v-if="searchParams.type===0"
+                         v-model:checked="searchParams.checkParentProfessionID"
+                         @change="onSearch">
+              相关行业
+            </a-checkbox>
+          </a-col>
         </a-row>
+
         <a-row class="edit-operation">
           <a-col :span="24" style="text-align: right">
             <a-button type="primary" html-type="submit" v-if="searchParams.type===0" functioncode="T01020206"
@@ -181,9 +190,15 @@
                 </a-button>
               </div>
             </template>
+            <template v-if="column.key === 'userName'">
+              <div style="text-align: center;color:#3a7be0;">
+                <a size="small" @click='onShowJobUserInfo(record)' >{{ record.userName }}</a>
+              </div>
+            </template>
           </template>
         </a-table>
       </div>
+      <jobUserDetailModel ref="modalJobUserInfoRef"></jobUserDetailModel>
     </div>
   </a-modal>
 </template>
@@ -198,17 +213,24 @@ import {getSysDictionaryList} from "@/api/system/dictionary";
 import {message} from "ant-design-vue";
 import {debounce} from "lodash-es";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
-import {get} from "@/api/common";
+import {getRegionCodeList} from '@/api/system/area/index';
+import JobUserDetailModel from "./jobUserDetail.vue";
+
 export default defineComponent({
   name: 'RecommendJobList',
+  components:{JobUserDetailModel},
   setup() {
     const visible = ref<boolean>(false);
     const confirmLoading = ref<boolean>(false);
     const formRef = ref<FormInstance>();
-    const expand = ref(false);
+    const modalJobUserInfoRef = ref();
+    const expand = ref(true);
     const title = ref<string>('');
     const siteList = ref<any>([]);
-    const regionList = ref<SelectProps['options']>();
+    const regionList = ref<any>([]);
+
+    const curRegionNameList = ref([]);
+    const curSiteNameList = ref([]);
     const searchParams = reactive({
       pageIndex: 1,
       pageSize: 10,
@@ -227,7 +249,9 @@ export default defineComponent({
       regionCode: null,
       siteID:null,
       minSalary: null,
-      maxSalary: null
+      maxSalary: null,
+      regionNameList:'',
+      siteNameList:'',
     });
     const formState = reactive({
       total: 0,
@@ -274,15 +298,33 @@ export default defineComponent({
     const dataList = ref([]);
     const addRecommendList = ref([] as any);
 
-    const getAllSites = () => {
+    const getRegionList = async function () {
+      const regionResult: any = await getRegionCodeList();
+      regionResult.map(x=>{
+        regionList.value.push({value:x.name});
+      });
+    };
+    const getAllSites = async function () {
+      siteList.value = [];
       getSiteList({pageIndex:1,pageSize:9999}).then((result :any) => {
-        siteList.value = result.list;
-        if(searchParams.regionCode){
-          siteList.value = siteList.value.filter(x=>x.regionCode==searchParams.regionCode);
-        }
+        result.list.map(x=>{
+          if(curRegionNameList.value.length>0){
+            curRegionNameList.value.map(m=> {
+              if(x.regionName == m){
+                siteList.value.push({value:x.siteName});
+              }
+            });
+          }else{
+            siteList.value.push({value:x.siteName});
+          }
+        });
       })
     }
 
+    const onShowJobUserInfo = (item:any) =>{
+      modalJobUserInfoRef.value.show(item.jobUserID);
+    }
+
     const onSelectChange = (selectedRowKeys: any) => {
       console.log(selectedRowKeys)
       formState.selectedRowKeys = selectedRowKeys;
@@ -322,19 +364,26 @@ export default defineComponent({
       searchParams.huntProfessionName = value;
     }
 
+    const curRegionNameListChange = ()=>{
+      curSiteNameList.value = [];
+      getAllSites();
+      onSearch();
+    }
+
     const onSearch = () => {
       searchParams.parentProfessionID = searchParams.checkParentProfessionID ? parentProfessionID.value : '';
+      searchParams.regionNameList  = curRegionNameList.value.join(',');
+      searchParams.siteNameList  = curSiteNameList.value.join(',');
       loadData();
     }
 
-    get('system/area/getCityList', {}).then(data => {
-      regionList.value = data;
-    });
+
 
 
     const loadData = async function () {
       formState.loading = true;
-      getAllSites();
+      await getRegionList();
+      await getAllSites();
       const result: any = await getRecommendJobList(searchParams);
       dataList.value = result.list;
       console.log(dataList);
@@ -451,6 +500,8 @@ export default defineComponent({
       regionList,
       dataList,
       professionList,
+      curRegionNameList,
+      curSiteNameList,
       cultureLevelList,
       addRecommendList,
       keyPersonTypeList,
@@ -458,11 +509,14 @@ export default defineComponent({
       show,
       formatStr,
       professionChange,
+      curRegionNameListChange,
       onSearch,
       showSalary,
       onRecommend,
       onBatchRecommend,
       onSelectChange,
+      modalJobUserInfoRef,
+      onShowJobUserInfo,
       handleTableChange,
       loadData,
       getCultureLevelList,

+ 1 - 3
vue/src/views/jobUserManager/jobhunt/companyDetail.vue

@@ -26,9 +26,7 @@
         </a-descriptions-item>
         <a-descriptions-item label="注册资本">
           {{ dataModel.registeredCapital }}
-          <span v-if="dataModel.registeredCapital != null">
-          万元
-        </span>
+          <span v-if="dataModel.registeredCapital != null">万元</span>
         </a-descriptions-item>
         <a-descriptions-item label="注册地行政区划">{{ dataModel.signInPoliticalAreaName }}</a-descriptions-item>
         <a-descriptions-item label="所属行业">{{ dataModel.industryName }}</a-descriptions-item>

+ 2 - 3
vue/src/views/jobUserManager/jobhunt/recommend.vue

@@ -31,7 +31,6 @@
           </a-col>
           <a-col :span="6">
             <a-form-item label="招聘企业" :label-col="{ span: 8 }" name="companyName">
-<!--              <a-input v-model:value="searchParams.companyName" placeholder=""/>-->
               <a-select ref="select" show-search optionFilterProp="label" allow-clear="true"
                         v-model:value="searchParams.companyName" >
                 <a-select-option v-for="item in companyList" :label="item.companyName" :value="item.companyName"
@@ -210,7 +209,7 @@ import {message, SelectProps} from "ant-design-vue";
 import {get} from "@/api/common";
 import {debounce} from "lodash-es";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
-import {getRegionCodeList } from '@/api/system/area/index';
+import {getRegionCodeList} from '@/api/system/area/index';
 import {getSysDictionaryList} from "@/api/system/dictionary";
 import CompanyDetailModel from "./companyDetail.vue";
 import PostDetailModel from "./postDetail.vue";
@@ -268,7 +267,7 @@ export default defineComponent({
         regionList.value.push({value:x.name});
       });
     };
-    const getAllSites = () => {
+    const getAllSites = async function (){
       allSiteList.value = [];
       getSiteList({pageIndex:1,pageSize:9999}).then((result :any) => {
         result.list.map(x=>{

+ 2 - 9
vue/src/views/jobUserManager/jobuser/vitae.vue

@@ -102,8 +102,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>
-            <p>{{ item.workAddress }}</p>
-            <p>{{ item.duties }}</p>
+            <p>工作单位:{{ item.workAddress }}</p>
+            <p>职务:{{ item.duties }}</p>
           </a-timeline-item>
         </a-timeline>
         <a-divider orientation="left">附件</a-divider>
@@ -277,13 +277,6 @@ const loadEducation = (id: any) => {
 const loadExperienceData = (id: any) => {
   getExperienceList(id).then(data => {
     if (data) {
-      data.sort((a, b) => {
-        // 将 startTime 字段转换为日期对象进行比较
-        const startTimeA = new Date(a.startTime);
-        const startTimeB = new Date(b.startTime);
-
-        return startTimeB - startTimeA;
-      })
       experienceData.value = data;
     }
   })