V4.0.9版本更新合伙人H5端调整
This commit is contained in:
@@ -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',
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user