// 历史销售单品报表 import { connect } from "umi"; import type { CurrentUser } from "umi"; import type { ConnectState } from "@/models/connect"; import React, { useRef, useState } from "react"; import ProCard from "@ant-design/pro-card"; import { MenuFoldOutlined } from "@ant-design/icons"; import type { FormInstance } from "antd"; import { Button, message, Space, Spin, Tree } from "antd"; import useRequest from "@ahooksjs/use-request"; import { getFieldEnumTree, getServerpartTree, getSPRegionShopTree, handleCallLogs, handleGetServiceShopTreeList } from "@/services/options"; import type { ActionType } from "@ant-design/pro-table"; import ProTable from "@ant-design/pro-table"; import ReactHTMLTableToExcel from "react-html-table-to-excel"; import { handleGetCommoditySaleSummary, } from "@/pages/reports/BusinessAnalysis/saleHisReport/service"; import moment from "moment"; import session from "@/utils/session"; import { handleGetBusinessTrades } from "../saleReport/service"; import ProDescriptions from "@ant-design/pro-descriptions"; import numeral from "numeral"; import PageTitleBox from "@/components/PageTitleBox"; import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun"; import { formatTreeData } from "@/utils/format"; const saleHisReport: React.FC<{ currentUser: CurrentUser }> = (props) => { const { currentUser } = props const downloadBtnRef = useRef() const actionRef = useRef(); const formRef = useRef(); const [reqDetailList, setReqDetailList] = useState(); // 合计项数据源 const [printOut, setPrintOut] = useState(); // 打印数据的内容 const [collapsible, setCollapsible] = useState(false) const [treeView, setTreeView] = useState() const [isFirst, setIsFirst] = useState(true) // 加载服务区树 const { loading: treeLoading, data: treeViews } = useRequest(async () => { const data = await handleGetServiceShopTreeList({ ProvinceCode: currentUser?.ProvinceCode, BusinessState: "1000,2000,3000", ShowState: true, SortStr: 'BUSINESS_STATE,SHOPSHORTNAME' }); setTreeView(data) return data }) // 树相关的属性和方法 const [selectedId, setSelectedId] = useState() // 导出的加载效果 const [showLoading, setShowLoading] = useState(false) // 是否显示打印的表格 const [showExportTable, setShowExportTable] = useState(false) const businessTypeObj = session.get("BUSINESSTYPEObj") const [printIndex, setPrintIndex] = useState(new Date().getTime()) // 表格数据 const [tableData, setTableData] = useState() // 商品业态列表 const [commodityFormatsObj, setCommodityFormatsObj] = useState() const columns: any = [ { title: '统计月份', dataIndex: 'search_months', valueType: "dateRange", hideInTable: true, colSize: 1, hideInDescriptions: true, initialValue: [moment().add(-2, 'month').endOf("month"), moment().add(-2, 'month').endOf("month")], search: { transform: (value) => { return { StartTime: value[0].replace('-', ''), EndTime: value[1].replace('-', ''), }; }, }, fieldProps: { picker: "month", format: 'YYYY-MM', disabledDate: (current: any) => current && current > moment().startOf("month") } }, { title: '查询', dataIndex: 'SearchKeyValue', hideInDescriptions: true, hideInTable: true, colSize: 1, fieldProps: { placeholder: '请输入商品条码/商品名称' } }, // { // title: '商品名称', // dataIndex: 'commodityName', // hideInDescriptions: true, // hideInTable: true, // colSize: 1, // fieldProps: { // placeholder: '请输入商品名称' // } // }, // { // title: '商品条码', // dataIndex: 'commodityBarcode', // hideInDescriptions: true, // hideInTable: true, // colSize: 1, // fieldProps: { // placeholder: '请输入商品条码' // } // }, { title: '商品业态', dataIndex: 'shopTrade', hideInTable: true, valueType: 'select', request: async () => { const data = await getFieldEnumTree({ FieldExplainField: 'BUSINESSTYPE' }) console.log('data', data) return data } }, { title: '经营模式', dataIndex: 'BusinessType', valueType: 'select', valueEnum: businessTypeObj, hideInTable: true, }, { title: '序号', width: 80, dataIndex: 'index', valueType: 'index', align: 'center', hideInSearch: true, }, { title: '商品名称', width: 200, ellipsis: true, align: 'center', dataIndex: 'Commodity_Name', hideInSearch: true, }, { title: '商品条码', width: 150, ellipsis: true, align: 'center', dataIndex: 'Commodity_Barcode', hideInSearch: true, }, { title:
销售单价
, width: 150, align: 'right', valueType: 'digit', dataIndex: 'Commodity_RetailPrice', hideInSearch: true, }, { title:
销售数量
, dataIndex: 'Total_Count', hideInSearch: true, width: 150, align: 'right', valueType: 'digit', }, { title:
优惠金额
, dataIndex: 'Total_OffAmount', valueType: 'digit', hideInSearch: true, width: 150, align: 'right', }, { title:
对客营收
, dataIndex: 'Total_SellAmount', valueType: 'digit', hideInSearch: true, width: 150, align: 'right', }, { title:
进货单价
, dataIndex: 'Commodity_PurchasePrice', valueType: 'digit', hideInSearch: true, width: 150, align: 'right', }, { title:
毛利率
, dataIndex: 'Total_SellAmountRate', hideInSearch: true, width: 150, align: 'right', render: (_, record) => { return record?.Total_SellAmountRate ? `${record?.Total_SellAmountRate}%` : '-' } }, ] const exportTable = (e) => { e.stopPropagation(); // 防止Collapse组件收起 const main = document.getElementsByClassName(`saleHisReportHideBox${printIndex}`)[0] const thead = main.querySelector('thead').cloneNode(true); // 深克隆DOM节点 const tbody = main.querySelector('tbody').cloneNode(true); // 深克隆DOM节点 const container = document.querySelector('#hiddenBox'); const tempTable = document.createElement('table'); tempTable.appendChild(thead); tempTable.appendChild(tbody); tempTable.setAttribute('id', 'table-to-xls-saleHisReport'); // 给table添加id,值与按钮上的table字段对应 container.appendChild(tempTable); // 把创建的节点添加到页面容器中 setShowLoading(false) downloadBtnRef.current.handleDownload(); setShowExportTable(false) tempTable.remove() // 防止重复打印一个内容 } // 查询的条件 const [searchParams, setSearchParams] = useState() return (
{ // 打印报表 if (!reqDetailList || reqDetailList.length === 0) return; setPrintOut(el); }} > { showLoading ?
数据导出中...
: '' }
{ showExportTable && reqDetailList && reqDetailList.length > 0 ? : '' }
{ setCollapsible(!collapsible) }} />} colSpan={!collapsible ? "300px" : "60px"} title={!collapsible ? "请选择服务区" : ""} headerBordered collapsed={collapsible} > {treeView && treeView.length > 0 ? { const selectedIds = info.checkedNodes.filter(n => n?.type === 2) setSelectedId(selectedIds.map(n => n?.value)?.toString() || '') // actionRef?.current?.reload() // getData(selectedIds.map(n => n?.value)?.toString() || '') }} // switcherIcon={} /> : ''}
} scroll={{ y: 'calc(100vh - 570px)' }} search={{ span: 6, defaultCollapsed: false }} pagination={{ pageSize: 100 }} request={async (params) => { if (isFirst) { setIsFirst(false) return } if (!selectedId) { message.error('请选择服务区') return } console.log('params', params) setSearchParams(params) handleCallLogs() const req = { ...params, ServerpartShopIds: selectedId, DataType: 2 // shopTrade:'', // businessType:'' } console.log('req', req) const data = await handleGetCommoditySaleSummary(req) console.log('data', data) let list: any = [] if (data && data.length > 0) { data.forEach((item: any, index: number) => { item.index = index + 1 }) list = data } let fieldData: any = [ "Commodity_RetailPrice", "Total_Count", "Total_OffAmount", "Total_SellAmount", "Commodity_PurchasePrice", ] let enumList: any = [] let newPrintData: any = formatTreeData(JSON.parse(JSON.stringify(list)), fieldData, enumList, [], ["Total_SellAmountRate"]) setReqDetailList(newPrintData) setTableData(list) return { data: list, success: true } }} toolbar={{ actions: [ // // // , ] }} tableExtraRender={() => { if (tableData && tableData.length > 0) { let Total_CountSum: number = 0 let Total_OffAmountSum: number = 0 let Total_SellAmountSum: number = 0 tableData.forEach((item: any) => { Total_CountSum += item.Total_Count Total_OffAmountSum += item.Total_OffAmount Total_SellAmountSum += item.Total_SellAmount }) return
{Total_CountSum ? numeral(Total_CountSum).format('0,0') : '0'} {Total_OffAmountSum || '0.00'} {Total_SellAmountSum} {/* */} {currentUser.Name} {moment().format('YYYY-MM-DD HH:mm:ss')} {`${moment(searchParams?.StartTime).format('YYYY-MM')}至${moment(searchParams?.EndTime).format('YYYY-MM')}`}
} }} />
) } export default connect(({ user }: ConnectState) => ({ currentUser: user.currentUser }))(saleHisReport);