Explorar o código

0724-1723-h01

zory hai 1 semana
pai
achega
80151d3bce

+ 7 - 0
src/api/model/merOrder.js

@@ -37,4 +37,11 @@ export default {
             return await http.post(this.url, params);
         },
     },
+    save: {
+        url: `${config.API_URL}/merchant/order/save`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
 }

+ 6 - 0
src/style/app.scss

@@ -101,6 +101,12 @@ textarea {
 		background-color: #f00;
 	}
 }
+.error-row{
+	background-color: var(--el-color-warning-light-9) !important;
+}
+.el-table__body-wrapper tr.error-row td.el-table-fixed-column--left ,.el-table__body-wrapper tr.error-row td.el-table-fixed-column--right{
+	background-color: var(--el-color-warning-light-9) !important;
+}
 /*布局设置*/
 .layout-setting {
 	position: fixed;

+ 14 - 2
src/views/manage/order/index/components/table.vue

@@ -1,5 +1,5 @@
 <template>
-    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id" :row-class-name="tableRowClassName">
         <el-table-column type="selection" width="50" fixed="left"></el-table-column>
         <el-table-column label="订单编号" width="260" fixed="left" prop="goods_id">
             <template #default="scope">
@@ -71,7 +71,8 @@
                     <span>待使用</span>
                 </div>
                 <div class="order-name" v-if="scope.row.status == 2">
-                    <span>已完成</span>
+                    <span v-if="scope.row.is_error == 1" style="color: #f00;">异常</span>
+                    <span v-else>已完成</span>
                 </div>
                 <div class="order-name" v-if="scope.row.status == 3">
                     <span>已退款</span>
@@ -85,6 +86,10 @@
                     <span>已关闭</span>
                     <span class="dec">用户已取消</span>
                 </div>
+                <div class="order-name" v-if="scope.row.status == 6">
+                    <span>部分退款</span>
+                    <span class="dec">已退款 <em style="color: #f00;">{{ scope.row.refund_num }}</em> 份</span>
+                </div>
             </template>
         </el-table-column>
         <el-table-column label="发货状态" prop="types" width="160" align="left">
@@ -138,6 +143,13 @@ export default {
         }
     },
     methods: {
+        tableRowClassName(row, rowIndex) {
+            if (row.row.is_error === 1) {
+                return 'error-row';
+            } else {
+                return 'success-row';
+            }
+        },
         orderSuccess(){
             this.$refs.table.refresh()
         },

+ 1 - 0
src/views/merchant/order/index/components/search.vue

@@ -25,6 +25,7 @@
                                 <el-option value="4" label="已退款"></el-option>
                                 <el-option value="5" label="退款中"></el-option>
                                 <el-option value="6" label="已关闭"></el-option>
+                                <el-option value="7" label="部分退款"></el-option>
                                 <template #prefix>订单状态</template>
                             </el-select>
                         </el-col>

+ 14 - 2
src/views/merchant/order/index/components/table.vue

@@ -1,5 +1,5 @@
 <template>
-    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id" :row-class-name="tableRowClassName">
         <el-table-column type="selection" width="50" fixed="left"></el-table-column>
         <el-table-column label="订单编号" width="260" fixed="left" prop="goods_id">
             <template #default="scope">
@@ -60,7 +60,8 @@
                     <span>待使用</span>
                 </div>
                 <div class="order-name" v-if="scope.row.status == 2">
-                    <span>已完成</span>
+                    <span v-if="scope.row.is_error == 1" style="color: #f00;">异常</span>
+                    <span v-else>已完成</span>
                 </div>
                 <div class="order-name" v-if="scope.row.status == 3">
                     <span>已退款</span>
@@ -74,6 +75,10 @@
                     <span>已关闭</span>
                     <span class="dec">用户已取消</span>
                 </div>
+                <div class="order-name" v-if="scope.row.status == 6">
+                    <span>部分退款</span>
+                    <span class="dec">已退款 <em style="color: #f00;">{{ scope.row.refund_num }}</em> 份</span>
+                </div>
             </template>
         </el-table-column>
         <el-table-column label="发货状态" prop="types" width="160" align="left">
@@ -127,6 +132,13 @@ export default {
         }
     },
     methods: {
+        tableRowClassName(row, rowIndex) {
+            if (row.row.is_error === 1) {
+                return 'error-row';
+            } else {
+                return 'success-row';
+            }
+        },
         orderSuccess(){
             this.$refs.table.refresh()
         },

+ 86 - 0
src/views/merchant/order/unusual/components/option.vue

@@ -0,0 +1,86 @@
+<template>
+    <div class="op-header-no">
+        <div class="left-panel">
+            <template v-if="trade==2">
+                <sc-file-import :apiObj="$API.common.importFile" title="导入快递单号" :data="{otherData:'demo'}" templateUrl="http://www.scuiadmin/file.xlsx" accept=".xls, .xlsx" :maxSize="30" tip="请上传小于或等于 30M 的 .xls, .xlsx 格式文件" @success="success">
+                    <template #default="{open}">
+                        <el-button type="primary" icon="sc-icon-upload" @click="open">导入快递单号</el-button>
+                    </template>
+                    <template #uploader>
+                        <el-icon class="el-icon--upload"><sc-icon-file-excel /></el-icon>
+                        <div class="el-upload__text">
+                            将文件拖到此处或 <em>点击选择文件上传</em>
+                        </div>
+                    </template>
+                </sc-file-import>
+            </template>
+            <sc-file-export :apiObj="$API.common.exportFile" :data="searchKey" fileName="订单列表" async>
+                <template #default="{open}">
+                    <el-button type="danger" icon="sc-icon-download" @click="open">导出</el-button>
+                </template>
+            </sc-file-export>
+        </div>
+    </div>
+</template>
+
+<script>
+import scFileExport from '@/components/scFileExport'
+import scFileImport from '@/components/scFileImport'
+export default {
+    components: {
+        scFileExport,scFileImport
+    },
+    props: {
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] },
+        trade: { type: String, default: "0" },
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        table_add(){
+            this.$router.push('/merchant/goods/add')
+        },
+        table_sync(){
+            this.$confirm(`发起同步后,请耐心等待1-2分钟后再刷新当前数据列表`, '提示', {
+                type: 'warning'
+            }).then(async () => {
+                var resp = await this.$API.category.sync.get();
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(() => {
+
+            })
+        },
+        table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            this.$confirm(`审核中的商品不支持该操作,请确认是否有勾选审核中的商品`, '提示', {
+                type: 'warning'
+            }).then(async () => {
+                var loading = this.$loading()
+                let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+                loading.close()
+                var resp = await this.$API.merGoods.batch.post(submitData);
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(() => {
+
+            })
+        },
+        handleSuccess(){
+            this.$emit("success");
+        }
+    }
+}
+</script>

+ 47 - 0
src/views/merchant/order/unusual/components/search.vue

@@ -0,0 +1,47 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.order_sn" placeholder="订单编号" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>订单编号</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.out_order_no" placeholder="系统单号" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>系统单号</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{error:1}
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 228 - 0
src/views/merchant/order/unusual/components/table.vue

@@ -0,0 +1,228 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="订单编号" width="260" fixed="left" prop="goods_id">
+            <template #default="scope">
+                <div class="order-name">
+                    <span>{{ scope.row.order_sn }}</span>
+                    <span class="dec">系统单号:{{ scope.row.out_order_no }}</span>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="商品类型" prop="types" width="100">
+            <template #default="scope">
+                {{ scope.row.product?scope.row.product.types:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="商品信息" width="340" prop="name">
+            <template #default="scope">
+                <div class="goods-img">
+                    <div class="img">
+                        <el-image 
+                        style="width: 54px; height: 54px"
+                        :src="scope.row.img"
+                        :zoom-rate="1.2"
+                        :max-scale="7"
+                        :min-scale="0.2"
+                        :preview-src-list="[scope.row.img]"
+                        preview-teleported
+                        z-index="999"
+                        fit="cover"></el-image>
+                    </div>
+                    <div class="name">
+                        <span>{{ scope.row.product.product_name }}</span>
+                        <span class="dec">商品编码:{{ scope.row.product.product_id }}</span>
+                    </div>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="下单用户" width="340" prop="name">
+            <template #default="scope">
+                <div class="goods-img">
+                    <div class="img">
+                        <el-image 
+                        style="width: 54px; height: 54px"
+                        :src="scope.row.user.avatar"
+                        :zoom-rate="1.2"
+                        :max-scale="7"
+                        :min-scale="0.2"
+                        :preview-src-list="[scope.row.user.avatar]"
+                        preview-teleported
+                        z-index="999"
+                        fit="cover"></el-image>
+                    </div>
+                    <div class="name">
+                        <span>{{ scope.row.user.nickname }}</span>
+                        <span class="dec">{{ scope.row.user.openid }}</span>
+                    </div>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="商品售价" prop="types" width="120" align="right">
+            <template #default="scope">
+                <div class="order-name">
+                    <span>{{ scope.row.price?$TOOL.money(scope.row.price):'-' }}</span>
+                    <span class="dec">{{ scope.row.number }}份</span>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="顾客支付" prop="types" width="120" align="right">
+            <template #default="scope">
+                {{ scope.row.pay_money?$TOOL.money(scope.row.pay_money):'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="留资号码" prop="types" width="120">
+            <template #default="scope">
+                {{ scope.row.mobile?scope.row.mobile:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="订单状态" prop="types" width="160" align="left">
+            <template #default="scope">
+                <div class="order-name" v-if="scope.row.status == 0">
+                    <span>待支付</span>
+                    <span class="dec" v-if="scope.row.end_time.min == 0 && scope.row.end_time.sec == 0">已超时,取消支付</span>
+                    <span class="dec" v-else>剩余{{ scope.row.end_time.min }}:{{ scope.row.end_time.sec }}</span>
+                </div>
+                <div class="order-name" v-if="scope.row.status == 1">
+                    <span>待使用</span>
+                </div>
+                <div class="order-name" v-if="scope.row.status == 2">
+                    <span>已完成</span>
+                </div>
+                <div class="order-name" v-if="scope.row.status == 3">
+                    <span>已退款</span>
+                    <span class="dec">款项已原路退回</span>
+                </div>
+                <div class="order-name" v-if="scope.row.status == 4">
+                    <span>退款中</span>
+                    <span class="dec">款项已原路退回</span>
+                </div>
+                <div class="order-name" v-if="scope.row.status == 5">
+                    <span>已关闭</span>
+                    <span class="dec">用户已取消</span>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="发货状态" prop="types" width="160" align="left">
+            <template #default="scope">
+                <div v-if="scope.row.status == 2">
+                    <div class="order-name" v-if="scope.row.express_status == 1">
+                        <span>待发货</span>
+                    </div>
+                    <div class="order-name" v-if="scope.row.express_status == 2">
+                        <span>已发货</span>
+                    </div>
+                    <div class="order-name" v-if="scope.row.express_status == 3">
+                        <span>已签收</span>
+                    </div>
+                </div>
+                <div v-else>待订单完成</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="下单时间" prop="create_at" width="160"></el-table-column>
+        <el-table-column label="支付时间" prop="pay_at" width="160">
+            <template #default="scope">
+                {{ scope.row.pay_at?scope.row.pay_at:'未支付' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="操作" width="140" align="left" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button size="small" text @click="table_view(scope.row)">详情</el-button>
+                    <el-button type="danger" size="small" text @click="table_view(scope.row)" v-if="trade==2">标记异常</el-button>
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+    <orderDetail ref="orderDetail" @success="orderSuccess"></orderDetail>
+</template>
+
+<script>
+import orderDetail from "@/components/imFloat/order";
+export default {
+    components:{
+        orderDetail
+    },
+    props: {
+        trade: { type: String, default: "0" },
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.merOrder.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{error:1}
+        }
+    },
+    methods: {
+        orderSuccess(){
+            this.$refs.table.refresh()
+        },
+        table_view(data){
+            this.$nextTick(() => {
+                data.order = data.out_order_no
+                this.$refs.orderDetail.open("edit").setData(data)
+            })
+        },
+        table_del(data){
+            
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+        sortChange(event){
+            if (event.order) {
+                var data = {
+                    "field":event.prop,
+                    "order":event.order
+                }
+                this.$refs.table.upData(data)
+            } else {
+                this.$refs.table.reload(this.searchKey)
+            }
+            return ;
+        },
+        selectionChange(event){
+            this.dataSelect = [];
+            var arr = [];
+            var arrCompany = [];
+            event.forEach(function(val,index){
+                arr[index] = val.id;
+                arrCompany[index] = val;
+            });
+            this.dataSelectFull = arrCompany;
+            this.dataSelect = arr;
+            this.$emit("success",this.dataSelect);
+            this.$emit("successFull",this.dataSelectFull);
+        },
+    }
+}
+</script>
+
+<style>
+.order-name span{display: block;}
+.order-name span.dec{color: #999;font-size: 12px;}
+.goods-img{display: flex;gap: 5px;}
+.goods-img .name span{display: block;}
+.goods-img .name span.dec{color: #999;font-size: 12px;}
+.goods-price,.price{display: flex;align-items: center;gap: 5px;font-size: 14px;}
+.goods-price .del{text-decoration: line-through;}
+.goods-price span{background-color: #fff !important;
+    border: 1px solid #d3d9e0 !important;
+    border-radius: 4px;
+    box-sizing: border-box;
+    color: #6c737a !important;
+    display: inline-flex;
+    flex: none;
+    font-size: 12px;
+    line-height: 18px !important;
+    padding: 1px 6px !important;text-decoration: none;}
+</style>

+ 52 - 0
src/views/merchant/order/unusual/index.vue

@@ -0,0 +1,52 @@
+<template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <search @success="handleSuccess"></search>
+            <!-- <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" :trade="userInfo.trade"></optionBtn> -->
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" :trade="userInfo.trade"></tablePage>
+            </div>
+        </el-main>
+    </el-container>  
+</template>
+
+<script>
+import search from './components/search';
+// import optionBtn from './components/option';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage
+    },
+    data(){
+        return {
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+            userInfo:null
+        }
+    },
+    created(){
+		var userInfo = this.$TOOL.data.get("USER_INFO");
+		this.userInfo = userInfo;
+    },
+    methods: {
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>

+ 1 - 0
src/views/service/order/index/components/search.vue

@@ -25,6 +25,7 @@
                                 <el-option value="4" label="已退款"></el-option>
                                 <el-option value="5" label="退款中"></el-option>
                                 <el-option value="6" label="已关闭"></el-option>
+                                <el-option value="7" label="部分退款"></el-option>
                                 <template #prefix>订单状态</template>
                             </el-select>
                         </el-col>

+ 47 - 3
src/views/service/order/index/components/table.vue

@@ -1,5 +1,5 @@
 <template>
-    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id" :row-class-name="tableRowClassName">
         <el-table-column type="selection" width="50" fixed="left"></el-table-column>
         <el-table-column label="订单编号" width="260" fixed="left" prop="goods_id">
             <template #default="scope">
@@ -87,7 +87,8 @@
                     <span>待使用</span>
                 </div>
                 <div class="order-name" v-if="scope.row.status == 2">
-                    <span>已完成</span>
+                    <span v-if="scope.row.is_error == 1" style="color: #f00;">异常</span>
+                    <span v-else>已完成</span>
                 </div>
                 <div class="order-name" v-if="scope.row.status == 3">
                     <span>已退款</span>
@@ -101,12 +102,16 @@
                     <span>已关闭</span>
                     <span class="dec">用户已取消</span>
                 </div>
+                <div class="order-name" v-if="scope.row.status == 6">
+                    <span>部分退款</span>
+                    <span class="dec">已退款 <em style="color: #f00;">{{ scope.row.refund_num }}</em> 份</span>
+                </div>
             </template>
         </el-table-column>
         <el-table-column label="发货状态" prop="types" width="160" align="left">
             <template #default="scope">
                 <div v-if="scope.row.status == 2">
-                    <div class="order-name" v-if="scope.row.express_status == 1">
+                    <div class="order-name" v-if="scope.row.express_status == 1 || scope.row.express_status == 0">
                         <span>待发货</span>
                     </div>
                     <div class="order-name" v-if="scope.row.express_status == 2">
@@ -129,6 +134,10 @@
             <template #default="scope">
                 <el-button-group>
                     <el-button size="small" text @click="table_view(scope.row)">详情</el-button>
+                    <el-button type="danger" size="small" text @click="table_error(scope.row)" v-if="trade==2 && scope.row.status==2 && scope.row.is_error==0">标记异常</el-button>
+                </el-button-group>
+                <el-button-group>
+                    <el-button type="danger" size="small" text @click="table_cancel(scope.row)" v-if="trade==2 && scope.row.status==2 && scope.row.express_status==1">取消</el-button>
                 </el-button-group>
             </template>
         </el-table-column>
@@ -156,6 +165,13 @@ export default {
         }
     },
     methods: {
+        tableRowClassName(row, rowIndex) {
+            if (row.row.is_error === 1) {
+                return 'error-row';
+            } else {
+                return 'success-row';
+            }
+        },
         orderSuccess(){
             this.$refs.table.refresh()
         },
@@ -167,6 +183,34 @@ export default {
         },
         table_del(data){
             
+        },
+        table_cancel(data){
+            this.$confirm(`取消该笔订单的核销,并非是直接退款,订单状态将恢复到【待使用】状态`, '提示', {
+                type: 'warning'
+            }).then(async () => {
+                var resp = await this.$API.merOrder.save.post({"order":data.out_order_no,"field":'status',"val":1});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(() => {
+
+            })
+        },
+        table_error(data){
+            this.$confirm(`订单标记异常后,该笔订单只能通过【异常订单】中进行下一步的操作,并且需等待24小时后系统判定后方可操作`, '提示', {
+                type: 'warning'
+            }).then(async () => {
+                var resp = await this.$API.merOrder.save.post({"order":data.out_order_no,"field":'is_error',"val":1});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(() => {
+
+            })
         },
         refresh(){
             this.$refs.table.refresh()

+ 86 - 0
src/views/service/order/unusual/components/option.vue

@@ -0,0 +1,86 @@
+<template>
+    <div class="op-header-no">
+        <div class="left-panel">
+            <template v-if="trade==2">
+                <sc-file-import :apiObj="$API.common.importFile" title="导入快递单号" :data="{otherData:'demo'}" templateUrl="http://www.scuiadmin/file.xlsx" accept=".xls, .xlsx" :maxSize="30" tip="请上传小于或等于 30M 的 .xls, .xlsx 格式文件" @success="success">
+                    <template #default="{open}">
+                        <el-button type="primary" icon="sc-icon-upload" @click="open">导入快递单号</el-button>
+                    </template>
+                    <template #uploader>
+                        <el-icon class="el-icon--upload"><sc-icon-file-excel /></el-icon>
+                        <div class="el-upload__text">
+                            将文件拖到此处或 <em>点击选择文件上传</em>
+                        </div>
+                    </template>
+                </sc-file-import>
+            </template>
+            <sc-file-export :apiObj="$API.common.exportFile" :data="searchKey" fileName="订单列表" async>
+                <template #default="{open}">
+                    <el-button type="danger" icon="sc-icon-download" @click="open">导出</el-button>
+                </template>
+            </sc-file-export>
+        </div>
+    </div>
+</template>
+
+<script>
+import scFileExport from '@/components/scFileExport'
+import scFileImport from '@/components/scFileImport'
+export default {
+    components: {
+        scFileExport,scFileImport
+    },
+    props: {
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] },
+        trade: { type: String, default: "0" },
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        table_add(){
+            this.$router.push('/merchant/goods/add')
+        },
+        table_sync(){
+            this.$confirm(`发起同步后,请耐心等待1-2分钟后再刷新当前数据列表`, '提示', {
+                type: 'warning'
+            }).then(async () => {
+                var resp = await this.$API.category.sync.get();
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(() => {
+
+            })
+        },
+        table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            this.$confirm(`审核中的商品不支持该操作,请确认是否有勾选审核中的商品`, '提示', {
+                type: 'warning'
+            }).then(async () => {
+                var loading = this.$loading()
+                let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+                loading.close()
+                var resp = await this.$API.merGoods.batch.post(submitData);
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(() => {
+
+            })
+        },
+        handleSuccess(){
+            this.$emit("success");
+        }
+    }
+}
+</script>

+ 47 - 0
src/views/service/order/unusual/components/search.vue

@@ -0,0 +1,47 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.order_sn" placeholder="订单编号" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>订单编号</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.out_order_no" placeholder="系统单号" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>系统单号</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{error:1}
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 228 - 0
src/views/service/order/unusual/components/table.vue

@@ -0,0 +1,228 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="订单编号" width="260" fixed="left" prop="goods_id">
+            <template #default="scope">
+                <div class="order-name">
+                    <span>{{ scope.row.order_sn }}</span>
+                    <span class="dec">系统单号:{{ scope.row.out_order_no }}</span>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="商品类型" prop="types" width="100">
+            <template #default="scope">
+                {{ scope.row.product?scope.row.product.types:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="商品信息" width="340" prop="name">
+            <template #default="scope">
+                <div class="goods-img">
+                    <div class="img">
+                        <el-image 
+                        style="width: 54px; height: 54px"
+                        :src="scope.row.img"
+                        :zoom-rate="1.2"
+                        :max-scale="7"
+                        :min-scale="0.2"
+                        :preview-src-list="[scope.row.img]"
+                        preview-teleported
+                        z-index="999"
+                        fit="cover"></el-image>
+                    </div>
+                    <div class="name">
+                        <span>{{ scope.row.product.product_name }}</span>
+                        <span class="dec">商品编码:{{ scope.row.product.product_id }}</span>
+                    </div>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="下单用户" width="340" prop="name">
+            <template #default="scope">
+                <div class="goods-img">
+                    <div class="img">
+                        <el-image 
+                        style="width: 54px; height: 54px"
+                        :src="scope.row.user.avatar"
+                        :zoom-rate="1.2"
+                        :max-scale="7"
+                        :min-scale="0.2"
+                        :preview-src-list="[scope.row.user.avatar]"
+                        preview-teleported
+                        z-index="999"
+                        fit="cover"></el-image>
+                    </div>
+                    <div class="name">
+                        <span>{{ scope.row.user.nickname }}</span>
+                        <span class="dec">{{ scope.row.user.openid }}</span>
+                    </div>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="商品售价" prop="types" width="120" align="right">
+            <template #default="scope">
+                <div class="order-name">
+                    <span>{{ scope.row.price?$TOOL.money(scope.row.price):'-' }}</span>
+                    <span class="dec">{{ scope.row.number }}份</span>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="顾客支付" prop="types" width="120" align="right">
+            <template #default="scope">
+                {{ scope.row.pay_money?$TOOL.money(scope.row.pay_money):'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="留资号码" prop="types" width="120">
+            <template #default="scope">
+                {{ scope.row.mobile?scope.row.mobile:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="订单状态" prop="types" width="160" align="left">
+            <template #default="scope">
+                <div class="order-name" v-if="scope.row.status == 0">
+                    <span>待支付</span>
+                    <span class="dec" v-if="scope.row.end_time.min == 0 && scope.row.end_time.sec == 0">已超时,取消支付</span>
+                    <span class="dec" v-else>剩余{{ scope.row.end_time.min }}:{{ scope.row.end_time.sec }}</span>
+                </div>
+                <div class="order-name" v-if="scope.row.status == 1">
+                    <span>待使用</span>
+                </div>
+                <div class="order-name" v-if="scope.row.status == 2">
+                    <span>已完成</span>
+                </div>
+                <div class="order-name" v-if="scope.row.status == 3">
+                    <span>已退款</span>
+                    <span class="dec">款项已原路退回</span>
+                </div>
+                <div class="order-name" v-if="scope.row.status == 4">
+                    <span>退款中</span>
+                    <span class="dec">款项已原路退回</span>
+                </div>
+                <div class="order-name" v-if="scope.row.status == 5">
+                    <span>已关闭</span>
+                    <span class="dec">用户已取消</span>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="发货状态" prop="types" width="160" align="left">
+            <template #default="scope">
+                <div v-if="scope.row.status == 2">
+                    <div class="order-name" v-if="scope.row.express_status == 1">
+                        <span>待发货</span>
+                    </div>
+                    <div class="order-name" v-if="scope.row.express_status == 2">
+                        <span>已发货</span>
+                    </div>
+                    <div class="order-name" v-if="scope.row.express_status == 3">
+                        <span>已签收</span>
+                    </div>
+                </div>
+                <div v-else>待订单完成</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="下单时间" prop="create_at" width="160"></el-table-column>
+        <el-table-column label="支付时间" prop="pay_at" width="160">
+            <template #default="scope">
+                {{ scope.row.pay_at?scope.row.pay_at:'未支付' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="操作" width="140" align="left" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button size="small" text @click="table_view(scope.row)">详情</el-button>
+                    <el-button type="danger" size="small" text @click="table_view(scope.row)" v-if="trade==2">标记异常</el-button>
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+    <orderDetail ref="orderDetail" @success="orderSuccess"></orderDetail>
+</template>
+
+<script>
+import orderDetail from "@/components/imFloat/order";
+export default {
+    components:{
+        orderDetail
+    },
+    props: {
+        trade: { type: String, default: "0" },
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.merOrder.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{error:1}
+        }
+    },
+    methods: {
+        orderSuccess(){
+            this.$refs.table.refresh()
+        },
+        table_view(data){
+            this.$nextTick(() => {
+                data.order = data.out_order_no
+                this.$refs.orderDetail.open("edit").setData(data)
+            })
+        },
+        table_del(data){
+            
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+        sortChange(event){
+            if (event.order) {
+                var data = {
+                    "field":event.prop,
+                    "order":event.order
+                }
+                this.$refs.table.upData(data)
+            } else {
+                this.$refs.table.reload(this.searchKey)
+            }
+            return ;
+        },
+        selectionChange(event){
+            this.dataSelect = [];
+            var arr = [];
+            var arrCompany = [];
+            event.forEach(function(val,index){
+                arr[index] = val.id;
+                arrCompany[index] = val;
+            });
+            this.dataSelectFull = arrCompany;
+            this.dataSelect = arr;
+            this.$emit("success",this.dataSelect);
+            this.$emit("successFull",this.dataSelectFull);
+        },
+    }
+}
+</script>
+
+<style>
+.order-name span{display: block;}
+.order-name span.dec{color: #999;font-size: 12px;}
+.goods-img{display: flex;gap: 5px;}
+.goods-img .name span{display: block;}
+.goods-img .name span.dec{color: #999;font-size: 12px;}
+.goods-price,.price{display: flex;align-items: center;gap: 5px;font-size: 14px;}
+.goods-price .del{text-decoration: line-through;}
+.goods-price span{background-color: #fff !important;
+    border: 1px solid #d3d9e0 !important;
+    border-radius: 4px;
+    box-sizing: border-box;
+    color: #6c737a !important;
+    display: inline-flex;
+    flex: none;
+    font-size: 12px;
+    line-height: 18px !important;
+    padding: 1px 6px !important;text-decoration: none;}
+</style>

+ 51 - 2
src/views/service/order/unusual/index.vue

@@ -1,3 +1,52 @@
 <template>
-    <div></div>
-</template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <search @success="handleSuccess"></search>
+            <!-- <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" :trade="userInfo.trade"></optionBtn> -->
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" :trade="userInfo.trade"></tablePage>
+            </div>
+        </el-main>
+    </el-container>  
+</template>
+
+<script>
+import search from './components/search';
+// import optionBtn from './components/option';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage
+    },
+    data(){
+        return {
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+            userInfo:null
+        }
+    },
+    created(){
+		var userInfo = this.$TOOL.data.get("USER_INFO");
+		this.userInfo = userInfo;
+    },
+    methods: {
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>