Zory 1 hete
szülő
commit
09ec4581a2

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

@@ -16,6 +16,13 @@ export default {
             return await http.get(this.url, params);
         },
     },
+    city: {
+        url: `${config.API_URL}/merchant/order/city`,
+        name: "-",
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
+    },
     done: {
         url: `${config.API_URL}/merchant/order/done`,
         name: "-",
@@ -23,4 +30,11 @@ export default {
             return await http.post(this.url, params);
         },
     },
+    address: {
+        url: `${config.API_URL}/merchant/order/address`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
 }

+ 107 - 0
src/components/imFloat/address.vue

@@ -0,0 +1,107 @@
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close :close-on-click-modal="false" @closed="$emit('closed')">
+        <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
+            <el-form-item label="姓名" prop="nickname">
+                <el-input v-model="formData.nickname" clearable placeholder="请输入"></el-input>
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
+            <el-form-item label="手机号码" prop="mobile">
+                <el-input v-model="formData.mobile" clearable placeholder="请输入"></el-input>
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
+            <el-form-item label="所属地区" prop="city">
+                <el-cascader ref="cascaderRef" v-model="formData.city" :options="categoryData" :props="deptsProps" @change="getTemplate" clearable style="width: 100%;" />
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
+            <el-form-item label="详细地址" prop="address">
+                <el-input type="textarea" rows="3" v-model="formData.address" clearable placeholder="请输入"></el-input>
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
+        </el-form>
+		<template #footer>
+            <el-button @click="visible=false" size="large">取 消</el-button>
+            <el-button v-if="mode!='show'" size="large" type="primary" :loading="isSaveing" @click="submit()">确 认</el-button>
+		</template>
+    </el-dialog>
+    
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            loading: false,
+            isSaveing: false,
+            mode:"add",
+            titleMap:{
+                add:"代客预约",
+                edit:"代客预约"
+            },
+            deptsProps:{
+                value: "value",
+                label: "text"
+            },
+            categoryData:[],
+            visible:false,
+            formData:{},
+            OrderData:{},
+            rules:{
+                nickname: [
+                    {required: true, message: '请输入'}
+                ],
+                mobile: [
+                    {required: true, message: '请输入'}
+                ],
+                address: [
+                    {required: true, message: '请输入'}
+                ],
+                city: [
+                    {required: true, message: '请选择'}
+                ]
+            }
+        }
+    },
+    methods:{
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.OrderData = JSON.parse(JSON.stringify(data));
+            this.getCityData()
+        },
+        async getCityData(){
+            var resp = await this.$API.merOrder.city.get();
+            this.categoryData = resp.data;
+        },
+        async getTemplate(v){
+            const nodes = this.$refs.cascaderRef.getCheckedNodes()
+            this.formData.cityLabel = nodes[0].pathLabels
+            this.formData.cityCode = nodes[0].pathValues
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            this.isSaveing = true;
+            this.formData.order = this.OrderData.out_order_no;
+            let submitData = JSON.parse(JSON.stringify(this.formData));
+            var resp = await this.$API.merOrder.address.post(submitData);
+            this.isSaveing = false;
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.submitState = false;
+            this.$emit("success");
+        }
+    }
+}
+</script>
+
+<style>
+.text-center{text-align: center;}
+</style>

+ 32 - 3
src/components/imFloat/imFloat.vue

@@ -231,10 +231,12 @@
                                             </div>
                                             <div class="order-btn-group">
                                                 <div class="status info cus" @click="viewOrder(msgOrder)">查看详情</div>
-                                                <div class="status primary cus" @click="sendAddress(msgOrder)">收集地址</div>
+                                                <div class="status primary cus" @click="sendAddress(msgOrder)" v-if="msgOrder.status=='1' && user.trade == '2'">发起预约</div>
+                                                <div class="status info cus" @click="editAddress(msgOrder)" v-if="msgOrder.status=='1' && user.trade == '2'">代客预约</div>
                                                 <!-- <div class="status warn cus" v-if="msgOrder.product.product_type==11 && msgOrder.custom_price > 0 && msgOrder.custom_status ==0" @click="submitPrice(msgOrder)">补差价</div> -->
                                                 <!-- <div class="status danger cus" v-if="msgOrder.product.product_type==11 && msgOrder.custom_price > 0 && msgOrder.custom_status ==0" @click="submitPrice(msgOrder)">改差价</div> -->
                                                 <div class="status danger cus" @click="sendOrder(msgOrder)">发送订单</div>
+                                                <div class="status primary cus" @click="doneOrder(msgOrder)" v-if="msgOrder.status=='1' && user.trade == '1'">手动核销</div>
                                             </div>
                                         </div>
                                     </div>
@@ -291,10 +293,12 @@
                                                     </div>
                                                     <div class="order-btn-group">
                                                         <div class="status info cus" @click="viewOrder(item)">查看详情</div>
-                                                        <div class="status primary cus" @click="sendAddress(item)">收集地址</div>
+                                                        <div class="status primary cus" @click="sendAddress(item)" v-if="item.status=='1' && user.trade == '2'">发起预约</div>
+                                                        <div class="status info cus" @click="editAddress(item)" v-if="item.status=='1' && user.trade == '2'">代客预约</div>
                                                         <!-- <div class="status warn cus" v-if="item.product.product_type==11 && item.custom_price > 0 && item.custom_status ==0" @click="submitPrice(item)">补差价</div>
                                                         <div class="status danger cus" v-if="item.product.product_type==11 && item.custom_price > 0 && item.custom_status ==0" @click="submitPrice(item)">改差价</div> -->
                                                         <div class="status danger cus" @click="sendOrder(item)">发送订单</div>
+                                                        <div class="status primary cus" @click="doneOrder(item)" v-if="item.status=='1' && user.trade == '1'">手动核销</div>
                                                     </div>
                                                 </div>
                                             </div>
@@ -318,6 +322,7 @@
     </el-drawer>
     <orderDetail ref="orderDetail" @success="orderSuccess"></orderDetail>
     <quickTxt ref="quickTxt" @success="orderSuccess"></quickTxt>
+    <addressMain ref="addressMain" @success="addressSuccess"></addressMain>
 </template>
 
 <script>
@@ -336,13 +341,15 @@ import {
 } from '@/util/index.js';
 import orderDetail from '@/components/imFloat/order';
 import quickTxt from '@/components/imFloat/quickTxt';
+import addressMain from '@/components/imFloat/address';
 let imageList = [];
 export default {
     name: 'GlobalIM',
     components:{
         item,
         orderDetail,
-        quickTxt
+        quickTxt,
+        addressMain
     },
     props: {
         user: { type: Object, default: () => {} }
@@ -461,6 +468,14 @@ export default {
         this.$refs.messageListRef.removeEventListener('scroll', this.handleScroll)
     },
     methods: {
+        editAddress(item){
+            this.$nextTick(() => {
+                this.$refs.addressMain.open("edit").setData(item);
+            })
+        },
+        addressSuccess(){
+
+        },
         handleClick(event){
             this.orderData.tab = event;
             switch (event) {
@@ -973,6 +988,20 @@ export default {
             this.chatContact[this.checkChat].last.create_at = resp.data.time;
             return true;
         },
+        doneOrder(data){
+            this.$confirm(`手动核销订单后,该订单不支持线上退款,如需退款需与客户线下进行处理❗️如商家原因拒绝退款,平台会代替商家先行垫付且店铺无法正常经营`, '注意事项', {
+                type: 'warning'
+            }).then(async ()=>{
+                this.isDoneing = true;
+                var resp = await this.$API.merOrder.done.post({"id":data.order_sn});
+                this.isDoneing = false;
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.getOrderList()
+            }).catch(()=>{})
+        },
         async getOrderList(){
             this.orderData.loading = true;
             var resp = await this.$API.order.list.get({"page":this.orderData.page,"pageSize":this.orderData.size,"order":this.orderData.order,"openid":this.chatItem.openid});

+ 3 - 2
src/components/scFileImport/index.vue

@@ -11,7 +11,7 @@
 	<slot :open="open">
 		<el-button type="primary" plain @click="open">导入</el-button>
 	</slot>
-	<el-dialog v-model="dialog" title="导入" :width="550" :close-on-click-modal="false" append-to-body destroy-on-close>
+	<el-dialog v-model="dialog" :title="title" :width="550" :close-on-click-modal="false" append-to-body destroy-on-close>
 		<el-progress v-if="loading" :text-inside="true" :stroke-width="20" :percentage="percentage" style="margin-bottom: 15px;"/>
 		<div v-loading="loading">
 			<el-upload ref="uploader"
@@ -59,7 +59,8 @@
 			accept: { type: String, default: ".xls, .xlsx" },
 			maxSize: { type: Number, default: 10 },
 			tip: { type: String, default: "" },
-			templateUrl: { type: String, default: "" }
+			templateUrl: { type: String, default: "" },
+			title: { type: String, default: "导入" }
 		},
 		data() {
 			return {

+ 1 - 0
src/style/app.scss

@@ -869,6 +869,7 @@ fieldset legend {
 	background-color: var(--el-fill-color-light);
 	border-bottom: 1px solid #ebeef5;
 }
+.op-header-no{margin-bottom: 10px;}
 
 .drawer-detail-header {
 	padding: 12px 12px;

+ 16 - 0
src/views/manage/order/index/components/table.vue

@@ -87,6 +87,22 @@
                 </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">

+ 13 - 1
src/views/manage/setting/basic/index.vue

@@ -110,7 +110,7 @@
                                 </el-col>
                                 <el-col :span="this.$store.state.global.ismobile?24:12">
                                     <fieldset>
-                                        <legend><el-tag>云打印机</el-tag></legend>
+                                        <legend><el-tag>其他</el-tag></legend>
                                         <el-form-item label="云打印机AppId" prop="ex_appid">
                                             <el-input v-model="sys.ex_appid" show-password clearable placeholder="请输入"></el-input>
                                             <div class="el-form-item-msg"></div>
@@ -123,6 +123,18 @@
                                             <el-input v-model="sys.ex_print" clearable placeholder="请输入"></el-input>
                                             <div class="el-form-item-msg"></div>
                                         </el-form-item>
+                                        <el-form-item label="快递AppKey" prop="kd_appkey">
+                                            <el-input v-model="sys.kd_appkey" clearable placeholder="请输入"></el-input>
+                                            <div class="el-form-item-msg"></div>
+                                        </el-form-item>
+                                        <el-form-item label="快递AppSecret" prop="kd_secret">
+                                            <el-input v-model="sys.kd_secret" show-password clearable placeholder="请输入"></el-input>
+                                            <div class="el-form-item-msg"></div>
+                                        </el-form-item>
+                                        <el-form-item label="快递AppCode" prop="kd_code">
+                                            <el-input v-model="sys.kd_code" show-password clearable placeholder="请输入"></el-input>
+                                            <div class="el-form-item-msg"></div>
+                                        </el-form-item>
                                     </fieldset>
                                 </el-col>
                             </el-row>

+ 55 - 35
src/views/manage/shop/index/components/form.vue

@@ -4,9 +4,9 @@
             
             <el-row :gutter="10">
                 <el-col :span="6">
-                    <el-form-item label="" prop="poi_logo">
+                    <el-form-item label="" prop="poi_logo" class="border">
                         <sc-upload v-model="formData.poi_logo" title="店铺LOGO"></sc-upload>
-                        <div class="el-form-item-msg">小程序前端展示</div>
+                        <div class="el-form-item-msg text-center">小程序前端展示</div>
                     </el-form-item>
                 </el-col>
                 <el-col :span="18">
@@ -14,40 +14,53 @@
                         <el-input v-model="formData.poi_name" disabled readonly clearable placeholder="请输入"></el-input>
                         <div class="el-form-item-msg"></div>
                     </el-form-item>
-                    <el-form-item label="客服电话" prop="service_mobile">
-                        <el-input v-model="formData.service_mobile" clearable placeholder="请输入"></el-input>
-                        <div class="el-form-item-msg"></div>
+                    <el-row :gutter="10">
+                        <el-col :span="12">
+                            <el-form-item label="到期时间" prop="vip_end">
+                                <el-date-picker v-model="formData.vip_end" style="width: 100%" placeholder="请选择" />
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="客服电话" prop="service_mobile">
+                                <el-input v-model="formData.service_mobile" clearable placeholder="请输入"></el-input>
+                                <div class="el-form-item-msg"></div>
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="营业时间">
+                        <el-row :gutter="10">
+                            <el-col :span="11">
+                                <el-time-select v-model="formData.start_at" start="00:00" step="00:01" end="23:59" placeholder="请选择"  style="width: 100%"/>
+                            </el-col>
+                            <el-col :span="2" class="text-center">
+                                <span class="text-gray-500">-</span>
+                            </el-col>
+                            <el-col :span="11">
+                                <el-time-select v-model="formData.end_at" start="00:00" step="00:01" end="23:59" placeholder="请选择"  style="width: 100%"/>
+                            </el-col>
+                        </el-row>
+                        <div class="el-form-item-msg">营业时间为必选,否则小程序端无法下单</div>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="可核销时段">
+                        <el-row :gutter="10">
+                            <el-col :span="11">
+                                <el-time-select v-model="formData.order_start" start="00:00" step="00:01" end="23:59" placeholder="请选择"  style="width: 100%"/>
+                            </el-col>
+                            <el-col :span="2" class="text-center">
+                                <span class="text-gray-500">-</span>
+                            </el-col>
+                            <el-col :span="11">
+                                <el-time-select v-model="formData.order_end" start="00:00" step="00:01" end="23:59" placeholder="请选择"  style="width: 100%"/>
+                            </el-col>
+                        </el-row>
+                        <div class="el-form-item-msg">默认为09:00 - 22:30</div>
                     </el-form-item>
                 </el-col>
             </el-row>
-            <el-form-item label="营业时间">
-                <el-row :gutter="10">
-                    <el-col :span="11">
-                        <el-time-select v-model="formData.start_at" start="00:00" step="00:01" end="23:59" placeholder="请选择"  style="width: 100%"/>
-                    </el-col>
-                    <el-col :span="2" class="text-center">
-                        <span class="text-gray-500">-</span>
-                    </el-col>
-                    <el-col :span="11">
-                        <el-time-select v-model="formData.end_at" start="00:00" step="00:01" end="23:59" placeholder="请选择"  style="width: 100%"/>
-                    </el-col>
-                </el-row>
-                <div class="el-form-item-msg">营业时间为必选,否则小程序端无法下单</div>
-            </el-form-item>
-            <el-form-item label="可核销时段">
-                <el-row :gutter="10">
-                    <el-col :span="11">
-                        <el-time-select v-model="formData.order_start" start="00:00" step="00:01" end="23:59" placeholder="请选择"  style="width: 100%"/>
-                    </el-col>
-                    <el-col :span="2" class="text-center">
-                        <span class="text-gray-500">-</span>
-                    </el-col>
-                    <el-col :span="11">
-                        <el-time-select v-model="formData.order_end" start="00:00" step="00:01" end="23:59" placeholder="请选择"  style="width: 100%"/>
-                    </el-col>
-                </el-row>
-                <div class="el-form-item-msg">默认为09:00 - 22:30</div>
-            </el-form-item>
             <el-row :gutter="10">
                 <el-col :span="12">
                     <el-form-item label="团购结算费率" prop="life_rate">
@@ -66,8 +79,11 @@
                     </el-form-item>
                 </el-col>
                 <el-col :span="12">
-                    <el-form-item label="到期时间" prop="vip_end">
-                        <el-date-picker v-model="formData.vip_end" :style="{width: '100%'}" placeholder="请选择" />
+                    <el-form-item label="核销方式" prop="trade_type">
+                        <el-select v-model="formData.trade_type" style="width: 100%;">
+                            <el-option :value="1" label="立即核销"></el-option>
+                            <el-option :value="2" label="物流核销"></el-option>
+                        </el-select>
                     </el-form-item>
                 </el-col>
                 <el-col :span="12">
@@ -108,6 +124,9 @@ export default {
                 poi_logo: [
                     {required: true, message: '请上传'}
                 ],
+                trade_type: [
+                    {required: true, message: '请选择'}
+                ],
                 service_mobile: [
                     {required: true, message: '请输入'}
                 ],
@@ -181,4 +200,5 @@ export default {
 
 <style>
 .text-center{text-align: center;}
+.border{border: 1px solid var(--el-disabled-border-color);}
 </style>

+ 1 - 1
src/views/merchant/goods/add.vue

@@ -569,7 +569,7 @@ export default {
                 customer_reserved_info:2,
                 auto_renew:1,
                 use_date_type:1,
-                day_duration:30,
+                day_duration:180,
                 can_no_use_date:1,
                 code_source_type:1,
                 limit_rule_type:1,

+ 86 - 0
src/views/service/order/index/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>

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

@@ -42,13 +42,8 @@
                     </el-row>
                 </div>
                 <div class="form-line"></div>
-                <div class="form-right" style="flex: 0 0 186px;">
+                <div class="form-right">
                     <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
-                    <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>
         </el-form>
@@ -56,11 +51,7 @@
 </template>
 
 <script>
-import scFileExport from '@/components/scFileExport'
 export default {
-    components: {
-        scFileExport
-    },
     data(){
         return {
             searchKey:{}

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

@@ -142,6 +142,9 @@ export default {
     components:{
         orderDetail
     },
+    props: {
+        trade: { type: String, default: "0" },
+    },
     data(){
         return {
             list: {

+ 9 - 4
src/views/service/order/index/index.vue

@@ -2,11 +2,11 @@
     <el-container class="flex-column">
         <div class="table-search">
             <search @success="handleSuccess"></search>
-            <!-- <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" type="3"></optionBtn> -->
+            <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" type="3"></tablePage>
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" :trade="userInfo.trade"></tablePage>
             </div>
         </el-main>
     </el-container>  
@@ -14,19 +14,24 @@
 
 <script>
 import search from './components/search';
-// import optionBtn from './components/option';
+import optionBtn from './components/option';
 import tablePage from './components/table';
 export default {
     components: {
-        search,tablePage
+        search,tablePage,optionBtn
     },
     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;

+ 3 - 0
src/views/service/order/unusual/index.vue

@@ -0,0 +1,3 @@
+<template>
+    <div></div>
+</template>