diff --git a/src/components/EvaluateTaskPersonnelSelector/EvaluateTaskPersonnelSelector.tsx b/src/components/EvaluateTaskPersonnelSelector/EvaluateTaskPersonnelSelector.tsx index 388d7dd..85cf062 100644 --- a/src/components/EvaluateTaskPersonnelSelector/EvaluateTaskPersonnelSelector.tsx +++ b/src/components/EvaluateTaskPersonnelSelector/EvaluateTaskPersonnelSelector.tsx @@ -14,7 +14,10 @@ const { Search } = Input; */ interface EvaluateTaskPersonnelSelectorProps { onSelect: (personnel: API.PersonnelItem[]) => void; // 选择确认后的回调函数 + onClose: () => void; // 关闭回调函数 selectedPersonnel?: API.PersonnelItem[]; // 已选择的人员列表(用于回显) + filter?: boolean; // 是否过滤评价人员 + filterUserIds?: string[]; // 过滤评价人员ID列表 } /** @@ -32,7 +35,10 @@ interface EvaluateTaskPersonnelSelectorProps { */ const EvaluateTaskPersonnelSelector: React.FC = ({ onSelect, - selectedPersonnel = [] + selectedPersonnel = [], + filter = false, + filterUserIds = [], + onClose, }) => { // 搜索关键词 const [keyword, setKeyword] = useState(''); @@ -66,6 +72,8 @@ const EvaluateTaskPersonnelSelector: React.FC { + onClose(); + }; /** * 处理确认选择 */ @@ -141,7 +153,7 @@ const EvaluateTaskPersonnelSelector: React.FC ({ + // 如果 isSelected = true 则禁用勾选 + disabled: record.isSelected === true, + }), }} columns={columns} dataSource={personnel} @@ -173,7 +190,7 @@ const EvaluateTaskPersonnelSelector: React.FC
- + diff --git a/src/models/supplierTaskManage.ts b/src/models/supplierTaskManage.ts index a7bc0d0..aa4228d 100644 --- a/src/models/supplierTaskManage.ts +++ b/src/models/supplierTaskManage.ts @@ -6,7 +6,7 @@ import type { TaskDetailResponse } from '@/servers/dao/supplierEvaluateTask'; import type { TaskNotifyLowerUnits } from '@/dicts/supplierTaskDict'; -import type { PersonnelItem } from '@/servers/dao/supplierEvaluateTask'; +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; @@ -22,7 +22,7 @@ export interface SupplierTaskModelState { detailLoading: boolean; // 详情数据加载状态 taskFormData: Partial; // 任务表单数据 taskDetail: TaskDetailData | null; // 任务详情数据 - userList: PersonnelItem[]; // 用户列表 + mode: 'add' | 'edit' | 'division'; // 模式 } /** @@ -39,6 +39,9 @@ export interface SupplierTaskModelType { nextStep: Effect; // 下一步 prevStep: Effect; // 上一步 resetState: Effect; // 重置状态 + setCurrentStep: Effect; // 设置当前步骤 + setMode: Effect; // 设置模式 + deleteUser: Effect; // 删除用户 }; reducers: { saveCurrentStep: Reducer; // 保存当前步骤 @@ -46,6 +49,7 @@ export interface SupplierTaskModelType { saveDetailLoading: Reducer; // 保存详情加载状态 saveTaskFormData: Reducer; // 保存任务表单数据 saveTaskDetail: Reducer; // 保存任务详情数据 + saveMode: Reducer; // 保存模式 }; } @@ -63,7 +67,7 @@ const SupplierTaskModel: SupplierTaskModelType = { detailLoading: false, // 详情数据加载状态 taskFormData: {}, // 任务表单数据 taskDetail: null, // 任务详情数据 - userList: [], // 用户列表 + mode: 'add', // 模式 }, // 副作用处理函数 @@ -94,6 +98,7 @@ const SupplierTaskModel: SupplierTaskModelType = { evaluateYear: detail.evaluateYear || '', categoryId: detail.categoryId || undefined, + // 供应商数据转换,添加id和name字段用于UI展示 selectedSuppliers: detail.blackSupplierVos.map((item) => ({ ...item, @@ -110,9 +115,8 @@ const SupplierTaskModel: SupplierTaskModelType = { // 部门权重 taskDeptWeightList: detail.taskDeptWeightList || [], - //设置评价分工table回显 需处理 - userList: detail.userList.map((user) => { + userList: detail.userList.map((user) => { const matchedIndicator = detail.indicatorList?.find( (indicator) => indicator.userId === user.userId ); @@ -124,21 +128,7 @@ const SupplierTaskModel: SupplierTaskModelType = { }; }), - // 供应商与评价人员关联,用于分工步骤 需要以userList[]人员为维度, - // 关联出 indicatorList[]指标中的 userId, - // 关联出来的对象中的indicatorIds[]为指标id, - // 对象中的type不需要关注,只在保存时动态修改即可 - suppliersWithEvaluators: detail.userList.map((user) => { - const matchedIndicator = detail.indicatorList?.find( - (indicator) => indicator.userId === user.userId - ); - return { - ...user, - name: user.userName, - id: user.userId, - indicatorIds: matchedIndicator?.indicatorIds || [], - }; - }), + }; // 保存数据到状态 @@ -255,14 +245,29 @@ const SupplierTaskModel: SupplierTaskModelType = { })); updatedFormData.selectedSuppliers = suppliersWithEvaluators; } + // 处理评价人员更新 - 更新后要保留原有对象中的indicatorIds + if (payload.userList) { + const existingUserMap = new Map( + (taskFormData.userList || []).map((user: PersonnelItem) => [user.id || user.userId, user]) + ); - // 处理评价人员更新 - 保持suppliersWithEvaluators和selectedSuppliers同步 - if (payload.suppliersWithEvaluators) { - const evaluatedSuppliers = payload.suppliersWithEvaluators; - updatedFormData.suppliersWithEvaluators = evaluatedSuppliers; - updatedFormData.selectedSuppliers = evaluatedSuppliers; // 同步更新selectedSuppliers + updatedFormData.userList = payload.userList.map((newUser: PersonnelItem) => { + const userId = newUser.id || newUser.userId; + const existing = existingUserMap.get(userId); + + const indicatorIds = + newUser.indicatorIds && newUser.indicatorIds.length > 0 + ? newUser.indicatorIds + : existing?.indicatorIds || []; + + return { + ...newUser, + indicatorIds, + }; + }); } + // 处理部门权重 if (payload.taskDeptWeightList) { updatedFormData.taskDeptWeightList = payload.taskDeptWeightList; @@ -272,6 +277,49 @@ const SupplierTaskModel: SupplierTaskModelType = { // 保存更新后的表单数据 yield put({ type: 'saveTaskFormData', payload: updatedFormData }); }, + /** + * 删除用户 + * @param payload.userId 用户ID + */ + *deleteUser({ payload }: { payload: { userIds: string[] } }, { put, select }: { put: any; select: any }) { + const { userIds } = payload; + if (!userIds || userIds.length === 0) return; + + const userIdSet = new Set(userIds.filter(Boolean).map(String)); + + const { taskFormData } = (yield select((state: any) => state.supplierTaskManage)) as { + taskFormData: TaskAddRequest; + }; + + const updatedFormData = { ...taskFormData }; + + // 1. 删除 userList 中的用户 + updatedFormData.userList = (updatedFormData.userList || []).filter( + (user: PersonnelItem) => !userIdSet.has(String(user.id || user.userId)) + ); + + // 2. 删除 indicatorList(指标对象) 中该用户的指标 + updatedFormData.indicatorList = (updatedFormData.indicatorList || []).filter( + (item: IndicatorItem) => !userIdSet.has(String(item.userId)) + ); + + // 3. 删除 selectedSuppliers(供应商对象) 中 evaluator(评价人员对象) 对象 + updatedFormData.selectedSuppliers = (updatedFormData.selectedSuppliers || []) + .map((supplier: SupplierItem) => { + const newEvaluators = (supplier.evaluators || []).filter( + (evaluator: PersonnelItem) => !userIdSet.has(String(evaluator.id)) + ); + return { + ...supplier, + evaluators: newEvaluators, + }; + }) + .filter((supplier) => (supplier.evaluators || []).length > 0); + + // 保存更新 + yield put({ type: 'saveTaskFormData', payload: updatedFormData }); + }, + /** * 下一步 @@ -290,6 +338,12 @@ const SupplierTaskModel: SupplierTaskModelType = { const { currentStep } = (yield select((state: any) => state.supplierTaskManage)) as { currentStep: number }; yield put({ type: 'saveCurrentStep', payload: currentStep - 1 }); }, + /* + 设置当前步骤 + */ + *setCurrentStep({ payload }: { payload: number }, { put }: { put: any }) { + yield put({ type: 'saveCurrentStep', payload }); + }, /** * 重置状态 @@ -307,6 +361,12 @@ const SupplierTaskModel: SupplierTaskModelType = { payload: 0 }); }, + /** + * 设置模式 + */ + *setMode({ payload }: { payload: 'add' | 'edit' | 'division' }, { put }: { put: any }) { + yield put({ type: 'saveMode', payload }); + }, }, // reducers用于更新状态 @@ -317,6 +377,12 @@ const SupplierTaskModel: SupplierTaskModelType = { saveCurrentStep(state, { payload }) { return { ...state, currentStep: payload }; }, + /** + * 保存模式 + */ + saveMode(state, { payload }) { + return { ...state, mode: payload }; + }, /** * 保存加载状态 */ diff --git a/src/pages/supplierEvaluateManage/supplierTaskManage/components/BasicInfoStep.tsx b/src/pages/supplierEvaluateManage/supplierTaskManage/components/BasicInfoStep.tsx index a670dd0..366959a 100644 --- a/src/pages/supplierEvaluateManage/supplierTaskManage/components/BasicInfoStep.tsx +++ b/src/pages/supplierEvaluateManage/supplierTaskManage/components/BasicInfoStep.tsx @@ -36,8 +36,7 @@ const BasicInfoStepComponent = (props: BasicInfoStepProps) => { // 暴露表单方法给父组件,使用 innerRef useImperativeHandle(innerRef, () => ({ validateFields: () => form.validateFields(), - getFieldsValue: () => form.getFieldsValue(), - setFieldsValue: (values: any) => form.setFieldsValue(values), + // 删除不必要的方法,因为现在使用Dva管理数据 })); // 获取模板列表 diff --git a/src/pages/supplierEvaluateManage/supplierTaskManage/components/DivisionStep.tsx b/src/pages/supplierEvaluateManage/supplierTaskManage/components/DivisionStep.tsx index 751d445..7370bbc 100644 --- a/src/pages/supplierEvaluateManage/supplierTaskManage/components/DivisionStep.tsx +++ b/src/pages/supplierEvaluateManage/supplierTaskManage/components/DivisionStep.tsx @@ -14,13 +14,7 @@ import { getTemplateDetail } from '@/servers/api/supplierEvaluate'; import type { Dispatch } from 'umi'; import { connect } from 'umi'; import type { SupplierTaskModelState } from '@/models/supplierTaskManage'; - -// 评价指标类型定义 -interface IndicatorItem { - id: string; - name: string; - description: string; -} +import type { IndicatorItem } from '@/servers/dao/supplierEvaluateTask'; // 组件接收的Props定义 interface DivisionStepProps { @@ -42,19 +36,11 @@ const DivisionStepComponent = (props: DivisionStepProps) => { const { supplierTaskManage, dispatch, innerRef } = props; // 从 model 获取表单数据,避免通过 props 层层传递 - const { taskFormData } = supplierTaskManage; + const { taskFormData, mode } = supplierTaskManage; // 从上一步获取的评价人员列表 const [evaluators, setEvaluators] = useState([]); - // 评价人员指标分配数据 - const indicatorAssignments = useRef<{ - [userId: string]: { - type: EvaluateType; - indicatorIds: string[]; - }; - }>({}); - // 选中的行keys const [selectedRowKeys, setSelectedRowKeys] = useState([]); @@ -88,27 +74,14 @@ const DivisionStepComponent = (props: DivisionStepProps) => { // 查看模式下的过滤后指标数据 const [filteredIndicators, setFilteredIndicators] = useState([]); - // 统一获取用户指标ID的函数 - const getUserIndicatorIds = useCallback((userId: string) => { - if (!userId) return []; - - const assignment = indicatorAssignments.current[userId]; - if (!assignment) return []; - - // 如果是按评价单评价(全部指标),返回空数组 - if (assignment.type == EvaluateType.ALL) { - return []; - } - - // 如果是按指标评价,返回指标ID列表 - return assignment.indicatorIds || []; - }, []); - // 获取当前用户的已分配指标ID const getCurrentUserSelectedIds = useCallback(() => { - // 使用统一的getUserIndicatorIds函数获取当前用户的指标ID - return getUserIndicatorIds(currentUserId); - }, [currentUserId, getUserIndicatorIds]); + if (!currentUserId) return []; + + // 直接从 taskFormData.userList 中获取当前用户的指标ID + const currentUser = taskFormData.userList?.find((user: any) => user.id === currentUserId); + return currentUser?.indicatorIds || []; + }, [currentUserId, taskFormData.userList]); // 根据指标ID过滤模板数据 const filterTemplateDataByIds = useCallback((data: any[], indicatorIds: string[]) => { @@ -226,34 +199,55 @@ const DivisionStepComponent = (props: DivisionStepProps) => { ); return indicatorNdListIds; }; - // 处理指标,将处理后的指标放到dva中,同步处理userList,展示table - const handleIndicatorAssignment = (indicatorNdListIds: string[]) => { - // 读取dva中的indicatorList - const indicatorList = JSON.parse(JSON.stringify(taskFormData?.indicatorList)); - // 将指标id塞到当前激活的评价人员中 - indicatorList?.map((item: any) => { - // 判断当前激活的评价人员和选择评价人构建的userId一直 - if (item.userId === currentUserId) { - item.indicatorIds = [...new Set([...item.indicatorIds, ...indicatorNdListIds])]; - } - }); - // 构建userList带指标id 为了表单回显 - const userList = JSON.parse(JSON.stringify(taskFormData?.userList)); - userList?.map((item: any) => { - if (item.id === currentUserId) { - item.indicatorIds = indicatorNdListIds; - } + // 处理指标,将处理后的指标放到dva中,同步处理userList,展示table 第二个参数是判断是否是批量设置, + // 如果批量则取 selectedRowKeys(table选中所有user) + const handleIndicatorAssignment = (indicatorNdListIds: string[], userIds: string[]) => { + // 读取dva中的数据,只克隆一次 + const indicatorList = JSON.parse(JSON.stringify(taskFormData?.indicatorList || [])); + const userList = JSON.parse(JSON.stringify(taskFormData?.userList || [])); + + // 批量更新indicatorList和userList + userIds.forEach((userId) => { + // 更新indicatorList + indicatorList.forEach((item: IndicatorItem) => { + if (item.userId === userId) { + item.indicatorIds = [...new Set([...(item.indicatorIds || []), ...indicatorNdListIds])]; + } + }); + + // 更新userList + userList.forEach((item: PersonnelItem) => { + if (item.id === userId) { + item.indicatorIds = indicatorNdListIds; + } + }); }); + + // 只调用一次updateFormData updateFormData({ indicatorList, userList, }); }; + // 保存指标分配 + const handleSaveIndicatorAssignment = () => { + if (!currentUserId) { + message.warning('未选择评价人员'); + return; + } + // 将选择回来的指标提取二级指标id + const indicatorNdListIds = getIndicatorNdListIds(selectedTemplateItems); + handleIndicatorAssignment(indicatorNdListIds, [currentUserId]); + setTemplateViewModalVisible(false); + message.success('已设置评价人员指标分工'); + }; + // 批量设置指标分工 const handleBatchSetDivision = () => { // 将选择回来的指标提取二级指标id const indicatorNdListIds = getIndicatorNdListIds(batchSelectedTemplateItems); - handleIndicatorAssignment(indicatorNdListIds); + const userIds = selectedRowKeys.map((key) => key.toString()); + handleIndicatorAssignment(indicatorNdListIds, userIds); setBatchTemplateModalVisible(false); message.success(`已为${selectedRowKeys.length}名评价人员设置分工`); }; @@ -278,19 +272,6 @@ const DivisionStepComponent = (props: DivisionStepProps) => { setSelectedTemplateItems(selectedItems); }; - // 保存指标分配 - const handleSaveIndicatorAssignment = () => { - if (!currentUserId) { - message.warning('未选择评价人员'); - return; - } - // 将选择回来的指标提取二级指标id - const indicatorNdListIds = getIndicatorNdListIds(selectedTemplateItems); - handleIndicatorAssignment(indicatorNdListIds); - setTemplateViewModalVisible(false); - message.success('已设置评价人员指标分工'); - }; - // 查看评价人员的指标分工 const handleViewAssignment = (person: PersonnelItem) => { const assignment = person.indicatorIds; @@ -329,35 +310,23 @@ const DivisionStepComponent = (props: DivisionStepProps) => { // 更新评价人员列表 setEvaluators((prev) => prev.filter((e) => e.id !== userId)); - // 更新指标分配数据 - const newAssignments = { ...indicatorAssignments.current }; - delete newAssignments[userId]; - indicatorAssignments.current = newAssignments; + //更新dva中的userList + dispatch({ + type: 'supplierTaskManage/deleteUser', + payload: { + userIds: [userId], + }, + }); message.success('已删除评价人员'); }, }); }; - // 初始化:从formData中提取指标分配数据 - useEffect(() => { - if (taskFormData.indicatorList && taskFormData.indicatorList.length > 0) { - // 如果已有指标分配数据,直接使用 - const assignments: any = {}; - taskFormData.indicatorList.forEach((item: any) => { - assignments[item.userId] = { - type: item.type, - indicatorIds: item.indicatorIds || [], - }; - }); - indicatorAssignments.current = assignments; - } - }, [taskFormData.indicatorList]); - // 从上一步获取评价人员列表 - 避免频繁更新 useEffect(() => { if (!taskFormData.userList) return; - setEvaluators(taskFormData.userList); + setEvaluators(taskFormData.userList as PersonnelItem[]); }, [taskFormData.userList]); // 暴露给父组件的方法 @@ -401,8 +370,7 @@ const DivisionStepComponent = (props: DivisionStepProps) => { title: '是否设置分工', key: 'hasDivision', render: (_: any, record: PersonnelItem) => { - const assignment = indicatorAssignments.current[record.id]; - if (!assignment || assignment.indicatorIds.length === 0) + if (!record.indicatorIds || record.indicatorIds.length === 0) return 未设置; return 已设置; }, @@ -412,38 +380,45 @@ const DivisionStepComponent = (props: DivisionStepProps) => { key: 'action', render: (_: any, record: PersonnelItem) => ( - + {!record.isSelected && ( + <> + + + + )} - ), }, ]; + const rowSelection = { + selectedRowKeys, + onChange: handleSelectChange, + }; return (
-
- -
+ {mode !== 'division' && ( +
+ +
+ )}
void; onSelect: (selectedEvaluators: PersonnelItem[]) => void; selectedPersonnel?: PersonnelItem[]; + filter?: boolean; + filterUserIds?: string[]; } const BatchEvaluatorModal: React.FC = ({ @@ -15,6 +17,8 @@ const BatchEvaluatorModal: React.FC = ({ onCancel, onSelect, selectedPersonnel = [], + filter, + filterUserIds, }) => { return ( = ({ ); diff --git a/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorComponents/SupplierEvaluatorModal.tsx b/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorComponents/SupplierEvaluatorModal.tsx index 4275183..d1a9e3d 100644 --- a/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorComponents/SupplierEvaluatorModal.tsx +++ b/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorComponents/SupplierEvaluatorModal.tsx @@ -10,6 +10,8 @@ interface SupplierEvaluatorModalProps { onSelect: (personnel: PersonnelItem[]) => void; // 选择人员后的回调函数 currentSupplier: SupplierItem | null; // 当前操作的供应商对象 mode: ModalMode; // 弹窗模式:SELECT(选择) 或 VIEW(查看) + filter?: boolean; // 是否过滤评价人员 + filterUserIds?: string[]; // 过滤评价人员ID列表 } const SupplierEvaluatorModal: React.FC = ({ @@ -18,6 +20,8 @@ const SupplierEvaluatorModal: React.FC = ({ onSelect, currentSupplier, mode, + filter, + filterUserIds, }) => { // 本地保存当前选中的人员,确保在弹窗打开/关闭时能正确处理数据 const [localSelectedPersonnel, setLocalSelectedPersonnel] = useState([]); @@ -95,7 +99,10 @@ const SupplierEvaluatorModal: React.FC = ({ ) : ( renderEvaluatorList() diff --git a/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorComponents/SupplierTable.tsx b/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorComponents/SupplierTable.tsx index 0d615eb..ed5d013 100644 --- a/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorComponents/SupplierTable.tsx +++ b/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorComponents/SupplierTable.tsx @@ -1,14 +1,15 @@ import React, { useEffect } from 'react'; -import { Table, Space, Button, Tag, Modal,Tooltip } from 'antd'; +import { Table, Space, Button, Tag, Modal, Tooltip } from 'antd'; import type { SupplierItem } from '@/servers/types/evaluator'; interface SupplierTableProps { - suppliers: SupplierItem[]; // 供应商数据列表 - selectedRowKeys: React.Key[]; // 选中的行keys - onSelectChange: (selectedRowKeys: React.Key[]) => void; // 选择行变化的回调 - onViewEvaluators: (supplier: SupplierItem) => void; // 查看评价人员的回调 - onSelectEvaluators: (supplier: SupplierItem) => void; // 选择评价人员的回调 - onDeleteSupplier: (key: string) => void; // 删除供应商的回调 + suppliers: SupplierItem[]; // 供应商数据列表 + selectedRowKeys: React.Key[]; // 选中的行keys + onSelectChange: (selectedRowKeys: React.Key[]) => void; // 选择行变化的回调 + onViewEvaluators: (supplier: SupplierItem) => void; // 查看评价人员的回调 + onSelectEvaluators: (supplier: SupplierItem) => void; // 选择评价人员的回调 + onDeleteSupplier: (key: string) => void; // 删除供应商的回调 + mode?: string; // 模式 } const SupplierTable: React.FC = ({ @@ -18,6 +19,7 @@ const SupplierTable: React.FC = ({ onViewEvaluators, onSelectEvaluators, onDeleteSupplier, + mode, }) => { // 表格行选择配置 const rowSelection = { @@ -42,9 +44,9 @@ const SupplierTable: React.FC = ({ // 表格列定义 const columns = [ { - title: '供应商名称', // 列标题 - dataIndex: 'supplierName', // 数据字段名 - key: 'supplierName', // 列的唯一标识 + title: '供应商名称', // 列标题 + dataIndex: 'supplierName', // 数据字段名 + key: 'supplierName', // 列的唯一标识 }, { title: '统一社会信用代码', @@ -68,8 +70,8 @@ const SupplierTable: React.FC = ({ }, { title: '评价人员数', - align: 'center' as const, // 列对齐方式 - dataIndex: 'evaluatorCount', // 评价人员数量字段 + align: 'center' as const, // 列对齐方式 + dataIndex: 'evaluatorCount', // 评价人员数量字段 key: 'evaluatorCount', }, { @@ -88,9 +90,13 @@ const SupplierTable: React.FC = ({ - + {mode !== 'division' && ( + <> + + + )} ), }, @@ -98,11 +104,11 @@ const SupplierTable: React.FC = ({ return (
); }; diff --git a/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorSelectStep.tsx b/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorSelectStep.tsx index f2e9d56..c5ffa09 100644 --- a/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorSelectStep.tsx +++ b/src/pages/supplierEvaluateManage/supplierTaskManage/components/EvaluatorSelectStep.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, forwardRef, useImperativeHandle } from 'react'; +import React, { useState, useEffect, forwardRef, useImperativeHandle, useRef } from 'react'; import { Card, Button, Space, Form } from 'antd'; import styles from '../supplierTaskManageAdd.less'; import { @@ -38,7 +38,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => { const { supplierTaskManage, dispatch, innerRef } = props; // 从 model 获取表单数据,避免通过 props 层层传递 - const { taskFormData } = supplierTaskManage; + const { taskFormData, mode } = supplierTaskManage; // 选中的供应商行的key列表,用于批量操作 const [selectedRowKeys, setSelectedRowKeys] = useState([]); @@ -66,7 +66,15 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => { // 表单实例,用于权重设置 const [form] = Form.useForm(); - + const [filterUserIds, setFilterUserIds] = useState([]); + useEffect(() => { + if (mode === 'division' && taskFormData.userList && taskFormData.userList.length > 0) { + const filterUserIdsaa = taskFormData.userList + .map((user: PersonnelItem) => (user.isSelected === true ? user.id : null)) + .filter((id: string | null) => id !== null); + setFilterUserIds(filterUserIdsaa); + } + }, [mode, taskFormData.userList]); /** * 暴露表单方法给父组件 * 包含验证、获取和设置表单数据的方法 @@ -88,44 +96,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => { } return Promise.resolve(); - }, - - // 获取表单数据的方法,返回处理后的数据结构 - getFieldsValue: () => { - // 构建评价人员列表 - const indicatorList = suppliers.flatMap( - (supplier) => - supplier.evaluators?.map((evaluator: PersonnelItem) => ({ - userId: evaluator.id, - type: 0, // type 评价类型(默认0 按评价单 ,当用户关联了指标则为 :1 按指标) - indicatorIds: [], - })) || [], - ); - - // 构建供应商ID列表 - const supplierIds = suppliers.map((supplier) => ({ - id: supplier.id, - userIds: supplier.evaluators?.map((e: PersonnelItem) => e.id) || [], - })); - - // 返回完整的表单数据 - return { - indicatorList, - supplierIds, - suppliersWithEvaluators: suppliers, - taskDeptWeightList, - }; - }, - - // 设置表单数据的方法,通常在编辑模式下使用 - setFieldsValue: (values: any) => { - if (values.suppliersWithEvaluators) { - setSuppliers(values.suppliersWithEvaluators); - } - if (values.taskDeptWeightList) { - setTaskDeptWeightList(values.taskDeptWeightList); - } - }, + } })); /** @@ -137,7 +108,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => { if (taskFormData.selectedSuppliers && taskFormData.selectedSuppliers.length > 0) { // 转换上一步的供应商数据,添加评价人员数量字段 const suppliersWithEvaluators = taskFormData.selectedSuppliers.map( - (supplier: SupplierItem) => { + (supplier) => { // 确保evaluators字段存在且为数组 const evaluators = supplier.evaluators || []; return { @@ -226,20 +197,25 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => { userIds: supplier.evaluators?.map((e: PersonnelItem) => e.id) || [], })); - // 构建userList 并去重 - const userList = Array.from( - new Map( - suppliersWithEvaluators - .flatMap(s => s.evaluators || []) - .map(user => [user.id, user]) - ).values() - ); - // 构建评价人员列表 - const indicatorList = userList.map((user) => ({ - userId: user.id, - type: 0, // 默认按评价单评价 (没有指派分工),如果指派了 (就 1 按指标) - indicatorIds: [], // 指标id集合 - })); + // 构建userList 并去重,确保保留 isSelected 为 true 的对象 + const userMap = new Map(); + suppliersWithEvaluators + .flatMap((s) => s.evaluators || []) + .forEach((user) => { + // 如果已存在此ID的用户且当前用户isSelected为true,或者Map中不存在此用户,则更新/添加 + if (!userMap.has(user.id) || user.isSelected) { + userMap.set(user.id, user); + } + }); + const userList = Array.from(userMap.values()); + + // 构建评价人员列表 + const indicatorList = userList.map((user) => ({ + ...user, + userId: user.id, + type: 0, // 默认按评价单评价 (没有指派分工),如果指派了 (就 1 按指标) + indicatorIds: user.indicatorIds || [], // 指标id集合 + })); // 通过dispatch更新model中的数据 // 这是组件与Dva model交互的关键 @@ -251,7 +227,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => { indicatorList, userList, supplierIds, - suppliersWithEvaluators: suppliersWithEvaluators, + selectedSuppliers: suppliersWithEvaluators, }, }); }; @@ -342,7 +318,6 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => { */ const handleEvaluatorSelect = (selectedEvaluators: PersonnelItem[]) => { if (!currentSupplier) return; - // 更新当前供应商的评价人员列表 const updatedSuppliers = suppliers.map((supplier) => { if (supplier.id === currentSupplier.id) { @@ -420,20 +395,22 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
{/* 工具栏区域 */} -
- - - - -
+ {mode !== 'division' && ( +
+ + + + +
+ )} {/* 供应商表格区域 */} {suppliers.length === 0 ? ( @@ -443,6 +420,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => { ) : ( { setBatchSelectModalVisible(false)} + filter={mode === 'division'} + filterUserIds={filterUserIds} onSelect={handleBatchEvaluatorSelect} /> @@ -462,6 +442,8 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => { setEvaluatorModalVisible(false)} + filter={mode === 'division'} + filterUserIds={filterUserIds} onSelect={handleEvaluatorSelect} currentSupplier={currentSupplier} mode={modalMode} diff --git a/src/pages/supplierEvaluateManage/supplierTaskManage/components/SupplierSelectStep.tsx b/src/pages/supplierEvaluateManage/supplierTaskManage/components/SupplierSelectStep.tsx index 8fa719f..793b6e1 100644 --- a/src/pages/supplierEvaluateManage/supplierTaskManage/components/SupplierSelectStep.tsx +++ b/src/pages/supplierEvaluateManage/supplierTaskManage/components/SupplierSelectStep.tsx @@ -36,17 +36,7 @@ const SupplierSelectStepComponent = (props: SupplierSelectStepProps) => { // 这里可以添加自定义验证逻辑 return Promise.resolve(); }, - getFieldsValue: () => { - return { - selectedSuppliers, - supplierIds: selectedSuppliers.map((supplier: SupplierItem) => ({ id: supplier.id })) - }; - }, - setFieldsValue: (values: any) => { - if (values.selectedSuppliers) { - setSelectedSuppliers(values.selectedSuppliers); - } - }, + // 删除不必要的方法,因为现在使用Dva管理数据 })); // 处理供应商选择 diff --git a/src/pages/supplierEvaluateManage/supplierTaskManage/supplierTaskManage.tsx b/src/pages/supplierEvaluateManage/supplierTaskManage/supplierTaskManage.tsx index 5a61faa..beb0db4 100644 --- a/src/pages/supplierEvaluateManage/supplierTaskManage/supplierTaskManage.tsx +++ b/src/pages/supplierEvaluateManage/supplierTaskManage/supplierTaskManage.tsx @@ -1,32 +1,13 @@ import React, { useState, useEffect } from 'react'; -import { - Button, - Table, - Space, - Modal, - message, - Input, - Select, - Form, - Tooltip, - Tag, - TablePaginationConfig, - DatePicker, - Row, - Col, -} from 'antd'; -import { - PlusOutlined, - DeleteOutlined, - ExclamationCircleOutlined, - SearchOutlined, - EditOutlined, - EyeOutlined, -} from '@ant-design/icons'; +import { Button, Table, Space, message, Input, Select, Form, Tooltip, Tag, DatePicker } from 'antd'; +import type { TablePaginationConfig } from 'antd/es/table'; +import { PlusOutlined, DeleteOutlined, SearchOutlined } from '@ant-design/icons'; import { history } from 'umi'; -import { TaskStatus, TaskType, TaskStatusText, TaskStatusColor, TaskTypeText } from '@/dicts/supplierTaskDict'; +import { TaskStatus, TaskStatusText, TaskStatusColor } from '@/dicts/supplierTaskDict'; import { getTaskList } from '@/servers/api/supplierEvaluate'; import styles from './supplierTaskManage.less'; +import type { TaskRequest, TaskRecord, TaskItem } from '@/servers/dao/supplierEvaluateTask'; +import type { TaskSearchParams } from '@/servers/dao/supplierEvaluateTask'; const { Option } = Select; const { RangePicker } = DatePicker; @@ -34,7 +15,7 @@ const { RangePicker } = DatePicker; const SupplierTaskManage: React.FC = () => { const [loading, setLoading] = useState(false); const [form] = Form.useForm(); - const [taskData, setTaskData] = useState([]); + const [taskData, setTaskData] = useState([]); const [pagination, setPagination] = useState({ current: 1, pageSize: 10, @@ -43,13 +24,18 @@ const SupplierTaskManage: React.FC = () => { showQuickJumper: true, showTotal: (total) => `共 ${total} 条记录`, }); - const [searchParams, setSearchParams] = useState({}); + const [searchParams, setSearchParams] = useState({ + basePageRequest: { + pageNo: 1, + pageSize: 10, + }, + }); // 获取任务列表 const fetchTaskList = async ( current = 1, pageSize = 10, - params: SupplierEvaluate.TaskSearchParams = searchParams, + params: TaskSearchParams = searchParams, ) => { // 更新搜索参数状态 if (params !== searchParams) { @@ -59,7 +45,7 @@ const SupplierTaskManage: React.FC = () => { setLoading(true); try { // 构造请求参数 - const requestParams: SupplierEvaluate.TaskRequest = { + const requestParams: TaskSearchParams = { basePageRequest: { pageNo: current, pageSize: pageSize, @@ -83,24 +69,7 @@ const SupplierTaskManage: React.FC = () => { if (response.success) { // 处理返回的数据 const { records, total, current: currentPage, size } = response.data; - - // 转换数据结构以适应组件 - const formattedData = records.map(item => ({ - id: item.id || '', - key: item.id || '', - taskName: item.evaluateTheme || '', - taskCode: item.id || '', // 使用id作为临时的taskCode - status: item.status || '', - startTime: item.startTime || '', - endTime: item.endTime || '', - createBy: item.tenantName || '', - // 添加必要的字段,以符合TaskRecord类型 - taskType: TaskType.REGULAR, // 默认值,实际应从API获取 - templateName: '评价模板', // 默认值,实际应从API获取 - createTime: item.startTime || '', // 使用开始时间作为创建时间 - })); - - setTaskData(formattedData); + setTaskData(records); setPagination({ ...pagination, current: currentPage, @@ -120,21 +89,26 @@ const SupplierTaskManage: React.FC = () => { // 首次加载获取数据 useEffect(() => { - fetchTaskList(pagination.current, pagination.pageSize, {}); + fetchTaskList(pagination.current, pagination.pageSize, searchParams); }, []); // 处理查看 - const handleView = (record: SupplierEvaluate.TaskRecord) => { + const handleView = (record: TaskItem) => { // 跳转到详情页面 history.push(`supplierTaskManageDetail?id=${record.id}`); }; // 处理编辑 - const handleEdit = (record: SupplierEvaluate.TaskRecord) => { + const handleEdit = (record: TaskItem) => { // 跳转到编辑页面(复用新增页面) history.push(`supplierTaskManageAdd?id=${record.id}&mode=edit`); }; + // 处理分工 + const handleDivision = (record: TaskItem) => { + // 跳转到分工页面 + history.push(`supplierTaskManageAdd?id=${record.id}&mode=division`); + }; // 获取状态标签 const getStatusTag = (status: string) => { @@ -151,28 +125,28 @@ const SupplierTaskManage: React.FC = () => { const columns = [ { title: '序号', - render: (_: any, __: SupplierEvaluate.TaskRecord, index: number) => + render: (_: any, __: TaskItem, index: number) => (pagination.current! - 1) * pagination.pageSize! + index + 1, width: 80, }, { title: '评价主题', - dataIndex: 'taskName', - key: 'taskName', + dataIndex: 'evaluateTheme', + key: 'evaluateTheme', width: 200, ellipsis: { showTitle: false, }, - render: (taskName: string) => ( - - {taskName} + render: (evaluateTheme: string) => ( + + {evaluateTheme} ), }, { title: '发起单位', - dataIndex: 'createBy', - key: 'createBy', + dataIndex: 'tenantName', + key: 'tenantName', width: 150, }, { @@ -199,11 +173,17 @@ const SupplierTaskManage: React.FC = () => { key: 'action', width: 150, align: 'center' as const, - render: (_: unknown, record: SupplierEvaluate.TaskRecord) => ( + render: (_: unknown, record: TaskItem) => ( + {record.division == '1' && ( + + )} + @@ -227,7 +207,7 @@ const SupplierTaskManage: React.FC = () => { params.dateRange = [dateRange[0].format('YYYY-MM-DD'), dateRange[1].format('YYYY-MM-DD')]; } - fetchTaskList(1, pagination.pageSize, params); + fetchTaskList(1, pagination.pageSize, searchParams); }; return ( @@ -263,7 +243,13 @@ const SupplierTaskManage: React.FC = () => { icon={} onClick={() => { form.resetFields(); - fetchTaskList(1, pagination.pageSize, {}); + setSearchParams({ + basePageRequest: { + pageNo: 1, + pageSize: 10, + }, + }); + fetchTaskList(1, pagination.pageSize, searchParams); }} > 重置 @@ -280,6 +266,7 @@ const SupplierTaskManage: React.FC = () => {
= ({ supplierTaskManage, dispat // 判断是否为编辑模式 const urlParams = getUrlParams(); const isEditMode = urlParams.mode === 'edit' && urlParams.id; + const isDivisionMode = urlParams.mode === 'division' && urlParams.id; const taskId = urlParams.id || ''; // 创建表单引用,用于访问子组件的表单方法(主要用于验证) @@ -62,19 +63,50 @@ const SupplierTaskManageAdd: React.FC = ({ supplierTaskManage, dispat * 利用useEffect在组件挂载或依赖项变化时触发 */ useEffect(() => { - if (isEditMode && taskId && dispatch) { + if ((isEditMode || isDivisionMode) && taskId && dispatch) { + dispatch({ + type: 'supplierTaskManage/saveMode', + payload: 'edit', + }); // 编辑模式,获取任务详情 dispatch({ type: 'supplierTaskManage/fetchTaskDetail', payload: { taskId }, }); + if (isDivisionMode) { + dispatch({ + type: 'supplierTaskManage/saveMode', + payload: 'division', + }); + dispatch({ + type: 'supplierTaskManage/setCurrentStep', + payload: 2, + }); + } } else if (dispatch) { + dispatch({ + type: 'supplierTaskManage/setMode', + payload: 'add', + }); // 新建模式,重置状态 dispatch({ type: 'supplierTaskManage/resetState', }); } - }, [isEditMode, taskId, dispatch]); + }, [isEditMode, isDivisionMode, taskId, dispatch]); + + /** + * 组件卸载时重置状态 + */ + useEffect(() => { + return () => { + if (dispatch) { + dispatch({ + type: 'supplierTaskManage/resetState', + }); + } + }; + }, [dispatch]); // 步骤配置,定义每个步骤的标题、描述和内容组件 const steps = [ @@ -277,7 +309,8 @@ const SupplierTaskManageAdd: React.FC = ({ supplierTaskManage, dispat {/* 步骤操作按钮 */}
- {currentStep > 0 && } + {/* 如果当前是评价分工步骤,则不显示上一步按钮 */} + {currentStep > (isDivisionMode ? 2 : 0) && } {currentStep < steps.length - 1 && (