web/manager/src/views/order/order/orderDetail.vue
2022-02-10 18:57:36 +08:00

861 lines
25 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="search">
<div>
<Card style="height: 60px">
<div style="">
<Button v-if="allowOperation.editPrice" @click="modifyPrice">调整价格</Button>
<Button
v-if="allowOperation.editConsignee"
@click="editAddress"
type="primary"
ghost
>修改收货地址</Button
>
<Button v-if="allowOperation.cancel" @click="orderCancel" type="warning" ghost
>订单取消</Button
>
<Button
v-if="orderInfo.order.orderStatus === 'UNPAID'"
@click="confirmPrice"
type="primary"
>收款</Button
>
<Button @click="orderLog" type="info" ghost>订单日志</Button>
</div>
</Card>
<Card class="mt_10 clearfix">
<div style="width: 30%; float: left; margin-left: 20px">
<div class="div-item">
<div class="div-item-left">订单号:</div>
<div class="div-item-right">{{ orderInfo.order.sn }}</div>
</div>
<div class="div-item">
<div class="div-item-left">订单来源:</div>
<div class="div-item-right">
{{ orderInfo.order.clientType | clientTypeWay }}
</div>
</div>
<div class="div-item">
<div class="div-item-left">订单状态:</div>
<div class="div-item-right">
{{ orderInfo.orderStatusValue }}
</div>
</div>
<div class="div-item">
<div class="div-item-left">下单时间:</div>
<div class="div-item-right">
{{ orderInfo.order.createTime }}
</div>
</div>
</div>
<div style="width: 30%; float: left; margin-left: 20px">
<div class="div-item" v-if="orderInfo.order.needReceipt == false">
<div class="div-item-left">发票信息:</div>
<div class="div-item-right">暂无发票信息</div>
</div>
<div class="div-item" v-if="orderInfo.order.needReceipt == true">
<div class="div-item-left">发票抬头:</div>
<div class="div-item-right">
{{
orderInfo.receipt.receiptTitle ? orderInfo.receipt.receiptTitle : "暂无"
}}
</div>
</div>
<div
class="div-item"
v-if="orderInfo.order.needReceipt == true && orderInfo.receipt.taxpayerId"
>
<div class="div-item-left">发票税号:</div>
<div class="div-item-right">
{{ orderInfo.receipt.taxpayerId ? orderInfo.receipt.taxpayerId : "暂无" }}
</div>
</div>
<div class="div-item" v-if="orderInfo.order.needReceipt == true">
<div class="div-item-left">发票内容:</div>
<div class="div-item-right">
{{
orderInfo.receipt.receiptContent
? orderInfo.receipt.receiptContent
: "暂无"
}}
</div>
</div>
<div class="div-item" v-if="orderInfo.order.needReceipt == true">
<div class="div-item-left">发票金额:</div>
<div class="div-item-right">
{{
orderInfo.receipt.receiptPrice
? orderInfo.receipt.receiptPrice
: "暂无" | unitPrice("¥")
}}
</div>
</div>
<div class="div-item" v-if="orderInfo.order.needReceipt == true">
<div class="div-item-left">是否开票:</div>
<div class="div-item-right">
{{ orderInfo.receipt.receiptStatus == 0 ? "未开" : "已开" }}
</div>
</div>
</div>
<div style="width: 36%; float: left">
<div class="div-item">
<div class="div-item-left">收货信息:</div>
<div class="div-item-right">
{{ orderInfo.order.consigneeName }}
{{ orderInfo.order.consigneeMobile }}
{{ orderInfo.order.consigneeAddressPath }}
{{ orderInfo.order.consigneeDetail }}
</div>
</div>
<div class="div-item">
<div class="div-item-left">支付方式:</div>
<div class="div-item-right">
{{ orderInfo.paymentMethodValue }}
</div>
</div>
<div class="div-item">
<div class="div-item-left">买家留言:</div>
<div class="div-item-right">{{ orderInfo.order.remark }}</div>
</div>
<div class="div-item" v-if="orderInfo.order.needReceipt == false">
<div class="div-item-left">发票信息:</div>
<div class="div-item-right">暂无发票信息</div>
</div>
<div class="div-item" v-if="orderInfo.order.needReceipt == true">
<div class="div-item-left">发票抬头:</div>
<div class="div-item-right">
{{
orderInfo.receipt.receiptTitle ? orderInfo.receipt.receiptTitle : "暂无"
}}
</div>
</div>
<div
class="div-item"
v-if="orderInfo.order.needReceipt == true && orderInfo.receipt.taxpayerId"
>
<div class="div-item-left">发票税号:</div>
<div class="div-item-right">
{{ orderInfo.receipt.taxpayerId ? orderInfo.receipt.taxpayerId : "暂无" }}
</div>
</div>
<div class="div-item" v-if="orderInfo.order.needReceipt == true">
<div class="div-item-left">发票内容:</div>
<div class="div-item-right">
{{
orderInfo.receipt.receiptContent
? orderInfo.receipt.receiptContent
: "暂无"
}}
</div>
</div>
<div class="div-item" v-if="orderInfo.order.needReceipt == true">
<div class="div-item-left">发票金额:</div>
<div class="div-item-right">
{{
orderInfo.receipt.receiptPrice
? orderInfo.receipt.receiptPrice
: "暂无" | unitPrice("¥")
}}
</div>
</div>
<div class="div-item" v-if="orderInfo.order.needReceipt == true">
<div class="div-item-left">是否开票:</div>
<div class="div-item-right">
{{ orderInfo.receipt.receiptStatus == 0 ? "未开" : "已开" }}
</div>
</div>
<div class="div-item">
<div class="div-item-left">配送方式:</div>
<div class="div-item-right">
{{ orderInfo.deliveryMethodValue }}
</div>
</div>
</div>
</Card>
<Card class="mt_10">
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
sortable="custom"
>
<!-- 商品栏目格式化 -->
<template slot="goodsSlot" slot-scope="{ row }">
<div style="margin-top: 5px; height: 80px; display: flex">
<div style="">
<img
:src="row.image"
style="height: 60px; margin-top: 1px; width: 60px"
/>
</div>
<div style="margin-left: 13px">
<div class="div-zoom">
<a @click="linkTo(row.goodsId, row.skuId)">{{ row.goodsName }}</a>
</div>
<span v-for="(item, key) in JSON.parse(row.specs)" :key="key">
<span v-show="key != 'images'" style="font-size: 12px; color: #999999">
{{ key }} : {{ item }}
</span>
</span>
<Poptip
trigger="hover"
style="display: block"
title="扫码在手机中查看"
transfer
>
<div slot="content">
<vue-qr
:text="wapLinkTo(row.goodsId, row.skuId)"
:margin="0"
colorDark="#000"
colorLight="#fff"
:size="150"
></vue-qr>
</div>
<img
src="../../../assets/qrcode.svg"
class="hover-pointer"
width="20"
height="20"
alt=""
/>
</Poptip>
</div>
</div>
</template>
</Table>
<div class="goods-total">
<ul>
<li>
<span class="label">商品总额</span>
<span class="txt">{{
orderInfo.order.priceDetailDTO.goodsPrice | unitPrice("¥")
}}</span>
</li>
<li
v-if="
orderInfo.order.priceDetailDTO.discountPrice &&
orderInfo.order.priceDetailDTO.discountPrice > 0
"
>
<span class="label">优惠金额:</span>
<span class="txt">
{{ orderInfo.order.priceDetailDTO.discountPrice | unitPrice("¥") }}
</span>
</li>
<li
v-if="
orderInfo.order.priceDetailDTO.couponPrice &&
orderInfo.order.priceDetailDTO.couponPrice > 0
"
>
<span class="label">优惠券金额:</span>
<span class="txt">
{{ orderInfo.order.priceDetailDTO.couponPrice | unitPrice("¥") }}
</span>
</li>
<li>
<span class="label">运费:</span>
<span class="txt">{{
orderInfo.order.freightPrice | unitPrice("¥")
}}</span>
</li>
<li v-if="orderInfo.order.priceDetailDTO.updatePrice">
<span class="label">修改金额:</span>
<span class="txt theme_color"
>¥{{ orderInfo.order.priceDetailDTO.updatePrice | unitPrice }}</span
>
</li>
<li v-if="orderInfo.order.priceDetailDTO.payPoint != 0">
<span class="label">使用积分:</span>
<span class="txt flowPrice">{{
orderInfo.order.priceDetailDTO.payPoint
}}</span>
</li>
<li>
<span class="label">应付金额:</span>
<span class="txt flowPrice"
>¥{{ orderInfo.order.priceDetailDTO.flowPrice | unitPrice }}</span
>
</li>
</ul>
</div>
</Card>
</div>
<Modal v-model="modal" width="530">
<p slot="header">
<Icon type="edit"></Icon>
<span>修改金额</span>
</p>
<div>
<Form
ref="modifyPriceForm"
:model="modifyPriceForm"
label-position="left"
:label-width="70"
:rules="modifyPriceValidate"
>
<FormItem label="订单金额" prop="price">
<InputNumber
style="width: 100px"
v-model="modifyPriceForm.price"
:min="0"
:max="999999"
></InputNumber>
<span class="ml_10">元</span>
</FormItem>
</Form>
</div>
<div slot="footer" style="text-align: right">
<Button @click="modal = false">关闭</Button>
<Button type="primary" @click="modifyPriceSubmit">调整</Button>
</div>
</Modal>
<!-- 订单取消模态框 -->
<Modal v-model="orderCancelModal" width="530">
<p slot="header">
<Icon type="edit"></Icon>
<span>订单取消</span>
</p>
<div>
<Form
ref="orderCancelForm"
:model="orderCancelForm"
label-position="left"
:label-width="100"
:rules="orderCancelValidate"
>
<FormItem label="取消原因" prop="reason">
<Input
v-model="orderCancelForm.reason"
type="textarea"
:autosize="{ minRows: 2, maxRows: 5 }"
placeholder="请输入取消原因"
></Input>
</FormItem>
</Form>
</div>
<div slot="footer" style="text-align: right">
<Button @click="orderCancelModal = false">关闭</Button>
<Button type="primary" @click="orderCancelSubmit">确认</Button>
</div>
</Modal>
<!--收件地址弹出框-->
<Modal v-model="addressModal" width="530">
<p slot="header">
<Icon type="edit"></Icon>
<span>修改收件信息</span>
</p>
<div>
<Form
ref="addressForm"
:model="addressForm"
label-position="left"
:label-width="100"
:rules="addressRule"
>
<FormItem label="收件人" prop="consigneeName">
<Input
v-model="addressForm.consigneeName"
size="large"
maxlength="20"
></Input>
</FormItem>
<FormItem label="联系方式" prop="consigneeMobile">
<Input
v-model="addressForm.consigneeMobile"
size="large"
maxlength="11"
></Input>
</FormItem>
<FormItem label="地址信息" prop="consigneeAddressPath">
<Input
v-model="addr"
disabled
style="width: 305px"
v-if="showRegion == false"
/>
<Button
v-if="showRegion == false"
@click="regionClick"
:loading="submitLoading"
type="primary"
icon="ios-create-outline"
style="margin-left: 8px"
>修改
</Button>
<region
style="width: 400px"
@selected="selectedRegion"
v-if="showRegion == true"
/>
</FormItem>
<FormItem label="详细地址" prop="consigneeDetail">
<Input
v-model="addressForm.consigneeDetail"
size="large"
maxlength="50"
></Input>
</FormItem>
</Form>
</div>
<div slot="footer" style="text-align: right">
<Button @click="addressModal = false">关闭</Button>
<Button type="primary" @click="editAddressSubmit">修改</Button>
</div>
</Modal>
<!-- 订单日志 -->
<Modal v-model="orderLogModal" width="60">
<p slot="header">
<span>订单日志</span>
</p>
<div class="order-log-div">
<Table
:loading="loading"
border
:columns="orderLogColumns"
:data="orderInfo.orderLogs"
ref="table"
sortable="custom"
></Table>
</div>
<div slot="footer" style="text-align: right">
<Button @click="handelCancel">取消</Button>
</div>
</Modal>
</div>
</template>
<script>
import * as API_Order from "@/api/order";
import * as RegExp from "@/libs/RegExp.js";
import region from "@/views/lili-components/region";
import vueQr from "vue-qr";
export default {
name: "orderList",
components: {
region,
"vue-qr": vueQr,
},
data() {
return {
loading: false, //加载表格
submitLoading: false, // 添加或编辑提交状态
addr: "", //地区
regionId: [], //地区id
showRegion: false, // 显示地区
orderLogInfo: [], //订单日志数据
orderLogModal: false, //弹出调整价格框
checkedLogistics: [], //选中的物流公司集合
allowOperation: {}, //订单可才做选项
sn: "", //订单编号
orderInfo: {
order: {
priceDetailDTO: {},
},
},
modal: false, //弹出调整价格框
searchForm: {
pageNumber: 1, // 当前页数
pageSize: 100, // 页面大小
orderSn: "", //订单sn
},
//调整价格表单
modifyPriceForm: {
price: 0,
},
//订单取消表单
orderCancelForm: {
reason: "",
},
//弹出订单取消框
orderCancelModal: false,
//订单发货
orderDeliveryForm: {
logisticsNo: "", //发货单号
logisticsId: "", //物流公司
},
//验证要调整的订单金额
modifyPriceValidate: {
reason: [
{ required: true, message: "请输入大于0小于99999的合法金额" },
{
pattern: /^[1-9]\d{0,3}(\.\d{1,2})?$/,
message: "请输入大于0小于9999的合法金额",
trigger: "change",
},
],
},
//验证取消订单原因
orderCancelValidate: {
reason: [{ required: true, message: "取消原因不能为空", trigger: "blur" }],
},
addressModal: false, //弹出修改收件信息框
//收件地址表单
addressForm: {
consigneeName: "",
consigneeMobile: "",
consigneeDetail: "",
consigneeAddressPath: "",
consigneeAddressIdPath: "",
},
orderDeliverFormValidate: {
logisticsNo: [{ required: true, message: "发货单号不能为空", trigger: "change" }],
logisticsId: [{ required: true, message: "请选择物流公司", trigger: "blur" }],
},
addressRule: {
consigneeName: [
{ required: true, message: "收货人姓名不能为空", trigger: "blur" },
],
consigneeMobile: [
{ required: true, message: "联系方式不能为空", trigger: "blur" },
{
pattern: RegExp.mobile,
trigger: "blur",
message: "请输入正确的手机号",
},
],
consigneeDetail: [
{ required: true, message: "详细地址不能为空", trigger: "blur" },
],
},
columns: [
{
title: "商品",
key: "goodsName",
minWidth: 200,
slot: "goodsSlot",
},
{
title: "优惠",
key: "num",
minWidth: 100,
render: (h, params) => {
let resultText = "";
if (params.row.promotionType) {
let type = params.row.promotionType.split(",");
if (type.indexOf("PINTUAN") != -1) {
resultText += "拼团 ";
}
if (type.indexOf("SECKILL") != -1) {
resultText += "秒杀 ";
}
if (type.indexOf("COUPON") != -1) {
resultText += "优惠券 ";
}
if (type.indexOf("FULL_DISCOUNT") != -1) {
resultText += "满减 ";
}
if (type.indexOf("POINTS_GOODS") != -1) {
resultText += "积分商品 ";
}
}
if (resultText === "") {
resultText = "暂无未参与任何促销";
}
return h("div", resultText);
},
},
{
title: "单价",
key: "goodsPrice",
minWidth: 100,
render: (h, params) => {
if (!params.row.goodsPrice) {
return h("div", this.$options.filters.unitPrice(0, "¥"));
}
return h("div", this.$options.filters.unitPrice(params.row.goodsPrice, "¥"));
},
},
{
title: "数量",
key: "num",
minWidth: 80,
},
{
title: "小计",
key: "flowPrice",
minWidth: 100,
render: (h, params) => {
return h("div", this.$options.filters.unitPrice(params.row.flowPrice, "¥"));
},
},
],
data: [], // 表单数据
orderLogColumns: [
{
title: "操作者",
key: "operatorName",
minWidth: 120,
},
{
title: "操作类型",
key: "operatorType",
minWidth: 100,
},
{
title: "时间",
key: "createTime",
width: 180,
},
{
title: "日志",
key: "message",
tooltip: true,
minWidth: 200,
},
],
};
},
watch: {
$route(to, from) {
this.$router.go(0);
},
},
methods: {
//修改地址
regionClick() {
this.showRegion = true;
this.regionId = "";
},
//确认收款
confirmPrice() {
this.$Modal.confirm({
title: "提示",
content:
"<p>您确定要收款吗?线下收款涉及库存变更,需异步进行,等待约一分钟刷新列表查看</p>",
onOk: () => {
API_Order.orderPay(this.sn).then((res) => {
if (res.success) {
this.$Message.success("收款成功");
this.getDataList();
} else {
// this.$Message.error(res.message);
}
});
},
});
},
// 获取订单详情
getDataList() {
this.loading = true;
API_Order.orderDetail(this.sn).then((res) => {
this.loading = false;
if (res.success) {
this.orderInfo = res.result;
this.allowOperation = res.result.allowOperationVO;
this.data = res.result.orderItems;
}
});
},
modifyPrice() {
//默认要修改的金额为订单总金额
this.modifyPriceForm.price = this.orderInfo.order.flowPrice;
this.modal = true;
},
//修改订单金额提交
modifyPriceSubmit() {
this.$refs.modifyPriceForm.validate((valid) => {
if (valid) {
API_Order.updateOrderPrice(this.sn, this.modifyPriceForm).then((res) => {
if (res.success) {
this.$Message.success("修改订单金额成功");
this.modal = false;
this.getDataList();
}
});
}
});
},
// 选中的地址
selectedRegion(val) {
this.addr = val[1];
this.regionId = val[0];
},
//订单取消
orderCancel() {
this.orderCancelModal = true;
},
//订单取消提交
orderCancelSubmit() {
this.$refs.orderCancelForm.validate((valid) => {
if (valid) {
API_Order.orderCancel(this.sn, this.orderCancelForm).then((res) => {
if (res.success) {
this.$Message.success("取消成功");
this.getDataList();
}
this.orderCancelModal = false;
});
}
});
},
//订单日志
orderLog() {
this.orderLogModal = true;
},
//订单日志取消
handelCancel() {
this.orderLogModal = false;
},
//弹出修改收货地址框
editAddress() {
this.addressModal = true;
this.showRegion = false;
this.addr = this.orderInfo.order.consigneeAddressPath;
this.regionId = this.orderInfo.order.consigneeAddressIdPath;
this.addressForm.consigneeName = this.orderInfo.order.consigneeName;
this.addressForm.consigneeMobile = this.orderInfo.order.consigneeMobile;
this.addressForm.consigneeDetail = this.orderInfo.order.consigneeDetail;
this.addressForm.consigneeAddressPath = this.orderInfo.order.consigneeAddressPath;
this.addressForm.consigneeAddressIdPath = this.orderInfo.order.consigneeAddressIdPath;
},
//修改收货地址
editAddressSubmit() {
if (this.regionId == "") {
this.$Message.error("请选择地址");
return;
}
this.addressForm.consigneeAddressPath = this.addr;
this.addressForm.consigneeAddressIdPath = this.regionId;
this.$refs.addressForm.validate((valid) => {
if (valid) {
API_Order.editOrderConsignee(this.sn, this.addressForm).then((res) => {
if (res.success) {
this.$Message.success("收货地址修改成功");
this.addressModal = false;
this.getDataList();
}
});
}
});
},
},
mounted() {
this.sn = this.$route.query.sn;
this.getDataList();
},
};
</script>
<style lang="scss">
.order-log-div {
line-height: 30px;
overflow-y: scroll;
}
.flex-card {
display: flex;
height: 600px;
}
.card-item {
margin: 5px 0;
}
.flex-card-left {
flex: 4;
//background: #f8f8f8;
}
.flex-card-right {
flex: 6;
}
.search {
.operation {
margin-bottom: 2vh;
}
.select-clear {
margin-left: 10px;
}
.div-item {
line-height: 35px;
display: flex;
> .div-item-left {
width: 80px;
}
> .div-item-right {
flex: 1;
word-break: break-all;
}
}
.div-status-right {
margin-top: 20px;
margin-left: 30px;
font-size: 20px;
}
.page {
margin-top: 2vh;
}
button {
margin-left: 5px;
}
.goods-total {
padding: 20px;
height: 150px;
width: 100%;
ul {
margin-right: 10px;
display: block;
float: right;
list-style-type: none;
li {
text-align: -webkit-match-parent;
}
}
.label {
float: left;
width: 500px;
text-align: right;
}
.txt {
float: left;
width: 130px;
text-align: right;
font-family: verdana;
}
.flowPrice {
color: #cc0000;
font-size: 22px;
}
}
}
</style>