57 changed files with 4124 additions and 433 deletions
@ -0,0 +1,70 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
/** |
|||
* 货道补货 -- 酒店售货机 and 自助售货机 详情 |
|||
* @param params |
|||
* @returns {Promise<T | never>} |
|||
* @constructor |
|||
*/ |
|||
export function GET_DEVICEINFO(params) { |
|||
return request({ |
|||
url: "/api/admin/restocks/deviceInfo?deviceId=" + params, |
|||
method: 'get', |
|||
}).then(res => res.data.data) |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 货道补货 -- 酒店售货机 and 自助售货机 开门补货 |
|||
* @param params |
|||
* @returns {Promise<T | never>} |
|||
* @constructor |
|||
*/ |
|||
export function POST_RESTOCKS(params) { |
|||
return request({ |
|||
url: "/api/admin/restocks?deviceId=" + params.deviceId, |
|||
method: 'post', |
|||
data:params |
|||
}).then(res => res.data.data) |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 货道补货 -- 一键开门 |
|||
* @param params |
|||
* @returns {Promise<T | never>} |
|||
* @constructor |
|||
*/ |
|||
export function POST_OPENDOOR(params) { |
|||
return request({ |
|||
url: "/api/admin/quxia/remote/openDoors?deviceId=" + params.deviceId, |
|||
method: 'post', |
|||
data:params |
|||
}).then(res => res.data.data) |
|||
} |
|||
|
|||
|
|||
|
|||
/** |
|||
* 货道补货 -- 酒店售货机 确认补货 |
|||
* @param params |
|||
* @returns {Promise<T | never>} |
|||
* @constructor |
|||
*/ |
|||
export function POST_RESTOCKS_UPDATE(params) { |
|||
return request({ |
|||
url: "/api/admin/restocks/update?deviceId=" + params.deviceId, |
|||
method: 'post', |
|||
data:params |
|||
}).then(res => res.data.data) |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,84 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
const url = '/api/admin'; |
|||
|
|||
/** |
|||
* 增值功能-数据统计 / 数据汇总 |
|||
* @param params |
|||
* @returns {Q.Promise<any> | * | Q.Promise<T | never> | PromiseLike<T | never> | Promise<T | never>} |
|||
* @constructor |
|||
*/ |
|||
export function GET_SUMMARY(params) { |
|||
return request({ |
|||
url: url + "/channels/analytics/summary", |
|||
method: 'get', |
|||
params |
|||
}).then(res => res.data.data) |
|||
|
|||
} |
|||
|
|||
|
|||
/** |
|||
* 增值功能-数据统计 / 增值渠道订单列表 |
|||
* @param params |
|||
* @returns {Q.Promise<any> | * | Q.Promise<T | never> | PromiseLike<T | never> | Promise<T | never>} |
|||
* @constructor |
|||
*/ |
|||
export function GET_LIST_ORDERS(params) { |
|||
return request({ |
|||
url: url + "/channels/orders", |
|||
method: 'get', |
|||
params |
|||
}).then(res => res.data.data) |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 增值功能-数据统计 / 增值渠道列表 |
|||
* @param params |
|||
* @returns {Q.Promise<any> | * | Q.Promise<T | never> | PromiseLike<T | never> | Promise<T | never>} |
|||
* @constructor |
|||
*/ |
|||
export function GET_SELECT(params) { |
|||
return request({ |
|||
url: url + "/channels/select", |
|||
method: 'get', |
|||
params |
|||
}).then(res => res.data.data) |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
/** |
|||
* 增值功能-数据统计 / 增值订单详情 |
|||
* @param params |
|||
* @returns {Q.Promise<any> | * | Q.Promise<T | never> | PromiseLike<T | never> | Promise<T | never>} |
|||
* @constructor |
|||
*/ |
|||
export function GET_LIST_ORDERS_DETAIL(params) { |
|||
return request({ |
|||
url: url + "/channels/orders/detail", |
|||
method: 'get', |
|||
params |
|||
}).then(res => res.data.data) |
|||
|
|||
} |
|||
|
|||
|
|||
/** |
|||
* 增值功能-数据统计 / 增值渠道订单总数 |
|||
* @param params |
|||
* @returns {Q.Promise<any> | * | Q.Promise<T | never> | PromiseLike<T | never> | Promise<T | never>} |
|||
* @constructor |
|||
*/ |
|||
export function GET_ORDERS_COUNT(params) { |
|||
return request({ |
|||
url: url + "/channels/orders/count", |
|||
method: 'get', |
|||
params |
|||
}).then(res => res.data.data) |
|||
|
|||
} |
|||
|
@ -1,8 +1,13 @@ |
|||
// export const BASE_API = "https://rapapi.renqilai.com/app/mock/39";
|
|||
|
|||
export const DEVICE_TYPE_SMALL = "quxia" |
|||
export const DEVICE_TYPE_BIG = "quxia-vm" |
|||
export const client_id = 'test' |
|||
export const client_secret = "test" |
|||
export const BASE_API = "http://192.168.0.222:8080" |
|||
export const BASE_API = "http://192.168.0.222:8080"; |
|||
// export const BASE_API = "http://192.168.0.252:9090"
|
|||
// export const BASE_API = "https://quxiaapi.renqilai.com"
|
|||
|
|||
// export const BASE_API = "https://rapapi.renqilai.com/app/mock/39";
|
|||
export const pageSize = 20 |
|||
|
|||
export const SHELF_MAX_ROW=7 |
|||
export const SHELF_MAX_COLOUM=12 |
|||
|
@ -0,0 +1,40 @@ |
|||
import Layout from '@/views/layout/Layout' |
|||
|
|||
const valueAddedManagement = { |
|||
path: '/valueAddedManagement', |
|||
component: Layout, |
|||
meta: {title: '增值管理', icon: 'guanggaoguanli', noCache: true, affix: false}, |
|||
children: [ |
|||
{ |
|||
path: '/valueAddedAtatistics/index', |
|||
component: () => import('@/views/valueAddedManagement/valueAddedAtatistics/index'), |
|||
name: '增值统计', |
|||
meta: {title: '增值统计', noCache: false, affix: false} |
|||
}, |
|||
{ |
|||
path: '/valueAddedAtatistics/channelDetails', |
|||
component: () => import('@/views/valueAddedManagement/valueAddedAtatistics/channelDetails'), |
|||
hidden:true, |
|||
name: '渠道详情', |
|||
meta: {title: '渠道详情', noCache: false, affix: false}, |
|||
|
|||
}, |
|||
{ |
|||
path: '/advertisingManagement/orderDetails', |
|||
component: () => import('@/views/valueAddedManagement/valueAddedAtatistics/orderDetails'), |
|||
hidden:true, |
|||
name: '订单详情', |
|||
meta: {title: '订单详情', noCache: false, affix: false}, |
|||
|
|||
}, |
|||
{ |
|||
path: '/distributionSettings/index', |
|||
component: () => import('@/views/valueAddedManagement/distributionSettings/index'), |
|||
name: '分润设置', |
|||
meta: {title: '分润设置', noCache: false, affix: false}, |
|||
|
|||
}, |
|||
] |
|||
}; |
|||
|
|||
export default valueAddedManagement |
@ -0,0 +1,17 @@ |
|||
.list { |
|||
display: flex; |
|||
|
|||
.label { |
|||
text-align : right; |
|||
float : left; |
|||
font-size : 14px; |
|||
color : #606266; |
|||
line-height : 40px; |
|||
padding : 0 12px 0 0; |
|||
font-weight : 600; |
|||
-webkit-box-sizing: border-box; |
|||
box-sizing : border-box; |
|||
} |
|||
|
|||
.value {} |
|||
} |
@ -0,0 +1,236 @@ |
|||
|
|||
<template> |
|||
<div class="pageContainer" v-loading="loading"> |
|||
<header> |
|||
<h3>货道详情</h3> |
|||
<div class="btns"> |
|||
<el-input-number v-model="detail.shelfCount" @change="changeShelfCount" :min="0" :max="50"></el-input-number> |
|||
<el-button @click="pilian1" style="margin-left:10px;">批量编辑</el-button> |
|||
<el-button @click="submit1" type="primary" :loading="loading">提交</el-button> |
|||
</div> |
|||
</header> |
|||
<div class="rightContainer"> |
|||
<div class="list"> |
|||
<ListItem |
|||
v-for="item in detail.shelfs" |
|||
:key="item.number" |
|||
:visible.sync="editModalState" |
|||
:visiblerpoduct.sync="visiblerpoduct" |
|||
:item="item" |
|||
@selectItem="selectItem" |
|||
@deleteItem="deleteItem" |
|||
:editItem.sync="editItem" |
|||
/> |
|||
</div> |
|||
</div> |
|||
<ItemEditModal @finish="finishEdit" :visible.sync="editModalState" :editItem.sync="editItem"></ItemEditModal> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
import * as apishelfs from "@/api/shelfs"; |
|||
import map from "lodash.map"; |
|||
import ItemEditModal from "./itemFormModal"; |
|||
import ListItem from "./rightShowItem"; |
|||
import { postShelf, putShelf } from "../../../api/shelfs"; |
|||
import myalert from "../../../utils/alert"; |
|||
import ItemEditProductModal from "./ItemEditProductModal"; |
|||
export default { |
|||
props: ["cacheRow", "isEdit"], |
|||
data() { |
|||
return { |
|||
loading: false, |
|||
detail: {}, |
|||
editItem: [], |
|||
editModalState: false, |
|||
visiblerpoduct: false |
|||
}; |
|||
}, |
|||
components: { |
|||
ItemEditModal, |
|||
ListItem, |
|||
ItemEditProductModal |
|||
}, |
|||
mounted() { |
|||
this.init(); |
|||
}, |
|||
watch: { |
|||
["cacheRow.id"]() { |
|||
this.init(); |
|||
} |
|||
}, |
|||
methods: { |
|||
changeShelfCount(num) { |
|||
if (this.detail.shelfs.length < num) { |
|||
for (let i = 0; i < num - this.detail.shelfs.length; i++) { |
|||
this.detail.shelfs.push({ |
|||
number: this.detail.shelfs.length + 1, |
|||
isEdit: false, |
|||
image: "", |
|||
productId: "", |
|||
safeStock: 1, |
|||
price: "", |
|||
maxStock: 1, |
|||
name: "" |
|||
}); |
|||
} |
|||
} |
|||
if (this.detail.shelfs.length > num) { |
|||
for (let i = 0; i < this.detail.shelfs.length - num; i++) { |
|||
this.detail.shelfs.splice(this.detail.shelfs.length - 1, 1); |
|||
} |
|||
} |
|||
}, |
|||
selectItem(item) { |
|||
this.$data.editItem = [item]; |
|||
}, |
|||
deleteItem(item) { |
|||
var _index = this.detail.shelfs.findIndex(_item => item.id == _item.id); |
|||
this.detail.shelfs.splice(_index, 1); |
|||
this.detail.shelfCount = this.detail.shelfs.length; |
|||
}, |
|||
submit1() { |
|||
var self = this; |
|||
var data = { |
|||
...this.$data.detail, |
|||
shelfCount: this.detail.shelfs.length, |
|||
shelfs: this.detail.shelfs |
|||
}; |
|||
var isOkPost = true; |
|||
data.shelfs.map(item => { |
|||
if (!item.productId) { |
|||
isOkPost = false; |
|||
} |
|||
}); |
|||
if (!isOkPost) { |
|||
myalert.fail("检查到有货道没有产品"); |
|||
return false; |
|||
} |
|||
self.$data.loading = true; |
|||
putShelf(data) |
|||
.then(res => { |
|||
setTimeout(() => { |
|||
self.init().then(res => { |
|||
myalert.success("保存成功"); |
|||
self.$data.loading = false; |
|||
}); |
|||
}, 1000); |
|||
}) |
|||
.catch(e => { |
|||
console.error(e); |
|||
self.$data.loading = false; |
|||
}); |
|||
}, |
|||
finishEdit(formData) { |
|||
var self = this; |
|||
var shelfs = this.$data.detail.shelfs; |
|||
shelfs.map((item, index) => { |
|||
self.$data.editItem.map((item2, index2) => { |
|||
if (item2.number == item.number) { |
|||
if (self.$data.editItem.length <= 1) { |
|||
item.number = formData.number; |
|||
} |
|||
item.price = formData.price; |
|||
item.image = formData.image; |
|||
item.productId = formData.productId; |
|||
item.safeStock = formData.safeStock; |
|||
item.maxStock = formData.maxStock; |
|||
item.name = formData.name; |
|||
} |
|||
}); |
|||
}); |
|||
//取消选择 |
|||
self.$data.editItem = []; |
|||
}, |
|||
async init() { |
|||
var id = this.cacheRow.id; //编辑的id |
|||
this.$data.loading = true; |
|||
var detail = await apishelfs.getShelfDetail(id).then(res => { |
|||
res.shelfs = map(res.shelfs, item => { |
|||
return { ...item, isEdit: false }; |
|||
}); |
|||
return res; |
|||
}); |
|||
this.editItem = []; |
|||
this.$data.detail = detail; |
|||
this.$data.loading = false; |
|||
}, |
|||
addItem() { |
|||
var self = this; |
|||
var shelfs = this.$data.detail.shelfs; |
|||
var newItem = { |
|||
number: this.$data.detail.shelfs.length + 1, |
|||
price: "", |
|||
productId: "", |
|||
safeStock: 1, |
|||
maxStock: 1, |
|||
isEdit: false |
|||
}; |
|||
shelfs.push(newItem); |
|||
}, |
|||
pilian1() { |
|||
if (this.$data.editItem.length <= 0) { |
|||
myalert.fail("请选择先"); |
|||
return false; |
|||
} |
|||
this.$data.editModalState = true; |
|||
}, |
|||
pilian2() { |
|||
if (this.$data.editItem.length <= 0) { |
|||
myalert.fail("请选择先"); |
|||
return false; |
|||
} |
|||
this.$data.visiblerpoduct = true; |
|||
} |
|||
} |
|||
}; |
|||
</script> |
|||
<style lang="scss" scoped> |
|||
.pageContainer { |
|||
} |
|||
header { |
|||
width: 100%; |
|||
align-items: center; |
|||
display: flex; |
|||
padding: 10px; |
|||
border-bottom: 1px solid #ddd; |
|||
h3 { |
|||
flex: 1; |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
padding: 20px; |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
.listItem { |
|||
box-sizing: border-box; |
|||
display: inline-block; |
|||
width: calc(50%-20px); |
|||
border: 1px solid #ddd; |
|||
display: flex; |
|||
padding: 10px; |
|||
margin-bottom: 20px; |
|||
position: relative; |
|||
&:nth-child(2n + 1) { |
|||
margin-right: 20px; |
|||
} |
|||
&.add { |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
} |
|||
} |
|||
} |
|||
.listItem.add { |
|||
margin-left: 20px; |
|||
margin-right: 20px; |
|||
width: calc(100%-60px); |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
padding: 10px; |
|||
border: 1px solid #ddd; |
|||
margin-top: 10px; |
|||
} |
|||
</style> |
|||
|
@ -0,0 +1,62 @@ |
|||
.header1 { |
|||
display : flex; |
|||
align-items: flex-end; |
|||
padding : 10px; |
|||
|
|||
h2 {} |
|||
|
|||
.el-input-number { |
|||
margin-right: 10px; |
|||
margin-left : 10px; |
|||
} |
|||
} |
|||
|
|||
.header1.header-big { |
|||
border-bottom: 1px solid #ddd; |
|||
} |
|||
|
|||
.row-content-container { |
|||
display : flex; |
|||
flex-wrap: wrap; |
|||
padding : 0 10px; |
|||
|
|||
.listItem { |
|||
width : calc(33.33%-20px); |
|||
margin-right: 20px; |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
.header-big { |
|||
align-items: center; |
|||
|
|||
.content-wrapper { |
|||
display : flex; |
|||
align-items : flex-end; |
|||
padding-right: 10px; |
|||
|
|||
h2 {} |
|||
|
|||
.el-input-number { |
|||
margin-right: 10px; |
|||
margin-left : 10px; |
|||
} |
|||
|
|||
.right-btns { |
|||
.check-btn {} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// 小售货机 |
|||
.row-container.small { |
|||
display : flex; |
|||
flex-wrap: wrap; |
|||
padding : 10px; |
|||
|
|||
.listItem { |
|||
width : calc(33.33%-20px); |
|||
margin-right: 20px; |
|||
} |
|||
} |
@ -0,0 +1,31 @@ |
|||
<template> |
|||
<div class="replenishment"> |
|||
<div style="background: #fff;padding: 30px;"> |
|||
<MyForm @search="search" :cargo="true"></MyForm> |
|||
</div> |
|||
|
|||
<div style=" margin-top: 20px; padding: 30px; background: #fff;"> |
|||
<MyTable :storex="{...$data}" @changePagination="changePaginationleft" @replenishment="changeReplenishment"></MyTable> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import MyForm from "../status/form"; |
|||
import MyTable from "./table"; |
|||
import initStore from "./mixins/initStore.js"; |
|||
import tablemix from "./mixins/table.js"; |
|||
|
|||
export default { |
|||
name: "index", |
|||
mixins: [initStore, tablemix], |
|||
components: { |
|||
MyForm, |
|||
MyTable |
|||
}, |
|||
methods: {} |
|||
} |
|||
</script> |
|||
|
|||
<style rel="stylesheet/scss" lang="scss" scoped> |
|||
</style> |
@ -0,0 +1,20 @@ |
|||
import { pageSize } from "@/config"; |
|||
|
|||
export default { |
|||
data() { |
|||
return { |
|||
dataForm: { |
|||
query: "", active: "", deviceTypeId: "", |
|||
size: pageSize, from: 0 |
|||
}, |
|||
isEdit: false, |
|||
isPostSelf: false, |
|||
cacheRow: {}, |
|||
loading: false, |
|||
leftTableData: [], |
|||
devices: 0, |
|||
outOfStockDevices: 0, |
|||
leftSelectRow: {}, |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,36 @@ |
|||
import initStore from "./initStore"; |
|||
export default { |
|||
props: { |
|||
storex: { |
|||
type: Object, |
|||
default: () => initStore |
|||
} |
|||
}, |
|||
|
|||
computed: { |
|||
leftSelectRow() { |
|||
return this.storex.leftSelectRow |
|||
}, |
|||
dataForm() { |
|||
return this.storex.dataForm |
|||
}, |
|||
isEdit() { |
|||
return this.storex.isEdit |
|||
}, |
|||
isPostSelf() { |
|||
return this.storex.isPostSelf |
|||
}, |
|||
loading() { |
|||
return this.storex.loading |
|||
}, |
|||
leftTableData() { |
|||
return this.storex.leftTableData |
|||
}, |
|||
outOfStockDevices() { |
|||
return this.storex.outOfStockDevices |
|||
}, |
|||
devices() { |
|||
return this.storex.outOfStockDevices |
|||
}, |
|||
} |
|||
} |
@ -0,0 +1,43 @@ |
|||
import {get_shelfs_device_summary, get_shelfs_device_lists} from '../../../../api/devicesStatus'; |
|||
|
|||
export default { |
|||
methods: { |
|||
search(formdata) { |
|||
this.dataForm = {...this.dataForm, ...formdata} |
|||
this.getLeftData() |
|||
}, |
|||
async getLeftData() { |
|||
this.loading = true; |
|||
var params = {...this.dataForm}; |
|||
var {devices, outOfStockDevices} = await get_shelfs_device_summary( |
|||
params |
|||
); |
|||
var tableData = await get_shelfs_device_lists(params); |
|||
this.leftTableData = tableData; |
|||
this.devices = devices; |
|||
this.outOfStockDevices = outOfStockDevices; |
|||
this.loading = false; |
|||
}, |
|||
clickrowleft(row) { |
|||
this.isEdit = false |
|||
this.leftSelectRow = row |
|||
this.$nextTick(() => { |
|||
this.isEdit = true |
|||
}) |
|||
}, |
|||
changePaginationleft(page) { |
|||
this.dataForm.from = (page - 1) * this.dataForm.size; |
|||
this.getLeftData() |
|||
}, |
|||
changeReplenishment(row, stock) { |
|||
if (row.typeId == 'quxia') { |
|||
this.$router.push('/shelfs/replenishment/quxia?id=' + row.id + '&stock=' + stock) |
|||
} else { |
|||
this.$router.push('/shelfs/replenishment/quxia-vm?id=' + row.id) |
|||
} |
|||
} |
|||
}, |
|||
mounted() { |
|||
this.getLeftData() |
|||
} |
|||
} |
@ -0,0 +1,373 @@ |
|||
<template> |
|||
<div class="quxia-vm"> |
|||
<div class="infoDetail"> |
|||
<div class="infoDetailTit"><span>编号:</span><span>{{$route.query.id}}</span></div> |
|||
<div class="infoDetailTit" v-if="detailData.deviceName"><span>设备名称:</span><span |
|||
>{{detailData.deviceName}}</span></div> |
|||
<div class="infoDetailTit" v-if="detailData.province"><span>地址:</span><span>{{detailData.province + detailData.city + detailData.district +detailData.street +detailData.locationName}}</span> |
|||
</div> |
|||
<div class="infoDetailTit"> |
|||
<span>状态:</span> |
|||
<span v-if="detailData.active">在线</span> |
|||
<span v-if="!detailData.active">离线</span> |
|||
</div> |
|||
</div> |
|||
<div class="content"> |
|||
<div> |
|||
<!--<el-select style="margin-right: 30px;" @change="toggleShelfs" v-model="value" placeholder="请选择">--> |
|||
<!--<el-option label="全部" value="all">全部</el-option>--> |
|||
<!--<el-option label="缺货" value="shortage"></el-option>--> |
|||
<!--</el-select>--> |
|||
|
|||
<el-button type="primary" @click="onFillReplenishNum">一键补满</el-button> |
|||
<el-button type="info" @click="onResetReplenishNum">重置</el-button> |
|||
<el-button type="success" @click="confrim">确定补货</el-button> |
|||
</div> |
|||
|
|||
<div v-if="!shelfs.length" style="text-align: center;">暂无数据,请配置货道</div> |
|||
<div v-for="(item,index) in shelfs" :key="index"> |
|||
<div class="row"> |
|||
<h2>第{{index +1}}层</h2> |
|||
<div class="row-content-container"> |
|||
<template v-for="(items,idx) in item.items"> |
|||
|
|||
<div class="listItem" v-if="items.isShow"> |
|||
<div v-if="items.isEdit" class="editBtns"></div> |
|||
<div class="row-container-item"> |
|||
<img :src="items.image" |
|||
class="left img" alt=""> |
|||
<div> |
|||
<h5>{{items.name}}</h5> |
|||
<p><span>货道号: {{index +1}}{{idx}}</span><span> 零售价: ¥{{items.price}}</span></p> |
|||
<p><span>容量: {{items.stock}}</span><span> 最大容量: {{items.maxStock}}</span> |
|||
</p> |
|||
</div> |
|||
<span class="shortage" v-if="items.state=='OUT_OF_STOCK'">缺货</span> |
|||
</div> |
|||
<div style="text-align: center;"> |
|||
<el-input-number size="medium" style="margin-top: 5px;" :min="0" |
|||
:max="items.maxStock" |
|||
v-model="items.replenishNum" |
|||
@change="handleChange($event,items.curr)"></el-input-number> |
|||
<span v-show="items.isEdit" style="margin-left: 10px;">{{ items.replenishNum - items.stock}} 件</span> |
|||
</div> |
|||
|
|||
</div> |
|||
</template> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
|
|||
import {GET_DEVICEINFO, POST_RESTOCKS} from '@/api/replenishment'; |
|||
import Alert from "@/utils/alert"; |
|||
|
|||
export default { |
|||
name: "quxia-vm", |
|||
data() { |
|||
return { |
|||
num1: 10, |
|||
value: 'all', |
|||
loading: false, |
|||
detailData: { |
|||
deviceName: '', |
|||
province: '', |
|||
city: '', |
|||
district: '', |
|||
street: '', |
|||
locationName: '', |
|||
}, |
|||
isFillUp: false, |
|||
shelfs: [], |
|||
selSheLfs: [] |
|||
} |
|||
}, |
|||
computed: { |
|||
stock() { |
|||
return this.$route.query.stock |
|||
} |
|||
}, |
|||
mounted() { |
|||
this.getDetail(this.$route.query.id); |
|||
}, |
|||
methods: { |
|||
getDetail(id) { |
|||
GET_DEVICEINFO(id).then(res => { |
|||
let shelfs = res.rows.map((item, index) => { |
|||
item.items.map((items, idx) => { |
|||
items.curr = `${index}:${idx}`; |
|||
items.replenishNum = items.stock; |
|||
items.isShow = true; |
|||
items.isEdit = false; |
|||
return items; |
|||
}); |
|||
return item |
|||
}); |
|||
this.detailData = res; |
|||
this.shelfs = shelfs |
|||
}) |
|||
}, |
|||
|
|||
handleChange(e, curr) { |
|||
|
|||
let x = curr.slice(':')[0]; |
|||
let y = curr.slice(':')[2]; |
|||
if (this.shelfs[x].items[y].replenishNum == this.shelfs[x].items[y].stock) { |
|||
this.shelfs[x].items[y].isEdit = false |
|||
} else { |
|||
this.shelfs[x].items[y].isEdit = true |
|||
} |
|||
|
|||
|
|||
}, |
|||
|
|||
/** |
|||
*确定补货 |
|||
*/ |
|||
confrim() { |
|||
let newShelfs = []; |
|||
let shelfs = this.shelfs.map(item => { |
|||
item.items.map(items => { |
|||
newShelfs.push(items) |
|||
}); |
|||
return item; |
|||
}); |
|||
|
|||
newShelfs = newShelfs.filter(item => { |
|||
return item.replenishNum != item.stock |
|||
}); |
|||
|
|||
newShelfs = newShelfs.map(item => { |
|||
return { |
|||
number: item.number, |
|||
amount: item.replenishNum - item.stock |
|||
} |
|||
}); |
|||
|
|||
if (!newShelfs.length) { |
|||
Alert.fail('请请选择需要补货的货道'); |
|||
return false; |
|||
} |
|||
|
|||
let obj = { |
|||
deviceId: this.$route.query.id, |
|||
shelfs: newShelfs |
|||
}; |
|||
|
|||
POST_RESTOCKS({...obj}).then(res => { |
|||
Alert.success('确定补货成功'); |
|||
setTimeout(() => { |
|||
this.getDetail(this.$route.query.id); |
|||
}, 500) |
|||
}) |
|||
}, |
|||
|
|||
/** |
|||
* 重置 |
|||
*/ |
|||
onResetReplenishNum() { |
|||
let shelfs = this.shelfs; |
|||
shelfs.forEach(item => { |
|||
item.items.forEach(items => { |
|||
items.replenishNum = items.stock; |
|||
items.isEdit = false; |
|||
}) |
|||
}); |
|||
|
|||
this.shelfs = shelfs; |
|||
this.isFillUp = false; |
|||
|
|||
}, |
|||
|
|||
/** |
|||
* 一键补满 |
|||
*/ |
|||
onFillReplenishNum() { |
|||
|
|||
let shelfs = this.shelfs, |
|||
isCanNext, len = shelfs.length, |
|||
isFillUp = this.isFillUp; |
|||
|
|||
|
|||
for (let i = 0; i < len; i++) { |
|||
const res1 = shelfs[i].items; |
|||
for (let j = 0; j < res1.length; j++) { |
|||
const res2 = res1[j]; |
|||
|
|||
|
|||
if (res2.replenishNum == res2.maxStock) { |
|||
res2.isEdit = false; |
|||
} else { |
|||
res2.isEdit = true; |
|||
} |
|||
|
|||
|
|||
if (res2.replenishNum == res2.maxStock) { |
|||
isCanNext = true; |
|||
} else { |
|||
isCanNext = false; |
|||
} |
|||
|
|||
|
|||
} |
|||
} |
|||
|
|||
|
|||
if (isFillUp) { |
|||
if (isCanNext) { |
|||
Alert.fail('货物已经补满,无需补货'); |
|||
return; |
|||
} |
|||
} |
|||
|
|||
|
|||
this.isFillUp = true; |
|||
|
|||
|
|||
shelfs = shelfs.map(item => { |
|||
item.items.map(items => { |
|||
items.replenishNum = items.maxStock; |
|||
return items |
|||
}); |
|||
return item; |
|||
}); |
|||
|
|||
|
|||
}, |
|||
|
|||
|
|||
// 全部 and 确实 切换 |
|||
toggleShelfs(val) { |
|||
let isFilterOutOfStock = val == 'all' ? false : true; |
|||
|
|||
let shelfs = this.shelfs; |
|||
|
|||
for (let i = 0; i < shelfs.length; i++) { |
|||
let res1 = shelfs[i].items; |
|||
for (let j = 0; j < res1.length; j++) { |
|||
const res2 = res1[j]; |
|||
if (isFilterOutOfStock) { |
|||
if (res2.state == "OUT_OF_STOCK") { |
|||
res1[j].isShow = true |
|||
} else { |
|||
res1[j].isShow = false |
|||
} |
|||
} else { |
|||
res1[j].isShow = true |
|||
} |
|||
} |
|||
} |
|||
|
|||
this.shelfs = shelfs |
|||
|
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style rel="stylesheet/scss" lang="scss" scoped> |
|||
.infoDetail { |
|||
padding: 20px; |
|||
margin-bottom: 20px; |
|||
border-bottom: 1px solid #d3dce6; |
|||
background: #fff; |
|||
|
|||
.infoDetailTit { |
|||
display: inline-block; |
|||
width: 33%; |
|||
margin: 10px 0; |
|||
|
|||
span:nth-child(1) { |
|||
padding-right: 10px; |
|||
color: #8492a6; |
|||
} |
|||
|
|||
span:nth-child(2) { |
|||
color: #324057; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.content { |
|||
padding: 20px; |
|||
background: #fff; |
|||
|
|||
.row { |
|||
margin: 20px 0; |
|||
|
|||
h2 { |
|||
margin: 10px 0; |
|||
} |
|||
|
|||
.row-content-container { |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
|
|||
.listItem { |
|||
width: calc(20% - 20px); |
|||
margin-right: 20px; |
|||
box-sizing: border-box; |
|||
border: 1px solid #ddd; |
|||
padding: 10px; |
|||
margin-bottom: 20px; |
|||
position: relative; |
|||
|
|||
.editBtns { |
|||
position: absolute; |
|||
top: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
height: 100%; |
|||
background: #bdeca27d; |
|||
} |
|||
|
|||
.row-container-item { |
|||
display: flex; |
|||
position: relative; |
|||
|
|||
.left.img { |
|||
width: 60px; |
|||
height: 60px; |
|||
margin-right: 5px; |
|||
} |
|||
|
|||
h5, p { |
|||
margin: 0; |
|||
padding: 0; |
|||
} |
|||
|
|||
p { |
|||
line-height: 20px; |
|||
} |
|||
|
|||
span { |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.shortage { |
|||
display: inline-block; |
|||
border-radius: 10px; |
|||
background: #f56c6c; |
|||
line-height: 20px; |
|||
text-align: center; |
|||
color: #fff; |
|||
width: 40px; |
|||
height: 20px; |
|||
position: absolute; |
|||
top: 20px; |
|||
right: 0; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
</style> |
@ -0,0 +1,261 @@ |
|||
<template> |
|||
<div class="quxia"> |
|||
<div class="infoDetail"> |
|||
<div class="infoDetailTit"><span>编号:</span><span>{{$route.query.id}}</span></div> |
|||
<div class="infoDetailTit" v-if="detailData.deviceName"><span>设备名称:</span><span |
|||
>{{detailData.deviceName}}</span></div> |
|||
<div class="infoDetailTit" v-if="detailData.province"><span>地址:</span><span>{{detailData.province + detailData.city + detailData.district +detailData.street +detailData.locationName}}</span> |
|||
</div> |
|||
<div class="infoDetailTit"> |
|||
<span>状态:</span> |
|||
<span v-if="detailData.active">在线</span> |
|||
<span v-if="!detailData.active">离线</span> |
|||
</div> |
|||
</div> |
|||
<div class="table"> |
|||
<div class="opi"> |
|||
<el-button v-show="stock=='true'" type="success" @click="openDoor">一键开门</el-button> |
|||
<el-button v-show="stock=='true'" type="primary" @click="confrim">确定补货</el-button> |
|||
<el-button v-show="stock=='false'" type="primary" @click="onRestocks">开门补货</el-button> |
|||
</div> |
|||
<el-table |
|||
:data="detailData.shelfs" |
|||
ref="multipleTable" |
|||
> |
|||
|
|||
<el-table-column |
|||
type="index"> |
|||
</el-table-column> |
|||
<el-table-column label="图片" prop="image"> |
|||
<template slot-scope="scope"> |
|||
<img :src="scope.row.image" alt="" width="70" height="70"> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="名字" prop="name"> |
|||
<template slot-scope="scope"> |
|||
<div>{{scope.row.name}}</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column label="货道状态" prop="active"> |
|||
<template slot-scope="scope"> |
|||
<!--<div v-if="scope.row.state=='OUT_OF_STOCK'">--> |
|||
<!--<span class="state stateQ">缺货</span>--> |
|||
<!--</div>--> |
|||
<!--<div v-else>--> |
|||
<!--<span class="state stateZ">正常</span>--> |
|||
<!--</div>--> |
|||
<el-tooltip class="item" effect="dark" :content="content" placement="top"> |
|||
<el-switch |
|||
v-model="scope.row.checked" |
|||
active-color="#409eff" |
|||
inactive-color="#dcdfe6"> |
|||
</el-switch> |
|||
</el-tooltip> |
|||
<span style="margin-left: 10px;" v-if="scope.row.state=='NORMAL'">正常</span> |
|||
<span style="margin-left: 10px;" v-else-if="scope.row.state=='ALERT'">缺货</span> |
|||
<span style="margin-left: 10px;" v-else="scope.row.state=='OUT_OF_STOCK'">售罄</span> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
</el-table> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
|
|||
import {GET_DEVICEINFO, POST_RESTOCKS, POST_OPENDOOR, POST_RESTOCKS_UPDATE} from '@/api/replenishment'; |
|||
import Alert from "@/utils/alert"; |
|||
|
|||
export default { |
|||
name: "quxia", |
|||
content:'', |
|||
data() { |
|||
return { |
|||
loading: false, |
|||
detailData: { |
|||
deviceName: '', |
|||
province: '', |
|||
city: '', |
|||
district: '', |
|||
street: '', |
|||
locationName: '', |
|||
}, |
|||
selSheLfs: [] |
|||
} |
|||
}, |
|||
computed: { |
|||
stock() { |
|||
return this.$route.query.stock |
|||
} |
|||
}, |
|||
mounted() { |
|||
this.getDetail(this.$route.query.id); |
|||
if (this.stock=='true'){ |
|||
this.content='点击确定补货才能真实修改' |
|||
} else { |
|||
this.content = '点击开门补货才能真实修改' |
|||
} |
|||
}, |
|||
methods: { |
|||
getDetail(id) { |
|||
GET_DEVICEINFO(id).then(res => { |
|||
res.shelfs.map((item, index) => { |
|||
if (item.state == 'NORMAL') { |
|||
item.checked = true; |
|||
item.isSel = true; |
|||
} else { |
|||
item.checked = false; |
|||
item.isSel = false; |
|||
} |
|||
item.index = index; |
|||
return item; |
|||
}); |
|||
this.detailData = res; |
|||
}) |
|||
}, |
|||
|
|||
/** |
|||
* |
|||
* 选择的行 |
|||
*/ |
|||
selChange(val) { |
|||
console.log(val); |
|||
this.detailData.shelfs.map((item, idx) => { |
|||
if (val == idx) { |
|||
|
|||
} |
|||
return item; |
|||
}) |
|||
// let restocks = []; |
|||
// val.forEach(item => { |
|||
// restocks.push({ |
|||
// number: item.number, |
|||
// amount: 1 |
|||
// }) |
|||
// }); |
|||
// this.selSheLfs = restocks |
|||
}, |
|||
/** |
|||
*开门补货 |
|||
*/ |
|||
onRestocks() { |
|||
|
|||
let restocks = []; |
|||
this.detailData.shelfs.map((item, idx) => { |
|||
if (item.checked && item.isSel == false) { |
|||
restocks.push({ |
|||
number: item.number, |
|||
amount: 1 |
|||
}) |
|||
} |
|||
}); |
|||
|
|||
|
|||
if (!restocks.length) { |
|||
Alert.fail('请选择补货商品'); |
|||
return |
|||
} |
|||
|
|||
Alert.confirm("确定开门补货吗?").then(res => { |
|||
let obj = { |
|||
deviceId: this.$route.query.id, |
|||
shelfs: restocks |
|||
}; |
|||
POST_RESTOCKS({...obj}).then(res => { |
|||
Alert.success('补货成功'); |
|||
setTimeout(() => { |
|||
this.getDetail(this.$route.query.id); |
|||
}, 1000) |
|||
}) |
|||
}); |
|||
|
|||
}, |
|||
/** |
|||
*确定补货 |
|||
*/ |
|||
confrim() { |
|||
let restocks = []; |
|||
this.detailData.shelfs.forEach(item => { |
|||
if (item.checked) { |
|||
restocks.push({number: item.number, amount: 1}) |
|||
} else { |
|||
restocks.push({number: item.number, amount: 0}) |
|||
} |
|||
}); |
|||
|
|||
let obj = { |
|||
deviceId: this.$route.query.id, |
|||
shelfs: restocks |
|||
}; |
|||
|
|||
POST_RESTOCKS_UPDATE({...obj}).then(res => { |
|||
Alert.success('确定补货成功'); |
|||
setTimeout(() => { |
|||
this.getDetail(this.$route.query.id); |
|||
}, 1000) |
|||
}) |
|||
}, |
|||
/** |
|||
* 一键开门 |
|||
*/ |
|||
openDoor() { |
|||
|
|||
Alert.confirm("确定一键开门吗?").then(res => { |
|||
let doors = this.detailData.shelfs.map(item => { |
|||
return item.number |
|||
}); |
|||
let obj = { |
|||
deviceId: this.$route.query.id, |
|||
doors |
|||
}; |
|||
POST_OPENDOOR({...obj}).then(res => { |
|||
Alert.success('一键开门成功'); |
|||
}) |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style rel="stylesheet/scss" lang="scss" scoped> |
|||
.infoDetail { |
|||
padding: 20px; |
|||
margin-bottom: 20px; |
|||
border-bottom: 1px solid #d3dce6; |
|||
background: #fff; |
|||
|
|||
.infoDetailTit { |
|||
display: inline-block; |
|||
width: 33%; |
|||
margin: 10px 0; |
|||
|
|||
span:nth-child(1) { |
|||
padding-right: 10px; |
|||
color: #8492a6; |
|||
} |
|||
|
|||
span:nth-child(2) { |
|||
color: #324057; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.table { |
|||
padding: 20px; |
|||
background: #fff; |
|||
|
|||
.state { |
|||
display: inline-block; |
|||
padding: 5px 10px; |
|||
background: #f56c6c; |
|||
border-radius: 10px; |
|||
color: #fff; |
|||
} |
|||
|
|||
.stateZ { |
|||
background: #67c23a; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,162 @@ |
|||
<template> |
|||
<div class="tableContainer"> |
|||
<el-table |
|||
:data="leftTableData" |
|||
v-loading="loading" |
|||
:row-class-name="tableRowClassName" |
|||
@row-click="(row)=>{$emit('clickrow',row)}" |
|||
> |
|||
<el-table-column label="编号" prop="id"></el-table-column> |
|||
<el-table-column label="名字" prop="name"> |
|||
<template slot-scope="scope"> |
|||
<div>{{scope.row.name}}</div> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="地址" prop="locationName"></el-table-column> |
|||
<el-table-column label="类型" prop="typeId"> |
|||
<template slot-scope="scope"> |
|||
<div v-if="scope.row.typeId=='quxia'">酒店售货机</div> |
|||
<div v-else="!scope.row.typeId=='quxia-vm'">自助售货机</div> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="状态" prop="active"> |
|||
<template slot-scope="scope"> |
|||
<div v-if="scope.row.active">在线</div> |
|||
<div v-if="!scope.row.active">离线</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column label="库存状态" prop="stockState"> |
|||
<template slot-scope="scope"> |
|||
<div>{{scope.row.stockState| filterStockState(scope.row)}}</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column label="操作" prop="active"> |
|||
<template slot-scope="scope"> |
|||
<span style="color: rgb(64, 158, 255);cursor: pointer;" @click="replenishment(scope.row)">补货</span> |
|||
<span v-if="scope.row.typeId=='quxia'" |
|||
style="color: rgb(64, 158, 255);cursor: pointer;margin: 0 20px" |
|||
@click="replenishment(scope.row,'stock')">调整库存</span> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
</el-table> |
|||
|
|||
<div class="paginationContainer" style="padding-top:20px"> |
|||
<el-pagination |
|||
background |
|||
:page-size="dataForm.size" |
|||
layout="prev, pager, next" |
|||
:total="devices" |
|||
@current-change="(page)=>$emit('changePagination',page)" |
|||
></el-pagination> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
import { |
|||
getShelfs, |
|||
getShelfDetail, |
|||
postShelfApply, |
|||
postShelf, |
|||
deleteShelf, |
|||
putShelf, |
|||
getShelfCount |
|||
} from "@/api/shelfs"; |
|||
import {mapState, mapActions} from "vuex"; |
|||
import myalert from "../../../utils/alert"; |
|||
import { |
|||
get_shelfs_device_lists, |
|||
get_shelfs_device_summary |
|||
} from "../../../api/devicesStatus"; |
|||
import props1 from "./mixins/props"; |
|||
|
|||
export default { |
|||
mixins: [props1], |
|||
data() { |
|||
return {}; |
|||
}, |
|||
mounted() { |
|||
}, |
|||
methods: { |
|||
...mapActions(["getDeviceTypes"]), |
|||
tableRowClassName({row, rowIndex}) { |
|||
if (row.id === this.leftSelectRow.id) { |
|||
return "success-row"; |
|||
} |
|||
return ""; |
|||
}, |
|||
postShelfApply1(item) { |
|||
this.$router.push(`/shelfs/putaway?id=${item.id}&name=${item.name}`); |
|||
}, |
|||
go2add() { |
|||
this.$router.push(`/shelfs/add`); |
|||
}, |
|||
deleteShelf1(row) { |
|||
var self = this; |
|||
myalert.confirm("确定要删除吗?").then(res => { |
|||
self.$data.tableLoading = true; |
|||
deleteShelf(row.id).then(res => { |
|||
self.$data.tableLoading = false; |
|||
myalert.success("删除成功"); |
|||
self.getTableData(); |
|||
}); |
|||
}); |
|||
}, |
|||
replenishment(row, stock) { |
|||
if (stock) { |
|||
stock = true |
|||
} else { |
|||
stock = false |
|||
} |
|||
this.$emit('replenishment', row, stock) |
|||
} |
|||
}, |
|||
filters: { |
|||
filterStockState(val, row) { |
|||
switch (val) { |
|||
case 'NORMAL': |
|||
return '正常'; |
|||
break; |
|||
case 'OUT_OF_STOCK': |
|||
return '全部售罄'; |
|||
break; |
|||
case 'ALERT': |
|||
return row.alertCount + '个缺货,' + row.soldoutCount + '个售罄'; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.tableContainer { |
|||
background: #fff; |
|||
|
|||
.btns { |
|||
margin-bottom: 10px; |
|||
} |
|||
} |
|||
|
|||
header { |
|||
width: 100%; |
|||
align-items: center; |
|||
display: flex; |
|||
padding: 10px; |
|||
border-bottom: 1px solid #ddd; |
|||
|
|||
.smnallbtns { |
|||
padding-left: 20px; |
|||
flex: 1; |
|||
display: flex; |
|||
|
|||
.item { |
|||
padding-right: 20px; |
|||
display: flex; |
|||
} |
|||
} |
|||
} |
|||
</style> |
|||
|
@ -1,92 +1,104 @@ |
|||
<template> |
|||
<div class="formContainer"> |
|||
<el-form |
|||
ref="ruleForm" |
|||
:inline="true" |
|||
:model="dataFormInner" |
|||
class="demo-form-inline" |
|||
label-position="right" |
|||
label-width="100px" |
|||
> |
|||
<div> |
|||
<el-form-item label="设备名称"> |
|||
<el-input v-model="dataFormInner.query" placeholder="公司名称"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="设备编号"> |
|||
<el-input v-model="dataFormInner.id" placeholder="设备编号"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="设备状态"> |
|||
<el-select |
|||
:clearable="true" |
|||
v-model="dataFormInner.active" |
|||
:value="''" |
|||
placeholder="设备状态" |
|||
> |
|||
<el-option label="在线" :value="true"></el-option> |
|||
<el-option label="离线" :value="false"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
</div> |
|||
<div> |
|||
<el-form-item label="场地"> |
|||
<el-select v-model="dataFormInner.locationId" placeholder="场地" :clearable="true"> |
|||
<el-option :key="item.id" v-for="item in locations" :label="item.name" :value="item.id"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="分组"> |
|||
<el-select v-model="dataFormInner.groupId" placeholder="分组" :clearable="true"> |
|||
<el-option |
|||
:key="item.id" |
|||
v-for="item in deviceGroups" |
|||
:label="item.name" |
|||
:value="item.id" |
|||
></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
<div class="formContainer"> |
|||
<el-form |
|||
ref="ruleForm" |
|||
:inline="true" |
|||
:model="dataFormInner" |
|||
class="demo-form-inline" |
|||
label-position="right" |
|||
label-width="100px" |
|||
> |
|||
<div> |
|||
<el-form-item label="设备名称"> |
|||
<el-input v-model="dataFormInner.query" placeholder="公司名称"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="设备编号"> |
|||
<el-input v-model="dataFormInner.id" placeholder="设备编号"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="设备状态"> |
|||
<el-select |
|||
:clearable="true" |
|||
v-model="dataFormInner.active" |
|||
:value="''" |
|||
placeholder="设备状态" |
|||
> |
|||
<el-option label="在线" :value="true"></el-option> |
|||
<el-option label="离线" :value="false"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="类型"> |
|||
<el-select :clearable="true" v-model="dataFormInner.typeId" placeholder="类型"> |
|||
<el-option |
|||
:key="item.id" |
|||
v-for="item in deviceTypes" |
|||
:label="item.name" |
|||
:value="item.id" |
|||
></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item style="padding-left:30px"> |
|||
<!-- <el-button type="default" @click="resetForm1('ruleForm')">重置</el-button> --> |
|||
<el-button type="primary" @click="$emit('search',dataFormInner)">查询</el-button> |
|||
</el-form-item> |
|||
</div> |
|||
</el-form> |
|||
</div> |
|||
<el-form-item label="货道状态" v-if="cargo"> |
|||
<el-select :clearable="true" v-model="dataFormInner.stockState" placeholder="类型"> |
|||
<el-option label="正常" value="NORMAL"></el-option> |
|||
<el-option label="缺货" value="OUT_OF_STOCK"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
</div> |
|||
<div> |
|||
<el-form-item label="场地"> |
|||
<el-select v-model="dataFormInner.locationId" placeholder="场地" :clearable="true"> |
|||
<el-option :key="item.id" v-for="item in locations" :label="item.name" |
|||
:value="item.id"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="分组"> |
|||
<el-select v-model="dataFormInner.groupId" placeholder="分组" :clearable="true"> |
|||
<el-option |
|||
:key="item.id" |
|||
v-for="item in deviceGroups" |
|||
:label="item.name" |
|||
:value="item.id" |
|||
></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="类型"> |
|||
<el-select :clearable="true" v-model="dataFormInner.typeId" placeholder="类型"> |
|||
<el-option |
|||
:key="item.id" |
|||
v-for="item in deviceTypes" |
|||
:label="item.name" |
|||
:value="item.id" |
|||
></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
|
|||
|
|||
<el-form-item style="padding-left:30px"> |
|||
<!-- <el-button type="default" @click="resetForm1('ruleForm')">重置</el-button> --> |
|||
<el-button type="primary" @click="$emit('search',dataFormInner)">查询</el-button> |
|||
</el-form-item> |
|||
</div> |
|||
</el-form> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
import { mapState, mapActions } from "vuex"; |
|||
import props1 from "./mixins/props.js"; |
|||
export default { |
|||
mixins: [props1], |
|||
data() { |
|||
return { |
|||
dataFormInner: {} |
|||
import {mapState, mapActions} from "vuex"; |
|||
import props1 from "./mixins/props.js"; |
|||
|
|||
export default { |
|||
mixins: [props1], |
|||
data() { |
|||
return { |
|||
dataFormInner: {} |
|||
}; |
|||
}, |
|||
computed: { |
|||
...mapState({ |
|||
deviceTypes: state => state.common.deviceTypes, |
|||
locations: state => state.common.locations, |
|||
deviceGroups: state => state.common.deviceGroups |
|||
}) |
|||
}, |
|||
mounted() { |
|||
this.getDeviceTypes(); |
|||
this.getLocations(); |
|||
this.getDeviceGroups(); |
|||
}, |
|||
methods: { |
|||
...mapActions(["getDeviceTypes", "getLocations", "getDeviceGroups"]) |
|||
} |
|||
}; |
|||
}, |
|||
computed: { |
|||
...mapState({ |
|||
deviceTypes: state => state.common.deviceTypes, |
|||
locations: state => state.common.locations, |
|||
deviceGroups: state => state.common.deviceGroups |
|||
}) |
|||
}, |
|||
mounted() { |
|||
this.getDeviceTypes(); |
|||
this.getLocations(); |
|||
this.getDeviceGroups(); |
|||
}, |
|||
methods: { |
|||
...mapActions(["getDeviceTypes", "getLocations", "getDeviceGroups"]) |
|||
} |
|||
}; |
|||
</script> |
|||
|
|||
|
@ -0,0 +1,15 @@ |
|||
<template> |
|||
<div> |
|||
分润设置 |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: "index" |
|||
} |
|||
</script> |
|||
|
|||
<style rel="stylesheet/scss" lang="scss" scoped> |
|||
|
|||
</style> |
@ -0,0 +1,15 @@ |
|||
<template> |
|||
<div> |
|||
渠道详情 |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: "channelDetails" |
|||
} |
|||
</script> |
|||
|
|||
<style rel="stylesheet/scss" lang="scss" scoped> |
|||
|
|||
</style> |
@ -0,0 +1,309 @@ |
|||
<template> |
|||
<div class="valueAddedAtatistics"> |
|||
<div class="row"> |
|||
<span>增值渠道:</span> |
|||
<el-select v-model="params.channelId" @change="selChange" clearable placeholder="请选择"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option v-for="item in channel" :key="item.id" :label="item.name" :value="item.id"></el-option> |
|||
</el-select> |
|||
|
|||
<div class="item1"> |
|||
<div :class="`item ${type=='today'?'active':'none'}`" @click="selectTime('today')">今日</div> |
|||
<div :class="`item ${type=='week'?'active':'none'}`" @click="selectTime('week')">本周</div> |
|||
<div :class="`item ${type=='mouth'?'active':'none'}`" @click="selectTime('mouth')">本月</div> |
|||
<div :class="`item ${type=='cumulative'?'active':'none'}`" @click="selectTime('cumulative')">累计</div> |
|||
</div> |
|||
<div class="item2"> |
|||
<el-date-picker |
|||
style="width:250px;" |
|||
v-model="dates" |
|||
type="daterange" |
|||
range-separator="至" |
|||
start-placeholder="开始" |
|||
end-placeholder="结束" |
|||
@change="dateChange" |
|||
></el-date-picker> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="profile"> |
|||
<div class="item"> |
|||
<div class="strong">{{summary.income==null?'0':summary.income}} 元</div> |
|||
<div class="small">收入</div> |
|||
</div> |
|||
<div class="item"> |
|||
<div class="strong">{{summary.sales==null?'0':summary.sales}} 元</div> |
|||
<div class="small">销售额</div> |
|||
</div> |
|||
<div class="item"> |
|||
<div class="strong">{{summary.orders==null?'0':summary.orders}} 单</div> |
|||
<div class="small">订单数</div> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
<div class="table"> |
|||
<el-table |
|||
:data="listData" |
|||
style="width: 100%"> |
|||
<el-table-column |
|||
prop="date" |
|||
label="增值渠道" |
|||
width="180"> |
|||
<template slot-scope="scope"> |
|||
<span>{{scope.row.type |filterType}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="deviceId" |
|||
label="设备ID" |
|||
width="180"> |
|||
</el-table-column> |
|||
|
|||
<el-table-column |
|||
prop="totalQuantity" |
|||
label="商品数" |
|||
width="180"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="orderTotal" |
|||
label="金额" |
|||
width="180"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="locationName" |
|||
label="场地名称" |
|||
width="180"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="场地地址"> |
|||
<template slot-scope="scope"> |
|||
{{scope.row.province + scope.row.city + scope.row.district + scope.row.street}} |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="createdDate" |
|||
label="下单时间"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="操作"> |
|||
<template slot-scope="scope"> |
|||
<span @click="itemDetail(scope.row.id)" style="color: #409EFF; cursor: pointer;">详情</span> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
</div> |
|||
|
|||
<div class="pagination"> |
|||
<el-pagination |
|||
background |
|||
:page-size="params.size" |
|||
layout="prev, pager, next" |
|||
:total="count" |
|||
@current-change="currentChange" |
|||
> |
|||
</el-pagination> |
|||
</div> |
|||
|
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import {getToday, getLastWeek, getLastMonth, dateFormate} from "@/utils/date"; |
|||
import {GET_SUMMARY, GET_LIST_ORDERS, GET_SELECT,GET_ORDERS_COUNT} from '@/api/valueAddedManagement'; |
|||
import moment from 'moment'; |
|||
import {pageSize} from '../../../config'; |
|||
|
|||
|
|||
|
|||
export default { |
|||
name: "index", |
|||
data() { |
|||
return { |
|||
type: "cumulative", |
|||
value4: '', |
|||
channel: [], |
|||
params: { |
|||
channelId: '', |
|||
start: '', |
|||
end: '', |
|||
form: 0, |
|||
size:pageSize |
|||
}, |
|||
dates: [], |
|||
listData: [], |
|||
summary:{}, |
|||
count:0 |
|||
} |
|||
}, |
|||
mounted() { |
|||
GET_SELECT().then(res => { |
|||
this.channel = res; |
|||
}); |
|||
this.get_list(); |
|||
}, |
|||
methods: { |
|||
|
|||
get_list() { |
|||
GET_LIST_ORDERS({...this.params}).then(res => { |
|||
res.map(item => { |
|||
item.createdDate = moment(item.createdDate).format('YYYY-MM-DD HH:mm:ss') |
|||
}); |
|||
this.listData = res; |
|||
}); |
|||
|
|||
GET_SUMMARY({...this.params}).then(res=>{ |
|||
this.summary = res; |
|||
}); |
|||
|
|||
|
|||
GET_ORDERS_COUNT({...this.params}).then(res=>{ |
|||
this.count =res; |
|||
}) |
|||
}, |
|||
selChange(val) { |
|||
this.params = { |
|||
...this.params, |
|||
channelId: val |
|||
}; |
|||
this.get_list(); |
|||
}, |
|||
selectTime(val) { |
|||
this.type = val; |
|||
let start, end; |
|||
this.dates = []; |
|||
if (this.type == "today") { |
|||
start = getToday().start; |
|||
end = getToday().end; |
|||
} |
|||
if (this.type == "week") { |
|||
start = getLastWeek().start; |
|||
end = getLastWeek().end; |
|||
} |
|||
if (this.type == "mouth") { |
|||
start = getLastMonth().start; |
|||
end = getLastMonth().end; |
|||
} |
|||
|
|||
if (this.type == 'cumulative') { |
|||
start = ''; |
|||
end = ''; |
|||
} |
|||
|
|||
this.params = { |
|||
...this.params, |
|||
start, |
|||
end, |
|||
}; |
|||
this.get_list(); |
|||
}, |
|||
dateChange(value) { |
|||
if (value) { |
|||
this.params = { |
|||
...this.params, |
|||
start:dateFormate(value[0]), |
|||
end:dateFormate(value[1]) |
|||
}; |
|||
this.get_list(); |
|||
} else { |
|||
this.selectTime("today"); |
|||
} |
|||
|
|||
}, |
|||
|
|||
/** |
|||
* 翻页 |
|||
*/ |
|||
currentChange(res) { |
|||
this.params = { |
|||
...this.params, |
|||
from: parseInt(res - 1) * this.params.size, |
|||
size: pageSize, |
|||
}; |
|||
this.get_list() |
|||
}, |
|||
|
|||
itemDetail(id){ |
|||
this.$router.push('/advertisingManagement/orderDetails?id='+id); |
|||
} |
|||
}, |
|||
filters: { |
|||
filterType(val) { |
|||
switch (val) { |
|||
case "QINGQU": |
|||
return '情趣用品'; |
|||
break; |
|||
case "TOURISM": |
|||
return '旅游商品'; |
|||
break; |
|||
case "PINTUAN": |
|||
return '拼团商城'; |
|||
break; |
|||
case "TECHAN": |
|||
return '平价特产'; |
|||
break; |
|||
case '': |
|||
return ''; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style rel="stylesheet/scss" lang="scss" scoped> |
|||
.valueAddedAtatistics { |
|||
padding: 20px; |
|||
background: #fff; |
|||
|
|||
.row { |
|||
display: flex; |
|||
align-items: center; |
|||
} |
|||
|
|||
.item1 { |
|||
width: 220px; |
|||
|
|||
display: inline-block; |
|||
margin-left: 50px; |
|||
|
|||
.item { |
|||
display: inline-block; |
|||
text-align: center; |
|||
margin-top: 10px; |
|||
margin-left: 5px; |
|||
margin-right: 15px; |
|||
padding-bottom: 5px; |
|||
cursor: pointer; |
|||
} |
|||
|
|||
.active { |
|||
border-bottom: 2px solid #409EFF; |
|||
} |
|||
} |
|||
|
|||
.profile { |
|||
display: flex; |
|||
justify-content: space-around; |
|||
margin: 50px 0; |
|||
border-bottom: 1px solid #ddd; |
|||
padding-bottom: 20px; |
|||
|
|||
.item { |
|||
width: 100%; |
|||
text-align: center; |
|||
border-right: 1px solid #ddd; |
|||
|
|||
&:last-child { |
|||
border-right: none; |
|||
} |
|||
|
|||
.strong { |
|||
margin-bottom: 10px; |
|||
font-size: 20px; |
|||
font-weight: bolder; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,155 @@ |
|||
<template> |
|||
<div class="table"> |
|||
|
|||
<h4>渠道详情</h4> |
|||
<div class="table-layout"> |
|||
|
|||
<el-row> |
|||
<el-col :span="5" class="table-cell-title">增值渠道</el-col> |
|||
<el-col :span="5" class="table-cell-title">设备编号</el-col> |
|||
<el-col :span="4" class="table-cell-title">设备类型</el-col> |
|||
<el-col :span="4" class="table-cell-title">使用场地</el-col> |
|||
<el-col :span="6" class="table-cell-title">使用地址</el-col> |
|||
</el-row> |
|||
<el-row> |
|||
<el-col :span="5" class="table-cell">{{details.type|filterType}}</el-col> |
|||
<el-col :span="5" class="table-cell">{{details.deviceId}}</el-col> |
|||
<el-col :span="4" class="table-cell">{{details.deviceTypeName}}</el-col> |
|||
<el-col :span="4" class="table-cell">{{details.locationName}}</el-col> |
|||
<el-col :span="6" class="table-cell">{{details.province + details.city + details.district + details.street}}</el-col> |
|||
</el-row> |
|||
</div> |
|||
|
|||
|
|||
<h4>费用明细</h4> |
|||
<div class="table-layout"> |
|||
|
|||
<el-row> |
|||
<el-col :span="6" class="table-cell-title">商品数量</el-col> |
|||
<el-col :span="6" class="table-cell-title">支付方式</el-col> |
|||
<el-col :span="6" class="table-cell-title">订单总价</el-col> |
|||
<el-col :span="6" class="table-cell-title">支付时间</el-col> |
|||
</el-row> |
|||
<el-row> |
|||
<el-col :span="6" class="table-cell">{{details.totalQuantity}}</el-col> |
|||
<el-col :span="6" class="table-cell">{{details.paymentGateway}}</el-col> |
|||
<el-col :span="6" class="table-cell">{{details.orderTotal}}</el-col> |
|||
<el-col :span="6" class="table-cell">{{details.createdDate}}</el-col> |
|||
</el-row> |
|||
</div> |
|||
|
|||
<h4>商品数据</h4> |
|||
<div> |
|||
<el-table |
|||
border |
|||
:data="details.items" |
|||
style="width: 100%"> |
|||
<el-table-column |
|||
label="图片" |
|||
width="180"> |
|||
<template slot-scope="scope"> |
|||
<img :src="scope.row.productImage" width="100" height="100" alt=""> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="productName" |
|||
label="商品名称"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="price" |
|||
label="单价"> |
|||
</el-table-column> |
|||
|
|||
<el-table-column |
|||
prop="quantity" |
|||
label="数量"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="total" |
|||
label="总价"> |
|||
</el-table-column> |
|||
</el-table> |
|||
</div> |
|||
|
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import {GET_LIST_ORDERS_DETAIL} from '@/api/valueAddedManagement'; |
|||
import moment from 'moment'; |
|||
|
|||
export default { |
|||
name: "orderDetails", |
|||
data(){ |
|||
return{ |
|||
details:{} |
|||
} |
|||
}, |
|||
mounted() { |
|||
GET_LIST_ORDERS_DETAIL({id:this.$route.query.id}).then(res=>{ |
|||
res.createdDate = moment(res.createdDate).format('YYYY-MM-DD HH:mm:ss'); |
|||
if (res.paymentGateway.toLowerCase() == 'wx') { |
|||
res.paymentGateway = '微信' |
|||
} else { |
|||
res.paymentGateway = '其他' |
|||
} |
|||
this.details =res |
|||
}) |
|||
}, |
|||
filters: { |
|||
filterType(val) { |
|||
switch (val) { |
|||
case "QINGQU": |
|||
return '情趣用品'; |
|||
break; |
|||
case "TOURISM": |
|||
return '旅游商品'; |
|||
break; |
|||
case "PINTUAN": |
|||
return '拼团商城'; |
|||
break; |
|||
case "TECHAN": |
|||
return '平价特产'; |
|||
break; |
|||
case '': |
|||
return ''; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style rel="stylesheet/scss" lang="scss" scoped> |
|||
.table{ |
|||
padding: 20px; |
|||
background: #fff; |
|||
} |
|||
.table-layout { |
|||
margin-top: 20px; |
|||
border-left: 1px solid #DCDFE6; |
|||
border-top: 1px solid #DCDFE6; |
|||
} |
|||
|
|||
.table-cell { |
|||
height: 60px; |
|||
line-height: 40px; |
|||
border-right: 1px solid #DCDFE6; |
|||
border-bottom: 1px solid #DCDFE6; |
|||
padding: 10px; |
|||
font-size: 14px; |
|||
color: #606266; |
|||
text-align: center; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
.table-cell-title { |
|||
border-right: 1px solid #DCDFE6; |
|||
border-bottom: 1px solid #DCDFE6; |
|||
padding: 10px; |
|||
background: #F2F6FC; |
|||
text-align: center; |
|||
font-size: 14px; |
|||
color: #303133; |
|||
} |
|||
</style> |
Loading…
Reference in new issue