This commit is contained in:
ylj20011123 2026-02-06 09:47:13 +08:00
parent 9a63d91801
commit 3357d03316
7 changed files with 498 additions and 192 deletions

View File

@ -14,6 +14,7 @@
"antd": "^5.21.2", "antd": "^5.21.2",
"axios": "^1.7.7", "axios": "^1.7.7",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
"dayjs": "1.11.13",
"dva": "^3.0.0-alpha.1", "dva": "^3.0.0-alpha.1",
"exceljs": "^4.4.0", "exceljs": "^4.4.0",
"moment": "^2.30.1", "moment": "^2.30.1",

BIN
src/21/~$打印表单.docx Normal file

Binary file not shown.

View File

@ -10,6 +10,8 @@ import { encryptAES } from "@/utils/handleAes";
import { ProForm, ProFormSelect, ProFormTextArea } from "@ant-design/pro-components"; import { ProForm, ProFormSelect, ProFormTextArea } from "@ant-design/pro-components";
import InvoiceDetial from "../redReversal/components/InvoiceDetial"; import InvoiceDetial from "../redReversal/components/InvoiceDetial";
import { handleGetREALESTATEList } from "../realEstate/service"; import { handleGetREALESTATEList } from "../realEstate/service";
import { handleGetServerpartDDL } from "../serverpartAssets/service";
import useRequest from "@ahooksjs/use-request";
interface ConnectState { interface ConnectState {
user: { user: {
@ -63,6 +65,25 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => {
BANK_NAME: { show: false }, BANK_NAME: { show: false },
BANK_ACCOUNT: { show: false }, BANK_ACCOUNT: { show: false },
}); });
// 搜索的全部服务区
const [serverPartObj, setServerPartObj] = useState<any>({})
const { loading, data: serverpart } = useRequest(async () => {
const req: any = {
ProvinceCode: "530000",
ServerpartType: "1000,1001,1010,2000,3000,4000,5000"
}
const data = await handleGetServerpartDDL(req)
let obj: any = {}
if (data && data.length > 0) {
data.forEach((item: any) => {
obj[item.value] = item.label
})
}
setServerPartObj(obj)
return data
})
const columns: any = [ const columns: any = [
{ {
@ -81,6 +102,20 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => {
placeholder: "请输入含税开票金额", placeholder: "请输入含税开票金额",
} }
}, },
{
title: '服务区名称',
dataIndex: 'SERVERPART_IDS',
width: 150,
align: 'center',
ellipsis: true,
hideInTable: true,
valueType: 'select',
valueEnum: serverPartObj,
fieldProps: {
showSearch: true,
filterOption: (input, option) => (option?.label ?? '').toLowerCase().includes(input.toLowerCase())
}
},
{ {
title: '服务区名称', title: '服务区名称',
dataIndex: 'SERVERPART_NAME', dataIndex: 'SERVERPART_NAME',
@ -113,6 +148,14 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => {
} }
}, },
// { // {
// title: "原单据号",
// dataIndex: "ORIBILL_NO",
// width: 180,
// align: 'center',
// ellipsis: true,
// hideInSearch: true
// },
// {
// title: '流水号', // title: '流水号',
// dataIndex: 'SERIAL_NO', // dataIndex: 'SERIAL_NO',
// width: 180, // width: 180,
@ -441,8 +484,6 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => {
}) })
} }
let obj: any = { let obj: any = {
billNo: record?.BILL_NO ? `HC-${record?.BILL_NO}` : "", // 单据编号 billNo: record?.BILL_NO ? `HC-${record?.BILL_NO}` : "", // 单据编号
billDate: moment(record?.BILL_DATE).format('YYYY-MM-DD'), // 单据日期 billDate: moment(record?.BILL_DATE).format('YYYY-MM-DD'), // 单据日期
@ -665,7 +706,7 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => {
includeTaxFlag: record?.ACCOUNTED_TYPE,// 判断是否含税 includeTaxFlag: record?.ACCOUNTED_TYPE,// 判断是否含税
autoInvoice: "1",// 自动开票标记 autoInvoice: "1",// 自动开票标记
invoiceType: record?.BILL_TYPE == 1000 ? '08xdp' : record?.BILL_TYPE == 2000 ? '10xdp' : '', //发票种类 invoiceType: record?.BILL_TYPE == 1000 ? '08xdp' : record?.BILL_TYPE == 2000 ? '10xdp' : '', //发票种类
invoiceProperty: record?.BILL_TYPE === 3000 ? '1' : '0', //发票属性
buyerTaxpayerId: cleanString(record?.TAXPAYER_IDENTIFYCODE),// 购方税号 buyerTaxpayerId: cleanString(record?.TAXPAYER_IDENTIFYCODE),// 购方税号
buyerName: record?.MERCHANTS_NAME, // 购买方名称 buyerName: record?.MERCHANTS_NAME, // 购买方名称
buyerProperty: "0", // 购买方性质 0-企业1-个人2-非企业单位 buyerProperty: "0", // 购买方性质 0-企业1-个人2-非企业单位
@ -1089,12 +1130,13 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => {
const value = sorter[n] const value = sorter[n]
return value ? `${n} ${value.replace('end', '')}` : '' return value ? `${n} ${value.replace('end', '')}` : ''
}) })
console.log('userInfouserInfo', userInfo);
// 获取票据信息表列表 // 获取票据信息表列表
const req: any = { const req: any = {
SearchParameter: { SearchParameter: {
SERVERPART_IDS: userInfo?.ServerpartIds, SERVERPART_IDS: params?.SERVERPART_IDS || userInfo?.ServerpartIds,
BILL_STATES: "2000,9000", BILL_STATES: "2000,9000",
BILL_TYPES: "", BILL_TYPES: "",
INVOICE_TAXAMOUNT: params?.INVOICE_TAXAMOUNT || "" INVOICE_TAXAMOUNT: params?.INVOICE_TAXAMOUNT || ""

View File

@ -1142,7 +1142,7 @@ const InvoiceInquiry: React.FC<{ currentUser: any }> = (props) => {
</Modal> </Modal>
<InvoiceDetial showDetail={showDetailModal} setShowDetail={setShowDetailModal} parentRow={currentRow} setParentRow={setCurrentRow} /> <InvoiceDetial showDetail={showDetailModal} setShowDetail={setShowDetailModal} parentRow={currentRow} setParentRow={setCurrentRow} showType="search" />
</div> </div>
) )

View File

@ -5,21 +5,35 @@ import { ActionType, FormInstance, ProForm, ProFormDatePicker, ProFormDateRangeP
import { handleDeleteREALESTATE, handleGetREALESTATEList, handleSynchroREALESTATE } from "./service"; import { handleDeleteREALESTATE, handleGetREALESTATEList, handleSynchroREALESTATE } from "./service";
import moment from "moment"; import moment from "moment";
import { encryptAES } from "@/utils/handleAes"; import { encryptAES } from "@/utils/handleAes";
import { Button, Col, message, Modal, Row } from "antd"; import { Button, Col, ConfigProvider, DatePicker, message, Modal, Row } from "antd";
import zhCN from 'antd/locale/zh_CN';
import ModalFooter from "./components/modalFooter"; import ModalFooter from "./components/modalFooter";
import { handleGetPassportInfoById } from "../DigitalElectronics/service"; import { handleGetPassportInfoById } from "../DigitalElectronics/service";
// 引入地址解析工具 // 引入地址解析工具
import { handleAddressChange, parseAddress } from "@/utils/addressParser"; import { handleAddressChange, parseAddress } from "@/utils/addressParser";
import { handleGetServerpartDDL, handleGetServerpartInfo, handleGetServerpartTree } from "../serverpartAssets/service"; import { handleGetServerpartDDL, handleGetServerpartInfo, handleGetServerpartTree } from "../serverpartAssets/service";
import { handleGetSERVERPARTDetail } from "../operationReport/service"; import { handleGetSERVERPARTDetail } from "../operationReport/service";
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 RealEstate = ({ serverPartId, isComponent, onRef, selectRealEstateId, parentRow }: { serverPartId: string, isComponent: boolean, onRef?: any, selectRealEstateId?: any, parentRow?: any }) => {
const RealEstate = ({ serverPartId, isComponent, onRef, selectRealEstateId }: { serverPartId: string, isComponent: boolean, onRef?: any, selectRealEstateId?: any }) => {
const actionRef = useRef<ActionType>(); const actionRef = useRef<ActionType>();
const formRef = useRef<FormInstance>(); const formRef = useRef<FormInstance>();
const modalFormRef = useRef<FormInstance>(); const modalFormRef = useRef<FormInstance>();
const { RangePicker } = DatePicker;
// 树相关的属性和方法 // 树相关的属性和方法
const [selectedId, setSelectedId] = useState<string>() const [selectedId, setSelectedId] = useState<string>()
const [collapsible, setCollapsible] = useState<boolean>(false) const [collapsible, setCollapsible] = useState<boolean>(false)
@ -36,9 +50,12 @@ const RealEstate = ({ serverPartId, isComponent, onRef, selectRealEstateId }: {
// 悬浮框点击确认的按钮加载效果 // 悬浮框点击确认的按钮加载效果
const [confirmLoading, setConfirmLoading] = useState<boolean>(false) const [confirmLoading, setConfirmLoading] = useState<boolean>(false)
// 选中的行数据详情 // 选中的行数据详情
const [selectRowKey, setSelectRowKey] = useState<any>()
const [selectRowDetail, setSelectRowDetail] = useState<any>() const [selectRowDetail, setSelectRowDetail] = useState<any>()
// 当前服务区下的方位 // 当前服务区下的方位
const [SERVERPARTREGION, setSERVERPARTREGION] = useState<any>() const [SERVERPARTREGION, setSERVERPARTREGION] = useState<any>()
// 表格数据
const [tableData, setTableData] = useState<any>()
// 服务区列表 // 服务区列表
const [searchServerPartList, setSearchServerPartList] = useState<any>() const [searchServerPartList, setSearchServerPartList] = useState<any>()
const [columnsState, setColumnsState] = useState<any>({ const [columnsState, setColumnsState] = useState<any>({
@ -46,6 +63,8 @@ const RealEstate = ({ serverPartId, isComponent, onRef, selectRealEstateId }: {
CITY_NAME: { show: false }, CITY_NAME: { show: false },
SPECIALINDUSTRY_NUMBER: { show: false }, SPECIALINDUSTRY_NUMBER: { show: false },
}) })
// 当前组件的可以选择的全部服务区
const [currentServerPartList, setCurrentServerPartList] = useState<any>()
// 列表配置 // 列表配置
const columns: any = [ const columns: any = [
@ -102,7 +121,40 @@ const RealEstate = ({ serverPartId, isComponent, onRef, selectRealEstateId }: {
width: 250, width: 250,
align: 'center', align: 'center',
render: (_: any, record: any) => { render: (_: any, record: any) => {
return `${record?.START_LEASEDATE || ""}${record?.END_LEASEDATE ? `-${record?.END_LEASEDATE}` : ''}` return isComponent ?
<ConfigProvider locale={zhCN}>
<RangePicker
value={[record?.START_LEASEDATE ? dayjs(record.START_LEASEDATE) : null, record?.END_LEASEDATE ? dayjs(record.END_LEASEDATE) : null]}
onChange={(e: any) => {
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]);
console.log('tableDatatableData', tableData);
let list: any = JSON.parse(JSON.stringify(tableData))
list.forEach((item: any) => {
if (item.REALESTATE_ID === record.REALESTATE_ID) {
item.START_LEASEDATE = start
item.END_LEASEDATE = end
}
})
setTableData(list)
}}
/>
</ConfigProvider>
// <ProForm
// submitter={false}
// initialValues={{ LEASEDATE: [moment(record?.START_LEASEDATE).format('YYYY-MM-DD'), moment(record?.END_LEASEDATE).format('YYYY-MM-DD')] }}
// >
// <ProFormDateRangePicker name="LEASEDATE" fieldProps={{
// format: 'YYYY-MM-DD',
// onChange: (e: any) => {
// 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]);
// }
// }} />
// </ProForm>
: `${record?.START_LEASEDATE || ""}${record?.END_LEASEDATE ? `-${record?.END_LEASEDATE}` : ''}`
} }
}, },
@ -326,17 +378,44 @@ const RealEstate = ({ serverPartId, isComponent, onRef, selectRealEstateId }: {
setSearchServerPartList(data) setSearchServerPartList(data)
} }
// 遍历找出全部type为1 的
const collectTypeOne = (list: any) => {
const result: any = [];
function dfs(arr: any) {
if (!Array.isArray(arr)) return;
arr.forEach(item => {
if (item && item.type === 1) {
result.push(item);
}
// 关键:层级不确定,递归遍历
if (Array.isArray(item?.children)) {
dfs(item.children);
}
});
}
dfs(list);
return result;
}
useEffect(() => { useEffect(() => {
if (!isComponent) {
if (isFirst) { if (isFirst) {
handleGetUserInfo() handleGetUserInfo()
setIsFirst(false) setIsFirst(false)
handleGetServerPartList() handleGetServerPartList()
} }
}
}, []) }, [])
useImperativeHandle(onRef, () => ({ useImperativeHandle(onRef, () => ({
selectRowDetail selectRowKey,
selectRowDetail,
tableData
})); }));
return <div style={{ height: isComponent ? '600px' : 'calc(100vh - 100px)', backgroundColor: '#fff', display: 'flex' }}> return <div style={{ height: isComponent ? '600px' : 'calc(100vh - 100px)', backgroundColor: '#fff', display: 'flex' }}>
@ -358,15 +437,18 @@ const RealEstate = ({ serverPartId, isComponent, onRef, selectRealEstateId }: {
columns={columns} columns={columns}
bordered bordered
rowKey={'REALESTATE_ID'} rowKey={'REALESTATE_ID'}
scroll={{ x: '100%', y: isComponent ? '400px' : 'calc(100vh - 450px)' }} scroll={{ x: '100%', y: isComponent ? '370px' : 'calc(100vh - 450px)' }}
headerTitle={'不动产列表'} headerTitle={'不动产列表'}
// search={isComponent && Number(serverPartId) !== 1269 ? false : { span: 6 }} // search={isComponent && Number(serverPartId) !== 1269 ? false : { span: 6 }}
search={isComponent ? false : { span: 6 }} // search={isComponent ? false : { span: 6 }}
search={{ span: 6 }}
dataSource={tableData}
request={async (params) => { request={async (params) => {
// 如果是组件的话 它下面的服务区 可能是单个服务区 或者是 一个片区下面的全部服务区 // 如果是组件的话 它下面的服务区 可能是单个服务区 或者是 一个片区下面的全部服务区
let isComponentSelect = '' let isComponentSelect = ''
// 服务区详情的信息 // 服务区详情的信息
let detail: any = {} let detail: any = {}
console.log('paramsparamsparamsparams', params);
if (!isComponent) { if (!isComponent) {
if (!selectedId) { if (!selectedId) {
@ -376,46 +458,52 @@ const RealEstate = ({ serverPartId, isComponent, onRef, selectRealEstateId }: {
console.log('selectRealEstateIdselectRealEstateId', selectRealEstateId); console.log('selectRealEstateIdselectRealEstateId', selectRealEstateId);
console.log('paramsparamsparamsparams', params); console.log('paramsparamsparamsparams', params);
console.log('serverPartIdserverPartIdserverPartId', serverPartId); console.log('serverPartIdserverPartIdserverPartId', serverPartId);
setSelectRowKey(selectRealEstateId)
if (isFirst) {
// 先调用一下服务区详情 判断是管理单元 还是服务区 // 先调用一下服务区详情 判断是管理单元 还是服务区
detail = await handleGetSERVERPARTDetail({ SERVERPARTId: serverPartId }) detail = await handleGetSERVERPARTDetail({ SERVERPARTId: serverPartId })
console.log('detaildetaildetaildetail', detail); console.log('detaildetaildetaildetail', detail);
let nowShowSelectServerPartList: any = []
// 先判断一下 是服务区还是管理单元 1000 说明是服务区 那么直接去请求即可 // 先判断一下 是服务区还是管理单元 1000 说明是服务区 那么直接去请求即可
if (Number(detail.STATISTICS_TYPE) === 1000) { if (Number(detail.STATISTICS_TYPE) === 1000) {
isComponentSelect = serverPartId isComponentSelect = serverPartId
nowShowSelectServerPartList.push({
label: detail.SERVERPART_NAME,
value: Number(detail.SERVERPART_ID)
})
} else { } else {
// 如果不是 那么就拿它的片区id 去请求下面的全部服务区 当作选择了的服务区id // 如果不是 那么就拿它的片区id 去请求下面的全部服务区 当作选择了的服务区id
const serverPart: any = await handleGetServerpartTree({ const serverPart: any = await handleGetServerpartTree({
ProvinceCode: "530000", ProvinceCode: "530000",
SPRegionType_ID: detail.SPREGIONTYPE_ID, SPRegionType_ID: detail.SPREGIONTYPE_ID,
ServerpartType: 1000, ServerpartType: "1000,1001,1010,2000,3000,4000,5000",
StatisticsType: 1000 StatisticsType: 1000
}) })
console.log('serverPartserverPartserverPart', serverPart); console.log('serverPartserverPartserverPart', serverPart);
if (serverPart && serverPart.length > 0) { if (serverPart && serverPart.length > 0) {
serverPart.forEach((item: any) => { const selectedIds = collectTypeOne(serverPart)
if (item.children && item.children.length > 0) { console.log('selectedIdsselectedIds', selectedIds);
item.children.forEach((subItem: any) => { isComponentSelect = selectedIds.map((n: any) => n?.value)?.toString() || ''
if (isComponentSelect) { setSelectedId(isComponentSelect)
isComponentSelect += `,${subItem.value}`
} else { if (selectedIds && selectedIds.length > 0) {
isComponentSelect = `${subItem.value}` selectedIds.forEach((item: any) => {
} nowShowSelectServerPartList.push({
label: item.label,
value: Number(item.value)
}) })
}
}) })
} }
} }
}
console.log('isComponentSelectisComponentSelectisComponentSelect', isComponentSelect);
// if (selectRealEstateId && selectRealEstateId.length > 0) { formRef.current?.setFieldsValue({ serverPartId: Number(detail.SERVERPART_ID) })
setSearchServerPartList(nowShowSelectServerPartList)
setIsFirst(false)
setCurrentServerPartList(isComponentSelect)
}
// } else {
// if (Number(serverPartId) === 1269 && params?.serverPartId) {
// } else {
// return []
// }
// }
} }
console.log('isComponentSelectisComponentSelect', isComponentSelect); console.log('isComponentSelectisComponentSelect', isComponentSelect);
@ -423,7 +511,9 @@ const RealEstate = ({ serverPartId, isComponent, onRef, selectRealEstateId }: {
const req: any = { const req: any = {
searchParameter: { searchParameter: {
REALESTATE_TYPE: isComponent ? '' : params?.REALESTATE_TYPE || "",// 不动产类型 REALESTATE_TYPE: isComponent ? '' : params?.REALESTATE_TYPE || "",// 不动产类型
SERVERPART_IDS: isComponent ? isComponentSelect : selectedId, // 当不是组件的时候 就根据左侧选择的服务区 selectedId
// 是组件的时候 如果选择的服务区里面有值 那就按照选择的走 没有值的话 就按照 当前片区的默认权限请求服务区 isComponentSelect是仅第一次生效 currentServerPartList是存好了的 之后生效
SERVERPART_IDS: isComponent ? params?.serverPartId ? params?.serverPartId : isComponentSelect ? isComponentSelect : currentServerPartList : selectedId,
// START_LEASEDATE_End: isComponent ? '' : params?.END_LEASEDATE_Start || "", // START_LEASEDATE_End: isComponent ? '' : params?.END_LEASEDATE_Start || "",
// END_LEASEDATE_Start: isComponent ? '' : params?.START_LEASEDATE_End || "", // END_LEASEDATE_Start: isComponent ? '' : params?.START_LEASEDATE_End || "",
REALESTATE_STATE: 1, REALESTATE_STATE: 1,
@ -445,8 +535,30 @@ const RealEstate = ({ serverPartId, isComponent, onRef, selectRealEstateId }: {
const data: any = await handleGetREALESTATEList(newReq) const data: any = await handleGetREALESTATEList(newReq)
console.log('datadatadata', data); console.log('datadatadata', data);
if (data && data.length > 0) { if (data && data.length > 0) {
console.log('parentRowparentRow', parentRow);
if (parentRow) {
let NewData: any = []
data.forEach((item: any) => {
if (Number(item.REALESTATE_ID) === Number(parentRow.REALESTATE_ID)) {
item = {
...item,
...parentRow,
REALESTATE_ID: Number(parentRow.REALESTATE_ID)
}
NewData.push(item)
} else {
NewData.push(item)
}
})
console.log('NewDataNewData', NewData);
setTableData(NewData)
return { data: NewData, success: true }
} else {
setTableData(data)
return { data, success: true } return { data, success: true }
} }
}
setTableData([])
return { data: [], success: true } return { data: [], success: true }
}} }}
rowSelection={isComponent ? { rowSelection={isComponent ? {
@ -455,8 +567,19 @@ const RealEstate = ({ serverPartId, isComponent, onRef, selectRealEstateId }: {
onChange: (_, row) => { onChange: (_, row) => {
console.log('__', _); console.log('__', _);
console.log('row', row); console.log('row', row);
setSelectRowKey(_)
setSelectRowDetail(row) // // 确保取最新的数据 不拿row 拿tableData
// let list: any = JSON.parse(JSON.stringify(tableData))
// let newRow: any = {}
// list.forEach((item: any) => {
// if (item.REALESTATE_ID === row[0].REALESTATE_ID) {
// newRow = item
// }
// })
// console.log('newRownewRow', newRow);
// setSelectRowDetail(newRow)
} }
} : false} } : false}
toolbar={{ toolbar={{

View File

@ -1,6 +1,6 @@
import React, { useEffect, useRef, useState } from "react"; import React, { useEffect, useRef, useState } from "react";
import ProForm, { ProFormSelect, ProFormText, ProFormTextArea } from "@ant-design/pro-form"; 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 } from "antd"; 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 { connect } from "umi";
import { ActionType, ProTable } from "@ant-design/pro-components"; import { ActionType, ProTable } from "@ant-design/pro-components";
import { handleGetAPPLYAPPROVEList, handleGetBILLDETAILList, handleSynchroBILLDETAILList } from "@/pages/DigitalElectronics/service"; import { handleGetAPPLYAPPROVEList, handleGetBILLDETAILList, handleSynchroBILLDETAILList } from "@/pages/DigitalElectronics/service";
@ -10,7 +10,20 @@ import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun";
import { getFieldEnum } from "@/pages/serverpartAssets/service"; import { getFieldEnum } from "@/pages/serverpartAssets/service";
import RealEstate from "@/pages/realEstate"; import RealEstate from "@/pages/realEstate";
import { handleGetREALESTATEList } from "@/pages/realEstate/service"; 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; const { Text } = Typography;
interface ConnectState { interface ConnectState {
@ -23,13 +36,16 @@ interface ParamsType {
parentRow: any; parentRow: any;
setParentRow: (v: any) => void; setParentRow: (v: any) => void;
parentTableRef?: any; // 父表格实例 parentTableRef?: any; // 父表格实例
showType?: string; // 没值 开票审核页面 search 票据查询页面
} }
const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, parentTableRef }: ParamsType) => { const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, parentTableRef, showType }: ParamsType) => {
const realEstateRef = useRef<any>(); const realEstateRef = useRef<any>();
const formRef = useRef<FormInstance<any>>(); const formRef = useRef<FormInstance<any>>();
const detailActionRef = useRef<ActionType>(); const detailActionRef = useRef<ActionType>();
const { RangePicker } = DatePicker;
// 保存的加载效果 // 保存的加载效果
const [saveLoading, setSaveLoading] = useState<boolean>(false) const [saveLoading, setSaveLoading] = useState<boolean>(false)
// 明细表格默认隐藏的内容 // 明细表格默认隐藏的内容
@ -65,7 +81,8 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
const [currentRow, setCurrentRow] = useState<any>(); const [currentRow, setCurrentRow] = useState<any>();
// 解析不动产的枚举 // 解析不动产的枚举
const [realEstateEnum, setRealEstateEnum] = useState<any>(); const [realEstateEnum, setRealEstateEnum] = useState<any>();
// 判断当前的发票明细里面 有没有不动产
const [haveRealEstate, setHaveRealEstate] = useState<boolean>(false)
const detailColumns: any = [ const detailColumns: any = [
{ {
@ -107,10 +124,43 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
}} /> : currentItem.TABLE_NAME }} /> : currentItem.TABLE_NAME
} }
}, },
{
title: <div style={{ textAlign: 'center' }}></div>,
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 ?
<ConfigProvider locale={zhCN}>
<RangePicker
defaultValue={[currentItem?.START_LEASEDATE ? dayjs(currentItem.START_LEASEDATE) : null, currentItem?.END_LEASEDATE ? dayjs(currentItem.END_LEASEDATE) : null]}
onChange={(e: any) => {
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)
}}
/>
</ConfigProvider>
:
`${record?.START_LEASEDATE || ""}${record?.END_LEASEDATE ? `-${record?.END_LEASEDATE}` : ''}`
}
},
{ {
title: <div style={{ textAlign: 'center' }}></div>, title: <div style={{ textAlign: 'center' }}></div>,
align: 'center', align: 'center',
width: 80, width: 70,
fixed: 'left', fixed: 'left',
dataIndex: "DUTY_PARAGRAPH", dataIndex: "DUTY_PARAGRAPH",
render: (_, record) => { render: (_, record) => {
@ -138,7 +188,7 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
{ {
title: <div style={{ textAlign: 'center' }}></div>, title: <div style={{ textAlign: 'center' }}></div>,
align: 'left', align: 'left',
width: 120, width: 100,
fixed: 'left', fixed: 'left',
dataIndex: "ITEM_ID", dataIndex: "ITEM_ID",
ellipsis: true ellipsis: true
@ -146,7 +196,7 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
{ {
title: <div style={{ textAlign: 'center' }}></div>, title: <div style={{ textAlign: 'center' }}></div>,
align: 'center', align: 'center',
width: 120, width: 80,
dataIndex: "ITEM_RULE", dataIndex: "ITEM_RULE",
ellipsis: true, ellipsis: true,
render: (_, record) => { render: (_, record) => {
@ -168,7 +218,7 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
{ {
title: <div style={{ textAlign: 'center' }}></div>, title: <div style={{ textAlign: 'center' }}></div>,
align: 'center', align: 'center',
width: 100, width: 80,
dataIndex: "ITEM_UNIT", dataIndex: "ITEM_UNIT",
ellipsis: true, ellipsis: true,
render: (_, record) => { render: (_, record) => {
@ -190,7 +240,7 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
{ {
title: <div style={{ textAlign: 'center' }}></div>, title: <div style={{ textAlign: 'center' }}></div>,
align: 'right', align: 'right',
width: 80, width: 60,
valueType: 'digit', valueType: 'digit',
dataIndex: "INVOICE_COUNT" dataIndex: "INVOICE_COUNT"
}, },
@ -224,8 +274,9 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
{ {
title: "不动产", title: "不动产",
dataIndex: "option", dataIndex: "option",
width: 80, width: 70,
align: 'center', align: 'center',
hideInTable: !haveRealEstate && showType === 'search',
render: (_: any, record: any) => { render: (_: any, record: any) => {
return record?.REALESTATE_ID ? return record?.REALESTATE_ID ?
<a onClick={() => { <a onClick={() => {
@ -234,7 +285,7 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
setSelectRealEstateModal(true) setSelectRealEstateModal(true)
}}> }}>
{realEstateEnum && realEstateEnum[record?.REALESTATE_ID] ? realEstateEnum[record?.REALESTATE_ID] : record?.REALESTATE_ID} {realEstateEnum && realEstateEnum[record?.REALESTATE_ID] ? realEstateEnum[record?.REALESTATE_ID] : record?.REALESTATE_ID}
</a> : </a> : showType === 'search' ? '' :
<Tooltip title={"选择不动产"}> <Tooltip title={"选择不动产"}>
<Button type={'primary'} onClick={async () => { <Button type={'primary'} onClick={async () => {
console.log('选择不动产', record); console.log('选择不动产', record);
@ -455,11 +506,12 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
}) })
} }
setRealEstateEnum(obj) setRealEstateEnum(obj)
return data
} }
return ( return (
<Drawer <Drawer
width="80%" width="90%"
open={showDetail} open={showDetail}
title="票据详情" title="票据详情"
onClose={() => { onClose={() => {
@ -497,14 +549,14 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
<Col span={8}> <Col span={8}>
<ProFormText name="BILL_NO" label="票据编号" readonly /> <ProFormText name="BILL_NO" label="票据编号" readonly />
<ProFormText name="SERVERPARTSHOP_NAME" label="门店" readonly /> <ProFormText name="SERIAL_NO" label="流水号" readonly />
<ProFormText name="BILL_AMOUNT" label="除税开票金额" readonly /> <ProFormText name="BILL_AMOUNT" label="除税开票金额" readonly />
<ProFormText name="BILL_DATE" label="申请日期" readonly /> <ProFormText name="BILL_DATE" label="申请日期" readonly />
</Col> </Col>
<Col span={8}> <Col span={8}>
<ProFormText name="SERIAL_NO" label="流水号" readonly /> <ProFormText name="ORIBILL_NO" label="原单据号" readonly />
<ProFormSelect name="BILL_STATE" label="票据状态" readonly fieldProps={{ <ProFormSelect name="BILL_STATE" label="票据状态" readonly fieldProps={{
options: [ options: [
{ label: "填写中", value: 1000 }, { label: "填写中", value: 1000 },
@ -576,12 +628,12 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
</Col> </Col>
</Row> </Row>
{/* 发票明细 */} {/* 发票明细 */}
<div style={{ marginTop: 24 }}> <div style={{ marginTop: 24 }}>
<Space direction="vertical" style={{ width: '100%' }}> <Space direction="vertical" style={{ width: '100%' }}>
<Text strong></Text> <Text strong></Text>
{
selectRealEstateModal ? '' :
<ProTable <ProTable
actionRef={detailActionRef} actionRef={detailActionRef}
search={false} search={false}
@ -596,6 +648,7 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
request={async () => { request={async () => {
// 调用一次 获取这个服务区里面的全部 不动产信息 // 调用一次 获取这个服务区里面的全部 不动产信息
handleGetThisServerpartRealEstateData() handleGetThisServerpartRealEstateData()
// 拿到发票明细 // 拿到发票明细
const billDetail = await handleGetBILLDETAILList({ const billDetail = await handleGetBILLDETAILList({
SearchParameter: { SearchParameter: {
@ -611,6 +664,52 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
setReqDetailList(billDetail) setReqDetailList(billDetail)
console.log('billDetailbillDetailbillDetail', 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: billDetail, success: true }
} }
return { data: [], success: true } return { data: [], success: true }
@ -657,6 +756,8 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
] ]
}} }}
/> />
}
</Space> </Space>
</div> </div>
@ -776,33 +877,68 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
setSelectRealEstateModal(false) setSelectRealEstateModal(false)
}} }}
confirmLoading={realEstateLoading} confirmLoading={realEstateLoading}
bodyStyle={{
onOk={async () => { height: '700px', // 你可以根据需要调整高度
// 已经开票申请了的 就不能改变不动产数据了 overflowY: 'auto',
if (parentRow?.BILL_STATE > 2000) { }}
setCurrentRow(undefined) footer={showType === 'search' ? '' : <div>
<Button onClick={() => {
setSelectRealEstateModal(false) setSelectRealEstateModal(false)
setRealEstateLoading(false) }}></Button>
return <Button loading={realEstateLoading} style={{ marginLeft: '8px' }} type={'primary'} onClick={async () => {
// 已经开票申请了的 就不能改变不动产数据了
// if (parentRow?.BILL_STATE > 2000) {
// setCurrentRow(undefined)
// setSelectRealEstateModal(false)
// setRealEstateLoading(false)
// return
// }
// let data = realEstateRef?.current?.selectRowDetail
let data: any = []
let nowSelectKey: any = realEstateRef?.current?.selectRowKey
let nowTableData: any = realEstateRef?.current?.tableData
if (nowTableData && nowTableData.length > 0) {
nowTableData.forEach((item: any) => {
if (item.REALESTATE_ID === nowSelectKey[0]) {
data = [item]
}
})
} }
let data = realEstateRef?.current?.selectRowDetail console.log('datadasds', data);
// 开始保存内容 // 开始保存内容
handleGetSelectRealEstate(data) handleGetSelectRealEstate(data)
if (tableEditData && tableEditData.length > 0) { if (tableEditData && tableEditData.length > 0) {
setRealEstateLoading(true) setRealEstateLoading(true)
let list: any = JSON.parse(JSON.stringify(tableEditData)) let list: any = JSON.parse(JSON.stringify(tableEditData))
let idList: any = [] let idList: any = []
// 因为 我们选择的 租赁开始结束时间在 data 中
// 但是实际的list 是来自tableEditData 所以得根据id拼进去 造一个对应id 对应的 租赁时间的对象
let leaseObj: any = {}
if (data && data.length > 0) { if (data && data.length > 0) {
idList = data.map((item: any) => Number(item.REALESTATE_ID)) idList = data.map((item: any) => Number(item.REALESTATE_ID))
data.forEach((item: any) => {
leaseObj[item.REALESTATE_ID] = {
START_LEASEDATE: item.START_LEASEDATE,
END_LEASEDATE: item.END_LEASEDATE
} }
})
}
console.log('leaseObjleaseObj', leaseObj);
list.forEach((item: any) => { list.forEach((item: any) => {
if (item.REALESTATE_ID === currentRow?.REALESTATE_ID) { if (item.REALESTATE_ID === currentRow?.REALESTATE_ID) {
item.REALESTATE_ID = idList && idList.length > 0 ? Number(idList.toString()) : "" item.REALESTATE_ID = idList && idList.length > 0 ? Number(idList.toString()) : ""
item.START_LEASEDATE = leaseObj[item.REALESTATE_ID]?.START_LEASEDATE
item.END_LEASEDATE = leaseObj[item.REALESTATE_ID]?.END_LEASEDATE
} }
}) })
setSelectRealEstateId(idList) setSelectRealEstateId(idList)
console.log('listlistlist', list);
let newreqResult: any = { let newreqResult: any = {
name: "", name: "",
value: encryptAES(JSON.stringify({ list: list })) value: encryptAES(JSON.stringify({ list: list }))
@ -821,9 +957,13 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow, par
} }
setSelectRealEstateModal(false) setSelectRealEstateModal(false)
setRealEstateLoading(false) setRealEstateLoading(false)
}}></Button>
</div>}
onOk={async () => {
}} }}
> >
<RealEstate serverPartId={parentRow?.SERVERPART_ID} isComponent={true} onRef={realEstateRef} selectRealEstateId={selectRealEstateId} /> <RealEstate serverPartId={parentRow?.SERVERPART_ID} isComponent={true} onRef={realEstateRef} selectRealEstateId={selectRealEstateId} parentRow={currentRow} showType={'search'} />
</Modal> </Modal>
</Drawer> </Drawer>
); );

View File

@ -5005,7 +5005,7 @@ data-view-byte-offset@^1.0.1:
es-errors "^1.3.0" es-errors "^1.3.0"
is-data-view "^1.0.1" is-data-view "^1.0.1"
dayjs@^1.11.10, dayjs@^1.11.11, dayjs@^1.11.7: dayjs@1.11.13, dayjs@^1.11.10, dayjs@^1.11.11, dayjs@^1.11.7:
version "1.11.13" version "1.11.13"
resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c"
integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==