yxk-20260527-巡视整改提升台账,任务清单新增
1、任务清单 dq_inspect_task.problem_id 必须关联 dq_inspect_problem.id,且被关联的问题节点 node_type = specific。 2、前端把当前手填“具体问题ID”改成树形选择,只允许选择“具体问题”节点。 后端在新增、编辑、导入时统一校验,防止绕过前端提交非法 problemId。
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user