import React, { useEffect, useState } from 'react'; import { Modal, Table, Button, Select, Spin, message } from 'antd'; import { reviewInfoData } from '../services'; import { connect } from 'umi'; interface ResultModalProps { visible: boolean; record?: { id?: string;[key: string]: any } | null; onCancel: () => void; dispatch: any; } // 只读备注弹窗 const RemarkViewModal: React.FC<{ visible: boolean; onCancel: () => void; remark: string; file?: any; }> = ({ visible, onCancel, remark, file, }) => (
备注:{remark || '无'}
{file && file.fileUrl && (
附件: {file.fileName}
)}
); const ResultModal: React.FC = ({ visible, record, onCancel, dispatch }) => { const [loading, setLoading] = useState(false); const [suppliers, setSuppliers] = useState([]); const [items, setItems] = useState([]); const [groupSummaryResult, setGroupSummaryResult] = useState<{ [k: string]: '0' | '1' | undefined }>({}); // 查看备注弹窗 const [remarkModal, setRemarkModal] = useState({ open: false, remark: '', file: undefined as any }); // 拉取数据 useEffect(() => { if (visible && record?.id) { setLoading(true); reviewInfoData({ id: record.id }) .then((res: any) => { const supplierList = res?.data || []; setSuppliers(supplierList); // 所有项,取第一家公司 const allItems = (supplierList[0]?.coscoAccessItemList || []); // 非summary项 setItems(allItems.filter((item: any) => item.itemType !== 'summary')); // summary 行初始化 const summaryMap: { [k: string]: '0' | '1' | undefined } = {}; supplierList.forEach((sup: any) => { // summary 行 const summaryItem = (sup.coscoAccessItemList || []).find((i: any) => i.itemType === 'summary'); console.log(summaryItem, 'summaryItem'); summaryMap[sup.supplierId] = summaryItem.coscoAccessUserItemList[0]?.reviewResult; }); setGroupSummaryResult(summaryMap); }) .finally(() => setLoading(false)); } else if (!visible) { setSuppliers([]); setItems([]); setGroupSummaryResult({}); } }, [visible, record]); // 构造二级表头 const columns: any[] = [ { title: '评审项', dataIndex: 'itemName', key: 'itemName', width: 180, fixed: 'left', }, ...suppliers.map(sup => { // 当前公司所有人员(所有非summary项,取 coscoAccessUserItemList 多个) const reviewerSet = new Set(); (sup.coscoAccessItemList || []).forEach((item: any) => { if (item.itemType !== 'summary' && Array.isArray(item.coscoAccessUserItemList)) { item.coscoAccessUserItemList.forEach((u: any) => { reviewerSet.add(u.reviewBy); }); } }); const reviewers = Array.from(reviewerSet); console.log(sup, 'sup'); return { title: (
{ dispatch({ type: 'globalModal/show', payload: { id: sup.supplierId, }, }); }} > {sup.supplierName}
), children: reviewers.map((reviewBy: string) => ({ title: reviewBy, dataIndex: `${sup.supplierId}_${reviewBy}`, key: `${sup.supplierId}_${reviewBy}`, width: 100, align: 'center', render: (_: any, row: any) => { // 在sup.coscoAccessItemList里找该itemName下该人员 const item = (sup.coscoAccessItemList || []).find((it: any) => it.itemName === row.itemName && it.itemType !== 'summary'); if (!item) return null; const userItem = (item.coscoAccessUserItemList || []).find((u: any) => u.reviewBy === reviewBy); if (!userItem) return null; return (
{userItem.reviewResult === '0' ? 合格 : userItem.reviewResult === '1' ? 不合格 : ''} {userItem.remark && ( )}
); } })) } }) ]; // 组装表格行数据 const tableData = items.map(item => { const row: any = { key: item.id, itemName: item.itemName }; suppliers.forEach(sup => { // 每个人员一格 const reviewerSet = new Set(); (sup.coscoAccessItemList || []).forEach((it: any) => { if (it.itemType !== 'summary' && Array.isArray(it.coscoAccessUserItemList)) { it.coscoAccessUserItemList.forEach((u: any) => { reviewerSet.add(u.reviewBy); }); } }); const reviewers = Array.from(reviewerSet); reviewers.forEach((reviewBy: string) => { row[`${sup.supplierId}_${reviewBy}`] = null; // 具体显示用render }); }); return row; }); // summary 行 const summaryRow = ( 结果汇总 {suppliers.map((sup, index) => { // 统计reviewer个数 const reviewerSet = new Set(); (sup.coscoAccessItemList || []).forEach((item: any) => { if (item.itemType !== 'summary' && Array.isArray(item.coscoAccessUserItemList)) { item.coscoAccessUserItemList.forEach((u: any) => { reviewerSet.add(u.reviewBy); }); } }); const colSpan = reviewerSet.size || 1; return ( {groupSummaryResult[sup.supplierId] === '0' ? '合格' : '不合格'} ) })} ); return ( 关 闭, ]} width={1000} bodyStyle={{ maxHeight: '60vh', overflowY: 'auto' }} centered destroyOnClose > summaryRow} scroll={{ x: 300 * suppliers.length + 200 }} /> setRemarkModal({ open: false, remark: '', file: undefined })} remark={remarkModal.remark} file={remarkModal.file} /> ); }; export default connect()(ResultModal);