| | |
| | | <template> |
| | | <Portal.Host> |
| | | <div :class="['page-layout-wrapper', { isWeb: isWeb }]" v-bind="$attrs"> |
| | | <div :class="['page-layout-wrapper', { isWeb: isWeb, hasBgColor }]"> |
| | | <slot v-if="_showNavigationBar" name="navigationBar"> |
| | | <CommonNavigationBar v-bind="_commonNavigationBarProps" /> |
| | | </slot> |
| | | |
| | | <slot name="bg"> |
| | | <div |
| | | v-if="hasLinearBg" |
| | | class="page-layout-linear-bg" |
| | | :style="{ |
| | | height: '100%', |
| | | }" |
| | | ></div> |
| | | </slot> |
| | | |
| | | <div class="page-layout-scroll-view-wrapper" :style="{ height: scrollViewHeight }"> |
| | |
| | | import { isWeb, isInAlipay, isInWeChat } from '@/utils/env'; |
| | | //@ts-ignore |
| | | import { setPageTitle } from '@/utils'; |
| | | import { pageLayoutProps } from './layout'; |
| | | |
| | | defineOptions({ |
| | | name: 'PageLayout', |
| | | inheritAttrs: false, |
| | | }); |
| | | |
| | | const props = defineProps({ |
| | | ...commonNavigationBarProps, |
| | | needAuth: { |
| | | type: Boolean, |
| | | default: true, |
| | | }, |
| | | useView: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | hasLinearBg: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | linearBgHeight: { |
| | | type: Number, |
| | | default: 388, |
| | | }, |
| | | }); |
| | | const props = defineProps(pageLayoutProps); |
| | | |
| | | setPageTitle(props.title); |
| | | |
| | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .page-layout-container { |
| | | height: 100%; |
| | | position: relative; |
| | | |
| | | .page-layout-wrapper { |
| | | width: 100%; |
| | | height: 100%; |
| | | position: absolute; |
| | | z-index: 100; |
| | | } |
| | | } |
| | | |
| | | .page-layout-wrapper { |
| | | /* background-color: $body-background-color; */ |
| | | |
| | | &.hasBgColor { |
| | | background-color: $body-background-color; |
| | | } |
| | | |
| | | .page-layout-scroll-view-wrapper { |
| | | display: flex; |
| | | flex-direction: column; |
| | |
| | | <template> |
| | | <PageLayout v-bind="props"> |
| | | <template #navigationBar> |
| | | <TransparentNavigationBar :title="title" :is-absolute="false"> |
| | | <template #left> |
| | | <slot name="left"></slot> |
| | | </template> |
| | | </TransparentNavigationBar> |
| | | </template> |
| | | <template #bg> |
| | | <div class="page-layout-container"> |
| | | <slot name="bg"> |
| | | <img :src="OssAssets.common.CommonPageBg" class="common-page-bg" /> |
| | | </template> |
| | | <template #default="{ scrollViewHeight }"> |
| | | <slot :scrollViewHeight="scrollViewHeight" /> |
| | | </template> |
| | | </PageLayout> |
| | | </slot> |
| | | <PageLayout v-bind="props"> |
| | | <template #navigationBar> |
| | | <slot name="navigationBar"> |
| | | <TransparentNavigationBar :title="title" :is-absolute="false"> |
| | | <template #left> |
| | | <slot name="left"></slot> |
| | | </template> |
| | | </TransparentNavigationBar> |
| | | </slot> |
| | | </template> |
| | | <template #default="{ scrollViewHeight }"> |
| | | <slot :scrollViewHeight="scrollViewHeight" /> |
| | | </template> |
| | | </PageLayout> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | import TransparentNavigationBar from '../NavigationBar/TransparentNavigationBar.vue'; |
| | | import _ from 'lodash'; |
| | | import { OssAssets } from '@/constants'; |
| | | import { pageLayoutProps } from './layout'; |
| | | |
| | | defineOptions({ |
| | | name: 'PageLayoutWithBg', |
| | | }); |
| | | |
| | | type Props = { |
| | | title?: string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), {}); |
| | | const props = defineProps(pageLayoutProps); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | |
| | | import { PropType } from 'vue'; |
| | | import { commonNavigationBarProps } from '../NavigationBar/commonNavigationBar'; |
| | | |
| | | export const loadingLayoutProps = { |
| | | loading: { |
| | |
| | | type: String, |
| | | }, |
| | | }; |
| | | |
| | | export const pageLayoutProps = { |
| | | ...commonNavigationBarProps, |
| | | needAuth: { |
| | | type: Boolean, |
| | | default: true, |
| | | }, |
| | | useView: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | hasLinearBg: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | linearBgHeight: { |
| | | type: Number, |
| | | default: 388, |
| | | }, |
| | | hasBgColor: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | }; |
New file |
| | |
| | | <template> |
| | | <div class="translate-navigation-bar" :style="barStyle"> |
| | | <TransparentNavigationBar |
| | | v-bind="_commonNavigationBarProps" |
| | | :is-absolute="false" |
| | | mode="dark" |
| | | navigationArrowWhite |
| | | :style="{ opacity: 1 - rangeValue }" |
| | | > |
| | | </TransparentNavigationBar> |
| | | <CommonNavigationBar v-bind="_commonNavigationBarProps" :style="{ opacity: rangeValue }" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { commonNavigationBarProps } from './commonNavigationBar'; |
| | | import { useSystemStore } from '@/stores/modules/system'; |
| | | import { CSSProperties } from 'vue'; |
| | | import TransparentNavigationBar from './TransparentNavigationBar.vue'; |
| | | import CommonNavigationBar from './CommonNavigationBar.vue'; |
| | | import { usePickProps } from 'senin-mini/hooks'; |
| | | |
| | | defineOptions({ |
| | | name: 'TranslateNavigationBar', |
| | | }); |
| | | |
| | | const systemStore = useSystemStore(); |
| | | |
| | | const props = defineProps({ |
| | | ...commonNavigationBarProps, |
| | | rangeValue: { |
| | | type: Number, |
| | | default: 0, |
| | | }, |
| | | }); |
| | | |
| | | const _commonNavigationBarProps = usePickProps(props, commonNavigationBarProps); |
| | | |
| | | const barStyle = computed(() => { |
| | | return { |
| | | height: systemStore.navigationBarHeight + 'px', |
| | | } as CSSProperties; |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .translate-navigation-bar { |
| | | position: relative; |
| | | |
| | | .navigation-bar-wrapper { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | export * from './login'; |
| | | export * from './infiniteLoading'; |
| | | export * from './lifepay'; |
| | | export * from './page'; |
New file |
| | |
| | | import { BaseEventOrig, ScrollViewProps } from '@tarojs/components'; |
| | | |
| | | type UseScrollRangeOptions = { |
| | | maxRange?: number; |
| | | }; |
| | | |
| | | export function useScrollRange(options: UseScrollRangeOptions = {}) { |
| | | const { maxRange = 160 } = options; |
| | | |
| | | const rangeValue = ref(0); |
| | | |
| | | function scroll(e: BaseEventOrig<ScrollViewProps.onScrollDetail>) { |
| | | rangeValue.value = Math.min(maxRange, e.detail.scrollTop) / maxRange; |
| | | } |
| | | |
| | | return { |
| | | scroll, |
| | | rangeValue, |
| | | }; |
| | | } |
| | |
| | | <template> |
| | | <PageLayout class="index-page-wrapper" :need-auth="false"> |
| | | <PageLayoutWithBg class="index-page-wrapper" :need-auth="false"> |
| | | <template #navigationBar> |
| | | <TransparentNavigationBar :title="'生活缴费'" :is-absolute="false"> |
| | | </TransparentNavigationBar> |
| | |
| | | @gasBillRecharge="goGasBillRecharge" |
| | | /> |
| | | </ContentView> |
| | | </PageLayout> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | <template> |
| | | <PageLayout class="mine-page-wrapper" :need-auth="false"> |
| | | <PageLayoutWithBg class="mine-page-wrapper" :need-auth="false"> |
| | | <template #navigationBar> |
| | | <TransparentNavigationBar :title="'个人中心'" :is-absolute="false"> |
| | | </TransparentNavigationBar> |
| | |
| | | ></ListItemV2> |
| | | </List> |
| | | </ContentScrollView> |
| | | </PageLayout> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | <template> |
| | | <PageLayout :needAuth="false" class="login-page-layout"> |
| | | <PageLayoutWithBg :needAuth="false" class="login-page-layout"> |
| | | <template #navigationBar> |
| | | <TransparentNavigationBar :title="title" :is-absolute="false"></TransparentNavigationBar> |
| | | </template> |
| | |
| | | <div class="authorization-page-title">欢迎使用生活缴费平台</div> |
| | | |
| | | <slot></slot> |
| | | </PageLayout> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | <template> |
| | | <PageLayout class="dashboard-page-wrapper"> |
| | | <PageLayoutWithBg class="dashboard-page-wrapper"> |
| | | <template #navigationBar> |
| | | <TransparentNavigationBar :title="'数据看板'" :is-absolute="false"> |
| | | </TransparentNavigationBar> |
| | |
| | | <img :src="OssAssets.common.DataPageBg" class="dashboard-page-bg" /> |
| | | </template> |
| | | <InnerPage /> |
| | | </PageLayout> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { PageLayout } from '@/components'; |
| | | import InnerPage from './InnerPage.vue'; |
| | | import { OssAssets } from '@/constants'; |
| | | |
| | |
| | | <template> |
| | | <ContentScrollView> |
| | | <OrderRefundResultView |
| | | style="margin-top: 40px" |
| | | @go-back-home="goHome()" |
| | | :orderNo="orderNo" |
| | | ></OrderRefundResultView> |
| | | <OrderRefundResultView @go-back-home="goHome()" :orderNo="orderNo"></OrderRefundResultView> |
| | | </ContentScrollView> |
| | | </template> |
| | | |
| | |
| | | <template> |
| | | <ContentScrollView :paddingH="false" style="background-color: #fff"> |
| | | <electricBillRecharge |
| | | @goPay="goPay" |
| | | :isDev="isDev" |
| | | @paySuccess="handePaySuccess" |
| | | :getOpenId="ensureOpenId" |
| | | :isInWeChat="isInWeChat" |
| | | :isInAlipay="isInAlipay" |
| | | :isH5="isWeb" |
| | | :appId="WXPayAppId" |
| | | :isFocus="isFocus" |
| | | :showAliPay="!isInWeChat" |
| | | :showWeixinPay="isInWeChat" |
| | | @missName="handleMissName" |
| | | /> |
| | | </ContentScrollView> |
| | | <electricBillRecharge |
| | | @goPay="goPay" |
| | | :isDev="isDev" |
| | | @paySuccess="handePaySuccess" |
| | | :getOpenId="ensureOpenId" |
| | | :isInWeChat="isInWeChat" |
| | | :isInAlipay="isInAlipay" |
| | | :isH5="isWeb" |
| | | :appId="WXPayAppId" |
| | | :isFocus="isFocus" |
| | | :showAliPay="!isInWeChat" |
| | | :showWeixinPay="isInWeChat" |
| | | @missName="handleMissName" |
| | | @editUserAccount="handleEditUserAccount" |
| | | @currentChange="emit('currentChange', $event)" |
| | | /> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'currentChange', current: 'step1' | 'step2'): void; |
| | | }>(); |
| | | |
| | | const isDev = process.env.NODE_ENV === 'development'; |
| | | |
| | |
| | | }); |
| | | } catch (error) {} |
| | | } |
| | | |
| | | function handleEditUserAccount(userAccountId: string) { |
| | | RouteHelper.navigateTo({ |
| | | url: `${RouterPath.editElectricUserAccount}?id=${userAccountId}`, |
| | | }); |
| | | } |
| | | </script> |
| | |
| | | <template> |
| | | <PageLayout title="电费充值" class="electricBillRecharge-page-wrapper" hasBorder> |
| | | <InnerPage /> |
| | | </PageLayout> |
| | | <PageLayoutWithBg |
| | | class="electricBillRecharge-page-wrapper" |
| | | :title="current != 'step2' ? title : ''" |
| | | > |
| | | <template #navigationBar v-if="current === 'step2'"> |
| | | <TranslateNavigationBar :title="title" :rangeValue="rangeValue"> </TranslateNavigationBar> |
| | | </template> |
| | | <template #bg> |
| | | <div |
| | | class="electricBillRecharge-page-bg" |
| | | :style=" |
| | | current === 'step2' && { |
| | | backgroundImage: `url(${OssAssets.common.PhoneBillRechargePageBg})`, |
| | | opacity: 1 - rangeValue, |
| | | } |
| | | " |
| | | ></div> |
| | | </template> |
| | | <ContentScrollView hasPaddingTop style="background-color: transparent" @scroll="scroll"> |
| | | <InnerPage @currentChange="handleCurrentChange" /> |
| | | </ContentScrollView> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { PageLayout } from '@/components'; |
| | | import InnerPage from './InnerPage.vue'; |
| | | import { OssAssets } from '@/constants'; |
| | | import { useScrollRange } from '@/hooks'; |
| | | |
| | | defineOptions({ |
| | | name: 'electricBillRecharge', |
| | | }); |
| | | |
| | | type Current = 'step1' | 'step2'; |
| | | |
| | | const title = '电费充值'; |
| | | |
| | | const current = ref<Current>(); |
| | | |
| | | function handleCurrentChange(val: Current) { |
| | | current.value = val; |
| | | } |
| | | |
| | | const { rangeValue, scroll } = useScrollRange(); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .electricBillRecharge-page-wrapper { |
| | | background-color: $body-background-color; |
| | | |
| | | .electricBillRecharge-page-bg { |
| | | position: absolute; |
| | | z-index: 1; |
| | | top: 0; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background-size: 100% 452px; |
| | | background-repeat: no-repeat; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <ContentScrollView :paddingH="false" style="background-color: #fff"> |
| | | <ContentScrollView hasPaddingTop style="background-color: transparent"> |
| | | <GasBillRecharge |
| | | @goPay="goPay" |
| | | :isDev="isDev" |
| | |
| | | :showAliPay="!isInWeChat" |
| | | :showWeixinPay="isInWeChat" |
| | | @missName="handleMissName" |
| | | @editUserAccount="handleEditUserAccount" |
| | | @currentChange="emit('currentChange', $event)" |
| | | /> |
| | | </ContentScrollView> |
| | | </template> |
| | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'currentChange', current: 'step1' | 'step2' | 'step3'): void; |
| | | }>(); |
| | | |
| | | const isDev = process.env.NODE_ENV === 'development'; |
| | | |
| | |
| | | }); |
| | | } catch (error) {} |
| | | } |
| | | |
| | | function handleEditUserAccount(userAccountId: string) { |
| | | RouteHelper.navigateTo({ |
| | | url: `${RouterPath.editGasUserAccount}?id=${userAccountId}`, |
| | | }); |
| | | } |
| | | </script> |
| | |
| | | <template> |
| | | <PageLayout title="燃气充值" class="gasBillRecharge-page-wrapper" hasBorder> |
| | | <InnerPage /> |
| | | </PageLayout> |
| | | <PageLayoutWithBg class="gasBillRecharge-page-wrapper" :title="current != 'step3' ? title : ''"> |
| | | <template #navigationBar v-if="current === 'step3'"> |
| | | <TranslateNavigationBar :title="title" :rangeValue="rangeValue"> </TranslateNavigationBar> |
| | | </template> |
| | | <template #bg> |
| | | <div |
| | | class="gasBillRecharge-page-bg" |
| | | :style=" |
| | | current === 'step3' && { |
| | | backgroundImage: `url(${OssAssets.common.PhoneBillRechargePageBg})`, |
| | | opacity: 1 - rangeValue, |
| | | } |
| | | " |
| | | ></div> |
| | | </template> |
| | | <ContentScrollView hasPaddingTop style="background-color: transparent" @scroll="scroll"> |
| | | <InnerPage @currentChange="handleCurrentChange" /> |
| | | </ContentScrollView> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { PageLayout } from '@/components'; |
| | | import InnerPage from './InnerPage.vue'; |
| | | import { OssAssets } from '@/constants'; |
| | | import { useScrollRange } from '@/hooks'; |
| | | |
| | | defineOptions({ |
| | | name: 'gasBillRecharge', |
| | | }); |
| | | |
| | | type Current = 'step1' | 'step2' | 'step3'; |
| | | |
| | | const title = '燃气充值'; |
| | | |
| | | const current = ref<Current>(); |
| | | |
| | | function handleCurrentChange(val: Current) { |
| | | current.value = val; |
| | | } |
| | | |
| | | const { rangeValue, scroll } = useScrollRange(); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .gasBillRecharge-page-wrapper { |
| | | background-color: $body-background-color; |
| | | |
| | | .gasBillRecharge-page-bg { |
| | | position: absolute; |
| | | z-index: 1; |
| | | top: 0; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background-size: 100% 452px; |
| | | background-repeat: no-repeat; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <ContentScrollView hasPaddingTop style="background-color: transparent"> |
| | | <PhoneBillRecharge |
| | | @goPay="goPay" |
| | | :isDev="isDev" |
| | | @paySuccess="handePaySuccess" |
| | | :getOpenId="ensureOpenId" |
| | | :isInWeChat="isInWeChat" |
| | | :isInAlipay="isInAlipay" |
| | | :isH5="isWeb" |
| | | :appId="WXPayAppId" |
| | | :isFocus="isFocus" |
| | | :showAliPay="!isInWeChat" |
| | | :showWeixinPay="isInWeChat" |
| | | @missName="handleMissName" |
| | | @editUserAccount="handleEditUserAccount" |
| | | @currentChange="emit('currentChange', $event)" |
| | | /> |
| | | </ContentScrollView> |
| | | <PhoneBillRecharge |
| | | @goPay="goPay" |
| | | :isDev="isDev" |
| | | @paySuccess="handePaySuccess" |
| | | :getOpenId="ensureOpenId" |
| | | :isInWeChat="isInWeChat" |
| | | :isInAlipay="isInAlipay" |
| | | :isH5="isWeb" |
| | | :appId="WXPayAppId" |
| | | :isFocus="isFocus" |
| | | :showAliPay="!isInWeChat" |
| | | :showWeixinPay="isInWeChat" |
| | | @missName="handleMissName" |
| | | @editUserAccount="handleEditUserAccount" |
| | | @currentChange="emit('currentChange', $event)" |
| | | /> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | <template> |
| | | <PageLayout |
| | | class="phoneBillRecharge-page-wrapper" |
| | | :style=" |
| | | current === 'step2' && { |
| | | backgroundImage: `url(${OssAssets.common.PhoneBillRechargePageBg})`, |
| | | } |
| | | " |
| | | :title="current != 'step2' && title" |
| | | > |
| | | <PageLayoutWithBg class="phoneBillRecharge-page-wrapper" :title="current != 'step2' ? title : ''"> |
| | | <template #navigationBar v-if="current === 'step2'"> |
| | | <TransparentNavigationBar |
| | | :title="title" |
| | | :is-absolute="false" |
| | | mode="dark" |
| | | navigationArrowWhite |
| | | > |
| | | </TransparentNavigationBar> |
| | | <TranslateNavigationBar :title="title" :rangeValue="rangeValue"> </TranslateNavigationBar> |
| | | </template> |
| | | <InnerPage @currentChange="handleCurrentChange" /> |
| | | </PageLayout> |
| | | <template #bg> |
| | | <div |
| | | class="phoneBillRecharge-page-bg" |
| | | :style=" |
| | | current === 'step2' && { |
| | | backgroundImage: `url(${OssAssets.common.PhoneBillRechargePageBg})`, |
| | | opacity: 1 - rangeValue, |
| | | } |
| | | " |
| | | ></div> |
| | | </template> |
| | | <ContentScrollView hasPaddingTop style="background-color: transparent" @scroll="scroll"> |
| | | <InnerPage @currentChange="handleCurrentChange" /> |
| | | </ContentScrollView> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { PageLayout } from '@/components'; |
| | | import { useScrollRange } from '@/hooks'; |
| | | import InnerPage from './InnerPage.vue'; |
| | | import { OssAssets } from '@/constants'; |
| | | |
| | |
| | | function handleCurrentChange(val: Current) { |
| | | current.value = val; |
| | | } |
| | | |
| | | const { rangeValue, scroll } = useScrollRange(); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .phoneBillRecharge-page-wrapper { |
| | | background-size: 100% 452px; |
| | | background-color: $body-background-color; |
| | | background-repeat: no-repeat; |
| | | |
| | | .phoneBillRecharge-page-bg { |
| | | position: fixed; |
| | | z-index: -1; |
| | | position: absolute; |
| | | z-index: 1; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 452px; |
| | | object-fit: cover; |
| | | right: 0; |
| | | bottom: 0; |
| | | background-size: 100% 452px; |
| | | background-repeat: no-repeat; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <PageLayout title="充值成功" class="rechargeElectricResult-page-wrapper" hasBorder> |
| | | <ContentScrollView> |
| | | <RechargeResultView |
| | | style="margin-top: 40px" |
| | | <ResultWithTips |
| | | :title="title" |
| | | :orderNo="orderNo" |
| | | type="success" |
| | | dangerTips="同一号码充值期间,未到账前切勿在其他任何平台再次充值。因此造成的资金损失须用户自行承担!!!" |
| | | @go-back-home="goHome()" |
| | | title="支付成功,充值款将在0-72小时内到账" |
| | | /> |
| | | > |
| | | <template #remark> |
| | | <div class="result-content-remark-item">充值款将在0-72小时内到账</div> |
| | | </template> |
| | | </ResultWithTips> |
| | | </ContentScrollView> |
| | | </PageLayout> |
| | | </template> |
| | |
| | | <script setup lang="ts"> |
| | | import { PageLayout } from '@/components'; |
| | | import { goHome } from '@/utils'; |
| | | import { RechargeResultView } from '@life-payment/components'; |
| | | import { ResultWithTips } from '@life-payment/components'; |
| | | |
| | | defineOptions({ |
| | | name: 'rechargeElectricResult', |
| | | }); |
| | | |
| | | type Props = { |
| | | title?: string; |
| | | orderNo?: string; |
| | | dangerTips?: string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | title: '支付成功', |
| | | }); |
| | | </script> |
| | |
| | | <template> |
| | | <PageLayout title="充值成功" class="rechargeGasResult-page-wrapper" hasBorder> |
| | | <ContentScrollView> |
| | | <RechargeResultView |
| | | style="margin-top: 40px" |
| | | <ResultWithTips |
| | | :title="title" |
| | | :orderNo="orderNo" |
| | | type="success" |
| | | dangerTips="同一燃气费账户在充值期间,未到账前切勿在其他任何平台再次充值。因此造成的资金损失须用户自行承担!!!" |
| | | @go-back-home="goHome()" |
| | | title="支付成功,充值款将在0-72小时内到账" |
| | | > |
| | | <template #tips> |
| | | 同一燃气费账户在充值期间,未到账前切勿在其他任何平台再次充值。因此造成的资金损失须用户自行承担!!! |
| | | <template #remark> |
| | | <div class="result-content-remark-item">充值款将在0-72小时内到账</div> |
| | | </template> |
| | | </RechargeResultView> |
| | | </ResultWithTips> |
| | | </ContentScrollView> |
| | | </PageLayout> |
| | | </template> |
| | |
| | | <script setup lang="ts"> |
| | | import { PageLayout } from '@/components'; |
| | | import { goHome } from '@/utils'; |
| | | import { RechargeResultView } from '@life-payment/components'; |
| | | import { ResultWithTips } from '@life-payment/components'; |
| | | |
| | | defineOptions({ |
| | | name: 'rechargeGasResult', |
| | | }); |
| | | |
| | | type Props = { |
| | | title?: string; |
| | | orderNo?: string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | title: '支付成功', |
| | | }); |
| | | </script> |
| | |
| | | <template> |
| | | <PageLayout title="充值成功" class="rechargeResult-page-wrapper" hasBorder> |
| | | <ContentScrollView> |
| | | <RechargeResultView style="margin-top: 40px" @go-back-home="goHome()" :orderNo="orderNo" /> |
| | | <ResultWithTips |
| | | title="支付成功" |
| | | :orderNo="orderNo" |
| | | type="success" |
| | | dangerTips="同一号码充值期间,未到账前切勿在其他任何平台再次充值。因此造成的资金损失须用户自行承担!!!" |
| | | @go-back-home="goHome()" |
| | | > |
| | | <template #remark> |
| | | <div class="result-content-remark-item">充值款将在0-24小时内到账</div> |
| | | </template> |
| | | </ResultWithTips> |
| | | </ContentScrollView> |
| | | </PageLayout> |
| | | </template> |
| | |
| | | <script setup lang="ts"> |
| | | import { PageLayout } from '@/components'; |
| | | import { goHome } from '@/utils'; |
| | | import { RechargeResultView } from '@life-payment/components'; |
| | | import { ResultWithTips } from '@life-payment/components'; |
| | | import Taro from '@tarojs/taro'; |
| | | |
| | | defineOptions({ |
| | |
| | | <template> |
| | | <ContentScrollView :paddingH="false"> |
| | | <ContentScrollView hasPaddingTop style="background-color: transparent"> |
| | | <EditElectricUserAccount :id="id" @success="handleSuccess" /> |
| | | </ContentScrollView> |
| | | </template> |
| | |
| | | <template> |
| | | <PageLayout title="编辑" class="editElectricUserAccount-page-wrapper" hasBorder> |
| | | <PageLayout title="编辑" class="editElectricUserAccount-page-wrapper" hasBgColor> |
| | | <InnerPage /> |
| | | </PageLayout> |
| | | </template> |
| | |
| | | <template> |
| | | <ContentScrollView :paddingH="false"> |
| | | <ContentScrollView hasPaddingTop style="background-color: transparent"> |
| | | <EditGasUserAccount :id="id" @success="handleSuccess" /> |
| | | </ContentScrollView> |
| | | </template> |
| | |
| | | <template> |
| | | <PageLayout title="编辑" class="editGasUserAccount-page-wrapper" hasBorder> |
| | | <PageLayout title="编辑" class="editGasUserAccount-page-wrapper" hasBgColor> |
| | | <InnerPage /> |
| | | </PageLayout> |
| | | </template> |
| | |
| | | <template> |
| | | <ContentScrollView :paddingH="false"> |
| | | <ContentScrollView hasPaddingTop style="background-color: transparent"> |
| | | <EditPhoneUserAccount :id="id" @success="handleSuccess" /> |
| | | </ContentScrollView> |
| | | </template> |
| | |
| | | <template> |
| | | <PageLayout title="编辑" class="editPhoneUserAccount-page-wrapper" hasBorder> |
| | | <PageLayout title="编辑" class="editPhoneUserAccount-page-wrapper" hasBgColor> |
| | | <InnerPage /> |
| | | </PageLayout> |
| | | </template> |
| | |
| | | <div class="order-card"> |
| | | <div class="order-card-title"> |
| | | <div class="order-card-title-left"> |
| | | <div class="order-card-title-text">{{ title }}</div> |
| | | <div class="order-card-title-text-wrapper"> |
| | | <div class="order-card-title-text">{{ title }}</div> |
| | | <div class="order-card-title-status"> |
| | | <img :src="StatusEnumImg" alt="" /> |
| | | </div> |
| | | </div> |
| | | <div class="order-card-title-ordernum"> |
| | | {{ `订单编号:${orderNo}` }} |
| | | </div> |
| | | </div> |
| | | <div class="order-card-title-status"> |
| | | <img :src="LifePayOrderStatusEnumImg[status]" alt="" /> |
| | | </div> |
| | | </div> |
| | | <div class="order-card-content"> |
| | | <slot></slot> |
| | | </div> |
| | | <slot name="actions"> |
| | | <div class="order-card-footer" v-if="shoeFooter"> |
| | | <div class="order-card-footer" v-if="showFooter"> |
| | | <div |
| | | v-if="status === LifeRechargeConstants.LifePayOrderStatusEnum.充值中" |
| | | class="order-card-action" |
| | |
| | | </div> |
| | | <div |
| | | class="order-card-action" |
| | | v-if="status === LifeRechargeConstants.LifePayOrderStatusEnum.退款失败" |
| | | v-if="frontStatus === LifeRechargeConstants.LifePayOrderFrontStatusEnum.退款失败" |
| | | @click="emit('goRefundDetail', orderNo)" |
| | | > |
| | | 详情 |
| | |
| | | type Props = { |
| | | title: string; |
| | | status?: LifeRechargeConstants.LifePayOrderStatusEnum; |
| | | frontStatus?: LifeRechargeConstants.LifePayOrderFrontStatusEnum; |
| | | orderNo: string; |
| | | id: string; |
| | | }; |
| | |
| | | [LifeRechargeConstants.LifePayOrderStatusEnum.退款中]: OssAssets.card.Refund, |
| | | }; |
| | | |
| | | const shoeFooter = computed(() => { |
| | | const StatusEnumImg = computed(() => { |
| | | if (props.frontStatus === LifeRechargeConstants.LifePayOrderFrontStatusEnum.退款失败) { |
| | | return OssAssets.card.RefundFail; |
| | | } else { |
| | | return LifePayOrderStatusEnumImg[props.status]; |
| | | } |
| | | }); |
| | | |
| | | const showFooter = computed(() => { |
| | | return ( |
| | | props.status === LifeRechargeConstants.LifePayOrderStatusEnum.充值中 || |
| | | props.status === LifeRechargeConstants.LifePayOrderStatusEnum.退款失败 |
| | | props.status === LifeRechargeConstants.LifePayOrderStatusEnum.退款失败 || |
| | | props.frontStatus === LifeRechargeConstants.LifePayOrderFrontStatusEnum.退款失败 |
| | | ); |
| | | }); |
| | | </script> |
| | |
| | | <template> |
| | | <div class="order-card-item" :class="{ danger }"> |
| | | <div class="order-card-item-label" :style="{ width: labelWidth, textAlign: textAlign }"> |
| | | <div |
| | | class="order-card-item-label" |
| | | :style="{ width: Taro.pxTransform(labelWidth), textAlign: textAlign }" |
| | | > |
| | | <slot name="label">{{ label }}</slot> |
| | | </div> |
| | | <div class="order-card-item-value"> |
| | |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import Taro from '@tarojs/taro'; |
| | | |
| | | defineOptions({ |
| | | name: 'OrderCardItem', |
| | | }); |
| | |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | labelWidth: '80px', |
| | | labelWidth: 140, |
| | | textAlign: 'left', |
| | | }); |
| | | </script> |
New file |
| | |
| | | <template> |
| | | <div class="user-account-card"> |
| | | <div class="user-account-card-title"> |
| | | <img class="user-account-card-icon" :src="icon" alt="" /> |
| | | <span class="user-account-card-text">{{ title }}</span> |
| | | </div> |
| | | <div class="user-account-card-content">{{ content }}</div> |
| | | <div class="user-account-card-remark">{{ remark }}</div> |
| | | <div class="user-account-card-actions"> |
| | | <slot name="action" /> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | defineOptions({ |
| | | name: 'UserAccountCard', |
| | | }); |
| | | |
| | | type Props = { |
| | | title?: string; |
| | | content?: string; |
| | | icon?: string; |
| | | remark?: string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), {}); |
| | | </script> |
New file |
| | |
| | | <template> |
| | | <div class="result-wrapper" v-bind="$attrs"> |
| | | <div class="result-content"> |
| | | <img class="result-content-icon" :src="icon" /> |
| | | <div class="result-content-title">{{ title }}</div> |
| | | <div class="result-content-remark"> |
| | | <slot name="remark"> </slot> |
| | | </div> |
| | | </div> |
| | | <div class="result-order-number"> |
| | | <div class="result-order-number-label">订单编号:</div> |
| | | <div class="result-order-number-value">{{ orderNo }}</div> |
| | | </div> |
| | | <div class="result-wrapper-tips"> |
| | | <slot name="tips"> </slot> |
| | | </div> |
| | | <div class="result-wrapper-actions"> |
| | | <slot name="actions"> |
| | | <div class="chunk-form-actions"> |
| | | <nut-button class="recharge-button" type="primary" @click="emit('goBackHome')"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">返回首页</div> |
| | | </div> |
| | | </nut-button> |
| | | </div> |
| | | </slot> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { computed } from 'vue'; |
| | | import { OssAssets } from '../../constants/img'; |
| | | |
| | | defineOptions({ |
| | | name: 'Result', |
| | | }); |
| | | |
| | | type Props = { |
| | | title?: string; |
| | | type?: 'success' | 'fail'; |
| | | orderNo?: string; |
| | | servicePhone?: string; |
| | | dangerTips?: string; |
| | | warningTips?: string; |
| | | customerServiceTips?: string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), {}); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'goBackHome'): void; |
| | | }>(); |
| | | |
| | | const icon = computed(() => { |
| | | switch (props.type) { |
| | | case 'success': |
| | | return OssAssets.result.Success; |
| | | case 'fail': |
| | | return OssAssets.result.Fail; |
| | | default: |
| | | return OssAssets.result.Success; |
| | | } |
| | | }); |
| | | </script> |
New file |
| | |
| | | <template> |
| | | <Result> |
| | | <template #remark> |
| | | <slot name="remark"> </slot> |
| | | </template> |
| | | <template #tips> |
| | | <slot name="tips"> |
| | | <div class="result-wrapper-tips-item title">充值须知</div> |
| | | <div class="result-wrapper-tips-item danger">{{ dangerTips }}</div> |
| | | <div class="result-wrapper-tips-item warning">{{ warningTips }}</div> |
| | | <div class="result-wrapper-tips-item">{{ customerServiceTips }}</div> |
| | | </slot> |
| | | </template> |
| | | </Result> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import Result from './Result.vue'; |
| | | import { CustomerServiceTips } from '../../constants'; |
| | | |
| | | defineOptions({ |
| | | name: 'ResultWithTips', |
| | | }); |
| | | |
| | | type Props = { |
| | | dangerTips?: string; |
| | | warningTips?: string; |
| | | customerServiceTips?: string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | warningTips: '如接到陌生来电,对方以缴费或误操作等理由要求处理款项,务必立即拉黑,谨防诈骗!!!', |
| | | customerServiceTips: CustomerServiceTips, |
| | | }); |
| | | </script> |
| | |
| | | Success: `${OssBasePath}/lifePayment/assets/card/card-status-success.png`, |
| | | WaitRefund: `${OssBasePath}/lifePayment/assets/card/card-status-wait-refund.png`, |
| | | }, |
| | | |
| | | accountCard: { |
| | | Electric: `${OssBasePath}/lifePayment/assets/card/account-card-electric.png`, |
| | | Gas: `${OssBasePath}/lifePayment/assets/card/account-card-gas.png`, |
| | | Phone: `${OssBasePath}/lifePayment/assets/card/account-card-phone.png`, |
| | | }, |
| | | |
| | | result: { |
| | | Success: `${OssBasePath}/lifePayment/assets/common/icon-result-success.png`, |
| | | Fail: `${OssBasePath}/lifePayment/assets/common/icon-result-fail.png`, |
| | | }, |
| | | }; |
| | |
| | | export { default as GasBillRecharge } from './views/GasBillRecharge/GasBillRecharge.vue'; |
| | | export { default as SelectPayTypeView } from './views/SelectPayTypeView/SelectPayTypeView.vue'; |
| | | export { default as RechargeResultView } from './views/RechargeResultView/RechargeResultView.vue'; |
| | | export { default as Result } from './components/Result/Result.vue'; |
| | | export { default as ResultWithTips } from './components/Result/ResultWithTips.vue'; |
| | | export { default as PhoneOrder } from './views/Order/components/PhoneOrder.vue'; |
| | | export { default as ElectricOrder } from './views/Order/components/ElectricOrder.vue'; |
| | | export { default as GasOrder } from './views/Order/components/GasOrder.vue'; |
| | |
| | | @include ellipsis; |
| | | } |
| | | } |
| | | |
| | | .user-account-card { |
| | | border-radius: 20px; |
| | | padding: 32px; |
| | | |
| | | .user-account-card-title { |
| | | display: flex; |
| | | align-items: center; |
| | | margin-bottom: 26px; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | |
| | | .user-account-card-icon { |
| | | width: 88px; |
| | | height: 88px; |
| | | margin-right: 26px; |
| | | } |
| | | |
| | | .user-account-card-title-text { |
| | | font-size: 36px; |
| | | line-height: 50px; |
| | | font-weight: 500; |
| | | } |
| | | } |
| | | |
| | | .user-account-card-content { |
| | | font-size: 34px; |
| | | font-weight: 400; |
| | | line-height: 48px; |
| | | margin-bottom: 14px; |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | @include ellipsis; |
| | | } |
| | | |
| | | .user-account-card-remark { |
| | | font-size: 30px; |
| | | line-height: 42px; |
| | | font-weight: 400; |
| | | margin-bottom: 20px; |
| | | color: boleGetCssVar('text-color', 'secondary'); |
| | | @include ellipsis; |
| | | } |
| | | |
| | | .user-account-card-actions { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | align-items: center; |
| | | |
| | | .user-account-card-action { |
| | | display: flex; |
| | | align-items: center; |
| | | |
| | | .user-account-card-action-icon { |
| | | width: 40px; |
| | | height: 40px; |
| | | margin-right: 12px; |
| | | } |
| | | |
| | | .user-account-card-action-text { |
| | | font-size: 26px; |
| | | line-height: 36px; |
| | | color: #777; |
| | | } |
| | | } |
| | | |
| | | .user-account-card-action + .user-account-card-action { |
| | | margin-left: 64px; |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | .result-wrapper { |
| | | margin-top: 32px; |
| | | |
| | | .result-content { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | flex-direction: column; |
| | | padding: 64px 0; |
| | | background-color: #ffffff; |
| | | border-radius: 20px; |
| | | margin-bottom: 32px; |
| | | |
| | | .result-content-icon { |
| | | width: 128px; |
| | | height: 128px; |
| | | margin-bottom: 50px; |
| | | } |
| | | |
| | | .result-content-title { |
| | | font-size: 36px; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | font-weight: 600; |
| | | margin-bottom: 10px; |
| | | line-height: 52px; |
| | | } |
| | | |
| | | .result-content-remark { |
| | | font-size: 24px; |
| | | line-height: 38px; |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | font-weight: 400; |
| | | text-align: center; |
| | | padding: 0 100px; |
| | | } |
| | | } |
| | | |
| | | .result-order-number { |
| | | background-color: #ffffff; |
| | | border-radius: 20px; |
| | | padding: 24px 32px; |
| | | display: flex; |
| | | margin-bottom: 32px; |
| | | |
| | | .result-order-number-label { |
| | | font-size: 30px; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | font-weight: 400; |
| | | line-height: 42px; |
| | | display: inline-flex; |
| | | align-items: center; |
| | | |
| | | &::before { |
| | | content: ''; |
| | | display: inline-block; |
| | | width: 8px; |
| | | height: 30px; |
| | | border-radius: 4px; |
| | | background-color: boleGetCssVar('color', 'primary'); |
| | | margin-right: 12px; |
| | | } |
| | | } |
| | | |
| | | .result-order-number-value { |
| | | font-size: 30px; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | font-weight: 400; |
| | | line-height: 42px; |
| | | text-align: right; |
| | | flex: 1; |
| | | min-width: 0; |
| | | @include ellipsis(); |
| | | } |
| | | } |
| | | |
| | | .result-wrapper-tips { |
| | | .result-wrapper-tips-item { |
| | | margin-bottom: 16px; |
| | | font-size: 28px; |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | font-weight: 400; |
| | | line-height: 44px; |
| | | |
| | | &.title { |
| | | margin-bottom: 12px; |
| | | font-size: 30px; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | font-weight: 400; |
| | | } |
| | | |
| | | &.danger { |
| | | color: boleGetCssVar('color', 'danger'); |
| | | } |
| | | &.warning { |
| | | color: boleGetCssVar('color', 'warning'); |
| | | } |
| | | } |
| | | } |
| | | |
| | | .result-wrapper-actions { |
| | | .recharge-button-text { |
| | | font-size: 32px; |
| | | } |
| | | } |
| | | } |
| | |
| | | @use './common.scss' as *; |
| | | |
| | | .gas-bill-recharge-wrapper { |
| | | .gas-bill-recharge-title { |
| | | padding: 24px 26px 0; |
| | | font-weight: 500; |
| | | font-size: 34px; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | } |
| | | |
| | | .gasOrgType-card { |
| | | border-radius: 16px; |
| | | border: 1px solid #e8e8e8; |
| | | padding: 28px; |
| | | border: 1px solid #e1e9f5; |
| | | padding: 20px 32px; |
| | | min-height: 120px; |
| | | margin-bottom: 30px; |
| | | margin-bottom: 22px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | background: #f8fafb; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .gasOrgType-card-title { |
| | | font-size: 36px; |
| | | font-size: 34px; |
| | | line-height: 48px; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | } |
| | | |
| | | .gasOrgType-card-button { |
| | | font-size: 26px; |
| | | height: 48px; |
| | | padding: 18px; |
| | | } |
| | | } |
| | | } |
| | |
| | | color: #333333; |
| | | flex: 1; |
| | | min-width: 0; |
| | | margin-right: 56px; |
| | | |
| | | .order-card-title-text-wrapper { |
| | | height: 68px; |
| | | display: flex; |
| | | } |
| | | |
| | | .order-card-title-text { |
| | | font-size: 30px; |
| | | line-height: 42px; |
| | | font-weight: 400; |
| | | flex: 1; |
| | | min-width: 0; |
| | | display: flex; |
| | | |
| | | &::before { |
| | | content: ''; |
| | | display: inline-block; |
| | | width: 8px; |
| | | height: 24px; |
| | | background-color: #fa4640; |
| | | border-radius: 24px; |
| | | margin-right: 12px; |
| | | line-height: 42px; |
| | | margin-top: 9px; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | .order-card-title-status { |
| | | width: 116px; |
| | | height: 116px; |
| | | width: 90px; |
| | | height: 90px; |
| | | |
| | | img { |
| | | width: 100%; |
| | |
| | | } |
| | | } |
| | | |
| | | .order-card-content { |
| | | padding-bottom: 26px; |
| | | } |
| | | |
| | | .order-card-footer { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | padding-top: 32px; |
| | | margin-top: 26px; |
| | | border-top: solid 1px #f7f7f7; |
| | | } |
| | | |
| | |
| | | ref="formRef" |
| | | :rules="rules" |
| | | label-position="top" |
| | | class="order-bill-recharge electric" |
| | | class="order-bill-recharge electric chunk-form" |
| | | > |
| | | <slot name="top"></slot> |
| | | <NutFormItem label="所在城市" class="bole-form-item" prop="areaList" required> |
| | |
| | | <template> |
| | | <NutForm label-position="top" class="order-bill-recharge gas-bill-recharge-wrapper phone"> |
| | | <NutForm |
| | | label-position="top" |
| | | class="order-bill-recharge gas-bill-recharge-wrapper phone chunk-form" |
| | | > |
| | | <div class="gas-bill-recharge-title">选择缴费类型</div> |
| | | <NutFormItem class="bole-form-item"> |
| | | <GasOrgTypeCard |
| | | :title="item.gasOrgName" |
| | |
| | | @click="goNext(item.gasOrgCode)" |
| | | ></GasOrgTypeCard> |
| | | </NutFormItem> |
| | | <div class="common-content"> |
| | | <NutButton class="recharge-button" type="primary" plain @click="goTo('step3')"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">返回</div> |
| | | </div> |
| | | </NutButton> |
| | | </div> |
| | | </NutForm> |
| | | <div class="chunk-form-actions"> |
| | | <NutButton class="recharge-button" type="primary" plain @click="goTo('step3')"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">返回</div> |
| | | </div> |
| | | </NutButton> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | import { BlLifeRecharge, LifeRechargeConstants } from '@life-payment/core-vue'; |
| | | import { useGasBillRechargeContext } from './context'; |
| | | import { useGetGasParValue } from '../../hooks'; |
| | | import Chunk from '../../components/Layout/Chunk.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'GasBillRechargeStep1', |
| | |
| | | > |
| | | </NutTextarea> |
| | | </NutFormItem> |
| | | <div class="common-content"> |
| | | <NutButton class="recharge-button" type="primary" @click="handleNext"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </NutButton> |
| | | <NutButton class="recharge-button" type="primary" plain @click="goToPrevious"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">返回</div> |
| | | </div> |
| | | </NutButton> |
| | | </div> |
| | | </GasBillRechargeBaseForm> |
| | | <div class="chunk-form-actions"> |
| | | <NutButton class="recharge-button" type="primary" @click="handleNext"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </NutButton> |
| | | <NutButton class="recharge-button" type="primary" plain @click="goToPrevious"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">返回</div> |
| | | </div> |
| | | </NutButton> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | label-position="top" |
| | | class="order-bill-recharge electric" |
| | | > |
| | | <NutFormItem class="bole-form-item" prop="currentUserAccountId"> |
| | | <NutRadioGroup |
| | | v-model="form.currentUserAccountId" |
| | | direction="horizontal" |
| | | class="par-account-list" |
| | | v-if="userAccountAllList.length > 0" |
| | | @change="handleUserAccountChange" |
| | | > |
| | | <NutRadio :label="item.id" shape="button" v-for="item in userAccountAllList" :key="item.id" |
| | | >{{ item.city }}-{{ item.content }}</NutRadio |
| | | <Chunk borderRadiusSmall :hasPaddingBottom="false"> |
| | | <NutFormItem class="bole-form-item user-account-form-item" prop="currentUserAccountId"> |
| | | <NutRadioGroup |
| | | v-model="form.currentUserAccountId" |
| | | direction="horizontal" |
| | | class="par-account-list" |
| | | v-if="userAccountAllList.length > 0" |
| | | @change="handleUserAccountChange" |
| | | > |
| | | </NutRadioGroup> |
| | | <AccountCard |
| | | v-if="userAccountAllList.length > 0" |
| | | title="充值户号" |
| | | :content="`${form.areaList?.[1] ?? ''} ${form.gasAccount}`" |
| | | :remark="form.remark" |
| | | > |
| | | <template #action> |
| | | <div class="account-card-action" @click="handleAddUserAccount">新增</div> |
| | | </template> |
| | | </AccountCard> |
| | | <AccountAddCard text="新增户号" v-else @click="handleAddUserAccount" /> |
| | | </NutFormItem> |
| | | <NutRadio |
| | | :label="item.id" |
| | | shape="button" |
| | | v-for="item in userAccountAllList" |
| | | :key="item.id" |
| | | >{{ item.city }}-{{ item.content }}</NutRadio |
| | | > |
| | | </NutRadioGroup> |
| | | <AccountCardV2 |
| | | v-if="userAccountAllList.length > 0" |
| | | :content="`${form.areaList?.[1] ?? ''} ${form.gasAccount}`" |
| | | :remark="form.remark" |
| | | :showEditBtn="!!form.currentUserAccountId" |
| | | @add="handleAddUserAccount" |
| | | @edit="emit('editUserAccount', form.currentUserAccountId)" |
| | | > |
| | | </AccountCardV2> |
| | | <AccountAddCardV2 |
| | | content="去添加充值户号" |
| | | remark="添加户号将保存在生活缴费进行管理" |
| | | tip="添加正确户号" |
| | | v-else |
| | | @click="handleAddUserAccount" |
| | | /> |
| | | </NutFormItem> |
| | | </Chunk> |
| | | |
| | | <NutFormItem label="选择充值金额" class="bole-form-item" prop="parValue" required> |
| | | <NutRadioGroup v-model="form.parValue" direction="horizontal" class="parValue-radio-group"> |
| | | <NutRadio |
| | | :label="Number(item)" |
| | | :key="item" |
| | | shape="button" |
| | | v-for="item in gasValueList" |
| | | class="parValue-item" |
| | | > |
| | | <div class="parValue-item-inner"> |
| | | <div class="amount-wrapper"> |
| | | <div class="amount">{{ item }}</div> |
| | | <div class="unit">元</div> |
| | | </div> |
| | | <div class="price-wrapper"> |
| | | <div class="price-text">折后</div> |
| | | <div class="price"> |
| | | {{ blLifeRecharge.getRechargeParValue(item, lifePayGasRate) }}元 |
| | | <Chunk borderRadiusSmall :hasPaddingBottom="false" title="选择充值金额"> |
| | | <NutFormItem class="bole-form-item" prop="parValue" required> |
| | | <NutRadioGroup v-model="form.parValue" direction="horizontal" class="parValue-radio-group"> |
| | | <NutRadio |
| | | :label="Number(item)" |
| | | :key="item" |
| | | shape="button" |
| | | v-for="item in gasValueList" |
| | | class="parValue-item" |
| | | > |
| | | <div class="parValue-item-inner"> |
| | | <div class="amount-wrapper"> |
| | | <div class="amount">{{ item }}</div> |
| | | <div class="unit">元</div> |
| | | </div> |
| | | <div class="price-wrapper"> |
| | | <div class="price-text">折后</div> |
| | | <div class="price"> |
| | | {{ blLifeRecharge.getRechargeParValue(item, lifePayGasRate) }}元 |
| | | </div> |
| | | </div> |
| | | <div class="discountTag" v-if="lifePayGasRate > 0">{{ lifePayGasRate }}折</div> |
| | | <img :src="IconSelect" class="discount-icon" /> |
| | | </div> |
| | | <div class="discountTag" v-if="lifePayGasRate > 0">{{ lifePayGasRate }}折</div> |
| | | </div> |
| | | </NutRadio> |
| | | </NutRadioGroup> |
| | | </NutFormItem> |
| | | </NutRadio> |
| | | </NutRadioGroup> |
| | | </NutFormItem> |
| | | </Chunk> |
| | | |
| | | <SelectPayTypeFormItem |
| | | v-model="form.lifePayType" |
| | | :showWeixinPay="showWeixinPay" |
| | | :showAliPay="showAliPay" |
| | | ></SelectPayTypeFormItem> |
| | | <div class="common-content"> |
| | | <nut-button class="recharge-button" type="primary" @click="handleSubmit"> |
| | | <nut-button |
| | | class="recharge-button recharge-button-linear" |
| | | type="primary" |
| | | @click="handleSubmit" |
| | | > |
| | | <div class="recharge-button-inner"> |
| | | <div>¥{{ realParValue }}</div> |
| | | <div class="recharge-button-text">立即充值</div> |
| | |
| | | import { useGetRate, useGetGasParValue, useSetUserAccountBySelect } from '../../hooks'; |
| | | import { useGasBillRechargeContext, GasUserAccountExtraProperties } from './context'; |
| | | import { FormValidator, initLifePayType } from '../../utils'; |
| | | import AccountAddCard from '../../components/Card/AccountAddCard.vue'; |
| | | import AccountCard from '../../components/Card/AccountCard.vue'; |
| | | import AccountAddCardV2 from '../../components/Card/AccountAddCardV2.vue'; |
| | | import AccountCardV2 from '../../components/Card/AccountCardV2.vue'; |
| | | import RechargeTipsView from '../../components/RechargeTipsView/RechargeTipsView.vue'; |
| | | import ConfirmDialog from '../../components/Dialog/ConfirmDialog.vue'; |
| | | import ConfirmDialogInfoItem from '../../components/Dialog/ConfirmDialogInfoItem.vue'; |
| | | import SelectPayTypeFormItem from '../../components/SelectPayTypeFormItem/SelectPayTypeFormItem.vue'; |
| | | import { useSelectPayType, useGetPayStatusByOrderNo } from '../../hooks/selectPayType'; |
| | | import { RechargeProps } from '../PhoneBillRecharge/types'; |
| | | import Chunk from '../../components/Layout/Chunk.vue'; |
| | | import IconSelect from '../../assets/recharge/icon-select.png'; |
| | | |
| | | defineOptions({ |
| | | name: 'GasBillRechargeStep3', |
| | |
| | | (e: 'goPay', orderNo: string): void; |
| | | (e: 'paySuccess', orderNo: string): void; |
| | | (e: 'missName', userAccountId: string): void; |
| | | (e: 'editUserAccount', userAccountId: string): void; |
| | | }>(); |
| | | |
| | | const { goTo } = useGasBillRechargeContext(); |
| | |
| | | <template> |
| | | <LoadingLayout :loading="isLoading"> |
| | | <div class="recharge-result-view" v-bind="$attrs"> |
| | | <div class="recharge-result-view-title">{{ title }}</div> |
| | | <div class="recharge-result-view-subtitle">订单号:{{ orderNo }}</div> |
| | | <div class="recharge-result-view-remark"> |
| | | {{ detail.refundCheckRemark }},如有疑问请联系客服 {{ CustomerServicePhone }}(周一到周五 |
| | | 9:00-17:30) |
| | | </div> |
| | | <div class="recharge-result-view-btn-wrapper"> |
| | | <div class="recharge-result-view-btn" @click="emit('goBackHome')">回首页</div> |
| | | </div> |
| | | </div> |
| | | <Result |
| | | v-bind="$attrs" |
| | | :title="title" |
| | | :orderNo="orderNo" |
| | | type="fail" |
| | | @goBackHome="emit('goBackHome')" |
| | | > |
| | | <template #remark> |
| | | <div class="result-content-remark-item">{{ detail.refundCheckRemark }}</div> |
| | | <div class="result-content-remark-item"> |
| | | 如有疑问 请联系客服 {{ CustomerServicePhone }}(周一到周五 9:00-17:30) |
| | | </div> |
| | | </template> |
| | | </Result> |
| | | </LoadingLayout> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { LifeRechargeConstants, useLifeRechargeContext } from '@life-payment/core-vue'; |
| | | import { CustomerServicePhone } from '../../constants'; |
| | | import Result from '../../components/Result/Result.vue'; |
| | | import { CustomerServicePhone, OssAssets } from '../../constants'; |
| | | import { useQuery } from '@tanstack/vue-query'; |
| | | import { computed } from 'vue'; |
| | | import LoadingLayout from '../../components//Layout/LoadingLayout.vue'; |
| | |
| | | <OrderCard |
| | | title="电费充值" |
| | | :status="item?.lifePayOrderStatus" |
| | | :frontStatus="item?.frontStatus" |
| | | :order-no="item?.orderNo" |
| | | :id="item?.id" |
| | | @goApplyRefund="emit('goApplyRefund', $event)" |
| | |
| | | <OrderCard |
| | | title="燃气充值" |
| | | :status="item?.lifePayOrderStatus" |
| | | :frontStatus="item?.frontStatus" |
| | | :order-no="item?.orderNo" |
| | | :id="item?.id" |
| | | @goApplyRefund="emit('goApplyRefund', $event)" |
| | |
| | | item.frontStatus === BlLifeRecharge.constants.LifePayOrderFrontStatusEnum.退款失败 |
| | | " |
| | | label="退款发起时间:" |
| | | labelWidth="110px" |
| | | :labelWidth="200" |
| | | :value=" |
| | | item?.refundApplyTime && dayjs(item?.refundApplyTime).format('YYYY-MM-DD HH:mm:ss') |
| | | " |
| | |
| | | <OrderCard |
| | | title="话费充值" |
| | | :status="item?.lifePayOrderStatus" |
| | | :frontStatus="item?.frontStatus" |
| | | :order-no="item?.orderNo" |
| | | :id="item?.id" |
| | | @goApplyRefund="emit('goApplyRefund', $event)" |
| | |
| | | item.frontStatus === BlLifeRecharge.constants.LifePayOrderFrontStatusEnum.退款失败 |
| | | " |
| | | label="退款发起时间:" |
| | | labelWidth="110px" |
| | | :labelWidth="200" |
| | | :value=" |
| | | item?.refundApplyTime && dayjs(item?.refundApplyTime).format('YYYY-MM-DD HH:mm:ss') |
| | | " |
| | |
| | | /> |
| | | </NutFormItem> |
| | | <slot></slot> |
| | | <NutDialog |
| | | title="提示" |
| | | content="电信可充值区域包括:广东、江苏、湖北、四川、江西、河北、河南、福建、辽宁。其它区域正在分批次进行维护中,在此期间可能会出现充值不成功并自动退款的情况,请您谅解。" |
| | | v-model:visible="dialogVisible" |
| | | /> |
| | | </NutForm> |
| | | <NutDialog |
| | | title="提示" |
| | | content="电信可充值区域包括:广东、江苏、湖北、四川、江西、河北、河南、福建、辽宁。其它区域正在分批次进行维护中,在此期间可能会出现充值不成功并自动退款的情况,请您谅解。" |
| | | v-model:visible="dialogVisible" |
| | | /> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | <template> |
| | | <div class="recharge-result-view"> |
| | | <div class="recharge-result-view-title">{{ title }}</div> |
| | | <div class="recharge-result-view-subtitle">订单号:{{ orderNo }}</div> |
| | | <div class="recharge-result-view-tips"> |
| | | <slot name="tips"> |
| | | 同一号码充值期间,未到账前切勿在其他任何平台再次充值。因此造成的资金损失须用户自行承担!!! |
| | | </slot> |
| | | </div> |
| | | <div class="recharge-result-view-warning"> |
| | | 如接到陌生来电,对方以缴费或误操作等理由要求处理款项,务必立即拉黑,谨防诈骗!!! |
| | | </div> |
| | | <div class="recharge-result-view-customerService">{{ CustomerServiceTips }}</div> |
| | | <div class="recharge-result-view-btn-wrapper"> |
| | | <div class="recharge-result-view-btn" @click="emit('goBackHome')">回首页</div> |
| | | </div> |
| | | </div> |
| | | <Result |
| | | :title="title" |
| | | :orderNo="orderNo" |
| | | :icon="OssAssets.result.Success" |
| | | :customerServiceTips="CustomerServiceTips" |
| | | :dangerTips="dangerTips" |
| | | warningTips="如接到陌生来电,对方以缴费或误操作等理由要求处理款项,务必立即拉黑,谨防诈骗!!!" |
| | | > |
| | | <template #actions> |
| | | <div class="chunk-form-actions"> |
| | | <nut-button class="recharge-button" type="primary" @click="emit('goBackHome')"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">返回首页</div> |
| | | </div> |
| | | </nut-button> |
| | | </div> |
| | | </template> |
| | | </Result> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { LifeRechargeConstants } from '@life-payment/core-vue'; |
| | | import { CustomerServiceTips } from '../../constants'; |
| | | import { CustomerServiceTips, OssAssets } from '../../constants'; |
| | | import Result from '../../components/Result/Result.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'RechargeResultView', |
| | |
| | | type Props = { |
| | | title?: string; |
| | | orderNo?: string; |
| | | dangerTips?: string; |
| | | lifePayOrderType?: LifeRechargeConstants.LifePayOrderTypeEnum; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | title: '支付成功,充值款将在0-24小时内到账', |
| | | title: '支付成功', |
| | | dangerTips: |
| | | '同一号码充值期间,未到账前切勿在其他任何平台再次充值。因此造成的资金损失须用户自行承担!!!', |
| | | }); |
| | | |
| | | const emit = defineEmits<{ |
| | |
| | | ref="formRef" |
| | | :rules="rules" |
| | | label-position="top" |
| | | class="order-bill-recharge electric" |
| | | class="order-bill-recharge electric chunk-form" |
| | | > |
| | | <NutFormItem label="所在区域" class="bole-form-item" prop="province" required> |
| | | <ChooseInputWithPicker |
| | |
| | | > |
| | | </NutTextarea> |
| | | </NutFormItem> |
| | | <div class="common-content"> |
| | | <nut-button class="recharge-button" type="primary" @click="handleNext"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </nut-button> |
| | | <nut-button class="recharge-button" type="primary" plain @click="goToNext"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">返回</div> |
| | | </div> |
| | | </nut-button> |
| | | </div> |
| | | </ElectricBillRechargeBaseForm> |
| | | <div class="chunk-form-actions"> |
| | | <nut-button class="recharge-button" type="primary" @click="handleNext"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </nut-button> |
| | | <nut-button class="recharge-button" type="primary" plain @click="goToNext"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">返回</div> |
| | | </div> |
| | | </nut-button> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | label-position="top" |
| | | class="order-bill-recharge electric" |
| | | > |
| | | <NutFormItem class="bole-form-item" prop="currentUserAccountId"> |
| | | <NutRadioGroup |
| | | v-model="form.currentUserAccountId" |
| | | direction="horizontal" |
| | | class="par-account-list" |
| | | v-if="userAccountAllList.length > 0" |
| | | @change="handleUserAccountChange" |
| | | > |
| | | <NutRadio :label="item.id" shape="button" v-for="item in userAccountAllList" :key="item.id" |
| | | >{{ item.city }}-{{ item.content }}</NutRadio |
| | | <Chunk borderRadiusSmall :hasPaddingBottom="false"> |
| | | <NutFormItem class="bole-form-item user-account-form-item" prop="currentUserAccountId"> |
| | | <NutRadioGroup |
| | | v-model="form.currentUserAccountId" |
| | | direction="horizontal" |
| | | class="par-account-list" |
| | | v-if="userAccountAllList.length > 0" |
| | | @change="handleUserAccountChange" |
| | | > |
| | | </NutRadioGroup> |
| | | <AccountCard |
| | | v-if="userAccountAllList.length > 0" |
| | | title="充值户号" |
| | | :content="`${form.city} ${form.electricAccount}`" |
| | | :remark="form.remark" |
| | | > |
| | | <template #action> |
| | | <div class="account-card-action" @click="handleAddUserAccount">新增</div> |
| | | </template> |
| | | </AccountCard> |
| | | <AccountAddCard text="新增户号" v-else @click="handleAddUserAccount" /> |
| | | </NutFormItem> |
| | | <NutRadio |
| | | :label="item.id" |
| | | shape="button" |
| | | v-for="item in userAccountAllList" |
| | | :key="item.id" |
| | | >{{ item.city }}-{{ item.content }}</NutRadio |
| | | > |
| | | </NutRadioGroup> |
| | | <AccountCardV2 |
| | | v-if="userAccountAllList.length > 0" |
| | | :content="`${form.city}-${form.electricAccount}`" |
| | | :remark="form.remark" |
| | | :showEditBtn="!!form.currentUserAccountId" |
| | | @add="handleAddUserAccount" |
| | | @edit="emit('editUserAccount', form.currentUserAccountId)" |
| | | > |
| | | </AccountCardV2> |
| | | <AccountAddCardV2 |
| | | content="去添加充值户号" |
| | | remark="添加户号将保存在生活缴费进行管理" |
| | | tip="添加正确户号" |
| | | v-else |
| | | @add="handleAddUserAccount" |
| | | /> |
| | | </NutFormItem> |
| | | </Chunk> |
| | | |
| | | <NutFormItem |
| | | v-if="!!form.province" |
| | | label="选择充值金额" |
| | | class="bole-form-item" |
| | | prop="parValue" |
| | | required |
| | | > |
| | | <NutRadioGroup v-model="form.parValue" direction="horizontal" class="parValue-radio-group"> |
| | | <NutRadio |
| | | :label="Number(item)" |
| | | :key="item" |
| | | shape="button" |
| | | v-for="item in parValueList" |
| | | class="parValue-item" |
| | | > |
| | | <div class="parValue-item-inner"> |
| | | <div class="amount-wrapper"> |
| | | <div class="amount">{{ item }}</div> |
| | | <div class="unit">元</div> |
| | | </div> |
| | | <div class="price-wrapper"> |
| | | <div class="price-text">折后</div> |
| | | <div class="price"> |
| | | {{ blLifeRecharge.getRechargeParValue(item, lifePayElectricRate) }}元 |
| | | <Chunk borderRadiusSmall :hasPaddingBottom="false" title="选择充值金额" v-if="!!form.province"> |
| | | <NutFormItem class="bole-form-item" prop="parValue" required> |
| | | <NutRadioGroup v-model="form.parValue" direction="horizontal" class="parValue-radio-group"> |
| | | <NutRadio |
| | | :label="Number(item)" |
| | | :key="item" |
| | | shape="button" |
| | | v-for="item in parValueList" |
| | | class="parValue-item" |
| | | > |
| | | <div class="parValue-item-inner"> |
| | | <div class="amount-wrapper"> |
| | | <div class="amount">{{ item }}</div> |
| | | <div class="unit">元</div> |
| | | </div> |
| | | <div class="price-wrapper"> |
| | | <div class="price-text">折后</div> |
| | | <div class="price"> |
| | | {{ blLifeRecharge.getRechargeParValue(item, lifePayElectricRate) }}元 |
| | | </div> |
| | | </div> |
| | | <div class="discountTag" v-if="lifePayElectricRate > 0"> |
| | | {{ lifePayElectricRate }}折 |
| | | </div> |
| | | <img :src="IconSelect" class="discount-icon" /> |
| | | </div> |
| | | <div class="discountTag" v-if="lifePayElectricRate > 0"> |
| | | {{ lifePayElectricRate }}折 |
| | | </div> |
| | | </div> |
| | | </NutRadio> |
| | | </NutRadioGroup> |
| | | </NutFormItem> |
| | | </NutRadio> |
| | | </NutRadioGroup> |
| | | </NutFormItem> |
| | | </Chunk> |
| | | |
| | | <SelectPayTypeFormItem |
| | | v-model="form.lifePayType" |
| | | :showWeixinPay="showWeixinPay" |
| | | :showAliPay="showAliPay" |
| | | ></SelectPayTypeFormItem> |
| | | <div class="common-content"> |
| | | <nut-button class="recharge-button" type="primary" @click="handleSubmit"> |
| | | <nut-button |
| | | class="recharge-button recharge-button-linear" |
| | | type="primary" |
| | | @click="handleSubmit" |
| | | > |
| | | <div class="recharge-button-inner"> |
| | | <div>¥{{ realParValue }}</div> |
| | | <div class="recharge-button-text">立即充值</div> |
| | |
| | | import ConfirmDialogInfoItem from '../../components/Dialog/ConfirmDialogInfoItem.vue'; |
| | | import { useGetRate, useGetElectricParValue, useSetUserAccountBySelect } from '../../hooks'; |
| | | import { FormValidator, initLifePayType } from '../../utils'; |
| | | import AccountAddCard from '../../components/Card/AccountAddCard.vue'; |
| | | import AccountCard from '../../components/Card/AccountCard.vue'; |
| | | import AccountAddCardV2 from '../../components/Card/AccountAddCardV2.vue'; |
| | | import AccountCardV2 from '../../components/Card/AccountCardV2.vue'; |
| | | import { useElectricBillRechargeContext, ElectricUserAccountExtraProperties } from './context'; |
| | | import SelectPayTypeFormItem from '../../components/SelectPayTypeFormItem/SelectPayTypeFormItem.vue'; |
| | | import { useSelectPayType, useGetPayStatusByOrderNo } from '../../hooks/selectPayType'; |
| | | import { RechargeProps } from '../PhoneBillRecharge/types'; |
| | | import Chunk from '../../components/Layout/Chunk.vue'; |
| | | import IconSelect from '../../assets/recharge/icon-select.png'; |
| | | |
| | | defineOptions({ |
| | | name: 'ElectricBillRechargeStep2', |
| | |
| | | (e: 'goPay', orderNo: string): void; |
| | | (e: 'paySuccess', orderNo: string): void; |
| | | (e: 'missName', userAccountId: string): void; |
| | | (e: 'editUserAccount', userAccountId: string): void; |
| | | }>(); |
| | | |
| | | const { goTo } = useElectricBillRechargeContext(); |
| | |
| | | @go-pay="emit('goPay', $event)" |
| | | @paySuccess="emit('paySuccess', $event)" |
| | | @missName="emit('missName', $event)" |
| | | @editUserAccount="emit('editUserAccount', $event)" |
| | | /> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { computed, provide } from 'vue'; |
| | | import { computed, provide, watch } from 'vue'; |
| | | import { useStepper } from 'senin-mini/hooks'; |
| | | import { ElectricBillRechargeContextKey } from './context'; |
| | | import ElectricBillRechargeStep1 from './ElectricBillRechargeStep1.vue'; |
| | |
| | | isDev: false, |
| | | }); |
| | | |
| | | const stepperInfo = useStepper(['step1', 'step2'], 'step2'); |
| | | const current = computed(() => stepperInfo.current.value); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'goPay', orderNo: string): void; |
| | | (e: 'paySuccess', orderNo: string): void; |
| | | (e: 'missName', userAccountId: string): void; |
| | | (e: 'editUserAccount', userAccountId: string): void; |
| | | (e: 'currentChange', current: 'step1' | 'step2'): void; |
| | | }>(); |
| | | |
| | | const stepperInfo = useStepper(['step1', 'step2'], 'step2'); |
| | | const current = computed(() => stepperInfo.current.value); |
| | | watch( |
| | | current, |
| | | (newVal) => { |
| | | emit('currentChange', newVal); |
| | | }, |
| | | { |
| | | immediate: true, |
| | | } |
| | | ); |
| | | |
| | | provide(ElectricBillRechargeContextKey, { |
| | | ...stepperInfo, |
| | |
| | | > |
| | | </NutTextarea> |
| | | </NutFormItem> |
| | | <div class="common-content"> |
| | | <NutButton class="recharge-button" type="primary" @click="handleSave"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </NutButton> |
| | | </div> |
| | | </ElectricBillRechargeBaseForm> |
| | | <div class="chunk-form-actions"> |
| | | <NutButton class="recharge-button" type="primary" @click="handleSave"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </NutButton> |
| | | </div> |
| | | </LoadingLayout> |
| | | </template> |
| | | |
| | |
| | | > |
| | | </NutTextarea> |
| | | </NutFormItem> |
| | | <div class="common-content"> |
| | | <NutButton class="recharge-button" type="primary" @click="handleSave"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </NutButton> |
| | | </div> |
| | | </GasBillRechargeBaseForm> |
| | | <div class="chunk-form-actions"> |
| | | <NutButton class="recharge-button" type="primary" @click="handleSave"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </NutButton> |
| | | </div> |
| | | </LoadingLayout> |
| | | </template> |
| | | |
| | |
| | | > |
| | | </NutTextarea> |
| | | </NutFormItem> |
| | | <div class="common-content"> |
| | | <NutButton class="recharge-button" type="primary" @click="handleSave"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </NutButton> |
| | | </div> |
| | | </PhoneBillRechargeBaseForm> |
| | | <div class="chunk-form-actions"> |
| | | <NutButton class="recharge-button" type="primary" @click="handleSave"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </NutButton> |
| | | </div> |
| | | </LoadingLayout> |
| | | </template> |
| | | |
| | |
| | | v-bind="infiniteLoadingProps" |
| | | > |
| | | <template #renderItem="{ item }"> |
| | | <AccountCard |
| | | <UserAccountCard |
| | | :title="TitleMap[item.lifePayType]" |
| | | :icon="TitleIconMap[item.lifePayType]" |
| | | :content=" |
| | | item.lifePayType === LifeRechargeConstants.LifePayOrderTypeEnum.话费订单 |
| | | ? item.content |
| | | ? `${ |
| | | BlLifeRecharge.constants.IspCodeText[ |
| | | JSON.parse(item?.extraProperties)?.ispCode ?? '' |
| | | ] |
| | | }-${item.content}` |
| | | : `${item.city}-${item.content}` |
| | | " |
| | | :remark="item.remark" |
| | | :style="{ |
| | | marginBottom: Taro.pxTransform(20), |
| | | marginBottom: Taro.pxTransform(32), |
| | | backgroundColor: '#ffffff', |
| | | }" |
| | | > |
| | | <template #action> |
| | | <div class="account-card-action" @click="handleEditUserAccount(item)">编辑</div> |
| | | <div class="account-card-action" @click="handleDeleteUserAccount(item)">删除</div> |
| | | <div class="user-account-card-action" @click="handleEditUserAccount(item)"> |
| | | <img :src="IconAccountEdit" class="user-account-card-action-icon" /> |
| | | <span class="user-account-card-action-text">编辑</span> |
| | | </div> |
| | | <div class="user-account-card-action" @click="handleDeleteUserAccount(item)"> |
| | | <img :src="IconAccountDelete" class="user-account-card-action-icon" /> |
| | | <span class="user-account-card-action-text">删除</span> |
| | | </div> |
| | | </template> |
| | | </AccountCard> |
| | | </UserAccountCard> |
| | | </template> |
| | | </InfiniteLoading> |
| | | </template> |
| | |
| | | } from '@life-payment/core-vue'; |
| | | import { useInfiniteLoading } from '../../hooks/infiniteLoading'; |
| | | import { OrderInputType } from '../../constants'; |
| | | import AccountCard from '../../components/Card/AccountCard.vue'; |
| | | import UserAccountCard from '../../components/Card/UserAccountCard.vue'; |
| | | import IconAccountDelete from '../../assets/account/icon-account-delete.png'; |
| | | import IconAccountEdit from '../../assets/account/icon-account-edit.png'; |
| | | import { OssAssets } from '../../constants'; |
| | | import Taro from '@tarojs/taro'; |
| | | |
| | | defineOptions({ |
| | |
| | | const { blLifeRecharge } = useLifeRechargeContext(); |
| | | |
| | | const TitleMap = { |
| | | [LifeRechargeConstants.LifePayOrderTypeEnum.话费订单]: '手机号', |
| | | [LifeRechargeConstants.LifePayOrderTypeEnum.电费订单]: '电费户号', |
| | | [LifeRechargeConstants.LifePayOrderTypeEnum.燃气订单]: '燃气户号', |
| | | [LifeRechargeConstants.LifePayOrderTypeEnum.话费订单]: '话费', |
| | | [LifeRechargeConstants.LifePayOrderTypeEnum.电费订单]: '电费', |
| | | [LifeRechargeConstants.LifePayOrderTypeEnum.燃气订单]: '燃气费', |
| | | }; |
| | | |
| | | const TitleIconMap = { |
| | | [LifeRechargeConstants.LifePayOrderTypeEnum.话费订单]: OssAssets.accountCard.Phone, |
| | | [LifeRechargeConstants.LifePayOrderTypeEnum.电费订单]: OssAssets.accountCard.Electric, |
| | | [LifeRechargeConstants.LifePayOrderTypeEnum.燃气订单]: OssAssets.accountCard.Gas, |
| | | }; |
| | | |
| | | const { infiniteLoadingProps, invalidateQueries } = useInfiniteLoading( |