|
|
@@ -1,18 +1,27 @@
|
|
|
-<script setup lang="ts">
|
|
|
-import { ref } from 'vue';
|
|
|
+<script setup lang="tsx">
|
|
|
+import { onMounted, ref } from 'vue';
|
|
|
import { useRoute } from 'vue-router';
|
|
|
// import { NFlex } from 'naive-ui';
|
|
|
+import { NDataTable } from 'naive-ui';
|
|
|
import dayjs from 'dayjs';
|
|
|
import duration from 'dayjs/plugin/duration';
|
|
|
-import { fetchGetNomalOrderInfo } from '@/service/api/order-manage/normal-order';
|
|
|
+import {
|
|
|
+ fetchDeliveryNode,
|
|
|
+ fetchDeliveryOrder,
|
|
|
+ fetchExpressDeliveryList,
|
|
|
+ fetchGetNomalOrderInfo
|
|
|
+} from '@/service/api/order-manage/normal-order';
|
|
|
+import { useModalFrom } from '@/components/zt/ModalForm/hooks/useModalForm';
|
|
|
// import { useAppStore } from '@/store/modules/app';
|
|
|
// import { copyTextToClipboard } from '@/utils/zt';
|
|
|
import {
|
|
|
businessType,
|
|
|
chargeMethod,
|
|
|
+ dvyStatus,
|
|
|
orderColumns,
|
|
|
orderDJKColumns,
|
|
|
orderDJKLogColumns,
|
|
|
+ orderShipColumns,
|
|
|
orderStatus,
|
|
|
orderStatusEnum,
|
|
|
payType,
|
|
|
@@ -24,22 +33,142 @@ const orderInfo = ref<Api.delivery.deliveryOrder>();
|
|
|
const TimeDown = ref<number>(0);
|
|
|
dayjs.extend(duration);
|
|
|
const route = useRoute();
|
|
|
+const deliveryNode = ref<any[]>([]);
|
|
|
+const [
|
|
|
+ registerModalForm,
|
|
|
+ {
|
|
|
+ openModal: openModalForm,
|
|
|
+ setFieldsValue: setModalFormValue,
|
|
|
+ getFieldsValue: getModalFormValue,
|
|
|
+ closeModal: closeModalForm,
|
|
|
+ setSubLoading
|
|
|
+ }
|
|
|
+] = useModalFrom({
|
|
|
+ modalConfig: {
|
|
|
+ title: '订单发货',
|
|
|
+ isShowHeaderText: false,
|
|
|
+ width: 1000,
|
|
|
+ height: 700
|
|
|
+ },
|
|
|
+ formConfig: {
|
|
|
+ schemas: [
|
|
|
+ {
|
|
|
+ field: 'orderNumber',
|
|
|
+ label: '',
|
|
|
+ component: 'NInput',
|
|
|
+ render: () => {
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <div class="py-20px font-semibold">商品信息</div>
|
|
|
+ <NDataTable columns={orderShipColumns} data={orderInfo.value?.orderItemList} bordered={false} />
|
|
|
+
|
|
|
+ <div class="py-20px font-semibold">订单信息</div>
|
|
|
+ <div>配送方式:{dvyStatus[orderInfo.value?.dvyType as keyof typeof dvyStatus]}</div>
|
|
|
+ <div>收货人姓名:{orderInfo.value?.consigneeName}</div>
|
|
|
+ <div>收货人手机号:{orderInfo.value?.consigneeMobile}</div>
|
|
|
+ <div>收货地址:{orderInfo.value?.consigneeAddress}</div>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ field: 'orderNumber',
|
|
|
+ label: '单号',
|
|
|
+ component: 'NInput',
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+
|
|
|
+ {
|
|
|
+ field: 'deliveryType',
|
|
|
+ component: 'NRadioGroup',
|
|
|
+ label: '发货方式',
|
|
|
+ required: true,
|
|
|
+ defaultValue: 1,
|
|
|
+ componentProps: {
|
|
|
+ options: [
|
|
|
+ {
|
|
|
+ label: '快递',
|
|
|
+ value: 0
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '其他',
|
|
|
+ value: 1
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '快递公司',
|
|
|
+ field: 'dvyId',
|
|
|
+ required: true,
|
|
|
+ component: 'ApiSelect',
|
|
|
+ componentProps: {
|
|
|
+ api: fetchExpressDeliveryList,
|
|
|
+ labelFeild: 'name',
|
|
|
+ valueFeild: 'id'
|
|
|
+ },
|
|
|
+
|
|
|
+ ifShow({ model }) {
|
|
|
+ return model.deliveryType === 0;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ field: 'dvyFlowId',
|
|
|
+ label: '快递单号',
|
|
|
+ required: true,
|
|
|
+ component: 'NInput',
|
|
|
+
|
|
|
+ ifShow({ model }) {
|
|
|
+ return model.deliveryType === 0;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ field: 'remark',
|
|
|
+ label: '备注',
|
|
|
+ required: true,
|
|
|
+ component: 'NInput',
|
|
|
+ ifShow({ model }) {
|
|
|
+ return model.deliveryType === 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ labelWidth: 80,
|
|
|
+ layout: 'horizontal',
|
|
|
+ gridProps: {
|
|
|
+ cols: '1',
|
|
|
+ itemResponsive: true
|
|
|
+ }
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
async function open(orderNumber: string) {
|
|
|
const { data, error } = await fetchGetNomalOrderInfo(orderNumber);
|
|
|
if (!error) {
|
|
|
orderInfo.value = data;
|
|
|
- if (orderInfo.value.hbLogisticStatus == orderStatusEnum.WAIT_PAY) {
|
|
|
+ if (orderInfo.value.hbOrderStatus == orderStatusEnum.WAIT_PAY) {
|
|
|
const createTime = dayjs(orderInfo.value.createTime);
|
|
|
const currentTime = dayjs();
|
|
|
const elapsed = currentTime.diff(createTime);
|
|
|
const fifteenMinutesInMillis = 15 * 60 * 1000;
|
|
|
TimeDown.value = fifteenMinutesInMillis - elapsed;
|
|
|
+ } else if (
|
|
|
+ orderInfo.value.hbOrderStatus !== orderStatusEnum.ORDER_DELIVERY &&
|
|
|
+ orderInfo.value.businessType == 'XSB'
|
|
|
+ ) {
|
|
|
+ getDeliveryNode();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
console.log(route.query.orderNumber);
|
|
|
+async function getDeliveryNode() {
|
|
|
+ const { data, error } = await fetchDeliveryNode({ orderNumber: String(route.query.orderNumber) });
|
|
|
+
|
|
|
+ if (!error) {
|
|
|
+ deliveryNode.value = data;
|
|
|
+ console.log(data, '节点信息');
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
-open(String(route.query.orderNumber));
|
|
|
defineExpose({ open });
|
|
|
|
|
|
// const isRefund = computed(() => {
|
|
|
@@ -88,6 +217,46 @@ function secondsToTime(seconds: number) {
|
|
|
}
|
|
|
return `00:${formatTime(minutes)}:${formatTime(secs)}`;
|
|
|
}
|
|
|
+
|
|
|
+function handleShip() {
|
|
|
+ openModalForm();
|
|
|
+ setModalFormValue({
|
|
|
+ orderNumber: orderInfo.value?.orderNumber,
|
|
|
+ dvyId: orderInfo.value?.dvyId,
|
|
|
+ dvyFlowId: orderInfo.value?.dvyFlowId,
|
|
|
+ deliveryType: orderInfo.value?.deliveryType || 0,
|
|
|
+ remark: orderInfo.value?.dvyName
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+async function handleSubmit() {
|
|
|
+ const form = await getModalFormValue();
|
|
|
+ if (form.deliveryType == 0) {
|
|
|
+ delete form.remark;
|
|
|
+ } else {
|
|
|
+ delete form.dvyId;
|
|
|
+ delete form.dvyFlowId;
|
|
|
+ }
|
|
|
+ console.log(form, '表单');
|
|
|
+ const { error } = await fetchDeliveryOrder(form);
|
|
|
+ if (!error) {
|
|
|
+ window.$message?.success('保存成功');
|
|
|
+ }
|
|
|
+ setSubLoading(false);
|
|
|
+ closeModalForm();
|
|
|
+ open(String(route.query.orderNumber));
|
|
|
+}
|
|
|
+
|
|
|
+function handleFinish() {
|
|
|
+ open(String(orderInfo.value?.orderNumber));
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(async () => {
|
|
|
+ await open(String(route.query.orderNumber));
|
|
|
+ if (route.query.type == 'ship') {
|
|
|
+ handleShip();
|
|
|
+ }
|
|
|
+});
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
@@ -112,12 +281,12 @@ function secondsToTime(seconds: number) {
|
|
|
订单状态:
|
|
|
<template v-if="orderInfo.businessType != 'DYY'">
|
|
|
{{
|
|
|
- orderInfo.hbOrderStatus == 20 ||
|
|
|
- orderInfo.hbOrderStatus == 30 ||
|
|
|
- orderInfo.hbOrderStatus == 40 ||
|
|
|
- orderInfo.hbOrderStatus == 70
|
|
|
- ? '进行中'
|
|
|
- : orderStatus[orderInfo.hbOrderStatus as keyof typeof orderStatus]
|
|
|
+ orderInfo.hbOrderStatus == 20 ||
|
|
|
+ orderInfo.hbOrderStatus == 30 ||
|
|
|
+ orderInfo.hbOrderStatus == 40 ||
|
|
|
+ orderInfo.hbOrderStatus == 70
|
|
|
+ ? '进行中'
|
|
|
+ : orderStatus[orderInfo.hbOrderStatus as keyof typeof orderStatus]
|
|
|
}}
|
|
|
</template>
|
|
|
<template v-else>
|
|
|
@@ -142,7 +311,9 @@ function secondsToTime(seconds: number) {
|
|
|
</NCard>
|
|
|
<NCard size="small" class="mt-20px" title="支付信息" :bordered="false">
|
|
|
<div>支付状态:{{ orderInfo.isPayed ? '已支付' : '未支付' }}</div>
|
|
|
- <div>支付金额:{{ orderInfo.actualTotal }}元</div>
|
|
|
+ <div v-if="orderInfo.businessType == 'JY'">支付金额:{{ orderInfo.omsOrderOilVO?.realMoney || '---' }}元</div>
|
|
|
+
|
|
|
+ <div v-else>支付金额:{{ orderInfo.actualTotal }}元</div>
|
|
|
<div>
|
|
|
付款方式:{{
|
|
|
orderInfo.hbOrderStatus == orderStatusEnum.WAIT_PAY ||
|
|
|
@@ -157,17 +328,34 @@ function secondsToTime(seconds: number) {
|
|
|
</NCard>
|
|
|
</div>
|
|
|
<div class="flex-1">
|
|
|
- <div class="flex">
|
|
|
- <div class="mb-10px text-16px font-semibold">
|
|
|
- 业务状态:
|
|
|
- <template v-if="orderInfo.businessType != 'DYY'">
|
|
|
- {{ orderStatus[orderInfo.hbOrderStatus as keyof typeof orderStatus] }}
|
|
|
- </template>
|
|
|
- <template v-else>
|
|
|
- {{ yppStatus[orderInfo.yppDetail?.orderState as keyof typeof yppStatus] }}
|
|
|
- </template>
|
|
|
+ <div class="flex justify-between">
|
|
|
+ <div class="flex">
|
|
|
+ <div class="mb-10px text-16px font-semibold">
|
|
|
+ 业务状态:
|
|
|
+ <template v-if="orderInfo.businessType != 'DYY'">
|
|
|
+ {{ orderStatus[orderInfo.hbOrderStatus as keyof typeof orderStatus] }}
|
|
|
+ {{ orderInfo.deliveryType && orderInfo.deliveryType == 1 ? '(已发货 其他方式)' : '' }}
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ {{ yppStatus[orderInfo.yppDetail?.orderState as keyof typeof yppStatus] }}
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ <div v-if="orderInfo.hbOrderStatus == orderStatusEnum.WAIT_PAY" class="text-gray">
|
|
|
+ 如买家未在
|
|
|
+ <NTag :type="TimeDown > 300094 ? 'success' : 'error'">
|
|
|
+ <NCountdown :duration="TimeDown" @finish="handleFinish" />
|
|
|
+ </NTag>
|
|
|
+ 内付款,订单将 自动关闭。
|
|
|
+ </div>
|
|
|
+ <div v-else class="mb-10px ml-20px text-16px font-semibold">
|
|
|
+ 第三方订单编号:{{ orderInfo.thirdOrderId }}
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div class="mb-10px ml-20px text-16px font-semibold">第三方订单编号:{{ orderInfo.thirdOrderId }}</div>
|
|
|
+
|
|
|
+ <!-- v-if="orderInfo.dvyType === 10 && orderInfo.hbOrderStatus === 40" -->
|
|
|
+ <NButton size="small" type="primary" @click="handleShip">
|
|
|
+ {{ orderInfo.dvyNo ? '修改发货信息' : '发货' }}
|
|
|
+ </NButton>
|
|
|
</div>
|
|
|
<NCard size="small" title="业务信息" :bordered="false">
|
|
|
<template v-if="orderInfo.businessType == 'XSB'">
|
|
|
@@ -213,6 +401,20 @@ function secondsToTime(seconds: number) {
|
|
|
</NTr>
|
|
|
</NTbody>
|
|
|
</NTable>
|
|
|
+
|
|
|
+ <template v-if="orderInfo.dvyType == 3 && orderInfo.hbOrderStatus != orderStatusEnum.WAIT_PAY">
|
|
|
+ <div class="py-20px font-semibold">03 订单追踪</div>
|
|
|
+ <div v-if="orderInfo.deliveryType == 1">信息记录:{{ orderInfo.dvyName || '暂无' }}</div>
|
|
|
+ <NTimeline v-else>
|
|
|
+ <NTimelineItem
|
|
|
+ v-for="(item, index) in deliveryNode"
|
|
|
+ :key="item.id"
|
|
|
+ :type="index == 0 ? 'success' : undefined"
|
|
|
+ :content="item.content"
|
|
|
+ :time="item.updateTime"
|
|
|
+ />
|
|
|
+ </NTimeline>
|
|
|
+ </template>
|
|
|
</template>
|
|
|
<template v-else-if="orderInfo.businessType == 'DYY'">
|
|
|
<div class="pb-20px font-semibold">01 影片与场次信息</div>
|
|
|
@@ -286,6 +488,7 @@ function secondsToTime(seconds: number) {
|
|
|
<template v-else-if="orderInfo.businessType == 'CD'">
|
|
|
<div class="flex flex-wrap items-center">
|
|
|
<div class="mr10px flex-shrink-0">
|
|
|
+ <div>车牌号:{{ orderInfo.chargeOrder.plateNum || '--' }}</div>
|
|
|
<div>终端编号:{{ orderInfo.chargeOrder.connectorId || '--' }}</div>
|
|
|
<div>充电电站:{{ orderInfo.chargeOrder.powerStationName || '--' }}</div>
|
|
|
<div>充电开始时间:{{ orderInfo.chargeOrder.startTime || '--' }}</div>
|
|
|
@@ -323,8 +526,18 @@ function secondsToTime(seconds: number) {
|
|
|
</NTr>
|
|
|
<NTr>
|
|
|
<NTd>积分抵扣</NTd>
|
|
|
- <NTd>{{ orderInfo.actualTotal }}</NTd>
|
|
|
- <!-- <NTd>{{ orderInfo.actualTotal - orderInfo.platformVolume }}</NTd> -->
|
|
|
+ <!-- <NTd>{{ orderInfo.actualTotal }}</NTd> -->
|
|
|
+ <NTd>
|
|
|
+ -{{
|
|
|
+ (
|
|
|
+ Number(orderInfo?.actualTotal || 0) - Number(orderInfo?.chargeOrder?.platformVolume || 0)
|
|
|
+ ).toFixed(2)
|
|
|
+ }}
|
|
|
+ </NTd>
|
|
|
+ </NTr>
|
|
|
+ <NTr>
|
|
|
+ <NTd>平台券</NTd>
|
|
|
+ <NTd>-{{ Number(orderInfo?.chargeOrder?.platformVolume || 0) }}</NTd>
|
|
|
</NTr>
|
|
|
</NTbody>
|
|
|
</NTable>
|
|
|
@@ -421,12 +634,12 @@ function secondsToTime(seconds: number) {
|
|
|
<div>加油量:{{ orderInfo.omsOrderOilVO?.quantity + 'L' || '---' }}</div>
|
|
|
|
|
|
<div class="mt-20px pb-20px font-semibold">04 加油明细</div>
|
|
|
- <div>门店价:{{ orderInfo.omsOrderOilVO?.storePrice || '---' }}</div>
|
|
|
- <div>平台价:{{ orderInfo.omsOrderOilVO?.vipPrice || '---' }}</div>
|
|
|
- <div>订单金额:{{ orderInfo.omsOrderOilVO?.totalMoney || '---' }}</div>
|
|
|
- <div>抵扣金额:{{ orderInfo.omsOrderOilVO?.promotionAmount || '---' }}</div>
|
|
|
- <div>服务费:{{ orderInfo.omsOrderOilVO?.serviceFee || '---' }}</div>
|
|
|
- <div>实付金额:{{ orderInfo.omsOrderOilVO?.realMoney || '---' }}</div>
|
|
|
+ <div>门店价:¥{{ orderInfo.omsOrderOilVO?.storePrice || '---' }}/L</div>
|
|
|
+ <div>平台价:¥{{ orderInfo.omsOrderOilVO?.vipPrice || '---' }}/L</div>
|
|
|
+ <div>订单金额:¥{{ orderInfo.omsOrderOilVO?.totalMoney || '---' }}</div>
|
|
|
+ <div>抵扣金额:-¥{{ orderInfo.omsOrderOilVO?.promotionAmount || '---' }}</div>
|
|
|
+ <div>服务费:+¥{{ orderInfo.omsOrderOilVO?.serviceFee || '---' }}</div>
|
|
|
+ <div>实付金额:¥{{ orderInfo.omsOrderOilVO?.realMoney || '---' }}</div>
|
|
|
|
|
|
<div class="mt-20px pb-20px font-semibold">05 抵扣信息</div>
|
|
|
<div>抵扣券ID:{{ orderInfo.omsOrderOilVO?.allowanceId || '---' }}</div>
|
|
|
@@ -435,6 +648,8 @@ function secondsToTime(seconds: number) {
|
|
|
</NCard>
|
|
|
</div>
|
|
|
</div>
|
|
|
+
|
|
|
+ <BasicModelForm @register-modal-form="registerModalForm" @submit-form="handleSubmit"></BasicModelForm>
|
|
|
</div>
|
|
|
</template>
|
|
|
|