import React, { useEffect, useRef, useState } from "react"; import ProForm, { ProFormSelect, ProFormText, ProFormTextArea } from "@ant-design/pro-form"; import { Col, Drawer, FormInstance, Row, Table, Typography, Space, Button, Empty, Divider, Input, message, Select, Modal, Tooltip, ConfigProvider, DatePicker } from "antd"; import { connect } from "umi"; import { ActionType, ProTable } from "@ant-design/pro-components"; import { handleGetAPPLYAPPROVEList, handleGetBILLDETAILList, handleSynchroBILLDETAILList } from "@/pages/DigitalElectronics/service"; import moment from "moment"; import { encryptAES } from "@/utils/handleAes"; import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun"; import { getFieldEnum } from "@/pages/serverpartAssets/service"; import RealEstate from "@/pages/realEstate"; import { handleGetREALESTATEList } from "@/pages/realEstate/service"; import zhCN from 'antd/locale/zh_CN'; import dayjs from "dayjs"; import 'dayjs/locale/zh-cn'; import weekday from "dayjs/plugin/weekday"; import localeData from "dayjs/plugin/localeData"; import customParseFormat from 'dayjs/plugin/customParseFormat'; import updateLocale from 'dayjs/plugin/updateLocale'; dayjs.extend(updateLocale); dayjs.updateLocale('zh-cn', { weekStart: 0, }); dayjs.extend(weekday); dayjs.extend(localeData); dayjs.extend(customParseFormat); const { Text } = Typography; interface ConnectState { user: { data: any }; } interface ParamsType { showDetail: boolean; setShowDetail: (v: boolean) => void; parentRow: any; setParentRow: (v: any) => void; parentTableRef?: any; // 父表格实例 showType?: string; // 没值 开票审核页面 search 票据查询页面 } const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, parentTableRef, showType }: ParamsType) => { const realEstateRef = useRef(); const formRef = useRef>(); const detailActionRef = useRef(); const { RangePicker } = DatePicker; // 保存的加载效果 const [saveLoading, setSaveLoading] = useState(false) // 明细表格默认隐藏的内容 const [columnsStateMap, setColumnsStateMap] = useState({ INVOICE_PRICE: { show: false }, INVOICE_DISCOUNT: { show: false }, }); useEffect(() => { if (formRef.current) { if (parentRow) { formRef.current.setFieldsValue(parentRow); } else { formRef.current.resetFields(); } } }, [parentRow]); const [reqDetailList, setReqDetailList] = useState(); // 合计项数据源 // 判断是否进入了编辑状态 const [isEdit, setIsEdit] = useState(false); // 表格数据 const [tableEditData, setTableEditData] = useState(); // 税率枚举列表 const [taxRateList, setTaxRateList] = useState(); // 不动产信息 const [realEstateData, setRealEstateData] = useState(); // 选择不动产的悬浮框 const [selectRealEstateModal, setSelectRealEstateModal] = useState(); // 选择的不动产id const [selectRealEstateId, setSelectRealEstateId] = useState(); // 选择不动产的loading const [realEstateLoading, setRealEstateLoading] = useState(false); // 当前发票明细 点击的行的信息 const [currentRow, setCurrentRow] = useState(); // 解析不动产的枚举 const [realEstateEnum, setRealEstateEnum] = useState(); // 判断当前的发票明细里面 有没有不动产 const [haveRealEstate, setHaveRealEstate] = useState(false) const detailColumns: any = [ { title: "序号", dataIndex: "index", valueType: "index", align: 'center', width: 70, fixed: 'left' }, { title:
款项名称
, align: 'left', width: 200, dataIndex: "ITEM_NAME", ellipsis: true, fixed: 'left' }, { title:
税务代码
, align: 'left', width: 180, dataIndex: "TABLE_NAME", fixed: 'left', ellipsis: true, render: (_, record) => { const currentItem = tableEditData?.find((item: any) => item.BILLDETAIL_ID === record.BILLDETAIL_ID) || record; return isEdit ? { let value: string = e.target.value || "" let tableData: any = JSON.parse(JSON.stringify(tableEditData)) tableData.forEach((item: any) => { if (item.BILLDETAIL_ID === record.BILLDETAIL_ID) { item.TABLE_NAME = value } }) setTableEditData(tableData) }} /> : currentItem.TABLE_NAME } }, { title:
租赁日期
, dataIndex: "LEASEDATE", width: 200, align: 'center', hideInTable: !haveRealEstate && showType === 'search', render: (_, record) => { const currentItem = tableEditData?.find((item: any) => item.BILLDETAIL_ID === record.BILLDETAIL_ID) || record; return isEdit ? { console.log('eee', e); let [start, end] = [moment(e[0].$d).format('YYYY-MM-DD'), moment(e[1].$d).format('YYYY-MM-DD')] console.log('2321321', [start, end]); let tableData: any = JSON.parse(JSON.stringify(tableEditData)) console.log('tableDatatableData', tableData); tableData.forEach((item: any) => { if (item.BILLDETAIL_ID === record.BILLDETAIL_ID) { item.START_LEASEDATE = start item.END_LEASEDATE = end } }) setTableEditData(tableData) }} /> : `${record?.START_LEASEDATE || ""}${record?.END_LEASEDATE ? `-${record?.END_LEASEDATE}` : ''}` } }, { title:
税率
, align: 'center', width: 70, fixed: 'left', dataIndex: "DUTY_PARAGRAPH", render: (_, record) => { const currentItem = tableEditData?.find((item: any) => item.BILLDETAIL_ID === record.BILLDETAIL_ID) || record; return isEdit ? { let value: string = e.target.value || "" let tableData: any = JSON.parse(JSON.stringify(tableEditData)) tableData.forEach((item: any) => { if (item.BILLDETAIL_ID === record.BILLDETAIL_ID) { item.ITEM_RULE = value } }) setTableEditData(tableData) }} /> : currentItem.ITEM_RULE } }, { title:
计量单位
, align: 'center', width: 80, dataIndex: "ITEM_UNIT", ellipsis: true, render: (_, record) => { const currentItem = tableEditData?.find((item: any) => item.BILLDETAIL_ID === record.BILLDETAIL_ID) || record; return isEdit ? { let value: string = e.target.value || "" let tableData: any = JSON.parse(JSON.stringify(tableEditData)) tableData.forEach((item: any) => { if (item.BILLDETAIL_ID === record.BILLDETAIL_ID) { item.ITEM_UNIT = value } }) setTableEditData(tableData) }} /> : currentItem.ITEM_UNIT } }, { title:
数量
, align: 'right', width: 60, valueType: 'digit', dataIndex: "INVOICE_COUNT" }, { title:
单价
, align: 'right', width: 80, valueType: 'digit', dataIndex: "INVOICE_PRICE" }, { title:
金额
, align: 'right', width: 80, valueType: 'digit', dataIndex: "INVOICE_AMOUNT" }, { title:
税额
, align: 'right', width: 80, valueType: 'digit', dataIndex: "INVOICE_TAX" }, { title:
折扣
, align: 'center', width: 80, dataIndex: "INVOICE_DISCOUNT" }, { title: "不动产", dataIndex: "option", width: 70, align: 'center', hideInTable: !haveRealEstate && showType === 'search', render: (_: any, record: any) => { return record?.REALESTATE_ID ? { setCurrentRow(record) setSelectRealEstateId([Number(record?.REALESTATE_ID)]) setSelectRealEstateModal(true) }}> {realEstateEnum && realEstateEnum[record?.REALESTATE_ID] ? realEstateEnum[record?.REALESTATE_ID] : record?.REALESTATE_ID} : showType === 'search' ? '' : } } // { // title:
操作时间
, // align: 'center', // width: 150, // dataIndex: "OPERATE_DATE", // render: (_, record) => { // return record?.OPERATE_DATE ? moment(record?.OPERATE_DATE).format('YYYY-MM-DD HH:mm:ss') : "" // } // }, ]; const approveColumns: any = [ { title:
环节名称
, width: 200, align: 'center', dataIndex: "ACTINST_NAME", }, { title:
票据状态
, width: 150, dataIndex: "APPROVE_STATE", align: 'center', valueType: 'select', fieldProps: { options: [ { label: "填写中", value: 1000 }, { label: "待审核", value: 2000 }, { label: "开票中", value: 9000 }, { label: "手动开票", value: 9100 }, { label: "已开票", value: 9200 }, { label: "红冲申请中", value: 9990 }, { label: "已红冲", value: 9999 } ] } }, { title:
审批人
, dataIndex: "STAFF_NAME", align: 'center', width: 150, }, { title:
审批时间
, dataIndex: "APPROVE_DATE", align: 'center', width: 150, render: (_, record) => { return record?.APPROVE_DATE ? moment(record?.APPROVE_DATE).format('YYYY-MM-DD HH:mm:ss') : "-" } }, { title:
审批意见
, dataIndex: "APPROVE_INFO", ellipsis: true } ]; // 不动产列表配置 const realEstateColumns: any = [ { title: "服务区名称", dataIndex: "SERVERPART_NAME", hideInSearch: true, ellipsis: true, width: 180, align: 'center' }, { title: "不动产类型", dataIndex: "REALESTATE_TYPE", width: 150, valueType: "select", align: 'center', valueEnum: { 1000: "房屋租赁", 2000: "车辆资产", } }, { title: "产权证号", dataIndex: "ESTATE_IDENTITY", hideInSearch: true, ellipsis: true, width: 150, align: 'center', }, { title: "资料编码", dataIndex: "SPECIALINDUSTRY_NUMBER", hideInSearch: true, ellipsis: true, width: 150, align: 'center', }, { title: "省份名称", dataIndex: "PROVINCE_NAME", hideInSearch: true, ellipsis: true, width: 150, align: 'center' }, { title: "城市名称", dataIndex: "CITY_NAME", hideInSearch: true, ellipsis: true, width: 150, align: 'center' }, { title: "详细地址", dataIndex: "REALESTATE_ADDRESS", hideInSearch: true, ellipsis: true, width: 180, align: 'center' }, { title: "是否跨地", dataIndex: "CROSS_CITYSIGN", hideInSearch: true, ellipsis: true, width: 120, align: 'center', render: (_: any, record: any) => { return record?.CROSS_CITYSIGN ? "是" : "否" } }, { title: "面积单位", dataIndex: "AREA_UNIT", hideInSearch: true, ellipsis: true, width: 120, align: 'center', valueType: "select", valueEnum: { 1: "平方千米", 2: "平方米", 3: "公顷", 4: "亩", 5: "h㎡", 6: "k㎡", 7: "㎡" } }, { title: "租赁期限", dataIndex: "LEASEDATE", hideInSearch: true, ellipsis: true, width: 250, align: 'center', render: (_: any, record: any) => { return `${record?.START_LEASEDATE || ""}${record?.END_LEASEDATE ? `-${record?.END_LEASEDATE}` : ''}` } } ] // 保存税务代码触发的事件 const handleSaveTaxCode = async () => { // 当前的表格数据 let newreqResult: any = { name: "", value: encryptAES(JSON.stringify({ list: tableEditData })) } setSaveLoading(true) const data = await handleSynchroBILLDETAILList(newreqResult) setSaveLoading(false) if (data.Result_Code === 100) { message.success('同步成功!') setIsEdit(false) detailActionRef.current?.reload() } else { message.error(data.Result_Desc) } } // 拿到选择的不动产 给表格显示 const handleGetSelectRealEstate = (data: any) => { setRealEstateData(data) } // 获取到这个服务区的全部 不动产信息 并给枚举的解析赋值 const handleGetThisServerpartRealEstateData = async () => { const req: any = { searchParameter: { SERVERPART_IDS: "", REALESTATE_STATE: 1 }, PageIndex: 1, PageSize: 999999, } let newReq: any = { name: "", value: encryptAES(JSON.stringify(req)) } const data: any = await handleGetREALESTATEList(newReq) console.log('datadatadata', data); let obj: any = {} if (data && data.length > 0) { data.forEach((item: any) => { obj[item.REALESTATE_ID] = item.ESTATE_IDENTITY }) } setRealEstateEnum(obj) return data } return ( { setShowDetail(false); setParentRow(undefined); setIsEdit(false) setTableEditData(null) }} bodyStyle={{ padding: '0 24px 24px' }} destroyOnClose > {/* 统一 labelCol 宽度:通过 formProps 设置 */} {/* 第一行:三列(每列 span=8) */} 票据基本信息 {/* */} {/* */} 收票方 {/* 第二行 */} 查看发票图片 ) : '', }} /> {/* 发票明细 */}
发票明细 { selectRealEstateModal ? '' : { // 调用一次 获取这个服务区里面的全部 不动产信息 handleGetThisServerpartRealEstateData() // 拿到发票明细 const billDetail = await handleGetBILLDETAILList({ SearchParameter: { BILL_ID: parentRow?.BILL_ID }, PageIndex: 1, PageSize: 999999, SortStr: "BILLDETAIL_ID" }) if (billDetail && billDetail.length > 0) { setTableEditData(billDetail) setReqDetailList(billDetail) console.log('billDetailbillDetailbillDetail', billDetail); // 因为要给原先的 不动产信息赋值租赁时间 所以先取出全部的 不动产id let allREALESTATE_ID: string = '' billDetail.forEach((item: any) => { if (item.REALESTATE_ID) { if (allREALESTATE_ID) { allREALESTATE_ID += `,${item.REALESTATE_ID}` } else { allREALESTATE_ID = `${item.REALESTATE_ID}` } } }) console.log('allREALESTATE_IDallREALESTATE_ID', allREALESTATE_ID); // 看看有没有不动产信息 if (allREALESTATE_ID) { setHaveRealEstate(true) } else { setHaveRealEstate(false) } // 请求到的当前的全部不动产信息 const req: any = { searchParameter: { REALESTATE_IDS: allREALESTATE_ID, REALESTATE_STATE: 1 }, PageIndex: 1, PageSize: 999999, } let newReq: any = { name: "", value: encryptAES(JSON.stringify(req)) } const data: any = await handleGetREALESTATEList(newReq) // 然后去找一样的不动产id 去匹配上 租赁时间的值 billDetail.forEach((item: any) => { data.forEach((subItem: any) => { if (Number(item.REALESTATE_ID) === Number(subItem.REALESTATE_ID) && !item.START_LEASEDATE && !item.END_LEASEDATE) { item.START_LEASEDATE = subItem.START_LEASEDATE item.END_LEASEDATE = subItem.END_LEASEDATE } }) }) console.log('最终的结果 ', billDetail); return { data: billDetail, success: true } } return { data: [], success: true } }} columnsState={{ value: columnsStateMap, onChange: setColumnsStateMap, }} toolbar={{ actions: [ <> { parentRow?.BILL_STATE <= 2000 ? <> { isEdit && parentRow?.BILL_STATE < 9000 ? <> : } : "" } , ] }} /> }
{/* 不动产信息 */} {/*
不动产信息
{ if (selectRealEstateId && selectRealEstateId.length > 0) { const req: any = { searchParameter: { REALESTATE_IDS: selectRealEstateId.toString() }, PageIndex: 1, PageSize: 999999, } let newReq: any = { name: "", value: encryptAES(JSON.stringify(req)) } const data: any = await handleGetREALESTATEList(newReq) if (data && data.length > 0) { return { data, success: true } } return { data: [], success: true } } else { return { data: [], success: true } } }} columnsState={{ value: columnsStateMap, onChange: setColumnsStateMap, }} toolbar={{ actions: [ <> { parentRow?.BILL_STATE <= 2000 ? : '' } ] }} />
*/} {/* 审批意见 */}
审批意见 { // 拿个税率的枚举 const taxRateLabel: any = await getFieldEnum({ FieldExplainField: 'DUTY_PARAGRAPH', notformate: true }) setTaxRateList(taxRateLabel) const req: any = { SearchParameter: { APPROVE_TYPE: parentRow?.BILL_ID,// 票的id APPROVE_DESC: "T_BILL" }, PageIndex: 1, PageSize: 999999, SortStr: "APPROVE_DATE desc" } let reqData: any = { name: "", value: encryptAES(JSON.stringify(req)) } const data = await handleGetAPPLYAPPROVEList(reqData) if (data && data.length > 0) { return { data, success: true } } return { data: [], success: true } }} />
{/* 不动产的悬浮框 */} { setSelectRealEstateModal(false) }} confirmLoading={realEstateLoading} bodyStyle={{ height: '700px', // 你可以根据需要调整高度 overflowY: 'auto', }} footer={showType === 'search' ? '' :
} onOk={async () => { }} >
); }; export default connect(({ user }: ConnectState) => ({ currentUser: user.data }))(InvoiceDetail);