feat(manager/plans + biz-project): 审核 dialog 项目编号改远程 el-select

后端 (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
This commit is contained in:
郭庆泰
2026-08-18 01:08:28 +08:00
parent 1d288fbe6c
commit 8bee167704
2 changed files with 35 additions and 1 deletions
@@ -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<BizProject> all = bizProjectService.selectList(new BizProject());
java.util.List<java.util.Map<String, Object>> opts = new java.util.ArrayList<>();
for (BizProject p : all) {
if (p.getProjectNo() == null || p.getProjectNo().isEmpty()) continue;
java.util.Map<String, Object> 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
+13 -1
View File
@@ -92,7 +92,9 @@
</el-radio-group>
</el-form-item>
<el-form-item v-if="auditForm.result === '2'" label="项目编号" prop="projectNo">
<el-input v-model="auditForm.projectNo" placeholder="请填写项目编号" />
<el-select v-model="auditForm.projectNo" placeholder="请选择项目编号" filterable style="width:100%">
<el-option v-for="opt in projectNoOptions" :key="opt.projectNo" :label="opt.projectNo + (opt.projectName ? ' / ' + opt.projectName : '')" :value="opt.projectNo" />
</el-select>
</el-form-item>
<el-form-item label="审核意见">
<el-input v-model="auditForm.opinion" type="textarea" rows="3" placeholder="请填写审核意见 (可选)" />
@@ -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() {