Files
rd_mes_uniapp/pages/wms/purchase/purchaseQualityT.vue
2025-12-18 14:11:48 +08:00

625 lines
21 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view>
<uni-collapse>
<uni-forms ref="form" :modelValue="formData" :rules="rules">
<!-- <uni-collapse-item title="采购质检单" :open="true"> -->
<uni-forms-item label="收货单" :labelWidth='90' name="purchaseReceiveCode">
<uni-easyinput suffixIcon="scan" @iconClick="scanBar" @confirm="scanBarCode"
v-model="formData.purchaseReceiveCode" type="text" />
</uni-forms-item>
<uni-forms-item label="质检单" :labelWidth='90' name="purchaseQualityCode"
v-show="formData.purchaseQualityCode">
<uni-easyinput v-model="formData.purchaseQualityCode" type="text" disabled />
</uni-forms-item>
<uni-forms-item label="附件" :labelWidth='90' name="enclosure">
<u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" multiple
:maxCount="10" :previewFullImage="true"></u-upload>
</uni-forms-item>
<uni-forms-item label="质检方式" :labelWidth='90'>
<u-radio-group v-model="value" iconPlacement="left">
<u-radio label="正常" name="正常"></u-radio>
<u-radio label="扫物料标签" name="扫物料标签" style="margin-left: 10px;"></u-radio>
</u-radio-group>
</uni-forms-item>
<button size="mini" v-if="value=='扫物料标签' &&formData.wmsPurchaseQualityDetailList.length == 0"
type="primary" style="text-align: center;margin-left: 30%;font-size: 18px;"
@click="show=!show">添加物料标签</button>
<u-modal :show="show" title="扫描物料标签编码" showCancelButton closeOnClickOverlay
@cancel="cancelMaterialLabel" @close="cancelMaterialLabel" :showConfirmButton="false">
<uni-easyinput suffixIcon="scan" @iconClick="scanBarMaterialLabel" v-model="materialLabel"
type="text" @confirm="confirmMaterialLabel" maxlength="-1" :focus="true" />
</u-modal>
<!-- </uni-collapse-item> -->
<uni-collapse-item title="采购质检单明细" :open="true">
<uni-swipe-action>
<uni-swipe-action-item :rightOptions="rightOptions" :key="index"
v-for="(item, index) in formData.wmsPurchaseQualityDetailList"
@click="(data) => clickDetail(index,data)">
<uni-badge :text="index+1" type="primary"></uni-badge>
<uni-forms-item label="物料编码" :labelWidth='90'
:name="'wmsPurchaseQualityDetailList.'+ index +'.materialCode'">
<uni-easyinput type="text" disabled v-model="item.materialCode"></uni-easyinput>
</uni-forms-item>
<uni-forms-item label="物料名称" :labelWidth='90'
:name="'wmsPurchaseQualityDetailList.'+ index +'.materialName'">
<uni-easyinput type="text" disabled v-model="item.materialName"></uni-easyinput>
</uni-forms-item>
<uni-forms-item label="物料批号" :labelWidth='90'
name="'wmsPurchaseQualityDetailList.'+ index +'.materialBatchNo'">
<uni-easyinput disabled type="text" v-model="item.materialBatchNo" />
</uni-forms-item>
<uni-forms-item label="实收数量" :labelWidth='90'
name="'wmsPurchaseQualityDetailList.'+ index +'.secondActualNumber'">
<uni-easyinput disabled type="number" v-model="item.secondActualNumber" />
</uni-forms-item>
<uni-forms-item label="质检数量" :labelWidth='90'
name="'wmsPurchaseQualityDetailList.'+ index +'secondNumber'">
<second-number-change-to-convert :materialCode="item.materialCode"
:secondNumber.sync="item.secondNumber" :secondUnitId="item.secondUnitId"
:number.sync="item.number" :unitId="item.unitId"
@input="(data) => inputNUmber(index,data)"
></second-number-change-to-convert>
<!-- <u-number-box inputWidth="120" button-size="36" v-model="item.number" min="0"
@change="getBackNumber(index)"></u-number-box> -->
<!-- <uni-easyinput type="number" v-model="item.number"
@change="(data) => getBackNumber(index,data)" /> -->
</uni-forms-item>
<uni-forms-item label="合格数量" :labelWidth='90'
name="'wmsPurchaseQualityDetailList'+ index +'.secondPassNumber'">
<second-number-change-to-convert-new :materialCode="item.materialCode"
:key="item.passNumber"
:secondNumber.sync="item.secondPassNumber" :secondUnitId="item.secondUnitId"
:number.sync="item.passNumber"
:unitId="item.unitId"
@change="(data) => getCompare(item,data)"></second-number-change-to-convert-new>
<!-- <u-number-box inputWidth="120" button-size="36" v-model="item.passNumber" min="0"
@change="getBackNumber(index)"></u-number-box> -->
</uni-forms-item>
<uni-forms-item label="应入数量" :labelWidth='90'
name="'wmsPurchaseQualityDetailList.'+ index +'.secondInNumber'">
<!-- 之前代码 -->
<!-- <second-number-change-to-convert :materialCode="item.materialCode"
:secondNumber.sync="item.secondInNumber" :secondUnitId="item.secondUnitId"
:number.sync="item.inNumber" :unitId="item.unitId"
@change="(data) => getBackNumber('secondInNumber',item,data)"></second-number-change-to-convert> -->
<uni-easyinput type="number" v-model="item.secondInNumber" @input="(data) => getBackNumber('secondInNumber',item,data)"/>
<!-- <u-number-box inputWidth="120" button-size="36" v-model="item.secondInNumber" min="0"
@change="(data) => getBackNumber(index,data)"
:max="item.actualNumber"></u-number-box> -->
<!-- <uni-row style="margin-top: 10px;">
<uni-col :span="12">
<button size="mini" type="primary" style="font-size: 16px;"
@click="item.inNumber = item.actualNumber">全部入库</button>
</uni-col>
<uni-col :span="12">
<button size="mini" type="primary" style="font-size: 16px;"
@click="item.inNumber = 0">全部退回</button>
</uni-col>
</uni-row> -->
</uni-forms-item>
<uni-forms-item label="退回数量" :labelWidth='90'
name="'wmsPurchaseQualityDetailList.'+ index +'.backNumber'">
<uni-easyinput type="number" v-model="item.backNumber" @input="(data) => getBackNumber('backNumber',item,data)"/>
</uni-forms-item>
<uni-forms-item label="不良原因" :labelWidth='90'
name="'wmsPurchaseQualityDetailList.'+ index +'.failReason'">
<uni-easyinput type="textarea" v-model="item.failReason" />
</uni-forms-item>
</uni-swipe-action-item>
</uni-swipe-action>
</uni-collapse-item>
</uni-forms>
</uni-collapse>
<u-button type="primary" @click="submit">提交</u-button>
</view>
</template>
<script>
import {
uploadImage,
getStandardList,
addQualityHistoryList,
listQualityHistory,
updateQualityHistory
} from "@/api/qc/qc.js";
import {
addReceive,
listReceive,
listQuality,
getReceive,
addQuality,
updateQuality,
getReceiveDetail,
getQualityDetail,
getQualityReceiveDetail,
getDetailListsBySRM
} from "@/api/wms/purchase.js";
import {
listMaterial
} from "@/api/wms/request.js";
import {
getConfigKey,
} from "@/api/wms/materRequisitiontask";
import SecondNumberChangeToConvert from "@/components/SecondNumberChangeToConvert/index.vue";
import SecondNumberChangeToConvertNew from "@/components/SecondNumberChangeToConvert/index-.vue";
import {
toast,
} from '@/utils/common'
export default {
mounted() {
getConfigKey('wms.app').then(res => {
if(getKey('purchaseQualityT',res.msg) === 'Y'){
this.value='扫物料标签'
}
/**
* 获取wms.app的值
* @param {Object} name 要获取的字段
* @param {Object} json 要转换的数据默认res.msg
*/
function getKey(name,json){
return JSON.parse(json)[name]
}
});
},
data() {
return {
isSupplierCode: false,
isQualited: false,
value: '正常',
show: false,
materialLabel: null,
fileList1: [],
formData: {
purchaseReceiveCode: null,
purchaseQualityCode: null,
enclosure: null,
wmsPurchaseQualityDetailList: []
},
rightOptions: [{
text: '删除',
style: {
backgroundColor: '#ff2a17'
}
}, ],
rules: {
passNumber: {
rules: [{
required: true,
errorMessage: '请输入质检数量!'
}]
},
purchaseReceiveCode: {
rules: [{
required: true,
errorMessage: '请输入采购收货单!'
}]
},
},
listStyles: {
// 是否显示边框
border: true,
// 是否显示分隔线
dividline: true,
// 线条样式
borderStyle: {
width: 1,
color: 'blue',
style: 'dashed',
radius: 2
}
},
}
},
components: {
SecondNumberChangeToConvert,
SecondNumberChangeToConvertNew,
},
methods: {
// getCompare1(e){
// console.log('质检数量改变');
// // console.log('111');
// },
getCompare(item,data){
if(data>item.secondNumber){
uni.showToast({
title: '合格数量不能大于质检数量',
icon: 'none',
duration: 2000
})
// this.$set(item, "secondPassNumber", item.secondNumber)
// this.$forceUpdate()
item.secondPassNumber=item.secondNumber
// console.log("1414",item.secondPassNumber);
}
},
//获取退回数量
getBackNumber(name,item,e) {
//输入的应收数量
if(name === 'secondInNumber'){
if (e > item.secondActualNumber) {
toast("应入数量不能大于实收数量");
return false
}
item.backNumber = item.secondActualNumber - e
}
if(name === 'backNumber'){
if (e > item.secondActualNumber) {
toast("退回数量不能大于实收数量");
return false
}
item.secondInNumber = item.secondActualNumber - e
}
this.formData = Object.assign({},this.formData)
},
// getBackNumber(index, data) {
// if (data) {
// this.formData.wmsPurchaseQualityDetailList[index].backNumber = this.formData
// .wmsPurchaseQualityDetailList[
// index]
// .actualNumber - data.value
// } else {
// this.formData.wmsPurchaseQualityDetailList[index].backNumber = this.formData
// .wmsPurchaseQualityDetailList[
// index]
// .actualNumber - this.formData
// .wmsPurchaseQualityDetailList[
// index]
// .inNumber
// }
// },
deleteDetail(index) {
this.formData.wmsPurchaseQualityDetailList.splice(index, 1);
},
clickDetail(itemIndex, {
position,
index
}) {
if (index == 0) {
this.deleteDetail(itemIndex);
}
},
addMaterialLabel() {
this.show = true;
},
cancelMaterialLabel() {
this.materialLabel = null;
this.show = false;
},
confirmMaterialLabel(data) {
//判断是否供应商扫码
if (data.includes('@')) {
this.isSupplierCode = true;
let array = data.split('@');
let new_supplierCode = array[0];
let new_u9SourceBillCode = array[3].split('|')[0];
let new_erpDocCode1 = array[4].split('|')[0];
let new_erpDocLineKey1 = array[4].split('|')[1];
getDetailListsBySRM({
u9SourceBillCode: new_u9SourceBillCode,
erpDocCode1: new_erpDocCode1,
erpDocLineKey1: new_erpDocLineKey1
}).then(res => {
//判断有没有质检(先查质检-再查收货)
if (res.qualityList.length == 0) {
//没有质检
//判断有没有收货
// if (res.receiveDetailList.length == 0) {
// this.$modal.msg("该条物料还未收货!")
// } else {
// //判断有没有完成收货
// if (res.receiveDetailList[0].theoryNumber == res.receiveDetailList[0]
// .actualNumber) {
// getQualityReceiveDetail({
// purchaseReceiveCode: res.receiveDetailList[0].purchaseReceiveCode,
// status: '1'
// }).then((res) => {
// console.log(res);
// this.formData = res.qualityBill;
// this.formData.purchaseQualityDetailList = res.qualityBill
// .wmsPurchaseQualityDetailList;
// });
// } else {
this.$modal.msg("该条物料还未完成收货!")
// }
// }
} else {
this.isQualited = true;
//判断检验有无完成
if (res.qualityList[0].status == 3) {
this.$modal.msg("该条物料已完成检验!")
} else {
this.formData = res.qualityList[0];
this.formData.wmsPurchaseQualityDetailList = res.qualityList[0]
.purchaseQualityDetailList
}
}
})
this.materialLabel = null;
this.show = false;
} else {
data = JSON.parse(data)
if (data) {
getQualityDetail({
purchaseReceiveDetailId: data.id
}).then(res => {
//判断有没有质检
if (res.data.length > 0) {
this.formData.purchaseReceiveCode = res.data[0].purchaseReceiveCode;
this.formData.purchaseQualityCode = res.data[0].purchaseQualityCode;
this.formData.supplierCode = res.data[0].supplierCode;
this.formData.supplierName = res.data[0].supplierName;
//代入主表id
this.formData.id = res.data[0].purchaseQualityId;
const data = res.data[0];
data.inNumber = data.secondInNumber;
data.backNumber = 0
this.formData.wmsPurchaseQualityDetailList.push(data);
this.materialLabel = null;
this.show = false;
// this.$modal.msg("该条物料已质检!");
} else {
getReceiveDetail(data.id).then(res => {
//判断有没有收货
if (res.data.actualNumber != null) {
let obj = {
materialCode: res.data.materialCode,
materialName: res.data.materialName,
materialBatchNo: res.data.materialBatchNo,
actualNumber: res.data.actualNumber,
number: res.data.number,
purchaseReceiveDetailId: data.id,
passNumber: 0,
unitId: res.data.unitId,
inNumber: res.data.secondInNumber,
secondNumber: res.data.secondActualNumber,
secondUnitId: res.data.secondActualUnitId,
secondInNumber: res.data.secondInNumber,
}
this.formData.supplierCode = res.data.supplierCode;
this.formData.supplierName = res.data.supplierName;
this.formData.purchaseReceiveCode = res.data.purchaseReceiveCode;
this.formData.wmsPurchaseQualityDetailList.push(obj);
this.materialLabel = null;
this.show = false;
} else {
this.$modal.msg("该条物料还没有收货,无法质检!");
}
})
}
})
};
}
},
scanBarMaterialLabel() {
const _this = this;
uni.scanCode({
scanType: ['barCode', 'qrCode'],
success: function(res) {
_this.materialLabel = res.result;
// console.log(materialLabel)
_this.confirmMaterialLabel(_this.materialLabel);
}
});
},
// 删除图片
deletePic(event) {
this[`fileList${event.name}`].splice(event.index, 1)
},
// 新增图片
async afterRead(event) {
// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
let lists = [].concat(event.file)
let fileListLen = this[`fileList${event.name}`].length
lists.map((item) => {
this[`fileList${event.name}`].push({
...item,
status: 'uploading',
message: '上传中'
})
})
for (let i = 0; i < lists.length; i++) {
const result = await this.uploadFilePromise(lists[i].url)
let item = this[`fileList${event.name}`][fileListLen]
// console.log(item)
this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
status: 'success',
message: '',
url: result
}))
fileListLen++
}
},
uploadFilePromise(url) {
return new Promise((resolve, reject) => {
let a = uploadImage({
filePath: url
}).then(response => {
uni.showToast({
title: "上传成功",
icon: 'success'
});
this.formData.enclosure = response.fileName
resolve(response.url)
});
})
},
reset(code) {
this.formData = {
purchaseReceiveCode: code,
wmsPurchaseQualityDetailList: [],
};
},
scanBarCode(code) {
// if (code){
// this.reset(code);
// }
if (code) {
let q = {
purchaseReceiveCode: code
}
listReceive(q).then(async res => {
if (res.rows != null && res.rows.length > 0) {
let did = res.rows[0].id
getReceive(did).then(async res => {
for (let i in res.data
.wmsPurchaseReceiveDetailList) {
let obj = {};
obj.materialBatchNo = res.data
.wmsPurchaseReceiveDetailList[i]
.materialBatchNo;
obj.materialCode = res.data
.wmsPurchaseReceiveDetailList[i]
.materialCode;
obj.materialName = res.data
.wmsPurchaseReceiveDetailList[i]
.materialName;
obj.actualNumber = res.data
.wmsPurchaseReceiveDetailList[i]
.actualNumber;
obj.number = res.data
.wmsPurchaseReceiveDetailList[i]
.actualNumber;
obj.secondActualNumber = res.data
.wmsPurchaseReceiveDetailList[i]
.secondActualNumber;
this.formData.wmsPurchaseQualityDetailList.push(
obj);
}
});
} else {
this.$modal.msg("未检索到收货明细!");
}
});
}
},
//采购任务单
scanBar() {
const _this = this;
uni.scanCode({
scanType: ['barCode', 'qrCode'],
success: function(res) {
_this.formData.purchaseReceiveCode = res.result;
_this.scanBarCode(_this.formData.purchaseReceiveCode);
}
});
},
submit() {
const _this = this;
if(!getNumber(_this.formData.wmsPurchaseQualityDetailList,'secondActualNumber','secondInNumber','backNumber','materialCode')) return
_this.$refs.form.validate().then(res => {
uni.showModal({
title: '提示',
content: '您确定完成该质检吗?',
success: function(res) {
if (res.confirm) {
if (_this.formData.id != null) {
_this.$modal.loading('提交中')
for(let i in _this.formData.wmsPurchaseQualityDetailList){
_this.formData.wmsPurchaseQualityDetailList[i].inNumber = _this.formData.wmsPurchaseQualityDetailList[i].secondInNumber
}
updateQuality(_this.formData).then(res => {
_this.$modal.msgSuccess("质检成功!");
setTimeout(() => {
_this.$modal.closeLoading();
_this.$tab.switchTab(
"/pages/work/index");
}, 500);
})
} else {
let wmsPurchaseQualityDetailList = [];
for (let i in _this.formData
.wmsPurchaseQualityDetailList) {
let obj = {};
obj.materialCode = _this.formData
.wmsPurchaseQualityDetailList[i]
.materialCode;
obj.materialName = _this.formData
.wmsPurchaseQualityDetailList[i]
.materialName;
obj.materialBatchNo = _this.formData
.wmsPurchaseQualityDetailList[i]
.materialBatchNo;
obj.number = _this.formData
.wmsPurchaseQualityDetailList[i].number;
obj.passNumber = Number(_this.formData
.wmsPurchaseQualityDetailList[i]
.passNumber);
obj.failReason = _this.formData
.wmsPurchaseQualityDetailList[i]
.failReason;
wmsPurchaseQualityDetailList.push(obj);
}
let enclosure = null;
if (_this.fileList1.length > 0) {
enclosure = _this.fileList1.map(obj => obj.url)
.join(', ');
}
for(let i in _this.formData.wmsPurchaseQualityDetailList){
_this.formData.wmsPurchaseQualityDetailList[i].inNumber = _this.formData.wmsPurchaseQualityDetailList[i].secondInNumber
}
let data = {
purchaseReceiveCode: _this.formData
.purchaseReceiveCode,
status: '1',
wmsPurchaseQualityDetailList: _this.formData
.wmsPurchaseQualityDetailList,
enclosure: enclosure
}
_this.$modal.loading('提交中')
addQuality(data).then(response => {
_this.$modal.msgSuccess("质检成功!");
setTimeout(() => {
_this.$modal.closeLoading();
_this.$tab.switchTab(
"/pages/work/index");
}, 500);
});
}
} else if (res.cancel) {
}
}
});
});
/**
* 判断应入和退回和是否等于实收
* @param {Object} list 要比较的数据
* @param {Object} key1 secondActualNumber
* @param {Object} key2 secondInNumber
* @param {Object} key3 backNumber
* @param {Object} key4 materialCode
*/
function getNumber(list,key1,key2,key3,key4){
for(let i in list){
if(list[i][key1] != parseInt(list[i][key2]) +parseInt(list[i][key3])){
_this.$modal.msg("物料编码为 " + list[i][key4] + "的单子应入和退回不等于实收");
return false
}
}
return true
}
},
/**
* 修改质检数量,合格数量跟随改变
* @param {Object} index 当前修改数据的下标
* @param {Object} data 当前修改的数据
*/
inputNUmber(index,data){
const arr = this.formData.wmsPurchaseQualityDetailList
arr[index].passNumber =arr[index].secondPassNumber = parseInt(data)
}
}
}
</script>
<style>
</style>