@ -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 [ division ModalVisible, setDivision ModalVisible ] = useState ( false ) ;
// 评价指标模板查看 弹窗可见性
const [ templateView ModalVisible, setTemplateView ModalVisible ] = 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 ) ;
setDivision ModalVisible ( false ) ;
setBatchTemplate ModalVisible ( 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 = { division ModalVisible}
onOk = { handleBatchSetDivision }
onCancel = { ( ) = > setDivisionModalVisible ( false ) }
okText = "确定"
cancelText = "取消"
width = { 700 }
title = { ` 批量设置评价指标分工 (已选择 ${ selectedRowKeys . length } 名评价人员) ` }
visible = { batchTemplate ModalVisible}
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 >
) ;