diff --git a/src/config.js b/src/config.js index 5d3c28c..a07dcf8 100644 --- a/src/config.js +++ b/src/config.js @@ -2,5 +2,5 @@ import React from "react"; export const stores_Context = React.createContext(); export const DATE_FORMAT = 'YYYY-MM-DD'; -//export const HT_HOST = 'https://p9axztuwd7x8a7.mycht.cn'; -export const HT_HOST = 'http://202.103.68.100:890';//889正式库 \ No newline at end of file +export const HT_HOST = 'https://p9axztuwd7x8a7.mycht.cn'; +//export const HT_HOST = 'http://202.103.68.100:890';//889正式库 \ No newline at end of file diff --git a/src/stores/AuthStore.js b/src/stores/AuthStore.js index 9c093ad..d2a9244 100644 --- a/src/stores/AuthStore.js +++ b/src/stores/AuthStore.js @@ -9,7 +9,7 @@ class AuthStore { constructor(rootStore) { this.rootStore = rootStore; makeAutoObservable(this); - //this.get_auth(); + this.get_auth(); } auth = ['admin']; diff --git a/src/stores/FinancialStore.js b/src/stores/FinancialStore.js index 1d6f320..4ac9734 100644 --- a/src/stores/FinancialStore.js +++ b/src/stores/FinancialStore.js @@ -40,6 +40,7 @@ class FinancialStore { credit_card_data = { data: [], + data_by_type: [], loading:false, bu_select_mode: false, business_units: ['ALL'], @@ -77,6 +78,27 @@ class FinancialStore { console.log('fetch data failed', error); }); } + + //请求信用卡账单 + get_credit_card_bills_by_type() { + const date_picker_store = this.rootStore.date_picker_store; + let url = '/service-web/QueryData/GetCreditCardBillsByType'; + url += `?business_unit=${this.credit_card_data.business_units.toString()}&groups=${this.credit_card_data.groups.toString()}`; + url += '&billdate1=' + date_picker_store.start_date.format(config.DATE_FORMAT) + '&billdate2=' + date_picker_store.end_date.format(config.DATE_FORMAT) + '%2023:59:59'; + if (date_picker_store.start_date_cp && date_picker_store.end_date_cp) { + url += '&billdateOld1=' + date_picker_store.start_date_cp.format(config.DATE_FORMAT) + '&billdateOld2=' + date_picker_store.end_date_cp.format(config.DATE_FORMAT) + '%2023:59:59'; + } + fetch(config.HT_HOST + url) + .then((response) => response.json()) + .then((json) => { + runInAction(() => { + this.credit_card_data.data_by_type = json; + }) + }) + .catch((error) => { + console.log('fetch data failed', error); + }); + } } diff --git a/src/stores/OrdersStore.js b/src/stores/OrdersStore.js index 3467dc3..c2d3bd4 100644 --- a/src/stores/OrdersStore.js +++ b/src/stores/OrdersStore.js @@ -109,16 +109,6 @@ class OrdersStore { }); } - show_vs_tag(vs, data1, data2) { - let tag = '-'; - if (parseInt(vs) < 0) { - tag = } color="gold">{vs} - } else if (parseInt(vs) > 0) { - tag = } color="lime">{vs} - } - return
{data1} vs {data2}
- {tag}
- } //网站订单类型 getOrderCountByType(order_type) { diff --git a/src/utils/commons.js b/src/utils/commons.js index b9b9c59..4966697 100644 --- a/src/utils/commons.js +++ b/src/utils/commons.js @@ -1,18 +1,23 @@ // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart +import {Tag} from "antd"; +import { + CaretUpOutlined, + CaretDownOutlined +} from '@ant-design/icons'; + if (!String.prototype.padStart) { - String.prototype.padStart = function padStart(targetLength,padString) { - targetLength = targetLength>>0; //floor if number or convert non-number to 0; + String.prototype.padStart = function padStart(targetLength, padString) { + targetLength = targetLength >> 0; //floor if number or convert non-number to 0; padString = String((typeof padString !== 'undefined' ? padString : ' ')); if (this.length > targetLength) { return String(this); - } - else { - targetLength = targetLength-this.length; + } else { + targetLength = targetLength - this.length; if (targetLength > padString.length) { - padString += padString.repeat(targetLength/padString.length); //append to original to ensure we are longer than needed + padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed } - return padString.slice(0,targetLength) + String(this); + return padString.slice(0, targetLength) + String(this); } }; } @@ -28,21 +33,21 @@ export function named(value) { } export function formatCurrency(name) { - if (name === 'USD' ) { - return '$'; - } else if (name === 'RMB') { - return '¥'; - } else if (name === 'EUR') { - return '€' - } else if (name === 'GBP') { - return '£' - } else { - return name + ' '; - } + if (name === 'USD') { + return '$'; + } else if (name === 'RMB') { + return '¥'; + } else if (name === 'EUR') { + return '€' + } else if (name === 'GBP') { + return '£' + } else { + return name + ' '; + } } export function formatPrice(price) { - return Math.ceil(price).toLocaleString(); + return Math.ceil(price).toLocaleString(); } export function formatPercent(number) { @@ -50,7 +55,9 @@ export function formatPercent(number) { } export function formatDate(date) { - if (isEmpty(date)) { return 'NaN'; } + if (isEmpty(date)) { + return 'NaN'; + } const year = date.getFullYear(); const month = date.getMonth() + 1; @@ -60,7 +67,7 @@ export function formatDate(date) { const dayStr = ('' + day).padStart(2, 0); const formatted = year + '-' + monthStr + '-' + dayStr; - return formatted; + return formatted; } export function formatTime(date) { @@ -170,8 +177,8 @@ export function debounce(fn, delay = 500) { export function throttle(fn, delay, atleast) { let timeout = null, - startTime = new Date(); - return function() { + startTime = new Date(); + return function () { let curTime = new Date(); clearTimeout(timeout); if (curTime - startTime >= atleast) { @@ -188,4 +195,17 @@ export function clickUrl(url) { httpLink.href = url; httpLink.target = '_blank'; httpLink.click(); +} + +export function show_vs_tag(vs, data1, data2) { + let tag = '-'; + if (parseInt(vs) < 0) { + tag = } color="gold">{vs} + } else if (parseInt(vs) > 0) { + tag = } color="lime">{vs} + } // else { + // return {tag} + // } + return
{data1} vs {data2}
+ {tag}
} \ No newline at end of file diff --git a/src/views/Credit_card_bill.js b/src/views/Credit_card_bill.js index 7ce23d6..1663b78 100644 --- a/src/views/Credit_card_bill.js +++ b/src/views/Credit_card_bill.js @@ -1,12 +1,13 @@ import React, {Component, useContext} from 'react'; import {observer} from 'mobx-react'; -import {Row, Col, Button, Tabs, Table} from 'antd'; +import {Row, Col, Button, Tabs, Table, Divider} from 'antd'; import {stores_Context} from '../config' -import {useNavigate} from "react-router-dom"; +import {utils, writeFileXLSX} from "xlsx"; +import {NavLink, useNavigate} from "react-router-dom"; import { SlackOutlined, - SketchOutlined, - AntCloudOutlined, + ContainerOutlined, + CarryOutOutlined, SearchOutlined, GithubOutlined } from '@ant-design/icons'; @@ -15,15 +16,92 @@ import GroupSelect from '../charts/GroupSelect' import Business_unit from '../charts/Business_unit' import DatePickerCharts from '../charts/DatePickerCharts' import {Line} from "@ant-design/charts"; -import * as com from '../utils/commons' +import * as comm from '../utils/commons' +import * as config from "../config"; + const Credit_card_bill = () => { const {financial_store} = useContext(stores_Context); const {bill_type_data, credit_card_data} = financial_store; - const data_source = !com.empty(credit_card_data.data) ? credit_card_data.data.billdate1 : []; + + const format_data = ((data) => { + let result = {dataSource: [], columns: []} + if (!comm.empty(data)) { + result.columns = [ + { + title: '项目', + children: [{ + title: '', + dataIndex: 'cb_billtype', + }], + }, + { + title: '美金', + children: [{title: data.BillTypeDataTotal1.cb_usd, dataIndex: 'cb_usd'}], + sorter: (a, b) => parseFloat(b.cb_usd.replace(/,/g, '')) - parseFloat(a.cb_usd.replace(/,/g, '')), + }, + { + title: '人民币', + children: [{title: data.BillTypeDataTotal1.cb_rmb, dataIndex: 'cb_rmb'}], + sorter: (a, b) => parseFloat(b.cb_rmb.replace(/,/g, '')) - parseFloat(a.cb_rmb.replace(/,/g, '')), + }, + ] + result.dataSource = data.BillTypeData1; + } + return result; + }) + + const format_data_detail = ((data) => { + let result = {dataSource: [], columns: []} + if (!comm.empty(data)) { + result.columns = [ + { + title: '项目', + children: [{ + title: '', + dataIndex: 'cb_bill', + }], + }, + { + title: '美金', + children: [{title: Math.round(data.billdate1.reduce((a, b) => a + b.cb_usd, 0)), dataIndex: 'cb_usd'}], + sorter: (a, b) => b.cb_usd - a.cb_usd, + }, + { + title: '人民币', + children: [{title: Math.round(data.billdate1.reduce((a, b) => a + b.cb_rmb, 0)), dataIndex: 'cb_rmb'}], + sorter: (a, b) => b.cb_rmb - a.cb_rmb, + }, + + { + title: '交易日期', + children: [{title: '', dataIndex: 'cb_datetime'}], + }, + { + title: '账期', + children: [{title: '', dataIndex: 'cb_billdate'}], + }, + { + title: '事业部', + children: [{title: '', dataIndex: 'cb_business_unit'}], + sorter: (a, b) => b.cb_business_unit - a.cb_business_unit, + }, + { + title: '小组', + children: [{title: '', dataIndex: 'cb_group'}], + }, + ] + result.dataSource = data.billdate1; + } + return result; + }) + + const credit_card_bills = !comm.empty(credit_card_data.data) ? format_data_detail(credit_card_data.data) : format_data_detail([]); + const credit_card_bills_by_type = !comm.empty(credit_card_data.data_by_type) ? format_data(credit_card_data.data_by_type) : format_data([]); + const line_config = { - data: data_source, + data: credit_card_bills.dataSource, padding: 'auto', xField: 'cb_datetime', yField: 'cb_usd', @@ -39,7 +117,7 @@ const Credit_card_bill = () => { legend: { itemValue: { formatter: (text, item) => { - const items = data_source.filter((d) => d.groups === item.value);//按站点筛选 + const items = credit_card_bills.dataSource.filter((d) => d.groups === item.value);//按站点筛选 return items.length ? Math.round(items.reduce((a, b) => a + b.cb_usd, 0)) : '';//计算总数 }, }, @@ -76,6 +154,7 @@ const Credit_card_bill = () => { @@ -84,6 +163,32 @@ const Credit_card_bill = () => { + + + 项目汇总} key="summarized_data"> + + { + const wb = utils.table_to_book(document.getElementById("table_by_type").getElementsByTagName('table')[0]); + writeFileXLSX(wb, "项目汇总.xlsx"); + }}>导出excel + + 明细} key="detail_data"> +
+ { + const wb = utils.table_to_book(document.getElementById("table_by_detail").getElementsByTagName('table')[0]); + writeFileXLSX(wb, "明细.xlsx"); + }}>导出excel + + + ); diff --git a/src/views/Orders.js b/src/views/Orders.js index 9bb1946..dd377df 100644 --- a/src/views/Orders.js +++ b/src/views/Orders.js @@ -49,35 +49,35 @@ class Orders extends Component { { title: '数量', children: [{ - title: orders_store.show_vs_tag(ordercountTotal1.OrderCount_vs, ordercountTotal1.OrderCount, ordercountTotal2.OrderCount), + title: comm.show_vs_tag(ordercountTotal1.OrderCount_vs, ordercountTotal1.OrderCount, ordercountTotal2.OrderCount), dataIndex: 'OrderCount' }], }, { title: '成交数', children: [{ - title: orders_store.show_vs_tag(ordercountTotal1.CJCount_vs, ordercountTotal1.CJCount, ordercountTotal2.CJCount), + title: comm.show_vs_tag(ordercountTotal1.CJCount_vs, ordercountTotal1.CJCount, ordercountTotal2.CJCount), dataIndex: 'CJCount' }], }, { title: '成交人数', children: [{ - title: orders_store.show_vs_tag(ordercountTotal1.CJPersonNum_vs, ordercountTotal1.CJPersonNum, ordercountTotal2.CJPersonNum), + title: comm.show_vs_tag(ordercountTotal1.CJPersonNum_vs, ordercountTotal1.CJPersonNum, ordercountTotal2.CJPersonNum), dataIndex: 'CJPersonNum' }], }, { title: '成交率', children: [{ - title: orders_store.show_vs_tag(ordercountTotal1.CJrate_vs, ordercountTotal1.CJrate, ordercountTotal2.CJrate), + title: comm.show_vs_tag(ordercountTotal1.CJrate_vs, ordercountTotal1.CJrate, ordercountTotal2.CJrate), dataIndex: 'CJrate' }], }, { title: '成交毛利(预计)', children: [{ - title: orders_store.show_vs_tag(ordercountTotal1.YJLY_vs, ordercountTotal1.YJLY, ordercountTotal2.YJLY), + title: comm.show_vs_tag(ordercountTotal1.YJLY_vs, ordercountTotal1.YJLY, ordercountTotal2.YJLY), dataIndex: 'YJLY' }], }, @@ -85,7 +85,7 @@ class Orders extends Component { { title: '单个订单价值', children: [{ - title: orders_store.show_vs_tag(ordercountTotal1.Ordervalue_vs, ordercountTotal1.Ordervalue, ordercountTotal2.Ordervalue), + title: comm.show_vs_tag(ordercountTotal1.Ordervalue_vs, ordercountTotal1.Ordervalue, ordercountTotal2.Ordervalue), dataIndex: 'Ordervalue' }], }, @@ -97,12 +97,12 @@ class Orders extends Component { key:item.key, OrderType: item.OrderType, OrderTypeSN: item.OrderTypeSN, - OrderCount: orders_store.show_vs_tag(item.OrderCount_vs, item.OrderCount, item2.OrderCount), - CJCount: orders_store.show_vs_tag(item.CJCount_vs, item.CJCount, item2.CJCount), - CJPersonNum: orders_store.show_vs_tag(item.CJPersonNum_vs, item.CJPersonNum, item2.CJPersonNum), - CJrate: orders_store.show_vs_tag(item.CJrate_vs, item.CJrate, item2.CJrate), - YJLY: orders_store.show_vs_tag(item.YJLY_vs, item.YJLY, item2.YJLY), - Ordervalue: orders_store.show_vs_tag(item.Ordervalue_vs, item.Ordervalue, item2.Ordervalue), + OrderCount: comm.show_vs_tag(item.OrderCount_vs, item.OrderCount, item2.OrderCount), + CJCount: comm.show_vs_tag(item.CJCount_vs, item.CJCount, item2.CJCount), + CJPersonNum: comm.show_vs_tag(item.CJPersonNum_vs, item.CJPersonNum, item2.CJPersonNum), + CJrate: comm.show_vs_tag(item.CJrate_vs, item.CJrate, item2.CJrate), + YJLY: comm.show_vs_tag(item.YJLY_vs, item.YJLY, item2.YJLY), + Ordervalue: comm.show_vs_tag(item.Ordervalue_vs, item.Ordervalue, item2.Ordervalue), }) } } @@ -218,7 +218,7 @@ class Orders extends Component { - + orders_store.onChange_Tabs(active_key)}> 来源类型} key="Form">