Procházet zdrojové kódy

📦 对接赐福购买接口, 升级订单购买接口

快乐的梦鱼 před 1 měsícem
rodič
revize
42c5e5609a

+ 17 - 1
src/api/light/TreeApi.ts

@@ -132,8 +132,11 @@ export class BlessOrderItem extends DataModel<BlessOrderItem> {
   }
 
   id!: number;
+  /** 村庄id */
   villageId = null as number | null;
+  /** 用户id */
   userId = null as number | null;
+  /** 赋福套餐id */
   blessId = null as number | null;
   amount = 0;
   addLight = 0;
@@ -141,6 +144,7 @@ export class BlessOrderItem extends DataModel<BlessOrderItem> {
   multiple = 0;
   startTime = null as Date | null;
   endTime = null as Date | null;
+  /** 状态:-1=已取消,0=待支付,1=已支付 */
   status = 0;
   remark = '' as string | null;
   payTime = null as Date | null;
@@ -667,6 +671,12 @@ export class TreeApi extends AppServerRequestModule<DataModel> {
     return res.requireData();
   }
 
+  /** 已下单赐福套餐支付 */
+  async blessPay(id: number) {
+    const res = await this.post<KeyValue>('/village/growth/blessPay', '已下单赐福套餐支付', { id });
+    return transformDataModel<BlessOrderConfirm>(BlessOrderConfirm, res.requireData());
+  }
+
   /** 升级订单列表 */
   async getUpgradeOrderList(options?: {
     page?: number;
@@ -716,6 +726,12 @@ export class TreeApi extends AppServerRequestModule<DataModel> {
     return transformDataModel<UpgradeOrderConfirm>(UpgradeOrderConfirm, res.requireData());
   }
 
+  /** 已下单订单支付 */
+  async upgradePay(id: number) {
+    const res = await this.post<KeyValue>('/village/growth/upgradePay', '已下单订单支付', { id });
+    return transformDataModel<UpgradeOrderConfirm>(UpgradeOrderConfirm, res.requireData());
+  }
+
   /** 对公付款上传凭证 */
   async saveUpgrade(id: number, payVoucher: string) {
     const res = await this.post<null>('/village/growth/saveUpgrade', '提交升级订单凭证', {
@@ -726,4 +742,4 @@ export class TreeApi extends AppServerRequestModule<DataModel> {
   }
 }
 
-export default new TreeApi();
+export default new TreeApi();

+ 11 - 0
src/common/composeabe/ErrorDisplay.ts

@@ -1,3 +1,10 @@
+// 忽略的错误信息
+const ignoreMessages = [
+  '已取消',
+  '已支付',
+  'cancel'
+];
+
 /**
  * 说明:
  * * 显示错误信息。
@@ -12,6 +19,10 @@ export function showError(e: any, title = '提示', callback?: () => void) {
     message = e.errMsg;
   else 
     message = '' + (e ?? '未知错误');
+  for (const ignore of ignoreMessages) {
+    if (message.includes(ignore))
+      return;
+  }
   uni.showModal({ 
     title,
     content: message,

+ 0 - 7
src/pages.json

@@ -46,13 +46,6 @@
       }
     },
     {
-      "path": "pages/home/light/help/new",
-      "style": {
-        "navigationBarTitleText": "新手上路",
-        "enablePullDownRefresh": false
-      }
-    },
-    {
       "path": "pages/home/light/submit",
       "style": {
         "navigationBarTitleText": "点亮村社",

+ 0 - 7
src/pages/home/light/help/new.vue

@@ -1,7 +0,0 @@
-<template>
-  <Construction text="等待设计《新手上路页面》" />
-</template>
-
-<script setup lang="ts">
-import Construction from '@/common/components/Construction.vue';
-</script>

+ 102 - 0
src/pages/home/village/bless/dialogs/DirectPayDialog.vue

@@ -0,0 +1,102 @@
+<template>
+  <CommonDialog v-model:show="show" title="赐福付款" :showDivider="false" :showCloseButton="false">
+    <FlexCol gap="gap.lg" padding="padding.md" width="600rpx">
+      <template v-if="uploadStep === 'form'">
+        <Text textAlign="center" text="选择支付方式" fontConfig="contentSpeicalText" />
+        <Height :height="10" />
+        <FlexCol gap="gap.md">
+          <BoxMid direction="row" justify="space-between">
+            <Text text="微信支付" fontConfig="lightImportantTitle" :fontSize="42" />
+            <CheckBox :modelValue="payMethod == 'wechat'" shape="round" @update="payMethod = 'wechat'" />
+          </BoxMid>
+        </FlexCol>
+        <FlexRow justify="space-around" gap="gap.md">
+          <FrameButton text="取消" @click="show = false" width="220rpx" />
+          <FrameButton primary text="支付" @click="handleSubmitPay" width="220rpx" />
+        </FlexRow>
+      </template>
+      <template v-else-if="uploadStep === 'finished'">
+        <Result
+          status="success"
+          title="感谢您的赐福!"
+          description="您的祝福已送达"
+        />
+        <FlexRow justify="space-around" gap="gap.md">
+          <FrameButton primary text="完成" @click="handleFinish" width="220rpx" />
+        </FlexRow>
+      </template>
+    </FlexCol>
+  </CommonDialog>
+</template>
+
+<script setup lang="ts">
+import { ref } from "vue";
+import { toast } from "@/components/dialog/CommonRoot";
+import { showError } from "@/common/composeabe/ErrorDisplay";
+import CommonDialog from "@/common/components/CommonDialog.vue";
+import FrameButton from "@/common/components/FrameButton.vue";
+import FlexCol from "@/components/layout/FlexCol.vue";
+import FlexRow from "@/components/layout/FlexRow.vue";
+import Height from "@/components/layout/space/Height.vue";
+import Text from "@/components/basic/Text.vue";
+import Result from "@/components/feedback/Result.vue";
+import BoxMid from "@/common/components/box/BoxMid.vue";
+import TreeApi from "@/api/light/TreeApi";
+import CheckBox from "@/components/form/CheckBox.vue";
+import type { BlessOrderConfirm } from "@/api/light/TreeApi";
+
+const emit = defineEmits(['success']);
+
+const show = ref(false);
+const uploadStep = ref<'form' | 'finished'>('form');
+
+const payMethod = ref('wechat');
+const orderId = ref<number>(0);
+
+async function handleSubmitPay() {
+  if (!orderId.value) {
+    showError('缺少必要参数');
+    return;
+  }
+  switch (payMethod.value) {
+    case 'wechat':
+      try {
+        const payInfo: BlessOrderConfirm = await TreeApi.blessPay(orderId.value);
+        if (payInfo && payInfo.pay) {
+          uni.requestPayment({
+            provider: 'wxpay',
+            appId: payInfo.pay.appId,
+            timeStamp: payInfo.pay.timeStamp,
+            nonceStr: payInfo.pay.nonceStr,
+            package: payInfo.pay.package,
+            signType: payInfo.pay.signType,
+            paySign: payInfo.pay.paySign,
+            success: () => {
+              uploadStep.value = 'finished';
+            },
+            fail: (err) => {
+              toast(`支付失败: ${err.errMsg}`);
+            },
+          });
+        }
+      } catch (err) {
+        showError('支付接口调用失败');
+      }
+      break;
+    default:
+      throw new Error('未知支付方式');
+  }
+}
+function handleFinish() {
+  emit('success');
+  show.value = false;
+}
+
+defineExpose({
+  open(id: number) {
+    orderId.value = id;
+    uploadStep.value = 'form';
+    show.value = true;
+  },
+});
+</script>

+ 35 - 10
src/pages/home/village/bless/my-orders.vue

@@ -21,19 +21,31 @@
               <Text fontConfig="lightImportantTitle" fontFamily="SongtiSCBlack">{{ item.blessName }}</Text>
               <Text :fontSize="23" :text="`${item.villageName} ${item.addLight}乡源光/${item.addFruit}乡源果`" />
             </FlexCol>
-            <FlexCol align="flex-end">
-              <FlexRow align="center" gap="gap.sm">
-                <Text :fontSize="23" fontConfig="lightGoldTitle">¥</Text>
-                <Text fontConfig="lightGoldTitle">{{ item.amount }}</Text>
-                <Width :width="10" />
-                <Tag size="small" :text="item.statusText" :type="getStatusTypeByStatusText(item.statusText)" />
-              </FlexRow>
-              <Text fontConfig="secondText">{{ item.createtime }}</Text>
-            </FlexCol>
+            <FlexRow gap="gap.xl">
+              <FlexCol align="flex-end">
+                <FlexRow align="center" gap="gap.sm">
+                  <Text :fontSize="23" fontConfig="lightGoldTitle">¥</Text>
+                  <Text fontConfig="lightGoldTitle">{{ item.amount }}</Text>
+                  <Width :width="10" />
+                  <Tag size="small" :text="item.statusText" :type="getStatusTypeByStatusText(item.statusText)" />
+                </FlexRow>
+                <Text fontConfig="secondText">{{ item.createtime }}</Text>
+              </FlexCol>
+              <FrameButton
+                v-if="item.status === 0"
+                primary
+                text="去支付"
+                width="100rpx"
+                size="small"
+                @click="handlePay(item)"
+              />
+            </FlexRow>
           </Touchable>
         </BoxMid>
       </FlexCol>
     </SimplePageListLoader>
+
+    <DirectPayDialog ref="directPayDialog" @success="handlePaySuccess" />
   </CommonTopBanner>
 </template>
 
@@ -41,8 +53,9 @@
 import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
 import { useAuthStore } from '@/store/auth';
 import { useSimplePageListLoader } from '@/components/composeabe/loader/SimplePageListLoader';
+import { ref } from 'vue';
 import FlexCol from '@/components/layout/FlexCol.vue';
-import TreeApi from '@/api/light/TreeApi';
+import TreeApi, { BlessOrderItem } from '@/api/light/TreeApi';
 import SimplePageListLoader from '@/components/loader/SimplePageListLoader.vue';
 import Touchable from '@/components/feedback/Touchable.vue';
 import Text from '@/components/basic/Text.vue';
@@ -51,6 +64,8 @@ import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
 import Tag from '@/components/display/Tag.vue';
 import Width from '@/components/layout/space/Width.vue';
 import BoxMid from '@/common/components/box/BoxMid.vue';
+import FrameButton from '@/common/components/FrameButton.vue';
+import DirectPayDialog from './dialogs/DirectPayDialog.vue';
 
 const { querys } = useLoadQuerys({
   villageId: 0,
@@ -59,6 +74,16 @@ const { querys } = useLoadQuerys({
 });
 const authStore = useAuthStore();
 
+const directPayDialog = ref<InstanceType<typeof DirectPayDialog>>();
+
+function handlePay(item: BlessOrderItem) {
+  directPayDialog.value?.open(item.id);
+}
+
+function handlePaySuccess() {
+  listLoader.reload();
+}
+
 const listLoader = useSimplePageListLoader(20, async (page, pageSize) => {
   if (!querys.value.villageId || !authStore.userId) {
     return {

+ 1 - 2
src/pages/home/village/dialogs/BlessBuyDialog.vue

@@ -14,7 +14,7 @@
         justify="space-between"
         align="center"
         gap="gap.md"
-        width="96%"
+        width="550rpx"
       >
         <FlexRow align="center" gap="gap.sm">
           <Image 
@@ -66,7 +66,6 @@
 import type { BlessPackageItem } from '@/api/light/TreeApi';
 import BoxMid from '@/common/components/box/BoxMid.vue';
 import CommonDialog from '@/common/components/CommonDialog.vue';
-import FrameButton from '@/common/components/FrameButton.vue';
 import PrimaryButton from '@/common/components/PrimaryButton.vue';
 import Image from '@/components/basic/Image.vue';
 import Text from '@/components/basic/Text.vue';

+ 5 - 1
src/pages/home/village/introd/card.vue

@@ -349,7 +349,11 @@ function handleGoJoin() {
   joinDialog.value.show();
 }
 function handleGoNew() {
-  navTo('/pages/home/light/help/new');
+  navTo('/pages/article/common/list', {
+    modelId: 18,
+    mainBodyColumnId: 356,
+    title: '新手上路',
+  });
 }
 function handleGoCollect(collectModuleId?: number, title?: string) {
   if (!collectModuleId) {

+ 30 - 12
src/pages/home/village/upgrade/dialogs/DirectPayDialog.vue

@@ -1,13 +1,13 @@
 <template>
-  <CommonDialog v-model:show="show" title="升级付款" :showDivider="false">
+  <CommonDialog v-model:show="show" title="升级付款" :showDivider="false" :showCloseButton="false">
     <FlexCol gap="gap.lg" padding="padding.md" width="600rpx">
       <template v-if="uploadStep === 'form'">
         <Text textAlign="center" text="选择支付方式" fontConfig="contentSpeicalText" />
         <Height :height="10" />
         <FlexCol gap="gap.md">
-          <BoxMid justify="space-between">
+          <BoxMid direction="row" justify="space-between">
             <Text text="微信支付" fontConfig="lightImportantTitle" :fontSize="42" />
-            <CheckBox :modelValue="payMethod == 'wechat'" @update="payMethod = 'wechat'" />
+            <CheckBox :modelValue="payMethod == 'wechat'" shape="round" @update="payMethod = 'wechat'" />
           </BoxMid>
         </FlexCol>
         <FlexRow justify="space-around" gap="gap.md">
@@ -32,22 +32,18 @@
 <script setup lang="ts">
 import { ref } from "vue";
 import { toast } from "@/components/dialog/CommonRoot";
-import { useAliOssUploadCo } from "@/common/components/upload/AliOssUploadCo";
 import { showError } from "@/common/composeabe/ErrorDisplay";
-import type { IDynamicFormOptions, IDynamicFormRef } from "@/components/dynamic";
-import type { UploaderFieldProps } from "@/components/form/UploaderField.vue";
 import CommonDialog from "@/common/components/CommonDialog.vue";
 import FrameButton from "@/common/components/FrameButton.vue";
 import FlexCol from "@/components/layout/FlexCol.vue";
 import FlexRow from "@/components/layout/FlexRow.vue";
 import Height from "@/components/layout/space/Height.vue";
 import Text from "@/components/basic/Text.vue";
-import DynamicForm from "@/components/dynamic/DynamicForm.vue";
 import Result from "@/components/feedback/Result.vue";
-import ProvideVar from "@/components/theme/ProvideVar.vue";
 import BoxMid from "@/common/components/box/BoxMid.vue";
 import TreeApi from "@/api/light/TreeApi";
 import CheckBox from "@/components/form/CheckBox.vue";
+import type { UpgradeOrderConfirm } from "@/api/light/TreeApi";
 
 const emit = defineEmits(['success']);
 
@@ -57,21 +53,43 @@ const uploadStep = ref<'form' | 'finished'>('form');
 const payMethod = ref('wechat');
 const orderId = ref<number>(0);
 
-function handleSubmitPay() {
+async function handleSubmitPay() {
   if (!orderId.value) {
     showError('缺少必要参数');
     return;
   } 
   switch (payMethod.value) {
     case 'wechat':
-      // 微信支付
+      try {
+        const payInfo: UpgradeOrderConfirm = await TreeApi.upgradePay(orderId.value);
+        if (payInfo && payInfo.pay) {
+          uni.requestPayment({
+            provider: 'wxpay',
+            appId: payInfo.pay.appId,
+            timeStamp: payInfo.pay.timeStamp,
+            nonceStr: payInfo.pay.nonceStr,
+            package: payInfo.pay.package,
+            signType: payInfo.pay.signType,
+            paySign: payInfo.pay.paySign,
+            success: () => {
+              uploadStep.value = 'finished';
+            },
+            fail: (err) => {
+              toast(`支付失败: ${err.errMsg}`);
+            },
+          });
+        }
+      } catch (err) {
+        showError('支付接口调用失败');
+      }
       break;
     default:
-      break;
+      throw new Error('未知支付方式');
   }
 }
 function handleFinish() {
   emit('success');
+  show.value = false;
 }
 
 defineExpose({
@@ -81,4 +99,4 @@ defineExpose({
     show.value = true;
   },
 });
-</script>
+</script>

+ 1 - 2
src/pages/home/village/upgrade/my-orders.vue

@@ -70,7 +70,6 @@ import BoxMid from '@/common/components/box/BoxMid.vue';
 import FrameButton from '@/common/components/FrameButton.vue';
 import UploadVoucherDialog from './dialogs/UploadVoucherDialog.vue';
 import DirectPayDialog from './dialogs/DirectPayDialog.vue';
-import { backAndCallOnPageBack } from '@/components/utils/PageAction.js';
 
 const { querys } = useLoadQuerys({
   villageId: 0,
@@ -112,7 +111,7 @@ function handlePay(item: UpgradeOrderItem) {
 }
 
 function handlePaySuccess() {
-  backAndCallOnPageBack('handlePaySuccess', {});
+  listLoader.reload();
 }
 
 function getStatusTypeByStatusText(statusText: string): 'warning' | 'success' | 'default' {

+ 1 - 1
src/pages/home/village/upgrade/pay-public.vue

@@ -9,7 +9,7 @@
           <FlexCol :gap="20">
             <FlexCol :padding="20" :radius="20">
               <Parse
-                v-if="loader.content.value.content"
+                v-if="loader.content.value.content.trim()"
                 :content="loader.content.value.content"
               />
               <Text v-else="emptyContent" fontConfig="subText">暂无对公打款说明,请在后台补充!</Text>