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;