import React, { useState, useEffect } from "react"; import { Form, Table, Button, Input, Select, Space, Modal, Upload, message, Flex, } from "antd"; import { PlusOutlined, UploadOutlined } from "@ant-design/icons"; import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout"; import SearchForm from "@cqsjjb/jjb-react-admin-component/SearchForm"; import ControlWrapper from "@cqsjjb/jjb-react-admin-component/ControlWrapper"; import { AntdTableFuncControl } from "@cqsjjb/jjb-common-decorator/antd"; import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace"; import { MATERIAL_TYPE_OPTIONS, MATERIAL_TYPE_MAP } from "~/enumerate/constant"; import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { tools } from "@cqsjjb/jjb-common-lib"; import AttachmentUpload from "~/components/AttachmentUpload"; import PreviewUrlButton from "~/components/PreviewUrlButton"; const { router } = tools; const ProjectDocLibrary = (props) => { const [searchForm] = Form.useForm(); const [uploadForm] = Form.useForm(); const [dataSource, setDataSource] = useState([]); const [total, setTotal] = useState(0); const [uploadModalOpen, setUploadModalOpen] = useState(false); const [projectList, setProjectList] = useState([]); const [docViewerVisible, setDocViewerVisible] = useState(false); const [currentDocs, setCurrentDocs] = useState([]); const { evalProjectDocLoading, evalProjectDocSaveLoading } = props.safetyEvalBusiness; const getData = async (pagination) => { const params = { ...router.query, current: pagination?.current || router.query.current || 1, size: pagination?.size || router.query.size || 10, }; const res = await props.evalProjectDocPage(params); if (res?.success !== false) { setDataSource(res?.data || []); setTotal(res?.total || 0); } }; const getProjectList = async () => { const res = await props.evalProjectPage({ current: 1, size: 999 }); if (res?.success !== false) { setProjectList(res?.data || []); } }; useEffect(() => { searchForm.setFieldsValue(router.query); getData(); }, []); const handleSearch = (values) => { router.query = { ...router.query, ...values, current: 1, size: 10 }; getData(); }; const handleReset = (values) => { searchForm.resetFields(); router.query = { ...values, current: 1, size: 10 }; getData(); }; const handlePageChange = (pagination) => { router.query = { ...router.query, current: pagination.current, size: pagination.pageSize, }; getData(pagination); }; const handleOpenUpload = () => { uploadForm.resetFields(); getProjectList(); setUploadModalOpen(true); }; const handleUploadSubmit = async () => { const values = await uploadForm.validateFields(); const res = await props.evalProjectDocSave({ projectId: values.projectId, projectDocUrl: values.file.map((item) => ({ project_doc_url: item.url, materialName: item.name, materialType: values.materialType, })), }); if (res?.success !== false) { message.success("上传成功"); setUploadModalOpen(false); getData(); } }; const columns = [ { title: "项目编号", dataIndex: "projectNo", width: 130 }, { title: "项目名称", dataIndex: "projectName", ellipsis: true, width: 200, }, { title: "企业名称", dataIndex: "customerName", ellipsis: true, width: 180 }, { title: "评价类型", dataIndex: "evalTypeName", width: 120 }, { title: "上传文档数量", width: 110, render: (_, record) => { const map = record.projectDocUrlMap || {}; const count = Object.values(map).reduce((sum, arr) => sum + (arr?.length || 0), 0); return {count}; }, }, { title: "操作", width: 100, fixed: "right", render: (_, record) => ( ), }, ]; return ( } onClick={handleOpenUpload}> 上传资料 } >
按项目归集企业和机构上传的资料,先选择项目,再查看项目文档。
, , ]} onFinish={handleSearch} onReset={handleReset} style={{ marginBottom: 16 }} /> `共 ${total} 条`, }} onChange={handlePageChange} /> setUploadModalOpen(false)} onOk={handleUploadSubmit} confirmLoading={evalProjectDocSaveLoading} width={700} destroyOnHide={true} >
setDocViewerVisible(false)} footer={null} width={700} destroyOnHide={true} > {currentDocs.map(([type, docs]) => (

{MATERIAL_TYPE_MAP[type] || type}

( ), }, ]} /> ))} {currentDocs.length === 0 && (
暂无文档
)} ); }; /** 上传按钮字段组件 - 上传后回填 url */ const UploadButtonField = ({ value, onChange }) => { const [uploading, setUploading] = useState(false); return ( ); }; const UploadButtonInner = ({ value, onChange, uploading, setUploading }) => { return ( {value && ( {value.split("/").pop()} )} { const ext = "." + file.name.split(".").pop().toLowerCase(); if (ext === ".gif") { message.error("不支持 GIF 格式图片上传"); return Upload.LIST_IGNORE; } return true; }} onChange={(info) => { if (info.file.status === "uploading") { setUploading(true); } else if (info.file.status === "done") { setUploading(false); const url = info.file.response?.data; if (url) { onChange?.(url); } } else if (info.file.status === "error") { setUploading(false); message.error("上传失败"); } }} > ); }; export default Connect( [NS_SAFETY_EVAL_BUSINESS], true, )(AntdTableFuncControl(ProjectDocLibrary));