Commit f80e3a62 by huangqy

同步下本地版本

parent b993e9e5
<template>
<div>
<el-tabs type="card" style="height: 50vh">
<el-tab-pane label="系统配置">
<el-card>
<el-form :model="sysForm" :inline="true">
<el-form-item label="仓库编号">
<el-input v-model="sysForm.storeCode" />
</el-form-item>
<el-form-item label="服务器">
<el-input v-model="sysForm.serverIp" />
</el-form-item>
<el-form-item label="端口">
<el-input v-model="sysForm.serverPort" />
</el-form-item>
<el-form-item label="是否切换">
<el-checkbox v-model="sysForm.isHide" />
</el-form-item>
<el-form-item>
<el-button type="success" @click="getConfig">刷新</el-button>
<el-button type="primary" @click="saveConfig">保存</el-button>
<el-button type="primary" @click="syncGoods">同步物资</el-button>
</el-form-item>
</el-form>
</el-card>
</el-tab-pane>
<el-tab-pane label="通道配置">
<el-card>
<div class="head-container">
<el-button class="filter-item" type="primary" style="float: right" @click="add">新增</el-button>
</div>
<el-table :data="channelList" border style="width: 100%;">
<el-table-column prop="stationId" label="通道号" align="center" width="100"/>
<el-table-column prop="readerIp" label="读写器" align="center">
<template #default="scope">
{{scope.row.readerIp + ':' + scope.row.readerPort }}
</template>
</el-table-column>
<el-table-column prop="gpioIp" label="GPIO" align="center">
<template #default="scope">
{{scope.row.gpioIp + ':' + scope.row.gpioPort }}
</template>
</el-table-column>
<el-table-column prop="ledIp" label="显示器" align="center">
<template #default="scope">
{{scope.row.ledIp + ':' + scope.row.ledPort }}
</template>
</el-table-column>
<el-table-column label="操作" width="200" align="center">
<template #default="scope">
<el-button type="primary" size="small" @click="edit(scope.row)">编辑</el-button>
<el-popconfirm title="你确定删除吗?" @confirm="removeDevice(scope.row)">
<template #reference>
<el-button type="danger" size="small">删除</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</el-card>
</el-tab-pane>
</el-tabs>
<el-dialog v-model="innerVisible" width="30%" :title="title">
<el-form label-position="right" size="large" label-width="90px" :model="formData">
<el-form-item label="通道号">
<el-input v-model="formData.stationId" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="读写器IP">
<el-input v-model="formData.readerIp"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="读写器端口">
<el-input v-model="formData.readerPort"/>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="读写器类型">
<el-select v-model="formData.readerType" style="width: 100%;">
<el-option :value="4" label="索利得四通道"></el-option>
<el-option :value="8" label="索利得八通道"></el-option>
</el-select>
</el-form-item>
<el-form-item label="天线功率">
<el-input v-model="formData.readerPower"/>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="GPIO的IP">
<el-input v-model="formData.gpioIp"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="GPIO端口">
<el-input v-model="formData.gpioPort"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="显示屏IP">
<el-input v-model="formData.ledIp"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="显示屏端口">
<el-input v-model="formData.ledPort"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="innerVisible = false">关闭</el-button>
<el-button type="primary" @click="handleSubmit">提交</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script>
import { defineComponent, ref, getCurrentInstance, toRefs, reactive } from 'vue'
import { postAction, getAction } from '@/api/manage'
import { ElMessage } from 'element-plus'
export default defineComponent({
setup() {
const channelList = ref([])
const title = ref('')
const sysForm = ref({})
const formData = ref({})
const innerVisible = ref(false)
const state = reactive({
url: {
getConfig: '/config/getConfig',
getDevice: '/device/getDevice',
updateDevice: '/device/updateDevice',
removeDevice: '/device/removeDevice',
saveDevice: '/device/saveDevice',
updateConfig: '/config/updateConfig',
saveConfig: '/config/saveConfig',
syncGoods: '/platform/syncGoods'
},
});
const loadData = (arg) => {
getConfig()
getDevice()
}
function getDevice() {
postAction(state.url.getDevice, {storeCode: JSON.parse(sessionStorage.getItem('storeInfo')).storeCode}).then(res => {
if (res.code !== 99200) return ElMessage.error(res.message);
channelList.value = res.data
})
}
function getConfig() {
postAction(state.url.getConfig, {}).then(res => {
if (res.code !== 99200) return ElMessage.error(res.message);
sysForm.value = {
id: res.data[0].id,
storeCode: res.data[0].storeCode,
serverIp: res.data[0].serverIp,
serverPort: res.data[0].serverPort
}
})
}
function syncGoods() {
getAction(state.url.syncGoods).then(res => {
if (res.code !== 99200) return ElMessage.error(res.message);
ElMessage.success(res.message)
})
}
function saveConfig() {
let url = sysForm.value.id ? state.url.updateConfig : state.url.saveConfig
postAction(url, sysForm.value).then(res => {
if (res.code !== 99200) return ElMessage.error(res.message);
ElMessage.success(res.message)
sessionStorage.setItem('storeInfo', JSON.stringify(sysForm.value))
})
}
function edit(row) {
title.value = '编辑通道'
formData.value = JSON.parse(JSON.stringify(row))
innerVisible.value = true
}
function add() {
title.value = '新增通道'
innerVisible.value = true
}
function handleSubmit() {
let url = formData.value.id ? state.url.updateDevice : state.url.saveDevice
formData.value.storeCode = JSON.parse(sessionStorage.getItem('storeInfo')).storeCode
postAction(url, formData.value).then(res => {
if (res.code !== 99200) return ElMessage.error(res.message);
ElMessage.success(res.message)
formData.value = {}
innerVisible.value = false
getDevice()
})
}
function removeDevice(row) {
postAction(state.url.removeDevice, {stationId: row.stationId, id: row.id}).then(res => {
if (res.code !== 99200) return ElMessage.error(res.message);
ElMessage.success(res.message)
getDevice()
})
}
return {
...toRefs(state),
sysForm,
formData,
innerVisible,
title,
channelList,
getConfig,
saveConfig,
add,
edit,
handleSubmit,
removeDevice,
loadData,
getDevice,
syncGoods
}
},
})
</script>
\ No newline at end of file
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<span>{{item.title}}</span> <span>{{item.title}}</span>
</span> </span>
</template> </template>
<component :is="item.template" :ref="item.template"></component> <component :is="item.template" :ref="item.template" @refresh="handleRefresh"></component>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</template> </template>
...@@ -19,8 +19,9 @@ import InTask from './InTask.vue' ...@@ -19,8 +19,9 @@ import InTask from './InTask.vue'
import OutTask from './OutTask.vue' import OutTask from './OutTask.vue'
import Query from './Query.vue' import Query from './Query.vue'
import Setting from './Setting.vue' import Setting from './Setting.vue'
import ChannelSetting from './ChannelSetting.vue'
export default defineComponent({ export default defineComponent({
components: { RFID, InTask, OutTask, Query, Setting }, components: { RFID, InTask, OutTask, Query, Setting, ChannelSetting },
setup() { setup() {
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const tabPosition = ref('bottom') const tabPosition = ref('bottom')
...@@ -30,14 +31,20 @@ export default defineComponent({ ...@@ -30,14 +31,20 @@ export default defineComponent({
{title: '出库作业', icon: 'iconfont icon-chukuguanli-', template: 'OutTask'}, {title: '出库作业', icon: 'iconfont icon-chukuguanli-', template: 'OutTask'},
{title: '手动设置', icon: 'iconfont icon-shezhi', template: 'Setting'}, {title: '手动设置', icon: 'iconfont icon-shezhi', template: 'Setting'},
{title: '查询', icon: 'iconfont icon-chaxun', template: 'Query'}, {title: '查询', icon: 'iconfont icon-chaxun', template: 'Query'},
{title: '通道配置', icon: 'iconfont icon-shezhi', template: 'ChannelSetting'},
] ]
function tabChange(index) { function tabChange(index) {
proxy.$refs[tabList[index].template][0].loadData() proxy.$refs[tabList[index].template][0].loadData()
} }
function handleRefresh() {
proxy.$refs.InTask[0].loadData()
proxy.$refs.OutTask[0].loadData()
}
return { return {
tabPosition, tabPosition,
tabList, tabList,
tabChange tabChange,
handleRefresh
} }
}, },
}) })
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
<el-table-column label="操作" width="200" align="center"> <el-table-column label="操作" width="200" align="center">
<template #default="scope"> <template #default="scope">
<el-button type="success" size="small" @click="activateBill(scope.row)" v-if="scope.row.activeState == 0" :disabled="lockState">激活</el-button> <el-button type="success" size="small" @click="activateBill(scope.row)" v-if="scope.row.activeState == 0" :disabled="lockState">激活</el-button>
<el-button type="warning" size="small" @click="deactivate(scope.row)" v-if="scope.row.activeState == 1">取消</el-button> <el-button type="warning" size="small" @click="deactivate(scope.row)" v-if="scope.row.activeState == 1">解除</el-button>
<el-button type="primary" size="small" :disabled="scope.row.activeState !== 2" @click="reportBill(scope.row)">上报</el-button> <el-button type="primary" size="small" :disabled="scope.row.activeState !== 2" @click="reportBill(scope.row)">上报</el-button>
</template> </template>
</el-table-column> </el-table-column>
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
</template> </template>
<el-table :data="modelList" border style="width: 100%;height: 78vh;"> <el-table :data="modelList" border style="width: 100%;height: 78vh;">
<el-table-column type="index" label="序号" width="60" align="center"/> <el-table-column type="index" label="序号" width="60" align="center"/>
<el-table-column prop="modelName" label="号型名称" align="center"/> <el-table-column prop="modelName" label="号型名称" align="center" width="180"/>
<el-table-column prop="planAmount" label="计划数量" align="center"/> <el-table-column prop="planAmount" label="计划数量" align="center"/>
<el-table-column prop="realAmount" label="实际数量" align="center"/> <el-table-column prop="realAmount" label="实际数量" align="center"/>
<el-table-column prop="writeAmount" label="手动修改数量" align="center"> <el-table-column prop="writeAmount" label="手动修改数量" align="center">
...@@ -282,7 +282,7 @@ export default defineComponent({ ...@@ -282,7 +282,7 @@ export default defineComponent({
}) })
} }
// 取消激活 // 解除激活
function deactivate(row) { function deactivate(row) {
row.activeState = 0 row.activeState = 0
postAction(state.url.activateBill, row).then(res => { postAction(state.url.activateBill, row).then(res => {
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
<el-table-column label="操作" width="200" align="center"> <el-table-column label="操作" width="200" align="center">
<template #default="scope"> <template #default="scope">
<el-button type="success" size="small" @click="activateBill(scope.row)" v-if="scope.row.activeState == 0" :disabled="lockState">激活</el-button> <el-button type="success" size="small" @click="activateBill(scope.row)" v-if="scope.row.activeState == 0" :disabled="lockState">激活</el-button>
<el-button type="warning" size="small" @click="deactivate(scope.row)" v-if="scope.row.activeState == 1">取消</el-button> <el-button type="warning" size="small" @click="deactivate(scope.row)" v-if="scope.row.activeState == 1">解除</el-button>
<el-button type="primary" size="small" :disabled="scope.row.activeState !== 2" @click="reportBill(scope.row)">上报</el-button> <el-button type="primary" size="small" :disabled="scope.row.activeState !== 2" @click="reportBill(scope.row)">上报</el-button>
</template> </template>
</el-table-column> </el-table-column>
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
</template> </template>
<el-table :data="modelList" border style="width: 100%;height: 78vh;"> <el-table :data="modelList" border style="width: 100%;height: 78vh;">
<el-table-column type="index" label="序号" width="60" align="center"/> <el-table-column type="index" label="序号" width="60" align="center"/>
<el-table-column prop="modelName" label="号型名称" align="center"/> <el-table-column prop="modelName" label="号型名称" align="center" width="180"/>
<el-table-column prop="planAmount" label="计划数量" align="center"/> <el-table-column prop="planAmount" label="计划数量" align="center"/>
<el-table-column prop="realAmount" label="实际数量" align="center"/> <el-table-column prop="realAmount" label="实际数量" align="center"/>
<el-table-column prop="writeAmount" label="手动修改数量" align="center"> <el-table-column prop="writeAmount" label="手动修改数量" align="center">
...@@ -282,7 +282,7 @@ export default defineComponent({ ...@@ -282,7 +282,7 @@ export default defineComponent({
}) })
} }
// 取消激活 // 解除激活
function deactivate(row) { function deactivate(row) {
row.activeState = 0 row.activeState = 0
postAction(state.url.activateBill, row).then(res => { postAction(state.url.activateBill, row).then(res => {
......
...@@ -8,62 +8,66 @@ ...@@ -8,62 +8,66 @@
<span>实时出入库数据</span> <span>实时出入库数据</span>
</div> </div>
</template> </template>
<div class="head-container"> <el-row :gutter="20">
<el-button type="primary" class="filter-item" style="float: right" @click="channelSetting">通道配置</el-button> <el-col :span="18">
</div> <el-table :data="item.logData" size="large" border style="width: 100%;" max-height="720">
<el-table :data="goodsData" border style="width: 100%;" max-height="850"> <el-table-column type="index" label="序号" width="70" align="center"/>
<el-table-column type="index" label="序号" width="60" /> <el-table-column prop="stationType" label="作业类型" align="center">
<el-table-column prop="name" label="品名" width="180" /> <template #default="scope">
<el-table-column prop="sizename" label="Address" /> {{ scope.row.stationType == 'IN' ? '入库' : '出库' }}
</template>
</el-table-column>
<el-table-column prop="goodsCode" label="代码" align="center"/>
<el-table-column prop="goodsName" label="品名" align="center"/>
<el-table-column prop="modelName" label="号型" align="center"/>
<el-table-column prop="amount" label="箱内数量" align="center"/>
<el-table-column prop="xhNo" label="箱号" align="center"/>
</el-table> </el-table>
</el-col>
<el-col :span="6">
<el-card class="box-card">
<template #header>
<div style="text-align: center;">
<span>识别总箱数</span>
</div>
</template>
<div class="text">{{ item.logData.length }}箱</div>
</el-card> </el-card>
</el-tab-pane> <el-divider />
</el-tabs> <el-card class="box-card">
<el-dialog v-model="dialogVisible" title="射频识别系统"> <template #header>
<el-tabs type="card"> <div style="text-align: center;">
<el-tab-pane label="系统配置"> <span>异常次数</span>
<el-card> </div>
<el-form :model="sysForm" :inline="true"> </template>
<el-form-item label="仓库编号"> <div class="text">{{ item.errNum }}次</div>
<el-input v-model="sysForm.storeCode" /> </el-card>
</el-form-item> </el-col>
<el-form-item label="服务器"> </el-row>
<el-input v-model="sysForm.serverIp" />
</el-form-item>
<el-form-item label="端口">
<el-input v-model="sysForm.serverPort" />
</el-form-item>
<el-form-item label="是否隐藏">
<el-checkbox v-model="sysForm.isHide" />
</el-form-item>
<el-form-item>
<el-button type="success" @click="getConfig">读取</el-button>
<el-button type="primary" @click="saveConfig">保存</el-button>
</el-form-item>
</el-form>
</el-card> </el-card>
</el-tab-pane>
<el-tab-pane label="通道配置">
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { defineComponent, ref, reactive, toRefs } from 'vue' import { defineComponent, ref, reactive, toRefs } from 'vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { postAction } from '@/api/manage' import { postAction, getAction } from '@/api/manage'
export default defineComponent({ export default defineComponent({
setup() { setup(props, {emit}) {
const channelList = ref([]); const channelList = ref([]);
const goodsData = ref([])
const sysForm = ref({}) const sysForm = ref({})
const dialogVisible = ref(false) const logData = ref([])
const title = ref('')
const state = reactive({ const state = reactive({
url: { url: {
getConfig: '/config/getConfig', getConfig: '/config/getConfig',
getDevice: '/device/getDevice', getDevice: '/device/getDevice',
openReader: '/rfid/openReader',
updateDevice: '/device/updateDevice',
removeDevice: '/device/removeDevice',
saveDevice: '/device/saveDevice',
updateConfig: '/config/updateConfig' updateConfig: '/config/updateConfig'
}, },
storeInfo: {}, storeInfo: {},
...@@ -71,6 +75,7 @@ export default defineComponent({ ...@@ -71,6 +75,7 @@ export default defineComponent({
lockReconnect: false lockReconnect: false
}); });
// websocket开始 // websocket开始
let websock = null let websock = null
function initWebSocket () { function initWebSocket () {
...@@ -87,7 +92,22 @@ export default defineComponent({ ...@@ -87,7 +92,22 @@ export default defineComponent({
}; };
// Websoket接收消息事件 // Websoket接收消息事件
const websocketOnmessage = (res) => { const websocketOnmessage = (res) => {
console.log(res.data); let message = JSON.parse(res.data)
if (message.noticeType == 2) {
let stationType = message.stationType
let noticeInfoList = JSON.parse(message.noticeInfo)
let newArr = noticeInfoList.map(v=>{
return {...v, stationType: stationType}
})
let channel = channelList.value.find(i => i.stationId == message.stationId)
channel.logData = [...channel.logData, ...newArr]
emit('refresh')
}
if (![0,2,3].includes(message.noticeType)) {
let channel = channelList.value.find(i => i.stationId == message.stationId)
channel.errNum = channel.errNum + 1
}
}; };
// Websoket连接错误事件 // Websoket连接错误事件
const websocketOnerror = (res) => { const websocketOnerror = (res) => {
...@@ -112,10 +132,25 @@ export default defineComponent({ ...@@ -112,10 +132,25 @@ export default defineComponent({
const loadData = () => { const loadData = () => {
if (sessionStorage.getItem('storeInfo')) { if (sessionStorage.getItem('storeInfo')) {
let config = JSON.parse(sessionStorage.getItem('storeInfo'))
sysForm.value = {
id: config.id,
storeCode: config.storeCode,
serverIp: config.serverIp,
serverPort: config.serverPort,
isHide: config.isHide
}
channelList.value = []
postAction(state.url.getDevice, {storeCode: JSON.parse(sessionStorage.getItem('storeInfo')).storeCode}).then(res => { postAction(state.url.getDevice, {storeCode: JSON.parse(sessionStorage.getItem('storeInfo')).storeCode}).then(res => {
if (res.code !== 99200) return ElMessage.error(res.message); if (res.code !== 99200) return ElMessage.error(res.message);
channelList.value = res.data res.data.map((item, index) => {
channelList.value.push(Object.assign({}, item, { logData: [], errNum: 0 }))
})
initWebSocket() initWebSocket()
getAction(state.url.openReader, {storeCode: JSON.parse(sessionStorage.getItem('storeInfo')).storeCode}).then(res => {
})
}) })
} else { } else {
postAction(state.url.getConfig, {}).then(res => { postAction(state.url.getConfig, {}).then(res => {
...@@ -126,6 +161,8 @@ export default defineComponent({ ...@@ -126,6 +161,8 @@ export default defineComponent({
} }
} }
function getConfig() { function getConfig() {
postAction(state.url.getConfig, {}).then(res => { postAction(state.url.getConfig, {}).then(res => {
if (res.code !== 99200) return ElMessage.error(res.message); if (res.code !== 99200) return ElMessage.error(res.message);
...@@ -150,13 +187,15 @@ export default defineComponent({ ...@@ -150,13 +187,15 @@ export default defineComponent({
dialogVisible.value = true dialogVisible.value = true
} }
loadData() loadData()
return { return {
...toRefs(state), ...toRefs(state),
channelList,
dialogVisible,
goodsData,
sysForm, sysForm,
channelList,
logData,
title,
loadData, loadData,
channelSetting, channelSetting,
getConfig, getConfig,
...@@ -171,7 +210,10 @@ export default defineComponent({ ...@@ -171,7 +210,10 @@ export default defineComponent({
.el-tabs--border-card >.el-tabs__content { .el-tabs--border-card >.el-tabs__content {
padding: 0px !important; padding: 0px !important;
} }
.text {
text-align: center;
font-size: 40px;
}
.head-container { .head-container {
padding-bottom: 10px; padding-bottom: 10px;
.filter-item { .filter-item {
......
...@@ -111,11 +111,13 @@ export default defineComponent({ ...@@ -111,11 +111,13 @@ export default defineComponent({
} }
const loadSelect = () => { const loadSelect = () => {
if (sessionStorage.getItem('storeInfo')) {
postAction(state.url.getBillPage, {pageNo: 1, pageSize: 50, type: 'IN', storeCode: JSON.parse(sessionStorage.getItem('storeInfo')).storeCode}).then(res => { postAction(state.url.getBillPage, {pageNo: 1, pageSize: 50, type: 'IN', storeCode: JSON.parse(sessionStorage.getItem('storeInfo')).storeCode}).then(res => {
if (res.code !== 99200) return ElMessage.error(res.message); if (res.code !== 99200) return ElMessage.error(res.message);
billList.value = res.data.records billList.value = res.data.records
}) })
} }
}
function changeStation(value) { function changeStation(value) {
if(value) { if(value) {
...@@ -154,6 +156,7 @@ export default defineComponent({ ...@@ -154,6 +156,7 @@ export default defineComponent({
function changeModel(value) { function changeModel(value) {
if (value) { if (value) {
formData.value.modelName = modelList.value.find(i => i.modelCode == formData.value.modelCode).modelName formData.value.modelName = modelList.value.find(i => i.modelCode == formData.value.modelCode).modelName
formData.value.skuCode = modelList.value.find(i => i.modelCode == formData.value.modelCode).skuCode
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论