wangfukang 2 weeks ago
parent
commit
b15f43ac3c
  1. 28
      src/views/app/business/bus/bus.vue
  2. 337
      src/views/app/business/logistics/logistics.vue
  3. 137
      src/views/app/business/logistics/logisticsAddress.vue
  4. 16
      src/views/app/business/luckey/luckey.vue
  5. 14
      src/views/app/shop/shop.vue
  6. 27
      src/views/sys/order-manage/logisticsAddress.vue
  7. 11
      src/views/sys/order-manage/orderManage.vue

28
src/views/app/business/bus/bus.vue

@ -227,34 +227,12 @@
},
selectDate: null,
form: {},
columns: [{
type: "selection",
width: 60,
align: "center",
},
columns: [
{
type: "index",
width: 60,
align: "center",
},
{
title: "优惠券类型",
key: "type",
minWidth: 150,
align: "center",
render: (h, params) => {
let re = ""
if (params.row.type == 1) {
re = "满减券";
} else if (params.row.type == 2) {
re = "无门槛直减券";
}
return h(
"div",
re
);
}
},
{
title: "优惠券名称",
key: "name",
@ -263,7 +241,7 @@
{
title: "抵扣面额",
key: "discountAmount",
minWidth: 80,
minWidth: 100,
},
{
title: "使用门槛",
@ -285,7 +263,7 @@
{
title: "剩余数量",
key: "remainCount",
width: 80,
width: 100,
},
{
title: "有效期",

337
src/views/app/business/logistics/logistics.vue

@ -1,6 +1,58 @@
<style lang="less">
@import "@/styles/table-common.less";
@import "./logistics.less";
.logistics-warning-row td {
background-color: #fff1f0 !important;
}
.logistics-warning-row:hover td {
background-color: #ffe4e1 !important;
}
.order-time-order-no {
margin-top: 4px;
color: #666;
font-size: 12px;
}
.worker-info {
color: #2d8cf0;
cursor: pointer;
}
.worker-info-name {
font-size: 14px;
font-weight: 700;
}
.worker-info-phone {
margin-top: 2px;
color: #666;
font-size: 13px;
}
.must-finish-time {
display: inline-block;
min-width: 168px;
padding: 2px 8px;
border: 1px solid #8ce6b0;
border-radius: 3px;
background: #edfff3;
color: #19be6b;
font-size: 15px;
font-weight: 700;
line-height: 20px;
white-space: nowrap;
}
.transfer-pickup-code {
margin-top: 4px;
color: #722ed1;
font-size: 12px;
line-height: 18px;
word-break: break-all;
}
</style>
<template>
<div class="search">
@ -107,7 +159,7 @@
<a class="select-clear" @click="clearSelectAll">清空</a>
</Alert> -->
<Table v-if="isOrderTab" :loading="loading" border :columns="columns" :data="data" :size="tableSize" sortable="custom"
@on-sort-change="changeSort" @on-selection-change="showSelect" ref="table"></Table>
:row-class-name="getOrderRowClassName" @on-sort-change="changeSort" @on-selection-change="showSelect" ref="table"></Table>
<Row v-if="isOrderTab" type="flex" justify="end" class="page">
<Page :current="activeSearchForm.pageNum" :total="total" :page-size="activeSearchForm.pageSize"
@on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]"
@ -115,6 +167,11 @@
</Row>
</Card>
<Modal v-model="transferOrder" :title="transferActionTitle" @on-ok="transferClose" :width="1065">
<Row style="margin-bottom: 12px;" @keydown.enter.native="handleWorkerSearch">
<Input v-model="searchWorker.keyword" clearable placeholder="请输入配送员名称或手机号" style="width: 260px" />
<Button type="primary" icon="ios-search" style="margin-left: 8px;" @click="handleWorkerSearch">搜索</Button>
<Button style="margin-left: 8px;" @click="handleWorkerReset">重置</Button>
</Row>
<Table :loading="workerLoading" border :columns="workerList" :data="transferList" :size="tableSize"
sortable="custom" ref="table1"></Table>
<Row type="flex" justify="end" class="page">
@ -123,7 +180,23 @@
:page-size-opts="[10, 20, 50]" size="small" show-total show-elevator show-sizer></Page>
</Row>
</Modal>
<Modal title="订单详情" v-model="Visiable" :mask-closable="false" :scrollabele="true" :width="1000">
<Modal v-model="workerOrderVisible" :title="workerOrderTitle" :mask-closable="false" :width="1200">
<Tabs v-model="workerOrderTab" :animated="false" @on-click="changeWorkerOrderTab">
<TabPane :label="'待取货(' + workerOrderCounts.daiqu + ')'" name="daiqu"></TabPane>
<TabPane :label="'待送达(' + workerOrderCounts.daisong + ')'" name="daisong"></TabPane>
</Tabs>
<Table :loading="workerOrderLoading" border :columns="workerOrderColumns" :data="workerOrderList" :size="tableSize"
:row-class-name="getOrderRowClassName"></Table>
<Row type="flex" justify="end" class="page">
<Page :current="workerOrderForm.pageNum" :total="workerOrderTotal" :page-size="workerOrderForm.pageSize"
@on-change="changeWorkerOrderPage" @on-page-size-change="changeWorkerOrderPageSize"
:page-size-opts="[10, 20, 50]" size="small" show-total show-elevator show-sizer></Page>
</Row>
<div slot="footer">
<Button type="text" @click="workerOrderVisible = false">关闭</Button>
</div>
</Modal>
<Modal title="订单详情" v-model="Visiable" :mask-closable="true" :scrollabele="true" :width="1000">
<logistics-address v-if="Visiable" ref="dialog"></logistics-address>
<div slot="footer" v-show="Visiable">
<Button type="text" @click="Visiable = false">关闭</Button>
@ -178,9 +251,14 @@
openTip: true,
loading: false,
workerLoading: false,
workerOrderLoading: false,
autoRefreshing: false,
settingLoading: false,
customerServiceLoading: false,
transferOrder: false,
workerOrderVisible: false,
workerOrderTab: "daiqu",
selectedWorker: {},
selectList: [],
searchWorker: {
baozhang: false,
@ -228,6 +306,10 @@
regionId: regionId,
customerPhone: ""
},
workerOrderForm: {
pageNum: 1,
pageSize: 10
},
form: {},
tabName: "hall",
hallTab: "waimai",
@ -242,11 +324,18 @@
daiqu: 0,
daisong: 0
},
workerOrderCounts: {
daiqu: 0,
daisong: 0
},
workerList: this.buildWorkerColumns(),
workerOrderColumns: [],
columns: [],
data: [],
workerOrderList: [],
total: 0,
workerTotal: 0,
workerOrderTotal: 0,
orderId: "",
transferActionTitle: "指派配送员",
transferActionType: "assign",
@ -267,11 +356,17 @@
},
deliveryTotalCount() {
return this.toNumber(this.deliveryCounts.daiqu) + this.toNumber(this.deliveryCounts.daisong);
},
workerOrderTitle() {
const name = this.selectedWorker.workerName || "配送员";
const phone = this.selectedWorker.workerPhone ? "(" + this.selectedWorker.workerPhone + ")" : "";
return name + phone + "的订单";
}
},
methods: {
init() {
this.columns = this.buildOrderColumns();
this.workerOrderColumns = this.buildOrderColumns(false);
this.getLogisticsInfo();
this.refreshOrderCounts();
this.startCountRefreshTimer();
@ -279,12 +374,7 @@
this.getCustomerServiceSetting();
},
buildWorkerColumns() {
return [{
type: "index",
width: 60,
align: "center",
fixed: "left",
}, {
return [ {
title: "配送人员",
key: "workerName",
width: 200,
@ -297,17 +387,17 @@
}, {
title: "待取",
key: "orderGetCount",
width: 130,
width: 110,
align: "center",
}, {
title: "待送",
key: "orderPutCount",
width: 130,
width: 110,
align: "center",
}, {
title: "待接单",
key: "orderWaitCount",
width: 130,
width: 110,
align: "center",
}, {
title: "配送佣金",
@ -330,37 +420,37 @@
])
}];
},
buildOrderColumns() {
buildOrderColumns(clickableWorker = true) {
return [{
type: "index",
width: 60,
align: "center",
fixed: "left",
}, {
title: "订单时间",
key: "createTime",
width: 170,
width: 190,
align: "center",
render: (h, params) => h("span", this.formatDateTime(params.row.createTime))
render: (h, params) => h("div", [
h("div", this.formatDateTime(params.row.createTime)),
h("div", { class: "order-time-order-no" }, "订单编号:" + this.getOrderNo(params.row))
])
}, {
title: "配送员",
key: "workerName",
width: 150,
align: "center",
render: (h, params) => this.renderWorkerInfo(h, params.row, clickableWorker)
},{
title: "送达时间",
key: "mustFinishTime",
width: 180,
width: 210,
align: "center",
render: (h, params) => h("div", [
h("Tag", {
props: {
color: this.isNearMustFinishTime(params.row) ? "red" : "green"
}
}, this.formatDateTime(params.row.mustFinishTime)),
h("span", { class: "must-finish-time" }, this.formatDateTime(params.row.mustFinishTime)),
this.isNearMustFinishTime(params.row) ? h("div", {
style: { color: "#ed4014", marginTop: "4px" }
style: { color: "#515a6e", marginTop: "4px", fontWeight: 700 }
}, this.getMustFinishWarningText(params.row)) : null
])
},{
title: "配送类型",
key: "deliveryType",
width: 100,
width: 140,
align: "center",
render: (h, params) => this.renderDeliveryTags(h, params.row)
}, {
@ -373,25 +463,6 @@
key: "receiverAddress",
minWidth: 240,
render: (h, params) => this.renderAddressBlock(h, params.row, "receiver")
}, {
title: "订单状态",
key: "status",
width: 80,
align: "center",
render: (h, params) => h("Tag", {
props: {
color: this.getStatusColor(params.row.status)
}
}, this.getStatusText(params.row.status))
}, {
title: "配送员",
key: "workerName",
width: 150,
align: "center",
render: (h, params) => h("div", [
h("div", params.row.workerName || "未分配"),
params.row.workerPhone ? h("div", { style: { color: "#999", fontSize: "12px" } }, params.row.workerPhone) : null
])
}, {
title: "配送佣金",
key: "deliveryFee",
@ -501,6 +572,24 @@
this.searchWorker.pageNum = 1;
this.getWorker();
},
handleWorkerSearch() {
this.searchWorker.pageNum = 1;
this.getWorker();
},
handleWorkerReset() {
this.searchWorker.keyword = "";
this.searchWorker.pageNum = 1;
this.getWorker();
},
changeWorkerOrderPage(v) {
this.workerOrderForm.pageNum = v;
this.getWorkerOrders();
},
changeWorkerOrderPageSize(v) {
this.workerOrderForm.pageSize = v;
this.workerOrderForm.pageNum = 1;
this.getWorkerOrders();
},
changeTableSize(v) {
this.tableSize = v;
},
@ -512,53 +601,126 @@
}
this.getLogisticsInfo();
},
getLogisticsInfo() {
getLogisticsInfo(silent = false) {
if (!this.isOrderTab) return;
if (this.tabName === "hall") {
this.getHallOrders();
return this.getHallOrders(silent);
} else {
this.getDeliveryOrders();
return this.getDeliveryOrders(silent);
}
},
getHallOrders() {
this.loading = true;
getHallOrders(silent = false) {
if (!silent) this.loading = true;
const params = this.cleanParams(this.hallSearchForm);
delete params.paths;
delete params.waimaiData;
delete params.kuaidiData;
delete params.workerId;
getAdminDeliveryHallData(params).then((res) => {
return getAdminDeliveryHallData(params).then((res) => {
if (this.isSuccess(res)) {
const result = res.result || {};
this.data = this.normalizeRecords(result.records);
this.total = Number(result.total) || 0;
}
}).finally(() => {
this.loading = false;
if (!silent) this.loading = false;
});
},
getDeliveryOrders() {
this.loading = true;
getDeliveryOrders(silent = false) {
if (!silent) this.loading = true;
const params = this.cleanParams(this.deliverySearchForm);
delete params.workerId;
orderSchedulingAdmin(params).then((res) => {
return orderSchedulingAdmin(params).then((res) => {
if (this.isSuccess(res)) {
const result = res.result || {};
this.data = this.normalizeRecords(result.records);
this.total = Number(result.total) || 0;
}
}).finally(() => {
this.loading = false;
if (!silent) this.loading = false;
});
},
openWorkerOrders(row) {
if (!row || !row.workerId) {
this.$Message.warning("该订单暂无配送员");
return;
}
this.selectedWorker = {
workerId: row.workerId,
workerName: row.workerName || "",
workerPhone: row.workerPhone || ""
};
this.workerOrderTab = "daiqu";
this.workerOrderForm.pageNum = 1;
this.workerOrderVisible = true;
this.getWorkerOrderCounts();
this.getWorkerOrders();
},
changeWorkerOrderTab(v) {
this.workerOrderTab = v;
this.workerOrderForm.pageNum = 1;
this.getWorkerOrders();
},
buildWorkerOrderParams() {
const source = this.activeSearchForm || {};
const params = {
regionId: source.regionId || this.currentRegionId,
deliveryType: source.deliveryType,
getAreaId: source.getAreaId,
putAreaId: source.putAreaId,
shopName: source.shopName,
order: source.order,
workerId: this.selectedWorker.workerId,
status: DELIVERY_STATUS_MAP[this.workerOrderTab],
pageNum: this.workerOrderForm.pageNum,
pageSize: this.workerOrderForm.pageSize
};
return this.cleanParams(params);
},
buildWorkerOrderCountParams(status) {
return Object.assign({}, this.buildWorkerOrderParams(), {
status: status,
pageNum: 1,
pageSize: 1
});
},
getWorkerOrderCounts() {
if (!this.selectedWorker.workerId) return;
Promise.all([
orderSchedulingAdmin(this.buildWorkerOrderCountParams(DELIVERY_STATUS_MAP.daiqu)),
orderSchedulingAdmin(this.buildWorkerOrderCountParams(DELIVERY_STATUS_MAP.daisong))
]).then(([daiqu, daisong]) => {
if (this.isSuccess(daiqu)) {
this.workerOrderCounts.daiqu = Number((daiqu.result || {}).total) || 0;
}
if (this.isSuccess(daisong)) {
this.workerOrderCounts.daisong = Number((daisong.result || {}).total) || 0;
}
});
},
getWorkerOrders() {
if (!this.selectedWorker.workerId) return;
this.workerOrderLoading = true;
orderSchedulingAdmin(this.buildWorkerOrderParams()).then((res) => {
if (this.isSuccess(res)) {
const result = res.result || {};
this.workerOrderList = this.normalizeRecords(result.records);
this.workerOrderTotal = Number(result.total) || 0;
}
}).finally(() => {
this.workerOrderLoading = false;
});
},
refreshOrderCounts() {
this.getHallOrderCounts();
this.getDeliveryStatusCounts();
return Promise.all([
this.getHallOrderCounts(),
this.getDeliveryStatusCounts()
]);
},
startCountRefreshTimer() {
this.clearCountRefreshTimer();
this.countRefreshTimer = setInterval(() => {
this.refreshOrderCounts();
this.refreshAutoData();
}, 30000);
},
clearCountRefreshTimer() {
@ -567,6 +729,16 @@
this.countRefreshTimer = null;
}
},
refreshAutoData() {
if (!this.isOrderTab || this.loading || this.autoRefreshing) return;
this.autoRefreshing = true;
Promise.all([
this.getLogisticsInfo(true),
this.refreshOrderCounts()
]).catch(() => {}).finally(() => {
this.autoRefreshing = false;
});
},
getHallOrderCounts() {
const params = this.cleanParams({
...this.hallSearchForm,
@ -579,7 +751,7 @@
delete params.workerId;
delete params.deliveryType;
delete params.order;
getAdminDeliveryHallData(params).then((res) => {
return getAdminDeliveryHallData(params).then((res) => {
if (this.isSuccess(res)) {
this.setHallCounts(res.result || {});
}
@ -596,7 +768,7 @@
delete params.workerId;
return params;
};
Promise.all([orderSchedulingAdmin(buildParams(1)), orderSchedulingAdmin(buildParams(2))]).then(([daiqu, daisong]) => {
return Promise.all([orderSchedulingAdmin(buildParams(1)), orderSchedulingAdmin(buildParams(2))]).then(([daiqu, daisong]) => {
if (this.isSuccess(daiqu)) {
this.deliveryCounts.daiqu = Number((daiqu.result || {}).total) || 0;
}
@ -704,10 +876,12 @@
newWorkerId: item.workerId,
newWorkerName: item.workerName,
newWorkerPhone: item.mobile,
fromWhere: "admin",
}).then((res) => {
if (this.isSuccess(res)) {
this.$Message.success(actionText + "配送员成功");
this.transferOrder = false;
this.workerOrderVisible = false;
this.getLogisticsInfo();
}
});
@ -725,7 +899,7 @@
},
unbind(v) {
if (!this.canAssignWorker(v)) {
this.$Message.warning("只有待接单配送单支持指派或改派");
this.$Message.warning("只有待接单、待取货、待送达配送单支持指派或改派");
return;
}
if (!v.getAreaId || !v.putAreaId) {
@ -783,7 +957,23 @@
});
},
getOrderNo(row) {
return row.numberCode || row.orderId || row.orderNo || row.id || "";
return row.orderId || row.orderNo || row.numberCode || row.id || "";
},
getOrderRowClassName(row) {
return this.isNearMustFinishTime(row) ? "logistics-warning-row" : "";
},
renderWorkerInfo(h, row, clickable = true) {
const children = [
h("div", { class: "worker-info-name" }, row.workerName || "未分配"),
row.workerPhone ? h("div", { class: "worker-info-phone" }, row.workerPhone) : null
];
if (!clickable || !row.workerId) return h("div", children);
return h("div", {
class: "worker-info",
on: {
click: () => this.openWorkerOrders(row)
}
}, children);
},
getDeliveryTypeText(type, row) {
if (row && row.workerId && this.tabName === "hall") return "指派单";
@ -802,6 +992,9 @@
}
if (row.transferDelivery == 1) {
tags.push(h("Tag", { props: { color: "purple" } }, "中转配送"));
if (row.transferPickupCode) {
tags.push(h("div", { class: "transfer-pickup-code" }, "中转码:" + row.transferPickupCode));
}
}
if (row.isBig == 1) {
tags.push(h("Tag", { props: { color: "red" } }, "超大/超重"));
@ -818,10 +1011,10 @@
renderAddressBlock(h, row, type) {
if (type === "shop") {
const children = [
h("div", { style: { fontWeight: 700 } }, row.shopName || ""),
h("div", row.shopAddress || "")
h("div", { style: { fontWeight: 700 } }, row.shopName || "")
];
if (row.shopPhone) children.push(h("div", { style: { color: "#999" } }, "电话:" + row.shopPhone));
if (row.shopPhone) children.push(h("div", { style: { fontWeight: 700 } }, "电话:" + row.shopPhone));
children.push(h("div", row.shopAddress || ""));
if (row.transferDelivery == 1) {
children.push(h("div", { style: { color: "#b26a00" } }, "中转点:" + (row.transferAddressName || row.shopName || "")));
children.push(h("div", { style: { color: "#b26a00" } }, "送达中转点:" + (row.transferArriveTime ? this.formatDateTime(row.transferArriveTime) : "商家未确认送达")));
@ -831,8 +1024,8 @@
}
return h("div", [
h("div", { style: { fontWeight: 700 } }, row.receiverName || ""),
row.receiverPhone ? h("div", { style: { fontWeight: 700 } }, "电话:" + row.receiverPhone) : null,
h("div", row.receiverAddress || ""),
row.receiverPhone ? h("div", { style: { color: "#999" } }, "电话:" + row.receiverPhone) : null,
row.deliveryType == 2 || row.deliveryType == 3 ? h("div", { style: { color: "#999" } }, "件数:" + (row.allCount || 0) + "件") : null,
row.getCodes ? h("div", { style: { color: "#999" } }, "取件码:" + row.getCodes) : null,
row.phoneNumber ? h("div", { style: { color: "#999" } }, "手机尾号:" + row.phoneNumber) : null
@ -863,7 +1056,7 @@
return h("div", children);
},
canAssignWorker(row) {
return row && row.status == 0;
return row && [0, 1, 2].indexOf(Number(row.status)) > -1;
},
getWorkerOrderType(row) {
return row && row.deliveryType == 2 ? 1 : 0;
@ -927,6 +1120,12 @@
mounted() {
this.init();
},
activated() {
this.startCountRefreshTimer();
},
deactivated() {
this.clearCountRefreshTimer();
},
beforeDestroy() {
this.clearCountRefreshTimer();
},

137
src/views/app/business/logistics/logisticsAddress.vue

@ -1,15 +1,12 @@
<template>
<div class="search">
<div class='waiceng' style="margin-top: 20px;">
<div class='waiceng' style="margin-top: -5px;">
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">核对编号{{orderData.numberCode}}</div>
<div style="flex:1;padding-left:10px;">物流编号{{orderData.deliveryInfo.id}}</div>
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">订单编号{{orderData.id}}</div>
<div style="flex:1;padding-left:10px;">物流订单生成时间{{orderData.deliveryInfo.createTime | formatDateTime}}
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">订单号{{orderData.numberCode}}</div>
<div style="flex:1;padding-left:10px;">配送单生成时间{{orderData.deliveryInfo.createTime | formatDateTime}}
</div>
</div>
</div>
<div class="title">商家信息</div>
<div class='waiceng'>
@ -19,7 +16,7 @@
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">地址{{orderData.shopAddress}}</div>
<div style="flex:1;padding-left:10px;">发货时间{{orderData.shopMakeTime | formatDateTime}}</div>
<div style="flex:1;padding-left:10px;">出餐时间{{orderData.shopMakeTime | formatDateTime}}</div>
</div>
</div>
<div class="title">用户信息</div>
@ -31,48 +28,48 @@
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">地址{{orderData.receiverAddress}}
</div>
<div style="flex:1;padding-left:10px;">要求送达时间{{orderData.deliveryInfo.mustFinishTime | formatDateTime}}
<div style="flex:1;padding-left:10px;">预计送达时间{{orderData.deliveryInfo.mustFinishTime | formatDateTime}}
</div>
</div>
</div>
<div class="title">商品信息</div>
<div class='waiceng' style="text-align: center;">
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">商品名称</div>
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">规格</div>
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">数量</div>
<div style="flex:1;padding-left:10px;">总价</div>
</div>
<div class="nei1" v-for="(item,index) in orderData.goodsList" :key="index">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">{{item.productName}}</div>
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">{{item.specs}}</div>
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">{{item.quantity}}</div>
<div style="flex:1;padding-left:10px;">¥{{item.price}}</div>
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">餐盒费</div>
<div style="width:25%;padding-left:10px;">¥{{orderData.packageFee}}</div>
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">配送费</div>
<div style="width:25%;padding-left:10px;">¥{{orderData.deliveryFee}}</div>
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">总计</div>
<div style="width:25%;padding-left:10px;">¥{{orderData.totalAmount}}</div>
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">抵用券金额</div>
<div style="width:25%;padding-left:10px;">
<div class="goods-table-row">
<div class="goods-table-cell">商品名称</div>
<div class="goods-table-cell">规格</div>
<div class="goods-table-cell">数量</div>
<div class="goods-table-cell last">总价</div>
</div>
<div class="goods-table-row" v-for="(item,index) in orderData.goodsList" :key="index">
<div class="goods-table-cell">{{item.productName}}</div>
<div class="goods-table-cell specs-cell">{{item.specs}}</div>
<div class="goods-table-cell">{{item.quantity}}</div>
<div class="goods-table-cell last">¥{{item.price}}</div>
</div>
<div class="goods-table-row">
<div class="goods-summary-label">餐盒费</div>
<div class="goods-summary-price">¥{{orderData.packageFee}}</div>
</div>
<div class="goods-table-row">
<div class="goods-summary-label">配送费</div>
<div class="goods-summary-price">¥{{orderData.deliveryFee}}</div>
</div>
<div class="goods-table-row">
<div class="goods-summary-label">实付金额</div>
<div class="goods-summary-price">¥{{orderData.totalAmount}}</div>
</div>
<div class="goods-table-row">
<div class="goods-summary-label">抵用券金额</div>
<div class="goods-summary-price">
¥{{orderData.couponDiscountFee== null?0.00:orderData.couponDiscountFee}}</div>
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">活动优惠金额</div>
<div style="width:25%;padding-left:10px;">¥0.00</div>
<div class="goods-table-row">
<div class="goods-summary-label">锦鲤免单金额</div>
<div class="goods-summary-price">¥{{orderData.freeAmount > 0? orderData.freeAmount : 0}}</div>
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">实付金额</div>
<div style="width:25%;padding-left:10px;">¥{{orderData.totalAmount}}</div>
<div class="goods-table-row">
<div class="goods-summary-label">实付金额</div>
<div class="goods-summary-price">¥{{orderData.totalAmount}}</div>
</div>
</div>
<div class="title">配送流程</div>
@ -88,20 +85,26 @@
{{orderData.createTime | formatDateTime}}</div>
<div style="flex:1;padding-left:10px;"></div>
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">配送员接单</div>
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">
{{orderData.deliveryInfo.acceptTime | formatDateTime}}</div>
<div style="flex:1;padding-left:10px;">{{orderData.deliveryInfo.workerName}}</div>
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">商家出餐</div>
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">
{{orderData.shopMakeTime | formatDateTime}}</div>
<div style="flex:1;padding-left:10px;">{{orderData.shopName}}</div>
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">配送员接单</div>
<div class="nei1" v-if="isTransferOrder">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">商家送达中转点</div>
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">
{{orderData.deliveryInfo.acceptTime | formatDateTime}}</div>
<div style="flex:1;padding-left:10px;">{{orderData.deliveryInfo.workerName}}</div>
{{orderData.deliveryInfo.transferArriveTime | formatDateTime}}</div>
<div style="flex:1;padding-left:10px;">{{orderData.shopName}}</div>
</div>
<div class="nei1">
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">已到店</div>
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">{{isTransferOrder ? '配送员到达中转点' : '已到店'}}</div>
<div style="flex:1;padding-left:10px;border-right:1px solid #eee;">
{{orderData.deliveryInfo.arriveTime | formatDateTime}}</div>
<div style="flex:1;padding-left:10px;">{{orderData.deliveryInfo.workerName}}</div>
@ -146,6 +149,12 @@
};
},
computed: {
isTransferOrder() {
const deliveryInfo = this.orderData.deliveryInfo || {};
return this.orderData.transferDelivery == 1 || deliveryInfo.transferDelivery == 1;
}
},
filters: {
formatDateTime(isoString) {
if (!isoString) return ''
@ -190,11 +199,45 @@
//@import "@/styles/table-common.less";
.nei1 {
display: flex;
padding-top: 10rpx;
border: 1px solid #eee;
height: 30px;
line-height: 30px;
}
.goods-table-row {
display: flex;
min-height: 30px;
border: 1px solid #eee;
line-height: 20px;
}
.goods-table-cell {
flex: 1;
padding: 5px 10px;
border-right: 1px solid #eee;
word-break: break-all;
}
.goods-table-cell.last {
border-right: 0;
}
.specs-cell {
white-space: normal;
}
.goods-summary-label {
flex: 1;
padding: 5px 10px;
border-right: 1px solid #eee;
}
.goods-summary-price {
width: 25%;
padding: 5px 10px;
}
.title {
height: 40px;
line-height: 40px;

16
src/views/app/business/luckey/luckey.vue

@ -502,7 +502,6 @@
],
landmark: [
{ key: 'name', label: '地标名称' },
{ key: 'icon', label: '图标' },
{ key: 'benefitType', label: '收益类型', type: 'select', options: [
{ value: 'ticket', label: '每日发券' },
{ value: 'stamina_speed', label: '体力恢复加速' },
@ -520,8 +519,6 @@
college: [
{ key: 'collegeName', label: '学院名称' },
{ key: 'shortName', label: '简称' },
{ key: 'icon', label: '图标/Emoji' },
{ key: 'themeColor', label: '主题色' },
{ key: 'sort', label: '排序', type: 'number' },
{ key: 'enabled', label: '是否启用', type: 'switch' }
]
@ -576,7 +573,6 @@
},
taskColumns() {
return [
{ title: '编码', key: 'code', width: 100 },
{ title: '名称', key: 'name', minWidth: 120 },
{ title: '描述', key: 'description', minWidth: 180 },
{ title: '奖励券', key: 'rewardTickets', width: 80 },
@ -728,7 +724,6 @@
landmarkColumns() {
return [
{ title: '名称', key: 'name', minWidth: 120 },
{ title: '图标', key: 'icon', minWidth: 80 },
{ title: '收益类型', key: 'benefitType', minWidth: 120 },
{ title: '收益值', key: 'benefitValue', minWidth: 90 },
{ title: '开放时间', minWidth: 150, render: (h, p) => h('span', `${p.row.openStartTime || '--'} - ${p.row.openEndTime || '--'}`) },
@ -740,8 +735,6 @@
return [
{ title: '学院名称', key: 'collegeName', minWidth: 150 },
{ title: '简称', key: 'shortName', minWidth: 100 },
{ title: '图标', key: 'icon', minWidth: 90 },
{ title: '主题色', key: 'themeColor', minWidth: 100 },
{ title: '排序', key: 'sort', minWidth: 80 },
{ title: '启用', minWidth: 70, render: (h, p) => this.enabledTag(h, p.row.enabled) },
this.operateActionColumn('college')
@ -778,7 +771,6 @@
return [
{ title: '日期', key: 'rankDate', minWidth: 120 },
{ title: '名次', key: 'rankNo', minWidth: 80 },
{ title: '昵称', key: 'nickname', minWidth: 120 },
{ title: '学院', key: 'college', minWidth: 120 },
{ title: '分数', key: 'score', minWidth: 90 },
{ title: '次数', key: 'playCount', minWidth: 80 },
@ -805,11 +797,9 @@
{ title: '学院', key: 'college', minWidth: 120 },
{ title: '分数', key: 'score', width: 90 },
{ title: '耗时(秒)', key: 'durationSeconds', width: 100 },
{ title: '普通/金/钻/彩', minWidth: 130, render: (h, p) => h('span', `${p.row.normalCount || 0}/${p.row.goldenCount || 0}/${p.row.diamondCount || 0}/${p.row.rainbowCount || 0}`) },
{ title: '券袋', key: 'ticketBagCount', width: 80 },
{ title: '状态', width: 90, render: (h, p) => h('Tag', { props: { color: p.row.status === 1 ? 'green' : 'blue' } }, p.row.status === 1 ? '已提交' : '进行中') },
{ title: '异常', width: 80, render: (h, p) => h('Tag', { props: { color: p.row.cheatFlag === 'Y' ? 'red' : 'green' } }, p.row.cheatFlag === 'Y' ? '异常' : '正常') },
{ title: '原因', key: 'cheatReason', minWidth: 160 },
{ title: '状态', width: 100, render: (h, p) => h('Tag', { props: { color: p.row.status === 1 ? 'green' : 'blue' } }, p.row.status === 1 ? '已提交' : '进行中') },
/* { title: '', width: 100, render: (h, p) => h('Tag', { props: { color: p.row.cheatFlag === 'Y' ? 'red' : 'green' } }, p.row.cheatFlag === 'Y' ? '' : '') },
{ title: '原因', key: 'cheatReason', minWidth: 160 }, */
{ title: '开始时间', key: 'startTime', minWidth: 160 },
{ title: '提交时间', key: 'endTime', minWidth: 160 }
]

14
src/views/app/shop/shop.vue

@ -1,6 +1,13 @@
<style lang="less">
@import "@/styles/table-common.less";
@import "shop.less";
.shop-address-tooltip {
max-width: 520px;
white-space: normal;
word-break: break-all;
line-height: 20px;
}
</style>
<template>
<div class="search">
@ -241,9 +248,9 @@
const address = params.row.shopAddress || "";
return h("Tooltip", {
props: {
content: address,
transfer: true,
placement: "top",
maxWidth: 520,
}
}, [
h("span", {
@ -256,6 +263,11 @@
verticalAlign: "middle",
},
}, address)
,
h("div", {
slot: "content",
class: "shop-address-tooltip"
}, address)
]);
},
},

27
src/views/sys/order-manage/logisticsAddress.vue

@ -80,17 +80,19 @@
</div>
<div class="waiceng" style="width: 29%;background: #eee;padding: 0;">
<div style="background: #fff;padding: 10px;margin-bottom: 10px;border-radius: 10px;">
<div class="title">物流信息</div>
<div class="title">配送信息</div>
<div class="text">配送单类型{{getDeliveryModeText()}}</div>
<div class="text">用户下单{{orderData.createTime | formatDateTime}}</div>
<div class="text">商家出餐{{orderData.shopMakeTime | formatDateTime}}</div>
<div class="text">配送员接单{{orderData.deliveryInfo.acceptTime | formatDateTime}}</div>
<div class="text">已到店{{orderData.deliveryInfo.arriveTime | formatDateTime}}</div>
<div class="text">商家出餐{{orderData.shopMakeTime | formatDateTime}}</div>
<div class="text" v-if="isTransferOrder()">商家送达中转点{{orderData.deliveryInfo.transferArriveTime | formatDateTime}}</div>
<div class="text">{{(this.orderData.deliveryInfo && this.orderData.deliveryInfo.transferDelivery == 1) ? '配送员到达中转点' : '已到店'}}{{orderData.deliveryInfo.arriveTime | formatDateTime}}</div>
<div class="text">配送员已取货{{orderData.deliveryInfo.getTime | formatDateTime}}</div>
<div class="text">配送员已送达{{orderData.deliveryInfo.finishTime | formatDateTime}}</div>
</div>
<div v-if="orderData.status !=7 && orderData.status != 11" style="background: #fff;padding: 10px;border-radius: 10px;">
<div class="title">运营订单备注</div>
<textarea v-model="refundReason" name="" id="" cols="30" rows="10" style="width: 100%;border: 1px solid #eee;"></textarea>
<textarea v-model="refundReason" name="" id="" cols="30" rows="4" style="width: 100%;height: 80px;border: 1px solid #eee;"></textarea>
<div v-if="canAdminRefundOrder()" class='btn' @click="adminRefundOrder">{{ refundLoading ? "退款中" : "退款" }}</div>
</div>
</div>
@ -396,6 +398,23 @@
if (item.status == 12) return "订单已售后";
return "";
},
isTransferOrder() {
const deliveryInfo = this.orderData.deliveryInfo || {};
return this.orderData.transferDelivery == 1 || deliveryInfo.transferDelivery == 1;
},
isShopDeliveryOrder() {
const deliveryInfo = this.orderData.deliveryInfo || {};
return this.orderData.shopDelivery == 1 || deliveryInfo.shopDelivery == 1;
},
getDeliveryModeText() {
const modes = [];
if (this.isTransferOrder()) modes.push("中转单");
if (this.isShopDeliveryOrder()) modes.push("商家自配送单");
if (modes.length > 0) return modes.join(" / ");
if (this.orderData.deliveryType == 1) return "普通配送单";
if (this.orderData.deliveryType == 2) return "到店自取";
return "";
},
getAutoRefundTime(value) {
if (!value) return "";
const date = new Date(value);

11
src/views/sys/order-manage/orderManage.vue

@ -93,7 +93,10 @@
</Tabs>
<Row v-show="openSearch" @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="100">
<FormItem label="订单编号" prop="id">
<Input type="text" v-model="searchForm.id" clearable placeholder="请输入订单编号"
style="width: 200px" />
</FormItem>
<FormItem label="店铺名称" prop="shopName">
<Input type="text" v-model="searchForm.shopName" clearable placeholder="请输入店铺名称"
style="width: 200px" />
@ -145,7 +148,7 @@
</Row>
</Card>
<!-- 订单详情 -->
<Modal title="订单详情" v-model="Visiable" :mask-closable="false" :scrollabele="true" :width="1000">
<Modal title="订单详情" v-model="Visiable" :mask-closable="true" :scrollabele="true" :width="1000">
<logistics-address v-if="Visiable" @closePage="closePage" ref="dialog"></logistics-address>
<div slot="footer" v-show="Visiable">
<Button type="text" @click="Visiable = false">关闭</Button>
@ -470,6 +473,7 @@
status: 0
},
searchForm: {
id: "",
pageNum: 1,
pageSize: 10,
regionId: JSON.parse(this.getStore("user")).departmentId,
@ -567,7 +571,7 @@
{
title: "完成支付时间",
key: "createTime",
width: 180,
minWidth: 180,
align: "center",
render: (h, params) => {
return h(
@ -1137,6 +1141,7 @@
},
handleReset() {
this.$refs.searchForm.resetFields();
this.searchForm.id = "";
this.searchForm.shopName = "";
this.searchForm.receiverPhone = "";
this.searchForm.pageNum = 1;

Loading…
Cancel
Save