中航光电热表web
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

708 lines
22 KiB

<template>
<basic-container>
<avue-crud
:option="option"
:table-loading="loading"
:data="data"
v-model:page="page"
v-model:search="search"
:before-open="beforeOpen"
v-model="form"
ref="crud"
@row-update="rowUpdate"
@row-save="rowSave"
@row-del="rowDel"
@search-change="searchChange"
@search-reset="searchReset"
@selection-change="selectionChange"
@current-change="currentChange"
@size-change="sizeChange"
@refresh-change="refreshChange"
@on-load="onLoad"
>
<template #menu-left>
<el-button type="primary" @click="handleAdd">新 增</el-button>
<el-button type="primary" @click="handleSet">批量设置分类</el-button>
</template>
<template #menu="{row}">
<el-button type="text" @click="editRow(row)">修改</el-button>
<el-button type="text" @click="deleteRow(row)">删除</el-button>
</template>
<template #userName="{row}">
{{ row.updateMan.userName}}
</template>
</avue-crud>
<el-dialog :title="title" append-to-body v-model="showDialog" width="60%">
<el-form ref="addForm" :rules="formRules" :model="formData" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="模板编码" prop="inspectionTemplateCode" >
<el-input v-model="formData.inspectionTemplateCode" placeholder="请输入模板编码"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="模板名称" prop="name" >
<el-input v-model="formData.name" placeholder="请输入模板名称"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="优先级" prop="priority">
<el-input v-model="formData.priority" placeholder="请输入优先级"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div v-if="title == '新增'">
<el-button type="primary" @click="insertEvent()">插入一行</el-button>
<el-button plain type="danger" @click="remove">删除选择行</el-button>
<!-- <el-button type="primary" @click="handleSave">保存</el-button> -->
</div>
<div style="margin-top:20px;">
<el-table :data="tidList" @selection-change="selectionChangeProject" @select="selectChange">
<el-table-column type="selection" width="55px"></el-table-column>
<el-table-column label="项目编号" prop="inspectionTemplateCode">
<template #default="scope">
<el-input v-model="scope.row.itemCode" @blur="validateRow(scope.$index)"></el-input>
</template>
</el-table-column>
<el-table-column label="项目" prop="inspectionItemId">
<template #default="scope">
<el-select v-model="scope.row.inspectionItemId" @change="(value) =>changeProject(value,scope.$index)">
<el-option v-for="item in projectArr" :key="item.id" :value="item.id" :label="item.name"></el-option>
</el-select>
<!-- <el-input v-if="scope.row.tidName" v-model="scope.row.tidName"></el-input> -->
</template>
</el-table-column>
<el-table-column label="标准" prop="standardId">
<template #default="scope">
<el-select v-model="scope.row.standardId">
<el-option v-for="item in standardList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</template>
</el-table-column>
</el-table>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">取 消</el-button>
<el-button type="primary" @click="handleSave">确 定</el-button>
</span>
</template>
</el-dialog>
<el-dialog title="批量设置分类" append-to-body v-model="setDialog" width="500px">
<el-form ref="typeForm" :rules="setRules" :model="setData" >
<el-form-item label="分类" prop="category">
<el-select v-model="setData.category">
<el-option v-for="item in typeData" :key="item.id" :label="item.dictValue" :value="item.dictKey"></el-option>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="setDialog = false">取 消</el-button>
<el-button type="primary" @click="sunmitType"> </el-button>
</span>
</template>
</el-dialog>
</basic-container>
</template>
<script>
import {getList,addTemplate,getStandard,editTemplate,getItem,getDetail,getCategory,setType,deleteItem} from '@/api/productionTesting/InspectionTemplate'
export default {
data(){
return{
data:[],
loading:false,
form:{},
query:{},
page:{
pageSize: 10,
currentPage: 1,
total: 0,
},
title:'新增',
search:{},
showDialog:false,
setDialog:false,
formData:{},
tidList:[],
selectionProjectList:[],
projectArr:[],
dialogData:[],
selectId:null,
deleteTidArr:[],
trialItemList: [
'常温绝缘电阻检测',
'常温耐压检测',
'泄漏率检测',
'低温密封性检测',
'高温密封性检测',
'潮湿绝缘电阻检测',
'高温绝缘电阻检测',
'承压检测',
'探伤检测',
'液氮存储检测',
'煤油绝缘检测',
'常温密封性检测',
'温冲试验检测',
'其他检测'
],
setRules:{
category: [{ required: true, trigger: 'blur', message:'请选择分类' }],
},
standardList:[],
formRules:{
inspectionTemplateCode: [{ required: true, message: '请输入模板编码', trigger: 'blur' }],
name: [{ required: true, trigger: 'blur', message:'请输入模板名称' }],
},
selectionList:[],
typeData:[
// {label:'A',value:'A',id:'001'}
],
setData:{},
option:{
tip: false,
height: 'auto',
calcHeight: 32,
align: 'center',
size: 'medium',
searchLabelWidth:120,
simplePage: true,
searchShow: true,
searchMenuSpan: 6,
searchIcon: true,
searchIndex: 3,
tree: false,
border: true,
selection: true,
viewBtn: false,
editBtn:false,
addBtn:false,
delBtn: false,
editBtnText: '修改',
viewBtnText:'详情',
labelWidth: 120,
menuWidth: 120,
dialogWidth: 1200,
dialogClickModal: false,
searchEnter: true,
excelBtn: false,
filterBtn: true,
searchShowBtn: false,
excelBtn: true,
index: false,
showOverflowTooltip: true,
searchLabelPosition:'left',
searchLabelPosition:'left',
searchGutter:24,
searchSpan:6,
menuAlign: 'left',
gridBtn:false,
searchMenuPosition:'right',
addBtnIcon: ' ',
viewBtnIcon: ' ',
delBtnIcon: ' ',
editBtnIcon: ' ',
column: [
{
label: '模板编码',
prop: 'inspectionTemplateCode',
addDisplay: false,
editDisplay: false,
span: 24,
search:true,
width:200,
rules: [
{
required: true,
message: '请输入模板编码',
trigger: 'click',
},
],
},
{
label: '模板名称',
prop: 'name',
addDisplay: false,
editDisplay: false,
span: 24,
search:true,
width:200,
rules: [
{
required: true,
message: '请输入模板名称',
trigger: 'click',
},
],
},
{
label: '工序数',
prop: 'processNum',
addDisplay: false,
editDisplay: false,
span: 24,
search:true,
width:200,
rules: [
{
required: true,
message: '请输入工序数',
trigger: 'click',
},
],
},
{
label: '优先级',
prop: 'priority',
addDisplay: false,
editDisplay: false,
span: 24,
search:false,
width:200,
rules: [
{
required: true,
message: '请输入优先级',
trigger: 'click',
},
],
},
{
label: '分类',
prop: 'category',
type:'select',
addDisplay: false,
editDisplay: false,
span: 24,
search:true,
rules: [
{
required: true,
message: '请输入分类',
trigger: 'click',
},
],
dicUrl:'/api/blade-system/dict/dictionary?code=InspectionTemplate-Category',
props:{
label:'dictValue',
value:'dictKey'
}
},
{
label: '修改人',
prop: 'updateUserRealName',
addDisplay: false,
editDisplay: false,
span: 24,
search:true,
width:200,
rules: [
{
required: true,
message: '请输入修改人',
trigger: 'click',
},
],
},
{
label: '修改时间',
prop: 'updateTime',
type:'date',
addDisplay: false,
editDisplay: false,
span: 24,
// search:true,
width:200,
rules: [
{
required: true,
message: '请输入修改时间',
trigger: 'click',
},
],
},
{
label: '修改时间',
prop: 'updateTime',
type:'date',
searchRange:true,
format:'YYYY-MM-DD',
valueFormat:"YYYY-MM-DD",
addDisplay: false,
editDisplay: false,
span: 24,
hide:true,
search:true,
width:200,
rules: [
{
required: true,
message: '请输入修改时间',
trigger: 'click',
},
],
},
]
}
}
},
mounted(){
this.getItemList()
this.getCategoryList()
this.getStandardList()
},
methods:{
getStandardList(){
getStandard().then(res =>{
this.standardList = res.data.data
})
},
getCategoryList(){
getCategory().then(res =>{
this.typeData = res.data.data
})
},
getItemList(){
getItem().then(res =>{
this.projectArr = res.data.data
})
},
// 校验单行(与上一行比较)
// 校验指定行(向上 + 向下)
validateRow(index) {
const digitOnly = /^\d+$/;
const row = this.tidList[index];
const id = (row?.itemCode || '').trim();
// 清除当前行错误(先清后设)
// this.$delete(this.errors, index);
// 如果当前行为空,不校验(或根据需求设为必填)
if (!id) return;
// 格式校验
if (!digitOnly.test(id)) {
// this.$set(this.errors, index, '编号必须为纯数字');
this.$message.error(`第【${index + 1}】行编号必须为纯数字`)
return;
}
const currentNum = Number(id);
// 🔼 向上校验:当前行 vs 上一行
if (index > 0) {
const prevId = (this.tidList[index - 1]?.itemCode || '').trim();
if (prevId) {
if (!digitOnly.test(prevId)) {
// this.$set(this.errors, index, '上一行编号格式无效');
this.$message.error(`第【${index + 1}】行编号格式无效`)
return;
}
if (currentNum <= Number(prevId)) {
// this.$set(
// this.errors,
// index,
// `必须大于上一行(${prevId})`
// );
this.$message.error(`第【${index + 1}】行编号必须大于上一行`)
return;
}
}
}
// 🔽 向下校验:下一行 vs 当前行
if (index < this.tidList.length - 1) {
const nextId = (this.tidList[index + 1]?.itemCode || '').trim();
if (nextId) {
if (!digitOnly.test(nextId)) {
// 下一行格式错,但错误应标在下一行
// this.$set(this.errors, index + 1, '编号必须为纯数字');
this.$message.error(`第【${index + 1}】行编号必须为纯数字`)
} else {
const nextNum = Number(nextId);
if (nextNum <= currentNum) {
// this.$set(
// this.errors,
// index + 1,
// `必须大于上一行(${id})`
// );
this.$message.error(`第【${index + 2}】行编号必须大于上一行`)
} else {
// 如果之前有错,现在合法了,清除下一行错误
// this.$delete(this.errors, index + 1);
}
}
} else {
// 下一行为空,清除其可能的历史错误
// this.$delete(this.errors, index + 1);
}
}
},
selectionChangeProject(list){
this.selectionProjectList = list
},
selectChange(list,val){
val._select = !val._select
},
insertEvent(row = -1) {
const num = this.tidList.length;
let tidCode = (num + 1) * 5;
if (tidCode.toString().length == 1) {
tidCode = '000' + tidCode;
} else if (tidCode.toString().length == 2) {
tidCode = '00' + tidCode;
} else if (tidCode.toString().length == 3) {
tidCode = '0' + tidCode;
} else if (tidCode.toString().length == 4) {
tidCode = '' + tidCode;
}
const record = { itemCode:tidCode,_select:false };
this.tidList.push(record)
},
// 切换项目
changeProject(value,index){
this.tidList[index].tidName = this.projectArr.find(item => item.oneData == value).twoData
},
remove(){
let arr = this.tidList.filter(item => item._select)
if(arr.length != 0){
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() =>{
if(this.selectId){
console.log('111111111111111')
let deleteData = this.tidList.filter(item => item._select)
console.log('deleteData---------------',deleteData)
this.deleteTidArr = deleteData.filter(item => item.tidId)
}
let deleteArr = this.tidList.filter(item => !item._select)
this.tidList = deleteArr
})
}else{
this.$message.error('请至少选择一条数据进行操作!')
}
},
// 输入框失焦时触发校验
handleIdBlur(index) {
this.validateRow(index);
},
// 全量校验(提交用)
validateAll() {
const newErrors = {};
const digitOnly = /^\d+$/;
for (let i = 0; i < this.tidList.length; i++) {
const id = (this.tidList[i]?.itemCode || '').trim();
if (!id) continue; // 或设为必填
if (!digitOnly.test(id)) {
// newErrors[i] = '编号必须为纯数字';
this.$message.error(`第【${i + 1}】行编号必须为纯数字`)
break;
}
const num = Number(id);
// 检查上一行
if (i > 0) {
const prevId = (this.tidList[i - 1]?.itemCode || '').trim();
if (prevId) {
if (!digitOnly.test(prevId)) {
// newErrors[i] = '上一行编号格式无效';
this.$message.error(`第【${i + 1}】行编号格式无效`)
continue;
}
if (num <= Number(prevId)) {
// newErrors[i] = `必须大于上一行(${prevId})`;
this.$message.error(`第【${i + 1}】行编号必须大于上一行`)
continue;
}
}
}
// 检查下一行(其实全量校验只需检查“当前 > 上一行”即可保证全局有序)
// 所以这里可简化:只校验 i > i-1 即可
}
// // 更简洁的全量校验:遍历一次,确保递增
// let lastNum = -1;
// for (let i = 0; i < this.tidList.length; i++) {
// const id = (this.tidList[i]?.id || '').trim();
// if (!id) continue;
// if (!digitOnly.test(id)) {
// // newErrors[i] = '编号必须为纯数字';
// this.$message.error(`第【${i + 1}】行编号必须为纯数字`)
// break;
// }
// const num = Number(id);
// if (num <= lastNum) {
// // newErrors[i] = i === 0 ? '编号无效' : `必须大于上一行(${this.tidList[i - 1].id})`;
// this.$message.error(i === 0 ? '编号无效' : `第【${i + 1}】行编号必须为纯数字`)
// break;
// }
// lastNum = num;
// }
// this.errors = newErrors;
return Object.keys(newErrors).length === 0;
},
handleSave(){
this.$refs.addForm.validate(valid => {
if(valid){
if(this.validateAll()){
let params = {
inspectionTemplateCode:this.formData.inspectionTemplateCode,
name:this.formData.name,
priority:this.formData.priority,
detailList:this.tidList.length > 0 ? this.tidList : []
}
if(this.title == '新增'){
addTemplate(params).then(res =>{
if(res.data.code == 200){
this.$message.success('新增成功')
this.showDialog = false
this.onLoad()
}
})
}else{
params.id = this.formData.id
editTemplate(params).then(res =>{
if(res.data.code == 200){
this.$message.success('修改成功')
this.showDialog = false
this.onLoad()
}
})
}
}
// // if(this.tidList)
// const deleteIdArr = []
// this.deleteTidArr.map(item =>{
// deleteIdArr.push(item.tidId)
// })
// console.log('dele----------------------',deleteIdArr)
// console.log('tidList----------------------',this.tidList)
// // let filteredObjArr = this.tidList.filter(item => !deleteIdArr.some(val => val === item.id));
// // console.log('filteredObjArr====================',filteredObjArr)
// let params = {
// deleteIds:deleteIdArr,
// dsTrialitemModel:this.formData,
// list:this.tidList
// }
// console.log('paramd--------------------',params)
}
})
},
sunmitType(){
this.$refs.typeForm.validate(valid =>{
if(valid){
this.selectionList.map(item =>{
item.category = this.setData.category
})
setType(this.selectionList).then(res =>{
if(res.data.code == 200){
this.$message.success('设置成功')
this.setDialog = false
this.onLoad()
}
})
console.log('slee=================',this.selectionList)
}
})
},
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
selectionChange(list) {
this.selectionList = list;
},
selectionClear() {
this.selectionList = [];
this.$refs.crud.toggleSelection();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
deleteRow(val){
this.$confirm('确定删除该条数据?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() =>{
deleteItem({ids:val.id}).then(res =>{
if(res.data.code == 200){
this.$message.success('删除成功')
this.onLoad()
}
})
})
},
handleAdd(){
this.showDialog = true
this.title = '新增'
this.formData = {}
this.tidList = []
this.deleteTidArr = []
},
handleSet(){
if(this.selectionList.length == 0){
this.$message.error('请至少选择一条数据')
}else{
this.setDialog = true
}
},
editRow(row){
getDetail({id:row.id}).then(res =>{
this.formData = res.data.data
this.title = '编辑'
this.tidList = res.data.data.detailList
this.showDialog = true
})
},
onLoad(){
this.loading = true
getList({
current:this.page.currentPage,
size:this.page.pageSize,
inspectionTemplateCode:this.query.inspectionTemplateCode,
name:this.query.name,
processNum:this.query.processNum,
category:this.query.category,
updateUserRealName:this.query.updateUserRealName,
}).then(res =>{
this.data = res.data.data.records
this.page.total = res.data.data.total
this.loading = false
})
}
}
}
</script>
<style>
</style>