zhaoyun 2 周之前
父節點
當前提交
8eadcb3b1d

+ 15 - 3
mer_plat_admin/src/components/linkaddress/linkData.json

@@ -229,6 +229,18 @@
         "sort": 0,
         "add_time": 1626837579
       },
+	  {
+	    "id": 171,
+	    "cate_id": 5,
+	    "type": 3,
+	    "name": "我的快递",
+	    "url": "/pages/substitute_fast_mail/my_fast_mail/index",
+	    "param": " ",
+	    "example": "/pages/substitute_fast_mail/my_fast_mail/index",
+	    "status": 1,
+	    "sort": 0,
+	    "add_time": 1626837579
+	  },
       {
         "id": 18,
         "cate_id": 5,
@@ -293,10 +305,10 @@
 			  "id": 222,
 			  "cate_id": 5,
 			  "type": 1,
-			  "name": "骑手接单",
-			  "url": "/pages/rider_index/index",
+			  "name": "骑手入驻",
+			  "url": "/pages/users/user_rider/index",
 			  "param": " ",
-			  "example": "/pages/rider_index/index",
+			  "example": "/pages/users/user_rider/index",
 			  "status": 1,
 			  "sort": 998,
 			  "add_time": 1626837579

+ 33 - 0
mer_plat_admin/src/router/modules/express.js

@@ -0,0 +1,33 @@
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+import Layout from '@/layout';
+
+const expressRouter = {
+  path: '/express',
+  component: Layout,
+  redirect: '/express/list',
+  name: 'Express',
+  alwaysShow: true,
+  meta: {
+    title: '订单',
+    icon: 'clipboard',
+  },
+  children: [
+    {
+      path: 'list',
+      component: () => import('@/views/express/index'),
+      name: 'OrderIndex',
+      meta: { title: '订单' },
+    }
+  ],
+};
+
+export default expressRouter;

+ 569 - 0
mer_plat_admin/src/views/express/components/orderDetail.vue

@@ -0,0 +1,569 @@
+<template>
+  <div>
+    <el-drawer :visible.sync="dialogVisible" :direction="direction" size="1000px" :before-close="handleClose">
+      <div slot="title" class="demo-drawer_title">
+        <div class="detailHead">
+          <div class="full">
+            <div class="order_icon"><span class="iconfont icon-dingdan"></span></div>
+            <div class="text">
+              <div class="title">{{ orderDatalist.type | orderTypeFilter }}</div>
+              <div>
+                <span class="mr20">订单号:{{ orderDatalist.orderNo }}</span>
+              </div>
+            </div>
+          </div>
+          <ul class="list">
+            <li class="item">
+              <div class="title">订单状态</div>
+              <div class="color-warning">
+                <span v-if="orderDatalist.refundStatus === 3">已退款</span>
+                <span v-else>{{ orderDatalist.status | orderStatusFilter }}</span>
+              </div>
+            </li>
+            <li class="item">
+              <div class="title">实际支付</div>
+              <div>¥ {{ orderDatalist.payPrice || '0.0' }}</div>
+            </li>
+            <li class="item">
+              <div class="title">支付方式</div>
+              <div>{{ orderDatalist.payType | payTypeFilter }}</div>
+            </li>
+            <li class="item">
+              <div class="title">创建时间</div>
+              <div>{{ orderDatalist.createTime | filterEmpty }}</div>
+            </li>
+          </ul>
+        </div>
+      </div>
+      <div v-if="orderDatalist" v-loading="loading">
+        <el-tabs type="border-card" v-model="activeName">
+          <el-tab-pane label="订单信息" name="detail">
+            <div class="detailSection" style="border: none">
+              <div class="title">用户信息</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">用户名称:</div>
+                  <div class="value">{{ orderDatalist.nickname }} | {{ orderDatalist.uid }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">用户电话:</div>
+                  <div class="value">{{ orderDatalist.phone }}</div>
+                </li>
+              </ul>
+            </div>
+            <div v-show="orderDatalist.shippingType < 2 " class="detailSection">
+              <div class="title">收货信息</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">收货人:</div>
+                  <div class="value">
+                    {{ orderDatalist.realName }}
+                  </div>
+                </li>
+                <li class="item">
+                  <div class="lang">收货电话:</div>
+                  <div class="value">
+                    {{ orderDatalist.userPhone }}
+                  </div>
+                </li>
+                <li class="item">
+                  <div class="lang">收货地址:</div>
+                  <div class="value">
+                    {{ orderDatalist.userAddress }}
+                  </div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">订单信息</div>
+              <ul class="list">
+                <li class="item">
+                  <div class="lang">商品总价:</div>
+                  <div class="value">{{ orderDatalist.proTotalPrice }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">商品总数:</div>
+                  <div class="value">{{ orderDatalist.totalNum }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">平台优惠金额:</div>
+                  <div class="value">{{ orderDatalist.platCouponPrice }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付状态:</div>
+                  <div class="value">{{ orderDatalist.paid ? '已支付' : '未支付' }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">实际支付:</div>
+                  <div class="value">{{ orderDatalist.payPrice || '0.0' }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">商户优惠金额:</div>
+                  <div class="value">{{ orderDatalist.merCouponPrice || '0.0' }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">会员抵扣金额:</div>
+                  <div class="value">{{ orderDatalist.svipDiscountPrice || '0.0' }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付邮费:</div>
+                  <div class="value">{{ orderDatalist.payPostage }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">赠送积分:</div>
+                  <div class="value">{{ orderDatalist.gainIntegral }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">积分抵扣金额:</div>
+                  <div class="value">{{ orderDatalist.integralPrice || '0.0' }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付方式:</div>
+                  <div class="value">{{ orderDatalist.payType | payTypeFilter }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">配送方式:</div>
+                  <div v-if="Number(orderDatalist.secondType) > 4" class="value">自动发货</div>
+                  <div v-else-if="Number(orderDatalist.secondType) == 2" class="value">虚拟发货</div>
+                  <div v-else class="value">{{ orderDatalist.shippingType | shippingTypeFilter }}</div>
+                </li>
+                <li class="item">
+                  <div class="lang">支付时间:</div>
+                  <div class="value">{{ orderDatalist.payTime | filterEmpty }}</div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">买家留言</div>
+              <ul class="list">
+                <li class="item">
+                  <div>{{ orderDatalist.userRemark | filterEmpty }}</div>
+                </li>
+              </ul>
+            </div>
+            <div class="detailSection">
+              <div class="title">商家备注</div>
+              <ul class="list">
+                <li class="item">
+                  <div>{{ orderDatalist.merchantRemark | filterEmpty }}</div>
+                </li>
+              </ul>
+            </div>
+            <div v-if="orderExtend.length && orderDatalist.secondType !== 1" class="detailSection">
+              <div class="title">自定义留言</div>
+              <ul class="list">
+                <li class="item" v-for="(item, index) in orderExtend" :key="index">
+                  <div class="lang" :title="item.title">{{ item.title }}</div>
+                  <div>{{ item.title.includes(':') ? '' : ':' }}</div>
+                  <div v-if="!Array.isArray(item.value)" class="value">{{ item.value | filterEmpty }}</div>
+                  <div v-else class="flex conter">
+                    <template v-if="item.value">
+                      <div v-for="(pic, idx) in item.value" :key="idx">
+                        <el-image v-if="pic.includes('http')" class="pictrue" :src="pic" :preview-src-list="[pic]" />
+                        <div v-else class="text-14px fontColor333 ml-5px acea-row row-middle mr5">
+                          {{ pic }}
+                          <div style="margin-left: 6px" v-show="idx < item.value.length - 1">-</div>
+                        </div>
+                      </div>
+                    </template>
+                    <template v-else> - </template>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="商品信息" name="goods">
+            <el-table class="mt20 orderDetailList" :data="orderDatalist.orderDetailList" size="small">
+              <el-table-column label="商品信息" min-width="400" :show-overflow-tooltip="true">
+                <template slot-scope="scope">
+                  <div class="acea-row row-middle">
+                    <div class="demo-image__preview mr15 line-heightOne">
+                      <el-image :src="scope.row.image" :preview-src-list="[scope.row.image]" />
+                    </div>
+                    <div style="width: 408px">
+                      <div class="line1 mb10">{{ scope.row.productName }}</div>
+                      <div class="line1 color-909399 line-heightOne">规格:{{ scope.row.sku }}</div>
+                    </div>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="商品售价" min-width="90">
+                <template slot-scope="scope">
+                  <div class="acea-row row-middle">
+                    <div class="line1">
+                      {{ scope.row.price }}
+                    </div>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="购买数量" min-width="90">
+                <template slot-scope="scope">
+                  <div class="acea-row row-middle">
+                    <div class="line1">
+                      {{ scope.row.payNum }}
+                    </div>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column :label="orderDatalist.shippingType == 2 ? '核销数量' : '发货数量'" min-width="90">
+                <template slot-scope="scope">
+                  <div class="acea-row row-middle">
+                    <div class="line1">
+                      {{ scope.row.deliveryNum }}
+                    </div>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="售后数量" min-width="90">
+                <template slot-scope="scope">
+                  <div class="acea-row row-middle">
+                    <div class="line1 mb10 line-heightOne">退款中:{{ scope.row.applyRefundNum }}</div>
+                    <div class="line1 line-heightOne">退款成功:{{ scope.row.refundNum }}</div>
+                  </div>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-tab-pane>
+          <el-tab-pane
+            v-if="
+              orderDatalist.status > 1 &&
+              orderDatalist.status < 9 &&
+              orderDatalist.secondType < 5 &&
+              orderDatalist.status !== 3 &&
+              orderDatalist.shippingType != 2
+            "
+            label="发货记录"
+            name="delivery"
+            class="tabBox"
+          >
+            <template v-for="item in InvoiceList">
+              <div v-if="InvoiceList.length">
+                <el-table class="mt20" :data="item.detailList" size="small" :key="item.id">
+                  <el-table-column min-width="400">
+                    <template slot="header" slot-scope="scope">
+                      <template v-if="item.deliveryType === 'express'">
+                        <span class="font-color">【快递配送】</span>
+                        <span>{{ item.expressName + ':' + item.trackingNumber }}</span>
+                        <span class="ml30">{{ item.createTime }}</span>
+                      </template>
+                      <template v-else-if="item.deliveryType === 'merchant'">
+                        <span class="font-color">【商家送货】</span>
+                        <span>{{ item.deliveryCarrier + ':' + item.carrierPhone }}</span>
+                        <span class="ml30">{{ item.createTime }}</span>
+                      </template>
+                      <template v-else>
+                        <span class="font-color"
+                          >【{{
+                            orderDatalist.secondType === OrderSecondTypeEnum.Fictitious ? '虚拟发货' : '无需配送'
+                          }}】</span
+                        >
+                        <span>{{ item.createTime }}</span>
+                      </template>
+                    </template>
+                    <template slot-scope="scope">
+                      <div class="acea-row row-middle">
+                        <div class="demo-image__preview mr15">
+                          <el-image :src="scope.row.image" :preview-src-list="[scope.row.image]" />
+                        </div>
+                        <div>
+                          <div class="line1 mb10 line-heightOne">{{ scope.row.productName }}</div>
+                          <div class="line1 color-909399 line-heightOne">规格:{{ scope.row.sku }}</div>
+                        </div>
+                        <div class="acea-row row-middle ml30">
+                          <div class="line1 font12 color-text">X {{ scope.row.num }}</div>
+                        </div>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column width="400" fixed="right">
+                    <template slot="header" slot-scope="scope">
+                      <div class="flex mr10" style="justify-content: flex-end">
+                        <a
+                          class="ml20"
+                          @click="openLogistics(item.id, item.expressName)"
+                          style="line-height: 1; height: auto"
+                          v-if="checkPermi(['platform:order:logistics:info']) && item.deliveryType === 'express'"
+                          >查看物流
+                        </a>
+                      </div>
+                    </template>
+                    <template v-if="item.deliveryType === 'noNeed'" slot-scope="scope">
+                      <div class="acea-row row-middle">
+                        <div class="font12 color-text">发货备注:{{ item.deliveryMark }}</div>
+                      </div>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </template>
+            <!--            <div v-if="parseFloat(orderDatalist.shippingType) === 2">-->
+            <!--              <div class="detailSection">-->
+            <!--                <ul class="list">-->
+            <!--                  <li class="item">-->
+            <!--                    <div>核销员名称:</div>-->
+            <!--                    <div class="value">{{ orderDatalist.clerkName }} | {{ orderDatalist.clerkId }}</div>-->
+            <!--                  </li>-->
+            <!--                </ul>-->
+            <!--              </div>-->
+            <!--            </div>-->
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+    </el-drawer>
+    <el-dialog v-if="orderDatalist" title="提示" :visible.sync="modal2" width="600px">
+      <div class="logistics acea-row row-top">
+        <div class="logistics_img"><img src="@/assets/imgs/expressi.jpg" /></div>
+        <div class="logistics_cent">
+          <span class="mb10">物流公司:{{ expressName }}</span>
+          <span>物流单号:{{ resultInfo.number }}</span>
+          <span v-show="resultInfo.courierPhone">快递站:{{ resultInfo.courierPhone }}</span>
+          <span v-show="resultInfo.courierPhone">快递员电话:{{ resultInfo.courierPhone }}</span>
+        </div>
+      </div>
+      <div class="acea-row row-column-around trees-coadd">
+        <div class="scollhide">
+          <el-timeline :reverse="reverse">
+            <el-timeline-item v-for="(item, i) in result" :key="i">
+              <p class="time" v-text="item.time"></p>
+              <p class="content" v-text="item.status"></p>
+            </el-timeline-item>
+          </el-timeline>
+        </div>
+      </div>
+      <span slot="footer">
+        <el-button type="primary" @click="modal2 = false">关闭</el-button>
+      </span>
+    </el-dialog>
+  </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 { getLogisticsInfoApi, orderInvoiceListApi, orderDetailApi, refundOrderDetailApi } from '@/api/secondHand';
+import { checkPermi } from '@/utils/permission'; // 权限判断函数
+import { OrderSecondTypeEnum } from '@/enums/productEnums';
+export default {
+  name: 'OrderDetail',
+  props: {
+    orderNo: {
+      type: String,
+      default: 0,
+    },
+  },
+  data() {
+    return {
+      OrderSecondTypeEnum: OrderSecondTypeEnum,
+      activeName: 'detail',
+      direction: 'rtl',
+      reverse: true,
+      dialogVisible: false,
+      orderDatalist: {},
+      loading: false,
+      modal2: false,
+      result: [],
+      resultInfo: {},
+      InvoiceList: [],
+      refundInfo: {},
+      expressName: '', //快递名称
+      orderExtend: [], //系统表单数据
+    };
+  },
+  watch: {},
+  mounted() {
+    this.activeName = 'detail';
+  },
+  methods: {
+    checkPermi,
+    tabClick(tab) {
+      if (tab.name == 'orderList') {
+        //this.getRecordList();
+      }
+    },
+    handleClose() {
+      this.dialogVisible = false;
+    },
+    openLogistics(id, expressName) {
+      this.expressName = expressName;
+      this.getOrderData(id);
+      this.modal2 = true;
+    },
+    // 获取订单退款信息
+    getRefundOrderDetail(id) {
+      refundOrderDetailApi(id).then(async (res) => {
+        this.refundInfo = res;
+      });
+    },
+    // 获取订单物流信息
+    getOrderData(id) {
+      getLogisticsInfoApi(id).then(async (res) => {
+        this.resultInfo = res;
+        this.result = res.list;
+      });
+    },
+    // 获取订单发货单列表
+    getOrderInvoiceList(id) {
+      orderInvoiceListApi(id)
+        .then((res) => {
+          this.InvoiceList = res;
+        })
+        .catch(() => {});
+    },
+    getDetail(id) {
+      this.loading = true;
+      orderDetailApi({ orderNo: id })
+        .then((res) => {
+          this.orderDatalist = res;
+          this.orderExtend = res.orderExtend ? JSON.parse(res.orderExtend) : [];
+          this.activeName = 'detail';
+          this.loading = false;
+        })
+        .catch(() => {
+          this.orderDatalist = null;
+          this.loading = false;
+        });
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+::v-deep .el-drawer__header {
+  display: flex !important;
+  align-items: flex-start !important;
+  padding: 15px 15px 0 15px !important;
+  margin: 0 !important;
+}
+::v-deep .el-drawer__body{
+  padding: 0 0 30px 0 !important;
+}
+::v-deep .demo-drawer_title {
+  width: 90%;
+}
+::v-deep .el-tabs__content {
+  padding: 0 20px !important;
+}
+.detailSection {
+  padding: 25px 15px !important;
+}
+::v-deep .el-table th.el-table__cell > .cell,
+::v-deep.el-table .cell,
+.el-table--border .el-table__cell:first-child .cell {
+  padding-left: 15px;
+}
+.InvoiceList {
+  ::v-deep.el-collapse-item__header {
+    font-size: 12px;
+    color: #606266;
+  }
+}
+
+.wrapper {
+  background-color: #fff;
+  margin-top: 7px;
+  padding: 10px 12px;
+  &-num {
+    font-size: 10px;
+    color: #999999;
+  }
+
+  &-title {
+    color: #666666;
+    font-size: 12px;
+  }
+
+  &-img {
+    width: 60px;
+    height: 60px;
+    margin-right: 10px;
+    border-radius: 7px;
+    overflow: hidden;
+    margin-bottom: 10px;
+
+    image {
+      width: 100%;
+      height: 100%;
+    }
+
+    &:nth-child(5n) {
+      margin-right: 0;
+    }
+  }
+}
+
+.demo-drawer__content {
+  padding: 0 30px;
+}
+
+.demo-image__preview {
+  display: inline-block;
+  .el-image {
+    width: 50px;
+    height: 50px;
+  }
+}
+
+.logistics {
+  align-items: center;
+  padding: 10px 0px;
+  .logistics_img {
+    width: 45px;
+    height: 45px;
+    margin-right: 12px;
+    img {
+      width: 100%;
+      height: 100%;
+    }
+  }
+  .logistics_cent {
+    span {
+      display: block;
+      font-size: 12px;
+    }
+  }
+}
+
+.trees-coadd {
+  width: 100%;
+  height: 400px;
+  border-radius: 4px;
+  overflow: hidden;
+  .scollhide {
+    width: 100%;
+    height: 100%;
+    overflow: auto;
+    margin-left: 18px;
+    padding: 10px 0 10px 0;
+    box-sizing: border-box;
+    .content {
+      font-size: 12px;
+    }
+
+    .time {
+      font-size: 12px;
+      color: #2d8cf0;
+    }
+  }
+}
+
+.description {
+  &-term {
+    display: table-cell;
+    padding-bottom: 5px;
+    line-height: 20px;
+    width: 50%;
+    font-size: 12px;
+    color: #606266;
+  }
+  ::v-deep .el-divider--horizontal {
+    margin: 12px 0 !important;
+  }
+}
+</style>

+ 510 - 0
mer_plat_admin/src/views/express/index.vue

@@ -0,0 +1,510 @@
+<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="商户名称:">
+            <el-input
+              v-model.trim="tableFrom.merName"
+              placeholder="请输入商户名称"
+              class="selWidth"
+              size="small"
+              clearable
+              @keyup.enter.native="handleSearchList"
+            />
+          </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 < 9
+             "
+             >{{ 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/secondHand';
+import detailsFrom from './components/orderDetail.vue';
+import merchantName from '@/components/merchantName';
+import { isWriteOff } from '@/utils';
+import { checkPermi } from '@/utils/permission'; // 权限判断函数
+export default {
+  name: 'orderlistDetails',
+  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,
+        merName: 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.merName = 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>