Bladeren bron

Merge branch 'master' of http://git.zonelife.cn:3000/zhangtao/city-gather

wenjie 1 week geleden
bovenliggende
commit
b91ff4421d

+ 92 - 0
src/api/api.type.d.ts

@@ -712,6 +712,36 @@ namespace Api {
     transactionId?: string
     updateTime?: string
     [property: string]: any
+    /**
+     * 充电订单
+     */
+    chargeOrder?: ChargeOrderInfo
+  }
+  interface ChargeOrderInfo {
+  /**
+   * 充电电站名称
+   */
+    powerStationName?: string | null
+    /**
+     * 充电订单创建时间
+     */
+    createTime?: string | null
+    /**
+     * 终端编号
+     */
+    connectorId?: number | null
+    /**
+     * 充电状态
+     */
+    status?: number | null
+    /**
+     * 费用
+     */
+    realCost?: number | null
+    /**
+     * 充电订单编号
+     */
+    orderNumber?: string
   }
   interface xsbOmsOrderItem {
     /**
@@ -1809,6 +1839,10 @@ namespace Api {
      * 用户手机号
      */
     consigneeMobile?: string
+    /**
+     * 电站名称
+     */
+    powerStationName: ?string | undefined
   }
 
   interface chargeSearchList {
@@ -1973,4 +2007,62 @@ namespace Api {
      */
     height?: number
   }
+  interface chargeOrderDetail {
+    /**
+     * 充电订单号
+     */
+    chargeOrderNo?: string
+    /**
+     * 充电时间:秒
+     */
+    chargeTime?: number
+    /**
+     * 结束充电时间
+     */
+    endTime?: string
+    /**
+     * 用户ID
+     */
+    memberId?: number
+    /**
+     * 订购流水号
+     */
+    orderNumber?: string
+    /**
+     * 电站名称
+     */
+    powerStationName?: string
+    /**
+     * 预充值金额
+     */
+    preAmt?: number
+    /**
+     * 平台实际收取金额
+     */
+    realCost?: number
+    /**
+     * 平台总服务费
+     */
+    realServiceCost?: number
+    /**
+     * 备注
+     */
+    remarks?: string
+    /**
+     * 开始充电时间
+     */
+    startTime?: string
+    /**
+     * 第三方充电站ID
+     */
+    stationId?: string
+    /**
+     * 充电订单状态
+     */
+    status?: number
+    /**
+     * 实际充电度数(单位:0.001 kw/h)
+     */
+    totalCharge?: number
+  }
 }

+ 1 - 0
src/api/apiDefinitions.ts

@@ -81,4 +81,5 @@ export default {
   'charge.chargeingCost': ['GET', '/smqjh-system/applet/v1/station/charging-cost'],
   'charge.stopCharge': ['POST', '/smqjh-system/applet/v1/station/stopCharge'],
   'charge.stationInfoMapList': ['GET', '/smqjh-system/applet/v1/homePage/getStationInfoMapList'],
+  'charge.orderDetail': ['GET', '/smqjh-oms/api/v1/order/getChargeOrder'],
 };

+ 10 - 0
src/api/globals.d.ts

@@ -779,6 +779,16 @@ declare global {
       >(
         config: Config
       ): Alova2Method<apiResData<any>, 'charge.stationInfoMapList', Config>;
+
+      orderDetail<
+        Config extends Alova2MethodConfig<apiResData<chargeOrderDetail>> & {
+          data: {
+            orderNumber?: string|null;
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<chargeOrderDetail>, 'charge.orderDetail', Config>;
     }
   }
 }

+ 2 - 2
src/config/index.ts

@@ -16,9 +16,9 @@ const mapEnvVersion = {
    */
   // trial: "http://192.168.1.166:8080/jeecg-boot",
   // trial: 'http://192.168.0.157:8080',
-  trial: 'http://47.109.84.152:8081',
+  // trial: 'http://47.109.84.152:8081',
   // trial: 'http://192.168.1.166:8080',
-  // trial: 'https://smqjh.api.zswlgz.com',
+  trial: 'https://smqjh.api.zswlgz.com',
   /**
    * 正式版
    */

+ 27 - 45
src/pages.json

@@ -1,21 +1,7 @@
 {
   "pages": [
-    {
-      "path": "pages/index/index",
-      "type": "home",
-      "name": "smqjh-home",
-      "layout": "tabbar",
-      "islogin": false,
-      "style": {
-        "navigationBarTitleText": "首页",
-        "navigationStyle": "custom",
-        "backgroundColor": "#9ED605",
-        "backgroundColorTop": "#9ED605"
-      }
-    },
     {
       "path": "pages/cart/index",
-      "type": "page",
       "name": "smqjh-cart",
       "layout": "tabbar",
       "islogin": false,
@@ -27,7 +13,6 @@
     },
     {
       "path": "pages/classfiy/index",
-      "type": "page",
       "name": "smqjh-classfiy",
       "layout": "tabbar",
       "islogin": false,
@@ -37,9 +22,20 @@
         "disableScroll": true
       }
     },
+    {
+      "path": "pages/index/index",
+      "name": "smqjh-home",
+      "layout": "tabbar",
+      "islogin": false,
+      "style": {
+        "navigationBarTitleText": "首页",
+        "navigationStyle": "custom",
+        "backgroundColor": "#9ED605",
+        "backgroundColorTop": "#9ED605"
+      }
+    },
     {
       "path": "pages/login/index",
-      "type": "page",
       "name": "smqjh-login",
       "islogin": false,
       "style": {
@@ -48,7 +44,6 @@
     },
     {
       "path": "pages/my/index",
-      "type": "page",
       "name": "smqjh-my",
       "layout": "tabbar",
       "islogin": false,
@@ -99,10 +94,15 @@
   "subPackages": [
     {
       "root": "subPack-xsb",
+      "plugins": {
+        "logisticsPlugin": {
+          "version": "2.1.12",
+          "provider": "wx9ad912bf20548d92"
+        }
+      },
       "pages": [
         {
           "path": "commonTab/index",
-          "type": "page",
           "name": "xsb-homeTabbar",
           "islogin": false,
           "style": {
@@ -114,7 +114,6 @@
         },
         {
           "path": "confirmOrder/index",
-          "type": "page",
           "name": "xsb-confirmOrder",
           "islogin": true,
           "style": {
@@ -123,7 +122,6 @@
         },
         {
           "path": "goods/index",
-          "type": "page",
           "name": "xsb-goods",
           "islogin": false,
           "style": {
@@ -133,7 +131,6 @@
         },
         {
           "path": "order/index",
-          "type": "page",
           "name": "xsb-order",
           "islogin": true,
           "style": {
@@ -142,7 +139,6 @@
         },
         {
           "path": "orderDetaile/index",
-          "type": "page",
           "name": "xsb-orderDetaile",
           "islogin": true,
           "style": {
@@ -152,7 +148,6 @@
         },
         {
           "path": "search/index",
-          "type": "page",
           "name": "xsb-search",
           "islogin": false,
           "style": {
@@ -161,7 +156,6 @@
         },
         {
           "path": "selectAddress/index",
-          "type": "page",
           "name": "xsb-selectAddress",
           "islogin": false,
           "style": {
@@ -175,7 +169,6 @@
       "pages": [
         {
           "path": "addressList/index",
-          "type": "page",
           "name": "common-addressList",
           "islogin": true,
           "style": {
@@ -184,7 +177,6 @@
         },
         {
           "path": "afterSales/index",
-          "type": "page",
           "name": "common-afterSales",
           "islogin": true,
           "style": {
@@ -193,7 +185,6 @@
         },
         {
           "path": "afterSalesDetail/index",
-          "type": "page",
           "name": "common-afterSalesDetail",
           "islogin": true,
           "style": {
@@ -202,7 +193,6 @@
         },
         {
           "path": "afterSalesList/index",
-          "type": "page",
           "name": "common-afterSalesList",
           "islogin": true,
           "style": {
@@ -211,7 +201,6 @@
         },
         {
           "path": "editAddress/index",
-          "type": "page",
           "name": "common-editAddress",
           "islogin": true,
           "style": {
@@ -221,7 +210,6 @@
         },
         {
           "path": "integral/index",
-          "type": "page",
           "name": "common-integral",
           "islogin": true,
           "style": {
@@ -231,7 +219,6 @@
         },
         {
           "path": "nickName/index",
-          "type": "page",
           "name": "common-nickName",
           "islogin": true,
           "style": {
@@ -240,7 +227,6 @@
         },
         {
           "path": "payError/index",
-          "type": "page",
           "name": "common-payError",
           "islogin": true,
           "style": {
@@ -251,7 +237,6 @@
         },
         {
           "path": "paySuccess/index",
-          "type": "page",
           "name": "common-paySuccess",
           "islogin": true,
           "style": {
@@ -262,7 +247,6 @@
         },
         {
           "path": "revalue/index",
-          "type": "page",
           "name": "common-revalue",
           "islogin": true,
           "style": {
@@ -273,7 +257,6 @@
         },
         {
           "path": "revalueSuccess/index",
-          "type": "page",
           "name": "common-revalue-success",
           "islogin": true,
           "style": {
@@ -284,7 +267,6 @@
         },
         {
           "path": "user-center/index",
-          "type": "page",
           "name": "common-user-center",
           "islogin": true,
           "style": {
@@ -298,7 +280,6 @@
       "pages": [
         {
           "path": "order/index",
-          "type": "page",
           "name": "smqjh-order",
           "islogin": true,
           "style": {
@@ -312,7 +293,6 @@
       "pages": [
         {
           "path": "chargeDetail/chargeDetail",
-          "type": "page",
           "name": "charge-detail",
           "islogin": false,
           "style": {
@@ -322,7 +302,6 @@
         },
         {
           "path": "chargeing/chargeing",
-          "type": "page",
           "name": "chargeing",
           "islogin": true,
           "style": {
@@ -332,7 +311,6 @@
         },
         {
           "path": "chargeMap/chargeMap",
-          "type": "page",
           "name": "charge-map",
           "islogin": false,
           "style": {
@@ -342,7 +320,6 @@
         },
         {
           "path": "chargeOrderDetail/chargeOrderDetail",
-          "type": "page",
           "name": "charge-order-detail",
           "islogin": true,
           "style": {
@@ -350,9 +327,17 @@
             "navigationStyle": "custom"
           }
         },
+        {
+          "path": "chargeOrderList/chargeOrderList",
+          "name": "charge-order-list",
+          "islogin": false,
+          "style": {
+            "navigationBarTitleText": "充电订单",
+            "navigationStyle": "custom"
+          }
+        },
         {
           "path": "chargeSearchList/chargeSearchList",
-          "type": "page",
           "name": "cahrge-search-list",
           "islogin": false,
           "style": {
@@ -362,7 +347,6 @@
         },
         {
           "path": "chargeSiteDetail/chargeSiteDetail",
-          "type": "page",
           "name": "charge-site-detail",
           "islogin": true,
           "style": {
@@ -372,7 +356,6 @@
         },
         {
           "path": "chargeStart/chargeStart",
-          "type": "page",
           "name": "charge-start",
           "islogin": true,
           "style": {
@@ -382,7 +365,6 @@
         },
         {
           "path": "index/index",
-          "type": "page",
           "name": "charge-index",
           "islogin": false,
           "style": {

+ 2 - 0
src/store/address.ts

@@ -98,6 +98,8 @@ export const useAddressStore = defineStore('address', {
       uni.chooseLocation({
         success: (res) => {
           console.log(res, '收获地址')
+          this.Location.latitude = res.latitude
+          this.Location.longitude = res.longitude
           this.name = res.name
         },
         fail: (e) => {

+ 40 - 33
src/subPack-charge/chargeOrderDetail/chargeOrderDetail.vue

@@ -1,5 +1,7 @@
 <script setup lang="ts">
+import { chargeOrderStatus } from '../utils/index'
 import router from '@/router'
+import { StaticUrl } from '@/config'
 
 const { statusBarHeight, MenuButtonHeight } = storeToRefs(useSysStore())
 
@@ -11,6 +13,22 @@ definePage({
     navigationStyle: 'custom',
   },
 })
+
+const orderNo = ref('')
+onLoad((options: any) => {
+  console.log(options, '页面数据')
+  orderNo.value = options.orderNo
+})
+
+onMounted(() => {
+  getOrderDetail()
+})
+
+const chargeOrderDetail = ref<Api.chargeOrderDetail>()
+async function getOrderDetail() {
+  const res = await Apis.charge.orderDetail({ data: { orderNumber: orderNo.value } })
+  chargeOrderDetail.value = res.data
+}
 </script>
 
 <template>
@@ -22,14 +40,19 @@ definePage({
     <view :style="{ paddingTop: `${(Number(statusBarHeight) || 44) + MenuButtonHeight + 12}px` }" />
     <view class="box-border px24rpx">
       <view class="rounded-16rpx bg-#FFF p-24rpx">
-        <view class="flex items-center gap-20rpx">
-          <view>icon</view>
-          <view class="text-28rpx">
+        <view class="flex items-center gap-8rpx">
+          <view>
+            <image
+              class="h-40rpx w-40rpx"
+              :src="`${StaticUrl}/charge-order-number.png`"
+            />
+          </view>
+          <view class="mb-10rpx text-28rpx">
             充电度数
           </view>
         </view>
         <view class="mt-20rpx text-28rpx text-#9ED605 font-bold">
-          60.800度电
+          {{ chargeOrderDetail?.totalCharge }}度电
         </view>
       </view>
       <view class="mt-20rpx rounded-16rpx bg-#FFF p-24rpx">
@@ -38,7 +61,7 @@ definePage({
             起始时间
           </view>
           <view class="mt-20rpx text-32rpx font-bold">
-            2024-07-02  23:10:05
+            {{ chargeOrderDetail?.startTime }}
           </view>
         </view>
         <view class="mt-28rpx">
@@ -46,7 +69,7 @@ definePage({
             终止时间
           </view>
           <view class="mt-20rpx text-32rpx font-bold">
-            2024-07-02  23:10:05
+            {{ chargeOrderDetail?.endTime }}
           </view>
         </view>
         <view class="mt-28rpx">
@@ -54,7 +77,7 @@ definePage({
             终止方式
           </view>
           <view class="mt-20rpx text-32rpx font-bold">
-            用户主动终止
+            {{ '--' }}
           </view>
         </view>
       </view>
@@ -64,7 +87,7 @@ definePage({
             订单状态
           </view>
           <view class="text-28rpx text-#AAA">
-            已完成
+            {{ chargeOrderStatus(chargeOrderDetail?.status).text || '--' }}
           </view>
         </view>
         <view class="mt-28rpx flex items-center justify-between">
@@ -72,7 +95,7 @@ definePage({
             订单编号
           </view>
           <view class="text-28rpx text-#AAA">
-            5215564861554994
+            {{ chargeOrderDetail?.chargeOrderNo }}
           </view>
         </view>
         <view class="mt-28rpx flex items-center justify-between">
@@ -80,7 +103,7 @@ definePage({
             订单时间
           </view>
           <view class="text-28rpx text-#AAA">
-            2024-07-07 23:13:12
+            {{ chargeOrderDetail?.chargeTime }}
           </view>
         </view>
         <view class="mt-28rpx flex items-center justify-between">
@@ -88,15 +111,7 @@ definePage({
             充电电站
           </view>
           <view class="text-28rpx text-#AAA">
-            华能贵州盘州市风电有限责任公司
-          </view>
-        </view>
-        <view class="mt-28rpx flex items-center justify-between">
-          <view class="text-28rpx font-500">
-            终端名称
-          </view>
-          <view class="text-28rpx text-#AAA">
-            402号直流快充
+            {{ chargeOrderDetail?.powerStationName }}
           </view>
         </view>
         <view class="mt-28rpx flex items-center justify-between">
@@ -104,15 +119,7 @@ definePage({
             终端编号
           </view>
           <view class="text-28rpx text-#AAA">
-            52155648615
-          </view>
-        </view>
-        <view class="mt-28rpx flex items-center justify-between">
-          <view class="text-28rpx font-500">
-            车位编号
-          </view>
-          <view class="text-28rpx text-#AAA">
-            无
+            {{ '--' }}
           </view>
         </view>
         <view class="mt-28rpx flex items-center justify-between">
@@ -120,7 +127,7 @@ definePage({
             电费
           </view>
           <view class="text-28rpx text-#AAA">
-            2.82
+            {{ '--' }}
           </view>
         </view>
         <view class="mt-28rpx flex items-center justify-between">
@@ -128,11 +135,11 @@ definePage({
             服务费
           </view>
           <view class="text-28rpx text-#AAA">
-            0.71
+            {{ chargeOrderDetail?.realServiceCost }}
           </view>
         </view>
         <wd-divider />
-        <view class="mt-28rpx flex items-center justify-between">
+        <!-- <view class="mt-28rpx flex items-center justify-between">
           <view class="text-28rpx font-500">
             新用户首单立减
           </view>
@@ -147,13 +154,13 @@ definePage({
           <view class="text-28rpx text-#F44033">
             0.71元
           </view>
-        </view>
+        </view> -->
         <view class="mt-28rpx flex items-center justify-between">
           <view class="text-28rpx font-500">
             实际结算费用
           </view>
           <view class="text-28rpx text-#F44033">
-            0.71
+            {{ chargeOrderDetail?.realCost }}
           </view>
         </view>
       </view>

+ 132 - 0
src/subPack-charge/chargeOrderList/chargeOrderList.vue

@@ -0,0 +1,132 @@
+<script setup lang="ts">
+import { navTabTypeList } from '../utils/order-data'
+import { chargeOrderStatus } from '../utils/index'
+import router from '@/router'
+import { createGlobalLoadingMiddleware } from '@/api/core/middleware'
+import { StaticUrl } from '@/config'
+
+const navActiveTab = ref(0)
+const { statusBarHeight, MenuButtonHeight, opcity } = storeToRefs(useSysStore())
+definePage({
+  name: 'charge-order-list',
+  islogin: false,
+  style: {
+    navigationBarTitleText: '充电订单',
+    navigationStyle: 'custom',
+  },
+})
+const { data: orderList, refresh, isLastPage, page, reload } = usePagination((pageNum, pageSize) => Apis.xsb.orderList({ data: {
+  businessType: 'CD',
+  pageNum,
+  pageSize,
+  dvyType: unref(navActiveTab) === 0 ? '' : unref(navActiveTab),
+} }), {
+  immediate: false,
+  pageNum: 1,
+  pageSize: 10,
+  initialData: [],
+  data: res => res.data?.list,
+  append: true,
+  middleware: createGlobalLoadingMiddleware(),
+})
+onShow(() => {
+  refresh()
+})
+onMounted(() => {
+  opcity.value = 0
+})
+
+onPageScroll((e) => {
+  const calculatedOpacity = e.scrollTop / 100
+  opcity.value = Math.min(1, Math.max(0.1, calculatedOpacity))
+})
+onReachBottom(() => {
+  if (!isLastPage.value) {
+    page.value++
+  }
+})
+function handleChangeTypeNav(value: number) {
+  navActiveTab.value = value
+  orderList.value = []
+  reload()
+  console.log(navActiveTab.value, '===============')
+}
+
+function handleItemClick(item: Api.xsbOrderList) {
+  const orderNumber = item.orderNumber
+  if (orderNumber) {
+    router.push({
+      name: 'charge-order-detail',
+      params: { orderNo: orderNumber },
+    })
+  }
+  else {
+    console.warn('订单号不存在,无法跳转到详情页')
+  }
+}
+</script>
+
+<template>
+  <view class="min-h-screen bg-[linear-gradient(180deg,#F5FEDD_0%,#FCFFF3_22.46%,#FAFCFB_27.26%,#FBFDFC_45.2%,#FBFCFB_68.94%,#FBFCFB_100%)]">
+    <wd-navbar
+      title="充电订单" :custom-style="`background-color: rgba(226, 255, 145, ${opcity})`"
+      :bordered="false" :z-index="999" safe-area-inset-top left-arrow fixed @click-left="router.back()"
+    />
+    <view :style="{ paddingTop: `${(Number(statusBarHeight) || 44) + MenuButtonHeight + 12}px` }" />
+    <view class="nav sticky top-0 z10 px24rpx">
+      <view class="h80rpx flex items-center">
+        <view
+          v-for="item in navTabTypeList" :key="item.value" class="mr64rpx h-full flex flex-col items-center justify-center text-32rpx"
+          :class="[navActiveTab == item.value ? 'font-semibold ' : 'text-#AAAAAA']"
+          @click="handleChangeTypeNav(item.value)"
+        >
+          {{ item.name }}
+          <view
+            class="mt10rpx bg-[var(--them-color)] transition-all transition-duration-400 ease-in"
+            :class="[navActiveTab == item.value ? 'w40rpx h8rpx rounded-4rpx' : '']"
+          />
+        </view>
+      </view>
+    </view>
+    <view class="box-border px24rpx">
+      <view v-for="item in orderList" :key="item.orderNumber" class="mt-20rpx mt20rpx rounded-16rpx bg-#FFF p-24rpx" @click="handleItemClick(item)">
+        <view class="flex items-center justify-between">
+          <view>
+            <view class="text-28rpx font-bold">
+              {{ item.chargeOrder?.powerStationName }}
+            </view>
+            <view class="mt-20rpx text-24rpx text-#AAA">
+              订单时间:{{ item.chargeOrder?.createTime || '未知' }}
+            </view>
+            <view class="mt-20rpx text-24rpx text-#AAA">
+              终端编号:{{ item.chargeOrder?.connectorId || '未知' }}
+            </view>
+          </view>
+          <view v-if="item.chargeOrder?.status" class="text-center text-28rpx text-#4EDC86">
+            <image
+              class="h-64rpx w-64rpx"
+              :src="`${StaticUrl}/${chargeOrderStatus(item.chargeOrder?.status).icon}.png`"
+            />
+            <view :style="{ color: chargeOrderStatus(item.chargeOrder?.status).color }">
+              {{ chargeOrderStatus(item.chargeOrder?.status).text }}
+            </view>
+          </view>
+        </view>
+        <view class="my-20rpx h-2rpx w-full bg-#F0F0F0" />
+        <view class="flex items-center justify-between">
+          <view class="text-28rpx">
+            充电费用:
+          </view>
+          <view class="text-32rpx text-#FF6464 font-800">
+            <text class="text-18rpx">
+              ¥
+            </text>
+            {{ item.chargeOrder?.realCost }}
+          </view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<style lang="scss" scoped></style>

+ 2 - 2
src/subPack-charge/chargeSiteDetail/chargeSiteDetail.vue

@@ -19,7 +19,7 @@ definePage({
     navigationStyle: 'custom',
   },
 })
-const activeFilter = ref('0')
+const activeFilter = ref('1')
 onMounted(() => {
   getStationDetail()
   opcity.value = 0
@@ -53,8 +53,8 @@ const filterOptions = computed(() => {
   }
 
   return [
-    { key: '0', label: `离线(${counts['0']})` },
     { key: '1', label: `空闲(${counts['1']})` },
+    { key: '0', label: `离线(${counts['0']})` },
     { key: '2', label: `占用(${counts['2']})` },
   ]
 })

+ 26 - 0
src/subPack-charge/chargeStart/chargeStart.vue

@@ -37,6 +37,7 @@ const fromData = ref<Api.invokeChargeList>({
   equipmentId: 0,
   stationId: 0,
   connectorId: '',
+  powerStationName: '',
   consigneeName: userInfo.value?.nickName,
   consigneeMobile: userInfo.value?.mobile,
 })
@@ -46,6 +47,7 @@ async function launchCharge() {
   fromData.value.equipmentId = connectorDetailInfo.value?.equipmentId
   fromData.value.stationId = connectorDetailInfo.value?.stationId
   fromData.value.connectorId = connectorDetailInfo.value?.connectorCode
+  fromData.value.powerStationName = connectorDetailInfo.value?.stationName
   const res = await Apis.charge.invokeCharge({ data: fromData.value })
   if (res.code === '00000') {
     router.push({ name: 'chargeing', params: { orderNo: res.data } })
@@ -125,6 +127,30 @@ async function launchCharge() {
             {{ connectorDetailInfo?.parkingTips || '--' }}
           </view>
         </view>
+        <view class="mt-20rpx flex items-center justify-between">
+          <view class="text-28rpx font-bold">
+            终端状态
+          </view>
+          <view class="text-28rpx text-#AAA">
+            {{ connectorDetailInfo?.statusName || '--' }}
+          </view>
+        </view>
+        <view class="mt-20rpx flex items-center justify-between">
+          <view class="text-28rpx font-bold">
+            终端编号
+          </view>
+          <view class="text-28rpx text-#AAA">
+            {{ connectorDetailInfo?.connectorCode || '--' }}
+          </view>
+        </view>
+        <view class="mt-20rpx flex items-center justify-between">
+          <view class="text-28rpx font-bold">
+            充电电站
+          </view>
+          <view class="text-28rpx text-#AAA">
+            {{ connectorDetailInfo?.stationName || '--' }}
+          </view>
+        </view>
         <view class="mt-28rpx text-24rpx text-#AAA">
           账单信息可能会有所延迟,具体以实际结算为准
         </view>

+ 4 - 24
src/subPack-charge/index/index.vue

@@ -91,7 +91,7 @@ function handleFilterClick(filterKey: number) {
       </template>
     </wd-navbar>
     <view :style="{ paddingTop: `${(Number(statusBarHeight) || 44) + MenuButtonHeight + 12}px` }" class="px24rpx">
-      <charge-search map-mode-text-value="地图模式" @map-mode-click="router.push({ name: 'charge-map' })" />
+      <charge-search map-mode-text-value="地图模式" @map-mode-click="router.replace({ name: 'charge-map' })" />
       <view class="userInfo-card">
         <view class="flex items-center gap-20rpx">
           <image
@@ -100,7 +100,7 @@ function handleFilterClick(filterKey: number) {
           />
           <view class="flex items-center gap-16rpx">
             <view class="text-32rpx text-#2B303A font-bold">
-              {{ userInfo?.nickName || '游客' }}
+              {{ userInfo?.nickName || '暂未登录' }}
             </view>
             <view v-if="!token" class="text-24rpx text-#9ED605" @click="router.replace({ name: 'smqjh-login' })">
               授权登录
@@ -131,7 +131,7 @@ function handleFilterClick(filterKey: number) {
               </view>
             </view>
           </view>
-          <view class="flex items-center gap-20rpx bg-#F3FFD1 p-24rpx" @click="router.push({ name: 'smqjh-order' })">
+          <view class="flex items-center gap-20rpx bg-#F3FFD1 p-24rpx" @click="router.push({ name: 'charge-order-list' })">
             <view>
               <view class="text-28rpx font-bold">
                 充电订单
@@ -203,7 +203,7 @@ function handleFilterClick(filterKey: number) {
                 </view>
               </view>
             </view>
-            <view v-if="!item.enterprisePrice" class="mt-28rpx flex items-center justify-between">
+            <view class="mt-28rpx flex items-center justify-between">
               <view class="relative flex">
                 <view class="absolute left-30rpx z-10 flex items-center -top-26rpx">
                   <text class="text-40rpx text-#FF6464 font-bold">
@@ -222,26 +222,6 @@ function handleFilterClick(filterKey: number) {
                 {{ item.peakValue }}:{{ item.peakTime }}
               </view>
             </view>
-            <view v-else class="mt-20rpx flex items-center justify-between">
-              <view class="flex items-center">
-                <view class="flex items-center -mt-10rpx">
-                  <text class="text-40rpx text-#FF6464 font-bold">
-                    {{ item.platformPrice }}
-                  </text>
-                  <text class="w-100rpx text-24rpx">
-                    元/度
-                  </text>
-                </view>
-                <view class="h-52rpx w-212rpx text-center" :style="{ backgroundImage: `url(${StaticUrl}/charge-firm.png)`, backgroundSize: 'cover', backgroundPosition: 'center' }">
-                  <text class="ml-70rpx text-28rpx text-#FF6464">
-                    {{ item.enterprisePrice }}
-                  </text>
-                </view>
-              </view>
-              <view class="text-24rpx text-#2B303A">
-                {{ item.peakValue }}:{{ item.peakTime }}
-              </view>
-            </view>
           </view>
         </wd-skeleton>
       </view>

+ 31 - 0
src/subPack-charge/utils/index.ts

@@ -5,6 +5,37 @@ export function formatStatusName(statusName: string) {
   return statusName.replace(/\([^)]*\)/g, '')
 }
 
+/**
+ * 统一充电订单状态处理
+ * @param order
+ */
+export function chargeOrderStatus(status: any) {
+  const statusObj = { icon: '', text: '', color: '' }
+  switch (status) {
+    case 0:
+      statusObj.icon = 'charge-order-settlement'
+      statusObj.text = '待充电'
+      statusObj.color = '#FFA500'
+      break
+    case 1:
+      statusObj.icon = 'charge-order-ing'
+      statusObj.text = '充电中'
+      statusObj.color = '#4EDC86'
+      break
+    case 2:
+      statusObj.icon = 'charge-order-settlement'
+      statusObj.text = '结算中'
+      statusObj.color = '#3EB6F8'
+      break
+    case 3:
+      statusObj.icon = 'charge-order-settled'
+      statusObj.text = '已完成'
+      statusObj.color = '#AAAAAA'
+      break
+  }
+  return statusObj
+}
+
 /**
  * 扫码工具类
  */

+ 5 - 0
src/subPack-charge/utils/order-data.ts

@@ -0,0 +1,5 @@
+export const navTabTypeList = [
+  { name: '全部订单', value: 0 },
+  { name: '进行中', value: 1 },
+  { name: '已完成', value: 2 },
+]

+ 26 - 7
src/subPack-smqjh/components/charge-orderList/charge-orderList.vue

@@ -1,32 +1,51 @@
 <script setup lang="ts">
+import { chargeOrderStatus } from '../../order/order-data'
 import router from '@/router'
+import { StaticUrl } from '@/config'
 
 defineProps<{
   orderList: Api.xsbOrderList[]
   subPackOrder: any
 }>()
+
+function handleItemClick(item: Api.xsbOrderList) {
+  const orderNumber = item.chargeOrder?.orderNumber
+  if (orderNumber) {
+    router.push({
+      name: 'charge-order-detail',
+      params: { orderNo: orderNumber },
+    })
+  }
+  else {
+    console.warn('订单号不存在,无法跳转到详情页')
+  }
+}
 </script>
 
 <template>
   <view class="">
-    <view v-for="item in orderList" :key="item.orderNumber" class="mt-20rpx mt20rpx rounded-16rpx bg-#FFF p-24rpx" @click="router.push({ name: 'charge-order-detail' })">
+    <view v-for="item in orderList" :key="item.orderNumber" class="mt-20rpx mt20rpx rounded-16rpx bg-#FFF p-24rpx" @click="handleItemClick(item)">
       <view class="flex items-center justify-between">
         <view>
           <view class="text-28rpx font-bold">
-            {{ item.shopName }}
+            {{ item.chargeOrder?.powerStationName }}
           </view>
           <view class="mt-20rpx text-24rpx text-#AAA">
             订单时间:{{ item.createTime || '未知' }}
           </view>
           <view class="mt-20rpx text-24rpx text-#AAA">
-            终端名称:{{ item.orderItemList?.[0]?.goodsName || '未知' }}
+            终端编号:{{ item.chargeOrder?.connectorId || '未知' }}
           </view>
         </view>
-        <view class="text-28rpx text-#4EDC86">
-          {{ subPackOrder?.handleCommonOrderStatusText(item) }}
+        <view class="text-center text-28rpx text-#4EDC86">
+          <image
+            class="h-64rpx w-64rpx"
+            :src="`${StaticUrl}/${chargeOrderStatus(item.chargeOrder?.status).icon}.png`"
+          />
+          <view>{{ chargeOrderStatus(item.chargeOrder?.status).text }}</view>
         </view>
       </view>
-      <wd-divider />
+      <view class="my-20rpx h-2rpx w-full bg-#F0F0F0" />
       <view class="flex items-center justify-between">
         <view class="text-28rpx">
           充电费用:
@@ -35,7 +54,7 @@ defineProps<{
           <text class="text-18rpx">
           </text>
-          {{ item.actualTotal }}
+          {{ item.chargeOrder?.realCost }}
         </view>
       </view>
     </view>

+ 54 - 18
src/subPack-smqjh/components/xsb-orderList/xsb-orderList.vue

@@ -9,14 +9,55 @@ const props = defineProps<{
 }>()
 
 const _emit = defineEmits<{
-  'cancel': [order: Api.xsbOrderList]
-  'pay': [orderNumber: string]
-  'submit': [order: Api.xsbOrderList]
-  'del': [order: Api.xsbOrderList]
   'after-sale': [item: Api.xsbOrderList]
   'refresh': []
 }>()
 
+function resolveModule<T = any>(maybeRef: any): T | undefined {
+  if (!maybeRef)
+    return undefined
+  if (maybeRef.value !== undefined)
+    return maybeRef.value as T
+  return maybeRef as T
+}
+
+async function handleCancel(order: Api.xsbOrderList) {
+  const sp = resolveModule(props.subPackOrder)
+  if (!sp)
+    return
+  await sp.handleCommonCancelOrder?.(order)
+  _emit('refresh')
+}
+
+async function handlePay(orderNumber: string) {
+  const spc = resolveModule(props.subPackConfirm)
+  if (!spc)
+    return
+  const res = await spc.handleCommonPayMent?.(orderNumber)
+  if (res?.payType !== 1 && res) {
+    await spc.getWxCommonPayment?.(res)
+  }
+  else {
+    _emit('refresh')
+  }
+}
+
+async function handleSubmit(order: Api.xsbOrderList) {
+  const sp = resolveModule(props.subPackOrder)
+  if (!sp)
+    return
+  await sp.handleCommonOrderReceive?.(order)
+  _emit('refresh')
+}
+
+async function handleDel(order: Api.xsbOrderList) {
+  const sp = resolveModule(props.subPackOrder)
+  if (!sp)
+    return
+  await sp.handleCommonDeleteOrder?.(order)
+  _emit('refresh')
+}
+
 function handleClick(no: string) {
   router.push({ name: 'xsb-orderDetaile', params: { id: no } })
 }
@@ -82,40 +123,35 @@ function handleClick(no: string) {
       </view>
     </view>
     <view class="my24rpx flex items-center justify-end">
-      <template v-if="item.hbOrderStatus === props.subPackOrder?.OrderStatus.PaddingPay">
+      <template v-if="item.hbOrderStatus === resolveModule(props.subPackOrder)?.OrderStatus.PaddingPay">
         <view class="mr20rpx">
-          <wd-button size="small" plain type="info" @click.stop="$emit('cancel', item)">
+          <wd-button size="small" plain type="info" @click.stop="handleCancel(item)">
             取消订单
           </wd-button>
         </view>
         <view class="mr20rpx">
-          <wd-button size="small" plain type="error" @click.stop="$emit('pay', item.orderNumber as string)">
+          <wd-button size="small" plain type="error" @click.stop="handlePay(item.orderNumber as string)">
             付款
           </wd-button>
         </view>
       </template>
-      <template v-if="[props.subPackOrder?.OrderStatus.OrderCancel, props.subPackOrder?.OrderStatus.OrderCompleted].includes(item.hbOrderStatus) ">
+      <template v-if="[resolveModule(props.subPackOrder)?.OrderStatus.OrderCancel, resolveModule(props.subPackOrder)?.OrderStatus.OrderCompleted].includes(item.hbOrderStatus) ">
         <view class="mr20rpx">
-          <wd-button size="small" plain type="info" @click.stop="$emit('del', item)">
+          <wd-button size="small" plain type="info" @click.stop="handleDel(item)">
             删除订单
           </wd-button>
         </view>
-        <!-- <view class="ml20rpx">
-              <wd-button size="small" plain type="error" >
-                再次购买
-              </wd-button>
-            </view> -->
       </template>
-      <template v-if="item.hbOrderStatus === props.subPackOrder?.OrderStatus.OrderArrived">
+      <template v-if="item.hbOrderStatus === resolveModule(props.subPackOrder)?.OrderStatus.OrderArrived">
         <view class="mr20rpx">
-          <wd-button size="small" plain type="info" @click.stop="$emit('submit', item)">
+          <wd-button size="small" plain type="info" @click.stop="handleSubmit(item)">
             确认收货
           </wd-button>
         </view>
       </template>
-      <template v-if="item.refundStatus != 2 || [props.subPackOrder?.OrderStatus.OrderCompleted, props.subPackOrder?.OrderStatus.OrderWaitDelivery, props.subPackOrder?.OrderStatus.OrderAccepted].includes(item.hbOrderStatus) ">
+      <template v-if="item.refundStatus != 2 || [resolveModule(props.subPackOrder)?.OrderStatus.OrderCompleted, resolveModule(props.subPackOrder)?.OrderStatus.OrderWaitDelivery, resolveModule(props.subPackOrder)?.OrderStatus.OrderAccepted].includes(item.hbOrderStatus) ">
         <view class="mr20rpx">
-          <wd-button size="small" plain type="info" @click.stop="$emit('after-sale', item)">
+          <wd-button size="small" plain type="info" @click.stop="() => _emit('after-sale', item)">
             申请售后
           </wd-button>
         </view>

+ 1 - 1
src/subPack-smqjh/order/components/OrderRenderer.vue

@@ -55,7 +55,7 @@ defineEmits<{
     @refresh="$emit('refresh')"
   />
   <chargeList
-    v-else-if="navActiveTab === 'CHARGE'"
+    v-else-if="navActiveTab === 'CD'"
     :order-list="orderList"
     :sub-pack-order="subPackOrder"
   />

+ 6 - 30
src/subPack-smqjh/order/index.vue

@@ -34,20 +34,20 @@ const { data: orderList, refresh, isLastPage, page, reload } = usePagination((pa
   middleware: createGlobalLoadingMiddleware(),
 })
 
-function createFilteredList(navTabValue: string, businessType: string) {
+function createFilteredList(businessType: string) {
   return computed(() => {
     if (navActiveTab.value === 'all') {
       return orderList.value.filter(order => order.businessType === businessType)
     }
-    else if (navActiveTab.value === navTabValue) {
+    else if (navActiveTab.value === businessType) {
       return orderList.value
     }
     return []
   })
 }
 
-const xsbOrderList = createFilteredList('XSB', 'XSB')
-const chargeOrderList = createFilteredList('CHARGE', 'CD')
+const xsbOrderList = createFilteredList('XSB')
+const chargeOrderList = createFilteredList('CD')
 
 const currentOrderList = computed(() => {
   if (navActiveTab.value === 'all') {
@@ -56,7 +56,7 @@ const currentOrderList = computed(() => {
   else if (navActiveTab.value === 'XSB') {
     return xsbOrderList.value
   }
-  else if (navActiveTab.value === 'CHARGE') {
+  else if (navActiveTab.value === 'CD') {
     return chargeOrderList.value
   }
   return []
@@ -86,27 +86,7 @@ function handleChangeStatus(value: string) {
   orderList.value = []
   reload()
 }
-async function handleCancel(order: Api.xsbOrderList) {
-  await subPackOrder.value?.handleCommonCancelOrder(order)
-  reload()
-}
-async function handlePay(orderNumber: string) {
-  const res = await subPackComfirm.value?.handleCommonPayMent(orderNumber)
-  if (res?.payType !== 1 && res) {
-    await subPackComfirm.value?.getWxCommonPayment(res)
-  }
-  else {
-    reload()
-  }
-}
-async function handleSubmitOrder(order: Api.xsbOrderList) {
-  await subPackOrder.value?.handleCommonOrderReceive(order)
-  reload()
-}
-async function handleDel(order: Api.xsbOrderList) {
-  await subPackOrder.value?.handleCommonDeleteOrder(order)
-  reload()
-}
+// Cancel / Pay / Submit / Delete are handled inside child components now
 async function handleAfterSale(item: Api.xsbOrderList) {
   if (!item.orderItemList) {
     useGlobalToast().show('商品异常!')
@@ -155,10 +135,6 @@ async function handleAfterSale(item: Api.xsbOrderList) {
         :nav-active-tab="navActiveTab"
         :sub-pack-order="subPackOrder"
         :sub-pack-confirm="subPackComfirm"
-        @cancel="handleCancel"
-        @pay="handlePay"
-        @submit="handleSubmitOrder"
-        @del="handleDel"
         @after-sale="handleAfterSale"
         @refresh="refresh"
       />

+ 32 - 1
src/subPack-smqjh/order/order-data.ts

@@ -1,7 +1,7 @@
 export const navTabTypeList = [
   { name: '全部', value: 'all' },
   { name: '星闪豹', value: 'XSB' },
-  { name: '充电', value: 'CHARGE' },
+  { name: '充电', value: 'CD' },
   { name: '电影演出', value: 'MOVIE' },
   { name: '视频权益', value: 'VIDEO' },
   { name: '大牌点餐', value: 'SHOP' },
@@ -32,3 +32,34 @@ export function handleCommonOrderPay(order: any) {
 export function handleCommonCancelOrder(order: any) {
   return order
 }
+
+/**
+ * 统一充电订单状态处理
+ * @param order
+ */
+export function chargeOrderStatus(status: any) {
+  const statusObj = { icon: '', text: '', color: '' }
+  switch (status) {
+    case 0:
+      statusObj.icon = 'charge-order-settlement'
+      statusObj.text = '待充电'
+      statusObj.color = '#FFA500'
+      break
+    case 1:
+      statusObj.icon = 'charge-order-ing'
+      statusObj.text = '充电中'
+      statusObj.color = '#4EDC86'
+      break
+    case 2:
+      statusObj.icon = 'charge-order-settlement'
+      statusObj.text = '结算中'
+      statusObj.color = '#3EB6F8'
+      break
+    case 3:
+      statusObj.icon = 'charge-order-settled'
+      statusObj.text = '已完成'
+      statusObj.color = '#AAAAAA'
+      break
+  }
+  return statusObj
+}

+ 1 - 1
src/subPack-xsb/order/index.vue

@@ -33,7 +33,7 @@ const { data: orderList, refresh, isLastPage, page, reload } = usePagination((pa
 })
 function handleChangeTypeNav(value: number) {
   navActiveTab.value = value
-  console.log(navActiveTab.value, '===============')
+  console.log(navActiveTab.value)
   orderList.value = []
   reload()
 }

+ 35 - 42
src/uni-pages.d.ts

@@ -1,50 +1,47 @@
 /* eslint-disable */
 /* prettier-ignore */
 // @ts-nocheck
-// Generated by vite-plugin-uni-pages
-
-type _LocationUrl =
-  "/pages/index/index" |
-  "/pages/cart/index" |
-  "/pages/classfiy/index" |
-  "/pages/login/index" |
-  "/pages/my/index" |
-  "/subPack-xsb/commonTab/index" |
-  "/subPack-xsb/confirmOrder/index" |
-  "/subPack-xsb/goods/index" |
-  "/subPack-xsb/order/index" |
-  "/subPack-xsb/orderDetaile/index" |
-  "/subPack-xsb/search/index" |
-  "/subPack-xsb/selectAddress/index" |
-  "/subPack-common/addressList/index" |
-  "/subPack-common/afterSales/index" |
-  "/subPack-common/afterSalesDetail/index" |
-  "/subPack-common/afterSalesList/index" |
-  "/subPack-common/editAddress/index" |
-  "/subPack-common/integral/index" |
-  "/subPack-common/nickName/index" |
-  "/subPack-common/payError/index" |
-  "/subPack-common/paySuccess/index" |
-  "/subPack-common/revalue/index" |
-  "/subPack-common/revalueSuccess/index" |
-  "/subPack-common/user-center/index" |
-  "/subPack-smqjh/order/index" |
-  "/subPack-charge/chargeDetail/chargeDetail" |
-  "/subPack-charge/chargeing/chargeing" |
-  "/subPack-charge/chargeMap/chargeMap" |
-  "/subPack-charge/chargeOrderDetail/chargeOrderDetail" |
-  "/subPack-charge/chargeSearchList/chargeSearchList" |
-  "/subPack-charge/chargeSiteDetail/chargeSiteDetail" |
-  "/subPack-charge/chargeStart/chargeStart" |
-  "/subPack-charge/index/index";
+// Generated by @uni-ku/pages-json
 
 interface NavigateToOptions {
-  url: _LocationUrl;
+  url: "/pages/login/index" |
+       "/subPack-xsb/commonTab/index" |
+       "/subPack-xsb/confirmOrder/index" |
+       "/subPack-xsb/goods/index" |
+       "/subPack-xsb/order/index" |
+       "/subPack-xsb/orderDetaile/index" |
+       "/subPack-xsb/search/index" |
+       "/subPack-xsb/selectAddress/index" |
+       "/subPack-common/addressList/index" |
+       "/subPack-common/afterSales/index" |
+       "/subPack-common/afterSalesDetail/index" |
+       "/subPack-common/afterSalesList/index" |
+       "/subPack-common/editAddress/index" |
+       "/subPack-common/integral/index" |
+       "/subPack-common/nickName/index" |
+       "/subPack-common/payError/index" |
+       "/subPack-common/paySuccess/index" |
+       "/subPack-common/revalue/index" |
+       "/subPack-common/revalueSuccess/index" |
+       "/subPack-common/user-center/index" |
+       "/subPack-smqjh/order/index" |
+       "/subPack-charge/chargeDetail/chargeDetail" |
+       "/subPack-charge/chargeing/chargeing" |
+       "/subPack-charge/chargeMap/chargeMap" |
+       "/subPack-charge/chargeOrderDetail/chargeOrderDetail" |
+       "/subPack-charge/chargeOrderList/chargeOrderList" |
+       "/subPack-charge/chargeSearchList/chargeSearchList" |
+       "/subPack-charge/chargeSiteDetail/chargeSiteDetail" |
+       "/subPack-charge/chargeStart/chargeStart" |
+       "/subPack-charge/index/index";
 }
 interface RedirectToOptions extends NavigateToOptions {}
 
 interface SwitchTabOptions {
-  url: "/pages/index/index" | "/pages/classfiy/index" | "/pages/cart/index" | "/pages/my/index"
+  url: "/pages/index/index" |
+       "/pages/classfiy/index" |
+       "/pages/cart/index" |
+       "/pages/my/index";
 }
 
 type ReLaunchOptions = NavigateToOptions | SwitchTabOptions;
@@ -55,7 +52,3 @@ declare interface Uni {
   switchTab(options: UniNamespace.SwitchTabOptions & SwitchTabOptions): void;
   reLaunch(options: UniNamespace.ReLaunchOptions & ReLaunchOptions): void;
 }
-
-declare module "virtual:uni-pages" {
-  export type LocationUrl = _LocationUrl;
-}