对接供应商评价任务新增
This commit is contained in:
@ -1,9 +1,10 @@
|
||||
import React, { useState, useEffect, forwardRef, useImperativeHandle } from 'react';
|
||||
import { Card, Table, Tag, Switch, Space, Button, message, Modal, Radio, Checkbox, Row, Col } from 'antd';
|
||||
import React, { useState, useEffect, forwardRef, useImperativeHandle, useMemo, useCallback } from 'react';
|
||||
import { Card, Table, Tag, Switch, Space, Button, message, Modal, Radio, Checkbox, Row, Col, Spin } from 'antd';
|
||||
import type { PersonnelItem } from '@/servers/types/evaluator';
|
||||
import type { ColumnsType } from 'antd/es/table';
|
||||
import type { CheckboxValueType } from 'antd/es/checkbox/Group';
|
||||
import styles from '../supplierTaskManageAdd.less';
|
||||
import EvaluateTemplateTable from '@/components/EvaluateTemplateTable';
|
||||
import { getTemplateDetail } from '@/servers/api/supplierEvaluate';
|
||||
|
||||
// 评价指标类型定义
|
||||
interface IndicatorItem {
|
||||
@ -19,12 +20,14 @@ interface DivisionStepProps {
|
||||
}
|
||||
|
||||
// 评价方式枚举
|
||||
// 注意:type值是根据用户是否关联了指标自动计算的,不是由用户直接选择的
|
||||
// 默认为0(按评价单),当用户关联了指标则为1(按指标)
|
||||
enum EvaluateType {
|
||||
ALL = 'ALL', // 按评价单评价(全部指标)
|
||||
INDICATOR = 'INDICATOR', // 按指标评价(部分指标)
|
||||
ALL = 0, // 按评价单评价(全部指标)
|
||||
INDICATOR = 1, // 按指标评价(部分指标)
|
||||
}
|
||||
|
||||
// 模拟的评价指标数据
|
||||
// 模拟的评价指标数据 - 仅作为备用
|
||||
const mockIndicators: IndicatorItem[] = [
|
||||
{ id: 'I001', name: '产品质量', description: '评估供应商产品质量' },
|
||||
{ id: 'I002', name: '交货及时性', description: '评估供应商交货的及时性' },
|
||||
@ -48,18 +51,71 @@ const DivisionStep = forwardRef<any, DivisionStepProps>(({ formData, onFormDataC
|
||||
// 选中的行keys
|
||||
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
|
||||
|
||||
// 指标列表
|
||||
const [indicators] = useState<IndicatorItem[]>(mockIndicators);
|
||||
// 指标列表 - 不再直接使用mockIndicators,而是从templateData派生
|
||||
const [indicators, setIndicators] = useState<IndicatorItem[]>([]);
|
||||
|
||||
// 指标分工弹窗可见性
|
||||
const [divisionModalVisible, setDivisionModalVisible] = useState(false);
|
||||
// 评价指标模板查看弹窗可见性
|
||||
const [templateViewModalVisible, setTemplateViewModalVisible] = useState(false);
|
||||
|
||||
// 评价方式类型
|
||||
const [batchEvaluateType, setBatchEvaluateType] = useState<EvaluateType>(EvaluateType.ALL);
|
||||
// 批量指标设置弹窗可见性
|
||||
const [batchTemplateModalVisible, setBatchTemplateModalVisible] = useState(false);
|
||||
|
||||
// 批量选择的指标
|
||||
const [batchSelectedIndicators, setBatchSelectedIndicators] = useState<string[]>([]);
|
||||
|
||||
// 批量选择的模板项
|
||||
const [batchSelectedTemplateItems, setBatchSelectedTemplateItems] = useState<any[]>([]);
|
||||
|
||||
// 当前查看的用户ID
|
||||
const [currentUserId, setCurrentUserId] = useState<string>('');
|
||||
|
||||
// 模板数据
|
||||
const [templateData, setTemplateData] = useState<any[]>([]);
|
||||
|
||||
// 加载状态
|
||||
const [loading, setLoading] = useState<boolean>(false);
|
||||
|
||||
// 选中的指标项
|
||||
const [selectedTemplateItems, setSelectedTemplateItems] = useState<any[]>([]);
|
||||
|
||||
// 获取模板详情 先写死 "1937123786334322688" 省的一步一步操作
|
||||
const fetchTemplateDetail = async (templateId: string = "1937123786334322688") => {
|
||||
if (!templateId) return;
|
||||
|
||||
try {
|
||||
setLoading(true);
|
||||
const res = await getTemplateDetail(templateId);
|
||||
if (res.success && res.data) {
|
||||
// 直接设置指标数据,无需转换
|
||||
if (res.data.indicatorStList && res.data.indicatorStList.length > 0) {
|
||||
setTemplateData(res.data.indicatorStList);
|
||||
|
||||
// 更新指标列表
|
||||
const newIndicators = res.data.indicatorStList.map((item: any) => ({
|
||||
id: item.id,
|
||||
name: item.baseIndicator,
|
||||
description: item.descIndicator || '',
|
||||
}));
|
||||
|
||||
// 更新indicators状态
|
||||
setIndicators(newIndicators);
|
||||
}
|
||||
} else {
|
||||
message.error(res.message || '获取模板详情失败');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取模板详情失败:', error);
|
||||
message.error('获取模板详情失败');
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
// 监听templateId变化,获取模板详情
|
||||
useEffect(() => {
|
||||
fetchTemplateDetail(formData.templateId);
|
||||
}, []);
|
||||
|
||||
// 处理行选择变化
|
||||
const handleSelectChange = (newSelectedRowKeys: React.Key[]) => {
|
||||
setSelectedRowKeys(newSelectedRowKeys);
|
||||
@ -71,17 +127,21 @@ const DivisionStep = forwardRef<any, DivisionStepProps>(({ formData, onFormDataC
|
||||
message.warning('请先选择评价人员');
|
||||
return;
|
||||
}
|
||||
setDivisionModalVisible(true);
|
||||
// 直接显示批量模板选择弹窗
|
||||
setBatchTemplateModalVisible(true);
|
||||
|
||||
// 重置已选中的模板项
|
||||
setBatchSelectedTemplateItems([]);
|
||||
};
|
||||
|
||||
// 处理评价方式变更
|
||||
const handleEvaluateTypeChange = (e: any) => {
|
||||
setBatchEvaluateType(e.target.value);
|
||||
// 处理批量模板指标选择
|
||||
const handleBatchTemplateItemsSelect = (selectedItems: any[]) => {
|
||||
setBatchSelectedTemplateItems(selectedItems);
|
||||
};
|
||||
|
||||
// 处理指标选择变更
|
||||
const handleIndicatorChange = (checkedValues: CheckboxValueType[]) => {
|
||||
setBatchSelectedIndicators(checkedValues.map(v => v.toString()));
|
||||
// 关闭批量模板选择弹窗
|
||||
const handleCloseBatchTemplateModal = () => {
|
||||
setBatchTemplateModalVisible(false);
|
||||
};
|
||||
|
||||
// 批量设置指标分工
|
||||
@ -91,28 +151,100 @@ const DivisionStep = forwardRef<any, DivisionStepProps>(({ formData, onFormDataC
|
||||
evaluator => selectedRowKeys.includes(evaluator.id)
|
||||
);
|
||||
|
||||
// 提取所有选中指标的ID
|
||||
const selectedIndicatorIds: string[] = [];
|
||||
|
||||
// 从选中的模板项中提取所有指标ID
|
||||
batchSelectedTemplateItems.forEach(stItem => {
|
||||
// 添加二级指标ID
|
||||
if (stItem.indicatorNdList && stItem.indicatorNdList.length > 0) {
|
||||
stItem.indicatorNdList.forEach((ndItem: any) => {
|
||||
selectedIndicatorIds.push(ndItem.id);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 更新指标分配数据
|
||||
const newAssignments = { ...indicatorAssignments };
|
||||
|
||||
selectedEvaluators.forEach(evaluator => {
|
||||
newAssignments[evaluator.id] = {
|
||||
type: batchEvaluateType,
|
||||
indicatorIds: batchEvaluateType === EvaluateType.INDICATOR ? batchSelectedIndicators : [],
|
||||
// 评价类型:如果用户关联了指标则为1(按指标),否则为0(按评价单)
|
||||
type: selectedIndicatorIds.length > 0 ? EvaluateType.INDICATOR : EvaluateType.ALL,
|
||||
indicatorIds: selectedIndicatorIds,
|
||||
};
|
||||
});
|
||||
|
||||
setIndicatorAssignments(newAssignments);
|
||||
setDivisionModalVisible(false);
|
||||
setBatchTemplateModalVisible(false);
|
||||
message.success(`已为${selectedRowKeys.length}名评价人员设置分工`);
|
||||
};
|
||||
|
||||
// 处理单个评价人员的指标分工
|
||||
const handleAssignIndicators = (userId: string) => {
|
||||
Modal.info({
|
||||
title: '评价指标分工',
|
||||
content: '此功能将在后续完善',
|
||||
okText: '确定',
|
||||
setCurrentUserId(userId);
|
||||
|
||||
// 重置已选中的指标项
|
||||
setSelectedTemplateItems([]);
|
||||
// 打开模态框
|
||||
setTemplateViewModalVisible(true);
|
||||
};
|
||||
|
||||
// 关闭模板查看模态框
|
||||
const handleCloseTemplateViewModal = () => {
|
||||
setTemplateViewModalVisible(false);
|
||||
};
|
||||
|
||||
// 处理模板指标选择
|
||||
const handleTemplateItemsSelect = (selectedItems: any[]) => {
|
||||
console.log(selectedItems)
|
||||
setSelectedTemplateItems(selectedItems);
|
||||
};
|
||||
|
||||
// 获取当前用户的已分配指标ID
|
||||
const getCurrentUserSelectedIds = useCallback(() => {
|
||||
if (!currentUserId) return [];
|
||||
|
||||
const userAssignment = indicatorAssignments[currentUserId];
|
||||
if (userAssignment && userAssignment.type === EvaluateType.INDICATOR) {
|
||||
const selectedIds = userAssignment.indicatorIds || [];
|
||||
return selectedIds;
|
||||
}
|
||||
|
||||
return [];
|
||||
}, [currentUserId, indicatorAssignments]);
|
||||
|
||||
// 保存指标分配
|
||||
const handleSaveIndicatorAssignment = () => {
|
||||
if (!currentUserId) {
|
||||
message.warning('未选择评价人员');
|
||||
return;
|
||||
}
|
||||
|
||||
// 提取所有选中指标的ID
|
||||
const selectedIndicatorIds: string[] = [];
|
||||
|
||||
// 从选中的模板项中提取所有指标ID
|
||||
selectedTemplateItems.forEach(stItem => {
|
||||
// 添加二级指标ID
|
||||
if (stItem.indicatorNdList && stItem.indicatorNdList.length > 0) {
|
||||
stItem.indicatorNdList.forEach((ndItem: any) => {
|
||||
selectedIndicatorIds.push(ndItem.id);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 更新指标分配
|
||||
const newAssignments = { ...indicatorAssignments };
|
||||
newAssignments[currentUserId] = {
|
||||
// 评价类型:如果用户关联了指标则为1(按指标),否则为0(按评价单)
|
||||
type: selectedIndicatorIds.length > 0 ? EvaluateType.INDICATOR : EvaluateType.ALL,
|
||||
indicatorIds: selectedIndicatorIds,
|
||||
};
|
||||
|
||||
setIndicatorAssignments(newAssignments);
|
||||
setTemplateViewModalVisible(false);
|
||||
message.success('已设置评价人员指标分工');
|
||||
};
|
||||
|
||||
// 查看评价人员的指标分工
|
||||
@ -332,36 +464,67 @@ const DivisionStep = forwardRef<any, DivisionStepProps>(({ formData, onFormDataC
|
||||
pagination={false}
|
||||
/>
|
||||
|
||||
{/* 批量设置指标分工弹窗 */}
|
||||
{/* 批量选择指标模板弹窗 */}
|
||||
<Modal
|
||||
title="批量设置评价指标分工"
|
||||
visible={divisionModalVisible}
|
||||
onOk={handleBatchSetDivision}
|
||||
onCancel={() => setDivisionModalVisible(false)}
|
||||
okText="确定"
|
||||
cancelText="取消"
|
||||
width={700}
|
||||
title={`批量设置评价指标分工 (已选择 ${selectedRowKeys.length} 名评价人员)`}
|
||||
visible={batchTemplateModalVisible}
|
||||
onCancel={handleCloseBatchTemplateModal}
|
||||
width={800}
|
||||
footer={[
|
||||
<Button key="cancel" onClick={handleCloseBatchTemplateModal}>
|
||||
取消
|
||||
</Button>,
|
||||
<Button key="save" type="primary" onClick={handleBatchSetDivision}>
|
||||
确定并保存
|
||||
</Button>
|
||||
]}
|
||||
>
|
||||
<div>
|
||||
<p>您已选择 {selectedRowKeys.length} 名评价人员进行指标分工设置</p>
|
||||
<Radio.Group defaultValue={EvaluateType.ALL} onChange={handleEvaluateTypeChange}>
|
||||
<Radio value={EvaluateType.ALL}>按评价单评价</Radio>
|
||||
<Radio value={EvaluateType.INDICATOR}>按指标评价</Radio>
|
||||
</Radio.Group>
|
||||
<Spin spinning={loading}>
|
||||
{templateData.length > 0 ? (
|
||||
<EvaluateTemplateTable
|
||||
value={templateData}
|
||||
isDetail={true}
|
||||
isCheck={true}
|
||||
onSelect={handleBatchTemplateItemsSelect}
|
||||
/>
|
||||
) : (
|
||||
<div style={{ textAlign: 'center', padding: '20px 0' }}>
|
||||
{loading ? '加载中...' : '暂无模板数据'}
|
||||
</div>
|
||||
)}
|
||||
</Spin>
|
||||
</Modal>
|
||||
|
||||
<div style={{ marginTop: 16 }}>
|
||||
<p>指标列表:</p>
|
||||
<Checkbox.Group style={{ width: '100%' }} onChange={handleIndicatorChange}>
|
||||
<Row>
|
||||
{indicators.map(indicator => (
|
||||
<Col span={8} key={indicator.id}>
|
||||
<Checkbox value={indicator.id}>{indicator.name}</Checkbox>
|
||||
</Col>
|
||||
))}
|
||||
</Row>
|
||||
</Checkbox.Group>
|
||||
</div>
|
||||
</div>
|
||||
{/* 评价指标模板查看弹窗 */}
|
||||
<Modal
|
||||
title="设置评价指标分工"
|
||||
visible={templateViewModalVisible}
|
||||
onCancel={handleCloseTemplateViewModal}
|
||||
footer={[
|
||||
<Button key="cancel" onClick={handleCloseTemplateViewModal}>
|
||||
取消
|
||||
</Button>,
|
||||
<Button key="save" type="primary" onClick={handleSaveIndicatorAssignment}>
|
||||
保存
|
||||
</Button>
|
||||
]}
|
||||
>
|
||||
<Spin spinning={loading}>
|
||||
{templateData.length > 0 ? (
|
||||
<EvaluateTemplateTable
|
||||
value={templateData}
|
||||
isDetail={true}
|
||||
isCheck={true}
|
||||
key={currentUserId}
|
||||
onSelect={handleTemplateItemsSelect}
|
||||
defaultSelectedIds={getCurrentUserSelectedIds()}
|
||||
/>
|
||||
) : (
|
||||
<div style={{ textAlign: 'center', padding: '20px 0' }}>
|
||||
{loading ? '加载中...' : '暂无模板数据'}
|
||||
</div>
|
||||
)}
|
||||
</Spin>
|
||||
</Modal>
|
||||
</div>
|
||||
);
|
||||
|
Reference in New Issue
Block a user