feat(ops): v4.0.4 开发任务多行与版本状态同步、合伙人/门店删除、账单合伙人列

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-31 16:08:55 +08:00
parent e26206b93c
commit ac94f5f5de
15 changed files with 568 additions and 59 deletions
+32
View File
@@ -1,5 +1,7 @@
import { describe, expect, it } from 'vitest';
import {
assertCanDeleteCityPartner,
assertCanDeleteStore,
validatePartnerCityBinding,
validatePartnerCommissionRates,
} from './city-partner';
@@ -70,3 +72,33 @@ describe('validatePartnerCommissionRates', () => {
expect(validatePartnerCommissionRates(0.05, 0.04, 0.08).ok).toBe(false);
});
});
describe('assertCanDeleteCityPartner', () => {
it('requires stores to be deleted first', () => {
const result = assertCanDeleteCityPartner({ storeCount: 2, orderCount: 0, redeemCount: 0 });
expect(result.ok).toBe(false);
expect(result.message).toContain('请先删除门店');
});
it('blocks when orders exist', () => {
const result = assertCanDeleteCityPartner({ storeCount: 0, orderCount: 1, redeemCount: 0 });
expect(result.ok).toBe(false);
expect(result.message).toContain('关联订单');
});
it('allows delete when empty', () => {
expect(assertCanDeleteCityPartner({ storeCount: 0, orderCount: 0, redeemCount: 0 }).ok).toBe(true);
});
});
describe('assertCanDeleteStore', () => {
it('blocks when redeem records exist', () => {
const result = assertCanDeleteStore({ orderCount: 0, redeemCount: 3 });
expect(result.ok).toBe(false);
expect(result.message).toContain('关联核销单');
});
it('allows delete when no orders or redeems', () => {
expect(assertCanDeleteStore({ orderCount: 0, redeemCount: 0 }).ok).toBe(true);
});
});