ZZ před 1 měsícem
rodič
revize
b3e297409e

+ 12 - 0
mer_plat_admin/src/router/modules/order.js

@@ -33,6 +33,18 @@ const orderRouter = {
       name: 'refund',
       meta: { title: '退款单' },
     },
+    {
+      path: 'fastMail',
+      component: () => import('@/views/order/fastMail'),
+      name: 'fastMail',
+      meta: { title: '快递订单' },
+    },
+    {
+      path: 'secondHand',
+      component: () => import('@/views/order/secondHand'),
+      name: 'secondHand',
+      meta: { title: '二手交易订单' },
+    },
   ],
 };
 

+ 741 - 0
mer_plat_admin/src/views/order/components/fastMailOrderDetail.vue

@@ -0,0 +1,741 @@
+<template>
+  <div>
+    <el-drawer :visible.sync="drawerVisible" :direction="direction" size="1000px" :before-close="handleClose">
+      <div v-loading="loading">
+        <div class="detailHead">
+          <div class="acea-row row-between headerBox">
+            <div class="full">
+              <div class="order_icon"><span class="iconfont icon-shouhou_tuikuan-2"></span></div>
+              <div class="text">
+                <div class="title">退款订单</div>
+                <div>
+                  <span class="mr20">退款单号:{{ refundInfo.refundOrderNo }}</span>
+                </div>
+              </div>
+            </div>
+            <!-- 审核 -->
+            <div class="acea-row row-center-wrapper">
+              <el-button size="small" @click.native="onOrderMark()" v-hasPermi="['platform:refund:order:mark']"
+                >订单备注</el-button
+              >
+              <el-button
+                v-if="
+                  checkPermi(['platform:refund:order:compulsory:refund']) &&
+                  (refundInfo.refundStatus === 0 || refundInfo.refundStatus === 5)
+                "
+                type="primary"
+                size="small"
+                v-debounceClick="
+                  () => {
+                    handlerCompulsoryReturn(refundInfo);
+                  }
+                "
+                >强制退款</el-button
+              >
+            </div>
+          </div>
+
+          <ul class="list">
+            <li class="item">
+              <div class="title">退款状态</div>
+              <div class="color-warning">{{ refundInfo.refundStatus | refundStatusFilter }}</div>
+            </li>
+            <li class="item">
+              <div class="title">退款金额</div>
+              <div>¥ {{ refundInfo.refundPrice || '0.0' }}</div>
+            </li>
+            <li class="item">
+              <div class="title">实付金额</div>
+              <div>{{ refundInfo.payPrice }}</div>
+            </li>
+            <li class="item">
+              <div class="title">创建时间</div>
+              <div>{{ refundInfo.orderInfoVo ? refundInfo.orderInfoVo.createTime : '' }}</div>
+            </li>
+          </ul>
+        </div>
+        <el-tabs type="border-card" v-model="activeName">
+          <el-tab-pane label="售后信息" name="refund">
+            <div class="detailSection" style="border: none">
+              <div class="title">退款商品</div>
+              <ul class="list">
+                <li class="item row-middle">
+                  <div class="image mr10">
+                    <el-image
+                      :src="refundInfo.image"
+                      :preview-src-list="[refundInfo.image]"
+                      style="width: 40px; height: 40px"
+                    ></el-image>
+                  </div>
+                  <div>
+                    <div class="text666 mb10 productName line-height-15">{{ refundInfo.productName }}</div>
+                    <div class="text999">
+                      <span>{{ refundInfo.sku }}</span
+                      ><span class="ml30">售价:¥{{ refundInfo.price }}</span>
+                    </div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">退款明细</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">退款数量:</div>
+                  <div class="value">{{ refundInfo.applyRefundNum }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">购买数量:</div>
+                  <div class="value">{{ refundInfo.payNum }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">预计退款方式:</div>
+                  <div class="value">原支付返还</div>
+                </li>
+                <li v-show="refundInfo.refundStatus === 2 || refundInfo.refundStatus === 3" class="item">
+                  <div class="lang">退回运费:</div>
+                  <div class="value">{{ refundInfo.refundFreightFee }}</div>
+                </li>
+                <li v-show="refundInfo.refundStatus === 2 || refundInfo.refundStatus === 3" class="item">
+                  <div class="lang">退一级佣金:</div>
+                  <div class="value">{{ refundInfo.refundFirstBrokerageFee }}</div>
+                </li>
+                <li v-show="refundInfo.refundStatus === 2 || refundInfo.refundStatus === 3" class="item">
+                  <div class="lang">退回抵扣积分:</div>
+                  <div class="value">{{ refundInfo.refundUseIntegral }}</div>
+                </li>
+                <li v-show="refundInfo.refundStatus === 2 || refundInfo.refundStatus === 3" class="item">
+                  <div class="lang">收回赠送积分:</div>
+                  <div class="value">{{ refundInfo.refundGainIntegral }}</div>
+                </li>
+                <li v-show="refundInfo.refundStatus === 2 || refundInfo.refundStatus === 3" class="item">
+                  <div class="lang">退二级返佣:</div>
+                  <div class="value">{{ refundInfo.refundSecondBrokerageFee }}</div>
+                </li>
+              </ul>
+            </div>
+            <!-- 退款流程信息-->
+            <div class="detailSection">
+              <div class="title">退款流程信息</div>
+              <div class="detail-centent acea-row">
+                <div>
+                  <!--  操作类型:apply-申请退款,audit-商家审核,returning-商品退回,receiving-商家确认收货,refund-退款,compulsory-平台强制退款,revoke-撤销-->
+                  <el-steps
+                    direction="vertical"
+                    :active="
+                      refundInfo.promoterType === 'merchant' ? 2 : refundInfo.statusList && refundInfo.statusList.length
+                    "
+                    finish-status="success"
+                  >
+                    <el-step title="直接退款-商家" v-if="refundInfo.promoterType === 'merchant'">
+                      <template slot="description">
+                        <div class="mb10">
+                          {{ refundInfo.refundTime }}
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="申请退款-用户"
+                      v-if="
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'apply')
+                      "
+                    >
+                      <template slot="description">
+                        <div class="mb10">
+                          {{ refundInfo.statusList.filter((item) => item.changeType === 'apply')[0].createTime }}
+                        </div>
+                        <div class="refundReasonWap">
+                          <div class="acea-row">
+                            <div class="detail-term" style="width: 58%">
+                              <span class="detail-infoTitle">退款原因:</span
+                              ><span class="detail-info">{{ refundInfo.refundReasonWap }}</span>
+                            </div>
+                            <div class="detail-term">
+                              <span class="detail-infoTitle">退货方式:</span
+                              ><span class="detail-info">{{
+                                refundInfo.returnGoodsType === 1
+                                  ? '快递退回'
+                                  : refundInfo.returnGoodsType === 2
+                                  ? '到店退货'
+                                  : '不退货'
+                              }}</span>
+                            </div>
+                          </div>
+                          <div class="detail-term acea-row">
+                            <span class="detail-infoTitle">备注说明:</span>
+                            <div class="detail-info" style="width: 600px">
+                              {{ refundInfo.refundReasonWapExplain | filterEmpty }}
+                            </div>
+                          </div>
+                          <div class="detail-term">
+                            <div class="acea-row">
+                              <span class="detail-infoTitle">退款凭证:</span>
+
+                              <div v-if="refundInfo.refundReasonWapImg">
+                                <el-image
+                                  v-for="(item, index) in refundInfo.refundReasonWapImg.split(',')"
+                                  :key="index"
+                                  style="width: 60px; height: 60px"
+                                  :src="item"
+                                  class="mr10"
+                                  :preview-src-list="refundInfo.refundReasonWapImg.split(',')"
+                                ></el-image>
+                              </div>
+                              <div v-else>-</div>
+                            </div>
+                          </div>
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="商家审核-商家"
+                      v-if="
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'audit')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'audit').length
+                              ? refundInfo.statusList.filter((item) => item.changeType === 'audit')[0].createTime
+                              : ''
+                          }}
+                        </div>
+                        <div v-if="refundInfo.refundStatus > 0" class="refundReasonWap">
+                          <div class="detail-term">
+                            <span class="detail-infoTitle">审核结果:</span
+                            ><span class="detail-info">{{
+                              refundInfo.refundStatus === 1 && refundInfo.statusList.length === 2
+                                ? '拒绝退款'
+                                : '同意退款'
+                            }}</span>
+                          </div>
+                          <div
+                            v-if="refundInfo.refundStatus === 1 && refundInfo.statusList.length === 2"
+                            class="detail-term"
+                          >
+                            <span class="detail-infoTitle">拒绝原因:</span>
+                            <span class="detail-info">{{ refundInfo.refundReason | filterEmpty }}</span>
+                          </div>
+                          <div
+                            v-if="refundInfo.returnGoodsType === 1 && refundInfo.refundStatus !== 1"
+                            class="detail-term"
+                          >
+                            <div>
+                              <span class="detail-infoTitle">退货地址:</span>
+                              <span class="detail-info">{{ refundInfo.receiverAddressDetail }}</span>
+                            </div>
+                            <div>
+                              <span class="detail-infoTitle"></span>
+                              <span class="detail-info">{{ refundInfo.receiver }} {{ refundInfo.receiverPhone }}</span>
+                            </div>
+                          </div>
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="商品退回信息-用户"
+                      v-if="
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'returning')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{ refundInfo.statusList.filter((item) => item.changeType === 'returning')[0].createTime }}
+                        </div>
+                        <div v-if="refundInfo.returnGoodsType === 1" class="refundReasonWap">
+                          <div class="acea-row">
+                            <div class="detail-term" style="width: 58%">
+                              <span class="detail-infoTitle">物流公司:</span
+                              ><span class="detail-info">{{ refundInfo.expressName }}</span>
+                            </div>
+                            <div class="detail-term">
+                              <span class="detail-infoTitle">物流单号:</span>
+                              <span class="detail-info">{{ refundInfo.trackingNumber }}</span>
+                            </div>
+                          </div>
+                          <div class="detail-term">
+                            <div>
+                              <span class="detail-infoTitle">联系电话:</span>
+                              <span class="detail-info">{{ refundInfo.telephone }}</span>
+                            </div>
+                          </div>
+                        </div>
+                        <div v-if="refundInfo.returnGoodsType === 2" class="refundReasonWap">
+                          <div class="detail-term">
+                            <div>
+                              <span class="detail-infoTitle">联系电话:</span>
+                              <span class="detail-info">{{ refundInfo.telephone }}</span>
+                            </div>
+                          </div>
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="商家确认收货-商家"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 6 &&
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'receiving')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'receiving').length
+                              ? refundInfo.statusList.filter((item) => item.changeType === 'receiving')[0].createTime
+                              : ''
+                          }}
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="商品拒绝收货-商家"
+                      v-if="
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'rejectionGoods')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'rejectionGoods')[0].createTime
+                          }}
+                        </div>
+                        <div v-if="refundInfo.refundStatus > 0" class="refundReasonWap">
+                          <div class="detail-term">
+                            <span class="detail-infoTitle">审核结果:</span
+                            ><span class="detail-info">{{
+                              refundInfo.refundStatus === 1 ? '拒绝退款' : '同意退款'
+                            }}</span>
+                          </div>
+                          <div v-if="refundInfo.refundStatus === 1" class="detail-term">
+                            <span class="detail-infoTitle">拒绝原因:</span>
+                            <span class="detail-info">{{ refundInfo.refundReason | filterEmpty }}</span>
+                          </div>
+                          <div
+                            v-if="refundInfo.returnGoodsType === 1 && refundInfo.refundStatus !== 1"
+                            class="detail-term"
+                          >
+                            <div>
+                              <span class="detail-infoTitle">退货地址:</span>
+                              <span class="detail-info">{{ refundInfo.receiverAddressDetail }}</span>
+                            </div>
+                            <div>
+                              <span class="detail-infoTitle"></span>
+                              <span class="detail-info">{{ refundInfo.receiver }} {{ refundInfo.receiverPhone }}</span>
+                            </div>
+                          </div>
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="已撤销"
+                      v-if="
+                        refundInfo.refundStatus === 6 &&
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'revoke')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'revoke').length
+                              ? refundInfo.statusList.filter((item) => item.changeType === 'revoke')[0].createTime
+                              : ''
+                          }}
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="平台强制退款成功"
+                      v-if="
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'compulsory')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'compulsory').length
+                              ? refundInfo.statusList.filter((item) => item.changeType === 'compulsory')[0].createTime
+                              : ''
+                          }}
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      :title="refundInfo.promoterType === 'user' ? '退款成功' : '退款成功-商家直接退款'"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 6 &&
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'refund')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'refund').length
+                              ? refundInfo.statusList.filter((item) => item.changeType === 'refund')[0].createTime
+                              : ''
+                          }}
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="商家审核-商家"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 2 &&
+                        refundInfo.refundStatus !== 6 &&
+                        refundInfo.refundStatus === 0
+                      "
+                    >
+                    </el-step>
+                    <el-step
+                      title="商品退回信息-用户"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 2 &&
+                        refundInfo.refundStatus !== 6 &&
+                        refundInfo.afterSalesType === 2 &&
+                        (refundInfo.refundStatus === 0 || refundInfo.refundStatus === 4)
+                      "
+                    >
+                    </el-step>
+                    <el-step
+                      title="商家确认收货-商家"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 2 &&
+                        refundInfo.refundStatus !== 6 &&
+                        refundInfo.afterSalesType === 2 &&
+                        (refundInfo.refundStatus === 0 ||
+                          refundInfo.refundStatus === 4 ||
+                          refundInfo.refundStatus === 5)
+                      "
+                    >
+                    </el-step>
+                    <el-step
+                      :title="refundInfo.promoterType === 'user' ? '退款成功' : '退款成功-商家直接退款'"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 6 &&
+                        (refundInfo.refundStatus === 0 ||
+                          refundInfo.refundStatus === 2 ||
+                          refundInfo.refundStatus === 4 ||
+                          refundInfo.refundStatus === 5)
+                      "
+                    >
+                    </el-step>
+                  </el-steps>
+                </div>
+              </div>
+            </div>
+            <div class="detailSection">
+              <div class="title">平台备注</div>
+              <ul class="list">
+                <li class="item">
+                  <div>{{ refundInfo.platformRemark | filterEmpty }}</div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">商家备注</div>
+              <ul class="list">
+                <li class="item">
+                  <div>{{ refundInfo.merRemark | filterEmpty }}</div>
+                </li>
+              </ul>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="订单信息" name="detail" v-if="refundInfo.orderInfoVo">
+            <div class="detailSection">
+              <div class="title">用户信息</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">用户昵称:</div>
+                  <div class="value">
+                    <span class="mr5">{{ refundInfo.orderInfoVo.nickname }}</span>
+                    <span class="mr5"> | </span>
+                    <span>{{ refundInfo.orderInfoVo.uid }}</span>
+                  </div>
+                </li>
+                <li class="item">
+                  <div class="lang">用户电话:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.phone }}</div>
+                </li>
+              </ul>
+            </div>
+            <div v-show="refundInfo.orderInfoVo.secondType < 2" class="detailSection">
+              <div class="title">配送信息</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">配送方式:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.shippingType === 1 ? '商家配送' :(refundInfo.orderInfoVo.shippingType === 2? '到店自提':'外卖配送' ) }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">收货电话:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.userPhone | filterEmpty }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">收货人:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.realName | filterEmpty }}</div>
+                </li>
+              </ul>
+              <div class="userAddress acea-row">
+                <div class="lang">收货地址:</div>
+                <div class="value">{{ refundInfo.orderInfoVo.userAddress | filterEmpty }}</div>
+              </div>
+            </div>
+            <div class="detailSection">
+              <div class="title">订单信息</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">订单号:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.orderNo }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">商品总数:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.totalNum }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付状态:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.paid ? '已支付' : '未支付' }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付方式:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.payType | payTypeFilter }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">订单状态:</div>
+                  <div class="value textE93323">
+                    <span v-if="refundInfo.orderInfoVo.refundStatus === 3">已退款</span>
+                    <span v-else>{{ refundInfo.orderInfoVo.status | orderStatusFilter }}</span>
+                  </div>
+                </li>
+                <li class="item">
+                  <div class="lang">已发货数量:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.deliveryNum }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">创建时间:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.createTime }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付时间:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.payTime }}</div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">订单明细</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">商品总价:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.proTotalPrice }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">平台优惠金额:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.platCouponPrice }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">赠送积分:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.gainIntegral }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">实际支付:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.payPrice }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">扣除抵扣积分:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.useIntegral }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">商家优惠金额:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.merCouponPrice }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">会员抵扣金额:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.svipDiscountPrice || 0 }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付邮费:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.payPostage }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">积分抵扣金额:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.integralPrice }}</div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">用户备注</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="value productName">{{ refundInfo.orderInfoVo.userRemark | filterEmpty }}</div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">商家备注</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="value productName">{{ refundInfo.orderInfoVo.merchantRemark | filterEmpty }}</div>
+                </li>
+              </ul>
+            </div>
+          </el-tab-pane>
+        </el-tabs>
+        <!-- 售后状态:0:待审核 1:商家拒绝 2:退款中 3:已退款 4:用户退货 5:商家待收货 6:已撤销-->
+      </div>
+    </el-drawer>
+  </div>
+</template>
+<script setup>
+import { orderRefundCompulsoryApi, refundMarkApi, refundOrderDetailApi } from '@/api/order';
+import { checkPermi } from '@/utils/permission'; // 权限判断函数
+import { filterEmpty, refundStatusFilter } from '@/filters';
+export default {
+  name: 'fastMailOrderDetail',
+  props: {
+    //退款单号
+    refundOrderNo: {
+      type: String,
+      default: 0,
+    },
+    //是否显示隐藏
+    drawerVisible: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      loadingBtn: false,
+      activeName: 'refund',
+      direction: 'rtl',
+      reverse: true,
+      orderDatalist: {},
+      loading: false,
+      modal2: false,
+      result: [],
+      resultInfo: {},
+      refundInfo: {},
+    };
+  },
+  mounted() {
+    this.getRefundOrderDetail(this.refundOrderNo);
+  },
+  methods: {
+    checkPermi,
+    handleClose() {
+      this.$emit('onClosedrawerVisible');
+    },
+    // 备注
+    onOrderMark() {
+      this.$modalPrompt('textarea', '退款单备注', this.refundInfo.platformRemark).then((V) => {
+        refundMarkApi({ remark: V, refundOrderNo: this.refundOrderNo }).then(() => {
+          this.$message.success('操作成功');
+        });
+      });
+    },
+    // 获取订单退款信息
+    getRefundOrderDetail(id) {
+      this.loading = true;
+      refundOrderDetailApi(id)
+        .then(async (res) => {
+          this.refundInfo = res;
+          this.loading = false;
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+    handlerCompulsoryReturn(refundInfo) {
+      this.$confirm(
+        `确定强制退款【${refundInfo.refundPrice}】 退款单,此操作不可逆,请慎重确认后再操作`,
+        '强制退款提示',
+      ).then(async () => {
+        let result = await orderRefundCompulsoryApi(refundInfo.refundOrderNo);
+        this.$emit('compulsoryReturnSuccess');
+      });
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.userAddress {
+  width: 100%;
+  margin-top: 16px;
+  font-size: 13px;
+  color: #666;
+}
+
+.productName {
+  width: 633px;
+}
+
+.detail-centent {
+  margin-top: 16px;
+}
+
+::v-deep .el-step__main {
+  margin-bottom: 30px !important;
+}
+
+::v-deep .el-step__title {
+  font-size: 14px !important;
+}
+
+.flow-path {
+  margin-bottom: 70px;
+}
+
+.refundReasonWap {
+  width: 720px;
+  height: auto;
+  padding: 10px 25px 0 0;
+  border-radius: 14px;
+  background-color: #f3f8fe;
+  overflow: hidden;
+}
+
+.image {
+  width: 40px;
+  height: 40px;
+  border-radius: 4px;
+  overflow: hidden;
+}
+
+.refund {
+  &-title {
+    font-size: 17px;
+    color: #333333;
+    font-weight: 600;
+  }
+
+  &-orderNo {
+    font-size: 14px;
+    color: #333333;
+  }
+
+  &-price {
+    margin-right: 100px;
+  }
+}
+</style>

+ 741 - 0
mer_plat_admin/src/views/order/components/secondHandOrderDetail.vue

@@ -0,0 +1,741 @@
+<template>
+  <div>
+    <el-drawer :visible.sync="drawerVisible" :direction="direction" size="1000px" :before-close="handleClose">
+      <div v-loading="loading">
+        <div class="detailHead">
+          <div class="acea-row row-between headerBox">
+            <div class="full">
+              <div class="order_icon"><span class="iconfont icon-shouhou_tuikuan-2"></span></div>
+              <div class="text">
+                <div class="title">退款订单</div>
+                <div>
+                  <span class="mr20">退款单号:{{ refundInfo.refundOrderNo }}</span>
+                </div>
+              </div>
+            </div>
+            <!-- 审核 -->
+            <div class="acea-row row-center-wrapper">
+              <el-button size="small" @click.native="onOrderMark()" v-hasPermi="['platform:refund:order:mark']"
+                >订单备注</el-button
+              >
+              <el-button
+                v-if="
+                  checkPermi(['platform:refund:order:compulsory:refund']) &&
+                  (refundInfo.refundStatus === 0 || refundInfo.refundStatus === 5)
+                "
+                type="primary"
+                size="small"
+                v-debounceClick="
+                  () => {
+                    handlerCompulsoryReturn(refundInfo);
+                  }
+                "
+                >强制退款</el-button
+              >
+            </div>
+          </div>
+
+          <ul class="list">
+            <li class="item">
+              <div class="title">退款状态</div>
+              <div class="color-warning">{{ refundInfo.refundStatus | refundStatusFilter }}</div>
+            </li>
+            <li class="item">
+              <div class="title">退款金额</div>
+              <div>¥ {{ refundInfo.refundPrice || '0.0' }}</div>
+            </li>
+            <li class="item">
+              <div class="title">实付金额</div>
+              <div>{{ refundInfo.payPrice }}</div>
+            </li>
+            <li class="item">
+              <div class="title">创建时间</div>
+              <div>{{ refundInfo.orderInfoVo ? refundInfo.orderInfoVo.createTime : '' }}</div>
+            </li>
+          </ul>
+        </div>
+        <el-tabs type="border-card" v-model="activeName">
+          <el-tab-pane label="售后信息" name="refund">
+            <div class="detailSection" style="border: none">
+              <div class="title">退款商品</div>
+              <ul class="list">
+                <li class="item row-middle">
+                  <div class="image mr10">
+                    <el-image
+                      :src="refundInfo.image"
+                      :preview-src-list="[refundInfo.image]"
+                      style="width: 40px; height: 40px"
+                    ></el-image>
+                  </div>
+                  <div>
+                    <div class="text666 mb10 productName line-height-15">{{ refundInfo.productName }}</div>
+                    <div class="text999">
+                      <span>{{ refundInfo.sku }}</span
+                      ><span class="ml30">售价:¥{{ refundInfo.price }}</span>
+                    </div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">退款明细</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">退款数量:</div>
+                  <div class="value">{{ refundInfo.applyRefundNum }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">购买数量:</div>
+                  <div class="value">{{ refundInfo.payNum }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">预计退款方式:</div>
+                  <div class="value">原支付返还</div>
+                </li>
+                <li v-show="refundInfo.refundStatus === 2 || refundInfo.refundStatus === 3" class="item">
+                  <div class="lang">退回运费:</div>
+                  <div class="value">{{ refundInfo.refundFreightFee }}</div>
+                </li>
+                <li v-show="refundInfo.refundStatus === 2 || refundInfo.refundStatus === 3" class="item">
+                  <div class="lang">退一级佣金:</div>
+                  <div class="value">{{ refundInfo.refundFirstBrokerageFee }}</div>
+                </li>
+                <li v-show="refundInfo.refundStatus === 2 || refundInfo.refundStatus === 3" class="item">
+                  <div class="lang">退回抵扣积分:</div>
+                  <div class="value">{{ refundInfo.refundUseIntegral }}</div>
+                </li>
+                <li v-show="refundInfo.refundStatus === 2 || refundInfo.refundStatus === 3" class="item">
+                  <div class="lang">收回赠送积分:</div>
+                  <div class="value">{{ refundInfo.refundGainIntegral }}</div>
+                </li>
+                <li v-show="refundInfo.refundStatus === 2 || refundInfo.refundStatus === 3" class="item">
+                  <div class="lang">退二级返佣:</div>
+                  <div class="value">{{ refundInfo.refundSecondBrokerageFee }}</div>
+                </li>
+              </ul>
+            </div>
+            <!-- 退款流程信息-->
+            <div class="detailSection">
+              <div class="title">退款流程信息</div>
+              <div class="detail-centent acea-row">
+                <div>
+                  <!--  操作类型:apply-申请退款,audit-商家审核,returning-商品退回,receiving-商家确认收货,refund-退款,compulsory-平台强制退款,revoke-撤销-->
+                  <el-steps
+                    direction="vertical"
+                    :active="
+                      refundInfo.promoterType === 'merchant' ? 2 : refundInfo.statusList && refundInfo.statusList.length
+                    "
+                    finish-status="success"
+                  >
+                    <el-step title="直接退款-商家" v-if="refundInfo.promoterType === 'merchant'">
+                      <template slot="description">
+                        <div class="mb10">
+                          {{ refundInfo.refundTime }}
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="申请退款-用户"
+                      v-if="
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'apply')
+                      "
+                    >
+                      <template slot="description">
+                        <div class="mb10">
+                          {{ refundInfo.statusList.filter((item) => item.changeType === 'apply')[0].createTime }}
+                        </div>
+                        <div class="refundReasonWap">
+                          <div class="acea-row">
+                            <div class="detail-term" style="width: 58%">
+                              <span class="detail-infoTitle">退款原因:</span
+                              ><span class="detail-info">{{ refundInfo.refundReasonWap }}</span>
+                            </div>
+                            <div class="detail-term">
+                              <span class="detail-infoTitle">退货方式:</span
+                              ><span class="detail-info">{{
+                                refundInfo.returnGoodsType === 1
+                                  ? '快递退回'
+                                  : refundInfo.returnGoodsType === 2
+                                  ? '到店退货'
+                                  : '不退货'
+                              }}</span>
+                            </div>
+                          </div>
+                          <div class="detail-term acea-row">
+                            <span class="detail-infoTitle">备注说明:</span>
+                            <div class="detail-info" style="width: 600px">
+                              {{ refundInfo.refundReasonWapExplain | filterEmpty }}
+                            </div>
+                          </div>
+                          <div class="detail-term">
+                            <div class="acea-row">
+                              <span class="detail-infoTitle">退款凭证:</span>
+
+                              <div v-if="refundInfo.refundReasonWapImg">
+                                <el-image
+                                  v-for="(item, index) in refundInfo.refundReasonWapImg.split(',')"
+                                  :key="index"
+                                  style="width: 60px; height: 60px"
+                                  :src="item"
+                                  class="mr10"
+                                  :preview-src-list="refundInfo.refundReasonWapImg.split(',')"
+                                ></el-image>
+                              </div>
+                              <div v-else>-</div>
+                            </div>
+                          </div>
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="商家审核-商家"
+                      v-if="
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'audit')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'audit').length
+                              ? refundInfo.statusList.filter((item) => item.changeType === 'audit')[0].createTime
+                              : ''
+                          }}
+                        </div>
+                        <div v-if="refundInfo.refundStatus > 0" class="refundReasonWap">
+                          <div class="detail-term">
+                            <span class="detail-infoTitle">审核结果:</span
+                            ><span class="detail-info">{{
+                              refundInfo.refundStatus === 1 && refundInfo.statusList.length === 2
+                                ? '拒绝退款'
+                                : '同意退款'
+                            }}</span>
+                          </div>
+                          <div
+                            v-if="refundInfo.refundStatus === 1 && refundInfo.statusList.length === 2"
+                            class="detail-term"
+                          >
+                            <span class="detail-infoTitle">拒绝原因:</span>
+                            <span class="detail-info">{{ refundInfo.refundReason | filterEmpty }}</span>
+                          </div>
+                          <div
+                            v-if="refundInfo.returnGoodsType === 1 && refundInfo.refundStatus !== 1"
+                            class="detail-term"
+                          >
+                            <div>
+                              <span class="detail-infoTitle">退货地址:</span>
+                              <span class="detail-info">{{ refundInfo.receiverAddressDetail }}</span>
+                            </div>
+                            <div>
+                              <span class="detail-infoTitle"></span>
+                              <span class="detail-info">{{ refundInfo.receiver }} {{ refundInfo.receiverPhone }}</span>
+                            </div>
+                          </div>
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="商品退回信息-用户"
+                      v-if="
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'returning')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{ refundInfo.statusList.filter((item) => item.changeType === 'returning')[0].createTime }}
+                        </div>
+                        <div v-if="refundInfo.returnGoodsType === 1" class="refundReasonWap">
+                          <div class="acea-row">
+                            <div class="detail-term" style="width: 58%">
+                              <span class="detail-infoTitle">物流公司:</span
+                              ><span class="detail-info">{{ refundInfo.expressName }}</span>
+                            </div>
+                            <div class="detail-term">
+                              <span class="detail-infoTitle">物流单号:</span>
+                              <span class="detail-info">{{ refundInfo.trackingNumber }}</span>
+                            </div>
+                          </div>
+                          <div class="detail-term">
+                            <div>
+                              <span class="detail-infoTitle">联系电话:</span>
+                              <span class="detail-info">{{ refundInfo.telephone }}</span>
+                            </div>
+                          </div>
+                        </div>
+                        <div v-if="refundInfo.returnGoodsType === 2" class="refundReasonWap">
+                          <div class="detail-term">
+                            <div>
+                              <span class="detail-infoTitle">联系电话:</span>
+                              <span class="detail-info">{{ refundInfo.telephone }}</span>
+                            </div>
+                          </div>
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="商家确认收货-商家"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 6 &&
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'receiving')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'receiving').length
+                              ? refundInfo.statusList.filter((item) => item.changeType === 'receiving')[0].createTime
+                              : ''
+                          }}
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="商品拒绝收货-商家"
+                      v-if="
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'rejectionGoods')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'rejectionGoods')[0].createTime
+                          }}
+                        </div>
+                        <div v-if="refundInfo.refundStatus > 0" class="refundReasonWap">
+                          <div class="detail-term">
+                            <span class="detail-infoTitle">审核结果:</span
+                            ><span class="detail-info">{{
+                              refundInfo.refundStatus === 1 ? '拒绝退款' : '同意退款'
+                            }}</span>
+                          </div>
+                          <div v-if="refundInfo.refundStatus === 1" class="detail-term">
+                            <span class="detail-infoTitle">拒绝原因:</span>
+                            <span class="detail-info">{{ refundInfo.refundReason | filterEmpty }}</span>
+                          </div>
+                          <div
+                            v-if="refundInfo.returnGoodsType === 1 && refundInfo.refundStatus !== 1"
+                            class="detail-term"
+                          >
+                            <div>
+                              <span class="detail-infoTitle">退货地址:</span>
+                              <span class="detail-info">{{ refundInfo.receiverAddressDetail }}</span>
+                            </div>
+                            <div>
+                              <span class="detail-infoTitle"></span>
+                              <span class="detail-info">{{ refundInfo.receiver }} {{ refundInfo.receiverPhone }}</span>
+                            </div>
+                          </div>
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="已撤销"
+                      v-if="
+                        refundInfo.refundStatus === 6 &&
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'revoke')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'revoke').length
+                              ? refundInfo.statusList.filter((item) => item.changeType === 'revoke')[0].createTime
+                              : ''
+                          }}
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="平台强制退款成功"
+                      v-if="
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'compulsory')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'compulsory').length
+                              ? refundInfo.statusList.filter((item) => item.changeType === 'compulsory')[0].createTime
+                              : ''
+                          }}
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      :title="refundInfo.promoterType === 'user' ? '退款成功' : '退款成功-商家直接退款'"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 6 &&
+                        refundInfo.statusList &&
+                        refundInfo.statusList.length &&
+                        refundInfo.statusList.find((item) => item.changeType === 'refund')
+                      "
+                    >
+                      <template slot="description" v-if="refundInfo.statusList && refundInfo.statusList.length">
+                        <div class="mb10">
+                          {{
+                            refundInfo.statusList.filter((item) => item.changeType === 'refund').length
+                              ? refundInfo.statusList.filter((item) => item.changeType === 'refund')[0].createTime
+                              : ''
+                          }}
+                        </div>
+                      </template>
+                    </el-step>
+                    <el-step
+                      title="商家审核-商家"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 2 &&
+                        refundInfo.refundStatus !== 6 &&
+                        refundInfo.refundStatus === 0
+                      "
+                    >
+                    </el-step>
+                    <el-step
+                      title="商品退回信息-用户"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 2 &&
+                        refundInfo.refundStatus !== 6 &&
+                        refundInfo.afterSalesType === 2 &&
+                        (refundInfo.refundStatus === 0 || refundInfo.refundStatus === 4)
+                      "
+                    >
+                    </el-step>
+                    <el-step
+                      title="商家确认收货-商家"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 2 &&
+                        refundInfo.refundStatus !== 6 &&
+                        refundInfo.afterSalesType === 2 &&
+                        (refundInfo.refundStatus === 0 ||
+                          refundInfo.refundStatus === 4 ||
+                          refundInfo.refundStatus === 5)
+                      "
+                    >
+                    </el-step>
+                    <el-step
+                      :title="refundInfo.promoterType === 'user' ? '退款成功' : '退款成功-商家直接退款'"
+                      v-if="
+                        refundInfo.refundStatus !== 1 &&
+                        refundInfo.refundStatus !== 6 &&
+                        (refundInfo.refundStatus === 0 ||
+                          refundInfo.refundStatus === 2 ||
+                          refundInfo.refundStatus === 4 ||
+                          refundInfo.refundStatus === 5)
+                      "
+                    >
+                    </el-step>
+                  </el-steps>
+                </div>
+              </div>
+            </div>
+            <div class="detailSection">
+              <div class="title">平台备注</div>
+              <ul class="list">
+                <li class="item">
+                  <div>{{ refundInfo.platformRemark | filterEmpty }}</div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">商家备注</div>
+              <ul class="list">
+                <li class="item">
+                  <div>{{ refundInfo.merRemark | filterEmpty }}</div>
+                </li>
+              </ul>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="订单信息" name="detail" v-if="refundInfo.orderInfoVo">
+            <div class="detailSection">
+              <div class="title">用户信息</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">用户昵称:</div>
+                  <div class="value">
+                    <span class="mr5">{{ refundInfo.orderInfoVo.nickname }}</span>
+                    <span class="mr5"> | </span>
+                    <span>{{ refundInfo.orderInfoVo.uid }}</span>
+                  </div>
+                </li>
+                <li class="item">
+                  <div class="lang">用户电话:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.phone }}</div>
+                </li>
+              </ul>
+            </div>
+            <div v-show="refundInfo.orderInfoVo.secondType < 2" class="detailSection">
+              <div class="title">配送信息</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">配送方式:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.shippingType === 1 ? '商家配送' :(refundInfo.orderInfoVo.shippingType === 2? '到店自提':'外卖配送' ) }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">收货电话:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.userPhone | filterEmpty }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">收货人:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.realName | filterEmpty }}</div>
+                </li>
+              </ul>
+              <div class="userAddress acea-row">
+                <div class="lang">收货地址:</div>
+                <div class="value">{{ refundInfo.orderInfoVo.userAddress | filterEmpty }}</div>
+              </div>
+            </div>
+            <div class="detailSection">
+              <div class="title">订单信息</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">订单号:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.orderNo }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">商品总数:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.totalNum }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付状态:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.paid ? '已支付' : '未支付' }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付方式:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.payType | payTypeFilter }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">订单状态:</div>
+                  <div class="value textE93323">
+                    <span v-if="refundInfo.orderInfoVo.refundStatus === 3">已退款</span>
+                    <span v-else>{{ refundInfo.orderInfoVo.status | orderStatusFilter }}</span>
+                  </div>
+                </li>
+                <li class="item">
+                  <div class="lang">已发货数量:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.deliveryNum }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">创建时间:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.createTime }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付时间:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.payTime }}</div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">订单明细</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">商品总价:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.proTotalPrice }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">平台优惠金额:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.platCouponPrice }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">赠送积分:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.gainIntegral }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">实际支付:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.payPrice }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">扣除抵扣积分:</div>
+                  <div class="value">{{ refundInfo.orderInfoVo.useIntegral }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">商家优惠金额:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.merCouponPrice }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">会员抵扣金额:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.svipDiscountPrice || 0 }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付邮费:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.payPostage }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">积分抵扣金额:</div>
+                  <div class="value">¥{{ refundInfo.orderInfoVo.integralPrice }}</div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">用户备注</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="value productName">{{ refundInfo.orderInfoVo.userRemark | filterEmpty }}</div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">商家备注</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="value productName">{{ refundInfo.orderInfoVo.merchantRemark | filterEmpty }}</div>
+                </li>
+              </ul>
+            </div>
+          </el-tab-pane>
+        </el-tabs>
+        <!-- 售后状态:0:待审核 1:商家拒绝 2:退款中 3:已退款 4:用户退货 5:商家待收货 6:已撤销-->
+      </div>
+    </el-drawer>
+  </div>
+</template>
+<script setup>
+import { orderRefundCompulsoryApi, refundMarkApi, refundOrderDetailApi } from '@/api/order';
+import { checkPermi } from '@/utils/permission'; // 权限判断函数
+import { filterEmpty, refundStatusFilter } from '@/filters';
+export default {
+  name: 'secondHandOrderDetail',
+  props: {
+    //退款单号
+    refundOrderNo: {
+      type: String,
+      default: 0,
+    },
+    //是否显示隐藏
+    drawerVisible: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      loadingBtn: false,
+      activeName: 'refund',
+      direction: 'rtl',
+      reverse: true,
+      orderDatalist: {},
+      loading: false,
+      modal2: false,
+      result: [],
+      resultInfo: {},
+      refundInfo: {},
+    };
+  },
+  mounted() {
+    this.getRefundOrderDetail(this.refundOrderNo);
+  },
+  methods: {
+    checkPermi,
+    handleClose() {
+      this.$emit('onClosedrawerVisible');
+    },
+    // 备注
+    onOrderMark() {
+      this.$modalPrompt('textarea', '退款单备注', this.refundInfo.platformRemark).then((V) => {
+        refundMarkApi({ remark: V, refundOrderNo: this.refundOrderNo }).then(() => {
+          this.$message.success('操作成功');
+        });
+      });
+    },
+    // 获取订单退款信息
+    getRefundOrderDetail(id) {
+      this.loading = true;
+      refundOrderDetailApi(id)
+        .then(async (res) => {
+          this.refundInfo = res;
+          this.loading = false;
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+    handlerCompulsoryReturn(refundInfo) {
+      this.$confirm(
+        `确定强制退款【${refundInfo.refundPrice}】 退款单,此操作不可逆,请慎重确认后再操作`,
+        '强制退款提示',
+      ).then(async () => {
+        let result = await orderRefundCompulsoryApi(refundInfo.refundOrderNo);
+        this.$emit('compulsoryReturnSuccess');
+      });
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.userAddress {
+  width: 100%;
+  margin-top: 16px;
+  font-size: 13px;
+  color: #666;
+}
+
+.productName {
+  width: 633px;
+}
+
+.detail-centent {
+  margin-top: 16px;
+}
+
+::v-deep .el-step__main {
+  margin-bottom: 30px !important;
+}
+
+::v-deep .el-step__title {
+  font-size: 14px !important;
+}
+
+.flow-path {
+  margin-bottom: 70px;
+}
+
+.refundReasonWap {
+  width: 720px;
+  height: auto;
+  padding: 10px 25px 0 0;
+  border-radius: 14px;
+  background-color: #f3f8fe;
+  overflow: hidden;
+}
+
+.image {
+  width: 40px;
+  height: 40px;
+  border-radius: 4px;
+  overflow: hidden;
+}
+
+.refund {
+  &-title {
+    font-size: 17px;
+    color: #333333;
+    font-weight: 600;
+  }
+
+  &-orderNo {
+    font-size: 14px;
+    color: #333333;
+  }
+
+  &-price {
+    margin-right: 100px;
+  }
+}
+</style>

+ 503 - 0
mer_plat_admin/src/views/order/fastMail.vue

@@ -0,0 +1,503 @@
+<template>
+  <div class="divBox relative">
+    <el-card
+      :bordered="false"
+      shadow="never"
+      class="ivu-mt"
+      :body-style="{ padding: 0 }"
+      v-hasPermi="['platform:order:page:list']"
+    >
+      <div class="padding-add">
+        <el-form size="small" inline label-position="right" @submit.native.prevent>
+          <el-form-item label="订单编号:" label-width="66px">
+            <el-input
+              v-model.trim="tableFrom.orderNo"
+              placeholder="请输入订单编号"
+              class="selWidth"
+              size="small"
+              clearable
+              @keyup.enter.native="handleSearchList"
+            />
+          </el-form-item>
+          <el-form-item label="订单类型:">
+            <el-select
+              v-model="tableFrom.type"
+              clearable
+              size="small"
+              placeholder="请选择"
+              class="selWidth"
+              @change="handleSearchList"
+            >
+              <el-option v-for="(item, i) in fromType" :key="i" :label="item.text" :value="item.value" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="时间选择:">
+            <el-date-picker
+              v-model="timeVal"
+              value-format="yyyy-MM-dd"
+              format="yyyy-MM-dd"
+              size="small"
+              type="daterange"
+              placement="bottom-end"
+              placeholder="自定义时间"
+              @change="onchangeTime"
+              class="selWidth"
+            />
+          </el-form-item>
+          <el-form-item label="用户搜索:" label-for="nickname">
+            <UserSearchInput v-model="tableFrom" />
+          </el-form-item>
+          <el-form-item label="商户名称:">
+            <merchant-name @getMerId="getMerId" :merIdChecked="tableFrom.merId"></merchant-name>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" size="small" @click="handleSearchList">查询</el-button>
+            <el-button size="small" @click="handleReset">重置</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-card>
+    <el-card class="box-card mt14" :body-style="{ padding: '0 20px 20px' }" shadow="never" :bordered="false">
+      <el-tabs class="list-tabs" v-model="tableFrom.status" @tab-click="handleSearchList">
+        <el-tab-pane name="all" :label="`全部(${orderChartType.all || 0})`"></el-tab-pane>
+        <el-tab-pane name="unPaid" :label="`未支付(${orderChartType.unPaid || 0})`"></el-tab-pane>
+        <el-tab-pane name="notShipped" :label="`未发货(${orderChartType.notShipped || 0})`"></el-tab-pane>
+        <el-tab-pane name="spike" :label="`待收货(${orderChartType.spike || 0})`"></el-tab-pane>
+        <el-tab-pane name="awaitVerification" :label="`待核销(${orderChartType.verification || 0})`"></el-tab-pane>
+        <el-tab-pane name="receiving" :label="`已收货(${orderChartType.receiving || 0})`"></el-tab-pane>
+        <el-tab-pane name="complete" :label="`已完成(${orderChartType.complete || 0})`"></el-tab-pane>
+        <el-tab-pane name="refunded" :label="`已退款(${orderChartType.refunded || 0})`"></el-tab-pane>
+        <el-tab-pane name="cancel" :label="`已取消(${orderChartType.cancel || 0})`"></el-tab-pane>
+        <el-tab-pane name="deleted" :label="`已删除(${orderChartType.deleted || 0})`"></el-tab-pane>
+      </el-tabs>
+      <div class="mt5">
+        <el-button size="small" @click="exports" v-hasPermi="['platform:export:order:excel']">导出</el-button>
+      </div>
+      <el-table
+        v-loading="listLoading"
+        :data="tableData.data"
+        size="small"
+        highlight-current-row
+        :row-key="
+          (row) => {
+            return row.orderNo;
+          }
+        "
+        class="mt20"
+      >
+        <el-table-column label="订单编号" min-width="220" v-if="checkedCities.includes('订单编号')">
+          <template slot-scope="scope">
+            <div class="acea-row">
+              <font v-show="scope.row.type === 1" class="mr5">[秒杀]</font>
+              <font v-show="scope.row.type === 2" class="mr5">[拼团]</font>
+              <span
+                style="display: block"
+                v-text="scope.row.orderNo"
+              />
+            </div>
+           <div class="flex">
+              <span class="colorPrompt" v-show="parseInt(scope.row.refundStatus) > 0" style="display: block">{{
+                  scope.row.refundStatus | orderRefundStatusFilter
+                }}</span>
+             <span v-show="scope.row.refundStatus==2" class="colorPrompt">{{ `(已退款 ${scope.row.refundNum} / 购买 ${scope.row.totalNum})`}}</span>
+           </div>
+            <span v-show="scope.row.isUserDel" class="colorPrompt" style="display: block">用户已删除</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="merName" label="商户名称" min-width="150" v-if="checkedCities.includes('商户名称')" />
+        <el-table-column prop="nickName" label="用户昵称" min-width="150" v-if="checkedCities.includes('用户昵称')">
+          <template slot-scope="scope">
+            <span :class="scope.row.isLogoff == true ? 'colorPrompt' : ''">{{ scope.row.nickName }}</span>
+            <span :class="scope.row.isLogoff == true ? 'colorPrompt' : ''" v-if="scope.row.isLogoff == true">|</span>
+            <span v-if="scope.row.isLogoff == true" class="colorPrompt">(已注销)</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="payPrice" label="实际支付" min-width="80" v-if="checkedCities.includes('实际支付')" />
+        <el-table-column label="支付方式" min-width="80" v-if="checkedCities.includes('支付方式')">
+          <template slot-scope="scope">
+            <span>{{ scope.row.payType | payTypeFilter }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="订单状态" min-width="100" v-if="checkedCities.includes('订单状态')">
+          <template slot-scope="scope">
+            <span class="textE93323 tag-background notStartTag tag-padding" v-if="scope.row.refundStatus === 3"
+              >已退款</span
+            >
+            <span
+              :class="scope.row.status < 5 ? 'doingTag' : 'endTag'"
+              class="tag-background tag-padding"
+              v-else-if="
+                scope.row.groupBuyRecordStatus == 99 || scope.row.status == 9 || scope.row.groupBuyRecordStatus == 10
+              "
+              >{{ scope.row.status | orderStatusFilter }}</span
+            >
+            <span class="textE93323 tag-background notStartTag tag-padding" v-else>{{
+              scope.row.groupBuyRecordStatus == 0 ? '拼团中' : '拼团失败'
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="createTime" label="下单时间" min-width="140" v-if="checkedCities.includes('下单时间')" />
+        <el-table-column v-if="checkPermi(['platform:order:info'])" width="70" fixed="right">
+          <template slot="header">
+            <p>
+              <span style="padding-right: 5px">操作</span>
+              <i class="el-icon-setting" @click="handleAddItem"></i>
+            </p>
+          </template>
+          <template slot-scope="scope">
+            <a v-if="scope.row.groupBuyRecordStatus != 0" @click="onOrderDetails(scope.row.orderNo)"> 详情</a>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="block">
+        <el-pagination
+          background
+          :page-sizes="[20, 40, 60, 80]"
+          :page-size="tableFrom.limit"
+          :current-page="tableFrom.page"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="tableData.total"
+          @size-change="handleSizeChange"
+          @current-change="pageChange"
+        />
+      </div>
+    </el-card>
+    <div class="card_abs" v-show="card_select_show">
+      <template>
+        <div class="cell_ht">
+          <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange"
+            >全选</el-checkbox
+          >
+          <el-button type="text" @click="checkSave()">保存</el-button>
+        </div>
+        <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
+          <el-checkbox v-for="item in columnData" :label="item" :key="item" class="check_cell">{{ item }}</el-checkbox>
+        </el-checkbox-group>
+      </template>
+    </div>
+
+    <!--详情-->
+    <details-from ref="orderDetail" :orderNo="orderNo" />
+  </div>
+</template>
+
+<script>
+// +---------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +---------------------------------------------------------------------
+// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
+// +---------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +---------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +---------------------------------------------------------------------
+import { orderStatusNumApi, orderListApi, orderExcelApi } from '@/api/order';
+import detailsFrom from '@/components/OrderDetail';
+import merchantName from '@/components/merchantName';
+import { isWriteOff } from '@/utils';
+import { checkPermi } from '@/utils/permission'; // 权限判断函数
+export default {
+  name: 'orderFastMail',
+  components: {
+    detailsFrom,
+    merchantName,
+  },
+  data() {
+    return {
+      options: [
+        {
+          value: 0,
+          label: '全部',
+        },
+        {
+          value: 2,
+          label: '商城订单',
+        },
+        {
+          value: 1,
+          label: '视频号订单',
+        },
+      ],
+      RefuseVisible: false,
+      RefuseData: {},
+      orderNo: '',
+      refundVisible: false,
+      refundData: {},
+      dialogVisibleJI: false,
+      tableDataLog: {
+        data: [],
+        total: 0,
+      },
+      tableFromLog: {
+        page: 1,
+        limit: 10,
+        orderNo: 0,
+      },
+      LogLoading: false,
+      isCreate: 1,
+      editData: null,
+      dialogVisible: false,
+      tableData: {
+        data: [],
+        total: 0,
+      },
+      listLoading: true,
+      tableFrom: {
+        status: 'all',
+        dateLimit: '',
+        orderNo: '',
+        page: 1,
+        limit: 20,
+        merId: null,
+        type: '',
+        searchType: 'all',
+        content: '',
+      },
+      orderChartType: {},
+      timeVal: [],
+      fromList: this.$constants.fromList,
+      fromType: [
+        { value: '', text: '全部' },
+        { value: '0', text: '普通' },
+        { value: '1', text: '秒杀' },
+        { value: '2', text: '拼团' },
+      ],
+      selectionList: [],
+      ids: '',
+      orderids: '',
+      cardLists: [],
+      isWriteOff: isWriteOff(),
+      proType: 0,
+      active: false,
+      card_select_show: false,
+      checkAll: false,
+      checkedCities: ['订单编号', '商户名称', '用户昵称', '实际支付', '支付方式', '订单状态', '下单时间'],
+      columnData: ['订单编号', '商户名称', '用户昵称', '实际支付', '支付方式', '订单状态', '下单时间'],
+      isIndeterminate: true,
+    };
+  },
+  mounted() {
+    if (checkPermi(['platform:order:page:list'])) this.getList();
+    if (checkPermi(['platform:order:status:num'])) this.getOrderStatusNum();
+  },
+  methods: {
+    checkPermi,
+    getMerId(id) {
+      this.tableFrom.merId = id;
+      this.handleSearchList();
+    },
+    resetForm(formValue) {
+      this.dialogVisible = false;
+    },
+    handleReset() {
+      this.tableFrom.content = '';
+      this.tableFrom.searchType = 'all';
+      this.tableFrom.status = 'all';
+      this.tableFrom.dateLimit = '';
+      this.tableFrom.orderNo = '';
+      this.tableFrom.page = 1;
+      this.tableFrom.merId = null;
+      this.tableFrom.type = '';
+      this.tableFrom.searchType = 'all';
+      this.tableFrom.content = '';
+      this.timeVal = [];
+      this.handleSearchList();
+    },
+    handleSearchList() {
+      this.tableFrom.page = 1;
+      this.getList();
+      this.getOrderStatusNum();
+    },
+    // 详情
+    onOrderDetails(id) {
+      this.orderNo = id;
+      this.$refs.orderDetail.getDetail(id);
+      this.$refs.orderDetail.getOrderInvoiceList(id);
+      this.$refs.orderDetail.dialogVisible = true;
+    },
+    handleClose() {
+      this.dialogVisible = false;
+    },
+    // 选择时间
+    selectChange(tab) {
+      this.timeVal = [];
+      this.tableFrom.page = 1;
+      this.getList();
+      this.getOrderStatusNum();
+    },
+    // 具体日期
+    onchangeTime(e) {
+      this.timeVal = e;
+      this.tableFrom.dateLimit = e ? this.timeVal.join(',') : '';
+      this.tableFrom.page = 1;
+      this.getList();
+      this.getOrderStatusNum();
+    },
+    // 列表
+    getList() {
+      this.listLoading = true;
+      orderListApi(this.tableFrom)
+        .then((res) => {
+          this.tableData.data = res.list || [];
+          this.tableData.total = res.total;
+          this.listLoading = false;
+          this.checkedCities = this.$cache.local.has('order_stroge')
+            ? this.$cache.local.getJSON('order_stroge')
+            : this.checkedCities;
+        })
+        .catch(() => {
+          this.listLoading = false;
+        });
+    },
+    // 获取各状态数量
+    getOrderStatusNum() {
+      let data = Object.assign({}, this.tableFrom);
+      delete data.page;
+      delete data.limit;
+      delete data.status;
+      orderStatusNumApi(data).then((res) => {
+        this.orderChartType = res;
+      });
+    },
+    pageChange(page) {
+      this.tableFrom.page = page;
+      this.getList();
+    },
+    handleSizeChange(val) {
+      this.tableFrom.limit = val;
+      this.getList();
+    },
+    exports() {
+      let data = {
+        dateLimit: this.tableFrom.dateLimit,
+        orderNo: this.tableFrom.orderNo,
+        status: this.tableFrom.status,
+        type: this.tableFrom.type,
+        merId: this.tableFrom.merId,
+      };
+      orderExcelApi(data).then((res) => {
+        window.open(res.fileName);
+      });
+    },
+    handleAddItem() {
+      if (this.card_select_show) {
+        this.$set(this, 'card_select_show', false);
+      } else if (!this.card_select_show) {
+        this.$set(this, 'card_select_show', true);
+      }
+    },
+    handleCheckAllChange(val) {
+      this.checkedCities = val ? this.columnData : [];
+      this.isIndeterminate = false;
+    },
+    handleCheckedCitiesChange(value) {
+      let checkedCount = value.length;
+      this.checkAll = checkedCount === this.columnData.length;
+      this.isIndeterminate = checkedCount > 0 && checkedCount < this.columnData.length;
+    },
+    checkSave() {
+      this.card_select_show = false;
+      this.$modal.loading('正在保存到本地,请稍候...');
+      this.$cache.local.setJSON('order_stroge', this.checkedCities);
+      setTimeout(this.$modal.closeLoading(), 1000);
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+font {
+  color: var(--prev-color-primary);
+}
+
+.ml5 {
+  margin-left: 5px;
+}
+
+.el-table__body {
+  width: 100%;
+  table-layout: fixed !important;
+}
+
+.demo-table-expand {
+  ::v-deeplabel {
+    width: 83px !important;
+  }
+}
+
+.refunding {
+  span {
+    display: block;
+  }
+}
+
+.el-icon-arrow-down {
+  font-size: 12px;
+}
+
+.tabBox_tit {
+  font-size: 12px !important;
+  /*margin: 0 2px 0 10px;*/
+  letter-spacing: 1px;
+  /*padding: 5px 0;*/
+  box-sizing: border-box;
+}
+
+.text_overflow {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  max-width: 400px;
+}
+
+.pup_card {
+  width: 200px;
+  border-radius: 5px;
+  padding: 5px;
+  box-sizing: border-box;
+  font-size: 12px;
+  line-height: 16px;
+}
+
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.relative {
+  position: relative;
+}
+
+.card_abs {
+  position: absolute;
+  padding-bottom: 15px;
+  top: 300px;
+  right: 40px;
+  width: 200px;
+  background: #fff;
+  z-index: 99999;
+  box-shadow: 0px 0px 14px 0px rgba(0, 0, 0, 0.1);
+}
+
+.cell_ht {
+  height: 50px;
+  padding: 15px 20px;
+  box-sizing: border-box;
+  border-bottom: 1px solid #eeeeee;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.check_cell {
+  width: 100%;
+  padding: 15px 20px 0;
+}
+
+::v-deep .el-checkbox__input.is-checked + .el-checkbox__label {
+  color: #606266;
+}
+
+.tag-background {
+  padding: 3px 8px;
+}
+</style>

+ 503 - 0
mer_plat_admin/src/views/order/secondHand.vue

@@ -0,0 +1,503 @@
+<template>
+  <div class="divBox relative">
+    <el-card
+      :bordered="false"
+      shadow="never"
+      class="ivu-mt"
+      :body-style="{ padding: 0 }"
+      v-hasPermi="['platform:order:page:list']"
+    >
+      <div class="padding-add">
+        <el-form size="small" inline label-position="right" @submit.native.prevent>
+          <el-form-item label="订单编号:" label-width="66px">
+            <el-input
+              v-model.trim="tableFrom.orderNo"
+              placeholder="请输入订单编号"
+              class="selWidth"
+              size="small"
+              clearable
+              @keyup.enter.native="handleSearchList"
+            />
+          </el-form-item>
+          <el-form-item label="订单类型:">
+            <el-select
+              v-model="tableFrom.type"
+              clearable
+              size="small"
+              placeholder="请选择"
+              class="selWidth"
+              @change="handleSearchList"
+            >
+              <el-option v-for="(item, i) in fromType" :key="i" :label="item.text" :value="item.value" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="时间选择:">
+            <el-date-picker
+              v-model="timeVal"
+              value-format="yyyy-MM-dd"
+              format="yyyy-MM-dd"
+              size="small"
+              type="daterange"
+              placement="bottom-end"
+              placeholder="自定义时间"
+              @change="onchangeTime"
+              class="selWidth"
+            />
+          </el-form-item>
+          <el-form-item label="用户搜索:" label-for="nickname">
+            <UserSearchInput v-model="tableFrom" />
+          </el-form-item>
+          <el-form-item label="商户名称:">
+            <merchant-name @getMerId="getMerId" :merIdChecked="tableFrom.merId"></merchant-name>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" size="small" @click="handleSearchList">查询</el-button>
+            <el-button size="small" @click="handleReset">重置</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-card>
+    <el-card class="box-card mt14" :body-style="{ padding: '0 20px 20px' }" shadow="never" :bordered="false">
+      <el-tabs class="list-tabs" v-model="tableFrom.status" @tab-click="handleSearchList">
+        <el-tab-pane name="all" :label="`全部(${orderChartType.all || 0})`"></el-tab-pane>
+        <el-tab-pane name="unPaid" :label="`未支付(${orderChartType.unPaid || 0})`"></el-tab-pane>
+        <el-tab-pane name="notShipped" :label="`未发货(${orderChartType.notShipped || 0})`"></el-tab-pane>
+        <el-tab-pane name="spike" :label="`待收货(${orderChartType.spike || 0})`"></el-tab-pane>
+        <el-tab-pane name="awaitVerification" :label="`待核销(${orderChartType.verification || 0})`"></el-tab-pane>
+        <el-tab-pane name="receiving" :label="`已收货(${orderChartType.receiving || 0})`"></el-tab-pane>
+        <el-tab-pane name="complete" :label="`已完成(${orderChartType.complete || 0})`"></el-tab-pane>
+        <el-tab-pane name="refunded" :label="`已退款(${orderChartType.refunded || 0})`"></el-tab-pane>
+        <el-tab-pane name="cancel" :label="`已取消(${orderChartType.cancel || 0})`"></el-tab-pane>
+        <el-tab-pane name="deleted" :label="`已删除(${orderChartType.deleted || 0})`"></el-tab-pane>
+      </el-tabs>
+      <div class="mt5">
+        <el-button size="small" @click="exports" v-hasPermi="['platform:export:order:excel']">导出</el-button>
+      </div>
+      <el-table
+        v-loading="listLoading"
+        :data="tableData.data"
+        size="small"
+        highlight-current-row
+        :row-key="
+          (row) => {
+            return row.orderNo;
+          }
+        "
+        class="mt20"
+      >
+        <el-table-column label="订单编号" min-width="220" v-if="checkedCities.includes('订单编号')">
+          <template slot-scope="scope">
+            <div class="acea-row">
+              <font v-show="scope.row.type === 1" class="mr5">[秒杀]</font>
+              <font v-show="scope.row.type === 2" class="mr5">[拼团]</font>
+              <span
+                style="display: block"
+                v-text="scope.row.orderNo"
+              />
+            </div>
+           <div class="flex">
+              <span class="colorPrompt" v-show="parseInt(scope.row.refundStatus) > 0" style="display: block">{{
+                  scope.row.refundStatus | orderRefundStatusFilter
+                }}</span>
+             <span v-show="scope.row.refundStatus==2" class="colorPrompt">{{ `(已退款 ${scope.row.refundNum} / 购买 ${scope.row.totalNum})`}}</span>
+           </div>
+            <span v-show="scope.row.isUserDel" class="colorPrompt" style="display: block">用户已删除</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="merName" label="商户名称" min-width="150" v-if="checkedCities.includes('商户名称')" />
+        <el-table-column prop="nickName" label="用户昵称" min-width="150" v-if="checkedCities.includes('用户昵称')">
+          <template slot-scope="scope">
+            <span :class="scope.row.isLogoff == true ? 'colorPrompt' : ''">{{ scope.row.nickName }}</span>
+            <span :class="scope.row.isLogoff == true ? 'colorPrompt' : ''" v-if="scope.row.isLogoff == true">|</span>
+            <span v-if="scope.row.isLogoff == true" class="colorPrompt">(已注销)</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="payPrice" label="实际支付" min-width="80" v-if="checkedCities.includes('实际支付')" />
+        <el-table-column label="支付方式" min-width="80" v-if="checkedCities.includes('支付方式')">
+          <template slot-scope="scope">
+            <span>{{ scope.row.payType | payTypeFilter }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="订单状态" min-width="100" v-if="checkedCities.includes('订单状态')">
+          <template slot-scope="scope">
+            <span class="textE93323 tag-background notStartTag tag-padding" v-if="scope.row.refundStatus === 3"
+              >已退款</span
+            >
+            <span
+              :class="scope.row.status < 5 ? 'doingTag' : 'endTag'"
+              class="tag-background tag-padding"
+              v-else-if="
+                scope.row.groupBuyRecordStatus == 99 || scope.row.status == 9 || scope.row.groupBuyRecordStatus == 10
+              "
+              >{{ scope.row.status | orderStatusFilter }}</span
+            >
+            <span class="textE93323 tag-background notStartTag tag-padding" v-else>{{
+              scope.row.groupBuyRecordStatus == 0 ? '拼团中' : '拼团失败'
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="createTime" label="下单时间" min-width="140" v-if="checkedCities.includes('下单时间')" />
+        <el-table-column v-if="checkPermi(['platform:order:info'])" width="70" fixed="right">
+          <template slot="header">
+            <p>
+              <span style="padding-right: 5px">操作</span>
+              <i class="el-icon-setting" @click="handleAddItem"></i>
+            </p>
+          </template>
+          <template slot-scope="scope">
+            <a v-if="scope.row.groupBuyRecordStatus != 0" @click="onOrderDetails(scope.row.orderNo)"> 详情</a>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="block">
+        <el-pagination
+          background
+          :page-sizes="[20, 40, 60, 80]"
+          :page-size="tableFrom.limit"
+          :current-page="tableFrom.page"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="tableData.total"
+          @size-change="handleSizeChange"
+          @current-change="pageChange"
+        />
+      </div>
+    </el-card>
+    <div class="card_abs" v-show="card_select_show">
+      <template>
+        <div class="cell_ht">
+          <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange"
+            >全选</el-checkbox
+          >
+          <el-button type="text" @click="checkSave()">保存</el-button>
+        </div>
+        <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
+          <el-checkbox v-for="item in columnData" :label="item" :key="item" class="check_cell">{{ item }}</el-checkbox>
+        </el-checkbox-group>
+      </template>
+    </div>
+
+    <!--详情-->
+    <details-from ref="orderDetail" :orderNo="orderNo" />
+  </div>
+</template>
+
+<script>
+// +---------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +---------------------------------------------------------------------
+// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
+// +---------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +---------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +---------------------------------------------------------------------
+import { orderStatusNumApi, orderListApi, orderExcelApi } from '@/api/order';
+import detailsFrom from '@/components/OrderDetail';
+import merchantName from '@/components/merchantName';
+import { isWriteOff } from '@/utils';
+import { checkPermi } from '@/utils/permission'; // 权限判断函数
+export default {
+  name: 'orderSecondHand',
+  components: {
+    detailsFrom,
+    merchantName,
+  },
+  data() {
+    return {
+      options: [
+        {
+          value: 0,
+          label: '全部',
+        },
+        {
+          value: 2,
+          label: '商城订单',
+        },
+        {
+          value: 1,
+          label: '视频号订单',
+        },
+      ],
+      RefuseVisible: false,
+      RefuseData: {},
+      orderNo: '',
+      refundVisible: false,
+      refundData: {},
+      dialogVisibleJI: false,
+      tableDataLog: {
+        data: [],
+        total: 0,
+      },
+      tableFromLog: {
+        page: 1,
+        limit: 10,
+        orderNo: 0,
+      },
+      LogLoading: false,
+      isCreate: 1,
+      editData: null,
+      dialogVisible: false,
+      tableData: {
+        data: [],
+        total: 0,
+      },
+      listLoading: true,
+      tableFrom: {
+        status: 'all',
+        dateLimit: '',
+        orderNo: '',
+        page: 1,
+        limit: 20,
+        merId: null,
+        type: '',
+        searchType: 'all',
+        content: '',
+      },
+      orderChartType: {},
+      timeVal: [],
+      fromList: this.$constants.fromList,
+      fromType: [
+        { value: '', text: '全部' },
+        { value: '0', text: '普通' },
+        { value: '1', text: '秒杀' },
+        { value: '2', text: '拼团' },
+      ],
+      selectionList: [],
+      ids: '',
+      orderids: '',
+      cardLists: [],
+      isWriteOff: isWriteOff(),
+      proType: 0,
+      active: false,
+      card_select_show: false,
+      checkAll: false,
+      checkedCities: ['订单编号', '商户名称', '用户昵称', '实际支付', '支付方式', '订单状态', '下单时间'],
+      columnData: ['订单编号', '商户名称', '用户昵称', '实际支付', '支付方式', '订单状态', '下单时间'],
+      isIndeterminate: true,
+    };
+  },
+  mounted() {
+    if (checkPermi(['platform:order:page:list'])) this.getList();
+    if (checkPermi(['platform:order:status:num'])) this.getOrderStatusNum();
+  },
+  methods: {
+    checkPermi,
+    getMerId(id) {
+      this.tableFrom.merId = id;
+      this.handleSearchList();
+    },
+    resetForm(formValue) {
+      this.dialogVisible = false;
+    },
+    handleReset() {
+      this.tableFrom.content = '';
+      this.tableFrom.searchType = 'all';
+      this.tableFrom.status = 'all';
+      this.tableFrom.dateLimit = '';
+      this.tableFrom.orderNo = '';
+      this.tableFrom.page = 1;
+      this.tableFrom.merId = null;
+      this.tableFrom.type = '';
+      this.tableFrom.searchType = 'all';
+      this.tableFrom.content = '';
+      this.timeVal = [];
+      this.handleSearchList();
+    },
+    handleSearchList() {
+      this.tableFrom.page = 1;
+      this.getList();
+      this.getOrderStatusNum();
+    },
+    // 详情
+    onOrderDetails(id) {
+      this.orderNo = id;
+      this.$refs.orderDetail.getDetail(id);
+      this.$refs.orderDetail.getOrderInvoiceList(id);
+      this.$refs.orderDetail.dialogVisible = true;
+    },
+    handleClose() {
+      this.dialogVisible = false;
+    },
+    // 选择时间
+    selectChange(tab) {
+      this.timeVal = [];
+      this.tableFrom.page = 1;
+      this.getList();
+      this.getOrderStatusNum();
+    },
+    // 具体日期
+    onchangeTime(e) {
+      this.timeVal = e;
+      this.tableFrom.dateLimit = e ? this.timeVal.join(',') : '';
+      this.tableFrom.page = 1;
+      this.getList();
+      this.getOrderStatusNum();
+    },
+    // 列表
+    getList() {
+      this.listLoading = true;
+      orderListApi(this.tableFrom)
+        .then((res) => {
+          this.tableData.data = res.list || [];
+          this.tableData.total = res.total;
+          this.listLoading = false;
+          this.checkedCities = this.$cache.local.has('order_stroge')
+            ? this.$cache.local.getJSON('order_stroge')
+            : this.checkedCities;
+        })
+        .catch(() => {
+          this.listLoading = false;
+        });
+    },
+    // 获取各状态数量
+    getOrderStatusNum() {
+      let data = Object.assign({}, this.tableFrom);
+      delete data.page;
+      delete data.limit;
+      delete data.status;
+      orderStatusNumApi(data).then((res) => {
+        this.orderChartType = res;
+      });
+    },
+    pageChange(page) {
+      this.tableFrom.page = page;
+      this.getList();
+    },
+    handleSizeChange(val) {
+      this.tableFrom.limit = val;
+      this.getList();
+    },
+    exports() {
+      let data = {
+        dateLimit: this.tableFrom.dateLimit,
+        orderNo: this.tableFrom.orderNo,
+        status: this.tableFrom.status,
+        type: this.tableFrom.type,
+        merId: this.tableFrom.merId,
+      };
+      orderExcelApi(data).then((res) => {
+        window.open(res.fileName);
+      });
+    },
+    handleAddItem() {
+      if (this.card_select_show) {
+        this.$set(this, 'card_select_show', false);
+      } else if (!this.card_select_show) {
+        this.$set(this, 'card_select_show', true);
+      }
+    },
+    handleCheckAllChange(val) {
+      this.checkedCities = val ? this.columnData : [];
+      this.isIndeterminate = false;
+    },
+    handleCheckedCitiesChange(value) {
+      let checkedCount = value.length;
+      this.checkAll = checkedCount === this.columnData.length;
+      this.isIndeterminate = checkedCount > 0 && checkedCount < this.columnData.length;
+    },
+    checkSave() {
+      this.card_select_show = false;
+      this.$modal.loading('正在保存到本地,请稍候...');
+      this.$cache.local.setJSON('order_stroge', this.checkedCities);
+      setTimeout(this.$modal.closeLoading(), 1000);
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+font {
+  color: var(--prev-color-primary);
+}
+
+.ml5 {
+  margin-left: 5px;
+}
+
+.el-table__body {
+  width: 100%;
+  table-layout: fixed !important;
+}
+
+.demo-table-expand {
+  ::v-deeplabel {
+    width: 83px !important;
+  }
+}
+
+.refunding {
+  span {
+    display: block;
+  }
+}
+
+.el-icon-arrow-down {
+  font-size: 12px;
+}
+
+.tabBox_tit {
+  font-size: 12px !important;
+  /*margin: 0 2px 0 10px;*/
+  letter-spacing: 1px;
+  /*padding: 5px 0;*/
+  box-sizing: border-box;
+}
+
+.text_overflow {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  max-width: 400px;
+}
+
+.pup_card {
+  width: 200px;
+  border-radius: 5px;
+  padding: 5px;
+  box-sizing: border-box;
+  font-size: 12px;
+  line-height: 16px;
+}
+
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.relative {
+  position: relative;
+}
+
+.card_abs {
+  position: absolute;
+  padding-bottom: 15px;
+  top: 300px;
+  right: 40px;
+  width: 200px;
+  background: #fff;
+  z-index: 99999;
+  box-shadow: 0px 0px 14px 0px rgba(0, 0, 0, 0.1);
+}
+
+.cell_ht {
+  height: 50px;
+  padding: 15px 20px;
+  box-sizing: border-box;
+  border-bottom: 1px solid #eeeeee;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.check_cell {
+  width: 100%;
+  padding: 15px 20px 0;
+}
+
+::v-deep .el-checkbox__input.is-checked + .el-checkbox__label {
+  color: #606266;
+}
+
+.tag-background {
+  padding: 3px 8px;
+}
+</style>

+ 1 - 1
mer_uniapp/pages/substitute_fast_mail/components/fast_mail_figure/index.vue

@@ -4,7 +4,7 @@
 			<!-- #ifdef MP-->
 			<view class="mp-header" :style="{top: navH + 'rpx'}">
 				<view class=" flex-col flex-center" style="background-color: #fff;">
-					<view class="flex-y-center" style="justify-content: flex-end;padding: 10rpx 19rpx 38rpx 19rpx;width: 100%;">
+					<view class="flex-y-center" style="justify-content: flex-end;padding: 20rpx 19rpx 38rpx 19rpx;width: 100%;">
 						<image style="width: 39rpx;height: 39rpx;" src="/static/img/chacha.png" @tap="onCancel"></image>
 					</view>
 					<view class="upload">

+ 37 - 3
mer_uniapp/pages/substitute_fast_mail/components/fast_mail_order/index.vue

@@ -4,12 +4,12 @@
 			<!-- #ifdef MP-->
 			<view class="mp-header" :style="{top: navH + 'rpx'}">
 				<view class="flex-col flex-center" style="background-color: #fff;">
-					<view class="flex-y-center" style="justify-content: space-between;padding: 10rpx 19rpx 38rpx 19rpx;width: 100%;">
+					<view class="flex-y-center" style="justify-content: space-between;padding: 20rpx 19rpx 38rpx 19rpx;width: 100%;">
 						<view style="opacity: 0;">1</view>
 						<view style="font-weight: 600;font-size: 27rpx;color: #141414;">订单提交成功</view>
 						<image style="width: 39rpx;height: 39rpx;" src="/static/img/chacha.png" @tap="onCancel"></image>
 					</view>
-					<view class="flex-wrap flex-around-center">
+					<view class="flex-wrap flex-around-center" style="width: 100%;">
 						<view class="send-item">
 							<view class="flex-between-center">
 								<view class="remark-name">取件地</view>
@@ -173,10 +173,44 @@
 		color: #FFFFFF;
 		margin: 58rpx 0 96rpx 0;
 	}
-	
+
 	.mark {
+		padding: 39rpx 0 0 23rpx;
+		width: 100%;
 		font-weight: 500;
 		font-size: 23rpx;
 		color: $bg-color-primary;
 	}
+
+	.send-item {
+		flex: 1;
+		overflow: hidden;
+		margin-top: 10rpx;
+		padding-left: 23rpx;
+		background: #FFFFFF;
+		border-radius: 23rpx 23rpx 0rpx 0rpx;
+
+		.remark-name {
+			font-weight: 600;
+			font-size: 27rpx;
+			color: #141414;
+		}
+
+		.flex-between-center {
+			// padding: 19rpx 0;
+			height: 80rpx;
+			border-bottom: 2rpx solid #D6D7DC;
+
+			.flex-y-center {
+				height: 100%;
+				padding-right: 39rpx;
+			}
+
+			.no-con {
+				font-weight: 400;
+				font-size: 27rpx;
+				color: #D6D7DC;
+			}
+		}
+	}
 </style>

+ 1 - 1
mer_uniapp/pages/substitute_fast_mail/components/fast_mail_point/index.vue

@@ -4,7 +4,7 @@
 			<!-- #ifdef MP-->
 			<view class="mp-header" :style="{top: navH + 'rpx'}">
 				<view class=" flex-col flex-center" style="background-color: #fff;">
-					<view class="flex-y-center" style="justify-content: space-between;padding: 10rpx 19rpx 38rpx 19rpx;width: 100%;">
+					<view class="flex-y-center" style="justify-content: space-between;padding: 20rpx 19rpx 38rpx 19rpx;width: 100%;">
 						<view style="opacity: 0;">1</view>
 						<view style="font-weight: 600;font-size: 27rpx;color: #141414;">选择快递点</view>
 						<image style="width: 39rpx;height: 39rpx;" src="/static/img/chacha.png" @tap="onCancel"></image>

+ 1 - 1
mer_uniapp/pages/substitute_fast_mail/components/fast_mail_specs/index.vue

@@ -4,7 +4,7 @@
 			<!-- #ifdef MP-->
 			<view class="mp-header" :style="{top: navH + 'rpx'}">
 				<view class=" flex-col flex-center" style="background-color: #fff;">
-					<view class="flex-y-center" style="justify-content: flex-end;padding: 10rpx 19rpx 38rpx 19rpx;width: 100%;">
+					<view class="flex-y-center" style="justify-content: flex-end;padding: 20rpx 19rpx 38rpx 19rpx;width: 100%;">
 						<image style="width: 39rpx;height: 39rpx;" src="/static/img/chacha.png" @tap="onCancel"></image>
 					</view>
 					<view class="flex-wrap flex-around-center" style="margin: 0 100rpx;gap: 20rpx;width: 100%;">

+ 1 - 1
mer_uniapp/pages/substitute_fast_mail/components/fast_mail_tip/index.vue

@@ -4,7 +4,7 @@
 			<!-- #ifdef MP-->
 			<view class="mp-header" :style="{top: navH + 'rpx'}">
 				<view class="flex-col flex-center" style="background-color: #fff;">
-					<view class="flex-y-center" style="justify-content: space-between;padding: 10rpx 19rpx 38rpx 19rpx;width: 100%;">
+					<view class="flex-y-center" style="justify-content: space-between;padding: 20rpx 19rpx 38rpx 19rpx;width: 100%;">
 						<view style="opacity: 0;">1</view>
 						<view style="font-weight: 600;font-size: 27rpx;color: #141414;">随心小费</view>
 						<image style="width: 39rpx;height: 39rpx;" src="/static/img/chacha.png" @tap="onCancel"></image>

+ 5 - 28
mer_uniapp/pages/substitute_fast_mail/home/index.vue

@@ -36,7 +36,7 @@
 				</button>
 			</view>
 		</view>
-		<fast-mail-order v-if="isOrder"></fast-mail-order>
+		<fast-mail-order v-if="isOrder"  @onCancel="onCanCel"></fast-mail-order>
 	</view>
 </template>
 
@@ -128,8 +128,10 @@
 			toPay() {
 				this.isOrder = true
 				console.log(this.$refs.takeFastMailRef, 'refffffffffffffffffffffffff')
-				console.log(this.formsObj, 1111111)
-			}
+			},
+			onCanCel(val) {
+				this.isOrder = val
+			},
 		}
 	}
 </script>
@@ -279,29 +281,4 @@
 			}
 		}
 	}
-
-	.send-item {
-		flex: 1;
-		overflow: hidden;
-		margin-top: 10rpx;
-		padding: 88rpx 0rpx 0 23rpx;
-		background: #FFFFFF;
-		border-radius: 23rpx 23rpx 0rpx 0rpx;
-
-		.remark-name {
-			font-weight: 600;
-			font-size: 27rpx;
-			color: #141414;
-		}
-
-		.flex-between-center {
-			// padding: 19rpx 0;
-			height: 80rpx;
-			border-bottom: 2rpx solid #D6D7DC;
-
-			.flex-y-center {
-				height: 100%;
-			}
-		}
-	}
 </style>