From 527637cce30d82666cd481ebba46279bb63389c7 Mon Sep 17 00:00:00 2001 From: linxd <544554903@qq.com> Date: Thu, 26 Jun 2025 18:14:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=84=E4=BB=B7=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E6=94=B9=E4=B8=BAdva=E6=95=B0=E6=8D=AE=E6=B5=81=E8=BD=AC?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SupplierSelector/SupplierSelector.tsx | 36 +- src/models/readme.md | 1 + src/models/supplierTaskManage.ts | 347 ++++++++ .../components/BasicInfoStep.tsx | 70 +- .../components/DivisionStep.tsx | 264 +++--- .../EvaluatorComponents/SupplierTable.tsx | 2 +- .../components/EvaluatorSelectStep.tsx | 769 ++++++++++-------- .../components/SupplierSelectStep.tsx | 57 +- .../supplierTaskManageAdd.tsx | 336 +++----- src/servers/api/supplierEvaluate.ts | 98 +-- src/servers/dao/supplierEvaluateTask.ts | 536 ++++++++++++ src/servers/types/evaluator.ts | 2 +- src/servers/types/supplierEvaluateTask.ts | 148 ---- src/typings.d.ts | 2 +- 14 files changed, 1698 insertions(+), 970 deletions(-) create mode 100644 src/models/readme.md create mode 100644 src/models/supplierTaskManage.ts create mode 100644 src/servers/dao/supplierEvaluateTask.ts delete mode 100644 src/servers/types/supplierEvaluateTask.ts diff --git a/src/components/SupplierSelector/SupplierSelector.tsx b/src/components/SupplierSelector/SupplierSelector.tsx index 3568c2f..83a98f8 100644 --- a/src/components/SupplierSelector/SupplierSelector.tsx +++ b/src/components/SupplierSelector/SupplierSelector.tsx @@ -148,7 +148,10 @@ const SupplierSelector: React.FC = ({ if (response && response.code === 200) { // 请求成功,更新数据和分页信息 - setTableListData(response.data.records || []); + setTableListData(response.data.records.map((item: any) => ({ + ...item, + supplierName: item.name, + }))); setPagination({ current: queryParams.pageNo, pageSize: queryParams.pageSize, @@ -231,16 +234,26 @@ const SupplierSelector: React.FC = ({ const columns = [ { title: '供应商名称', - dataIndex: 'name', + dataIndex: 'supplierName', ellipsis: true, - render: (name: string) => ( - - {name} + render: (supplierName: string) => ( + + {supplierName} ), }, { - title: '所属品类', + title: '统一社会信用代码', + dataIndex: 'socialCreditCode', + ellipsis: true, + render: (socialCreditCode: string) => ( + + {socialCreditCode || '-'} + + ), + }, + { + title: '准入品类', dataIndex: 'categoryName', ellipsis: true, render: (categoryName: string) => ( @@ -249,16 +262,7 @@ const SupplierSelector: React.FC = ({ ), }, - { - title: '部门', - dataIndex: 'deptName', - ellipsis: true, - render: (deptName: string) => ( - - {deptName || '-'} - - ) - } + ]; return ( diff --git a/src/models/readme.md b/src/models/readme.md new file mode 100644 index 0000000..367c74e --- /dev/null +++ b/src/models/readme.md @@ -0,0 +1 @@ +dva 模块 \ No newline at end of file diff --git a/src/models/supplierTaskManage.ts b/src/models/supplierTaskManage.ts new file mode 100644 index 0000000..a7bc0d0 --- /dev/null +++ b/src/models/supplierTaskManage.ts @@ -0,0 +1,347 @@ +import { message } from 'antd'; +import { addTask, getTaskDetail } from '@/servers/api/supplierEvaluate'; +import type { + TaskDetailData, + TaskAddRequest, + TaskDetailResponse +} from '@/servers/dao/supplierEvaluateTask'; +import type { TaskNotifyLowerUnits } from '@/dicts/supplierTaskDict'; +import type { PersonnelItem } 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; +type Reducer = (state: S, action: { payload: any }) => S; + +/** + * 供应商任务管理模型状态接口 + * 定义了整个模型的状态结构 + */ +export interface SupplierTaskModelState { + currentStep: number; // 当前步骤索引,从0开始 + loading: boolean; // 提交加载状态 + detailLoading: boolean; // 详情数据加载状态 + taskFormData: Partial; // 任务表单数据 + taskDetail: TaskDetailData | null; // 任务详情数据 + userList: PersonnelItem[]; // 用户列表 +} + +/** + * 供应商任务管理模型类型接口 + * 定义了模型的命名空间、状态、副作用和reducers + */ +export interface SupplierTaskModelType { + namespace: 'supplierTaskManage'; // 模型命名空间 + state: SupplierTaskModelState; // 模型状态 + effects: { + fetchTaskDetail: Effect; // 获取任务详情 + submitTaskData: Effect; // 提交任务数据 + updateFormData: Effect; // 更新表单数据 + nextStep: Effect; // 下一步 + prevStep: Effect; // 上一步 + resetState: Effect; // 重置状态 + }; + reducers: { + saveCurrentStep: Reducer; // 保存当前步骤 + saveLoading: Reducer; // 保存加载状态 + saveDetailLoading: Reducer; // 保存详情加载状态 + saveTaskFormData: Reducer; // 保存任务表单数据 + saveTaskDetail: Reducer; // 保存任务详情数据 + }; +} + +/** + * 供应商任务管理模型 + * 用于管理供应商评价任务的添加、编辑流程和数据 + */ +const SupplierTaskModel: SupplierTaskModelType = { + namespace: 'supplierTaskManage', + + // 初始状态 + state: { + currentStep: 0, // 当前步骤,默认为第一步 + loading: false, // 提交加载状态 + detailLoading: false, // 详情数据加载状态 + taskFormData: {}, // 任务表单数据 + taskDetail: null, // 任务详情数据 + userList: [], // 用户列表 + }, + + // 副作用处理函数 + effects: { + /** + * 获取任务详情 + * @param payload.taskId 任务ID + */ + *fetchTaskDetail({ payload }: { payload: { taskId: string } }, { call, put }: { call: any; put: any }) { + const { taskId } = payload; + yield put({ type: 'saveDetailLoading', payload: true }); + + try { + // 调用API获取任务详情 + const response = (yield call(getTaskDetail, taskId)) as TaskDetailResponse; + + if (response.success) { + const detail: TaskDetailData = response.data; + + // 转换任务详情数据为表单数据结构 + const taskFormData: Partial = { + id: detail.id || '', + evaluateTheme: detail.evaluateTheme || '', + startTime: detail.startTime || '', + endTime: detail.endTime || '', + templateId: detail.templateId || '', + categoryLimitation: detail.categoryLimitation || '0', + evaluateYear: detail.evaluateYear || '', + categoryId: detail.categoryId || undefined, + + // 供应商数据转换,添加id和name字段用于UI展示 + selectedSuppliers: detail.blackSupplierVos.map((item) => ({ + ...item, + id: item.supplierId, + name: item.supplierName, + evaluators: item.userList, + })), + + // 指标列表 + indicatorList: detail.indicatorList || [], + + // 供应商IDs与用户IDs + supplierIds: detail.supplierIds || [], + + // 部门权重 + taskDeptWeightList: detail.taskDeptWeightList || [], + + //设置评价分工table回显 需处理 + userList: 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 || [], + }; + }), + + // 供应商与评价人员关联,用于分工步骤 需要以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 || [], + }; + }), + }; + + // 保存数据到状态 + yield put({ type: 'saveTaskFormData', payload: taskFormData }); + yield put({ type: 'saveTaskDetail', payload: detail }); + } else { + message.error(response.message || '获取任务详情失败'); + } + } catch (error) { + console.error('获取任务详情失败:', error); + message.error('获取任务详情失败'); + } finally { + yield put({ type: 'saveDetailLoading', payload: false }); + } + }, + + /** + * 提交任务数据 + * @param payload.taskStatus 任务状态 + * @param payload.isEditMode 是否为编辑模式 + * @param payload.taskId 任务ID(编辑模式必须) + * @param payload.onSuccess 成功回调函数 + */ + *submitTaskData( + { payload }: { payload: { taskStatus: TaskNotifyLowerUnits | null; isEditMode: boolean; taskId: string; onSuccess?: () => void } }, + { call, put, select }: { call: any; put: any; select: any } + ) { + const { taskStatus, isEditMode, taskId, onSuccess } = payload; + yield put({ type: 'saveLoading', payload: true }); + + try { + // 获取表单数据 + const { taskFormData } = (yield select((state: any) => state.supplierTaskManage)) as { taskFormData: TaskAddRequest }; + + // 构建提交数据 + let submitData: TaskAddRequest = { + evaluateTheme: taskFormData.evaluateTheme || '', + startTime: taskFormData.startTime || '', + endTime: taskFormData.endTime || '', + templateId: taskFormData.templateId || '', + categoryLimitation: taskFormData.categoryLimitation || '0', + evaluateYear: taskFormData.evaluateYear || '', + categoryId: taskFormData.categoryId || '', + taskStatus: taskStatus || null, + + // 供应商IDs与评价人员IDs + supplierIds: + taskFormData.selectedSuppliers?.map((supplier: any) => { + // 从供应商的evaluators中提取用户ID + const userIds = supplier.evaluators?.map((evaluator: any) => evaluator.id) || []; + return { + id: supplier.id, + userIds, + }; + }) || [], + + // 指标列表 + indicatorList: + taskFormData.indicatorList?.map((item: any) => ({ + userId: item.userId, + // 评价类型:如果用户关联了指标则为1(按指标),否则为0(按评价单) + type: item.indicatorIds && item.indicatorIds.length > 0 ? 1 : 0, + indicatorIds: item.indicatorIds || [], + })) || [], + + // 部门权重列表,过滤掉权重为0的 + taskDeptWeightList: + taskFormData.taskDeptWeightList?.filter((item: any) => { + return item.weightValue && item.weightValue !== '0'; + }) || [], + }; + + + if (isEditMode) { + // 编辑模式,添加ID字段 + submitData = { + ...submitData, + id: taskId, + }; + } + const response = (yield call(addTask, submitData)) as API.Response; + if (response.success) { + message.success(isEditMode ? '任务更新成功' : '任务创建成功'); + if (onSuccess) { + onSuccess(); + } + } else { + message.error(response.message || '提交失败'); + } + } catch (error) { + console.error('提交失败:', error); + message.error('提交失败'); + } finally { + yield put({ type: 'saveLoading', payload: false }); + } + }, + + /** + * 更新表单数据 + * 处理不同步骤表单数据的变化,保持数据一致性 + * @param payload 表单数据 + */ + *updateFormData({ payload }: { payload: any }, { put, select }: { put: any; select: any }) { + // 获取当前表单数据 + const { taskFormData } = (yield select((state: any) => state.supplierTaskManage)) as { taskFormData: TaskAddRequest }; + // 合并新的表单数据 + const updatedFormData = { ...taskFormData, ...payload }; + // 处理供应商选择更新 + if (payload.selectedSuppliers) { + // 确保每个供应商都有evaluators字段 + const suppliersWithEvaluators = payload.selectedSuppliers.map((supplier: any) => ({ + ...supplier, + evaluators: supplier.evaluators || [], // 确保evaluators字段存在 + })); + updatedFormData.selectedSuppliers = suppliersWithEvaluators; + } + + // 处理评价人员更新 - 保持suppliersWithEvaluators和selectedSuppliers同步 + if (payload.suppliersWithEvaluators) { + const evaluatedSuppliers = payload.suppliersWithEvaluators; + updatedFormData.suppliersWithEvaluators = evaluatedSuppliers; + updatedFormData.selectedSuppliers = evaluatedSuppliers; // 同步更新selectedSuppliers + } + + // 处理部门权重 + if (payload.taskDeptWeightList) { + updatedFormData.taskDeptWeightList = payload.taskDeptWeightList; + } + console.log(updatedFormData) + + // 保存更新后的表单数据 + yield put({ type: 'saveTaskFormData', payload: updatedFormData }); + }, + + /** + * 下一步 + * 将当前步骤索引加1 + */ + *nextStep(_: any, { put, select }: { put: any; select: any }) { + const { currentStep } = (yield select((state: any) => state.supplierTaskManage)) as { currentStep: number }; + yield put({ type: 'saveCurrentStep', payload: currentStep + 1 }); + }, + + /** + * 上一步 + * 将当前步骤索引减1 + */ + *prevStep(_: any, { put, select }: { put: any; select: any }) { + const { currentStep } = (yield select((state: any) => state.supplierTaskManage)) as { currentStep: number }; + yield put({ type: 'saveCurrentStep', payload: currentStep - 1 }); + }, + + /** + * 重置状态 + * 清空表单数据并将步骤重置为第一步 + */ + *resetState(_: any, { put }: { put: any }) { + // 重置表单数据 + yield put({ + type: 'saveTaskFormData', + payload: {} + }); + // 重置步骤到第一步 + yield put({ + type: 'saveCurrentStep', + payload: 0 + }); + }, + }, + + // reducers用于更新状态 + reducers: { + /** + * 保存当前步骤 + */ + saveCurrentStep(state, { payload }) { + return { ...state, currentStep: payload }; + }, + /** + * 保存加载状态 + */ + saveLoading(state, { payload }) { + return { ...state, loading: payload }; + }, + /** + * 保存详情加载状态 + */ + saveDetailLoading(state, { payload }) { + return { ...state, detailLoading: payload }; + }, + /** + * 保存任务表单数据 + */ + saveTaskFormData(state, { payload }) { + return { ...state, taskFormData: payload }; + }, + /** + * 保存任务详情数据 + */ + saveTaskDetail(state, { payload }) { + return { ...state, taskDetail: payload }; + }, + }, +}; + +export default SupplierTaskModel; diff --git a/src/pages/supplierEvaluateManage/supplierTaskManage/components/BasicInfoStep.tsx b/src/pages/supplierEvaluateManage/supplierTaskManage/components/BasicInfoStep.tsx index 5e9d3a0..a670dd0 100644 --- a/src/pages/supplierEvaluateManage/supplierTaskManage/components/BasicInfoStep.tsx +++ b/src/pages/supplierEvaluateManage/supplierTaskManage/components/BasicInfoStep.tsx @@ -5,28 +5,36 @@ import { getAllTemplates } from '@/servers/api/supplierEvaluate'; import CategorySelector from '@/components/CategorySelector'; import styles from '../supplierTaskManageAdd.less'; import { CategoryLimitationType } from '@/dicts/supplierTemplateDict'; -import type { TaskAddRequest } from '@/servers/types/supplierEvaluateTask'; +import type { Dispatch } from 'umi'; +import { connect } from 'umi'; +import type { SupplierTaskModelState } from '@/models/supplierTaskManage'; const { Option } = Select; -interface BasicInfoStepProps { - formData: Partial; - onFormDataChange: (data: TaskAddRequest) => void; -} - interface TemplateItem { id: string; templateName: string; categoryLimitation?: string; } -const BasicInfoStep = forwardRef(({ formData, onFormDataChange }, ref) => { +interface BasicInfoStepProps { + supplierTaskManage: SupplierTaskModelState; + dispatch: Dispatch; + innerRef?: any; // 使用 innerRef 作为属性名 +} + +// 定义组件,使用 innerRef 代替直接的 ref +const BasicInfoStepComponent = (props: BasicInfoStepProps) => { + const { supplierTaskManage, dispatch, innerRef } = props; const [form] = Form.useForm(); const [templates, setTemplates] = useState([]); const [loading, setLoading] = useState(false); - // 暴露表单方法给父组件 - useImperativeHandle(ref, () => ({ + // 从props中获取状态 + const { taskFormData } = supplierTaskManage; + + // 暴露表单方法给父组件,使用 innerRef + useImperativeHandle(innerRef, () => ({ validateFields: () => form.validateFields(), getFieldsValue: () => form.getFieldsValue(), setFieldsValue: (values: any) => form.setFieldsValue(values), @@ -52,27 +60,31 @@ const BasicInfoStep = forwardRef(({ formData, onFormDat fetchTemplates(); // 初始化表单数据 - if (formData) { - form.setFieldsValue(formData); + if (taskFormData) { + form.setFieldsValue(taskFormData); } }, []); - // 当formData变化时更新表单值 + // 当taskFormData变化时更新表单值 useEffect(() => { - if (formData) { + if (taskFormData) { // 处理日期字段,确保正确设置 const formValues = { - ...formData, - startTime: formData.startTime ? moment(formData.startTime) : undefined, - endTime: formData.endTime ? moment(formData.endTime) : undefined, + ...taskFormData, + startTime: taskFormData.startTime ? moment(taskFormData.startTime) : undefined, + endTime: taskFormData.endTime ? moment(taskFormData.endTime) : undefined, }; form.setFieldsValue(formValues); } - }, [formData, form]); + }, [taskFormData, form]); // 表单值变化时触发 const handleValuesChange = (changedValues: any, allValues: any) => { - onFormDataChange(allValues); + // 使用dispatch更新model中的数据 + dispatch({ + type: 'supplierTaskManage/updateFormData', + payload: allValues, + }); }; // 年度选项生成 @@ -87,9 +99,9 @@ const BasicInfoStep = forwardRef(({ formData, onFormDat // 判断是否显示品类选择器 const shouldShowCategorySelector = useCallback(() => { - const categoryLimitation = formData.categoryLimitation; + const categoryLimitation = taskFormData.categoryLimitation; return categoryLimitation === CategoryLimitationType.LIMITED; - }, [formData]); + }, [taskFormData]); return ( @@ -100,8 +112,8 @@ const BasicInfoStep = forwardRef(({ formData, onFormDat layout="vertical" onValuesChange={handleValuesChange} initialValues={{ - ...formData, - categoryLimitation: formData.categoryLimitation || '0', + ...taskFormData, + categoryLimitation: taskFormData.categoryLimitation || '0', }} > @@ -203,6 +215,18 @@ const BasicInfoStep = forwardRef(({ formData, onFormDat ); -}); +}; + +// 连接 Dva model +const ConnectedComponent = connect( + ({ supplierTaskManage }: { supplierTaskManage: SupplierTaskModelState }) => ({ + supplierTaskManage, + }) +)(BasicInfoStepComponent); + +// 外层转发 ref 到 innerRef +const BasicInfoStep = forwardRef((props: any, ref) => ( + +)); export default BasicInfoStep; diff --git a/src/pages/supplierEvaluateManage/supplierTaskManage/components/DivisionStep.tsx b/src/pages/supplierEvaluateManage/supplierTaskManage/components/DivisionStep.tsx index 6d1f2ce..751d445 100644 --- a/src/pages/supplierEvaluateManage/supplierTaskManage/components/DivisionStep.tsx +++ b/src/pages/supplierEvaluateManage/supplierTaskManage/components/DivisionStep.tsx @@ -3,30 +3,17 @@ import React, { useEffect, forwardRef, useImperativeHandle, - useMemo, useCallback, useRef, } from 'react'; -import { - Card, - Table, - Tag, - Switch, - Space, - Button, - message, - Modal, - Radio, - Checkbox, - Row, - Col, - Spin, -} from 'antd'; +import { Table, Tag, Space, Button, message, Modal, Spin } from 'antd'; import type { PersonnelItem } from '@/servers/types/evaluator'; import type { ColumnsType } from 'antd/es/table'; import EvaluateTemplateTable from '@/components/EvaluateTemplateTable'; import { getTemplateDetail } from '@/servers/api/supplierEvaluate'; -import type { TaskAddRequest } from '@/servers/types/supplierEvaluateTask'; +import type { Dispatch } from 'umi'; +import { connect } from 'umi'; +import type { SupplierTaskModelState } from '@/models/supplierTaskManage'; // 评价指标类型定义 interface IndicatorItem { @@ -37,8 +24,9 @@ interface IndicatorItem { // 组件接收的Props定义 interface DivisionStepProps { - formData: Partial; - onFormDataChange?: (values: Partial) => void; + supplierTaskManage: SupplierTaskModelState; + dispatch: Dispatch; + innerRef?: any; // 使用 innerRef 作为属性名 } // 评价方式枚举 @@ -49,7 +37,13 @@ enum EvaluateType { INDICATOR = 1, // 按指标评价(部分指标) } -const DivisionStep = forwardRef(({ formData, onFormDataChange }, ref) => { +// 定义组件,使用 innerRef 代替直接的 ref +const DivisionStepComponent = (props: DivisionStepProps) => { + const { supplierTaskManage, dispatch, innerRef } = props; + + // 从 model 获取表单数据,避免通过 props 层层传递 + const { taskFormData } = supplierTaskManage; + // 从上一步获取的评价人员列表 const [evaluators, setEvaluators] = useState([]); @@ -60,12 +54,6 @@ const DivisionStep = forwardRef(({ formData, onFormDataC indicatorIds: string[]; }; }>({}); - // const [indicatorAssignments, setIndicatorAssignments] = useState<{ - // [userId: string]: { - // type: EvaluateType; - // indicatorIds: string[]; - // }; - // }>({}); // 选中的行keys const [selectedRowKeys, setSelectedRowKeys] = useState([]); @@ -79,9 +67,6 @@ const DivisionStep = forwardRef(({ formData, onFormDataC // 批量指标设置弹窗可见性 const [batchTemplateModalVisible, setBatchTemplateModalVisible] = useState(false); - // 批量选择的指标 - const [batchSelectedIndicators, setBatchSelectedIndicators] = useState([]); - // 批量选择的模板项 const [batchSelectedTemplateItems, setBatchSelectedTemplateItems] = useState([]); @@ -187,10 +172,23 @@ const DivisionStep = forwardRef(({ formData, onFormDataC setLoading(false); } }; - + /** + * 更新表单数据 + * 将本地状态同步到 Dva model + * @param updatedData 要更新的部分数据 + */ + const updateFormData = (updatedData: any) => { + // 通过dispatch更新model中的数据 + dispatch({ + type: 'supplierTaskManage/updateFormData', // action类型 + payload: { + ...updatedData, + }, + }); + }; // 监听templateId变化,获取模板详情 useEffect(() => { - fetchTemplateDetail(formData.templateId as string); + fetchTemplateDetail(taskFormData.templateId as string); }, []); // 处理行选择变化 @@ -220,39 +218,42 @@ const DivisionStep = forwardRef(({ formData, onFormDataC const handleCloseBatchTemplateModal = () => { setBatchTemplateModalVisible(false); }; - - // 批量设置指标分工 - const handleBatchSetDivision = () => { - // 获取选中的评价人员 - const selectedEvaluators = evaluators.filter((evaluator) => - selectedRowKeys.includes(evaluator.id), + // 处理指标选择 提取二级指标id + const getIndicatorNdListIds = (selectedItems: any[]) => { + const indicatorNdList = selectedItems.map((item) => item.indicatorNdList); + const indicatorNdListIds = indicatorNdList.flatMap((item) => + item.map((ndItem: any) => ndItem.id), ); - - // 提取所有选中指标的ID - const selectedIndicatorIds: string[] = []; - - // 从选中的模板项中提取所有指标ID - batchSelectedTemplateItems.forEach((stItem) => { - // 添加二级指标ID - if (stItem.indicatorNdList && stItem.indicatorNdList.length > 0) { - stItem.indicatorNdList.forEach((ndItem: any) => { - selectedIndicatorIds.push(ndItem.id); - }); + 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])]; } }); - - // 更新指标分配数据 - const newAssignments = { ...indicatorAssignments.current }; - - selectedEvaluators.forEach((evaluator) => { - newAssignments[evaluator.id] = { - // 评价类型:如果用户关联了指标则为1(按指标),否则为0(按评价单) - type: selectedIndicatorIds.length > 0 ? EvaluateType.INDICATOR : EvaluateType.ALL, - indicatorIds: selectedIndicatorIds, - }; + // 构建userList带指标id 为了表单回显 + const userList = JSON.parse(JSON.stringify(taskFormData?.userList)); + userList?.map((item: any) => { + if (item.id === currentUserId) { + item.indicatorIds = indicatorNdListIds; + } }); - - indicatorAssignments.current = newAssignments; + updateFormData({ + indicatorList, + userList, + }); + }; + // 批量设置指标分工 + const handleBatchSetDivision = () => { + // 将选择回来的指标提取二级指标id + const indicatorNdListIds = getIndicatorNdListIds(batchSelectedTemplateItems); + handleIndicatorAssignment(indicatorNdListIds); setBatchTemplateModalVisible(false); message.success(`已为${selectedRowKeys.length}名评价人员设置分工`); }; @@ -274,7 +275,6 @@ const DivisionStep = forwardRef(({ formData, onFormDataC // 处理模板指标选择 const handleTemplateItemsSelect = (selectedItems: any[]) => { - console.log(selectedItems); setSelectedTemplateItems(selectedItems); }; @@ -284,49 +284,29 @@ const DivisionStep = forwardRef(({ formData, onFormDataC message.warning('未选择评价人员'); return; } - - // 提取所有选中指标的ID - const selectedIndicatorIds: string[] = []; - - // 从选中的模板项中提取所有指标ID - selectedTemplateItems.forEach((stItem) => { - // 添加二级指标ID - if (stItem.indicatorNdList && stItem.indicatorNdList.length > 0) { - stItem.indicatorNdList.forEach((ndItem: any) => { - selectedIndicatorIds.push(ndItem.id); - }); - } - }); - - // 更新指标分配 - const newAssignments = { ...indicatorAssignments.current }; - newAssignments[currentUserId] = { - // 评价类型:如果用户关联了指标则为1(按指标),否则为0(按评价单) - type: selectedIndicatorIds.length > 0 ? EvaluateType.INDICATOR : EvaluateType.ALL, - indicatorIds: selectedIndicatorIds, - }; - - indicatorAssignments.current = newAssignments; + // 将选择回来的指标提取二级指标id + const indicatorNdListIds = getIndicatorNdListIds(selectedTemplateItems); + handleIndicatorAssignment(indicatorNdListIds); setTemplateViewModalVisible(false); message.success('已设置评价人员指标分工'); }; // 查看评价人员的指标分工 - const handleViewAssignment = (userId: string) => { - const assignment = indicatorAssignments.current[userId]; + const handleViewAssignment = (person: PersonnelItem) => { + const assignment = person.indicatorIds; if (!assignment) { message.info('该评价人员尚未设置分工'); return; } - setCurrentUserId(userId); + setCurrentUserId(person.id); setLoading(true); // 获取该评价人员的指标ID - const indicatorIds = getUserIndicatorIds(userId); + const indicatorIds = person.indicatorIds; // 过滤模板数据 - const filtered = filterTemplateDataByIds(templateData, indicatorIds); + const filtered = filterTemplateDataByIds(templateData, indicatorIds || []); setFilteredIndicators(filtered); setLoading(false); @@ -361,10 +341,10 @@ const DivisionStep = forwardRef(({ formData, onFormDataC // 初始化:从formData中提取指标分配数据 useEffect(() => { - if (formData.indicatorList && formData.indicatorList.length > 0) { + if (taskFormData.indicatorList && taskFormData.indicatorList.length > 0) { // 如果已有指标分配数据,直接使用 const assignments: any = {}; - formData.indicatorList.forEach((item: any) => { + taskFormData.indicatorList.forEach((item: any) => { assignments[item.userId] = { type: item.type, indicatorIds: item.indicatorIds || [], @@ -372,85 +352,16 @@ const DivisionStep = forwardRef(({ formData, onFormDataC }); indicatorAssignments.current = assignments; } - }, [formData.indicatorList]); + }, [taskFormData.indicatorList]); // 从上一步获取评价人员列表 - 避免频繁更新 useEffect(() => { - if (!formData.suppliersWithEvaluators) return; - - // 从所有供应商中提取评价人员列表 - const allEvaluators: PersonnelItem[] = []; - - formData.suppliersWithEvaluators.forEach((supplier: any) => { - if (supplier.evaluators && supplier.evaluators.length > 0) { - supplier.evaluators.forEach((evaluator: PersonnelItem) => { - // 检查是否已存在(避免重复) - if (!allEvaluators.some((e) => e.id === evaluator.id)) { - allEvaluators.push({ - ...evaluator, - // 添加单位和员工编号,假设这些字段可能不存在 - company: evaluator.company || supplier.supplierName || '未知单位', - employeeNumber: evaluator.employeeNumber || `EMP${evaluator.id.slice(-4)}`, - department: evaluator.department || '未知部门', - }); - } - }); - } - }); - - setEvaluators(allEvaluators); - }, [formData.suppliersWithEvaluators]); - - // 为评价人员初始化指标分配数据 - 作为单独的效果处理 - useEffect(() => { - // 检查是否有新的评价人员需要初始化 - const newAssignments = { ...indicatorAssignments.current }; - let hasNewAssignments = false; - - evaluators.forEach((evaluator) => { - if (!indicatorAssignments.current[evaluator.id]) { - newAssignments[evaluator.id] = { - type: EvaluateType.ALL, - indicatorIds: [], - }; - hasNewAssignments = true; - } - }); - if (hasNewAssignments) { - indicatorAssignments.current = newAssignments; - } - }, [evaluators, indicatorAssignments]); - - // 同步数据回表单 - 使用防抖确保不会频繁触发 - const previousValueRef = React.useRef(''); - - useEffect(() => { - // 若当前还未初始化完成(没有任何指标数据),不应向父组件同步 - if (evaluators.length === 0 || Object.keys(indicatorAssignments.current).length === 0) { - return; - } - - // 将评价人员列表和指标分配数据同步回表单 - const indicatorList = evaluators.map((evaluator) => ({ - userId: evaluator.id, - userName: evaluator.name, - type: indicatorAssignments.current[evaluator.id]?.type ?? EvaluateType.ALL, - indicatorIds: indicatorAssignments.current[evaluator.id]?.indicatorIds ?? [], - })); - - // 使用JSON字符串比较确保只有在真正变化时才更新 - const currentValue = JSON.stringify(indicatorList); - if (currentValue !== previousValueRef.current) { - previousValueRef.current = currentValue; - onFormDataChange?.({ - ...formData, - indicatorList, - }); - } - }, [evaluators, formData, onFormDataChange]); + if (!taskFormData.userList) return; + setEvaluators(taskFormData.userList); + }, [taskFormData.userList]); // 暴露给父组件的方法 - useImperativeHandle(ref, () => ({ + useImperativeHandle(innerRef, () => ({ validate: () => { if (evaluators.length === 0) { return { @@ -462,6 +373,7 @@ const DivisionStep = forwardRef(({ formData, onFormDataC }, })); + // 选择完 // 获取当前评价人员名称 const getCurrentEvaluatorName = () => { const evaluator = evaluators.find((e) => e.id === currentUserId); @@ -503,7 +415,7 @@ const DivisionStep = forwardRef(({ formData, onFormDataC - - - - - - {suppliers.length === 0 ? ( -
- 请先在上一步选择供应商 -
- ) : ( - - )} - - {/* 批量选择评价人员弹窗 */} - setBatchSelectModalVisible(false)} - onSelect={handleBatchEvaluatorSelect} - /> - - {/* 单个供应商评价人员弹窗 */} - setEvaluatorModalVisible(false)} - onSelect={handleEvaluatorSelect} - currentSupplier={currentSupplier} - mode={modalMode} - /> - - {/* 权重设置弹窗 */} - setWeightSettingModalVisible(false)} - onOk={handleSaveWeights} - taskDeptWeightList={taskDeptWeightList} - form={form} - /> - - + // 构建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集合 + })); + + // 通过dispatch更新model中的数据 + // 这是组件与Dva model交互的关键 + dispatch({ + type: 'supplierTaskManage/updateFormData', // action类型 + payload: { + // action数据 + ...updatedData, + indicatorList, + userList, + supplierIds, + suppliersWithEvaluators: suppliersWithEvaluators, + }, + }); + }; + + /** + * 处理批量选择按钮点击事件 + * 打开批量选择评价人员模态框 + */ + const handleBatchSelect = () => { + if (selectedRowKeys.length === 0) return; + setBatchSelectModalVisible(true); + }; + + /** + * 处理设置评分单位权重按钮点击事件 + * 打开权重设置模态框 + */ + const handleWeightSetting = () => { + // 将权重数据转换为表单初始值 + form.setFieldsValue({ + taskDeptWeightList: taskDeptWeightList.reduce((acc, item) => { + acc[item.weightDept] = parseInt(item.weightValue, 10) || 0; + return acc; + }, {} as Record), + }); + + setWeightSettingModalVisible(true); + }; + + /** + * 保存权重设置 + * 更新本地权重数据并同步到 Dva model + */ + const handleSaveWeights = () => { + form.validateFields().then((values) => { + // 将表单值转换回权重列表格式 + const updatedTaskDeptWeightList = taskDeptWeightList.map((item) => ({ + ...item, + weightValue: values.taskDeptWeightList[item.weightDept].toString(), + })); + + // 更新本地状态 + setTaskDeptWeightList(updatedTaskDeptWeightList); + + // 同步到Dva model + updateFormData({ + suppliersWithEvaluators: suppliers, + taskDeptWeightList: updatedTaskDeptWeightList, + }); + + setWeightSettingModalVisible(false); + }); + }; + + /** + * 处理选择评价人员按钮点击事件 + * 打开评价人员选择模态框 + * @param supplier 当前选中的供应商 + */ + const handleSelectEvaluators = (supplier: SupplierItem) => { + setCurrentSupplier(supplier); + setModalMode(ModalMode.SELECT); + setEvaluatorModalVisible(true); + }; + + /** + * 处理查看评价人员按钮点击事件 + * 打开评价人员查看模态框 + * @param supplier 当前选中的供应商 + */ + const handleViewEvaluators = (supplier: SupplierItem) => { + // 查找完整的供应商数据(包括evaluators) + const fullSupplier = suppliers.find((s) => s.id === supplier.id); + if (fullSupplier) { + setCurrentSupplier(fullSupplier); + } else { + setCurrentSupplier(supplier); + } + + setModalMode(ModalMode.VIEW); + setEvaluatorModalVisible(true); + }; + + /** + * 处理评价人员选择确认 + * 更新供应商的评价人员列表并同步到 Dva model + * @param selectedEvaluators 选中的评价人员列表 + */ + const handleEvaluatorSelect = (selectedEvaluators: PersonnelItem[]) => { + if (!currentSupplier) return; + + // 更新当前供应商的评价人员列表 + const updatedSuppliers = suppliers.map((supplier) => { + if (supplier.id === currentSupplier.id) { + const updated = { + ...supplier, + evaluators: selectedEvaluators, + evaluatorCount: selectedEvaluators.length, + }; + return updated; + } + return supplier; + }); + + // 更新本地状态 + setSuppliers(updatedSuppliers); + + // 同步到Dva model + updateFormData({ suppliersWithEvaluators: updatedSuppliers }); + + // 关闭模态框 + setEvaluatorModalVisible(false); + }; + + /** + * 处理批量选择评价人员确认 + * 批量更新供应商的评价人员列表并同步到 Dva model + * @param selectedEvaluators 选中的评价人员列表 + */ + const handleBatchEvaluatorSelect = (selectedEvaluators: PersonnelItem[]) => { + if (selectedRowKeys.length === 0) return; + + // 更新所有选中供应商的评价人员列表 + const updatedSuppliers = suppliers.map((supplier) => { + if (selectedRowKeys.includes(supplier.id)) { + return { + ...supplier, + evaluators: selectedEvaluators, + evaluatorCount: selectedEvaluators.length, + }; + } + return supplier; + }); + + // 更新本地状态 + setSuppliers(updatedSuppliers); + + // 同步到Dva model + updateFormData({ suppliersWithEvaluators: updatedSuppliers }); + + // 关闭模态框 + setBatchSelectModalVisible(false); + }; + + /** + * 处理删除供应商 + * 从供应商列表中删除指定供应商并同步到 Dva model + * @param key 供应商ID + */ + const handleDeleteSupplier = (key: string) => { + // 过滤掉要删除的供应商 + const updatedSuppliers = suppliers.filter((item) => item.id !== key); + + // 更新本地状态 + setSuppliers(updatedSuppliers); + + // 同步到Dva model + updateFormData({ suppliersWithEvaluators: updatedSuppliers }); + + // 更新选中行,移除已删除的供应商 + setSelectedRowKeys((prevKeys) => prevKeys.filter((k) => k !== key)); + }; + + // 渲染组件 + return ( +
+ + {/* 工具栏区域 */} +
+ + + + +
+ + {/* 供应商表格区域 */} + {suppliers.length === 0 ? ( +
+ 请先在上一步选择供应商 +
+ ) : ( + + )} + + {/* 批量选择评价人员弹窗 */} + setBatchSelectModalVisible(false)} + onSelect={handleBatchEvaluatorSelect} + /> + + {/* 单个供应商评价人员弹窗 */} + setEvaluatorModalVisible(false)} + onSelect={handleEvaluatorSelect} + currentSupplier={currentSupplier} + mode={modalMode} + /> + + {/* 权重设置弹窗 */} + setWeightSettingModalVisible(false)} + onOk={handleSaveWeights} + taskDeptWeightList={taskDeptWeightList} + form={form} + /> +
+
+ ); +}; + +/** + * 连接 Dva model + * 将 model 中的状态映射到组件 props + */ +const ConnectedComponent = connect( + ({ supplierTaskManage }: { supplierTaskManage: SupplierTaskModelState }) => ({ + supplierTaskManage, + }), +)(EvaluatorSelectStepComponent); + +/** + * 外层转发 ref 到 innerRef + */ +const EvaluatorSelectStep = forwardRef((props: any, ref) => ( + +)); export default EvaluatorSelectStep; diff --git a/src/pages/supplierEvaluateManage/supplierTaskManage/components/SupplierSelectStep.tsx b/src/pages/supplierEvaluateManage/supplierTaskManage/components/SupplierSelectStep.tsx index f0cf773..8fa719f 100644 --- a/src/pages/supplierEvaluateManage/supplierTaskManage/components/SupplierSelectStep.tsx +++ b/src/pages/supplierEvaluateManage/supplierTaskManage/components/SupplierSelectStep.tsx @@ -1,27 +1,37 @@ import React, { forwardRef, useImperativeHandle, useEffect, useState } from 'react'; -import { Card, Form } from 'antd'; +import { Card } from 'antd'; import styles from '../supplierTaskManageAdd.less'; import SupplierSelector from '@/components/SupplierSelector'; -import type { TaskAddRequest,SupplierItem } from '@/servers/types/supplierEvaluateTask'; +import type { SupplierItem } from '@/servers/dao/supplierEvaluateTask'; +import type { Dispatch } from 'umi'; +import { connect } from 'umi'; +import type { SupplierTaskModelState } from '@/models/supplierTaskManage'; interface SupplierSelectStepProps { - formData: Partial; // 从父组件传递的表单数据 - onFormDataChange: (data: Partial) => void; // 表单数据变更的回调函数 + supplierTaskManage: SupplierTaskModelState; + dispatch: Dispatch; + innerRef?: any; // 使用 innerRef 作为属性名 } -const SupplierSelectStep = forwardRef(({ formData, onFormDataChange }, ref) => { +// 定义组件,使用 innerRef 代替直接的 ref +const SupplierSelectStepComponent = (props: SupplierSelectStepProps) => { + const { supplierTaskManage, dispatch, innerRef } = props; + + // 从model获取数据 + const { taskFormData } = supplierTaskManage; + // 内部状态,避免直接操作formData导致循环更新 const [selectedSuppliers, setSelectedSuppliers] = useState([]); - // 当formData.selectedSuppliers更新时,同步到本地状态 + // 当taskFormData.selectedSuppliers更新时,同步到本地状态 useEffect(() => { - if (formData.selectedSuppliers && formData.selectedSuppliers.length > 0) { - setSelectedSuppliers(formData.selectedSuppliers); + if (taskFormData.selectedSuppliers && taskFormData.selectedSuppliers.length > 0) { + setSelectedSuppliers(taskFormData.selectedSuppliers); } - }, [formData.selectedSuppliers]); // 只在表单ID变化时更新(编辑模式加载时) + }, [taskFormData.selectedSuppliers]); // 只在表单ID变化时更新(编辑模式加载时) - // 暴露表单方法给父组件 - useImperativeHandle(ref, () => ({ + // 暴露表单方法给父组件,使用 innerRef + useImperativeHandle(innerRef, () => ({ validateFields: () => { // 这里可以添加自定义验证逻辑 return Promise.resolve(); @@ -51,10 +61,13 @@ const SupplierSelectStep = forwardRef(({ formData, // 更新本地状态 setSelectedSuppliers(suppliersWithEvaluators); - // 通知父组件 - onFormDataChange({ - selectedSuppliers: suppliersWithEvaluators, - supplierIds: suppliersWithEvaluators.map(supplier => ({ id: supplier.id })) + // 通过dispatch更新model数据 + dispatch({ + type: 'supplierTaskManage/updateFormData', + payload: { + selectedSuppliers: suppliersWithEvaluators, + supplierIds: suppliersWithEvaluators.map(supplier => ({ id: supplier.id })) + } }); }; @@ -68,6 +81,18 @@ const SupplierSelectStep = forwardRef(({ formData, ); -}); +}; + +// 连接 Dva model +const ConnectedComponent = connect( + ({ supplierTaskManage }: { supplierTaskManage: SupplierTaskModelState }) => ({ + supplierTaskManage, + }) +)(SupplierSelectStepComponent); + +// 外层转发 ref 到 innerRef +const SupplierSelectStep = forwardRef((props: any, ref) => ( + +)); export default SupplierSelectStep; diff --git a/src/pages/supplierEvaluateManage/supplierTaskManage/supplierTaskManageAdd.tsx b/src/pages/supplierEvaluateManage/supplierTaskManage/supplierTaskManageAdd.tsx index 211d9af..e569af7 100644 --- a/src/pages/supplierEvaluateManage/supplierTaskManage/supplierTaskManageAdd.tsx +++ b/src/pages/supplierEvaluateManage/supplierTaskManage/supplierTaskManageAdd.tsx @@ -1,23 +1,22 @@ -import React, { useState, useRef, useEffect } from 'react'; -import { Card, Steps, Button, message, Space, Row, Col, Form, Modal } from 'antd'; -import { history } from 'umi'; +import React, { useRef, useEffect } from 'react'; +import { Card, Steps, Button, message, Space, Row, Col, Modal } from 'antd'; +import { connect, ConnectProps, history, Dispatch } from 'umi'; import { ArrowLeftOutlined, SaveOutlined } from '@ant-design/icons'; -import { addTask, getTaskDetail, updateTask } from '@/servers/api/supplierEvaluate'; import BasicInfoStep from './components/BasicInfoStep'; import SupplierSelectStep from './components/SupplierSelectStep'; import EvaluatorSelectStep from './components/EvaluatorSelectStep'; import DivisionStep from './components/DivisionStep'; import styles from './supplierTaskManageAdd.less'; -import type { - DeptWeightItem, - TaskAddRequest, - TaskDetailData, -} from '@/servers/types/supplierEvaluateTask'; import { TaskNotifyLowerUnits } from '@/dicts/supplierTaskDict'; +import { SupplierTaskModelState } from '@/models/supplierTaskManage'; const { Step } = Steps; -// 获取URL参数 +/** + * 获取URL参数 + * 解析URL中的id和mode参数,用于判断是否为编辑模式 + * @returns {object} 包含id和mode的对象 + */ const getUrlParams = () => { const location = window.location.href; const url = new URL(location); @@ -27,143 +26,63 @@ const getUrlParams = () => { }; }; -const SupplierTaskManageAdd: React.FC = () => { - // 当前步骤索引,从0开始 - const [currentStep, setCurrentStep] = useState(0); +/** + * 页面组件Props接口定义 + * 继承了ConnectProps,添加了supplierTaskManage和dispatch + */ +interface PageProps extends ConnectProps { + supplierTaskManage: SupplierTaskModelState; // dva model状态 + dispatch: Dispatch; // dva dispatch方法 +} - // 提交加载状态 - const [loading, setLoading] = useState(false); +/** + * 供应商任务管理添加/编辑组件 + * 使用步骤式表单引导用户完成添加或编辑任务的流程 + */ +const SupplierTaskManageAdd: React.FC = ({ supplierTaskManage, dispatch }) => { + // 获取dva model中的状态 + const { currentStep, loading, detailLoading } = supplierTaskManage; // 判断是否为编辑模式 const urlParams = getUrlParams(); const isEditMode = urlParams.mode === 'edit' && urlParams.id; const taskId = urlParams.id || ''; - // 整个表单的数据,包含所有步骤的数据 - const [formData, setFormData] = useState>({}); - - // 加载状态 - const [detailLoading, setDetailLoading] = useState(false); - - // 创建表单引用,用于访问子组件的表单方法(仅用于验证) - const basicFormRef = useRef(null); // 基本信息表单引用 + // 创建表单引用,用于访问子组件的表单方法(主要用于验证) + const basicFormRef = useRef(null); // 基本信息表单引用 const supplierFormRef = useRef(null); // 供应商选择表单引用 const evaluatorFormRef = useRef(null); // 评价人员表单引用 - const divisionFormRef = useRef(null); // 评价分工表单引用 + const divisionFormRef = useRef(null); // 评价分工表单引用 // 确认对话框可见性状态 - const [confirmModalVisible, setConfirmModalVisible] = useState(false); + const [confirmModalVisible, setConfirmModalVisible] = React.useState(false); - // 获取任务详情 - const fetchTaskDetail = async (id: string) => { - setDetailLoading(true); - try { - const response = await getTaskDetail(id); - if (response.success) { - const detail: TaskDetailData = response.data; - - // 转换任务详情数据为表单数据结构 - const taskFormData: Partial = { - id: detail.id || '', - evaluateTheme: detail.evaluateTheme || '', - startTime: detail.startTime || '', - endTime: detail.endTime || '', - templateId: detail.templateId || '', - categoryLimitation: detail.categoryLimitation || '0', - evaluateYear: detail.evaluateYear || '', - categoryId: detail.categoryId || undefined, - - // 供应商数据回显转换 - selectedSuppliers: detail.blackSupplierVos.map((item) => ({ - ...item, - id: item.supplierId, - name: item.supplierName, - evaluators: item.userList, - })), - - // 接口返回的人员分配的指标,以人员userId 为维度 indicatorIds[string] 指标id - indicatorList: detail.indicatorList || [], - // 后台用供应商集合,包含供应商id 并且关联 userIds - supplierIds: detail.supplierIds || [], - - // 部门权重设置 - taskDeptWeightList: detail.taskDeptWeightList || [], - // 分配指标分工回显 - suppliersWithEvaluators: detail.blackSupplierVos.map((item) => ({ - ...item, - id: item.supplierId, - name: item.supplierName, - evaluators: item.userList, - })), - }; - - // 更新表单数据 - 子组件通过props获取 - setFormData(taskFormData); - } else { - message.error(response.message || '获取任务详情失败'); - } - } catch (error) { - console.error('获取任务详情失败:', error); - message.error('获取任务详情失败'); - } finally { - setDetailLoading(false); - } - }; - - // 编辑模式下获取任务详情 + /** + * 编辑模式下获取任务详情,或新建模式下重置状态 + * 利用useEffect在组件挂载或依赖项变化时触发 + */ useEffect(() => { - if (isEditMode) { - fetchTaskDetail(taskId); + if (isEditMode && taskId && dispatch) { + // 编辑模式,获取任务详情 + dispatch({ + type: 'supplierTaskManage/fetchTaskDetail', + payload: { taskId }, + }); + } else if (dispatch) { + // 新建模式,重置状态 + dispatch({ + type: 'supplierTaskManage/resetState', + }); } - }, [isEditMode, taskId]); + }, [isEditMode, taskId, dispatch]); - // 处理表单数据变更 - const handleFormDataChange = (data: Partial) => { - // 第一步:基本信息 - if (data) { - setFormData((prev) => ({ ...prev, ...data })); - } - - // 第二步:供应商选择 - if (data.selectedSuppliers) { - // 确保供应商数据包含evaluators字段 - const suppliersWithEvaluators = data.selectedSuppliers.map((supplier: any) => ({ - ...supplier, - evaluators: supplier.evaluators || [], // 确保evaluators字段存在 - })); - - setFormData((prev) => ({ ...prev, selectedSuppliers: suppliersWithEvaluators })); - } - - // 第三步:评价人员 - if (data.suppliersWithEvaluators) { - // 确保suppliersWithEvaluators和selectedSuppliers保持一致 - const evaluatedSuppliers = data.suppliersWithEvaluators; - setFormData((prev) => ({ - ...prev, - suppliersWithEvaluators: evaluatedSuppliers, - selectedSuppliers: evaluatedSuppliers, // 同步更新selectedSuppliers - })); - } - - // 处理部门权重列表 taskDeptWeightList - if (data.taskDeptWeightList) { - setFormData((prev) => ({ - ...prev, - taskDeptWeightList: data.taskDeptWeightList, - })); - } - }; - - // 步骤配置 + // 步骤配置,定义每个步骤的标题、描述和内容组件 const steps = [ { title: '基本信息', // 步骤标题 description: '请填写基本信息', // 步骤描述 content: ( ), // 步骤内容组件 @@ -173,8 +92,6 @@ const SupplierTaskManageAdd: React.FC = () => { description: '请选择参加评价的供应商', content: ( ), @@ -184,8 +101,6 @@ const SupplierTaskManageAdd: React.FC = () => { description: '请选择供应商评价人员', content: ( ), @@ -195,23 +110,27 @@ const SupplierTaskManageAdd: React.FC = () => { description: '不设置按默认全部指标评价', content: ( ), }, ]; - // 处理返回 + /** + * 处理返回按钮点击事件 + * 返回上一页 + */ const handleBack = () => { history.goBack(); }; - // 下一步 + /** + * 处理下一步按钮点击事件 + * 验证当前步骤的表单数据,通过后进入下一步 + */ const handleNext = async () => { try { - // 验证当前步骤表单 + // 根据当前步骤验证相应的表单 if (currentStep === 0 && basicFormRef.current) { // 验证基本信息 await basicFormRef.current.validateFields(); @@ -231,7 +150,9 @@ const SupplierTaskManageAdd: React.FC = () => { } // 验证通过,进入下一步 - setCurrentStep(currentStep + 1); + if (dispatch) { + dispatch({ type: 'supplierTaskManage/nextStep' }); + } } catch (errorInfo: any) { // 表单验证失败 console.log('表单验证失败:', errorInfo); @@ -243,83 +164,40 @@ const SupplierTaskManageAdd: React.FC = () => { } }; - // 上一步 + /** + * 处理上一步按钮点击事件 + * 返回上一个步骤 + */ const handlePrev = () => { - setCurrentStep(currentStep - 1); - }; - - // 实际提交数据的函数 - const submitTaskData = async (taskStatus: TaskNotifyLowerUnits) => { - setLoading(true); - try { - // 构建提交数据,确保必填字段有值 - const submitData = { - evaluateTheme: formData.evaluateTheme || '', // 评价主题 - startTime: formData.startTime || '', // 开始时间 - endTime: formData.endTime || '', // 结束时间 - templateId: formData.templateId || '', // 模板ID - categoryLimitation: formData.categoryLimitation || '0', // 品类限制 - evaluateYear: formData.evaluateYear || '', // 评价年份 - categoryId: formData.categoryId || '', // 品类ID - taskStatus: taskStatus, // 任务状态,根据用户的选择决定 - - // 供应商ID列表,包含评价人员ID - supplierIds: - formData.selectedSuppliers?.map((supplier: any) => { - // 从供应商的evaluators中提取用户ID - const userIds = supplier.evaluators?.map((evaluator: any) => evaluator.id) || []; - return { - id: supplier.id, - userIds, - }; - }) || [], - - // 评价指标列表 - indicatorList: - formData.indicatorList?.map((item: any) => ({ - userId: item.userId, - // 评价类型:如果用户关联了指标则为1(按指标),否则为0(按评价单) - type: item.indicatorIds && item.indicatorIds.length > 0 ? 1 : 0, - indicatorIds: item.indicatorIds || [], - })) || [], - - // 部门权重列表,过滤掉权重为0的 - taskDeptWeightList: - formData.taskDeptWeightList?.filter((item: any) => { - return item.weightValue && item.weightValue !== '0'; - }) || [], - }; - - let response; - - if (isEditMode) { - // 编辑模式,添加ID字段 - const updateData = { - ...submitData, - id: taskId, - }; - response = await updateTask(updateData); - } else { - // 新增模式 - response = await addTask(submitData); - } - - if (response.success) { - message.success(isEditMode ? '任务更新成功' : '任务创建成功'); - // 成功后直接返回列表页面 - history.push('/supplier/supplierTaskManage'); - } else { - message.error(response.message || '提交失败'); - } - } catch (error) { - console.error('提交失败:', error); - message.error('提交失败'); - } finally { - setLoading(false); + if (dispatch) { + dispatch({ type: 'supplierTaskManage/prevStep' }); } }; - // 提交表单 + /** + * 提交任务数据 + * @param taskStatus 任务状态,决定是否需要下级单位完善 + */ + const submitTaskData = (taskStatus: TaskNotifyLowerUnits | null) => { + if (dispatch) { + dispatch({ + type: 'supplierTaskManage/submitTaskData', + payload: { + taskStatus, + isEditMode, + taskId, + onSuccess: () => { + history.goBack(); + } + }, + }); + } + }; + + /** + * 处理提交按钮点击事件 + * 验证评价分工表单,通过后根据是否为编辑模式决定提交方式 + */ const handleSubmit = async () => { // 验证评价分工 if (divisionFormRef.current) { @@ -329,23 +207,42 @@ const SupplierTaskManageAdd: React.FC = () => { return; } } + // 如果是编辑模式,则直接提交 提示是否确认后直接提交 + if (isEditMode) { + Modal.confirm({ + title: '提示', + content: '是否确认提交', + onOk: () => { + submitTaskData(null); + }, + }); + return; + } - // 显示确认对话框 + // 新增模式下,显示确认对话框询问是否需要下级单位完善 setConfirmModalVisible(true); }; - // 处理确认对话框的取消 + /** + * 处理确认对话框的取消按钮点击事件 + */ const handleConfirmCancel = () => { setConfirmModalVisible(false); }; - // 处理确认对话框的"是"选项 + /** + * 处理确认对话框的"是"选项点击事件 + * 提交任务,并设置状态为需要下级单位完善 + */ const handleConfirmYes = () => { submitTaskData(TaskNotifyLowerUnits.YES); // 未开始状态,需要下级单位完善 setConfirmModalVisible(false); }; - // 处理确认对话框的"否"选项 + /** + * 处理确认对话框的"否"选项点击事件 + * 提交任务,并设置状态为不需要下级单位完善 + */ const handleConfirmNo = () => { submitTaskData(TaskNotifyLowerUnits.NO); // 进行中状态,不需要下级单位完善 setConfirmModalVisible(false); @@ -353,7 +250,9 @@ const SupplierTaskManageAdd: React.FC = () => { return (
+ {/* 卡片容器,显示加载状态 */} + {/* 页面头部,包含标题和返回按钮 */}

{isEditMode ? '修改评价任务' : '新增评价任务'}

+ {/* 步骤式表单布局 */} + {/* 左侧步骤导航 */} {steps.map((item) => ( @@ -369,9 +270,11 @@ const SupplierTaskManageAdd: React.FC = () => { ))} + {/* 右侧表单内容 */}
{steps[currentStep].content}
+ {/* 步骤操作按钮 */}
{currentStep > 0 && } @@ -396,7 +299,7 @@ const SupplierTaskManageAdd: React.FC = () => { - {/* 确认对话框 */} + {/* 确认对话框 - 询问是否需要下级单位完善 */} { ); }; -export default SupplierTaskManageAdd; +// 将dva model中的状态映射到组件props +export default connect(({ supplierTaskManage }: { supplierTaskManage: SupplierTaskModelState }) => ({ + supplierTaskManage, +}))(SupplierTaskManageAdd); diff --git a/src/servers/api/supplierEvaluate.ts b/src/servers/api/supplierEvaluate.ts index 1dbe388..591610b 100644 --- a/src/servers/api/supplierEvaluate.ts +++ b/src/servers/api/supplierEvaluate.ts @@ -1,5 +1,26 @@ import request from '@/utils/request'; -import type { TaskDetailResponse } from '@/servers/types/supplierEvaluateTask'; +import type { + TaskDetailResponse, + TemplateRequest, + TemplateResponse, + TemplateDetailResponse, + TemplateAddRequest, + TemplateUpdateRequest, + CategoryTreeResponse, + TaskRequest, + TaskResponse, + EvaluateTaskRequest, + EvaluateTaskData, + EvaluateSupplierRequest, + EvaluateSupplierData, + EvaluateScoreRequest, + EvaluateScoreDetailData, + EvaluateRuleResponse, + EvaluateRuleDetailResponse, + EvaluateRuleAddRequest, + EvaluateRuleUpdateRequest, + TaskAddRequest, +} from '@/servers/dao/supplierEvaluateTask'; /** * 获取所有模板列表 @@ -16,8 +37,8 @@ export async function getAllTemplates() { * @param params 查询参数 * @returns Promise */ -export async function getTemplateList(params: SupplierEvaluate.TemplateRequest) { - return request('/coscoEvaluate/template/getPage', { +export async function getTemplateList(params: TemplateRequest) { + return request('/coscoEvaluate/template/getPage', { method: 'POST', data: params, }); @@ -29,7 +50,7 @@ export async function getTemplateList(params: SupplierEvaluate.TemplateRequest) * @returns Promise */ export async function getTemplateDetail(id: string) { - return request(`/coscoEvaluate/template/${id}`, { + return request(`/coscoEvaluate/template/${id}`, { method: 'GET', }); } @@ -39,7 +60,7 @@ export async function getTemplateDetail(id: string) { * @param params 模板数据 * @returns Promise */ -export async function addTemplate(params: SupplierEvaluate.TemplateAddRequest) { +export async function addTemplate(params: TemplateAddRequest) { return request>('/coscoEvaluate/template', { method: 'POST', data: params, @@ -52,7 +73,7 @@ export async function addTemplate(params: SupplierEvaluate.TemplateAddRequest) { * @param params 模板数据 * @returns Promise */ -export async function updateTemplate(params: SupplierEvaluate.TemplateUpdateRequest) { +export async function updateTemplate(params: TemplateUpdateRequest) { return request>('/coscoEvaluate/template', { method: 'PUT', data: params, @@ -110,7 +131,7 @@ export async function getCategoryList() { * @returns Promise */ export async function getCategoryTree() { - return request('/cosco/category/categoryTree', { + return request('/cosco/category/categoryTree', { method: 'GET', }); } @@ -130,8 +151,8 @@ export async function getDepartmentList() { * @param params 查询参数 * @returns Promise */ -export async function getTaskList(params: SupplierEvaluate.TaskRequest) { - return request('/coscoEvaluate/task/getPage', { +export async function getTaskList(params: TaskRequest) { + return request('/coscoEvaluate/task/getPage', { method: 'POST', data: params, }); @@ -153,56 +174,21 @@ export async function getTaskDetail(id: string) { * @param params 任务数据 * @returns Promise */ -export async function addTask(params: SupplierEvaluate.TaskAddRequest) { +export async function addTask(params: TaskAddRequest) { return request>('/coscoEvaluate/task/addTask', { method: 'POST', data: params, }); } -/** - * 更新评价任务 - * @param params 任务数据 - * @returns Promise - */ -export async function updateTask(params: SupplierEvaluate.TaskAddRequest) { - return request>('/coscoEvaluate/task', { - method: 'PUT', - data: params, - }); -} - -/** - * 删除评价任务 - * @param id 任务ID - * @returns Promise - */ -export async function deleteTask(id: string) { - return request>('/coscoEvaluate/task/delete', { - method: 'POST', - data: { id }, - }); -} - -/** - * 批量删除评价任务 - * @param ids 任务ID数组 - * @returns Promise - */ -export async function batchDeleteTask(ids: string[]) { - return request>('/coscoEvaluate/task/batchDelete', { - method: 'POST', - data: { ids }, - }); -} /** * 获取评价结果列表 * @param params 查询参数 * @returns Promise */ -export async function getEvaluateResultList(params: API.EvaluateTaskRequest) { - return request>('/coscoEvaluate/task/getTaskPage', { +export async function getEvaluateResultList(params: EvaluateTaskRequest) { + return request>('/coscoEvaluate/task/getTaskPage', { method: 'POST', data: params, }); @@ -213,8 +199,8 @@ export async function getEvaluateResultList(params: API.EvaluateTaskRequest) { * @param params 查询参数 * @returns Promise */ -export async function getEvaluateSupplierList(params: API.EvaluateSupplierRequest) { - return request>('/coscoEvaluate/supplier/getPage', { +export async function getEvaluateSupplierList(params: EvaluateSupplierRequest) { + return request>('/coscoEvaluate/supplier/getPage', { method: 'POST', data: params, }); @@ -225,7 +211,7 @@ export async function getEvaluateSupplierList(params: API.EvaluateSupplierReques * @param params 查询参数 * @returns Promise */ -export async function getEvaluateScoreList(params: API.EvaluateScoreRequest) { +export async function getEvaluateScoreList(params: EvaluateScoreRequest) { return request>>('/coscoEvaluate/supplier/getSupplierDimension', { method: 'POST', data: params, @@ -238,7 +224,7 @@ export async function getEvaluateScoreList(params: API.EvaluateScoreRequest) { * @returns Promise */ export async function getEvaluateScoreDetail(id: string) { - return request>(`/coscoEvaluate/user/getIndicator?id=${id}`, { + return request>(`/coscoEvaluate/user/getIndicator?id=${id}`, { method: 'GET', }); } @@ -248,7 +234,7 @@ export async function getEvaluateScoreDetail(id: string) { * @returns Promise */ export async function getAllEvaluateRules() { - return request('/coscoEvaluate/level/getAllList', { + return request('/coscoEvaluate/level/getAllList', { method: 'GET', }); } @@ -259,7 +245,7 @@ export async function getAllEvaluateRules() { * @returns Promise */ export async function getEvaluateRuleDetail(id: string) { - return request(`/coscoEvaluate/level/${id}`, { + return request(`/coscoEvaluate/level/${id}`, { method: 'GET', }); } @@ -269,7 +255,7 @@ export async function getEvaluateRuleDetail(id: string) { * @param params 规则数据 * @returns Promise */ -export async function addEvaluateRule(params: API.EvaluateRuleAddRequest) { +export async function addEvaluateRule(params: EvaluateRuleAddRequest) { return request>('/coscoEvaluate/level', { method: 'POST', data: params, @@ -281,7 +267,7 @@ export async function addEvaluateRule(params: API.EvaluateRuleAddRequest) { * @param params 规则数据 * @returns Promise */ -export async function updateEvaluateRule(params: API.EvaluateRuleUpdateRequest) { +export async function updateEvaluateRule(params: EvaluateRuleUpdateRequest) { return request>('/coscoEvaluate/level', { method: 'PUT', data: params, @@ -305,7 +291,7 @@ export async function deleteEvaluateRule(id: string) { * @returns Promise */ export async function getSupplierScoreDetail(id: string) { - return request>(`/coscoEvaluate/supplier/getScoreResult`, { + return request>(`/coscoEvaluate/supplier/getScoreResult`, { method: 'GET', params: { id } }); diff --git a/src/servers/dao/supplierEvaluateTask.ts b/src/servers/dao/supplierEvaluateTask.ts new file mode 100644 index 0000000..fbab47e --- /dev/null +++ b/src/servers/dao/supplierEvaluateTask.ts @@ -0,0 +1,536 @@ + +import type { TaskNotifyLowerUnits } from '@/dicts/supplierTaskDict'; +/** + * 供应商评价相关接口类型定义 + */ + +// 模板相关类型 +/** + * 模板查询请求参数 + */ +export interface TemplateRequest { + current?: number; + pageSize?: number; + templateName?: string; + status?: string; +} + +/** + * 模板查询响应 + */ +export interface TemplateResponse { + code: number; + success: boolean; + data: { + records: TemplateItem[]; + total: number; + size: number; + current: number; + pages: number; + }; + message: string; +} + +/** + * 模板项 + */ +export interface TemplateItem { + id: string; + templateName: string; + status: string; + createTime: string; + updateTime: string; + createBy: string; + updateBy: string; + [key: string]: any; +} + +/** + * 模板详情响应 + */ +export interface TemplateDetailResponse { + code: number; + success: boolean; + data: { + id: string; + templateName: string; + status: string; + dimensions: TemplateDimension[]; + [key: string]: any; + }; + message: string; +} + +/** + * 模板维度 + */ +export interface TemplateDimension { + id: string; + dimensionName: string; + dimensionWeight: number; + indicators: TemplateIndicator[]; + [key: string]: any; +} + +/** + * 模板指标 + */ +export interface TemplateIndicator { + id: string; + indicatorName: string; + indicatorWeight: number; + [key: string]: any; +} + +/** + * 新增模板请求 + */ +export interface TemplateAddRequest { + templateName: string; + dimensions: { + dimensionName: string; + dimensionWeight: number; + indicators: { + indicatorName: string; + indicatorWeight: number; + }[]; + }[]; +} + +/** + * 更新模板请求 + */ +export interface TemplateUpdateRequest { + id: string; + templateName: string; + dimensions: { + id?: string; + dimensionName: string; + dimensionWeight: number; + indicators: { + id?: string; + indicatorName: string; + indicatorWeight: number; + }[]; + }[]; +} + +// 品类相关类型 +/** + * 品类树响应 + */ +export interface CategoryTreeResponse { + code: number; + success: boolean; + data: CategoryTreeItem[]; + message: string; +} + +/** + * 品类树节点 + */ +export interface CategoryTreeItem { + id: string; + name: string; + children?: CategoryTreeItem[]; + [key: string]: any; +} + +// 任务相关类型 +/** + * 任务查询请求 + */ +export interface TaskRequest { + current?: number; + pageSize?: number; + evaluateTheme?: string; + evaluateYear?: string; + startTime?: string; + endTime?: string; + categoryId?: string; + status?: string; +} + +/** + * 任务查询响应 + */ +export interface TaskResponse { + code: number; + success: boolean; + data: { + records: TaskItem[]; + total: number; + size: number; + current: number; + pages: number; + }; + message: string; +} + +/** + * 任务项 + */ +export interface TaskItem { + id: string; + evaluateTheme: string; + evaluateYear: string; + startTime: string; + endTime: string; + templateId: string; + templateName: string; + status: string; + categoryId?: string; + categoryName?: string; + createTime: string; + createBy: string; + [key: string]: any; +} +/* +人员信息 +*/ +export interface PersonnelItem { + id: string; + name: string; + position: string; + userDept: string; + userDeptId: string; +} + +// 评价结果相关类型 +/** + * 评价任务请求 + */ +export interface EvaluateTaskRequest { + current?: number; + pageSize?: number; + evaluateTheme?: string; + evaluateYear?: string; + startTime?: string; + endTime?: string; + status?: string; +} + +/** + * 评价任务数据 + */ +export interface EvaluateTaskData { + records: EvaluateTaskItem[]; + total: number; + size: number; + current: number; + pages: number; +} + +/** + * 评价任务项 + */ +export interface EvaluateTaskItem { + id: string; + evaluateTheme: string; + evaluateYear: string; + startTime: string; + endTime: string; + templateId: string; + templateName: string; + status: string; + createTime: string; + createBy: string; + supplierCount: number; + [key: string]: any; +} + +/** + * 评价供应商请求 + */ +export interface EvaluateSupplierRequest { + current?: number; + pageSize?: number; + taskId: string; + supplierName?: string; + status?: string; +} + +/** + * 评价供应商数据 + */ +export interface EvaluateSupplierData { + records: EvaluateSupplierItem[]; + total: number; + size: number; + current: number; + pages: number; +} + +/** + * 评价供应商项 + */ +export interface EvaluateSupplierItem { + id: string; + supplierId: string; + supplierName: string; + socialCreditCode: string; + status: string; + score: number; + level: string; + [key: string]: any; +} + +/** + * 评价分数请求 + */ +export interface EvaluateScoreRequest { + current?: number; + pageSize?: number; + taskId: string; + supplierId: string; +} + +/** + * 评价分数详情数据 + */ +export interface EvaluateScoreDetailData { + id: string; + supplierId: string; + supplierName: string; + taskId: string; + evaluateTheme: string; + evaluateYear: string; + dimensions: EvaluateDimension[]; + userScore: number; + totalScore: number; + level: string; + [key: string]: any; +} + +/** + * 评价维度 + */ +export interface EvaluateDimension { + id: string; + dimensionName: string; + dimensionWeight: number; + dimensionScore: number; + indicators: EvaluateIndicator[]; + [key: string]: any; +} + +/** + * 评价指标 + */ +export interface EvaluateIndicator { + id: string; + indicatorName: string; + indicatorWeight: number; + score: number; + remarks: string; + [key: string]: any; +} + +// 评价规则相关类型 +/** + * 评价规则响应 + */ +export interface EvaluateRuleResponse { + code: number; + success: boolean; + data: EvaluateRuleItem[]; + message: string; +} + +/** + * 评价规则项 + */ +export interface EvaluateRuleItem { + id: string; + levelName: string; + minScore: number; + maxScore: number; + status: string; + createTime: string; + updateTime: string; + createBy: string; + updateBy: string; + [key: string]: any; +} + +/** + * 评价规则详情响应 + */ +export interface EvaluateRuleDetailResponse { + code: number; + success: boolean; + data: EvaluateRuleItem; + message: string; +} + +/** + * 评价规则新增请求 + */ +export interface EvaluateRuleAddRequest { + levelName: string; + minScore: number; + maxScore: number; +} + +/** + * 评价规则更新请求 + */ +export interface EvaluateRuleUpdateRequest { + id: string; + levelName: string; + minScore: number; + maxScore: number; +} + +/** + * 供应商评价任务详情接口类型定义 + */ +export interface IndicatorList { + indicatorIds: string[]; + type: number; + userId: string; +} +export interface User { + userId: string; + userName: string; + userDept: string; + userDeptId: string; +} +/** + * 任务详情数据 + */ +export interface TaskDetailData { + categoryId: string | null; + categoryLimitation: string | null; + createBy: string | null; + createDate: string | null; + createTime: string | null; + deleteFlag: string | null; + delFlag: string; + deptId: string | null; + endTime: string | null; + evaluateTheme: string | null; + evaluateYear: string | null; + id: string | null; + indicatorList: IndicatorList[] | null; + lastUpdateTime: string | null; + startTime: string | null; + status: string; + supplierIds: { + id: string; + userIds: string[]; + }[] | null; + userList: User[]; + suppliers: { + id: string; + supplierName: string; + socialCreditCode?: string; + category?: string; + department?: string; + evaluators: { + id: string; + name: string; + department: string; + position?: string; + }[]; + [key: string]: any; + }[] | null; + templateId: string | null; + tenantId: string | null; + tenantName: string | null; + updateBy: string | null; + updateDate: string | null; + updateTime: string | null; + weightDept: string | null; + weightStatus: number | null; + weightValue: string | null; + taskDeptWeightList: DeptWeightItem[] | null; + blackSupplierVos: { + deptName: string; + supplierId: string; + supplierName: string; + userList: User[]; + }[], + [property: string]: any; +} +// 部门配置权重 +export interface DeptWeightItem { + //部门id + weightDept: string; + // 部门权重值 + weightValue: string; + // 部门名称 + weightDeptName: string; +} +/** + * 任务详情响应 + */ +export interface TaskDetailResponse { + code: number; + data: TaskDetailData; + message: string; + success: boolean; + [property: string]: any; +} + +// 新增评价任务和修改 请求参数定义 +export type TaskAddRequest = { + /** + * 品类限制类型(0.通用不限品类、1.限制品类) + */ + categoryLimitation?: string; + /** + * 评价结束时间 + */ + endTime: string; + /** + * 评价主题 + */ + evaluateTheme: string; + /** + * 评价年度 + */ + evaluateYear: string; + indicatorList: IndicatorList[]; + /** + * 评价开始时间 + */ + startTime: string; + supplierIds: SupplierId[]; + taskDeptWeightList: DeptWeightItem[]; + /** + * 评价表模板id(cosco_evaluate_template表主键) + */ + templateId: string; + // 品类id + categoryId?: string; + /** + * 是否下级部门可以添加评价信息 0否1是 + */ + taskStatus?: TaskNotifyLowerUnits | null; + [property: string]: any; +} +/** + * 供应商项 + */ +export interface SupplierItem { + id: string; // 供应商ID + supplierName: string; // 供应商名称 + socialCreditCode?: string; // 统一社会信用代码 + category?: string; // 品类 + department?: string; // 准入部门 + evaluatorCount: number; // 评价人员数量 + evaluators: User[]; // 评价人员列表 + // 其他可能的字段 + [key: string]: any; +} +export type SupplierId = { + /** + * 供应商id + */ + id: string; + /** + * 用户集合 + */ + userIds?: string[]; +} diff --git a/src/servers/types/evaluator.ts b/src/servers/types/evaluator.ts index 98c5c46..d59cde7 100644 --- a/src/servers/types/evaluator.ts +++ b/src/servers/types/evaluator.ts @@ -13,8 +13,8 @@ export interface PersonnelItem { userDeptId: string; // 所属部门ID position?: string; // 职位(可选) selected?: boolean; // 是否被选中(用于UI显示) + indicatorIds?: string[]; // 指标ID列表 // 其他可能的API字段 - [key: string]: any; } /** diff --git a/src/servers/types/supplierEvaluateTask.ts b/src/servers/types/supplierEvaluateTask.ts deleted file mode 100644 index db6b951..0000000 --- a/src/servers/types/supplierEvaluateTask.ts +++ /dev/null @@ -1,148 +0,0 @@ -/** - * 供应商评价任务详情接口类型定义 - */ -export interface IndicatorList { - indicatorIds: string[]; - type: number; - userId: string; -} -export interface User{ - userId: string; - userName: string; - userDept: string; - userDeptId: string; -} -/** - * 任务详情数据 - */ -export interface TaskDetailData { - categoryId: string | null; - categoryLimitation: string | null; - createBy: string | null; - createDate: string | null; - createTime: string | null; - deleteFlag: string | null; - delFlag: string; - deptId: string | null; - endTime: string | null; - evaluateTheme: string | null; - evaluateYear: string | null; - id: string | null; - indicatorList: IndicatorList[] | null; - lastUpdateTime: string | null; - startTime: string | null; - status: string; - supplierIds: { - id: string; - userIds: string[]; - }[] | null; - userList: User[]; - suppliers: { - id: string; - supplierName: string; - socialCreditCode?: string; - category?: string; - department?: string; - evaluators: { - id: string; - name: string; - department: string; - position?: string; - }[]; - [key: string]: any; - }[] | null; - templateId: string | null; - tenantId: string | null; - tenantName: string | null; - updateBy: string | null; - updateDate: string | null; - updateTime: string | null; - weightDept: string | null; - weightStatus: number | null; - weightValue: string | null; - taskDeptWeightList: DeptWeightItem[] | null; - blackSupplierVos: { - deptName: string; - supplierId: string; - supplierName: string; - userList: User[]; - }[], - [property: string]: any; -} -// 部门配置权重 -export interface DeptWeightItem { - //部门id - weightDept: string; - // 部门权重值 - weightValue: string; - // 部门名称 - weightDeptName: string; -} -/** - * 任务详情响应 - */ -export interface TaskDetailResponse { - code: number; - data: TaskDetailData; - message: string; - success: boolean; - [property: string]: any; -} - -// 新增评价任务和修改 请求参数定义 -export type TaskAddRequest = { - /** - * 品类限制类型(0.通用不限品类、1.限制品类) - */ - categoryLimitation?: string; - /** - * 评价结束时间 - */ - endTime: string; - /** - * 评价主题 - */ - evaluateTheme: string; - /** - * 评价年度 - */ - evaluateYear: string; - indicatorList: IndicatorList[]; - /** - * 评价开始时间 - */ - startTime: string; - supplierIds: SupplierId[]; - taskDeptWeightList: DeptWeightItem[]; - /** - * 评价表模板id(cosco_evaluate_template表主键) - */ - templateId: string; - // 品类id - categoryId?: string; - [property: string]: any; -} -/** - * 供应商项 - */ -export interface SupplierItem { - id: string; // 供应商ID - supplierName: string; // 供应商名称 - socialCreditCode?: string; // 统一社会信用代码 - category?: string; // 品类 - department?: string; // 准入部门 - evaluatorCount: number; // 评价人员数量 - evaluators: User[]; // 评价人员列表 - // 其他可能的字段 - [key: string]: any; -} -export type SupplierId = { - /** - * 供应商id - */ - id: string; - /** - * 用户集合 - */ - userIds?: string[]; -} \ No newline at end of file diff --git a/src/typings.d.ts b/src/typings.d.ts index 05ec17d..f47257e 100644 --- a/src/typings.d.ts +++ b/src/typings.d.ts @@ -500,7 +500,7 @@ declare namespace SupplierEvaluate { /** * 是否通知下级单位完善评价人及评价分工 0否1是 */ - taskStatus: number; + taskStatus: number | null; [property: string]: any; }