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', exportXls = '/dqinspecttask/dqInspectTask/exportXls',
queryDataById = '/dqinspecttask/dqInspectTask/queryById', queryDataById = '/dqinspecttask/dqInspectTask/queryById',
dqInspectProgressList = '/dqinspecttask/dqInspectTask/queryDqInspectProgressByMainId', dqInspectProgressList = '/dqinspecttask/dqInspectTask/queryDqInspectProgressByMainId',
specificProblemOptions = '/dqinspectproblem/dqInspectProblem/specificOptions',
} }
/** /**
* 导出api * 导出api
@@ -31,6 +32,11 @@ export const getImportUrl = Api.importExcel;
*/ */
export const queryDqInspectProgressListByMainId = (id) => defHttp.get({url: Api.dqInspectProgressList, params:{ id }}); export const queryDqInspectProgressListByMainId = (id) => defHttp.get({url: Api.dqInspectProgressList, params:{ id }});
/**
* 查询整改任务可挂载的具体问题树
*/
export const specificProblemOptions = () => defHttp.get({url: Api.specificProblemOptions});
/** /**
* 列表接口 * 列表接口
* @param params * @param params
@@ -78,4 +84,3 @@ export const saveOrUpdate = (params, isUpdate) => {
* @param params * @param params
*/ */
export const queryDataById = (id) => defHttp.get({url: Api.queryDataById, params:{ id }}); export const queryDataById = (id) => defHttp.get({url: Api.queryDataById, params:{ id }});
@@ -7,9 +7,10 @@ import { getWeekMonthQuarterYear } from '/@/utils';
//列表数据 //列表数据
export const columns: BasicColumn[] = [ export const columns: BasicColumn[] = [
{ {
title: '具体问题ID', title: '具体问题',
align:"center", align:"center",
dataIndex: 'problemId' dataIndex: 'problemId',
customRender: ({ text, record }) => record.problemId_dictText || text,
}, },
{ {
title: '密级', title: '密级',
@@ -5,8 +5,17 @@
<a-form v-bind="formItemLayout" name="DqInspectTaskForm" ref="formRef"> <a-form v-bind="formItemLayout" name="DqInspectTaskForm" ref="formRef">
<a-row> <a-row>
<a-col :span="24"> <a-col :span="24">
<a-form-item label="具体问题ID" v-bind="validateInfos.problemId" id="DqInspectTaskForm-problemId" name="problemId"> <a-form-item label="具体问题" v-bind="validateInfos.problemId" id="DqInspectTaskForm-problemId" name="problemId">
<a-input v-model:value="formData.problemId" placeholder="请输入具体问题ID" allow-clear ></a-input> <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-form-item>
</a-col> </a-col>
<a-col :span="24"> <a-col :span="24">
@@ -105,22 +114,22 @@
</JFormContainer> </JFormContainer>
<!-- 子表单区域 --> <!-- 子表单区域 -->
<a-tabs v-model:activeKey="activeKey" animated style="overflow:hidden;"> <!-- <a-tabs v-model:activeKey="activeKey" animated style="overflow:hidden;">-->
<a-tab-pane tab="工作进展反馈" key="dqInspectProgress" :forceRender="true"> <!-- <a-tab-pane tab="工作进展反馈" key="dqInspectProgress" :forceRender="true">-->
<j-vxe-table <!-- <j-vxe-table-->
:keep-source="true" <!-- :keep-source="true"-->
resizable <!-- resizable-->
ref="dqInspectProgressTableRef" <!-- ref="dqInspectProgressTableRef"-->
:loading="dqInspectProgressTable.loading" <!-- :loading="dqInspectProgressTable.loading"-->
:columns="dqInspectProgressTable.columns" <!-- :columns="dqInspectProgressTable.columns"-->
:dataSource="dqInspectProgressTable.dataSource" <!-- :dataSource="dqInspectProgressTable.dataSource"-->
:height="340" <!-- :height="340"-->
:disabled="disabled" <!-- :disabled="disabled"-->
:rowNumber="true" <!-- :rowNumber="true"-->
:rowSelection="true" <!-- :rowSelection="true"-->
:toolbar="true"/> <!-- :toolbar="true"/>-->
</a-tab-pane> <!-- </a-tab-pane>-->
</a-tabs> <!-- </a-tabs>-->
<div v-if="showFlowSubmitButton" :span="24" style="width: 100%;text-align: center;margin-top: 10px"> <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> <a-button preIcon="ant-design:check-outlined" style="width: 126px" type="primary" @click="submitForm"> </a-button>
</div> </div>
@@ -131,7 +140,7 @@
import { defineComponent, ref, reactive, computed, toRaw, onMounted } from 'vue'; import { defineComponent, ref, reactive, computed, toRaw, onMounted } from 'vue';
import { defHttp } from '/@/utils/http/axios'; import { defHttp } from '/@/utils/http/axios';
import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods'; 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 { JVxeTable } from '/@/components/jeecg/JVxeTable';
import {dqInspectProgressColumns} from '../DqInspectTask.data'; import {dqInspectProgressColumns} from '../DqInspectTask.data';
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue'; import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
@@ -163,6 +172,8 @@
const loading = ref(false); const loading = ref(false);
const formRef = ref(); const formRef = ref();
const dqInspectProgressTableRef = ref(); const dqInspectProgressTableRef = ref();
const problemTreeData = ref<any[]>([]);
const loadingProblemOptions = ref(false);
const dqInspectProgressTable = reactive<Record<string, any>>({ const dqInspectProgressTable = reactive<Record<string, any>>({
loading: false, loading: false,
columns: dqInspectProgressColumns, columns: dqInspectProgressColumns,
@@ -195,6 +206,7 @@
//表单验证 //表单验证
const validatorRules = reactive({ const validatorRules = reactive({
problemId: [{ required: true, message: '请选择具体问题' }],
}); });
const {resetFields, validate, validateInfos} = useForm(formData, validatorRules, {immediate: false}); const {resetFields, validate, validateInfos} = useForm(formData, validatorRules, {immediate: false});
const dbData = {}; const dbData = {};
@@ -216,6 +228,7 @@
}); });
onMounted(()=>{ onMounted(()=>{
loadSpecificProblemOptions();
initFormData(); initFormData();
}); });
//渲染流程表单数据 //渲染流程表单数据
@@ -243,13 +256,27 @@
return false return false
}); });
/**
* 整改任务只能选择具体问题,分类和面上问题由后端置灰用于分组展示。
*/
async function loadSpecificProblemOptions() {
loadingProblemOptions.value = true;
try {
const data = await specificProblemOptions();
problemTreeData.value = Array.isArray(data) ? data : data?.result || [];
} finally {
loadingProblemOptions.value = false;
}
}
function add() { async function add() {
resetFields(); resetFields();
dqInspectProgressTable.dataSource = []; dqInspectProgressTable.dataSource = [];
await loadSpecificProblemOptions();
} }
async function edit(row) { async function edit(row) {
await loadSpecificProblemOptions();
//主表数据 //主表数据
await queryMainData(row.id); await queryMainData(row.id);
//子表数据 //子表数据
@@ -292,7 +319,8 @@
async function submitForm() { async function submitForm() {
const mainData = await getFormData(); const mainData = await getFormData();
const subData = await getSubFormAndTableData(); // 工作进展子表当前未渲染时 ref 为空,提交主表即可;后续恢复子表时仍走原校验取数逻辑。
const subData = dqInspectProgressTableRef.value ? await getSubFormAndTableData() : {};
const values = Object.assign({}, dbData, mainData, subData); const values = Object.assign({}, dbData, mainData, subData);
console.log('表单提交数据', values) console.log('表单提交数据', values)
const isUpdate = values.id ? true : false const isUpdate = values.id ? true : false
@@ -322,6 +350,8 @@
return { return {
dqInspectProgressTableRef, dqInspectProgressTableRef,
dqInspectProgressTable, dqInspectProgressTable,
problemTreeData,
loadingProblemOptions,
validatorRules, validatorRules,
validateInfos, validateInfos,
activeKey, activeKey,