From 8bee1677045bb2631a061ad06421c6c222077a39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E5=BA=86=E6=B3=B0?= <12369755+htcloud1@user.noreply.gitee.com> Date: Tue, 18 Aug 2026 01:08:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(manager/plans=20+=20biz-project):=20?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=20dialog=20=E9=A1=B9=E7=9B=AE=E7=BC=96?= =?UTF-8?q?=E5=8F=B7=E6=94=B9=E8=BF=9C=E7=A8=8B=20el-select?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后端 (BizProjectController): - 新增 GET /business/project/projectNoOptions - 返回 [{projectNo, projectName}], 仅 project_no 非空, 按 projectNo 倒序 - 不加 @PreAuthorize (manager 是业务角色, 与 specialPlan/options 一致) 前端 (manager/Plans.vue): - 模板: 项目编号 el-input → el-select (filterable, 显示 projectNo / projectName) - script: 加 projectNoOptions ref + loadProjectNoOptions() 函数 - onAudit: 每次打开 dialog 调 loadProjectNoOptions 拿最新 options --- .../controller/BizProjectController.java | 22 +++++++++++++++++++ ry-vue3/src/views/manager/Plans.vue | 14 +++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) 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() {