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_id = 'test' |
||||
export const client_secret = "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://quxiaapi.renqilai.com"
|
||||
|
// export const BASE_API = "https://rapapi.renqilai.com/app/mock/39";
|
||||
export const pageSize = 20 |
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> |
||||
|
|
@ -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