Browse Source

fix: 企业基本信息第二版

zhangying 4 days ago
parent
commit
10f047d657

+ 177 - 0
.docs/260604-企业基本信息模块开发记录.md

@@ -0,0 +1,177 @@
+# 企业基本信息模块开发记录
+
+**日期:** 2026-06-04
+
+## 模块概述
+
+企业基本信息模块(enterprise)是招聘管理系统中的核心基础模块,负责管理招聘企业的基本信息。该模块采用 JeecgBoot 的前后端分离架构,前端基于 Vue3 + Ant Design Vue,后端基于 Spring Boot + MyBatis-Plus。
+
+### 业务关系
+
+- **EnterpriseInfo(企业基本信息)**:唯一的主表,记录企业的登记注册信息、经营信息、联系方式、宣传资料等。对外提供企业下拉列表接口供岗位信息等模块关联使用。
+
+---
+
+## 模块文件结构
+
+### 前端(jeecgboot-vue3/src/views/recruitment/enterprise/)
+
+| 文件                                  | 用途                             |
+|-------------------------------------|--------------------------------|
+| `EnterpriseInfoList.vue`            | 企业信息列表页面,提供查询、新增、编辑、详情、删除、批量删除、导入导出等功能 |
+| `EnterpriseInfo.api.ts`             | 企业信息 API 封装                    |
+| `EnterpriseInfo.data.ts`            | 列表页表格列配置(9列)与高级查询字段定义(26个查询字段) |
+| `components/EnterpriseInfoForm.vue` | 企业信息新增/编辑/详情表单组件,含图片上传与视频上传     |
+| `components/EnterpriseInfoModal.vue` | 企业信息弹窗组件,包裹 EnterpriseInfoForm,全屏模式  |
+
+### 后端(jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/.../org/jeecg/modules/zjrs/enterprise/)
+
+| 层次           | 文件                                          |
+|--------------|---------------------------------------------|
+| Controller   | `EnterpriseInfoController.java`             |
+| Entity       | `EnterpriseInfo.java`                       |
+| Service      | `IEnterpriseInfoService.java`               |
+| Service Impl | `EnterpriseInfoServiceImpl.java`            |
+| Mapper       | `EnterpriseInfoMapper.java`                 |
+| Mapper XML   | `EnterpriseInfoMapper.xml`                  |
+
+---
+
+## 开发记录
+
+### 功能清单
+
+| 功能            | 说明                                                             |
+|---------------|----------------------------------------------------------------|
+| 分页列表查询        | 支持按单位名称、统一社会信用代码、联系人、所属行业等条件查询,9 列展示                        |
+| 新增            | 全屏表单,支持 35 个企业字段录入,含 logo 图片上传、宣传图片上传(最多5张)、宣传视频上传             |
+| 编辑            | 复用新增表单,预填充已有数据                                                |
+| 详情            | 表单禁用模式查看企业全部信息                                                |
+| 删除 / 批量删除     | 支持单条删除和批量删除,删除前弹窗确认                                           |
+| 导入 / 导出 Excel | 基于 Jeecg 标准 Excel 导入导出功能                                       |
+| 高级查询          | 26 个查询字段,支持灵活的筛选条件                                            |
+| 企业下拉列表        | 单独接口 `/listForSelect`,返回 id 和 companyName,供岗位信息等模块关联选择企业        |
+| 字段必填校验        | 前端(Ant Design Vue Form 校验)+ 后端(Service 层 `validateRequiredFields`)双重校验 |
+
+### 必填字段(前后端一致)
+
+共 16 个必填字段:单位名称、统一社会信用代码、注册地址行政区划、单位类型、经济类型、所属行业、数据来源、人员规模、联系人、联系方式、接收平台短信推送、面向求职者会员开放、是否允许人社部门代报名、单位简介、办公地址行政区划、办公地址。
+
+---
+
+### 功能开发
+
+| 日期         | 内容           | 涉及文件          | 说明                     |
+|------------|--------------|---------------|------------------------|
+| 2026-06-04 | 企业基本信息模块初始构建 | 前端 5 个文件 + 后端 6 个文件 | 完成企业信息管理的基础 CRUD 功能,含 Excel 导入导出与企业下拉列表接口 |
+
+### EnterpriseInfo 实体字段一览
+
+| 分类     | 字段                   | 说明            |
+|--------|----------------------|---------------|
+| 登记信息   | companyName          | 单位名称          |
+|        | unifiedCreditCode    | 统一社会信用代码      |
+|        | orgCode              | 组织机构代码        |
+|        | establishDate        | 成立日期          |
+|        | registeredCapital    | 注册资本          |
+|        | regAddrDistrict      | 注册地址行政区划      |
+| 经营信息   | businessStatus       | 经营状态          |
+|        | companyType          | 单位类型          |
+|        | economyType          | 经济类型          |
+|        | industry             | 所属行业          |
+|        | isListedCompany      | 是否上市公司        |
+|        | industryField        | 行业领域          |
+|        | industryAdminDept    | 行业主管部门        |
+|        | industryTag          | 产业标签          |
+|        | companyPropertyTag   | 单位属性标签        |
+|        | provinceOrCity       | 省属或所属地市       |
+|        | companyAttribute     | 单位属性          |
+|        | isHeadEnterprise     | 是否为头部企业       |
+|        | isKeyEnterprise      | 是否为重点企业       |
+|        | isKeyInstitution     | 是否为重点事业单位      |
+|        | isStrategicIndustry  | 是否属于20个战略性产业集群 |
+| 联系方式   | contactPerson        | 联系人           |
+|        | contactPhone         | 联系方式          |
+|        | email                | 电子邮箱          |
+|        | postalCode           | 邮政编码          |
+|        | website              | 单位网站          |
+|        | faxNumber            | 传真号码          |
+|        | officeAddrDistrict   | 办公地址行政区划      |
+|        | officeAddress        | 办公地址          |
+| 配置项    | dataSource           | 数据来源          |
+|        | companyTag           | 单位标签          |
+|        | staffSize            | 人员规模          |
+|        | acceptSmsPush        | 接收平台短信推送      |
+|        | openToJobSeeker      | 面向求职者会员开放     |
+|        | allowAgentSignup     | 是否允许人社部门代报名   |
+|        | companyBenefits      | 单位福利          |
+|        | companyIntro         | 单位简介          |
+| 宣传资料   | logoImg              | logo图片        |
+|        | promotionalVideo     | 宣传视频          |
+|        | promotionalImage     | 宣传图片          |
+| 系统字段   | id / createBy / createTime / updateBy / updateTime / sysOrgCode | 系统内置字段        |
+
+---
+
+### 2026-06-04:企业列表字段调整 & 关联岗位数统计
+
+**需求描述:** 调整企业信息列表页的表格显示字段,并从岗位信息表(post_info)关联统计当前岗位数。
+
+**表格列调整(13列):**
+
+| 新列            | 对应字段              | 说明                     |
+|---------------|-------------------|------------------------|
+| 序号            | index              | 自定义列,customRender 显示行索引   |
+| 统一信用代码        | unifiedCreditCode | —                      |
+| 单位名称          | companyName       | —                      |
+| 单位类型          | companyType       | —                      |
+| 所属行业          | industry          | —                      |
+| 注册地址          | regAddrDistrict   | 对应注册地址行政区划字段           |
+| 经营地址          | officeAddress     | 对应办公地址字段               |
+| 企业规模          | staffSize         | 原"人员规模"改名为"企业规模"       |
+| 是否重点企业        | isKeyEnterprise   | 新增显示字段                 |
+| 单位标签          | companyTag        | 新增显示字段                 |
+| 经营状态          | businessStatus    | —                      |
+| 当前岗位数         | postCount         | 自 post_info 表关联统计       |
+| 数据来源          | dataSource        | 新增显示字段                 |
+
+**删除的列:** 注册资本、联系人、联系方式
+
+**涉及文件:**
+
+| 文件                                               | 操作 | 原因                                    |
+|--------------------------------------------------|----|---------------------------------------|
+| `jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/.../enterprise/entity/EnterpriseInfo.java` | 修改 | 移除 postCount 字段(已移到 VO) |
+| `jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/.../enterprise/vo/EnterpriseInfoVO.java` | 新增 | 企业信息 VO,继承 EnterpriseInfo,包含 postCount 扩展字段 |
+| `jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/.../enterprise/mapper/EnterpriseInfoMapper.java` | 修改 | 添加 `queryPageWithPostCount` 和 `queryListWithPostCount` 自定义查询方法,返回 EnterpriseInfoVO |
+| `jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/.../enterprise/mapper/xml/EnterpriseInfoMapper.xml` | 修改 | 添加 LEFT JOIN 子查询 SQL,通过 `enterprise_id` 关联 `post_info` 表统计岗位数 |
+| `jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/.../enterprise/service/IEnterpriseInfoService.java` | 修改 | 添加 `queryPageWithPostCount` 和 `queryListWithPostCount` 服务接口方法 |
+| `jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/.../enterprise/service/impl/EnterpriseInfoServiceImpl.java` | 修改 | 实现自定义查询方法,委托给 Mapper 执行 |
+| `jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/.../enterprise/controller/EnterpriseInfoController.java` | 修改 | 分页列表接口改用 `queryPageWithPostCount`;导出方法重写以包含岗位数,处理 selections 选中导出和全量导出两种场景 |
+| `jeecgboot-vue3/src/views/recruitment/enterprise/EnterpriseInfo.data.ts` | 修改 | 更新 columns 定义,调整为 12 列新字段配置 |
+
+---
+
+### 2026-06-04:数据字典字段适配(列表显示 + 表单下拉 + 导出翻译)
+
+**需求描述:** 将企业信息模块中匹配数据字典的字段从普通文本输入改为下拉选择,列表页显示中文标签,导出时自动翻译字典值为中文。
+
+**涉及字典及字段映射:**
+
+| 字段名              | 字典编码            | 说明     |
+|------------------|-----------------|--------|
+| `businessStatus` | BusinessStatus  | 经营状态   |
+| `companyType`    | CompanyType     | 单位类型   |
+| `dataSource`     | DataSource      | 数据来源   |
+| `staffSize`      | CompanySize     | 人员规模   |
+| `industryField`  | IndustryField   | 行业领域   |
+
+**涉及文件:**
+
+| 文件                                               | 操作 | 原因                                    |
+|--------------------------------------------------|----|---------------------------------------|
+| `jeecgboot-vue3/src/views/recruitment/enterprise/EnterpriseInfoList.vue` | 修改 | 导入 `useDict`,预加载 BusinessStatus/CompanyType/CompanySize/DataSource 字典;`bodyCell` 插槽添加 4 个字典字段的 `getDictText()` 翻译渲染 |
+| `jeecgboot-vue3/src/views/recruitment/enterprise/components/EnterpriseInfoForm.vue` | 修改 | 导入 `useDict`,预加载 5 个字典;5 个字典字段从 `<a-input>` 改为 `<a-select>` 下拉选择;校验提示从"请输入"改为"请选择" |
+| `jeecg-boot/.../enterprise/controller/EnterpriseInfoController.java` | 修改 | 添加 `EXPORT_DICT_FIELD_MAP` 静态常量映射 4 个字段到字典编码;导出流程增加 `translateDictFields` 调用 |
+| `jeecg-boot/.../enterprise/service/IEnterpriseInfoService.java` | 修改 | 添加 `translateDictFields` 方法声明 |
+| `jeecg-boot/.../enterprise/service/impl/EnterpriseInfoServiceImpl.java` | 修改 | 注入 `IDictionaryItemService`;实现 `translateDictFields` 方法,采用后端内存映射方案批量查询字典并替换字段值 |

+ 44 - 0
.docs/sql/数据字典数据插入.sql

@@ -339,3 +339,47 @@ INSERT INTO "DICTIONARY_ITEM"
 VALUES ('1174509082208395381', '', 'TitleLevel', 4, '助理级', 4, 1, 1);
 INSERT INTO "DICTIONARY_ITEM"
 VALUES ('1174509082208395382', '', 'TitleLevel', 5, '员级', 5, 1, 1);
+
+-- ----------------------------
+-- 18. 经营状态 (BusinessStatus)
+-- ----------------------------
+INSERT INTO "DICTIONARY"
+VALUES ('BusinessStatus', '经营状态', 18, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395383', '', 'BusinessStatus', 1, '登记在册', 1, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395384', '', 'BusinessStatus', 2, '破产', 2, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395385', '', 'BusinessStatus', 3, '注销', 3, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395386', '', 'BusinessStatus', 4, '被兼并', 4, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395387', '', 'BusinessStatus', 5, '其他', 5, 1, 1);
+
+-- ----------------------------
+-- 19. 行业领域 (IndustryField)
+-- ----------------------------
+INSERT INTO "DICTIONARY"
+VALUES ('IndustryField', '行业领域', 19, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395388', '', 'IndustryField', 1, '人工智能与机器人', 1, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395389', '', 'IndustryField', 2, '半导体与集成电路', 2, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395390', '', 'IndustryField', 3, '新材料', 3, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395391', '', 'IndustryField', 4, '新能源', 4, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395392', '', 'IndustryField', 5, '低空经济', 5, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395393', '', 'IndustryField', 6, '生物制造', 6, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395394', '', 'IndustryField', 7, '商业航空航天', 7, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395395', '', 'IndustryField', 8, '实验室', 8, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395396', '', 'IndustryField', 9, '科研机构', 9, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395397', '', 'IndustryField', 10, '金融机构', 10, 1, 1);
+INSERT INTO "DICTIONARY_ITEM"
+VALUES ('1174509082208395398', '', 'IndustryField', 11, '其他', 11, 1, 1);

+ 43 - 3
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/enterprise/controller/EnterpriseInfoController.java

@@ -8,18 +8,26 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.zjrs.enterprise.entity.EnterpriseInfo;
 import org.jeecg.modules.zjrs.enterprise.service.IEnterpriseInfoService;
+import org.jeecg.modules.zjrs.enterprise.vo.EnterpriseInfoVO;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
 import java.util.Arrays;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -37,6 +45,19 @@ public class EnterpriseInfoController extends JeecgController<EnterpriseInfo, IE
     @Autowired
     private IEnterpriseInfoService enterpriseInfoService;
 
+    /**
+     * 导出字段与字典编码的映射关系:entity字段名 → 字典编码
+     * 用于导出时自动将字典值翻译为中文标签
+     */
+    private static final Map<String, String> EXPORT_DICT_FIELD_MAP = new LinkedHashMap<>();
+
+    static {
+        EXPORT_DICT_FIELD_MAP.put("businessStatus", "BusinessStatus");
+        EXPORT_DICT_FIELD_MAP.put("companyType", "CompanyType");
+        EXPORT_DICT_FIELD_MAP.put("dataSource", "DataSource");
+        EXPORT_DICT_FIELD_MAP.put("staffSize", "CompanySize");
+    }
+
     /**
      * 分页列表查询
      *
@@ -48,13 +69,13 @@ public class EnterpriseInfoController extends JeecgController<EnterpriseInfo, IE
      */
     @Operation(summary = "企业信息-企业基本信息-分页列表查询")
     @GetMapping(value = "/list")
-    public Result<IPage<EnterpriseInfo>> queryPageList(EnterpriseInfo enterpriseInfo,
+    public Result<IPage<EnterpriseInfoVO>> queryPageList(EnterpriseInfo enterpriseInfo,
                                                        @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                        @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                        HttpServletRequest req) {
         QueryWrapper<EnterpriseInfo> queryWrapper = QueryGenerator.initQueryWrapper(enterpriseInfo, req.getParameterMap());
         Page<EnterpriseInfo> page = new Page<EnterpriseInfo>(pageNo, pageSize);
-        IPage<EnterpriseInfo> pageList = enterpriseInfoService.page(page, queryWrapper);
+        IPage<EnterpriseInfoVO> pageList = enterpriseInfoService.queryPageWithPostCount(page, queryWrapper);
         return Result.OK(pageList);
     }
 
@@ -145,7 +166,26 @@ public class EnterpriseInfoController extends JeecgController<EnterpriseInfo, IE
     @RequiresPermissions("enterprise:enterprise_info:exportXls")
     @RequestMapping(value = "/exportXls")
     public ModelAndView exportXls(HttpServletRequest request, EnterpriseInfo enterpriseInfo) {
-        return super.exportXls(request, enterpriseInfo, EnterpriseInfo.class, "企业基本信息表");
+        String selections = request.getParameter("selections");
+        List<EnterpriseInfoVO> list;
+        if (oConvertUtils.isNotEmpty(selections)) {
+            QueryWrapper<EnterpriseInfo> queryWrapper = new QueryWrapper<>();
+            queryWrapper.in("id", Arrays.asList(selections.split(",")));
+            list = enterpriseInfoService.queryListWithPostCount(queryWrapper);
+        } else {
+            QueryWrapper<EnterpriseInfo> queryWrapper = QueryGenerator.initQueryWrapper(enterpriseInfo, request.getParameterMap());
+            list = enterpriseInfoService.queryListWithPostCount(queryWrapper);
+        }
+        // 字典字段值→标签内存映射翻译
+        list = enterpriseInfoService.translateDictFields(list, EXPORT_DICT_FIELD_MAP);
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String username = sysUser != null ? sysUser.getRealname() : "未知用户";
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        mv.addObject(NormalExcelConstants.FILE_NAME, "企业基本信息表");
+        mv.addObject(NormalExcelConstants.CLASS, EnterpriseInfoVO.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("企业基本信息表", "导出人:" + username, "企业信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, list);
+        return mv;
     }
 
     /**

+ 14 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/enterprise/mapper/EnterpriseInfoMapper.java

@@ -1,7 +1,12 @@
 package org.jeecg.modules.zjrs.enterprise.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.zjrs.enterprise.entity.EnterpriseInfo;
+import org.jeecg.modules.zjrs.enterprise.vo.EnterpriseInfoVO;
 
 /**
  * @Description: 企业基本信息表
@@ -11,4 +16,13 @@ import org.jeecg.modules.zjrs.enterprise.entity.EnterpriseInfo;
  */
 public interface EnterpriseInfoMapper extends BaseMapper<EnterpriseInfo> {
 
+    /**
+     * 分页查询企业信息(含当前岗位数)
+     */
+    Page<EnterpriseInfoVO> queryPageWithPostCount(Page<?> page, @Param(Constants.WRAPPER) QueryWrapper<EnterpriseInfo> queryWrapper);
+
+    /**
+     * 查询企业信息列表(含当前岗位数,用于导出)
+     */
+    java.util.List<EnterpriseInfoVO> queryListWithPostCount(@Param(Constants.WRAPPER) QueryWrapper<EnterpriseInfo> queryWrapper);
 }

+ 19 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/enterprise/mapper/xml/EnterpriseInfoMapper.xml

@@ -2,4 +2,23 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.zjrs.enterprise.mapper.EnterpriseInfoMapper">
 
+    <!-- 企业信息映射(含当前岗位数) -->
+    <sql id="EnterpriseWithPostCountSql">
+        SELECT e.*,
+               (SELECT COUNT(*) FROM post_info p WHERE p.enterprise_id = e.id) AS post_count
+        FROM enterprise_info e
+    </sql>
+
+    <!-- 分页查询企业信息(含当前岗位数) -->
+    <select id="queryPageWithPostCount" resultType="org.jeecg.modules.zjrs.enterprise.vo.EnterpriseInfoVO">
+        <include refid="EnterpriseWithPostCountSql"/>
+        ${ew.customSqlSegment}
+    </select>
+
+    <!-- 查询企业信息列表(含当前岗位数,用于导出) -->
+    <select id="queryListWithPostCount" resultType="org.jeecg.modules.zjrs.enterprise.vo.EnterpriseInfoVO">
+        <include refid="EnterpriseWithPostCountSql"/>
+        ${ew.customSqlSegment}
+    </select>
+
 </mapper>

+ 23 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/enterprise/service/IEnterpriseInfoService.java

@@ -1,7 +1,11 @@
 package org.jeecg.modules.zjrs.enterprise.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.zjrs.enterprise.entity.EnterpriseInfo;
+import org.jeecg.modules.zjrs.enterprise.vo.EnterpriseInfoVO;
 
 import java.util.List;
 import java.util.Map;
@@ -17,4 +21,23 @@ public interface IEnterpriseInfoService extends IService<EnterpriseInfo> {
     List<Map<String, String>> listForSelect();
 
     void validateRequiredFields(EnterpriseInfo enterpriseInfo);
+
+    /**
+     * 分页查询企业信息(含当前岗位数)
+     */
+    IPage<EnterpriseInfoVO> queryPageWithPostCount(Page<EnterpriseInfo> page, QueryWrapper<EnterpriseInfo> queryWrapper);
+
+    /**
+     * 查询企业信息列表(含当前岗位数,用于导出)
+     */
+    List<EnterpriseInfoVO> queryListWithPostCount(QueryWrapper<EnterpriseInfo> queryWrapper);
+
+    /**
+     * 导出时对字典字段进行值→标签的内存映射翻译
+     *
+     * @param list         待导出的数据列表
+     * @param fieldDictMap 字段名→字典编码 的映射关系
+     * @return 字典字段已替换为中文标签的数据列表
+     */
+    List<EnterpriseInfoVO> translateDictFields(List<EnterpriseInfoVO> list, Map<String, String> fieldDictMap);
 }

+ 66 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/enterprise/service/impl/EnterpriseInfoServiceImpl.java

@@ -1,13 +1,19 @@
 package org.jeecg.modules.zjrs.enterprise.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.jeecg.common.util.AssertUtils;
+import org.jeecg.modules.zjrs.dictionary.service.IDictionaryItemService;
 import org.jeecg.modules.zjrs.enterprise.entity.EnterpriseInfo;
 import org.jeecg.modules.zjrs.enterprise.mapper.EnterpriseInfoMapper;
 import org.jeecg.modules.zjrs.enterprise.service.IEnterpriseInfoService;
+import org.jeecg.modules.zjrs.enterprise.vo.EnterpriseInfoVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -22,6 +28,9 @@ import java.util.stream.Collectors;
 @Service
 public class EnterpriseInfoServiceImpl extends ServiceImpl<EnterpriseInfoMapper, EnterpriseInfo> implements IEnterpriseInfoService {
 
+    @Autowired
+    private IDictionaryItemService dictionaryItemService;
+
     @Override
     public List<Map<String, String>> listForSelect() {
         QueryWrapper<EnterpriseInfo> queryWrapper = new QueryWrapper<>();
@@ -54,4 +63,61 @@ public class EnterpriseInfoServiceImpl extends ServiceImpl<EnterpriseInfoMapper,
         AssertUtils.assertNotEmpty("办公地址行政区划不能为空", enterpriseInfo.getOfficeAddrDistrict());
         AssertUtils.assertNotEmpty("办公地址不能为空", enterpriseInfo.getOfficeAddress());
     }
+
+    @Override
+    public IPage<EnterpriseInfoVO> queryPageWithPostCount(Page<EnterpriseInfo> page, QueryWrapper<EnterpriseInfo> queryWrapper) {
+        return baseMapper.queryPageWithPostCount(page, queryWrapper);
+    }
+
+    @Override
+    public List<EnterpriseInfoVO> queryListWithPostCount(QueryWrapper<EnterpriseInfo> queryWrapper) {
+        return baseMapper.queryListWithPostCount(queryWrapper);
+    }
+
+    @Override
+    public List<EnterpriseInfoVO> translateDictFields(List<EnterpriseInfoVO> list, Map<String, String> fieldDictMap) {
+        // 批量查询导出涉及的所有字典数据
+        List<String> dictCodes = new ArrayList<>(fieldDictMap.values());
+        Map<String, List<Map<String, Object>>> dictData = dictionaryItemService.getDictItemsBatch(dictCodes);
+
+        // 构建 value→label 快速查找映射: Map<字典编码, Map<value, label>>
+        Map<String, Map<String, String>> valueLabelMap = new HashMap<>();
+        for (Map.Entry<String, List<Map<String, Object>>> entry : dictData.entrySet()) {
+            Map<String, String> valueToLabel = new HashMap<>();
+            for (Map<String, Object> item : entry.getValue()) {
+                valueToLabel.put(String.valueOf(item.get("value")), String.valueOf(item.get("label")));
+            }
+            valueLabelMap.put(entry.getKey(), valueToLabel);
+        }
+
+        // 遍历导出数据,将字典字段的值替换为对应的中文标签
+        for (EnterpriseInfoVO info : list) {
+            for (Map.Entry<String, String> fieldEntry : fieldDictMap.entrySet()) {
+                String fieldName = fieldEntry.getKey();
+                String dictCode = fieldEntry.getValue();
+                Map<String, String> mapping = valueLabelMap.get(dictCode);
+                if (mapping == null) continue;
+
+                switch (fieldName) {
+                    case "businessStatus":
+                        if (info.getBusinessStatus() != null)
+                            info.setBusinessStatus(mapping.getOrDefault(info.getBusinessStatus(), info.getBusinessStatus()));
+                        break;
+                    case "companyType":
+                        if (info.getCompanyType() != null)
+                            info.setCompanyType(mapping.getOrDefault(info.getCompanyType(), info.getCompanyType()));
+                        break;
+                    case "dataSource":
+                        if (info.getDataSource() != null)
+                            info.setDataSource(mapping.getOrDefault(info.getDataSource(), info.getDataSource()));
+                        break;
+                    case "staffSize":
+                        if (info.getStaffSize() != null)
+                            info.setStaffSize(mapping.getOrDefault(info.getStaffSize(), info.getStaffSize()));
+                        break;
+                }
+            }
+        }
+        return list;
+    }
 }

+ 26 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/enterprise/vo/EnterpriseInfoVO.java

@@ -0,0 +1,26 @@
+package org.jeecg.modules.zjrs.enterprise.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.jeecg.modules.zjrs.enterprise.entity.EnterpriseInfo;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * @Description: 企业基本信息VO(含当前岗位数等扩展字段)
+ * @Author: jeecg-boot
+ * @Date: 2026-06-04
+ * @Version: V1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EnterpriseInfoVO extends EnterpriseInfo {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 当前岗位数
+     */
+    @Excel(name = "当前岗位数", width = 15)
+    @Schema(description = "当前岗位数")
+    private java.lang.Integer postCount;
+}

+ 49 - 15
jeecgboot-vue3/src/views/recruitment/enterprise/EnterpriseInfo.data.ts

@@ -3,49 +3,83 @@ import { BasicColumn } from '/@/components/Table';
 //列表数据
 export const columns: BasicColumn[] = [
   {
-    title: '单位名称',
+    title: '序号',
     align: 'center',
-    dataIndex: 'companyName',
+    dataIndex: 'index',
+    width: 60,
+    customRender: ({ index }) => index + 1,
   },
   {
-    title: '统一社会信用代码',
+    title: '统一信用代码',
     align: 'center',
     dataIndex: 'unifiedCreditCode',
+    width: 170,
   },
   {
-    title: '经营状态',
-    align: 'center',
-    dataIndex: 'businessStatus',
-  },
-  {
-    title: '注册资本',
+    title: '单位名称',
     align: 'center',
-    dataIndex: 'registeredCapital',
+    dataIndex: 'companyName',
+    width: 200,
   },
   {
     title: '单位类型',
     align: 'center',
     dataIndex: 'companyType',
+    width: 120,
   },
   {
     title: '所属行业',
     align: 'center',
     dataIndex: 'industry',
+    width: 120,
   },
   {
-    title: '联系人',
+    title: '注册地址',
     align: 'center',
-    dataIndex: 'contactPerson',
+    dataIndex: 'regAddrDistrict',
+    width: 150,
   },
   {
-    title: '联系方式',
+    title: '经营地址',
     align: 'center',
-    dataIndex: 'contactPhone',
+    dataIndex: 'officeAddress',
+    width: 200,
   },
   {
-    title: '人员规模',
+    title: '企业规模',
     align: 'center',
     dataIndex: 'staffSize',
+    width: 100,
+  },
+  {
+    title: '是否重点企业',
+    align: 'center',
+    dataIndex: 'isKeyEnterprise',
+    width: 120,
+  },
+  {
+    title: '单位标签',
+    align: 'center',
+    dataIndex: 'companyTag',
+    width: 120,
+  },
+  {
+    title: '经营状态',
+    align: 'center',
+    dataIndex: 'businessStatus',
+    width: 100,
+  },
+  {
+    title: '当前岗位数',
+    align: 'center',
+    dataIndex: 'postCount',
+    width: 100,
+  },
+  {
+    title: '数据来源',
+    align: 'center',
+    dataIndex: 'dataSource',
+    width: 100,
   },
 ];
 

+ 24 - 1
jeecgboot-vue3/src/views/recruitment/enterprise/EnterpriseInfoList.vue

@@ -63,7 +63,20 @@
       <template #action="{ record }">
         <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
       </template>
-      <template v-slot:bodyCell="{ column, record, index, text }"> </template>
+      <template v-slot:bodyCell="{ column, record, index, text }">
+        <template v-if="column.dataIndex === 'companyType'">
+          {{ getDictText('CompanyType', text) }}
+        </template>
+        <template v-else-if="column.dataIndex === 'businessStatus'">
+          {{ getDictText('BusinessStatus', text) }}
+        </template>
+        <template v-else-if="column.dataIndex === 'staffSize'">
+          {{ getDictText('CompanySize', text) }}
+        </template>
+        <template v-else-if="column.dataIndex === 'dataSource'">
+          {{ getDictText('DataSource', text) }}
+        </template>
+      </template>
     </BasicTable>
     <!-- 表单区域 -->
     <EnterpriseInfoModal ref="registerModal" @success="handleSuccess"></EnterpriseInfoModal>
@@ -80,6 +93,7 @@
   import { useUserStore } from '/@/store/modules/user';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { getDateByPicker } from '/@/utils';
+  import { useDict } from '/@/hooks/dictionary/useDict';
 
   const fieldPickers = reactive({});
 
@@ -89,6 +103,15 @@
   const registerModal = ref();
   const userStore = useUserStore();
   const { createMessage } = useMessage();
+
+  // 预加载页面所需的字典
+  const { getDictText } = useDict([
+    'BusinessStatus',
+    'CompanyType',
+    'CompanySize',
+    'DataSource',
+  ]);
+
   //注册table数据
   const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
     tableProps: {

+ 82 - 61
jeecgboot-vue3/src/views/recruitment/enterprise/components/EnterpriseInfoForm.vue

@@ -4,11 +4,9 @@
       <template #detail>
         <a-form ref="formRef" :labelCol="labelCol" :wrapperCol="wrapperCol" class="antd-modal-form" name="EnterpriseInfoForm">
           <a-row>
-            <a-col :span="24">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-companyName"
-                :labelCol="{ xs: { span: 24 }, sm: { span: 3 } }"
-                :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
                 label="单位名称"
                 name="companyName"
                 v-bind="validateInfos.companyName"
@@ -16,7 +14,7 @@
                 <a-input v-model:value="formData.companyName" allow-clear placeholder="请输入单位名称"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-unifiedCreditCode"
                 label="统一社会信用代码"
@@ -26,12 +24,12 @@
                 <a-input v-model:value="formData.unifiedCreditCode" allow-clear placeholder="请输入统一社会信用代码"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-orgCode" label="组织机构代码" name="orgCode" v-bind="validateInfos.orgCode">
                 <a-input v-model:value="formData.orgCode" allow-clear placeholder="请输入组织机构代码"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-establishDate" label="成立日期" name="establishDate" v-bind="validateInfos.establishDate">
                 <a-date-picker
                   v-model:value="formData.establishDate"
@@ -42,12 +40,12 @@
                 />
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-businessStatus" label="经营状态" name="businessStatus" v-bind="validateInfos.businessStatus">
-                <a-input v-model:value="formData.businessStatus" allow-clear placeholder="请输入经营状态"></a-input>
+                <a-select v-model:value="formData.businessStatus" allow-clear placeholder="请选择经营状态" :options="businessStatusOptions"></a-select>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-registeredCapital"
                 label="注册资本"
@@ -57,7 +55,7 @@
                 <a-input v-model:value="formData.registeredCapital" allow-clear placeholder="请输入注册资本"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-regAddrDistrict"
                 label="注册地址行政区划"
@@ -67,32 +65,32 @@
                 <a-input v-model:value="formData.regAddrDistrict" allow-clear placeholder="请输入注册地址行政区划"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-companyType" label="单位类型" name="companyType" v-bind="validateInfos.companyType">
-                <a-input v-model:value="formData.companyType" allow-clear placeholder="请输入单位类型"></a-input>
+                <a-select v-model:value="formData.companyType" allow-clear placeholder="请选择单位类型" :options="companyTypeOptions"></a-select>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-economyType" label="经济类型" name="economyType" v-bind="validateInfos.economyType">
                 <a-input v-model:value="formData.economyType" allow-clear placeholder="请输入经济类型"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-industry" label="所属行业" name="industry" v-bind="validateInfos.industry">
                 <a-input v-model:value="formData.industry" allow-clear placeholder="请输入所属行业"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-isListedCompany" label="是否上市公司" name="isListedCompany" v-bind="validateInfos.isListedCompany">
                 <a-input v-model:value="formData.isListedCompany" allow-clear placeholder="请输入是否上市公司"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-industryField" label="行业领域" name="industryField" v-bind="validateInfos.industryField">
-                <a-input v-model:value="formData.industryField" allow-clear placeholder="请输入行业领域"></a-input>
+                <a-select v-model:value="formData.industryField" allow-clear placeholder="请选择行业领域" :options="industryFieldOptions"></a-select>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-industryAdminDept"
                 label="行业主管部门"
@@ -102,12 +100,12 @@
                 <a-input v-model:value="formData.industryAdminDept" allow-clear placeholder="请输入行业主管部门"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-industryTag" label="产业标签" name="industryTag" v-bind="validateInfos.industryTag">
                 <a-input v-model:value="formData.industryTag" allow-clear placeholder="请输入产业标签"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-companyPropertyTag"
                 label="单位属性标签"
@@ -117,17 +115,17 @@
                 <a-input v-model:value="formData.companyPropertyTag" allow-clear placeholder="请输入单位属性标签"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-provinceOrCity" label="省属或所属地市" name="provinceOrCity" v-bind="validateInfos.provinceOrCity">
                 <a-input v-model:value="formData.provinceOrCity" allow-clear placeholder="请输入省属或所属地市"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-companyAttribute" label="单位属性" name="companyAttribute" v-bind="validateInfos.companyAttribute">
                 <a-input v-model:value="formData.companyAttribute" allow-clear placeholder="请输入单位属性"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-isHeadEnterprise"
                 label="是否为头部企业"
@@ -137,7 +135,7 @@
                 <a-input v-model:value="formData.isHeadEnterprise" allow-clear placeholder="请输入是否为头部企业"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-isKeyEnterprise"
                 label="是否为重点企业"
@@ -147,7 +145,7 @@
                 <a-input v-model:value="formData.isKeyEnterprise" allow-clear placeholder="请输入是否为重点企业"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-isKeyInstitution"
                 label="是否为重点事业单位"
@@ -157,7 +155,7 @@
                 <a-input v-model:value="formData.isKeyInstitution" allow-clear placeholder="请输入是否为重点事业单位"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-isStrategicIndustry"
                 label="是否属于20个战略性产业集群"
@@ -167,47 +165,50 @@
                 <a-input v-model:value="formData.isStrategicIndustry" allow-clear placeholder="请输入是否属于20个战略性产业集群"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-dataSource" label="数据来源" name="dataSource" v-bind="validateInfos.dataSource">
-                <a-input v-model:value="formData.dataSource" allow-clear placeholder="请输入数据来源"></a-input>
+                <a-select v-model:value="formData.dataSource" allow-clear placeholder="请选择数据来源" :options="dataSourceOptions"></a-select>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+          </a-row>
+          <a-divider orientation="left" orientation-margin="0px">单位详细信息</a-divider>
+          <a-row>
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-companyTag" label="单位标签" name="companyTag" v-bind="validateInfos.companyTag">
                 <a-input v-model:value="formData.companyTag" allow-clear placeholder="请输入单位标签"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-staffSize" label="人员规模" name="staffSize" v-bind="validateInfos.staffSize">
-                <a-input v-model:value="formData.staffSize" allow-clear placeholder="请输入人员规模"></a-input>
+                <a-select v-model:value="formData.staffSize" allow-clear placeholder="请选择人员规模" :options="staffSizeOptions"></a-select>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-email" label="电子邮箱" name="email" v-bind="validateInfos.email">
                 <a-input v-model:value="formData.email" allow-clear placeholder="请输入电子邮箱"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-postalCode" label="邮政编码" name="postalCode" v-bind="validateInfos.postalCode">
                 <a-input v-model:value="formData.postalCode" allow-clear placeholder="请输入邮政编码"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-contactPerson" label="联系人" name="contactPerson" v-bind="validateInfos.contactPerson">
                 <a-input v-model:value="formData.contactPerson" allow-clear placeholder="请输入联系人"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-contactPhone" label="联系方式" name="contactPhone" v-bind="validateInfos.contactPhone">
                 <a-input v-model:value="formData.contactPhone" allow-clear placeholder="请输入联系方式"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-acceptSmsPush" label="接收平台短信推送" name="acceptSmsPush" v-bind="validateInfos.acceptSmsPush">
                 <a-input v-model:value="formData.acceptSmsPush" allow-clear placeholder="请输入接收平台短信推送"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-openToJobSeeker"
                 label="面向求职者会员开放"
@@ -217,7 +218,7 @@
                 <a-input v-model:value="formData.openToJobSeeker" allow-clear placeholder="请输入面向求职者会员开放"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-allowAgentSignup"
                 label="是否允许人社部门代报名"
@@ -227,34 +228,22 @@
                 <a-input v-model:value="formData.allowAgentSignup" allow-clear placeholder="请输入是否允许人社部门代报名"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-website" label="单位网站" name="website" v-bind="validateInfos.website">
                 <a-input v-model:value="formData.website" allow-clear placeholder="请输入单位网站"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-faxNumber" label="传真号码" name="faxNumber" v-bind="validateInfos.faxNumber">
                 <a-input v-model:value="formData.faxNumber" allow-clear placeholder="请输入传真号码"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-companyBenefits" label="单位福利" name="companyBenefits" v-bind="validateInfos.companyBenefits">
                 <a-input v-model:value="formData.companyBenefits" allow-clear placeholder="请输入单位福利"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="24">
-              <a-form-item
-                id="EnterpriseInfoForm-companyIntro"
-                :labelCol="{ xs: { span: 24 }, sm: { span: 3 } }"
-                :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
-                label="单位简介"
-                name="companyIntro"
-                v-bind="validateInfos.companyIntro"
-              >
-                <a-textarea v-model:value="formData.companyIntro" :rows="4" allow-clear placeholder="请输入单位简介"></a-textarea>
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item
                 id="EnterpriseInfoForm-officeAddrDistrict"
                 label="办公地址行政区划"
@@ -264,17 +253,32 @@
                 <a-input v-model:value="formData.officeAddrDistrict" allow-clear placeholder="请输入办公地址行政区划"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-officeAddress" label="办公地址" name="officeAddress" v-bind="validateInfos.officeAddress">
                 <a-input v-model:value="formData.officeAddress" allow-clear placeholder="请输入办公地址"></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="24">
+              <a-form-item
+                id="EnterpriseInfoForm-companyIntro"
+                :labelCol="{ span: 2 }"
+                :wrapperCol="{ span: 21 }"
+                label="单位简介"
+                name="companyIntro"
+                v-bind="validateInfos.companyIntro"
+              >
+                <a-textarea v-model:value="formData.companyIntro" :rows="4" allow-clear placeholder="请输入单位简介"></a-textarea>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <a-divider orientation="left" orientation-margin="0px">单位形象</a-divider>
+          <a-row>
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-logoImg" label="logo图片" name="logoImg" v-bind="validateInfos.logoImg">
                 <JImageUpload v-model:value="formData.logoImg" :disabled="disabled" :fileMax="1" bizPath="enterprise" />
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-promotionalVideo" label="宣传视频" name="promotionalVideo" v-bind="validateInfos.promotionalVideo">
                 <JUpload
                   v-model:value="formData.promotionalVideo"
@@ -286,7 +290,7 @@
                 />
               </a-form-item>
             </a-col>
-            <a-col :span="12">
+            <a-col :span="8">
               <a-form-item id="EnterpriseInfoForm-promotionalImage" label="宣传图片" name="promotionalImage" v-bind="validateInfos.promotionalImage">
                 <JImageUpload v-model:value="formData.promotionalImage" :disabled="disabled" :fileMax="5" bizPath="enterprise" />
               </a-form-item>
@@ -307,6 +311,7 @@
   import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
   import { Form } from 'ant-design-vue';
   import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
+  import { useDict } from '/@/hooks/dictionary/useDict';
 
   const props = defineProps({
     formDisabled: { type: Boolean, default: false },
@@ -359,6 +364,22 @@
     promotionalVideo: '',
     promotionalImage: '',
   });
+  // 预加载表单所需的字典
+  const { getDictOptions } = useDict([
+    'BusinessStatus',
+    'CompanyType',
+    'CompanySize',
+    'DataSource',
+    'IndustryField',
+  ]);
+
+  // 字典选项
+  const businessStatusOptions = computed(() => getDictOptions('BusinessStatus'));
+  const companyTypeOptions = computed(() => getDictOptions('CompanyType'));
+  const staffSizeOptions = computed(() => getDictOptions('CompanySize'));
+  const dataSourceOptions = computed(() => getDictOptions('DataSource'));
+  const industryFieldOptions = computed(() => getDictOptions('IndustryField'));
+
   const { createMessage } = useMessage();
   const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 6 } });
   const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
@@ -369,11 +390,11 @@
     companyName: [{ required: true, message: '请输入单位名称' }],
     unifiedCreditCode: [{ required: true, message: '请输入统一社会信用代码' }],
     regAddrDistrict: [{ required: true, message: '请输入注册地址行政区划' }],
-    companyType: [{ required: true, message: '请输入单位类型' }],
+    companyType: [{ required: true, message: '请选择单位类型' }],
     economyType: [{ required: true, message: '请输入经济类型' }],
     industry: [{ required: true, message: '请输入所属行业' }],
-    dataSource: [{ required: true, message: '请输入数据来源' }],
-    staffSize: [{ required: true, message: '请输入人员规模' }],
+    dataSource: [{ required: true, message: '请选择数据来源' }],
+    staffSize: [{ required: true, message: '请选择人员规模' }],
     contactPerson: [{ required: true, message: '请输入联系人' }],
     contactPhone: [{ required: true, message: '请输入联系方式' }],
     acceptSmsPush: [{ required: true, message: '请输入接收平台短信推送' }],

+ 7 - 0
jeecgboot-vue3/src/views/recruitment/enterpriseTag/EnterpriseTag.data.ts

@@ -1,6 +1,13 @@
 import { BasicColumn } from '/@/components/Table';
 
 export const columns: BasicColumn[] = [
+  {
+    title: '序号',
+    align: 'center',
+    dataIndex: 'index',
+    width: 60,
+    customRender: ({ index }) => index + 1,
+  },
   {
     title: '省标标码',
     align: 'center',

+ 7 - 0
jeecgboot-vue3/src/views/recruitment/personalTag/PersonalTag.data.ts

@@ -1,6 +1,13 @@
 import { BasicColumn } from '/@/components/Table';
 
 export const columns: BasicColumn[] = [
+  {
+    title: '序号',
+    align: 'center',
+    dataIndex: 'index',
+    width: 60,
+    customRender: ({ index }) => index + 1,
+  },
   {
     title: '省标标码',
     align: 'center',

+ 7 - 0
jeecgboot-vue3/src/views/recruitment/post/PostInfo.data.ts

@@ -2,6 +2,13 @@ import { BasicColumn } from '/@/components/Table';
 
 //列表数据
 export const columns: BasicColumn[] = [
+  {
+    title: '序号',
+    align: 'center',
+    dataIndex: 'index',
+    width: 60,
+    customRender: ({ index }) => index + 1,
+  },
   {
     title: '单位名称',
     align: 'center',