From 81313ec86c17fc5cf9abb304d50c75d3a10d04f4 Mon Sep 17 00:00:00 2001 From: Lei OT Date: Wed, 20 Sep 2023 13:48:55 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=20=E5=B9=B4=E5=BA=A6=20?= =?UTF-8?q?=E5=9B=BD=E5=86=85/=E6=B5=B7=E5=A4=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/BulletWithSort.jsx | 12 +++++++----- src/components/Waterfall.jsx | 5 ++--- src/components/search/BusinessSelect.jsx | 4 +++- src/components/search/SearchForm.jsx | 8 ++++++++ src/libs/ht.js | 24 ++++++++++++++++++++---- src/stores/Trade.js | 8 ++++---- src/utils/commons.js | 8 ++++++++ src/views/Home.jsx | 3 +-- 8 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/components/BulletWithSort.jsx b/src/components/BulletWithSort.jsx index bd9fb6d..b10572e 100644 --- a/src/components/BulletWithSort.jsx +++ b/src/components/BulletWithSort.jsx @@ -19,7 +19,6 @@ export default observer((props) => { const sortData = origin.sort(sortBy(measureField)).slice(-itemLength); // 顶格的值定在更远 const _parseData = sortData?.map((ele) => ({ ...ele, [rangeField]: [0, Math.ceil(_max / 0.9)], [measureField]: [ele[measureField]] })); - console.log(_parseData, 'vvvvvvvvvvvvvv'); return _parseData; }; @@ -36,13 +35,16 @@ export default observer((props) => { target: '#FF9845', }, label: { - // target: true, - // measure: { + target: false, + measure: { // position: extProps?.vertical === 'vertical' ? 'top' : 'right', // style: { // fill: '#063CAA', // }, - // }, + formatter: (v) => { + return dataFieldAlias[extProps.measureField]?.formatter(v[extProps.measureField]) || v; + } + }, }, xAxis: { line: null, @@ -81,7 +83,7 @@ export default observer((props) => { tooltip: { customItems: (originalItems) => { // process originalItems, - return originalItems.map((ele) => ({ ...ele, name: dataFieldAlias[ele.name]?.alias || ele.name })); + return originalItems.map((ele) => ({ ...ele, value: dataFieldAlias[ele.name]?.formatter(Number(ele.value)), name: dataFieldAlias[ele.name]?.alias || ele.name })); }, }, }, extProps); diff --git a/src/components/Waterfall.jsx b/src/components/Waterfall.jsx index 4df8f2d..2ec6bd6 100644 --- a/src/components/Waterfall.jsx +++ b/src/components/Waterfall.jsx @@ -5,14 +5,13 @@ import { merge } from '../utils/commons'; export default observer((props) => { const { dataSource, line, title, ...extProps } = props; - const yMax = (Math.max(line?.value || 0, ...dataSource.map((ele) => ele[extProps.yField])))*10; - console.log(title, 'title waterfall', yMax); + const yMax = (Math.max(line?.value || 0, ...dataSource.map((ele) => ele[extProps.yField])))*1; const annotationsLine = line ? [ { type: 'text', position: ['start', line.value], - content: `${line.label} ${line.value / 1000} K`, + content: `${line.label} ${line.value / 10000} 万`, // offsetX: -15, style: { fill: '#F4664A', diff --git a/src/components/search/BusinessSelect.jsx b/src/components/search/BusinessSelect.jsx index 5cd1f25..cb94770 100644 --- a/src/components/search/BusinessSelect.jsx +++ b/src/components/search/BusinessSelect.jsx @@ -29,5 +29,7 @@ const Business_unit = (props) => { ); }; - +/** + * 基于组织架构 + */ export default observer(Business_unit); diff --git a/src/components/search/SearchForm.jsx b/src/components/search/SearchForm.jsx index f9640b8..725b5ab 100644 --- a/src/components/search/SearchForm.jsx +++ b/src/components/search/SearchForm.jsx @@ -7,6 +7,7 @@ import { Form, Row, Col, Select, Button, Space, DatePicker } from 'antd'; import moment from 'moment'; // import locale from 'antd/es/date-picker/locale/zh_CN'; import BusinessSelect from './BusinessSelect'; +import BusinessUnitSelect from './BusinessUnitSelect'; import GroupSelect from './GroupSelect'; import SiteSelect from './SiteSelect'; import DateTypeSelect from './DataTypeSelect'; @@ -203,6 +204,13 @@ function getFields(props) { }; let baseChildren = []; baseChildren = [ + item( + 'HTBusinessUnits', + 99, + + + + ), item( 'businessUnits', 99, diff --git a/src/libs/ht.js b/src/libs/ht.js index cd04159..65654ed 100644 --- a/src/libs/ht.js +++ b/src/libs/ht.js @@ -81,7 +81,7 @@ export const dateTypes = [ * 结果字段 */ export const dataFieldOptions = [ - { label: '毛利', value: 'SumML', formatter: (v) => `${v / 1000} K`, nestkey: { p: 'MLKPIrates', v: 'MLKPIvalue' } }, + { label: '毛利', value: 'SumML', formatter: (v) => `${v / 10000} 万`, nestkey: { p: 'MLKPIrates', v: 'MLKPIvalue' } }, { label: '订单数', value: 'SumOrder', formatter: (v) => v, nestkey: { p: 'OrderKPIrates', v: 'OrderKPIvalue' } }, { label: '成交数', value: 'ConfirmOrder', formatter: (v) => v, nestkey: { p: 'ConfirmOrderKPIrates', v: 'ConfirmOrderKPIvalue' } }, { label: '成交率', value: 'ConfirmRates', formatter: (v) => v, nestkey: { p: 'ConfirmRatesKPIrates', v: 'ConfirmRatesKPIvalue' } }, @@ -95,7 +95,7 @@ export const dataFieldAlias = dataFieldOptions.reduce( (a, c) => ({ ...a, [c.value]: { ...c, alias: c.label, formatter: (v) => c.formatter(v) }, - [c.nestkey.v]: { ...c, alias: `${c.label}目标`, formatter: (v) => c.formatter(v) }, + [c.nestkey.v]: { ...c, value: c.nestkey.v, alias: `${c.label}目标`, formatter: (v) => c.formatter(v) }, }), {} ); @@ -104,11 +104,27 @@ export const dataFieldAlias = dataFieldOptions.reduce( * KPI对象 */ export const KPIObjects = [ - { key: 'overview', value: 'overview', label: '总额' }, + { key: 'overview', value: 'overview', label: '海纳' }, { key: 'bu', value: 'bu', label: '事业部' }, { key: 'dept', value: 'dept', label: '小组' }, - { key: 'du', value: 'du', label: '顾问小组' }, + { key: 'du', value: 'du', label: '销售小组' }, { key: 'operator', value: 'operator', label: '顾问' }, { key: 'destination', value: 'destination', label: '目的地' }, { key: 'country', value: 'country', label: '国籍' }, ]; +export const KPISubjects = [ + { key: 'sum_profit', value: 'sum_profit', label: '毛利' }, + { key: 'in_order_count', value: 'in_order_count', label: '订单数'}, + { key: 'confirm_order_count', value: 'confirm_order_count', label: '成团'}, + { key: 'depart_order_count', value: 'depart_order_count', label: '走团'}, + { key: 'confirm_rates', value: 'confirm_rates', label: '成型率'}, + { key: 'praise_rates', value: 'praise_rates', label: '表扬率'}, + // { key: 'first_reply_rates', value: 'first_reply_rates', label: '首报回复率'}, + // { key: 'quote_rates', value: 'quote_rates', label: '报价率'}, + // { key: 'first_post_time', value: 'first_post_time', label: '订单到首邮发送时间'}, + // { key: 'reply_rates_wechat', value: 'reply_rates_wechat', label: '微信回复率'}, + // { key: 'reply_rates_wa', value: 'reply_rates_wa', label: 'WA回复率'}, + // { key: 'reply_eff_wechat', value: 'reply_eff_wechat', label: '微信回复效率'}, + // { key: 'reply_eff_wa', value: 'reply_eff_wa', label: 'WA回复效率'}, + { key: 'sum_person_num', value: 'sum_person_num', label: '人数'}, +]; diff --git a/src/stores/Trade.js b/src/stores/Trade.js index 10c176f..a726e92 100644 --- a/src/stores/Trade.js +++ b/src/stores/Trade.js @@ -30,7 +30,7 @@ class Trade { KPIrate: summary?.[dataFieldAlias.ConfirmOrder.nestkey.p], hasKPI: !isEmpty(summary?.[dataFieldAlias.ConfirmOrder.nestkey.p]), }, - { title: '毛利', value: summary?.SumML, KPIrate: summary?.[dataFieldAlias.SumML.nestkey.p], hasKPI: !isEmpty(summary?.[dataFieldAlias.SumML.nestkey.p]) }, + { title: '毛利', value: summary?.SumML, KPIrate: summary?.[dataFieldAlias.SumML.nestkey.p], hasKPI: false }, { title: '完成率', value: `${summary?.[dataFieldAlias.SumML.nestkey.p] || ''}%`, hasKPI: false }, { title: '人数', @@ -92,9 +92,9 @@ class Trade { */ fetchTradeDataByMonth(queryData) { this.sideData.loading = true; - // Object.assign(queryData, { groupType: 'bizarea', groupDateType: 'month' }); // todo: groupType: bizarea - Object.assign(queryData, { groupType: 'bu', groupDateType: 'month' }); + // Object.assign(queryData, { groupType: 'bu', groupDateType: 'month' }); + Object.assign(queryData, { groupType: 'bizarea', groupDateType: 'month' }); this.fetchTradeData(queryData).then((json) => { if (json.errcode === 0) { runInAction(() => { @@ -103,7 +103,7 @@ class Trade { * test: '91006' */ const groupsData = sortResult.reduce((r, v) => { - if (v.groupsLabel && ['91001', '91006'].includes(v.groupsKey)) { // , '91006' + if (v.groupsLabel ) { // && ['91001', '91006'].includes(v.groupsKey) (r[v.groupsLabel] || (r[v.groupsLabel] = [])).push(v); } return r; diff --git a/src/utils/commons.js b/src/utils/commons.js index 5050b07..6a9adff 100644 --- a/src/utils/commons.js +++ b/src/utils/commons.js @@ -391,6 +391,7 @@ export const fixTo2Decimals = curriedFix(2); * 向零四舍五入, 保留4位小数 */ export const fixTo4Decimals = curriedFix(4); +export const fixToInt = curriedFix(0); /** * 映射 @@ -498,3 +499,10 @@ export function flush(collection) { } return undefined; } + +/** + * 千分位 格式化数字 + */ +export const numberFormatter = (number) => { + return new Intl.NumberFormat().format(number); +}; diff --git a/src/views/Home.jsx b/src/views/Home.jsx index b7c88e1..9109c48 100644 --- a/src/views/Home.jsx +++ b/src/views/Home.jsx @@ -70,7 +70,7 @@ export default observer(() => { measureField: key, rangeField: `${key}Range`, // targetField: `${key}KPI`, - targetField: dataFieldAlias[key].nestkey.p, + targetField: dataFieldAlias[key].nestkey.v, xField: 'groupsLabel', }); }; @@ -128,7 +128,6 @@ export default observer(() => { setLineConfig({ ...lineConfig, yField: key, - // ? 全局的alias不起作用 tooltip: { customItems: (originalItems) => { // process originalItems,