You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

909 lines
22 KiB

<template>
<view class="deliver-goods">
<header class="header">
<view class="order-num">
<view class="num line1">订单号{{ order_id }}</view>
<!-- <view class="name line1">
<span class="iconfont icon-yonghu2"></span>{{ delivery.nickname }}
</view> -->
</view>
<view class="address">
<view class="name">
<text class="iconfont icon-ic_location4"></text>
{{ delivery.real_name }}
<text class="phone">{{ delivery.user_phone }}</text>
</view>
<view>地址{{ delivery.user_address }}</view>
</view>
<view class="line">
<image src="@/static/images/line.jpg" />
</view>
</header>
<view class="wrapper">
<view class="item acea-row row-between-wrapper">
<view>发货方式</view>
<view class="mode acea-row row-middle row-right">
<template v-for="(item, index) in types">
<view v-if="item.show" class="goods" :class="(active === index || productType==3) ? 'on' : ''" :key="index" @click="changeType(item, index)">
<text :class="['iconfont', active === index ? 'icon-ic_Selected' : 'icon-ic_unselect']"></text>
{{ item.title }}
</view>
</template>
</view>
</view>
<block v-if="logistics.length>0">
<view class="list" v-show="active === 0">
<view class="item acea-row row-middle" v-if="delivery.config_export_open == 1">
<view>发货类型</view>
<view class="mode acea-row row-middle row-right">
<view class="goods" :class="curExpress === item.key ? 'on' : ''" v-for="(item, index) in expressType" :key="index" @click="changeExpTpe(item, index)">
<text :class="['iconfont', curExpress === item.key ? 'icon-ic_Selected' : 'icon-ic_unselect']"></text>
{{ item.title }}
</view>
</view>
</view>
<block v-if="curExpress == 1">
<view class="item acea-row row-middle">
<view>快递公司</view>
<view class="select-box">
<picker class="pickerBox" @change="bindPickerChange" :value="seIndex" :range="logistics" range-key="name">
<view class="uni-input">{{logistics[seIndex].name}}</view>
</picker>
</view>
<text class="iconfont icon-ic_rightarrow"></text>
</view>
<view class="item acea-row row-middle">
<view>快递单号</view>
<input type="text" placeholder="请输入" v-model="delivery_id" class="mode" />
<!-- #ifdef MP -->
<text class="iconfont icon-xiangji" @click="scanCode"></text>
<!-- #endif -->
<!-- #ifdef H5 -->
<text v-if="isWeixin" class="iconfont icon-xiangji" @click="scanCode"></text>
<!-- #endif -->
</view>
<view class="item">
<view class="trip" v-if="curExpress == 1">顺丰请输入单号 :收件人或寄件人手机号后四位</view>
<view class="trip" v-if="curExpress == 1">例如:SF000000000000:3941</view>
</view>
</block>
<block v-if="curExpress == 2">
<view class="item acea-row row-between-wrapper">
<view>寄件人姓名:</view>
<input type="text" placeholder="填写寄件人姓名" v-model="to_name" class="mode" />
</view>
<view class="item acea-row row-between-wrapper">
<view>寄件人电话:</view>
<input type="text" placeholder="填写寄件人电话" v-model="to_tel" class="mode" />
</view>
<view class="item acea-row row-between-wrapper">
<view>寄件人地址:</view>
<input type="text" placeholder="填写寄件人地址" v-model="to_addr" class="mode" />
</view>
<view class="item acea-row row-between-wrapper">
<view>快递公司</view>
<view class="select-box">
<picker class="pickerBox" @change="bindPickerChange" :value="seIndex" :range="logistics" range-key="name">
<!-- <view></view> -->
<view class="uni-input">{{logistics[seIndex].name}}</view>
</picker>
</view>
</view>
<view class="item acea-row row-between-wrapper" v-if="expTemp.length>0">
<view>电子面单</view>
<view class="picker-add">
<picker class="pickerBox" @change="bindTempChange" :value="expIndex" :range="expTemp" range-key="title">
<view class="uni-input">{{expTemp[expIndex].title}}</view>
</picker>
<view class="look" @click="previewImage">预览</view>
</view>
</view>
</block>
</view>
</block>
<view class="list" v-show="active === 1">
<view class="item acea-row row-between-wrapper">
<view>送货人</view>
<view class="select-box" v-if="postPeople.length>0">
<picker class="pickerBox" @change="bindPostChange" :value="postIndex" :range="postPeople" range-key="wx_name">
<view class="acea-row row-middle">
<view class="uni-input">{{postPeople[postIndex].wx_name}}</view>
<text class="iconfont icon-ic_rightarrow"></text>
</view>
</picker>
</view>
</view>
<view class="item acea-row row-between-wrapper" v-if="postPeople[postIndex]">
<view>手机号</view>
<view class="select-box acea-row row-middle row-right">{{postPeople[postIndex].phone}}</view>
</view>
</view>
<textarea v-show="active === 2" v-model="fictitious_content" class="textarea" @blur="bindTextAreaBlur" placeholder="备注" :maxlength="500" auto-height />
</view>
<view class="split-wrapper" v-if="totalNum>1">
<view class="split-switch acea-row row-between-wrapper">
<view>分单发货</view>
<!-- <view class="mode acea-row row-middle row-right">
<view class="goods" :class="curGoods === item.key ? 'on' : ''" v-for="(item, index) in orderGoods" :key="item.key" @click="changeGoods(item)">
{{ item.title }}<span class="iconfont icon-xuanzhong2"></span>
</view>
</view> -->
<view class="switch" :class="{ on: curGoods }" @click="changeGoods"></view>
</view>
<splitOrder :select_all="false" :splitGoods="splitGoods" @getList="getList" v-if="curGoods"></splitOrder>
</view>
<view class="height-add"></view>
<view class="confirm-wrapper">
<view class="confirm" @click="saveInfo">确认提交</view>
</view>
</view>
</template>
<script>
import {
getStoreOrderDelivery,
getAdminOrderDelivery,
setStoreOrderDelivery,
setAdminOrderDelivery,
getLogistics,
storeOrderExportTemp,
orderExportTemp,
storeOrderDeliveryInfo,
orderDeliveryInfo,
storeOrderDelivery,
orderOrderDelivery,
storeOrderSplitInfo,
orderSplitInfo,
storeOrderSplitDelivery,
orderSplitDelivery
} from "@/api/admin";
import splitOrder from '@/components/splitOrder';
export default {
name: "GoodsDeliver",
components: {
splitOrder
},
props: {},
data: function() {
return {
types: [{
type: "express",
title: "发货",
key: 1,
show: true,
},
{
type: "send",
title: "送货",
key: 2,
show: true,
},
{
type: "fictitious",
title: "无需物流",
key: 3,
show: true,
}
],
expressType: [{
title: '手动填写',
key: 1
},
{
title: '电子面单打印',
key: 2
},
],
orderGoods: [{
title: '开启',
key: 1
},
{
title: '关闭',
key: 0
}
],
curExpress: 1,
active: 0,
order_id: "",
delivery: [],
logistics: [],
delivery_type: "1",
delivery_name: "",
delivery_id: "",
seIndex: 0,
expIndex: 0,
expTemp: [], // 快递模板
to_name: '', // 发货人名称
to_tel: '', // 发货人电话
to_addr: "", // 发货人地址
postPeople: [], //配送人
postIndex: 0,
fictitious_content: '',
listId: 0,
curGoods: 0,
splitGoods: [],
cartIds: [],
totalNum: 0,
productType: 0,
storeNum:1,
// #ifdef H5
isWeixin: this.$wechat.isWeixin()
// #endif
};
},
watch: {
"$route.params.oid": function(newVal) {
let that = this;
if (newVal != undefined) {
that.order_id = newVal;
that.getIndex();
}
}
},
onLoad: function(option) {
this.storeNum = parseInt(option.storeNum);
this.order_id = option.id;
this.listId = option.listId;
this.totalNum = option.totalNum;
this.comeType = option.comeType;
this.productType = option.productType
if (this.productType == 3) {
// this.types.splice(0, 2);
for (let i = 0; i < this.types.length; i++) {
if (i == 2) {
this.types[i].show = true;
} else {
this.types[i].show = false;
}
}
this.delivery_type = 3;
this.active = 2;
}
if (option.orderStatus == 8 || option.orderStatus == 4 || option.orderStatus == 9) {
this.curGoods = 1;
this.orderGoods.pop();
this.splitList();
}
this.getIndex();
this.getLogistics();
this.orderDeliveryInfo()
this.geTorderOrderDelivery()
},
methods: {
getList(val) {
let that = this;
that.splitGoods = val;
let cartIds = [];
val.forEach((item) => {
if (item.checked) {
let i = {
cart_id: item.cart_id,
cart_num: item.surplus_num
}
cartIds.push(i)
}
})
this.cartIds = cartIds;
},
splitList() {
let funApi = '';
if(this.storeNum){
funApi = orderSplitInfo;
}else{
funApi = storeOrderSplitInfo;
}
funApi(this.listId).then(res => {
let list = res.data;
list.forEach((item) => {
item.checked = false
item.numShow = item.surplus_num
})
this.splitGoods = list;
}).catch(err => {
return this.$util.Tips({
title: err
});
})
},
// 点击获取拆单列表
changeGoods() {
this.curGoods = this.curGoods ? 0 : 1;
if (this.curGoods) {
this.splitList();
}
},
// 扫描快递单号一维码
scanCode() {
// #ifdef MP
let that = this;
uni.scanCode({
scanType: ['barCode'],
success(res) {
that.delivery_id = res.result;
}
})
// #endif
// #ifdef H5
if (this.$wechat.isWeixin()) {
this.$wechat.wechatEvevt('scanQRCode', {
needResult: 1,
scanType: ['barCode']
}).then(res => {
let result = res.resultStr.split(",");
this.delivery_id = result[1];
});
}
// #endif
},
// 预览图片
previewImage() {
uni.previewImage({
urls: [this.expTemp[this.expIndex].pic],
success: function() {
},
fail: function(error) {
}
});
},
// 获取配送员列表
geTorderOrderDelivery() {
let funApi = '';
// if(this.storeNum){
// funApi = orderOrderDelivery;
// }else{
// funApi = storeOrderDelivery;
// }
funApi = orderOrderDelivery;
funApi().then(res => {
this.postPeople = res.data
})
},
// 配送员选择
bindPostChange(e) {
this.postIndex = e.detail.value
},
// 选择发货类型
changeExpTpe(item, index) {
this.curExpress = item.key
this.getLogistics(index || '');
},
changeType: function(item, index) {
this.active = index;
this.delivery_type = item.key;
},
getIndex: function() {
let that = this;
let funApi = '';
// if(this.storeNum){
// funApi = getAdminOrderDelivery;
// }else{
// funApi = getStoreOrderDelivery;
// }
funApi = getAdminOrderDelivery;
funApi(that.order_id).then(
res => {
that.delivery = res.data;
},
error => {
that.$util.Tips({
title: error
})
}
);
},
getLogistics(status) {
let that = this;
getLogistics({
status
}).then(
res => {
that.logistics = res.data;
that.getExpTemp(res.data[0].code)
},
error => {
that.$util.Tips({
title: error
})
}
);
},
async saveInfo() {
let that = this,
delivery_type = that.delivery_type,
delivery_name = that.logistics[that.seIndex].name,
delivery_id = that.delivery_id,
userName = that.delivery_name,
save = {};
save.delivery_type = delivery_type;
save.delivery_code = that.logistics[that.seIndex].code
save.delivery_name = that.logistics[that.seIndex].name
save.type = that.active + 1
if (delivery_type == 1 && this.curExpress == 1) {
if (!delivery_id) {
return this.$util.Tips({
title: '请填写快递单号'
})
}
save.express_record_type = that.curExpress
save.delivery_id = delivery_id
if (that.curGoods) {
that.setSplitInfo(save)
} else {
that.setInfo(save);
}
}
if (delivery_type == 1 && this.curExpress == 2) {
if (!that.to_name) {
return this.$util.Tips({
title: '请填写寄件人姓名'
})
}
if (!that.to_tel) {
return this.$util.Tips({
title: '请填写寄件人手机号码'
})
}
if (!(/^1[3456789]\d{9}$/.test(that.to_tel))) {
return this.$util.Tips({
title: '请填写寄件人手机号码'
})
}
if (!that.to_addr) {
return this.$util.Tips({
title: '请填写寄件人地址'
})
}
if (that.expTemp.length == 0) {
return this.$util.Tips({
title: '请选择电子面单'
})
}
save.express_record_type = that.curExpress
save.to_name = that.to_name
save.to_tel = that.to_tel
save.to_addr = that.to_addr
save.express_temp_id = that.expTemp[that.expIndex].temp_id
if (that.curGoods) {
that.setSplitInfo(save)
} else {
that.setInfo(save);
}
}
if (delivery_type == 2) {
if (!that.postPeople.length) {
return this.$util.Tips({
title: '请在平台后台添加送货人'
})
}
let obj = this.postPeople[this.postIndex]
let params = {}
params.type = that.delivery_type
params.sh_delivery_name = obj.wx_name
params.sh_delivery_id = obj.phone
params.sh_delivery_uid = obj.uid
if (that.curGoods) {
that.setSplitInfo(params)
} else {
that.setInfo(params);
}
}
if (delivery_type == 3) {
let params = {}
params.type = that.delivery_type;
params.fictitious_content = that.fictitious_content;
if (that.curGoods) {
that.setSplitInfo(params)
} else {
that.setInfo(params);
}
}
// switch (delivery_type) {
// case "2":
// if (!userName) {
// return that.$util.Tips({
// title: '请填写送货人姓名'
// })
// }
// if (!delivery_id || !checkPhone(delivery_id)) {
// return that.$util.Tips({
// title: '请填写正确的手机号码'
// })
// }
// save.delivery_name = userName;
// save.delivery_id = delivery_id;
// that.setInfo(save);
// break;
// case "1":
// if (!delivery_id) {
// return this.$util.Tips({
// title: '请填写快递单号'
// })
// }
// save.delivery_name = delivery_name;
// save.delivery_id = delivery_id;
// that.setInfo(save);
// break;
// case "3":
// that.setInfo(save);
// break;
// }
},
setInfo: function(item) {
let that = this;
let funApi = '';
// if(this.storeNum){
// funApi = setAdminOrderDelivery;
// }else{
// funApi = setStoreOrderDelivery;
// }
funApi = setAdminOrderDelivery;
funApi(that.delivery.id, item).then(
res => {
that.$util.Tips({
title: res.msg,
icon: 'success',
mask: true
})
setTimeout(res => {
if (this.comeType == 2) {
uni.navigateTo({
url: '/pages/admin/orderDetail/index?id=' + this.order_id+'&storeNum='+this.storeNum
})
} else {
uni.navigateTo({
url: '/pages/admin/orderList/index?types=1'
})
}
}, 2000)
},
error => {
that.$util.Tips({
title: error
})
}
);
},
setSplitInfo(item) {
if (!this.cartIds.length) {
return this.$util.Tips({
title: '请选择发货商品'
})
}
item.cart_ids = this.cartIds
let funApi = '';
if(this.storeNum){
funApi = orderSplitDelivery;
}else{
funApi = storeOrderSplitDelivery;
}
funApi(this.delivery.id, item).then(res => {
this.$util.Tips({
title: res.msg,
icon: 'success',
mask: true
})
setTimeout(res => {
if (this.comeType == 2) {
uni.navigateTo({
url: '/pages/admin/orderDetail/index?id=' + this.order_id+'&storeNum='+this.storeNum
})
} else {
uni.navigateTo({
url: '/pages/admin/orderList/index?types=1'
})
}
}, 2000)
}).catch(err => {
this.$util.Tips({
title: err
})
})
},
bindPickerChange(e) {
this.seIndex = e.detail.value
this.getExpTemp(this.logistics[e.detail.value].code)
},
bindTempChange(e) {
this.expIndex = e.detail.value
},
getExpTemp(code) {
let funApi = '';
if(this.storeNum){
funApi = orderExportTemp;
}else{
funApi = storeOrderExportTemp;
}
funApi({
com: code
}).then(res => {
this.expTemp = res.data.data
})
},
// 获取订单打印默认配置
orderDeliveryInfo() {
let funApi = '';
// if(this.storeNum){
// funApi = orderDeliveryInfo;
// }else{
// funApi = storeOrderDeliveryInfo;
// }
funApi = orderDeliveryInfo;
funApi().then(res => {
this.to_name = res.data.to_name;
this.to_tel = res.data.to_tel;
this.to_addr = res.data.to_add;
})
}
}
};
</script>
<style lang="scss">
.picker-add {
display: flex;
align-items: center;
}
.height-add {
height: 120upx;
}
/*发货*/
.deliver-goods {
padding: 22rpx 20rpx;
}
.deliver-goods .header {
position: relative;
padding: 0 32rpx;
border-radius: 24rpx;
background: #FFFFFF;
overflow: hidden;
}
.deliver-goods .header .order-num {
padding: 20rpx 0;
border-bottom: 1px dotted #EEEEEE;
}
.deliver-goods .header .order-num .num {
font-size: 28rpx;
line-height: 40rpx;
color: #333333;
position: relative;
}
.deliver-goods header .order-num .num:after {}
.deliver-goods header .order-num .name {
width: 260upx;
font-size: 26upx;
color: #282828;
text-align: center;
}
.deliver-goods header .order-num .name .iconfont {
font-size: 35upx;
color: #477ef3;
vertical-align: middle;
margin-right: 10upx;
}
.deliver-goods .header .address {
padding: 20rpx 0 40rpx;
font-size: 24rpx;
line-height: 34rpx;
color: #999999;
}
.deliver-goods .header .address .name {
font-weight: 500;
font-size: 30rpx;
line-height: 42rpx;
color: #333333;
margin-bottom: 12rpx;
}
.deliver-goods .header .address .name .iconfont {
margin-right: 8rpx;
font-size: 32rpx;
}
.deliver-goods .header .address .name .phone {
margin-left: 40rpx;
}
.deliver-goods .header .line {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 4rpx;
}
.deliver-goods .header .line image {
width: 100%;
height: 100%;
display: block;
}
.deliver-goods .wrapper {
padding: 12rpx 0;
border-radius: 24rpx;
margin-top: 20rpx;
background-color: #fff;
}
.deliver-goods .wrapper .item {
padding: 0 24rpx;
height: 80rpx;
font-size: 28rpx;
color: #333333;
position: relative;
}
.deliver-goods .wrapper .item .mode {
flex: 1;
height: 100%;
text-align: right;
}
.deliver-goods .wrapper .item .mode .iconfont {
font-size: 32rpx;
margin-right: 12rpx;
color: #CCCCCC;
}
.deliver-goods .wrapper .item .mode .goods~.goods {
margin-left: 50rpx;
}
.deliver-goods .wrapper .item .mode .goods {
color: #999999;
}
.deliver-goods .wrapper .item .mode .goods.on {
color: #333333;
}
.deliver-goods .wrapper .item .mode .goods.on .iconfont {
color: #2A7EFB;
}
.deliver-goods .wrapper .item .icon-up {
position: absolute;
font-size: 35upx;
color: #2c2c2c;
right: 30upx;
}
.deliver-goods .wrapper .item select {
direction: rtl;
padding-right: 60upx;
position: relative;
z-index: 2;
}
.deliver-goods .wrapper .item input::placeholder {
color: #bbb;
}
.deliver-goods .confirm-wrapper {
position: fixed;
left: 0;
bottom: 0;
bottom: constant(safe-area-inset-bottom);
bottom: env(safe-area-inset-bottom);
width: 100%;
padding: 20rpx;
}
.deliver-goods .confirm {
font-weight: 500;
font-size: 28rpx;
color: #fff;
height: 80rpx;
border-radius: 40rpx;
background: #2A7EFB;
text-align: center;
line-height: 80rpx;
}
.select-box {
flex: 1;
height: 100%;
.pickerBox {
display: flex;
align-items: center;
justify-content: flex-end;
width: 100%;
height: 100%;
.iconfont {
margin-left: 8rpx;
font-size: 24rpx;
color: #999999;
}
}
}
.look {
margin-left: 20rpx;
color: #1890FF;
}
.textarea {
display: block;
min-height: 192rpx;
padding: 30rpx;
width: 100%;
border-bottom: 1px solid #f0f0f0;
box-sizing: border-box;
}
.icon-xiangji {
font-size: 35rpx;
color: #477ef3;
}
.trip {
font-size: 22rpx;
color: #ccc;
padding: 6rpx 0;
}
.split-wrapper {
border-radius: 24rpx;
margin-top: 20rpx;
background: #FFFFFF;
.splitOrder {
padding: 0 24rpx 46rpx;
margin: 0;
}
}
.split-switch {
padding: 40rpx 24rpx;
font-size: 28rpx;
color: #333333;
.switch {
position: relative;
width: 79rpx;
height: 48rpx;
padding: 4rpx;
border-radius: 24rpx;
background: #DDDDDD;
transition: background 0.1s, border 0.1s;
&::after {
content: "";
position: absolute;
top: 4rpx;
left: 4rpx;
width: 40rpx;
height: 40rpx;
border-radius: 20rpx;
background: #FFFFFF;
box-shadow: 0 3rpx 6rpx 0 rgba(0, 0, 0, 0.08);
transition: transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
}
&.on {
background: #2A7EFB;
&::after {
transform: translateX(31rpx);
}
}
}
}
</style>