123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552 |
- define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'moment'], function ($, undefined, Backend, Table, Form, Moment) {
- var Controller = {
- index: () => {
- const { reactive, onMounted } = Vue
- const index = {
- setup() {
- const state = reactive({
- total: {
- user: {
- data: {},
- color: '#806AF6',
- color1: 'rgba(128, 106, 246, 0.4)',
- color2: 'rgba(128, 106, 246, 0)',
- title: '用户数量',
- tip: '今日新增用户',
- footer: '本周新增用户人数',
- },
- agent: {
- data: {},
- color: '#409EFF',
- color1: 'rgba(64, 158, 255, 0.4)',
- color2: ' rgba(64, 158, 255, 0)',
- title: '分销商数量',
- tip: '今日新增人数',
- footer: '本周新增分销商人数',
- },
- share: {
- data: {},
- color: '#21C732',
- color1: 'rgba(33, 199, 50, 0.4)',
- color2: 'rgba(33, 199, 50, 0)',
- title: '分享次数',
- tip: '今日分享次数',
- footer: '本周新增分享次数',
- },
- },
- })
- function getTotal() {
- Fast.api.ajax({
- url: 'shopro/dashboard/total',
- type: 'GET',
- }, function (ret, res) {
- state.total.agent.data = res.data.agent_data;
- state.total.share.data = res.data.share_data;
- state.total.user.data = res.data.user_data;
- for (var key in state.total) {
- if (state.total[key].data) {
- initChartTotal(key)
- }
- }
- return false
- }, function (ret, res) { })
- }
- function initChartTotal(key) {
- var myChart = echarts.init(document.getElementById(`${key}Total`));
- window.onresize = () => {
- myChart.resize()
- }
- var option = {
- grid: {
- left: 6,
- top: 6,
- right: 6,
- bottom: 6,
- },
- tooltip: {
- trigger: 'axis',
- axisPointer: {
- type: 'none',
- },
- },
- xAxis: {
- type: 'category',
- data: ['分', 20, 36, 10, 10, 20],
- boundaryGap: false,
- axisTick: {
- show: false,
- },
- axisLabel: {
- show: false,
- },
- axisLine: {
- show: false,
- },
- },
- yAxis: {
- type: 'value',
- splitLine: {
- show: false,
- },
- axisLabel: {
- show: false,
- },
- },
- series: [{
- // name: state.total.user.title,
- data: [5, 20, 36, 10, 10, 20], // [5, 20, 36, 10, 10, 20]
- type: 'line',
- smooth: true,
- showSymbol: false,
- symbol: 'circle',
- symbolSize: 6,
- itemStyle: {
- color: state.total[key].color,
- },
- areaStyle: {
- color: new echarts.graphic.LinearGradient(
- 0,
- 0,
- 0,
- 1,
- [
- {
- offset: 0,
- color: state.total[key].color1,
- },
- {
- offset: 1,
- color: state.total[key].color2,
- },
- ],
- false,
- ),
- },
- lineStyle: {
- width: 2,
- },
- }]
- };
- initIntervalTotal(24, 'hours', option, key)
- myChart.setOption(option);
- }
- function initIntervalTotal(interval, kld, option, key) {
- let dateTime = `${Moment().format('YYYY-MM-DD')} 00:00:00`;
- let x = [];
- let y = [];
- let timeStamp = [];
- for (let i = 0; i <= interval; i++) {
- x.push(Moment(dateTime).add(i, kld).format('HH:mm'));
- y.push(0);
- timeStamp.push(Moment(dateTime).add(i, kld).valueOf());
- }
- x.forEach((item, index) => {
- state.total[key].data.array.forEach((item) => {
- if (
- timeStamp[index + 1] &&
- item.createtime_unix > timeStamp[index] &&
- item.createtime_unix <= timeStamp[index + 1]
- ) {
- y[index]++;
- }
- });
- });
- option.xAxis.data = x;
- option.series[0].data = y;
- }
- const chart = reactive({
- tabsData: {
- order: '订单数',
- payOrder: '支付订单',
- payAmount: '支付金额',
- },
- tabActive: 'order',
- dateTime: getTimeSlot(),
- shortcuts: [
- {
- text: '今天',
- value: getTimeSlot(),
- },
- {
- text: '昨天',
- value: () => {
- return getTimeSlot('yesterday');
- },
- },
- {
- text: '近一周',
- value: () => {
- return getTimeSlot('week');
- },
- },
- ],
- data: {
- payAmountArr: [], // 销售额
- payOrderArr: [], // 订单
- orderArr: [], //订单数
- },
- });
- function onChangeTabActive(type) {
- chart.tabActive = type;
- chartOption.series[0].name = chart.tabsData[chart.tabActive];
- initChart();
- }
- function onChangeDateTime(e) {
- // 时间date必选
- e && getChart();
- }
- const statistics = reactive({
- order: {
- num: 0,
- text: '订单数',
- path: '',
- tip: '时间区间内总的下单数量(包含未支付订单)',
- status: 'all',
- },
- payAmount: {
- num: 0,
- text: '支付金额',
- path: '',
- tip: '时间区间内支付订单的支付总金额(包含退款订单)',
- status: 'paid',
- },
- payOrder: {
- num: 0,
- text: '支付订单',
- path: '',
- tip: '时间区间内支付的订单数量(包含退款订单)',
- status: 'paid',
- },
- noSend: {
- num: 0,
- text: '待发货订单',
- path: '',
- tip: '时间区间内待发货订单数量',
- status: 'nosend',
- },
- aftersale: {
- num: 0,
- text: '售后维权',
- path: '',
- tip: '时间区间内申请售后维权的订单数量',
- status: 'aftersale',
- },
- refund: {
- num: 0,
- text: '退款订单',
- path: '',
- tip: '时间区间内退款的订单数量',
- status: 'refund',
- },
- });
- async function getChart() {
- Fast.api.ajax({
- url: 'shopro/dashboard/chart',
- type: 'GET',
- data: {
- date: chart.dateTime.join(' - '),
- }
- }, function (ret, res) {
- for (let key in statistics) {
- statistics[key].num = res.data[`${key}Num`];
- }
- chart.data.payAmountArr = res.data.payAmountArr; // 销售额
- chart.data.payOrderArr = res.data.payOrderArr; // 订单
- chart.data.orderArr = res.data.orderArr; //订单数
- initChart();
- return false
- }, function (ret, res) { })
- }
- // 柱状图参数
- const chartOption = reactive({
- grid: {
- left: '10px',
- top: '20px',
- bottom: '20px',
- right: '20px',
- containLabel: true,
- },
- xAxis: {
- type: 'category',
- data: [],
- offset: 5,
- axisLine: {
- show: false,
- },
- axisTick: {
- show: false,
- },
- },
- yAxis: {
- type: 'value',
- offset: 5,
- splitLine: {
- show: false,
- },
- axisTick: {
- show: false,
- },
- axisLine: {
- show: false,
- },
- },
- tooltip: {
- trigger: 'axis',
- axisPointer: {
- show: true,
- status: 'shadow',
- z: -1,
- shadowStyle: {
- color: 'rgba(191, 191, 191, 0.24)',
- },
- type: 'shadow',
- },
- },
- series: [
- {
- name: chart.tabsData[chart.tabActive],
- type: 'bar',
- data: [],
- zlevel: 1,
- z: 1,
- label: {
- show: false,
- position: 'top',
- },
- itemStyle: {
- color: '#806af6',
- },
- showBackground: true,
- backgroundStyle: {
- color: 'rgba(191, 191, 191, 0.24)',
- },
- },
- ],
- });
- // 获取时间刻度
- function initChart() {
- if (chart.dateTime) {
- let time =
- (new Date(chart.dateTime[1].replace(/-/g, '/')).getTime() -
- new Date(chart.dateTime[0].replace(/-/g, '/')).getTime()) /
- 1000 +
- 1;
- let kld = '';
- let interval = 0;
- if (time <= 60 * 60) {
- interval = parseInt(time / 60);
- kld = 'minutes';
- } else if (time <= 60 * 60 * 24) {
- interval = parseInt(time / (60 * 60));
- kld = 'hours';
- } else if (time <= 60 * 60 * 24 * 30 * 1.5) {
- interval = parseInt(time / (60 * 60 * 24));
- kld = 'days';
- } else if (time < 60 * 60 * 24 * 30 * 24) {
- interval = parseInt(time / (60 * 60 * 24 * 30));
- kld = 'months';
- } else if (time >= 60 * 60 * 24 * 30 * 24) {
- interval = parseInt(time / (60 * 60 * 24 * 30 * 12));
- kld = 'years';
- }
- drawX(interval, kld);
- console.log(chartOption, 'chartOption')
- var myChart2 = echarts.init(document.getElementById(`chartContent`));
- window.onresize = () => {
- myChart2.resize()
- }
- myChart2.setOption(chartOption);
- } else {
- chartOption.xAxis.data = [];
- chartOption.series[0].data = [];
- }
- }
- // 给柱状图数据赋值
- function drawX(interval, kld) {
- let x = [];
- let y = [];
- let timeStamp = [];
- for (let i = 0; i <= interval - 1; i++) {
- if (kld == 'minutes' || kld == 'hours') {
- x.push(Moment(chart.dateTime[0]).add(i, kld).format('DD HH:mm'));
- y.push(0);
- } else if (kld == 'days') {
- x.push(Moment(chart.dateTime[0]).add(i, kld).format('YYYY-MM-DD'));
- y.push(0);
- } else if (kld == 'months') {
- x.push(Moment(chart.dateTime[0]).add(i, kld).format('YYYY-MM'));
- y.push(0);
- } else {
- x.push(Moment(chart.dateTime[0]).add(i, kld).format('YYYY'));
- y.push(0);
- }
- }
- for (let i = 1; i <= interval; i++) {
- timeStamp.push(Moment(chart.dateTime[0]).add(i, kld).valueOf());
- }
- x.forEach((item, index) => {
- chart.data[`${chart.tabActive}Arr`].forEach((item) => {
- if (
- item.createtime > (index - 1 >= 0 ? timeStamp[index - 1] : 0) &&
- item.createtime <= timeStamp[index]
- ) {
- if (chart.tabActive == 'payAmount') {
- y[index] = (Number(y[index]) + Number(item.counter)).toFixed(2);
- } else {
- y[index]++;
- }
- }
- });
- });
- chartOption.xAxis.data = x;
- chartOption.series[0].data = y;
- }
- // 默认获取当天的时间赋值
- function getTimeSlot(e) {
- let beginTime = Moment(new Date()).format('YYYY-MM-DD');
- let endTime = Moment(new Date()).format('YYYY-MM-DD');
- switch (e) {
- case 'yesterday':
- endTime = Moment().subtract(1, 'days').format('YYYY-MM-DD');
- beginTime = endTime;
- break;
- case 'week':
- beginTime = Moment().subtract(1, 'weeks').format('YYYY-MM-DD');
- break;
- case 'month':
- beginTime = Moment().subtract(1, 'months').format('YYYY-MM-DD');
- }
- let timeSlot = [beginTime + ' 00:00:00', endTime + ' 23:59:59'];
- return timeSlot;
- }
- const ranking = reactive({
- goods: [],
- hot_search: []
- })
- const pieOption = reactive({
- tooltip: {
- trigger: 'item',
- formatter: '{a} <br/>{b}: {c} ({d}%)',
- },
- legend: {
- show: false,
- },
- series: [
- {
- name: '热搜榜',
- type: 'pie',
- radius: ['52%', '90%'],
- avoidLabelOverlap: false,
- label: {
- show: false,
- position: 'center',
- },
- zlevel: 1,
- z: 1,
- emphasis: {
- label: {
- show: true,
- fontSize: '16',
- fontWeight: 'normal',
- },
- },
- labelLine: {
- show: false,
- },
- data: [],
- },
- ],
- });
- function getRanking() {
- Fast.api.ajax({
- url: 'shopro/dashboard/ranking',
- type: 'GET',
- }, function (ret, res) {
- ranking.goods = res.data.goods
- ranking.hot_search = res.data.hot_search
- pieOption.series[0].data = []
- ranking.hot_search.forEach(item => {
- pieOption.series[0].data.push({
- name: item.keyword,
- value: item.num,
- });
- })
- var myChart3 = echarts.init(document.getElementById(`rankingContent`));
- window.onresize = () => {
- myChart3.resize()
- }
- myChart3.setOption(pieOption);
- return false
- }, function (ret, res) { })
- }
- function onOpen(status) {
- Fast.api.open(`shopro/order/order/index?status=${status}&createtime=${encodeURI(JSON.stringify(chart.dateTime))}`, "订单", {
- callback() {
- getChart()
- }
- })
- }
- onMounted(() => {
- Config.cardList.forEach(item => {
- if (item.name == 'total' && item.status) {
- getTotal()
- }
- if (item.name == 'chart' && item.status) {
- getChart()
- }
- if (item.name == 'ranking' && item.status) {
- getRanking()
- }
- })
- })
- return {
- state,
- getTotal,
- chart,
- onChangeTabActive,
- onChangeDateTime,
- statistics,
- getChart,
- chartOption,
- initChart,
- drawX,
- getTimeSlot,
- ranking,
- onOpen,
- }
- }
- }
- createApp('index', index);
- },
- };
- return Controller;
- });
|