feat(core): 按照严格TDD模式完成活动项目(4位核销码)、订单状态机、财务分销与双身份切换核心领域服务及30项单元测试
这个提交包含在:
@@ -0,0 +1,80 @@
|
||||
export enum UserRoleFlag {
|
||||
NONE = 0,
|
||||
PLAYER = 1 << 0, // 1
|
||||
EXPERT = 1 << 1, // 2
|
||||
}
|
||||
|
||||
export enum WorkMode {
|
||||
PLAYER = 'PLAYER',
|
||||
EXPERT = 'EXPERT',
|
||||
}
|
||||
|
||||
export enum CertStatus {
|
||||
NONE = 0, // 未提交
|
||||
PENDING = 1, // 待审核
|
||||
APPROVED = 2, // 审核通过
|
||||
REJECTED = 3, // 驳回
|
||||
}
|
||||
|
||||
export interface UserAccount {
|
||||
id: number;
|
||||
openid: string;
|
||||
nickname: string;
|
||||
roleFlags: number;
|
||||
currentMode: WorkMode;
|
||||
}
|
||||
|
||||
export class AuthRoleManager {
|
||||
private users = new Map<number, UserAccount>();
|
||||
private certs = new Map<number, { status: CertStatus; realName?: string; idCardNo?: string }>();
|
||||
private autoIncId = 1000;
|
||||
|
||||
registerUser(params: { openid: string; nickname: string }): UserAccount {
|
||||
const id = ++this.autoIncId;
|
||||
const user: UserAccount = {
|
||||
id,
|
||||
openid: params.openid,
|
||||
nickname: params.nickname,
|
||||
roleFlags: UserRoleFlag.PLAYER,
|
||||
currentMode: WorkMode.PLAYER,
|
||||
};
|
||||
this.users.set(id, user);
|
||||
this.certs.set(id, { status: CertStatus.NONE });
|
||||
return user;
|
||||
}
|
||||
|
||||
getUser(userId: number): UserAccount {
|
||||
const user = this.users.get(userId);
|
||||
if (!user) throw new Error('用户不存在');
|
||||
return user;
|
||||
}
|
||||
|
||||
getCertStatus(userId: number): CertStatus {
|
||||
return this.certs.get(userId)?.status ?? CertStatus.NONE;
|
||||
}
|
||||
|
||||
submitExpertCert(userId: number, info: { realName: string; idCardNo: string }) {
|
||||
this.certs.set(userId, {
|
||||
status: CertStatus.PENDING,
|
||||
realName: info.realName,
|
||||
idCardNo: info.idCardNo,
|
||||
});
|
||||
}
|
||||
|
||||
approveExpertCert(userId: number) {
|
||||
const cert = this.certs.get(userId);
|
||||
if (!cert) throw new Error('未找到认证申请');
|
||||
cert.status = CertStatus.APPROVED;
|
||||
|
||||
const user = this.getUser(userId);
|
||||
user.roleFlags |= UserRoleFlag.EXPERT;
|
||||
}
|
||||
|
||||
switchMode(userId: number, targetMode: WorkMode) {
|
||||
const user = this.getUser(userId);
|
||||
if (targetMode === WorkMode.EXPERT && !(user.roleFlags & UserRoleFlag.EXPERT)) {
|
||||
throw new Error('尚未开通或通过大神认证,无法切换至接单模式');
|
||||
}
|
||||
user.currentMode = targetMode;
|
||||
}
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户