feat: 产品管理: 导出合同

main
Lei OT 1 month ago
parent 7e0b48bf2d
commit 9e6a244504

@ -2,7 +2,7 @@ import { flush, groupBy, isEmpty, isNotEmpty, pick, unique, uniqWith } from '@/u
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { formatGroupSize } from './useProductsSets'; import { formatGroupSize } from './useProductsSets';
// Shoulder Season 平季; peak season 旺季 // Shoulder Season 平季; peak season 旺季
const isFullYearOrLonger = (year, startDate, endDate) => { export const isFullYearOrLonger = (year, startDate, endDate) => {
// Parse the dates // Parse the dates
const start = dayjs(startDate, 'YYYY-MM-DD'); const start = dayjs(startDate, 'YYYY-MM-DD');
const end = dayjs(endDate, 'YYYY-MM-DD'); const end = dayjs(endDate, 'YYYY-MM-DD');
@ -74,6 +74,7 @@ export const chunkBy = (use_year, dataList = [], by = []) => {
return aq; return aq;
}, {}); }, {});
// 补全产品旺季的人等分组 (当旺季和平季的人等不完全一致时)
for (const WPI in PGroupSizeSS) { for (const WPI in PGroupSizeSS) {
if (Object.prototype.hasOwnProperty.call(PGroupSizeSS, WPI)) { if (Object.prototype.hasOwnProperty.call(PGroupSizeSS, WPI)) {
const element = PGroupSizeSS[WPI]; const element = PGroupSizeSS[WPI];
@ -168,11 +169,12 @@ export const chunkBy = (use_year, dataList = [], by = []) => {
const rowsByDate = groupBy(_sizeRows, qi => `${qi.use_dates_start}~${qi.use_dates_end}`); const rowsByDate = groupBy(_sizeRows, qi => `${qi.use_dates_start}~${qi.use_dates_end}`);
const _rowsFromDate = Object.keys(rowsByDate).reduce((accDate, dateKeys) => { const _rowsFromDate = Object.keys(rowsByDate).reduce((accDate, dateKeys) => {
const _dateRows = rowsByDate[dateKeys]; const _dateRows = rowsByDate[dateKeys];
const rowKey = _dateRows.map(e => e.id).join(',');
const keepCol = pick(_dateRows[0], ['WPI_SN', 'WPP_VEI_SN', 'currency', 'unit_id', 'unit_name', 'use_dates_start', 'use_dates_end', 'weekdays', 'quote_season']); const keepCol = pick(_dateRows[0], ['WPI_SN', 'WPP_VEI_SN', 'currency', 'unit_id', 'unit_name', 'use_dates_start', 'use_dates_end', 'weekdays', 'quote_season']);
const _colFromDateRow = _dateRows.reduce((accCols, rowp) => { const _colFromDateRow = _dateRows.reduce((accCols, rowp) => {
// const _colRow = pick(rowp, ['currency', 'unit_id', 'unit_name', 'use_dates_start', 'use_dates_end', 'weekdays', 'child_cost', 'adult_cost']); // const _colRow = pick(rowp, ['currency', 'unit_id', 'unit_name', 'use_dates_start', 'use_dates_end', 'weekdays', 'child_cost', 'adult_cost']);
return { ...accCols, [rowp.quote_col_key]: rowp }; return { ...accCols, [rowp.quote_col_key]: rowp };
}, {...keepCol, originRows: _dateRows }); }, {...keepCol, originRows: _dateRows, rowKey });
accDate.push(_colFromDateRow); accDate.push(_colFromDateRow);
return accDate; return accDate;
}, []); }, []);
@ -211,7 +213,7 @@ export const chunkBy = (use_year, dataList = [], by = []) => {
* 按人等拆分表格 * 按人等拆分表格
* @use D J B R 8 * @use D J B R 8
*/ */
const splitTable_SizeSets = (chunkData) => { export const splitTable_SizeSets = (chunkData) => {
const { SSRange, PSRange, SSsizeSetKey, SSsizeSetsMap, chunk } = chunkData; const { SSRange, PSRange, SSsizeSetKey, SSsizeSetsMap, chunk } = chunkData;
const bySizeSetKey = groupBy(chunk, 'sizeSetsSS'); // next: city const bySizeSetKey = groupBy(chunk, 'sizeSetsSS'); // next: city
// agencyProducts.J. // agencyProducts.J.
@ -241,7 +243,7 @@ const splitTable_SizeSets = (chunkData) => {
* 按季度分列 [平季, 旺季] * 按季度分列 [平季, 旺季]
* @use Q 7 6 * @use Q 7 6
*/ */
const splitTable_Season = (chunkData) => { export const splitTable_Season = (chunkData) => {
const { SSRange, PSRange, SSsizeSetKey, SSsizeSetsMap, chunk } = chunkData; const { SSRange, PSRange, SSsizeSetKey, SSsizeSetsMap, chunk } = chunkData;
// console.log(chunkData); // console.log(chunkData);
const tablesQuote = chunk.map((pitem) => { const tablesQuote = chunk.map((pitem) => {
@ -256,6 +258,7 @@ const splitTable_Season = (chunkData) => {
const valRow = pick(valRows[0], ['adult_cost', 'child_cost', 'currency', 'unit_id', 'unit_name', 'group_size_min', 'group_size_max']); const valRow = pick(valRows[0], ['adult_cost', 'child_cost', 'currency', 'unit_id', 'unit_name', 'group_size_min', 'group_size_max']);
// valRow.dates = valRows.map((v) => pick(v, ['id', 'use_dates_end', 'use_dates_start'])); // valRow.dates = valRows.map((v) => pick(v, ['id', 'use_dates_end', 'use_dates_start']));
valRow.rows = valRows; valRow.rows = valRows;
valRow.rowKey = valRows.map(v => v.id).join(',');
accv.push(valRow); accv.push(valRow);
return accv; return accv;
}, []); }, []);
@ -263,22 +266,24 @@ const splitTable_Season = (chunkData) => {
return { ...accp, [_s]: valUnderSeason }; return { ...accp, [_s]: valUnderSeason };
}, {}); }, {});
// console.log('---- rowSeason', rowSeason); // console.log('---- rowSeason', rowSeason);
return { info: pitem.info, ...rowSeason }; return { info: pitem.info, ...rowSeason, rowKey: pitem.info.id };
}); });
// console.log('---- tablesQuote', tablesQuote); // console.log('---- tablesQuote', tablesQuote);
return tablesQuote; return tablesQuote;
}; };
export const splitTable_D = (use_year, dataSource) => { export const splitTable_D = (use_year, dataSource, retTableOnly = true) => {
const chunked = chunkBy(use_year, dataSource); const chunked = chunkBy(use_year, dataSource);
// console.log(chunked); // console.log(chunked);
return addCityRow4Split(splitTable_SizeSets(chunked)); const tables = addCityRow4Split(splitTable_SizeSets(chunked));
return retTableOnly ? tables : { ...chunked, tables };
}; };
export const splitTable_J = (use_year, dataSource) => { export const splitTable_J = (use_year, dataSource, retTableOnly = true) => {
const chunked = chunkBy(use_year, dataSource); const chunked = chunkBy(use_year, dataSource);
// console.log(chunked); // console.log(chunked);
return addCityRow4Split(splitTable_SizeSets(chunked)); const tables = addCityRow4Split(splitTable_SizeSets(chunked));
return retTableOnly ? tables : { ...chunked, tables };
}; };
export const splitTable_Q = (use_year, dataSource) => { export const splitTable_Q = (use_year, dataSource) => {
@ -291,10 +296,11 @@ export const splitTable_7 = (use_year, dataSource) => {
return addCityRow4Season(splitTable_Season(chunked)); return addCityRow4Season(splitTable_Season(chunked));
}; };
export const splitTable_R = (use_year, dataSource) => { export const splitTable_R = (use_year, dataSource, retTableOnly = true) => {
const chunked = chunkBy(use_year, dataSource); const chunked = chunkBy(use_year, dataSource);
// console.log(chunked); // console.log(chunked);
return addCityRow4Split(splitTable_SizeSets(chunked)); const tables = addCityRow4Split(splitTable_SizeSets(chunked));
return retTableOnly ? tables : { ...chunked, tables };
}; };
export const splitTable_8 = (use_year, dataSource) => { export const splitTable_8 = (use_year, dataSource) => {
@ -303,22 +309,24 @@ export const splitTable_8 = (use_year, dataSource) => {
return addCityRow4Split(splitTable_SizeSets(chunked)); return addCityRow4Split(splitTable_SizeSets(chunked));
}; };
export const splitTable_6 = (use_year, dataSource) => { export const splitTable_6 = (use_year, dataSource, retTableOnly = true) => {
const chunked = chunkBy(use_year, dataSource, ['quote_season']); const chunked = chunkBy(use_year, dataSource, ['quote_season']);
return (splitTable_Season(chunked)); const tables = splitTable_Season(chunked);
return retTableOnly ? tables : { ...chunked, tables };
}; };
export const splitTable_B = (use_year, dataSource) => { export const splitTable_B = (use_year, dataSource, retTableOnly = true) => {
const chunked = chunkBy(use_year, dataSource); const chunked = chunkBy(use_year, dataSource);
// console.log(chunked); // console.log(chunked);
return addCityRow4Split(splitTable_SizeSets(chunked)); const tables = addCityRow4Split(splitTable_SizeSets(chunked));
return retTableOnly ? tables : { ...chunked, tables };
}; };
export const addCityRow4Season = (table) => { export const addCityRow4Season = (table) => {
const byCity = groupBy(table, (ele) => `${ele.info.city_id}@${ele.info.city_name}`); const byCity = groupBy(table, (ele) => `${ele.info.city_id}@${ele.info.city_name}`);
const withCityRow = Object.keys(byCity).reduce((acc, cityIdName) => { const withCityRow = Object.keys(byCity).reduce((acc, cityIdName) => {
const [cityId, cityName] = cityIdName.split('@'); const [cityId, cityName] = cityIdName.split('@');
acc.push({ info: { product_title: cityName, isCityRow: true,}, use_dates_end: '', use_dates_start: '', quote_season: 'SS', rowSpan: 1 }); acc.push({ info: { product_title: cityName, isCityRow: true,}, use_dates_end: '', use_dates_start: '', quote_season: 'SS', rowSpan: 1, rowKey: `c_${cityId}` });
return acc.concat(byCity[cityIdName]); return acc.concat(byCity[cityIdName]);
}, []); }, []);
return withCityRow; return withCityRow;

@ -172,20 +172,23 @@ const Header = ({ refresh, ...props }) => {
// await refresh(); // await refresh();
const agencyExtras = await getAgencyAllExtrasAction(switchParams); const agencyExtras = await getAgencyAllExtrasAction(switchParams);
const remarks = await getRemarkList() const remarks = await getRemarkList()
const remarksMappedByType = remarks.reduce((r, v) => ({...r, [v.product_type_id]: v}), {});
const documentCreator = new AgencyContract(); const documentCreator = new AgencyContract();
const doc = documentCreator.create([ const doc = documentCreator.create([
switchParams, switchParams,
activeAgency, activeAgency,
agencyProducts, agencyProducts,
agencyExtras, agencyExtras,
remarks // remarks,
remarksMappedByType,
]); ]);
const _d = dayjs().format("YYYYMMDD_HH.mm.ss.SSS"); // Date.now().toString(32) const _d = dayjs().format("YYYYMMDD_HH.mm.ss.SSS"); // Date.now().toString(32)
const _state = pickAuditState.value ? pickAuditState.label : '';
Packer.toBlob(doc).then((blob) => { Packer.toBlob(doc).then((blob) => {
saveAs( saveAs(
blob, blob,
`${activeAgency.travel_agency_name}${pickYear}年地接合同-${_d}.docx` `${activeAgency.travel_agency_name}${pickYear}年地接合同-${_state}-${_d}.docx`
); );
}); });
}; };

File diff suppressed because it is too large Load Diff

@ -57,10 +57,11 @@ const AgencyPreview = ({ params, ...props }) => {
if (!('6' in agencyProducts)) { if (!('6' in agencyProducts)) {
return null; return null;
} }
const tablesQuote = splitTable_6(use_year, agencyProducts['6']); const {tables, SSRange} = splitTable_6(use_year, agencyProducts['6'], false);
const table2Rows = tablesQuote.reduce((acc, {info, SS}) => { const table2Rows = tables.reduce((acc, {info, SS}) => {
return acc.concat(SS.map((v, i) => ({...v, info, rowSpan: i===0 ? SS.length : 0}))); return acc.concat(SS.map((v, i) => ({...v, info, rowSpan: i===0 ? SS.length : 0})));
}, []); }, []);
// console.log('tablesQuote', tablesQuote)
// console.log('table2Rows', table2Rows) // console.log('table2Rows', table2Rows)
return ( return (
<> <>
@ -68,7 +69,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered bordered
striped striped
sticky={{ offsetHeader: -24 }} sticky={{ offsetHeader: -24 }}
key={'ti'} key={'ti6'}
rowKey={'rowKey'}
dataSource={table2Rows} dataSource={table2Rows}
size={'small'} size={'small'}
pagination={false} pagination={false}
@ -92,7 +94,7 @@ const AgencyPreview = ({ params, ...props }) => {
render: (_, r) => <div>{formatGroupSize(r.group_size_min, r.group_size_max, true)}</div>, render: (_, r) => <div>{formatGroupSize(r.group_size_min, r.group_size_max, true)}</div>,
}, },
{ {
title: '-', title: <>{SSRange.map(v => <div key={v}>{v}</div>)}</>,
dataIndex: 'SS', dataIndex: 'SS',
key: 'SS', key: 'SS',
width: '9rem', width: '9rem',
@ -121,7 +123,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered bordered
striped striped
sticky={{ offsetHeader: -24 }} sticky={{ offsetHeader: -24 }}
key={ti} key={colsKey}
rowKey={'rowKey'}
rowClassName={cityRowHighlights} rowClassName={cityRowHighlights}
columns={[ columns={[
{ {
@ -190,6 +193,7 @@ const AgencyPreview = ({ params, ...props }) => {
return null; return null;
} }
const tablesQuote = splitTable_J(use_year, agencyProducts.J); const tablesQuote = splitTable_J(use_year, agencyProducts.J);
// console.log(tablesQuote)
return ( return (
<> <>
{tablesQuote.map(({ cols, colsKey, data }, ti) => ( {tablesQuote.map(({ cols, colsKey, data }, ti) => (
@ -197,7 +201,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered bordered
striped striped
sticky={{ offsetHeader: -24 }} sticky={{ offsetHeader: -24 }}
key={ti} key={colsKey}
rowKey={'rowKey'}
rowClassName={cityRowHighlights} rowClassName={cityRowHighlights}
columns={[ columns={[
{ {
@ -218,11 +223,11 @@ const AgencyPreview = ({ params, ...props }) => {
fixed: 'left', fixed: 'left',
render: (_, { quote_season, use_dates_start, use_dates_end, rowSpan }) => render: (_, { quote_season, use_dates_start, use_dates_end, rowSpan }) =>
quote_season === 'SS' ? (rowSpan > 1 ? ( quote_season === 'SS' ? (rowSpan > 1 ? (
<div> <div key={'ss'}>
平季<div>(除特殊时段外)</div> 平季<div>(除特殊时段外)</div>
</div> </div>
) : '') : ( ) : '') : (
<div> <div key={'ps'}>
特殊时段 特殊时段
<div> <div>
{use_dates_start.replace(`${use_year}-`, '')}~{use_dates_end.replace(`${use_year}-`, '')} {use_dates_start.replace(`${use_year}-`, '')}~{use_dates_end.replace(`${use_year}-`, '')}
@ -230,8 +235,6 @@ const AgencyPreview = ({ params, ...props }) => {
</div> </div>
), ),
}, },
// { title: '', dataIndex: 'dateText', key: 'dateText', width: '9rem', render: (_, { quote_season, use_dates_start, use_dates_end}) => quote_season === 'SS' ? (<div><div>()</div></div>) : (<div><div>{use_dates_start.replace(`${use_year}-`, '')}~{use_dates_end.replace(`${use_year}-`, '')}</div></div>)},
// `\n${use_dates_start.replace(`${use_year}-`, '')}~${use_dates_end.replace(`${use_year}-`, '')}` },
...cols.map((col) => ({ ...cols.map((col) => ({
title: formatGroupSize(...col), title: formatGroupSize(...col),
// dataIndex: [formatGroupSize(...col), 'adult_cost'], // dataIndex: [formatGroupSize(...col), 'adult_cost'],
@ -259,6 +262,7 @@ const AgencyPreview = ({ params, ...props }) => {
return null; return null;
} }
const tablesQuote = splitTable_D(use_year, agencyProducts.D); const tablesQuote = splitTable_D(use_year, agencyProducts.D);
// console.log(tablesQuote)
return ( return (
<> <>
{tablesQuote.map(({ cols, colsKey, data }, ti) => ( {tablesQuote.map(({ cols, colsKey, data }, ti) => (
@ -266,7 +270,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered bordered
striped striped
sticky={{ offsetHeader: -24 }} sticky={{ offsetHeader: -24 }}
key={ti} key={colsKey}
rowKey={'rowKey'}
rowClassName={cityRowHighlights} rowClassName={cityRowHighlights}
columns={[ columns={[
{ {
@ -334,6 +339,7 @@ const AgencyPreview = ({ params, ...props }) => {
striped striped
sticky={{ offsetHeader: -24 }} sticky={{ offsetHeader: -24 }}
key={'ti'} key={'ti'}
rowKey={'rowKey'}
dataSource={tablesQuote} dataSource={tablesQuote}
size={'small'} size={'small'}
pagination={false} pagination={false}
@ -483,6 +489,7 @@ const AgencyPreview = ({ params, ...props }) => {
striped striped
sticky={{ offsetHeader: -24 }} sticky={{ offsetHeader: -24 }}
key={'ti'} key={'ti'}
rowKey={'rowKey'}
dataSource={tablesQuote} dataSource={tablesQuote}
size={'small'} size={'small'}
pagination={false} pagination={false}
@ -592,7 +599,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered bordered
striped striped
sticky={{ offsetHeader: -24 }} sticky={{ offsetHeader: -24 }}
key={ti} key={colsKey}
rowKey={'rowKey'}
rowClassName={cityRowHighlights} rowClassName={cityRowHighlights}
columns={[ columns={[
{ {
@ -664,7 +672,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered bordered
striped striped
sticky={{ offsetHeader: -24 }} sticky={{ offsetHeader: -24 }}
key={ti} key={colsKey}
rowKey={'rowKey'}
rowClassName={cityRowHighlights} rowClassName={cityRowHighlights}
columns={[ columns={[
{ {

Loading…
Cancel
Save