From 5b3413ebfad6a5ffb470e1de0e38949d295b4ccd Mon Sep 17 00:00:00 2001 From: yangwenhua <1289978696@qq.com> Date: Tue, 28 Jun 2022 18:14:11 +0800 Subject: [PATCH] =?UTF-8?q?=E8=90=A5=E9=94=80=E6=8A=A5=E8=A1=A8=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=BB=84=E7=BB=87=E6=9C=BA=E6=9E=84=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E3=80=81=E5=AF=BC=E5=87=BA=E6=89=80=E6=9C=89=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/order/order-market-report/index.jsx | 152 +++++++++++++----- .../order/order-market-report/index.less | 21 +++ .../order/order-market-report/service.js | 16 ++ 3 files changed, 152 insertions(+), 37 deletions(-) diff --git a/src/pages/order/order-market-report/index.jsx b/src/pages/order/order-market-report/index.jsx index 36c3116..deca9b1 100644 --- a/src/pages/order/order-market-report/index.jsx +++ b/src/pages/order/order-market-report/index.jsx @@ -1,13 +1,13 @@ import React, { useEffect, useState } from 'react'; import { PageContainer } from '@ant-design/pro-layout'; import { DownloadOutlined } from '@ant-design/icons'; -import { Button, Table, Card, DatePicker, message, Pagination } from 'antd'; +import { Button, Table, Card, DatePicker, message, Pagination, Spin, TreeSelect } from 'antd'; import styles from './index.less'; import moment from 'moment'; import marketAPI from "./service"; - import ExportJsonExcel from "js-export-excel" +const { TreeNode } = TreeSelect; const { RangePicker } = DatePicker; const columns = [ { @@ -382,6 +382,14 @@ const columns = [ } ] +const LoadingCard = () => { + return ( +
+ +
+ ) +} + /** * 营销报表 * @returns @@ -392,19 +400,21 @@ export default function Index() { const [current, setCurrent] = useState(1); const [pageSize, setPageSize] = useState(10); const [total, setTotal] = useState(0); - + const [orgTree, setOrgTree] = useState([]); + const [showLoading, setShowLoading] = useState(false); const [timeRange, setTimeRange] = useState([ moment(moment(new Date(Date.now() - 24 * 60 * 60 * 1000 * 7)).format('YYYY-MM-DD 00:00:00')), moment(moment(new Date(Date.now())).format('YYYY-MM-DD 23:59:59')), ]); //日期选择器 + const [currentOrg, setCurrentOrg] = useState(''); useEffect(() => { queryMarketReport(); }, [current, pageSize, timeRange]); - // useEffect(() => { - // calcTotal(); - // }, [data]); + useEffect(() => { + onGetOrgTree(); + }, []); //计算总计 const calcTotal = () => { @@ -434,10 +444,15 @@ export default function Index() { const queryMarketReport = async () => { const jsonData = { + startTime: timeRange[0], + endTime: timeRange[1], current: current, pageSize: pageSize } + currentOrg.key && (jsonData.shopId = currentOrg.key); + setShowLoading(true); const response = await marketAPI.getMarketReportList(jsonData); + setShowLoading(false); if (response.statusCode === 200) { setData(response.data.data); setTotal(response.data.total); @@ -453,49 +468,112 @@ export default function Index() { } //下载Excel - const onDownloadExcel = () => { - let option = {}; //option代表的就是excel文件 - const date = new Date(); - const excelName = "营销报表-" + date.toLocaleString().replaceAll('\/', '-'); - option.fileName = excelName; //excel文件名称 - const sheetHeader = []; - Object.keys(data[0]).forEach(item => { - sheetHeader.push(item); - }); - console.log('sheetHeader', sheetHeader); - option.datas = [ - { - sheetData: data, //excel文件中的数据源 - sheetName: excelName, //excel文件中sheet页名称 - sheetFilter: sheetHeader, //excel文件中需显示的列数据 - sheetHeader: ['ID', '时间', '店铺名称', '店铺ID', '营收流水', - '实际营收', '会员价', '优惠券', '活动折扣', '营收流水', - '营收流水', '客单价-流水单价', '客单价-实收单价', '单单价-总流水', '单单价-总实收', - '现金-交易笔数', '现金收入', '微信-交易笔数', '微信收入', '会员收入', '非会员收入' - ] //excel文件中每列的表头名称 + const onDownloadExcel = async () => { + const jsonData = { + startTime: timeRange[0], + endTime: timeRange[1], + } + currentOrg.key && (jsonData.shopId = currentOrg.key); + setShowLoading(true); + const response = await marketAPI.marketingReportExport(jsonData); + setShowLoading(false); + if (response.statusCode === 200) { + let option = {}; //option代表的就是excel文件 + const date = new Date(); + const excelName = "营销报表-" + date.toLocaleString().replaceAll('\/', '-'); + option.fileName = excelName; //excel文件名称 + const sheetHeader = []; + Object.keys(response.data[0]).forEach(item => { + sheetHeader.push(item); + }); + console.log('sheetHeader', sheetHeader); + option.datas = [ + { + sheetData: response.data, //excel文件中的数据源 + sheetName: excelName, //excel文件中sheet页名称 + sheetFilter: sheetHeader, //excel文件中需显示的列数据 + sheetHeader: ['ID', '时间', '店铺名称', '店铺ID', '营收流水', + '实际营收', '会员折扣', '优惠券折扣', '活动折扣','客单价-流水单价', '客单价-实收单价', + '单单价-总流水', '单单价-总实收', + '现金-交易笔数', '现金收入', '微信-交易笔数', '微信收入', '会员收入', '非会员收入' + ] //excel文件中每列的表头名称 + } + ] + let toExcel = new ExportJsonExcel(option); //生成excel文件 + toExcel.saveExcel(); + } else { + message.error(response.errors || '导出失败'); + } + } + + //获取组织树 + const onGetOrgTree = async () => { + setShowLoading(true); + const response = await marketAPI.getOrgTree(); + setShowLoading(false); + if (response.statusCode === 200) { + const originTree = response.data; + onSetOrgTreeStatus(originTree); + setOrgTree(originTree); + } else { + message.error(response.errors || '获取组织树出错'); + } + } + + //设置组织树不可选择状态 + const onSetOrgTreeStatus = (originTree) => { + originTree.forEach(treeItem => { + if (treeItem.children && treeItem.children.length > 0) { + onSetOrgTreeStatus(treeItem.children); + } else { + if (treeItem.type === 2 || treeItem.type === 3) { + treeItem.disabled = false; + } else { + treeItem.disabled = true; + } } - ] - let toExcel = new ExportJsonExcel(option); //生成excel文件 - toExcel.saveExcel(); + }); } return ( + {showLoading ? : null}
- { - let tempDate = [ - moment(moment(new Date(dateStrings[0])).format('YYYY-MM-DD 00:00:00')), - moment(moment(new Date(dateStrings[1])).format('YYYY-MM-DD 23:59:59')), - ] - setTimeRange(tempDate); - }} /> +
+ { + let tempDate = [ + moment(moment(new Date(dateStrings[0])).format('YYYY-MM-DD 00:00:00')), + moment(moment(new Date(dateStrings[1])).format('YYYY-MM-DD 23:59:59')), + ] + setTimeRange(tempDate); + }} /> + { + if (node.type === 2 || node === 3) { + setCurrentOrg(node); + } + }} + placeholder="请选择组织架构" + treeDefaultExpandAll + /> +
+
- +
diff --git a/src/pages/order/order-market-report/index.less b/src/pages/order/order-market-report/index.less index 9487917..ed50ea4 100644 --- a/src/pages/order/order-market-report/index.less +++ b/src/pages/order/order-market-report/index.less @@ -17,4 +17,25 @@ justify-content: flex-end; align-items: center; height: 50px; +} + +.data-search-left { + display: flex; + align-items: center; +} + +// 加载中 +.loading-card { + position: fixed; + display: flex; + align-items: center; + justify-content: center; + width: 100vw; + height: 100vh; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 999; + background-color: rgba(0, 0, 0, 0.5); } \ No newline at end of file diff --git a/src/pages/order/order-market-report/service.js b/src/pages/order/order-market-report/service.js index e5a3880..7820383 100644 --- a/src/pages/order/order-market-report/service.js +++ b/src/pages/order/order-market-report/service.js @@ -1,10 +1,26 @@ import { request } from 'umi'; export default { + //获取分页数据 getMarketReportList(data) { return request(`/kitchen/api/report-statistics/marketing-report`, { method: 'Post', data: data, }); + }, + + //获取组织架构 + getOrgTree() { + return request(`/kitchen/api/report-statistics/org-tree`, { + method: 'GET', + }); + }, + + //下载报表 + marketingReportExport(data) { + return request(`/kitchen/api/report-statistics/marketing-report-export`, { + method: 'Post', + data: data, + }); } };