From 2e800655947439e8d71f05fddb3ad49770eec9fd Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期二, 16 九月 2025 13:40:30 +0800
Subject: [PATCH] Merge branch 'dev-1.4.1'

---
 apps/taro/src/components/NavigationBar/TransparentNavigationBar.vue              |    1 
 packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeBaseForm.vue    |   16 
 apps/taro/src/utils/common/message.tsx                                           |    9 
 packages/components/src/views/GasBillRecharge/GasBillRechargeStep3.vue           |   32 ++
 packages/services/api/WxPayNotify.ts                                             |   15 +
 packages/components/src/views/electricBillRecharge/ElectricBillRechargeStep2.vue |   32 ++
 apps/taro/src/hooks/lifepay.ts                                                   |   68 +++++
 apps/taro/config/staging.js                                                      |    2 
 packages/components/src/hooks/rate.ts                                            |  101 +++++++
 types/api.d.ts                                                                   |    1 
 packages/services/api/LifePayRate.ts                                             |   81 ++++++
 packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep2.vue       |   23 -
 packages/services/api/typings.d.ts                                               |  122 +++++++++
 packages/core/src/lifeRechargeConstants.ts                                       |   23 +
 apps/taro/src/pages/home/index.vue                                               |    6 
 packages/services/api/index.ts                                                   |    4 
 apps/taro/src/pages/home/components/NormalAnnouncement.vue                       |   31 ++
 packages/services/api/LifePayAnnouncement.ts                                     |   69 +++++
 packages/core/src/lifeRechargeServices.ts                                        |   72 +++++
 packages/components/src/hooks/index.ts                                           |   70 +++-
 20 files changed, 724 insertions(+), 54 deletions(-)

diff --git a/apps/taro/config/staging.js b/apps/taro/config/staging.js
index 1a6e4ad..20f2259 100644
--- a/apps/taro/config/staging.js
+++ b/apps/taro/config/staging.js
@@ -4,7 +4,7 @@
   env: {
     // BASE_URL: '"https://testrlywx.boleyuma.com"',
     BASE_URL: '"https://api.81812333.com"',
-    BASE_URL_H5: '"https://testrlywx.boleyuma.com"',
+    BASE_URL_H5: '"https://testlifepay.81812333.com"',
     BASE_URL_JX: '"https://api.jx818.com"',
 
     APP_ENV: '"staging"',
diff --git a/apps/taro/src/components/NavigationBar/TransparentNavigationBar.vue b/apps/taro/src/components/NavigationBar/TransparentNavigationBar.vue
index ed91b01..b1b86d0 100644
--- a/apps/taro/src/components/NavigationBar/TransparentNavigationBar.vue
+++ b/apps/taro/src/components/NavigationBar/TransparentNavigationBar.vue
@@ -36,7 +36,6 @@
 const props = defineProps(commonNavigationBarProps);
 
 const router = Taro.useRouter();
-console.log('router: ', router);
 
 const isLastPage = computed(() => {
   const pages = Taro.getCurrentPages();
diff --git a/apps/taro/src/hooks/lifepay.ts b/apps/taro/src/hooks/lifepay.ts
index 28090cd..eb019fa 100644
--- a/apps/taro/src/hooks/lifepay.ts
+++ b/apps/taro/src/hooks/lifepay.ts
@@ -1,6 +1,12 @@
 import { useQuery } from '@tanstack/vue-query';
-import { useLifeRechargeContext, CreateEditPayChannelsInput } from '@life-payment/core-vue';
+import {
+  useLifeRechargeContext,
+  CreateEditPayChannelsInput,
+  GetShowingLifePayAnnouncementInput,
+} from '@life-payment/core-vue';
 import { MaybeRef } from 'vue';
+import { Message } from '@/utils';
+import Taro from '@tarojs/taro';
 
 export function useOnlineService() {
   const { blLifeRecharge } = useLifeRechargeContext();
@@ -60,3 +66,63 @@
     getChannlesNameByNum,
   };
 }
+
+type UseShowingLifePayAnnouncementOptions = {
+  params?: MaybeRef<API.GetShowingLifePayAnnouncementInput>;
+  onSuccess?: (data: API.CreateEditLifePayAnnouncementOutput) => any;
+  staleTime?: MaybeRef<number>;
+};
+
+export function useShowingLifePayAnnouncement(options: UseShowingLifePayAnnouncementOptions = {}) {
+  const { onSuccess, params = {}, staleTime } = options;
+
+  const { blLifeRecharge } = useLifeRechargeContext();
+
+  const {
+    data: announcement,
+    isLoading,
+    refetch,
+  } = useQuery({
+    queryKey: ['blLifeRecharge/getShowingLifePayAnnouncement', params],
+    queryFn: async () => {
+      return await blLifeRecharge.services.getShowingLifePayAnnouncement(unref(params), {
+        showLoading: false,
+        skipErrorHandler: true,
+      });
+    },
+    onSuccess: (data) => {
+      onSuccess?.(data);
+    },
+    staleTime: staleTime,
+  });
+
+  return {
+    announcement,
+    isLoading,
+    refetch,
+  };
+}
+
+const dialogShowingLifePayAnnouncementCache = {};
+
+export function useDialogShowingLifePayAnnouncement() {
+  const { blLifeRecharge } = useLifeRechargeContext();
+  const router = Taro.useRouter();
+
+  useShowingLifePayAnnouncement({
+    params: {
+      announcementType: blLifeRecharge.constants.AnnouncementTypeEnum.Dialog,
+    },
+    onSuccess(data) {
+      if (!dialogShowingLifePayAnnouncementCache[router.path]) {
+        dialogShowingLifePayAnnouncementCache[router.path] = true;
+        Message.confirm({
+          title: '鍏憡',
+          message: data.announcementContent ?? '',
+          showCancelBtn: false,
+        });
+      }
+    },
+    staleTime: Infinity,
+  });
+}
diff --git a/apps/taro/src/pages/home/components/NormalAnnouncement.vue b/apps/taro/src/pages/home/components/NormalAnnouncement.vue
new file mode 100644
index 0000000..bd972f4
--- /dev/null
+++ b/apps/taro/src/pages/home/components/NormalAnnouncement.vue
@@ -0,0 +1,31 @@
+<template>
+  <nut-noticebar :left-icon="false" :text="text" v-if="!!text" />
+</template>
+
+<script setup lang="ts">
+import { BlLifeRecharge } from '@life-payment/core-vue';
+import { useShowingLifePayAnnouncement } from '@/hooks';
+
+defineOptions({
+  name: 'NormalAnnouncement',
+});
+
+// type Props = {};
+
+// const props = withDefaults(defineProps<Props>(), {});
+
+const text = ref('');
+
+useShowingLifePayAnnouncement({
+  params: {
+    announcementType: BlLifeRecharge.constants.AnnouncementTypeEnum.Normal,
+  },
+  onSuccess(data) {
+    text.value = data.announcementContent;
+  },
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/taro/src/pages/home/index.vue b/apps/taro/src/pages/home/index.vue
index 45bf44c..30d2ee7 100644
--- a/apps/taro/src/pages/home/index.vue
+++ b/apps/taro/src/pages/home/index.vue
@@ -7,6 +7,7 @@
     <template #bg>
       <img :src="OssAssets.common.HomePageBg" class="home-page-bg" />
     </template>
+    <NormalAnnouncement />
     <ContentView>
       <div class="home-page-banner-wrapper">
         <div class="home-page-banner-left">
@@ -38,7 +39,7 @@
 </template>
 
 <script setup lang="ts">
-import { useAccessLogin } from '@/hooks';
+import { useAccessLogin, useDialogShowingLifePayAnnouncement } from '@/hooks';
 import { useUserStore } from '@/stores/modules/user';
 import Taro from '@tarojs/taro';
 import { OrderInputType } from '@life-payment/constants';
@@ -48,11 +49,14 @@
 import IconBanner from '@/assets/home/icon-banner.png';
 import IconBannerLogo from '@/assets/home/icon-banner-logo.png';
 import IconBannerItem from '@/assets/home/icon-banner-item.png';
+import NormalAnnouncement from './components/NormalAnnouncement.vue';
 
 const userStore = useUserStore();
 
 const router = Taro.useRouter();
 
+useDialogShowingLifePayAnnouncement();
+
 const goPhoneBillRecharge = useAccessLogin(() => {
   RouteHelper.navigateTo({
     url: `${RouterPath.phoneBillRecharge}`,
diff --git a/apps/taro/src/utils/common/message.tsx b/apps/taro/src/utils/common/message.tsx
index 937d801..9a64b30 100644
--- a/apps/taro/src/utils/common/message.tsx
+++ b/apps/taro/src/utils/common/message.tsx
@@ -24,11 +24,17 @@
   title?: string;
   message?: string | VNode;
   confirmText?: string;
+  showCancelBtn?: boolean;
 };
 
 export class Message {
   static confirm(options: ConfirmOptions = {}) {
-    const { title = '鎻愮ず', message = '纭畾瑕佸垹闄よ鏁版嵁鍚�?', confirmText = '纭' } = options;
+    const {
+      title = '鎻愮ず',
+      message = '纭畾瑕佸垹闄よ鏁版嵁鍚�?',
+      confirmText = '纭',
+      showCancelBtn = true,
+    } = options;
     return new Promise((resolve, reject) => {
       Portal.add((key) => {
         return (
@@ -54,6 +60,7 @@
                     onClose();
                   }}
                   confirmText={confirmText}
+                  showCancelBtn={showCancelBtn}
                 ></Model>
               ),
             }}
diff --git a/packages/components/src/hooks/index.ts b/packages/components/src/hooks/index.ts
index 6eca483..8288b45 100644
--- a/packages/components/src/hooks/index.ts
+++ b/packages/components/src/hooks/index.ts
@@ -18,17 +18,19 @@
 import { useInfiniteLoading } from './infiniteLoading';
 import { OrderInputType } from '../constants';
 import { convertOrderFrontStatus } from '../utils';
+import { useLifePayRateChannelAllList } from './rate';
 
 export function useGetRate() {
   const { blLifeRecharge } = useLifeRechargeContext();
 
-  const { data: lifePayRateList, isLoading } = useQuery({
-    queryKey: ['blLifeRecharge/getRate'],
-    queryFn: async () => {
-      return await blLifeRecharge.services.getRate({ showLoading: false });
-    },
-    placeholderData: () => [] as LifePayRateListOutput[],
-  });
+  // const { data: lifePayRateList, isLoading } = useQuery({
+  //   queryKey: ['blLifeRecharge/getRate'],
+  //   queryFn: async () => {
+  //     return await blLifeRecharge.services.getRate({ showLoading: false });
+  //   },
+  //   placeholderData: () => [] as LifePayRateListOutput[],
+  // });
+  const { allRateChannelList } = useLifePayRateChannelAllList();
 
   const hasChannel = computed(() => !!blLifeRecharge.accountModel.channlesNum);
 
@@ -50,10 +52,15 @@
     if (hasChannel.value && channelRate.value.channlesRate) {
       return channelRate.value.channlesRate;
     }
+    // return (
+    //   lifePayRateList.value.find(
+    //     (x) => x.rateType === blLifeRecharge.constants.LifePayRateTypeEnum.榛樿璇濊垂鎶樻墸
+    //   )?.rate ?? 0
+    // );
     return (
-      lifePayRateList.value.find(
-        (x) => x.rateType === blLifeRecharge.constants.LifePayRateTypeEnum.榛樿璇濊垂鎶樻墸
-      )?.rate ?? 0
+      allRateChannelList.value
+        .filter((x) => x.lifePayOrderType == blLifeRecharge.constants.LifePayOrderTypeEnum.璇濊垂璁㈠崟)
+        .toSorted((a, b) => a.platformRate - b.platformRate)?.[0]?.platformRate ?? 0
     );
   });
 
@@ -61,10 +68,15 @@
     if (hasChannel.value && channelRate.value.channlesRate) {
       return channelRate.value.channlesRate;
     }
+    // return (
+    //   lifePayRateList.value.find(
+    //     (x) => x.rateType === blLifeRecharge.constants.LifePayRateTypeEnum.榛樿鐢佃垂鎶樻墸
+    //   )?.rate ?? 0
+    // );
     return (
-      lifePayRateList.value.find(
-        (x) => x.rateType === blLifeRecharge.constants.LifePayRateTypeEnum.榛樿鐢佃垂鎶樻墸
-      )?.rate ?? 0
+      allRateChannelList.value
+        .filter((x) => x.lifePayOrderType == blLifeRecharge.constants.LifePayOrderTypeEnum.鐢佃垂璁㈠崟)
+        .toSorted((a, b) => a.platformRate - b.platformRate)?.[0]?.platformRate ?? 0
     );
   });
 
@@ -72,18 +84,24 @@
     if (hasChannel.value && channelRate.value.channlesRate) {
       return channelRate.value.channlesRate;
     }
+    // return (
+    //   lifePayRateList.value.find(
+    //     (x) => x.rateType === blLifeRecharge.constants.LifePayRateTypeEnum.榛樿鐕冩皵鎶樻墸
+    //   )?.rate ?? 0
+    // );
     return (
-      lifePayRateList.value.find(
-        (x) => x.rateType === blLifeRecharge.constants.LifePayRateTypeEnum.榛樿鐕冩皵鎶樻墸
-      )?.rate ?? 0
+      allRateChannelList.value
+        .filter((x) => x.lifePayOrderType == blLifeRecharge.constants.LifePayOrderTypeEnum.鐕冩皵璁㈠崟)
+        .toSorted((a, b) => a.platformRate - b.platformRate)?.[0]?.platformRate ?? 0
     );
   });
 
   return {
-    lifePayRateList,
+    // lifePayRateList,
     lifePayPhoneRate,
     lifePayElectricRate,
     lifePayGasRate,
+    allRateChannelList,
   };
 }
 
@@ -265,23 +283,25 @@
   onSetUserAccount: (currentUserAccount: UserAccountListOutput) => any;
   getDefaultUserAccount?: (
     userAccountList: UserAccountListOutput[]
-  ) => UserAccountListOutput | undefined;
+  ) => Promise<UserAccountListOutput | undefined>;
 };
 
 export function useSetUserAccountBySelect({
   lifePayOrderType,
   onSetUserAccount,
-  getDefaultUserAccount = (data) => data[0],
+  getDefaultUserAccount = (data) => Promise.resolve(data[0]),
 }: UseSetUserAccountBySelectOptions) {
   const { userAccountAllList } = useUserAccountAllList({
     lifePayOrderType: lifePayOrderType,
-    onSuccess(data) {
-      if (data.length > 0) {
-        const currentUserAccount = getDefaultUserAccount(data);
-        if (currentUserAccount) {
-          onSetUserAccount?.(currentUserAccount);
+    async onSuccess(data) {
+      try {
+        if (data.length > 0) {
+          const currentUserAccount = await getDefaultUserAccount(data);
+          if (currentUserAccount) {
+            onSetUserAccount?.(currentUserAccount);
+          }
         }
-      }
+      } catch (error) {}
     },
   });
 
diff --git a/packages/components/src/hooks/rate.ts b/packages/components/src/hooks/rate.ts
new file mode 100644
index 0000000..48b30b4
--- /dev/null
+++ b/packages/components/src/hooks/rate.ts
@@ -0,0 +1,101 @@
+import {
+  useLifeRechargeContext,
+  QueryRateChannelInput,
+  CreateEditRateChannelOutput,
+} from '@life-payment/core-vue';
+import { useQuery, useQueryClient } from '@tanstack/vue-query';
+import { MaybeRef, unref, computed, Ref } from 'vue';
+
+type UseLifePayRateChannelAllListOptions = {
+  params?: MaybeRef<QueryRateChannelInput>;
+};
+
+export function useLifePayRateChannelAllList(options: UseLifePayRateChannelAllListOptions = {}) {
+  const { params = {} } = options;
+
+  const { blLifeRecharge } = useLifeRechargeContext();
+
+  const queryClient = useQueryClient();
+
+  const _params = computed(() => ({
+    status: blLifeRecharge.constants.LifePayRateChannelStatus.Enabled,
+    ...unref(params),
+  }));
+
+  const { data: allRateChannelList } = useQuery({
+    queryKey: ['blLifeRecharge/getLifePayRateChannelAllList', _params],
+    queryFn: async () => {
+      return await blLifeRecharge.services.getLifePayRateChannelAllList(_params.value, {
+        showLoading: false,
+      });
+    },
+    placeholderData: () => [] as CreateEditRateChannelOutput[],
+  });
+
+  function ensureLifePayRateChannelAllList() {
+    return queryClient.ensureQueryData({
+      queryKey: ['blLifeRecharge/getLifePayRateChannelAllList', _params],
+    });
+  }
+
+  function getRateChannelByCode(code: string) {
+    return allRateChannelList.value.find((item) => item.code === code);
+  }
+
+  return {
+    allRateChannelList,
+    ensureLifePayRateChannelAllList,
+    getRateChannelByCode,
+  };
+}
+
+type UseCheckCanRechargeOptions = {
+  msg: Ref<string>;
+  show: Ref<boolean>;
+};
+
+export function useCheckCanRecharge(options: UseCheckCanRechargeOptions) {
+  const { msg, show } = options;
+
+  const { blLifeRecharge } = useLifeRechargeContext();
+
+  const { getRateChannelByCode, ensureLifePayRateChannelAllList } = useLifePayRateChannelAllList({
+    params: {
+      status: null,
+    },
+  });
+
+  /**
+   *
+   * @param rateChannelCode
+   * @description rateChannelCode鍊艰瘽璐逛负IspCode銆佺數璐逛负electricType銆佺噧姘旇垂涓篻asOrgType
+   * @returns
+   */
+  function isCanRecharge(rateChannelCode: string) {
+    const rateChannel = getRateChannelByCode(rateChannelCode);
+    return rateChannel?.status === blLifeRecharge.constants.LifePayRateChannelStatus.Enabled;
+  }
+
+  /**
+   *
+   * @param rateChannelCode
+   * @description rateChannelCode鍊艰瘽璐逛负IspCode銆佺數璐逛负electricType銆佺噧姘旇垂涓篻asOrgType
+   * @returns
+   */
+  function checkCanRecharge(rateChannelCode: string) {
+    const rateChannel = getRateChannelByCode(rateChannelCode);
+    if (!isCanRecharge(rateChannelCode)) {
+      //閫氶亾姝e湪鍗囩骇锛岀粰鎮ㄥ甫鏉ヤ笉渚垮敖鎯呰皡瑙�
+      msg.value = rateChannel?.remark ?? '';
+      show.value = true;
+      return false;
+    }
+    return true;
+  }
+
+  return {
+    isCanRecharge,
+    checkCanRecharge,
+    ensureLifePayRateChannelAllList,
+  };
+}
diff --git a/packages/components/src/views/GasBillRecharge/GasBillRechargeStep3.vue b/packages/components/src/views/GasBillRecharge/GasBillRechargeStep3.vue
index be78bf7..ef36068 100644
--- a/packages/components/src/views/GasBillRecharge/GasBillRechargeStep3.vue
+++ b/packages/components/src/views/GasBillRecharge/GasBillRechargeStep3.vue
@@ -13,7 +13,7 @@
           direction="horizontal"
           class="par-account-list"
           v-if="userAccountAllList.length > 0"
-          @change="handleUserAccountChange"
+          @change="_handleUserAccountChange"
         >
           <NutRadio
             :label="item.id"
@@ -145,6 +145,7 @@
 import { RechargeProps } from '../PhoneBillRecharge/types';
 import Chunk from '../../components/Layout/Chunk.vue';
 import IconSelect from '../../assets/recharge/icon-select.png';
+import { useCheckCanRecharge } from '../../hooks/rate';
 
 defineOptions({
   name: 'GasBillRechargeStep3',
@@ -199,7 +200,28 @@
       form.parValue = 0;
     }
   },
+  async getDefaultUserAccount(userAccountList) {
+    await ensureLifePayRateChannelAllList();
+    const defaultUserAccount = userAccountList.find((x) => {
+      const currentUserAccountExtraProperties = JSON.parse(
+        x.extraProperties
+      ) as GasUserAccountExtraProperties;
+      return isCanRecharge(currentUserAccountExtraProperties.gasOrgType);
+    });
+    return defaultUserAccount;
+  },
 });
+
+function _handleUserAccountChange(userAccountId: string) {
+  const currentUserAccount = userAccountAllList.value.find((x) => x.id === userAccountId);
+  const currentUserAccountExtraProperties = JSON.parse(
+    currentUserAccount.extraProperties
+  ) as GasUserAccountExtraProperties;
+  if (!checkCanRecharge(currentUserAccountExtraProperties.gasOrgType)) {
+    // return;
+  }
+  handleUserAccountChange(userAccountId);
+}
 
 function handleAddUserAccount() {
   goTo('step1');
@@ -257,8 +279,16 @@
 
 const currentOrderNo = ref('');
 
+const { isCanRecharge, checkCanRecharge, ensureLifePayRateChannelAllList } = useCheckCanRecharge({
+  msg: toRef(state, 'msg'),
+  show: toRef(state, 'show'),
+});
+
 async function goPay() {
   try {
+    if (!checkCanRecharge(form.gasOrgType)) {
+      return;
+    }
     let params: LifeGasDataCreateLifePayOrderInput = {
       userId: blLifeRecharge.accountModel.userId,
       channelId: blLifeRecharge.accountModel.channlesNum,
diff --git a/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeBaseForm.vue b/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeBaseForm.vue
index 2b4f92a..bd2b1fb 100644
--- a/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeBaseForm.vue
+++ b/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeBaseForm.vue
@@ -8,12 +8,9 @@
   >
     <NutFormItem label="閫夋嫨杩愯惀鍟�:" class="bole-form-item" prop="ispCode" required>
       <NutRadioGroup v-model="form.ispCode" direction="horizontal" @change="handleIspCodeChange">
-        <BlRadio
-          :label="key"
-          v-for="(val, key) in BlLifeRecharge.constants.IspCodeTextForSelect"
-          :key="key"
-          >{{ val }}</BlRadio
-        >
+        <BlRadio :label="item.code" v-for="item in allRateChannelList" :key="item.id">{{
+          item.rateChannelName
+        }}</BlRadio>
       </NutRadioGroup>
     </NutFormItem>
     <NutFormItem label="鍏呭�兼墜鏈哄彿" class="bole-form-item" prop="phone" required>
@@ -56,6 +53,7 @@
 import BlRadio from '../../components/Radio/Radio.vue';
 import { FormValidator } from '../../utils';
 import { BlLifeRecharge, LifeRechargeConstants } from '@life-payment/core-vue';
+import { useLifePayRateChannelAllList } from '../../hooks/rate';
 
 defineOptions({
   name: 'PhoneBillRechargeBaseForm',
@@ -78,6 +76,12 @@
 
 const dialogVisible = ref(false);
 
+const { allRateChannelList } = useLifePayRateChannelAllList({
+  params: {
+    lifePayOrderType: LifeRechargeConstants.LifePayOrderTypeEnum.璇濊垂璁㈠崟,
+  },
+});
+
 function handleIspCodeChange(ispCode: LifeRechargeConstants.IspCode) {
   console.log('ispCode: ', ispCode);
   if (ispCode === LifeRechargeConstants.IspCode.dianxin) {
diff --git a/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep2.vue b/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep2.vue
index 1ca4086..a5508c1 100644
--- a/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep2.vue
+++ b/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep2.vue
@@ -132,6 +132,7 @@
 import { RechargeProps } from './types';
 import Chunk from '../../components/Layout/Chunk.vue';
 import IconSelect from '../../assets/recharge/icon-select.png';
+import { useCheckCanRecharge } from '../../hooks/rate';
 
 defineOptions({
   name: 'PhoneBillRechargeStep2',
@@ -166,7 +167,8 @@
     form.remark = currentUserAccount.remark;
     changeIspCode(form.ispCode as any);
   },
-  getDefaultUserAccount(userAccountList) {
+  async getDefaultUserAccount(userAccountList) {
+    await ensureLifePayRateChannelAllList();
     const defaultUserAccount = userAccountList.find((x) => {
       const currentUserAccountExtraProperties = JSON.parse(
         x.extraProperties
@@ -262,21 +264,10 @@
 
 const currentOrderNo = ref('');
 
-function isCanRecharge(ispCode: string) {
-  // return ispCode !== blLifeRecharge.constants.IspCode.yidong;
-  return true;
-}
-
-function checkCanRecharge(ispCode: string) {
-  if (!isCanRecharge(ispCode)) {
-    //閫氶亾姝e湪鍗囩骇锛岀粰鎮ㄥ甫鏉ヤ笉渚垮敖鎯呰皡瑙�
-    state.msg =
-      '灏婃暚鐨勭敤鎴凤紝涓烘彁渚涙洿瀹夊叏銆佺ǔ瀹氱殑鍏呭�兼湇鍔★紝绉诲姩鍏呭�奸�氶亾姝e湪杩涜鍗囩骇缁存姢锛岀淮鎶ゆ湡闂存殏鏃犳硶鍙戣捣鍏呭��';
-    state.show = true;
-    return false;
-  }
-  return true;
-}
+const { isCanRecharge, checkCanRecharge, ensureLifePayRateChannelAllList } = useCheckCanRecharge({
+  msg: toRef(state, 'msg'),
+  show: toRef(state, 'show'),
+});
 
 async function goPay() {
   try {
diff --git a/packages/components/src/views/electricBillRecharge/ElectricBillRechargeStep2.vue b/packages/components/src/views/electricBillRecharge/ElectricBillRechargeStep2.vue
index 40844f6..719bc65 100644
--- a/packages/components/src/views/electricBillRecharge/ElectricBillRechargeStep2.vue
+++ b/packages/components/src/views/electricBillRecharge/ElectricBillRechargeStep2.vue
@@ -13,7 +13,7 @@
           direction="horizontal"
           class="par-account-list"
           v-if="userAccountAllList.length > 0"
-          @change="handleUserAccountChange"
+          @change="_handleUserAccountChange"
         >
           <NutRadio
             :label="item.id"
@@ -143,6 +143,7 @@
 import { RechargeProps } from '../PhoneBillRecharge/types';
 import Chunk from '../../components/Layout/Chunk.vue';
 import IconSelect from '../../assets/recharge/icon-select.png';
+import { useCheckCanRecharge } from '../../hooks/rate';
 
 defineOptions({
   name: 'ElectricBillRechargeStep2',
@@ -201,7 +202,28 @@
       form.parValue = 0;
     }
   },
+  async getDefaultUserAccount(userAccountList) {
+    await ensureLifePayRateChannelAllList();
+    const defaultUserAccount = userAccountList.find((x) => {
+      const currentUserAccountExtraProperties = JSON.parse(
+        x.extraProperties
+      ) as ElectricUserAccountExtraProperties;
+      return isCanRecharge(currentUserAccountExtraProperties.electricType);
+    });
+    return defaultUserAccount;
+  },
 });
+
+function _handleUserAccountChange(userAccountId: string) {
+  const currentUserAccount = userAccountAllList.value.find((x) => x.id === userAccountId);
+  const currentUserAccountExtraProperties = JSON.parse(
+    currentUserAccount.extraProperties
+  ) as ElectricUserAccountExtraProperties;
+  if (!checkCanRecharge(currentUserAccountExtraProperties.electricType)) {
+    // return;
+  }
+  handleUserAccountChange(userAccountId);
+}
 
 function handleAddUserAccount() {
   goTo('step1');
@@ -261,8 +283,16 @@
 
 const currentOrderNo = ref('');
 
+const { isCanRecharge, checkCanRecharge, ensureLifePayRateChannelAllList } = useCheckCanRecharge({
+  msg: toRef(state, 'msg'),
+  show: toRef(state, 'show'),
+});
+
 async function goPay() {
   try {
+    if (!checkCanRecharge(form.electricType)) {
+      return;
+    }
     let params: LifeElectricDataCreateLifePayOrderInput = {
       userId: blLifeRecharge.accountModel.userId,
       channelId: blLifeRecharge.accountModel.channlesNum,
diff --git a/packages/core/src/lifeRechargeConstants.ts b/packages/core/src/lifeRechargeConstants.ts
index 528cfbe..5dff6c0 100644
--- a/packages/core/src/lifeRechargeConstants.ts
+++ b/packages/core/src/lifeRechargeConstants.ts
@@ -231,4 +231,27 @@
     [LifePayChannelAgentType.BrandAgent]: '鍝佺墝浠g悊',
     [LifePayChannelAgentType.AreaAgent]: '鍖哄煙浠g悊',
   };
+
+  export enum AnnouncementTypeEnum {
+    /**鏅�氬叕鍛� */
+    Normal = 10,
+    /**寮圭獥鍏憡 */
+    Dialog = 20,
+  }
+
+  export enum AnnouncementStatusEnum {
+    /**灞曠ず涓� */
+    Showing = 10,
+    /**寰呭睍绀� */
+    Wait = 20,
+    /**宸插仠姝� */
+    Stop = 30,
+  }
+
+  export enum LifePayRateChannelStatus {
+    /**鍚敤 */
+    Disabled = -10,
+    /**绂佺敤 */
+    Enabled = 10,
+  }
 }
diff --git a/packages/core/src/lifeRechargeServices.ts b/packages/core/src/lifeRechargeServices.ts
index 41e981e..9bfcac7 100644
--- a/packages/core/src/lifeRechargeServices.ts
+++ b/packages/core/src/lifeRechargeServices.ts
@@ -464,6 +464,39 @@
       ...(options || {}),
     });
   }
+
+  /** 鑾峰彇褰撳墠灞曠ず涓殑鍏憡 POST /api/LifePayAnnouncement/GetShowingLifePayAnnouncement */
+  async getShowingLifePayAnnouncement(
+    body: GetShowingLifePayAnnouncementInput,
+    options?: RequestConfig
+  ) {
+    return this.request<CreateEditLifePayAnnouncementOutput>(
+      '/api/LifePayAnnouncement/GetShowingLifePayAnnouncement',
+      {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json',
+        },
+        data: body,
+        ...(options || {}),
+      }
+    );
+  }
+
+  /** 鑾峰彇鎶樻墸閫氶亾閰嶇疆鍒楄〃 POST /api/LifePayRate/GetLifePayRateChannelAllList */
+  async getLifePayRateChannelAllList(body: QueryRateChannelInput, options?: RequestConfig) {
+    return this.request<CreateEditRateChannelOutput[]>(
+      '/api/LifePayRate/GetLifePayRateChannelAllList',
+      {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json',
+        },
+        data: body,
+        ...(options || {}),
+      }
+    );
+  }
 }
 
 export interface PhoneMesssageCodeLoginInput {
@@ -1069,3 +1102,42 @@
   /** IdNumber */
   idNumber?: string;
 }
+
+export interface GetShowingLifePayAnnouncementInput {
+  announcementType?: LifeRechargeConstants.AnnouncementTypeEnum;
+}
+
+export interface CreateEditLifePayAnnouncementOutput {
+  id?: string;
+  announcementType: LifeRechargeConstants.AnnouncementTypeEnum;
+  /** 鐢熸晥鏃ユ湡 */
+  startTime: string;
+  /** 鎴鏃ユ湡 */
+  endTime: string;
+  /** 鍏憡鍐呭 */
+  announcementContent: string;
+  creationTime?: string;
+  status?: LifeRechargeConstants.AnnouncementStatusEnum;
+}
+
+export interface QueryRateChannelInput {
+  status?: LifeRechargeConstants.LifePayRateChannelStatus;
+  lifePayOrderType?: LifeRechargeConstants.LifePayOrderTypeEnum;
+}
+
+export interface CreateEditRateChannelOutput {
+  id?: string;
+  lifePayOrderType: LifeRechargeConstants.LifePayOrderTypeEnum;
+  /** 閫氶亾 */
+  rateChannelName: string;
+  /** ID */
+  code: string;
+  /** 渚涘簲鍟嗘姌鎵� */
+  supplierRate: number;
+  /** 骞冲彴鎶樻墸 */
+  platformRate: number;
+  status: LifeRechargeConstants.LifePayRateChannelStatus;
+  /** 閫氱煡鍐呭 */
+  remark: string;
+  creationTime?: string;
+}
diff --git a/packages/services/api/LifePayAnnouncement.ts b/packages/services/api/LifePayAnnouncement.ts
new file mode 100644
index 0000000..4714e3e
--- /dev/null
+++ b/packages/services/api/LifePayAnnouncement.ts
@@ -0,0 +1,69 @@
+/* eslint-disable */
+// @ts-ignore
+import { request } from '@/utils/request';
+
+/** 鏂板缂栬緫鍏憡 POST /api/LifePayAnnouncement/CreateOrEditLifePayAnnouncement */
+export async function createOrEditLifePayAnnouncement(
+  body: API.CreateEditLifePayAnnouncementInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/LifePayAnnouncement/CreateOrEditLifePayAnnouncement', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鍒犻櫎鍏憡 GET /api/LifePayAnnouncement/DeleteLifePayAnnouncement */
+export async function deleteLifePayAnnouncement(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIdeleteLifePayAnnouncementParams,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/LifePayAnnouncement/DeleteLifePayAnnouncement', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+/** 鑾峰彇鍏憡鍒嗛〉 POST /api/LifePayAnnouncement/GetLifePayAnnouncementPage */
+export async function getLifePayAnnouncementPage(
+  body: API.GetLifePayAnnouncementPageInput,
+  options?: API.RequestConfig
+) {
+  return request<API.CreateEditLifePayAnnouncementOutputPageOutput>(
+    '/api/LifePayAnnouncement/GetLifePayAnnouncementPage',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 鑾峰彇褰撳墠灞曠ず涓殑鍏憡 POST /api/LifePayAnnouncement/GetShowingLifePayAnnouncement */
+export async function getShowingLifePayAnnouncement(
+  body: API.GetShowingLifePayAnnouncementInput,
+  options?: API.RequestConfig
+) {
+  return request<API.CreateEditLifePayAnnouncementOutput>(
+    '/api/LifePayAnnouncement/GetShowingLifePayAnnouncement',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
diff --git a/packages/services/api/LifePayRate.ts b/packages/services/api/LifePayRate.ts
new file mode 100644
index 0000000..6d326d1
--- /dev/null
+++ b/packages/services/api/LifePayRate.ts
@@ -0,0 +1,81 @@
+/* eslint-disable */
+// @ts-ignore
+import { request } from '@/utils/request';
+
+/** 鏂板缂栬緫鎶樻墸閫氶亾閰嶇疆 POST /api/LifePayRate/CreateOrEditLifePayRateChannel */
+export async function createOrEditLifePayRateChannel(
+  body: API.CreateEditRateChannelInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/LifePayRate/CreateOrEditLifePayRateChannel', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鍒犻櫎鎶樻墸閫氶亾 POST /api/LifePayRate/DeleteRateChannel */
+export async function deleteRateChannel(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIdeleteRateChannelParams,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/LifePayRate/DeleteRateChannel', {
+    method: 'POST',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+/** 鑾峰彇鎶樻墸閫氶亾閰嶇疆鍒楄〃 POST /api/LifePayRate/GetLifePayRateChannelAllList */
+export async function getLifePayRateChannelAllList(
+  body: API.QueryRateChannelInput,
+  options?: API.RequestConfig
+) {
+  return request<API.CreateEditRateChannelOutput[]>(
+    '/api/LifePayRate/GetLifePayRateChannelAllList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 鑾峰彇鎶樻墸閫氶亾閰嶇疆鍒嗛〉 POST /api/LifePayRate/GetLifePayRateChannelPage */
+export async function getLifePayRateChannelPage(body: API.PageInput, options?: API.RequestConfig) {
+  return request<API.CreateEditRateChannelOutputPageOutput>(
+    '/api/LifePayRate/GetLifePayRateChannelPage',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 璁剧疆鎶樻墸閫氶亾鐘舵�� GET /api/LifePayRate/SetRateChannelStatus */
+export async function setRateChannelStatus(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIsetRateChannelStatusParams,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/LifePayRate/SetRateChannelStatus', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
diff --git a/packages/services/api/WxPayNotify.ts b/packages/services/api/WxPayNotify.ts
index fa00992..ac15ac8 100644
--- a/packages/services/api/WxPayNotify.ts
+++ b/packages/services/api/WxPayNotify.ts
@@ -17,6 +17,21 @@
   });
 }
 
+/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 POST /api/WxPayNotify/WxPayDomesticRefundsNotifyImp */
+export async function wxPayDomesticRefundsNotifyImp(
+  body: API.WxPayDomesticRefundsNotice,
+  options?: API.RequestConfig
+) {
+  return request<any>('/api/WxPayNotify/WxPayDomesticRefundsNotifyImp', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 寰俊鏀粯鍥炶皟閫氱煡 POST /api/WxPayNotify/WxRechargeNotify */
 export async function wxRechargeNotify(
   body: API.WxRechargeNotifyInput,
diff --git a/packages/services/api/index.ts b/packages/services/api/index.ts
index 8bc1a3d..002daba 100644
--- a/packages/services/api/index.ts
+++ b/packages/services/api/index.ts
@@ -14,6 +14,8 @@
 import * as IdentityUser from './IdentityUser';
 import * as IdentityUserLookup from './IdentityUserLookup';
 import * as LifePay from './LifePay';
+import * as LifePayAnnouncement from './LifePayAnnouncement';
+import * as LifePayRate from './LifePayRate';
 import * as Log from './Log';
 import * as OperateHistory from './OperateHistory';
 import * as Permissions from './Permissions';
@@ -38,6 +40,8 @@
   IdentityUser,
   IdentityUserLookup,
   LifePay,
+  LifePayAnnouncement,
+  LifePayRate,
   Log,
   OperateHistory,
   Permissions,
diff --git a/packages/services/api/typings.d.ts b/packages/services/api/typings.d.ts
index 6640eab..81c5ffa 100644
--- a/packages/services/api/typings.d.ts
+++ b/packages/services/api/typings.d.ts
@@ -139,6 +139,10 @@
     column?: ModuleColumnDto[];
   }
 
+  type AnnouncementStatusEnum = 10 | 20 | 30;
+
+  type AnnouncementTypeEnum = 10 | 20;
+
   interface APIaddOrEditModuleStatusParams {
     id?: string;
     isMenu?: number;
@@ -169,6 +173,10 @@
     id?: string;
   }
 
+  interface APIdeleteLifePayAnnouncementParams {
+    id?: string;
+  }
+
   interface APIdeleteModuleButtonParams {
     id?: string;
   }
@@ -178,6 +186,10 @@
   }
 
   interface APIdeleteModuleParams {
+    id?: string;
+  }
+
+  interface APIdeleteRateChannelParams {
     id?: string;
   }
 
@@ -390,6 +402,11 @@
   interface APIsetLifePayChannelsStatusParams {
     id?: string;
     status?: LifePayChannelsStatsEnum;
+  }
+
+  interface APIsetRateChannelStatusParams {
+    id?: string;
+    status?: LifePayRateChannelStatus;
   }
 
   interface APIstatisticsByDateParams {
@@ -717,6 +734,36 @@
     customerResources?: string;
   }
 
+  interface CreateEditLifePayAnnouncementInput {
+    id?: string;
+    announcementType: AnnouncementTypeEnum;
+    /** 鐢熸晥鏃ユ湡 */
+    startTime: string;
+    /** 鎴鏃ユ湡 */
+    endTime: string;
+    /** 鍏憡鍐呭 */
+    announcementContent: string;
+  }
+
+  interface CreateEditLifePayAnnouncementOutput {
+    id?: string;
+    announcementType: AnnouncementTypeEnum;
+    /** 鐢熸晥鏃ユ湡 */
+    startTime: string;
+    /** 鎴鏃ユ湡 */
+    endTime: string;
+    /** 鍏憡鍐呭 */
+    announcementContent: string;
+    creationTime?: string;
+    status?: AnnouncementStatusEnum;
+  }
+
+  interface CreateEditLifePayAnnouncementOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: CreateEditLifePayAnnouncementOutput[];
+  }
+
   interface CreateEditPayChannelsInput {
     id?: string;
     channlesName?: string;
@@ -741,6 +788,45 @@
     pageModel?: Pagination;
     objectData?: any;
     data?: CreateEditPayChannelsInput[];
+  }
+
+  interface CreateEditRateChannelInput {
+    id?: string;
+    lifePayOrderType: LifePayOrderTypeEnum;
+    /** 閫氶亾 */
+    rateChannelName: string;
+    /** ID */
+    code: string;
+    /** 渚涘簲鍟嗘姌鎵� */
+    supplierRate: number;
+    /** 骞冲彴鎶樻墸 */
+    platformRate: number;
+    status: LifePayRateChannelStatus;
+    /** 閫氱煡鍐呭 */
+    remark: string;
+  }
+
+  interface CreateEditRateChannelOutput {
+    id?: string;
+    lifePayOrderType: LifePayOrderTypeEnum;
+    /** 閫氶亾 */
+    rateChannelName: string;
+    /** ID */
+    code: string;
+    /** 渚涘簲鍟嗘姌鎵� */
+    supplierRate: number;
+    /** 骞冲彴鎶樻墸 */
+    platformRate: number;
+    status: LifePayRateChannelStatus;
+    /** 閫氱煡鍐呭 */
+    remark: string;
+    creationTime?: string;
+  }
+
+  interface CreateEditRateChannelOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: CreateEditRateChannelOutput[];
   }
 
   interface CreateLifePayOrderOutput {
@@ -1052,6 +1138,15 @@
     groups?: FeatureGroupDto[];
   }
 
+  interface GetLifePayAnnouncementPageInput {
+    pageModel?: Pagination;
+    creationTimeBegin?: string;
+    creationTimeEnd?: string;
+    startTime?: string;
+    endTime?: string;
+    status?: AnnouncementStatusEnum;
+  }
+
   interface GetOperateHistoryInput {
     pageModel?: Pagination;
     relationId?: string;
@@ -1093,6 +1188,10 @@
     pageModel?: Pagination;
     /** 鏌ヨ鏉′欢锛氳鑹插悕绉� */
     queryCondition?: string;
+  }
+
+  interface GetShowingLifePayAnnouncementInput {
+    announcementType?: AnnouncementTypeEnum;
   }
 
   interface IanaTimeZone {
@@ -1631,6 +1730,8 @@
     rate?: number;
     id?: string;
   }
+
+  type LifePayRateChannelStatus = 10 | -10;
 
   interface LifePayRateInput {
     rateType?: LifePayRateTypeEnum;
@@ -2202,6 +2303,11 @@
     phoneChargeOrder?: PhoneChargeOrderOutput;
   }
 
+  interface QueryRateChannelInput {
+    status?: LifePayRateChannelStatus;
+    lifePayOrderType?: LifePayOrderTypeEnum;
+  }
+
   interface QueryUserAccountAllListInput {
     pageModel?: Pagination;
     checkChannelId?: string;
@@ -2245,6 +2351,13 @@
     receiveList?: ReceiptsDetail[];
     /** 30澶╂敹鍏� */
     incomeList?: ReceiptsDetail[];
+  }
+
+  interface RefundAmount {
+    total: number;
+    refund: number;
+    payerTotal: string;
+    payerRefund: string;
   }
 
   interface RefundLifePayOrderInput {
@@ -2781,6 +2894,15 @@
     unionId?: string;
   }
 
+  interface WxPayDomesticRefundsNotice {
+    mchid?: string;
+    outTradeNo?: string;
+    transactionId?: string;
+    outRefundNo?: string;
+    refundStatus?: string;
+    amount?: RefundAmount;
+  }
+
   interface WxPayDomesticRefundsQueryReponse {
     code?: string;
     message?: string;
diff --git a/types/api.d.ts b/types/api.d.ts
index 3241ace..95e117a 100644
--- a/types/api.d.ts
+++ b/types/api.d.ts
@@ -2,6 +2,7 @@
   interface RequestConfig extends GlobalType.RequestConfig {
     showNavigationBarLoading?: boolean;
     showLoading?: boolean;
+    skipErrorHandler?: boolean;
     mock?: boolean;
     customErrorHandler?: (error: any) => boolean;
   }

--
Gitblit v1.9.1