yxk-20260527-巡视整改提升台账,任务清单新增

1、任务清单 dq_inspect_task.problem_id 必须关联 dq_inspect_problem.id,且被关联的问题节点 node_type = specific。
2、前端把当前手填“具体问题ID”改成树形选择,只允许选择“具体问题”节点。
后端在新增、编辑、导入时统一校验,防止绕过前端提交非法 problemId。
This commit is contained in:
ye1023
2026-05-28 15:31:55 +08:00
parent fc0d281890
commit 8f1007ff70
3 changed files with 80 additions and 44 deletions
@@ -13,6 +13,7 @@ enum Api {
exportXls = '/dqinspecttask/dqInspectTask/exportXls',
queryDataById = '/dqinspecttask/dqInspectTask/queryById',
dqInspectProgressList = '/dqinspecttask/dqInspectTask/queryDqInspectProgressByMainId',
specificProblemOptions = '/dqinspectproblem/dqInspectProblem/specificOptions',
}
/**
* 导出api
@@ -31,6 +32,11 @@ export const getImportUrl = Api.importExcel;
*/
export const queryDqInspectProgressListByMainId = (id) => defHttp.get({url: Api.dqInspectProgressList, params:{ id }});
/**
* 查询整改任务可挂载的具体问题树
*/
export const specificProblemOptions = () => defHttp.get({url: Api.specificProblemOptions});
/**
* 列表接口
* @param params
@@ -78,4 +84,3 @@ export const saveOrUpdate = (params, isUpdate) => {
* @param params
*/
export const queryDataById = (id) => defHttp.get({url: Api.queryDataById, params:{ id }});
@@ -7,9 +7,10 @@ import { getWeekMonthQuarterYear } from '/@/utils';
//列表数据
export const columns: BasicColumn[] = [
{
title: '具体问题ID',
title: '具体问题',
align:"center",
dataIndex: 'problemId'
dataIndex: 'problemId',
customRender: ({ text, record }) => record.problemId_dictText || text,
},
{
title: '密级',
@@ -5,8 +5,17 @@
<a-form v-bind="formItemLayout" name="DqInspectTaskForm" ref="formRef">
<a-row>
<a-col :span="24">
<a-form-item label="具体问题ID" v-bind="validateInfos.problemId" id="DqInspectTaskForm-problemId" name="problemId">
<a-input v-model:value="formData.problemId" placeholder="请输入具体问题ID" allow-clear ></a-input>
<a-form-item label="具体问题" v-bind="validateInfos.problemId" id="DqInspectTaskForm-problemId" name="problemId">
<a-tree-select
v-model:value="formData.problemId"
:tree-data="problemTreeData"
:loading="loadingProblemOptions"
:disabled="disabled || loadingProblemOptions"
placeholder="请选择具体问题"
allow-clear
tree-default-expand-all
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="24">
@@ -105,22 +114,22 @@
</JFormContainer>
<!-- 子表单区域 -->
<a-tabs v-model:activeKey="activeKey" animated style="overflow:hidden;">
<a-tab-pane tab="工作进展反馈" key="dqInspectProgress" :forceRender="true">
<j-vxe-table
:keep-source="true"
resizable
ref="dqInspectProgressTableRef"
:loading="dqInspectProgressTable.loading"
:columns="dqInspectProgressTable.columns"
:dataSource="dqInspectProgressTable.dataSource"
:height="340"
:disabled="disabled"
:rowNumber="true"
:rowSelection="true"
:toolbar="true"/>
</a-tab-pane>
</a-tabs>
<!-- <a-tabs v-model:activeKey="activeKey" animated style="overflow:hidden;">-->
<!-- <a-tab-pane tab="工作进展反馈" key="dqInspectProgress" :forceRender="true">-->
<!-- <j-vxe-table-->
<!-- :keep-source="true"-->
<!-- resizable-->
<!-- ref="dqInspectProgressTableRef"-->
<!-- :loading="dqInspectProgressTable.loading"-->
<!-- :columns="dqInspectProgressTable.columns"-->
<!-- :dataSource="dqInspectProgressTable.dataSource"-->
<!-- :height="340"-->
<!-- :disabled="disabled"-->
<!-- :rowNumber="true"-->
<!-- :rowSelection="true"-->
<!-- :toolbar="true"/>-->
<!-- </a-tab-pane>-->
<!-- </a-tabs>-->
<div v-if="showFlowSubmitButton" :span="24" style="width: 100%;text-align: center;margin-top: 10px">
<a-button preIcon="ant-design:check-outlined" style="width: 126px" type="primary" @click="submitForm"> </a-button>
</div>
@@ -131,7 +140,7 @@
import { defineComponent, ref, reactive, computed, toRaw, onMounted } from 'vue';
import { defHttp } from '/@/utils/http/axios';
import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
import { queryDqInspectProgressListByMainId, queryDataById, saveOrUpdate } from '../DqInspectTask.api';
import { queryDqInspectProgressListByMainId, queryDataById, saveOrUpdate, specificProblemOptions } from '../DqInspectTask.api';
import { JVxeTable } from '/@/components/jeecg/JVxeTable';
import {dqInspectProgressColumns} from '../DqInspectTask.data';
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
@@ -163,6 +172,8 @@
const loading = ref(false);
const formRef = ref();
const dqInspectProgressTableRef = ref();
const problemTreeData = ref<any[]>([]);
const loadingProblemOptions = ref(false);
const dqInspectProgressTable = reactive<Record<string, any>>({
loading: false,
columns: dqInspectProgressColumns,
@@ -171,30 +182,31 @@
const activeKey = ref('dqInspectProgress');
const formData = reactive<Record<string, any>>({
id: '',
problemId: '',
secretLevel: '',
improveMeasure: '',
deadline: '',
targetNode: '',
measureResLeader: '',
measureResDept: '',
rectificationEvidence: '',
evaluationCriterion: '',
isNeedAppro: '',
supDeptleaderid: '',
inspectionStatus: '',
supervisoryOpinion: '',
problemId: '',
secretLevel: '',
improveMeasure: '',
deadline: '',
targetNode: '',
measureResLeader: '',
measureResDept: '',
rectificationEvidence: '',
evaluationCriterion: '',
isNeedAppro: '',
supDeptleaderid: '',
inspectionStatus: '',
supervisoryOpinion: '',
measureCount: undefined,
bpmProcessId: '',
bpmStatus: '',
taskStatus: '',
superviseCount: '',
bpmProcessId: '',
bpmStatus: '',
taskStatus: '',
superviseCount: '',
sortNo: undefined,
delFlag: '',
delFlag: '',
});
//表单验证
const validatorRules = reactive({
problemId: [{ required: true, message: '请选择具体问题' }],
});
const {resetFields, validate, validateInfos} = useForm(formData, validatorRules, {immediate: false});
const dbData = {};
@@ -216,6 +228,7 @@
});
onMounted(()=>{
loadSpecificProblemOptions();
initFormData();
});
//渲染流程表单数据
@@ -242,14 +255,28 @@
}
return false
});
function add() {
/**
* 整改任务只能选择具体问题,分类和面上问题由后端置灰用于分组展示。
*/
async function loadSpecificProblemOptions() {
loadingProblemOptions.value = true;
try {
const data = await specificProblemOptions();
problemTreeData.value = Array.isArray(data) ? data : data?.result || [];
} finally {
loadingProblemOptions.value = false;
}
}
async function add() {
resetFields();
dqInspectProgressTable.dataSource = [];
await loadSpecificProblemOptions();
}
async function edit(row) {
await loadSpecificProblemOptions();
//主表数据
await queryMainData(row.id);
//子表数据
@@ -292,7 +319,8 @@
async function submitForm() {
const mainData = await getFormData();
const subData = await getSubFormAndTableData();
// 工作进展子表当前未渲染时 ref 为空,提交主表即可;后续恢复子表时仍走原校验取数逻辑。
const subData = dqInspectProgressTableRef.value ? await getSubFormAndTableData() : {};
const values = Object.assign({}, dbData, mainData, subData);
console.log('表单提交数据', values)
const isUpdate = values.id ? true : false
@@ -300,7 +328,7 @@
//关闭弹窗
emit('success');
}
function setFieldsValue(values) {
if(values){
Object.keys(values).map(k=>{
@@ -322,6 +350,8 @@
return {
dqInspectProgressTableRef,
dqInspectProgressTable,
problemTreeData,
loadingProblemOptions,
validatorRules,
validateInfos,
activeKey,