You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dashboard/src/zustand/CustomerRelations.js

173 lines
6.5 KiB
JavaScript

import { create } from 'zustand';
import { devtools } from 'zustand/middleware';
import { immer } from 'zustand/middleware/immer';
import { fetchJSON } from '@haina/utils-request';
import { HT_HOST } from '../config';
import { formatDate, isEmpty, sortBy } from '@haina/utils-commons';
import { groupsMappedByKey, sitesMappedByCode, pivotBy } from './../libs/ht';
const defaultParams = {};
export const fetchRegularCustomer = async (params) => {
const _params = {
Website: params.WebCode || '', // CHT,AH,JH,GH,ZWQD,GH_ZWQD_HW,GHKYZG,GHKYHW,HTravel
DEI_SNList: params.DepartmentList || '', // 1,2,28,7
ApplydateCheck: params.DateType === 'applyDate' ? 1 : 0, //
EntrancedateCheck: params.DateType === 'startDate' ? 1 : 0, //
ConfirmDateCheck: params.DateType === 'confirmDate' ? 1 : 0, //
ApplydateStart: params.Date1 || '',
ApplydateEnd: params.Date2 || '',
EntrancedateStart: params.Date1 || '',
EntrancedateEnd: params.Date2 || '',
ConfirmdateStart: params.Date1 || '',
ConfirmdateEnd: params.Date2 || '',
IsDetail: '', //
IncludeTickets: '', //
...params,
};
const { WebCode, DepartmentList, DateType, Date1, Date2, ...readyParams } = _params;
const [result1=[], result2=[]] = await Promise.all([
fetchJSON(HT_HOST + '/service-tourdesign/RegularCusOrder', { ...defaultParams, ...readyParams }),
...(params.DateDiff1 && params.IsDetail === 0
? [
fetchJSON(HT_HOST + '/service-tourdesign/RegularCusOrder', {
...defaultParams,
...readyParams,
ApplydateStart: params.DateDiff1 || '',
ApplydateEnd: params.DateDiff2 || '',
EntrancedateStart: params.DateDiff1 || '',
EntrancedateEnd: params.DateDiff2 || '',
ConfirmdateStart: params.DateDiff1 || '',
ConfirmdateEnd: params.DateDiff2 || '',
}),
]
: []),
]);
if (params.IsDetail === 1) {
return { result1, result2 };
}
const ret = {};
const result1Mapped = result1.reduce((r, v) => ({ ...r, [v.ItemName]: v }), {});
const allKeys = [...new Set([...result1.map((e) => e.ItemName), ...result2.map((e) => e.ItemName)])];
const result2Mapped = result2.reduce((r, v) => ({ ...r, [v.ItemName]: v }), {});
const x = {};
allKeys.forEach((key) => {
x[key] = { ...(result1Mapped?.[key] || { ItemName: key }), diff: result2Mapped[key] || {} };
});
ret.result1 = Object.values(x);
return { result1: ret.result1 }; // { result1, result2 };
};
// 老客户: 日期对应的数据字段
const dateTypeDataHelper = {
applyDate: 'SumOrder',
startDate: 'ConfirmOrder',
confirmDate: 'ConfirmOrder',
};
/**
* 构建 老客户系列数据
* * 用明细数据计算
* @param {[]} details
* @param {string} pivotByOrder
* @param {string} pivotByDate
* @returns
*/
const buildSeriesDataFromDetails = (details, pivotByOrder, pivotByDate) => {
const dataDetail = (details || []).map((ele) => ({
...ele,
key: ele.COLI_ID,
orderState: ele.OrderState,
applyDate: formatDate(new Date(ele.COLI_ApplyDate)),
startDate: ele.COLI_OrderStartDate,
confirmDate: formatDate(new Date(ele.COLI_ConfirmDate)),
}));
const { data: IsOldData } = pivotBy(
dataDetail.filter((ele) => ele.COLI_IsOld === '是'),
[['COLI_IsOld'], [], pivotByDate]
);
const { data: isCusCommendData } = pivotBy(
dataDetail.filter((ele) => ele.COLI_IsCusCommend === '是'),
[['COLI_IsCusCommend'], [], pivotByDate]
);
// console.log('IsOldData====', IsOldData, '\nisCusCommend', isCusCommendData);
// 合并成两个系列
const seriesData = []
.concat(
IsOldData.map((ele) => ({ ...ele, _ylabel: '老客户' })),
isCusCommendData.map((ele) => ({ ...ele, _ylabel: '老客户推荐' }))
)
.sort(sortBy(pivotByDate));
return seriesData;
};
/**
* --------------------------------------------------------------------------------------------------------
*/
const initialState = {
loading: false,
loading2: false,
searchValues: {
DepartmentList: ['1', '2', '28', '7'].map((kk) => groupsMappedByKey[kk]),
WebCode: ['CHT', 'AH', 'JH', 'GH', 'ZWQD', 'GH_ZWQD_HW', 'GHKYZG', 'GHKYHW', 'HTravel'].map((kk) => sitesMappedByCode[kk]),
DateType: { key: 'applyDate', label: '提交日期' },
IncludeTickets: { key: '0', label: '不含门票' },
},
searchValuesToSub: {},
regular: { data: [], details: [], total_data_tips: '', pivotData: [], pivotY: 'SumOrder', pivotX: '' },
};
const useCustomerRelationsStore = create(
devtools(
immer((set, get) => ({
...initialState,
reset: () => set(initialState),
setLoading: (loading) => set({ loading }),
setLoading2: (loading2) => set({ loading2 }),
setSearchValues: (obj, values) => set((state) => ({ searchValues: values, searchValuesToSub: obj })),
setSearchValuesToSub: (values) => set((state) => ({ searchValuesToSub: values })),
// 获取数据 ---------------------------------------------------------------------------------------------------
// 老客户
getRegularCustomer: async (params) => {
const { setLoading, setLoading2 } = get();
const { IsDetail } = params;
setLoading(true);
setLoading2(IsDetail === 1);
const pivotByOrder = dateTypeDataHelper[params.DateType];
const pivotByDate = params.DateType;
try {
const {result1, result2} = await fetchRegularCustomer(params);
set((state) => {
if (IsDetail === 1) {
state.regular.details = result1;
const dump_l = (result1 || []).filter((ele) => ele.COLI_IsOld !== '' && ele.COLI_IsCusCommend !== '').length;
state.regular.total_data_tips = dump_l > 0 ? `包含 ${dump_l} 条同时勾选的数据` : '';
/** 使用明细数据画图 */
const seriesData = buildSeriesDataFromDetails(result1, pivotByOrder, pivotByDate);
state.regular.pivotData = seriesData;
state.regular.pivotX = pivotByDate;
state.regular.pivotY = pivotByOrder;
} else {
console.log('0000');
state.regular.data = result1;
}
});
} catch (error) {
console.error(error);
} finally {
setLoading(false);
IsDetail === 1 && setLoading2(false);
}
},
})),
{ name: 'CustomerRelations' }
)
);
export default useCustomerRelationsStore;