!161 feat(supervision): 反馈表格按状态整行着色与台账统一

Merge pull request !161 from wsm/feature/feedback_info_style
This commit is contained in:
wsm
2026-08-19 06:42:48 +00:00
committed by Gitee
14 changed files with 72 additions and 0 deletions
+11
View File
@@ -293,3 +293,14 @@ html[data-theme='dark'] {
margin-inline: 0; margin-inline: 0;
} }
// update-end--author:wangshuai---date:20240611---for:【TV360X-1070】一对多内嵌,为什么多这一块,不从头对齐 // update-end--author:wangshuai---date:20240611---for:【TV360X-1070】一对多内嵌,为什么多这一块,不从头对齐
/* 反馈表格整行按状态着色(与台账颜色统一:未开始黄/进行中红/已完成绿) */
.feedback-status-row-warning td {
background: #fffbe6 !important;
}
.feedback-status-row-error td {
background: #fff1f0 !important;
}
.feedback-status-row-success td {
background: #f6ffed !important;
}
@@ -132,6 +132,7 @@
:loading="getFeedbackTableLoading(record)" :loading="getFeedbackTableLoading(record)"
:pagination="false" :pagination="false"
:scroll="{ x: 1400 }" :scroll="{ x: 1400 }"
:rowClassName="feedbackStatusRowClassName"
> >
<template #feedbackAttachments="{ record: feedbackRecord }"> <template #feedbackAttachments="{ record: feedbackRecord }">
<SUploadFile <SUploadFile
@@ -207,6 +208,7 @@
import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue'; import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue';
import { columns, superQuerySchema, bgPartymatterFeedbackColumns } from './BgPartymatter.data'; import { columns, superQuerySchema, bgPartymatterFeedbackColumns } from './BgPartymatter.data';
import { list, statusStats, deleteOne, batchDelete, getImportUrl, getExportXlsByEasyExcelUrl, getImportExcelByEasyExcelUrl, getCheckExcelByEasyExcelUrl, getExportXlsHeadersUrl, bgPartymatterFeedbackList, saveOrUpdate } from './BgPartymatter.api'; import { list, statusStats, deleteOne, batchDelete, getImportUrl, getExportXlsByEasyExcelUrl, getImportExcelByEasyExcelUrl, getCheckExcelByEasyExcelUrl, getExportXlsHeadersUrl, bgPartymatterFeedbackList, saveOrUpdate } from './BgPartymatter.api';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
import { defHttp } from '/@/utils/http/axios'; import { defHttp } from '/@/utils/http/axios';
import { showImportValidationErrors } from '/@/utils/helper/importError'; import { showImportValidationErrors } from '/@/utils/helper/importError';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
@@ -206,6 +206,7 @@
:data-source="feedbackList" :data-source="feedbackList"
:pagination="false" :pagination="false"
:scroll="{ x: feedbackTableScrollX }" :scroll="{ x: feedbackTableScrollX }"
:rowClassName="feedbackStatusRowClassName"
> >
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'attachments'"> <template v-if="column.key === 'attachments'">
@@ -293,6 +294,7 @@
import JSelectDept from '/@/components/Form/src/jeecg/components/JSelectDept.vue'; import JSelectDept from '/@/components/Form/src/jeecg/components/JSelectDept.vue';
import Icon from '/@/components/Icon/index'; import Icon from '/@/components/Icon/index';
import { bgPartymatterFeedbackDelete, bgPartymatterFeedbackList, saveBpmForm, setBpmVariableLocal } from '../BgPartymatter.api'; import { bgPartymatterFeedbackDelete, bgPartymatterFeedbackList, saveBpmForm, setBpmVariableLocal } from '../BgPartymatter.api';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
import { usePermission } from '/@/hooks/web/usePermission'; import { usePermission } from '/@/hooks/web/usePermission';
import TaskHandleInnerContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskHandleInnerContent.vue'; import TaskHandleInnerContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskHandleInnerContent.vue';
import JDictSelectTag from '../../../../components/Form/src/jeecg/components/JDictSelectTag.vue'; import JDictSelectTag from '../../../../components/Form/src/jeecg/components/JDictSelectTag.vue';
@@ -108,6 +108,7 @@
:pagination="false" :pagination="false"
:scroll="{ x: 1600 }" :scroll="{ x: 1600 }"
:loading="feedbackLoading" :loading="feedbackLoading"
:rowClassName="feedbackStatusRowClassName"
> >
<template #bodyCell="{ column, record: feedbackRecord }"> <template #bodyCell="{ column, record: feedbackRecord }">
<template v-if="column.key === 'attachments'"> <template v-if="column.key === 'attachments'">
@@ -132,6 +133,7 @@
import Icon from '/@/components/Icon/index'; import Icon from '/@/components/Icon/index';
import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue'; import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue';
import { bgPartymatterFeedbackList } from '../BgPartymatter.api'; import { bgPartymatterFeedbackList } from '../BgPartymatter.api';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
import { bgPartymatterFeedbackColumns } from '../BgPartymatter.data'; import { bgPartymatterFeedbackColumns } from '../BgPartymatter.data';
import type { BasicColumn } from '/@/components/Table'; import type { BasicColumn } from '/@/components/Table';
import { countFeedbackStatus } from '/@/views/bg/utils/feedbackStatusCount'; import { countFeedbackStatus } from '/@/views/bg/utils/feedbackStatusCount';
@@ -166,6 +166,7 @@
:loading="getFeedbackTableLoading(record)" :loading="getFeedbackTableLoading(record)"
:pagination="false" :pagination="false"
:scroll="{ x: 1780 }" :scroll="{ x: 1780 }"
:rowClassName="feedbackStatusRowClassName"
> >
<template #feedbackAttachments="{ record: feedbackRecord }"> <template #feedbackAttachments="{ record: feedbackRecord }">
<SUploadFile <SUploadFile
@@ -244,6 +245,7 @@
import { showImportValidationErrors } from '/@/utils/helper/importError'; import { showImportValidationErrors } from '/@/utils/helper/importError';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { countFeedbackStatus } from '/@/views/bg/utils/feedbackStatusCount'; import { countFeedbackStatus } from '/@/views/bg/utils/feedbackStatusCount';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
import { useDebounceFn } from '@vueuse/core'; import { useDebounceFn } from '@vueuse/core';
import SzSelectDept from '/@/components/Form/src/jeecg/components/SzSelectDept.vue'; import SzSelectDept from '/@/components/Form/src/jeecg/components/SzSelectDept.vue';
import JInput from '/@/components/Form/src/jeecg/components/JInput.vue'; import JInput from '/@/components/Form/src/jeecg/components/JInput.vue';
@@ -231,6 +231,7 @@
:data-source="feedbackList" :data-source="feedbackList"
:pagination="false" :pagination="false"
:scroll="{ x: feedbackTableScrollX }" :scroll="{ x: feedbackTableScrollX }"
:rowClassName="feedbackStatusRowClassName"
> >
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'attachments'"> <template v-if="column.key === 'attachments'">
@@ -316,6 +317,7 @@
import JSwitch from '/@/components/Form/src/jeecg/components/JSwitch.vue'; import JSwitch from '/@/components/Form/src/jeecg/components/JSwitch.vue';
import Icon from '/@/components/Icon/index'; import Icon from '/@/components/Icon/index';
import { bgTakepulseFeedbackDelete, bgTakepulseFeedbackList, saveBpmForm, setBpmVariableLocal } from '../BgTakepulse.api'; import { bgTakepulseFeedbackDelete, bgTakepulseFeedbackList, saveBpmForm, setBpmVariableLocal } from '../BgTakepulse.api';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
import { usePermission } from '/@/hooks/web/usePermission'; import { usePermission } from '/@/hooks/web/usePermission';
import TaskHandleInnerContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskHandleInnerContent.vue'; import TaskHandleInnerContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskHandleInnerContent.vue';
import BgTakepulseBPMFeedbackModal from './BgTakepulseBPMFeedbackModal.vue'; import BgTakepulseBPMFeedbackModal from './BgTakepulseBPMFeedbackModal.vue';
@@ -123,6 +123,7 @@
:pagination="false" :pagination="false"
:scroll="{ x: 1800 }" :scroll="{ x: 1800 }"
:loading="feedbackLoading" :loading="feedbackLoading"
:rowClassName="feedbackStatusRowClassName"
> >
<template #bodyCell="{ column, record: feedbackRecord }"> <template #bodyCell="{ column, record: feedbackRecord }">
<template v-if="column.key === 'attachments'"> <template v-if="column.key === 'attachments'">
@@ -149,6 +150,7 @@
import { bgTakepulseFeedbackList } from '../BgTakepulse.api'; import { bgTakepulseFeedbackList } from '../BgTakepulse.api';
import type { BasicColumn } from '/@/components/Table'; import type { BasicColumn } from '/@/components/Table';
import { countFeedbackStatus } from '/@/views/bg/utils/feedbackStatusCount'; import { countFeedbackStatus } from '/@/views/bg/utils/feedbackStatusCount';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
const visible = ref(false); const visible = ref(false);
const title = ref('详情'); const title = ref('详情');
@@ -0,0 +1,37 @@
/**
* 反馈状态颜色工具:与台账颜色统一
* 未开始 -> warning(黄) / 进行中·督办中·整改中 -> error(红) / 已完成 -> success(绿)
*
* 说明:反馈字典(feedback_status)的码值与台账字典(super_status)不一致
* (反馈"已完成"码值为 '2',台账为 '3'),因此按显示的字典文本判定状态,
* 不依赖状态码,避免码值差异导致颜色失效。
*/
/** 根据字典文本返回状态颜色(warning/error/success */
export function feedbackStatusColorByText(text: string | number | undefined | null): string | undefined {
const t = String(text ?? '');
if (t.includes('未开始') || t.includes('未完成')) return 'warning';
if (t.includes('进行中') || t.includes('督办中') || t.includes('整改中') || t.includes('处理中')) return 'error';
if (t.includes('已完成') || t === '完成') return 'success';
return undefined;
}
/**
* 反馈表格整行背景色 class(表格 :rowClassName 使用)
* 自动兼容 bpmStatus / completionStatus 两套字段名,按字典文本判定状态。
* 对应全局样式:feedback-status-row-warning/error/success(定义于 /@/design/index.less
*/
export function feedbackStatusRowClassName(record: Recordable | undefined | null): string {
const text = String(
record?.['bpmStatus_dictText'] ??
record?.['completionStatus_dictText'] ??
record?.['bpmStatus'] ??
record?.['completionStatus'] ??
'',
);
const color = feedbackStatusColorByText(text);
if (color === 'warning') return 'feedback-status-row-warning';
if (color === 'error') return 'feedback-status-row-error';
if (color === 'success') return 'feedback-status-row-success';
return '';
}
@@ -205,6 +205,7 @@
:data-source="feedbackList" :data-source="feedbackList"
:pagination="false" :pagination="false"
:scroll="{ x: 1980 }" :scroll="{ x: 1980 }"
:rowClassName="feedbackStatusRowClassName"
> >
<template #bodyCell="{ column, record, index }"> <template #bodyCell="{ column, record, index }">
<template v-if="column.key === 'seq'">{{ index + 1 }}</template> <template v-if="column.key === 'seq'">{{ index + 1 }}</template>
@@ -286,6 +287,7 @@
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue'; import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import Icon from '/@/components/Icon/index'; import Icon from '/@/components/Icon/index';
import { bgXiSpeakFeedbackList, bgXiSpeakFeedbackDelete, saveBpmForm, saveSubApprove, getProcessVariable } from '../BgXiSpeak.api'; import { bgXiSpeakFeedbackList, bgXiSpeakFeedbackDelete, saveBpmForm, saveSubApprove, getProcessVariable } from '../BgXiSpeak.api';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
import { useSubApproveUserResolver } from '/@/composables/useSubApproveUserResolver'; import { useSubApproveUserResolver } from '/@/composables/useSubApproveUserResolver';
import { usePermission } from '/@/hooks/web/usePermission'; import { usePermission } from '/@/hooks/web/usePermission';
import TaskHandleInnerContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskHandleInnerContent.vue'; import TaskHandleInnerContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskHandleInnerContent.vue';
@@ -80,6 +80,7 @@
:pagination="false" :pagination="false"
:scroll="{ x: 1500 }" :scroll="{ x: 1500 }"
:loading="feedbackLoading" :loading="feedbackLoading"
:rowClassName="feedbackStatusRowClassName"
> >
<template #bodyCell="{ column, record: fb }"> <template #bodyCell="{ column, record: fb }">
<template v-if="column.key === 'action'"> <template v-if="column.key === 'action'">
@@ -109,6 +110,7 @@
import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue'; import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue';
import BgXiSpeakFeedbackDetailModal from './BgXiSpeakFeedbackDetailModal.vue'; import BgXiSpeakFeedbackDetailModal from './BgXiSpeakFeedbackDetailModal.vue';
import { bgXiSpeakFeedbackList } from '../BgXiSpeak.api'; import { bgXiSpeakFeedbackList } from '../BgXiSpeak.api';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
import type { BasicColumn } from '/@/components/Table'; import type { BasicColumn } from '/@/components/Table';
const visible = ref(false); const visible = ref(false);
@@ -19,6 +19,7 @@
:columns="columns" :columns="columns"
:dataSource="feedbackTableData" :dataSource="feedbackTableData"
:loading="loading" :loading="loading"
:rowClassName="feedbackStatusRowClassName"
:pagination="false" :pagination="false"
:bordered="false" :bordered="false"
> >
@@ -50,6 +51,7 @@
import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue'; import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue';
import BgXiSpeakFeedbackDetailModal from './BgXiSpeakFeedbackDetailModal.vue'; import BgXiSpeakFeedbackDetailModal from './BgXiSpeakFeedbackDetailModal.vue';
import { bgXiSpeakFeedbackList } from '../BgXiSpeak.api'; import { bgXiSpeakFeedbackList } from '../BgXiSpeak.api';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
const visible = ref(false); const visible = ref(false);
const loading = ref(false); const loading = ref(false);
@@ -19,6 +19,7 @@
:dataSource="feedbackTableData" :dataSource="feedbackTableData"
:loading="loading" :loading="loading"
:pagination="false" :pagination="false"
:rowClassName="feedbackStatusRowClassName"
:bordered="false" :bordered="false"
> >
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
@@ -44,6 +45,7 @@
import JModal from '/@/components/Modal/src/JModal/JModal.vue'; import JModal from '/@/components/Modal/src/JModal/JModal.vue';
import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue'; import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue';
import { list } from '../DqInspectProgress.api'; import { list } from '../DqInspectProgress.api';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
const visible = ref(false); const visible = ref(false);
const loading = ref(false); const loading = ref(false);
@@ -175,6 +175,7 @@
:data-source="feedbackList" :data-source="feedbackList"
:pagination="false" :pagination="false"
:scroll="{ x: 1200 }" :scroll="{ x: 1200 }"
:rowClassName="feedbackStatusRowClassName"
> >
<template #bodyCell="{ column, record, index }"> <template #bodyCell="{ column, record, index }">
<template v-if="column.key === 'seq'">{{ index + 1 }}</template> <template v-if="column.key === 'seq'">{{ index + 1 }}</template>
@@ -269,6 +270,7 @@
import Icon from '/@/components/Icon/index'; import Icon from '/@/components/Icon/index';
import { saveBpmForm, setProcessVariable, specificProblemOptions } from '../DqInspectTask.api'; import { saveBpmForm, setProcessVariable, specificProblemOptions } from '../DqInspectTask.api';
import { list as progressList, deleteOne as progressDelete } from '../../inspectProgress/DqInspectProgress.api'; import { list as progressList, deleteOne as progressDelete } from '../../inspectProgress/DqInspectProgress.api';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
import { usePermission } from '/@/hooks/web/usePermission'; import { usePermission } from '/@/hooks/web/usePermission';
import { CHARGE_LEADER_ROLE_ID } from '/@/constant/supervision'; import { CHARGE_LEADER_ROLE_ID } from '/@/constant/supervision';
import { useSelectNameResolver } from '/@/composables/useSelectNameResolver'; import { useSelectNameResolver } from '/@/composables/useSelectNameResolver';
@@ -85,6 +85,7 @@
:pagination="false" :pagination="false"
:scroll="{ x: 1200 }" :scroll="{ x: 1200 }"
:loading="feedbackLoading" :loading="feedbackLoading"
:rowClassName="feedbackStatusRowClassName"
> >
<template #bodyCell="{ column, record: fb }"> <template #bodyCell="{ column, record: fb }">
<template v-if="column.key === 'attachments'"> <template v-if="column.key === 'attachments'">
@@ -109,6 +110,7 @@
import Icon from '/@/components/Icon/index'; import Icon from '/@/components/Icon/index';
import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue'; import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue';
import { list } from '../../inspectProgress/DqInspectProgress.api'; import { list } from '../../inspectProgress/DqInspectProgress.api';
import { feedbackStatusRowClassName } from '/@/views/bg/utils/feedbackStatusRender';
import type { BasicColumn } from '/@/components/Table'; import type { BasicColumn } from '/@/components/Table';
const visible = ref(false); const visible = ref(false);