2025-06-13 19:18:28 +08:00

1245 lines
60 KiB
TypeScript

/*
* @Author: cclu 1106109051@qq.com
* @Date: 2024-08-13 18:25:53
* @LastEditors: cclu 1106109051@qq.com
* @LastEditTime: 2025-01-02 10:11:42
* @FilePath: \cloud-platform\src\pages\reports\settlementAccount\component\monthExamine.tsx
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { connect } from "umi";
import type { ConnectState } from "@/models/connect";
import ProTable, { ActionType } from "@ant-design/pro-table";
import { useImperativeHandle, useRef, useState } from "react";
import { Col, Drawer, FormInstance, message, Modal, Row, Spin } from "antd";
import moment from 'moment'
import session from "@/utils/session";
import { handleGetAPPROVALROUTEDetail, handleGetGetBUSINESSAPPROVALDetail, handleGetProjectAccountList, handleGetProjectPeriodAccount, handleGetTableRevenueRecognition, } from "../../ShopExpenseDetail/service";
import { handleGetMonthAccountProinst } from "@/pages/examine/examineList/service";
import useRequest from '@ahooksjs/use-request'; // 请求数据的引用
import { handleGetAPPROVALROUTEList } from "@/pages/Setting/serviceConfig/service";
import numeral from 'numeral'
import ProjectEditor from "@/pages/BussinessProject/editor";
import ProjectDetail from '@/pages/BussinessProject/detail'
import CompareList from "../../revenueConfirmation/components/compareList";
import MonthExamineProcess from "./monthExamineProcess";
import ProForm, { ProFormSelect, ProFormTextArea } from "@ant-design/pro-form";
import { handleGetBUSINESSAPPROVALDetail } from "@/pages/examine/monthSettlement/service";
import { handleApproveMAPList } from "../service";
import printIcon from '@/assets/ai/printIcon.png'
import LoadingBox from "../../Finance/businessAnalysis/components/loading";
import { getMoney, handleFormatNumber } from "@/services/options";
import { handleNewPrint, wrapTreeNode } from "@/utils/format";
import PrintContent from "./printContent";
import { handleGetProjectPeriodIncome } from "../../revenueConfirmation/components/service";
import { handleRejectMonthAccountProinst } from "@/pages/examine/reconciliationApproval/base/service";
type DetailProps = {
searchParams: any
parentRow: any
examineState: any
searchContent: any
currentUser?: any
parentRef?: any // 父级表格
isChangeFile?: any // 判断附件是否能删除
endReject?: any // 办结后撤回
}
const MonthExamine = ({ searchParams, parentRow, examineState, searchContent, currentUser, parentRef, isChangeFile, endReject }: DetailProps) => {
const actionRef = useRef<ActionType>();
const formRef = useRef<FormInstance>();
const formRejectRef = useRef<any>();
const batchFormRef = useRef<FormInstance>();
// 月度状态的对象
const [monthStateObj, setMonthStateObj] = useState<any>()
// 默认展开的数据
const [defaultExpand, setDefaultExpand] = useState<any>()
// 点击行的数据
const [currentRow, setCurrentRow] = useState<any>()
// 显示添加项目功能
const [modalVisible, handleModalVisible] = useState<boolean>(false) // 是否显示编辑
// 出来项目详情的抽屉
const [showProjectDrawer, setShowProjectDrawer] = useState<boolean>(false)
// 当前状态
const [currentApprovalstate, setCurrentApprovalstate] = useState<any>()
// 月度结算抽屉
const [showDetailDrawer, setShowDetailDrawer] = useState<boolean>(false)
// 当前月份
const [monthTime, setMonthTime] = useState<any>()
// 显示批量审批
const [batchModal, setBatchModal] = useState<boolean>(false)
// 批量审批的加载
const [batchLoading, setBatchLoading] = useState<boolean>(false)
// 下一状态
const [currentNextState, setCurrentNextState] = useState<any>()
// 当前状态
const [currentNowState, setCurrentNowState] = useState<any>()
// 导出报表的表格数据
const [printData, setPrintData] = useState<any>()
// 导出的合计行数据
const [exportSumRow, setExportSumRow] = useState<any>()
// 复核驳回的悬浮框
const [reviewRejected, setReviewRejected] = useState<boolean>(false)
// 打印的加载效果
const [printLoading, setPrintLoading] = useState<boolean>(false)
// 加载服务区树
const { loading: stateLoading, data: busninessState = [] } = useRequest(async () => {
const req: any = {
SearchParameter: {
APPROVALROUTE_VALID: 1,
OPERATION_TYPES: 12
},
SortStr: 'APPROVALROUTE_STATE asc',
PageIndex: 1,
PageSize: 999999
}
const data = await handleGetAPPROVALROUTEList(req)
if (data && data.length > 0) {
const list: any = []
data.forEach((item: any) => {
list.push({ label: item.APPROVALROUTE_NAME, value: item.APPROVALROUTE_STATE })
})
list.push({ label: '已审结', value: 9000 })
list.push({ label: '已驳回', value: 3000 })
let str: string = ''
list.forEach((item: any) => {
if (item.value === 3000) {
} else {
if (str) {
str += `,${item.value}`
} else {
str = item.value
}
}
})
console.log('list22', list);
if (list && list.length > 0) {
let obj: any = {}
list.forEach((item: any) => {
obj[item.value] = item.label
})
console.log('month', obj);
setMonthStateObj(obj)
}
}
})
// 打印的columns
const exportColumns: any = [
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'PeriodDescBig',
children: [
{
dataIndex: 'IndexStr',
title: <div style={{ textAlign: 'center' }}></div>,
align: 'center',
hideInSearch: true
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'IndexDesc',
align: 'left',
hideInSearch: true,
// render: (_, record) => {
// return record?.IndexDesc !== '合计' && record?.IndexDesc === '精算数据' ?
// <span>{`${record?.StartDate}-${record?.EndDate}`}</span> :
// <span>{`${record?.IndexDesc}`}</span>
// }
}
]
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'PeriodDescBig',
hideInSearch: true,
children: [
{
title: <div style={{ textAlign: 'center' }}>/</div>,
dataIndex: 'RENTFEE',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.RENTFEE ? handleFormatNumber(record?.RENTFEE) : '0.00'
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'GUARANTEERATIO',
hideInSearch: true,
align: 'right',
render: (_, record) => {
return record?.GUARANTEERATIO ? `${record?.GUARANTEERATIO}%` : ''
}
}
]
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'turnover',
hideInSearch: true,
children: [
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'CASHPAY_AMOUNT',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.CASHPAY_AMOUNT ? handleFormatNumber(record?.CASHPAY_AMOUNT) : '0.00'
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'MOBILEPAY_AMOUNT',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.MOBILEPAY_AMOUNT ? handleFormatNumber(record?.MOBILEPAY_AMOUNT) : '0.00'
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'REVENUEDAILY_AMOUNTTotal',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return <span>{record?.REVENUEDAILY_AMOUNTTotal ? handleFormatNumber(record?.REVENUEDAILY_AMOUNTTotal) : '0.00'}</span>
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'GUARANTEERATIOAMOUNT',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.GUARANTEERATIOAMOUNT ? handleFormatNumber(record?.GUARANTEERATIOAMOUNT) : '0.00'
}
// render: (_, record) => {
// return record.RevenueAmount * (record.GuaranteeRatio / 100)
// }
},
]
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'BANKACCOUNT_AMOUNT',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.BANKACCOUNT_AMOUNT ? handleFormatNumber(record?.BANKACCOUNT_AMOUNT) : '0.00'
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'ROYALTYTHEORYMUST',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.ROYALTYTHEORYMUST ? handleFormatNumber(record?.ROYALTYTHEORYMUST) : '0.00'
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'SHOPEXPENSE_AMOUNT',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.SHOPEXPENSE_AMOUNT ? handleFormatNumber(record?.SHOPEXPENSE_AMOUNT) : '0.00'
}
// render: (_, record) => {
// return numeral(record?.SHOPEXPENSE_AMOUNT).format('0,0.00')
// }
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'PAID_AMOUNTSum',
valueType: 'digit',
align: 'right',
hideInSearch: true,
// render: (_, record) => {
// return record?.PAID_AMOUNT || ''
// },
children: [
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'PAID_AMOUNT',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.PAID_AMOUNT ? handleFormatNumber(record?.PAID_AMOUNT) : '0.00'
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'PAID_AMOUNT_9010',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.PAID_AMOUNT_9010 ?
handleFormatNumber(record?.PAID_AMOUNT_9010)
: record?.PAID_AMOUNT_9010 === 0 ? <span style={{ color: 'red' }}>0.00</span> : ''
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'PAID_AMOUNT_9020',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.PAID_AMOUNT_9020 ?
handleFormatNumber(record?.PAID_AMOUNT_9020)
: record?.PAID_AMOUNT_9020 === 0 ? <span style={{ color: 'red' }}>0.00</span> : ''
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'PAID_AMOUNT_9030',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.PAID_AMOUNT_9030 ? handleFormatNumber(record?.PAID_AMOUNT_9030) : '0.00'
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'PAID_AMOUNT_9050',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
return record?.PAID_AMOUNT_9050 ?
handleFormatNumber(record?.PAID_AMOUNT_9050)
: record?.PAID_AMOUNT_9050 === 0 ? <span style={{ color: 'red' }}>0.00</span> : ''
}
}
]
},
{
title: <div style={{ textAlign: 'center' }}>退</div>,
dataIndex: 'RefundSupplement',
valueType: 'digit',
align: 'right',
hideInSearch: true,
render: (_, record) => {
const number: number = record?.BANKACCOUNT_AMOUNT - record?.RECEIVABLEAMOUNT - record?.SHOPEXPENSE_AMOUNT + record?.PAID_AMOUNT
return <span>{number ? handleFormatNumber(number) : '0.00'}</span>
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
width: 100,
dataIndex: 'desc',
valueType: 'digit',
align: 'right',
hideInSearch: true,
}
]
const columns: any = [
{
title: '统计时间',
dataIndex: 'search_date',
valueType: 'dateRange',
hideInTable: true,
hideInDescriptions: true,
initialValue: [moment(parentRow?.STARTDATE).format("YYYY-MM"), moment(searchParams?.EndDate).format('YYYY-MM')],
search: {
transform: (value: any) => {
return {
StartDate: value[0],
EndDate: value[1],
};
},
},
fieldProps: {
picker: "month",
format: 'YYYY-MM',
allowClear: true
// disabledDate: (current: any) => current && current > moment()
}
},
{
dataIndex: 'CURRENT_PERIOD',
title: <div style={{ textAlign: 'center' }}></div>,
align: 'center',
width: 140,
hideInSearch: true,
render: (_, record) => {
return record?.level === 1 ?
record?.CURRENT_PERIOD : record?.SETTLEMENT_DATE
}
},
{
dataIndex: 'SETTLEMENT_STATE',
title: <div style={{ textAlign: 'center' }}></div>,
align: 'center',
width: 120,
valueType: 'select',
valueEnum: {
'3': { text: '全部' },
'0': { text: '待结算' },
'1': { text: '已结算' },
'2': { text: '审批中' },
},
hideInSearch: true,
render: (_, record) => {
return record?.level === 1 ? record?.SETTLEMENT_STATE : record?.BUSINESSPROJECT_ID ?
record?.SETTLEMENT_STATE === 1 ?
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
<img style={{ marginRight: '8px', cursor: 'pointer', width: '16px', height: '16px' }} src={printIcon} onClick={() => {
console.log('record', record);
handlePrintReport(record)
}} />
<a style={{ color: 'red' }} onClick={() => {
console.log('record', record);
setCurrentApprovalstate(9)
setCurrentRow({
...record,
Approvalstate: 9,
startTime: record?.STARTDATE,
endTime: record?.ENDDATE,
ShopRoyaltyId: record?.SHOPROYALTY_ID,
BUSINESSPROJECT_ID: record?.BUSINESSPROJECT_ID,
Id: record?.SERVERPARTSHOP_ID,
SERVERPART_ID: record?.SERVERPART_ID,
STATISTICS_MONTH: record?.SETTLEMENT_DATE,
})
setMonthTime(record?.SETTLEMENT_DATE)
setShowDetailDrawer(true)
}}>
</a>
</div>
: record?.SETTLEMENT_STATE === 2 ?
<a onClick={() => {
console.log('record', record);
setCurrentApprovalstate(1)
setCurrentRow({
...record,
Approvalstate: 1,
startTime: record?.STARTDATE,
endTime: record?.ENDDATE,
ShopRoyaltyId: record?.SHOPROYALTY_ID,
BUSINESSPROJECT_ID: record?.BUSINESSPROJECT_ID,
Id: record?.SERVERPARTSHOP_ID,
SERVERPART_ID: record?.SERVERPART_ID,
STATISTICS_MONTH: record?.SETTLEMENT_DATE,
})
console.log('dsad', {
...record,
Approvalstate: 1,
startTime: record?.STARTDATE,
endTime: record?.ENDDATE,
ShopRoyaltyId: record?.SHOPROYALTY_ID,
BUSINESSPROJECT_ID: record?.BUSINESSPROJECT_ID,
Id: record?.SERVERPARTSHOP_ID,
SERVERPART_ID: record?.SERVERPART_ID,
STATISTICS_MONTH: record?.SETTLEMENT_DATE,
});
setMonthTime(record?.SETTLEMENT_DATE)
setShowDetailDrawer(true)
}} style={{ color: '#faad14' }}>
</a> :
record?.SETTLEMENT_STATE === 0 ?
<a onClick={() => {
setCurrentApprovalstate(0)
setCurrentRow({
...record,
Approvalstate: 0,
startTime: record?.STARTDATE,
endTime: record?.ENDDATE,
ShopRoyaltyId: record?.SHOPROYALTY_ID,
BUSINESSPROJECT_ID: record?.BUSINESSPROJECT_ID,
Id: record?.SERVERPARTSHOP_ID,
SERVERPART_ID: record?.SERVERPART_ID,
STATISTICS_MONTH: record?.SETTLEMENT_DATE,
})
setMonthTime(record?.SETTLEMENT_DATE)
setShowDetailDrawer(true)
}}></a>
: '' :
<a style={{ color: 'red' }} onClick={async () => {
handleModalVisible(true)
setCurrentRow({
...record,
SERVERPART_IDS: [Number(record?.SERVERPART_ID)],
serverpartShopIds: record?.SERVERPARTSHOP_ID ? record?.SERVERPARTSHOP_ID.split(',') : '',
projectRangeDate: [record?.PROJECT_STARTDATE, record?.PROJECT_ENDDATE],
})
}}></a>
}
},
{
dataIndex: 'BUSINESSPROJECT_NAME',
title: <div style={{ textAlign: 'center' }}></div>,
width: 250,
hideInSearch: true,
ellipsis: true,
render: (_, record) => {
return record?.level === 1 ?
<a onClick={() => {
console.log('r', record);
setCurrentRow(record)
setShowProjectDrawer(true)
}}>
{record?.BUSINESSPROJECT_NAME}
</a>
: ''
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'REVENUE_AMOUNT',
width: 120,
valueType: 'digit',
align: 'right',
hideInSearch: true,
hideInTable: true,
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'CURREVENUE_AMOUNT',
width: 120,
hideInSearch: true,
align: 'right',
valueType: 'digit',
render: (_, record) => {
return record.level === 1 ?
<>
{/* 批量审批的显示条件 这一期必须要已经是完整的一起 且 都是待审核中 且 不是商家 且 全部审批人都是同一个人 才会在这个人进入的时候显示按钮 */}
{/* appovedIdList 状态的数组 判断是不是全部是同一个状态 */}
{
record?.children && record?.children.length >= 12 && (Number(record?.pendingList.toString()) === Number(currentUser.ID)) && record?.appovedIdList && record?.appovedIdList.length === 1 && (Number(record?.appovedIdList.toString()) !== 9000) && (Number(record?.appovedIdList.toString()) !== 1000) ?
<a onClick={async () => {
setCurrentRow(record)
setBatchModal(true)
}}></a> : ''
}
{
record?.children && record?.children.length >= 12 && record?.appovedIdList && record?.appovedIdList.length === 1 && (Number(record?.appovedIdList.toString()) !== 1000)
&& currentUser?.UserPattern !== 2000 && record?.pendingList && record?.pendingList.length === 1 && (Number(record?.pendingList.toString()) === Number(currentUser.ID))
?
'' : ''
}
</>
: <span>{record?.CURREVENUE_AMOUNT ? numeral(record?.CURREVENUE_AMOUNT).format('0,0.00') : ''}</span>
}
},
{
title: <div style={{ textAlign: 'center' }}></div>,
dataIndex: 'SHOPEXPENSE_AMOUNT',
width: 120,
ellipsis: true,
align: 'right',
hideInSearch: true,
},
{
dataIndex: 'MERCHANTS_NAME',
title: <div style={{ textAlign: 'center' }}></div>,
ellipsis: true,
hideInSearch: true,
render: (_, record) => {
return record?.level === 1 ? record?.MERCHANTS_NAME :
record?.BusinessProcess_State ?
<div>
<span>{record?.BusinessProcess_State > 1000 && record?.BusinessProcess_State < 9000 ? `待审核:` : ''}</span>
<span style={{ color: '#ada7a7', fontStyle: 'italic' }}>{`${record?.ApproveStaff_Name || ''}${monthStateObj[record?.BusinessProcess_State]}`}</span>
</div>
: ''
}
},
{
dataIndex: 'SERVERPARTSHOP_NAME',
title: <div style={{ textAlign: 'center' }}></div>,
hideInSearch: true,
ellipsis: true,
render: (_, record) => {
return record?.level === 1 ? record?.SERVERPARTSHOP_NAME :
record?.Staff_Name ?
<span>
<span>{`发起人:`}</span>
<span style={{ color: '#ada7a7', fontStyle: 'italic' }}>{record?.Staff_Name ? record?.Staff_Name : ''}{record?.BusinessProcess_StartDate ? `${record?.BusinessProcess_StartDate}` : ''}</span>
</span> : ''
}
},
{
title: '操作',
hideInTable: !endReject,
dataIndex: 'option',
align: 'center',
render: (_, record) => {
return record?.level === 1 ? '' : <a onClick={() => {
console.log('record', record);
setCurrentRow(record)
setReviewRejected(true)
}}>
</a>
}
}
]
// 打印报表的方法
const handlePrintReport = async (obj: any) => {
setPrintLoading(true)
let res: any = []
const otherReq: any = {
ServerpartIds: obj?.SERVERPART_ID,
ShopRoyaltyId: obj?.SHOPROYALTY_ID,
BusinessProjectId: obj?.BUSINESSPROJECT_ID,
startDate: obj.SETTLEMENT_DATE ? moment(obj.SETTLEMENT_DATE).format('YYYYMM') : '',
endDate: obj.SETTLEMENT_DATE ? moment(obj.SETTLEMENT_DATE).format('YYYYMM') : '',
}
console.log('otherReq', otherReq);
const otherData = await handleGetTableRevenueRecognition(otherReq)
console.log('otherData', otherData);
if (otherData && otherData.length > 0) {
const list: any = wrapTreeNode(otherData)
let newObj: any = {}
if (list && list.length > 0) {
newObj = list[0].children[0].children[0]
}
console.log('newObj', newObj);
let [start, end] = newObj.IndexDesc.split('-')
let newIndexDesc: string = ''
let newEnd: string = ''
if (moment(obj.SETTLEMENT_DATE).format('YYYYMM') === moment(end).format('YYYYMM')) {
newEnd = moment(end).format('YYYY/MM/DD')
} else {
newEnd = moment(obj.SETTLEMENT_DATE).endOf('month').format('YYYY/MM/DD')
}
newIndexDesc = start + '-' + newEnd
newObj.IndexDesc = newIndexDesc
// 取现金 微支付 应收租金 应收费用 已缴费用
const incomeReq: any = {
BusinessProjectId: obj?.BUSINESSPROJECT_ID,
StatisticsMonth: obj?.SETTLEMENT_DATE ? moment(obj?.SETTLEMENT_DATE).format('YYYYMM') : '',
ShopRoyaltyId: obj?.SHOPROYALTY_ID,
}
const income = await handleGetProjectPeriodIncome(incomeReq)
console.log('income', income);
let incomObj: any = income[0]
newObj.CASHPAY_AMOUNT = incomObj.CASHPAY_AMOUNT
newObj.MOBILEPAY_AMOUNT = incomObj.MOBILEPAY_AMOUNT
newObj.ROYALTYTHEORYMUST = incomObj.RECEIVABLEAMOUNT
res = [newObj]
}
console.log('res', res);
setPrintData(res)
const req: any = {
BUSINESSAPPROVALId: obj?.BUSINESSAPPROVAL_ID
}
const data = await handleGetGetBUSINESSAPPROVALDetail(req)
// 给导出弄签字
const signature: any = {
financeName: '',// 财务部签名
financeRealName: '',// 财务部签名(只有人名)
developmentName: '',// 经发部签名
developmentRealName: '',// 经发部签名(只有人名)
directorName: '',// 中心主任签名
directorRealName: '',// 中心主任签名(只有人名)
centralFinanceName: '',// 中心财务签名
centralFinanceRealName: '',// 中心财务签名(只有人名)
operationsSuperName: '',// 中心经营主管签名
operationsSuperRealName: '',// 中心经营主管签名(只有人名)
areaManagerName: '',// 服务区经理签名
areaManagerRealName: '',// 服务区经理签名(只有人名)
confirmationName: '',// 商户确认签名
confirmationRealName: '',// 商户确认签名(只有人名)
developManagerName: data.STAFF_NAME,// 经发人签名
developManagerRealName: data.STAFF_NAME.split('【')[0] + ` ${data.BUSINESS_STARTDATE || ''}`,// 经发人签名(只有人名)
}
if (data.approveList && data.approveList.length > 0) {
data.approveList.forEach((item: any) => {
// if (item.APPLYAPPROVE_TYPE === 1000) {
// obj.developManagerName = item.STAFF_NAME
// obj.developManagerRealName = item.STAFF_NAME.split('【')[0] + ` ${item.APPLYAPPROVE_DATE}`
// } else
if (item.APPLYAPPROVE_TYPE === 2000) {
signature.confirmationName = item.STAFF_NAME
signature.confirmationRealName = item.STAFF_NAME.split('【')[0] + ` ${item.APPLYAPPROVE_DATE}`
} else if (item.APPLYAPPROVE_TYPE === 2010) {
signature.areaManagerName = item.STAFF_NAME
signature.areaManagerRealName = item.STAFF_NAME.split('【')[0] + ` ${item.APPLYAPPROVE_DATE}`
} else if (item.APPLYAPPROVE_TYPE === 2020) {
signature.operationsSuperName = item.STAFF_NAME
signature.operationsSuperRealName = item.STAFF_NAME.split('【')[0] + ` ${item.APPLYAPPROVE_DATE}`
} else if (item.APPLYAPPROVE_TYPE === 2030) {
signature.centralFinanceName = item.STAFF_NAME
signature.centralFinanceRealName = item.STAFF_NAME.split('【')[0] + ` ${item.APPLYAPPROVE_DATE}`
} else if (item.APPLYAPPROVE_TYPE === 2040) {
signature.directorName = item.STAFF_NAME
signature.directorRealName = item.STAFF_NAME.split('【')[0] + ` ${item.APPLYAPPROVE_DATE}`
} else if (item.APPLYAPPROVE_TYPE === 2050) {
signature.developmentName = item.STAFF_NAME
signature.developmentRealName = item.STAFF_NAME.split('【')[0] + ` ${item.APPLYAPPROVE_DATE}`
} else if (item.APPLYAPPROVE_TYPE === 2060) {
signature.financeName = item.STAFF_NAME
signature.financeRealName = item.STAFF_NAME.split('【')[0] + ` ${item.APPLYAPPROVE_DATE}`
}
})
}
let printName: string = `${obj?.SERVERPART_NAME}-${obj?.SERVERPARTSHOP_NAME}-${obj?.SETTLEMENT_DATE}月度结算`
let neckList: any = [
{ label: '管理中心', value: obj?.SPREGIONTYPE_NAME },
{ label: '服务区', value: obj?.SERVERPART_NAME },
{ label: '经营商户', value: obj?.MERCHANTS_NAME },
{ label: '门店名称', value: obj?.SERVERPARTSHOP_NAME },
{ label: '合同期限', value: `${obj?.PROJECT_STARTDATE ? `${moment(obj?.PROJECT_STARTDATE).format('YYYY.MM.DD')}` : ''}${obj?.PROJECT_ENDDATE ? `-${moment(obj?.PROJECT_ENDDATE).format('YYYY.MM.DD')}` : ''}` },
]
const styles = Array.from(document.styleSheets) // 获取页面的CSS样式
.map((sheet) =>
Array.from(sheet.cssRules).map((rule) => rule.cssText).join('\n')
)
.join('\n');
let originalTable: any = document.getElementsByClassName('monthExamineTestTable')[0] // 拿到要打印的数据表格
const clonedTable = originalTable.cloneNode(true) as HTMLElement;// 克隆表格元素,包括其子元素
// 修改克隆后的表格样式
clonedTable.style.display = 'block';
// 遍历克隆表格的 <th> 和 <td> 以及它们的所有子元素,设置字体大小为 16px
const setFontSizeRecursively = (element: HTMLElement) => {
element.style.fontSize = '10px'; // 设置字体大小为 16px
element.style.padding = '4px'; // 设置字体大小为 16px
Array.from(element.children).forEach((child) =>
setFontSizeRecursively(child as HTMLElement)
);
};
// 遍历克隆表格的 <th> 和 <td> 单元格,并设置字体大小为 16px
const tableCells = clonedTable.querySelectorAll('thead th, tbody td,tfoot td');
tableCells.forEach((cell) => setFontSizeRecursively(cell as HTMLElement));
// 获取克隆后的 HTML 内容
const clonedHTML = clonedTable.getElementsByClassName('ant-table-content')[0].innerHTML;
console.log('clonedHTML', clonedHTML);
const footer: string = `<div style="width:100%;box-sizing: border-box;padding: 12px 12px 12px 20px;">
<div style="width: 100%;display: flex;align-items: center;">
<div style="width: 33%;box-sizing: border-box;padding-left: 5%">
<span style="font-size: 14px;font-weight: 600;margin-right: 2px;">财务部:</span>
<span style="font-size: 12px;">${signature?.financeRealName || ''}</span>
</div>
<div style="width: 33%;box-sizing: border-box;padding-left: 5%">
<span style="font-size: 14px;font-weight: 600;margin-right: 2px;">经发部:</span>
<span style="font-size: 12px;">${signature?.developmentRealName || ''}</span>
</div>
<div style="width: 33%;box-sizing: border-box;padding-left: 5%">
<span style="font-size: 14px;font-weight: 600;margin-right: 2px;">中心主任:</span>
<span style="font-size: 12px;">${signature?.directorRealName || ''}</span>
</div>
</div>
<div style="width: 100%;display: flex;align-items: center;flex-wrap: wrap;">
<div style="width: 33%;box-sizing: border-box;padding-left: 5%">
<span style="font-size: 14px;font-weight: 600;margin-right: 2px;">中心财务:</span>
<span style="font-size: 12px;">${signature?.centralFinanceRealName || ''}</span>
</div>
<div style="width: 33%;box-sizing: border-box;padding-left: 5%">
<span style="font-size: 14px;font-weight: 600;margin-right: 2px;">中心经营主管:</span>
<span style="font-size: 12px;">${signature?.operationsSuperRealName || ''}</span>
</div>
<div style="width: 33%;box-sizing: border-box;padding-left: 5%">
<span style="font-size: 14px;font-weight: 600;margin-right: 2px;">服务区经理:</span>
<span style="font-size: 12px;">${signature?.areaManagerRealName || ''}</span>
</div>
</div>
<div style="width: 100%;display: flex;align-items: center;flex-wrap: wrap;">
<div style="width: 66%;box-sizing: border-box;padding-left: 5%">
<span style="font-size: 14px;font-weight: 600;margin-right: 2px;">商户确认:</span>
<span style="font-size: 12px;">${signature?.confirmationRealName || ''}</span>
</div>
<div style="width: 33%;box-sizing: border-box;padding-left: 5%">
<span style="font-size: 14px;font-weight: 600;margin-right: 2px;">发起人:</span>
<span style="font-size: 12px;">${signature?.developManagerRealName || ''}</span>
</div>
</div>
</div>`
setPrintLoading(false)
handleNewPrint(printName, `${obj?.BUSINESSPROJECT_NAME}结算表(${obj?.SETTLEMENT_DATE})月`, neckList, styles, clonedHTML, footer)
}
return (
<div style={{ position: 'relative' }}>
{
printLoading ?
<div style={{
position: 'absolute', width: '100%', height: '100%', background: 'rgba(0,0,0,0.1)', display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 5
}}>
<div style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
padding: '15px 20px 10px',
background: '#fff',
borderRadius: '8px',
width: '200px',
position: 'absolute',
top: '50%',
left: '50%',
zIndex: 6,
transform: 'translate(-50%,-50%)'
}}>
<Spin />
<span style={{ marginLeft: '5px' }}>{'加载打印内容中...'}</span>
</div>
</div> : ''
}
<ProTable
actionRef={actionRef}
formRef={formRef}
columns={columns}
bordered
rowKey={(record) => {
return `${record?.CURRENT_PERIOD}-${record?.level}-${record?.SETTLEMENT_DATE}`
}}
expandable={{
expandedRowKeys: defaultExpand,
onExpand: (expanded, record) => {
console.log('expanded', expanded);
console.log('record', record);
if (defaultExpand && defaultExpand.length > 0) {
// 展开还是闭合
if (expanded) {
// 展开
let old: any = JSON.parse(JSON.stringify(defaultExpand))
old.push(`${record?.CURRENT_PERIOD}-1-undefined`)
setDefaultExpand(old)
} else {
// 闭合
let old: any = JSON.parse(JSON.stringify(defaultExpand))
let newList: any = []
old.forEach((item: any) => {
console.log('item', item);
console.log('neew', `${record?.CURRENT_PERIOD}-1-undefined`);
if (item === `${record?.CURRENT_PERIOD}-1-undefined`) {
} else {
newList.push(item)
}
})
console.log('newList', newList);
setDefaultExpand(newList)
}
} else {
// 本身没有 那只能是新增
let old: any = []
old.push(`${record?.CURRENT_PERIOD}-1-undefined`)
setDefaultExpand(old)
}
}
}}
request={async (params) => {
const req = {
ServerpartId: parentRow?.SERVERPART_ID,
ServerpartShopId: parentRow?.SERVERPARTSHOP_ID,
StartDate: params?.StartDate ? moment(params?.StartDate).format('YYYYMM') : '',
EndDate: params?.EndDate ? moment(params?.EndDate).format('YYYYMM') : '',
SettlementMode: parentRow?.SETTLEMENT_MODES || '',
SettlementState: examineState === 0 ? '' : examineState,
SettlementType: 2,
PageIndex: 1,
PageSize: 999999,
SortStr: '',
SearchKeyValue: parentRow?.SERVERPARTSHOP_ID ? '' : parentRow?.MERCHANTS_NAME,
SearchKeyName: 'MERCHANTS_NAME'
}
const data = await handleGetProjectAccountList(req)
const stateReq: any = {
SearchParameter: {
BusinessProcess_StateSearch: "1000,2000,2010,2020,2030,2040,2050,2060,9000",
Operation_Type: 12,
Serverpart_IDS: parentRow?.SERVERPART_ID,
ServerpartShop_ID: parentRow?.SERVERPARTSHOP_ID,
PendState: 2
},
PageIndex: 1,
PageSize: 999999
}
const stateData = await handleGetMonthAccountProinst(stateReq)
console.log('stateData', stateData);
console.log('month', data);
if (data && data.length > 0) {
let res: any = []
let periodList: any = []
data.forEach((item: any) => {
if (periodList.indexOf(item.CURRENT_PERIOD) === -1) {
periodList.push(item.CURRENT_PERIOD)
}
if (stateData && stateData.length > 0) {
stateData.forEach((subItem: any) => {
if (subItem.BusinessApproval_ID === item.BUSINESSAPPROVAL_ID) {
item.ApproveStaff_Name = subItem.ApproveStaff_Name
item.BusinessProcess_State = subItem.BusinessProcess_State
item.Staff_Name = subItem.Staff_Name
item.Staff_ID = subItem.Staff_ID
item.BusinessProcess_StartDate = subItem.BusinessProcess_StartDate
}
})
}
})
console.log('periodList', periodList);
let defaultRow: any = []
periodList.forEach((item: any) => {
let children: any = []
let obj: any = {}
// 待审批的状态
let APPOVED_IDSLIST: any = []
// 拿到当前用户可以审批的申请id数组 业务id
let idList: any = []
// 待审批人数组 只有一个的时候才可以批量审批
let pendingList: any = []
// 那第一个业务的 作为当前的业务状态
let firstState: any = 0
data.forEach((subItem: any, subIndex: number) => {
if (item === subItem.CURRENT_PERIOD) {
obj = subItem
children.push(subItem)
if (pendingList.indexOf(Number(subItem.APPOVED_IDS)) === -1) {
pendingList.push(Number(subItem.APPOVED_IDS))
}
idList.push(subItem.BUSINESSAPPROVAL_ID)
}
if (Number(subItem.APPOVED_IDS) === Number(currentUser.ID)) {
if (APPOVED_IDSLIST.indexOf(subItem.BusinessProcess_State) === -1) {
APPOVED_IDSLIST.push(subItem.BusinessProcess_State)
}
if (subIndex === 0) {
firstState = subItem.BusinessProcess_State
}
}
})
console.log('APPOVED_IDSLIST', APPOVED_IDSLIST);
console.log('idList', idList);
res.push({
CURRENT_PERIOD: item,
children: children,
level: 1,
SETTLEMENT_STATE: children.length,
BUSINESSPROJECT_NAME: obj.BUSINESSPROJECT_NAME,
MERCHANTS_NAME: obj.MERCHANTS_NAME,
SERVERPARTSHOP_NAME: obj.SERVERPARTSHOP_NAME,
BUSINESSPROJECT_ID: obj.BUSINESSPROJECT_ID,
appovedIdList: APPOVED_IDSLIST,
SHOPROYALTY_ID: obj.SHOPROYALTY_ID,
BUSINESSAPPROVAL_IDS: idList,
pendingList: pendingList,// 待审批人列表
currentState: firstState,
BUSINESSAPPROVAL_ID: obj.BUSINESSAPPROVAL_ID
})
defaultRow.push(`${item}-1-undefined`)
})
console.log('defaultRow', defaultRow);
console.log('res321312', res);
setDefaultExpand(defaultRow)
return { data: res, success: true }
}
return { data: [], success: true }
}}
/>
<PrintContent pageName={'monthExamine'} exportColumns={exportColumns} exportData={printData} type={'month'} />
{/* <ProTable
style={{ display: "none" }}
className="testTable"
columns={exportColumns}
dataSource={printData}
pagination={false}
bordered
expandable={{
defaultExpandAllRows: true
}}
summary={() => {
return <>
<tr>
<td colSpan={2} align={'center'}>{exportSumRow?.PeriodIndexStr}</td>
<td>{exportSumRow?.MinturnOver ? numeral(exportSumRow?.MinturnOver).format('0,0') : ''}</td>
<td></td>
<td>{exportSumRow?.CashAmount ? numeral(exportSumRow?.CashAmount).format('0,0.00') : ''}</td>
<td>{exportSumRow?.MobilePayAmount ? numeral(exportSumRow?.MobilePayAmount).format('0,0.00') : ''}</td>
<td>{exportSumRow?.RevenueAmount ? numeral(exportSumRow?.RevenueAmount).format('0,0.00') : ''}</td>
<td>{exportSumRow?.amount ? numeral(exportSumRow?.amount).format('0,0.00') : ''}</td>
<td>{exportSumRow?.RoyaltyAmount ? numeral(exportSumRow?.RoyaltyAmount).format('0,0.00') : ''}</td>
<td>{exportSumRow?.GuaranteeFee ? numeral(exportSumRow?.GuaranteeFee).format('0,0.00') : ''}</td>
<td>{exportSumRow?.accountsReceivable ? numeral(exportSumRow?.accountsReceivable).format('0,0.00') : ''}</td>
<td>{exportSumRow?.PaidFee ? numeral(exportSumRow?.PaidFee).format('0,0.00') : ''}</td>
<td>{exportSumRow?.PaidFee_9010 ? numeral(exportSumRow?.PaidFee_9010).format('0,0.00') : ''}</td>
<td>{exportSumRow?.PaidFee_9020 ? numeral(exportSumRow?.PaidFee_9020).format('0,0.00') : ''}</td>
<td>{exportSumRow?.PaidFee_9030 ? numeral(exportSumRow?.PaidFee_9030).format('0,0.00') : ''}</td>
<td>{exportSumRow?.PaidFee_9050 ? numeral(exportSumRow?.PaidFee_9050).format('0,0.00') : ''}</td>
<td>{exportSumRow?.RefundSupplement ? numeral(exportSumRow?.RefundSupplement).format('0,0.00') : ''}</td>
<td>{exportSumRow?.desc}</td>
</tr>
</>
}}
/> */}
<ProjectEditor parentTableRef={actionRef} currentRecord={currentRow} modalVisible={modalVisible} handleModalVisible={handleModalVisible} come={"examine"} />
{/* 项目详情抽屉 */}
<Drawer
width="80%"
className="project-drawer"
visible={showProjectDrawer} // 抽屉弹框是否显示状态
onClose={() => { // 关闭抽屉 则在清空选中行数据 并 设置抽屉状态为关闭
setCurrentRow(undefined);
setShowProjectDrawer(false);
}}
bodyStyle={{ backgroundColor: "#f9f9f9", padding: 0 }}
closable={false}
>
{/* 抽屉打开时 加载项目详情组件 */}
{showProjectDrawer && <ProjectDetail id={currentRow?.BUSINESSPROJECT_ID} ></ProjectDetail>}
</Drawer>
{/* 月度结算抽屉 */}
<MonthExamineProcess onShow={showDetailDrawer} setOnShow={setShowDetailDrawer} parentRow={currentRow} setParentRow={setCurrentRow}
setCurrentApprovalstate={setCurrentApprovalstate} actionRef={actionRef} currentApprovalstate={currentApprovalstate} monthTime={monthTime}
setMonthTime={setMonthTime} parentRef={parentRef} isChangeFile={isChangeFile} />
{/* 批量审批 */}
<Modal
title="批量审批"
open={batchModal}
width={600}
confirmLoading={batchLoading}
destroyOnClose
onOk={() => {
batchFormRef.current?.validateFields().then(async (res: any) => {
setBatchLoading(true)
console.log('currentRow', currentRow);
const req: any = {
businessApprovalID: currentRow?.BUSINESSAPPROVAL_IDS.toString(),
curProinstState: currentNowState,
approveedInfo: res?.desc,
approveedStaffId: currentUser?.ID,
approveedStaffName: currentUser?.Name,
nextId: res?.nextPerson
}
console.log('req', req);
const data = await handleApproveMAPList(req)
if (data.Result_Code === 100) {
message.success(data.Result_Desc)
actionRef.current?.reload()
setBatchLoading(false)
setCurrentRow(undefined)
setBatchModal(false)
setCurrentNowState(undefined)
setCurrentNextState(undefined)
} else {
message.error(data.Result_Desc)
setBatchLoading(false)
}
})
}}
onCancel={() => {
setCurrentRow(undefined)
setBatchModal(false)
setBatchLoading(false)
}}
// setBatchLoading
>
<ProForm
formRef={batchFormRef}
submitter={{
// 清空表单自带的按钮
render: (props, doms) => {
return []
}
}}
>
{
currentNextState?.NEXT_STATE !== 9000 ?
<Row>
<Col span={6}>
<ProFormSelect
name={"nextPerson"}
label={"下一环节审批人"}
rules={[
{
required: true,
message: '请输入备注说明'
}
]}
request={async () => {
// merchantState 判断哪几个状态是商户的 商户调用拿到 商户下面的全部人列表选择一个 不是商户的 就根据选择了的人去指定一个人
// 接口直接返回就不用判断了
const req: any = {
BUSINESSAPPROVALId: currentRow?.BUSINESSAPPROVAL_ID || currentRow?.BUSINESSAPPROVAL_IDS[0]
}
console.log('req', req);
const data = await handleGetBUSINESSAPPROVALDetail(req)
setCurrentNowState(data.BUSINESSAPPROVAL_STATE)
// 拿到下一环节
const nextReq: any = {
OperationType: 12,
CurState: data.BUSINESSAPPROVAL_STATE,
IsValid: 1
}
const nextData = await handleGetAPPROVALROUTEDetail(nextReq)
setCurrentNextState(nextData)
const list: any = []
if (data.UserList && data.UserList.length > 0) {
data.UserList.forEach((item: any) => {
if (item.USER_STATUS === 1) {
list.push({ label: item.USER_NAME, value: item.USER_ID })
}
})
}
if (list && list.length > 0 && list.length === 1) {
batchFormRef.current?.setFieldsValue({ nextPerson: list[0].value })
}
if (currentUser?.ID === 2785) {
list.push({ label: '严琅杰', value: 2785 })
}
return list
}}
/>
</Col>
</Row>
: ''
}
<ProFormTextArea
name="desc"
label="审批意见"
rules={[
{
required: true,
message: '请输入审批意见'
}
]}
/>
</ProForm>
</Modal>
{/* 办结后的驳回 */}
<Modal
title={"复核驳回"}
destroyOnClose={true}
width={500}
visible={reviewRejected}
afterClose={() => {
formRejectRef.current?.resetFields();
}}
onCancel={() => {
setCurrentRow(undefined)
setReviewRejected(false)
}}
onOk={(value) => { // 提交框内的数据
formRejectRef.current.validateFields().then(async (res: any) => {
let req: any = {
businessApprovalID: currentRow?.BUSINESSAPPROVAL_ID,
approveedStaffId: currentUser?.ID,
approveedStaffName: currentUser?.Name,
approveedInfo: res.desc,
endReject: true,
targetProinstState: res.RejectState
}
const data = await handleRejectMonthAccountProinst(req)
if (data.Result_Code === 100) {
message.success(data.Result_Desc)
setCurrentRow(undefined)
setReviewRejected(false)
actionRef.current?.reload()
if (parentRef) {
parentRef.current?.reload()
}
} else {
message.error(data.Result_Desc)
}
})
}}
>
<ProForm
formRef={formRejectRef}
submitter={false}
>
<ProFormSelect
name="RejectState"
label="回退状态"
request={async () => {
const req: any = {
SearchParameter: {
OPERATION_TYPES: '12',
APPROVALROUTE_VALID: 1
},
PageIndex: 1,
PageSize: 999999
}
const data = await handleGetAPPROVALROUTEList(req)
let list: any = []
if (data && data.length > 0) {
data.forEach((item: any) => {
list.push({ label: item.APPROVALROUTE_NAME, value: item.APPROVALROUTE_STATE })
})
}
console.log('list', list);
return list
}}
required
/>
<ProFormTextArea
name="desc"
label="备注说明"
/>
</ProForm>
</Modal>
</div>
)
}
export default connect(({ user, }: ConnectState) => ({
currentUser: user.currentUser,
}))(MonthExamine);