diff --git a/src/App.jsx b/src/App.jsx
index a465a07..7e0c7ad 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -58,6 +58,8 @@ import Hotel from './views/Hotel';
import HostCaseCount from './views/HostCaseCount';
import TrainsUpsell from './views/biz/reports/TrainsUpsell';
import HostCaseReport from './views/HostCaseReport';
+import ToBOrder from './views/toB/ToBOrder';
+import ToBOrderSub from './views/toB/ToBOrderSub';
const App = () => {
const { Content, Footer, Sider, } = Layout;
@@ -93,6 +95,11 @@ const App = () => {
label: 订单数据,
// icon: ,
},
+ {
+ key: 'tob_orders',
+ label: 分销订单,
+ // icon: ,
+ },
{
key: 22,
label: 仪表盘,
@@ -260,6 +267,8 @@ const App = () => {
} />
} />
} />
+ } />
+ } />
} />
} />
} />
diff --git a/src/views/toB/ToBOrder.jsx b/src/views/toB/ToBOrder.jsx
new file mode 100644
index 0000000..27fcaf4
--- /dev/null
+++ b/src/views/toB/ToBOrder.jsx
@@ -0,0 +1,366 @@
+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;
diff --git a/src/views/toB/ToBOrderSub.jsx b/src/views/toB/ToBOrderSub.jsx
new file mode 100644
index 0000000..5a53590
--- /dev/null
+++ b/src/views/toB/ToBOrderSub.jsx
@@ -0,0 +1,280 @@
+import { useContext, useEffect } from 'react';
+import { Row, Col, Tabs, Table, Divider, Spin, Space } from 'antd';
+import { ContainerOutlined, BlockOutlined, SmileOutlined, MobileOutlined } from '@ant-design/icons';
+import { Line } from '@ant-design/charts';
+import { NavLink, useParams } from 'react-router-dom';
+import { getWeek } from '@haina/utils-commons';
+import DateGroupRadio from '../../components/DateGroupRadio';
+import SearchForm from '../../components/search/SearchForm';
+import { TableExportBtn } from '../../components/Data';
+
+import { observer } from 'mobx-react';
+import { stores_Context } from '../../config';
+import { useShallow } from 'zustand/shallow';
+import useToBOrderStore, { orderCountDataMapper, orderCountDataFieldMapper } from '../../zustand/ToBOrder';
+
+// 在逗号和分号处自动换行的函数
+const addLineBreaksAtCommas = (text) => {
+ if (!text) return '';
+ return text.replace(/&/g, '&').replace(/,/g, ',\n').replace(/,/g, ',\n').replace(/;/g, ';\n').replace(/;/g, ';\n');
+};
+
+const OrderDetailTable = ({ caption, dataSource, loading, ...props }) => {
+ const columns = [
+ {
+ title: '订单号',
+ dataIndex: 'COLI_ID',
+ key: 'COLI_ID',
+ },
+ {
+ title: '网站',
+ dataIndex: 'COLI_WebCode',
+ key: 'COLI_WebCode',
+ },
+ {
+ title: '成行',
+ dataIndex: 'COLI_Success',
+ key: 'COLI_Success',
+ render: (text, record) => {text == 1 ? '是' : '否'},
+ sorter: (a, b) => b.COLI_Success - a.COLI_Success,
+ },
+ // {
+ // title: "人数(成/童/婴)",
+ // dataIndex: "COLI_PersonNum",
+ // key: "COLI_PersonNum",
+ // render: (text, record) => (
+ //
+ // {record.COLI_PersonNum}/{record.COLI_ChildNum}/{record.COLI_BabyNum}
+ //
+ // ),
+ // },
+ {
+ title: '预计利润',
+ dataIndex: 'CGI_YJLY',
+ key: 'CGI_YJLY',
+ },
+ {
+ title: '预定时间',
+ dataIndex: 'COLI_ApplyDate',
+ key: 'COLI_ApplyDate',
+ },
+ {
+ title: '出发日期',
+ dataIndex: 'CGI_ArriveDate',
+ key: 'CGI_ArriveDate',
+ },
+ // {
+ // title: '客人需求',
+ // dataIndex: 'COLI_CustomerRequest',
+ // key: 'COLI_CustomerRequest',
+ // ellipsis: true,
+ // },
+ {
+ title: '订单内容',
+ dataIndex: 'COLI_OrderDetailText',
+ key: 'COLI_OrderDetailText',
+ ellipsis: true,
+ },
+ Table.EXPAND_COLUMN,
+ ];
+ return (
+