diff --git a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/controller/JcbtWorkStudyApplicationController.java b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/controller/JcbtWorkStudyApplicationController.java index f0eae6fc..35662e1e 100644 --- a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/controller/JcbtWorkStudyApplicationController.java +++ b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/controller/JcbtWorkStudyApplicationController.java @@ -351,12 +351,12 @@ public class JcbtWorkStudyApplicationController extends BaseController { * 获取学生已申请岗位列表 */ @Operation(summary = "获取学生已申请岗位列表") - @GetMapping("/student/status") + @GetMapping("/student/applicationStatus") @SaCheckPermission("jcbt:workStudyApplication:query") - public R> getStudentApplicationStatus() { + public R>> getStudentApplicationStatus() { - Map statusMap = workStudyApplicationService.getStudentApplicationStatus(); - return R.ok(statusMap); + List> statusList = workStudyApplicationService.getStudentApplicationStatus(); + return R.ok(statusList); } diff --git a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/mapper/JcbtWorkStudyApplicationMapper.java b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/mapper/JcbtWorkStudyApplicationMapper.java index 6ed6bec4..319dd890 100644 --- a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/mapper/JcbtWorkStudyApplicationMapper.java +++ b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/mapper/JcbtWorkStudyApplicationMapper.java @@ -5,6 +5,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.jcbt.domain.JcbtWorkStudyApplication; import org.dromara.jcbt.domain.vo.JcbtWorkStudyApplicationVo; +import java.util.List; import java.util.Map; /** @@ -24,6 +25,6 @@ public interface JcbtWorkStudyApplicationMapper extends BaseMapperPlus selectApplicationStatus(@Param("positionId") Long positionId, @Param("userId") Long userId); - Map selectApplicationStatusByStudentId(@Param("studentId") Long studentId); + List> selectApplicationStatusByStudentId(@Param("studentId") Long studentId); } diff --git a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/IJcbtWorkStudyApplicationService.java b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/IJcbtWorkStudyApplicationService.java index 79822bb7..845d640f 100644 --- a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/IJcbtWorkStudyApplicationService.java +++ b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/IJcbtWorkStudyApplicationService.java @@ -167,7 +167,7 @@ public interface IJcbtWorkStudyApplicationService { /** * 获取学生已申请岗位列表 * - * @return 学生已申请岗位列表 + * @return 学生已申请岗位状态列表 (包含岗位ID和申请状态) */ - Map getStudentApplicationStatus(); + List> getStudentApplicationStatus(); } diff --git a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/impl/JcbtWorkStudyApplicationServiceImpl.java b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/impl/JcbtWorkStudyApplicationServiceImpl.java index 7f6d8dca..8c70dd1a 100644 --- a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/impl/JcbtWorkStudyApplicationServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/impl/JcbtWorkStudyApplicationServiceImpl.java @@ -28,6 +28,9 @@ import org.dromara.xg.domain.vo.XgStudentMsgVo; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.HashMap; +import java.util.List; + import java.util.*; import java.util.stream.Collectors; @@ -338,25 +341,35 @@ public class JcbtWorkStudyApplicationServiceImpl implements IJcbtWorkStudyApplic // 更新总状态 - 关键修改:确保状态正确更新 String oldStatus = application.getStatus(); - if ("APPROVED".equals(reviewBo.getReviewResult())) { + + // 标准化审核结果参数,兼容前端传递的小写值 + String reviewResult = reviewBo.getReviewResult(); + if (reviewResult != null) { + reviewResult = reviewResult.toUpperCase(); + } + + if ("APPROVED".equals(reviewResult)) { application.setStatus(WorkStudyApplicationStatusEnum.COLLEGE_APPROVED.getCode()); log.info("🔍 [学院审核] 审核通过,状态更新: {} -> {}", oldStatus, WorkStudyApplicationStatusEnum.COLLEGE_APPROVED.getCode()); - } else if ("REJECTED".equals(reviewBo.getReviewResult())) { + } else if ("REJECTED".equals(reviewResult)) { application.setStatus(WorkStudyApplicationStatusEnum.COLLEGE_REJECTED.getCode()); log.info("🔍 [学院审核] 审核拒绝,状态更新: {} -> {}", oldStatus, WorkStudyApplicationStatusEnum.COLLEGE_REJECTED.getCode()); + } else { + throw new ServiceException("审核结果参数错误,只支持approved或rejected"); } // 使用updateById确保更新 boolean result = baseMapper.updateById(application) > 0; log.info("🔍 [学院审核] 数据库更新结果: {}", result ? "成功" : "失败"); - if (result) { + if (result) { // 验证更新后的状态 JcbtWorkStudyApplication updatedApplication = baseMapper.selectById(reviewBo.getApplicationId()); log.info("🔍 [学院审核] 更新后验证状态: {}, 审核状态: {}", updatedApplication.getStatus(), updatedApplication.getCollegeReviewStatus()); // 确保状态更新成功 - if ("APPROVED".equals(reviewBo.getReviewResult()) && !WorkStudyApplicationStatusEnum.COLLEGE_APPROVED.getCode().equals(updatedApplication.getStatus())) { + String normalizedResult = reviewBo.getReviewResult() != null ? reviewBo.getReviewResult().toUpperCase() : ""; + if ("APPROVED".equals(normalizedResult) && !WorkStudyApplicationStatusEnum.COLLEGE_APPROVED.getCode().equals(updatedApplication.getStatus())) { log.error("🔍 [学院审核] 状态更新失败!期望: {}, 实际: {}", WorkStudyApplicationStatusEnum.COLLEGE_APPROVED.getCode(), updatedApplication.getStatus()); throw new ServiceException("状态更新失败,请重试"); } @@ -388,8 +401,13 @@ public class JcbtWorkStudyApplicationServiceImpl implements IJcbtWorkStudyApplic application.setFinalReviewerName(currentUserName); application.setFinalReviewComment(reviewBo.getReviewComment()); - // 更新总状态 - if ("APPROVED".equals(reviewBo.getReviewResult())) { + // 更新总状态 - 标准化审核结果参数,兼容前端传递的小写值 + String reviewResult = reviewBo.getReviewResult(); + if (reviewResult != null) { + reviewResult = reviewResult.toUpperCase(); + } + + if ("APPROVED".equals(reviewResult)) { application.setStatus(WorkStudyApplicationStatusEnum.FINAL_APPROVED.getCode()); // 更新岗位当前申请通过人数 @@ -402,8 +420,10 @@ public class JcbtWorkStudyApplicationServiceImpl implements IJcbtWorkStudyApplic } positionMapper.updateById(position); } - } else if ("REJECTED".equals(reviewBo.getReviewResult())) { + } else if ("REJECTED".equals(reviewResult)) { application.setStatus(WorkStudyApplicationStatusEnum.FINAL_REJECTED.getCode()); + } else { + throw new ServiceException("审核结果参数错误,只支持approved或rejected"); } return baseMapper.updateById(application) > 0; @@ -530,11 +550,46 @@ public class JcbtWorkStudyApplicationServiceImpl implements IJcbtWorkStudyApplic } /** - * 获取学生已申请岗位列表 + * 获取学生已申请岗位状态列表 */ @Override - public Map getStudentApplicationStatus() { + public List> getStudentApplicationStatus() { Long studentId = LoginHelper.getUserId(); - return baseMapper.selectApplicationStatusByStudentId(studentId); + List> resultList = baseMapper.selectApplicationStatusByStudentId(studentId); + + // 转换数据结构并进行状态值转换 + List> statusList = new ArrayList<>(); + for (Map item : resultList) { + Map result = new HashMap<>(); + result.put("positionId", item.get("position_id")); + result.put("status", convertStatusToFrontend((String) item.get("status"))); + statusList.add(result); + } + + return statusList; + } + + /** + * 将后端状态转换为前端状态 + */ + private String convertStatusToFrontend(String backendStatus) { + if (backendStatus == null) { + return "submitted"; + } + switch (backendStatus) { + case "SUBMITTED": + return "submitted"; + case "COLLEGE_APPROVED": + return "college_reviewing"; + case "FINAL_APPROVED": + return "approved"; + case "COLLEGE_REJECTED": + case "FINAL_REJECTED": + return "rejected"; + case "CANCELLED": + return "cancelled"; + default: + return "submitted"; + } } } diff --git a/mobile/src/api/workStudy.js b/mobile/src/api/workStudy.js new file mode 100644 index 00000000..d6dda780 --- /dev/null +++ b/mobile/src/api/workStudy.js @@ -0,0 +1,133 @@ +// 勤工俭学API接口 +import { request } from '@/common/request.js'; + +/** + * 学生查看可申请的岗位列表 + * @param {Object} params 查询参数 + */ +export const getAvailablePositions = (params = {}) => { + return request({ + url: '/jcbt/workStudyPosition/visibleList', + method: 'GET', + params: { + ...params, + excludeApplied: true // 排除已申请的岗位 + } + }); +}; + +/** + * 获取岗位详情及申请状态 + * @param {String|Number} positionId 岗位ID + */ +export const getPositionWithApplicationStatus = (positionId) => { + return request({ + url: `/jcbt/workStudyPosition/${positionId}/withApplicationStatus`, + method: 'GET' + }); +}; + +/** + * 查看我的申请列表 + * @param {Object} params 查询参数 + */ +export const getMyApplications = (params = {}) => { + return request({ + url: '/jcbt/workStudyApplication/myList', + method: 'GET', + params: params + }); +}; + +/** + * 新增申请 + * @param {Object} data 申请数据 + */ +export const addApplication = (data) => { + return request({ + url: '/jcbt/workStudyApplication', + method: 'POST', + data: data + }); +}; + +/** + * 提交申请 + * @param {String|Number} applicationId 申请ID + */ +export const submitApplication = (applicationId) => { + return request({ + url: `/jcbt/workStudyApplication/submit/${applicationId}`, + method: 'POST' + }); +}; + +/** + * 撤销申请 + * @param {String|Number} applicationId 申请ID + */ +export const cancelApplication = (applicationId) => { + return request({ + url: `/jcbt/workStudyApplication/cancel/${applicationId}`, + method: 'POST' + }); +}; + +/** + * 获取当前学生信息 + */ +export const getCurrentStudentInfo = () => { + return request({ + url: '/jcbt/workStudyApplication/currentStudentInfo', + method: 'GET' + }); +}; + +/** + * 获取申请选项数据 + */ +export const getApplicationOptions = () => { + return request({ + url: '/jcbt/workStudyApplication/options', + method: 'GET' + }); +}; + +/** + * 检查重复申请 + * @param {String} studentNumber 学号 + * @param {Number} positionId 岗位ID + */ +export const checkDuplicateApplication = (studentNumber, positionId) => { + return request({ + url: '/jcbt/workStudyApplication/checkDuplicate', + method: 'GET', + params: { + studentNumber: studentNumber, + positionId: positionId + } + }); +}; + +/** + * 查询申请详情 + * @param {String|Number} applicationId 申请ID + */ +export const getApplicationDetail = (applicationId) => { + return request({ + url: `/jcbt/workStudyApplication/detail/${applicationId}`, + method: 'GET' + }); +}; + +/** + * 修改申请 + * @param {Object} data 申请数据 + */ +export const updateApplication = (data) => { + return request({ + url: '/jcbt/workStudyApplication', + method: 'PUT', + data: data + }); +}; diff --git a/mobile/src/pages/workStudy/applicationDetail.vue b/mobile/src/pages/workStudy/applicationDetail.vue new file mode 100644 index 00000000..871ddd21 --- /dev/null +++ b/mobile/src/pages/workStudy/applicationDetail.vue @@ -0,0 +1,624 @@ + + + + + diff --git a/mobile/src/pages/workStudy/apply.vue b/mobile/src/pages/workStudy/apply.vue new file mode 100644 index 00000000..7b6fbbce --- /dev/null +++ b/mobile/src/pages/workStudy/apply.vue @@ -0,0 +1,743 @@ + + + + + diff --git a/mobile/src/pages/workStudy/detail.vue b/mobile/src/pages/workStudy/detail.vue new file mode 100644 index 00000000..2842aa4e --- /dev/null +++ b/mobile/src/pages/workStudy/detail.vue @@ -0,0 +1,632 @@ + + + + + diff --git a/mobile/src/pages/workStudy/index.vue b/mobile/src/pages/workStudy/index.vue new file mode 100644 index 00000000..ef954759 --- /dev/null +++ b/mobile/src/pages/workStudy/index.vue @@ -0,0 +1,852 @@ + + + + + diff --git a/web/src/api/jcbt/workStudyApplication.js b/web/src/api/jcbt/workStudyApplication.js index edd8aad2..1e2e8f63 100644 --- a/web/src/api/jcbt/workStudyApplication.js +++ b/web/src/api/jcbt/workStudyApplication.js @@ -114,3 +114,11 @@ export function getApplicationStatistics(positionId) { method: 'get' }); } + +// 获取学生申请状态列表 +export function getStudentApplicationStatusList() { + return request({ + url: '/jcbt/workStudyApplication/student/applicationStatus', + method: 'get' + }); +} diff --git a/web/src/api/jcbt/workStudyApplication.ts b/web/src/api/jcbt/workStudyApplication.ts index 016adde6..427307d7 100644 --- a/web/src/api/jcbt/workStudyApplication.ts +++ b/web/src/api/jcbt/workStudyApplication.ts @@ -447,3 +447,13 @@ export function getCurrentStudentInfo(): AxiosPromise { method: 'get' }); } + +/** + * 获取学生已申请岗位状态列表 + */ +export function getStudentApplicationStatusList(): AxiosPromise { + return request({ + url: '/jcbt/workStudyApplication/student/applicationStatus', + method: 'get' + }); +} diff --git a/web/src/views/jcbt/workstudy/Application/index.vue b/web/src/views/jcbt/workstudy/Application/index.vue index 39bbe0b6..6697ea19 100644 --- a/web/src/views/jcbt/workstudy/Application/index.vue +++ b/web/src/views/jcbt/workstudy/Application/index.vue @@ -112,12 +112,27 @@ - + + + + + @@ -141,7 +156,8 @@ - + +
岗位详情页面开发中...
@@ -149,12 +165,17 @@ - + /> --> +
申请表单页面开发中...
+
@@ -162,10 +183,14 @@