This commit is contained in:
faiz 2024-04-08 17:44:44 +08:00
parent 109c18fa57
commit 1024bd15a5
12 changed files with 269 additions and 66 deletions

View File

@ -3,11 +3,11 @@ ENV = 'development'
# http://192.168.1.43:8324/admin # http://192.168.1.43:8324/admin
# http://mer.crmeb.net/admin # http://mer.crmeb.net/admin
# base api # base api
VUE_APP_BASE_API = 'http://192.168.1.32:8080' VUE_APP_BASE_API = 'http://192.168.1.199:8080'
# VUE_APP_BASE_API = 'https://plus.hwms.shop' # VUE_APP_BASE_API = 'https://plus.hwms.shop'
# socket 连接地址 # socket 连接地址
VUE_APP_WS_URL = 'ws://192.168.1.32:8080' VUE_APP_WS_URL = 'ws://192.168.1.199:8080'
# VUE_APP_WS_URL = 'ws://plus.hwms.shop' # VUE_APP_WS_URL = 'ws://plus.hwms.shop'
# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable, # vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,

View File

@ -33,6 +33,18 @@ export function refundorderLogApi(id) {
export function refundorderStatusApi(id) { export function refundorderStatusApi(id) {
return request.get(`order/refund/status/${id}/form`) return request.get(`order/refund/status/${id}/form`)
} }
/**
* @description 开启强制退款订单 -- 审核from
*/
export function refundorderOpenApi(id) {
return request.get(`order/refund/open/${id}/form`)
}
/**
* @description 退款单获取物流信息
*/
export function refundorderExpressApi(id) {
return request.get(`order/express/${id}`)
}
/** /**
* @description 开启退款 * @description 开启退款
*/ */

View File

@ -178,7 +178,19 @@ export function seckillProductDetailApi(id) {
return request.get(`seckill/product/detail/${id}`) return request.get(`seckill/product/detail/${id}`)
} }
/** /**
* @description 商品审核 -- 表单提交 * @description 商品审核 -- 初步审核
*/
export function productStatusFirstApi(data) {
return request.post(`store/product/status_first`, data)
}
/**
* @description 商品审核 -- 二次审核
*/
export function productStatusSecondApi(data) {
return request.post(`store/product/status_second`, data)
}
/**
* @description 商品审核 -- 最终审核
*/ */
export function productStatusApi(data) { export function productStatusApi(data) {
return request.post(`store/product/status`, data) return request.post(`store/product/status`, data)

View File

@ -303,7 +303,7 @@
type="text" type="text"
size="small" size="small"
@click="offline(scope.row.mer_id)" @click="offline(scope.row.mer_id)"
>线下付款</el-button >财务审核</el-button
> >
</template> </template>
</el-table-column> </el-table-column>

View File

@ -105,7 +105,7 @@
highlight-current-row highlight-current-row
> >
<el-table-column prop="mer_id" label="ID" min-width="60" /> <el-table-column prop="mer_id" label="ID" min-width="60" />
<el-table-column prop="mer_name" label="商户名称" min-width="150" /> <el-table-column prop="mer_name" label="店铺名称" min-width="150" />
<el-table-column prop="is_huimei" label="是否惠美乡村" min-width="100"> <el-table-column prop="is_huimei" label="是否惠美乡村" min-width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{scope.row.is_huimei == 1 ? '是' : '否'}}</span> <span>{{scope.row.is_huimei == 1 ? '是' : '否'}}</span>

View File

@ -219,11 +219,11 @@
<el-button type="text" size="small" @click.native="onUserDetails(scope.row.uid)">{{scope.row.user&&scope.row.user.nickname +'/'+ scope.row.uid}}</el-button> <el-button type="text" size="small" @click.native="onUserDetails(scope.row.uid)">{{scope.row.user&&scope.row.user.nickname +'/'+ scope.row.uid}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="订单类型" min-width="80"> <!-- <el-table-column label="订单类型" min-width="80">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.row.is_virtual == 1 ? "虚拟订单" : scope.row.order_type == 0 ? "普通订单" : "核销订单" }}</span> <span>{{ scope.row.is_virtual == 1 ? "虚拟订单" : scope.row.order_type == 0 ? "普通订单" : "核销订单" }}</span>
</template> </template>
</el-table-column> </el-table-column> -->
<el-table-column prop="real_name" label="收货人/订购人" min-width="120" /> <el-table-column prop="real_name" label="收货人/订购人" min-width="120" />
<el-table-column label="商户名称" min-width="100"> <el-table-column label="商户名称" min-width="100">
<template slot-scope="scope"> <template slot-scope="scope">
@ -290,7 +290,7 @@
<span>{{ scope.row.create_time }}</span> <span>{{ scope.row.create_time }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" min-width="80" fixed="right"> <el-table-column width="100px" label="操作" min-width="80" fixed="right" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-for="(val, i ) in scope.row.orderProduct" :key="i"> <span v-for="(val, i ) in scope.row.orderProduct" :key="i">
<el-button <el-button
@ -302,6 +302,7 @@
</span> </span>
<el-button type="text" size="small" @click="onOrderDetails(scope.row.order_id)">详情</el-button> <el-button type="text" size="small" @click="onOrderDetails(scope.row.order_id)">详情</el-button>
<!-- <el-button type="text" size="small" @click="onOrderOpenRefund(scope.row.order_id)">开启退款</el-button> --> <!-- <el-button type="text" size="small" @click="onOrderOpenRefund(scope.row.order_id)">开启退款</el-button> -->
<el-button type="text" size="small" @click="onOrderOpen(scope.row.order_id)">开启强制退款</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -346,7 +347,7 @@
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com> // | Author: CRMEB Team <admin@crmeb.com>
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
import { orderListApi, chartApi, cardListApi, exportOrderApi,openRefundApi } from "@/api/order"; import { refundorderOpenApi,orderListApi, chartApi, cardListApi, exportOrderApi,openRefundApi } from "@/api/order";
import { merSelectApi } from "@/api/product"; import { merSelectApi } from "@/api/product";
import userDetails from '../../user/list/userDetails'; import userDetails from '../../user/list/userDetails';
import orderDetail from './orderDetails.vue'; import orderDetail from './orderDetails.vue';
@ -564,6 +565,10 @@ export default {
this.drawer = true; this.drawer = true;
// this.$refs.orderDetail.onOrderDetails(id); // this.$refs.orderDetail.onOrderDetails(id);
// this.$refs.orderDetail.onOrderLog(id); // this.$refs.orderDetail.onOrderLog(id);
},
// 退
onOrderOpen(id) {
this.$modalForm(refundorderOpenApi(id)).then(() => this.getList(''))
}, },
// 退 // 退
// onOrderOpenRefund(id) { // onOrderOpenRefund(id) {

View File

@ -393,6 +393,10 @@
<div>商户类别</div> <div>商户类别</div>
<div class="value">{{ orderDetailList.merchant.is_trader ? '自营' : '非自营' }}</div> <div class="value">{{ orderDetailList.merchant.is_trader ? '自营' : '非自营' }}</div>
</li> </li>
<li class="item">
<div>店铺电话</div>
<div class="value">{{ orderDetailList.merchant.service_phone }}</div>
</li>
</ul> </ul>
</div> </div>
</template> </template>

View File

@ -0,0 +1,112 @@
<template>
<div>
<div class="logistics acea-row row-top">
<div class="logistics_img"><img src="@/assets/images/expressi.jpg"></div>
<div class="logistics_cent">
<span>物流公司{{ logisticsName ? orderDatalist.delivery_type : orderDatalist.delivery_name }}</span>
<span>物流单号{{ orderDatalist.delivery_id }}</span>
</div>
</div>
<div class="acea-row row-column-around trees-coadd">
<div class="scollhide">
<el-timeline v-if="result.length>0">
<el-timeline-item v-for="(item,i) in result" :key="i">
<p class="time" v-text="item.time" />
<p class="content" v-text="item.status" />
</el-timeline-item>
</el-timeline>
</div>
</div>
</div>
</template>
<script>
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEBCRMEB
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
export default {
name: 'Logistics',
props: {
orderDatalist: {
type: Object,
default: null
},
result: {
type: Array,
default: () => []
},
logisticsName: {
type: String,
default: ''
}
}
}
</script>
<style scoped lang="scss">
.title{
margin-bottom: 16px;
color: #17233d;
font-weight: 500;
font-size: 14px;
}
.description{
&-term {
display: table-cell;
padding-bottom: 10px;
line-height: 20px;
width: 50%;
font-size: 12px;
}
}
.logistics{
align-items: center;
padding: 10px 0px;
.logistics_img{
width: 45px;
height: 45px;
margin-right: 12px;
img{
width: 100%;
height: 100%;
}
}
.logistics_cent{
span{
display: block;
font-size: 12px;
}
}
}
.trees-coadd{
width: 100%;
height: 400px;
border-radius: 4px;
overflow: hidden;
.scollhide{
width: 100%;
height: 100%;
overflow: auto;
margin-left: 18px;
padding: 10px 0 10px 0;
box-sizing: border-box;
.content{
font-size: 12px;
}
.time{
font-size: 12px;
color: var(--prev-color-primary);
}
}
}
.scollhide::-webkit-scrollbar {
display: none; /* Chrome Safari */
}
</style>

View File

@ -82,11 +82,11 @@
<span v-show="scope.row.is_del > 0" style="color: #ED4014;display: block;">用户已删除</span> <span v-show="scope.row.is_del > 0" style="color: #ED4014;display: block;">用户已删除</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="订单类型" min-width="100"> <!-- <el-table-column label="订单类型" min-width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.row.order_type == 0 ? "普通订单" : "核销订单" }}</span> <span>{{ scope.row.order_type == 0 ? "普通订单" : "核销订单" }}</span>
</template> </template>
</el-table-column> </el-table-column> -->
<el-table-column label="商户名称" min-width="150"> <el-table-column label="商户名称" min-width="150">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.merchant">{{ scope.row.merchant.mer_name }}</span> <span v-if="scope.row.merchant">{{ scope.row.merchant.mer_name }}</span>

View File

@ -174,6 +174,20 @@
<file-list ref="exportList" /> <file-list ref="exportList" />
<!--详情--> <!--详情-->
<details-from ref="orderDetail" :order-datalist="orderDatalist" @get-logistics="openLogistics" /> <details-from ref="orderDetail" :order-datalist="orderDatalist" @get-logistics="openLogistics" />
<el-dialog
v-if="dialogLogistics"
title="物流查询"
:visible.sync="dialogLogistics"
width="350px"
:before-close="handleClose"
>
<logistics-from
v-if="orderDetails"
:order-datalist="orderDetails"
:result="result"
:logistics-name="logisticsName"
/>
</el-dialog>
</div> </div>
</template> </template>
@ -192,21 +206,24 @@ import {
orderUpdateApi, orderUpdateApi,
refundorderStatusApi, refundorderStatusApi,
refundorderDetailApi, refundorderDetailApi,
refundorderExpressApi,
orderDeliveryApi, exportRefundOrderApi orderDeliveryApi, exportRefundOrderApi
} from "@/api/order"; } from "@/api/order";
import createWorkBook from '@/utils/newToExcel.js'; import createWorkBook from '@/utils/newToExcel.js';
import detailsFrom from './refundDetail' import detailsFrom from './refundDetail'
import logisticsFrom from '../logistics'
import { fromList } from "@/libs/constants.js"; import { fromList } from "@/libs/constants.js";
import fileList from '@/components/exportFile/fileList' import fileList from '@/components/exportFile/fileList'
import { roterPre } from "@/settings"; import { roterPre } from "@/settings";
import timeOptions from '@/utils/timeOptions'; import timeOptions from '@/utils/timeOptions';
export default { export default {
components: { fileList,detailsFrom }, components: { fileList,detailsFrom,logisticsFrom },
name: "OrderRefund", name: "OrderRefund",
data() { data() {
return { return {
pickerOptions: timeOptions, pickerOptions: timeOptions,
orderId: 0, orderId: 0,
logisticsName: 'refund',
roterPre: roterPre, roterPre: roterPre,
tableData: { tableData: {
data: [], data: [],

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="divBox"> <div class="divBox">
<div class="selCard"> <div class="selCard">
<el-form inline size="small" :model="tableFrom" ref="searchForm" label-width="85px"> <el-form inline size="small" :model="tableFrom" ref="searchForm" label-width="103px">
<el-form-item label="商品分类:" prop="pid"> <el-form-item label="商品分类:" prop="pid">
<el-cascader v-model="tableFrom.pid" class="selWidth" :options="merCateList" :props="{ checkStrictly: true, emitPath:false }" clearable @change="getList(1)" /> <el-cascader v-model="tableFrom.pid" class="selWidth" :options="merCateList" :props="{ checkStrictly: true, emitPath:false }" clearable @change="getList(1)" />
</el-form-item> </el-form-item>
@ -43,8 +43,8 @@
<el-option v-for="item in recommendList" :key="item.value" :label="item.name" :value="item.value" /> <el-option v-for="item in recommendList" :key="item.value" :label="item.name" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="商品类型:" prop="is_ficti"> <el-form-item label="商品类型:" prop="audit_type">
<el-select v-model="tableFrom.is_ficti" placeholder="请选择" class="filter-item selWidth" clearable @change="getList(1)"> <el-select v-model="tableFrom.audit_type" placeholder="请选择" class="filter-item selWidth" clearable @change="getList(1)">
<el-option v-for="item in productTypeList" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in productTypeList" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -67,6 +67,12 @@
clearable clearable
/> />
</el-form-item> </el-form-item>
<el-form-item label="是否惠美乡村:" prop="us_status">
<el-select v-model="tableFrom.is_huimei" placeholder="请选择" class="filter-item selWidth" clearable @change="getList(1)">
<el-option label="是" value="1" />
<el-option label="否" value="0" />
</el-select>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" size="small" @click="getList(1)">搜索</el-button> <el-button type="primary" size="small" @click="getList(1)">搜索</el-button>
<el-button size="small" @click="searchReset()">重置</el-button> <el-button size="small" @click="searchReset()">重置</el-button>
@ -78,7 +84,7 @@
<el-tab-pane v-for="(item,index) in headeNum" :key="index" :name="item.type.toString()" :label="item.name +'('+item.count +')' " /> <el-tab-pane v-for="(item,index) in headeNum" :key="index" :name="item.type.toString()" :label="item.name +'('+item.count +')' " />
</el-tabs> </el-tabs>
<div class="mt5 mb20"> <div class="mt5 mb20">
<el-button v-show="tableFrom.type === '6'" size="small" :disabled="multipleSelection.length==0" @click="batch">批量审核</el-button> <!-- <el-button v-show="tableFrom.type === '6'" size="small" :disabled="multipleSelection.length==0" @click="batch">批量审核</el-button> -->
<el-button size="small" :disabled="multipleSelection.length==0 " @click="batchOff">批量强制下架</el-button> <el-button size="small" :disabled="multipleSelection.length==0 " @click="batchOff">批量强制下架</el-button>
<el-button size="small" :disabled="multipleSelection.length==0 " @click="batchShow(0)">批量不显示</el-button> <el-button size="small" :disabled="multipleSelection.length==0 " @click="batchShow(0)">批量不显示</el-button>
<el-button size="small" :disabled="multipleSelection.length==0 " @click="batchShow(1)">批量显示</el-button> <el-button size="small" :disabled="multipleSelection.length==0 " @click="batchShow(1)">批量显示</el-button>
@ -118,7 +124,11 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="product_id" label="ID" min-width="80" /> <el-table-column prop="product_id" label="ID" min-width="80" />
<el-table-column prop="type" label="商品品类" min-width="80" /> <el-table-column prop="audit_type" label="商品类型" min-width="80">
<template slot-scope="scope">
{{ productTypeList[scope.row.audit_type].label }}
</template>
</el-table-column>
<el-table-column label="商品图" min-width="70"> <el-table-column label="商品图" min-width="70">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="demo-image__preview"> <div class="demo-image__preview">
@ -136,10 +146,10 @@
<span>{{ scope.row.merchant ? scope.row.merchant.mer_name : '' }}</span> <span>{{ scope.row.merchant ? scope.row.merchant.mer_name : '' }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="remark" label="商备注" min-width="100" /> <el-table-column prop="remark" label="商备注" min-width="100" />
<el-table-column label="是否惠美乡村产品" min-width="100"> <el-table-column label="是否惠美乡村产品" min-width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.row.is_soldier ? '是' : '否' }}</span> <span>{{ scope.row.is_huimei ? '是' : '否' }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="price" label="商品售价" min-width="80" /> <el-table-column prop="price" label="商品售价" min-width="80" />
@ -147,7 +157,7 @@
<el-table-column prop="stock" label="库存" min-width="70" /> <el-table-column prop="stock" label="库存" min-width="70" />
<el-table-column prop="is_audited" label="待审核类型" min-width="80"> <el-table-column prop="is_audited" label="待审核类型" min-width="80">
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.row.is_audited?'上架商品修改':'首次提报'}} {{ auditedList[scope.row.is_audited] }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="推荐级别" min-width="150"> <el-table-column label="推荐级别" min-width="150">
@ -169,10 +179,10 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="create_time" label="创建时间" min-width="120" /> <el-table-column prop="create_time" label="创建时间" min-width="120" />
<el-table-column v-if="Number(tableFrom.type) < 7" key="8" label="操作" min-width="180" fixed="right"> <el-table-column v-if="Number(tableFrom.type) != 7" key="8" label="操作" min-width="210" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" size="small" @click="onDetails(scope.row.product_id)">详情</el-button> <el-button type="text" size="small" @click="onDetails(scope.row.product_id)">详情</el-button>
<el-button v-if="tableFrom.type === '6'" type="text" size="small" @click.native="toExamine(scope.row.product_id)">审核</el-button> <el-button v-if="tableFrom.type === '6' || tableFrom.type === '10' || tableFrom.type === '11'" type="text" size="small" @click.native="toExamine(scope.row.product_id)">{{ getStatusName(scope.row.status) }}</el-button>
<el-button type="text" size="small" class="mr10" @click="handlePreview(scope.row.product_id)">预览</el-button> <el-button type="text" size="small" class="mr10" @click="handlePreview(scope.row.product_id)">预览</el-button>
<el-dropdown> <el-dropdown>
<span class="el-dropdown-link"> <span class="el-dropdown-link">
@ -418,6 +428,7 @@ export default {
{ label: "2星", value: 2 }, { label: "2星", value: 2 },
{ label: "1星", value: 1 } { label: "1星", value: 1 }
], ],
auditedList:['首次提报','非首次提报','首次修改'],
recommend: proOptions, recommend: proOptions,
recommendList: [{ recommendList: [{
name: '热门榜单', name: '热门榜单',
@ -454,9 +465,9 @@ export default {
{ label: "平台关闭", value: -1 }, { label: "平台关闭", value: -1 },
], ],
productTypeList: [ productTypeList: [
{ label: '普通商品', value: 0 }, { label: '食品及保健品', value: 0 },
{ label: '虚拟商品', value: 1 }, { label: '化妆品及日化品', value: 1 },
{ label: '卡密商品', value: 2 } { label: '其他品类', value: 2 }
], ],
fullscreenLoading: false, fullscreenLoading: false,
isShow: false, isShow: false,
@ -474,6 +485,7 @@ export default {
sys_labels: '', sys_labels: '',
pid: '', pid: '',
store_name: '', store_name: '',
audit_type:'',
type: '6', type: '6',
mer_id: '', mer_id: '',
keyword: '', keyword: '',
@ -511,6 +523,16 @@ export default {
this.getLabelLst() this.getLabelLst()
}, },
methods: { methods: {
getStatusName(val){
switch (val) {
case 0:
return '初始审核';
case 10:
return '二次审核';
case 11:
return '最终审核';
}
},
// //
onchangeTime(e) { onchangeTime(e) {
this.timeVal = e this.timeVal = e

View File

@ -444,7 +444,7 @@
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com> // | Author: CRMEB Team <admin@crmeb.com>
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
import { productDetailApi, productStatusApi } from '@/api/product' import { productDetailApi, productStatusApi,productStatusFirstApi,productStatusSecondApi } from '@/api/product'
const defaultObj = { const defaultObj = {
image: '', image: '',
slider_image: [], slider_image: [],
@ -634,11 +634,29 @@ export default {
}, tit); }, tit);
}, },
onSubmit() { onSubmit() {
console.log(this.isShow); console.log(this.projectData);
let mode = {
0: {
'api': productStatusFirstApi,
'status':10
},
10: {
'api': productStatusSecondApi,
'status':11
},
11: {
'api': productStatusApi,
'status':1
}
}
this.$refs.ruleForm.validate(valid=>{ this.$refs.ruleForm.validate(valid=>{
if(valid){ if(valid){
this.isShow ? this.ruleForm.id = this.proId : this.ruleForm.id = this.ids this.isShow ? this.ruleForm.id = this.proId : this.ruleForm.id = this.ids
productStatusApi(this.ruleForm).then(res => { let params = {
...this.ruleForm,
status: this.ruleForm.status==-1?-1:mode[this.projectData.status].status,
}
mode[this.projectData.status].api(params).then(res => {
this.$message.success(res.message) this.$message.success(res.message)
this.dialogVisible = false this.dialogVisible = false
this.activeNames = 'first' this.activeNames = 'first'
@ -659,7 +677,8 @@ export default {
this.loading = true this.loading = true
this.ruleForm.status_img = [] this.ruleForm.status_img = []
productDetailApi(id).then(res => { productDetailApi(id).then(res => {
this.projectData = res.data this.projectData = res.data,
this.ruleForm.status_img = res.data.status_img
let qualification={ let qualification={
production_name: '', production_name: '',
businessList: [], businessList: [],