diff --git a/src/models/supplierAnnualTaskManage.ts b/src/models/supplierAnnualTaskManage.ts index 836d67e..5943ad2 100644 --- a/src/models/supplierAnnualTaskManage.ts +++ b/src/models/supplierAnnualTaskManage.ts @@ -1,9 +1,5 @@ import { message } from 'antd'; import { addAnnualTask, getAnnualTaskDetail,updateAnnualTask } from '@/servers/api/supplierAnnual'; -import type { SupplierItem } from '@/servers/dao/supplierEvaluateTask'; - -import type { TaskNotifyLowerUnits } from '@/dicts/supplierTaskDict'; - // Define the types for dva effects and reducers type Effect = (action: { payload: any }, effects: { call: any; put: any; select: any }) => Generator; type Reducer = (state: S, action: { payload: any }) => S; @@ -151,7 +147,7 @@ const supplierAnnualTaskManage: SupplierTaskModelType = { // 供应商IDs与评价人员IDs supplierPeopleVo: - taskFormData.selectedSuppliers?.map((supplier: SupplierItem) => { + taskFormData.selectedSuppliers?.map((supplier: supplierAnnualTaskManage.SupplierItem) => { // 从供应商的evaluators中提取用户ID const userIds = supplier.evaluators?.map((evaluator: supplierAnnualTaskManage.PersonnelItem) => evaluator.id) || []; return { @@ -235,7 +231,7 @@ const supplierAnnualTaskManage: SupplierTaskModelType = { // 3. 删除 selectedSuppliers(供应商对象) 中 evaluator(评价人员对象) 对象 updatedFormData.selectedSuppliers = (updatedFormData.selectedSuppliers || []) - .map((supplier: SupplierItem) => { + .map((supplier: supplierAnnualTaskManage.SupplierItem) => { const newEvaluators = (supplier.evaluators || []).filter( (evaluator: supplierAnnualTaskManage.PersonnelItem) => !userIdSet.has(String(evaluator.id)) ); @@ -244,7 +240,7 @@ const supplierAnnualTaskManage: SupplierTaskModelType = { evaluators: newEvaluators, }; }) - .filter((supplier: SupplierItem) => (supplier.evaluators || []).length > 0); + .filter((supplier: supplierAnnualTaskManage.SupplierItem) => (supplier.evaluators || []).length > 0); // 保存更新 yield put({ type: 'saveTaskFormData', payload: updatedFormData }); diff --git a/src/models/supplierTaskManage.ts b/src/models/supplierTaskManage.ts index 7d608e1..7bd5522 100644 --- a/src/models/supplierTaskManage.ts +++ b/src/models/supplierTaskManage.ts @@ -1,12 +1,5 @@ import { message } from 'antd'; import { addTask, getTaskDetail, addDivisionTask } from '@/servers/api/supplierEvaluate'; -import type { - TaskDetailData, - TaskAddRequest, - TaskDetailResponse -} from '@/servers/dao/supplierEvaluateTask'; -import type { TaskNotifyLowerUnits } from '@/dicts/supplierTaskDict'; -import type { PersonnelItem, IndicatorItem, SupplierItem } from '@/servers/dao/supplierEvaluateTask'; // Define the types for dva effects and reducers type Effect = (action: { payload: any }, effects: { call: any; put: any; select: any }) => Generator; @@ -20,8 +13,8 @@ export interface SupplierTaskModelState { currentStep: number; // 当前步骤索引,从0开始 loading: boolean; // 提交加载状态 detailLoading: boolean; // 详情数据加载状态 - taskFormData: Partial; // 任务表单数据 - taskDetail: TaskDetailData | null; // 任务详情数据 + taskFormData: Partial; // 任务表单数据 + taskDetail: SupplierTaskManage.TaskDetailData | null; // 任务详情数据 mode: 'add' | 'edit' | 'division'; // 模式 } @@ -82,13 +75,13 @@ const SupplierTaskModel: SupplierTaskModelType = { try { // 调用API获取任务详情 - const response = (yield call(getTaskDetail, taskId)) as TaskDetailResponse; + const response = (yield call(getTaskDetail, taskId)) as SupplierTaskManage.TaskDetailResponse; if (response.success) { - const detail: TaskDetailData = response.data; + const detail: SupplierTaskManage.TaskDetailData = response.data; // 转换任务详情数据为表单数据结构 - const taskFormData: Partial = { + const taskFormData: Partial = { id: detail.id || '', evaluateTheme: detail.evaluateTheme || '', startTime: detail.startTime || '', @@ -98,7 +91,6 @@ const SupplierTaskModel: SupplierTaskModelType = { evaluateYear: detail.evaluateYear || '', categoryId: detail.categoryId || undefined, - // 供应商数据转换,添加id和name字段用于UI展示 selectedSuppliers: detail.blackSupplierVos.map((item) => ({ ...item, @@ -127,8 +119,6 @@ const SupplierTaskModel: SupplierTaskModelType = { indicatorIds: matchedIndicator?.indicatorIds || [], }; }), - - }; // 保存数据到状态 @@ -154,7 +144,7 @@ const SupplierTaskModel: SupplierTaskModelType = { * @param payload.isDivisionMode 是否为分工模式 */ *submitTaskData( - { payload }: { payload: { taskStatus: TaskNotifyLowerUnits | null; isEditMode: boolean; taskId: string; onSuccess?: () => void; isDivisionMode: boolean } }, + { payload }: { payload: { taskStatus: string | null; isEditMode: boolean; taskId: string; onSuccess?: () => void; isDivisionMode: boolean } }, { call, put, select }: { call: any; put: any; select: any } ) { const { taskStatus, isEditMode, taskId, onSuccess, isDivisionMode } = payload; @@ -162,10 +152,10 @@ const SupplierTaskModel: SupplierTaskModelType = { try { // 获取表单数据 - const { taskFormData } = (yield select((state: any) => state.supplierTaskManage)) as { taskFormData: TaskAddRequest }; + const { taskFormData } = (yield select((state: any) => state.supplierTaskManage)) as { taskFormData: SupplierTaskManage.TaskAddRequest }; // 构建提交数据 - let submitData: TaskAddRequest = { + let submitData: SupplierTaskManage.TaskAddRequest = { evaluateTheme: taskFormData.evaluateTheme || '', startTime: taskFormData.startTime || '', endTime: taskFormData.endTime || '', @@ -202,7 +192,6 @@ const SupplierTaskModel: SupplierTaskModelType = { }) || [], }; - if (isEditMode || isDivisionMode) { // 编辑模式,添加ID字段 submitData = { @@ -235,7 +224,7 @@ const SupplierTaskModel: SupplierTaskModelType = { */ *updateFormData({ payload }: { payload: any }, { put, select }: { put: any; select: any }) { // 获取当前表单数据 - const { taskFormData } = (yield select((state: any) => state.supplierTaskManage)) as { taskFormData: TaskAddRequest }; + const { taskFormData } = (yield select((state: any) => state.supplierTaskManage)) as { taskFormData: SupplierTaskManage.TaskAddRequest }; // 合并新的表单数据 const updatedFormData = { ...taskFormData, ...payload }; // 处理供应商选择更新 @@ -250,10 +239,10 @@ const SupplierTaskModel: SupplierTaskModelType = { // 处理评价人员更新 - 更新后要保留原有对象中的indicatorIds if (payload.userList) { const existingUserMap = new Map( - (taskFormData.userList || []).map((user: PersonnelItem) => [user.id || user.userId, user]) + (taskFormData.userList || []).map((user: SupplierTaskManage.PersonnelItem) => [user.id || user.userId, user]) ); - updatedFormData.userList = payload.userList.map((newUser: PersonnelItem) => { + updatedFormData.userList = payload.userList.map((newUser: SupplierTaskManage.PersonnelItem) => { const userId = newUser.id || newUser.userId; const existing = existingUserMap.get(userId); @@ -269,7 +258,6 @@ const SupplierTaskModel: SupplierTaskModelType = { }); } - // 处理部门权重 if (payload.taskDeptWeightList) { updatedFormData.taskDeptWeightList = payload.taskDeptWeightList; @@ -290,26 +278,26 @@ const SupplierTaskModel: SupplierTaskModelType = { const userIdSet = new Set(userIds.filter(Boolean).map(String)); const { taskFormData } = (yield select((state: any) => state.supplierTaskManage)) as { - taskFormData: TaskAddRequest; + taskFormData: SupplierTaskManage.TaskAddRequest; }; const updatedFormData = { ...taskFormData }; // 1. 删除 userList 中的用户 updatedFormData.userList = (updatedFormData.userList || []).filter( - (user: PersonnelItem) => !userIdSet.has(String(user.id || user.userId)) + (user: SupplierTaskManage.PersonnelItem) => !userIdSet.has(String(user.id || user.userId)) ); // 2. 删除 indicatorList(指标对象) 中该用户的指标 updatedFormData.indicatorList = (updatedFormData.indicatorList || []).filter( - (item: IndicatorItem) => !userIdSet.has(String(item.userId)) + (item: SupplierTaskManage.IndicatorItem) => !userIdSet.has(String(item.userId)) ); // 3. 删除 selectedSuppliers(供应商对象) 中 evaluator(评价人员对象) 对象 updatedFormData.selectedSuppliers = (updatedFormData.selectedSuppliers || []) - .map((supplier: SupplierItem) => { + .map((supplier: SupplierTaskManage.SupplierItem) => { const newEvaluators = (supplier.evaluators || []).filter( - (evaluator: PersonnelItem) => !userIdSet.has(String(evaluator.id)) + (evaluator: SupplierTaskManage.PersonnelItem) => !userIdSet.has(String(evaluator.id)) ); return { ...supplier, @@ -322,7 +310,6 @@ const SupplierTaskModel: SupplierTaskModelType = { yield put({ type: 'saveTaskFormData', payload: updatedFormData }); }, - /** * 下一步 * 将当前步骤索引加1 diff --git a/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/EvaluatorComponents/BatchEvaluatorModal.tsx b/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/EvaluatorComponents/BatchEvaluatorModal.tsx index 99f8036..5eb3bf4 100644 --- a/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/EvaluatorComponents/BatchEvaluatorModal.tsx +++ b/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/EvaluatorComponents/BatchEvaluatorModal.tsx @@ -1,13 +1,12 @@ import React from 'react'; import { Modal } from 'antd'; import EvaluateTaskPersonnelSelector from '@/components/EvaluateTaskPersonnelSelector/EvaluateTaskPersonnelSelector'; -import type { PersonnelItem } from '@/servers/types/evaluator'; interface BatchEvaluatorModalProps { visible: boolean; onCancel: () => void; - onSelect: (selectedEvaluators: PersonnelItem[]) => void; - selectedPersonnel?: PersonnelItem[]; + onSelect: (selectedEvaluators: supplierAnnualTaskManage.PersonnelItem[]) => void; + selectedPersonnel?: supplierAnnualTaskManage.PersonnelItem[]; filter?: boolean; filterUserIds?: string[]; } @@ -20,9 +19,40 @@ const BatchEvaluatorModal: React.FC = ({ filter, filterUserIds, }) => { + // 将 API.PersonnelItem 转换为 supplierAnnualTaskManage.PersonnelItem + const convertToTaskPersonnel = (items: API.PersonnelItem[]): supplierAnnualTaskManage.PersonnelItem[] => { + return items.map(item => ({ + id: item.id, + name: item.name, + userId: item.id, // 使用 id 作为 userId + userName: item.name, // 使用 name 作为 userName + userDept: item.userDept, + userDeptId: item.userDeptId, + position: item.position || '', + isSelected: item.isSelected + })); + }; + + // 将 supplierAnnualTaskManage.PersonnelItem 转换为 API.PersonnelItem + const convertToAPIPersonnel = (items: supplierAnnualTaskManage.PersonnelItem[]): API.PersonnelItem[] => { + return items.map(item => ({ + id: item.id, + name: item.name, + userDept: item.userDept, + userDeptId: item.userDeptId, + position: item.position, + isSelected: item.isSelected // 默认值 + })); + }; + + // 处理选择事件,将 API.PersonnelItem 转换为 supplierAnnualTaskManage.PersonnelItem + const handleSelect = (apiPersonnel: API.PersonnelItem[]) => { + onSelect(convertToTaskPersonnel(apiPersonnel)); + }; + return ( = ({ destroyOnClose={false} > void; // 取消按钮回调函数 - onSelect: (personnel: PersonnelItem[]) => void; // 选择人员后的回调函数 - currentSupplier: SupplierItem | null; // 当前操作的供应商对象 + onSelect: (personnel: supplierAnnualTaskManage.PersonnelItem[]) => void; // 选择人员后的回调函数 + currentSupplier: supplierAnnualTaskManage.SupplierItem | null; // 当前操作的供应商对象 mode: ModalMode; // 弹窗模式:SELECT(选择) 或 VIEW(查看) filter?: boolean; // 是否过滤评价人员 filterUserIds?: string[]; // 过滤评价人员ID列表 @@ -24,7 +28,7 @@ const SupplierEvaluatorModal: React.FC = ({ filterUserIds, }) => { // 本地保存当前选中的人员,确保在弹窗打开/关闭时能正确处理数据 - const [localSelectedPersonnel, setLocalSelectedPersonnel] = useState([]); + const [localSelectedPersonnel, setLocalSelectedPersonnel] = useState([]); // 当currentSupplier变化时,更新本地的选中人员 useEffect(() => { @@ -35,14 +39,41 @@ const SupplierEvaluatorModal: React.FC = ({ } }, [currentSupplier]); + // 将 API.PersonnelItem 转换为 supplierAnnualTaskManage.PersonnelItem + const convertToTaskPersonnel = (items: API.PersonnelItem[]): supplierAnnualTaskManage.PersonnelItem[] => { + return items.map(item => ({ + id: item.id, + name: item.name, + userId: item.id, // 使用 id 作为 userId + userName: item.name, // 使用 name 作为 userName + userDept: item.userDept, + userDeptId: item.userDeptId, + position: item.position || '', + isSelected: item.isSelected + })); + }; + + // 将 supplierAnnualTaskManage.PersonnelItem 转换为 API.PersonnelItem + const convertToAPIPersonnel = (items: supplierAnnualTaskManage.PersonnelItem[]): API.PersonnelItem[] => { + return items.map(item => ({ + id: item.id, + name: item.name, + userDept: item.userDept, + userDeptId: item.userDeptId, + position: item.position, + isSelected: item.isSelected // 默认值 + })); + }; + // 处理选择人员的回调 - const handleSelect = (personnel: PersonnelItem[]) => { + const handleSelect = (personnel: API.PersonnelItem[]) => { if (personnel.length === 0) { message.warning('请至少选择一名评价人员'); return; } - setLocalSelectedPersonnel(personnel); - onSelect(personnel); + const convertedPersonnel = convertToTaskPersonnel(personnel); + setLocalSelectedPersonnel(convertedPersonnel); + onSelect(convertedPersonnel); }; // 渲染评价人员列表(用于查看模式) @@ -64,7 +95,7 @@ const SupplierEvaluatorModal: React.FC = ({ ( + renderItem={(item: supplierAnnualTaskManage.PersonnelItem) => ( = ({ onSelect={handleSelect} filter={filter} filterUserIds={filterUserIds} - selectedPersonnel={localSelectedPersonnel} + selectedPersonnel={convertToAPIPersonnel(localSelectedPersonnel)} onClose={onCancel} /> ) : ( diff --git a/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/EvaluatorComponents/SupplierTable.tsx b/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/EvaluatorComponents/SupplierTable.tsx index b3c4cb8..e60e96d 100644 --- a/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/EvaluatorComponents/SupplierTable.tsx +++ b/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/EvaluatorComponents/SupplierTable.tsx @@ -1,13 +1,12 @@ -import React, { useEffect } from 'react'; -import { Table, Space, Button, Tag, Modal, Tooltip } from 'antd'; -import type { SupplierItem } from '@/servers/types/evaluator'; +import React from 'react'; +import { Table, Space, Button, Modal, Tooltip } from 'antd'; interface SupplierTableProps { - suppliers: SupplierItem[]; // 供应商数据列表 + suppliers: supplierAnnualTaskManage.SupplierItem[]; // 供应商数据列表 selectedRowKeys: React.Key[]; // 选中的行keys onSelectChange: (selectedRowKeys: React.Key[]) => void; // 选择行变化的回调 - onViewEvaluators: (supplier: SupplierItem) => void; // 查看评价人员的回调 - onSelectEvaluators: (supplier: SupplierItem) => void; // 选择评价人员的回调 + onViewEvaluators: (supplier: supplierAnnualTaskManage.SupplierItem) => void; // 查看评价人员的回调 + onSelectEvaluators: (supplier: supplierAnnualTaskManage.SupplierItem) => void; // 选择评价人员的回调 onDeleteSupplier: (key: string) => void; // 删除供应商的回调 mode?: string; // 模式 } @@ -28,11 +27,11 @@ const SupplierTable: React.FC = ({ }; // 删除确认对话框 - const showDeleteConfirm = (record: SupplierItem) => { + const showDeleteConfirm = (record: supplierAnnualTaskManage.SupplierItem) => { Modal.confirm({ title: '确定要删除此供应商吗?', content: `供应商: ${record.supplierName}${ - record.evaluatorCount > 0 ? `,将同时删除 ${record.evaluatorCount} 名关联的评价人员` : '' + record.evaluatorCount && record.evaluatorCount > 0 ? `,将同时删除 ${record.evaluatorCount} 名关联的评价人员` : '' }`, okText: '确定', okType: 'danger', @@ -77,7 +76,7 @@ const SupplierTable: React.FC = ({ { title: '操作', key: 'action', - render: (_: any, record: SupplierItem) => ( + render: (_: any, record: supplierAnnualTaskManage.SupplierItem) => ( @@ -321,7 +317,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => { /> )} - {/* 批量选择年审人员弹窗 */} + {/* 批量选择评价人员弹窗 */} setBatchSelectModalVisible(false)} @@ -330,7 +326,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => { onSelect={handleBatchEvaluatorSelect} /> - {/* 单个供应商年审人员弹窗 */} + {/* 单个供应商评价人员弹窗 */} setEvaluatorModalVisible(false)} diff --git a/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/SupplierSelectStep.tsx b/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/SupplierSelectStep.tsx index 6a40b9c..eea174e 100644 --- a/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/SupplierSelectStep.tsx +++ b/src/pages/supplierAnnualManage/supplierAnnualTaskManage/components/SupplierSelectStep.tsx @@ -2,7 +2,6 @@ import React, { forwardRef, useImperativeHandle, useEffect, useState } from 'rea import { Card } from 'antd'; import styles from '../supplierAnnualTaskManageAdd.less'; import SupplierSelector from '@/components/SupplierSelector'; -import type { SupplierItem } from '@/servers/dao/supplierEvaluateTask'; import type { Dispatch } from 'umi'; import { connect } from 'umi'; import type { SupplierTaskModelState } from '@/models/supplierAnnualTaskManage'; @@ -21,7 +20,7 @@ const SupplierSelectStepComponent = (props: SupplierSelectStepProps) => { const { taskFormData } = supplierAnnualTaskManage; // 内部状态,避免直接操作formData导致循环更新 - const [selectedSuppliers, setSelectedSuppliers] = useState([]); + const [selectedSuppliers, setSelectedSuppliers] = useState([]); // 当taskFormData.selectedSuppliers更新时,同步到本地状态 useEffect(() => { @@ -40,7 +39,7 @@ const SupplierSelectStepComponent = (props: SupplierSelectStepProps) => { })); // 处理供应商选择 - const handleSupplierSelect = (suppliers: SupplierItem[]) => { + const handleSupplierSelect = (suppliers: supplierAnnualTaskManage.SupplierItem[]) => { // 确保每个供应商都有evaluators字段 const suppliersWithEvaluators = suppliers.map(supplier => ({ ...supplier, diff --git a/src/pages/supplierAnnualManage/supplierAnnualTaskManage/supplierAnnualTaskManageAdd.tsx b/src/pages/supplierAnnualManage/supplierAnnualTaskManage/supplierAnnualTaskManageAdd.tsx index c118013..1a8c419 100644 --- a/src/pages/supplierAnnualManage/supplierAnnualTaskManage/supplierAnnualTaskManageAdd.tsx +++ b/src/pages/supplierAnnualManage/supplierAnnualTaskManage/supplierAnnualTaskManageAdd.tsx @@ -167,7 +167,7 @@ const SupplierTaskManageAdd: React.FC = ({ supplierAnnualTaskManage, * 提交任务数据 * @param taskStatus 任务状态,决定是否需要下级单位完善 */ - const submitTaskData = (taskStatus: TaskNotifyLowerUnits | null) => { + const submitTaskData = (taskStatus: string | null) => { if (dispatch) { dispatch({ type: 'supplierAnnualTaskManage/submitTaskData', diff --git a/src/pages/supplierEvaluateManage/supplierEvaluateResult/supplierEvaluateResult.tsx b/src/pages/supplierEvaluateManage/supplierEvaluateResult/supplierEvaluateResult.tsx index 8431def..abb372f 100644 --- a/src/pages/supplierEvaluateManage/supplierEvaluateResult/supplierEvaluateResult.tsx +++ b/src/pages/supplierEvaluateManage/supplierEvaluateResult/supplierEvaluateResult.tsx @@ -9,32 +9,37 @@ import { Space, Tag, DatePicker, - TablePaginationConfig, Modal, - Row, - Col, Tooltip, message, } from 'antd'; +import type { TablePaginationConfig } from 'antd'; import { SearchOutlined, DeleteOutlined, - EyeOutlined, - PlusOutlined, } from '@ant-design/icons'; -import { TaskStatus, TaskStatusText, TaskStatusColor, TaskType, TaskTypeText } from '@/dicts/supplierTaskDict'; -import moment from 'moment'; -import styles from './supplierEvaluateResult.less'; +import { TaskStatus, TaskStatusText, TaskStatusColor } from '@/dicts/supplierTaskDict'; import { history } from 'umi'; import { getEvaluateResultList, submitTaskForApproval } from '@/servers/api/supplierEvaluate'; + + +// 扩展评价任务搜索参数类型 +interface EvaluateTaskSearchParams { + evaluateTheme?: string; + status?: string; + timeRange?: string[]; + [key: string]: any; +} + + const { Option } = Select; const { RangePicker } = DatePicker; const SupplierEvaluateResult: React.FC = () => { const [loading, setLoading] = useState(false); const [form] = Form.useForm(); - const [resultData, setResultData] = useState([]); + const [resultData, setResultData] = useState< SupplierEvaluateResult.EvaluateTaskItem []>([]); const [pagination, setPagination] = useState({ current: 1, pageSize: 10, @@ -43,7 +48,7 @@ const SupplierEvaluateResult: React.FC = () => { showQuickJumper: true, showTotal: (total) => `共 ${total} 条记录`, }); - const [searchParams, setSearchParams] = useState({}); + const [searchParams, setSearchParams] = useState({}); // 品类数据 const categoryOptions = [ @@ -66,7 +71,7 @@ const SupplierEvaluateResult: React.FC = () => { const fetchResultList = async ( current = 1, pageSize = 10, - params: API.EvaluateTaskSearchParams = searchParams, + params: EvaluateTaskSearchParams = searchParams, ) => { // 更新搜索参数状态 if (params !== searchParams) { @@ -76,7 +81,7 @@ const SupplierEvaluateResult: React.FC = () => { setLoading(true); try { // 构建请求参数 - const requestParams: API.EvaluateTaskRequest = { + const requestParams: SupplierEvaluateResult.EvaluateTaskRequest = { basePageRequest: { pageNo: current, pageSize: pageSize, @@ -137,7 +142,7 @@ const SupplierEvaluateResult: React.FC = () => { // 处理搜索 const handleSearch = (values: any) => { const { timeRange, ...rest } = values; - const params: API.EvaluateTaskSearchParams = { ...rest }; + const params: EvaluateTaskSearchParams = { ...rest }; if (timeRange && timeRange.length === 2) { params.timeRange = [timeRange[0].format('YYYY-MM-DD'), timeRange[1].format('YYYY-MM-DD')]; @@ -153,7 +158,7 @@ const SupplierEvaluateResult: React.FC = () => { }; // 处理提交审批 - const handleApprove = (record: API.EvaluateTaskRecord) => { + const handleApprove = (record: SupplierEvaluateResult.EvaluateTaskItem ) => { Modal.confirm({ title: '提交审批确认', content: `确定要提交"${record.evaluateTheme}"的评价任务进行审批吗?`, @@ -178,7 +183,7 @@ const SupplierEvaluateResult: React.FC = () => { }; // 查看详情 - 修改为跳转到详情页 - const handleViewDetail = (record: API.EvaluateTaskRecord) => { + const handleViewDetail = (record: SupplierEvaluateResult.EvaluateTaskItem ) => { history.push({ pathname: 'supplierEvaluateResultInfo', state: { record } @@ -195,7 +200,7 @@ const SupplierEvaluateResult: React.FC = () => { const columns = [ { title: '序号', - render: (_: any, __: API.EvaluateTaskRecord, index: number) => + render: (_: any, __: SupplierEvaluateResult.EvaluateTaskItem , index: number) => (pagination.current! - 1) * pagination.pageSize! + index + 1, width: 80, }, @@ -265,7 +270,7 @@ const SupplierEvaluateResult: React.FC = () => { key: 'action', width: 100, align: 'center' as const, - render: (_: unknown, record: API.EvaluateTaskRecord) => ( + render: (_: unknown, record: SupplierEvaluateResult.EvaluateTaskItem ) => ( diff --git a/src/pages/supplierEvaluateManage/supplierEvaluateResult/supplierEvaluateResultScoreDetail.tsx b/src/pages/supplierEvaluateManage/supplierEvaluateResult/supplierEvaluateResultScoreDetail.tsx index 5750e08..b9dd99d 100644 --- a/src/pages/supplierEvaluateManage/supplierEvaluateResult/supplierEvaluateResultScoreDetail.tsx +++ b/src/pages/supplierEvaluateManage/supplierEvaluateResult/supplierEvaluateResultScoreDetail.tsx @@ -11,13 +11,13 @@ const { Title } = Typography; const SupplierEvaluateResultScoreDetail: React.FC = () => { const location = useLocation<{ - record: API.EvaluateSupplierRecord; - parentRecord: API.EvaluateTaskRecord; + record: SupplierEvaluateResult.EvaluateSupplierItem; + parentRecord: SupplierEvaluateResult.EvaluateTaskItem; }>(); const [loading, setLoading] = useState(false); - const [supplierRecord, setSupplierRecord] = useState(null); - const [parentRecord, setParentRecord] = useState(null); - const [scoreDetail, setScoreDetail] = useState(null); + const [supplierRecord, setSupplierRecord] = useState(null); + const [parentRecord, setParentRecord] = useState(null); + const [scoreDetail, setScoreDetail] = useState(null); // 获取上级页面传递的数据 useEffect(() => { @@ -69,12 +69,12 @@ const SupplierEvaluateResultScoreDetail: React.FC = () => { const formatDataForScoreTable = () => { if (!scoreDetail?.taskIndicatorVo) return []; - return scoreDetail.taskIndicatorVo.map(indicator => { + return scoreDetail.taskIndicatorVo.map((indicator: SupplierEvaluateResult.TaskIndicatorVo) => { return { baseIndicator: indicator.baseIndicator, descIndicator: indicator.indicatorDesc, score: indicator.score, - indicatorNdList: indicator.subIndicator?.map(subItem => { + indicatorNdList: indicator.subIndicator?.map((subItem: SupplierEvaluateResult.SubIndicator) => { return { subIndicator: subItem.subIndicator, score: subItem.subScore, diff --git a/src/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApproval.less b/src/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApproval.less deleted file mode 100644 index 7780f18..0000000 Binary files a/src/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApproval.less and /dev/null differ diff --git a/src/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApproval.tsx b/src/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApproval.tsx deleted file mode 100644 index 6c7c9a9..0000000 --- a/src/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApproval.tsx +++ /dev/null @@ -1,452 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { - Card, - Form, - Input, - Select, - Button, - Table, - Space, - Tag, - DatePicker, - TablePaginationConfig, - Tooltip, - message, - Modal, - Timeline, - Descriptions, -} from 'antd'; -import { - SearchOutlined, - DeleteOutlined, - CheckCircleOutlined, - CloseCircleOutlined, - HistoryOutlined, - AuditOutlined, -} from '@ant-design/icons'; -import { TaskStatus, TaskStatusText, TaskStatusColor } from '@/dicts/supplierTaskDict'; -import { - ProcessStatus, - ProcessStatusText, - ProcessStatusColor, - ApprovalResult, - ApprovalResultText, - ApprovalResultColor -} from '@/dicts/supplierEvaluateDict'; -import moment from 'moment'; -import { history } from 'umi'; - -const { Option } = Select; -const { RangePicker } = DatePicker; - -// 使用全局类型定义 - -const SupplierEvaluateResultApproval: React.FC = () => { - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const [approvalData, setApprovalData] = useState([]); - const [pagination, setPagination] = useState({ - current: 1, - pageSize: 10, - total: 0, - showSizeChanger: true, - showQuickJumper: true, - showTotal: (total) => `共 ${total} 条记录`, - }); - const [searchParams, setSearchParams] = useState({}); - - // 审批相关状态 - const [historyModalVisible, setHistoryModalVisible] = useState(false); - const [currentRecord, setCurrentRecord] = useState(null); - const [approvalHistoryData, setApprovalHistoryData] = useState([]); - - // 品类数据 - const categoryOptions = [ - { label: '食品', value: '食品' }, - { label: '电子', value: '电子' }, - { label: '机械', value: '机械' }, - { label: '化工', value: '化工' }, - { label: '医药', value: '医药' }, - ]; - - // 创建单位数据 - const unitOptions = [ - { label: '中山市合创展包装材料有限公司', value: '中山市合创展包装材料有限公司' }, - { label: '广州市科技发展有限公司', value: '广州市科技发展有限公司' }, - { label: '深圳市创新科技有限公司', value: '深圳市创新科技有限公司' }, - { label: '东莞市制造业有限公司', value: '东莞市制造业有限公司' }, - ]; - - // 模拟获取审批列表 - const fetchApprovalList = async ( - current = 1, - pageSize = 10, - params: SupplierEvaluate.ApprovalSearchParams = searchParams, - ) => { - // 更新搜索参数状态 - if (params !== searchParams) { - setSearchParams(params); - } - - setLoading(true); - try { - // 模拟API请求 - setTimeout(() => { - // 模拟数据 - const mockData: SupplierEvaluate.ApprovalRecord[] = Array.from({ length: 35 }).map((_, index) => { - const id = `${index + 1}`; - - // 随机生成流程状态 - const processStatusOptions = Object.values(ProcessStatus); - const processStatus = processStatusOptions[Math.floor(Math.random() * processStatusOptions.length)]; - - // 随机生成审批结果 - const approvalResultOptions = Object.values(ApprovalResult); - const approvalResult = approvalResultOptions[Math.floor(Math.random() * approvalResultOptions.length)]; - - // 随机选择单位和品类 - const unitIndex = Math.floor(Math.random() * unitOptions.length); - const categoryIndex = Math.floor(Math.random() * categoryOptions.length); - - // 随机生成申请日期 - const applyDate = moment().subtract(Math.floor(Math.random() * 60), 'days'); - - return { - id, - key: id, - evaluateTitle: `供应商评价任务${index + 1}`, - evaluateCategory: categoryOptions[categoryIndex].value, - initiatingUnit: unitOptions[unitIndex].value, - applyTime: applyDate.format('YYYY-MM-DD'), - processStatus, - approvalResult, - }; - }); - - // 根据搜索条件过滤 - let filteredData = [...mockData]; - if (params.evaluateTitle) { - filteredData = filteredData.filter(item => - item.evaluateTitle.includes(params.evaluateTitle || '') - ); - } - if (params.processStatus) { - filteredData = filteredData.filter(item => - item.processStatus === params.processStatus - ); - } - if (params.approvalResult) { - filteredData = filteredData.filter(item => - item.approvalResult === params.approvalResult - ); - } - if (params.timeRange && params.timeRange.length === 2) { - const start = moment(params.timeRange[0]); - const end = moment(params.timeRange[1]); - filteredData = filteredData.filter(item => { - const itemDate = moment(item.applyTime); - return itemDate.isBetween(start, end, null, '[]'); - }); - } - - // 分页 - const startIndex = (current - 1) * pageSize; - const endIndex = startIndex + pageSize; - const paginatedData = filteredData.slice(startIndex, endIndex); - - setApprovalData(paginatedData); - setPagination({ - ...pagination, - current, - pageSize, - total: filteredData.length, - }); - - setLoading(false); - }, 500); - } catch (error) { - console.error('获取审批列表失败:', error); - message.error('获取审批列表失败'); - setLoading(false); - } - }; - - // 模拟获取审批历史记录 - const fetchApprovalHistory = (recordId: string) => { - // 模拟数据 - const historyData: SupplierEvaluate.ApprovalHistoryRecord[] = [ - { - id: '1', - operator: '张三', - action: '提交申请', - comment: '提交供应商评价结果审批', - time: moment().subtract(5, 'days').format('YYYY-MM-DD HH:mm:ss'), - }, - { - id: '2', - operator: '李四', - action: '部门审核', - comment: '部门审核通过', - time: moment().subtract(4, 'days').format('YYYY-MM-DD HH:mm:ss'), - }, - { - id: '3', - operator: '王五', - action: '经理审批', - comment: '经理审批通过', - time: moment().subtract(3, 'days').format('YYYY-MM-DD HH:mm:ss'), - }, - { - id: '4', - operator: '赵六', - action: '总监审批', - comment: '总监审批中', - time: moment().subtract(2, 'days').format('YYYY-MM-DD HH:mm:ss'), - }, - ]; - - setApprovalHistoryData(historyData); - }; - - // 首次加载获取数据 - useEffect(() => { - fetchApprovalList(pagination.current, pagination.pageSize, {}); - }, []); - - // 处理表格分页变化 - const handleTableChange = (newPagination: TablePaginationConfig) => { - fetchApprovalList(newPagination.current, newPagination.pageSize, searchParams); - }; - - // 处理搜索 - const handleSearch = (values: any) => { - const { timeRange, ...rest } = values; - const params: SupplierEvaluate.ApprovalSearchParams = { ...rest }; - - if (timeRange && timeRange.length === 2) { - params.timeRange = [timeRange[0].format('YYYY-MM-DD'), timeRange[1].format('YYYY-MM-DD')]; - } - - fetchApprovalList(1, pagination.pageSize, params); - }; - - // 处理重置 - const handleReset = () => { - form.resetFields(); - fetchApprovalList(1, pagination.pageSize, {}); - }; - - // 跳转到审批页面 - const handleApproval = (record: SupplierEvaluate.ApprovalRecord) => { - history.push({ - pathname: '/supplierEvaluateResultApproval/supplierEvaluateResultApprovalInfo', - state: { record } - }); - }; - - // 打开审批历史弹窗 - const handleViewHistory = (record: SupplierEvaluate.ApprovalRecord) => { - setCurrentRecord(record); - fetchApprovalHistory(record.id); - setHistoryModalVisible(true); - }; - - // 刷新列表 - const refreshList = () => { - fetchApprovalList(pagination.current, pagination.pageSize, searchParams); - }; - - // 获取流程状态标签 - const getProcessStatusTag = (status: string) => { - const color = ProcessStatusColor[status as keyof typeof ProcessStatusColor] || 'default'; - const text = ProcessStatusText[status as keyof typeof ProcessStatusText] || '未知状态'; - return {text}; - }; - - // 获取审批结果标签 - const getApprovalResultTag = (result: string) => { - const color = ApprovalResultColor[result as keyof typeof ApprovalResultColor] || 'default'; - const text = ApprovalResultText[result as keyof typeof ApprovalResultText] || '未知结果'; - return {text}; - }; - - const columns = [ - { - title: '序号', - render: (_: any, __: SupplierEvaluate.ApprovalRecord, index: number) => - (pagination.current! - 1) * pagination.pageSize! + index + 1, - width: 80, - }, - { - title: '评价主题', - dataIndex: 'evaluateTitle', - key: 'evaluateTitle', - width: 200, - ellipsis: { - showTitle: false, - }, - render: (evaluateTitle: string) => ( - - {evaluateTitle} - - ), - }, - { - title: '评价品类', - dataIndex: 'evaluateCategory', - key: 'evaluateCategory', - width: 120, - }, - { - title: '发起单位', - dataIndex: 'initiatingUnit', - key: 'initiatingUnit', - width: 200, - ellipsis: { - showTitle: false, - }, - render: (text: string) => ( - - {text} - - ), - }, - { - title: '申请时间', - dataIndex: 'applyTime', - key: 'applyTime', - width: 120, - }, - { - title: '流程状态', - dataIndex: 'processStatus', - key: 'processStatus', - width: 100, - align: 'center' as const, - render: (status: string) => getProcessStatusTag(status), - }, - { - title: '审批结果', - dataIndex: 'approvalResult', - key: 'approvalResult', - width: 100, - align: 'center' as const, - render: (result: string) => getApprovalResultTag(result), - }, - { - title: '操作', - key: 'action', - width: 180, - align: 'center' as const, - render: (_: unknown, record: SupplierEvaluate.ApprovalRecord) => ( - - {record.approvalResult === ApprovalResult.PENDING && ( - - )} - - - ), - }, - ]; - - return ( -
-
-
- - - - - - - - - - - - - - - - -
-
- -
- - - - {/* 审批历史弹窗 */} - setHistoryModalVisible(false)} - footer={[ - , - ]} - width={600} - > - {currentRecord && ( -
- - - {currentRecord.evaluateTitle} - - - {currentRecord.evaluateCategory} - - - {currentRecord.initiatingUnit} - - - - - {approvalHistoryData.map((item) => ( - -

{item.operator} - {item.action}

-

{item.comment}

-
- ))} -
-
- )} -
- - ); -}; - -export default SupplierEvaluateResultApproval; diff --git a/src/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApprovalInfo.tsx b/src/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApprovalInfo.tsx deleted file mode 100644 index 67c99da..0000000 --- a/src/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApprovalInfo.tsx +++ /dev/null @@ -1,318 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { - Card, - Typography, - Form, - Input, - Select, - Button, - Table, - Space, - Divider, - Radio, - message, - Row, - Col, -} from 'antd'; -import { ArrowLeftOutlined, CheckCircleOutlined, CloseCircleOutlined } from '@ant-design/icons'; -import { history, useLocation } from 'umi'; -import { - ProcessStatus, - ProcessStatusText, - ApprovalResult, - ApprovalResultText -} from '@/dicts/supplierEvaluateDict'; -// Use inline styles instead of importing a less file - -const { Title, Text } = Typography; -const { Option } = Select; -const { TextArea } = Input; - -const SupplierEvaluateResultApprovalInfo: React.FC = () => { - const location = useLocation<{ record: SupplierEvaluate.ApprovalRecord }>(); - const [loading, setLoading] = useState(false); - const [submitting, setSubmitting] = useState(false); - const [record, setRecord] = useState(null); - const [form] = Form.useForm(); - const [evaluationData, setEvaluationData] = useState([]); - - // 模拟获取评价详情数据 - const fetchEvaluationData = () => { - setLoading(true); - // 模拟API请求 - setTimeout(() => { - // 模拟数据 - const mockData = [ - { - id: '1', - supplierName: '中山市合创展包装材料有限公司', - category: '燃油', - score: 98, - level: 'A', - evaluator: '张三', - evaluateTime: '2023-05-15', - }, - { - id: '2', - supplierName: '深圳市欧阳华斯电源有限公司', - category: '燃油', - score: 95, - level: 'A', - evaluator: '李四', - evaluateTime: '2023-05-16', - }, - { - id: '3', - supplierName: '广东振兴塑胶机械有限公司', - category: '燃油', - score: 80, - level: 'B', - evaluator: '王五', - evaluateTime: '2023-05-17', - }, - { - id: '4', - supplierName: '上海硕建建筑技术工程有限公司', - category: '备件', - score: 60, - level: 'C', - evaluator: '赵六', - evaluateTime: '2023-05-18', - }, - { - id: '5', - supplierName: '中山市合创展包装材料有限公司', - category: '润滑油', - score: 98, - level: 'A', - evaluator: '张三', - evaluateTime: '2023-05-19', - }, - { - id: '6', - supplierName: '深圳市欧阳华斯电源有限公司', - category: '备件', - score: 95, - level: 'A', - evaluator: '李四', - evaluateTime: '2023-05-20', - }, - { - id: '7', - supplierName: '广东振兴塑胶机械有限公司', - category: '润滑油', - score: 80, - level: 'B', - evaluator: '王五', - evaluateTime: '2023-05-21', - }, - { - id: '8', - supplierName: '上海硕建建筑技术工程有限公司', - category: '备件', - score: 60, - level: 'C', - evaluator: '赵六', - evaluateTime: '2023-05-22', - }, - { - id: '9', - supplierName: '广东振兴塑胶机械有限公司', - category: '润滑油', - score: 80, - level: 'B', - evaluator: '王五', - evaluateTime: '2023-05-23', - }, - { - id: '10', - supplierName: '上海硕建建筑技术工程有限公司', - category: '备件', - score: 60, - level: 'C', - evaluator: '赵六', - evaluateTime: '2023-05-24', - }, - ]; - - setEvaluationData(mockData); - setLoading(false); - }, 500); - }; - - // 获取上级页面传递的数据 - useEffect(() => { - if (location.state?.record) { - setRecord(location.state.record); - // 模拟获取评价详情数据 - fetchEvaluationData(); - } - }, [location]); - - // 处理返回 - const handleBack = () => { - history.goBack(); - }; - - // 处理提交 - const handleSubmit = async (values: SupplierEvaluate.ApprovalFormValues) => { - setSubmitting(true); - try { - // 模拟提交 - setTimeout(() => { - console.log('提交审批结果:', values); - message.success('审批提交成功'); - setSubmitting(false); - history.goBack(); - }, 1000); - } catch (error) { - console.error('提交失败:', error); - message.error('提交失败'); - setSubmitting(false); - } - }; - - const columns = [ - { - title: '序号', - render: (_: any, __: SupplierEvaluate.SupplierEvaluationRecord, index: number) => index + 1, - width: 80, - }, - { - title: '供应商名称', - dataIndex: 'supplierName', - key: 'supplierName', - width: 200, - }, - { - title: '评价品类', - dataIndex: 'category', - key: 'category', - width: 120, - }, - { - title: '评价得分', - dataIndex: 'score', - key: 'score', - width: 100, - align: 'center' as const, - }, - { - title: '评价等级', - dataIndex: 'level', - key: 'level', - width: 100, - align: 'center' as const, - }, - { - title: '评价人', - dataIndex: 'evaluator', - key: 'evaluator', - width: 120, - }, - { - title: '评价时间', - dataIndex: 'evaluateTime', - key: 'evaluateTime', - width: 120, - }, - ]; - - if (!record) { - return
加载中...
; - } - - return ( -
- -
- - 供应商评价结果审批 -
- -
- -
- 评价主题: - {record.evaluateTitle} - - - 评价品类: - {record.evaluateCategory} - - - 发起单位: - {record.initiatingUnit} - - - - - 申请时间: - {record.applyTime} - - - 流程状态: - {ProcessStatusText[record.processStatus as keyof typeof ProcessStatusText] || '未知状态'} - - - - - - -
- - - -
- 审批意见 - - - - {ApprovalResultText[ApprovalResult.APPROVED]} - - - {ApprovalResultText[ApprovalResult.REJECTED]} - - - - -