feat(生产模块-设备故障履历): 添加设备异常履历功能
This commit is contained in:
parent
221649ef4c
commit
e34933de4b
48
src/api/mes/wip-nalinv/equipment-abn-history.js
Normal file
48
src/api/mes/wip-nalinv/equipment-abn-history.js
Normal file
@ -0,0 +1,48 @@
|
||||
import request from "@/router/axios";
|
||||
import {iep} from "@/api/prefix";
|
||||
|
||||
// 获取设备故障代码列表
|
||||
export function getAbnCodeList(obj) {
|
||||
return request({
|
||||
url: iep('/equipment-abn-history/getAbnCodeList'),
|
||||
method: 'post',
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
|
||||
// 获取设备故障代码列表
|
||||
export function getEquipAbnHistoryPage(query) {
|
||||
return request({
|
||||
url: iep('/equipment-abn-history/page'),
|
||||
method: 'get',
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
// 查询班次
|
||||
export function getShiftList(query) {
|
||||
return request({
|
||||
url: iep('/equipment-abn-history/getShiftList'),
|
||||
method: 'get',
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
// 查询班次
|
||||
export function getResrceByCode(query) {
|
||||
return request({
|
||||
url: iep('/equipment-abn-history/getResrceByCode'),
|
||||
method: 'get',
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
// 保存
|
||||
export function saveEquipAbnHistory(data) {
|
||||
return request({
|
||||
url: iep('/equipment-abn-history/'),
|
||||
method: 'post',
|
||||
data: data,
|
||||
})
|
||||
}
|
||||
|
||||
733
src/views/mes/wip-nalinv/equipment-abn-history/index.vue
Normal file
733
src/views/mes/wip-nalinv/equipment-abn-history/index.vue
Normal file
@ -0,0 +1,733 @@
|
||||
<template>
|
||||
<div class="execution">
|
||||
<!-- 设备 弹出框 -->
|
||||
<input-select-dialog
|
||||
:modal-obj="resrceDialogObj"
|
||||
:modal-fetch-fun="resrceDialogObj.fetchFun"
|
||||
:modal-show.sync="resrceDialogObj.visible"
|
||||
:before-loading-fun="fetchFilterResrce"
|
||||
@inputDialogSelected="(row) => {dialogSelected(row, 'resrce')}"
|
||||
/>
|
||||
|
||||
<basic-container>
|
||||
<!-- 搜索条件区域 -->
|
||||
<el-form ref="formObj" :model="formObj" :rules="formRules" label-width="120px">
|
||||
<!-- 第一行 -->
|
||||
<el-row :gutter="24">
|
||||
<!-- 设备编码 -->
|
||||
<el-col :span="6">
|
||||
<el-form-item label="设备编码:" required prop="resrce">
|
||||
<el-input placeHolder="设备编码+" v-model="formObj.resrce" clearable>
|
||||
<i slot="suffix" class="el-input__icon el-icon-copy-document" @click.stop="openDialog('resrce')"/>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 班次 -->
|
||||
<el-col :span="6">
|
||||
<el-form-item label="班次:" prop="shift">
|
||||
<el-select v-model="formObj.shift" clearable>
|
||||
<el-option v-for="item in shiftList" :key="item.userWorkShift" :label="item.userWorkShift"
|
||||
:value="item.userWorkShift"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 异常代码 -->
|
||||
<el-col :span="6">
|
||||
<el-form-item label="异常代码:" prop="abnCode">
|
||||
<el-select v-model="formObj.abnCode" clearable>
|
||||
<el-option v-for="item in abnCodeSearchList" :key="item.reasonCode" :label="item.reasonCode"
|
||||
:value="item.reasonCode"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 创建人 -->
|
||||
<el-col :span="6">
|
||||
<el-form-item label="创建人:" prop="creatorName">
|
||||
<el-input placeHolder="创建人+" v-model="formObj.creatorName" clearable/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<!-- 第二行 -->
|
||||
<el-row :gutter="24">
|
||||
<el-col :span="6">
|
||||
<!-- 生产开始日期 -->
|
||||
<el-form-item label="生产日期:" required prop="timeRange">
|
||||
<el-date-picker
|
||||
v-model="formObj.timeRange"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
format="yyyy-MM-dd HH:mm:ss"
|
||||
type="datetimerange"
|
||||
range-separator="至"
|
||||
:default-time="['00:00:00', '23:59:59']"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<!-- 操作栏 -->
|
||||
<c-top-bar :offset="50" style="margin-bottom: 10px">
|
||||
<el-button type="text" icon="el-icon-search" @click="doRetrieve(true)">检索</el-button>
|
||||
<el-divider direction="vertical"/>
|
||||
<el-button type="text" icon="el-icon-save" @click="doSave">保存</el-button>
|
||||
<el-divider direction="vertical"/>
|
||||
<el-button type="text" icon="el-icon-circle-close" @click="doClear()">清除</el-button>
|
||||
<el-divider direction="vertical"/>
|
||||
<el-button type="text" icon="el-icon-document" @click="doExport">导出</el-button>
|
||||
<el-divider style="margin-top: 0;"/>
|
||||
</c-top-bar>
|
||||
<!-- 按钮行 -->
|
||||
<el-row>
|
||||
<div class="mb8 w100">
|
||||
<el-button type="primary" @click="doAdd">插入新项</el-button>
|
||||
<el-button type="danger" @click="doRemoveSelected">移除选定项</el-button>
|
||||
</div>
|
||||
</el-row>
|
||||
<!-- 表格内容 -->
|
||||
<div>
|
||||
<el-table
|
||||
size="mini"
|
||||
:data="equipmentAbnHistoryList"
|
||||
@selection-change="selectionChangHandle"
|
||||
border
|
||||
style="width: 100%"
|
||||
height="550"
|
||||
highlight-current-row>
|
||||
<el-table-column type="selection" width="40" align="center"/>
|
||||
<!-- 序号 -->
|
||||
<el-table-column align="center" type="index" fixed="left" label="序号" width="60" />
|
||||
<el-table-column align="center" prop="equipmentCode" fixed="left" label="设备编码" show-overflow-tooltip/>
|
||||
<el-table-column align="center" prop="equipmentCodeDesc" fixed="left" label="设备描述" show-overflow-tooltip/>
|
||||
<el-table-column align="center" prop="shift" label="班次">
|
||||
<template #default="scope">
|
||||
<el-select v-model="scope.row.shift" clearable @change="handleShiftChange(scope.$index)">
|
||||
<el-option v-for="item in shiftList" :key="item.userWorkShift" :label="item.userWorkShift"
|
||||
:value="item.userWorkShift"/>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="abnCodeGroup" label="异常代码组">
|
||||
<template #default="scope">
|
||||
<el-select v-model="scope.row.abnCodeGroup" clearable @change="handleAbnCodeGroupChange(scope.$index)">
|
||||
<el-option v-for="item in abnCodeGroupList" :key="item.value" :label="item.label" :value="item.value"/>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="abnCode" label="异常代码" min-width="140">
|
||||
<template #default="scope">
|
||||
<el-select v-model="scope.row.abnCode" clearable @change="handleAbnCodeChange(scope.$index)">
|
||||
<el-option v-for="item in scope.row.abnCodeFilterList" :key="item.reasonCode" :label="item.reasonCode"
|
||||
:value="item.reasonCode"/>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="abnCodeName" label="异常原因" show-overflow-tooltip/>
|
||||
<el-table-column align="center" prop="countermeasure" label="处理对策" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.countermeasure"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="startTime" label="开始时间" min-width="140">
|
||||
<template #default="scope">
|
||||
<el-date-picker
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
format="yyyy-MM-dd HH:mm:ss"
|
||||
:picker-options="pickerOptions"
|
||||
style="width: 100%"
|
||||
size="small"
|
||||
@change="dateChange('START',scope.$index)"
|
||||
v-model="scope.row.startTime"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="endTime" label="结束时间" min-width="140">
|
||||
<template #default="scope">
|
||||
<el-date-picker
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
format="yyyy-MM-dd HH:mm:ss"
|
||||
:picker-options="pickerOptions"
|
||||
style="width: 100%"
|
||||
size="small"
|
||||
@change="dateChange('END', scope.$index)"
|
||||
v-model="scope.row.endTime"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="timeConsuming" label="耗时/min" show-overflow-tooltip/>
|
||||
<el-table-column align="center" prop="creatorName" label="填写人" show-overflow-tooltip/>
|
||||
</el-table>
|
||||
<!-- 分页插件 -->
|
||||
<div style="width: 100%;display: flex;flex-direction: column;align-items: center;justify-content: center;">
|
||||
<el-pagination @current-change="handleCurrentChange"
|
||||
@size-change="handleSizeChange"
|
||||
:current-page.sync="page.current"
|
||||
:page-sizes="[10, 20, 50, 100, 200]"
|
||||
:page-size="page.size"
|
||||
layout="total, sizes, prev, pager, next, jumper"
|
||||
:total="page.total">
|
||||
</el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</basic-container>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {hideLoading, showLoading} from '@/const/loading';
|
||||
import {mapGetters} from 'vuex';
|
||||
import {getStore} from "@/util/store";
|
||||
import {fetchItemList as fetchDictList} from '@/api/admin/dict';
|
||||
import {listByActivityId} from "@/api/admin/activity-option";
|
||||
import {
|
||||
initFormObj,
|
||||
resrceInitDialogObj,
|
||||
} from "@/views/mes/wip-nalinv/equipment-abn-history/init";
|
||||
import {fetchSearchTextPage} from "@/api/wms/prd-code-status-query-report";
|
||||
import {
|
||||
getAbnCodeList,
|
||||
getEquipAbnHistoryPage, getResrceByCode, getShiftList,
|
||||
saveEquipAbnHistory
|
||||
} from "@/api/mes/wip-nalinv/equipment-abn-history";
|
||||
import {formatterDate} from "@/views/mes/wms/take-inventory/init";
|
||||
|
||||
export default {
|
||||
// *****************************************************************************************************************
|
||||
data() {
|
||||
return {
|
||||
selectObjs: [], // 多选ID集合
|
||||
multiple: true, // 控制删除按钮是否禁用
|
||||
formObj: {...initFormObj}, // 搜索条件对象
|
||||
site: getStore({name: 'tenantId'}),
|
||||
userName: getStore({name: 'userInfo'}).username,
|
||||
name: getStore({name: 'userInfo'}).name,
|
||||
fabNo: '', // 作业规则获取车间
|
||||
resrceDialogObj: {...resrceInitDialogObj}, // 设备
|
||||
shiftList: [], // 班组状态(字典)
|
||||
abnCodeGroupList: [], // 异常代码组(选择)
|
||||
abnCodeGroupStringList: [], // 异常代码组(字符串)
|
||||
abnCodeList: [], // 异常代码
|
||||
abnCodeFilterList: [], // 异常代码
|
||||
abnCodeSearchList: [], // 异常代码(搜索框)
|
||||
resrceStringList: [], // 设备(字符串)
|
||||
equipmentAbnHistoryList: [], // 查询结果
|
||||
isSecrecy: '', // 作业规则
|
||||
// 分页参数
|
||||
page: {
|
||||
total: 0,
|
||||
current: 1,
|
||||
size: 20
|
||||
},
|
||||
formRules: {
|
||||
resrce: [
|
||||
{required: true, message: '请选择设备', trigger: ['change','blur']}
|
||||
],
|
||||
timeRange: [
|
||||
{required: true, message: '请选择时间范围', trigger: 'change'}
|
||||
],
|
||||
},
|
||||
// 时间查询参数
|
||||
pickerOptions: {
|
||||
disabledDate: time => {
|
||||
if (!this.formObj.timeRange || this.formObj.timeRange.length !== 2) {
|
||||
return false; // 没有设置时间范围则不禁用任何日期
|
||||
}
|
||||
|
||||
const startDate = new Date(this.formObj.timeRange[0]).getTime();
|
||||
const endDate = new Date(this.formObj.timeRange[1]).getTime();
|
||||
const currentTime = time.getTime();
|
||||
|
||||
// 禁用不在范围内的日期
|
||||
return currentTime < startDate || currentTime > endDate;
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
// *****************************************************************************************************************
|
||||
created() {
|
||||
let me = this
|
||||
// 获取设备
|
||||
if(me.$route.query.resrce){
|
||||
me.formObj.resrce = me.$route.query.resrce
|
||||
// 通过设备查询描述
|
||||
getResrceByCode({equipmentCode:me.$route.query.resrce}).then((response) => {
|
||||
if (response.data.code === 0) {
|
||||
me.formObj.resrceDesc = response.data.data.description;
|
||||
}
|
||||
})
|
||||
}
|
||||
// 获取作业规则
|
||||
let activityId = this.$route.query.ACTIVITY_ID
|
||||
showLoading()
|
||||
listByActivityId(activityId).then((response) => {
|
||||
hideLoading();
|
||||
if (response.data.code !== 0) {
|
||||
return this.$message.error(response.data.msg)
|
||||
}
|
||||
let optionList = response.data.data
|
||||
for (let i = 0; i < optionList.length; i++) {
|
||||
// 车间
|
||||
if (optionList[i].optionName === 'REASON_CODE_CATEGORY') {
|
||||
let reasonCodeCategory = optionList[i].optionValue
|
||||
// 通过分号截取 赋值给 abnCodeGroupList
|
||||
// 先按分号分割字符串
|
||||
me.abnCodeGroupStringList = reasonCodeCategory.split(';');
|
||||
// 获取异常代码
|
||||
getAbnCodeList(me.abnCodeGroupStringList).then((res) => {
|
||||
me.abnCodeSearchList = res.data.data;
|
||||
})
|
||||
|
||||
// 获取异常代码
|
||||
const codes = reasonCodeCategory.split(';');
|
||||
// 转换为包含value和label的对象数组
|
||||
me.abnCodeGroupList = codes.map(code => ({
|
||||
value: code.trim(),
|
||||
label: code.trim()
|
||||
}));
|
||||
} else if (optionList[i].optionName === 'GET_RESOURCE') {
|
||||
let equipmentCode = optionList[i].optionValue;
|
||||
me.resrceStringList = equipmentCode.split(";")
|
||||
}
|
||||
}
|
||||
}).catch((e) => {
|
||||
hideLoading()
|
||||
})
|
||||
// 获取班次数据
|
||||
getShiftList().then((response) => {
|
||||
this.shiftList = response.data.data;
|
||||
})
|
||||
|
||||
},
|
||||
// *****************************************************************************************************************
|
||||
computed: {
|
||||
...mapGetters(['permissions']),
|
||||
permissionList() {
|
||||
return {};
|
||||
}
|
||||
},
|
||||
// *****************************************************************************************************************
|
||||
methods: {
|
||||
// 过滤设备号
|
||||
fetchFilterResrce(res) {
|
||||
// 获取 作业规则中的 设备号 如果设备号不为空 则进行过滤
|
||||
if (this.resrceStringList) {
|
||||
// 对 records 进行过滤,只保留 resrce 在 resrceStringList 中的记录
|
||||
res.data.data.records = res.data.data.records.filter(record => {
|
||||
// 确保 record 和 record.resrce 存在
|
||||
if (!record || !record.resrce) return false;
|
||||
// 检查当前记录的 resrce 是否在允许的列表中
|
||||
return this.resrceStringList.includes(record.resrce);
|
||||
});
|
||||
}
|
||||
},
|
||||
// 在methods中添加处理异常代码选择变化的方法
|
||||
handleAbnCodeChange(rowIndex) {
|
||||
// 获取选中的数据
|
||||
const currentRow = this.equipmentAbnHistoryList[rowIndex];
|
||||
|
||||
if (!currentRow.abnCode) {
|
||||
// 如果没有选择异常代码,清空相关字段
|
||||
currentRow.abnCodeName = '';
|
||||
return;
|
||||
}
|
||||
|
||||
// 查找选中的异常代码对象
|
||||
const selectedItem = currentRow.abnCodeFilterList.find(item =>
|
||||
item.reasonCode === currentRow.abnCode
|
||||
);
|
||||
|
||||
// 更新异常原因(假设 reasonDesc 是描述字段)
|
||||
currentRow.abnCodeName = selectedItem.description;
|
||||
},
|
||||
// 在methods中添加处理异常代码组选择变化的方法
|
||||
handleAbnCodeGroupChange(rowIndex) {
|
||||
const selectedGroup = this.equipmentAbnHistoryList[rowIndex].abnCodeGroup;
|
||||
|
||||
if (!selectedGroup) {
|
||||
// 如果没有选择组,清空异常代码
|
||||
this.equipmentAbnHistoryList[rowIndex].abnCodeFilterList = [];
|
||||
return;
|
||||
}
|
||||
|
||||
// 更新 abnCodeList 集合
|
||||
this.equipmentAbnHistoryList[rowIndex].abnCodeFilterList = this.abnCodeSearchList.filter(item => item.category === selectedGroup);
|
||||
},
|
||||
// 班次改变事件
|
||||
handleShiftChange(rowIndex) {
|
||||
// 获取当前行的数据
|
||||
const currentRow = this.equipmentAbnHistoryList[rowIndex];
|
||||
|
||||
// 如果没有选择班次或者当前行不存在,直接返回
|
||||
if (!currentRow || !currentRow.shift) return;
|
||||
|
||||
// 在 shiftList 中查找匹配的班次数据
|
||||
const selectedShift = this.shiftList.find(item =>
|
||||
item.userWorkShift === currentRow.shift
|
||||
);
|
||||
if (selectedShift) {
|
||||
currentRow.shiftFrom = selectedShift.shiftFrom;
|
||||
currentRow.shiftTo = selectedShift.shiftTo;
|
||||
}
|
||||
},
|
||||
// 多选事件
|
||||
selectionChangHandle(objs) {
|
||||
// 使用 rowIndex 做为选中标识
|
||||
this.selectObjs = objs.map(obj => obj.rowIndex);
|
||||
this.multiple = !objs.length;
|
||||
},
|
||||
// 移除选定项
|
||||
// doRemoveSelected() {
|
||||
// // 检查是否有选中的行
|
||||
// if (this.selectObjs.length === 0) {
|
||||
// this.$message.warning('请先选择要移除的项');
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// this.$confirm('是否确认移除选中行', {
|
||||
// confirmButtonText: '确认',
|
||||
// cancelButtonText: '取消',
|
||||
// type: 'warning'
|
||||
// }).then(() => {
|
||||
// // 使用 item.id 进行匹配(而不是 handle)
|
||||
// this.equipmentAbnHistoryList = this.equipmentAbnHistoryList.filter(
|
||||
// item => !this.selectObjs.includes(item.id)
|
||||
// );
|
||||
//
|
||||
// // 重置多选状态
|
||||
// this.selectObjs = [];
|
||||
// this.multiple = true;
|
||||
// }).catch(() => {
|
||||
// // 用户点击取消时不做任何操作
|
||||
// console.log('用户取消删除');
|
||||
// });
|
||||
// },
|
||||
|
||||
// 移除选定项
|
||||
doRemoveSelected() {
|
||||
if (this.selectObjs.length === 0) {
|
||||
this.$message.warning('请先选择要移除的项');
|
||||
return;
|
||||
}
|
||||
|
||||
this.$confirm('是否确认移除选中行', {
|
||||
confirmButtonText: '确认',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
// 根据 rowIndex 排序后倒序删除(防止删除顺序影响索引)
|
||||
const sortedIndexes = [...this.selectObjs].sort((a, b) => b - a);
|
||||
|
||||
sortedIndexes.forEach(rowIndex => {
|
||||
this.equipmentAbnHistoryList.splice(rowIndex, 1);
|
||||
});
|
||||
|
||||
// 更新剩余行的 rowIndex
|
||||
this.equipmentAbnHistoryList = this.equipmentAbnHistoryList.map((row, index) => {
|
||||
row.rowIndex = index;
|
||||
return row;
|
||||
});
|
||||
|
||||
// 清空选中状态
|
||||
this.selectObjs = [];
|
||||
this.multiple = true;
|
||||
}).catch(() => {
|
||||
// 用户取消
|
||||
console.log('用户取消删除');
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
// 保存
|
||||
doSave() {
|
||||
let me = this;
|
||||
let obj = {
|
||||
site: me.site,
|
||||
equipmentCode: me.formObj.resrce,
|
||||
shift: me.formObj.shift,
|
||||
creatorName: me.formObj.creatorName,
|
||||
abnCode: me.formObj.abnCode,
|
||||
startTimeStr: formatterDate(me.formObj.timeRange[0], 'yyyy-MM-dd hh:mm:ss'),
|
||||
endTimeStr: formatterDate(me.formObj.timeRange[1], 'yyyy-MM-dd hh:mm:ss'),
|
||||
equipmentAbnHistoryList: this.equipmentAbnHistoryList,
|
||||
}
|
||||
// 保存接口
|
||||
saveEquipAbnHistory(obj).then((res) => {
|
||||
if (res.data.code === 0) {
|
||||
return this.$message.success('保存成功!')
|
||||
}
|
||||
this.doRetrieve(true);
|
||||
})
|
||||
},
|
||||
|
||||
// 添加
|
||||
doAdd() {
|
||||
if (!this.formObj.resrce) {
|
||||
return this.$message.warning("请选择设备编码");
|
||||
}
|
||||
if (!this.formObj.timeRange) {
|
||||
return this.$message.error("请选择生产日期");
|
||||
}
|
||||
this.equipmentAbnHistoryList.push({
|
||||
handle: "",
|
||||
site: this.site,
|
||||
equipmentCode: this.formObj.resrce,
|
||||
equipmentCodeDesc: this.formObj.resrceDesc,
|
||||
shift: '',
|
||||
abnCodeGroup: '',
|
||||
abnCode: '',
|
||||
abnCodeName: '',
|
||||
countermeasure: '',
|
||||
startTime: '',
|
||||
endTime: '',
|
||||
timeConsuming: '',
|
||||
creator: this.userName,
|
||||
creatorName: this.name,
|
||||
shiftFrom: '',
|
||||
shiftTo: '',
|
||||
dateCreate: formatterDate(new Date(), 'yyyy-MM-dd hh:mm:ss'),
|
||||
abnCodeFilterList: []
|
||||
})
|
||||
},
|
||||
// 检查时间改变
|
||||
dateChange(t, rowIndex) {
|
||||
let me = this;
|
||||
|
||||
// 获取当前行的数据
|
||||
const row = me.equipmentAbnHistoryList[rowIndex];
|
||||
|
||||
// 确保行存在
|
||||
if (!row) return;
|
||||
|
||||
if (!row.shift) {
|
||||
row.startTime = '';
|
||||
row.endTime = '';
|
||||
return me.$message.error('请先选择班次!');
|
||||
}
|
||||
|
||||
let date1 = row.startTime ? new Date(row.startTime) : null;
|
||||
let date2 = row.endTime ? new Date(row.endTime) : null;
|
||||
|
||||
// 获取班次时间段(时分格式)
|
||||
const shiftFrom = row.shiftFrom; // 格式:"HH:mm"
|
||||
const shiftTo = row.shiftTo; // 格式:"HH:mm"
|
||||
|
||||
// 将时间转换为分钟数进行比较
|
||||
const [fromHour, fromMinute] = shiftFrom.split(':').map(Number);
|
||||
const [toHour, toMinute] = shiftTo.split(':').map(Number);
|
||||
const shiftFromMinutes = fromHour * 60 + fromMinute;
|
||||
const shiftToMinutes = toHour * 60 + toMinute;
|
||||
|
||||
// 计算班次时间段总分钟数(可能跨天)
|
||||
let shiftDurationMinutes;
|
||||
if (shiftFromMinutes <= shiftToMinutes) {
|
||||
shiftDurationMinutes = shiftToMinutes - shiftFromMinutes;
|
||||
} else {
|
||||
// 跨天情况,假设第二天
|
||||
shiftDurationMinutes = (24 * 60 - shiftFromMinutes) + shiftToMinutes;
|
||||
}
|
||||
|
||||
// 校验开始时间
|
||||
if (t === 'START' && date1) {
|
||||
const date1Minutes = date1.getHours() * 60 + date1.getMinutes();
|
||||
|
||||
if ((shiftFromMinutes <= shiftToMinutes &&
|
||||
(date1Minutes < shiftFromMinutes || date1Minutes > shiftToMinutes)) ||
|
||||
(shiftFromMinutes > shiftToMinutes &&
|
||||
(date1Minutes < shiftFromMinutes && date1Minutes > shiftToMinutes))) {
|
||||
|
||||
row.startTime = '';
|
||||
row.timeConsuming = '';
|
||||
return me.$message.warning('请选择班次时间段内的开始时间');
|
||||
}
|
||||
|
||||
// 新增:校验同一设备、同班次下后续记录的开始时间不能大于前一条记录的开始时间
|
||||
// 查找同一设备、同班次的所有之前记录
|
||||
const sameRecords = me.equipmentAbnHistoryList
|
||||
.filter((item, index) =>
|
||||
item.equipmentCode === row.equipmentCode &&
|
||||
item.shift === row.shift &&
|
||||
index < rowIndex // 只检查之前的记录
|
||||
);
|
||||
// 如果有之前的记录
|
||||
if (sameRecords.length > 0) {
|
||||
// 获取最后一条记录
|
||||
const lastRecord = sameRecords[sameRecords.length - 1];
|
||||
// 比较开始时间
|
||||
if (lastRecord.endTime) {
|
||||
const lastDate = new Date(lastRecord.endTime);
|
||||
|
||||
// 如果当前开始时间大于最后一条记录的开始时间
|
||||
if (date1 < lastDate) {
|
||||
row.startTime = '';
|
||||
row.timeConsuming = '';
|
||||
return me.$message.warning(`同一个设备【${me.equipmentAbnHistoryList[rowIndex].equipmentCode}】相同班次【${me.equipmentAbnHistoryList[rowIndex].shift}】相同时间段内不能维护多笔数据!`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 校验结束时间
|
||||
if (t === 'END' && date2) {
|
||||
const date2Minutes = date2.getHours() * 60 + date2.getMinutes();
|
||||
|
||||
if ((shiftFromMinutes <= shiftToMinutes
|
||||
&& (date2Minutes < shiftFromMinutes || date2Minutes > shiftToMinutes)) ||
|
||||
(shiftFromMinutes > shiftToMinutes &&
|
||||
(date2Minutes < shiftFromMinutes && date2Minutes > shiftToMinutes))) {
|
||||
|
||||
row.endTime = '';
|
||||
row.timeConsuming = '';
|
||||
return me.$message.warning('请选择班次时间段内的结束时间');
|
||||
}
|
||||
}
|
||||
|
||||
// 如果是开始时间修改且两个时间都存在
|
||||
if (t === 'START' && date1 && date2 && date1 > date2) {
|
||||
row.startTime = '';
|
||||
row.timeConsuming = '';
|
||||
return me.$message.warning('开始时间不能大于结束时间');
|
||||
}
|
||||
|
||||
// 如果是结束时间修改且两个时间都存在
|
||||
if (t === 'END' && date1 && date2 && date1 > date2) {
|
||||
row.endTime = '';
|
||||
row.timeConsuming = '';
|
||||
return me.$message.warning('结束时间不能小于开始时间');
|
||||
}
|
||||
|
||||
// 新增:校验时间范围是否超过班次时间段限制
|
||||
if (date1 && date2) {
|
||||
const diffMs = Math.abs(date2 - date1);
|
||||
const diffMinutes = Math.floor(diffMs / (1000 * 60));
|
||||
|
||||
if (diffMinutes > shiftDurationMinutes) {
|
||||
row.startTime = '';
|
||||
row.endTime = '';
|
||||
row.timeConsuming = '';
|
||||
return me.$message.warning(`开始时间和结束时间不能超过班次时间段限制`);
|
||||
}
|
||||
}
|
||||
|
||||
// 计算时间差(分钟)
|
||||
if (date1 && date2) {
|
||||
const diffMs = Math.abs(date2 - date1);
|
||||
const diffMinutes = Math.floor(diffMs / (1000 * 60));
|
||||
row.timeConsuming = diffMinutes.toString(); // 更新耗时字段
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
|
||||
// 弹出框通用选择
|
||||
dialogSelected(row, type) {
|
||||
switch (type) {
|
||||
case 'resrce':
|
||||
this.formObj.resrce = row.resrce;
|
||||
this.formObj.resrceDesc = row.resrceDesc;
|
||||
break;
|
||||
}
|
||||
},
|
||||
// 弹出框通用打开
|
||||
openDialog(type) {
|
||||
switch (type) {
|
||||
case 'resrce':
|
||||
this.resrceDialogObj.visible = true;
|
||||
this.resrceDialogObj.fetchFun = fetchSearchTextPage;
|
||||
break;
|
||||
}
|
||||
},
|
||||
// 获取数据字典
|
||||
getDataDictionary(dictType, list) {
|
||||
fetchDictList({
|
||||
current: "1",
|
||||
size: "1000",
|
||||
dictType: dictType,
|
||||
}).then((response) => {
|
||||
this[list] = response.data.data.records
|
||||
});
|
||||
},
|
||||
|
||||
// 页面大小改变
|
||||
handleSizeChange(val) {
|
||||
this.page.size = val;
|
||||
this.page.current = 1;
|
||||
this.doRetrieve();
|
||||
},
|
||||
//页面切换
|
||||
handleCurrentChange(val) {
|
||||
this.page.current = val;
|
||||
this.doRetrieve();
|
||||
},
|
||||
|
||||
// 【检索按钮】方法
|
||||
doRetrieve(flag) {
|
||||
let me = this;
|
||||
if (flag) {
|
||||
me.page.current = 1;
|
||||
}
|
||||
if (!me.formObj.resrce) {
|
||||
return me.$message.error("请选择设备");
|
||||
}
|
||||
if (!me.formObj.timeRange) {
|
||||
return me.$message.error("请选择生产日期");
|
||||
}
|
||||
let obj = {
|
||||
site: me.site,
|
||||
equipmentCode: me.formObj.resrce,
|
||||
shift: me.formObj.shift,
|
||||
creatorName: me.formObj.creatorName,
|
||||
abnCode: me.formObj.abnCode,
|
||||
startTimeStr: formatterDate(me.formObj.timeRange[0], 'yyyy-MM-dd hh:mm:ss'),
|
||||
endTimeStr: formatterDate(me.formObj.timeRange[1], 'yyyy-MM-dd hh:mm:ss'),
|
||||
};
|
||||
showLoading();
|
||||
getEquipAbnHistoryPage(Object.assign({
|
||||
current: me.page.current,
|
||||
size: me.page.size,
|
||||
site: this.site
|
||||
}, obj)).then(response => {
|
||||
hideLoading();
|
||||
if (!response.data.data || response.data.data.length === 0) {
|
||||
this.$message.error('检索无数据');
|
||||
this.doClear();
|
||||
return false;
|
||||
}
|
||||
me.equipmentAbnHistoryList = response.data.data.records;
|
||||
me.page.total = response.data.data.total;
|
||||
me.page.current = response.data.data.current;
|
||||
}).catch(() => {
|
||||
hideLoading();
|
||||
});
|
||||
},
|
||||
// 【清空按钮】方法
|
||||
doClear() {
|
||||
let me = this;
|
||||
me.formObj = {};
|
||||
me.equipmentAbnHistoryList = []
|
||||
me.page = {
|
||||
total: 0,
|
||||
current: 1,
|
||||
size: 20
|
||||
}
|
||||
},
|
||||
// 【导出按钮】方法
|
||||
doExport() {
|
||||
let me = this;
|
||||
|
||||
let search = {
|
||||
site: me.site,
|
||||
equipmentCode: me.formObj.resrce,
|
||||
shift: me.formObj.shift,
|
||||
creatorName: me.formObj.creatorName,
|
||||
abnCode: me.formObj.abnCode,
|
||||
startTimeStr: formatterDate(me.formObj.timeRange[0], 'yyyy-MM-dd hh:mm:ss'),
|
||||
endTimeStr: formatterDate(me.formObj.timeRange[1], 'yyyy-MM-dd hh:mm:ss'),
|
||||
};
|
||||
this.downBlobFile("/iep-app/equipment-abn-history/tablePageExport", search, "设备异常履历.xlsx");
|
||||
},
|
||||
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
35
src/views/mes/wip-nalinv/equipment-abn-history/init.js
Normal file
35
src/views/mes/wip-nalinv/equipment-abn-history/init.js
Normal file
@ -0,0 +1,35 @@
|
||||
import {getStore} from "@/util/store";
|
||||
|
||||
|
||||
export const resrceInitDialogObj= {
|
||||
callBackKey: "resrce",
|
||||
regex: ";",
|
||||
condition: "resrce",
|
||||
tableColumn: [
|
||||
{prop: "resrce", label: "设备编码"},
|
||||
{prop: "resrceDesc", label: "设备描述"}
|
||||
],
|
||||
queryParam: {
|
||||
site: getStore({name: 'tenantId'}),
|
||||
searchTextByGroup: "resrce",
|
||||
},
|
||||
visible: false,
|
||||
fetchFun: null,
|
||||
}
|
||||
|
||||
export const initFormObj = {
|
||||
resrce: "",
|
||||
resrceDesc: "",
|
||||
shift: "",
|
||||
creator: "",
|
||||
abnCode: "",
|
||||
startTime: "",
|
||||
endTime: "",
|
||||
timeRange: "",
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user