index.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. <script setup lang="ts">
  2. import { ref } from 'vue';
  3. import { useRoute } from 'vue-router';
  4. // import { NFlex } from 'naive-ui';
  5. import dayjs from 'dayjs';
  6. import duration from 'dayjs/plugin/duration';
  7. import { fetchGetNomalOrderInfo } from '@/service/api/order-manage/normal-order';
  8. // import { useAppStore } from '@/store/modules/app';
  9. // import { copyTextToClipboard } from '@/utils/zt';
  10. import {
  11. businessType,
  12. chargeMethod,
  13. orderColumns,
  14. orderDJKColumns,
  15. orderDJKLogColumns,
  16. orderStatus,
  17. orderStatusEnum,
  18. payType,
  19. yppStatus,
  20. yppStatusEnum
  21. } from '../normal-order/normal-order';
  22. const orderInfo = ref<Api.delivery.deliveryOrder>();
  23. // const appStore = useAppStore();
  24. const TimeDown = ref<number>(0);
  25. dayjs.extend(duration);
  26. const route = useRoute();
  27. async function open(orderNumber: string) {
  28. const { data, error } = await fetchGetNomalOrderInfo(orderNumber);
  29. if (!error) {
  30. orderInfo.value = data;
  31. if (orderInfo.value.hbLogisticStatus == orderStatusEnum.WAIT_PAY) {
  32. const createTime = dayjs(orderInfo.value.createTime);
  33. const currentTime = dayjs();
  34. const elapsed = currentTime.diff(createTime);
  35. const fifteenMinutesInMillis = 15 * 60 * 1000;
  36. TimeDown.value = fifteenMinutesInMillis - elapsed;
  37. }
  38. }
  39. }
  40. console.log(route.query.orderNumber);
  41. open(String(route.query.orderNumber));
  42. defineExpose({ open });
  43. // const isRefund = computed(() => {
  44. // const goodsData = orderInfo.value?.orderItems?.find(it => it.refundIngCount == 1);
  45. // return Boolean(goodsData);
  46. // });
  47. // const currentSteps = computed(() => {
  48. // switch (orderInfo.value?.hbOrderStatus) {
  49. // case orderStatusEnum.WAIT_PAY:
  50. // return 1;
  51. // case orderStatusEnum.ORDER_ACCEPT:
  52. // return 2;
  53. // case orderStatusEnum.ORDER_WAIT_DELIVE RY:
  54. // return 2;
  55. // case orderStatusEnum.WAIT_DELIVERY:
  56. // return 2;
  57. // case orderStatusEnum.ORDER_DELIVERY:
  58. // return 3;
  59. // case orderStatusEnum.ORDER_ARRIVE:
  60. // return 3;
  61. // case orderStatusEnum.ORDER_COMPLETE:
  62. // return 4;
  63. // default:
  64. // return 1;
  65. // }
  66. // });
  67. // function handleCopy(value: string | number | undefined) {
  68. // copyTextToClipboard(String(value));
  69. // // copyTextToClipboard(String(orderInfo.value?.orderNumber));
  70. // }
  71. function secondsToTime(seconds: number) {
  72. // 创建 duration 对象
  73. const time = dayjs.duration(seconds, 'seconds');
  74. // 获取时分秒
  75. const hours = Math.floor(seconds / 3600);
  76. const minutes = time.minutes();
  77. const secs = time.seconds();
  78. // 格式化为两位数字符串
  79. const formatTime = (num: number) => num.toString().padStart(2, '0');
  80. if (hours > 0) {
  81. return `${formatTime(hours)}:${formatTime(minutes)}:${formatTime(secs)}`;
  82. }
  83. return `00:${formatTime(minutes)}:${formatTime(secs)}`;
  84. }
  85. </script>
  86. <template>
  87. <div>
  88. <div v-if="orderInfo" class="flex">
  89. <div class="mr-20px w-300px">
  90. <div class="mb-10px text-16px font-semibold">
  91. 统一状态:
  92. <template v-if="orderInfo.businessType != 'DYY'">
  93. {{ orderStatus[orderInfo.hbOrderStatus as keyof typeof orderStatus] }}
  94. </template>
  95. <template v-else>
  96. {{ yppStatus[orderInfo.yppDetail?.orderState as keyof typeof yppStatus] }}
  97. </template>
  98. </div>
  99. <NCard size="small" title="订单概览" :bordered="false">
  100. <div>订单编号:{{ orderInfo.orderNumber }}</div>
  101. <div>
  102. 业务类型:{{ businessType[orderInfo.businessType as keyof typeof businessType] || orderInfo.businessType }}
  103. </div>
  104. <div>
  105. 订单状态:
  106. <template v-if="orderInfo.businessType != 'DYY'">
  107. {{
  108. orderInfo.hbOrderStatus == 20 ||
  109. orderInfo.hbOrderStatus == 30 ||
  110. orderInfo.hbOrderStatus == 40 ||
  111. orderInfo.hbOrderStatus == 70
  112. ? '进行中'
  113. : orderStatus[orderInfo.hbOrderStatus as keyof typeof orderStatus]
  114. }}
  115. </template>
  116. <template v-else>
  117. {{ yppStatus[orderInfo.yppDetail?.orderState as keyof typeof yppStatus] }}
  118. </template>
  119. </div>
  120. <div>订单金额:{{ orderInfo.orderMoney }}</div>
  121. <div>订单创建:{{ orderInfo?.createTime || '暂无' }}</div>
  122. <div>创建人:用户自助下单</div>
  123. <div>备注:{{ orderInfo?.remarks || '暂无' }}</div>
  124. </NCard>
  125. <NCard size="small" class="mt-20px" title="客户信息" :bordered="false">
  126. <div>客户姓名:{{ orderInfo?.consigneeName || '---' }}</div>
  127. <div>客户手机号:{{ orderInfo?.consigneeMobile || '---' }}</div>
  128. <div>客户地址:{{ orderInfo?.consigneeAddress || '---' }}</div>
  129. <div>用户昵称:{{ orderInfo.userName || '---' }}</div>
  130. <div>用户电话:{{ orderInfo.consigneeMobile }}</div>
  131. <div>企业身份:{{ orderInfo.channelName || '---' }}</div>
  132. <div>会员等级:{{ orderInfo.level || '---' }}</div>
  133. <div>分销等级:{{ orderInfo.level || '---' }}</div>
  134. </NCard>
  135. <NCard size="small" class="mt-20px" title="支付信息" :bordered="false">
  136. <div>支付状态:{{ orderInfo.isPayed ? '已支付' : '未支付' }}</div>
  137. <div>支付金额:{{ orderInfo.actualTotal }}元</div>
  138. <div>
  139. 付款方式:{{
  140. orderInfo.hbOrderStatus == orderStatusEnum.WAIT_PAY ||
  141. orderInfo.hbOrderStatus == orderStatusEnum.ORDER_CANCEL
  142. ? '暂无'
  143. : '微信'
  144. }}
  145. </div>
  146. <div>支付时间:{{ orderInfo.payTime || '暂无' }}</div>
  147. <div>交易号:{{ orderInfo.outTradeNo || '---' }}</div>
  148. <div>退款记录:{{ orderInfo.record || '暂无' }}</div>
  149. </NCard>
  150. </div>
  151. <div class="flex-1">
  152. <div class="flex">
  153. <div class="mb-10px text-16px font-semibold">
  154. 业务状态:
  155. <template v-if="orderInfo.businessType != 'DYY'">
  156. {{ orderStatus[orderInfo.hbOrderStatus as keyof typeof orderStatus] }}
  157. </template>
  158. <template v-else>
  159. {{ yppStatus[orderInfo.yppDetail?.orderState as keyof typeof yppStatus] }}
  160. </template>
  161. </div>
  162. <div class="mb-10px ml-20px text-16px font-semibold">第三方订单编号:{{ orderInfo.orderNumber }}</div>
  163. </div>
  164. <NCard size="small" title="业务信息" :bordered="false">
  165. <template v-if="orderInfo.businessType == 'XSB'">
  166. <div class="pb-20px font-semibold">01 商家信息</div>
  167. <div>门店名称:{{ orderInfo.shopName || '暂无' }}</div>
  168. <div>门店地址:{{ orderInfo.shopAddress || '暂无' }}</div>
  169. <div>联系电话:{{ orderInfo.tel || '暂无' }}</div>
  170. <div class="py-20px font-semibold">02 商品&费用</div>
  171. <NDataTable :columns="orderColumns" :data="orderInfo.orderItemList" :bordered="false" />
  172. <NTable class="mt-20px" :single-line="false">
  173. <NThead>
  174. <NTr>
  175. <NTh>费用类型</NTh>
  176. <NTh>金额/元</NTh>
  177. </NTr>
  178. </NThead>
  179. <NTbody>
  180. <NTr>
  181. <NTd>商品总额</NTd>
  182. <NTd>{{ orderInfo.total }}</NTd>
  183. </NTr>
  184. <NTr>
  185. <NTd>配送费(快递)</NTd>
  186. <NTd>{{ orderInfo.freightAmount }}</NTd>
  187. </NTr>
  188. <NTr>
  189. <NTd>积分</NTd>
  190. <NTd>-{{ (Number(orderInfo.offsetPoints) / 100).toFixed(2) || 0 }}</NTd>
  191. </NTr>
  192. <NTr>
  193. <NTd v-if="orderInfo.hbOrderStatus == orderStatusEnum.WAIT_PAY">需付款</NTd>
  194. <NTd
  195. v-if="
  196. orderInfo.hbOrderStatus != orderStatusEnum.WAIT_PAY &&
  197. orderInfo.hbOrderStatus != orderStatusEnum.ORDER_CANCEL
  198. "
  199. >
  200. 实际付款
  201. </NTd>
  202. <NTd v-if="orderInfo.hbOrderStatus == orderStatusEnum.ORDER_CANCEL">应付款</NTd>
  203. <NTd>{{ orderInfo.actualTotal }}</NTd>
  204. </NTr>
  205. </NTbody>
  206. </NTable>
  207. </template>
  208. <template v-else-if="orderInfo.businessType == 'DYY'">
  209. <div class="pb-20px font-semibold">01 影片与场次信息</div>
  210. <div>影片名称:{{ orderInfo.yppDetail?.movieName || '暂无' }}</div>
  211. <div class="flex items-center justify-between">
  212. <div>影院名称:{{ orderInfo.yppDetail?.cinemaName || '--' }}</div>
  213. <div>影厅:{{ orderInfo.yppDetail?.hallName || '--' }}</div>
  214. </div>
  215. <div class="flex items-center justify-between">
  216. <div>放映时间:{{ orderInfo.yppDetail?.sessionBeginTime || '--' }}</div>
  217. <div>结束时间:{{ orderInfo.yppDetail?.sessionEndTime || '--' }}</div>
  218. </div>
  219. <div class="flex items-center justify-between">
  220. <div>版本类型:{{ orderInfo.yppDetail?.movieVersion || '--' }}</div>
  221. <div>语言:{{ orderInfo.yppDetail?.movieVersion || '--' }}</div>
  222. </div>
  223. <div class="flex items-center justify-between">
  224. <div>座位信息: {{ orderInfo.yppDetail?.seatNames || '--' }}</div>
  225. <div>快速票:{{ orderInfo.yppDetail?.buyModel ? '是' : '否' }}</div>
  226. </div>
  227. <div class="pb-20px font-semibold">02 价格与结算信息</div>
  228. <div v-if="yppStatusEnum.WAIT_PAY == orderInfo.yppDetail?.orderState" class="font-semibold">
  229. 【客户需支付信息】
  230. </div>
  231. <div
  232. :class="[
  233. yppStatusEnum.WAIT_PAY != orderInfo.yppDetail?.orderState ? 'flex items-center justify-between' : ''
  234. ]"
  235. >
  236. <div v-if="yppStatusEnum.WAIT_PAY != orderInfo.yppDetail?.orderState">
  237. <div class="font-semibold">【客户已支付信息】</div>
  238. <div>市场原价(单价):¥{{ orderInfo.yppDetail?.originPrice || '--' }}</div>
  239. <div>原票价总价:¥{{ orderInfo.yppDetail?.totalUserPrice || '--' }}</div>
  240. <div>积分抵扣: ¥{{ (Number(orderInfo.offsetPoints) / 100).toFixed(2) || 0 }}</div>
  241. <div>客户实际支付:¥{{ orderInfo.actualTotal }}</div>
  242. </div>
  243. <template v-if="yppStatusEnum.WAIT_PAY != orderInfo.yppDetail?.orderState">
  244. <div>
  245. <div class="font-semibold">【预存款结算信息】</div>
  246. <div>企业扣款价:¥--</div>
  247. <div>结算价已退金额:¥--</div>
  248. <div>订单成本价:¥--</div>
  249. </div>
  250. </template>
  251. </div>
  252. <template
  253. v-if="
  254. [yppStatusEnum.SUCCESS, yppStatusEnum.REFUND_FAIL].includes(orderInfo.yppDetail?.orderState as number)
  255. "
  256. >
  257. <div class="pb-20px font-semibold">03 取票与退款信息</div>
  258. <div v-if="yppStatusEnum.SUCCESS == orderInfo.yppDetail?.orderState" class="flex flex-wrap items-center">
  259. <div>
  260. <div>座位:{{ orderInfo.yppDetail?.seatNames }}</div>
  261. <div>取票码:{{ orderInfo.yppDetail?.ticketCode || '--' }}</div>
  262. </div>
  263. </div>
  264. <template v-if="yppStatusEnum.REFUND_FAIL == orderInfo.yppDetail?.orderState">
  265. <div class="flex">
  266. <div>退款金额:</div>
  267. <div>
  268. <div>{{ orderInfo.yppDetail?.epRefundAmount }}</div>
  269. <div class="text-gray">
  270. 退还金额:{{ orderInfo.yppDetail?.epRefundAmount }}元 退还积分:{{ orderInfo.offsetPoints }}
  271. </div>
  272. </div>
  273. </div>
  274. </template>
  275. </template>
  276. </template>
  277. <template v-else-if="orderInfo.businessType == 'CD'">
  278. <div class="flex flex-wrap items-center">
  279. <div class="mr10px flex-shrink-0">
  280. <div>终端编号:{{ orderInfo.chargeOrder.connectorId || '--' }}</div>
  281. <div>充电电站:{{ orderInfo.chargeOrder.powerStationName || '--' }}</div>
  282. <div>充电开始时间:{{ orderInfo.chargeOrder.startTime || '--' }}</div>
  283. <div>充电结束时间:{{ orderInfo.chargeOrder.endTime || '--' }}</div>
  284. <div>充电时长:{{ secondsToTime(Number(orderInfo.chargeOrder.chargeTime)) || '--' }}</div>
  285. <div>充电度数:{{ orderInfo.chargeOrder.totalPower || '--' }}</div>
  286. <div>
  287. 终止方式:{{ chargeMethod[orderInfo.chargeOrder.stopMethod as keyof typeof chargeMethod] || '--' }}
  288. </div>
  289. <div>详细地址:{{ orderInfo.chargeOrder.powerStationName?.split('-')[0] || '--' }}</div>
  290. </div>
  291. <NTable v-if="orderInfo.hbOrderStatus == orderStatusEnum.ORDER_COMPLETE" :single-line="false">
  292. <NThead>
  293. <NTr>
  294. <NTh>费用类型</NTh>
  295. <NTh>金额/元</NTh>
  296. </NTr>
  297. </NThead>
  298. <NTbody>
  299. <NTr>
  300. <NTd>电费</NTd>
  301. <NTd>{{ orderInfo.chargeOrder.totalMoney }}</NTd>
  302. </NTr>
  303. <NTr>
  304. <NTd>结算服务费</NTd>
  305. <NTd>0</NTd>
  306. </NTr>
  307. <NTr>
  308. <NTd>运营服务费</NTd>
  309. <NTd>{{ orderInfo.chargeOrder.realServiceCost }}</NTd>
  310. </NTr>
  311. <NTr>
  312. <NTd>订单金额</NTd>
  313. <NTd>{{ orderInfo.actualTotal }}</NTd>
  314. </NTr>
  315. <NTr>
  316. <NTd>积分抵扣</NTd>
  317. <NTd>{{ orderInfo.actualTotal }}</NTd>
  318. </NTr>
  319. </NTbody>
  320. </NTable>
  321. </div>
  322. </template>
  323. <template v-else-if="orderInfo.businessType == 'XNSP'">
  324. <div>商品名称:{{ orderInfo.virtualOrderItem?.productName }}</div>
  325. <div>充值账号:{{ orderInfo.virtualOrderItem?.rechargeAccount }}</div>
  326. <NTable class="mt-10px" :single-line="true">
  327. <NThead>
  328. <NTr>
  329. <NTh>商品</NTh>
  330. <NTh>单价/元</NTh>
  331. <NTh>数量</NTh>
  332. <NTh>小计/元</NTh>
  333. </NTr>
  334. </NThead>
  335. <NTbody>
  336. <NTr>
  337. <NTd>{{ orderInfo.virtualOrderItem?.productName }}</NTd>
  338. <NTd>{{ orderInfo.virtualOrderItem?.sellPrice }}</NTd>
  339. <NTd>1</NTd>
  340. <NTd>{{ orderInfo.virtualOrderItem?.sellPrice }}</NTd>
  341. </NTr>
  342. <NTr v-if="orderInfo.offsetPoints">
  343. <NTd></NTd>
  344. <NTd></NTd>
  345. <NTd>积分抵扣</NTd>
  346. <NTd>-{{ Number(orderInfo.offsetPoints) || 0 }}</NTd>
  347. </NTr>
  348. </NTbody>
  349. </NTable>
  350. </template>
  351. <template v-else-if="orderInfo.businessType == 'DJK'">
  352. <div>下单时间:{{ orderInfo.createTime || '---' }}</div>
  353. <div>支付方式:{{ payType[orderInfo.payType as keyof typeof payType] || '---' }}</div>
  354. <div>有效期:{{ orderInfo.djkOrderAttachInfo.expiredTime || '---' }}</div>
  355. <div class="py-20px font-semibold">订单信息</div>
  356. <NDataTable :columns="orderDJKColumns" :data="[orderInfo.djkOrderAttachInfo]" :bordered="false" />
  357. <div class="py-20px font-semibold">商品&费用</div>
  358. <NTable class="mt-20px" :single-line="false">
  359. <NThead>
  360. <NTr>
  361. <NTh>费用类型</NTh>
  362. <NTh>金额/元</NTh>
  363. </NTr>
  364. </NThead>
  365. <NTbody>
  366. <NTr>
  367. <NTd>商品总额</NTd>
  368. <NTd>{{ orderInfo.total }}</NTd>
  369. </NTr>
  370. <NTr>
  371. <NTd>配送费(快递)</NTd>
  372. <NTd>{{ orderInfo.freightAmount }}</NTd>
  373. </NTr>
  374. <NTr>
  375. <NTd>积分</NTd>
  376. <NTd>-{{ (Number(orderInfo.offsetPoints) / 100).toFixed(2) || 0 }}</NTd>
  377. </NTr>
  378. <NTr>
  379. <NTd v-if="orderInfo.hbOrderStatus == orderStatusEnum.WAIT_PAY">需付款</NTd>
  380. <NTd
  381. v-if="
  382. orderInfo.hbOrderStatus != orderStatusEnum.WAIT_PAY &&
  383. orderInfo.hbOrderStatus != orderStatusEnum.ORDER_CANCEL
  384. "
  385. >
  386. 实际付款
  387. </NTd>
  388. <NTd v-if="orderInfo.hbOrderStatus == orderStatusEnum.ORDER_CANCEL">应付款</NTd>
  389. <NTd>{{ orderInfo.actualTotal }}</NTd>
  390. </NTr>
  391. </NTbody>
  392. </NTable>
  393. <div class="py-20px font-semibold">操作记录</div>
  394. <NDataTable :columns="orderDJKLogColumns" :data="orderInfo.djkOrderLogList" :bordered="false" />
  395. </template>
  396. <template v-else-if="orderInfo.businessType == 'JY'">
  397. <div class="mt-20px pb-20px font-semibold">01 订单编号</div>
  398. <div>我方订单编号:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  399. <div>小桔订单编号:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  400. <div class="mt-20px pb-20px font-semibold">02 油站信息</div>
  401. <div>油站名称:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  402. <div>油站地址:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  403. <div>所在城市:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  404. <div class="mt-20px pb-20px font-semibold">03 加油明细</div>
  405. <div>油品名称:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  406. <div>枪号:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  407. <div>加油量:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  408. <div class="mt-20px pb-20px font-semibold">04 加油明细</div>
  409. <div>门店价:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  410. <div>平台价:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  411. <div>订单金额:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  412. <div>抵扣金额:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  413. <div>服务费:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  414. <div>需付金额:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
  415. </template>
  416. </NCard>
  417. </div>
  418. </div>
  419. </div>
  420. </template>
  421. <style scoped></style>