登录 个人 与 零星采购

This commit is contained in:
孙景学
2025-07-09 14:01:45 +08:00
parent 56da66ee21
commit b46b35cd4b
35 changed files with 1054 additions and 343 deletions

View File

@ -278,6 +278,7 @@ const CreateModal: React.FC<{ visible: boolean; onCancel: () => void; }> = ({ vi
<Radio.Group onChange={onMethodChange} value={admissionMethod}>
<Radio value="online">线</Radio>
<Radio value="offline">线</Radio>
<Radio value="scattered">/</Radio>
</Radio.Group>
</Form.Item>
@ -313,7 +314,7 @@ const CreateModal: React.FC<{ visible: boolean; onCancel: () => void; }> = ({ vi
</Button>
</Form.Item>
{admissionMethod !== 'online' && (
{admissionMethod === 'offline' && (
<>
<Form.Item
label="供应商符合性审查"
@ -321,7 +322,7 @@ const CreateModal: React.FC<{ visible: boolean; onCancel: () => void; }> = ({ vi
rules={[
{
validator: (_, value) => {
if (admissionMethod === 'online') {
if (admissionMethod === 'offline') {
if (!value || value.length === 0) {
return Promise.reject(new Error('请上传供应商符合性审查文件'));
}
@ -426,7 +427,8 @@ const CreateModal: React.FC<{ visible: boolean; onCancel: () => void; }> = ({ vi
<Form.Item wrapperCol={{ offset: 6 }}>
<Button type="primary" htmlType="submit" style={{ marginRight: 8 }}>
{ admissionMethod === 'online'? '确认': admissionMethod === 'offline'? '提交审核':'提交' }
</Button>
<Button
onClick={() => {

View File

@ -1,10 +1,11 @@
import React, { useEffect, useState } from 'react';
import { Modal, Table, Button, Select, Spin, message } from 'antd';
import { reviewInfoData } from '../services';
import { Modal, Table, Button, Spin } from 'antd';
import { reviewInfoData, groupByList } from '../services';
import { connect } from 'umi';
interface ResultModalProps {
visible: boolean;
record?: { id?: string;[key: string]: any } | null;
record?: { id?: string; [key: string]: any } | null;
onCancel: () => void;
dispatch: any;
}
@ -15,7 +16,7 @@ const RemarkViewModal: React.FC<{
onCancel: () => void;
remark: string;
file?: any;
}> = ({ visible, onCancel, remark, file, }) => (
}> = ({ visible, onCancel, remark, file }) => (
<Modal
visible={visible}
title="备注信息"
@ -49,31 +50,59 @@ const ResultModal: React.FC<ResultModalProps> = ({
const [suppliers, setSuppliers] = useState<any[]>([]);
const [items, setItems] = useState<any[]>([]);
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;
// 拉取评审项groupByList+供应商+评审数据reviewInfoData
Promise.all([
groupByList({ accessWorkId: record.id }),
reviewInfoData({ id: record.id })
]).then(([groupRes, reviewRes]: any) => {
// 评审项按接口数据确定字段兼容你的接口itemType !== 'summary'
const allItems = (groupRes?.data || []).filter((it: any) => it.itemType !== 'summary');
setItems(allItems);
// 供应商及评审数据
const supplierList = reviewRes?.data || [];
// 为每个 supplier 构造 coscoAccessItemList根据 groupByList 的 items + supplier.coscoAccessUserItemList 拼装),这样 columns 渲染就不依赖接口中的 coscoAccessItemList
supplierList.forEach((sup: any) => {
// 按 itemName+itemType 拆分兼容后续render逻辑
const itemList = allItems.map((item: any) => {
// 找所有该供应商的userItem同一itemName, itemType
const userItems = (sup.coscoAccessUserItemList || []).filter(
(u: any) => u.itemName === item.itemName && u.itemType === item.itemType
);
return {
...item,
coscoAccessUserItemList: userItems
}
});
setGroupSummaryResult(summaryMap);
})
.finally(() => setLoading(false));
// summary 行
const summaryItems = (sup.coscoAccessUserItemList || []).filter(
(u: any) => u.itemType === 'summary'
);
if (summaryItems.length) {
itemList.push({
itemName: summaryItems[0].itemName,
itemType: 'summary',
coscoAccessUserItemList: summaryItems
});
}
sup.coscoAccessItemList = itemList;
});
setSuppliers(supplierList);
// 汇总行初始化
const summaryMap: { [k: string]: '0' | '1' | undefined } = {};
supplierList.forEach((sup: any) => {
const summaryItem = (sup.coscoAccessItemList || []).find((i: any) => i.itemType === 'summary');
summaryMap[sup.supplierId] = summaryItem?.coscoAccessUserItemList?.[0]?.reviewResult;
});
setGroupSummaryResult(summaryMap);
}).finally(() => setLoading(false));
} else if (!visible) {
setSuppliers([]);
setItems([]);
@ -81,8 +110,6 @@ const ResultModal: React.FC<ResultModalProps> = ({
}
}, [visible, record]);
// 构造二级表头
const columns: any[] = [
{
@ -103,7 +130,6 @@ const ResultModal: React.FC<ResultModalProps> = ({
}
});
const reviewers = Array.from(reviewerSet);
console.log(sup, 'sup');
return {
title: (
@ -130,7 +156,9 @@ const ResultModal: React.FC<ResultModalProps> = ({
align: 'center',
render: (_: any, row: any) => {
// 在sup.coscoAccessItemList里找该itemName下该人员
const item = (sup.coscoAccessItemList || []).find((it: any) => it.itemName === row.itemName && it.itemType !== 'summary');
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;
@ -181,7 +209,12 @@ const ResultModal: React.FC<ResultModalProps> = ({
// summary 行
const summaryRow = (
<Table.Summary.Row>
<Table.Summary.Cell index={-1}></Table.Summary.Cell>
<Table.Summary.Cell
index={-1}
className="summary-sticky-cell"
>
</Table.Summary.Cell>
{suppliers.map((sup, index) => {
// 统计reviewer个数
const reviewerSet = new Set<string>();
@ -193,10 +226,11 @@ const ResultModal: React.FC<ResultModalProps> = ({
}
});
const colSpan = reviewerSet.size || 1;
return (
<Table.Summary.Cell index={index} key={sup.supplierId} colSpan={colSpan} align="center">
<span style={{ color: groupSummaryResult[sup.supplierId] === '0' ? '#52c41a' : '#f5222d' }}> {groupSummaryResult[sup.supplierId] === '0' ? '合格' : '不合格'}</span>
<span style={{ color: groupSummaryResult[sup.supplierId] === '0' ? '#52c41a' : '#f5222d' }}>
{groupSummaryResult[sup.supplierId] === '0' ? '合格' : '不合格'}
</span>
</Table.Summary.Cell>
)
})}