diff --git a/lib/aspects/token.js b/lib/aspects/token.js index c70aae408..a9167d292 100644 --- a/lib/aspects/token.js +++ b/lib/aspects/token.js @@ -94,13 +94,87 @@ function tryMakeChangeLoginWay(userId, context) { }); }); } +function dealWithUserState(user, context, tokenData) { + return tslib_1.__awaiter(this, void 0, void 0, function () { + var _a, _b, user2; + var _c, _d; + return tslib_1.__generator(this, function (_e) { + switch (_e.label) { + case 0: + _a = user.userState; + switch (_a) { + case 'disabled': return [3 /*break*/, 1]; + case 'shadow': return [3 /*break*/, 2]; + case 'merged': return [3 /*break*/, 4]; + } + return [3 /*break*/, 7]; + case 1: + { + throw new Exception_1.OakUserDisabledException(); + } + _e.label = 2; + case 2: + _c = { + userId: user.id + }; + _d = {}; + return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; + case 3: return [2 /*return*/, (_c.user = (_d.id = _e.sent(), + _d.action = 'activate', + _d.data = {}, + _d), + _c)]; + case 4: + (0, assert_1.assert)(user === null || user === void 0 ? void 0 : user.refId); + return [4 /*yield*/, context.select('user', { + data: { + id: 1, + userState: 1, + refId: 1, + wechatUser$user: { + $entity: 'wechatUser', + data: { + id: 1, + }, + }, + userSystem$user: { + $entity: 'userSystem', + data: { + id: 1, + systemId: 1, + }, + } + }, + filter: { + id: user.refId, + } + }, { + dontCollect: true, + })]; + case 5: + _b = tslib_1.__read.apply(void 0, [_e.sent(), 1]), user2 = _b[0]; + return [4 /*yield*/, dealWithUserState(user2, context, tokenData)]; + case 6: return [2 /*return*/, _e.sent()]; + case 7: + { + (0, assert_1.assert)(user.userState === 'normal'); + return [2 /*return*/, { + userId: user.id, + }]; + } + _e.label = 8; + case 8: return [2 /*return*/]; + } + }); + }); +} function setupMobile(mobile, env, context) { var _a; return tslib_1.__awaiter(this, void 0, void 0, function () { - var currentToken, applicationId, systemId, result2, _b, mobileRow, userId, user, userState, _c, tokenData, user, userState, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, mobileData, _p, _q, _r, userData, _s, _t, _u, mobileData, tokenData, _v, _w, _x, _y, _z, _0; - var _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14; - return tslib_1.__generator(this, function (_15) { - switch (_15.label) { + var currentToken, applicationId, systemId, result2, _b, mobileRow, userId, user, userState, _c, tokenData, user, userState, _d, _e, _f, _g, _h, _j, _k, _l, _m, mobileData, _o, _p, _q, userData, _r, _s, _t, mobileData, tokenData, _u, _v, _w, _x, _y, _z; + var _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11; + return tslib_1.__generator(this, function (_12) { + switch (_12.label) { case 0: currentToken = context.getToken(true); applicationId = context.getApplicationId(); @@ -114,6 +188,7 @@ function setupMobile(mobile, env, context) { user: { id: 1, userState: 1, + refId: 1, wechatUser$user: { $entity: 'wechatUser', data: { @@ -135,8 +210,8 @@ function setupMobile(mobile, env, context) { } }, { dontCollect: true })]; case 1: - result2 = _15.sent(); - if (!(result2.length > 0)) return [3 /*break*/, 23]; + result2 = _12.sent(); + if (!(result2.length > 0)) return [3 /*break*/, 19]; // 此手机号已经存在 (0, assert_1.assert)(result2.length === 1); _b = tslib_1.__read(result2, 1), mobileRow = _b[0]; @@ -156,13 +231,13 @@ function setupMobile(mobile, env, context) { { throw new Exception_1.OakUserDisabledException(); } - _15.label = 4; + _12.label = 4; case 4: // 直接合并 return [4 /*yield*/, (0, user_1.mergeUser)({ from: userId, to: currentToken.userId }, context, true)]; case 5: // 直接合并 - _15.sent(); + _12.sent(); return [2 /*return*/, currentToken.id]; case 6: /* assert(userState === 'normal'); @@ -173,170 +248,142 @@ function setupMobile(mobile, env, context) { /* assert(userState === 'normal'); throw await makeDistinguishException(userId as string, context, '该手机号已被一个有效用户占用,请联系管理员处理'); */ // 直接合并 - _15.sent(); + _12.sent(); return [2 /*return*/, currentToken.id]; - case 8: return [3 /*break*/, 22]; + case 8: return [3 /*break*/, 18]; case 9: - _1 = {}; + _0 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 10: - tokenData = (_1.id = _15.sent(), - _1.applicationId = applicationId, - _1.playerId = mobileRow.userId, - _1.env = env, - _1.entity = 'mobile', - _1.entityId = mobileRow.id, - _1); + tokenData = (_0.id = _12.sent(), + _0.applicationId = applicationId, + _0.playerId = mobileRow.userId, + _0.env = env, + _0.entity = 'mobile', + _0.entityId = mobileRow.id, + _0); user = mobileRow.user; userState = user.userState; - _d = userState; - switch (_d) { - case 'disabled': return [3 /*break*/, 11]; - case 'shadow': return [3 /*break*/, 12]; - } - return [3 /*break*/, 14]; + // 可能出现多次merge的情况 + _e = (_d = Object).assign; + _f = [tokenData]; + return [4 /*yield*/, dealWithUserState(user, context, tokenData)]; case 11: - { - throw new Exception_1.OakUserDisabledException(); - } - _15.label = 12; - case 12: - _f = (_e = Object).assign; - _g = [tokenData]; - _2 = { - userId: mobileRow.userId - }; + // 可能出现多次merge的情况 + _e.apply(_d, _f.concat([_12.sent()])); + _h = (_g = context).operate; + _j = ['token']; + _1 = {}; + return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; + case 12: return [4 /*yield*/, _h.apply(_g, _j.concat([(_1.id = _12.sent(), + _1.data = tokenData, + _1.action = 'create', + _1), { + dontCollect: true, + }]))]; + case 13: + _12.sent(); + if (!(((_a = user === null || user === void 0 ? void 0 : user.userSystem$user) === null || _a === void 0 ? void 0 : _a.length) == 0)) return [3 /*break*/, 17]; + _l = (_k = context).operate; + _m = ['userSystem']; + _2 = {}; + return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; + case 14: + _2.id = _12.sent(), + _2.action = 'create'; _3 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; - case 13: - _f.apply(_e, _g.concat([(_2.user = (_3.id = _15.sent(), - _3.action = 'activate', - _3.data = {}, + case 15: return [4 /*yield*/, _l.apply(_k, _m.concat([(_2.data = (_3.id = _12.sent(), + _3.userId = user.id, + _3.systemId = systemId, _3), - _2)])); - return [3 /*break*/, 15]; - case 14: - { - (0, assert_1.assert)(userState === 'normal'); - Object.assign(tokenData, { - userId: mobileRow.userId, - }); - } - _15.label = 15; - case 15: - _j = (_h = context).operate; - _k = ['token']; + _2), { + dontCollect: true, + }]))]; + case 16: + _12.sent(); + _12.label = 17; + case 17: return [2 /*return*/, tokenData.id]; + case 18: return [3 /*break*/, 34]; + case 19: + if (!currentToken) return [3 /*break*/, 23]; _4 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; - case 16: return [4 /*yield*/, _j.apply(_h, _k.concat([(_4.id = _15.sent(), - _4.data = tokenData, - _4.action = 'create', - _4), { - dontCollect: true, - }]))]; - case 17: - _15.sent(); - if (!(((_a = user === null || user === void 0 ? void 0 : user.userSystem$user) === null || _a === void 0 ? void 0 : _a.length) == 0)) return [3 /*break*/, 21]; - _m = (_l = context).operate; - _o = ['userSystem']; + case 20: + mobileData = (_4.id = _12.sent(), + _4.mobile = mobile, + _4.userId = currentToken.userId, + _4); + _p = (_o = context).operate; + _q = ['mobile']; _5 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; - case 18: - _5.id = _15.sent(), - _5.action = 'create'; + case 21: return [4 /*yield*/, _p.apply(_o, _q.concat([(_5.id = _12.sent(), + _5.action = 'create', + _5.data = mobileData, + _5), {}]))]; + case 22: + _12.sent(); + return [2 /*return*/, currentToken.id]; + case 23: _6 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; - case 19: return [4 /*yield*/, _m.apply(_l, _o.concat([(_5.data = (_6.id = _15.sent(), - _6.userId = user.id, - _6.systemId = systemId, - _6), - _5), { - dontCollect: true, - }]))]; - case 20: - _15.sent(); - _15.label = 21; - case 21: return [2 /*return*/, tokenData.id]; - case 22: return [3 /*break*/, 38]; - case 23: - if (!currentToken) return [3 /*break*/, 27]; + case 24: + userData = (_6.id = _12.sent(), + _6.userState = 'normal', + _6); + _s = (_r = context).operate; + _t = ['user']; _7 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; - case 24: - mobileData = (_7.id = _15.sent(), - _7.mobile = mobile, - _7.userId = currentToken.userId, - _7); - _q = (_p = context).operate; - _r = ['mobile']; + case 25: return [4 /*yield*/, _s.apply(_r, _t.concat([(_7.id = _12.sent(), + _7.action = 'create', + _7.data = userData, + _7), {}]))]; + case 26: + _12.sent(); _8 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; - case 25: return [4 /*yield*/, _q.apply(_p, _r.concat([(_8.id = _15.sent(), - _8.action = 'create', - _8.data = mobileData, - _8), {}]))]; - case 26: - _15.sent(); - return [2 /*return*/, currentToken.id]; case 27: + mobileData = (_8.id = _12.sent(), + _8.mobile = mobile, + _8.userId = userData.id, + _8); _9 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 28: - userData = (_9.id = _15.sent(), - _9.userState = 'normal', + tokenData = (_9.id = _12.sent(), + _9.userId = userData.id, + _9.playerId = userData.id, + _9.env = env, + _9.entity = 'mobile', + _9.entityId = mobileData.id, _9); - _t = (_s = context).operate; - _u = ['user']; + _v = (_u = context).operate; + _w = ['token']; _10 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; - case 29: return [4 /*yield*/, _t.apply(_s, _u.concat([(_10.id = _15.sent(), + case 29: return [4 /*yield*/, _v.apply(_u, _w.concat([(_10.id = _12.sent(), _10.action = 'create', - _10.data = userData, - _10), {}]))]; + _10.data = tokenData, + _10), { dontCollect: true }]))]; case 30: - _15.sent(); + _12.sent(); + return [4 /*yield*/, context.setTokenValue(tokenData.id)]; + case 31: + _12.sent(); + _y = (_x = context).operate; + _z = ['mobile']; _11 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; - case 31: - mobileData = (_11.id = _15.sent(), - _11.mobile = mobile, - _11.userId = userData.id, - _11); - _12 = {}; - return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; - case 32: - tokenData = (_12.id = _15.sent(), - _12.userId = userData.id, - _12.playerId = userData.id, - _12.env = env, - _12.entity = 'mobile', - _12.entityId = mobileData.id, - _12); - _w = (_v = context).operate; - _x = ['token']; - _13 = {}; - return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; - case 33: return [4 /*yield*/, _w.apply(_v, _x.concat([(_13.id = _15.sent(), - _13.action = 'create', - _13.data = tokenData, - _13), { dontCollect: true }]))]; - case 34: - _15.sent(); - return [4 /*yield*/, context.setTokenValue(tokenData.id)]; - case 35: - _15.sent(); - _z = (_y = context).operate; - _0 = ['mobile']; - _14 = {}; - return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; - case 36: return [4 /*yield*/, _z.apply(_y, _0.concat([(_14.id = _15.sent(), - _14.action = 'create', - _14.data = mobileData, - _14), { dontCollect: true }]))]; - case 37: - _15.sent(); + case 32: return [4 /*yield*/, _y.apply(_x, _z.concat([(_11.id = _12.sent(), + _11.action = 'create', + _11.data = mobileData, + _11), { dontCollect: true }]))]; + case 33: + _12.sent(); return [2 /*return*/, tokenData.id]; - case 38: return [2 /*return*/]; + case 34: return [2 /*return*/]; } }); }); diff --git a/lib/entities/Message.d.ts b/lib/entities/Message.d.ts index 9223a3386..0a2a4dff1 100644 --- a/lib/entities/Message.d.ts +++ b/lib/entities/Message.d.ts @@ -6,6 +6,7 @@ declare type Router = { pathname: string; props?: Record; state?: Record; + isTabBar?: boolean; }; declare type MessageRestriction = { systemIds?: string[]; diff --git a/lib/entities/UserEntityGrant.d.ts b/lib/entities/UserEntityGrant.d.ts index 53bce3602..39949bdfb 100644 --- a/lib/entities/UserEntityGrant.d.ts +++ b/lib/entities/UserEntityGrant.d.ts @@ -7,6 +7,7 @@ export declare type RedirectToProps = { pathname: string; props?: Record; state?: Record; + isTabBar?: boolean; }; export interface Schema extends EntityShape { entity: String<32>; diff --git a/lib/entities/WechatQrCode.d.ts b/lib/entities/WechatQrCode.d.ts index a37ce84eb..a29e3e22c 100644 --- a/lib/entities/WechatQrCode.d.ts +++ b/lib/entities/WechatQrCode.d.ts @@ -6,6 +6,7 @@ export declare type WechatQrCodeProps = { pathname: string; props?: Record; state?: Record; + isTabBar?: boolean; }; export interface Schema extends EntityShape { entity: String<32>; diff --git a/lib/general-app-domain/Message/Schema.d.ts b/lib/general-app-domain/Message/Schema.d.ts index 6291bbe86..c1c285e48 100644 --- a/lib/general-app-domain/Message/Schema.d.ts +++ b/lib/general-app-domain/Message/Schema.d.ts @@ -11,6 +11,7 @@ declare type Router = { pathname: string; props?: Record; state?: Record; + isTabBar?: boolean; }; declare type MessageRestriction = { systemIds?: string[]; diff --git a/lib/general-app-domain/UserEntityGrant/Schema.d.ts b/lib/general-app-domain/UserEntityGrant/Schema.d.ts index 9444956e2..c4115e1fa 100644 --- a/lib/general-app-domain/UserEntityGrant/Schema.d.ts +++ b/lib/general-app-domain/UserEntityGrant/Schema.d.ts @@ -14,6 +14,7 @@ export declare type RedirectToProps = { pathname: string; props?: Record; state?: Record; + isTabBar?: boolean; }; export declare type OpSchema = EntityShape & { entity: "role" | string; diff --git a/lib/general-app-domain/WechatQrCode/Schema.d.ts b/lib/general-app-domain/WechatQrCode/Schema.d.ts index 847a5c727..061289568 100644 --- a/lib/general-app-domain/WechatQrCode/Schema.d.ts +++ b/lib/general-app-domain/WechatQrCode/Schema.d.ts @@ -14,6 +14,7 @@ export declare type WechatQrCodeProps = { pathname: string; props?: Record; state?: Record; + isTabBar?: boolean; }; export declare type OpSchema = EntityShape & { entity: "user" | "userEntityGrant" | string; diff --git a/lib/pages/userEntityGrant/confirm/index.js b/lib/pages/userEntityGrant/confirm/index.js index 29c1adcc8..015de9e1b 100644 --- a/lib/pages/userEntityGrant/confirm/index.js +++ b/lib/pages/userEntityGrant/confirm/index.js @@ -141,9 +141,13 @@ exports.default = OakComponent({ }); return; } - var pathname = redirectTo.pathname, _a = redirectTo.props, props = _a === void 0 ? {} : _a, _b = redirectTo.state, state = _b === void 0 ? {} : _b; + var pathname = redirectTo.pathname, props = redirectTo.props, state = redirectTo.state, isTabBar = redirectTo.isTabBar; var url = pathname.substring(0, 1) === '/' ? pathname : "/".concat(pathname); - this.redirectTo(tslib_1.__assign({ url: url }, props), state); + if (isTabBar) { + this.switchTab(tslib_1.__assign({ url: url }, (props || {})), state); + return; + } + this.redirectTo(tslib_1.__assign({ url: url }, (props || {})), state); }, }, }); diff --git a/lib/pages/userEntityGrant/confirm/index.xml b/lib/pages/userEntityGrant/confirm/index.xml index 00072f755..1274dab68 100644 --- a/lib/pages/userEntityGrant/confirm/index.xml +++ b/lib/pages/userEntityGrant/confirm/index.xml @@ -44,8 +44,8 @@ - - 领取成功{{redirectTo ? '(' + redirectCounter + 's)' : '' }} + + 领取成功{{redirectTo && redirectCounter > 0 ? '(' + redirectCounter + 's)' : '' }} \ No newline at end of file diff --git a/src/aspects/token.ts b/src/aspects/token.ts index 0a99d20a1..425d842ae 100644 --- a/src/aspects/token.ts +++ b/src/aspects/token.ts @@ -83,6 +83,59 @@ async function tryMakeChangeLoginWay, context: BackendRuntimeContext, tokenData: EntityDict['token']['CreateSingle']['data']): Promise> { + switch (user.userState) { + case 'disabled': { + throw new OakUserDisabledException(); + } + case 'shadow': { + return { + userId: user.id, + user: { + id: await generateNewIdAsync(), + action: 'activate', + data: {}, + } + } + } + case 'merged': { + assert(user?.refId); + const [user2] = await context.select('user', { + data: { + id: 1, + userState: 1, + refId: 1, + wechatUser$user: { + $entity: 'wechatUser', + data: { + id: 1, + }, + }, + userSystem$user: { + $entity: 'userSystem', + data: { + id: 1, + systemId: 1, + }, + } + }, + filter: { + id: user.refId, + } + }, { + dontCollect: true, + }) + return await dealWithUserState(user2, context, tokenData); + } + default: { + assert(user.userState === 'normal'); + return { + userId: user.id, + }; + } + } +} + async function setupMobile>(mobile: string, env: WebEnv | WechatMpEnv, context: Cxt) { const currentToken = context.getToken(true); const applicationId = context.getApplicationId(); @@ -97,6 +150,7 @@ async function setupMobile(userId as string, context, '该手机号已被一个有效用户占用,请联系管理员处理'); */ - + // 直接合并 await mergeUser({ from: userId!, to: currentToken.userId! }, context, true); return currentToken.id!; @@ -161,29 +215,9 @@ async function setupMobile, context as BackendRuntimeContext, tokenData)); await context.operate('token', { id: await generateNewIdAsync(), data: tokenData, diff --git a/src/entities/Message.ts b/src/entities/Message.ts index 36c553c49..681edd431 100644 --- a/src/entities/Message.ts +++ b/src/entities/Message.ts @@ -10,6 +10,7 @@ type Router = { pathname: string; props?: Record; state?: Record; + isTabBar?: boolean; //小程序独有 小程序跳回tabBar的话 必须使用 wx.switchTab }; type MessageRestriction = { diff --git a/src/entities/UserEntityGrant.ts b/src/entities/UserEntityGrant.ts index 515054fad..28ed28ba0 100644 --- a/src/entities/UserEntityGrant.ts +++ b/src/entities/UserEntityGrant.ts @@ -10,6 +10,7 @@ export type RedirectToProps = { pathname: string; props?: Record; state?: Record; + isTabBar?: boolean; //小程序独有 小程序跳回tabBar的话 必须使用 wx.switchTab }; export interface Schema extends EntityShape { diff --git a/src/entities/WechatQrCode.ts b/src/entities/WechatQrCode.ts index 2bfd023c7..d1bddd97c 100644 --- a/src/entities/WechatQrCode.ts +++ b/src/entities/WechatQrCode.ts @@ -9,6 +9,7 @@ export type WechatQrCodeProps = { pathname: string; props?: Record; state?: Record; + isTabBar?: boolean; //小程序独有 小程序跳回tabBar的话 必须使用 wx.switchTab }; export interface Schema extends EntityShape { diff --git a/src/pages/userEntityGrant/confirm/index.ts b/src/pages/userEntityGrant/confirm/index.ts index 84ae21649..433866fa5 100644 --- a/src/pages/userEntityGrant/confirm/index.ts +++ b/src/pages/userEntityGrant/confirm/index.ts @@ -117,13 +117,24 @@ export default OakComponent({ }); return; } - const { pathname, props = {}, state = {} } = redirectTo; + const { pathname, props, state, isTabBar } = redirectTo; const url = pathname.substring(0, 1) === '/' ? pathname : `/${pathname}`; + + if (isTabBar) { + this.switchTab( + { + url, + ...(props || {}), + }, + state + ); + return; + } this.redirectTo( { url, - ...props, + ...(props || {}), }, state ); diff --git a/src/pages/userEntityGrant/confirm/index.xml b/src/pages/userEntityGrant/confirm/index.xml index 00072f755..1274dab68 100644 --- a/src/pages/userEntityGrant/confirm/index.xml +++ b/src/pages/userEntityGrant/confirm/index.xml @@ -44,8 +44,8 @@ - - 领取成功{{redirectTo ? '(' + redirectCounter + 's)' : '' }} + + 领取成功{{redirectTo && redirectCounter > 0 ? '(' + redirectCounter + 's)' : '' }} \ No newline at end of file