Sfoglia il codice sorgente

feat(main): 添加审核功能模块和背调相关实体

- debug了修改密码的问题
- 新增 AGENTS.md 项目概述文档
- 添加 IMainAuditService 接口定义审核服务方法
- 实现 MainAuditServiceImpl 审核业务逻辑,包括审核通过和驳回功能
- 创建 MainAudit 实体类和对应的 VO/BO 对象
- 添加 MainAuditController 提供 REST API 接口
- 实现 MyBatis 映射文件 MainAuditMapper.xml 支持详情查询
- 添加背调相关实体类如 MainBackCategory、MainBackCandidate 等
- 新增背调条款、订单、记录等服务接口定义
- 实现企业申请和岗位申请的数据同步逻辑
- 添加审核类型和状态的字典翻译支持
西格玛许 2 mesi fa
parent
commit
a936ea27cb
71 ha cambiato i file con 3082 aggiunte e 7 eliminazioni
  1. 32 0
      AGENTS.md
  2. 6 0
      pom.xml
  3. 4 0
      ruoyi-admin/pom.xml
  4. 1 0
      ruoyi-modules/pom.xml
  5. 63 0
      ruoyi-modules/ruoyi-main/pom.xml
  6. 79 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainAuditController.java
  7. 53 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainBackCategoryController.java
  8. 81 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainBackClauseController.java
  9. 32 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainBackOrderController.java
  10. 39 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainBackRecordController.java
  11. 49 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainCompanyApplyController.java
  12. 48 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainPostApplyController.java
  13. 35 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainAudit.java
  14. 29 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainBackCandidate.java
  15. 38 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainBackCategory.java
  16. 46 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainBackClause.java
  17. 41 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainBackOrder.java
  18. 38 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainBackRecord.java
  19. 37 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainCompanyApply.java
  20. 60 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainPostApply.java
  21. 45 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainStudent.java
  22. 24 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainAuditBo.java
  23. 18 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainBackCandidateBo.java
  24. 27 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainBackCategoryBo.java
  25. 35 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainBackClauseBo.java
  26. 20 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainBackOrderBo.java
  27. 18 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainBackRecordBo.java
  28. 26 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainCompanyApplyBo.java
  29. 50 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainPostApplyBo.java
  30. 23 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainStudentBo.java
  31. 123 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainAuditVo.java
  32. 24 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainBackCandidateVo.java
  33. 25 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainBackCategoryVo.java
  34. 32 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainBackClauseVo.java
  35. 29 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainBackOrderVo.java
  36. 33 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainBackRecordVo.java
  37. 67 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainCompanyApplyVo.java
  38. 127 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainPostApplyVo.java
  39. 29 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainStudentVo.java
  40. 29 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainAuditMapper.java
  41. 8 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainBackCandidateMapper.java
  42. 8 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainBackCategoryMapper.java
  43. 8 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainBackClauseMapper.java
  44. 8 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainBackOrderMapper.java
  45. 8 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainBackRecordMapper.java
  46. 8 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainCompanyApplyMapper.java
  47. 8 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainPostApplyMapper.java
  48. 8 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainStudentMapper.java
  49. 45 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainAuditService.java
  50. 14 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainBackCategoryService.java
  51. 42 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainBackClauseService.java
  52. 17 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainBackOrderService.java
  53. 17 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainBackRecordService.java
  54. 24 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainCompanyApplyService.java
  55. 24 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainPostApplyService.java
  56. 273 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainAuditServiceImpl.java
  57. 48 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainBackCategoryServiceImpl.java
  58. 104 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainBackClauseServiceImpl.java
  59. 83 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainBackOrderServiceImpl.java
  60. 66 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainBackRecordServiceImpl.java
  61. 81 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainCompanyApplyServiceImpl.java
  62. 111 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainPostApplyServiceImpl.java
  63. 159 0
      ruoyi-modules/ruoyi-main/src/main/resources/mapper/MainAuditMapper.xml
  64. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTagController.java
  65. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java
  66. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java
  67. 3 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java
  68. 19 3
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
  69. 266 0
      script/sql/main.sql
  70. 2 2
      script/sql/sqlserver/sqlserver_ry_vue_5.X.sql
  71. 0 0
      script/sql/新建 文本文档.txt

+ 32 - 0
AGENTS.md

@@ -0,0 +1,32 @@
+# project overview
+
+this is project overview.
+
+- Language:
+- Build tool:
+- Framework:
+- Testing Framework:
+
+Description of the architecture
+
+project structure describe here
+
+The project uses `.env` for configuration.
+
+List your backing services, such as database, message queue, external services, etc.
+
+- Main database:
+- Table Naming: Singular, prefer `account` instead of `accounts`
+
+The project uses Maven to build and run the project, and some tasks as following:
+
+- Build: `just build`
+- Run: `just start`
+
+For other tasks, the project uses [just](https://github.com/casey/just) as the task runner,
+and the available recipes are as below:
+
+- `just build`: build the project
+
+
+- `8080`: web server listen port, and main page is http://localhost:8080

+ 6 - 0
pom.xml

@@ -357,6 +357,12 @@
                 <version>${revision}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>ruoyi-main</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 

+ 4 - 0
ruoyi-admin/pom.xml

@@ -92,6 +92,10 @@
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-workflow</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-main</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>de.codecentric</groupId>

+ 1 - 0
ruoyi-modules/pom.xml

@@ -15,6 +15,7 @@
         <module>ruoyi-job</module>
         <module>ruoyi-system</module>
         <module>ruoyi-workflow</module>
+        <module>ruoyi-main</module>
     </modules>
 
     <artifactId>ruoyi-modules</artifactId>

+ 63 - 0
ruoyi-modules/ruoyi-main/pom.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    @d:/yp_pro/sj-backend/ruoyi-modules/ruoyi-main/pom.xml:6-10
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-modules</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>ruoyi-main</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.github.linpeilie</groupId>
+            <artifactId>mapstruct-plus</artifactId>
+            <version>1.5.0</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-annotation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.validation</groupId>
+            <artifactId>jakarta.validation-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-mybatis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-translation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-system</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 79 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainAuditController.java

@@ -0,0 +1,79 @@
+package org.dromara.main.controller;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.main.domain.bo.MainAuditBo;
+import org.dromara.main.domain.vo.MainAuditVo;
+import org.dromara.main.service.IMainAuditService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/main/audit")
+public class MainAuditController extends BaseController {
+
+    private final IMainAuditService mainAuditService;
+
+    /**
+     * 查询审核列表(包含企业/岗位详情)
+     */
+    @GetMapping("/list")
+    public TableDataInfo<MainAuditVo> list(MainAuditBo bo, PageQuery pageQuery) {
+        return mainAuditService.queryDetailPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取审核详细信息(包含企业/岗位详情)
+     */
+    @GetMapping("/{id}")
+    public R<MainAuditVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return R.ok(mainAuditService.queryDetailById(id));
+    }
+
+    /**
+     * 新增审核
+     */
+    @PostMapping("/add")
+    public R<Void> add(@RequestBody MainAuditBo bo) {
+        return toAjax(mainAuditService.insertByBo(bo));
+    }
+
+    /**
+     * 修改审核
+     */
+    @PutMapping("/edit")
+    public R<Void> edit(@RequestBody MainAuditBo bo) {
+        return toAjax(mainAuditService.updateByBo(bo));
+    }
+
+    /**
+     * 删除审核
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+        return toAjax(mainAuditService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+
+    /**
+     * 审核通过
+     */
+    @PutMapping("/pass/{id}")
+    public R<Void> auditPass(@PathVariable Long id, @RequestParam(required = false) String remark) {
+        return toAjax(mainAuditService.auditPass(id, remark));
+    }
+
+    /**
+     * 审核驳回
+     */
+    @PutMapping("/reject/{id}")
+    public R<Void> auditReject(@PathVariable Long id, @RequestParam String remark) {
+        return toAjax(mainAuditService.auditReject(id, remark));
+    }
+}

+ 53 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainBackCategoryController.java

@@ -0,0 +1,53 @@
+package org.dromara.main.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.main.domain.bo.MainBackCategoryBo;
+import org.dromara.main.domain.vo.MainBackCategoryVo;
+import org.dromara.main.service.IMainBackCategoryService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/backCategory")
+public class MainBackCategoryController extends BaseController {
+
+    private final IMainBackCategoryService mainBackCategoryService;
+
+    /**
+     * 查询背调条款分类列表
+     */
+    @GetMapping("/list")
+    public R<List<MainBackCategoryVo>> list(MainBackCategoryBo bo) {
+        return R.ok(mainBackCategoryService.queryList(bo));
+    }
+
+    /**
+     * 新增背调条款分类
+     */
+    @PostMapping()
+    public R<Void> add(@Validated @RequestBody MainBackCategoryBo bo) {
+        return toAjax(mainBackCategoryService.insertByBo(bo));
+    }
+
+    /**
+     * 修改背调条款分类
+     */
+    @PutMapping()
+    public R<Void> edit(@Validated @RequestBody MainBackCategoryBo bo) {
+        return toAjax(mainBackCategoryService.updateByBo(bo));
+    }
+
+    /**
+     * 删除背调条款分类
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(mainBackCategoryService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 81 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainBackClauseController.java

@@ -0,0 +1,81 @@
+package org.dromara.main.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.main.domain.bo.MainBackClauseBo;
+import org.dromara.main.domain.vo.MainBackClauseVo;
+import org.dromara.main.service.IMainBackClauseService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/backClause")
+public class MainBackClauseController extends BaseController {
+
+    private final IMainBackClauseService mainBackClauseService;
+
+    /**
+     * 查询背调条款分页列表
+     */
+    // @SaCheckPermission("system:backClause:list") // 如果需要权限控制请取消注释
+    @GetMapping("/list")
+    public TableDataInfo<MainBackClauseVo> list(MainBackClauseBo bo, PageQuery pageQuery) {
+        return mainBackClauseService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取背调条款详细信息
+     */
+    // @SaCheckPermission("system:backClause:query")
+    @GetMapping("/{id}")
+    public R<MainBackClauseVo> getInfo(@PathVariable Long id) {
+        return R.ok(mainBackClauseService.queryById(id));
+    }
+
+    /**
+     * 新增背调条款
+     */
+    // @SaCheckPermission("system:backClause:add")
+    @PostMapping()
+    public R<Void> add(@Validated @RequestBody MainBackClauseBo bo) {
+        return toAjax(mainBackClauseService.insertByBo(bo));
+    }
+
+    /**
+     * 修改背调条款
+     */
+    // @SaCheckPermission("system:backClause:edit")
+    @PutMapping()
+    public R<Void> edit(@Validated @RequestBody MainBackClauseBo bo) {
+        return toAjax(mainBackClauseService.updateByBo(bo));
+    }
+
+    /**
+     * 删除背调条款
+     */
+    // @SaCheckPermission("system:backClause:remove")
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(mainBackClauseService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+
+
+    /**
+     * 修改条款状态
+     */
+    @PutMapping("/changeStatus")
+    public R<Void> changeStatus(@RequestBody MainBackClauseBo bo) {
+        // 这里不需要 @Validated,因为我们只更新状态
+        MainBackClauseBo updateBo = new MainBackClauseBo();
+        updateBo.setId(bo.getId());
+        updateBo.setStatus(bo.getStatus());
+        return toAjax(mainBackClauseService.updateByBo(updateBo));
+    }
+}

+ 32 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainBackOrderController.java

@@ -0,0 +1,32 @@
+package org.dromara.main.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.main.domain.bo.MainBackOrderBo;
+import org.dromara.main.domain.vo.MainBackOrderVo;
+import org.dromara.main.service.IMainBackOrderService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/backOrder")
+public class MainBackOrderController extends BaseController {
+
+    private final IMainBackOrderService mainBackOrderService;
+
+    /**
+     * 查询背调订单列表
+     */
+    @SaCheckPermission("system:backOrder:list")
+    @GetMapping("/list")
+    public TableDataInfo<MainBackOrderVo> list(MainBackOrderBo bo, PageQuery pageQuery) {
+        return mainBackOrderService.queryPageList(bo, pageQuery);
+    }
+}

+ 39 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainBackRecordController.java

@@ -0,0 +1,39 @@
+package org.dromara.main.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.main.domain.bo.MainBackRecordBo;
+import org.dromara.main.domain.vo.MainBackRecordVo;
+import org.dromara.main.service.IMainBackRecordService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 背调执行记录Controller
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/backRecord")
+public class MainBackRecordController extends BaseController {
+
+    private final IMainBackRecordService mainBackRecordService;
+
+    /**
+     * 查询背调执行记录列表(候选人列表)
+     */
+//    @SaCheckPermission("system:backRecord:list")
+    @GetMapping("/list")
+    public TableDataInfo<MainBackRecordVo> list(
+            @RequestParam(value = "orderId") Long orderId,
+            MainBackRecordBo bo,
+            PageQuery pageQuery) {
+        return mainBackRecordService.queryPageList(orderId, bo, pageQuery);
+    }
+}

+ 49 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainCompanyApplyController.java

@@ -0,0 +1,49 @@
+package org.dromara.main.controller;
+
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.main.domain.bo.MainCompanyApplyBo;
+import org.dromara.main.domain.vo.MainCompanyApplyVo;
+import org.dromara.main.service.IMainCompanyApplyService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/main/companyApply")
+public class MainCompanyApplyController extends BaseController {
+
+    private final IMainCompanyApplyService mainCompanyApplyService;
+
+    @GetMapping("/list")
+    public TableDataInfo<MainCompanyApplyVo> list(MainCompanyApplyBo bo, PageQuery pageQuery) {
+        return mainCompanyApplyService.queryPageList(bo, pageQuery);
+    }
+
+    @GetMapping("/{id}")
+    public R<MainCompanyApplyVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return R.ok(mainCompanyApplyService.queryById(id));
+    }
+
+    @PostMapping("/add")
+    public R<Void> add(@RequestBody MainCompanyApplyBo bo) {
+        return toAjax(mainCompanyApplyService.insertByBo(bo));
+    }
+
+    @PutMapping("/edit")
+    public R<Void> edit(@RequestBody MainCompanyApplyBo bo) {
+        return toAjax(mainCompanyApplyService.updateByBo(bo));
+    }
+
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+        return toAjax(mainCompanyApplyService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+}

+ 48 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainPostApplyController.java

@@ -0,0 +1,48 @@
+package org.dromara.main.controller;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.main.domain.bo.MainPostApplyBo;
+import org.dromara.main.domain.vo.MainPostApplyVo;
+import org.dromara.main.service.IMainPostApplyService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/main/postApply")
+public class MainPostApplyController extends BaseController {
+
+    private final IMainPostApplyService mainPostApplyService;
+
+    @GetMapping("/list")
+    public TableDataInfo<MainPostApplyVo> list(MainPostApplyBo bo, PageQuery pageQuery) {
+        return mainPostApplyService.queryPageList(bo, pageQuery);
+    }
+
+    @GetMapping("/{id}")
+    public R<MainPostApplyVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return R.ok(mainPostApplyService.queryById(id));
+    }
+
+    @PostMapping("/add")
+    public R<Void> add(@RequestBody MainPostApplyBo bo) {
+        return toAjax(mainPostApplyService.insertByBo(bo));
+    }
+
+    @PutMapping("/edit")
+    public R<Void> edit(@RequestBody MainPostApplyBo bo) {
+        return toAjax(mainPostApplyService.updateByBo(bo));
+    }
+
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+        return toAjax(mainPostApplyService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+}

+ 35 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainAudit.java

@@ -0,0 +1,35 @@
+package org.dromara.main.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("main_audit")
+public class MainAudit extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private Long id;
+
+    private Integer auditType;
+    private Long targetId;
+    private Integer auditResult;
+    private String auditRemark;
+    private BigDecimal deposit;
+    private BigDecimal finalPayment;
+    private Date auditTime;
+    private Long auditBy;
+    private String tenantId;
+
+    @TableLogic
+    private String delFlag;
+}

+ 29 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainBackCandidate.java

@@ -0,0 +1,29 @@
+package org.dromara.main.domain;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("main_back_candidate")
+public class MainBackCandidate extends BaseEntity {
+
+    @TableId(value = "id")
+    private Long id;
+
+    /** 所属租户(企业ID) */
+    private String tenantId;
+
+    /** 关联学员ID */
+    private Long studentId;
+
+    /** 来源渠道 */
+    private String source;
+
+    /** 删除标志 */
+    @TableLogic
+    private String delFlag;
+}

+ 38 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainBackCategory.java

@@ -0,0 +1,38 @@
+package org.dromara.main.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("main_back_category")
+public class MainBackCategory extends BaseEntity {
+
+    /** 主键ID */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /** 分类名称 */
+    private String name;
+
+    /** 分类价格 */
+    private BigDecimal price;
+
+    /** 状态(0停用 1正常) */
+    private String status;
+
+    /** 删除标志(0代表存在 1代表删除) */
+    @TableLogic
+    private String delFlag;
+
+    /** 备注 */
+    private String remark;
+
+}

+ 46 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainBackClause.java

@@ -0,0 +1,46 @@
+package org.dromara.main.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("main_back_clause")
+public class MainBackClause extends BaseEntity {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /** 所属分类ID */
+    private Long categoryId;
+
+    /** 条款名称 */
+    private String name;
+
+    /** 条款类型(字典:sys_clause_type) */
+    private String type;
+
+    /** 条款描述 */
+    private String description;
+
+    /** 条款单价 */
+    private BigDecimal price;
+
+    /** 状态(0停用 1正常) */
+    private String status;
+
+    /** 创建部门 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createDept;
+
+    /** 删除标志 */
+    @TableLogic
+    private String delFlag;
+
+    /** 备注 */
+    private String remark;
+}

+ 41 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainBackOrder.java

@@ -0,0 +1,41 @@
+package org.dromara.main.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("main_back_order")
+public class MainBackOrder extends BaseEntity {
+
+    @TableId(value = "id")
+    private Long id;
+
+    /** 订单编号 */
+    private String orderNo;
+
+    /** 下单租户(企业ID) */
+    private String tenantId;
+
+    /** 背调套餐ID */
+    private Long categoryId;
+
+    /** 套餐名称快照 */
+    private String categoryName;
+
+    /** 订单金额 */
+    private BigDecimal totalAmount;
+
+    /** 订单状态(0待处理 1进行中 2已完成 3已退款) */
+    private String status;
+
+    /** 删除标志 */
+    @TableLogic
+    private String delFlag;
+}

+ 38 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainBackRecord.java

@@ -0,0 +1,38 @@
+package org.dromara.main.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.time.LocalDateTime;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("main_back_record")
+public class MainBackRecord extends BaseEntity {
+
+    @TableId(value = "id")
+    private Long id;
+
+    /** 关联订单ID */
+    private Long orderId;
+
+    /** 关联企业候选人ID */
+    private Long candidateId;
+
+    /** 背调状态 */
+    private String status;
+
+    /** 报告地址 */
+    private String reportUrl;
+
+    /** 完成时间 */
+    private LocalDateTime finishTime;
+
+    /** 删除标志 */
+    @TableLogic
+    private String delFlag;
+}

+ 37 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainCompanyApply.java

@@ -0,0 +1,37 @@
+package org.dromara.main.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("main_company_apply")
+public class MainCompanyApply extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private Long id;
+
+    private String applyNo;
+    private String companyName;
+    private String officialAccount;
+    private String officeAddress;
+    private String creditCode;
+    private Long authLetter;
+    private Long avatar;
+    private String surname;
+    private String name;
+    private String mobile;
+    private Integer applyStatus;
+    private Long auditId;
+    private String tenantId;
+    private String rejectReason;
+
+    @TableLogic
+    private String delFlag;
+}

+ 60 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainPostApply.java

@@ -0,0 +1,60 @@
+package org.dromara.main.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("main_post_apply")
+public class MainPostApply extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private Long id;
+
+    private String applyNo;
+    private String tenantId;
+    private String postName;
+    private String companyName;
+    private String postDescription;
+    private String workProvince;
+    private String workCity;
+    private String workDistrict;
+    private String workAddress;
+    private String postType;
+    private String educationRequirement;
+    private String salaryType;
+    private String salaryRange;
+    private Integer recruitNum;
+    private Date registrationStartDate;
+    private Date registrationEndDate;
+    private Integer isUrgent;
+    private String schoolRequirement;
+    private String genderRequirement;
+    private String gradeRequirement;
+    private String arrivalTime;
+    private String internshipDuration;
+    private Integer willingToTravel;
+    private String welfareTags;
+    private String jobRequirement;
+    private String postLevel;
+    private String assessmentTime;
+    private BigDecimal gradeA;
+    private BigDecimal gradeB;
+    private BigDecimal gradeC;
+    private Integer applyStatus;
+    private Long auditId;
+    private Long postId;
+    private String rejectReason;
+
+    @TableLogic
+    private String delFlag;
+}

+ 45 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainStudent.java

@@ -0,0 +1,45 @@
+package org.dromara.main.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("main_student")
+public class MainStudent extends BaseEntity {
+
+    @TableId(value = "id")
+    private Long id;
+
+    /** 姓名 */
+    private String name;
+
+    /** 手机号 */
+    private String mobile;
+
+    /** 证件号码 */
+    private String idCardNumber;
+
+    /** 背调/测评唯一码 */
+    private String uniqueCode;
+
+    /** 性别(0男 1女 2未知) */
+    private String gender;
+
+    /** 头像URL */
+    private Long avatar;
+
+    /** 状态(0正常 1停用) */
+    private String status;
+
+    /** 所属租户 */
+    private String tenantId;
+
+    /** 删除标志 */
+    @TableLogic
+    private String delFlag;
+}

+ 24 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainAuditBo.java

@@ -0,0 +1,24 @@
+package org.dromara.main.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.main.domain.MainAudit;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MainAudit.class, reverseConvertGenerate = false)
+public class MainAuditBo extends BaseEntity {
+
+    private Long id;
+    private Integer auditType;
+    private Long targetId;
+    private Integer auditResult;
+    private String auditRemark;
+    private BigDecimal deposit;
+    private BigDecimal finalPayment;
+}

+ 18 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainBackCandidateBo.java

@@ -0,0 +1,18 @@
+package org.dromara.main.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.main.domain.MainBackCandidate;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MainBackCandidate.class, reverseConvertGenerate = false)
+public class MainBackCandidateBo extends BaseEntity {
+
+    private Long id;
+    private String tenantId;
+    private Long studentId;
+    private String source;
+}

+ 27 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainBackCategoryBo.java

@@ -0,0 +1,27 @@
+package org.dromara.main.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.main.domain.MainBackCategory;
+
+import java.math.BigDecimal;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MainBackCategory.class, reverseConvertGenerate = false)
+public class MainBackCategoryBo extends BaseEntity {
+
+    private Long id;
+
+    @NotBlank(message = "分类名称不能为空")
+    private String name;
+
+    private BigDecimal price;
+
+    private String status;
+
+    private String remark;
+}

+ 35 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainBackClauseBo.java

@@ -0,0 +1,35 @@
+package org.dromara.main.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.main.domain.MainBackClause;
+
+import java.math.BigDecimal;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MainBackClause.class, reverseConvertGenerate = false)
+public class MainBackClauseBo extends BaseEntity {
+
+    private Long id;
+
+    @NotNull(message = "所属分类不能为空")
+    private Long categoryId;
+
+    @NotBlank(message = "条款名称不能为空")
+    private String name;
+
+    private String type;
+
+    private String description;
+
+    private BigDecimal price;
+
+    private String status;
+
+    private String remark;
+}

+ 20 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainBackOrderBo.java

@@ -0,0 +1,20 @@
+package org.dromara.main.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.main.domain.MainBackOrder;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MainBackOrder.class, reverseConvertGenerate = false)
+public class MainBackOrderBo extends BaseEntity {
+
+    private Long id;
+    private String orderNo;
+    private String tenantId;
+    private Long categoryId;
+    private String status;
+    private String keyword; // 对应前端“请输入单位名称”搜索
+}

+ 18 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainBackRecordBo.java

@@ -0,0 +1,18 @@
+package org.dromara.main.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.main.domain.MainBackRecord;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MainBackRecord.class, reverseConvertGenerate = false)
+public class MainBackRecordBo extends BaseEntity {
+
+    private Long id;
+    private Long orderId;
+    private Long candidateId;
+    private String status;
+}

+ 26 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainCompanyApplyBo.java

@@ -0,0 +1,26 @@
+package org.dromara.main.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.main.domain.MainCompanyApply;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MainCompanyApply.class, reverseConvertGenerate = false)
+public class MainCompanyApplyBo extends BaseEntity {
+
+    private Long id;
+    private String applyNo;
+    private String companyName;
+    private String officialAccount;
+    private String officeAddress;
+    private String creditCode;
+    private Long authLetter;
+    private Long avatar;
+    private String surname;
+    private String name;
+    private String mobile;
+    private Integer applyStatus;
+}

+ 50 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainPostApplyBo.java

@@ -0,0 +1,50 @@
+package org.dromara.main.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.main.domain.MainPostApply;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MainPostApply.class, reverseConvertGenerate = false)
+public class MainPostApplyBo extends BaseEntity {
+
+    private Long id;
+    private String applyNo;
+    private String tenantId;
+    private String postName;
+    private String companyName;
+    private String postDescription;
+    private String workProvince;
+    private String workCity;
+    private String workDistrict;
+    private String workAddress;
+    private String postType;
+    private String educationRequirement;
+    private String salaryType;
+    private String salaryRange;
+    private Integer recruitNum;
+    private Date registrationStartDate;
+    private Date registrationEndDate;
+    private Integer isUrgent;
+    private String schoolRequirement;
+    private String genderRequirement;
+    private String gradeRequirement;
+    private String arrivalTime;
+    private String internshipDuration;
+    private Integer willingToTravel;
+    private String welfareTags;
+    private String jobRequirement;
+    private String postLevel;
+    private String assessmentTime;
+    private BigDecimal gradeA;
+    private BigDecimal gradeB;
+    private BigDecimal gradeC;
+    private Integer applyStatus;
+}

+ 23 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainStudentBo.java

@@ -0,0 +1,23 @@
+package org.dromara.main.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.main.domain.MainStudent;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MainStudent.class, reverseConvertGenerate = false)
+public class MainStudentBo extends BaseEntity {
+
+    private Long id;
+    private String name;
+    private String mobile;
+    private String idCardNumber;
+    private String uniqueCode;
+    private String gender;
+    private Long avatar;
+    private String status;
+    private String tenantId;
+}

+ 123 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainAuditVo.java

@@ -0,0 +1,123 @@
+package org.dromara.main.domain.vo;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.main.domain.MainAudit;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@AutoMapper(target = MainAudit.class)
+public class MainAuditVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @ExcelProperty(value = "审核ID")
+    private Long id;
+
+    @ExcelProperty(value = "审核类型")
+    private Integer auditType;
+
+    @ExcelProperty(value = "目标ID")
+    private Long targetId;
+
+    @ExcelProperty(value = "审核结果")
+    private Integer auditResult;
+
+    @ExcelProperty(value = "审核备注")
+    private String auditRemark;
+
+    @ExcelProperty(value = "定金")
+    private BigDecimal deposit;
+
+    @ExcelProperty(value = "尾款")
+    private BigDecimal finalPayment;
+
+    @ExcelProperty(value = "审核时间")
+    private Date auditTime;
+
+    @ExcelProperty(value = "审核人")
+    private Long auditBy;
+
+    @ExcelProperty(value = "租户ID")
+    private String tenantId;
+
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    private String applyNo;
+    private String companyName;
+    private String officialAccount;
+    private String officeAddress;
+    private String creditCode;
+    private Long authLetter;
+    private String mobile;
+    private String surname;
+    private String name;
+    private Long avatar;
+    private Date applyCreateTime;
+
+    private String postName;
+    private String postDescription;
+    private String workProvince;
+    private String workCity;
+    private String workDistrict;
+    private String workAddress;
+    private String postType;
+
+    @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "postType", other = "main_position_type")
+    private String postTypeName;
+
+    private String educationRequirement;
+    private String salaryType;
+    private String salaryRange;
+    private Integer recruitNum;
+    private Date registrationStartDate;
+    private Date registrationEndDate;
+    private Integer isUrgent;
+    private String schoolRequirement;
+
+    @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "schoolRequirement", other = "main_education")
+    private String schoolRequirementName;
+
+    private String genderRequirement;
+
+    @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "genderRequirement", other = "sys_user_sex")
+    private String genderRequirementName;
+
+    private String gradeRequirement;
+
+    @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "gradeRequirement", other = "main_experience")
+    private String gradeRequirementName;
+
+    private String arrivalTime;
+
+    @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "arrivalTime", other = "main_arrival_time")
+    private String arrivalTimeName;
+
+    private String internshipDuration;
+
+    @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "internshipDuration", other = "main_internship_duration")
+    private String internshipDurationName;
+
+    private Integer willingToTravel;
+    private String welfareTags;
+    private String jobRequirement;
+    private String postLevel;
+
+    @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "postLevel", other = "main_position_level")
+    private String postLevelName;
+
+    private String assessmentTime;
+    private BigDecimal gradeA;
+    private BigDecimal gradeB;
+    private BigDecimal gradeC;
+    private String auditByName;
+}

+ 24 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainBackCandidateVo.java

@@ -0,0 +1,24 @@
+package org.dromara.main.domain.vo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.main.domain.MainBackCandidate;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@AutoMapper(target = MainBackCandidate.class)
+public class MainBackCandidateVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+    private String tenantId;
+    private Long studentId;
+    private String source;
+    private LocalDateTime createTime;
+    private LocalDateTime updateTime;
+}

+ 25 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainBackCategoryVo.java

@@ -0,0 +1,25 @@
+package org.dromara.main.domain.vo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.main.domain.MainBackCategory;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@AutoMapper(target = MainBackCategory.class)
+public class MainBackCategoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+    private String name;
+    private BigDecimal price;
+    private String status;
+    private String remark;
+    private LocalDateTime createTime;
+}

+ 32 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainBackClauseVo.java

@@ -0,0 +1,32 @@
+package org.dromara.main.domain.vo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.main.domain.MainBackClause;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@AutoMapper(target = MainBackClause.class)
+public class MainBackClauseVo implements Serializable {
+
+    private Long id;
+    private Long categoryId;
+    private String name;
+//    @Translation(type= TransConstant.DICT_TYPE_TO_LABEL, mapper = "sys_clause_type")
+    private String type;
+    private String description;
+    private BigDecimal price;
+    private String status;
+    private String remark;
+    private Long createDept;
+    private Date createTime;
+
+    @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "type", other = "sys_clause_type")
+    private String typeName;
+
+}

+ 29 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainBackOrderVo.java

@@ -0,0 +1,29 @@
+package org.dromara.main.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.main.domain.MainBackOrder;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@AutoMapper(target = MainBackOrder.class)
+public class MainBackOrderVo implements Serializable {
+
+    private Long id;
+    private String orderNo;
+    private String tenantId;
+    private String companyName; // 对应前端“下单企业”
+    private Long categoryId;
+    private String categoryName;
+    @TableField("total_amount")
+    private BigDecimal totalAmount;
+    private String status;
+    private LocalDateTime createTime;
+
+    /** 候选人人数 (需在 Service 中统计或 SQL 关联查询) */
+    private Long candidateCount;
+}

+ 33 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainBackRecordVo.java

@@ -0,0 +1,33 @@
+package org.dromara.main.domain.vo;
+
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.main.domain.MainBackRecord;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@AutoMapper(target = MainBackRecord.class)
+public class MainBackRecordVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+    private Long orderId;
+    private Long candidateId;
+    private String status;
+    private String reportUrl;
+    private LocalDateTime finishTime;
+    private LocalDateTime createTime;
+
+    private String studentName;
+    private String studentMobile;
+    private String studentIdCard;
+    private String studentGender;
+    private String studentStatus;
+
+}

+ 67 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainCompanyApplyVo.java

@@ -0,0 +1,67 @@
+package org.dromara.main.domain.vo;
+
+
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.main.domain.MainCompanyApply;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@AutoMapper(target = MainCompanyApply.class)
+public class MainCompanyApplyVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @ExcelProperty(value = "申请ID")
+    private Long id;
+
+    @ExcelProperty(value = "申请编号")
+    private String applyNo;
+
+    @ExcelProperty(value = "企业名称")
+    private String companyName;
+
+    @ExcelProperty(value = "官方邮箱")
+    private String officialAccount;
+
+    @ExcelProperty(value = "办公地址")
+    private String officeAddress;
+
+    @ExcelProperty(value = "统一社会信用代码")
+    private String creditCode;
+
+    @ExcelProperty(value = "委托招聘证明")
+    private Long authLetter;
+
+    @ExcelProperty(value = "头像")
+    private Long avatar;
+
+    @ExcelProperty(value = "姓氏")
+    private String surname;
+
+    @ExcelProperty(value = "名字")
+    private String name;
+
+    @ExcelProperty(value = "手机号")
+    private String mobile;
+
+    @ExcelProperty(value = "申请状态")
+    private Integer applyStatus;
+
+    @ExcelProperty(value = "审核ID")
+    private Long auditId;
+
+    @ExcelProperty(value = "租户ID")
+    private String tenantId;
+
+    @ExcelProperty(value = "驳回原因")
+    private String rejectReason;
+
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+}

+ 127 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainPostApplyVo.java

@@ -0,0 +1,127 @@
+package org.dromara.main.domain.vo;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.main.domain.MainPostApply;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@AutoMapper(target = MainPostApply.class)
+public class MainPostApplyVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @ExcelProperty(value = "申请ID")
+    private Long id;
+
+    @ExcelProperty(value = "申请编号")
+    private String applyNo;
+
+    @ExcelProperty(value = "租户ID")
+    private String tenantId;
+
+    @ExcelProperty(value = "岗位名称")
+    private String postName;
+
+    @ExcelProperty(value = "公司名称")
+    private String companyName;
+
+    @ExcelProperty(value = "岗位描述")
+    private String postDescription;
+
+    @ExcelProperty(value = "工作省份")
+    private String workProvince;
+
+    @ExcelProperty(value = "工作城市")
+    private String workCity;
+
+    @ExcelProperty(value = "工作区县")
+    private String workDistrict;
+
+    @ExcelProperty(value = "工作地址")
+    private String workAddress;
+
+    @ExcelProperty(value = "岗位类型")
+    private String postType;
+
+    @ExcelProperty(value = "学历要求")
+    private String educationRequirement;
+
+    @ExcelProperty(value = "薪资类型")
+    private String salaryType;
+
+    @ExcelProperty(value = "薪资范围")
+    private String salaryRange;
+
+    @ExcelProperty(value = "招聘人数")
+    private Integer recruitNum;
+
+    @ExcelProperty(value = "报名开始时间")
+    private Date registrationStartDate;
+
+    @ExcelProperty(value = "报名结束时间")
+    private Date registrationEndDate;
+
+    @ExcelProperty(value = "是否急招")
+    private Integer isUrgent;
+
+    @ExcelProperty(value = "学校要求")
+    private String schoolRequirement;
+
+    @ExcelProperty(value = "性别要求")
+    private String genderRequirement;
+
+    @ExcelProperty(value = "年级要求")
+    private String gradeRequirement;
+
+    @ExcelProperty(value = "到岗时间")
+    private String arrivalTime;
+
+    @ExcelProperty(value = "实习时长")
+    private String internshipDuration;
+
+    @ExcelProperty(value = "是否愿意出差")
+    private Integer willingToTravel;
+
+    @ExcelProperty(value = "福利标签")
+    private String welfareTags;
+
+    @ExcelProperty(value = "岗位要求")
+    private String jobRequirement;
+
+    @ExcelProperty(value = "岗位等级")
+    private String postLevel;
+
+    @ExcelProperty(value = "测评时长")
+    private String assessmentTime;
+
+    @ExcelProperty(value = "能力A及格分")
+    private BigDecimal gradeA;
+
+    @ExcelProperty(value = "能力B及格分")
+    private BigDecimal gradeB;
+
+    @ExcelProperty(value = "能力C及格分")
+    private BigDecimal gradeC;
+
+    @ExcelProperty(value = "申请状态")
+    private Integer applyStatus;
+
+    @ExcelProperty(value = "审核ID")
+    private Long auditId;
+
+    @ExcelProperty(value = "岗位ID")
+    private Long postId;
+
+    @ExcelProperty(value = "驳回原因")
+    private String rejectReason;
+
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+}

+ 29 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainStudentVo.java

@@ -0,0 +1,29 @@
+package org.dromara.main.domain.vo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.main.domain.MainStudent;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@AutoMapper(target = MainStudent.class)
+public class MainStudentVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+    private String name;
+    private String mobile;
+    private String idCardNumber;
+    private String uniqueCode;
+    private String gender;
+    private Long avatar;
+    private String status;
+    private String tenantId;
+    private LocalDateTime createTime;
+    private LocalDateTime updateTime;
+}

+ 29 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainAuditMapper.java

@@ -0,0 +1,29 @@
+package org.dromara.main.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.main.domain.MainAudit;
+import org.dromara.main.domain.vo.MainAuditVo;
+
+import java.util.List;
+
+public interface MainAuditMapper extends BaseMapperPlus<MainAudit, MainAuditVo> {
+    /**
+     * 分页查询审核详情(包含企业或岗位信息)
+     */
+    IPage<MainAuditVo> selectAuditDetailPage(Page<MainAuditVo> page, @Param(Constants.WRAPPER) Wrapper<MainAudit> queryWrapper);
+
+    /**
+     * 查询审核详情列表(包含企业或岗位信息)
+     */
+    List<MainAuditVo> selectAuditDetailList(@Param(Constants.WRAPPER) Wrapper<MainAudit> queryWrapper);
+
+    /**
+     * 根据ID查询审核详情(包含企业或岗位信息)
+     */
+    MainAuditVo selectAuditDetailById(@Param("id") Long id);
+}

+ 8 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainBackCandidateMapper.java

@@ -0,0 +1,8 @@
+package org.dromara.main.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.main.domain.MainBackCandidate;
+import org.dromara.main.domain.vo.MainBackCandidateVo;
+
+public interface MainBackCandidateMapper extends BaseMapperPlus<MainBackCandidate, MainBackCandidateVo> {
+}

+ 8 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainBackCategoryMapper.java

@@ -0,0 +1,8 @@
+package org.dromara.main.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.main.domain.MainBackCategory;
+import org.dromara.main.domain.vo.MainBackCategoryVo;
+
+public interface MainBackCategoryMapper extends BaseMapperPlus<MainBackCategory, MainBackCategoryVo> {
+}

+ 8 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainBackClauseMapper.java

@@ -0,0 +1,8 @@
+package org.dromara.main.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.main.domain.MainBackClause;
+import org.dromara.main.domain.vo.MainBackClauseVo;
+
+public interface MainBackClauseMapper extends BaseMapperPlus<MainBackClause, MainBackClauseVo> {
+}

+ 8 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainBackOrderMapper.java

@@ -0,0 +1,8 @@
+package org.dromara.main.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.main.domain.MainBackOrder;
+import org.dromara.main.domain.vo.MainBackOrderVo;
+
+public interface MainBackOrderMapper extends BaseMapperPlus<MainBackOrder, MainBackOrderVo> {
+}

+ 8 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainBackRecordMapper.java

@@ -0,0 +1,8 @@
+package org.dromara.main.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.main.domain.MainBackRecord;
+import org.dromara.main.domain.vo.MainBackRecordVo;
+
+public interface MainBackRecordMapper extends BaseMapperPlus< MainBackRecord, MainBackRecordVo> {
+}

+ 8 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainCompanyApplyMapper.java

@@ -0,0 +1,8 @@
+package org.dromara.main.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.main.domain.MainCompanyApply;
+import org.dromara.main.domain.vo.MainCompanyApplyVo;
+
+public interface MainCompanyApplyMapper extends BaseMapperPlus<MainCompanyApply, MainCompanyApplyVo> {
+}

+ 8 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainPostApplyMapper.java

@@ -0,0 +1,8 @@
+package org.dromara.main.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.main.domain.MainPostApply;
+import org.dromara.main.domain.vo.MainPostApplyVo;
+
+public interface MainPostApplyMapper extends BaseMapperPlus<MainPostApply, MainPostApplyVo> {
+}

+ 8 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainStudentMapper.java

@@ -0,0 +1,8 @@
+package org.dromara.main.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.main.domain.MainStudent;
+import org.dromara.main.domain.vo.MainStudentVo;
+
+public interface MainStudentMapper extends BaseMapperPlus<MainStudent, MainStudentVo> {
+}

+ 45 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainAuditService.java

@@ -0,0 +1,45 @@
+package org.dromara.main.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.bo.MainAuditBo;
+import org.dromara.main.domain.vo.MainAuditVo;
+
+import java.util.Collection;
+import java.util.List;
+
+public interface IMainAuditService {
+
+    /** 查询审核列表(基础) */
+    TableDataInfo<MainAuditVo> queryPageList(MainAuditBo bo, PageQuery pageQuery);
+
+    /** 查询审核详情列表(包含企业/岗位信息) */
+    TableDataInfo<MainAuditVo> queryDetailPageList(MainAuditBo bo, PageQuery pageQuery);
+
+    /** 查询审核列表 */
+    List<MainAuditVo> queryList(MainAuditBo bo);
+
+    /** 查询审核详情列表 */
+    List<MainAuditVo> queryDetailList(MainAuditBo bo);
+
+    /** 查询详细信息 */
+    MainAuditVo queryById(Long id);
+
+    /** 查询详细信息(包含企业/岗位信息) */
+    MainAuditVo queryDetailById(Long id);
+
+    /** 新增审核 */
+    Boolean insertByBo(MainAuditBo bo);
+
+    /** 修改审核 */
+    Boolean updateByBo(MainAuditBo bo);
+
+    /** 批量删除 */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /** 审核通过 */
+    Boolean auditPass(Long id, String remark);
+
+    /** 审核驳回 */
+    Boolean auditReject(Long id, String remark);
+}

+ 14 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainBackCategoryService.java

@@ -0,0 +1,14 @@
+package org.dromara.main.service;
+
+import org.dromara.main.domain.bo.MainBackCategoryBo;
+import org.dromara.main.domain.vo.MainBackCategoryVo;
+
+import java.util.Collection;
+import java.util.List;
+
+public interface IMainBackCategoryService {
+    List<MainBackCategoryVo> queryList(MainBackCategoryBo bo);
+    Boolean insertByBo(MainBackCategoryBo bo);
+    Boolean updateByBo(MainBackCategoryBo bo);
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 42 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainBackClauseService.java

@@ -0,0 +1,42 @@
+package org.dromara.main.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.bo.MainBackClauseBo;
+import org.dromara.main.domain.vo.MainBackClauseVo;
+
+import java.util.Collection;
+import java.util.List;
+
+public interface IMainBackClauseService {
+
+    /**
+     * 查询背调条款分页列表
+     */
+    TableDataInfo<MainBackClauseVo> queryPageList(MainBackClauseBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询背调条款列表
+     */
+    List<MainBackClauseVo> queryList(MainBackClauseBo bo);
+
+    /**
+     * 查询背调条款详细信息
+     */
+    MainBackClauseVo queryById(Long id);
+
+    /**
+     * 新增背调条款
+     */
+    Boolean insertByBo(MainBackClauseBo bo);
+
+    /**
+     * 修改背调条款
+     */
+    Boolean updateByBo(MainBackClauseBo bo);
+
+    /**
+     * 校验并批量删除背调条款信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 17 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainBackOrderService.java

@@ -0,0 +1,17 @@
+package org.dromara.main.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.bo.MainBackOrderBo;
+import org.dromara.main.domain.vo.MainBackOrderVo;
+
+/**
+ * 背调订单Service接口
+ */
+public interface IMainBackOrderService {
+
+    /**
+     * 查询背调订单分页列表
+     */
+    TableDataInfo<MainBackOrderVo> queryPageList(MainBackOrderBo bo, PageQuery pageQuery);
+}

+ 17 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainBackRecordService.java

@@ -0,0 +1,17 @@
+package org.dromara.main.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.bo.MainBackRecordBo;
+import org.dromara.main.domain.vo.MainBackRecordVo;
+
+/**
+ * 背调执行记录Service接口
+ */
+public interface IMainBackRecordService {
+
+    /**
+     * 查询背调执行记录分页列表(候选人列表)
+     */
+    TableDataInfo<MainBackRecordVo> queryPageList(Long orderId, MainBackRecordBo bo, PageQuery pageQuery);
+}

+ 24 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainCompanyApplyService.java

@@ -0,0 +1,24 @@
+package org.dromara.main.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.bo.MainCompanyApplyBo;
+import org.dromara.main.domain.vo.MainCompanyApplyVo;
+
+import java.util.Collection;
+import java.util.List;
+
+public interface IMainCompanyApplyService {
+
+    TableDataInfo<MainCompanyApplyVo> queryPageList(MainCompanyApplyBo bo, PageQuery pageQuery);
+
+    List<MainCompanyApplyVo> queryList(MainCompanyApplyBo bo);
+
+    MainCompanyApplyVo queryById(Long id);
+
+    Boolean insertByBo(MainCompanyApplyBo bo);
+
+    Boolean updateByBo(MainCompanyApplyBo bo);
+
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 24 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainPostApplyService.java

@@ -0,0 +1,24 @@
+package org.dromara.main.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.bo.MainPostApplyBo;
+import org.dromara.main.domain.vo.MainPostApplyVo;
+
+import java.util.Collection;
+import java.util.List;
+
+public interface IMainPostApplyService {
+
+    TableDataInfo<MainPostApplyVo> queryPageList(MainPostApplyBo bo, PageQuery pageQuery);
+
+    List<MainPostApplyVo> queryList(MainPostApplyBo bo);
+
+    MainPostApplyVo queryById(Long id);
+
+    Boolean insertByBo(MainPostApplyBo bo);
+
+    Boolean updateByBo(MainPostApplyBo bo);
+
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 273 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainAuditServiceImpl.java

@@ -0,0 +1,273 @@
+package org.dromara.main.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.main.domain.MainAudit;
+import org.dromara.main.domain.MainCompanyApply;
+import org.dromara.main.domain.MainPostApply;
+import org.dromara.main.domain.bo.MainAuditBo;
+import org.dromara.main.domain.vo.MainAuditVo;
+import org.dromara.main.mapper.MainAuditMapper;
+import org.dromara.main.mapper.MainCompanyApplyMapper;
+import org.dromara.main.mapper.MainPostApplyMapper;
+import org.dromara.main.service.IMainAuditService;
+import org.dromara.system.domain.bo.SysPostBo;
+import org.dromara.system.domain.bo.SysTenantBo;
+import org.dromara.system.service.ISysPostService;
+import org.dromara.system.service.ISysTenantService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+import static org.dromara.common.mybatis.core.mapper.BaseMapperPlus.log;
+
+@RequiredArgsConstructor
+@Service
+public class MainAuditServiceImpl implements IMainAuditService {
+
+    private final MainAuditMapper baseMapper;
+    private final MainCompanyApplyMapper companyApplyMapper;
+    private final MainPostApplyMapper postApplyMapper;
+    private final ISysTenantService tenantService;
+    private final ISysPostService sysPostService;
+    @Override
+    public TableDataInfo<MainAuditVo> queryPageList(MainAuditBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<MainAudit> lqw = buildQueryWrapper(bo);
+        Page<MainAuditVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public TableDataInfo<MainAuditVo> queryDetailPageList(MainAuditBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<MainAudit> lqw = buildQueryWrapper(bo);
+        Page<MainAuditVo> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
+        IPage<MainAuditVo> result = baseMapper.selectAuditDetailPage(page, lqw);
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public List<MainAuditVo> queryList(MainAuditBo bo) {
+        LambdaQueryWrapper<MainAudit> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    @Override
+    public List<MainAuditVo> queryDetailList(MainAuditBo bo) {
+        LambdaQueryWrapper<MainAudit> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectAuditDetailList(lqw);
+    }
+
+    @Override
+    public MainAuditVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    @Override
+    public MainAuditVo queryDetailById(Long id) {
+        return baseMapper.selectAuditDetailById(id);
+    }
+
+    @Override
+    public Boolean insertByBo(MainAuditBo bo) {
+        MainAudit add = MapstructUtils.convert(bo, MainAudit.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean updateByBo(MainAuditBo bo) {
+        MainAudit update = MapstructUtils.convert(bo, MainAudit.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean auditPass(Long id, String remark) {
+        MainAudit audit = baseMapper.selectById(id);
+        if (audit == null) {
+            return false;
+        }
+
+        // 更新审核状态
+        audit.setAuditResult(1);
+        audit.setAuditRemark(remark);
+        audit.setAuditTime(new Date());
+        audit.setAuditBy(LoginHelper.getUserId());
+        boolean updateSuccess = baseMapper.updateById(audit) > 0;
+
+        if (!updateSuccess) {
+            return false;
+        }
+
+        // 根据审核类型同步数据
+        try {
+            if (audit.getAuditType() == 1) {
+                // 企业审核通过 - 同步到 sys_tenant 表
+                syncCompanyToTenant(audit.getTargetId());
+            } else if (audit.getAuditType() == 2) {
+                // 岗位审核通过 - 保存到 main_post_apply 表(标记为已通过)
+                syncPostApplyToSysPost(audit.getTargetId());
+            }
+        } catch (Exception e) {
+            log.error("审核通过后数据同步失败", e);
+            throw new ServiceException("审核通过后数据同步失败:" + e.getMessage());
+        }
+
+        return true;
+    }
+
+    /**
+     * 将企业申请数据同步到租户表
+     */
+    /**
+     * 将企业申请数据同步到租户表
+     */
+    private void syncCompanyToTenant(Long applyId) {
+        // 1. 查询企业申请信息
+        MainCompanyApply companyApply = companyApplyMapper.selectById(applyId);
+        if (companyApply == null) {
+            throw new ServiceException("企业申请信息不存在");
+        }
+
+        // 2. 检查是否已经同步过(避免重复)
+        if (StringUtils.isNotBlank(companyApply.getTenantId())) {
+            return; // 已经有租户ID,说明已同步过
+        }
+
+        // 3. 构建租户对象
+        SysTenantBo tenantBo = new SysTenantBo();
+        tenantBo.setCompanyName(companyApply.getCompanyName());
+        tenantBo.setLicenseNumber(companyApply.getCreditCode());
+        tenantBo.setAddress(companyApply.getOfficeAddress());
+        tenantBo.setContactUserName(companyApply.getSurname() + companyApply.getName());
+        tenantBo.setContactPhone(companyApply.getMobile());
+        // tenantBo.setCompanyEntrustProof(companyApply.getAuthLetter()); // 暂时注释
+        tenantBo.setLogo(companyApply.getAvatar());
+        tenantBo.setStatus("0"); // 正常状态
+
+        // 必需字段:创建系统用户的用户名和密码
+        tenantBo.setUsername(companyApply.getMobile()); // 使用手机号作为用户名
+        tenantBo.setPassword("666666"); // 设置默认密码
+        tenantBo.setEmail(companyApply.getOfficialAccount()); // 设置邮箱
+
+        // 4. 创建租户
+        Boolean success = tenantService.insertByBo(tenantBo);
+        if (!success) {
+            throw new ServiceException("创建租户失败");
+        }
+
+        // 5. 更新企业申请表的 tenant_id 和 apply_status
+        companyApply.setTenantId(tenantBo.getTenantId());
+        companyApply.setApplyStatus(2); // 已通过
+        companyApplyMapper.updateById(companyApply);
+    }
+
+    /**
+     * 将岗位申请标记为已通过
+     */
+    /**
+     * 将岗位申请数据同步到 sys_post 表
+     */
+    private void syncPostApplyToSysPost(Long applyId) {
+        // 1. 查询岗位申请信息
+        MainPostApply postApply = postApplyMapper.selectById(applyId);
+        if (postApply == null) {
+            throw new ServiceException("岗位申请信息不存在");
+        }
+
+        // 2. 检查是否已经同步过(避免重复)
+        if (postApply.getPostId() != null) {
+            return; // 已经有岗位ID,说明已同步过
+        }
+
+        // 3. 构建岗位对象
+        SysPostBo postBo = new SysPostBo();
+        postBo.setPostName(postApply.getPostName());
+        postBo.setPostCode(postApply.getApplyNo()); // 使用申请编号作为岗位编码
+        postBo.setPostCategory("1"); // 可根据需要设置岗位类别
+        postBo.setPostSort(0); // 默认排序
+        postBo.setStatus("0"); // 正常状态
+        postBo.setRemark(postApply.getPostDescription()); // 将岗位描述作为备注
+        postBo.setTenantId(postApply.getTenantId()); // 设置租户ID
+        postBo.setDeptId(100L);   //默认部门ID
+        // 4. 创建岗位
+        int result = sysPostService.insertPost(postBo);
+        if (result <= 0) {
+            throw new ServiceException("创建岗位失败");
+        }
+
+        // 5. 更新岗位申请表的 post_id 和 apply_status
+        postApply.setPostId(postBo.getPostId()); // 获取新创建的岗位ID
+        postApply.setApplyStatus(2); // 已通过
+        postApplyMapper.updateById(postApply);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean auditReject(Long id, String remark) {
+        MainAudit audit = baseMapper.selectById(id);
+        if (audit == null) {
+            return false;
+        }
+
+        audit.setAuditResult(2);
+        audit.setAuditRemark(remark);
+        audit.setAuditTime(new Date());
+        audit.setAuditBy(LoginHelper.getUserId());
+
+        // 更新申请表的拒绝原因
+        if (audit.getAuditType() == 1) {
+            MainCompanyApply companyApply = companyApplyMapper.selectById(audit.getTargetId());
+            if (companyApply != null) {
+                companyApply.setApplyStatus(3); // 已驳回
+                companyApply.setRejectReason(remark);
+                companyApplyMapper.updateById(companyApply);
+            }
+        } else if (audit.getAuditType() == 2) {
+            MainPostApply postApply = postApplyMapper.selectById(audit.getTargetId());
+            if (postApply != null) {
+                postApply.setApplyStatus(3); // 已驳回
+                postApply.setRejectReason(remark);
+                postApplyMapper.updateById(postApply);
+            }
+        }
+
+        return baseMapper.updateById(audit) > 0;
+    }
+
+    private LambdaQueryWrapper<MainAudit> buildQueryWrapper(MainAuditBo bo) {
+        LambdaQueryWrapper<MainAudit> lqw = Wrappers.lambdaQuery();
+        lqw.eq(ObjectUtil.isNotNull(bo.getAuditType()), MainAudit::getAuditType, bo.getAuditType());
+        lqw.eq(ObjectUtil.isNotNull(bo.getTargetId()), MainAudit::getTargetId, bo.getTargetId());
+        lqw.eq(ObjectUtil.isNotNull(bo.getAuditResult()), MainAudit::getAuditResult, bo.getAuditResult());
+        lqw.orderByDesc(MainAudit::getCreateTime);
+        return lqw;
+    }
+
+    private void validEntityBeforeSave(MainAudit entity) {
+    }
+}

+ 48 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainBackCategoryServiceImpl.java

@@ -0,0 +1,48 @@
+package org.dromara.main.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.main.domain.MainBackCategory;
+import org.dromara.main.domain.bo.MainBackCategoryBo;
+import org.dromara.main.domain.vo.MainBackCategoryVo;
+import org.dromara.main.mapper.MainBackCategoryMapper;
+import org.dromara.main.service.IMainBackCategoryService;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+
+@RequiredArgsConstructor
+@Service
+public class MainBackCategoryServiceImpl implements IMainBackCategoryService {
+
+    private final MainBackCategoryMapper baseMapper;
+
+    @Override
+    public List<MainBackCategoryVo> queryList(MainBackCategoryBo bo) {
+        LambdaQueryWrapper<MainBackCategory> lqw = Wrappers.lambdaQuery();
+        lqw.like(ObjectUtil.isNotNull(bo.getName()), MainBackCategory::getName, bo.getName());
+        lqw.eq(ObjectUtil.isNotNull(bo.getStatus()), MainBackCategory::getStatus, bo.getStatus());
+        return baseMapper.selectVoList(lqw);
+    }
+
+    @Override
+    public Boolean insertByBo(MainBackCategoryBo bo) {
+        MainBackCategory add = MapstructUtils.convert(bo, MainBackCategory.class);
+        return baseMapper.insert(add) > 0;
+    }
+
+    @Override
+    public Boolean updateByBo(MainBackCategoryBo bo) {
+        MainBackCategory update = MapstructUtils.convert(bo, MainBackCategory.class);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 104 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainBackClauseServiceImpl.java

@@ -0,0 +1,104 @@
+package org.dromara.main.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.MainBackClause;
+import org.dromara.main.domain.bo.MainBackClauseBo;
+import org.dromara.main.domain.vo.MainBackClauseVo;
+import org.dromara.main.mapper.MainBackClauseMapper;
+import org.dromara.main.service.IMainBackClauseService;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+
+@RequiredArgsConstructor
+@Service
+public class MainBackClauseServiceImpl implements IMainBackClauseService {
+
+    private final MainBackClauseMapper baseMapper;
+
+    /**
+     * 查询背调条款分页列表
+     */
+    @Override
+    public TableDataInfo<MainBackClauseVo> queryPageList(MainBackClauseBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<MainBackClause> lqw = buildQueryWrapper(bo);
+        Page<MainBackClauseVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询背调条款列表
+     */
+    @Override
+    public List<MainBackClauseVo> queryList(MainBackClauseBo bo) {
+        LambdaQueryWrapper<MainBackClause> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    /**
+     * 构建查询包装器
+     */
+    private LambdaQueryWrapper<MainBackClause> buildQueryWrapper(MainBackClauseBo bo) {
+        LambdaQueryWrapper<MainBackClause> lqw = Wrappers.lambdaQuery();
+        // 关键:根据所属分类 ID 过滤
+        lqw.eq(ObjectUtil.isNotNull(bo.getCategoryId()), MainBackClause::getCategoryId, bo.getCategoryId());
+        // 模糊查询条款名称
+        lqw.like(ObjectUtil.isNotEmpty(bo.getName()), MainBackClause::getName, bo.getName());
+        // 根据类型过滤
+        lqw.eq(ObjectUtil.isNotEmpty(bo.getType()), MainBackClause::getType, bo.getType());
+        // 根据状态过滤
+        lqw.eq(ObjectUtil.isNotEmpty(bo.getStatus()), MainBackClause::getStatus, bo.getStatus());
+        // 默认按 ID 倒序
+        lqw.orderByDesc(MainBackClause::getId);
+        return lqw;
+    }
+
+    /**
+     * 查询详细信息
+     */
+    @Override
+    public MainBackClauseVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 新增
+     */
+    @Override
+    public Boolean insertByBo(MainBackClauseBo bo) {
+        MainBackClause add = MapstructUtils.convert(bo, MainBackClause.class);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改
+     */
+    @Override
+    public Boolean updateByBo(MainBackClauseBo bo) {
+        MainBackClause update = MapstructUtils.convert(bo, MainBackClause.class);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 批量删除
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            // 这里可以添加删除前的业务校验逻辑
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 83 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainBackOrderServiceImpl.java

@@ -0,0 +1,83 @@
+package org.dromara.main.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.MainBackOrder;
+import org.dromara.main.domain.MainBackRecord;
+import org.dromara.main.domain.bo.MainBackOrderBo;
+import org.dromara.main.domain.vo.MainBackOrderVo;
+import org.dromara.main.mapper.MainBackOrderMapper;
+import org.dromara.main.mapper.MainBackRecordMapper;
+import org.dromara.main.service.IMainBackOrderService;
+import org.dromara.system.domain.bo.SysTenantBo;
+import org.dromara.system.domain.vo.SysTenantVo;
+import org.dromara.system.service.ISysTenantService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RequiredArgsConstructor
+@Service
+public class MainBackOrderServiceImpl implements IMainBackOrderService {
+
+    private final MainBackOrderMapper baseMapper;
+    private final MainBackRecordMapper recordMapper;
+    private final ISysTenantService tenantService;
+
+    @Override
+    public TableDataInfo<MainBackOrderVo> queryPageList(MainBackOrderBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<MainBackOrder> lqw = new LambdaQueryWrapper<>();
+
+        // 1. 左侧分类过滤
+        lqw.eq(bo.getCategoryId() != null, MainBackOrder::getCategoryId, bo.getCategoryId());
+
+        // 2. 状态过滤
+        lqw.eq(StrUtil.isNotBlank(bo.getStatus()), MainBackOrder::getStatus, bo.getStatus());
+
+        // 3. 右侧单位名称搜索逻辑
+        if (StrUtil.isNotBlank(bo.getKeyword())) {
+            // 通过单位名称模糊查询租户ID列表
+            SysTenantBo tenantBo = new SysTenantBo();
+            tenantBo.setCompanyName(bo.getKeyword());
+            List<String> tenantIds = tenantService.queryList(tenantBo)
+                .stream()
+                .map(SysTenantVo::getTenantId)
+                .toList();
+
+            if (tenantIds.isEmpty()) {
+                return TableDataInfo.build(new ArrayList<>());
+            }
+            lqw.in(MainBackOrder::getTenantId, tenantIds);
+        }
+
+        // 4. 分页查询订单主表
+        Page<MainBackOrderVo> pageResult = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        TableDataInfo<MainBackOrderVo> result = TableDataInfo.build(pageResult);
+
+        // 5. 动态填充页面所需字段
+        for (MainBackOrderVo vo : result.getRows()) {
+            // A. 统计候选人人数
+            Long count = recordMapper.selectCount(
+                new LambdaQueryWrapper<MainBackRecord>()
+                    .eq(MainBackRecord::getOrderId, vo.getId())
+            );
+            vo.setCandidateCount(count);
+
+            // B. 填充企业名称
+            SysTenantVo tenant = tenantService.queryByTenantId(vo.getTenantId());
+            if (tenant != null) {
+                vo.setCompanyName(tenant.getCompanyName());
+            }
+        }
+
+        return result;
+    }
+}
+
+

+ 66 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainBackRecordServiceImpl.java

@@ -0,0 +1,66 @@
+package org.dromara.main.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.MainBackCandidate;
+import org.dromara.main.domain.MainBackRecord;
+import org.dromara.main.domain.MainStudent;
+import org.dromara.main.domain.bo.MainBackRecordBo;
+import org.dromara.main.domain.vo.MainBackRecordVo;
+import org.dromara.main.mapper.MainBackCandidateMapper;
+import org.dromara.main.mapper.MainBackRecordMapper;
+import org.dromara.main.mapper.MainStudentMapper;
+import org.dromara.main.service.IMainBackRecordService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 背调执行记录Service业务层处理
+ */
+@RequiredArgsConstructor
+@Service
+public class MainBackRecordServiceImpl implements IMainBackRecordService {
+
+    private final MainBackRecordMapper baseMapper;
+    private final MainStudentMapper studentMapper;
+    private final MainBackCandidateMapper candidateMapper;
+
+
+    @Override
+    public TableDataInfo<MainBackRecordVo> queryPageList(Long orderId, MainBackRecordBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<MainBackRecord> lqw = new LambdaQueryWrapper<>();
+
+        // 1. 按订单ID过滤
+        lqw.eq(orderId != null, MainBackRecord::getOrderId, orderId);
+
+        // 2. 按状态过滤
+        lqw.eq(StrUtil.isNotBlank(bo.getStatus()), MainBackRecord::getStatus, bo.getStatus());
+
+        // 3. 分页查询
+        Page<MainBackRecordVo> pageResult = baseMapper.selectVoPage(pageQuery.build(), lqw);
+
+        TableDataInfo<MainBackRecordVo> result= TableDataInfo.build(pageResult);
+
+        for (MainBackRecordVo vo : result.getRows()) {
+            // 1. 先查询 main_candidate 表
+            MainBackCandidate candidate = candidateMapper.selectById(vo.getCandidateId());
+
+            if (candidate != null) {
+                // 2. 再通过 student_id 查询 main_student 表
+                MainStudent student = studentMapper.selectById(candidate.getStudentId());
+                if (student != null) {
+                    vo.setStudentName(student.getName());
+                    vo.setStudentMobile(student.getMobile());
+                    vo.setStudentIdCard(student.getIdCardNumber());
+                    vo.setStudentGender(student.getGender());
+                    vo.setStudentStatus(student.getStatus());
+                }
+            }
+        }
+
+        return result;
+    }
+}

+ 81 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainCompanyApplyServiceImpl.java

@@ -0,0 +1,81 @@
+package org.dromara.main.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.MainCompanyApply;
+import org.dromara.main.domain.bo.MainCompanyApplyBo;
+import org.dromara.main.domain.vo.MainCompanyApplyVo;
+import org.dromara.main.mapper.MainCompanyApplyMapper;
+import org.dromara.main.service.IMainCompanyApplyService;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+
+@RequiredArgsConstructor
+@Service
+public class MainCompanyApplyServiceImpl implements IMainCompanyApplyService {
+
+    private final MainCompanyApplyMapper baseMapper;
+
+    @Override
+    public TableDataInfo<MainCompanyApplyVo> queryPageList(MainCompanyApplyBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<MainCompanyApply> lqw = buildQueryWrapper(bo);
+        Page<MainCompanyApplyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public List<MainCompanyApplyVo> queryList(MainCompanyApplyBo bo) {
+        LambdaQueryWrapper<MainCompanyApply> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    @Override
+    public MainCompanyApplyVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    @Override
+    public Boolean insertByBo(MainCompanyApplyBo bo) {
+        MainCompanyApply add = MapstructUtils.convert(bo, MainCompanyApply.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean updateByBo(MainCompanyApplyBo bo) {
+        MainCompanyApply update = MapstructUtils.convert(bo, MainCompanyApply.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    private LambdaQueryWrapper<MainCompanyApply> buildQueryWrapper(MainCompanyApplyBo bo) {
+        LambdaQueryWrapper<MainCompanyApply> lqw = Wrappers.lambdaQuery();
+        lqw.like(ObjectUtil.isNotNull(bo.getApplyNo()), MainCompanyApply::getApplyNo, bo.getApplyNo());
+        lqw.like(ObjectUtil.isNotNull(bo.getCompanyName()), MainCompanyApply::getCompanyName, bo.getCompanyName());
+        lqw.eq(ObjectUtil.isNotNull(bo.getCreditCode()), MainCompanyApply::getCreditCode, bo.getCreditCode());
+        lqw.eq(ObjectUtil.isNotNull(bo.getApplyStatus()), MainCompanyApply::getApplyStatus, bo.getApplyStatus());
+        lqw.eq(ObjectUtil.isNotNull(bo.getMobile()), MainCompanyApply::getMobile, bo.getMobile());
+        lqw.orderByDesc(MainCompanyApply::getCreateTime);
+        return lqw;
+    }
+
+    private void validEntityBeforeSave(MainCompanyApply entity) {
+    }
+}

+ 111 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainPostApplyServiceImpl.java

@@ -0,0 +1,111 @@
+package org.dromara.main.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.MainPostApply;
+import org.dromara.main.domain.bo.MainPostApplyBo;
+import org.dromara.main.domain.vo.MainPostApplyVo;
+import org.dromara.main.mapper.MainPostApplyMapper;
+import org.dromara.main.service.IMainPostApplyService;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Collection;
+import java.util.List;
+
+@RequiredArgsConstructor
+@Service
+public class MainPostApplyServiceImpl implements IMainPostApplyService {
+
+    private final MainPostApplyMapper baseMapper;
+
+    @Override
+    public TableDataInfo<MainPostApplyVo> queryPageList(MainPostApplyBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<MainPostApply> lqw = buildQueryWrapper(bo);
+        Page<MainPostApplyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public List<MainPostApplyVo> queryList(MainPostApplyBo bo) {
+        LambdaQueryWrapper<MainPostApply> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    @Override
+    public MainPostApplyVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    @Override
+    public Boolean insertByBo(MainPostApplyBo bo) {
+        MainPostApply add = MapstructUtils.convert(bo, MainPostApply.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean updateByBo(MainPostApplyBo bo) {
+        MainPostApply update = MapstructUtils.convert(bo, MainPostApply.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    private LambdaQueryWrapper<MainPostApply> buildQueryWrapper(MainPostApplyBo bo) {
+        LambdaQueryWrapper<MainPostApply> lqw = Wrappers.lambdaQuery();
+        lqw.like(ObjectUtil.isNotNull(bo.getApplyNo()), MainPostApply::getApplyNo, bo.getApplyNo());
+        lqw.eq(ObjectUtil.isNotNull(bo.getTenantId()), MainPostApply::getTenantId, bo.getTenantId());
+        lqw.like(ObjectUtil.isNotNull(bo.getPostName()), MainPostApply::getPostName, bo.getPostName());
+        lqw.like(ObjectUtil.isNotNull(bo.getCompanyName()), MainPostApply::getCompanyName, bo.getCompanyName());
+        lqw.eq(ObjectUtil.isNotNull(bo.getApplyStatus()), MainPostApply::getApplyStatus, bo.getApplyStatus());
+        lqw.eq(ObjectUtil.isNotNull(bo.getPostType()), MainPostApply::getPostType, bo.getPostType());
+        lqw.eq(ObjectUtil.isNotNull(bo.getIsUrgent()), MainPostApply::getIsUrgent, bo.getIsUrgent());
+        lqw.eq(ObjectUtil.isNotNull(bo.getPostLevel()), MainPostApply::getPostLevel, bo.getPostLevel());
+        lqw.eq(ObjectUtil.isNotNull(bo.getWorkCity()), MainPostApply::getWorkCity, bo.getWorkCity());
+        lqw.orderByDesc(MainPostApply::getCreateTime);
+        return lqw;
+    }
+
+    private void validEntityBeforeSave(MainPostApply entity) {
+        if (entity.getRegistrationStartDate() != null && entity.getRegistrationEndDate() != null) {
+            if (entity.getRegistrationStartDate().after(entity.getRegistrationEndDate())) {
+                throw new ServiceException("报名开始时间不能晚于结束时间");
+            }
+        }
+
+        if (entity.getRecruitNum() != null && entity.getRecruitNum() <= 0) {
+            throw new ServiceException("招聘人数必须大于0");
+        }
+
+        if (entity.getGradeA() != null && (entity.getGradeA().compareTo(BigDecimal.ZERO) < 0
+            || entity.getGradeA().compareTo(new BigDecimal("100")) > 0)) {
+            throw new ServiceException("能力A及格分必须在0-100之间");
+        }
+
+        if (entity.getGradeB() != null && (entity.getGradeB().compareTo(BigDecimal.ZERO) < 0
+            || entity.getGradeB().compareTo(new BigDecimal("100")) > 0)) {
+            throw new ServiceException("能力B及格分必须在0-100之间");
+        }
+
+        if (entity.getGradeC() != null && (entity.getGradeC().compareTo(BigDecimal.ZERO) < 0
+            || entity.getGradeC().compareTo(new BigDecimal("100")) > 0)) {
+            throw new ServiceException("能力C及格分必须在0-100之间");
+        }
+    }
+}

+ 159 - 0
ruoyi-modules/ruoyi-main/src/main/resources/mapper/MainAuditMapper.xml

@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.main.mapper.MainAuditMapper">
+
+    <resultMap type="org.dromara.main.domain.vo.MainAuditVo" id="AuditDetailResult">
+        <id     property="id"             column="id"              />
+        <result property="auditType"      column="audit_type"      />
+        <result property="targetId"       column="target_id"       />
+        <result property="auditResult"    column="audit_result"    />
+        <result property="auditRemark"    column="audit_remark"    />
+        <result property="deposit"        column="deposit"         />
+        <result property="finalPayment"   column="final_payment"   />
+        <result property="auditTime"      column="audit_time"      />
+        <result property="auditBy"        column="audit_by"        />
+        <result property="tenantId"       column="tenant_id"       />
+        <result property="createTime"     column="create_time"     />
+
+        <result property="applyNo"        column="apply_no"        />
+        <result property="companyName"    column="company_name"    />
+        <result property="officialAccount" column="official_account" />
+        <result property="officeAddress"  column="office_address"  />
+        <result property="creditCode"     column="credit_code"     />
+        <result property="authLetter"     column="auth_letter"     />
+        <result property="mobile"         column="mobile"          />
+        <result property="surname"        column="surname"         />
+        <result property="name"           column="name"            />
+        <result property="avatar"         column="avatar"          />
+        <result property="applyCreateTime" column="apply_create_time" />
+        <result property="auditByName"    column="audit_by_name"   />
+
+        <result property="postName"       column="post_name"       />
+        <result property="postDescription" column="post_description" />
+        <result property="workProvince"   column="work_province"   />
+        <result property="workCity"       column="work_city"       />
+        <result property="workDistrict"   column="work_district"   />
+        <result property="workAddress"    column="work_address"    />
+        <result property="postType"       column="post_type"       />
+        <result property="educationRequirement" column="education_requirement" />
+        <result property="salaryType"     column="salary_type"     />
+        <result property="salaryRange"    column="salary_range"    />
+        <result property="recruitNum"     column="recruit_num"     />
+        <result property="registrationStartDate" column="registration_start_date" />
+        <result property="registrationEndDate" column="registration_end_date" />
+        <result property="isUrgent"       column="is_urgent"       />
+        <result property="schoolRequirement" column="school_requirement" />
+        <result property="genderRequirement" column="gender_requirement" />
+        <result property="gradeRequirement" column="grade_requirement" />
+        <result property="arrivalTime"    column="arrival_time"    />
+        <result property="internshipDuration" column="internship_duration" />
+        <result property="willingToTravel" column="willing_to_travel" />
+        <result property="welfareTags"    column="welfare_tags"    />
+        <result property="jobRequirement" column="job_requirement" />
+        <result property="postLevel"      column="post_level"      />
+        <result property="assessmentTime" column="assessment_time" />
+        <result property="gradeA"         column="grade_a"         />
+        <result property="gradeB"         column="grade_b"         />
+        <result property="gradeC"         column="grade_c"         />
+    </resultMap>
+
+    <sql id="selectAuditDetailVo">
+        SELECT
+            a.id,
+            a.audit_type,
+            a.target_id,
+            a.audit_result,
+            a.audit_remark,
+            a.deposit,
+            a.final_payment,
+            a.audit_time,
+            a.audit_by,
+            a.create_time,
+
+            CASE
+                WHEN a.audit_type = 1 THEN ca.tenant_id
+                WHEN a.audit_type = 2 THEN pa.tenant_id
+                ELSE a.tenant_id
+                END as tenant_id,
+
+            u.nick_name as audit_by_name,
+
+            ca.apply_no,
+            ca.official_account,
+            ca.office_address,
+            ca.credit_code,
+            ca.auth_letter,
+            ca.mobile,
+            ca.surname,
+            ca.name,
+            ca.avatar,
+            ca.create_time as apply_create_time,
+
+            pa.post_name,
+            pa.post_description,
+            pa.work_province,
+            pa.work_city,
+            pa.work_district,
+            pa.work_address,
+            pa.post_type,
+            pa.education_requirement,
+            pa.salary_type,
+            pa.salary_range,
+            pa.recruit_num,
+            pa.registration_start_date,
+            pa.registration_end_date,
+            pa.is_urgent,
+            pa.school_requirement,
+            pa.gender_requirement,
+            pa.grade_requirement,
+            pa.arrival_time,
+            pa.internship_duration,
+            pa.willing_to_travel,
+            pa.welfare_tags,
+            pa.job_requirement,
+            pa.post_level,
+            pa.assessment_time,
+            pa.grade_a,
+            pa.grade_b,
+            pa.grade_c,
+
+            CASE
+                WHEN a.audit_type = 1 THEN ca.company_name
+                WHEN a.audit_type = 2 THEN COALESCE(t.company_name, pa.company_name)
+                ELSE NULL
+                END as company_name
+
+        FROM main_audit a
+                 LEFT JOIN main_company_apply ca ON a.audit_type = 1 AND a.target_id = ca.id
+                 LEFT JOIN main_post_apply pa ON a.audit_type = 2 AND a.target_id = pa.id
+                 LEFT JOIN sys_tenant t ON (
+            (a.audit_type = 1 AND ca.tenant_id = t.tenant_id) OR
+            (a.audit_type = 2 AND pa.tenant_id = t.tenant_id)
+            )
+                 LEFT JOIN sys_user u ON a.audit_by = u.user_id
+    </sql>
+
+    <select id="selectAuditDetailPage" resultMap="AuditDetailResult">
+        <include refid="selectAuditDetailVo"/>
+        WHERE a.del_flag = '0'
+        <if test="ew != null and ew.sqlSegment != null and ew.sqlSegment != ''">
+            AND ${ew.sqlSegment}
+        </if>
+    </select>
+
+    <select id="selectAuditDetailList" resultMap="AuditDetailResult">
+        <include refid="selectAuditDetailVo"/>
+        WHERE a.del_flag = '0'
+        <if test="ew != null and ew.sqlSegment != null and ew.sqlSegment != ''">
+            AND ${ew.sqlSegment}
+        </if>
+    </select>
+
+    <select id="selectAuditDetailById" resultMap="AuditDetailResult">
+        <include refid="selectAuditDetailVo"/>
+        WHERE a.id = #{id} AND a.del_flag = '0'
+    </select>
+
+</mapper>

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTagController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.encrypt.annotation.ApiEncrypt;
 import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -53,6 +54,7 @@ public class SysTagController extends BaseController {
 
     @Log(title = "标签定义", businessType = BusinessType.UPDATE)
     @PutMapping
+    @ApiEncrypt
     public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysTagBo bo) {
         return toAjax(iSysTagService.updateByBo(bo));
     }

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java

@@ -105,5 +105,7 @@ public class SysTenant extends BaseEntity {
 
 //    企业logo
     private Long logo;
+
+    private String email;
 }
 

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java

@@ -73,7 +73,7 @@ public class SysPostBo extends BaseEntity {
     private String remark;
 
 
-    private Long tenantId;
+    private String tenantId;
 
     private Integer platformId;
 

+ 3 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java

@@ -116,11 +116,13 @@ public class SysTenantBo extends BaseEntity {
 
 
 //    企业委托证明
-     private String companyEntrustProof;
+     private Long companyEntrustProof;
 
     private Long userId;
     private String email;
     private String userName;
     private String nickName;
 
+    private Long logo;
+
 }

+ 19 - 3
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java

@@ -20,6 +20,7 @@ import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.encrypt.annotation.ApiEncrypt;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.platform.Platform;
@@ -299,17 +300,32 @@ public class SysTenantServiceImpl implements ISysTenantService {
     /**
      * 修改租户
      */
+    @ApiEncrypt  // 添加这个注解,用于解密前端传来的密码
     @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId")
     @Override
     public Boolean updateByBo(SysTenantBo bo) {
         SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class);
-        SysUser user=MapstructUtils.convert(bo, SysUser.class);
-
         tenant.setTenantId(null);
         tenant.setPackageId(null);
 
+        // 更新租户基本信息
+        boolean tenantUpdated = baseMapper.updateById(tenant) > 0;
+
+        // 更新用户信息
+        SysUser user = new SysUser();
+        user.setUserId(bo.getUserId());
+        user.setNickName(bo.getNickName());
+        user.setEmail(bo.getEmail());
+        user.setAvatar(bo.getAvatar());
+
+        // 只有当密码不为空时才更新密码,并进行加密
+        if (StringUtils.isNotBlank(bo.getPassword())) {
+            user.setPassword(BCrypt.hashpw(bo.getPassword()));
+        }
+
+        boolean userUpdated = userMapper.updateById(user) > 0;
 
-        return baseMapper.updateById(tenant) > 0 && userMapper.updateById(user)>0 ;
+        return tenantUpdated && userUpdated;
     }
 
     /**

+ 266 - 0
script/sql/main.sql

@@ -0,0 +1,266 @@
+-- ----------------------------
+-- 1. 背调分类表 (main_back_category)
+-- ----------------------------
+DROP TABLE IF EXISTS `main_back_category`;
+CREATE TABLE `main_back_category` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `name` varchar(255) NOT NULL COMMENT '分类名称',
+  `price` decimal(10, 2) DEFAULT '0.00' COMMENT '分类价格',
+  `status` char(1) DEFAULT '1' COMMENT '状态(0停用 1正常)',
+  `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='背调分类表';
+
+-- ----------------------------
+-- 2. 背调条款表 (main_back_clause)
+-- ----------------------------
+DROP TABLE IF EXISTS `main_back_clause`;
+CREATE TABLE `main_back_clause` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `category_id` bigint NOT NULL COMMENT '所属分类ID',
+  `name` varchar(255) NOT NULL COMMENT '条款名称',
+  `type` varchar(50) DEFAULT NULL COMMENT '条款类型(字典:sys_clause_type)',
+  `description` text COMMENT '条款描述',
+  `price` decimal(10,2) DEFAULT '0.00' COMMENT '条款单价',
+  `status` char(1) DEFAULT '1' COMMENT '状态(0停用 1正常)',
+  `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  PRIMARY KEY (`id`),
+  KEY `idx_category_id` (`category_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='背调条款表';
+
+-- ----------------------------
+-- 3. 学员个人信息表 (main_student)
+-- ----------------------------
+DROP TABLE IF EXISTS `main_student`;
+CREATE TABLE `main_student` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '学员ID',
+  `name` varchar(50) NOT NULL COMMENT '姓名',
+  `mobile` varchar(20) NOT NULL COMMENT '手机号',
+  `id_card_number` varchar(50) DEFAULT NULL COMMENT '证件号码',
+  `unique_code` varchar(32) NOT NULL COMMENT '背调/测评唯一码',
+  `gender` char(1) DEFAULT '0' COMMENT '性别(0男 1女 2未知)',
+  `avatar` bigint DEFAULT NULL COMMENT '头像URL',
+  `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+  `tenant_id` varchar(20) DEFAULT '000000' COMMENT '所属租户(默认平台)',
+  `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uk_mobile` (`mobile`),
+  UNIQUE KEY `uk_unique_code` (`unique_code`),
+  UNIQUE KEY `uk_id_card` (`id_card_number`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学员个人信息表';
+
+-- ----------------------------
+-- 4. 企业候选人关系表 (main_candidate)
+-- ----------------------------
+DROP TABLE IF EXISTS `main_candidate`;
+CREATE TABLE `main_candidate` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `tenant_id` varchar(20) NOT NULL COMMENT '所属租户(企业ID)',
+  `student_id` bigint NOT NULL COMMENT '关联学员ID',
+  `source` varchar(50) DEFAULT NULL COMMENT '来源渠道',
+  `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`),
+  KEY `idx_tenant_id` (`tenant_id`),
+  KEY `idx_student_id` (`student_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业候选人关系表';
+
+-- ----------------------------
+-- 5. 背调订单表 (main_back_order)
+-- ----------------------------
+DROP TABLE IF EXISTS `main_back_order`;
+CREATE TABLE `main_back_order` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `order_no` varchar(64) NOT NULL COMMENT '订单编号',
+  `tenant_id` varchar(20) NOT NULL COMMENT '下单租户(企业ID)',
+  `category_id` bigint DEFAULT NULL COMMENT '背调套餐ID',
+  `category_name` varchar(255) DEFAULT NULL COMMENT '套餐名称快照',
+  `total_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '订单金额',
+  `status` char(1) DEFAULT '0' COMMENT '订单状态(0待处理 1进行中 2已完成 3已退款)',
+  `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uk_order_no` (`order_no`),
+  KEY `idx_tenant_id` (`tenant_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='背调订单表';
+
+-- ----------------------------
+-- 6. 背调执行记录表 (main_back_record)
+-- ----------------------------
+DROP TABLE IF EXISTS `main_back_record`;
+CREATE TABLE `main_back_record` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务ID',
+  `order_id` bigint NOT NULL COMMENT '关联订单ID',
+  `candidate_id` bigint NOT NULL COMMENT '关联企业候选人ID',
+  `status` varchar(20) DEFAULT '未完成' COMMENT '状态(完成、未完成、失败)',
+  `report_url` varchar(500) DEFAULT NULL COMMENT '报告地址',
+  `finish_time` datetime DEFAULT NULL COMMENT '完成时间',
+  `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`),
+  KEY `idx_order_id` (`order_id`),
+  KEY `idx_candidate_id` (`candidate_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='背调执行记录表';
+
+-- ----------------------------
+-- 7. 企业入驻申请表 (main_company_apply)
+-- ----------------------------
+DROP TABLE IF EXISTS `main_company_apply`;
+CREATE TABLE `main_company_apply` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `apply_no` varchar(64) DEFAULT NULL COMMENT '申请编号',
+  `company_name` varchar(255) DEFAULT NULL COMMENT '企业名称',
+  `official_account` varchar(100) DEFAULT NULL COMMENT '公众号名称',
+  `office_address` varchar(500) DEFAULT NULL COMMENT '办公地址',
+  `credit_code` varchar(50) DEFAULT NULL COMMENT '统一社会信用代码',
+  `auth_letter` bigint DEFAULT NULL COMMENT '授权委托书(文件ID)',
+  `avatar` bigint DEFAULT NULL COMMENT '企业logo',
+  `surname` varchar(50) DEFAULT NULL COMMENT '联系人姓',
+  `name` varchar(50) DEFAULT NULL COMMENT '联系人名',
+  `mobile` varchar(20) DEFAULT NULL COMMENT '联系电话',
+  `apply_status` tinyint DEFAULT '0' COMMENT '申请状态(0待审核 1已通过 2已驳回)',
+  `audit_id` bigint DEFAULT NULL COMMENT '审核ID',
+  `tenant_id` varchar(64) DEFAULT NULL COMMENT '租户ID',
+  `reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因',
+  `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`),
+  KEY `idx_tenant_id` (`tenant_id`),
+  KEY `idx_apply_no` (`apply_no`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业入驻申请表';
+
+-- ----------------------------
+-- 8. 岗位发布申请表 (main_post_apply)
+-- ----------------------------
+DROP TABLE IF EXISTS `main_post_apply`;
+CREATE TABLE `main_post_apply` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `apply_no` varchar(64) DEFAULT NULL COMMENT '申请编号',
+  `tenant_id` varchar(64) DEFAULT NULL COMMENT '租户ID',
+  `post_name` varchar(255) DEFAULT NULL COMMENT '岗位名称',
+  `company_name` varchar(255) DEFAULT NULL COMMENT '公司名称',
+  `post_description` varchar(500) DEFAULT NULL COMMENT '岗位描述',
+  `work_province` varchar(100) DEFAULT NULL COMMENT '工作省份',
+  `work_city` varchar(100) DEFAULT NULL COMMENT '工作城市',
+  `work_district` varchar(100) DEFAULT NULL COMMENT '工作区县',
+  `work_address` varchar(500) DEFAULT NULL COMMENT '工作详细地址',
+  `post_type` varchar(50) DEFAULT NULL COMMENT '岗位类型(字典值)',
+  `education_requirement` varchar(50) DEFAULT NULL COMMENT '学历要求(字典值)',
+  `salary_type` varchar(50) DEFAULT NULL COMMENT '薪资类型(字典值)',
+  `salary_range` varchar(100) DEFAULT NULL COMMENT '薪资范围',
+  `recruit_num` int DEFAULT NULL COMMENT '招聘人数',
+  `registration_start_date` datetime DEFAULT NULL COMMENT '报名开始时间',
+  `registration_end_date` datetime DEFAULT NULL COMMENT '报名结束时间',
+  `is_urgent` tinyint(1) DEFAULT '0' COMMENT '是否急招',
+  `school_requirement` varchar(50) DEFAULT NULL COMMENT '学校要求(字典值)',
+  `gender_requirement` varchar(50) DEFAULT NULL COMMENT '性别要求(字典值)',
+  `grade_requirement` varchar(50) DEFAULT NULL COMMENT '年级要求(字典值)',
+  `arrival_time` varchar(50) DEFAULT NULL COMMENT '到岗时间(字典值)',
+  `internship_duration` varchar(50) DEFAULT NULL COMMENT '实习时长(字典值)',
+  `willing_to_travel` tinyint(1) DEFAULT '0' COMMENT '是否愿意出差',
+  `welfare_tags` varchar(500) DEFAULT NULL COMMENT '福利标签',
+  `job_requirement` text COMMENT '岗位要求',
+  `post_level` varchar(50) DEFAULT NULL COMMENT '岗位等级(字典值)',
+  `assessment_time` varchar(50) DEFAULT NULL COMMENT '测评时长(分钟)',
+  `grade_a` decimal(10,2) DEFAULT NULL COMMENT '能力A及格分',
+  `grade_b` decimal(10,2) DEFAULT NULL COMMENT '能力B及格分',
+  `grade_c` decimal(10,2) DEFAULT NULL COMMENT '能力C及格分',
+  `apply_status` tinyint DEFAULT '0' COMMENT '申请状态',
+  `audit_id` bigint DEFAULT NULL COMMENT '审核ID',
+  `post_id` bigint DEFAULT NULL COMMENT '对应已发布岗位ID',
+  `reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因',
+  `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`),
+  KEY `idx_tenant_id` (`tenant_id`),
+  KEY `idx_apply_no` (`apply_no`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='岗位发布申请表';
+
+-- ----------------------------
+-- 9. 审核记录表 (main_audit)
+-- ----------------------------
+DROP TABLE IF EXISTS `main_audit`;
+CREATE TABLE `main_audit` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `audit_type` tinyint DEFAULT NULL COMMENT '审核类型(1企业入驻 2岗位发布)',
+  `target_id` bigint DEFAULT NULL COMMENT '审核目标ID',
+  `audit_result` tinyint DEFAULT NULL COMMENT '审核结果(1通过 2驳回)',
+  `audit_remark` varchar(500) DEFAULT NULL COMMENT '审核备注',
+  `deposit` decimal(10,2) DEFAULT NULL COMMENT '保证金',
+  `final_payment` decimal(10,2) DEFAULT NULL COMMENT '尾款',
+  `audit_time` datetime DEFAULT NULL COMMENT '审核时间',
+  `audit_by` bigint DEFAULT NULL COMMENT '审核人ID',
+  `tenant_id` varchar(64) DEFAULT NULL COMMENT '租户ID',
+  `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`),
+  KEY `idx_tenant_id` (`tenant_id`),
+  KEY `idx_target_id` (`target_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审核记录表';
+
+-- ----------------------------
+-- 10. 字典数据
+-- ----------------------------
+-- 字典类型
+DELETE FROM `sys_dict_type` WHERE `dict_type` = 'sys_clause_type';
+INSERT INTO `sys_dict_type` (`dict_id`, `dict_name`, `dict_type`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) 
+VALUES (null, '背调条款类型', 'sys_clause_type', '0', 1, sysdate(), 1, sysdate(), '背调条款类型列表');
+
+-- 字典数据
+DELETE FROM `sys_dict_data` WHERE `dict_type` = 'sys_clause_type';
+INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) 
+VALUES (null, 1, '身份风险', '身份风险', 'sys_clause_type', '', 'primary', 'N', '0', 1, sysdate(), 1, sysdate(), '身份风险');
+
+INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) 
+VALUES (null, 2, '职业风险', '职业风险', 'sys_clause_type', '', 'warning', 'N', '0', 1, sysdate(), 1, sysdate(), '职业风险');
+
+INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) 
+VALUES (null, 3, '能力评估', '能力评估', 'sys_clause_type', '', 'success', 'N', '0', 1, sysdate(), 1, sysdate(), '能力评估');

+ 2 - 2
script/sql/sqlserver/sqlserver_ry_vue_5.X.sql

@@ -297,7 +297,7 @@ EXEC sys.sp_addextendedproperty
     'MS_Description', N'域名' ,
     'SCHEMA', N'dbo',
     'TABLE', N'sys_tenant',
-    'COLUMN', N'domain'
+    'COLUMN', N'domain
 GO
 EXEC sys.sp_addextendedproperty
     'MS_Description', N'备注' ,
@@ -3129,7 +3129,7 @@ EXEC sp_addextendedproperty
      'MS_Description', N'自定义域名',
      'SCHEMA', N'dbo',
      'TABLE', N'sys_oss_config',
-     'COLUMN', N'domain'
+     'COLUMN', N'domain
 GO
 EXEC sp_addextendedproperty
     'MS_Description', N'是否https(Y=是,N=否)',

+ 0 - 0
script/sql/新建 文本文档.txt