年审模块
This commit is contained in:
@ -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 });
|
||||
|
@ -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%' }}>
|
||||
|
@ -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>
|
||||
|
@ -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;
|
@ -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>
|
||||
|
@ -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;
|
@ -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>
|
||||
),
|
||||
|
@ -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;
|
@ -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
|
||||
};
|
||||
|
@ -55,7 +55,7 @@ const SupplierEvaluatorModal: React.FC<SupplierEvaluatorModalProps> = ({
|
||||
if (!currentSupplier.evaluators || currentSupplier.evaluators.length === 0) {
|
||||
return (
|
||||
<div style={{ textAlign: 'center', padding: '20px 0' }}>
|
||||
当前供应商暂无评价人员,请点击"编辑人员"按钮添加
|
||||
当前供应商暂无年审人员,请点击"编辑人员"按钮添加
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -78,7 +78,7 @@ const SupplierEvaluatorModal: React.FC<SupplierEvaluatorModalProps> = ({
|
||||
|
||||
return (
|
||||
<Modal
|
||||
title={`${mode === ModalMode.SELECT ? '选择' : '查看'}评价人员 - ${
|
||||
title={`${mode === ModalMode.SELECT ? '选择' : '查看'}年审人员 - ${
|
||||
currentSupplier?.supplierName || ''
|
||||
}`}
|
||||
visible={visible}
|
||||
|
@ -69,9 +69,9 @@ const SupplierTable: React.FC<SupplierTableProps> = ({
|
||||
key: 'deptName',
|
||||
},
|
||||
{
|
||||
title: '评价人员数',
|
||||
title: '年审人员数',
|
||||
align: 'center' as const, // 列对齐方式
|
||||
dataIndex: 'evaluatorCount', // 评价人员数量字段
|
||||
dataIndex: 'evaluatorCount', // 年审人员数量字段
|
||||
key: 'evaluatorCount',
|
||||
},
|
||||
{
|
||||
|
@ -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>
|
||||
);
|
||||
|
@ -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 }))
|
||||
}
|
||||
});
|
||||
};
|
||||
|
@ -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>
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
@ -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;
|
||||
|
@ -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[];
|
||||
}
|
Reference in New Issue
Block a user