首页 年度 国内/海外

feature/2.0-sales-trade
Lei OT 2 years ago
parent 9985d4272b
commit 81313ec86c

@ -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);

@ -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',

@ -29,5 +29,7 @@ const Business_unit = (props) => {
</div>
);
};
/**
* 基于组织架构
*/
export default observer(Business_unit);

@ -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,
<Form.Item name={`HTBusinessUnits`} initialValue={at(props, 'initialValue.HTBusinessUnits')[0] || undefined}>
<BusinessUnitSelect {...fieldProps.HTBusinessUnits} />
</Form.Item>
),
item(
'businessUnits',
99,

@ -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: '人数'},
];

@ -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;

@ -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);
};

@ -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,

Loading…
Cancel
Save