diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectController.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectController.java index dee968b..d7f7f6c 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectController.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectController.java @@ -84,6 +84,28 @@ public class BizProjectController extends BaseController return getDataTable(list); } + /** + * 项目编号下拉选项 (供 manager/Plans 审核 dialog "通过时" 选项目编号用) + * 返回 [{projectNo, projectName}], 仅 project_no 非空的项目, 按 project_no DESC + * 注: 不加 @PreAuthorize, 与 BizSpecialPlanController.options 一致 — manager 是业务角色 + */ + @GetMapping("/projectNoOptions") + public AjaxResult projectNoOptions() + { + List all = bizProjectService.selectList(new BizProject()); + java.util.List> opts = new java.util.ArrayList<>(); + for (BizProject p : all) { + if (p.getProjectNo() == null || p.getProjectNo().isEmpty()) continue; + java.util.Map m = new java.util.LinkedHashMap<>(); + m.put("projectNo", p.getProjectNo()); + m.put("projectName", p.getProjectName()); + opts.add(m); + } + // 按 projectNo 倒序 (新 → 旧) + opts.sort((a, b) -> String.valueOf(b.get("projectNo")).compareTo(String.valueOf(a.get("projectNo")))); + return success(opts); + } + /** * sponsor 专属项目列表 (按当前登录 sponsor 的 user_id 过滤) * GET /business/project/sponsorList diff --git a/ry-vue3/src/views/manager/Plans.vue b/ry-vue3/src/views/manager/Plans.vue index 6697dc7..a6ec4e5 100644 --- a/ry-vue3/src/views/manager/Plans.vue +++ b/ry-vue3/src/views/manager/Plans.vue @@ -92,7 +92,9 @@ - + + + @@ -164,6 +166,15 @@ async function loadPlanDirectionOptions() { } catch { planDirectionOptions.value = [] } } +// 项目编号下拉选项: [{projectNo, projectName}], 审核通过时选择用 +const projectNoOptions = ref([]) +async function loadProjectNoOptions() { + try { + const { data } = await request.get('/business/project/projectNoOptions') + projectNoOptions.value = (data && data.data) || data || [] + } catch { projectNoOptions.value = [] } +} + const q = ref({ planName: '', projectNo: '', planDirectionId: '', planCategory: '', status: '', isSettled: '', remark: '' }) const rows = ref([]); const selection = ref([]) const loading = ref(false) @@ -224,6 +235,7 @@ function onAudit(row) { auditForm.result = '2' auditForm.projectNo = '' auditForm.opinion = '' + loadProjectNoOptions() auditOpen.value = true } async function submitAudit() {