feat: 外联业绩×页面类型
parent
460dd47f1c
commit
ae07f7593b
@ -0,0 +1,23 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Select } from 'antd';
|
||||||
|
import { observer } from 'mobx-react';
|
||||||
|
import { lineClass } from './../../libs/ht';
|
||||||
|
|
||||||
|
export const LineClassSelector = ({ value, onChange, ...props }) => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Select
|
||||||
|
style={{ width: '100%' }}
|
||||||
|
placeholder="选择来源类型"
|
||||||
|
value={value}
|
||||||
|
onChange={onChange}
|
||||||
|
allowClear
|
||||||
|
labelInValue
|
||||||
|
{...props}
|
||||||
|
options={lineClass}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default observer(LineClassSelector);
|
||||||
@ -0,0 +1,122 @@
|
|||||||
|
import { create } from 'zustand';
|
||||||
|
import { devtools } from 'zustand/middleware';
|
||||||
|
import { immer } from 'zustand/middleware/immer';
|
||||||
|
import { groupsMappedByCode } from '../libs/ht';
|
||||||
|
import { fetchJSON } from '@haina/utils-request';
|
||||||
|
import { HT_HOST } from '../config';
|
||||||
|
import { groupBy, isEmpty, } from '@haina/utils-commons';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 顾问业绩 (例会数据)
|
||||||
|
*/
|
||||||
|
|
||||||
|
const defaultParams = { OrderType: 227001, IsDYTJ: '', IncludeTickets: 1, Team: '', WebCodeFX: '', CusType: '', OldCus: 0, lineClass: '', IsDetail: -1 };
|
||||||
|
|
||||||
|
export const fetchMeetingDataSales = async (params) => {
|
||||||
|
const { errcode, errmsg, result } = await fetchJSON(HT_HOST + '/service-web/QueryData/WLCountForMeetingNew', {
|
||||||
|
...defaultParams,
|
||||||
|
...params,
|
||||||
|
WebCode: (params.WebCode || '').replace('all', ''),
|
||||||
|
OPI_SN: params.operator || '',
|
||||||
|
});
|
||||||
|
const ret =
|
||||||
|
errcode !== 0
|
||||||
|
? []
|
||||||
|
: (result || [])
|
||||||
|
// .filter((ele) =>
|
||||||
|
// Object.keys(ele)
|
||||||
|
// .filter((col) => !['OPI_SN', 'OPI_Name', 'COLI_LineClass', 'LineClass', 'vi'].includes(col))
|
||||||
|
// .some((col) => !isEmpty(ele[col])),
|
||||||
|
// )
|
||||||
|
.map((ele) => ({ ...ele, key: `${ele.OPI_SN}_${ele.COLI_LineClass || ''}_${ele.vi || ''}` }));
|
||||||
|
const byOPI = groupBy(structuredClone(ret), 'OPI_SN');
|
||||||
|
const OPIValue = Object.keys(byOPI).reduce((r, opisn) => {
|
||||||
|
byOPI[opisn].forEach((ele, xi) => {
|
||||||
|
ele.rowSpan = xi === 0 ? byOPI[opisn].length : 0;
|
||||||
|
});
|
||||||
|
return [...r, ...byOPI[opisn]];
|
||||||
|
}, []);
|
||||||
|
const byLineClass = groupBy(structuredClone(ret), 'LineClass');
|
||||||
|
const LineClassValue = Object.keys(byLineClass).reduce((r, gkey) => {
|
||||||
|
byLineClass[gkey].forEach((ele, xi) => {
|
||||||
|
ele.rowSpan = xi === 0 ? byLineClass[gkey].length : 0;
|
||||||
|
});
|
||||||
|
return [...r, ...byLineClass[gkey]];
|
||||||
|
}, []);
|
||||||
|
return { result: ret, OPIValue, LineClassValue };
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
const initialState = {
|
||||||
|
loading: false,
|
||||||
|
typeLoading: false,
|
||||||
|
searchValues: {
|
||||||
|
// DateType: { key: 'applyDate', label: '提交日期' },
|
||||||
|
WebCode: { key: 'all', label: '所有来源' },
|
||||||
|
IncludeTickets: { key: '1', label: '含门票' },
|
||||||
|
DepartmentList: groupsMappedByCode.GH, // { key: 'All', label: '所有来源' }, //
|
||||||
|
},
|
||||||
|
searchValuesToSub: {
|
||||||
|
// DateType: 'applyDate',
|
||||||
|
WebCode: 'all',
|
||||||
|
IncludeTickets: '1',
|
||||||
|
DepartmentList: -1, // -1: All
|
||||||
|
},
|
||||||
|
|
||||||
|
salesDataTotal: [],
|
||||||
|
salesData: [],
|
||||||
|
matrixData: {},
|
||||||
|
matrixtableMajorKey: 'opi',
|
||||||
|
matrixTableData: [],
|
||||||
|
|
||||||
|
// 二级页面
|
||||||
|
};
|
||||||
|
|
||||||
|
const useSalesInsightStore = create(
|
||||||
|
devtools(
|
||||||
|
immer((set, get) => ({
|
||||||
|
...initialState,
|
||||||
|
reset: () => set(initialState),
|
||||||
|
|
||||||
|
setLoading: (loading) => set({ loading }),
|
||||||
|
setTypeLoading: (typeLoading) => set({ typeLoading }),
|
||||||
|
|
||||||
|
setSearchValues: (obj, values) => set((state) => ({ searchValues: values, searchValuesToSub: obj })),
|
||||||
|
setSearchValuesToSub: (values) => set((state) => ({ searchValuesToSub: values })),
|
||||||
|
setActiveTab: (tab) => set({ activeTab: tab }),
|
||||||
|
|
||||||
|
|
||||||
|
// site effects
|
||||||
|
getMeetingDataSales: async (params) => {
|
||||||
|
const { setTypeLoading, } = get();
|
||||||
|
setTypeLoading(true);
|
||||||
|
try {
|
||||||
|
const res = await fetchMeetingDataSales(params);
|
||||||
|
if (params.IsDetail === 1) {
|
||||||
|
set({ matrixData: res, matrixTableData: res.OPIValue, matrixtableMajorKey: 'opi', salesData: res.result });
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
set({ salesDataTotal: res.result });
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
} finally {
|
||||||
|
setTypeLoading(false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onMatrixChange: () => {
|
||||||
|
const { matrixtableMajorKey, matrixData } = get();
|
||||||
|
const newKey = matrixtableMajorKey === 'opi' ? 'lineclass' : 'opi';
|
||||||
|
const dataKey = matrixtableMajorKey === 'opi' ? 'LineClassValue' : 'OPIValue' ;
|
||||||
|
set({ matrixtableMajorKey: newKey, matrixTableData: matrixData?.[dataKey] });
|
||||||
|
},
|
||||||
|
|
||||||
|
// sub
|
||||||
|
})),
|
||||||
|
{ name: 'SalesInsight' }
|
||||||
|
)
|
||||||
|
);
|
||||||
|
export default useSalesInsightStore;
|
||||||
Loading…
Reference in New Issue