Browse Source

feat: 企业数据可视化地图完成

zhangying 9 months ago
parent
commit
ac5b2c120d

+ 21 - 0
src/main/java/com/hz/employmentsite/controller/companyService/CompanyController.java

@@ -208,6 +208,11 @@ public class CompanyController {
         return RespGenerstor.success(result);
     }
 
+    /**
+     * 企业可视化地图查询企业信息
+     *
+     * @return 企业信息
+     */
     @GetMapping("/dataMap")
     public BaseResponse getDataMapList(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize,
                                        @RequestParam(required = false) String companyName, @RequestParam(required = false) Integer maxDistance,
@@ -218,4 +223,20 @@ public class CompanyController {
         return RespGenerstor.success(result);
     }
 
+    /**
+     * 企业可视化地图查询企业信息-按岗位名称反向查询
+     *
+     * @param companyName 岗位名称,变量名保持不变,方便前端调用
+     * @return 企业信息
+     */
+    @GetMapping("/dataMapByPostName")
+    public BaseResponse getDataMapListByPostName(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize,
+                                                 @RequestParam(required = false) String companyName, @RequestParam(required = false) Integer maxDistance,
+                                                 @RequestParam(required = false) Integer companyModel, @RequestParam(required = false) Integer recordStatus,
+                                                 @RequestParam(required = false) String regionCode, @RequestParam(required = false) String siteID,
+                                                 @RequestParam Double latitude, @RequestParam Double longitude) {
+        PageInfo<CompanyVo> result = companyService.getDataMapListByPostName(pageIndex, pageSize, companyName, maxDistance, companyModel, recordStatus, regionCode, siteID, latitude, longitude);
+        return RespGenerstor.success(result);
+    }
+
 }

+ 18 - 0
src/main/java/com/hz/employmentsite/mapper/cquery/CompanyCQuery.java

@@ -32,4 +32,22 @@ public interface CompanyCQuery {
                                    @Param("companyModel") Integer companyModel, @Param("recordStatus") Integer recordStatus,
                                    @Param("regionCode") String regionCode, @Param("siteID") String siteID,
                                    @Param("latitude") Double latitude, @Param("longitude") Double longitude);
+
+    /**
+     * 企业可视化地图查询企业-按岗位名称反向查询
+     *
+     * @param postName     岗位名称
+     * @param maxDistance  最大直线距离
+     * @param companyModel 企业规模
+     * @param recordStatus 企业状态
+     * @param regionCode   所属县区
+     * @param siteID       所属驿站
+     * @param latitude     定点纬度
+     * @param longitude    定点经度
+     * @return 企业信息列表
+     */
+    List<CompanyVo> getDataMapListByPostName(@Param("postName") String postName, @Param("maxDistance") Integer maxDistance,
+                                             @Param("companyModel") Integer companyModel, @Param("recordStatus") Integer recordStatus,
+                                             @Param("regionCode") String regionCode, @Param("siteID") String siteID,
+                                             @Param("latitude") Double latitude, @Param("longitude") Double longitude);
 }

+ 26 - 3
src/main/java/com/hz/employmentsite/services/impl/companyService/CompanyServiceImpl.java

@@ -14,15 +14,12 @@ import com.hz.employmentsite.services.service.system.DictionaryService;
 import com.hz.employmentsite.util.StringUtils;
 import com.hz.employmentsite.vo.companyService.AppCompanyPostVo;
 import com.hz.employmentsite.vo.companyService.CompanyVo;
-import com.hz.employmentsite.vo.jobUserManager.JobUserVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 @Service("CompanyService")
@@ -662,4 +659,30 @@ public class CompanyServiceImpl implements CompanyService {
         PageInfo<CompanyVo> result = new PageInfo(dataMapList);
         return result;
     }
+
+    /**
+     * 企业可视化地图查询企业-按岗位名称反向查询
+     *
+     * @param pageIndex
+     * @param pageSize
+     * @param postName     企业名称
+     * @param maxDistance  最大直线距离
+     * @param companyModel 企业规模
+     * @param recordStatus 企业状态
+     * @param regionCode   所属县区
+     * @param siteID       所属驿站
+     * @param latitude     纬度
+     * @param longitude    经度
+     * @return 企业VO列表
+     */
+    @Override
+    public PageInfo<CompanyVo> getDataMapListByPostName(int pageIndex, int pageSize, String postName,
+                                                        Integer maxDistance, Integer companyModel, Integer recordStatus,
+                                                        String regionCode, String siteID, Double latitude,
+                                                        Double longitude) {
+        PageHelper.startPage(pageIndex, pageSize);
+        List<CompanyVo> dataMapList = companyCQuery.getDataMapListByPostName(postName, maxDistance, companyModel, recordStatus, regionCode, siteID, latitude, longitude);
+        PageInfo<CompanyVo> result = new PageInfo(dataMapList);
+        return result;
+    }
 }

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

@@ -53,4 +53,21 @@ public interface CompanyService {
                                        Integer companyModel, Integer recordStatus,
                                        String regionCode, String siteID,
                                        Double latitude, Double longitude);
+
+    /**
+     * 企业可视化地图查询企业-按岗位名称反向查询
+     *
+     * @param postName     企业名称
+     * @param maxDistance  最大直线距离
+     * @param companyModel 企业规模
+     * @param recordStatus 企业状态
+     * @param regionCode   所属县区
+     * @param siteID       所属驿站
+     * @return 企业VO列表
+     */
+    PageInfo<CompanyVo> getDataMapListByPostName(int pageIndex, int pageSize,
+                                                 String postName, Integer maxDistance,
+                                                 Integer companyModel, Integer recordStatus,
+                                                 String regionCode, String siteID,
+                                                 Double latitude, Double longitude);
 }

+ 86 - 0
src/main/resources/mapping/cquery/CompanyCQuery.xml

@@ -167,4 +167,90 @@
         ORDER BY
         distance
     </select>
+
+    <select id="getDataMapListByPostName" resultType="com.hz.employmentsite.vo.companyService.CompanyVo">
+        SELECT
+        company.CompanyID,
+        company.CompanyName,
+        company.CompanyAddress,
+        cmodel.`Name` AS companyModelType,
+        com_status.`Name` AS recordStatusName,
+        company.Longitude,
+        company.Latitude,
+        (
+        6371 * ACOS(
+        COS(
+        RADIANS( 23.116236 )) * COS(
+        RADIANS( company.Latitude )) * COS(
+        RADIANS( company.Longitude ) - RADIANS( 114.420244 )) + SIN(
+        RADIANS( 23.116236 )) * SIN(
+        RADIANS( company.Latitude ))
+        )) AS distance,
+        (
+        SELECT
+        JSON_ARRAYAGG( JSON_OBJECT( 'labelID', labelTemp.LabelID, 'labelName', labelTemp.LabelName ) )
+        FROM
+        (
+        SELECT
+        label.LabelID,
+        label.LabelName
+        FROM
+        pc_label label
+        LEFT JOIN pc_label_company label_company ON label.LabelID = label_company.LabelID
+        WHERE
+        label_company.CompanyID = company.CompanyID
+        ) AS labelTemp
+        ) AS labelList,
+        (
+        SELECT
+        JSON_ARRAYAGG( JSON_OBJECT( 'postID', postTemp.PostID, 'professionName', postTemp.ProfessionName ) )
+        FROM
+        (
+        SELECT
+        post1.PostID,
+        profession1.ProfessionName
+        FROM
+        pc_post post1
+        LEFT JOIN pc_profession profession1 ON post1.ProfessionID = profession1.ProfessionID
+        WHERE
+        post1.CompanyID = company.CompanyID
+        <if test="postName!='' and postName!=null">
+            and profession1.ProfessionName like Concat('%',#{postName},'%')
+        </if>
+        LIMIT 3
+        ) AS postTemp
+        ) AS postList
+        FROM
+        pc_post post
+        LEFT JOIN pc_profession prof ON post.ProfessionID = prof.ProfessionID
+        LEFT JOIN pc_company company ON post.CompanyID = company.CompanyID
+        LEFT JOIN sys_dictionary_item cmodel ON company.CompanyModel = cmodel.`Value`
+        AND cmodel.DictionaryCode = 'CompanyModel'
+        LEFT JOIN sys_dictionary_item com_status ON company.RecordStatus = com_status.`Value`
+        AND com_status.DictionaryCode = 'CompanyStatus'
+        WHERE 1=1
+        <if test="postName!='' and postName!=null">
+            and prof.ProfessionName like Concat('%',#{postName},'%')
+        </if>
+        <if test="companyModel!=null">
+            and company.companyModel = #{companyModel}
+        </if>
+        <if test="recordStatus!=null">
+            and company.recordStatus = #{recordStatus}
+        </if>
+        <if test="regionCode!='' and regionCode!=null">
+            and company.regionCode = #{regionCode}
+        </if>
+        <if test="siteID!='' and siteID!=null">
+            and company.siteID = #{siteID}
+        </if>
+        GROUP BY
+        company.CompanyID
+        <if test="maxDistance!=null">
+            HAVING
+            distance <![CDATA[ <= ]]> #{maxDistance}
+        </if>
+        ORDER BY
+        distance
+    </select>
 </mapper>

+ 13 - 0
vue/src/api/companyService/company.ts

@@ -95,3 +95,16 @@ export function getDataMapList(params: any) {
     },
   );
 }
+
+export function getDataMapListByPostName(params: any) {
+  return request<object>(
+    {
+      url: "companyService/company/dataMapByPostName",
+      method: 'get',
+      params: params,
+    },
+    {
+      isNew: true,
+    },
+  );
+}

+ 10 - 0
vue/src/api/companyService/post.ts

@@ -63,6 +63,16 @@ export function del(ids: any) {
   );
 }
 
+export function getCompanyMapPostList(params: any) {
+  return request<object>({
+    url: 'companyService/post/companyMapGet',
+    method: 'get',
+    params: params
+  }, {
+    isNew: true
+  })
+}
+
 export function updatePostStatus(query: { postID: String, status: number }) {
   return request(
     {

+ 3 - 1
vue/src/plugins/antd.ts

@@ -23,6 +23,7 @@ import {
   Timeline,
   Tag,
   AutoComplete,
+  Empty
 } from 'ant-design-vue';
 import type { App } from 'vue';
 //导入组件库
@@ -74,5 +75,6 @@ export function setupAntd(app: App<Element>) {
     .use(Tree).use(Progress).use(List).use(Avatar).use(Badge).use(Spin).use(Pagination)
     .use(Timeline)
     .use(Tag)
-    .use(AutoComplete);
+    .use(AutoComplete)
+    .use(Empty);
 }

+ 396 - 95
vue/src/views/companyService/dataMap/index.vue

@@ -71,16 +71,17 @@
         </div>
         <!-- 企业数据列表 -->
         <div class="list-box">
-          <div class="company-data-box" v-for="(company,index) in companyList" :key="index"
+          <div class="company-data-box" :class="{'check-company':nowCheckCompany.companyID == company.companyID}"
+               v-if="companyList.length > 0" v-for="(company,index) in companyList" :key="index"
                @click="checkCompanyChange(company)">
             <p class="company-name">
               {{ company.companyName }}
             </p>
-            <p class="company-address">
+            <p class="label-text">
               地点:{{ company.companyAddress }}
             </p>
             <!-- 岗位 -->
-            <div class="company-post-box">
+            <div class="company-post-box label-text">
               <span>招聘岗位:</span>
               <a-tag v-if="company.postList && company.postList.length > 0" v-for="(label, index) in company.postList"
                      :key="index">
@@ -92,12 +93,21 @@
               <span v-else>暂无</span>
             </div>
             <!-- 标签 -->
-            <div class="company-label-box" v-if="company.labelList && company.labelList.length > 0">
-              <a-tag v-for="(label, index) in company.labelList" :key="index">
+            <div class="company-label-box" v-if="company.labelList && company.labelList.length > 0"
+                 :ref="el => companyLabelBoxRef[index] = el" :class="{'label-box-max-height': company.labelExpanded}">
+              <a-tag v-for="(label, labelIndex) in company.labelList" :key="labelIndex">
                 {{ label.labelName }}
               </a-tag>
+              <div v-if="showLaunchBtnBox(index)">
+                <span class="launch-btn" v-if="company.labelExpanded"
+                      @click.stop="companyLabelOpen(company)">展开</span>
+                <span class="launch-btn" v-else @click.stop="companyLabelOpen(company)">收起</span>
+              </div>
             </div>
           </div>
+          <div v-else class="empty-box">
+            <a-empty/>
+          </div>
         </div>
         <!-- 分页区域 -->
         <div class="pagination-box">
@@ -107,8 +117,86 @@
         </div>
       </div>
       <!-- 岗位信息 -->
-      <div class="post-box">
-
+      <div class="post-box" v-if="nowCheckCompany.companyID">
+        <p class="title label-text">企业详情</p>
+        <!-- 企业信息 -->
+        <div class="post-company-box">
+          <p class="company-name">
+            {{ nowCheckCompany.companyName }}
+          </p>
+          <p class="label-text">
+            工作地点:{{ nowCheckCompany.companyAddress }}
+          </p>
+          <p class="label-text">
+            企业规模:{{ nowCheckCompany.companyModelType }}
+          </p>
+          <p class="label-text">
+            企业状态:{{ nowCheckCompany.recordStatusName }}
+          </p>
+          <!-- 标签 -->
+          <div class="company-label-box" v-if="nowCheckCompany.labelList && nowCheckCompany.labelList.length > 0"
+               :ref="postBoxCompanyLabelBoxRef" :class="{'label-box-max-height': postBoxCompanyLabelExpanded}">
+            <a-tag v-for="(label, index) in nowCheckCompany.labelList" :key="index">
+              {{ label.labelName }}
+            </a-tag>
+            <div v-if="postBoxCompanyShowLaunchBtn">
+              <span class="launch-btn" v-if="postBoxCompanyLabelExpanded"
+                    @click.stop="postBoxCompanyLabelOpen">展开</span>
+              <span class="launch-btn" v-else @click.stop="postBoxCompanyLabelOpen">收起</span>
+            </div>
+          </div>
+        </div>
+        <!-- 岗位列表 -->
+        <div class="list-box">
+          <div class="list-post-box" v-if="postList.length > 0" v-for="(post, postIndex) in postList" :key="postIndex">
+            <div class="post-title">
+              <span>{{ post.professionName }}</span>
+              <span>{{ showSalary(post.minSalary, post.maxSalary) }}</span>
+            </div>
+            <p class="label-text">
+              招聘人数:{{ post.recruitCount }}
+            </p>
+            <p class="label-text">
+              招聘日期:
+              {{ dayjs(post.startTime).format("YYYY-MM-DD") }}
+              至
+              {{ dayjs(post.endTime).format("YYYY-MM-DD") }}
+            </p>
+            <!-- 岗位要求 -->
+            <div class="post-desc-box">
+              <div class="label-text post-desc" :ref="el => postDescBoxRef[postIndex] = el"
+                   :class="{'post-desc-max-height': post.descExpanded}">
+                岗位要求:{{ post.postDesc }}
+              </div>
+              <div v-if="postDescLaunchBtnBox(postIndex)">
+                <span class="launch-btn" v-if="post.descExpanded"
+                      @click.stop="postDescOpen(post)">展开</span>
+                <span class="launch-btn " v-else @click.stop="postDescOpen(post)">收起</span>
+              </div>
+            </div>
+            <!-- 标签 -->
+            <div class="company-label-box" v-if="post.labelList && post.labelList.length > 0"
+                 :ref="el => postLabelBoxRef[postIndex] = el" :class="{'label-box-max-height': post.labelExpanded}">
+              <a-tag v-for="(label, labelIndex) in post.labelList" :key="labelIndex">
+                {{ label.labelName }}
+              </a-tag>
+              <div v-if="postListShowLaunchBtnBox(postIndex)">
+                <span class="launch-btn" v-if="post.labelExpanded"
+                      @click.stop="postLabelOpen(post)">展开</span>
+                <span class="launch-btn" v-else @click.stop="postLabelOpen(post)">收起</span>
+              </div>
+            </div>
+          </div>
+          <div v-else class="empty-box">
+            <a-empty/>
+          </div>
+        </div>
+        <!-- 分页控件 -->
+        <div class="pagination-box">
+          <a-pagination v-model:current="postSearchParams.pageIndex" :total="postTotal"
+                        v-model:pageSize="postSearchParams.pageSize"
+                        show-less-items @change="postPaginationChange" simple :show-size-changer="false"/>
+        </div>
       </div>
     </div>
   </div>
@@ -123,7 +211,9 @@ import type {SelectProps} from "ant-design-vue";
 import {getSysDictionaryList} from "@/api/system/dictionary";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
 import {getRegionCodeList} from "@/api/system/area/index";
-import {getDataMapList} from "@/api/companyService/company";
+import {getDataMapList, getDataMapListByPostName} from "@/api/companyService/company";
+import {getCompanyMapPostList} from "@/api/companyService/post";
+import dayjs from "dayjs";
 
 const T = (window as any).T;
 const zoom = 9;
@@ -143,13 +233,31 @@ const companySearchParam = reactive({
   companyModel: undefined,
   siteID: undefined,
   regionCode: undefined,
-  longitude: 114.4,
-  latitude: 23.08
+  longitude: 114.416110,
+  latitude: 23.111582
 })
 // 企业数据
 const companyList = ref<Array<any>>([])
 // 企业分页条数
 const companyTotal = ref(0);
+// 当前选中的企业
+const nowCheckCompany = ref({
+  companyID: "",
+  companyName: "",
+  companyAddress: "",
+  companyModelType: "",
+  recordStatusName: "",
+  labelList: new Array<any>()
+})
+// 岗位查询条件
+const postSearchParams = reactive({
+  pageIndex: 1,
+  pageSize: 5,
+})
+// 当前选中的企业岗位列表
+const postList = ref<Array<any>>([]);
+// 岗位分页总条数
+const postTotal = ref(0);
 
 // 范围列表
 const rangeList = [
@@ -165,8 +273,16 @@ const siteList = ref<any>([]);
 const regionList = ref<SelectProps['options']>();
 // 查询按钮加载
 const searchLoading = ref(false);
-// 当前选中的企业
-const nowCheckCompany = ref()
+// 企业信息标签box ref
+const companyLabelBoxRef = ref([])
+// 岗位面板企业信息的标签盒子ref
+const postBoxCompanyLabelBoxRef = ref();
+// 岗位面板企业信息的标签展开与收起开关
+const postBoxCompanyLabelExpanded = ref(true)
+// 岗位信息的标签box ref
+const postLabelBoxRef = ref([]);
+// 岗位要求
+const postDescBoxRef = ref([])
 
 // 查询企业规模
 const getCompanyModelList = async function () {
@@ -186,18 +302,37 @@ const getRegionList = async function () {
 // 查询事件
 function onSearch() {
   searchLoading.value = true;
-  getDataMapList(companySearchParam).then((result: any) => {
-    companyList.value = result.list;
-    // 处理标签和岗位JSON数据
-    companyList.value.forEach((item: any) => {
-      item.labelList = JSON.parse(item.labelList)
-      item.postList = JSON.parse(item.postList)
-    });
-    companyTotal.value = result.total;
-    setCompanyMarker();
-  }).finally(() => {
-    searchLoading.value = false;
-  })
+  // 按企业名称查询
+  if (searchType.value == 'company') {
+    getDataMapList(companySearchParam).then((result: any) => {
+      findFuncThen(result);
+    }).finally(() => {
+      searchLoading.value = false;
+    })
+  }
+  // 按岗位名称反向查询
+  if (searchType.value == "post") {
+    getDataMapListByPostName(companySearchParam).then((result: any) => {
+      findFuncThen(result);
+    }).finally(() => {
+      searchLoading.value = false;
+    })
+  }
+}
+
+// 查询处理
+function findFuncThen(result: any) {
+  companyList.value = result.list;
+  // 处理标签和岗位JSON数据
+  companyList.value.forEach((item: any) => {
+    item.labelList = JSON.parse(item.labelList || '[]')
+    item.postList = JSON.parse(item.postList || '[]')
+    item.labelExpanded = true;
+  });
+  companyTotal.value = result.total;
+  // 重置选中
+  nowCheckCompany.value.companyID = "";
+  setCompanyMarker();
 }
 
 // 地图初始化
@@ -206,8 +341,8 @@ const initMap = () => {
   map = new T.Map('mapDiv');
 
   if (map != null) {
-    // 设置地图显示中心点为惠州市
-    (map as any).centerAndZoom(new T.LngLat(114.4, 23.08), zoom);
+    // 设置地图显示中心点为惠州市人民政府
+    (map as any).centerAndZoom(new T.LngLat(114.416110, 23.111582), zoom);
   }
 
   // 设置城市边界
@@ -245,35 +380,39 @@ function setBoundary() {
 
 // 获取当前登录用户定位
 function setLoginLocation() {
+  let labelText = "当前定位"
   getPosition().then((data: any) => {
     if (data.longitude && data.latitude) {
-      // companySearchParam.longitude = data.longitude;
-      // companySearchParam.latitude = data.latitude;
-
+      companySearchParam.longitude = data.longitude;
+      companySearchParam.latitude = data.latitude;
+    } else {
+      // 如果没有获取到经纬度,设置默认为惠州市人民政府的位置
       companySearchParam.longitude = 114.420244;
       companySearchParam.latitude = 23.116236;
-
-      // 设置中心点
-      (map as any).centerAndZoom(new T.LngLat(companySearchParam.longitude, companySearchParam.latitude), 12);
-      const icon = new T.Icon({
-        iconUrl: thIcon,
-        iconSize: new T.Point(30, 30),
-        iconAnchor: new T.Point(10, 56)
-      })
-      const label = new T.Label({
-        text: "当前位置", //文本标注的内容
-        position: new T.LngLat(companySearchParam.longitude, companySearchParam.latitude), //文本标注的地理位置
-        offset: new T.Point(-45, 20) //文本标注的位置偏移值
-      })
-      const point = new T.LngLat(companySearchParam.longitude, companySearchParam.latitude, {
-        icon: icon
-      })
-      // 创建标注
-      const marker = new T.Marker(point);
-      //向地图上标记
-      (map as any).addOverLay(label);
-      (map as any).addOverLay(marker);
+      labelText = "默认位置"
     }
+  }).finally(() => {
+    // 设置中心点
+    (map as any).centerAndZoom(new T.LngLat(companySearchParam.longitude, companySearchParam.latitude), 12);
+    const icon = new T.Icon({
+      iconUrl: thIcon,
+      iconSize: new T.Point(30, 30),
+      iconAnchor: new T.Point(10, 56)
+    })
+    const label = new T.Label({
+      text: labelText, //文本标注的内容
+      position: new T.LngLat(companySearchParam.longitude, companySearchParam.latitude), //文本标注的地理位置
+      offset: new T.Point(-45, 20) //文本标注的位置偏移值
+    })
+    const point = new T.LngLat(companySearchParam.longitude, companySearchParam.latitude, {
+      icon: icon
+    })
+    // 创建标注
+    const marker = new T.Marker(point);
+    //向地图上标记
+    (map as any).addOverLay(label);
+    (map as any).addOverLay(marker);
+    onSearch();
   })
 }
 
@@ -328,8 +467,93 @@ function companyPaginationChange() {
 }
 
 // 企业信息点击事件
-function checkCompanyChange(company: any) {
-  nowCheckCompany.value = company;
+async function checkCompanyChange(company: any) {
+  nowCheckCompany.value = JSON.parse(JSON.stringify(company));
+  await findPostList();
+}
+
+// 查询岗位
+async function findPostList() {
+  await getCompanyMapPostList({...postSearchParams, companyID: nowCheckCompany.value.companyID}).then((result: any) => {
+    postList.value = result.list;
+    // 处理标签JSON数据
+    postList.value.forEach((item: any) => {
+      item.labelList = JSON.parse(item.labelList || '[]');
+      item.labelExpanded = true;
+      item.descExpanded = true;
+    })
+    postTotal.value = result.total;
+  })
+}
+
+// 企业分页器页码变更事件
+function postPaginationChange() {
+  findPostList();
+}
+
+// 岗位薪酬优化显示
+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 "";
+    }
+  }
+}
+
+// 是否显示展开按钮
+function showLaunchBtnBox(index) {
+  if (companyLabelBoxRef.value[index] && companyLabelBoxRef.value[index].scrollHeight) {
+    return companyLabelBoxRef.value[index]?.scrollHeight > 50
+  }
+  return false;
+}
+
+function postBoxCompanyShowLaunchBtn() {
+  if (postBoxCompanyLabelBoxRef.value && postBoxCompanyLabelBoxRef.value.scrollHeight) {
+    return postBoxCompanyLabelBoxRef.value[index]?.scrollHeight > 50
+  }
+  return false;
+}
+
+function postListShowLaunchBtnBox(index) {
+  if (postLabelBoxRef.value[index] && postLabelBoxRef.value[index].scrollHeight) {
+    return postLabelBoxRef.value[index]?.scrollHeight > 50
+  }
+  return false;
+}
+
+function postDescLaunchBtnBox(index) {
+  if (postDescBoxRef.value[index] && postDescBoxRef.value[index].scrollHeight) {
+    return postDescBoxRef.value[index]?.scrollHeight > 35
+  }
+  return false;
+}
+
+// 企业标签展开
+function companyLabelOpen(company) {
+  company.labelExpanded = !company.labelExpanded;
+}
+
+function postBoxCompanyLabelOpen() {
+  postBoxCompanyLabelExpanded.value = !postBoxCompanyLabelExpanded.value;
+}
+
+// 岗位标签展开
+function postLabelOpen(post) {
+  post.labelExpanded = !post.labelExpanded;
+}
+
+// 岗位要求展开
+function postDescOpen(post) {
+  post.descExpanded = !post.descExpanded;
 }
 
 onMounted(() => {
@@ -337,7 +561,7 @@ onMounted(() => {
   getCompanyModelList();
   getAllSites();
   getRegionList();
-  onSearch();
+  // onSearch();
 })
 </script>
 
@@ -373,41 +597,87 @@ export default {
     background-color: white;
   }
 
+  .company-name, .post-title {
+    font-size: 14px;
+    font-weight: 700;
+  }
+
+  .label-text {
+    font-size: 12px;
+    color: #737373;
+    margin-bottom: 3px;
+  }
+
+  .company-label-box {
+    display: flex;
+    align-items: center;
+    flex-wrap: wrap;
+    margin-top: 5px;
+    overflow: hidden;
+    position: relative;
+
+    .ant-tag {
+      margin-bottom: 3px;
+    }
+  }
+
+  .label-box-max-height {
+    max-height: 25px;
+  }
+
+  .ant-tag {
+    text-align: center;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+
+  .search-box,
+  .list-box,
+  .pagination-box {
+    width: 100%;
+  }
+
+  .list-box {
+    margin-bottom: 10px;
+    overflow-y: auto;
+  }
+
+  .pagination-box {
+    display: flex;
+    justify-content: center;
+  }
+
+  .launch-btn {
+    font-size: 12px;
+    color: #40a9ff;
+    position: absolute;
+    bottom: 4px;
+    right: 0;
+    cursor: pointer;
+  }
+
+  .empty-box {
+    width: 100%;
+    height: 450px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    border-right: 1px solid rgba(173, 173, 173, 0.8);
+  }
+
   .company-box {
     left: 0;
     right: 300px;
     border-right: 1px solid rgba(173, 173, 173, 0.8);
 
-    .search-box,
-    .list-box,
-    .pagination-box {
-      width: 100%;
-    }
-
     .list-box {
       max-height: calc(100% - 150px);
-      margin-bottom: 10px;
-      overflow-y: auto;
 
       .company-data-box {
         padding: 8px;
         border-bottom: 1px solid rgba(173, 173, 173, 0.8);
-
-        p {
-          margin-bottom: 3px;
-        }
-
-        .company-name {
-          font-size: 14px;
-          font-weight: 700;
-        }
-
-        .company-address,
-        .company-post-box,
-        .company-label-box {
-          font-size: 12px;
-          color: #737373;
-        }
+        cursor: pointer;
 
         .company-post-box {
           display: flex;
@@ -416,32 +686,17 @@ export default {
 
           .ant-tag {
             width: 55px;
-            text-align: center;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            white-space: nowrap;
           }
 
           .all-post-btn {
             cursor: pointer;
           }
         }
-
-        .company-label-box {
-          display: flex;
-          flex-wrap: wrap;
-          margin-top: 5px;
-
-          .ant-tag {
-            margin-bottom: 3px;
-          }
-        }
       }
-    }
 
-    .pagination-box {
-      display: flex;
-      justify-content: center;
+      .check-company {
+        background-color: #dadada;
+      }
     }
   }
 
@@ -449,6 +704,52 @@ export default {
     left: calc(100% - 300px);
     right: 0;
     border-left: 1px solid rgba(173, 173, 173, 0.8);
+
+    .title {
+      text-align: center;
+      margin-top: 8px;
+    }
+
+    .post-company-box {
+      padding: 8px;
+      width: 100%;
+      max-height: 180px;
+      overflow-y: auto;
+      border-bottom: 1px solid rgba(173, 173, 173, 0.8);
+    }
+
+    .list-box {
+      max-height: calc(100% - 270px);
+
+      .list-post-box {
+        padding: 8px;
+        border-bottom: 1px solid rgba(173, 173, 173, 0.8);
+
+        .post-title {
+          display: flex;
+          justify-content: space-between;
+          flex-wrap: wrap;
+        }
+
+        .post-desc-box {
+          position: relative;
+
+          .launch-btn {
+            bottom: -1px;
+            background-color: white;
+          }
+
+          .post-desc {
+            overflow: hidden;
+            width: 91%;
+          }
+
+          .post-desc-max-height {
+            max-height: 35px;
+          }
+        }
+      }
+    }
   }
 }
 </style>