445 lines
13 KiB
Vue
445 lines
13 KiB
Vue
<template>
|
||
<view style="background-color: #fff;">
|
||
<uni-forms ref="form" :modelValue="formData" :rules="rules">
|
||
<uni-row>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="工单编码" :labelWidth='100' name="pwoCode">
|
||
<uni-easyinput suffixIcon="scan" @iconClick="scanBar" type="text" v-model="formData.pwoCode"
|
||
@blur="scanBarCode" :key="input.boolean" :focus='true' />
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="作业编码" :labelWidth='100' name="pwoJobCode">
|
||
<uni-data-select :localdata="formData.pwoJobs" v-model="formData.pwoJobCode"
|
||
@change="getJobInfo"></uni-data-select>
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="产品编码" :labelWidth='100' name="ptNoTar">
|
||
<uni-easyinput disabled type="text" v-model="formData.ptNoTar" />
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="产品名称" :labelWidth='100' name="ptTitleTar">
|
||
<uni-easyinput disabled type="text" v-model="formData.ptTitleTar" />
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="设备编号" :labelWidth='100' name="machineId">
|
||
<uni-easyinput disabled type="text" v-model="formData.machineId" />
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="批号" :labelWidth='100' name="batchNo">
|
||
<uni-easyinput disabled type="text" v-model="formData.batchNo" />
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="制程编码" :labelWidth='100' name="opCode">
|
||
<uni-easyinput disabled type="text" v-model="formData.opCode" />
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="制程名称" :labelWidth='100' name="opTitle">
|
||
<uni-easyinput disabled type="text" v-model="formData.opTitle" />
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="用时(h)" :labelWidth='100' name="timeTake">
|
||
<uni-easyinput type="number" v-model="formData.timeTake" />
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="生产员工编码" :labelWidth='100' name="createByCode">
|
||
<uni-easyinput type="text" suffixIcon="scan" @iconClick="scanBar1" @blur="scanBarCreateBy"
|
||
v-model="formData.createByCode" />
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="生产员工" :labelWidth='100' name="createByName">
|
||
<uni-easyinput disabled type="text" v-model="formData.createByName" />
|
||
</uni-forms-item>
|
||
<u-divider :text="'可报工数量:'+reportableNum"></u-divider>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="合格数量" :labelWidth='100' name="pass">
|
||
<u-number-box button-size="36" inputWidth="120"
|
||
v-model="formData.mesJobReportOnceRequestDTO.pass.reportNumber" min="0"></u-number-box>
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="不良数量" :labelWidth='100' name="defect">
|
||
<u-number-box button-size="36" inputWidth="120"
|
||
v-model="formData.mesJobReportOnceRequestDTO.defect.reportNumber" min="0"></u-number-box>
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="不良原因" :labelWidth='100' name="defectReason">
|
||
<uni-data-select v-model="formData.mesJobReportOnceRequestDTO['defect'].reason"
|
||
:localdata="defectReasonOptions"></uni-data-select>
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="报废数量" :labelWidth='100' name="scrap">
|
||
<u-number-box button-size="36" inputWidth="120"
|
||
v-model="formData.mesJobReportOnceRequestDTO.scrap.reportNumber" min="0"></u-number-box>
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="报废原因" :labelWidth='100' name="scrapReason">
|
||
<uni-data-select v-model="formData.mesJobReportOnceRequestDTO['scrap'].reason"
|
||
:localdata="scrapReasonOptions"></uni-data-select>
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="损耗数量" :labelWidth='100' name="loss">
|
||
<u-number-box button-size="36" inputWidth="120"
|
||
v-model="formData.mesJobReportOnceRequestDTO.loss.reportNumber" min="0"></u-number-box>
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="损耗原因" :labelWidth='100' name="lossReason">
|
||
<uni-data-select v-model="formData.mesJobReportOnceRequestDTO['loss'].reason"
|
||
:localdata="lossReasonOptions"></uni-data-select>
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="开工时间" :labelWidth='100'>
|
||
<view class="example-body">
|
||
<uni-datetime-picker type="datetime" v-model="formData.startTime" />
|
||
</view>
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="完工时间" :labelWidth='100' name="endTime">
|
||
<view class="example-body">
|
||
<uni-datetime-picker type="datetime" v-model="formData.endTime" />
|
||
</view>
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
<uni-col :span="24">
|
||
<uni-forms-item label="备注" :labelWidth='100' name="remark">
|
||
<uni-easyinput autoHeight type="textarea" v-model="formData.remark"></uni-easyinput>
|
||
</uni-forms-item>
|
||
</uni-col>
|
||
</uni-row>
|
||
</uni-forms>
|
||
<u-button type="primary" @click="submit">提交</u-button>
|
||
<!-- <u-button type="primary" @click="end">关闭</u-button> -->
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import {
|
||
listPwoJob,
|
||
addReport,
|
||
getEquipment,
|
||
addReportOnce
|
||
} from "@/api/mes/jobReport.js";
|
||
import { listPwoJobLike } from "@/api/mes/pwoIn.js";
|
||
import {
|
||
listEmpEqpHistory,
|
||
listEmployee,
|
||
listConversion
|
||
} from "@/api/mes/jobIn.js";
|
||
import { getDicts } from "@/api/system/dict/dictData.js";
|
||
import { login } from "../../../api/login";
|
||
// const serialPort = uni.requireNativePlugin('Fvv-UniSerialPort')
|
||
export default {
|
||
data() {
|
||
return {
|
||
input: {
|
||
boolean: 0,
|
||
inputValue: '',
|
||
},
|
||
//判断是否从工单状态页面查询过来
|
||
isSearchRoute: false,
|
||
lossReasonOptions: [],
|
||
scrapReasonOptions: [],
|
||
defectReasonOptions: [],
|
||
formData: {
|
||
pwoJobCode: null,
|
||
pwoJobs: [],
|
||
pwoCode: null,
|
||
ptNoTar: null,
|
||
ptTitleTar: null,
|
||
opTitle: null,
|
||
opCode: null,
|
||
machineId: null,
|
||
batchNo: null,
|
||
createByName: null,
|
||
createByCode: null,
|
||
createById: null,
|
||
remark: null,
|
||
mesJobReportOnceRequestDTO: {
|
||
pass: {
|
||
reportNumber: 0,
|
||
reason: null
|
||
},
|
||
defect: {
|
||
reportNumber: 0,
|
||
reason: null
|
||
},
|
||
scrap: {
|
||
reportNumber: 0,
|
||
reason: null
|
||
},
|
||
loss: {
|
||
reportNumber: 0,
|
||
reason: null
|
||
}
|
||
},
|
||
startTime: null,
|
||
endTime: null,
|
||
},
|
||
reportableNum: 0,
|
||
rules: {
|
||
pwoCode: {
|
||
rules: [{
|
||
required: true,
|
||
errorMessage: '请输入工单编码!'
|
||
}]
|
||
},
|
||
pwoJobCode: {
|
||
rules: [{
|
||
required: true,
|
||
errorMessage: '请选择作业编码!'
|
||
}]
|
||
},
|
||
createByCode: {
|
||
rules: [{
|
||
required: true,
|
||
errorMessage: '请输入生产员工编码!'
|
||
}]
|
||
},
|
||
endTime: {
|
||
rules: [{
|
||
required: true,
|
||
errorMessage: '请输入完工时间!'
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
},
|
||
methods: {
|
||
test() {
|
||
serialPort.sendHex("A00102A3")
|
||
},
|
||
end() {
|
||
serialPort.sendHex("A00100A1")
|
||
},
|
||
getOptions() {
|
||
getDicts("mes_job_report_defect").then(res => {
|
||
this.defectReasonOptions = res.data.map(dict => {
|
||
return {
|
||
text: dict.dictLabel,
|
||
value: dict.dictValue,
|
||
diasble: false
|
||
}
|
||
});
|
||
})
|
||
getDicts("mes_job_report_scrap").then(res => {
|
||
this.scrapReasonOptions = res.data.map(dict => {
|
||
return {
|
||
text: dict.dictLabel,
|
||
value: dict.dictValue,
|
||
diasble: false
|
||
}
|
||
});
|
||
})
|
||
getDicts("mes_job_report_loss").then(res => {
|
||
this.lossReasonOptions = res.data.map(dict => {
|
||
return {
|
||
text: dict.dictLabel,
|
||
value: dict.dictValue,
|
||
diasble: false
|
||
}
|
||
});
|
||
})
|
||
},
|
||
submit() {
|
||
if (this.sumReportNum() <= 0 || this.sumReportNum() > this.reportableNum) {
|
||
this.$modal.showToast("请重新检查报工数量")
|
||
return
|
||
}
|
||
this.$refs.form.validate().then(res => {
|
||
this.$modal.loading('提交中')
|
||
addReportOnce(this.formData).then(res => {
|
||
this.$modal.closeLoading();
|
||
this.$modal.msgSuccess("报工成功!");
|
||
if (this.isSearchRoute = true) {
|
||
setTimeout(() => {
|
||
this.$tab.navigateBack();
|
||
}, 500);
|
||
} else {
|
||
setTimeout(() => {
|
||
this.$tab.switchTab("/pages/work/index");
|
||
}, 500);
|
||
}
|
||
})
|
||
})
|
||
},
|
||
sumReportNum() {
|
||
const sum = ['pass', 'defect', 'scrap', 'loss'].reduce((total, key) => {
|
||
const value = Number(this.formData.mesJobReportOnceRequestDTO[key].reportNumber)
|
||
this.formData.mesJobReportOnceRequestDTO[key].reportNumber = value
|
||
return total + value
|
||
}, 0)
|
||
|
||
return sum
|
||
},
|
||
scanBarCode() {
|
||
if (this.formData.pwoCode) {
|
||
this.formData.pwoJobs = []
|
||
this.formData.pwoJobCode = null
|
||
this.clearJobInfo()
|
||
listPwoJob({
|
||
pwoCode: this.formData.pwoCode
|
||
}).then((res) => {
|
||
if (res.rows.length > 0) {
|
||
this.$set(this.formData, "pwoJobs", res.rows.map(item => ({
|
||
text: item.code + ":" + item.opTitle,
|
||
value: item.code,
|
||
disabled: false
|
||
})))
|
||
console.log(this.formData.pwoJobs)
|
||
} else {
|
||
this.$modal.showToast("未查询到该工单编码")
|
||
}
|
||
})
|
||
}
|
||
},
|
||
clearJobInfo() {
|
||
this.reportableNum = 0
|
||
const resetFields = [
|
||
"ptNoTar", "ptTitleTar", "batchNo",
|
||
"createByName", "createByCode", "createById", "remark", "startTime",
|
||
"machineId", "opCode", "opTitle"
|
||
]
|
||
// 重置表单信息
|
||
resetFields.forEach(field => {
|
||
this.$set(this.formData, field, null)
|
||
})
|
||
// 重置报工数量
|
||
Object.keys(this.formData.mesJobReportOnceRequestDTO).forEach(key => {
|
||
const item = this.formData.mesJobReportOnceRequestDTO[key];
|
||
this.$set(item, 'reportNumber', 0);
|
||
this.$set(item, 'reason', null);
|
||
});
|
||
},
|
||
async getJobInfo(e) {
|
||
this.formData.pwoJobCode = e
|
||
if (this.formData.pwoJobCode) {
|
||
this.clearJobInfo()
|
||
|
||
await listPwoJob({
|
||
code: this.formData.pwoJobCode
|
||
}).then(async res => {
|
||
this.formData.ptNoTar = res.rows[0].ptNoTar
|
||
this.formData.ptTitleTar = res.rows[0].ptTitleTar
|
||
this.formData.opCode = res.rows[0].opCode
|
||
this.formData.opTitle = res.rows[0].opTitle
|
||
this.formData.batchNo = res.rows[0].batchNo
|
||
this.reportableNum = res.rows[0].targetNum - res.rows[0].finishQty
|
||
|
||
await listPwoJobLike({
|
||
code: this.formData.pwoJobCode
|
||
}).then(res => {
|
||
this.formData.eqpId = res.rows[0].eqpId
|
||
})
|
||
if (this.formData.eqpId) {
|
||
getEquipment(this.formData.eqpId).then(res => {
|
||
this.formData.machineId = res.data.equipmentCode
|
||
}).catch(() => {
|
||
this.$modal.showToast("获取设备编号失败")
|
||
})
|
||
}
|
||
}).catch(() => {
|
||
this.$modal.showToast("获取作业信息失败!")
|
||
})
|
||
}
|
||
},
|
||
scanBarCreateBy() {
|
||
if (this.formData.createByCode) {
|
||
let obj = {
|
||
empCode: this.formData.createByCode
|
||
}
|
||
listEmployee(obj).then(async res => {
|
||
if (res.rows.length != 0) {
|
||
this.formData.createByName = res.rows[0].name;
|
||
this.formData.createById = res.rows[0].id;
|
||
} else {
|
||
this.$modal.msg("未查询到该人员信息!");
|
||
}
|
||
});
|
||
}
|
||
},
|
||
scanBar() {
|
||
const _this = this;
|
||
uni.scanCode({
|
||
scanType: ['barCode', 'qrCode'],
|
||
success: function(res) {
|
||
_this.formData.pwoCode = res.result;
|
||
_this.scanBarCode();
|
||
}
|
||
});
|
||
},
|
||
scanBar1() {
|
||
const _this = this;
|
||
uni.scanCode({
|
||
scanType: ['barCode', 'qrCode'],
|
||
success: function(res) {
|
||
_this.formData.createByCode = res.result;
|
||
_this.scanBarCreateBy();
|
||
}
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 隐藏软键盘
|
||
*/
|
||
focus() {
|
||
uni.hideKeyboard()
|
||
},
|
||
/**
|
||
* 不让手动输入
|
||
* @param {Object} value
|
||
|
||
handleInput(value) {
|
||
const {
|
||
inputValue
|
||
} = this.input
|
||
if (value.length - inputValue.length == 1 || inputValue.length - value.length == 1) {
|
||
this.$modal.msg("请扫描")
|
||
this.formData.pwoJobCode = null
|
||
this.input.inputValue = value
|
||
this.input.boolean = this.input.boolean == 0 ? 10 : 0
|
||
return
|
||
}
|
||
this.input.inputValue = value
|
||
|
||
}*/
|
||
},
|
||
onLoad: function(option) {
|
||
if (option.pwoCode) {
|
||
this.isSearchRoute = true;
|
||
this.formData.pwoCode = option.pwoCode;
|
||
this.scanBarCode();
|
||
}
|
||
// 获取当前时间
|
||
var currentDate = new Date();
|
||
// 格式化为字符串(YYYY-MM-DD HH:mm:ss)
|
||
var year = currentDate.getFullYear();
|
||
var month = ("0" + (currentDate.getMonth() + 1)).slice(-2);
|
||
var day = ("0" + currentDate.getDate()).slice(-2);
|
||
var hours = ("0" + currentDate.getHours()).slice(-2);
|
||
var minutes = ("0" + currentDate.getMinutes()).slice(-2);
|
||
var seconds = ("0" + currentDate.getSeconds()).slice(-2);
|
||
var formattedDate = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
|
||
// 将当前时间赋值给 formData.endTime
|
||
this.formData.endTime = formattedDate;
|
||
this.formData.way = '人工报工';
|
||
this.getOptions();
|
||
}
|
||
}
|
||
</script> |