Răsfoiți Sursa

feat(main): 添加背调候选人和订单管理功能

- 在MainBackCandidate实体类中新增updateTime字段和Date导入
- 新增IMainBackCandidateService接口定义Offer管理方法
- 新增IMainOrderService接口定义订单管理CRUD方法
- 新增IMainStudentAppendixService接口定义学员附件管理方法
- 实现MainBackCandidateController提供学员Offer列表和接受/拒绝接口
- 实现MainOrderController提供订单管理的增删改查接口
- 实现MainBackCandidateServiceImpl处理Offer状态变更逻辑
- 实现MainOrderServiceImpl处理订单查询和扩展信息填充
- 新增学员简历附件相关实体类、BO、VO和映射器
- 实现MainStudentAppendixService处理附件上传限制和管理功能
- 添加订单管理中的权限控制和数据验证注解
西格玛许 6 zile în urmă
părinte
comite
4f278d799f
14 a modificat fișierele cu 842 adăugiri și 0 ștergeri
  1. 66 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainBackCandidateController.java
  2. 84 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainOrderController.java
  3. 55 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainStudentAppendixController.java
  4. 4 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainBackCandidate.java
  5. 55 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainStudentAppendix.java
  6. 45 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainStudentAppendixBo.java
  7. 56 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainStudentAppendixVo.java
  8. 15 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainStudentAppendixMapper.java
  9. 38 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainBackCandidateService.java
  10. 41 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainOrderService.java
  11. 31 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainStudentAppendixService.java
  12. 132 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainBackCandidateServiceImpl.java
  13. 153 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainOrderServiceImpl.java
  14. 67 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainStudentAppendixServiceImpl.java

+ 66 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainBackCandidateController.java

@@ -0,0 +1,66 @@
+package org.dromara.main.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.main.service.IMainBackCandidateService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 背调候选人Controller
+ * 主要处理学员端的Offer管理
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/main/backCandidate")
+public class MainBackCandidateController extends BaseController {
+
+    private final IMainBackCandidateService mainBackCandidateService;
+
+    /**
+     * 获取学员的Offer列表
+     */
+    @GetMapping("/offerList")
+    public R<List<Map<String, Object>>> offerList() {
+        Long studentId = LoginHelper.getUserId();
+        if (studentId == null) {
+            return R.fail("未登录");
+        }
+        List<Map<String, Object>> list = mainBackCandidateService.getStudentOfferList(studentId);
+        return R.ok(list);
+    }
+
+    /**
+     * 学员接受Offer
+     */
+    @PutMapping("/acceptOffer/{id}")
+    public R<Void> acceptOffer(@PathVariable Long id) {
+        Long studentId = LoginHelper.getUserId();
+        if (studentId == null) {
+            return R.fail("未登录");
+        }
+        Boolean result = mainBackCandidateService.acceptOffer(id, studentId);
+        return toAjax(result);
+    }
+
+    /**
+     * 学员拒绝Offer
+     */
+    @PutMapping("/rejectOffer/{id}")
+    public R<Void> rejectOffer(@PathVariable Long id) {
+        Long studentId = LoginHelper.getUserId();
+        if (studentId == null) {
+            return R.fail("未登录");
+        }
+        Boolean result = mainBackCandidateService.rejectOffer(id, studentId);
+        return toAjax(result);
+    }
+}

+ 84 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainOrderController.java

@@ -0,0 +1,84 @@
+package org.dromara.main.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+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.MainOrder;
+import org.dromara.main.service.IMainOrderService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 订单管理
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/main/order")
+public class MainOrderController extends BaseController {
+
+    private final IMainOrderService iMainOrderService;
+
+    /**
+     * 查询订单列表
+     */
+//    @SaCheckPermission("main:order:list")
+    @GetMapping("/list")
+    public TableDataInfo<MainOrder> list(MainOrder order, PageQuery pageQuery) {
+        return iMainOrderService.queryPageList(order, pageQuery);
+    }
+
+    /**
+     * 获取订单详细信息
+     *
+     * @param id 主键
+     */
+//    @SaCheckPermission("main:order:query")
+    @GetMapping("/{id}")
+    public R<MainOrder> getInfo(@PathVariable Long id) {
+        return R.ok(iMainOrderService.queryById(id));
+    }
+
+    /**
+     * 新增订单
+     */
+//    @SaCheckPermission("main:order:add")
+    @Log(title = "订单管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody MainOrder order) {
+        return toAjax(iMainOrderService.insert(order));
+    }
+
+    /**
+     * 修改订单
+     */
+//    @SaCheckPermission("main:order:edit")
+    @Log(title = "订单管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody MainOrder order) {
+        return toAjax(iMainOrderService.update(order));
+    }
+
+    /**
+     * 删除订单
+     *
+     * @param ids 主键串
+     */
+//    @SaCheckPermission("main:order:remove")
+    @Log(title = "订单管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable List<Long> ids) {
+        return toAjax(iMainOrderService.deleteWithValidByIds(ids, true));
+    }
+}

+ 55 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainStudentAppendixController.java

@@ -0,0 +1,55 @@
+package org.dromara.main.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.main.domain.bo.MainStudentAppendixBo;
+import org.dromara.main.domain.vo.MainStudentAppendixVo;
+import org.dromara.main.service.IMainStudentAppendixService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 学员简历附件控制器
+ *
+ * @author antigravity
+ * @date 2026-04-08
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/main/studentAppendix")
+public class MainStudentAppendixController extends BaseController {
+
+    private final IMainStudentAppendixService mainStudentAppendixService;
+
+    /**
+     * 查询学员简历附件列表
+     */
+    @SaIgnore
+    @GetMapping("/list")
+    public R<List<MainStudentAppendixVo>> list(@RequestParam Long studentId) {
+        return R.ok(mainStudentAppendixService.queryList(studentId));
+    }
+
+    /**
+     * 新增学员简历附件
+     */
+    @SaIgnore
+    @PostMapping("/add")
+    public R<Void> add(@RequestBody MainStudentAppendixBo bo) {
+        return toAjax(mainStudentAppendixService.insertByBo(bo));
+    }
+
+    /**
+     * 删除学员简历附件
+     */
+    @SaIgnore
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(mainStudentAppendixService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

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

@@ -7,6 +7,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 
+import java.util.Date;
+
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("main_back_candidate")
@@ -40,4 +42,6 @@ public class MainBackCandidate extends BaseEntity {
     private String studentStatus;
 
     private String remark;
+
+    private Date updateTime;
 }

+ 55 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainStudentAppendix.java

@@ -0,0 +1,55 @@
+package org.dromara.main.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 学员简历附件对象 main_student_appendix
+ *
+ * @author antigravity
+ * @date 2026-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("main_student_appendix")
+public class MainStudentAppendix extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 学员ID (关联 main_student.id)
+     */
+    private Long studentId;
+
+    /**
+     * 附件OSS ID
+     */
+    private Long ossId;
+
+    /**
+     * 原始文件名
+     */
+    private String fileName;
+
+    /**
+     * 文件大小
+     */
+    private Long fileSize;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

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

@@ -0,0 +1,45 @@
+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.MainStudentAppendix;
+
+/**
+ * 学员简历附件业务对象 main_student_appendix
+ *
+ * @author antigravity
+ * @date 2026-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MainStudentAppendix.class, reverseConvertGenerate = true)
+public class MainStudentAppendixBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 学员ID (关联 main_student.id)
+     */
+    private Long studentId;
+
+    /**
+     * 附件OSS ID
+     */
+    private Long ossId;
+
+    /**
+     * 原始文件名
+     */
+    private String fileName;
+
+    /**
+     * 文件大小
+     */
+    private Long fileSize;
+
+}

+ 56 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainStudentAppendixVo.java

@@ -0,0 +1,56 @@
+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.MainStudentAppendix;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 学员简历附件视图对象
+ *
+ * @author antigravity
+ * @date 2026-04-08
+ */
+@Data
+@AutoMapper(target = MainStudentAppendix.class)
+public class MainStudentAppendixVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 学员ID
+     */
+    private Long studentId;
+
+    /**
+     * 附件OSS ID
+     */
+    private Long ossId;
+
+    /**
+     * 原始文件名
+     */
+    private String fileName;
+
+    /**
+     * 文件大小
+     */
+    private Long fileSize;
+
+    /**
+     * OSS地址URL
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "ossId")
+    private String url;
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainStudentAppendixMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.main.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.main.domain.MainStudentAppendix;
+import org.dromara.main.domain.vo.MainStudentAppendixVo;
+
+/**
+ * 学员简历附件Mapper接口
+ *
+ * @author antigravity
+ * @date 2026-04-08
+ */
+public interface MainStudentAppendixMapper extends BaseMapperPlus<MainStudentAppendix, MainStudentAppendixVo> {
+
+}

+ 38 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainBackCandidateService.java

@@ -0,0 +1,38 @@
+package org.dromara.main.service;
+
+import org.dromara.main.domain.MainBackCandidate;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 背调候选人Service接口
+ */
+public interface IMainBackCandidateService {
+
+    /**
+     * 获取学员的Offer列表
+     *
+     * @param studentId 学员ID
+     * @return Offer列表(包含岗位名称和企业名称)
+     */
+    List<Map<String, Object>> getStudentOfferList(Long studentId);
+
+    /**
+     * 学员接受Offer
+     *
+     * @param id        候选记录ID
+     * @param studentId 学员ID(用于校验)
+     * @return 是否成功
+     */
+    Boolean acceptOffer(Long id, Long studentId);
+
+    /**
+     * 学员拒绝Offer
+     *
+     * @param id        候选记录ID
+     * @param studentId 学员ID(用于校验)
+     * @return 是否成功
+     */
+    Boolean rejectOffer(Long id, Long studentId);
+}

+ 41 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainOrderService.java

@@ -0,0 +1,41 @@
+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.MainOrder;
+
+import java.util.Collection;
+import java.util.List;
+
+public interface IMainOrderService {
+
+    /**
+     * 查询订单详情
+     */
+    MainOrder queryById(Long id);
+
+    /**
+     * 查询订单列表
+     */
+    TableDataInfo<MainOrder> queryPageList(MainOrder order, PageQuery pageQuery);
+
+    /**
+     * 查询订单列表
+     */
+    List<MainOrder> queryList(MainOrder order);
+
+    /**
+     * 新增订单
+     */
+    Boolean insert(MainOrder order);
+
+    /**
+     * 修改订单
+     */
+    Boolean update(MainOrder order);
+
+    /**
+     * 校验并批量删除订单信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 31 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainStudentAppendixService.java

@@ -0,0 +1,31 @@
+package org.dromara.main.service;
+
+import org.dromara.main.domain.bo.MainStudentAppendixBo;
+import org.dromara.main.domain.vo.MainStudentAppendixVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 学员简历附件Service接口
+ *
+ * @author antigravity
+ * @date 2026-04-08
+ */
+public interface IMainStudentAppendixService {
+
+    /**
+     * 查询学员简历附件列表
+     */
+    List<MainStudentAppendixVo> queryList(Long studentId);
+
+    /**
+     * 新增学员简历附件
+     */
+    Boolean insertByBo(MainStudentAppendixBo bo);
+
+    /**
+     * 校验并删除学员简历附件信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 132 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainBackCandidateServiceImpl.java

@@ -0,0 +1,132 @@
+package org.dromara.main.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.main.domain.MainBackCandidate;
+import org.dromara.main.domain.MainPosition;
+import org.dromara.main.mapper.MainBackCandidateMapper;
+import org.dromara.main.mapper.MainPositionMapper;
+import org.dromara.main.service.IMainBackCandidateService;
+import org.dromara.system.domain.SysTenant;
+import org.dromara.system.mapper.SysTenantMapper;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 背调候选人Service实现
+ */
+@RequiredArgsConstructor
+@Service
+public class MainBackCandidateServiceImpl implements IMainBackCandidateService {
+
+    private final MainBackCandidateMapper mainBackCandidateMapper;
+    private final MainPositionMapper mainPositionMapper;
+    private final SysTenantMapper sysTenantMapper;
+
+    @Override
+    public List<Map<String, Object>> getStudentOfferList(Long studentId) {
+        LambdaQueryWrapper<MainBackCandidate> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(MainBackCandidate::getStudentId, studentId)
+               .eq(MainBackCandidate::getDelFlag, "0")
+               .orderByDesc(MainBackCandidate::getCreateTime);
+        List<MainBackCandidate> list = mainBackCandidateMapper.selectList(wrapper);
+
+        // 批量查询岗位名称和企业名称
+        List<Long> postIds = list.stream().map(MainBackCandidate::getPostId).distinct().collect(Collectors.toList());
+        List<String> tenantIds = list.stream().map(MainBackCandidate::getTenantId).distinct().collect(Collectors.toList());
+
+        Map<Long, String> postNameMap = new HashMap<>();
+        if (!postIds.isEmpty()) {
+            List<MainPosition> positions = mainPositionMapper.selectBatchIds(postIds);
+            postNameMap.putAll(positions.stream()
+                .collect(Collectors.toMap(MainPosition::getId, MainPosition::getPostName, (v1, v2) -> v1)));
+        }
+
+        Map<String, String> companyNameMap = new HashMap<>();
+        for (String tenantId : tenantIds) {
+            SysTenant tenant = sysTenantMapper.selectOne(new LambdaQueryWrapper<SysTenant>()
+                .eq(SysTenant::getTenantId, tenantId));
+            if (tenant != null) {
+                companyNameMap.put(tenantId, tenant.getCompanyName());
+            }
+        }
+
+        // 组装返回数据
+        return list.stream().map(item -> {
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", item.getId());
+            map.put("postId", item.getPostId());
+            map.put("postName", postNameMap.getOrDefault(item.getPostId(), "未知岗位"));
+            map.put("tenantId", item.getTenantId());
+            map.put("companyName", companyNameMap.getOrDefault(item.getTenantId(), "未知企业"));
+            map.put("studentId", item.getStudentId());
+            map.put("enterpriseStatus", item.getEnterpriseStatus());
+            map.put("studentStatus", item.getStudentStatus());
+            map.put("offerFileUrl", item.getOfferFileUrl());
+            map.put("offerFileName", item.getOfferFileName());
+            map.put("offerTime", item.getOfferTime());
+            map.put("studentReplyTime", item.getStudentReplyTime());
+            map.put("remark", item.getRemark());
+            map.put("createTime", item.getCreateTime());
+            return map;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public Boolean acceptOffer(Long id, Long studentId) {
+        MainBackCandidate candidate = mainBackCandidateMapper.selectById(id);
+        if (candidate == null) {
+            throw new ServiceException("候选记录不存在");
+        }
+        if (!candidate.getStudentId().equals(studentId)) {
+            throw new ServiceException("无权操作该记录");
+        }
+        if (!"adopted".equals(candidate.getEnterpriseStatus())) {
+            throw new ServiceException("企业未发出Offer,无法接受");
+        }
+        if (!"pending".equals(candidate.getStudentStatus())) {
+            throw new ServiceException("已处理过该Offer");
+        }
+
+        MainBackCandidate update = new MainBackCandidate();
+        update.setId(id);
+        update.setStudentStatus("accepted");
+        update.setStudentReplyTime(LocalDateTime.now());
+        // 同时更新旧status字段保持兼容
+        update.setStatus("adopted");
+
+        return mainBackCandidateMapper.updateById(update) > 0;
+    }
+
+    @Override
+    public Boolean rejectOffer(Long id, Long studentId) {
+        MainBackCandidate candidate = mainBackCandidateMapper.selectById(id);
+        if (candidate == null) {
+            throw new ServiceException("候选记录不存在");
+        }
+        if (!candidate.getStudentId().equals(studentId)) {
+            throw new ServiceException("无权操作该记录");
+        }
+        if (!"adopted".equals(candidate.getEnterpriseStatus())) {
+            throw new ServiceException("企业未发出Offer");
+        }
+        if (!"pending".equals(candidate.getStudentStatus())) {
+            throw new ServiceException("已处理过该Offer");
+        }
+
+        MainBackCandidate update = new MainBackCandidate();
+        update.setId(id);
+        update.setStudentStatus("rejected");
+        update.setStudentReplyTime(LocalDateTime.now());
+        // 同时更新旧status字段保持兼容
+        update.setStatus("rejected");
+
+        return mainBackCandidateMapper.updateById(update) > 0;
+    }
+}

+ 153 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainOrderServiceImpl.java

@@ -0,0 +1,153 @@
+package org.dromara.main.service.impl;
+
+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.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.MainOrder;
+import org.dromara.main.domain.MainPosition;
+import org.dromara.main.domain.MainStudent;
+import org.dromara.main.domain.MainBackCandidate;
+import org.dromara.system.domain.vo.SysOssVo;
+import org.dromara.system.service.ISysOssService;
+import org.dromara.main.mapper.MainOrderMapper;
+import org.dromara.main.mapper.MainPositionMapper;
+import org.dromara.main.mapper.MainStudentMapper;
+import org.dromara.main.mapper.MainBackCandidateMapper;
+import org.dromara.main.service.IMainOrderService;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+
+@RequiredArgsConstructor
+@Service
+public class MainOrderServiceImpl implements IMainOrderService {
+
+    private final MainOrderMapper baseMapper;
+    private final MainStudentMapper studentMapper;
+    private final MainPositionMapper positionMapper;
+    private final MainBackCandidateMapper candidateMapper;
+    private final ISysOssService ossService;
+
+    @Override
+    public MainOrder queryById(Long id) {
+        MainOrder order = baseMapper.selectById(id);
+        fillExtendInfo(order);
+        return order;
+    }
+
+    @Override
+    public TableDataInfo<MainOrder> queryPageList(MainOrder order, PageQuery pageQuery) {
+        LambdaQueryWrapper<MainOrder> lqw = buildQueryWrapper(order);
+        Page<MainOrder> result = baseMapper.selectPage(pageQuery.build(), lqw);
+        
+        // 填充扩展信息
+        if (result.getRecords() != null && !result.getRecords().isEmpty()) {
+            for (MainOrder item : result.getRecords()) {
+                fillExtendInfo(item);
+            }
+        }
+        
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public List<MainOrder> queryList(MainOrder order) {
+        LambdaQueryWrapper<MainOrder> lqw = buildQueryWrapper(order);
+        List<MainOrder> list = baseMapper.selectList(lqw);
+        
+        // 填充扩展信息
+        if (list != null && !list.isEmpty()) {
+            for (MainOrder item : list) {
+                fillExtendInfo(item);
+            }
+        }
+        
+        return list;
+    }
+
+    /**
+     * 填充扩展信息(学员手机号/头像,商品信息等)
+     */
+    private void fillExtendInfo(MainOrder order) {
+        if (order == null) {
+            return;
+        }
+        
+        // 1. 如果买家是学员,获取学员信息
+        if (order.getBuyerType() != null && order.getBuyerType() == 2 && order.getBuyerId() != null) {
+            MainStudent student = studentMapper.selectById(order.getBuyerId());
+            if (student != null) {
+                order.setPhone(student.getMobile());
+                if (student.getAvatar() != null) {
+                    SysOssVo oss = ossService.getById(student.getAvatar());
+                    if (oss != null) {
+                        order.setUserAvatar(oss.getUrl());
+                    }
+                }
+            }
+        }
+        
+        // 2. 根据订单类型获取业务信息
+        if (order.getOrderType() != null && order.getBusinessId() != null) {
+            if (order.getOrderType() == 1) {
+                // 职位发布订单
+                MainPosition position = positionMapper.selectById(order.getBusinessId());
+                if (position != null) {
+                    order.setProductName("发布职位:" + position.getPostName());
+                }
+            } else if (order.getOrderType() == 2) {
+                // 简历投递订单
+                MainBackCandidate candidate = candidateMapper.selectById(order.getBusinessId());
+                if (candidate != null && candidate.getPostId() != null) {
+                    MainPosition position = positionMapper.selectById(candidate.getPostId());
+                    if (position != null) {
+                        order.setProductName("投递职位:" + position.getPostName());
+                    }
+                }
+            } else if (order.getOrderType() == 3) {
+                // 背调订单
+                order.setProductName("背景调查服务");
+            }
+        }
+    }
+
+    private LambdaQueryWrapper<MainOrder> buildQueryWrapper(MainOrder order) {
+        LambdaQueryWrapper<MainOrder> lqw = Wrappers.lambdaQuery();
+        if (order != null) {
+            lqw.eq(StringUtils.isNotBlank(order.getOrderNo()), MainOrder::getOrderNo, order.getOrderNo());
+            lqw.like(StringUtils.isNotBlank(order.getCustomerSn()), MainOrder::getCustomerSn, order.getCustomerSn());
+            lqw.eq(order.getOrderType() != null, MainOrder::getOrderType, order.getOrderType());
+            lqw.eq(order.getBuyerType() != null, MainOrder::getBuyerType, order.getBuyerType());
+            lqw.eq(order.getBuyerId() != null, MainOrder::getBuyerId, order.getBuyerId());
+            lqw.like(StringUtils.isNotBlank(order.getBuyerName()), MainOrder::getBuyerName, order.getBuyerName());
+            lqw.eq(order.getSellerId() != null, MainOrder::getSellerId, order.getSellerId());
+            lqw.eq(order.getOrderStatus() != null, MainOrder::getOrderStatus, order.getOrderStatus());
+            lqw.eq(order.getPayStatus() != null, MainOrder::getPayStatus, order.getPayStatus());
+            lqw.eq(order.getBusinessId() != null, MainOrder::getBusinessId, order.getBusinessId());
+            lqw.eq(order.getProductId() != null, MainOrder::getProductId, order.getProductId());
+            lqw.eq(StringUtils.isNotBlank(order.getTenantId()), MainOrder::getTenantId, order.getTenantId());
+        }
+        lqw.orderByDesc(MainOrder::getCreateTime);
+        return lqw;
+    }
+
+    @Override
+    public Boolean insert(MainOrder order) {
+        return baseMapper.insert(order) > 0;
+    }
+
+    @Override
+    public Boolean update(MainOrder order) {
+        return baseMapper.updateById(order) > 0;
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+}

+ 67 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainStudentAppendixServiceImpl.java

@@ -0,0 +1,67 @@
+package org.dromara.main.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.main.domain.MainStudentAppendix;
+import org.dromara.main.domain.bo.MainStudentAppendixBo;
+import org.dromara.main.domain.vo.MainStudentAppendixVo;
+import org.dromara.main.mapper.MainStudentAppendixMapper;
+import org.dromara.main.service.IMainStudentAppendixService;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 学员简历附件Service业务层处理
+ *
+ * @author antigravity
+ * @date 2026-04-08
+ */
+@RequiredArgsConstructor
+@Service
+public class MainStudentAppendixServiceImpl implements IMainStudentAppendixService {
+
+    private final MainStudentAppendixMapper baseMapper;
+
+    /**
+     * 查询学员简历附件列表
+     */
+    @Override
+    public List<MainStudentAppendixVo> queryList(Long studentId) {
+        return baseMapper.selectVoList(new LambdaQueryWrapper<MainStudentAppendix>()
+            .eq(MainStudentAppendix::getStudentId, studentId)
+            .orderByDesc(MainStudentAppendix::getCreateTime));
+    }
+
+    /**
+     * 新增学员简历附件
+     */
+    @Override
+    public Boolean insertByBo(MainStudentAppendixBo bo) {
+        // 核心逻辑:校验数量
+        Long count = baseMapper.selectCount(new LambdaQueryWrapper<MainStudentAppendix>()
+            .eq(MainStudentAppendix::getStudentId, bo.getStudentId()));
+        if (count >= 3) {
+            throw new ServiceException("最多只允许上传3份附件简历");
+        }
+
+        MainStudentAppendix add = BeanUtil.toBean(bo, MainStudentAppendix.class);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 批量删除学员简历附件
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}