浏览代码

0727-1931-c01

zory 1 周之前
父节点
当前提交
7e6dddf1bf

+ 19 - 0
src/api/model/express.js

@@ -0,0 +1,19 @@
+import config from "@/config";
+import http from "@/utils/request";
+
+export default {
+    list: {
+        url: `${config.API_URL}/merchant/express/list`,
+        name: "-",
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
+    },
+    data: {
+        url: `${config.API_URL}/merchant/express/data`,
+        name: "-",
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
+    },
+}

+ 2 - 2
src/api/model/system.js

@@ -120,8 +120,8 @@ export default {
 		import: {
 			url: `${config.API_URL}/tasks/import`,
 			name: "系统任务管理",
-			get: async function(params){
-				return await http.get(this.url, params);
+			post: async function(params){
+				return await http.post(this.url, params);
 			}
 		}
 	}

+ 63 - 0
src/components/imFloat/express.vue

@@ -0,0 +1,63 @@
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="800" destroy-on-close :close-on-click-modal="false" @closed="$emit('closed')">
+        <div class="express-header">
+            <el-descriptions :column="1" border direction="vertical">
+                <el-descriptions-item label="快递单号">
+                    {{ formData.express_sn }}
+                    <a class="green" :href="'https://www.baidu.com/s?wd='+formData.express_sn" target="_blank">查看实时信息</a>
+                </el-descriptions-item>
+            </el-descriptions>
+        </div>
+        <template v-if="formData.content">
+            <el-timeline style="max-width: 600px">
+                <el-timeline-item v-for="(item,index) in expressData" :key="index" :timestamp="item.timeDesc" :type="index==0?'primary':'info'">
+                    {{ item.desc }}
+                </el-timeline-item>
+            </el-timeline>
+        </template>
+		<template #footer>
+            <el-button @click="visible=false" size="large">关 闭</el-button>
+		</template>
+    </el-dialog>
+    
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            loading: false,
+            isSaveing: false,
+            mode:"add",
+            titleMap:{
+                add:"快递信息",
+                edit:"快递信息"
+            },
+            categoryData:[],
+            visible:false,
+            formData:{},
+            expressData:[]
+        }
+    },
+    methods:{
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = JSON.parse(JSON.stringify(data));
+            if (data.content) {
+                this.expressData = data.content.reverse();
+            }
+        },
+    }
+}
+</script>
+
+<style>
+.text-center{text-align: center;}
+.express-header{margin-bottom: 15px;}
+.green{color: #20a53a;font-size: 12px;margin-left: 15px;}
+</style>

+ 14 - 0
src/components/imFloat/order.vue

@@ -115,15 +115,24 @@
                         </div>
                     </div>
                     <div class="order-info" v-if="orderData.express">
+                        <div class="title">物流信息</div>
+                        <div class="empty-data-item">
+                            <el-button @click="showExpress">查看完整物流信息</el-button>
+                        </div>
                     </div>
                 </div>
             </el-main>
         </el-container>
     </el-drawer>
+    <expressData ref="expressData"></expressData>
 </template>
 
 <script>
+import expressData  from "./express";
 export default {
+    components:{
+        expressData
+    },
     data(){
         return {
             loading: false,
@@ -145,6 +154,11 @@ export default {
             this.visible = true;
             return this
         },
+        showExpress(){
+            this.$nextTick(() => {
+                this.$refs.expressData.open("edit").setData(this.orderData.express)
+            })
+        },
         //表单注入数据
         setData(data){
             this.formData = JSON.parse(JSON.stringify(data));

+ 7 - 1
src/views/manage/goods/index/components/search.vue

@@ -22,12 +22,18 @@
                                 <template #prepend>商品标题</template>
                             </el-input>
                         </el-col>
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.goods_id" placeholder="商品ID" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>商品ID</template>
+                            </el-input>
+                        </el-col>
                         <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
                             <el-select v-model="searchKey.status" clearable placeholder="请选择状态" @change="searchForm" :style="{width: '100%'}" class="diy-select">
                                 <el-option value="1" label="审核中"></el-option>
                                 <el-option value="2" label="售卖中"></el-option>
                                 <el-option value="3" label="已下架"></el-option>
-                                <el-option value="4" label="审核驳回"></el-option>
+                                <el-option value="4" label="已删除"></el-option>
+                                <el-option value="5" label="审核驳回"></el-option>
                                 <template #prefix>状态</template>
                             </el-select>
                         </el-col>

+ 2 - 1
src/views/merchant/goods/index/components/search.vue

@@ -17,7 +17,8 @@
                                 <el-option value="1" label="审核中"></el-option>
                                 <el-option value="2" label="售卖中"></el-option>
                                 <el-option value="3" label="已下架"></el-option>
-                                <el-option value="4" label="审核驳回"></el-option>
+                                <el-option value="4" label="已删除"></el-option>
+                                <el-option value="5" label="审核驳回"></el-option>
                                 <template #prefix>状态</template>
                             </el-select>
                         </el-col>

+ 45 - 0
src/views/merchant/order/express/components/search.vue

@@ -0,0 +1,45 @@
+<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-select v-model="searchKey.status" clearable placeholder="请选择状态" @change="searchForm" :style="{width: '100%'}" class="diy-select">
+                                <el-option value="1" label="执行中"></el-option>
+                                <el-option value="2" label="已完成"></el-option>
+                                <el-option value="3" label="执行失败"></el-option>
+                                <template #prefix>状态</template>
+                            </el-select>
+                        </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:{}
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 138 - 0
src/views/merchant/order/express/components/table.vue

@@ -0,0 +1,138 @@
+<template>
+    <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="order_sn"></el-table-column>
+        <el-table-column label="文档名称" prop="title"></el-table-column>
+        <el-table-column label="发货状态" prop="types" align="left">
+            <template #default="scope">
+                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 已完成</div>
+                <div class="status-danger" v-if="scope.row.status==2"><sc-status-indicator type="danger"></sc-status-indicator> 执行失败</div>
+                <div class="status-info" v-if="scope.row.status==0"><sc-status-indicator type="info"></sc-status-indicator> 执行中</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="创建时间" prop="create_at"></el-table-column>
+        <el-table-column label="执行时间" prop="last_at">
+            <template #default="scope">
+                {{ scope.row.last_at?scope.row.last_at:'-' }}
+            </template>
+        </el-table-column>
+    </scTable>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.express.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods: {
+        tableRowClassName(row, rowIndex) {
+            if (row.row.is_error === 1) {
+                return 'error-row';
+            } else {
+                return 'success-row';
+            }
+        },
+        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){
+            
+        },
+        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()
+        },
+        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>

+ 54 - 0
src/views/merchant/order/express/index.vue

@@ -0,0 +1,54 @@
+<template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <search @success="handleSuccess"></search>
+        </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 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: {
+        handleOp(){
+            this.$refs.tablePage.upData(this.searchKey)
+        },
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.searchKey = data;
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>

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

@@ -2,7 +2,7 @@
     <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">
+                <sc-file-import :apiObj="$API.system.tasks.import" title="导入快递单号" templateUrl="https://tran.jsshuita.cn/download/express-example.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>

+ 45 - 0
src/views/service/order/express/components/search.vue

@@ -0,0 +1,45 @@
+<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-select v-model="searchKey.status" clearable placeholder="请选择状态" @change="searchForm" :style="{width: '100%'}" class="diy-select">
+                                <el-option value="1" label="执行中"></el-option>
+                                <el-option value="2" label="已完成"></el-option>
+                                <el-option value="3" label="执行失败"></el-option>
+                                <template #prefix>状态</template>
+                            </el-select>
+                        </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:{}
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 138 - 0
src/views/service/order/express/components/table.vue

@@ -0,0 +1,138 @@
+<template>
+    <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="order_sn"></el-table-column>
+        <el-table-column label="文档名称" prop="title"></el-table-column>
+        <el-table-column label="发货状态" prop="types" align="left">
+            <template #default="scope">
+                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 已完成</div>
+                <div class="status-danger" v-if="scope.row.status==2"><sc-status-indicator type="danger"></sc-status-indicator> 执行失败</div>
+                <div class="status-info" v-if="scope.row.status==0"><sc-status-indicator type="info"></sc-status-indicator> 执行中</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="创建时间" prop="create_at"></el-table-column>
+        <el-table-column label="执行时间" prop="last_at">
+            <template #default="scope">
+                {{ scope.row.last_at?scope.row.last_at:'-' }}
+            </template>
+        </el-table-column>
+    </scTable>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.express.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods: {
+        tableRowClassName(row, rowIndex) {
+            if (row.row.is_error === 1) {
+                return 'error-row';
+            } else {
+                return 'success-row';
+            }
+        },
+        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){
+            
+        },
+        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()
+        },
+        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>

+ 54 - 0
src/views/service/order/express/index.vue

@@ -0,0 +1,54 @@
+<template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <search @success="handleSuccess"></search>
+        </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 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: {
+        handleOp(){
+            this.$refs.tablePage.upData(this.searchKey)
+        },
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.searchKey = data;
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>

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

@@ -2,7 +2,7 @@
     <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">
+                <sc-file-import :apiObj="$API.system.tasks.import" title="导入快递单号" templateUrl="https://tran.jsshuita.cn/download/express-example.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>