年审模块

This commit is contained in:
linxd
2025-06-30 09:43:28 +08:00
parent bf19b53402
commit d775dce037
18 changed files with 118 additions and 1175 deletions

View File

@ -1,12 +1,8 @@
import { message } from 'antd';
import { addTask, getTaskDetail } from '@/servers/api/supplierEvaluate';
import type {
TaskDetailData,
TaskAddRequest,
TaskDetailResponse
} from '@/servers/dao/supplierAnnualTaskManag';
import { addAnnualTask, getAnnualTaskDetail,updateAnnualTask } from '@/servers/api/supplierAnnual';
import type { SupplierItem } from '@/servers/dao/supplierEvaluateTask';
import type { TaskNotifyLowerUnits } from '@/dicts/supplierTaskDict';
import type { PersonnelItem, IndicatorItem, SupplierItem } from '@/servers/dao/supplierAnnualTaskManag';
// Define the types for dva effects and reducers
type Effect = (action: { payload: any }, effects: { call: any; put: any; select: any }) => Generator<any, void, unknown>;
@ -20,8 +16,8 @@ export interface SupplierTaskModelState {
currentStep: number; // 当前步骤索引从0开始
loading: boolean; // 提交加载状态
detailLoading: boolean; // 详情数据加载状态
taskFormData: Partial<TaskAddRequest>; // 任务表单数据
taskDetail: TaskDetailData | null; // 任务详情数据
taskFormData: Partial<supplierAnnualTaskManage.AddTaskRequest>; // 任务表单数据
taskDetail: supplierAnnualTaskManage.TaskDetailData | null; // 任务详情数据
mode: 'add' | 'edit' | 'division'; // 模式
}
@ -82,20 +78,20 @@ const supplierAnnualTaskManage: SupplierTaskModelType = {
try {
// 调用API获取任务详情
const response = (yield call(getTaskDetail, taskId)) as TaskDetailResponse;
const response = (yield call(getAnnualTaskDetail, taskId)) as supplierAnnualTaskManage.TaskDetailResponse;
if (response.success) {
const detail: TaskDetailData = response.data;
const detail: supplierAnnualTaskManage.TaskDetailData = response.data;
// 转换任务详情数据为表单数据结构
const taskFormData: Partial<TaskAddRequest> = {
const taskFormData: Partial<supplierAnnualTaskManage.AddTaskRequest> = {
id: detail.id || '',
evaluateTheme: detail.evaluateTheme || '',
annualreviewTheme: detail.annualreviewTheme || '',
startTime: detail.startTime || '',
endTime: detail.endTime || '',
templateId: detail.templateId || '',
categoryLimitation: detail.categoryLimitation || '0',
evaluateYear: detail.evaluateYear || '',
annualreviewYear: detail.annualreviewYear || '',
categoryId: detail.categoryId || undefined,
@ -107,25 +103,8 @@ const supplierAnnualTaskManage: SupplierTaskModelType = {
evaluators: item.userList,
})),
// 指标列表
indicatorList: detail.indicatorList || [],
// 供应商IDs与用户IDs
supplierIds: detail.supplierIds || [],
//设置评价分工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 || [],
};
}),
supplierPeopleVo: detail.supplierPeopleVo || [],
};
@ -145,53 +124,41 @@ const supplierAnnualTaskManage: SupplierTaskModelType = {
/**
* 提交任务数据
* @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 } },
{ payload }: { payload: {isEditMode: boolean; taskId: string; onSuccess?: () => void } },
{ call, put, select }: { call: any; put: any; select: any }
) {
const { taskStatus, isEditMode, taskId, onSuccess } = payload;
const { isEditMode, taskId, onSuccess } = payload;
yield put({ type: 'saveLoading', payload: true });
try {
// 获取表单数据
const { taskFormData } = (yield select((state: any) => state.supplierAnnualTaskManage)) as { taskFormData: TaskAddRequest };
const { taskFormData } = (yield select((state: any) => state.supplierAnnualTaskManage)) as { taskFormData: supplierAnnualTaskManage.AddTaskRequest };
// 构建提交数据
let submitData: TaskAddRequest = {
evaluateTheme: taskFormData.evaluateTheme || '',
let submitData: supplierAnnualTaskManage.AddTaskRequest = {
annualreviewTheme: taskFormData.annualreviewTheme || '',
startTime: taskFormData.startTime || '',
endTime: taskFormData.endTime || '',
templateId: taskFormData.templateId || '',
categoryLimitation: taskFormData.categoryLimitation || '0',
evaluateYear: taskFormData.evaluateYear || '',
annualreviewYear: taskFormData.annualreviewYear || '',
categoryId: taskFormData.categoryId || '',
taskStatus: taskStatus || null,
// 供应商IDs与评价人员IDs
supplierIds:
taskFormData.selectedSuppliers?.map((supplier: any) => {
supplierPeopleVo:
taskFormData.selectedSuppliers?.map((supplier: SupplierItem) => {
// 从供应商的evaluators中提取用户ID
const userIds = supplier.evaluators?.map((evaluator: any) => evaluator.id) || [];
const userIds = supplier.evaluators?.map((evaluator: supplierAnnualTaskManage.PersonnelItem) => evaluator.id) || [];
return {
id: supplier.id,
suppliedId: 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 || [],
})) || [],
};
@ -202,7 +169,7 @@ const supplierAnnualTaskManage: SupplierTaskModelType = {
id: taskId,
};
}
const response = (yield call(addTask, submitData)) as API.Response;
const response = (yield call(isEditMode? updateAnnualTask : addAnnualTask, submitData)) as supplierAnnualTaskManage.ApiResponse;
if (response.success) {
message.success(isEditMode ? '任务更新成功' : '任务创建成功');
if (onSuccess) {
@ -226,7 +193,7 @@ const supplierAnnualTaskManage: SupplierTaskModelType = {
*/
*updateFormData({ payload }: { payload: any }, { put, select }: { put: any; select: any }) {
// 获取当前表单数据
const { taskFormData } = (yield select((state: any) => state.supplierAnnualTaskManage)) as { taskFormData: TaskAddRequest };
const { taskFormData } = (yield select((state: any) => state.supplierAnnualTaskManage)) as { taskFormData: supplierAnnualTaskManage.AddTaskRequest };
// 合并新的表单数据
const updatedFormData = { ...taskFormData, ...payload };
// 处理供应商选择更新
@ -256,33 +223,28 @@ const supplierAnnualTaskManage: SupplierTaskModelType = {
const userIdSet = new Set(userIds.filter(Boolean).map(String));
const { taskFormData } = (yield select((state: any) => state.supplierAnnualTaskManage)) as {
taskFormData: TaskAddRequest;
taskFormData: supplierAnnualTaskManage.AddTaskRequest;
};
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))
(user: supplierAnnualTaskManage.TaskUserList) => !userIdSet.has(String(user.id || user.userId))
);
// 3. 删除 selectedSuppliers(供应商对象) 中 evaluator(评价人员对象) 对象
updatedFormData.selectedSuppliers = (updatedFormData.selectedSuppliers || [])
.map((supplier: SupplierItem) => {
const newEvaluators = (supplier.evaluators || []).filter(
(evaluator: PersonnelItem) => !userIdSet.has(String(evaluator.id))
(evaluator: supplierAnnualTaskManage.PersonnelItem) => !userIdSet.has(String(evaluator.id))
);
return {
...supplier,
evaluators: newEvaluators,
};
})
.filter((supplier) => (supplier.evaluators || []).length > 0);
.filter((supplier: SupplierItem) => (supplier.evaluators || []).length > 0);
// 保存更新
yield put({ type: 'saveTaskFormData', payload: updatedFormData });

View File

@ -1,7 +1,7 @@
import React, { useState, useEffect, useCallback, forwardRef, useImperativeHandle } from 'react';
import { Form, Input, Select, DatePicker, Row, Col, Card, Radio } from 'antd';
import moment from 'moment';
import { getAllTemplates } from '@/servers/api/supplierEvaluate';
import { getAllAnnualTemplates } from '@/servers/api/supplierAnnual';
import CategorySelector from '@/components/CategorySelector';
import styles from '../supplierAnnualTaskManageAdd.less';
import { CategoryLimitationType } from '@/dicts/supplierTemplateDict';
@ -43,7 +43,7 @@ const BasicInfoStepComponent = (props: BasicInfoStepProps) => {
const fetchTemplates = async () => {
setLoading(true);
try {
const response = await getAllTemplates();
const response = await getAllAnnualTemplates();
if (response.success && response.data) {
setTemplates(response.data);
}
@ -119,7 +119,7 @@ const BasicInfoStepComponent = (props: BasicInfoStepProps) => {
<Col span={12}>
<Form.Item
label="评价主题"
name="evaluateTheme"
name="annualreviewTheme"
rules={[{ required: true, message: '请输入评价主题' }]}
>
<Input placeholder="请输入" maxLength={50} />
@ -128,7 +128,7 @@ const BasicInfoStepComponent = (props: BasicInfoStepProps) => {
<Col span={12}>
<Form.Item
label="评价年度"
name="evaluateYear"
name="annualreviewYear"
rules={[{ required: true, message: '请选择评价年度' }]}
>
<Select placeholder="请选择年度" style={{ width: '100%' }}>

View File

@ -2,10 +2,10 @@ import React from 'react';
import { Card, Descriptions, Tag } from 'antd';
import { TaskStatusColor, TaskStatusText } from '@/dicts/supplierTaskDict';
import styles from '../../supplierAnnualTaskManageDetail.less';
import { CategoryLimitationType, CategoryLimitationTypeText } from '@/dicts/supplierTemplateDict';
import { CategoryLimitationTypeText } from '@/dicts/supplierTemplateDict';
interface BasicInfoProps {
taskData: SupplierEvaluate.TaskDetailData;
taskData: supplierAnnualTaskManage.TaskDetailData;
}
const BasicInfo: React.FC<BasicInfoProps> = ({ taskData }) => {
@ -19,11 +19,11 @@ const BasicInfo: React.FC<BasicInfoProps> = ({ taskData }) => {
return (
<Card className={styles.detailCard}>
<Descriptions title="基本信息" bordered column={2}>
<Descriptions.Item label="评价主题">{taskData.evaluateTheme || '--'}</Descriptions.Item>
<Descriptions.Item label="评价主题">{taskData.annualreviewTheme || '--'}</Descriptions.Item>
<Descriptions.Item label="评价状态">
{getStatusTag(taskData.status || '')}
</Descriptions.Item>
<Descriptions.Item label="评价年份">{taskData.evaluateYear || '--'}</Descriptions.Item>
<Descriptions.Item label="评价年份">{taskData.annualreviewYear || '--'}</Descriptions.Item>
<Descriptions.Item label="开始时间">{taskData.startTime || '--'}</Descriptions.Item>
<Descriptions.Item label="结束时间">{taskData.endTime || '--'}</Descriptions.Item>
<Descriptions.Item label="评价模板">{taskData.templateName || '--'}</Descriptions.Item>

View File

@ -1,88 +0,0 @@
import React from 'react';
import { Card, Table, Button, message } from 'antd';
import { UnorderedListOutlined } from '@ant-design/icons';
import styles from '../../supplierAnnualTaskManageDetail.less';
import type { TaskDetailData, IndicatorList, User } from '@/servers/types/supplierEvaluateTask';
interface EvaluatorInfoProps {
taskData: TaskDetailData;
onViewIndicators: (record: IndicatorList) => void;
}
const EvaluatorInfo: React.FC<EvaluatorInfoProps> = ({ taskData, onViewIndicators }) => {
const userList = taskData.userList;
// 查看评价人员分工
const handleViewIndicators = (record: IndicatorList) => {
if (record.indicatorIds && record.indicatorIds.length > 0) {
onViewIndicators(record);
} else {
message.info('该评价人员没有分配指标');
}
};
const columns = [
{
title: '序号',
dataIndex: 'index',
key: 'index',
render: (_: any, __: any, index: number) => index + 1,
width: 80,
},
{
title: '评价人员',
dataIndex: 'userId',
key: 'userId',
render: (userId: string) => {
try {
const user = userList.find((userItem: User) => userItem.userId === userId);
return user?.userName;
} catch (error) {
console.error('获取评价人员信息失败:', error);
return userId;
}
},
},
{
title: '评价类型',
dataIndex: 'type',
key: 'type',
render: (type: string) => (type === '1' ? '按指标评价' : '按评价单评价'),
},
{
title: '指标数量',
dataIndex: 'indicatorIds',
key: 'indicatorCount',
render: (indicatorIds: string[]) => indicatorIds?.length || 0,
},
{
title: '操作',
key: 'action',
render: (record: any) => (
<Button
type="link"
onClick={() => handleViewIndicators(record)}
>
</Button>
),
},
];
if (!taskData || !taskData.indicatorList || taskData.indicatorList.length === 0) {
return <div className={styles.emptyData}></div>;
}
return (
<Card className={styles.detailCard}>
<Table
columns={columns}
dataSource={taskData.indicatorList}
rowKey="userId"
pagination={false}
className={styles.tableContainer}
/>
</Card>
);
};
export default EvaluatorInfo;

View File

@ -1,11 +1,10 @@
import React from 'react';
import { Modal, Button, Tag } from 'antd';
import styles from '../../supplierAnnualTaskManageDetail.less';
import type {TaskDetailData} from '@/servers/supplierEvaluateTask'
interface EvaluatorModalProps {
visible: boolean;
supplier: TaskDetailData;
supplier: supplierAnnualTaskManage.TaskDetailData;
onCancel: () => void;
}
@ -27,7 +26,7 @@ const EvaluatorModal: React.FC<EvaluatorModalProps> = ({ visible, supplier, onCa
<div className={styles.evaluatorList}>
{supplier.userList.map((user) => (
<Tag key={user.userId} className={styles.evaluatorTag}>
{user.userDept} - {user.userName}
{user.userDept} - {user.name}
</Tag>
))}
</div>

View File

@ -1,99 +0,0 @@
import React, { useState, useEffect } from 'react';
import { Modal, Button, Spin } from 'antd';
import styles from '../../supplierAnnualTaskManageDetail.less';
import EvaluateTemplateTable from '@/components/EvaluateTemplateTable/EvaluateTemplateTable';
import { getTemplateDetail } from '@/servers/api/supplierEvaluate';
interface IndicatorModalProps {
visible: boolean;
evaluatorId: string;
indicators: string[];
templateId?: string;
onCancel: () => void;
}
const IndicatorModal: React.FC<IndicatorModalProps> = ({
visible,
evaluatorId,
indicators,
templateId,
onCancel
}) => {
const [loading, setLoading] = useState<boolean>(false);
const [filteredIndicators, setFilteredIndicators] = useState<any[]>([]);
// 获取模板详情数据
useEffect(() => {
const fetchTemplateData = async () => {
if (visible && templateId) {
setLoading(true);
try {
const res = await getTemplateDetail(templateId);
if (res.success && res.data) {
// 筛选出当前评价人员负责的指标
if (res.data.indicatorStList && indicators.length > 0) {
// 扁平化处理模板数据,提取出所有二级指标
const allIndicators = [];
for (const stItem of res.data.indicatorStList) {
if (stItem.indicatorNdList) {
for (const ndItem of stItem.indicatorNdList) {
if (indicators.includes(ndItem.id as string)) {
allIndicators.push({
...ndItem,
baseIndicator: stItem.baseIndicator,
descIndicator: stItem.descIndicator,
stScore: stItem.score,
indicatorType: stItem.indicatorType,
id: ndItem.id,
score: ndItem.score,
});
}
}
}
}
setFilteredIndicators(allIndicators);
}
}
} catch (error) {
console.error('获取模板详情失败:', error);
} finally {
setLoading(false);
}
}
};
fetchTemplateData();
}, [visible, templateId, indicators]);
return (
<Modal
title={`评价人员 ${evaluatorId} 的指标分工`}
visible={visible}
onCancel={onCancel}
footer={[
<Button key="close" onClick={onCancel}>
</Button>
]}
width={1200} // 增加宽度以适应表格
>
{loading ? (
<div className={styles.loadingContainer}>
<Spin tip="加载中..." />
</div>
) : indicators.length > 0 && filteredIndicators.length > 0 ? (
<div className={styles.indicatorModalContent}>
<EvaluateTemplateTable
value={filteredIndicators}
isDetail={true}
/>
</div>
) : (
<div className={styles.emptyData}></div>
)}
</Modal>
);
};
export default IndicatorModal;

View File

@ -1,39 +1,22 @@
import React from 'react';
import { Card, Table, Button, message } from 'antd';
import { TeamOutlined } from '@ant-design/icons';
import styles from '../../supplierAnnualTaskManageDetail.less';
import type { TaskDetailData,User } from '@/servers/types/supplierEvaluateTask';
interface SupplierInfoProps {
taskData: TaskDetailData;
taskData: supplierAnnualTaskManage.TaskDetailData;
onViewEvaluators: (supplier: any) => void;
}
const SupplierInfo: React.FC<SupplierInfoProps> = ({ taskData, onViewEvaluators }) => {
// 查看供应商评价人员
const handleViewSupplierEvaluators = (record: TaskDetailData) => {
if (!taskData || !taskData.supplierIds) {
message.error('无法获取供应商评价人员信息');
return;
}
// 根据供应商ID查找对应的userIds
const supplierData = taskData.supplierIds.find((item) => item.id === record.supplierId);
let userList: User[] = [];
try {
userList = taskData.userList.filter((item) => supplierData?.userIds.includes(item.userId));
} catch (error) {
console.error('获取供应商评价人员信息失败:', error);
}
if (supplierData) {
const handleViewSupplierEvaluators = (record: supplierAnnualTaskManage.TaskDetailData) => {
if (record.userList && record.userList.length > 0) {
onViewEvaluators({
...record,
userIds: supplierData.userIds,
userList: userList,
userList: record.userList,
});
} else {
message.error('未找到该供应商的评价人员信息');
message.error('未找到该供应商的年审人员信息');
}
};
@ -65,10 +48,7 @@ const SupplierInfo: React.FC<SupplierInfoProps> = ({ taskData, onViewEvaluators
title: '操作',
key: 'action',
render: (record: any) => (
<Button
type="link"
onClick={() => handleViewSupplierEvaluators(record)}
>
<Button type="link" onClick={() => handleViewSupplierEvaluators(record)}>
</Button>
),

View File

@ -1,48 +0,0 @@
import React from 'react';
import { Card, Table } from 'antd';
import styles from '../../supplierAnnualTaskManageDetail.less';
interface WeightInfoProps {
taskData: SupplierEvaluate.TaskDetailData;
}
const WeightInfo: React.FC<WeightInfoProps> = ({ taskData }) => {
const columns = [
{
title: '序号',
dataIndex: 'index',
key: 'index',
render: (_: any, __: any, index: number) => index + 1,
width: 80,
},
{
title: '部门名称',
dataIndex: 'weightDept',
key: 'weightDept',
},
{
title: '权重值',
dataIndex: 'weightValue',
key: 'weightValue',
render: (value: number) => `${value}%`,
},
];
if (!taskData || !taskData.taskDeptWeightList || taskData.taskDeptWeightList.length === 0) {
return <div className={styles.emptyData}></div>;
}
return (
<Card className={styles.detailCard}>
<Table
columns={columns}
dataSource={taskData.taskDeptWeightList}
rowKey="id"
pagination={false}
className={styles.tableContainer}
/>
</Card>
);
};
export default WeightInfo;

View File

@ -1,15 +1,9 @@
import BasicInfo from './BasicInfo';
import SupplierInfo from './SupplierInfo';
import EvaluatorInfo from './EvaluatorInfo';
import WeightInfo from './WeightInfo';
import EvaluatorModal from './EvaluatorModal';
import IndicatorModal from './IndicatorModal';
export {
BasicInfo,
SupplierInfo,
EvaluatorInfo,
WeightInfo,
EvaluatorModal,
IndicatorModal
};

View File

@ -55,7 +55,7 @@ const SupplierEvaluatorModal: React.FC<SupplierEvaluatorModalProps> = ({
if (!currentSupplier.evaluators || currentSupplier.evaluators.length === 0) {
return (
<div style={{ textAlign: 'center', padding: '20px 0' }}>
&quot;&quot;
&quot;&quot;
</div>
);
}
@ -78,7 +78,7 @@ const SupplierEvaluatorModal: React.FC<SupplierEvaluatorModalProps> = ({
return (
<Modal
title={`${mode === ModalMode.SELECT ? '选择' : '查看'}评价人员 - ${
title={`${mode === ModalMode.SELECT ? '选择' : '查看'}年审人员 - ${
currentSupplier?.supplierName || ''
}`}
visible={visible}

View File

@ -69,9 +69,9 @@ const SupplierTable: React.FC<SupplierTableProps> = ({
key: 'deptName',
},
{
title: '评价人员数',
title: '年审人员数',
align: 'center' as const, // 列对齐方式
dataIndex: 'evaluatorCount', // 评价人员数量字段
dataIndex: 'evaluatorCount', // 年审人员数量字段
key: 'evaluatorCount',
},
{

View File

@ -108,7 +108,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
if (taskFormData.selectedSuppliers && taskFormData.selectedSuppliers.length > 0) {
// 转换上一步的供应商数据,添加评价人员数量字段
const suppliersWithEvaluators = taskFormData.selectedSuppliers.map(
(supplier) => {
(supplier: SupplierItem) => {
// 确保evaluators字段存在且为数组
const evaluators = supplier.evaluators || [];
return {
@ -129,52 +129,6 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
}, [taskFormData]); // 依赖于 taskFormData当 model 数据变化时重新计算
/**
* 当选择的人员变化时,更新权重单位列表
* 根据所有评价人员的部门信息,动态生成权重单位列表
*/
useEffect(() => {
// 从所有供应商的评价人员中提取部门信息
const allDepartments: PersonnelItem[] = [];
suppliers.forEach((supplier) => {
if (supplier.evaluators && supplier.evaluators.length > 0) {
supplier.evaluators.forEach((evaluator) => {
if (evaluator.userDept) {
allDepartments.push(evaluator);
}
});
}
});
// 去重部门列表 - 根据部门ID去重
const departmentMap = new Map<string, PersonnelItem>();
allDepartments.forEach((dept) => {
if (dept.userDeptId && !departmentMap.has(dept.userDeptId)) {
departmentMap.set(dept.userDeptId, dept);
}
});
const uniqueDepartments = Array.from(departmentMap.values());
// 如果有部门数据,生成权重单位列表
if (uniqueDepartments.length > 0) {
const newTaskDeptWeightList: DeptWeightItem[] = uniqueDepartments.map((dept) => ({
weightDept: dept.userDeptId || '',
weightValue: '0', // 默认权重为0
weightDeptName: dept.userDept || '',
}));
// 更新权重单位列表,保留原有权重值
setTaskDeptWeightList((prevList) => {
const prevValuesMap = new Map(prevList.map((item) => [item.weightDept, item.weightValue]));
return newTaskDeptWeightList.map((item) => ({
...item,
weightValue: prevValuesMap.get(item.weightDept) || '0', // 如果有原来的权重值则保留
}));
});
}
}, [suppliers]); // 依赖于suppliers当选择的供应商或其评价人员变化时重新计算
/**
* 更新表单数据
@ -186,7 +140,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
const { suppliersWithEvaluators }: { suppliersWithEvaluators: SupplierItem[] } = updatedData;
// 构建供应商ID列表
const supplierIds = suppliersWithEvaluators.map((supplier) => ({
id: supplier.id,
suppliedId: supplier.id,
userIds: supplier.evaluators?.map((e: PersonnelItem) => e.id) || [],
}));
@ -223,48 +177,6 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
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<string, number>),
});
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);
});
};
/**
* 处理选择评价人员按钮点击事件
* 打开评价人员选择模态框
@ -376,7 +288,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
// 渲染组件
return (
<div className={styles.evaluatorSelectStep}>
<Card title="选择评价人员" bordered={false} className="inner-card">
<Card title="选择年审人员" bordered={false} className="inner-card">
{/* 工具栏区域 */}
{mode !== 'division' && (
<div className={styles.toolbar}>
@ -386,10 +298,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
onClick={handleBatchSelect}
disabled={selectedRowKeys.length === 0}
>
</Button>
<Button onClick={handleWeightSetting} disabled={taskDeptWeightList.length === 0}>
</Button>
</Space>
</div>
@ -412,7 +321,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
/>
)}
{/* 批量选择评价人员弹窗 */}
{/* 批量选择年审人员弹窗 */}
<BatchEvaluatorModal
visible={batchSelectModalVisible}
onCancel={() => setBatchSelectModalVisible(false)}
@ -421,7 +330,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
onSelect={handleBatchEvaluatorSelect}
/>
{/* 单个供应商评价人员弹窗 */}
{/* 单个供应商年审人员弹窗 */}
<SupplierEvaluatorModal
visible={evaluatorModalVisible}
onCancel={() => setEvaluatorModalVisible(false)}
@ -432,14 +341,6 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
mode={modalMode}
/>
{/* 权重设置弹窗 */}
<WeightSettingModal
visible={weightSettingModalVisible}
onCancel={() => setWeightSettingModalVisible(false)}
onOk={handleSaveWeights}
taskDeptWeightList={taskDeptWeightList}
form={form}
/>
</Card>
</div>
);

View File

@ -2,7 +2,7 @@ import React, { forwardRef, useImperativeHandle, useEffect, useState } from 'rea
import { Card } from 'antd';
import styles from '../supplierAnnualTaskManageAdd.less';
import SupplierSelector from '@/components/SupplierSelector';
import type { SupplierItem } from '@/servers/dao/supplierAnnualTaskManag';
import type { SupplierItem } from '@/servers/dao/supplierEvaluateTask';
import type { Dispatch } from 'umi';
import { connect } from 'umi';
import type { SupplierTaskModelState } from '@/models/supplierAnnualTaskManage';
@ -56,7 +56,7 @@ const SupplierSelectStepComponent = (props: SupplierSelectStepProps) => {
type: 'supplierAnnualTaskManage/updateFormData',
payload: {
selectedSuppliers: suppliersWithEvaluators,
supplierIds: suppliersWithEvaluators.map(supplier => ({ id: supplier.id }))
supplierIds: suppliersWithEvaluators.map(supplier => ({ suppliedId: supplier.id }))
}
});
};

View File

@ -13,16 +13,22 @@ import {
Select,
Tag,
Tooltip,
Modal
Modal,
} from 'antd';
import { history } from 'umi';
import { SearchOutlined, DeleteOutlined, PlusOutlined, EditOutlined, EyeOutlined } from '@ant-design/icons';
import {
SearchOutlined,
DeleteOutlined,
PlusOutlined,
EditOutlined,
EyeOutlined,
} from '@ant-design/icons';
import { getAnnualTaskList } from '@/servers/api/supplierAnnual';
import {
AnnualTaskStatus,
AnnualTaskStatusText,
AnnualTaskStatusColor,
AnnualTaskStatusOptions
AnnualTaskStatusOptions,
} from '@/dicts/supplierAnnualTaskManageDict';
import moment from 'moment';
import styles from './supplierAnnualTaskManage.less';
@ -126,17 +132,13 @@ const SupplierAnnualTaskManage: React.FC = () => {
return;
}
history.push({
pathname: 'supplierAnnualTaskManageAdd',
state: { id: record.id, mode: 'edit' }
});
history.push(`/supplierAnnual/supplierAnnualTaskManageAdd?id=${record.id}&mode=edit`);
};
// 查看详情
const handleView = (record: supplierAnnualTaskManage.TaskRecord) => {
history.push({
pathname: 'supplierAnnualTaskManageDetail',
state: { id: record.id }
pathname: '/supplierAnnual/supplierAnnualTaskManageDetail?id=' + record.id,
});
};
@ -152,7 +154,8 @@ const SupplierAnnualTaskManage: React.FC = () => {
dataIndex: 'index',
key: 'index',
width: 80,
render: (_: any, __: any, index: number) => index + 1 + (pagination.current - 1) * pagination.pageSize,
render: (_: any, __: any, index: number) =>
index + 1 + (pagination.current - 1) * pagination.pageSize,
},
{
title: '评价主题',
@ -190,20 +193,22 @@ const SupplierAnnualTaskManage: React.FC = () => {
dataIndex: 'status',
key: 'status',
width: 100,
render: (status: string, record: supplierAnnualTaskManage.TaskRecord) => getStatusTag(status, record.statusName),
render: (status: string, record: supplierAnnualTaskManage.TaskRecord) =>
getStatusTag(status, record.statusName),
},
{
title: '操作',
key: 'action',
width: 180,
fixed: 'right' as const,
align: 'center' as const,
render: (_: any, record: supplierAnnualTaskManage.TaskRecord) => (
<Space size="middle">
<Button type="link" size="small" icon={<EyeOutlined />} onClick={() => handleView(record)}>
<Button type="link" size="small" onClick={() => handleView(record)}>
</Button>
{record.status === AnnualTaskStatus.PENDING && (
<Button type="link" size="small" icon={<EditOutlined />} onClick={() => handleEdit(record)}>
<Button type="link" size="small" onClick={() => handleEdit(record)}>
</Button>
)}
@ -234,7 +239,7 @@ const SupplierAnnualTaskManage: React.FC = () => {
</Form.Item>
<Form.Item name="status" label="评价状态">
<Select placeholder="请选择状态" allowClear style={{ width: 150 }}>
{AnnualTaskStatusOptions.map(item => (
{AnnualTaskStatusOptions.map((item) => (
<Option key={item.value} value={item.value}>
{item.label}
</Option>
@ -245,12 +250,7 @@ const SupplierAnnualTaskManage: React.FC = () => {
<Button type="primary" htmlType="submit" icon={<SearchOutlined />}>
</Button>
<Button
type="primary"
danger
icon={<DeleteOutlined />}
onClick={handleReset}
>
<Button type="primary" danger icon={<DeleteOutlined />} onClick={handleReset}>
</Button>
</Form.Item>

View File

@ -45,7 +45,6 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
// 判断是否为编辑模式
const urlParams = getUrlParams();
const isEditMode = urlParams.mode === 'edit' && urlParams.id;
const isDivisionMode = urlParams.mode === 'division' && urlParams.id;
const taskId = urlParams.id || '';
// 创建表单引用,用于访问子组件的表单方法(主要用于验证)
@ -54,15 +53,12 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
const evaluatorFormRef = useRef<any>(null); // 评价人员表单引用
const divisionFormRef = useRef<any>(null); // 评价分工表单引用
// 确认对话框可见性状态
const [confirmModalVisible, setConfirmModalVisible] = React.useState(false);
/**
* 编辑模式下获取任务详情,或新建模式下重置状态
* 利用useEffect在组件挂载或依赖项变化时触发
*/
useEffect(() => {
if ((isEditMode || isDivisionMode) && taskId && dispatch) {
if (isEditMode && taskId && dispatch) {
dispatch({
type: 'supplierAnnualTaskManage/saveMode',
payload: 'edit',
@ -72,16 +68,6 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
type: 'supplierAnnualTaskManage/fetchTaskDetail',
payload: { taskId },
});
if (isDivisionMode) {
dispatch({
type: 'supplierAnnualTaskManage/saveMode',
payload: 'division',
});
dispatch({
type: 'supplierAnnualTaskManage/setCurrentStep',
payload: 2,
});
}
} else if (dispatch) {
dispatch({
type: 'supplierAnnualTaskManage/setMode',
@ -92,7 +78,7 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
type: 'supplierAnnualTaskManage/resetState',
});
}
}, [isEditMode, isDivisionMode, taskId, dispatch]);
}, [isEditMode, taskId, dispatch]);
/**
* 组件卸载时重置状态
@ -112,29 +98,17 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
{
title: '基本信息', // 步骤标题
description: '请填写基本信息', // 步骤描述
content: (
<BasicInfoStep
ref={basicFormRef}
/>
), // 步骤内容组件
content: <BasicInfoStep ref={basicFormRef} />, // 步骤内容组件
},
{
title: '选择供应商',
description: '请选择参加评价的供应商',
content: (
<SupplierSelectStep
ref={supplierFormRef}
/>
),
content: <SupplierSelectStep ref={supplierFormRef} />,
},
{
title: '选择评价人员',
description: '请选择供应商评价人员',
content: (
<EvaluatorSelectStep
ref={evaluatorFormRef}
/>
),
title: '选择年审人员',
description: '请选择供应商年审人员',
content: <EvaluatorSelectStep ref={evaluatorFormRef} />,
},
];
@ -203,7 +177,7 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
taskId,
onSuccess: () => {
history.goBack();
}
},
},
});
}
@ -223,7 +197,6 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
}
}
// 如果是编辑模式,则直接提交 提示是否确认后直接提交
if (isEditMode) {
Modal.confirm({
title: '提示',
content: '是否确认提交',
@ -231,36 +204,6 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
submitTaskData(null);
},
});
return;
}
// 新增模式下,显示确认对话框询问是否需要下级单位完善
setConfirmModalVisible(true);
};
/**
* 处理确认对话框的取消按钮点击事件
*/
const handleConfirmCancel = () => {
setConfirmModalVisible(false);
};
/**
* 处理确认对话框的"是"选项点击事件
* 提交任务,并设置状态为需要下级单位完善
*/
const handleConfirmYes = () => {
submitTaskData(TaskNotifyLowerUnits.YES); // 未开始状态,需要下级单位完善
setConfirmModalVisible(false);
};
/**
* 处理确认对话框的"否"选项点击事件
* 提交任务,并设置状态为不需要下级单位完善
*/
const handleConfirmNo = () => {
submitTaskData(TaskNotifyLowerUnits.NO); // 进行中状态,不需要下级单位完善
setConfirmModalVisible(false);
};
return (
@ -269,7 +212,7 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
<Card bordered={false} loading={detailLoading}>
{/* 页面头部,包含标题和返回按钮 */}
<div className="page-header">
<h2>{isEditMode ? '修改评价任务' : '新增评价任务'}</h2>
<h2>{isEditMode ? '修改年审任务' : '新增年审任务'}</h2>
<Button type="link" icon={<ArrowLeftOutlined />} onClick={handleBack}>
</Button>
@ -293,7 +236,9 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
<div className={styles.stepsAction}>
<Space>
{/* 如果当前是评价分工步骤,则不显示上一步按钮 */}
{currentStep > (isDivisionMode ? 2 : 0) && <Button onClick={handlePrev}></Button>}
{currentStep > 0 && (
<Button onClick={handlePrev}></Button>
)}
{currentStep < steps.length - 1 && (
<Button type="primary" onClick={handleNext}>
@ -314,30 +259,13 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
</Col>
</Row>
</Card>
{/* 确认对话框 - 询问是否需要下级单位完善 */}
<Modal
title="提交确认"
visible={confirmModalVisible}
onCancel={handleConfirmCancel}
footer={null}
>
<p></p>
<div style={{ textAlign: 'right', marginTop: 24 }}>
<Space>
<Button type="primary" onClick={handleConfirmYes}>
</Button>
<Button onClick={handleConfirmNo}></Button>
<Button onClick={handleConfirmCancel}></Button>
</Space>
</div>
</Modal>
</div>
);
};
// 将dva model中的状态映射到组件props
export default connect(({ supplierAnnualTaskManage }: { supplierAnnualTaskManage: SupplierTaskModelState }) => ({
export default connect(
({ supplierAnnualTaskManage }: { supplierAnnualTaskManage: SupplierTaskModelState }) => ({
supplierAnnualTaskManage,
}))(SupplierTaskManageAdd);
}),
)(SupplierTaskManageAdd);

View File

@ -2,14 +2,11 @@ import React, { useState, useEffect } from 'react';
import { Card, Button, message, Spin, Tabs, Typography } from 'antd';
import { history, useLocation } from 'umi';
import { ArrowLeftOutlined } from '@ant-design/icons';
import { getTaskDetail } from '@/servers/api/supplierEvaluate';
import { getAnnualTaskDetail } from '@/servers/api/supplierAnnual';
import {
BasicInfo,
SupplierInfo,
EvaluatorInfo,
WeightInfo,
EvaluatorModal,
IndicatorModal
} from './components/Detail';
import styles from './supplierAnnualTaskManageDetail.less';
@ -37,10 +34,7 @@ const SupplierTaskManageDetail: React.FC = () => {
// 模态框状态
const [evaluatorModalVisible, setEvaluatorModalVisible] = useState<boolean>(false);
const [indicatorModalVisible, setIndicatorModalVisible] = useState<boolean>(false);
const [currentSupplier, setCurrentSupplier] = useState<any>(null);
const [currentIndicators, setCurrentIndicators] = useState<string[]>([]);
const [currentEvaluator, setCurrentEvaluator] = useState<string>('');
// 获取任务详情
const fetchTaskDetail = async (id: string) => {
@ -51,7 +45,7 @@ const SupplierTaskManageDetail: React.FC = () => {
setLoading(true);
try {
const response = await getTaskDetail(id);
const response = await getAnnualTaskDetail(id);
if (response.success) {
setTaskData(response.data);
} else {
@ -71,7 +65,6 @@ const SupplierTaskManageDetail: React.FC = () => {
fetchTaskDetail(taskId);
} else {
message.error('未提供任务ID');
history.push('/supplier/supplierTaskManage');
}
}, [taskId]);
@ -86,12 +79,6 @@ const SupplierTaskManageDetail: React.FC = () => {
setEvaluatorModalVisible(true);
};
// 处理查看评价人员分工
const handleViewIndicators = (record: any) => {
setCurrentIndicators(record.indicatorIds || []);
setCurrentEvaluator(record.userId);
setIndicatorModalVisible(true);
};
return (
<div className="common-container">
@ -118,15 +105,6 @@ const SupplierTaskManageDetail: React.FC = () => {
onViewEvaluators={handleViewSupplierEvaluators}
/>}
</TabPane>
<TabPane tab="评价指标分工" key="3">
{taskData && <EvaluatorInfo
taskData={taskData}
onViewIndicators={handleViewIndicators}
/>}
</TabPane>
<TabPane tab="评分单位权重" key="4">
{taskData && <WeightInfo taskData={taskData} />}
</TabPane>
</Tabs>
)}
</Card>
@ -137,15 +115,6 @@ const SupplierTaskManageDetail: React.FC = () => {
supplier={currentSupplier}
onCancel={() => setEvaluatorModalVisible(false)}
/>
{/* 评价人员分工模态框 */}
<IndicatorModal
visible={indicatorModalVisible}
evaluatorId={currentEvaluator}
indicators={currentIndicators}
templateId={taskData?.templateId || ''}
onCancel={() => setIndicatorModalVisible(false)}
/>
</div>
);
};

View File

@ -13,7 +13,19 @@ declare namespace supplierAnnualTaskManage {
basePageRequest: BasePageRequest;
[property: string]: any;
}
/*
人员信息
*/
interface PersonnelItem {
id: string;
name: string;
userId: string;
userName: string;
position: string;
userDept: string;
userDeptId: string;
indicatorIds?: string[];
}
// 列表响应
interface TaskListResponse {
code: number;

View File

@ -1,567 +0,0 @@
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 TaskRecord {
id: string;
taskName: string;
taskCode: string;
taskType: string;
templateName: string;
status: string;
startTime: string;
endTime: string;
createBy: string;
createTime: string;
updateBy?: string;
updateTime?: string;
key?: string;
}
export interface TaskRequest {
current?: number;
pageSize?: number;
evaluateTheme?: string;
evaluateYear?: string;
startTime?: string;
endTime?: string;
categoryId?: string;
status?: string;
}
// 供应商评价任务查询参数
export interface TaskSearchParams {
basePageRequest: API.BasePageRequest;
evaluateTheme?: string;
status?: string;
dateRange?: string[];
startTime?: string;
endTime?: 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 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 IndicatorItem {
indicatorIds: string[];
type: number;
userId: string;
}
/*
人员信息
*/
export interface PersonnelItem {
id: string;
name: string;
userId: string;
userName: string;
position: string;
userDept: string;
userDeptId: string;
indicatorIds?: 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: IndicatorItem[] | null;
lastUpdateTime: string | null;
startTime: string | null;
status: string;
supplierIds: {
id: string;
userIds: string[];
}[] | null;
userList: PersonnelItem[];
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: PersonnelItem[];
}[],
[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 = {
id?: string;
/**
* 品类限制类型0.通用不限品类、1.限制品类)
*/
categoryLimitation?: string;
/**
* 评价结束时间
*/
endTime: string;
/**
* 评价主题
*/
evaluateTheme: string;
/**
* 评价年度
*/
evaluateYear: string;
indicatorList: IndicatorItem[];
/**
* 评价开始时间
*/
startTime: string;
supplierIds: SupplierId[];
/**
* 评价表模板id(cosco_evaluate_template表主键)
*/
templateId: string;
// 品类id
categoryId?: string;
/**
* 是否下级部门可以添加评价信息 0否1是
*/
taskStatus?: TaskNotifyLowerUnits | null;
/*
供应商列表
*/
selectedSuppliers?: SupplierItem[];
userList?: PersonnelItem[];
}
/**
* 供应商项
*/
export interface SupplierItem {
id: string; // 供应商ID
supplierName: string; // 供应商名称
supplierId?: string; // 供应商ID
socialCreditCode?: string; // 统一社会信用代码
category?: string; // 品类
department?: string; // 准入部门
evaluatorCount?: number; // 评价人员数量
evaluators: PersonnelItem[]; // 评价人员列表
deptName?: string; // 部门名称
// 其他可能的字段
[key: string]: any;
}
export type SupplierId = {
/**
* 供应商id
*/
id: string;
/**
* 用户集合
*/
userIds?: string[];
}