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