import { useContext } from 'react'; import { Row, Col, Tabs, Table, Divider, Spin, Checkbox, Space } from 'antd'; import { ContainerOutlined, BlockOutlined, SmileOutlined, MobileOutlined, CustomerServiceOutlined, IeOutlined } from '@ant-design/icons'; import { Line, Pie } from '@ant-design/charts'; import { NavLink } from 'react-router-dom'; import * as comm from '@haina/utils-commons'; import DateGroupRadio from '../../components/DateGroupRadio'; import SearchForm from '../../components/search/SearchForm'; import { TableExportBtn } from '../../components/Data'; import { RenderVSDataCell } from './../../components/Data'; import { observer } from 'mobx-react'; import { toJS } from 'mobx'; import { stores_Context } from '../../config'; import { useShallow } from 'zustand/shallow'; import useToBOrderStore, { orderCountDataMapper, orderCountDataFieldMapper } from '../../zustand/ToBOrder'; const ToBOrder = observer(() => { const { date_picker_store: searchFormStore } = useContext(stores_Context); const [searchValues, setSearchValues] = useToBOrderStore(useShallow((state) => [state.searchValues, state.setSearchValues])); const [activeTab, setActiveTab] = useToBOrderStore(useShallow((state) => [state.activeTab, state.setActiveTab])); const [loading, typeLoading, onTabChange] = useToBOrderStore(useShallow((state) => [state.loading, state.typeLoading,state.onTabChange])); const orderCountDataRaw = useToBOrderStore((state) => state.orderCountDataRaw); const [orderCountDataLines, avgLineValue] = useToBOrderStore(useShallow((state) => [state.orderCountDataLines, state.avgLineValue])); const [onChangeDateGroup, activeDateGroupRadio] = useToBOrderStore(useShallow((state) => [state.onChangeDateGroup, state.activeDateGroupRadio])); const orderCountDataByType = useToBOrderStore((state) => state.orderCountDataByType); const result = orderCountDataByType[activeTab] || {}; const getToBOrderCount = useToBOrderStore((state) => state.getToBOrderCount); const showDiff = !comm.isEmpty(searchFormStore.start_date_cp); const avg_line_y = Math.round(avgLineValue); const lineConfig = { data: orderCountDataLines, padding: 'auto', xField: 'xField', yField: 'yField', seriesField: 'seriesField', // xAxis: { // type: "timeCat", // }, point: { size: 4, shape: 'cicle', }, annotations: [ { type: 'text', position: ['start', avg_line_y], content: avg_line_y, offsetX: -15, style: { fill: '#F4664A', textBaseline: 'bottom', }, }, { type: 'line', start: [-10, avg_line_y], end: ['max', avg_line_y], style: { stroke: '#F4664A', lineDash: [2, 2], }, }, ], label: {}, // 显示标签 legend: { itemValue: { formatter: (text, item) => { const items = orderCountDataLines.filter((d) => d.seriesField === item.value); // 按站点筛选 return items.length ? items.reduce((a, b) => a + b.yField, 0) : ''; // 计算总数 }, }, }, tooltip: { customItems: (originalItems) => { // process originalItems, return originalItems.map((ele) => ({ ...ele, name: ele.data?.seriesField || ele.data?.xField })); }, title: (title, datum) => { let ret = title; switch (activeDateGroupRadio) { case 'day': ret = `${title} ${comm.getWeek(datum.xField)}`; // 显示周几 break; default: break; } return ret; }, }, // smooth: true, }; const pieConfig = { appendPadding: 10, data: [], angleField: 'OrderCount', colorField: 'OrderType', radius: 0.8, label: { type: 'outer', content: '{name} {value} \t {percentage}', }, legend: false, // 不显示图例 interactions: [ { type: 'element-selected', }, { type: 'element-active', }, ], }; const tableProps = { dataSource: result?.ordercount1 || [], // table_data.dataSource, columns: [ { title: '#', fixed: 'left', children: [ { title: (
{result.ordercountTotal1?.groups}
{showDiff ?
{result.ordercountTotal2?.groups}
: null}
), titleX: `${result.ordercountTotal1?.groups}` + (showDiff ? ` vs ${result.ordercountTotal2?.groups}` : ''), dataIndex: 'OrderType', fixed: 'left', render: (text, record) => {text}, }, ], }, { title: '数量', children: [ { title: ( ), titleX: [result.ordercountTotal1?.OrderCount, result.ordercountTotal2?.OrderCount].join(' vs '), dataIndex: 'OrderCount', render: (text, r) => , }, ], }, { title: '成交数', children: [ { title: ( ), titleX: [result.ordercountTotal1?.CJCount, result.ordercountTotal2?.CJCount].join(' vs '), dataIndex: 'CJCount', render: (text, r) => , }, ], }, { title: '成交人数', children: [ { title: ( ), titleX: [result.ordercountTotal1?.CJPersonNum, result.ordercountTotal2?.CJPersonNum].join(' vs '), dataIndex: 'CJPersonNum', render: (text, r) => , }, ], }, { title: '成交率', children: [ { title: ( ), titleX: [result.ordercountTotal1?.CJrate, result.ordercountTotal2?.CJrate].join(' vs '), dataIndex: 'CJrate', render: (text, r) => , }, ], }, { title: '成交毛利(预计)', children: [ { title: ( ), titleX: [result.ordercountTotal1?.YJLY, result.ordercountTotal2?.YJLY].join(' vs '), dataIndex: 'YJLY', render: (text, r) => , }, ], }, { title: '单个订单价值', children: [ { title: ( ), titleX: [result.ordercountTotal1?.Ordervalue, result.ordercountTotal2?.Ordervalue].join(' vs '), dataIndex: 'Ordervalue', render: (text, r) => , }, ], }, ], size: 'small', pagination: false, scroll: { x: 100 * 7 }, loading, }; return ( <>
{ setSearchValues(obj, form); getToBOrderCount(obj); onTabChange(activeTab); }} /> onTabChange(active_key)} items={[ { key: 'customer_types', label: ( 分销客户 ), }, ].map((ele) => { return { ...ele, children: ( <> ), }; })} />

各项占比

{/* setIsShowEmpty(e.target.checked)} > 包含空值 */}
{showDiff && } ); }); export default ToBOrder;