路由多语言维护, 优化layoutHeader组件样式,供应商评价-打分详情更改bug

This commit is contained in:
linxd
2025-07-02 16:14:42 +08:00
parent 1dc59c9587
commit 2b3eb5672d
13 changed files with 183 additions and 102 deletions

View File

@ -194,6 +194,7 @@ export default [
hideInMenu: true,
icon: 'icon-fenlei',
component: '@/pages/supplierAnnualManage/supplierAnnualTemplateManage/supplierAnnualTemplateManageAdd',
parentKeys: ['/supplierAnnual/supplierAnnualTemplateManage'],
},
{
name: '年审模板管理详情',
@ -201,6 +202,7 @@ export default [
hideInMenu: true,
icon: 'icon-fenlei',
component: '@/pages/supplierAnnualManage/supplierAnnualTemplateManage/supplierAnnualTemplateManageDetail',
parentKeys: ['/supplierAnnual/supplierAnnualTemplateManage'],
},
{
name: '年审任务管理',
@ -214,6 +216,7 @@ export default [
hideInMenu: true,
icon: 'icon-liebiaomoshi',
component: '@/pages/supplierAnnualManage/supplierAnnualTaskManage/supplierAnnualTaskManageAdd',
parentKeys: ['/supplierAnnual/supplierAnnualTaskManage'],
},
{
name: '年审任务管理详情',
@ -221,6 +224,7 @@ export default [
hideInMenu: true,
icon: 'icon-liebiaomoshi',
component: '@/pages/supplierAnnualManage/supplierAnnualTaskManage/supplierAnnualTaskManageDetail',
parentKeys: ['/supplierAnnual/supplierAnnualTaskManage'],
},
{
name: '年度审查',
@ -241,7 +245,7 @@ export default [
path: 'supplierAnnualScoreDetail',
hideInMenu: true,
icon: 'icon-liebiaomoshi',
parentKeys: ['/supplierAnnual/supplierAnnualScore'],
parentKeys: ['/supplierAnnual/supplierAnnualReview'],
component: '@/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualScoreDetail',
},

View File

@ -5,7 +5,7 @@ import LogoImg from '@/assets/img/logo.png';
import Language from './Language';
import User from './User';
import './layout.less';
const HeaderComponent: React.FC = (props) => {
const HeaderComponent: React.FC = () => {
return (
<div className="headerComponent">
<img className="logo" src={LogoImg} alt="logo" />

View File

@ -7,6 +7,7 @@
align-items: center;
justify-content: space-between;
padding: 0 15px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
.logo {
height: 45px;
}

View File

@ -9,7 +9,9 @@ export default {
'menu.评价规则管理': 'Evaluation Rule Management',
'menu.任务管理': 'Task Management',
'menu.任务管理新增': 'Add Task',
'menu.任务管理详情': 'Task Detail',
'menu.评价打分': 'Evaluation Scoring',
'menu.评价打分详情': 'Evaluation Scoring Detail',
'menu.评价结果': 'Evaluation Results',
'menu.评价结果详情': 'Evaluation Results Detail',
'menu.评价结果得分明细': 'Evaluation Score Details',
@ -28,9 +30,18 @@ export default {
// 供应商年审模块
'menu.供应商年审': 'Supplier Annual Review',
'menu.年审模板管理': 'Annual Review Template Management',
'menu.年审模板管理新增': 'Add Annual Review Template',
'menu.年审模板管理详情': 'Annual Review Template Detail',
'menu.年审任务管理': 'Annual Review Task Management',
'menu.年审任务管理新增': 'Add Annual Review Task',
'menu.年审任务管理详情': 'Annual Review Task Detail',
'menu.年度查询': 'Annual Query',
'menu.年审打分': 'Annual Review Scoring',
'menu.年审打分详情': 'Annual Review Scoring Detail',
'menu.年审结果': 'Annual Review Results',
'menu.年审结果一级查询列表': 'Annual Review Results Primary Query',
'menu.年审结果二级查询列表': 'Annual Review Results Secondary Query',
'menu.年审结果详情': 'Annual Review Results Detail',
//供应商
'menu.admit': 'admit',
@ -44,16 +55,16 @@ export default {
'menu.registrationQuery': 'Registered supplier inquiry',
'menu.groupQualifiedSupplierQuery': 'Group Qualified Supplier Query',
'menu.mySupplierInquiry': 'My supplier inquiry',
'menu.admission': '供应商准入',
'menu.admissionManagement': '供应商准入管理',
'menu.admissionReviewManagement': '供应商准入评审管理',
'menu.SupplierEntryReview': '供应商准入审核管理',
'menu.SupplierCategoryEntry': '供应商品类准入管理',
'menu.SupplierCategoryEntryReview': '供应商品类准入审核管理',
'menu.informationManagement': '供应商信息管理',
'menu.SupplierRegisterAgent': '供应商注册代录',
'menu.SupplierChangeManage': '供应商变更管理',
'menu.SupplierChangeReviewManage': '供应商变更审核管理',
'menu.admission': 'Supplier Admission',
'menu.admissionManagement': 'Supplier Admission Management',
'menu.admissionReviewManagement': 'Supplier Admission Review',
'menu.SupplierEntryReview': 'Supplier Entry Review',
'menu.SupplierCategoryEntry': 'Supplier Category Entry',
'menu.SupplierCategoryEntryReview': 'Supplier Category Entry Review',
'menu.informationManagement': 'Supplier Information Management',
'menu.SupplierRegisterAgent': 'Supplier Registration Agency',
'menu.SupplierChangeManage': 'Supplier Change Management',
'menu.SupplierChangeReviewManage': 'Supplier Change Review',
'menu.category': 'Supplier Category Library',
'menu.categoryManage': 'Category Management',
'menu.categoryLibraryManage': 'Category Library Management',

View File

@ -9,7 +9,9 @@ export default {
'menu.评价规则管理': '评价规则管理',
'menu.任务管理': '任务管理',
'menu.任务管理新增': '任务管理新增',
'menu.任务管理详情': '任务管理详情',
'menu.评价打分': '评价打分',
'menu.评价打分详情': '评价打分详情',
'menu.评价结果': '评价结果',
'menu.评价结果详情': '评价结果详情',
'menu.评价结果得分明细': '评价结果得分明细',
@ -27,9 +29,18 @@ export default {
// 供应商年审模块
'menu.供应商年审': '供应商年审',
'menu.年审模板管理': '年审模板管理',
'menu.年审模板管理新增': '年审模板管理新增',
'menu.年审模板管理详情': '年审模板管理详情',
'menu.年审任务管理': '年审任务管理',
'menu.年审任务管理新增': '年审任务管理新增',
'menu.年审任务管理详情': '年审任务管理详情',
'menu.年度查询': '年度查询',
'menu.年审打分': '年审打分',
'menu.年审打分详情': '年审打分详情',
'menu.年审结果': '年审结果',
'menu.年审结果一级查询列表': '年审结果一级查询列表',
'menu.年审结果二级查询列表': '年审结果二级查询列表',
'menu.年审结果详情': '年审结果详情',
'menu.年度审查': '年度审查',

View File

@ -24,6 +24,8 @@ import {
AnnualTaskStatusColor,
AnnualTaskStatusOptions,
} from '@/dicts/supplierAnnualTaskManageDict';
import type { DictItem } from '@/servers/api/dicts';
import { getDictList } from '@/servers/api/dicts';
const { RangePicker } = DatePicker;
const { Option } = Select;
@ -41,7 +43,7 @@ const SupplierAnnualTaskManage: React.FC = () => {
showQuickJumper: true,
});
const [searchParams, setSearchParams] = useState<any>({});
const [evaluateStatus, setEvaluateStatus] = useState<DictItem[]>([]);
// 获取年度任务列表
const fetchList = async (params: any = {}) => {
try {
@ -78,6 +80,11 @@ const SupplierAnnualTaskManage: React.FC = () => {
// 首次加载获取数据
useEffect(() => {
fetchList({ current: 1, pageSize: 10 });
getDictList('project_status').then((res) => {
if (res.success) {
setEvaluateStatus(res.data);
}
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
@ -183,11 +190,9 @@ const SupplierAnnualTaskManage: React.FC = () => {
},
{
title: '评价状态',
dataIndex: 'status',
key: 'status',
width: 100,
render: (status: string, record: supplierAnnualTaskManage.TaskRecord) =>
getStatusTag(status, record.statusName),
dataIndex: 'statusName',
key: 'statusName',
width: 100
},
{
title: '操作',
@ -232,9 +237,9 @@ const SupplierAnnualTaskManage: React.FC = () => {
</Form.Item>
<Form.Item name="status" label="评价状态">
<Select placeholder="请选择状态" allowClear style={{ width: 150 }}>
{AnnualTaskStatusOptions.map((item) => (
<Option key={item.value} value={item.value}>
{item.label}
{evaluateStatus.map((item) => (
<Option key={item.code} value={item.code}>
{item.dicName}
</Option>
))}
</Select>

View File

@ -1,6 +1,5 @@
import React, { useState, useEffect } from 'react';
import {
Card,
Form,
Input,
Select,
@ -18,9 +17,11 @@ import {
SearchOutlined,
DeleteOutlined,
} from '@ant-design/icons';
import { TaskStatus, TaskStatusText, TaskStatusColor } from '@/dicts/supplierTaskDict';
import { TaskStatusText, TaskStatusColor } from '@/dicts/supplierTaskDict';
import { history } from 'umi';
import { getEvaluateResultList, submitTaskForApproval } from '@/servers/api/supplierEvaluate';
import { getDictList } from '@/servers/api/dicts';
import type { DictItem } from '@/servers/api/dicts';
@ -49,24 +50,7 @@ const SupplierEvaluateResult: React.FC = () => {
showTotal: (total) => `${total} 条记录`,
});
const [searchParams, setSearchParams] = useState<EvaluateTaskSearchParams>({});
// 品类数据
const categoryOptions = [
{ label: '食品', value: '食品' },
{ label: '电子', value: '电子' },
{ label: '机械', value: '机械' },
{ label: '化工', value: '化工' },
{ label: '医药', value: '医药' },
];
// 创建单位数据
const unitOptions = [
{ label: '中山市合创展包装材料有限公司', value: '中山市合创展包装材料有限公司' },
{ label: '广州市科技发展有限公司', value: '广州市科技发展有限公司' },
{ label: '深圳市创新科技有限公司', value: '深圳市创新科技有限公司' },
{ label: '东莞市制造业有限公司', value: '东莞市制造业有限公司' },
];
const [evaluateStatus, setEvaluateStatus] = useState<DictItem[]>([]);
// 获取评价结果列表
const fetchResultList = async (
current = 1,
@ -132,6 +116,11 @@ const SupplierEvaluateResult: React.FC = () => {
// 首次加载获取数据
useEffect(() => {
fetchResultList(pagination.current, pagination.pageSize, {});
getDictList('project_status').then((res) => {
if (res.success) {
setEvaluateStatus(res.data);
}
});
}, []);
// 处理表格分页变化
@ -260,10 +249,9 @@ const SupplierEvaluateResult: React.FC = () => {
},
{
title: '评价状态',
dataIndex: 'status',
key: 'status',
dataIndex: 'statusName',
key: 'statusName',
width: 100,
render: (status: string) => getStatusTag(status),
},
{
title: '操作',
@ -305,9 +293,11 @@ const SupplierEvaluateResult: React.FC = () => {
</Form.Item>
<Form.Item name="status" label="评价状态">
<Select placeholder="请选择状态" allowClear style={{ width: 150 }}>
<Option value={TaskStatus.DRAFT}>{TaskStatusText[TaskStatus.DRAFT]}</Option>
<Option value={TaskStatus.PROCESSING}>{TaskStatusText[TaskStatus.PROCESSING]}</Option>
<Option value={TaskStatus.COMPLETED}>{TaskStatusText[TaskStatus.COMPLETED]}</Option>
{evaluateStatus.map((item) => (
<Option key={item.code} value={item.code}>
{item.dicName}
</Option>
))}
</Select>
</Form.Item>
<Form.Item className="filter-btns">

View File

@ -63,7 +63,6 @@ const SupplierEvaluateResultScoreByList: React.FC = () => {
// 获取上级页面传递的数据
useEffect(() => {
console.log(location.state);
if (location.state?.record) {
setRecord(location.state.record);
}

View File

@ -19,6 +19,8 @@ import {
getSupplierDimension,
getTaskPage,
} from '@/servers/api/supplierEvaluate';
import { getDictList } from '@/servers/api/dicts';
import type { DictItem } from '@/servers/api/dicts';
const { Title } = Typography;
const { TabPane } = Tabs;
@ -30,9 +32,9 @@ const SupplierEvaluateScore: React.FC = () => {
// 新增状态
const [activeTab, setActiveTab] = useState<string>('supplier');
const [supplierTableData, setSupplierTableData] = useState<
supplierEvaluateScore.SupplierDimensionRecord[]
SupplierEvaluateScore.SupplierDimensionResponse[]
>([]);
const [taskTableData, setTaskTableData] = useState<supplierEvaluateScore.TaskPageRecord[]>([]);
const [taskTableData, setTaskTableData] = useState<SupplierEvaluateScore.TaskPageResponse[]>([]);
const [supplierTableLoading, setSupplierTableLoading] = useState<boolean>(false);
const [taskTableLoading, setTaskTableLoading] = useState<boolean>(false);
const [pagination, setPagination] = useState({
@ -40,6 +42,7 @@ const SupplierEvaluateScore: React.FC = () => {
pageSize: 10,
total: 0,
});
const [evaluateStatus, setEvaluateStatus] = useState<DictItem[]>([]);
/*
name :关键字
startTime开始时间
@ -51,7 +54,7 @@ status状态
const values = filterForm.getFieldsValue();
if (activeTab === 'supplier') {
const params: supplierEvaluateScore.SupplierDimensionRequest = {
const params: SupplierEvaluateScore.SupplierDimensionRequest = {
basePageRequest: {
pageNo: pagination.current,
pageSize: pagination.pageSize,
@ -68,7 +71,7 @@ status状态
return params;
} else {
const params: supplierEvaluateScore.TaskPageRequest = {
const params: SupplierEvaluateScore.TaskPageRequest = {
basePageRequest: {
pageNo: pagination.current,
pageSize: pagination.pageSize,
@ -153,6 +156,11 @@ status状态
// 初始化加载数据
useEffect(() => {
handleSearch();
getDictList('project_status').then((res) => {
if (res.success) {
setEvaluateStatus(res.data);
}
});
}, [activeTab]);
// 处理标签页切换
@ -381,10 +389,11 @@ status状态
<Form.Item name="status" label="评价状态">
<Select placeholder="请选择" style={{ width: 150 }} allowClear>
<Option value="1"></Option>
<Option value="2"></Option>
<Option value="3"></Option>
<Option value="4"></Option>
{evaluateStatus.map((item) => (
<Option key={item.code} value={item.code}>
{item.dicName}
</Option>
))}
</Select>
</Form.Item>

View File

@ -9,12 +9,11 @@ import {
message,
Typography,
Empty,
Space,
Form,
Modal,
} from 'antd';
import { ArrowLeftOutlined, SaveOutlined, ExclamationCircleOutlined } from '@ant-design/icons';
import { getSupplierScoreDetail, saveEvaluateScore } from '@/servers/api/supplierEvaluate';
import { getIndicator, saveEvaluateScore } from '@/servers/api/supplierEvaluate';
import ScoreEvaluationTable from '@/components/ScoreEvaluationTable';
import styles from './supplierEvaluateScore.less';
@ -22,18 +21,14 @@ const { Title } = Typography;
const { confirm } = Modal;
const SupplierEvaluateScoreDetail: React.FC = () => {
const [form] = Form.useForm();
const location = useLocation<{
record: supplierEvaluateScore.SupplierDimensionRecord | supplierEvaluateScore.TaskPageRecord;
record: SupplierEvaluateScore.SupplierDimensionData;
mode?: 'view' | 'score'; // 查看模式或打分模式
recordType: 'supplier' | 'task'; // 记录类型:供应商或任务
}>();
const [loading, setLoading] = useState<boolean>(false);
const [submitting, setSubmitting] = useState<boolean>(false);
const [saving, setSaving] = useState<boolean>(false);
const [scoreDetail, setScoreDetail] = useState<supplierEvaluateScore.ScoreDetailData | null>(
null,
);
const [scoreDetail, setScoreDetail] = useState<SupplierEvaluateResult.EvaluateScoreDetailData>();
const [scoreData, setScoreData] = useState<any[]>([]);
const [record, setRecord] = useState<any>(null);
const [mode, setMode] = useState<'view' | 'score'>('view'); // 默认为查看模式
@ -63,7 +58,7 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
}, [location]);
// 将API数据转换为ScoreEvaluationTable组件所需的格式
const formatDataForScoreTable = (data: supplierEvaluateScore.ScoreDetailData) => {
const formatDataForScoreTable = (data: SupplierEvaluateResult.EvaluateScoreDetailData) => {
if (!data?.taskIndicatorVo) return [];
return data.taskIndicatorVo.map((indicator) => {
@ -103,7 +98,7 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
setLoading(true);
try {
const response = await getSupplierScoreDetail(record.id);
const response = await getIndicator(record.id);
if (response.success && response.data) {
setScoreDetail(response.data);
@ -167,7 +162,7 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
setSubmitting(true);
try {
// 构建提交数据
const submitData: supplierEvaluateScore.ScoreSaveRequest = {
const submitData: SupplierEvaluateScore.ScoreSaveRequest = {
id: record.id,
scoreVoList: scoreData.flatMap((item) => {
return item.indicatorNdList.map((subItem: any) => ({

View File

@ -6,6 +6,8 @@ import { history, useIntl } from 'umi';
import { TaskStatus, TaskStatusText, TaskStatusColor } from '@/dicts/supplierTaskDict';
import { getTaskList } from '@/servers/api/supplierEvaluate';
import styles from './supplierTaskManage.less';
import { getDictList } from '@/servers/api/dicts';
import type { DictItem } from '@/servers/api/dicts';
const { Option } = Select;
const { RangePicker } = DatePicker;
@ -30,7 +32,7 @@ const SupplierTaskManage: React.FC = () => {
pageSize: 10,
},
});
const [evaluateStatus, setEvaluateStatus] = useState<DictItem[]>([]);
const fetchTaskList = async (
current: number = 1,
pageSize: number = 10,
@ -72,6 +74,12 @@ const SupplierTaskManage: React.FC = () => {
useEffect(() => {
fetchTaskList(pagination.current!, pagination.pageSize!, searchParams);
// 从字典接口中获取评价状态
getDictList('project_status').then((res) => {
if (res.success) {
setEvaluateStatus(res.data);
}
});
}, []);
const handleView = (record: SupplierTaskManage.TaskItem) => {
@ -85,15 +93,6 @@ const SupplierTaskManage: React.FC = () => {
const handleDivision = (record: SupplierTaskManage.TaskItem) => {
history.push(`supplierTaskManageAdd?id=${record.id}&mode=division`);
};
const getStatusTag = (status: string) => {
const color = TaskStatusColor[status as keyof typeof TaskStatusColor] || 'default';
const text =
TaskStatusText[status as keyof typeof TaskStatusText] ||
intl.formatMessage({ id: 'supplierTaskManage.status.unknown' });
return <Tag color={color}>{text}</Tag>;
};
const handleTableChange = (newPagination: TablePaginationConfig) => {
fetchTaskList(newPagination.current!, newPagination.pageSize!, searchParams);
};
@ -179,7 +178,6 @@ const SupplierTaskManage: React.FC = () => {
dataIndex: 'statusName',
key: 'statusName',
width: 100,
// render: (status: string) => getStatusTag(status),
},
{
title: intl.formatMessage({ id: 'supplierTaskManage.column.action' }),
@ -240,15 +238,11 @@ const SupplierTaskManage: React.FC = () => {
placeholder={intl.formatMessage({ id: 'supplierTaskManage.placeholder.status' })}
allowClear
>
<Option value={TaskStatus.DRAFT}>
{intl.formatMessage({ id: 'supplierTaskManage.status.draft' })}
</Option>
<Option value={TaskStatus.PROCESSING}>
{intl.formatMessage({ id: 'supplierTaskManage.status.processing' })}
</Option>
<Option value={TaskStatus.COMPLETED}>
{intl.formatMessage({ id: 'supplierTaskManage.status.completed' })}
</Option>
{evaluateStatus.map((item) => (
<Option key={item.code} value={item.code}>
{item.dicName}
</Option>
))}
</Select>
</Form.Item>
<Form.Item

View File

@ -304,7 +304,7 @@ export async function saveEvaluateScore(params: SupplierEvaluateScore.ScoreSaveR
* @returns
*/
export async function getIndicator(id: string) {
return request<SupplierEvaluateResult.EvaluateScoreIndicator>('/coscoEvaluate/user/getIndicator', {
return request<SupplierEvaluateScore.ScoreDetailResponse>('/coscoEvaluate/user/getIndicator', {
method: 'GET',
params: { id },
});

View File

@ -4,18 +4,17 @@ declare namespace SupplierEvaluateScore {
// 现有接口定义
interface ScoreDetailResponse {
code: number;
data: any; // 使用 SupplierEvaluateResult.EvaluateScoreDetailData
data: SupplierEvaluateResult.EvaluateScoreDetailData; // 使用 SupplierEvaluateResult.EvaluateScoreDetailData
message: string;
success: boolean;
}
interface ScoreSaveRequest {
id: string;
score: number;
indicators: {
scoreVoList: {
id: string;
score: number;
remarks?: string;
remark?: string;
}[];
}
@ -27,27 +26,90 @@ declare namespace SupplierEvaluateScore {
}
interface SupplierDimensionRequest {
current?: number;
pageSize?: number;
taskId: string;
supplierId: string;
basePageRequest: {
pageNo: number;
pageSize: number;
};
name?: string;
status?: string;
startTime?: string;
endTime?: string;
}
/**
* 获取供应商维度响应
*/
interface SupplierDimensionResponse {
code: number;
data: any;
data: SupplierDimensionData;
message: string;
success: boolean;
[property: string]: any;
}
/**
* 供应商维度数据
*/
interface SupplierDimensionData {
categoryId: null;
categoryLimitation: string;
createBy: null;
createDate: null;
createTime: null;
deleteFlag: null;
delFlag: string;
deptId: null;
endTime: string;
evaluateTheme: string;
evaluateYear: string;
id: string;
indicatorList: IndicatorListItem[];
lastUpdateTime: null;
startTime: string;
status: string;
supplierIds: SupplierIdItem[];
templateId: string;
tenantId: null;
tenantName: null;
updateBy: null;
updateDate: null;
updateTime: null;
weightDept: null;
weightStatus: string;
weightValue: null;
[property: string]: any;
}
/**
* 指标列表项
*/
interface IndicatorListItem {
indicatorIds: null[];
type: string;
userId: string;
[property: string]: any;
}
/**
* 供应商ID项
*/
interface SupplierIdItem {
id: string;
userIds: any[];
[property: string]: any;
}
interface TaskPageRequest {
current?: number;
pageSize?: number;
evaluateTheme?: string;
evaluateYear?: string;
basePageRequest: {
pageNo: number;
pageSize: number;
};
name?: string;
status?: string;
startTime?: string;
endTime?: string;
status?: string;
evaluateTheme?: string;
evaluateYear?: string;
}
interface TaskPageResponse {