import type { CurrentUser } from "umi"; import { connect } from "umi"; import type { ConnectState } from "@/models/connect"; import { Button, Col, DatePicker, Drawer, Form, Input, message, Modal, Popconfirm, Popover, Row, Select, Space, Spin, Switch, Tree, Upload } from "antd"; import React, { useEffect, useRef, useState } from "react"; import type { ActionType, ProColumns } from "@ant-design/pro-table"; import AddNewShop from "@/pages/supplier/supplierList/components/addNewShop"; import { handleSubmitData, handleBIDList, handleSaveQuotation, handleCompareSubmit, handleQualificationList, updateQualification, handleDeleteBIDList } from "@/pages/supplier/supplierList/service"; import moment from "moment"; import { ExclamationCircleOutlined, FilterOutlined, PlusOutlined } from "@ant-design/icons"; import ProTable from "@ant-design/pro-table"; import { ModalForm, ProFormDatePicker, ProFormSelect, ProFormText, ProFormTextArea, ProFormUploadButton } from "@ant-design/pro-form"; import useRequest from "@ahooksjs/use-request"; import { handleSupplierList } from "@/pages/Setting/Roles/service"; import { deleteAHYDPicture, deletePicture, uploadAHYDPicture, uploadPicture } from "@/services/picture"; import type { QualificationModel } from "@/pages/merchantManagement/supplier/Qualifications/data"; import { getFieldEnum } from "@/services/options"; import type { UploadFile } from "antd/es/upload/interface"; import { getQualificationDetail } from "@/pages/merchantManagement/supplier/Qualifications/service"; import type { PictureModel } from "@/services/options/typings"; import type { ProDescriptionsItemProps } from "@ant-design/pro-descriptions"; import ProDescriptions from "@ant-design/pro-descriptions"; import { transferImg } from "@/utils/format"; import './list.less' import dealtSelect from '@/assets/supplier/dealtSelect.png' import dealt from '@/assets/supplier/dealt.png' import owner from '@/assets/supplier/owner.png' import ownerSelect from '@/assets/supplier/ownerSelect.png' import allBussiness from '@/assets/supplier/allBussiness.png' import pendingBusiness from '@/assets/supplier/pendingBusiness.png' import successBusiness from '@/assets/supplier/successBusiness.png' import businessName from '@/assets/supplier/businessName.png' import startTime from '@/assets/supplier/startTime.png' import compareTime from '@/assets/supplier/compareTime.png' import compareRate from '@/assets/supplier/compareRate.png' import state from '@/assets/supplier/state.png' import option from '@/assets/supplier/option.png' import first from '@/assets/supplier/1st.png' import second from '@/assets/supplier/2st.png' import third from '@/assets/supplier/3st.png' import forth from '@/assets/supplier/4st.png' import descIcon from '@/assets/supplier/descIcon.png' import shopSmallIcon from '@/assets/supplier/shopSmallIcon.png' import remainderIcon from '@/assets/supplier/remainderIcon.png' import error from "@/assets/bussinessProject/error.svg"; const { confirm } = Modal; // 上传资质图片 const customUploadRequest = async (fileList: UploadFile[], tableId: string) => { if (!fileList.length) { message.error("您上传的图片不存在.") return false } const formData = new FormData(); fileList.forEach((file: any) => { formData.append('files[]', file); }); formData.append('TableName', 'QUALIFICATION'); formData.append('TableId', tableId); const success = await uploadAHYDPicture(formData) if (success) { return true } return false } const SupplierList: React.FC<{ currentUser: CurrentUser | undefined }> = ({ currentUser }) => { const tableRef = useRef() // 子组件的实例对象 const addNewShopRef = useRef() const actionRef = useRef() const actionSupplierRef = useRef() const [showDetailDrawer, setShowDetailDrawer] = useState(false) const [currentItem, setCurrentItem] = useState() const [showAddDrawer, setShowAddDrawer] = useState(false) const [shopList, setShopList] = useState() // 详情查到的商品列表 const [qualification, setQualification] = useState(false)// 上传资质的悬浮框 const [addQualification, setAddQualification] = useState(false)// 新增资质的悬浮框 const qualificationFormRef = useRef() const [submitModal, setSubmitModal] = useState(false) const [submitSupplierID, setSubmitSupplierID] = useState()// 最后提交的时候选择的供应商id // 最后提交的时候 选择的供应商列表 const [submitSelectList, setSubmitSelectList] = useState() const [fileList, setFileList] = useState([]) const [showCurrentDetail, setShowCurrentDetail] = useState(false)// 资质的详情 const [currentRow, setCurrentRow] = useState()// 当前选中的资质详情 const { data: supplierLists } = useRequest(async () => { return await handleSupplierList({ ProvinceCode: currentUser?.USER_PROVINCE, OwnerUnitId: currentUser?.OwnerUnitId, }) }) // 搜索的业务名称 const [searchName, setSearchName] = useState() // 搜索的查询时间 const [searchTime, setSearchTime] = useState()// 搜索时间 // 搜索的配送时间 const [deliveryTime, setDeliveryTime] = useState() // 获取供应商列表 const { loading, data: supplierList } = useRequest(async () => { return await handleSupplierList({ ProvinceCode: currentUser?.USER_PROVINCE, OwnerUnitId: currentUser?.OwnerUnitId, }) }) // 资质的供应商 const columns: ProColumns[] = [ { dataIndex: 'QUALIFICATION_NAME', title: '资质名称', hideInDescriptions: true, hideInSearch: true, render: (_, record) => { return { setCurrentRow(await getDetail(record)) setShowCurrentDetail(true) }}>{_} } // width: '15%', }, { dataIndex: 'QUALIFICATION_DESC', title: '资质说明', hideInSearch: true, }, { dataIndex: 'SUPPLIER_ID', title: '供应商名称', valueType: 'select', fieldProps: { showSearch: true, options: !loading ? supplierList : [] } }, { dataIndex: 'QUALIFICATION_TYPE', title: '资质类型', align: 'center', valueType: 'select', request: async () => { return await getFieldEnum({ FieldExplainField: 'QUALIFICATION_TYPE' }) } }, { dataIndex: 'ISSUING_DATE', title: '签发日期', align: 'center', hideInSearch: true, render: (_, record) => { if (record?.ISSUING_DATE) { return moment(record?.ISSUING_DATE).format('YYYY-MM-DD') } return _ } }, { dataIndex: 'QUALIFICATION_ENDDATE', title: '有效期至', align: 'center', sorter: true, hideInSearch: true, valueType: 'date', render: (_, record) => { if (record?.QUALIFICATION_ENDDATE && record?.QUALIFICATION_ENDDATE.toString() !== '') { // 资质到期时间在一个月内,内容标红显示 if (moment().add(1, 'month').diff(moment(record?.QUALIFICATION_ENDDATE)) > 0 && moment(record?.QUALIFICATION_ENDDATE).diff(moment().format('YYYY/MM/DD')) >= 0) { return {_} } // 资质已过期,则置灰显示 if (moment(record?.QUALIFICATION_ENDDATE).diff(moment().format('YYYY/MM/DD')) < 0) { return {_} } } return _ } }, { dataIndex: 'QUALIFICATION_ENDDATE', title: '到期', align: 'center', hideInTable: true, valueType: 'radioButton', hideInDescriptions: true, valueEnum: { 1: { text: '一个月' }, 2: { text: '三个月' }, 3: { text: '半年' }, }, }, { dataIndex: 'QUALIFICATION_STATE', title: '状态', align: 'center', valueType: 'select', hideInDescriptions: true, valueEnum: { 1: { text: '有效', status: 'processing' }, 0: { text: '过期', status: "default" }, }, }, { dataIndex: 'OPERATE_DATE', title: '更新时间', align: 'center', valueType: 'fromNow', hideInTable: true, hideInSearch: true, }, { dataIndex: 'STAFF_NAME', title: '操作员', align: 'center', hideInSearch: true, hideInTable: true, }, { dataIndex: 'option', title: '操作', align: 'center', valueType: 'option', hideInSearch: true, render: (_, record) => { return ( { supplierId ? '' : { console.log('record', record) setCurrentRow(await getDetail(record)) qualificationFormRef.current?.setFieldsValue({ ...record }) setAddQualification(true) }} > 编辑 } ); }, }, ]; // 当前查看供应商资质选中的供应商 const [supplierId, setSupplierId] = useState() const { RangePicker } = DatePicker; // 获取详情 const getDetail = async (record: QualificationModel) => { const data = await getQualificationDetail(record?.QUALIFICATION_ID) const files = data?.ImgList ? data?.ImgList.map((n: PictureModel) => { return { uid: n.ImageId, name: n.ImageName, status: 'done', url: n.ImageUrl, deletepath: n.ImagePath } }) : [] // setPriviewFileList(files) setFileList(files) return data } // 选项卡列表 const [tabList, setTabList] = useState(currentUser?.UserPattern === 1000 ? [ { label: '待办事项', number: 0, value: 1, icon: dealt, selectIcon: dealtSelect }, { label: '我的申请', number: 0, value: 2, icon: owner, selectIcon: ownerSelect }, ] : [ { label: '待办事项', number: 0, value: 1, icon: dealt, selectIcon: dealtSelect }, { label: '中标项目', number: 0, value: 2, icon: owner, selectIcon: ownerSelect }, { label: '未中标项目', number: 0, value: 3, icon: owner, selectIcon: ownerSelect }, ]) // 选中的标签 const [selectTab, setSelectTab] = useState(1) // 其他详情信息 const [navList, setNavList] = useState( currentUser?.UserPattern === 4000 ? [ { label: '总业务', img: allBussiness, value: 0 }, { label: '在招标', img: pendingBusiness, value: 0 }, { label: '已完成', img: successBusiness, value: 0 } ] : [ { label: '总业务', img: allBussiness, value: 0 }, { label: '在招标', img: pendingBusiness, value: 0 }, { label: '比价中', img: pendingBusiness, value: 0 }, { label: '已完成', img: successBusiness, value: 0 } ] ) // 待办事项的columns const waitColumns = [ { title:
业务名称
, ellipsis: true, dataIndex: 'BID_NAME', hideInSearch: true, align: 'left', }, { title:
业务备注
, dataIndex: 'BID_DESC', ellipsis: true, hideInSearch: true, align: 'left', }, { title:
发起时间
, dataIndex: 'OPERATE_DATE', width: 180, hideInSearch: true, align: 'center', }, { title:
比价时间
, dataIndex: 'compareTime', width: 300, hideInSearch: true, align: 'left', render: (_, record) => { return
{`${moment(record?.START_DATE).format('YYYY-MM-DD')}~${moment(record?.END_DATE).format('YYYY-MM-DD')}`} { record.BID_STATE === 9000 ? '' :
{ record?.Remian ?
还剩{record?.Remian}
: '' }
}
} }, { title:
比价进度
, dataIndex: 'compareRate', width: 150, hideInSearch: true, hideInTable: selectTab !== 1, align: 'center', render: (_, record) => { return
1 ? 100 : (record?.BidSupplier / record?.TotalSupplier) * 100}%` }}>
{`${record?.BidSupplier}/${record?.TotalSupplier}`}
} }, { title:
供应商
, dataIndex: 'SUPPLIER_NAME', hideInSearch: true, hideInTable: !(currentUser?.UserPattern === 1000 && selectTab === 2), align: 'left', width: 320, render: (_, record) => { return
{ record.BID_STATE === 9000 ?
{record.WinSupplier}
:
{record.SUPPLIER_NAME}
{record.SUPPLIER_NAME}
}
} }, { title:
状态
, dataIndex: 'BID_STATE', width: 100, hideInSearch: true, align: 'center', filters: true, onFilter: true, valueEnum: { 2000: '报价中', 3000: '比价中', }, render: (_, record) => { return
{record.BID_STATE === 2000 ? '报价中' : record.BID_STATE === 3000 ? '比价中' : '已审结'}
} }, { title:
操作
, dataIndex: '', hideInSearch: true, width: 100, align: 'center', render: (_, record) => { return <> { setShowDetailDrawer(true) setCurrentItem(record) }}>详情 { selectTab === 1 && currentUser?.UserPattern === 1000 ? { const data = await handleDeleteBIDList({ BIDId: record.BID_ID }) if (data.Result_Code === 100) { message.success(data.Result_Desc) tableRef.current?.reload() } else { message.error(data.Result_Desc) } }} okText="确认" cancelText="取消" > 删除 : '' } } }, ] // 供应商查看资质的方法 const handleSearchQualification = (name: string) => { if (supplierList && supplierList.length > 0) { supplierList.forEach((item: any) => { if (item.label === name.split('(未参加)')[0]) { setSupplierId(item.value) } }) } setQualification(true) } return (
比价审批 {/* 搜索的内容 */}
{ setSearchName(e.target.value) }} />
比价时间: { if (e) { setSearchTime([moment(e[0]._d), moment(e[1]._d)]) } else { setSearchTime(null) } }} />
配送时间: { if (e) { setDeliveryTime([moment(e[0]._d), moment(e[1]._d)]) } else { setDeliveryTime(null) } }} />
{/* 页面内容 */}
{ tabList.map((item: any) => { return
{ setSelectTab(item.value) tableRef.current?.reload() }}> {item.label} { item.number ? ({item.number}) : '' }
}) }
{ navList.map((item: any) => { return
{item.label} {item.value}
}) }
{ const req = { SearchParameter: { SUPPLIER_IDS: currentUser?.UserPattern === 4000 ? currentUser?.SupplierID : '', SERVERPART_IDS: '', BID_STATES: '', STAFF_ID: currentUser?.UserPattern === 1000 ? currentUser?.ID : '', START_DATE_End: searchTime && searchTime.length > 0 ? moment(searchTime[0]).format('YYYY-MM-DD') : '', END_DATE_Start: searchTime && searchTime.length > 0 ? moment(searchTime[1]).format('YYYY-MM-DD') : '', EFFECT_STARTDATE_End: deliveryTime && deliveryTime.length > 0 ? moment(deliveryTime[1]).format('YYYY-MM-DD') : '', EFFECT_ENDDATE_Start: deliveryTime && deliveryTime.length > 0 ? moment(deliveryTime[0]).format('YYYY-MM-DD') : '', // OPERATE_DATE_Start:searchTime && searchTime.length>0?moment(searchTime[0]).format('YYYY-MM-DD'):'', // OPERATE_DATE_End:searchTime && searchTime.length>0?moment(searchTime[1]).format('YYYY-MM-DD'):'', SELLER_ID: currentUser?.UserPattern === 1000 ? currentUser?.SellerId : '' }, keyWord: { // , key: 'BID_NAME,SUPPLIER_NAME,BID_DESC,COMMODITY_NAME,SERVERPART_NAME', value: searchName || '', }, PageIndex: 1, PageSize: 999999, Province_Code: currentUser?.ProvinceCode, ShowWholePower: true, sortStr: 'OPERATE_DATE desc' } const data = await handleBIDList(req) // 接口会返回两个list分别对应两个tab 先用一个数组把两个数组变成一个大数组 然后在里面进行切换就不用再调接口了 let allList = [] if (currentUser?.UserPattern === 1000) { allList = [data.bIDInModels, data.bIDMyModels] } else { allList = [data.bIDInModels, data.bIDWinModels, data.bIDFailModels] } // // 大数组赋值 // setTableAllList(allList) // // 显示数组的初始值 // setTableData(allList[selectTab - 1]) // 拿到一开始有初始数据的tab数组 对他进行赋值 让它括号内的数据可以显示 const newTableList: any = JSON.parse(JSON.stringify(tabList)) newTableList.forEach((item: any) => { if (item.label === '待办事项') { item.number = data.bIDInModels?.length || 0 } else if (item.label === '我的申请') { item.number = data.bIDMyModels?.length || 0 } else if (item.label === '中标项目') { item.number = data.bIDWinModels?.length || 0 } else if (item.label === '未中标项目') { item.number = data.bIDFailModels?.length || 0 } }) // 添加数字之后的tab列表赋值 setTabList(newTableList) // 表格上方那个总览框的初始数据 并对齐进行赋值 const navDetail: any = JSON.parse(JSON.stringify(navList)) navDetail.forEach((item: any) => { if (item.label === '总业务') { item.value = data.TotalCount } else if (item.label === '在招标') { item.value = data.InBidCount } else if (item.label === '比价中') { item.value = data.SelectBidCount } else if (item.label === '已完成') { item.value = data.CompleteBidCount } }) setNavList(navDetail) return { data: allList[selectTab - 1], success: true } }} search={false} options={false} scroll={{ y: 'calc(100vh - 525px)' }} pagination={{ pageSize: 10 }} >
{/* 编辑比价申请 */} { setCurrentItem(undefined); setShowDetailDrawer(false); setCurrentItem(null) }} destroyOnClose={true} bodyStyle={{ backgroundColor: "#f9f9f9", padding: 0 }} footer={ // 当状态是9000的时候说明已经审结了 就不会显示按钮 currentItem?.BID_STATE !== 9000 ? // 当用户为1000时 说明是商户 显示对应的按钮 另一个是4000的情况 currentUser?.UserPattern === 1000 ?
{/* */}
:
: '' } closable={false} zIndex={99} > {/* 抽屜内显示的东西变为一个组件 往里面传参就可以 */}
{/* 新增比价申请 */} { setCurrentItem(undefined); setShowAddDrawer(false); }} zIndex={29} destroyOnClose={true} bodyStyle={{ backgroundColor: "#f9f9f9", padding: 0 }} footer={ // 新增只有商户可以 所以直接写死 无需判断
} closable={false} >
{/* 上传资质时供应商有了的资质 */} { setQualification(false) setSupplierId(null) }} footer={null} destroyOnClose={true} bodyStyle={{ padding: 0 }} width={1200} onOk={() => { }}> {/* 资质的东西 看一下资质列表 */} { const searchReq = { SearchParameter: { SUPPLIER_ID: supplierId || currentUser?.SupplierID, BUSINESSMAN_ID: currentUser?.OwnerUnitId, }, PageIndex: 1, PageSize: 9999 } const data = await handleQualificationList(searchReq) return data }} pagination={{ defaultPageSize: 10 }} toolbar={{ actions: supplierId ? [] : [ ] }} /> {/* 提交比价的时候出现的选择供应商的悬浮框 */} { setSubmitModal(false) setSubmitSupplierID(null) }} destroyOnClose={true} bodyStyle={{ padding: 0 }} width={600} onOk={async () => { if (submitSupplierID) { const req = { BID_ID: currentItem.BID_ID, SUPPLIER_ID: submitSupplierID } const data = await handleCompareSubmit(req) message.success(data.Result_Desc); if (data.Result_Code === 100) { actionRef.current?.reload() tableRef.current?.reload() setSubmitModal(false) setSubmitSupplierID(null) setCurrentItem(undefined); setShowDetailDrawer(false); setCurrentItem(null) } } else { message.error('请选择供应商') } }}>

请选择供应商

{/* 上传资质里面的新增或者编辑 */} { setCurrentRow(null) setFileList([]) setAddQualification(false) qualificationFormRef.current?.resetFields(); }, destroyOnClose: true }} // onVisibleChange={(value) => { // setAddQualification(value); // console.log('value',value) // console.log('currentRow',currentRow) // if (value) { // qualificationFormRef.current?.setFieldsValue( // currentRow || { QUALIFICATION_STATE: 1 }, // ); // } else { // qualificationFormRef.current?.resetFields(); // setFileList([]) // setCurrentRow(undefined); // } // }} onFinish={(values) => { let req = { ...values, QUALIFICATION_STATE: values.QUALIFICATION_STATE ? 1 : 0, SUPPLIER_CODE: currentUser?.SupplierID, BUSINESSMAN_ID: currentUser?.OwnerUnitId, SUPPLIER_ID: currentUser?.SupplierID, // SUPPLIER_NAME:'', STAFF_ID: currentUser?.ID, // STAFF_NAME:'', // OPERATE_DATE:'' } if (currentRow) { // 编辑数据 // req = { ...currentRow, ...req }; req = Object.assign(currentRow, req); req = { ...req, QUALIFICATION_ENDDATE: values.QUALIFICATION_ENDDATE, ISSUING_DATE: values.ISSUING_DATE } } updateQualification(req).then((result: any) => { if (result.Result_Code === 100) { const waitUpload = fileList.filter(n => n.status !== 'done') if (waitUpload.length > 0) { customUploadRequest(waitUpload, result.Result_Data?.QUALIFICATION_ID).then((uploadSuccess: any) => { if (uploadSuccess) { if (actionSupplierRef.current) { actionSupplierRef.current?.reload() } setAddQualification(false) qualificationFormRef.current?.resetFields(); setFileList([]) message.success(result.Result_Desc) return true } return false }) } else { setAddQualification(false) actionSupplierRef.current?.reload() message.success(result.Result_Desc) setCurrentRow(null) setFileList([]) } } else { message.error(result.Result_Desc) } }) }} > {/* 都是资质页面的老东西 直接复制的 */}
{ } }} request={async () => { return await getFieldEnum({ FieldExplainField: 'QUALIFICATION_TYPE' }) }} /> { } }} /> { } }} /> { }} /> { }, customRequest: ({ file, onSuccess }) => { // 自定义上传,不实际发送请求 setTimeout(() => { if (onSuccess) { onSuccess({}); } }, 0); }, beforeUpload: (file, files) => { setFileList([...fileList, ...files]) return false }, onChange: async (info: any) => { if (info.file.status === 'removed') { // 如果在待上传列表中找到,则说明当前图片没有上传服务器,可直接删除 const index = fileList.findIndex(n => n.uid === info.file.uid); if (!info.file?.deletepath) { const newFileList = fileList.slice(); newFileList.splice(index, 1); setFileList(newFileList) return } confirm({ title: '确认删除该文件吗?', icon: , async onOk() { const deleteLoading = message.loading('正在删除...') // const success = await deletePicture(info.file?.deletepath, info.file?.uid, 'QUALIFICATION') const success = await deleteAHYDPicture(info.file?.deletepath, info.file?.uid, 'QUALIFICATION') deleteLoading() if (success) { const files = [...fileList] files.splice(index, 1) setFileList(files) } else { message.error("删除失败") } }, onCancel() { }, }); } } }} />
{/* 上传资质里面的详情抽屉 */} { setCurrentRow(undefined); setFileList([]); setShowCurrentDetail(false); }} closable={false} > {currentRow?.QUALIFICATION_NAME && (<> column={1} title={currentRow?.QUALIFICATION_NAME} request={async () => ({ data: currentRow || {}, })} params={{ id: currentRow?.QUALIFICATION_ID, }} columns={columns as ProDescriptionsItemProps[]} /> )}
资质文件
{ currentRow?.ImgList ? : '-' }
) } export default connect(({ user }: ConnectState) => ({ currentUser: user?.currentUser }))(SupplierList)