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 { formatGroupSize } from './useProductsSets';
// Shoulder Season 平季; peak season 旺季
const isFullYearOrLonger = (year, startDate, endDate) => {
export const isFullYearOrLonger = (year, startDate, endDate) => {
// Parse the dates
const start = dayjs(startDate, 'YYYY-MM-DD');
const end = dayjs(endDate, 'YYYY-MM-DD');
@ -74,6 +74,7 @@ export const chunkBy = (use_year, dataList = [], by = []) => {
return aq;
}, {});
// 补全产品旺季的人等分组 (当旺季和平季的人等不完全一致时)
for (const WPI in PGroupSizeSS) {
if (Object.prototype.hasOwnProperty.call(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 _rowsFromDate = Object.keys(rowsByDate).reduce((accDate, 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 _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']);
return { ...accCols, [rowp.quote_col_key]: rowp };
}, {...keepCol, originRows: _dateRows });
}, {...keepCol, originRows: _dateRows, rowKey });
accDate.push(_colFromDateRow);
return accDate;
}, []);
@ -211,7 +213,7 @@ export const chunkBy = (use_year, dataList = [], by = []) => {
* 按人等拆分表格
* @use D J B R 8
*/
const splitTable_SizeSets = (chunkData) => {
export const splitTable_SizeSets = (chunkData) => {
const { SSRange, PSRange, SSsizeSetKey, SSsizeSetsMap, chunk } = chunkData;
const bySizeSetKey = groupBy(chunk, 'sizeSetsSS'); // next: city
// agencyProducts.J.
@ -241,7 +243,7 @@ const splitTable_SizeSets = (chunkData) => {
* 按季度分列 [平季, 旺季]
* @use Q 7 6
*/
const splitTable_Season = (chunkData) => {
export const splitTable_Season = (chunkData) => {
const { SSRange, PSRange, SSsizeSetKey, SSsizeSetsMap, chunk } = chunkData;
// console.log(chunkData);
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']);
// valRow.dates = valRows.map((v) => pick(v, ['id', 'use_dates_end', 'use_dates_start']));
valRow.rows = valRows;
valRow.rowKey = valRows.map(v => v.id).join(',');
accv.push(valRow);
return accv;
}, []);
@ -263,22 +266,24 @@ const splitTable_Season = (chunkData) => {
return { ...accp, [_s]: valUnderSeason };
}, {});
// console.log('---- rowSeason', rowSeason);
return { info: pitem.info, ...rowSeason };
return { info: pitem.info, ...rowSeason, rowKey: pitem.info.id };
});
// console.log('---- tablesQuote', 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);
// 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);
// 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) => {
@ -291,10 +296,11 @@ export const splitTable_7 = (use_year, dataSource) => {
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);
// 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) => {
@ -303,22 +309,24 @@ export const splitTable_8 = (use_year, dataSource) => {
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']);
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);
// console.log(chunked);
return addCityRow4Split(splitTable_SizeSets(chunked));
const tables = addCityRow4Split(splitTable_SizeSets(chunked));
return retTableOnly ? tables : { ...chunked, tables };
};
export const addCityRow4Season = (table) => {
const byCity = groupBy(table, (ele) => `${ele.info.city_id}@${ele.info.city_name}`);
const withCityRow = Object.keys(byCity).reduce((acc, cityIdName) => {
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 withCityRow;

@ -172,20 +172,23 @@ const Header = ({ refresh, ...props }) => {
// await refresh();
const agencyExtras = await getAgencyAllExtrasAction(switchParams);
const remarks = await getRemarkList()
const remarksMappedByType = remarks.reduce((r, v) => ({...r, [v.product_type_id]: v}), {});
const documentCreator = new AgencyContract();
const doc = documentCreator.create([
switchParams,
activeAgency,
agencyProducts,
agencyExtras,
remarks
// remarks,
remarksMappedByType,
]);
const _d = dayjs().format("YYYYMMDD_HH.mm.ss.SSS"); // Date.now().toString(32)
const _state = pickAuditState.value ? pickAuditState.label : '';
Packer.toBlob(doc).then((blob) => {
saveAs(
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)) {
return null;
}
const tablesQuote = splitTable_6(use_year, agencyProducts['6']);
const table2Rows = tablesQuote.reduce((acc, {info, SS}) => {
const {tables, SSRange} = splitTable_6(use_year, agencyProducts['6'], false);
const table2Rows = tables.reduce((acc, {info, SS}) => {
return acc.concat(SS.map((v, i) => ({...v, info, rowSpan: i===0 ? SS.length : 0})));
}, []);
// console.log('tablesQuote', tablesQuote)
// console.log('table2Rows', table2Rows)
return (
<>
@ -68,7 +69,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered
striped
sticky={{ offsetHeader: -24 }}
key={'ti'}
key={'ti6'}
rowKey={'rowKey'}
dataSource={table2Rows}
size={'small'}
pagination={false}
@ -92,7 +94,7 @@ const AgencyPreview = ({ params, ...props }) => {
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',
key: 'SS',
width: '9rem',
@ -121,7 +123,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered
striped
sticky={{ offsetHeader: -24 }}
key={ti}
key={colsKey}
rowKey={'rowKey'}
rowClassName={cityRowHighlights}
columns={[
{
@ -190,6 +193,7 @@ const AgencyPreview = ({ params, ...props }) => {
return null;
}
const tablesQuote = splitTable_J(use_year, agencyProducts.J);
// console.log(tablesQuote)
return (
<>
{tablesQuote.map(({ cols, colsKey, data }, ti) => (
@ -197,7 +201,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered
striped
sticky={{ offsetHeader: -24 }}
key={ti}
key={colsKey}
rowKey={'rowKey'}
rowClassName={cityRowHighlights}
columns={[
{
@ -218,11 +223,11 @@ const AgencyPreview = ({ params, ...props }) => {
fixed: 'left',
render: (_, { quote_season, use_dates_start, use_dates_end, rowSpan }) =>
quote_season === 'SS' ? (rowSpan > 1 ? (
<div>
<div key={'ss'}>
平季<div>(除特殊时段外)</div>
</div>
) : '') : (
<div>
<div key={'ps'}>
特殊时段
<div>
{use_dates_start.replace(`${use_year}-`, '')}~{use_dates_end.replace(`${use_year}-`, '')}
@ -230,8 +235,6 @@ const AgencyPreview = ({ params, ...props }) => {
</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) => ({
title: formatGroupSize(...col),
// dataIndex: [formatGroupSize(...col), 'adult_cost'],
@ -259,6 +262,7 @@ const AgencyPreview = ({ params, ...props }) => {
return null;
}
const tablesQuote = splitTable_D(use_year, agencyProducts.D);
// console.log(tablesQuote)
return (
<>
{tablesQuote.map(({ cols, colsKey, data }, ti) => (
@ -266,7 +270,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered
striped
sticky={{ offsetHeader: -24 }}
key={ti}
key={colsKey}
rowKey={'rowKey'}
rowClassName={cityRowHighlights}
columns={[
{
@ -334,6 +339,7 @@ const AgencyPreview = ({ params, ...props }) => {
striped
sticky={{ offsetHeader: -24 }}
key={'ti'}
rowKey={'rowKey'}
dataSource={tablesQuote}
size={'small'}
pagination={false}
@ -483,6 +489,7 @@ const AgencyPreview = ({ params, ...props }) => {
striped
sticky={{ offsetHeader: -24 }}
key={'ti'}
rowKey={'rowKey'}
dataSource={tablesQuote}
size={'small'}
pagination={false}
@ -592,7 +599,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered
striped
sticky={{ offsetHeader: -24 }}
key={ti}
key={colsKey}
rowKey={'rowKey'}
rowClassName={cityRowHighlights}
columns={[
{
@ -664,7 +672,8 @@ const AgencyPreview = ({ params, ...props }) => {
bordered
striped
sticky={{ offsetHeader: -24 }}
key={ti}
key={colsKey}
rowKey={'rowKey'}
rowClassName={cityRowHighlights}
columns={[
{

Loading…
Cancel
Save