<template>
|
<view class="page">
|
<!--调机送检-->
|
<!-- 右上角刷新按钮 -->
|
<view class="top-right">
|
<button class="refresh-btn" @click="refresh">刷新</button>
|
</view>
|
|
<!-- 中间状态部分,上下结构,包含调机流程的三个步骤 -->
|
<view class="middle-section">
|
<view class="item" style="height: 100px;">
|
<h4>
|
<!--说明:
|
1.点击'调机开始'、'送检呼叫'后再点击'保存生效'<br />
|
2.主界面首检合格后再点击'保存生效'<br />
|
3.首检不合格再点击'保存生效'会清空送检时间<br />
|
4.清空送检时间后点击‘检验不合格重新送检呼叫’再保存-->
|
</h4>
|
</view>
|
<view class="item">
|
<!-- 调机开始按钮,maStartTime有值时禁用 -->
|
<button :class="maStartTime ? 'btn-disabled' : 'btn-blue'"
|
:disabled="!!maStartTime"
|
@click="handleMaStartTime">
|
调机开始
|
</button>
|
<!-- 显示调机开始时间 -->
|
<input class="txt-inp" v-model="maStartTime" placeholder="点击按钮带出调机时间" disabled="true" />
|
</view>
|
<view class="item">
|
<!-- 送检呼叫按钮,maShoutTime有值时禁用 -->
|
<button :class="maShoutTime ? 'btn-disabled' : 'btn-blue'"
|
:disabled="!!maShoutTime"
|
@click="handleMaShoutTime">
|
送检呼叫
|
</button>
|
<!-- 显示送检呼叫时间 -->
|
<input class="txt-inp" v-model="maShoutTime" placeholder="点击按钮带出送检时间" disabled="true" />
|
</view>
|
<!--<view class="item">-->
|
<!-- 调机完成按钮,maEndTime有值时禁用 -->
|
<!--<button :class="maEndTime ? 'btn-disabled' : 'btn-blue'"
|
:disabled="!!maEndTime"
|
@click="handleMaEndTime">
|
调机完成(=检验通过)
|
</button>-->
|
<!-- 显示调机完成时间 -->
|
<!--<input class="txt-inp" v-model="maEndTime" placeholder="首次首检确认通过写入" disabled="true" />
|
</view>-->
|
<view class="item">
|
<button class="btn-disabled" disabled>
|
调机完成(=检验通过=开工)
|
</button>
|
<input class="txt-inp" v-model="maEndTime" placeholder="首次首检确认通过写入" disabled="true" />
|
</view>
|
|
<!--启用该功能-->
|
<!--新增:检验不合格送检呼叫 按钮(功能与送检呼叫一样,仅在特定 remark 下可以点击)-->
|
<view class="item">
|
<!--检验不合格送检呼叫按钮,仅在 remark 为指定文本 且 当前无送检时间 时可点击-->
|
<button :class="canFailResend ? 'btn-blue' : 'btn-disabled'"
|
:disabled="!canFailResend"
|
@click="ReHandleMaShoutTime">
|
检验不合格重新送检呼叫
|
</button>
|
<!--仍复用同一送检时间字段,避免重复状态-->
|
<input class="txt-inp"
|
v-model="maShoutTime"
|
placeholder="首检不合格重新呼叫时点击按钮带出送检时间"
|
disabled="true" />
|
</view>
|
|
</view>
|
|
<!-- 底部保存/取消按钮 -->
|
<view class="bottom-section">
|
<!-- 只有调机完成未填写时才可保存 -->
|
<button class="save-btn" v-if="!maEndTime" @click="save">保存并生效</button>
|
<!-- 已完成时保存按钮禁用 -->
|
<button class="btn-disabled" v-else>保存并生效</button>
|
<button class="cancel-btn" @click="cancel">取消</button>
|
</view>
|
|
</view>
|
</template>
|
|
<script>
|
export default {
|
props: {
|
orderNo: String, // 工单号
|
orderId: Number, // 工单ID
|
machineNo: String // 机台号
|
},
|
data() {
|
return {
|
maShoutTime: '', // 送检呼叫时间
|
maStartTime: '', // 调机开始时间
|
maEndTime: '', // 调机完成时间
|
statusForm: {}, // 工单状态表单数据(包含 remark 字段)
|
flag: -1, // 操作标记
|
failedRemark: '首检不合格,送检时间已清空,请重新送检呼叫生成新的首检单' // 首检不合格后由后端返回的提示
|
}
|
},
|
computed: {
|
// 满足首检不合格重新呼叫条件且当前尚未重新生成送检时间 => 按钮可用
|
canFailResend() {
|
return this.statusForm &&
|
this.statusForm.remark === this.failedRemark &&
|
!this.maShoutTime;
|
}
|
},
|
created() {
|
// 组件创建时自动加载工单数据
|
if (!this.orderId && !this.orderNo) {
|
return;
|
}
|
this.findByOrderId();
|
},
|
methods: {
|
// 处理调机开始按钮点击
|
handleMaStartTime() {
|
if (!this.maStartTime) {
|
this.setMaStartTime();
|
this.flag = -1; // 调机开始按钮按下时回传的flag=-1
|
}
|
},
|
// 处理送检呼叫按钮点击(不含首检不合格重呼叫)
|
handleMaShoutTime() {
|
if (!this.maShoutTime) {
|
this.stateCheck(1);
|
}
|
},
|
// 首检不合格重呼叫:flag = 2
|
ReHandleMaShoutTime() {
|
if (!this.maShoutTime && this.canFailResend) {
|
this.stateCheck(2);
|
}
|
},
|
// 处理调机完成按钮点击
|
handleMaEndTime() {
|
if (!this.maEndTime) {
|
this.setMaEndTime();
|
}
|
},
|
// 设置调机开始时间为当前时间
|
setMaStartTime() {
|
this.maStartTime = this.$getDate('yyyy-mm-dd hh24:mi:ss');
|
},
|
// 设置调机完成时间为当前时间
|
setMaEndTime() {
|
console.log('调机完成按钮被点击');
|
this.maEndTime = this.$getDate('yyyy-mm-dd hh24:mi:ss');
|
},
|
// 刷新工单数据(局部刷新当前组件)
|
refresh() {
|
this.findByOrderId();
|
},
|
// 保存并生效,将时间等信息提交到后端
|
// 变更:返回 Promise;成功后局部刷新(调用 findByOrderId)而不是整页 reload
|
save() {
|
if (!this.statusForm.id) {
|
this.$showMessage("id为空,不允许推送");
|
return Promise.resolve();
|
}
|
return this.$post({
|
url: "/MesOrderSta/ChangeMachineTime",
|
data: {
|
maStartTime: this.maStartTime,
|
maShoutTime: this.maShoutTime,
|
maEndTime: this.maEndTime,
|
id: this.statusForm.id,
|
orderId: this.orderId,
|
machineNo: this.machineNo,
|
flag: this.flag
|
}
|
}).then(res => {
|
if (res && res.data && res.data.tbBillList) {
|
this.$showMessage("呼叫成功");
|
|
// 关键修改:清空 flag 的值
|
this.flag = -1; // 或者根据业务需求设置为其他初始值
|
|
// 方案1:使用uni-app的页面刷新方法
|
// 方法1:触发下拉刷新(如果页面支持)
|
if (uni.startPullDownRefresh) {
|
uni.startPullDownRefresh();
|
// 2秒后停止刷新
|
setTimeout(() => {
|
uni.stopPullDownRefresh();
|
}, 2000);
|
}
|
|
// 方法2:重新调用页面的onLoad方法(推荐)
|
const pages = getCurrentPages();
|
const currentPage = pages[pages.length - 1];
|
if (currentPage && currentPage.onLoad) {
|
// 保存当前页面参数
|
const pageOptions = currentPage.options || {};
|
// 重新加载页面数据
|
currentPage.onLoad(pageOptions);
|
}
|
|
// 方法3:同时刷新组件数据
|
this.findByOrderId();
|
|
} else {
|
this.$showMessage("呼叫失败");
|
this.cancel();
|
}
|
return res;
|
}).catch(err => {
|
console.error('保存失败:', err);
|
this.$showMessage("保存时发生错误");
|
throw err;
|
});
|
},
|
// 取消操作,恢复为上次保存的数据
|
cancel() {
|
this.maShoutTime = this.statusForm.maShoutTime;
|
this.maStartTime = this.statusForm.maStartTime;
|
this.maEndTime = this.statusForm.maEndTime;
|
},
|
// 送检呼叫,item=1时设置送检呼叫时间
|
// 送检呼叫与重新送检呼叫以及调机开始对应的 flag 值
|
// flag 说明:-1 = 调机开始;1 = 首次送检呼叫;2 = 不合格重新送检呼叫
|
stateCheck(item) {
|
switch (item) {
|
case 0:
|
break;
|
case 1:// 首次送检呼叫
|
this.maShoutTime = this.$getDate('yyyy-mm-dd hh24:mi:ss');
|
//this.flag = -1; // 送检呼叫有值后,flag始终为-1
|
break;
|
case 2:// 检验不合格重新送检呼叫
|
this.maShoutTime = this.$getDate('yyyy-mm-dd hh24:mi:ss');
|
//this.flag = -1; // 送检呼叫有值后,flag始终为-1
|
break;
|
default:
|
// 其它值不处理
|
break;
|
}
|
this.flag = item;
|
},
|
// 根据工单号/ID获取工单状态数据
|
findByOrderId() {
|
this.$post({
|
url: "/MesOrderSta/FindByOrderNo",
|
data: {
|
orderId: this.orderId,
|
orderNo: this.orderNo
|
}
|
}).then(res => {
|
this.statusForm = res.data.tbBillList;
|
this.maShoutTime = res.data.tbBillList.maShoutTime;
|
this.maStartTime = res.data.tbBillList.maStartTime;
|
this.maEndTime = res.data.tbBillList.maEndTime;
|
})
|
}
|
},
|
mounted() {
|
// 页面加载时,启动定时器,每隔30秒自动保存
|
this.autoSaveTimer = setInterval(() => {
|
// 1. 调机完成时间有了就不自动保存
|
if (this.maEndTime) {
|
return;
|
}
|
// 2. 送检时间为空也不自动保存
|
if (!this.maShoutTime) {
|
return;
|
}
|
this.save(); // 满足条件才自动保存
|
}, 1 * 30 * 1000); // 30秒
|
},
|
beforeDestroy() {
|
// 页面卸载时清理定时器
|
clearInterval(this.autoSaveTimer);
|
},
|
};
|
</script>
|
|
<style scoped>
|
/* 页面整体布局 */
|
.page {
|
padding: 8px;
|
display: flex;
|
flex-direction: column;
|
justify-content: space-between;
|
box-sizing: border-box;
|
height: 100%;
|
}
|
|
/* 右上角刷新按钮 */
|
.top-right {
|
position: absolute;
|
top: 8px;
|
right: 40px;
|
width: 200px;
|
z-index: 1000;
|
}
|
|
.refresh-btn {
|
padding: 8px 16px;
|
background-color: #00A2E9;
|
color: white;
|
border: none;
|
font-size: 24px;
|
border-radius: 5px;
|
}
|
|
label {
|
margin-right: 10px;
|
font-size: 24px;
|
}
|
|
/* 中间状态部分布局 */
|
.middle-section {
|
display: flex;
|
flex-direction: column;
|
margin-bottom: 8px;
|
}
|
|
.item {
|
display: flex;
|
flex-direction: row;
|
align-items: center;
|
margin-bottom: 10px;
|
gap: 10px;
|
}
|
|
.item h4 {
|
font-size: 24px;
|
line-height: 1.4;
|
margin: 0;
|
padding: 5px 0;
|
}
|
|
button {
|
width: 50%;
|
flex-shrink: 0;
|
padding: 10px;
|
font-size: 24px;
|
border: none;
|
text-align: center;
|
min-height: 40px;
|
}
|
|
.btn-disabled {
|
background-color: #ccc;
|
color: white;
|
}
|
|
.btn-blue {
|
background-color: #00A2E9;
|
color: white;
|
}
|
|
input {
|
margin-top: 0;
|
padding: 8px;
|
font-size: 24px;
|
border: 1px solid #ccc;
|
width: 50%;
|
flex-grow: 1;
|
box-sizing: border-box;
|
}
|
|
/* 底部保存/取消按钮布局 */
|
.bottom-section {
|
display: flex;
|
justify-content: space-between;
|
margin-top: 10px;
|
padding-top: 10px;
|
}
|
|
.save-btn,
|
.cancel-btn {
|
width: 48%;
|
padding: 12px;
|
background-color: #00A2E9;
|
color: white;
|
font-size: 24px;
|
border: none;
|
text-align: center;
|
min-height: 45px;
|
}
|
|
.txt-inp {
|
height: 80px; /* 增大高度 */
|
padding: 12px; /* 增大内边距 */
|
font-size: 24px; /* 增大字体 */
|
width: 50%;
|
flex-grow: 1;
|
box-sizing: border-box;
|
margin-top: 0;
|
}
|
|
/* 针对1280*717屏幕的特定优化 */
|
@media screen and (max-width: 1280px) and (max-height: 800px) {
|
.page {
|
padding: 6px;
|
}
|
|
.middle-section {
|
margin-bottom: 6px;
|
}
|
|
.item {
|
margin-bottom: 8px;
|
}
|
|
.item h4 {
|
font-size: 24px;
|
padding: 3px 0;
|
}
|
|
button {
|
padding: 8px;
|
font-size: 24px;
|
min-height: 38px;
|
}
|
|
.txt-inp {
|
height: 46px;
|
padding: 10px;
|
font-size: 24px;
|
}
|
|
.bottom-section {
|
margin-top: 8px;
|
padding-top: 8px;
|
}
|
|
.save-btn,
|
.cancel-btn {
|
padding: 10px;
|
font-size: 24px;
|
min-height: 42px;
|
}
|
|
input {
|
font-size: 24px;
|
}
|
|
.refresh-btn {
|
font-size: 24px;
|
}
|
|
label {
|
font-size: 24px;
|
}
|
}
|
</style>
|