Commit 6ab3fcbf by huangqy

改的是个啥啊,改了封面

parent 4544fde0
......@@ -13,7 +13,7 @@
"axios": "^0.21.1",
"core-js": "^3.6.5",
"echarts": "^4.9.0",
"element-ui": "^2.14.1",
"element-ui": "^2.15.7",
"lodash": "^4.17.21",
"nprogress": "^0.2.0",
"swiper": "^6.3.5",
......
No preview for this file type
......@@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>公用被装全寿命管理系统</title>
<title>金锭生产防伪管理系统</title>
</head>
<body>
<noscript>
......@@ -15,7 +15,7 @@
<!-- built files will be auto injected -->
<script>
window._CONFIG = {};
window._CONFIG['domianURL'] = 'http://192.168.3.130:10027';
window._CONFIG['domianURL'] = 'http://192.168.2.12:10030';
</script>
</body>
</html>
......@@ -271,15 +271,12 @@ i {
margin: 10px 0;
}
.el-divider--horizontal {
/* .el-divider--horizontal {
margin: 5px 0 !important;
}
} */
/* 分割线设置 */
.el-divider .el-divider__text {
font-size: 16px;
font-weight: 700;
color: #284527;
text-shadow: 0 0px 1px #2a770d;
font-size: 20px;
}
/* alert警告样式 */
.el-alert {
......
src/assets/images/loginbg.png

3.65 MB | W: | H:

src/assets/images/loginbg.png

2.1 MB | W: | H:

src/assets/images/loginbg.png
src/assets/images/loginbg.png
src/assets/images/loginbg.png
src/assets/images/loginbg.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/logo.png

26.4 KB | W: | H:

src/assets/logo.png

337 KB | W: | H:

src/assets/logo.png
src/assets/logo.png
src/assets/logo.png
src/assets/logo.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -121,6 +121,7 @@ export default {
font-weight: 500;
margin-left: 8px;
color: #fff;
line-height: 90px;
}
span {
display: block;
......@@ -140,6 +141,7 @@ export default {
font-weight: 500;
margin-left: 8px;
color: #fff;
line-height: 90px;
}
}
.active {
......
......@@ -57,9 +57,13 @@ import {
Collapse,
CollapseItem,
Image,
Calendar
Calendar,
Descriptions,
DescriptionsItem
} from 'element-ui'
// import element from 'element-ui'
Vue.use(Descriptions)
Vue.use(DescriptionsItem)
Vue.use(Step)
Vue.use(Steps)
Vue.use(Alert)
......
......@@ -2,6 +2,28 @@
基础数据
*/
const basicData = [
{
path: '/base/company',
name: 'base/company',
component: () => import(/* webpackChunkName: "index/data/room" */ '@/basicData/company')
},
{
path: '/base/product',
name: 'base/product',
component: () => import(/* webpackChunkName: "index/data/room" */ '@/basicData/product')
},
{
path: '/production/produce',
name: 'production/produce',
component: () => import(/* webpackChunkName: "index/data/room" */ '@/basicData/produce')
},
{
path: '/production/check',
name: 'production/check',
component: () => import(/* webpackChunkName: "index/data/room" */ '@/basicData/check')
},
// 基础数据
{
// 基础数据 - 物资数据同步
......@@ -29,12 +51,7 @@ const basicData = [
component: () => import(/* webpackChunkName: "index/data/room" */ '@/basicData/app')
},
{
// 基础数据 - 企业管理
path: '/data/company',
name: 'data/company',
component: () => import(/* webpackChunkName: "index/data/room" */ '@/basicData/company')
},
{
// 基础数据 - 企业管理
......
......@@ -13,11 +13,6 @@ const production = [
component: () => import(/* webpackChunkName: "index/audit/work" */ '@/production/list')
},
{
path: '/production/check',
name: 'production/check',
component: () => import(/* webpackChunkName: "index/audit/work" */ '@/production/check')
},
{
path: '/production/delivery',
name: 'production/delivery',
component: () => import(/* webpackChunkName: "index/audit/work" */ '@/production/delivery')
......
......@@ -22,6 +22,12 @@ const system = [
component: () => import(/* webpackChunkName: "index/system/role" */ '@/system/role')
},
{
// 系统管理 - 角色管理
path: '/system/log',
name: 'system/log',
component: () => import(/* webpackChunkName: "index/system/role" */ '@/system/log')
},
{
// 系统管理 - 授权管理
path: '/system/empower',
name: 'system/empower',
......
<template>
<div class="body" :style="'height:' + height + 'px'">
<div class="inner_border">
<el-card :style="'height:' + (height - 60) + 'px; overflow-y: auto; position:relative;'">
<el-form :inline="true" :model="searchData" size="medium" label-position="left">
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item class="mgl15" label="批次号 :">
<el-input
placeholder="请输入批次号"
v-model="searchData.batchNo"
/>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost class="mgl15" icon="search" @click="toQuery()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- 主表 -->
<el-row>
<el-col :span="14">
<el-card :style="'height:' + (height - 160) + 'px;overflow-y: auto;position:relative;'">
<el-table :data="data" ref="table" highlight-current-row @row-click="rowClick">
<el-table-column prop="batchNo" label="批次号" align="center" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="productName" label="产品名称" align="center" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="spec" label="成色" align="center" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="total" label="生产总数" align="center" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="checkedNum" label="已自检" align="center" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="waitingNum" label="待自检" align="center"></el-table-column>
<el-table-column label="操作" align="center" width="120">
<template slot-scope="scope">
<a-button type="primary" icon="edit" size="small" ghost @click="checkClick(scope.row)">自检</a-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
</el-card>
</el-col>
<el-col :span="10">
<el-card :style="'height:' + (height - 160) + 'px;overflow-y: auto;position:relative;'">
<el-table :data="modelData" size="medium">
<el-table-column prop="tagUid" label="UID" align="center" width="180" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="produceTime" label="生产日期" align="center" :show-overflow-tooltip="true">
<template slot-scope="scope">
{{ parseTime(scope.row.produceTime) }}
</template>
</el-table-column>
<el-table-column prop="hasChecked" label="自检状态" align="center">
<template slot-scope="scope">
<el-tag type="success" v-if="scope.row.hasChecked">已完成</el-tag>
<el-tag type="warning" v-else>未自检</el-tag>
</template>
</el-table-column>
<el-table-column prop="checkTime" label="自检时间" align="center" :show-overflow-tooltip="true">
<template slot-scope="scope">
{{ parseTime(scope.row.checkTime) }}
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@current-change="handleCurrentChange1"
:current-page="searchData1.pageNo"
:page-size="searchData1.pageSize"
layout="total, prev, pager, next"
:total="total1"
/>
</el-card>
</el-col>
</el-row>
</el-card>
<el-dialog :append-to-body="true" title="生产自检" :visible.sync="dialogVisible" @close="dialogClose()" width="1000px" :close-on-click-modal="false">
<el-card>
<div slot="header" class="clearfix">
<span style="font-size: 20px;flex: 1">已自检数: <span style="color: green;font-size: 20px;">{{ formData.checkedNum }} </span></span>
<span style="font-size: 20px;flex: 1">未自检数: <span style="color: red;font-size: 20px;">{{ formData.waitingNum }} </span></span>
</div>
<el-descriptions direction="vertical" border :column="5">
<el-descriptions-item label="批次号" :labelStyle="{'text-align': 'center'}" :contentStyle="{'text-align': 'center'}">{{ formData.batchNo }}</el-descriptions-item>
<el-descriptions-item label="产品名称" :labelStyle="{'text-align': 'center'}" :contentStyle="{'text-align': 'center'}">{{ formData.productName }}</el-descriptions-item>
<el-descriptions-item label="规格尺寸" :labelStyle="{'text-align': 'center'}" :contentStyle="{'text-align': 'center'}">{{ formData.spec }}</el-descriptions-item>
<el-descriptions-item label="材质" :labelStyle="{'text-align': 'center'}" :contentStyle="{'text-align': 'center'}">{{ formData.material }}</el-descriptions-item>
<el-descriptions-item label="重量" :labelStyle="{'text-align': 'center'}" :contentStyle="{'text-align': 'center'}">{{ formData.weight }}</el-descriptions-item>
</el-descriptions>
<el-divider style="margin-top: 30px;font-size: 20px;">日志列表</el-divider>
<div style="background-color: white;margin-top: 4px;">
<div style="max-height: 130px;overflow:auto">
<ul>
<li v-for="item in logList" style="margin-top: 8px;" :key="item.time + item.log">
<div style="display: flex;justify-content: center;align-items: center">
<div style="flex: 1;line-height: 16px; font-size: 16px;text-align: center">{{ item.log }}</div>
<div style="flex: 1;line-height: 16px; font-size: 16px;text-align: center">{{ item.time }}</div>
</div>
</li>
</ul>
</div>
</div>
</el-card>
<span slot="footer" class="dialog-footer">
<a-button @click="dialogVisible = false" ghost type="danger">取 消</a-button>
<a-button type="primary" ghost @click="bindBatch()" style="margin-left: 10px;" :loading="loading">自 检</a-button>
</span>
</el-dialog>
</div>
</div>
</template>
<script>
import initData from '../../mixins/initData'
export default {
mixins: [initData],
data () {
return {
filePath: window._CONFIG['domianURL'] + '/file/upload',
loading: false,
specTitle: '',
formData: {},
uid: '',
modelData: [],
searchData1: {
pageNo: 1,
pageSize: 10
},
total1: 0,
formDataRules: {},
fileList: [],
modelCode: '',
modelName: '',
logList: [],
editFormData: {},
editFormDataRules: {
goodsCode: [
{ required: true, message: '此项为必填项', trigger: 'blur' },
],
goodsName: [
{ required: true, message: '此项为必填项', trigger: 'blur' },
],
unit: [
{ required: true, message: '此项为必填项', trigger: 'blur' },
],
modelCode: [
{ required: true, message: '此项为必填项', trigger: 'blur' },
],
modelName: [
{ required: true, message: '此项为必填项', trigger: 'blur' },
]
}
}
},
created () {
this.$nextTick(() => {
this.init()
})
},
methods: {
beforeInit() {
this.url = '/api/batch/process/page'
return true
},
async init() {
if (!await this.beforeInit()) {
return
}
const { data: res } = await this.$axios.get(this.url, { params: this.searchData })
if (res.code !== 99200) return this.$message(res.message)
this.total = res.data.totalRows - 0
this.data = res.data.records
if (this.data.length > 0) {
this.$refs.table.setCurrentRow(this.data[0]);
this.searchData1.batchId = this.data[0].batchId
this.initModel()
}
},
async initModel() {
const { data: res } = await this.$axios.get('/api/tag/page', { params: this.searchData1 })
if (res.code != 99200) return this.$message.error(res.message)
this.total1 = res.data.totalRows - 0
this.modelData = res.data.records
},
rowClick(row) {
this.searchData1.batchId = row.batchId
this.initModel()
},
checkClick(row) {
this.websock = new WebSocket('ws://127.0.0.1:9618');
this.websock.onopen = this.websocketOnopen;
this.websock.onerror = this.websocketOnerror;
this.websock.onmessage = this.websocketOnmessage;
this.websock.onclose = this.websocketOnclose;
this.formData = row
this.dialogVisible = true
},
dialogClose() {
this.logList = []
this.websock.close()
this.init()
},
handleCurrentChange1(val) {
this.searchData1.pageNo = val
this.initModel()
},
handleSizeChange1 (val) {
this.searchData1.pageSize = val
this.initModel()
},
websocketOnopen(e) {
this.logList.unshift({time: this.parseTime(new Date()), log: 'WebSocket连接建立' })
},
websocketOnerror: function (e) {
console.log("WebSocket连接发生错误");
},
websocketOnclose: function (e) {
console.log("WebSocket连接已关闭");
},
websocketOnmessage(e) {
var backMessObj = JSON.parse(e.data);
console.log(backMessObj)
this.loading = false
if (backMessObj.Cmd === 1){
this.uid = backMessObj.Data
this.websock.send(JSON.stringify({Cmd: 5}))
}
else if (backMessObj.Cmd === 3){
this.tagCheck(backMessObj.Data.Data)
}
else if (backMessObj.Cmd === 5){
let str = backMessObj.Data.replace(/\n/g, ',')
var obj = str.substr(0, str.length -1)
var index = obj.lastIndexOf("编")
obj = obj.substring(index+3, obj.length)
var sendObj = { Uid: this.uid, Data: obj }
this.websock.send(JSON.stringify({Cmd: 3, Data: sendObj}))
}
else if (backMessObj.Cmd === 254) {
if (backMessObj.Data.Code === 1004) {
setTimeout(() => {
this.websock.send(JSON.stringify({Cmd: 1, Data: ''}))
}, 1000)
} else {
this.logList.unshift({time: this.parseTimes(new Date()), log: backMessObj.Data.Message })
}
}
},
async tagCheck(productCode) {
const { data: res } = await this.$axios.post('/api/tag/check', { tagUid: this.uid, productCode: productCode })
if (res.code != 99200) return this.$message.error(res.message)
this.logList.unshift({time: this.parseTimes(new Date()), log: '自检成功' })
this.findNumber()
},
async findNumber() {
const { data: res } = await this.$axios.get(this.url, { params: {batchId: this.searchData1.batchId} })
if (res.code !== 99200) return this.$message(res.message)
this.formData = res.data.records[0]
setTimeout(() => {
this.websock.send(JSON.stringify({Cmd: 1, Data: ''}))
},1000)
},
parseTimes(time) {
if (time) {
var date = new Date(time)
var year = date.getFullYear()
/* 在日期格式中,月份是从0开始的,因此要加0
* 使用三元表达式在小于10的前面加0,以达到格式统一 如 09:11:05
* */
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
// 拼接
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
} else {
return ''
}
},
bindBatch() {
this.loading = true
this.websock.send(JSON.stringify({Cmd: 1, Data: ''}))
}
}
}
</script>
<style scoped lang='less'>
.clearfix {
display: flex;
align-items: center;
text-align: center;
}
</style>
......@@ -12,7 +12,7 @@
<el-input
clearable
placeholder="请输入企业名称"
v-model="searchData.businessName"
v-model="searchData.name"
/>
</el-form-item>
<el-form-item>
......@@ -28,33 +28,15 @@
</el-form-item>
</el-col>
<el-form-item>
<a-upload
name="file"
:multiple="false"
:showUploadList="false"
action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
@change="handleUpload"
>
<a-button type="primary" icon="upload" ghost round> 导入 </a-button>
</a-upload>
</el-form-item>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="orgName" label="企业名称" align="center" />
<el-table-column prop="orgCode" label="企业代码" align="center" />
<el-table-column prop="orgFullName" label="企业全称" align="center" />
<el-table-column prop="contact" label="联系人" align="center" />
<el-table-column prop="phone" label="电话" align="center" />
<el-table-column label="状态" align="center" >
<template slot-scope="scope">
{{ scope.row.statusFlag === 1 ? '启用' : '禁用' }}
</template>
</el-table-column>
<!-- <el-table-column prop="remark" label="备注" align="center" :show-overflow-tooltip="true"/> -->
<el-table-column prop="name" label="企业名称" align="center" />
<!-- <el-table-column prop="bizType" label="企业类型" align="center" /> -->
<el-table-column prop="shortName" label="企业简称" align="center" />
<el-table-column prop="remark" label="备注" align="center" :show-overflow-tooltip="true"/>
<el-table-column label="操作" align="center" width="280">
<template slot-scope="scope">
<a-button
......@@ -78,7 +60,7 @@
:current-page="searchData.pageNo"
:page-sizes="[10, 20, 30, 40]"
:page-size="searchData.pageSize"
layout="total, sizes, prev, pager, next, jumper"
layout="total, prev, pager, next, jumper"
:total="total"
/>
......@@ -99,59 +81,28 @@
<el-input
clearable
placeholder="请输入企业名称"
v-model="formData.orgName"
v-model="formData.name"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="企业编码 :" prop="orgCode">
<el-form-item label="企业简称 :">
<el-input
clearable
placeholder="请输入企业编码"
v-model="formData.orgCode"
placeholder="请输入企业简称"
v-model="formData.shortName"
/>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="企业全称 :">
<el-input
clearable
placeholder="请输入企业全称"
v-model="formData.orgFullName"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="状态 :">
<el-select v-model="formData.statusFlag" style="width: 100%;" :disabled="title === '修改生产企业'">
<el-option label="启用" :value="1"/>
<el-option label="禁用" :value="2"/>
<!-- <el-col :span="11">
<el-form-item label="企业类型 :">
<el-select v-model="formData.bizType" style="width: 100%;">
<el-option label="1" :value="1"/>
<el-option label="2" :value="2"/>
</el-select>
</el-form-item>
</el-col>
</el-col> -->
</el-row>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="联系人 :">
<el-input
clearable
placeholder="请输入联系人"
v-model="formData.contact"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="电话 :">
<el-input
clearable
placeholder="请输入电话"
v-model="formData.phone"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="备注信息 :">
<el-input
......@@ -179,24 +130,9 @@ import initData from '../../mixins/initData'
export default {
mixins: [initData],
data () {
let checkCode = (rule, value, cb) => {
if (value.length === 8) {
return cb()
}
cb(new Error('企业代码长度必须为8位'))
}
return {
formData: {
orgType: 100,
orgParentId: '1480804695504134146',
orgParentIds: '[-1, 1480804695504134146]'
},
formDataRules: {
orgCode: [
{ required: true, message: '此项为必填项', trigger: 'blur' },
{ validator: checkCode, trigger: 'blur' },
]
}
formData: {},
formDataRules: {}
}
},
......@@ -208,8 +144,7 @@ export default {
methods: {
beforeInit() {
this.url = '/org/page'
this.searchData.orgType = 100
this.url = '/api/company/page'
return true
},
handleAdd() {
......@@ -217,39 +152,37 @@ export default {
this.dialogVisible = true
},
dialogClose() {
this.formData = {
orgType: 100,
orgParentId: '1480804695504134146',
orgParentIds: '[-1, 1480804695504134146]'
}
this.formData = {}
this.$refs.fromRef.resetFields()
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return;
let url = '/org/add'
if (this.formData.orgId) {
url = '/org/edit'
let url = '/api/company'
if (this.formData.bizId) {
const { data: res } = await this.$axios.put(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
} else {
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
}
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
this.dialogVisible = false
this.init()
})
},
editClickBtn(val) {
this.title = '修改生产企业'
this.title = '修改企业'
// 拷贝
const obj = JSON.parse(JSON.stringify(val))
this.dialogVisible = true
this.formData = obj
},
deleteClick (row) {
const url = '/org/delete'
const url = '/api/company'
const params = {
orgId: row.orgId
bizId: row.bizId
}
this.delete(url, params, this.init())
},
......@@ -259,7 +192,7 @@ export default {
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const { data: res } = await this.$axios.post(url, data)
const { data: res } = await this.$axios.delete(url, {data})
if (res.code === 99200) {
this.$message.success(res.message)
this.init()
......@@ -268,16 +201,6 @@ export default {
}
})
},
handleUpload(info) {
if (info.file.status !== 'uploading') {
console.log(info.file, info.fileList);
}
if (info.file.status === 'done') {
this.$message.success(`${info.file.name} 导入成功`);
} else if (info.file.status === 'error') {
this.$message.error(`${info.file.name} 导入失败.`);
}
}
}
}
</script>
......
// 基础数据 - 企业管理
<template>
<div class="body" :style="'height:' + height + 'px'">
<div class="inner_border">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item class="mgl15" label="批次号 :" >
<el-input
clearable
placeholder="请输入批次号"
v-model="searchData.batchNo"
/>
</el-form-item>
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="toQuery()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="handleAdd()" icon="plus">
新建
</a-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="batchNo" label="批次号" align="center" />
<el-table-column prop="productName" label="产品名称" align="center" />
<el-table-column prop="spec" label="规格尺寸" align="center" />
<el-table-column prop="material" label="材质" align="center" />
<el-table-column prop="weight" label="重量" align="center" />
<el-table-column prop="total" label="生产总数" align="center" />
<el-table-column prop="doneNum" label="已绑定数" align="center" />
<el-table-column label="是否初始化" align="center">
<template slot-scope="scope">
<el-tag type="success" v-if="scope.row.hasInit">已完成</el-tag>
<el-tag type="warning" v-else>进行中</el-tag>
</template>
</el-table-column>
<el-table-column label="绑定状态" align="center">
<template slot-scope="scope">
<el-tag type="success" v-if="scope.row.hasFinish">已绑定</el-tag>
<el-tag type="warning" v-else>绑定中</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="280">
<template slot-scope="scope">
<a-button
type="primary"
icon="arrow-down"
size="small"
ghost
v-if="scope.row.hasInit"
@click="bindData(scope.row)"
>绑定</a-button>
<a-button
type="primary"
icon="retweet"
size="small"
ghost
v-if="!scope.row.hasInit"
@click="produce(scope.row)"
>生产</a-button>
<a-button
type="primary"
style="margin-left: 5px"
icon="edit"
size="small"
ghost
@click="editClickBtn(scope.row)"
>编辑</a-button>
<a-button type="danger" icon="delete" style="margin-left: 6px;" ghost size="small" @click="deleteClick(scope.row)">删除</a-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-sizes="[10, 20, 30, 40]"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
<el-dialog
:append-to-body="true"
:title="title"
:visible.sync="dialogVisible"
@close="dialogClose()"
width="800px"
:close-on-click-modal="false"
>
<!-- 表单区域 -->
<el-form :model="formData" :rules="formDataRules" ref="fromRef" size="medium" style="border: 2px solid rgb(67, 167, 71);padding:20px;">
<el-card>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="产品名称 :">
<el-select v-model="formData.productId" filterable clearable style="width: 100%;" @change="changeProduct">
<el-option v-for="item in productList" :key="item.productId" :label="item.name" :value="item.productId">
<span style="float: left">{{ item.name }}</span>
<span style="float: right; color: #8492a6; font-size: 13px">{{ item.material }}</span>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="生产总数 :">
<el-input-number
style="width: 100%;"
:precision="0"
:max="9999"
v-model="formData.total"
/>
</el-form-item>
</el-col>
<!-- <el-col :span="11">
<el-form-item label="产品规格 :">
<el-select v-model="formData.specId" style="width: 100%;">
<el-option v-for="item in specList" :key="item.specId" :label="item.spec" :value="item.specId">
<span style="float: left">{{ item.spec }}</span>
<span style="float: right; color: #8492a6; font-size: 13px">{{ item.weight }}</span>
</el-option>
</el-select>
</el-form-item>
</el-col> -->
</el-row>
<!-- <el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="生产总数 :">
<el-input-number
style="width: 100%;"
:precision="0"
:max="9999"
v-model="formData.total"
/>
</el-form-item>
</el-col>
</el-row> -->
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<a-button @click="dialogVisible = false" type="danger" ghost>取 消</a-button>
<a-button type="primary" @click="subFormData()" ghost style="margin-left: 6px;">提 交</a-button>
</span>
</el-dialog>
<el-dialog :append-to-body="true" title="数据绑定" :visible.sync="bindVisible" @close="bindDialogClose()" width="1000px" :close-on-click-modal="false">
<el-card>
<div slot="header" class="clearfix">
<span style="font-size: 20px;flex: 1">生产总数: <span style="color: green;font-size: 20px;">{{ bindForm.total }} </span></span>
<span style="font-size: 20px;flex: 1">已绑定数量: <span style="color: red;font-size: 20px;">{{ bindForm.doneNum }} </span></span>
</div>
<el-descriptions direction="vertical" border :column="5">
<el-descriptions-item label="批次号" :labelStyle="{'text-align': 'center'}" :contentStyle="{'text-align': 'center'}">{{ bindForm.batchNo }}</el-descriptions-item>
<el-descriptions-item label="产品名称" :labelStyle="{'text-align': 'center'}" :contentStyle="{'text-align': 'center'}">{{ bindForm.productName }}</el-descriptions-item>
<el-descriptions-item label="规格尺寸" :labelStyle="{'text-align': 'center'}" :contentStyle="{'text-align': 'center'}">{{ bindForm.spec }}</el-descriptions-item>
<el-descriptions-item label="材质" :labelStyle="{'text-align': 'center'}" :contentStyle="{'text-align': 'center'}">{{ bindForm.material }}</el-descriptions-item>
<el-descriptions-item label="重量" :labelStyle="{'text-align': 'center'}" :contentStyle="{'text-align': 'center'}">{{ bindForm.weight }}</el-descriptions-item>
</el-descriptions>
<el-divider style="margin-top: 30px;font-size: 20px;">日志列表</el-divider>
<div style="background-color: white;margin-top: 4px;">
<div style="max-height: 130px;overflow:auto">
<ul>
<li v-for="item in logList" style="margin-top: 8px;" :key="item.time + item.log">
<div style="display: flex;justify-content: center;align-items: center">
<div style="flex: 1;line-height: 16px; font-size: 16px;text-align: center">{{ item.log }}</div>
<div style="flex: 1;line-height: 16px; font-size: 16px;text-align: center">{{ item.time }}</div>
</div>
</li>
</ul>
</div>
</div>
</el-card>
<span slot="footer" class="dialog-footer">
<a-button @click="bindVisible = false" ghost type="danger">取 消</a-button>
<a-button type="primary" ghost @click="bindBatch()" style="margin-left: 10px;" :loading="loading">绑 定</a-button>
</span>
</el-dialog>
</el-card>
</div>
</div>
</template>
<script>
import initData from '../../mixins/initData'
export default {
mixins: [initData],
data () {
return {
productList:[],
specList: [],
formData: {
specId: ''
},
newUid: '',
oldUid: '',
loading: false,
websock: null,
logList: [],
bindForm: {},
bindVisible: false,
formDataRules: {}
}
},
created () {
this.$nextTick(() => {
this.init()
})
},
methods: {
beforeInit() {
this.url = '/api/batch/page'
return true
},
handleAdd() {
this.title = '新增生产任务'
this.getProductList()
this.dialogVisible = true
},
async getProductList() {
const { data: res } = await this.$axios.get('/api/product')
if (!res.data) return this.$message.error(res.message)
this.productList = res.data
},
async changeProduct(value) {
this.formData.specId = ''
this.specList = []
if (value) {
const { data: res } = await this.$axios.get('/api/spec/getByProduct?productId=' + value)
if (!res.data) return this.$message.error(res.message)
this.specList = res.data
}
},
dialogClose() {
this.formData = {
specId: ''
}
this.$refs.fromRef.resetFields()
},
bindDialogClose() {
this.logList = []
this.websock.close()
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return;
let url = '/api/batch'
if (this.formData.batchId) {
const { data: res } = await this.$axios.put(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
} else {
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
}
this.dialogVisible = false
this.init()
})
},
editClickBtn(val) {
this.title = '修改生产任务'
// 拷贝
const obj = JSON.parse(JSON.stringify(val))
this.dialogVisible = true
this.formData = obj
},
deleteClick (row) {
const url = '/api/batch'
const params = {
batchId: row.batchId
}
this.delete(url, params, this.init())
},
delete (url, data, obj) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const { data: res } = await this.$axios.delete(url, {data})
if (res.code === 99200) {
this.$message.success(res.message)
this.init()
} else {
this.$message.error(res.message)
}
})
},
async produce(row) {
const { data: res } = await this.$axios.post('/api/batch/produce', {batchId: row.batchId})
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
this.init()
},
parseTime(time) {
if (time) {
var date = new Date(time)
var year = date.getFullYear()
/* 在日期格式中,月份是从0开始的,因此要加0
* 使用三元表达式在小于10的前面加0,以达到格式统一 如 09:11:05
* */
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
// 拼接
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
} else {
return ''
}
},
bindData(row) {
this.websock = new WebSocket('ws://127.0.0.1:9618');
this.websock.onopen = this.websocketOnopen;
this.websock.onerror = this.websocketOnerror;
this.websock.onmessage = this.websocketOnmessage;
this.websock.onclose = this.websocketOnclose;
this.bindForm = row
this.bindVisible = true
},
websocketOnopen(e) {
this.logList.unshift({time: this.parseTime(new Date()), log: 'WebSocket连接建立' })
},
websocketOnerror: function (e) {
console.log("WebSocket连接发生错误");
},
websocketOnclose: function (e) {
console.log("WebSocket连接已关闭");
},
websocketOnmessage(e) {
var backMessObj = JSON.parse(e.data);
console.log(backMessObj)
this.loading = false
if (backMessObj.Cmd == 2) {
// this.logList.unshift({time: this.parseTime(new Date()), log: '数据加密成功:' + JSON.stringify(backMessObj.Data) })
this.updateContent(backMessObj.Data.Access, backMessObj.Data.Data)
} else if (backMessObj.Cmd === 1){
if (this.oldUid !== this.newUid) {
this.logList.unshift({time: this.parseTime(new Date()), log: '读取到UID:' + backMessObj.Data })
}
this.updateUid(backMessObj.Data)
}
else if (backMessObj.Cmd === 4){
this.logList.unshift({time: this.parseTime(new Date()), log: '标签成功写入生产数据' })
this.bindForm.doneNum ++
this.oldUid = this.newUid
setTimeout(() => {
this.websock.send(JSON.stringify({Cmd: 1, Data: ''}))
}, 1000)
}
else if (backMessObj.Cmd === 254) {
if (backMessObj.Data.Code === 1004) {
setTimeout(() => {
this.websock.send(JSON.stringify({Cmd: 1, Data: ''}))
}, 1000)
} else {
this.logList.unshift({time: this.parseTime(new Date()), log: backMessObj.Data.Message })
}
}
},
async updateUid(uid) {
this.newUid = uid
if (this.newUid === this.oldUid) {
setTimeout(() => {
this.websock.send(JSON.stringify({Cmd: 1, Data: ''}))
}, 500)
} else {
const { data: res } = await this.$axios.post('/api/tag/updateUid', {batchId: this.bindForm.batchId, tagUid: uid})
if (!res.data) return this.$message.error(res.message)
this.bindForm.tagId = res.data.tagId
this.websock.send(JSON.stringify({Cmd: 2, Data: {Uid: uid, Data: res.data.content}}))
}
},
async updateContent(password, ciphertext) {
const { data: res } = await this.$axios.post('/api/tag/updateContent', {tagId: this.bindForm.tagId, password: password, ciphertext: ciphertext})
if (!res.data) return this.$message.error(res.message)
this.websock.send(JSON.stringify({Cmd: 4, Data: {Access: password, Data: res.data.content} }))
},
bindBatch() {
this.loading = true
this.websock.send(JSON.stringify({Cmd: 1, Data: ''}))
}
}
}
</script>
<style scoped lang='less'>
.clearfix {
display: flex;
align-items: center;
text-align: center;
}
</style>
<template>
<div class="body" :style="'height:' + height + 'px'">
<div class="inner_border">
<el-card :style="'height:' + (height - 60) + 'px; overflow-y: auto; position:relative;'">
<el-form :inline="true" :model="searchData" size="medium" label-position="left">
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item class="mgl15" label="产品名称 :">
<el-input
placeholder="请输入产品名称"
v-model="searchData.name"
/>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost class="mgl15" icon="search" @click="toQuery()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="handleAdd()" icon="plus">
新建
</a-button>
</el-form-item>
</el-col>
<!-- <el-form-item>
<a-button type="primary" ghost icon="plus" @click="handleAddSepc()" >
详细信息
</a-button>
</el-form-item> -->
</el-row>
</el-form>
<!-- 主表 -->
<!-- <el-row>
<el-col :span="12"> -->
<el-card :style="'height:' + (height - 160) + 'px;overflow-y: auto;position:relative;'">
<el-table :data="data" ref="productTable" highlight-current-row @row-click="rowClick">
<el-table-column type="index" label="序号" width="50" align="center"/>
<el-table-column prop="name" label="产品名称" align="center" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="mfBizName" label="生产企业名称" align="center" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="spec" label="规格尺寸" align="center"></el-table-column>
<el-table-column prop="material" label="材质" align="center"></el-table-column>
<el-table-column prop="weight" label="重量" align="center"></el-table-column>
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<a-button type="primary" icon="edit" size="small" ghost @click="editClick(scope.row)">编辑</a-button>
<a-button type="danger" icon="delete" size="small" ghost style="margin-left: 6px" @click="deleteProduct(scope.row)">删除</a-button>
<!-- <el-upload action="http://192.168.3.130:10026/file/upload" :limit="1" :data="{fileBucket: 'lcm', fileLocation: '3'}" :on-success="handleSuccess1" :show-file-list="false">
<a-button size="small" icon="upload" type="primary" ghost>上传</a-button>
</el-upload> -->
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
</el-card>
<!-- </el-col>
<el-col :span="12">
<el-card :style="'height:' + (height - 160) + 'px;overflow-y: auto;position:relative;'">
<el-table :data="modelData">
<el-table-column type="index" label="序号" width="50" align="center"/>
<el-table-column prop="spec" label="规格尺寸" align="center"></el-table-column>
<el-table-column prop="material" label="材质" align="center"></el-table-column>
<el-table-column prop="weight" label="重量" align="center"></el-table-column>
<el-table-column label="操作" align="center" width="180">
<template v-slot="scope">
<a-button type="primary" icon="edit" size="small" ghost @click="editSpec(scope.row)">编辑</a-button>
<a-button type="danger" icon="delete" size="small" ghost style="margin-left: 6px" @click="deleteClick(scope.row)">删除</a-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@current-change="handleCurrentChange1"
:current-page="searchData1.pageNo"
:page-size="searchData1.pageSize"
layout="total, prev, pager, next"
:total="total1"
/>
</el-card>
</el-col>
</el-row> -->
<el-dialog :append-to-body="true" :close-on-click-modal="false" :visible.sync="picVisible" title="图片预览" width="800px">
<img :src="picUrl" width="760" height="500"/>
<div slot="footer" class="dialog-footer">
<el-button type="info" plain @click="picVisible = false">关闭</el-button>
</div>
</el-dialog>
<el-dialog
:append-to-body="true"
:title="title"
:visible.sync="dialogVisible"
@close="dialogClose()"
width="800px"
:close-on-click-modal="false"
>
<!-- 表单区域 -->
<el-form :model="formData" ref="fromRef" style="border: 2px solid rgb(67, 167, 71);padding:20px;">
<el-card>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="产品名称 :">
<el-input
clearable
placeholder="请输入产品名称"
v-model="formData.name"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="生产企业 :">
<el-select v-model="formData.mfBizId" filterable placeholder="请选择生产企业" clearable style="width: 100%">
<el-option
v-for="item in mfBizList"
:key="item.bizId"
:label="item.shortName"
:value="item.bizId">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="规格尺寸 :">
<el-input
clearable
placeholder="请输入规格尺寸"
v-model="formData.spec"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="材质 :">
<el-input
clearable
placeholder="请输入材质"
v-model="formData.material"
/>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="重量 :">
<el-input
clearable
placeholder="请输入重量"
v-model="formData.weight"
/>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<a-button @click="dialogVisible = false" type="danger" ghost>取 消</a-button>
<a-button type="primary" @click="subFormData()" ghost style="margin-left: 6px;">提 交</a-button>
</span>
</el-dialog>
<el-dialog
:append-to-body="true"
:title="specTitle"
:visible.sync="specVisible"
@close="specDialogClose()"
width="800px"
:close-on-click-modal="false"
>
<!-- 表单区域 -->
<el-form :model="specFormData" ref="specForm" style="border: 2px solid rgb(67, 167, 71);padding:20px;">
<el-card>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="规格尺寸 :">
<el-input
clearable
placeholder="请输入规格尺寸"
v-model="specFormData.spec"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="材质 :">
<el-input
clearable
placeholder="请输入材质"
v-model="specFormData.material"
/>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="重量 :">
<el-input
clearable
placeholder="请输入重量"
v-model="specFormData.weight"
/>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<a-button @click="specVisible = false" type="danger" ghost>取 消</a-button>
<a-button type="primary" @click="submitSpecForm()" ghost style="margin-left: 6px;">提 交</a-button>
</span>
</el-dialog>
</el-card>
</div>
</div>
</template>
<script>
import initData from '../../mixins/initData'
export default {
mixins: [initData],
data () {
return {
filePath: window._CONFIG['domianURL'] + '/file/upload',
picVisible: false,
specVisible: false,
specTitle: '',
specFormData: {},
formData: {},
picUrl: '',
modelData: [],
mfBizList: [],
searchData1: {
pageNo: 1,
pageSize: 10
},
total1: 0,
formDataRules: {},
fileList: [],
modelCode: '',
modelName: '',
editFormData: {},
editFormDataRules: {
goodsCode: [
{ required: true, message: '此项为必填项', trigger: 'blur' },
],
goodsName: [
{ required: true, message: '此项为必填项', trigger: 'blur' },
],
unit: [
{ required: true, message: '此项为必填项', trigger: 'blur' },
],
modelCode: [
{ required: true, message: '此项为必填项', trigger: 'blur' },
],
modelName: [
{ required: true, message: '此项为必填项', trigger: 'blur' },
]
}
}
},
created () {
this.$nextTick(() => {
this.init()
})
},
methods: {
beforeInit() {
this.url = '/api/product/page'
return true
},
async init() {
if (!await this.beforeInit()) {
return
}
const { data: res } = await this.$axios.get(this.url, { params: this.searchData })
if (res.code !== 99200) return this.$message(res.message)
this.total = res.data.totalRows - 0
this.data = res.data.records
// if (this.data.length > 0) {
// this.$refs.productTable.setCurrentRow(this.data[0]);
// this.searchData1.productId = this.data[0].productId
// this.initModel()
// }
},
async initModel() {
const { data: res } = await this.$axios.get('/api/spec/page', { params: this.searchData1 })
if (res.code != 99200) return this.$message.error(res.message)
this.total1 = res.data.totalRows - 0
this.modelData = res.data.records
},
rowClick(row) {
// this.searchData1.productId = row.productId
// this.initModel()
},
handleAddSepc() {
this.specFormData = {
productId: this.searchData1.productId,
specId: '',
spec: '',
weight: '',
material: ''
}
this.specTitle = '详细信息'
this.specVisible = true
},
handleAdd() {
this.title = '新增产品'
this.getCompanyList()
this.dialogVisible = true
},
async getCompanyList() {
const { data: res } = await this.$axios.get('/api/company')
if (res.code != 99200) return this.$message.error(res.message)
this.mfBizList = res.data
this.formData.mfBizId = res.data[0].bizId
},
editClick(row) {
this.formData = {
productId: row.productId,
productCode: row.productCode,
name: row.name,
mfBizId: row.mfBizId,
unit: row.unit,
barcode: row.barcode,
}
this.getCompanyList()
this.title = '编辑产品'
this.dialogVisible = true
},
editSpec(row) {
this.specFormData = {
productId: row.productId,
specId: row.specId,
spec: row.spec,
weight: row.weight,
material: row.material
}
this.specTitle = '详细信息'
this.specVisible = true
},
submitSpecForm() {
this.$refs.specForm.validate(async falg => {
if (!falg) return this.$message.error(res.message)
let url = '/api/spec'
if (this.specFormData.specId) {
const { data: res } = await this.$axios.put(url, this.specFormData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
} else {
const { data: res } = await this.$axios.post(url, this.specFormData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
}
this.specVisible = false
this.initModel()
})
},
showPic(val) {
this.picUrl = val
this.picVisible = true
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.formData = {
goodsName: '',
goodsCode: '',
unit: '',
dtoList: []
}
this.timeData = []
this.init()
},
dialogClose() {
this.formData = {}
this.$refs.fromRef.resetFields()
},
specDialogClose() {
this.specFormData = {}
this.$refs.specForm.resetFields()
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return this.$message.error(res.message)
let url = '/api/product'
if (this.formData.productId) {
const { data: res } = await this.$axios.put(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
} else {
this.formData.mfBizName = this.mfBizList.find(i => i.bizId == this.formData.mfBizId).name
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
}
this.dialogVisible = false
this.init()
})
},
deleteModel(index) {
this.formData.dtoList.splice(index, 1)
},
deleteProduct (row) {
const url = '/api/product'
const params = {
productId: row.productId
}
this.delete(url, params, this.init())
},
deleteClick (row) {
const url = '/api/spec'
const params = {
specId: row.specId
}
this.delete(url, params, this.init())
},
handleCurrentChange1(val) {
this.searchData1.pageNo = val
this.initModel()
},
handleSizeChange1 (val) {
this.searchData1.pageSize = val
this.initModel()
},
handleSuccess(res, file) {
if(res.code === 99200) {
this.formData.imgUrl = res.data.accessUrl
}
},
handleSuccess1(res, file) {
if(res.code === 99200) {
this.updatePhoto(res.data.accessUrl)
}
},
async updatePhoto(imgUrl) {
const { data: res } = await this.$axios.post('/goods/updatePhoto', { imgUrl:imgUrl, goodsCode: this.selectRow.goodsCode })
if (res.code != 99200) return this.$message.error(res.message)
this.init()
},
handleRemove(res, file) {
this.removePhoto(res.response.data.fileCode)
},
async removePhoto(fileCode) {
const { data: res } = await this.$axios.post('/file/deleteReally', { fileCode: fileCode })
},
}
}
</script>
<style scoped lang='less'>
</style>
......@@ -2,9 +2,9 @@
<el-container class="home-container">
<!-- 顶部区域 S -->
<el-header class="ltk-header">
<div class="logo" @click="goHome()">
<div class="logo">
<img src="../assets/logo.png" alt="logo" />
<span>公用被装全寿命管理系统</span>
<span>金锭生产防伪管理系统</span>
</div>
<div class="time_box" @click="cut">
<bo-time></bo-time>
......@@ -13,12 +13,7 @@
<span class="user mgr15" style="cursor:pointer" @click="$router.push('/center')">
当前账号: {{userData.userInfo.realName}}
</span>
<div ref="noticeRef" style="cursor:pointer" @click="$router.push('/read')">
<el-badge :value="readCount" style="margin-top:1px;">
<svg t="1600915000040" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2006" width="20" height="20"><path d="M608.0336 936.448C608.0336 984.768 565.0256 1024 512.0336 1024S416.0336 984.768 416.0336 936.448m96-778.88c-31.68 0-57.6-23.616-57.6-52.48V52.48C454.4336 23.616 480.3536 0 512.0336 0s57.6 23.68 57.6 52.48v52.608c0 28.864-25.92 52.48-57.6 52.48zM384.0336 576c-17.728 0-32-18.56-32-41.472V361.472C352.0336 338.56 366.3056 320 384.0336 320s32 18.56 32 41.472v173.056C415.9056 557.44 401.6336 576 384.0336 576z" p-id="2007" fill="#f6f6f6"></path><path d="M833.9536 896H190.1136a92.8 92.8 0 0 1-81.728-48.192 95.04 95.04 0 0 1 1.152-95.744l1.856-2.816 64.64-90.496V404.48C176.0336 216.704 326.6256 64 512.0336 64s336 152.704 336 340.48v254.08l66.496 93.376c17.6 29.824 18.048 65.536 1.152 95.744A92.672 92.672 0 0 1 833.9536 896zM173.7936 792.448a18.624 18.624 0 0 0 16.256 27.008h643.84c9.728 0 14.4-6.528 15.936-9.408a18.304 18.304 0 0 0 0.32-17.6l-64.384-90.048a71.808 71.808 0 0 1-13.44-42.176V404.48c0-145.472-116.8-263.808-260.416-263.808-143.552 0-260.352 118.336-260.352 263.808v255.68c0 15.104-4.608 29.696-13.44 42.048l-64.32 90.24z" p-id="2008" fill="#f6f6f6"></path></svg>
</el-badge>
</div>
<a-button style="font-weight:bold;color:#fff;background: rgb(221, 115 ,37);border: 0px solid transparent;margin-left: 25px;" icon="logout" @click="logout">退出</a-button>
<a-button style="font-weight:bold;color:#fff;background: rgb(221, 115 ,37);border: 0px solid transparent;" icon="logout" @click="logout">退出</a-button>
</div>
</el-header>
<!-- 顶部区域 N -->
......@@ -52,15 +47,14 @@
<swiper-slide v-for="item in menuList.children" :key="item.id">
<el-card :class="`${item.path === active ? 'active-top-card' : 'top-card'}`">
<div class="card_item" @click="saveNavState(item.path)">
<!-- <i class="el-icon-setting"></i> -->
<img :src="require('@icons/设置.png')" style="width: 25px;">
<br/>
<span> {{item.title}}</span>
</div>
</el-card>
</swiper-slide>
<div class="swiper-button-prev swiper-button-white" slot="button-prev" @click="prev"></div>
<div class="swiper-button-next swiper-button-white" slot="button-next" @click="next"></div>
<div class="swiper-button-prev swiper-button-white" slot="button-prev" @click="prev" v-if="menuList.children.length > 6"></div>
<div class="swiper-button-next swiper-button-white" slot="button-next" @click="next" v-if="menuList.children.length > 6"></div>
</swiper>
</el-header>
<el-main>
......@@ -121,12 +115,12 @@ export default {
this.getPlanTopData()
}
this.activeClick()
this.initWebsock()
// this.initWebsock()
// this.getCut()
//刷新未读数量
eventBus.$on("updateMessage",() =>{
this.getReadCount()
})
// eventBus.$on("updateMessage",() =>{
// this.getReadCount()
// })
},
computed: {
...mapState(['userData']),
......@@ -279,7 +273,6 @@ export default {
this.show = true
const path = e ? e.path : this.activeOnePath
this.edActiveOnePath(path)
console.log(path, e)
if (e) {
this.edActive(e.children[0].path)
this.$router.push(e.children[0].path)
......@@ -323,14 +316,14 @@ export default {
}
},
//获取当前用户未读信息
async getReadCount () {
const params = {
userId: this.userData.userId
}
const { data: res } = await this.$axios.get('/first/getMessageCount', { params: params })
if (res.code !== 99200) return this.$message(res.message)
this.readCount = res.data
},
// async getReadCount () {
// const params = {
// userId: this.userData.userId
// }
// const { data: res } = await this.$axios.get('/first/getMessageCount', { params: params })
// if (res.code !== 99200) return this.$message(res.message)
// this.readCount = res.data
// },
// 保存链接的激活状态
saveNavState (val) {
......@@ -473,6 +466,7 @@ export default {
/* 主体内容区域 */
.container_box {
box-sizing: border-box;
// background: rgb(0, 204, 255);
background: url("../assets/images/bg.png");
background-size: 100% 100%;
position: fixed;
......
<template>
<template>
......@@ -4,7 +4,7 @@
<el-header class="ltk-header">
<div class="logo" @click="goHome()">
<img src="../assets/logo.png" alt="logo" />
<span>公用被装全寿命管理系统</span>
<span>金锭生产防伪管理系统</span>
</div>
<div class="time_box" @click="cut">
<bo-time></bo-time>
......
<template>
<div class="login_container" @keyup.enter="loginClick()">
<dv-border-box-12 :color="['#fff','#fff']" style="width: 450px;height: 360px;display: block;float: right;margin-right: 36%;margin-top: 24%">
<div class="logo">
<img src="../../assets/images/logo.png" style="font-style: inherit;font-weight: inherit;line-height: 1.8; color: rgb(58, 58, 58);font-size: 14px;box-sizing: border-box;
-webkit-tap-highlight-color: rgba(0,0,0,0);
height: auto;
max-width: 100%;
display: block;
border: 0;
margin: 0 auto;"></div>
<dv-border-box-12 :color="['#fff','#fff']" style="width: 450px;height: 300px;display: block;float: right;margin-right: 38.4%;margin-top: 18%">
<span style="font-size: 26px;color:#fff;padding:0px 172px;display:inline-block;margin-top: 20px">用户登录</span>
<el-form
class="login_form"
......@@ -8,9 +16,6 @@
:rules="loginFormRules"
ref="loginFormRef"
>
<el-form-item prop="orgCode">
<el-input v-model="loginForm.orgCode" style="width: 350px" placeholder="请输入单位代码"></el-input>
</el-form-item>
<el-form-item prop="account">
<el-input v-model="loginForm.account" style="width: 350px" placeholder="请输入登录ID">
<i slot="prefix">
......@@ -78,22 +83,15 @@ export default {
this.$refs.loginFormRef.validate(async flag => {
// 登录验证
if (!flag) return
const { data: res } = await this.$axios.post('/auth/login', this.loginForm)
const { data: res } = await this.$axios.post('/api/auth/login', this.loginForm)
if (res.code != 99200) return this.$message.error(res.message);
window.sessionStorage.setItem('token', res.data.token)
const userData = res.data.userInfo
var date = new Date()
var year = date.getFullYear()
userData.gznd = year
window.sessionStorage.setItem('userData', JSON.stringify(userData))
// 菜单列表
const { data: menuRes } = await this.$axios.get('/sysMenu/getLeftMenus')
window.sessionStorage.setItem('navList', JSON.stringify(menuRes.data[0].children))
if (userData.roleInfoList[0].roleCode === '10002') {
this.$router.push('/production/write')
} else {
this.$router.push('index')
}
this.$router.push('/production/produce')
})
},
// 密码显示
......@@ -115,6 +113,21 @@ export default {
line-height: 50px;
}
.logo {
font-style: inherit;
font-weight: inherit;
line-height: 1.8;
color: rgb(58, 58, 58);
font-size: 14px;
font-family: "Microsoft Yahei", Arial, Helvetica, sans-serif;
box-sizing: border-box;
-webkit-tap-highlight-color: rgba(0,0,0,0);
position: absolute;
width: 80%;
top: 20%;
left: 10%;
}
.login_container {
position:fixed;
top: 0;
......@@ -122,7 +135,6 @@ export default {
width:100%;
height:100%;
min-width: 1000px;
//z-index:-10;
zoom: 1;
background-color: #fff;
background: url('../../assets/images/loginbg.png') no-repeat;
......
// 日志管理 - 登录日志
<template>
<div class="body" :style="'height:' + height + 'px'">
<div class="inner_border">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px; overflow-y: auto; position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left">
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="时间节点 :" class="mgr15 mgl15">
<el-date-picker
@change="dateChange"
v-model="timeData"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy 年 MM 月 dd 日"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost class="mgl15" icon="search" @click="toQuery()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- 主表 -->
<el-table :data="data" style="overflow: auto;" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center"></el-table-column>
<el-table-column prop="logName" label="日志名称" align="center"></el-table-column>
<el-table-column prop="logSucceed" label="是否执行成功" align="center"></el-table-column>
<el-table-column prop="logMessage" label="具体消息" align="center"></el-table-column>
<el-table-column prop="loginIpAddress" label="登录ip" align="center"></el-table-column>
<el-table-column prop="userId" label="用户id" align="center"></el-table-column>
<el-table-column prop="createTime" label="创建时间" align="center"></el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-sizes="[10, 20, 30, 40]"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
</el-card>
</div>
</div>
</template>
<script>
import initData from '../../mixins/initData'
export default {
mixins: [initData],
data () {
return {
timeData: []
}
},
created () {
this.$nextTick(() => {
this.init()
})
},
methods: {
beforeInit() {
this.url = '/loginLog/page'
return true
},
dateChange (date) {
this.searchData.beginTime = date ? date[0] : ''
this.searchData.endTime = date ? date[1] : ''
},
}
}
</script>
<style scoped lang='less'>
</style>
......@@ -176,7 +176,7 @@ export default {
// 表单数据
formData: {
appCode: 10001,
appCode: 10003,
iconShow: false
},
// 表单验证规则
......@@ -259,7 +259,7 @@ export default {
editClose() {
this.formData = {
appCode: 10001,
appCode: 10003,
iconShow: false
}
this.$refs.fromRef.resetFields()
......
......@@ -5,11 +5,11 @@
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<el-form :inline="true" :model="searchData" size="medium" label-position="left">
<el-row >
<el-form-item label="人员名称 :">
<el-form-item label="人员姓名 :">
<el-input
clearable
@keypress.native.enter="toQuery()"
placeholder="请输入人员名称"
placeholder="请输入人员姓名"
v-model="searchData.realName"
/>
</el-form-item>
......@@ -37,8 +37,8 @@
<el-card :style="'height:' + (height - 156) + 'px;overflow-y: auto;position:relative;'">
<el-table ref="userTable" :data="data" style="width: 100%;" size="medium" :highlight-current-row="true" @row-click="rowClick">
<el-table-column type="index" width="60" label="序号" align="center"/>
<el-table-column prop="account" label="用户名" align="center"/>
<el-table-column prop="realName" label="人员名称" align="center"/>
<el-table-column prop="account" label="登录账号" align="center"/>
<el-table-column prop="realName" label="人员姓名" align="center"/>
<el-table-column prop="sex" label="性别" align="center">
<template slot-scope="scope">
{{ scope.row.sex === 'M' ? '男' : '女' }}
......@@ -46,10 +46,10 @@
</el-table-column>
<el-table-column label="状态" align="center">
<template slot-scope="scope">
{{ scope.row.statusFlag === 1 ? '正常' : '冻结' }}
<el-tag type="success" v-if="scope.row.statusFlag == 1">正常</el-tag>
<el-tag type="danger" v-if="scope.row.statusFlag == 2">冻结</el-tag>
</template>
</el-table-column>
<el-table-column prop="orgCode" label="所属单位代码" align="center"/>
<el-table-column label="操作" align="center" width="280">
<template v-slot="scope">
<!-- 重置 -->
......@@ -165,13 +165,6 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="机构 :">
<treeselect :normalizer="normalizer" :options="orgList" :show-count="true" z-index="9999"
:appendToBody="true" noResultsText="无." clearValueText="清除" v-model="formData.orgId"
:clearable="true" style="width: 100%" treeNodeFilterProp="name" placeholder="请选择机构"/>
</el-form-item>
</el-row>
</el-card>
</el-form>
......@@ -370,7 +363,7 @@ export default {
}).then(async () => {
const { data: res } = await this.$axios.post('/sysUser/resetPwd', { userId: row.userId })
if (res.code === 99200) {
this.$message.success(res.message + ',重置后新密码为123456')
this.$message.success(res.message + ', 重置后新密码为123456')
this.init()
} else {
this.$message.error(res.message)
......@@ -387,6 +380,7 @@ export default {
if (this.formData.userId) {
url = '/sysUser/edit'
}
this.formData.orgId = '1'
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
......@@ -436,7 +430,7 @@ export default {
},
async grantRole() {
if (this.grantRoleIdList.length>1) {
this.$message.warning('一个用户只能绑定一种角色')
this.$message.warning('用户只能绑定其中一种角色')
this.getUserGrantRole()
} else {
const { data: res } = await this.$axios.post('/sysUser/grantRole', {grantRoleIdList: this.grantRoleIdList, userId: this.selectRow.userId })
......
......@@ -3,17 +3,10 @@ function resolve (dir) {
return path.join(__dirname, dir)
}
module.exports = {
publicPath: '/',
publicPath: './',
devServer: {
host: '192.168.3.101',
port: 2233,
// proxy: {
// '/store': {
// // /store/update
// target: '',
// changeOrigin: true
// }
// }
host: '192.168.3.101',
port: 2233,
},
configureWebpack: {
resolve: {
......
......@@ -3419,10 +3419,10 @@
"resolved" "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.634.tgz?cache=0&sync_timestamp=1609814040694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.634.tgz"
"version" "1.3.634"
"element-ui@^2.14.1":
"integrity" "sha1-i1dFxzZsHBpgO7bAIShupxh+KqI="
"resolved" "https://registry.npm.taobao.org/element-ui/download/element-ui-2.14.1.tgz?cache=0&sync_timestamp=1605089928506&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felement-ui%2Fdownload%2Felement-ui-2.14.1.tgz"
"version" "2.14.1"
"element-ui@^2.15.7":
"integrity" "sha512-dx45nQLt4Hn87/Z9eRr3ex6KFZbxlFAwEU3QoW3wA5EsYftvHTyL9Pq7VnXXD7hu1Eiaup2jcs6kp+/VSFmXuA=="
"resolved" "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.9.tgz"
"version" "2.15.9"
dependencies:
"async-validator" "~1.8.1"
"babel-helper-vue-jsx-merge-props" "^2.0.0"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论