From cd4b4cd3228a95fcc827ddfdccaf3949d2546a7c Mon Sep 17 00:00:00 2001
From: owen <owen@evolsun.com>
Date: Mon, 16 Oct 2023 22:03:36 +0800
Subject: [PATCH 1/4] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=EF=BC=9AReview=E4=BF=AE?=
 =?UTF-8?q?=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/mall/statistics/member.ts                    | 10 +++++-----
 src/api/mall/statistics/pay.ts                       |  8 +++++++-
 src/api/mall/statistics/trade.ts                     |  2 +-
 src/views/mall/home/components/OperationDataCard.vue |  3 ++-
 src/views/mall/home/index.vue                        |  4 ++--
 src/views/mall/statistics/trade/index.vue            |  6 +++---
 6 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/src/api/mall/statistics/member.ts b/src/api/mall/statistics/member.ts
index 28d5a78c..92af031e 100644
--- a/src/api/mall/statistics/member.ts
+++ b/src/api/mall/statistics/member.ts
@@ -58,8 +58,8 @@ export interface MemberTerminalStatisticsRespVO {
 export interface MemberCountRespVO {
   /** 用户访问量 */
   visitUserCount: string
-  /** 新增用户数量 */
-  createUserCount: number
+  /** 注册用户数量 */
+  registerUserCount: number
 }
 
 /** 会员注册数量 Response VO */
@@ -86,21 +86,21 @@ export const getMemberAnalyse = (params: MemberAnalyseReqVO) => {
 // 按照省份,查询会员统计列表
 export const getMemberAreaStatisticsList = () => {
   return request.get<MemberAreaStatisticsRespVO[]>({
-    url: '/statistics/member/get-area-statistics-list'
+    url: '/statistics/member/area-statistics-list'
   })
 }
 
 // 按照性别,查询会员统计列表
 export const getMemberSexStatisticsList = () => {
   return request.get<MemberSexStatisticsRespVO[]>({
-    url: '/statistics/member/get-sex-statistics-list'
+    url: '/statistics/member/sex-statistics-list'
   })
 }
 
 // 按照终端,查询会员统计列表
 export const getMemberTerminalStatisticsList = () => {
   return request.get<MemberTerminalStatisticsRespVO[]>({
-    url: '/statistics/member/get-terminal-statistics-list'
+    url: '/statistics/member/terminal-statistics-list'
   })
 }
 
diff --git a/src/api/mall/statistics/pay.ts b/src/api/mall/statistics/pay.ts
index 1593f38d..f5d14c9d 100644
--- a/src/api/mall/statistics/pay.ts
+++ b/src/api/mall/statistics/pay.ts
@@ -1,6 +1,12 @@
 import request from '@/config/axios'
 
+/** 支付统计 */
+export interface PaySummaryRespVO {
+  /** 充值金额,单位分 */
+  rechargePrice: number
+}
+
 /** 获取钱包充值金额 */
 export const getWalletRechargePrice = async () => {
-  return await request.get<number>({ url: `/statistics/pay/wallet-recharge-price` })
+  return await request.get<PaySummaryRespVO>({ url: `/statistics/pay/summary` })
 }
diff --git a/src/api/mall/statistics/trade.ts b/src/api/mall/statistics/trade.ts
index ef2a2b2b..5e620a6e 100644
--- a/src/api/mall/statistics/trade.ts
+++ b/src/api/mall/statistics/trade.ts
@@ -25,7 +25,7 @@ export interface TradeTrendSummaryRespVO {
   expensePrice: number
   orderWalletPayPrice: number
   brokerageSettlementPrice: number
-  orderRefundPrice: number
+  afterSaleRefundPrice: number
 }
 
 /** 交易订单数量 Response VO */
diff --git a/src/views/mall/home/components/OperationDataCard.vue b/src/views/mall/home/components/OperationDataCard.vue
index cae09a3e..3efac9bf 100644
--- a/src/views/mall/home/components/OperationDataCard.vue
+++ b/src/views/mall/home/components/OperationDataCard.vue
@@ -70,7 +70,8 @@ const getProductData = async () => {
 
 /** 查询钱包充值数据 */
 const getWalletRechargeData = async () => {
-  data.rechargePrice.value = await PayStatisticsApi.getWalletRechargePrice()
+  const paySummary = await PayStatisticsApi.getWalletRechargePrice();
+  data.rechargePrice.value = paySummary.rechargePrice
 }
 
 /**
diff --git a/src/views/mall/home/index.vue b/src/views/mall/home/index.vue
index ede05bff..feaa46a9 100644
--- a/src/views/mall/home/index.vue
+++ b/src/views/mall/home/index.vue
@@ -32,8 +32,8 @@
         <ComparisonCard
           tag="今日"
           title="新增用户"
-          :value="userComparison?.value?.createUserCount || 0"
-          :reference="userComparison?.reference?.createUserCount || 0"
+          :value="userComparison?.value?.registerUserCount || 0"
+          :reference="userComparison?.reference?.registerUserCount || 0"
         />
       </el-col>
     </el-row>
diff --git a/src/views/mall/statistics/trade/index.vue b/src/views/mall/statistics/trade/index.vue
index b7dfc667..744bcd1e 100644
--- a/src/views/mall/statistics/trade/index.vue
+++ b/src/views/mall/statistics/trade/index.vue
@@ -192,11 +192,11 @@
             icon-bg-color="text-blue-500"
             prefix="¥"
             :decimals="2"
-            :value="fenToYuan(trendSummary?.value?.orderRefundPrice || 0)"
+            :value="fenToYuan(trendSummary?.value?.afterSaleRefundPrice || 0)"
             :percent="
               calculateRelativeRate(
-                trendSummary?.value?.orderRefundPrice,
-                trendSummary?.reference?.orderRefundPrice
+                trendSummary?.value?.afterSaleRefundPrice,
+                trendSummary?.reference?.afterSaleRefundPrice
               )
             "
           />

From 6204ce6c1b70c5c878f3e21de6d286935ed8ef15 Mon Sep 17 00:00:00 2001
From: owen <owen@evolsun.com>
Date: Mon, 16 Oct 2023 22:09:20 +0800
Subject: [PATCH 2/4] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=EF=BC=9Atrade=5Fstatisti?=
 =?UTF-8?q?cs=20=E5=AD=97=E6=AE=B5=E3=80=90order=5Fwallet=5Fpay=5Fprice?=
 =?UTF-8?q?=E3=80=91=E6=94=B9=E4=B8=BA=E3=80=90wallet=5Fpay=5Fprice?=
 =?UTF-8?q?=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/mall/statistics/trade.ts          | 2 +-
 src/views/mall/statistics/trade/index.vue | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/api/mall/statistics/trade.ts b/src/api/mall/statistics/trade.ts
index 5e620a6e..94052597 100644
--- a/src/api/mall/statistics/trade.ts
+++ b/src/api/mall/statistics/trade.ts
@@ -23,7 +23,7 @@ export interface TradeTrendSummaryRespVO {
   orderPayPrice: number
   rechargePrice: number
   expensePrice: number
-  orderWalletPayPrice: number
+  walletPayPrice: number
   brokerageSettlementPrice: number
   afterSaleRefundPrice: number
 }
diff --git a/src/views/mall/statistics/trade/index.vue b/src/views/mall/statistics/trade/index.vue
index 744bcd1e..aff190b0 100644
--- a/src/views/mall/statistics/trade/index.vue
+++ b/src/views/mall/statistics/trade/index.vue
@@ -156,11 +156,11 @@
             icon-bg-color="text-cyan-500"
             prefix="¥"
             :decimals="2"
-            :value="fenToYuan(trendSummary?.value?.orderWalletPayPrice || 0)"
+            :value="fenToYuan(trendSummary?.value?.walletPayPrice || 0)"
             :percent="
               calculateRelativeRate(
-                trendSummary?.value?.orderWalletPayPrice,
-                trendSummary?.reference?.orderWalletPayPrice
+                trendSummary?.value?.walletPayPrice,
+                trendSummary?.reference?.walletPayPrice
               )
             "
           />

From e3a0cfe5e934f2d4863012821545864c845cdbf2 Mon Sep 17 00:00:00 2001
From: owen <owen@evolsun.com>
Date: Mon, 16 Oct 2023 22:18:51 +0800
Subject: [PATCH 3/4] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=EF=BC=9A=E4=BF=AE?=
 =?UTF-8?q?=E5=A4=8D=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/mall/home/components/OperationDataCard.vue | 2 +-
 src/views/mall/home/components/TradeTrendCard.vue    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/views/mall/home/components/OperationDataCard.vue b/src/views/mall/home/components/OperationDataCard.vue
index 3efac9bf..b905203b 100644
--- a/src/views/mall/home/components/OperationDataCard.vue
+++ b/src/views/mall/home/components/OperationDataCard.vue
@@ -70,7 +70,7 @@ const getProductData = async () => {
 
 /** 查询钱包充值数据 */
 const getWalletRechargeData = async () => {
-  const paySummary = await PayStatisticsApi.getWalletRechargePrice();
+  const paySummary = await PayStatisticsApi.getWalletRechargePrice()
   data.rechargePrice.value = paySummary.rechargePrice
 }
 
diff --git a/src/views/mall/home/components/TradeTrendCard.vue b/src/views/mall/home/components/TradeTrendCard.vue
index 6aa9fdcc..a8cab828 100644
--- a/src/views/mall/home/components/TradeTrendCard.vue
+++ b/src/views/mall/home/components/TradeTrendCard.vue
@@ -186,7 +186,7 @@ const getOrderCountTrendComparison = async (
     dates.push(item.value.date)
     if (series.length === 2) {
       series[0].data.push(fenToYuan(item?.value?.orderPayPrice || 0)) // 当前金额
-      series[1].data.push(fenToYuan(item?.value?.orderPayCount || 0)) // 对照数量
+      series[1].data.push(fenToYuan(item?.value?.orderPayCount || 0)) // 当前数量
     } else {
       series[0].data.push(fenToYuan(item?.reference?.orderPayPrice || 0)) // 对照金额
       series[1].data.push(fenToYuan(item?.value?.orderPayPrice || 0)) // 当前金额

From 6fc232b758f5d540389be60367b6866ded7ec5aa Mon Sep 17 00:00:00 2001
From: owen <owen@evolsun.com>
Date: Tue, 17 Oct 2023 16:09:36 +0800
Subject: [PATCH 4/4] =?UTF-8?q?=E4=BA=A4=E6=98=93=EF=BC=9A=E8=AE=A2?=
 =?UTF-8?q?=E5=8D=95=E6=A0=B8=E9=94=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/mall/trade/order/index.ts             |  41 +++++--
 src/views/mall/trade/order/detail/index.vue   |   9 +-
 .../mall/trade/order/form/OrderPickUpForm.vue | 108 ++++++++++++++++++
 src/views/mall/trade/order/index.vue          |  12 ++
 4 files changed, 160 insertions(+), 10 deletions(-)
 create mode 100644 src/views/mall/trade/order/form/OrderPickUpForm.vue

diff --git a/src/api/mall/trade/order/index.ts b/src/api/mall/trade/order/index.ts
index ea78275f..999757bd 100644
--- a/src/api/mall/trade/order/index.ts
+++ b/src/api/mall/trade/order/index.ts
@@ -1,6 +1,7 @@
 import request from '@/config/axios'
 
 export interface OrderVO {
+  // ========== 订单基本信息 ==========
   id?: number | null // 订单编号
   no?: string // 订单流水号
   createTime?: Date | null // 下单时间
@@ -15,35 +16,43 @@ export interface OrderVO {
   cancelTime?: Date | null // 订单取消时间
   cancelType?: number | null // 取消类型
   remark?: string // 商家备注
+
+  // ========== 价格 + 支付基本信息 ==========
   payOrderId?: number | null // 支付订单编号
-  payed?: boolean // 是否已支付
+  payStatus?: boolean // 是否已支付
   payTime?: Date | null // 付款时间
   payChannelCode?: string // 支付渠道
   totalPrice?: number | null // 商品原价(总)
-  orderPrice?: number | null // 订单原价(总)
   discountPrice?: number | null // 订单优惠(总)
   deliveryPrice?: number | null // 运费金额
   adjustPrice?: number | null // 订单调价(总)
   payPrice?: number | null // 应付金额(总)
+  // ========== 收件 + 物流基本信息 ==========
   deliveryType?: number | null // 发货方式
+  pickUpStoreId?: number // 自提门店编号
+  pickUpVerifyCode?: string // 自提核销码
   deliveryTemplateId?: number | null // 配送模板编号
-  logisticsId?: number | null | null // 发货物流公司编号
+  logisticsId?: number | null // 发货物流公司编号
   logisticsNo?: string // 发货物流单号
-  deliveryStatus?: number | null // 发货状态
   deliveryTime?: Date | null // 发货时间
   receiveTime?: Date | null // 收货时间
   receiverName?: string // 收件人名称
   receiverMobile?: string // 收件人手机
-  receiverAreaId?: number | null // 收件人地区编号
   receiverPostCode?: number | null // 收件人邮编
+  receiverAreaId?: number | null // 收件人地区编号
+  receiverAreaName?: string //收件人地区名字
   receiverDetailAddress?: string // 收件人详细地址
+
+  // ========== 售后基本信息 ==========
   afterSaleStatus?: number | null // 售后状态
   refundPrice?: number | null // 退款金额
+
+  // ========== 营销基本信息 ==========
   couponId?: number | null // 优惠劵编号
   couponPrice?: number | null // 优惠劵减免金额
-  vipPrice?: number | null // VIP 减免金额
   pointPrice?: number | null // 积分抵扣的金额
-  receiverAreaName?: string //收件人地区名字
+  vipPrice?: number | null // VIP 减免金额
+
   items?: OrderItemRespVO[] // 订单项列表
   // 下单用户信息
   user?: {
@@ -142,5 +151,21 @@ export const updateOrderAddress = async (data: any) => {
 
 // 订单核销
 export const pickUpOrder = async (id: number) => {
-  return await request.put({ url: `/trade/order/pick-up?id=${id}` })
+  return await request.put({ url: `/trade/order/pick-up-by-id?id=${id}` })
+}
+
+// 订单核销
+export const pickUpOrderByVerifyCode = async (pickUpVerifyCode: string) => {
+  return await request.put({
+    url: `/trade/order/pick-up-by-verify-code`,
+    params: { pickUpVerifyCode }
+  })
+}
+
+// 查询核销码对应的订单
+export const getOrderByPickUpVerifyCode = async (pickUpVerifyCode: string) => {
+  return await request.get<OrderVO>({
+    url: `/trade/order/get-by-pick-up-verify-code`,
+    params: { pickUpVerifyCode }
+  })
 }
diff --git a/src/views/mall/trade/order/detail/index.vue b/src/views/mall/trade/order/detail/index.vue
index 58939dbc..a68eecbc 100644
--- a/src/views/mall/trade/order/detail/index.vue
+++ b/src/views/mall/trade/order/detail/index.vue
@@ -54,7 +54,7 @@
           </el-button>
           <!-- 到店自提 -->
           <el-button
-            v-if="formData.deliveryType === DeliveryTypeEnum.PICK_UP.type"
+            v-if="formData.deliveryType === DeliveryTypeEnum.PICK_UP.type && showPickUp"
             type="primary"
             @click="handlePickUp"
           >
@@ -235,6 +235,7 @@ import * as DeliveryExpressApi from '@/api/mall/trade/delivery/express'
 import { useTagsViewStore } from '@/store/modules/tagsView'
 import { DeliveryTypeEnum, TradeOrderStatusEnum } from '@/utils/constants'
 import * as DeliveryPickUpStoreApi from '@/api/mall/trade/delivery/pickUpStore'
+import { propTypes } from '@/utils/propTypes'
 
 defineOptions({ name: 'TradeOrderDetail' })
 
@@ -294,8 +295,12 @@ const handlePickUp = async () => {
 
 /** 获得详情 */
 const { params } = useRoute() // 查询参数
+const props = defineProps({
+  id: propTypes.number.def(undefined), // 订单ID
+  showPickUp: propTypes.bool.def(true) // 显示核销按钮
+})
+const id = (params.id || props.id) as unknown as number
 const getDetail = async () => {
-  const id = params.id as unknown as number
   if (id) {
     const res = (await TradeOrderApi.getOrder(id)) as TradeOrderApi.OrderVO
     // 没有表单信息则关闭页面返回
diff --git a/src/views/mall/trade/order/form/OrderPickUpForm.vue b/src/views/mall/trade/order/form/OrderPickUpForm.vue
new file mode 100644
index 00000000..529263c4
--- /dev/null
+++ b/src/views/mall/trade/order/form/OrderPickUpForm.vue
@@ -0,0 +1,108 @@
+<template>
+  <!-- 核销对话框 -->
+  <Dialog v-model="dialogVisible" title="订单核销" width="35%">
+    <el-form
+      ref="formRef"
+      v-loading="formLoading"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
+    >
+      <el-form-item prop="pickUpVerifyCode" label="核销码">
+        <el-input v-model="formData.pickUpVerifyCode" placeholder="请输入核销码" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button type="primary" :disabled="formLoading" @click="getOrderByPickUpVerifyCode">
+        查询
+      </el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+  <!-- 核销确认对话框 -->
+  <Dialog v-model="detailDialogVisible" title="订单详情" width="55%">
+    <TradeOrderDetail v-if="orderDetails.id" :id="orderDetails.id" :show-pick-up="false" />
+    <template #footer>
+      <el-button type="primary" :disabled="formLoading" @click="submitForm"> 确认核销 </el-button>
+      <el-button @click="detailDialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+<script lang="ts" setup>
+import * as TradeOrderApi from '@/api/mall/trade/order'
+import { OrderVO } from '@/api/mall/trade/order'
+import { DeliveryTypeEnum, TradeOrderStatusEnum } from '@/utils/constants'
+import TradeOrderDetail from '@/views/mall/trade/order/detail/index.vue'
+
+/** 订单核销表单 */
+defineOptions({ name: 'OrderPickUpForm' })
+
+const message = useMessage() // 消息弹窗
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const detailDialogVisible = ref(false) // 详情弹窗的是否展示
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formRules = reactive({
+  pickUpVerifyCode: [{ required: true, message: '核销码不能为空', trigger: 'blur' }]
+})
+const formData = ref({
+  pickUpVerifyCode: '' // 核销码
+})
+const formRef = ref() // 表单 Ref
+const orderDetails = ref<OrderVO>({})
+
+/** 打开弹窗 */
+const open = async () => {
+  resetForm()
+  dialogVisible.value = true
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 提交请求
+  formLoading.value = true
+  try {
+    await TradeOrderApi.pickUpOrderByVerifyCode(formData.value.pickUpVerifyCode)
+    message.success('核销成功')
+    detailDialogVisible.value = false
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success', true)
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    pickUpVerifyCode: '' // 核销码
+  }
+  formRef.value?.resetFields()
+}
+
+/** 查询核销码对应的订单 */
+const getOrderByPickUpVerifyCode = async () => {
+  // 校验表单
+  if (!formRef) return
+  const valid = await formRef.value.validate()
+  if (!valid) return
+
+  formLoading.value = true
+  const data = await TradeOrderApi.getOrderByPickUpVerifyCode(formData.value.pickUpVerifyCode)
+  formLoading.value = false
+  if (data?.deliveryType !== DeliveryTypeEnum.PICK_UP.type) {
+    message.error('请输入正确的核销码')
+    return
+  }
+  if (data?.status !== TradeOrderStatusEnum.UNDELIVERED.status) {
+    message.error('订单不是待核销状态')
+    return
+  }
+  orderDetails.value = data
+  // 显示详情对话框
+  detailDialogVisible.value = true
+}
+</script>
diff --git a/src/views/mall/trade/order/index.vue b/src/views/mall/trade/order/index.vue
index 33d98548..653bfcb9 100644
--- a/src/views/mall/trade/order/index.vue
+++ b/src/views/mall/trade/order/index.vue
@@ -156,6 +156,10 @@
           <Icon class="mr-5px" icon="ep:refresh" />
           重置
         </el-button>
+        <el-button @click="handlePickup" type="success" plain>
+          <Icon class="mr-5px" icon="ep:check" />
+          核销
+        </el-button>
       </el-form-item>
     </el-form>
   </ContentWrap>
@@ -347,6 +351,7 @@
   <!-- 各种操作的弹窗 -->
   <OrderDeliveryForm ref="deliveryFormRef" @success="getList" />
   <OrderUpdateRemarkForm ref="updateRemarkForm" @success="getList" />
+  <OrderPickUpForm ref="pickUpForm" @success="getList" />
 </template>
 
 <script lang="ts" setup>
@@ -361,6 +366,7 @@ import { floatToFixed2 } from '@/utils'
 import { createImageViewer } from '@/components/ImageViewer'
 import * as DeliveryExpressApi from '@/api/mall/trade/delivery/express'
 import { DeliveryTypeEnum, TradeOrderStatusEnum } from '@/utils/constants'
+import OrderPickUpForm from './form/OrderPickUpForm.vue'
 
 defineOptions({ name: 'TradeOrder' })
 
@@ -521,6 +527,12 @@ watch(
   }
 )
 
+/** 显示核销表单 */
+const pickUpForm = ref()
+const handlePickup = () => {
+  pickUpForm.value.open()
+}
+
 const pickUpStoreList = ref([]) // 自提门店精简列表
 const deliveryExpressList = ref([]) // 物流公司
 /** 初始化 **/