From 8bb9173a95a87e3ceab4f48b5b34041af38b7c70 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期五, 28 三月 2025 15:23:14 +0800
Subject: [PATCH] fix: 四期需求

---
 apps/taro/src/subpackages/my/shareQrcode/InnerPage.vue |   26 +++-
 packages/core/src/lifeRechargeAccountModel.ts          |   43 ++++++++
 packages/core/src/listener.ts                          |   36 +++++++
 packages/services/api/typings.d.ts                     |   14 ++
 apps/taro/src/hooks/user.ts                            |   30 +++++
 packages/core-vue/src/plugin.ts                        |   20 +++
 packages/core/src/lifeRecharge.ts                      |   11 ++
 apps/taro/src/stores/modules/user.ts                   |   10 +
 apps/taro/src/pages/mine/index.vue                     |    5 
 packages/core/src/lifeRechargeServices.ts              |   32 ++++++
 packages/services/api/Account.ts                       |   18 +++
 11 files changed, 223 insertions(+), 22 deletions(-)

diff --git a/apps/taro/src/hooks/user.ts b/apps/taro/src/hooks/user.ts
index 711c45e..36ec443 100644
--- a/apps/taro/src/hooks/user.ts
+++ b/apps/taro/src/hooks/user.ts
@@ -10,8 +10,32 @@
   useLifeRechargeContext,
   APIgetLifePayWxIndentityParams,
   WxMiniAppIndentityInfo,
+  LifePayPhoneMesssageCodeLoginOutput,
 } from '@life-payment/core-vue';
 import { isInWeChat } from '@/utils/env';
+
+export function useVirtualUserInfo() {
+  const { blLifeRecharge } = useLifeRechargeContext();
+
+  const { data: virtualUserInfo } = useQuery({
+    queryKey: ['blLifeRecharge/lifePayUserMesssageByIduser', blLifeRecharge.accountModel.userId],
+    queryFn: async () => {
+      return await blLifeRecharge.services.lifePayUserMesssageByIduser(
+        {
+          id: blLifeRecharge.accountModel.userId,
+        },
+        {
+          showLoading: false,
+        }
+      );
+    },
+    placeholderData: () => ({} as LifePayPhoneMesssageCodeLoginOutput),
+    enabled: computed(() => !!blLifeRecharge.accountModel.userId),
+    staleTime: Infinity,
+  });
+
+  return { virtualUserInfo };
+}
 
 export function useUser() {
   const userStore = useUserStore();
@@ -30,7 +54,10 @@
     return userStore.getCurrentUserInfo();
   }
 
-  const isChannelAccount = computed(() => !!virtualUserId.value && true);
+  const { blLifeRecharge } = useLifeRechargeContext();
+  const { virtualUserInfo } = useVirtualUserInfo();
+
+  const isChannelAccount = computed(() => virtualUserInfo.value.isBackClientUser);
 
   return {
     user: userInfo,
@@ -42,6 +69,7 @@
     wxCode,
     wxOpenId,
     isChannelAccount,
+    virtualUserInfo,
   };
 }
 
diff --git a/apps/taro/src/pages/mine/index.vue b/apps/taro/src/pages/mine/index.vue
index 8bf95d1..403801c 100644
--- a/apps/taro/src/pages/mine/index.vue
+++ b/apps/taro/src/pages/mine/index.vue
@@ -13,7 +13,9 @@
     <div class="mine-page-top-view" @click="goLogin">
       <img class="mine-avatar" :src="DefaultAvatar" alt="" />
       <div class="user-info">
-        <div class="user-info-name" v-if="isLogin">{{ hiddenPhoneNumber(virtualPhoneNumber) }}</div>
+        <div class="user-info-name" v-if="isLogin">
+          {{ hiddenPhoneNumber(virtualPhoneNumber) }}
+        </div>
         <div class="mine-go-login" v-else>鐧诲綍</div>
       </div>
     </div>
@@ -47,6 +49,7 @@
 import { hiddenPhoneNumber } from '@life-payment/utils';
 
 const { userDetail, virtualPhoneNumber, isChannelAccount } = useUser();
+
 const isLogin = useIsLogin();
 const systemStore = useSystemStore();
 const userStore = useUserStore();
diff --git a/apps/taro/src/stores/modules/user.ts b/apps/taro/src/stores/modules/user.ts
index 1ac1d0e..65c9724 100644
--- a/apps/taro/src/stores/modules/user.ts
+++ b/apps/taro/src/stores/modules/user.ts
@@ -21,6 +21,8 @@
 import { getAccountInfoFromAccessToken, AccountInfo, setOSSLink } from '@life-payment/utils';
 import DefaultAvatar from '@/assets/components/icon-default-avatar.png';
 import { myClient } from '@/constants/query';
+import { blLifeRecharge } from '@/utils/blLifeRecharge';
+import { LifePayPhoneMesssageCodeLoginOutput } from '@life-payment/core-vue';
 
 interface UserState {
   userInfo?: Nullable<API.IdentityModelTokenCacheItem>;
@@ -38,6 +40,8 @@
 
   wxCode?: string;
   wxOpenId?: string;
+
+  virtualUserInfo?: LifePayPhoneMesssageCodeLoginOutput;
 }
 
 const goAuthorization = debounce(
@@ -174,6 +178,7 @@
     async loginVirtualSuccess(virtualUserRes: LoginVirtualRes) {
       try {
         this.setVirtualUserId(virtualUserRes);
+        this.getCurrentUserInfo();
       } catch (error) {}
     },
 
@@ -218,9 +223,10 @@
 
     async getCurrentUserInfo() {
       try {
-        // let res = await userServices.getUserInfo({ showLoading: false });
+        // let res = await blLifeRecharge.accountModel.getUserInfo(this.virtualUserId);
         // if (res) {
-        //   this.setUserDetail(res);
+        //   // this.setUserDetail(res);
+        //   this.virtualUserInfo = res;
         //   this.firstGetUserDetail = false;
         // }
       } catch (error) {}
diff --git a/apps/taro/src/subpackages/my/shareQrcode/InnerPage.vue b/apps/taro/src/subpackages/my/shareQrcode/InnerPage.vue
index 6b505c8..9df5cfa 100644
--- a/apps/taro/src/subpackages/my/shareQrcode/InnerPage.vue
+++ b/apps/taro/src/subpackages/my/shareQrcode/InnerPage.vue
@@ -1,23 +1,31 @@
 <template>
-  <ProTabs v-model="orderType" name="user-home-tabs" class="user-home-tabs" flexTitle fullHeight>
-    <ProTabPane title="璇濊垂璁㈠崟" pane-key="1">
-      <ShareQrcodeView :channles-num="'818'" />
-    </ProTabPane>
-    <ProTabPane title="鐢佃垂璁㈠崟" pane-key="2">
-      <ShareQrcodeView :channles-num="'818'" />
+  <ProTabs v-model="channlesType" name="user-home-tabs" class="user-home-tabs" flexTitle fullHeight>
+    <ProTabPane
+      :title="item.name"
+      :pane-key="item.channlesNum"
+      v-for="item in userChannles"
+      :key="item.channlesNum"
+    >
+      <ShareQrcodeView :channles-num="item.channlesNum" />
     </ProTabPane>
   </ProTabs>
 </template>
 
 <script setup lang="ts">
 import { ShareQrcodeView } from '@life-payment/components';
-import { useLifePayChannlesAllList } from '@/hooks';
+import { useUser } from '@/hooks';
 
 defineOptions({
   name: 'InnerPage',
 });
 
-const orderType = ref('1');
+const { virtualUserInfo } = useUser();
 
-const { getChannlesNameByNum } = useLifePayChannlesAllList();
+const userChannles = computed(() => virtualUserInfo.value.channlesNum ?? []);
+
+const channlesType = ref(userChannles.value[0]?.channlesNum ?? '');
+
+watch(userChannles, (val) => {
+  channlesType.value = val?.[0]?.channlesNum ?? '';
+});
 </script>
diff --git a/packages/core-vue/src/plugin.ts b/packages/core-vue/src/plugin.ts
index af1966d..9bd40c1 100644
--- a/packages/core-vue/src/plugin.ts
+++ b/packages/core-vue/src/plugin.ts
@@ -1,5 +1,5 @@
-import { BlLifeRecharge } from '@life-payment/core';
-import { inject, shallowReactive } from 'vue';
+import { BlLifeRecharge, BlLifeRechargeOptions } from '@life-payment/core';
+import { inject, reactive, provide, ref } from 'vue';
 import type { InjectionKey, UnwrapNestedRefs, Ref } from 'vue';
 
 export type LifeRechargeContext = {
@@ -12,10 +12,24 @@
   blLifeRecharge: BlLifeRecharge;
 };
 
+function updateState(state: Record<string, unknown>, update: Record<string, any>): void {
+  Object.keys(state).forEach((key) => {
+    state[key] = update[key];
+  });
+}
+
 export const VueLifeRechargePlugin = {
   install: (app: any, { blLifeRecharge }: VueLifeRechargePluginOptions) => {
+    const _blLifeRecharge = reactive(blLifeRecharge);
+
+    // blLifeRecharge.listener.addListener({
+    //   update: (state) => {
+    //     updateState(_blLifeRecharge, state);
+    //   },
+    // });
+
     app.provide(clientKey, {
-      blLifeRecharge: shallowReactive(blLifeRecharge),
+      blLifeRecharge: _blLifeRecharge,
     });
   },
 };
diff --git a/packages/core/src/lifeRecharge.ts b/packages/core/src/lifeRecharge.ts
index 8c1cb2c..409801a 100644
--- a/packages/core/src/lifeRecharge.ts
+++ b/packages/core/src/lifeRecharge.ts
@@ -2,21 +2,29 @@
   BlLifeRechargeServices,
   PhoneMesssageCodeLoginInput,
   RequestConfig,
+  ChannelOutput,
 } from './lifeRechargeServices';
 import { BlLifeRechargeOptions } from './types';
 import { LifeRechargeConstants } from './lifeRechargeConstants';
 import { BlLifeRechargeAccountModel } from './lifeRechargeAccountModel';
+import { LifeRechargeListener } from './listener';
 
 export class BlLifeRecharge<TResponse = any, TRequestOptions = any> {
   services: BlLifeRechargeServices<TResponse, TRequestOptions>;
   accountModel: BlLifeRechargeAccountModel;
+  listener: LifeRechargeListener;
 
   static constants = LifeRechargeConstants;
   constants = LifeRechargeConstants;
 
+  /**鐢ㄦ埛鎵�鏈夌殑娓犻亾 */
+  userChannles = [] as ChannelOutput[];
+  isBackClientUser: boolean;
+
   constructor(options: BlLifeRechargeOptions<TResponse, TRequestOptions>) {
+    this.listener = new LifeRechargeListener();
     this.services = new BlLifeRechargeServices(this, options);
-    this.accountModel = new BlLifeRechargeAccountModel({
+    this.accountModel = new BlLifeRechargeAccountModel(this, {
       userId: options.userId,
       phoneNumber: options.phoneNumber,
       channlesNum: options.channlesNum,
@@ -37,6 +45,7 @@
   loginout() {
     this.accountModel.setUserId('');
     this.accountModel.setPhoneNumber('');
+    this.accountModel.setUserChannles([]);
   }
 
   isLogin() {
diff --git a/packages/core/src/lifeRechargeAccountModel.ts b/packages/core/src/lifeRechargeAccountModel.ts
index e5e7b9e..42a4afc 100644
--- a/packages/core/src/lifeRechargeAccountModel.ts
+++ b/packages/core/src/lifeRechargeAccountModel.ts
@@ -1,13 +1,20 @@
 import { BlLifeRechargeAccountModelOptions } from './types';
-import { LifePayPhoneMesssageCodeLoginOutput } from './lifeRechargeServices';
+import { ChannelOutput } from './lifeRechargeServices';
+import { BlLifeRecharge } from './lifeRecharge';
 
-export class BlLifeRechargeAccountModel {
+export class BlLifeRechargeAccountModel<TResponse = any, TRequestOptions = any> {
+  ctx: BlLifeRecharge<TResponse, TRequestOptions>;
+
   userId = '';
   phoneNumber = '';
   channlesNum = '';
 
-  constructor(options: BlLifeRechargeAccountModelOptions = {}) {
+  constructor(
+    ctx: BlLifeRecharge<TResponse, TRequestOptions>,
+    options: BlLifeRechargeAccountModelOptions = {}
+  ) {
     const { userId = '', phoneNumber = '', channlesNum } = options;
+    this.ctx = ctx;
     this.setUserId(userId);
     this.setPhoneNumber(phoneNumber);
     this.setChannlesNum(channlesNum);
@@ -15,12 +22,42 @@
 
   setUserId(userId: string) {
     this.userId = userId;
+    this.ctx.listener.fireEvent('update', this.ctx);
+    if (userId) {
+      this.getUserInfo(userId);
+    }
+  }
+
+  async getUserInfo(userId: string) {
+    try {
+      let res = await this.ctx.services.lifePayUserMesssageByIduser(
+        {
+          id: userId,
+        },
+        {
+          showLoading: false,
+        }
+      );
+      this.ctx.isBackClientUser = res.isBackClientUser;
+      if (res && res.isBackClientUser) {
+        this.setUserChannles(res.channlesNum ?? []);
+      }
+      return res;
+    } catch (error) {
+      console.log('error: ', error);
+    }
   }
 
   setPhoneNumber(phoneNumber: string) {
     this.phoneNumber = phoneNumber;
+    this.ctx.listener.fireEvent('update', this.ctx);
   }
   setChannlesNum(channlesNum: string) {
     this.channlesNum = channlesNum;
+    this.ctx.listener.fireEvent('update', this.ctx);
+  }
+  setUserChannles(userChannles: ChannelOutput[]) {
+    this.ctx.userChannles = userChannles;
+    this.ctx.listener.fireEvent('update', this.ctx);
   }
 }
diff --git a/packages/core/src/lifeRechargeServices.ts b/packages/core/src/lifeRechargeServices.ts
index ca95c57..1bfa225 100644
--- a/packages/core/src/lifeRechargeServices.ts
+++ b/packages/core/src/lifeRechargeServices.ts
@@ -357,6 +357,24 @@
       ...(options || {}),
     });
   }
+
+  /** 鏍规嵁鐢ㄦ埛ID鑾峰彇鐢ㄦ埛鏄惁涓哄悗鍙扮鐞嗗憳 POST /api/Account/LifePayUserMesssageByIduser */
+  async lifePayUserMesssageByIduser(
+    body: LifePayUserMesssageByIduserInput,
+    options?: RequestConfig
+  ) {
+    return this.request<LifePayPhoneMesssageCodeLoginOutput>(
+      '/api/Account/LifePayUserMesssageByIduser',
+      {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json',
+        },
+        data: body,
+        ...(options || {}),
+      }
+    );
+  }
 }
 
 export interface PhoneMesssageCodeLoginInput {
@@ -809,5 +827,17 @@
   /** 鏄惁鏄悗鍙扮敤鎴� */
   isBackClientUser?: boolean;
   /** 娓犻亾鍙� */
-  channlesNum?: string[];
+  channlesNum?: ChannelOutput[];
+}
+
+export interface ChannelOutput {
+  name?: string;
+  channlesNum?: string;
+}
+
+export interface LifePayUserMesssageByIduserInput {
+  pageModel?: Pagination;
+  checkChannelId?: string;
+  /** 鐢ㄦ埛缂栧彿 */
+  id?: string;
 }
diff --git a/packages/core/src/listener.ts b/packages/core/src/listener.ts
new file mode 100644
index 0000000..4c9319b
--- /dev/null
+++ b/packages/core/src/listener.ts
@@ -0,0 +1,36 @@
+class BaseListener<ListenerMap extends { [key: string]: any }> {
+  listenerList: ListenerMap[] = [];
+
+  fireEvent(eventName: keyof ListenerMap, ...data: any[]) {
+    this.listenerList.forEach((listener) => {
+      var callback = listener[eventName];
+      callback && callback(...data);
+    });
+  }
+}
+
+type LifeRechargeListenerMap = {
+  update: (store: any) => any;
+};
+
+export class LifeRechargeListener extends BaseListener<LifeRechargeListenerMap> {
+  addListener(listener: LifeRechargeListenerMap) {
+    this.listenerList.push(listener);
+  }
+
+  removeListener(listener?: LifeRechargeListenerMap) {
+    if (listener) {
+      var index = -1;
+      for (var i = 0, len = this.listenerList.length; i < len; i++) {
+        if (listener == this.listenerList[i]) {
+          index = i;
+        }
+      }
+      if (index > -1) {
+        this.listenerList.splice(index, 1);
+      }
+    } else {
+      this.listenerList = [];
+    }
+  }
+}
diff --git a/packages/services/api/Account.ts b/packages/services/api/Account.ts
index ade46e0..d354b68 100644
--- a/packages/services/api/Account.ts
+++ b/packages/services/api/Account.ts
@@ -55,6 +55,24 @@
   );
 }
 
+/** 鏍规嵁鐢ㄦ埛ID鑾峰彇鐢ㄦ埛鏄惁涓哄悗鍙扮鐞嗗憳 POST /api/Account/LifePayUserMesssageByIduser */
+export async function lifePayUserMesssageByIduser(
+  body: API.LifePayUserMesssageByIduserInput,
+  options?: API.RequestConfig
+) {
+  return request<API.LifePayPhoneMesssageCodeLoginOutput>(
+    '/api/Account/LifePayUserMesssageByIduser',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
 /** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 GET /api/accountAuth/GetCode */
 export async function getCode(options?: API.RequestConfig) {
   return request<any>('/api/accountAuth/GetCode', {
diff --git a/packages/services/api/typings.d.ts b/packages/services/api/typings.d.ts
index f3befa6..ff0e189 100644
--- a/packages/services/api/typings.d.ts
+++ b/packages/services/api/typings.d.ts
@@ -512,6 +512,11 @@
     type?: number;
   }
 
+  interface ChannelOutput {
+    name?: string;
+    channlesNum?: string;
+  }
+
   interface ChannelRateOutput {
     channlesRate?: number;
   }
@@ -1295,7 +1300,7 @@
     /** 鏄惁鏄悗鍙扮敤鎴� */
     isBackClientUser?: boolean;
     /** 娓犻亾鍙� */
-    channlesNum?: string[];
+    channlesNum?: ChannelOutput[];
   }
 
   interface LifePayPremiumInput {
@@ -1421,6 +1426,13 @@
 
   type LifePayTypeEnum = 10 | 20;
 
+  interface LifePayUserMesssageByIduserInput {
+    pageModel?: Pagination;
+    checkChannelId?: string;
+    /** 鐢ㄦ埛缂栧彿 */
+    id?: string;
+  }
+
   interface LifePhoneData {
     /** 杩愯惀鍟嗙紪鐮侊紝渚嬪锛�"yidong", "dianxin", "liantong"銆� */
     ispCode: string;

--
Gitblit v1.9.1