V4.0.9版本更新合伙人H5端调整

This commit is contained in:
2026-09-02 09:46:41 +08:00
parent af3c4b6f08
commit c905b3f930
33 changed files with 893 additions and 176 deletions
+55
View File
@@ -3,12 +3,16 @@ import {
addShanghaiDays,
isWineryIssueDay,
listWineryIssueDays,
nextPartnerBillIssueAt,
previousShanghaiMonth,
previousShanghaiWeek,
shanghaiBillPeriodYmds,
shanghaiLaggedIssueWindow,
shanghaiMonthLastInstant,
shanghaiMonthRange,
shanghaiPeriodYmds,
shanghaiT1DayWindow,
shanghaiWeekRange,
shanghaiWineryPeriodWindow,
shanghaiYmd,
startOfShanghaiDay,
@@ -145,3 +149,54 @@ describe('previousShanghaiMonth', () => {
});
});
});
describe('shanghaiWeekRange', () => {
it('周三落入当周周一至下周一', () => {
const { start, endExclusive } = shanghaiWeekRange(new Date('2026-09-02T04:00:00+08:00'));
expect(shanghaiYmd(start)).toBe('2026-08-31');
expect(shanghaiYmd(endExclusive)).toBe('2026-09-07');
});
it('周日仍属当周(周一为起点)', () => {
const { start } = shanghaiWeekRange(new Date('2026-09-06T23:00:00+08:00'));
expect(shanghaiYmd(start)).toBe('2026-08-31');
});
});
describe('previousShanghaiWeek', () => {
it('周一 08:00 取上一完整周', () => {
const prev = previousShanghaiWeek(new Date('2026-09-07T08:00:00+08:00'));
expect(shanghaiYmd(prev.start)).toBe('2026-08-31');
expect(shanghaiYmd(prev.endExclusive)).toBe('2026-09-07');
});
});
describe('nextPartnerBillIssueAt', () => {
it('周一 07:59 出账日为当日 08:00', () => {
const at = nextPartnerBillIssueAt(new Date('2026-09-07T07:59:00+08:00'));
expect(at.toISOString()).toBe(new Date('2026-09-07T08:00:00+08:00').toISOString());
});
it('周一 08:00 起指向下周一', () => {
const at = nextPartnerBillIssueAt(new Date('2026-09-07T08:00:00+08:00'));
expect(at.toISOString()).toBe(new Date('2026-09-14T08:00:00+08:00').toISOString());
});
});
describe('shanghaiBillPeriodYmds', () => {
it('周账展示周一至周日', () => {
const start = new Date('2026-08-31T00:00:00+08:00');
const end = new Date('2026-09-06T23:59:59.999+08:00');
expect(shanghaiBillPeriodYmds(start, end)).toEqual({
periodStart: '2026-08-31',
periodEnd: '2026-09-06',
});
});
it('无止日或跨度大时回退自然月', () => {
expect(shanghaiBillPeriodYmds(new Date('2026-08-01T00:00:00+08:00'))).toEqual({
periodStart: '2026-08-01',
periodEnd: '2026-08-31',
});
});
});
+55
View File
@@ -127,3 +127,58 @@ export function shanghaiPeriodYmds(periodStart: Date): { periodStart: string; pe
periodEnd: shanghaiYmd(new Date(endExclusive.getTime() - 1)),
};
}
/** 0=周日 … 6=周六,按北京日历日 */
export function shanghaiWeekday(d: Date): number {
return new Date(`${shanghaiYmd(d)}T12:00:00+08:00`).getUTCDay();
}
/** 北京自然周:周一 00:00 ~ 下周一 00:00(不含) */
export function shanghaiWeekRange(anchor = new Date()): { start: Date; endExclusive: Date } {
const dayStart = startOfShanghaiDay(anchor);
const wd = shanghaiWeekday(dayStart);
const daysFromMonday = wd === 0 ? 6 : wd - 1;
const start = addShanghaiDays(dayStart, -daysFromMonday);
return { start, endExclusive: addShanghaiDays(start, 7) };
}
export function shanghaiWeekLastInstant(anchor = new Date()): Date {
return new Date(shanghaiWeekRange(anchor).endExclusive.getTime() - 1);
}
export function previousShanghaiWeek(anchor = new Date()): { start: Date; endExclusive: Date } {
return shanghaiWeekRange(addShanghaiDays(shanghaiWeekRange(anchor).start, -1));
}
/** 下一个合伙人出账时刻:周一 08:00(若尚未到本周一 08:00 则为当日) */
export function nextPartnerBillIssueAt(anchor = new Date()): Date {
const { start } = shanghaiWeekRange(anchor);
const thisMonday8 = new Date(start.getTime() + 8 * 60 * 60 * 1000);
if (anchor.getTime() < thisMonday8.getTime()) return thisMonday8;
return new Date(addShanghaiDays(start, 7).getTime() + 8 * 60 * 60 * 1000);
}
export function shanghaiPeriodYmdsForWeek(periodStart: Date): { periodStart: string; periodEnd: string } {
const { start } = shanghaiWeekRange(periodStart);
return {
periodStart: shanghaiYmd(start),
periodEnd: shanghaiYmd(addShanghaiDays(start, 6)),
};
}
/** 周账用真实起止日;跨度超过 8 天则按月展示(兼容历史月账) */
export function shanghaiBillPeriodYmds(
periodStart: Date,
periodEnd?: Date,
): { periodStart: string; periodEnd: string } {
if (periodEnd) {
const days = shanghaiCalendarDaysBetween(periodStart, periodEnd);
if (days >= 0 && days <= 8) {
return {
periodStart: shanghaiYmd(periodStart),
periodEnd: shanghaiYmd(periodEnd),
};
}
}
return shanghaiPeriodYmds(periodStart);
}