refactor: 四端完成 Options API → script setup + vuex → pinia 迁移

- buyer(95) / seller(169) / im(53) / manager(280) 共 597 个组件全部从 Options API 转换为 <script setup>
- 四端 vuex 全部移除,状态管理统一迁移至 pinia 4(stores/ 目录)
- util.js 等基础设施去除 vm 首参依赖;全局属性($Message/$filters 等)在 script 内改为具名导入
- 被外部 ref 访问的公共组件均已补齐 defineExpose(清单见各端 MIGRATION-VUE3.md)
- 各端 eslint 启用 vue/component-api-style 防止新代码回退 Options API
- 四端 yarn build 全部通过;迁移约定与注意事项已更新至各端 MIGRATION-VUE3.md
This commit is contained in:
lifenlong
2026-10-13 07:06:59 +08:00
parent 870bacdd8c
commit 88fc1b0b2a
674 changed files with 71220 additions and 69943 deletions

View File

@@ -55,7 +55,7 @@
</el-card>
<el-dialog v-model="modalVisible" :title="modalTitle" width="500px" :close-on-click-modal="false">
<el-form ref="form" :model="form" label-width="100px" :rules="formValidate">
<el-form ref="formRef" :model="form" label-width="100px" :rules="formValidate">
<el-form-item label="售后原因" prop="reason">
<el-input v-model="form.reason" maxlength="20" clearable style="width: 100%" />
</el-form-item>
@@ -67,116 +67,113 @@
</el-dialog>
</div>
</template>
<script>
<script setup>
import { onMounted, reactive, ref } from "vue";
import * as API_Order from "@/api/order";
import { ElMessage, ElMessageBox } from "element-plus";
export default {
data() {
return {
activeTab: "RETURN_MONEY",
modalVisible: false,
modalTitle: "",
loading: true,
submitLoading: false,
form: { reason: "" },
formValidate: {
reason: [{ required: true, message: "请输入售后原因", trigger: "blur" }],
},
searchForm: {
pageNumber: 1,
pageSize: 20,
sort: "createTime",
order: "desc",
serviceType: "RETURN_MONEY",
},
data: [],
total: 0,
};
},
methods: {
onTabClick(tab) {
this.handleClickType(tab.paneName);
},
changePage(v) {
this.searchForm.pageNumber = v;
this.getDataList();
},
changePageSize(v) {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = v;
this.getDataList();
},
handleClickType(v) {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 20;
this.searchForm.serviceType = v;
this.getDataList();
},
getDataList() {
this.loading = true;
API_Order.getAfterSaleReasonPage(this.searchForm).then((res) => {
this.loading = false;
if (res.success) {
this.data = res.result.records;
this.total = res.result.total;
}
});
},
add() {
this.form.reason = "";
this.modalVisible = true;
this.modalTitle = "添加售后原因";
},
edit(v) {
this.form.reason = v.reason;
this.form.id = v.id;
this.modalVisible = true;
this.modalTitle = "修改售后原因";
},
handleSubmit() {
this.form.serviceType = this.searchForm.serviceType;
this.$refs.form.validate((valid) => {
if (valid) {
this.submitLoading = true;
if (this.modalTitle == "添加售后原因") {
delete this.form.id;
API_Order.addAfterSaleReason(this.form).then((res) => {
this.submitLoading = false;
if (res.success) {
ElMessage.success("添加成功");
this.getDataList();
this.modalVisible = false;
}
});
} else {
API_Order.editAfterSaleReason(this.form.id, this.form).then((res) => {
this.submitLoading = false;
if (res.success) {
ElMessage.success("修改成功");
this.getDataList();
this.modalVisible = false;
}
});
}
}
});
},
remove(v) {
ElMessageBox.confirm("确认要删除此售后原因?", "确认删除", { type: "warning" }).then(() => {
API_Order.delAfterSaleReason(v.id).then((res) => {
const activeTab = ref("RETURN_MONEY");
const modalVisible = ref(false);
const modalTitle = ref("");
const loading = ref(true);
const submitLoading = ref(false);
const form = reactive({ reason: "" });
const formValidate = reactive({
reason: [{ required: true, message: "请输入售后原因", trigger: "blur" }],
});
const searchForm = reactive({
pageNumber: 1,
pageSize: 20,
sort: "createTime",
order: "desc",
serviceType: "RETURN_MONEY",
});
const data = ref([]);
const total = ref(0);
const formRef = ref(null);
function onTabClick(tab) {
handleClickType(tab.paneName);
}
function changePage(v) {
searchForm.pageNumber = v;
getDataList();
}
function changePageSize(v) {
searchForm.pageNumber = 1;
searchForm.pageSize = v;
getDataList();
}
function handleClickType(v) {
searchForm.pageNumber = 1;
searchForm.pageSize = 20;
searchForm.serviceType = v;
getDataList();
}
function getDataList() {
loading.value = true;
API_Order.getAfterSaleReasonPage(searchForm).then((res) => {
loading.value = false;
if (res.success) {
data.value = res.result.records;
total.value = res.result.total;
}
});
}
function add() {
form.reason = "";
modalVisible.value = true;
modalTitle.value = "添加售后原因";
}
function edit(v) {
form.reason = v.reason;
form.id = v.id;
modalVisible.value = true;
modalTitle.value = "修改售后原因";
}
function handleSubmit() {
form.serviceType = searchForm.serviceType;
formRef.value.validate((valid) => {
if (valid) {
submitLoading.value = true;
if (modalTitle.value == "添加售后原因") {
delete form.id;
API_Order.addAfterSaleReason(form).then((res) => {
submitLoading.value = false;
if (res.success) {
ElMessage.success("售后原因已删除");
this.getDataList();
ElMessage.success("添加成功");
getDataList();
modalVisible.value = false;
}
});
}).catch(() => {});
},
},
mounted() {
this.getDataList();
},
};
} else {
API_Order.editAfterSaleReason(form.id, form).then((res) => {
submitLoading.value = false;
if (res.success) {
ElMessage.success("修改成功");
getDataList();
modalVisible.value = false;
}
});
}
}
});
}
function remove(v) {
ElMessageBox.confirm("确认要删除此售后原因?", "确认删除", { type: "warning" }).then(() => {
API_Order.delAfterSaleReason(v.id).then((res) => {
if (res.success) {
ElMessage.success("售后原因已删除");
getDataList();
}
});
}).catch(() => {});
}
onMounted(() => {
getDataList();
});
</script>
<style scoped>
.link-text {

View File

@@ -2,7 +2,7 @@
<div class="search">
<el-card>
<el-form
ref="searchForm"
ref="searchFormRef"
:model="searchForm"
inline
label-width="70px"
@@ -167,194 +167,193 @@
</div>
</template>
<script>
<script setup>
import { computed, onMounted, reactive, ref } from "vue";
import * as API_Order from "@/api/order";
import { unitPrice, customRouterPush } from "@/utils/filters";
export default {
name: "after-sale-order",
data() {
return {
loading: true,
searchForm: {
pageNumber: 1,
pageSize: 20,
sort: "createTime",
order: "desc",
startDate: "",
endDate: "",
orderSn: "",
memberName: "",
serviceStatus: "",
storeName: "",
sn: "",
keywords: "",
},
selectDate: null,
data: [],
total: 0,
currentStatus: "",
afterSaleNumData: {},
};
},
computed: {
serviceStatusWithCount() {
return [
{ title: "全部", value: "" },
{
title: `申请售后${this.afterSaleNumData.applyNum ? "(" + this.afterSaleNumData.applyNum + ")" : ""}`,
value: "APPLY",
},
{
title: `通过售后${this.afterSaleNumData.passNum ? "(" + this.afterSaleNumData.passNum + ")" : ""}`,
value: "PASS",
},
{
title: `拒绝售后${this.afterSaleNumData.refuseNum ? "(" + this.afterSaleNumData.refuseNum + ")" : ""}`,
value: "REFUSE",
},
{
title: `待收货${this.afterSaleNumData.buyerReturnNum ? "(" + this.afterSaleNumData.buyerReturnNum + ")" : ""}`,
value: "BUYER_RETURN",
},
{
title: `确认收货${this.afterSaleNumData.sellerConfirmNum ? "(" + this.afterSaleNumData.sellerConfirmNum + ")" : ""}`,
value: "SELLER_CONFIRM",
},
{
title: `完成售后${this.afterSaleNumData.completeNum ? "(" + this.afterSaleNumData.completeNum + ")" : ""}`,
value: "COMPLETE",
},
{
title: `卖家终止售后${this.afterSaleNumData.sellerTerminationNum ? "(" + this.afterSaleNumData.sellerTerminationNum + ")" : ""}`,
value: "SELLER_TERMINATION",
},
{
title: `买家取消售后${this.afterSaleNumData.buyerCancelNum ? "(" + this.afterSaleNumData.buyerCancelNum + ")" : ""}`,
value: "BUYER_CANCEL",
},
{
title: `等待平台退款${this.afterSaleNumData.waitRefundNum ? "(" + this.afterSaleNumData.waitRefundNum + ")" : ""}`,
value: "WAIT_REFUND",
},
];
defineOptions({ name: "after-sale-order" });
// 模板 ref(模板 ref="searchForm" 与 data 同名,改名 searchFormRef 避免互相覆盖)
const searchFormRef = ref(null);
// 模板 ref="table"
const table = ref(null);
const loading = ref(true);
const searchForm = reactive({
pageNumber: 1,
pageSize: 20,
sort: "createTime",
order: "desc",
startDate: "",
endDate: "",
orderSn: "",
memberName: "",
serviceStatus: "",
storeName: "",
sn: "",
keywords: "",
});
const selectDate = ref(null);
const data = ref([]);
const total = ref(0);
const currentStatus = ref("");
const afterSaleNumData = ref({});
const serviceStatusWithCount = computed(() => {
return [
{ title: "全部", value: "" },
{
title: `申请售后${afterSaleNumData.value.applyNum ? "(" + afterSaleNumData.value.applyNum + ")" : ""}`,
value: "APPLY",
},
},
methods: {
unitPrice,
serviceTypeText(type) {
const map = {
RETURN_MONEY: "退款",
RETURN_GOODS: "退货",
EXCHANGE_GOODS: "换货",
};
return map[type] || type || "-";
{
title: `通过售后${afterSaleNumData.value.passNum ? "(" + afterSaleNumData.value.passNum + ")" : ""}`,
value: "PASS",
},
serviceTypeTagType(type) {
const map = {
RETURN_MONEY: "primary",
RETURN_GOODS: "warning",
EXCHANGE_GOODS: "success",
};
return map[type] || "info";
{
title: `拒绝售后${afterSaleNumData.value.refuseNum ? "(" + afterSaleNumData.value.refuseNum + ")" : ""}`,
value: "REFUSE",
},
serviceStatusText(status) {
const map = {
APPLY: "申请中",
PASS: "通过售后",
REFUSE: "拒绝售后",
BUYER_RETURN: "买家退货,待卖家收货",
SELLER_CONFIRM: "卖家确认收货",
SELLER_TERMINATION: "卖家终止售后",
BUYER_CANCEL: "买家取消售后",
COMPLETE: "完成售后",
WAIT_REFUND: "待平台退款",
};
return map[status] || status || "-";
{
title: `待收货${afterSaleNumData.value.buyerReturnNum ? "(" + afterSaleNumData.value.buyerReturnNum + ")" : ""}`,
value: "BUYER_RETURN",
},
serviceStatusTagType(status) {
const map = {
APPLY: "primary",
PASS: "info",
REFUSE: "warning",
BUYER_RETURN: "warning",
SELLER_CONFIRM: "",
SELLER_TERMINATION: "success",
BUYER_CANCEL: "danger",
COMPLETE: "success",
WAIT_REFUND: "primary",
};
return map[status] || "info";
{
title: `确认收货${afterSaleNumData.value.sellerConfirmNum ? "(" + afterSaleNumData.value.sellerConfirmNum + ")" : ""}`,
value: "SELLER_CONFIRM",
},
init() {
this.getDataList();
this.getAfterSaleNumData();
{
title: `完成售后${afterSaleNumData.value.completeNum ? "(" + afterSaleNumData.value.completeNum + ")" : ""}`,
value: "COMPLETE",
},
changePage() {
this.getDataList();
{
title: `卖家终止售后${afterSaleNumData.value.sellerTerminationNum ? "(" + afterSaleNumData.value.sellerTerminationNum + ")" : ""}`,
value: "SELLER_TERMINATION",
},
changePageSize() {
this.searchForm.pageNumber = 1;
this.getDataList();
{
title: `买家取消售后${afterSaleNumData.value.buyerCancelNum ? "(" + afterSaleNumData.value.buyerCancelNum + ")" : ""}`,
value: "BUYER_CANCEL",
},
handleSearch() {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 20;
this.getDataList();
this.getAfterSaleNumData();
{
title: `等待平台退款${afterSaleNumData.value.waitRefundNum ? "(" + afterSaleNumData.value.waitRefundNum + ")" : ""}`,
value: "WAIT_REFUND",
},
selectDateRange(v) {
if (v) {
this.searchForm.startDate = v[0];
this.searchForm.endDate = v[1];
} else {
this.searchForm.startDate = "";
this.searchForm.endDate = "";
}
},
getDataList() {
this.loading = true;
API_Order.getAfterSaleOrderPage(this.searchForm).then((res) => {
this.loading = false;
if (res.success) {
this.data = res.result.records;
this.total = res.result.total;
}
});
},
getAfterSaleNumData() {
const { serviceStatus, ...searchParams } = this.searchForm;
API_Order.getAfterSaleNumVO(searchParams).then((res) => {
if (res.success) {
this.afterSaleNumData = res.result;
}
});
},
detail(v) {
const sn = v.sn;
customRouterPush({
name: "after-order-detail",
query: { sn: sn },
});
},
onStatusTabClick(tab) {
this.serviceStatusClick(tab.paneName);
},
serviceStatusClick(item) {
this.currentStatus = item;
if (item === "" || item === undefined) {
delete this.searchForm.serviceStatus;
} else {
this.searchForm.serviceStatus = item;
}
this.getDataList();
this.getAfterSaleNumData();
},
},
mounted() {
this.init();
},
};
];
});
function serviceTypeText(type) {
const map = {
RETURN_MONEY: "退款",
RETURN_GOODS: "退货",
EXCHANGE_GOODS: "换货",
};
return map[type] || type || "-";
}
function serviceTypeTagType(type) {
const map = {
RETURN_MONEY: "primary",
RETURN_GOODS: "warning",
EXCHANGE_GOODS: "success",
};
return map[type] || "info";
}
function serviceStatusText(status) {
const map = {
APPLY: "申请中",
PASS: "通过售后",
REFUSE: "拒绝售后",
BUYER_RETURN: "买家退货,待卖家收货",
SELLER_CONFIRM: "卖家确认收货",
SELLER_TERMINATION: "卖家终止售后",
BUYER_CANCEL: "买家取消售后",
COMPLETE: "完成售后",
WAIT_REFUND: "待平台退款",
};
return map[status] || status || "-";
}
function serviceStatusTagType(status) {
const map = {
APPLY: "primary",
PASS: "info",
REFUSE: "warning",
BUYER_RETURN: "warning",
SELLER_CONFIRM: "",
SELLER_TERMINATION: "success",
BUYER_CANCEL: "danger",
COMPLETE: "success",
WAIT_REFUND: "primary",
};
return map[status] || "info";
}
function init() {
getDataList();
getAfterSaleNumData();
}
function changePage() {
getDataList();
}
function changePageSize() {
searchForm.pageNumber = 1;
getDataList();
}
function handleSearch() {
searchForm.pageNumber = 1;
searchForm.pageSize = 20;
getDataList();
getAfterSaleNumData();
}
function selectDateRange(v) {
if (v) {
searchForm.startDate = v[0];
searchForm.endDate = v[1];
} else {
searchForm.startDate = "";
searchForm.endDate = "";
}
}
function getDataList() {
loading.value = true;
API_Order.getAfterSaleOrderPage(searchForm).then((res) => {
loading.value = false;
if (res.success) {
data.value = res.result.records;
total.value = res.result.total;
}
});
}
function getAfterSaleNumData() {
const { serviceStatus, ...searchParams } = searchForm;
API_Order.getAfterSaleNumVO(searchParams).then((res) => {
if (res.success) {
afterSaleNumData.value = res.result;
}
});
}
function detail(v) {
const sn = v.sn;
customRouterPush({
name: "after-order-detail",
query: { sn: sn },
});
}
function onStatusTabClick(tab) {
serviceStatusClick(tab.paneName);
}
function serviceStatusClick(item) {
currentStatus.value = item;
if (item === "" || item === undefined) {
delete searchForm.serviceStatus;
} else {
searchForm.serviceStatus = item;
}
getDataList();
getAfterSaleNumData();
}
onMounted(() => {
init();
});
</script>
<style lang="scss" scoped>

View File

@@ -332,185 +332,184 @@
</div>
</template>
<script>
<script setup>
import { onMounted, reactive, ref } from "vue";
import { useRoute } from "vue-router";
import * as API_Order from "@/api/order";
import vueQr from "vue-qr";
import { ElMessage, ElMessageBox } from "element-plus";
export default {
components: {
"vue-qr": vueQr,
},
name: "orderDetail",
data() {
return {
sn: "", // 订单号
logisticsModal: false, //查询物流模态框
logisticsInfo: {}, //物流信息
afterSaleInfo: {}, // 售后信息
afterSaleImage: [], //会员申诉图片
submitLoading: false, // 添加或编辑提交状态
storeMsg: {}, // 商家地址信息
//商家处理意见
params: {
serviceStatus: "PASS",
remark: "",
},
//平台退款
refundPriceForm: {
remark: "",
},
afterSaleStatusList: [
// 售后状态列表
{
name: "申请中",
status: "APPLY",
},
{
name: "通过售后",
status: "PASS",
},
{
name: "拒绝售后",
status: "REFUSE",
},
{
name: "买家退货,待卖家收货",
status: "BUYER_RETURN",
},
{
name: "卖家确认收货",
status: "SELLER_CONFIRM",
},
{
name: "卖家终止售后",
status: "SELLER_TERMINATION",
},
{
name: "买家取消售后",
status: "BUYER_CANCEL",
},
{
name: "完成售后",
status: "COMPLETE",
},
{
name: "待平台退款",
status: "WAIT_REFUND",
},
],
};
defineOptions({ name: "orderDetail" });
const route = useRoute();
const sn = ref(""); // 订单号
const logisticsModal = ref(false); //查询物流模态框
const logisticsInfo = ref({}); //物流信息
const afterSaleInfo = ref({}); // 售后信息
const afterSaleImage = ref([]); //会员申诉图片
const submitLoading = ref(false); // 添加或编辑提交状态
const storeMsg = ref({}); // 商家地址信息
// 原代码未在 data 声明、直接挂 this 上的字段,补声明避免 ReferenceError
let loading = false;
//商家处理意见
const params = reactive({
serviceStatus: "PASS",
remark: "",
});
//平台退款
const refundPriceForm = reactive({
remark: "",
});
const afterSaleStatusList = ref([
// 售后状态列表
{
name: "申请中",
status: "APPLY",
},
methods: {
// 获取售后详情
getDetail() {
this.loading = true;
API_Order.getAfterSaleOrderDetail(this.sn).then((res) => {
this.loading = false;
if (res.success) {
this.afterSaleInfo = res.result;
this.afterSaleInfo.showDelivery = this.showDelivery(
this.afterSaleInfo.serviceStatus
);
this.afterSaleInfo.serviceName = this.filterOrderStatus(
this.afterSaleInfo.serviceStatus
);
this.afterSaleImage = (res.result.afterSaleImage || "").split(",");
//退货地址去掉逗号
if (this.afterSaleInfo.mconsigneeAddressPath)
this.afterSaleInfo.mconsigneeAddressPath = this.afterSaleInfo.mconsigneeAddressPath.replaceAll(
{
name: "通过售后",
status: "PASS",
},
{
name: "拒绝售后",
status: "REFUSE",
},
{
name: "买家退货,待卖家收货",
status: "BUYER_RETURN",
},
{
name: "卖家确认收货",
status: "SELLER_CONFIRM",
},
{
name: "卖家终止售后",
status: "SELLER_TERMINATION",
},
{
name: "买家取消售后",
status: "BUYER_CANCEL",
},
{
name: "完成售后",
status: "COMPLETE",
},
{
name: "待平台退款",
status: "WAIT_REFUND",
},
]);
// 获取售后详情
function getDetail() {
loading = true;
API_Order.getAfterSaleOrderDetail(sn.value).then((res) => {
loading = false;
if (res.success) {
afterSaleInfo.value = res.result;
afterSaleInfo.value.showDelivery = showDelivery(
afterSaleInfo.value.serviceStatus
);
afterSaleInfo.value.serviceName = filterOrderStatus(
afterSaleInfo.value.serviceStatus
);
afterSaleImage.value = (res.result.afterSaleImage || "").split(",");
//退货地址去掉逗号
if (afterSaleInfo.value.mconsigneeAddressPath)
afterSaleInfo.value.mconsigneeAddressPath = afterSaleInfo.value.mconsigneeAddressPath.replaceAll(
",",
" "
);
params.actualRefundPrice = afterSaleInfo.value.applyRefundPrice;
// 如果显示物流信息,展示商家地址
if (afterSaleInfo.value.showDelivery) {
API_Order.storeAddress(sn.value).then((resu) => {
if (resu.success) {
const obj = resu.result;
obj.salesConsigneeAddressPath = obj.salesConsigneeAddressPath.replaceAll(
",",
" "
""
);
this.params.actualRefundPrice = this.afterSaleInfo.applyRefundPrice;
// 如果显示物流信息,展示商家地址
if (this.afterSaleInfo.showDelivery) {
API_Order.storeAddress(this.sn).then((resu) => {
if (resu.success) {
const obj = resu.result;
obj.salesConsigneeAddressPath = obj.salesConsigneeAddressPath.replaceAll(
",",
""
);
this.storeMsg = obj;
}
});
}
}
});
},
//平台退款
refundPriceSubmit() {
if (this.refundPriceForm.remark == "") {
ElMessage.error("请输入退款备注");
return;
}
ElMessageBox.confirm("请确认退款?", "确认退款", { type: "warning" }).then(() => {
API_Order.refundPrice(this.sn, this.refundPriceForm).then((res) => {
if (res.success) {
ElMessage.success("收款成功");
this.getDetail();
storeMsg.value = obj;
}
});
}).catch(() => {});
},
//查询物流
logisticsSeller() {
this.logisticsModal = true;
API_Order.getAfterSaleTraces(this.sn).then((res) => {
if (res.success && res.result != null) {
this.logisticsInfo = res.result;
}
});
},
//关闭物流弹出框
logisticsClose() {
this.logisticsModal = false;
},
//回复
handleSubmit() {
if (this.params.remark == "") {
ElMessage.error("请输入备注信息");
return;
}
if (this.params.actualRefundPrice == "") {
ElMessage.error("请输入退款金额");
return;
}
});
}
//平台退款
function refundPriceSubmit() {
if (refundPriceForm.remark == "") {
ElMessage.error("请输入退款备注");
return;
}
ElMessageBox.confirm("请确认退款?", "确认退款", { type: "warning" }).then(() => {
API_Order.refundPrice(sn.value, refundPriceForm).then((res) => {
if (res.success) {
ElMessage.success("收款成功");
getDetail();
}
API_Order.afterSaleSellerReview(this.sn, this.params).then((res) => {
this.submitLoading = false;
if (res.success) {
ElMessage.success("审核成功");
this.params.remark = "";
this.getDetail();
}
});
},
filterOrderStatus(status) {
// 获取订单状态中文
const ob = this.afterSaleStatusList.filter((e) => {
return e.status === status;
});
return ob.length > 0 ? ob[0].name : status;
},
// 根据订单状态判断是否显示物流信息
showDelivery(status) {
let flag = false;
this.afterSaleStatusList.forEach((e, index) => {
// 订单为买家退货,待卖家收货之后的状态,并且不是买家取消售后,展示物流信息
if (e.status === status && index >= 3 && index !== 6) {
flag = true;
}
});
return flag;
},
},
mounted() {
this.sn = this.$route.query.sn;
this.getDetail();
},
};
});
}).catch(() => {});
}
//查询物流
function logisticsSeller() {
logisticsModal.value = true;
API_Order.getAfterSaleTraces(sn.value).then((res) => {
if (res.success && res.result != null) {
logisticsInfo.value = res.result;
}
});
}
//关闭物流弹出框
function logisticsClose() {
logisticsModal.value = false;
}
//回复
function handleSubmit() {
if (params.remark == "") {
ElMessage.error("请输入备注信息");
return;
}
if (params.actualRefundPrice == "") {
ElMessage.error("请输入退款金额");
return;
}
API_Order.afterSaleSellerReview(sn.value, params).then((res) => {
submitLoading.value = false;
if (res.success) {
ElMessage.success("审核成功");
params.remark = "";
getDetail();
}
});
}
function filterOrderStatus(status) {
// 获取订单状态中文
const ob = afterSaleStatusList.value.filter((e) => {
return e.status === status;
});
return ob.length > 0 ? ob[0].name : status;
}
// 根据订单状态判断是否显示物流信息
function showDelivery(status) {
let flag = false;
afterSaleStatusList.value.forEach((e, index) => {
// 订单为买家退货,待卖家收货之后的状态,并且不是买家取消售后,展示物流信息
if (e.status === status && index >= 3 && index !== 6) {
flag = true;
}
});
return flag;
}
onMounted(() => {
sn.value = route.query.sn;
getDetail();
});
</script>
<style lang="scss">
.main-content {

View File

@@ -2,7 +2,7 @@
<div class="search">
<el-card>
<el-form
ref="searchForm"
ref="searchFormRef"
:model="searchForm"
inline
label-width="70px"
@@ -104,97 +104,100 @@
</div>
</template>
<script>
<script setup>
import { onMounted, reactive, ref, watch } from "vue";
import { useRoute } from "vue-router";
import * as API_Order from "@/api/order";
import vueQr from "vue-qr";
import { customRouterPush } from "@/utils/filters";
export default {
name: "orderComplaint",
components: { vueQr },
data() {
return {
loading: true,
searchForm: {
pageNumber: 1,
pageSize: 20,
sort: "createTime",
order: "desc",
},
data: [],
total: 0,
};
},
watch: {
$route() {
this.getDataList();
},
},
methods: {
complainStatusText(v) {
const map = {
NEW: "新投诉",
CANCEL: "已撤销",
WAIT_APPEAL: "待申诉",
COMMUNICATION: "对话中",
WAIT_ARBITRATION: "等待仲裁",
COMPLETE: "已完成",
};
return map[v] || v || "-";
},
complainStatusTagType(v) {
const map = {
NEW: "primary",
CANCEL: "info",
WAIT_APPEAL: "warning",
COMMUNICATION: "warning",
WAIT_ARBITRATION: "",
COMPLETE: "success",
};
return map[v] || "info";
},
init() {
this.getDataList();
},
changePage(v) {
this.searchForm.pageNumber = v;
this.getDataList();
},
changePageSize(v) {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = v;
this.getDataList();
},
handleSearch() {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 20;
this.getDataList();
},
getDataList() {
this.loading = true;
API_Order.getOrderComplain(this.searchForm)
.then((res) => {
this.loading = false;
if (res.success) {
this.data = res.result.records;
this.total = res.result.total;
}
})
.catch(() => {
this.loading = false;
});
},
detail(v) {
customRouterPush({
name: "order-complaint-detail",
query: { id: v.id },
});
},
},
mounted() {
this.init();
},
};
defineOptions({ name: "orderComplaint" });
const route = useRoute();
const searchFormRef = ref(null);
const table = ref(null);
const loading = ref(true);
const searchForm = reactive({
pageNumber: 1,
pageSize: 20,
sort: "createTime",
order: "desc",
});
const data = ref([]);
const total = ref(0);
watch(
() => route.query,
() => {
getDataList();
}
);
function complainStatusText(v) {
const map = {
NEW: "新投诉",
CANCEL: "已撤销",
WAIT_APPEAL: "待申诉",
COMMUNICATION: "对话中",
WAIT_ARBITRATION: "等待仲裁",
COMPLETE: "已完成",
};
return map[v] || v || "-";
}
function complainStatusTagType(v) {
const map = {
NEW: "primary",
CANCEL: "info",
WAIT_APPEAL: "warning",
COMMUNICATION: "warning",
WAIT_ARBITRATION: "",
COMPLETE: "success",
};
return map[v] || "info";
}
function init() {
getDataList();
}
function changePage(v) {
searchForm.pageNumber = v;
getDataList();
}
function changePageSize(v) {
searchForm.pageNumber = 1;
searchForm.pageSize = v;
getDataList();
}
function handleSearch() {
searchForm.pageNumber = 1;
searchForm.pageSize = 20;
getDataList();
}
function getDataList() {
loading.value = true;
API_Order.getOrderComplain(searchForm)
.then((res) => {
loading.value = false;
if (res.success) {
data.value = res.result.records;
total.value = res.result.total;
}
})
.catch(() => {
loading.value = false;
});
}
function detail(v) {
customRouterPush({
name: "order-complaint-detail",
query: { id: v.id },
});
}
onMounted(() => {
init();
});
</script>
<style scoped>

View File

@@ -203,140 +203,141 @@
</div>
</template>
<script>
<script setup>
import { onMounted, reactive, ref, watch } from "vue";
import { useRoute, useRouter } from "vue-router";
import * as API_Order from "@/api/order";
import { ElMessage } from "element-plus";
import { unitPrice } from "@/utils/filters";
defineOptions({ name: "orderComplaintDetail" });
const route = useRoute();
const router = useRouter();
const emptyComplaint = () => ({
id: "",
orderComplaintCommunications: [],
});
export default {
name: "orderComplaintDetail",
data() {
return {
loading: false,
id: "",
complaintInfo: emptyComplaint(),
images: [],
appealImages: [],
submitLoading: false,
params: {
content: "",
complainId: "",
},
arbitrationParams: {
arbitrationResult: "",
},
arbitrationResultShow: false,
};
},
methods: {
unitPrice,
complainStatusText(v) {
const map = {
NEW: "新投诉",
CANCEL: "已撤销",
WAIT_APPEAL: "待申诉",
COMMUNICATION: "对话中",
WAIT_ARBITRATION: "等待仲裁",
COMPLETE: "已完成",
};
return map[v] || v || "-";
},
handleStoreComplaint() {
API_Order.storeComplain({
complainStatus: "WAIT_APPEAL",
complainId: this.complaintInfo.id,
}).then((res) => {
if (res.success) {
ElMessage.success("操作成功");
this.getDetail();
}
});
},
getDetail() {
if (!this.id) return;
this.loading = true;
API_Order.getOrderComplainDetail(this.id)
.then((res) => {
this.loading = false;
if (res.success) {
this.complaintInfo = res.result || emptyComplaint();
this.images = (res.result.images || "")
.split(",")
.map((s) => s.trim())
.filter(Boolean);
this.appealImages = (res.result.appealImages || "")
.split(",")
.map((s) => s.trim())
.filter(Boolean);
}
})
.catch(() => {
this.loading = false;
});
},
returnDataList() {
this.$router.push({ name: "orderComplaint" });
},
arbitrationHandle() {
this.arbitrationResultShow = true;
},
arbitrationHandleSubmit() {
if (!this.arbitrationParams.arbitrationResult) {
ElMessage.error("请填写仲裁内容");
return;
const loading = ref(false);
const id = ref("");
const complaintInfo = ref(emptyComplaint());
const images = ref([]);
const appealImages = ref([]);
const submitLoading = ref(false);
const params = reactive({
content: "",
complainId: "",
});
const arbitrationParams = reactive({
arbitrationResult: "",
});
const arbitrationResultShow = ref(false);
function complainStatusText(v) {
const map = {
NEW: "新投诉",
CANCEL: "已撤销",
WAIT_APPEAL: "待申诉",
COMMUNICATION: "对话中",
WAIT_ARBITRATION: "等待仲裁",
COMPLETE: "已完成",
};
return map[v] || v || "-";
}
function handleStoreComplaint() {
API_Order.storeComplain({
complainStatus: "WAIT_APPEAL",
complainId: complaintInfo.value.id,
}).then((res) => {
if (res.success) {
ElMessage.success("操作成功");
getDetail();
}
});
}
function getDetail() {
if (!id.value) return;
loading.value = true;
API_Order.getOrderComplainDetail(id.value)
.then((res) => {
loading.value = false;
if (res.success) {
complaintInfo.value = res.result || emptyComplaint();
images.value = (res.result.images || "")
.split(",")
.map((s) => s.trim())
.filter(Boolean);
appealImages.value = (res.result.appealImages || "")
.split(",")
.map((s) => s.trim())
.filter(Boolean);
}
this.submitLoading = true;
API_Order.orderComplete(this.id, this.arbitrationParams)
.then((res) => {
this.submitLoading = false;
if (res.success) {
ElMessage.success("仲裁成功");
this.arbitrationParams.arbitrationResult = "";
this.arbitrationResultShow = false;
this.getDetail();
}
})
.catch(() => {
this.submitLoading = false;
});
},
handleSubmit() {
if (!this.params.content) {
ElMessage.error("请填写对话内容");
return;
})
.catch(() => {
loading.value = false;
});
}
function returnDataList() {
router.push({ name: "orderComplaint" });
}
function arbitrationHandle() {
arbitrationResultShow.value = true;
}
function arbitrationHandleSubmit() {
if (!arbitrationParams.arbitrationResult) {
ElMessage.error("请填写仲裁内容");
return;
}
submitLoading.value = true;
API_Order.orderComplete(id.value, arbitrationParams)
.then((res) => {
submitLoading.value = false;
if (res.success) {
ElMessage.success("仲裁成功");
arbitrationParams.arbitrationResult = "";
arbitrationResultShow.value = false;
getDetail();
}
this.submitLoading = true;
this.params.complainId = this.id;
API_Order.addOrderCommunication(this.params)
.then((res) => {
this.submitLoading = false;
if (res.success) {
ElMessage.success("对话成功");
this.params.content = "";
this.getDetail();
}
})
.catch(() => {
this.submitLoading = false;
});
},
},
mounted() {
this.id = this.$route.query.id;
this.getDetail();
},
watch: {
"$route.query.id"(val) {
this.id = val;
this.getDetail();
},
},
};
})
.catch(() => {
submitLoading.value = false;
});
}
function handleSubmit() {
if (!params.content) {
ElMessage.error("请填写对话内容");
return;
}
submitLoading.value = true;
params.complainId = id.value;
API_Order.addOrderCommunication(params)
.then((res) => {
submitLoading.value = false;
if (res.success) {
ElMessage.success("对话成功");
params.content = "";
getDetail();
}
})
.catch(() => {
submitLoading.value = false;
});
}
onMounted(() => {
id.value = route.query.id;
getDetail();
});
watch(
() => route.query.id,
(val) => {
id.value = val;
getDetail();
}
);
</script>
<style lang="scss" scoped>