Byd_Dg_Web/src/views/base-data/point/index.vue

405 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle">
<!-- -->
<label class="el-form-item-label">代码</label>
<el-input v-model="query.code" clearable placeholder="代码" style="width: 185px;" class="filter-item"
@keyup.enter.native="crud.toQuery"
/>
<label class="el-form-item-label">名称</label>
<el-input v-model="query.name" clearable placeholder="名称" style="width: 185px;" class="filter-item"
@keyup.enter.native="crud.toQuery"
/>
<label class="el-form-item-label">状态</label>
<el-select
v-model="query.status"
clearable
size="small"
placeholder="状态"
class="filter-item"
style="width: 185px"
@change="crud.toQuery"
>
<el-option
v-for="item in dict.use_status"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
<label class="el-form-item-label">库区</label>
<el-select v-model="query.areaName"
style="width: 185px;"
clearable
filterable
placeholder="请选择"
@keyup.enter.native="crud.toQuery"
class="filter-item"
@change="getArea()"
>
<el-option
v-for="area in areas"
:key="area.id"
:label="area.name"
:value="area.name"
/>
</el-select>
<label class="el-form-item-label">是否启用</label>
<el-select v-model="query.enabled" clearable placeholder="请选择" style="width: 185px;" class="filter-item"
@keyup.enter.native="crud.toQuery"
>
<el-option
v-for="baseStatus in dict.base_staus"
:key="baseStatus.id"
:label="baseStatus.label"
:value="baseStatus.value"
/>
</el-select>
<rrOperation :crud="crud"/>
</div>
<!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'-->
<crudOperation :permission="permission" :tableKey="this.$options.name">
<el-upload
class="upload-demo"
slot="right"
style="float: right;padding-left: 5px"
:headers="headers"
:action="baseApi+'/api/point/import_point'"
:file-list="fileList"
:on-error="handleErr"
:on-success=" (response, file, fileList) => { return handleSuccess(response, file, fileList,crud);}"
:show-file-list="true"
>
<el-button size="mini" type="success" icon="el-icon-upload2">导入</el-button>
</el-upload>
</crudOperation>
<!--表单组件-->
<el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0"
:title="crud.status.title" width="500px" top="20px"
>
<el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="库区" prop="area">
<el-select @change="getArea" v-model="form.area"
value-key="id" filterable
placeholder="请选择" style="width: 370px;"
>
<el-option
v-for="item in areas"
:key="item.id"
:label="item.name"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item label="代码" prop="code">
<el-input v-model="form.code" @input="syncNameWithCode" style="width: 370px;"/>
</el-form-item>
<el-form-item label="名称">
<el-input v-model="form.name" style="width: 370px;"/>
</el-form-item>
<el-form-item label="类型" prop="type">
<el-select v-model="form.type" filterable placeholder="请选择" style="width: 370px;"
:default-first-option="true"
>
<el-option
v-for="item in dict.point_type"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="排" prop="posX" v-if="showPaiLieCeng">
<el-input v-model="form.posX" value="1" style="width: 370px;"/>
</el-form-item>
<el-form-item label="列" prop="posY" v-if="showPaiLieCeng">
<el-input v-model="form.posY" style="width: 370px;"/>
</el-form-item>
<el-form-item label="层" prop="posZ" v-if="showPaiLieCeng">
<el-input v-model="form.posZ" style="width: 370px;"/>
</el-form-item>
<el-form-item label="状态">
<el-select
v-model="form.status"
clearable
size="small"
placeholder="状态"
class="filter-item"
style="width: 370px"
>
<el-option
v-for="item in dict.use_status"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="描述">
<el-input type="textarea" v-model="form.description" style="width: 370px;"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
</div>
</el-dialog>
<!--表格渲染-->
<el-table ref="table" height="63vh" v-loading="crud.loading" :data="crud.data" size="mini" style="width: 100%;"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column type="selection" width="55"/>
<el-table-column prop="code" label="代码"/>
<el-table-column prop="name" label="名称"/>
<el-table-column prop="type" label="类型">
<template slot-scope="scope">
{{ dict.label.point_type[scope.row.type] }}
</template>
</el-table-column>
<el-table-column
prop="status"
label="状态"
width="100"
:filters="[{ text: '空闲', value: 'FREE' }, { text: '占用', value: 'USED' }]"
:filter-method="filterTag"
filter-placement="bottom-end">
<template slot-scope="scope">
<el-tag
:type="dict.label.use_status[scope.row.status] === '空闲' ? 'success' : 'danger'"
disable-transitions> {{ dict.label.use_status[scope.row.status] }}
</el-tag>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="areaName" label="库区">
<template slot-scope="scope">
<div>{{ scope.row.area.name }}</div>
</template>
</el-table-column>
<el-table-column label="启用" align="center" prop="enabled">
<template slot-scope="scope">
<el-switch
v-model="scope.row.enabled"
active-color="#409EFF"
inactive-color="#F56C6C"
@change="changeEnabled(scope.row, scope.row.enabled)"
/>
</template>
</el-table-column>
<el-table-column v-if="checkPer(['admin','point:edit','point:del'])" label="操作" align="center">
<template slot-scope="scope">
<udOperation
:data="scope.row"
:permission="permission"
:show-dle="false"
/>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<div style="float: right;">
<pagination/>
</div>
</div>
</div>
</template>
<script>
import crudPoint from '@/api/point'
import crudArea from '@/api/area'
import CRUD, {presenter, header, form, crud} from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
import rrOperation from '@crud/RR.operation'
import pagination from '@crud/Pagination'
import {getToken} from '@/utils/auth'
import {mapGetters} from 'vuex'
const defaultForm = {
id: null,
status: 'FREE',
enabled: 1,
code: null,
name: null,
type: null,
dept: null,
description: null,
area: null,
posX: null,
posY: null,
posZ: null
}
export default {
name: 'Point',
components: {
pagination, crudOperation, udOperation, rrOperation
},
mixins: [presenter(), header(), form(defaultForm), crud()],
dicts: ['base_staus', 'use_status', 'point_type', 'agv_on_off', 'smallArea', 'item_height'],
cruds() {
return CRUD({
title: '点位', url: 'api/point', idField: 'id', sort: 'id,desc', crudMethod: {...crudPoint},
optShow: {
add: true,
edit: false,
del: false,
reset: true,
download: true
},
queryOnPresenterCreated: true
})
},
computed: {
...mapGetters([
'baseApi'
]),
showPaiLieCeng() {
// 通过库区控制高度显示隐藏
return this.form.area && (this.form.area.code === 'DJQ' || this.form.area.code === 'XJQ')
}
},
data() {
var validateCode = (rule, value, callback) => {
// 检查输入是否为空
if (!value) {
return callback(new Error('请输入代码'));
}
// 获取区域代码
const areaCode = this.form.area.code;
// 检查是否需要验证特定格式
if (['DJQ', 'XJQ'].includes(areaCode)) {
const parts = value.split('-');
// 检查格式是否正确
if (parts.length === 4) {
[this.form.posX, this.form.posY, this.form.posZ] = parts.slice(1);
return callback();
} else {
this.form.posX = null;
this.form.posY = null;
this.form.posZ = null;
const msg = areaCode === 'DJQ' ? 'DJ' : 'XJ';
return callback(new Error(`格式错误,格式为(${msg}-01-01-001): 编码-xx-xx-xxx`));
}
}
// 如果不需要验证特定格式,直接通过
callback();
};
return {
//地标点数据
fileList: [],
from1: [],
fromBack: [],
pointListData: [],
headers: {'Authorization': getToken()},
queryTypeOptions: [
{key: 'code', display_name: '代码'},
{key: 'name', display_name: '名称'},
{key: 'status', display_name: '状态'},
{key: 'beatCode', display_name: '区域编码'},
{key: 'areaCode', display_name: '仓库'},
{key: 'enabled', display_name: '启用'}
],
areas: [],
permission: {
add: ['admin', 'point:add'],
edit: ['admin', 'point:edit'],
del: ['admin', 'point:del']
},
rules: {
code: [
{validator: validateCode, required: true, trigger: 'blur'}
],
type: [
{required: true, message: '类型不能为空', trigger: 'blur'}
],
area: [
{required: true, message: '库区不能为空', trigger: 'blur'}
],
posX: [
{required: true, message: '排不能为空', trigger: 'blur'}
],
posY: [
{required: true, message: '列不能为空', trigger: 'blur'}
],
posZ: [
{required: true, message: '层不能为空', trigger: 'blur'}
]
}
}
},
mounted() {
this.getArea()
},
methods: {
handleSuccess(response, file, fileList, crud) {
let myError = response.toString()//转字符串
this.crud.notify(response['message'], CRUD.NOTIFICATION_TYPE.SUCCESS)
crud.toQuery()
},
handleErr(err, file, fileList) {
let myError = err.toString()//转字符串
myError = myError.replace('Error: ', '') // 去掉前面的" Error: "
myError = JSON.parse(myError)//转对象
this.crud.notify(myError['message'], CRUD.NOTIFICATION_TYPE.ERROR)
},
// 钩子在获取表格数据之前执行false 则代表不获取数据
[CRUD.HOOK.beforeRefresh]() {
return true
},
syncNameWithCode() {
this.form.name = this.form.code;
},
// 改变状态
changeEnabled(data, val) {
this.$confirm('此操作将 "' + this.dict.label.base_staus[val] + ', 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
crudPoint.edit(data).then(res => {
this.crud.notify(this.dict.label.base_staus[val] + '成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
}).catch(() => {
data.enabled = !data.enabled
})
}).catch(() => {
data.enabled = !data.enabled
})
},
getArea() {
crudArea.queryAreaAll({}).then(res => {
this.areas = res
})
},
filterTag(value, row) {
return row.status === value
}
}
}
</script>
<style scoped>
</style>