!47 style(inspectProgress): 进展表单对齐BPM表单样式

* style(inspectProgress): 进展表单对齐BPM表单样式
* style(xispeak): 反馈表单对齐BPM表单样式
* perf(xispeak): 反馈统计查询由逐条请求改为批量接口
This commit is contained in:
new_new_new
2026-06-17 03:07:33 +00:00
parent 4aeb89ff44
commit 6f3d19b876
3 changed files with 139 additions and 102 deletions
+12 -21
View File
@@ -112,7 +112,7 @@
updateLaunchType, updateLaunchType,
saveOrUpdateDict, saveOrUpdateDict,
withDrawXiSpeak, withDrawXiSpeak,
bgXiSpeakFeedbackList, queryFeedbackCounts,
} from './BgXiSpeak.api'; } from './BgXiSpeak.api';
const FLOW_CODE = 'dev_bg_xi_speak_001'; const FLOW_CODE = 'dev_bg_xi_speak_001';
@@ -348,27 +348,18 @@
const ids = collectAllIds(records); const ids = collectAllIds(records);
if (ids.length === 0) return; if (ids.length === 0) return;
try { try {
// 并行加载所有记录的反馈数据 const res = await queryFeedbackCounts({ ids: ids.join(',') });
const results = await Promise.all( const data = Array.isArray(res) ? res : res?.records || res?.result || [];
ids.map((id) =>
bgXiSpeakFeedbackList({
mainId: id,
pageNo: 1,
pageSize: 9999,
column: 'createTime',
order: 'desc',
}).catch(() => null)
)
);
// 构建 id -> { total, closed } 映射
const countsMap: Record<string, { total: number; closed: number }> = {}; const countsMap: Record<string, { total: number; closed: number }> = {};
ids.forEach((id, index) => { for (const item of data) {
const res = results[index]; const id = item.mainId || item.id || item.main_id;
const list = Array.isArray(res) ? res : res?.records || []; if (id) {
const total = list.length; countsMap[id] = {
const closed = list.filter((item: any) => item.completionStatus == 1).length; total: item.total ?? item.implCount ?? 0,
countsMap[id] = { total, closed }; closed: item.closed ?? item.closedCount ?? 0,
}); };
}
}
const updateFn = (list) => { const updateFn = (list) => {
if (!list) return; if (!list) return;
for (const item of list) { for (const item of list) {
@@ -2,21 +2,21 @@
<a-spin :spinning="confirmLoading"> <a-spin :spinning="confirmLoading">
<JFormContainer :disabled="disabled"> <JFormContainer :disabled="disabled">
<template #detail> <template #detail>
<a-form class="antd-modal-form" labelAlign="left" :labelCol="formItemLayout.labelCol" :wrapperCol="formItemLayout.wrapperCol" ref="formRef" :model="formData" :rules="validatorRules" name="BgXiSpeakFeedbackForm"> <a-form class="antd-modal-form" labelAlign="left" :labelCol="labelCol" :wrapperCol="wrapperCol" ref="formRef" :model="formData" :rules="validatorRules" name="BgXiSpeakFeedbackForm">
<!-- 基本信息 --> <!-- 基本信息 -->
<a-divider orientation="left" plain>基本信息</a-divider> <a-divider orientation="left" plain>基本信息</a-divider>
<a-row :gutter="[16, 0]"> <a-row class="form-content-row" :gutter="[12, 4]">
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="反馈部门" name="responDeptid"> <a-form-item label="反馈部门" name="responDeptid">
<j-select-dept v-model:value="formData.responDeptid" :multiple="true" checkStrictly allow-clear @change="handleDeptChange" /> <j-select-dept v-model:value="formData.responDeptid" :multiple="true" checkStrictly allow-clear @change="handleDeptChange" />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="反馈人" name="responPersonid"> <a-form-item label="反馈人" name="responPersonid">
<j-select-user v-model:value="formData.responPersonid" allow-clear @change="handleUserChange" /> <j-select-user v-model:value="formData.responPersonid" allow-clear @change="handleUserChange" />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="反馈时间" name="responTime"> <a-form-item label="反馈时间" name="responTime">
<a-date-picker <a-date-picker
placeholder="请选择反馈时间" placeholder="请选择反馈时间"
@@ -28,7 +28,7 @@
/> />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="序号" name="num"> <a-form-item label="序号" name="num">
<a-input-number v-model:value="formData.num" placeholder="请输入序号" style="width: 100%" allow-clear /> <a-input-number v-model:value="formData.num" placeholder="请输入序号" style="width: 100%" allow-clear />
</a-form-item> </a-form-item>
@@ -36,15 +36,13 @@
</a-row> </a-row>
<!-- 措施内容 --> <!-- 措施内容 -->
<a-divider orientation="left" plain>措施信息</a-divider> <a-divider orientation="left" plain>措施信息</a-divider>
<a-row :gutter="[16, 0]"> <a-row class="form-content-row" :gutter="[12, 4]">
<a-col :span="24"> <a-col :span="24">
<a-form-item label="具体措施" name="method"> <a-form-item label="具体措施" name="method">
<a-textarea v-model:value="formData.method" placeholder="请输入措施内容" :rows="3" allow-clear></a-textarea> <a-textarea v-model:value="formData.method" placeholder="请输入措施内容" :rows="3" allow-clear></a-textarea>
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row> <a-col :xs="24" :md="12">
<a-row :gutter="[16, 0]">
<a-col :span="12">
<a-form-item label="完成期限" name="deadline"> <a-form-item label="完成期限" name="deadline">
<a-date-picker <a-date-picker
placeholder="请选择完成期限" placeholder="请选择完成期限"
@@ -55,13 +53,11 @@
/> />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="成果形式" name="outcomeForm"> <a-form-item label="成果形式" name="outcomeForm">
<a-input v-model:value="formData.outcomeForm" placeholder="请输入成果形式" allow-clear></a-input> <a-input v-model:value="formData.outcomeForm" placeholder="请输入成果形式" allow-clear></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row>
<a-row :gutter="[16, 0]">
<a-col :span="24"> <a-col :span="24">
<a-form-item label="进展情况" v-bind="validateInfos.progress" name="progress"> <a-form-item label="进展情况" v-bind="validateInfos.progress" name="progress">
<a-textarea v-model:value="formData.progress" placeholder="请输入进展情况" :rows="3" allow-clear></a-textarea> <a-textarea v-model:value="formData.progress" placeholder="请输入进展情况" :rows="3" allow-clear></a-textarea>
@@ -70,13 +66,13 @@
</a-row> </a-row>
<!-- 状态与落实 --> <!-- 状态与落实 -->
<a-divider orientation="left" plain>状态与落实</a-divider> <a-divider orientation="left" plain>状态与落实</a-divider>
<a-row :gutter="[16, 0]"> <a-row class="form-content-row" :gutter="[12, 4]">
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="落实情况" name="implStatus"> <a-form-item label="落实情况" name="implStatus">
<a-input v-model:value="formData.implStatus" placeholder="请输入落实情况" allow-clear></a-input> <a-input v-model:value="formData.implStatus" placeholder="请输入落实情况" allow-clear></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="完成状态" v-bind="validateInfos.completionStatus" name="completionStatus"> <a-form-item label="完成状态" v-bind="validateInfos.completionStatus" name="completionStatus">
<JDictSelectTag <JDictSelectTag
v-model:value="formData.completionStatus" v-model:value="formData.completionStatus"
@@ -87,9 +83,7 @@
/> />
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row> <a-col :xs="24" :md="12">
<a-row :gutter="[16, 0]">
<a-col :span="12">
<a-form-item label="是否报送上级报告" name="isReportedToHigher"> <a-form-item label="是否报送上级报告" name="isReportedToHigher">
<JDictSelectTag <JDictSelectTag
v-model:value="formData.isReportedToHigher" v-model:value="formData.isReportedToHigher"
@@ -101,32 +95,26 @@
/> />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="检查情况" name="checkStatus"> <a-form-item label="检查情况" name="checkStatus">
<a-input v-model:value="formData.checkStatus" placeholder="请输入检查情况" allow-clear></a-input> <a-input v-model:value="formData.checkStatus" placeholder="请输入检查情况" allow-clear></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row>
<a-row :gutter="[16, 0]">
<a-col :span="24"> <a-col :span="24">
<a-form-item label="落实计划" name="completionPlan"> <a-form-item label="落实计划" name="completionPlan">
<a-textarea v-model:value="formData.completionPlan" placeholder="请输入落实计划" :rows="3" allow-clear></a-textarea> <a-textarea v-model:value="formData.completionPlan" placeholder="请输入落实计划" :rows="3" allow-clear></a-textarea>
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row> <a-col :xs="24" :md="12">
<a-row :gutter="[16, 0]">
<a-col :span="12">
<a-form-item label="总措施号" name="sumMethodNum"> <a-form-item label="总措施号" name="sumMethodNum">
<a-input v-model:value="formData.sumMethodNum" placeholder="请输入总措施号" allow-clear></a-input> <a-input v-model:value="formData.sumMethodNum" placeholder="请输入总措施号" allow-clear></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="措施数量" name="measureNum"> <a-form-item label="措施数量" name="measureNum">
<a-input-number v-model:value="formData.measureNum" placeholder="请输入措施数量" style="width: 100%" allow-clear /> <a-input-number v-model:value="formData.measureNum" placeholder="请输入措施数量" style="width: 100%" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row>
<a-row :gutter="[16, 0]">
<a-col :span="24"> <a-col :span="24">
<a-form-item label="监督意见" name="inspectionAdvice"> <a-form-item label="监督意见" name="inspectionAdvice">
<a-textarea v-model:value="formData.inspectionAdvice" placeholder="请输入监督意见" :rows="3" allow-clear></a-textarea> <a-textarea v-model:value="formData.inspectionAdvice" placeholder="请输入监督意见" :rows="3" allow-clear></a-textarea>
@@ -135,8 +123,8 @@
</a-row> </a-row>
<!-- 周期配置 --> <!-- 周期配置 -->
<a-divider orientation="left" plain>周期配置</a-divider> <a-divider orientation="left" plain>周期配置</a-divider>
<a-row :gutter="[16, 0]"> <a-row class="form-content-row" :gutter="[12, 4]">
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="发起类型" name="launchType"> <a-form-item label="发起类型" name="launchType">
<a-select v-model:value="formData.launchType" placeholder="请选择发起类型" allow-clear> <a-select v-model:value="formData.launchType" placeholder="请选择发起类型" allow-clear>
<a-select-option :value="0">立即发起</a-select-option> <a-select-option :value="0">立即发起</a-select-option>
@@ -144,7 +132,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="周期类型" name="intervalType"> <a-form-item label="周期类型" name="intervalType">
<a-select v-model:value="formData.intervalType" placeholder="请选择周期类型" allow-clear> <a-select v-model:value="formData.intervalType" placeholder="请选择周期类型" allow-clear>
<a-select-option :value="1"></a-select-option> <a-select-option :value="1"></a-select-option>
@@ -155,12 +143,12 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="周期任务数量" name="startCount"> <a-form-item label="周期任务数量" name="startCount">
<a-input-number v-model:value="formData.startCount" placeholder="请输入周期任务数量" style="width: 100%" allow-clear /> <a-input-number v-model:value="formData.startCount" placeholder="请输入周期任务数量" style="width: 100%" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :xs="24" :md="12">
<a-form-item label="周期开始时间" name="startTime"> <a-form-item label="周期开始时间" name="startTime">
<a-date-picker <a-date-picker
v-model:value="formData.startTime" v-model:value="formData.startTime"
@@ -234,10 +222,8 @@
const props = defineProps({ const props = defineProps({
disabled: { type: Boolean, default: false }, disabled: { type: Boolean, default: false },
}); });
const formItemLayout = { const labelCol = { xs: { span: 24 }, sm: { span: 7 } };
labelCol: { xs: { span: 24 }, sm: { span: 6 } }, const wrapperCol = { xs: { span: 24 }, sm: { span: 17 } };
wrapperCol: { xs: { span: 24 }, sm: { span: 18 } },
};
/** /**
* 部门选择变化 * 部门选择变化
@@ -343,5 +329,35 @@
<style lang="less" scoped> <style lang="less" scoped>
.antd-modal-form { .antd-modal-form {
padding: 14px; padding: 14px;
:deep(.ant-form-item-label) {
padding-bottom: 0;
text-align: left;
}
:deep(.ant-form-item-label > label) {
width: 100%;
justify-content: flex-start;
}
:deep(.ant-form-item-control),
:deep(.ant-form-item-control-input),
:deep(.ant-form-item-control-input-content) {
text-align: left;
}
}
.form-content-row {
:deep(.ant-form-item) {
margin-bottom: 6px;
}
:deep(.ant-input),
:deep(.ant-input-affix-wrapper),
:deep(.ant-input-number),
:deep(.ant-picker),
:deep(.ant-select-selector) {
min-height: 30px;
}
} }
</style> </style>
@@ -2,48 +2,48 @@
<a-spin :spinning="confirmLoading"> <a-spin :spinning="confirmLoading">
<JFormContainer :disabled="disabled"> <JFormContainer :disabled="disabled">
<template #detail> <template #detail>
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol" name="DqInspectProgressForm"> <a-form ref="formRef" class="antd-modal-form" labelAlign="left" :labelCol="labelCol" :wrapperCol="wrapperCol" name="DqInspectProgressForm">
<a-row> <a-row class="form-content-row" :gutter="[12, 4]">
<a-col :span="24"> <a-col :xs="24" :md="12">
<a-form-item label="反馈部门ID" v-bind="validateInfos.feedbackDeptId" id="DqInspectProgressForm-feedbackDeptId" name="feedbackDeptId"> <a-form-item label="反馈部门ID" v-bind="validateInfos.feedbackDeptId" id="DqInspectProgressForm-feedbackDeptId" name="feedbackDeptId">
<a-input v-model:value="formData.feedbackDeptId" placeholder="请输入反馈部门ID" allow-clear ></a-input> <a-input v-model:value="formData.feedbackDeptId" placeholder="请输入反馈部门ID" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="24"> <a-col :xs="24" :md="12">
<a-form-item label="反馈部门名称" v-bind="validateInfos.feedbackDeptName" id="DqInspectProgressForm-feedbackDeptName" name="feedbackDeptName"> <a-form-item label="反馈部门名称" v-bind="validateInfos.feedbackDeptName" id="DqInspectProgressForm-feedbackDeptName" name="feedbackDeptName">
<a-input v-model:value="formData.feedbackDeptName" placeholder="请输入反馈部门名称" allow-clear ></a-input> <a-input v-model:value="formData.feedbackDeptName" placeholder="请输入反馈部门名称" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="24"> <a-col :xs="24" :md="12">
<a-form-item label="反馈人ID" v-bind="validateInfos.feedbackPersonId" id="DqInspectProgressForm-feedbackPersonId" name="feedbackPersonId"> <a-form-item label="反馈人ID" v-bind="validateInfos.feedbackPersonId" id="DqInspectProgressForm-feedbackPersonId" name="feedbackPersonId">
<a-input v-model:value="formData.feedbackPersonId" placeholder="请输入反馈人ID" allow-clear ></a-input> <a-input v-model:value="formData.feedbackPersonId" placeholder="请输入反馈人ID" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="24"> <a-col :xs="24" :md="12">
<a-form-item label="反馈人姓名" v-bind="validateInfos.feedbackPersonName" id="DqInspectProgressForm-feedbackPersonName" name="feedbackPersonName"> <a-form-item label="反馈人姓名" v-bind="validateInfos.feedbackPersonName" id="DqInspectProgressForm-feedbackPersonName" name="feedbackPersonName">
<a-input v-model:value="formData.feedbackPersonName" placeholder="请输入反馈人姓名" allow-clear ></a-input> <a-input v-model:value="formData.feedbackPersonName" placeholder="请输入反馈人姓名" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="24"> <a-col :xs="24" :md="12">
<a-form-item label="实际完成时间" v-bind="validateInfos.actualTime" id="DqInspectProgressForm-actualTime" name="actualTime"> <a-form-item label="实际完成时间" v-bind="validateInfos.actualTime" id="DqInspectProgressForm-actualTime" name="actualTime">
<a-date-picker placeholder="请选择实际完成时间" v-model:value="formData.actualTime" value-format="YYYY-MM-DD" style="width: 100%" allow-clear /> <a-date-picker placeholder="请选择实际完成时间" v-model:value="formData.actualTime" value-format="YYYY-MM-DD" style="width: 100%" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="24"> <a-col :xs="24" :md="12">
<a-form-item label="工作进展" v-bind="validateInfos.workProgress" id="DqInspectProgressForm-workProgress" name="workProgress"> <a-form-item label="工作进展" v-bind="validateInfos.workProgress" id="DqInspectProgressForm-workProgress" name="workProgress">
<a-input v-model:value="formData.workProgress" placeholder="请输入工作进展" allow-clear ></a-input> <a-input v-model:value="formData.workProgress" placeholder="请输入工作进展" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="24"> <a-col :xs="24" :md="12">
<a-form-item label="进展状态" v-bind="validateInfos.bpmStatus" id="DqInspectProgressForm-bpmStatus" name="bpmStatus"> <a-form-item label="进展状态" v-bind="validateInfos.bpmStatus" id="DqInspectProgressForm-bpmStatus" name="bpmStatus">
<a-input v-model:value="formData.bpmStatus" placeholder="请输入进展状态" allow-clear ></a-input> <a-input v-model:value="formData.bpmStatus" placeholder="请输入进展状态" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="24"> <a-col :xs="24" :md="12">
<a-form-item label="整改措施任务ID" v-bind="validateInfos.mainId" id="DqInspectProgressForm-mainId" name="mainId"> <a-form-item label="整改措施任务ID" v-bind="validateInfos.mainId" id="DqInspectProgressForm-mainId" name="mainId">
<a-input v-model:value="formData.mainId" placeholder="请输入整改措施任务ID" allow-clear ></a-input> <a-input v-model:value="formData.mainId" placeholder="请输入整改措施任务ID" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col v-if="showFlowSubmitButton" :span="24" style="width: 100%;text-align: center;"> <a-col v-if="showFlowSubmitButton" :span="24" style="width: 100%;text-align: center;">
<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>
</a-col> </a-col>
@@ -85,8 +85,8 @@
mainId: '', mainId: '',
}); });
const { createMessage } = useMessage(); const { createMessage } = useMessage();
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } }); const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 7 } });
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } }); const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 17 } });
const confirmLoading = ref<boolean>(false); const confirmLoading = ref<boolean>(false);
//表单验证 //表单验证
const validatorRules = reactive({ const validatorRules = reactive({
@@ -212,5 +212,35 @@
<style lang="less" scoped> <style lang="less" scoped>
.antd-modal-form { .antd-modal-form {
padding: 14px; padding: 14px;
:deep(.ant-form-item-label) {
padding-bottom: 0;
text-align: left;
}
:deep(.ant-form-item-label > label) {
width: 100%;
justify-content: flex-start;
}
:deep(.ant-form-item-control),
:deep(.ant-form-item-control-input),
:deep(.ant-form-item-control-input-content) {
text-align: left;
}
}
.form-content-row {
:deep(.ant-form-item) {
margin-bottom: 6px;
}
:deep(.ant-input),
:deep(.ant-input-affix-wrapper),
:deep(.ant-input-number),
:deep(.ant-picker),
:deep(.ant-select-selector) {
min-height: 30px;
}
} }
</style> </style>