赫艾前端
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.
 
 
 
 
 

396 lines
13 KiB

<script>
import {getPartValue, removeScanLabel, saveScanLabel, scanLabel} from "../../../api/production/generateReport";
import dayjs from "dayjs";
import {Decimal} from "decimal.js";
import {getPhotoAddressData} from "../../../api/pad";
export default {
name:"scanForm",
props:{
detail:{
type: [Object],
required: true
},
scanFlag:{
type: Boolean,
default:false,
},
allNum:{
type:Number,
default: 0,
},
notifyQty:{
type:Number,
default:0,
},
isReport:{
type:Boolean,
default:false,
}
},
computed:{
flag:{
get(){
return this.scanFlag;
},
set(val){
this.$emit("update:scanFlag",val)
}
},
total:{
get(){
return this.scanLabelDetailList.reduce((pre, cur) => {
return pre + new Decimal(cur.scanQty).toNumber()
}, 0);
},
set(val) {
// this.scanLabelDetailList = v
}
},
totalNum:{
get(){
return this.scanLabelDetailList.length;
},
set(val) {
// this.scanLabelDetailList = v
}
},
totalWeight:{
get(){
return this.scanLabelDetailList.reduce((pre, cur) => {
if (cur.weight){
return pre + new Decimal(cur.weight).toNumber()
}
return pre
}, 0);
},
set(val) {
}
}
},
data(){
return{
model:{
flag:"",
label:'',
},
partValue:0,
scanLabelDetailList:[],
photoDatas:[],
num:1,
exportDataStandard: {
"通知单号": "delNotifyNo",
"通知单序号号": "delNotifyItemNo",
"产品编码": "partNo",
"数量": "scanQty",
"类型": "scanType",
"JOB NO.": "seqNo",
"操作员": "createBy",
"扫描时间": "createData",
},
exportName: "发货扫描"+dayjs().format("YYYYMMDDHHmmss"),
}
},
methods:{
removeScanLabel(row){
removeScanLabel(row).then(({data})=>{
if (data && data.code === 0){
this.$message.success(data.msg)
this.scanLabel();
}else {
this.$message.warning(data.msg)
}
}).catch((error)=>{
this.$message.error(error)
})
},
getFocus(refName){
this.$refs[refName].focus()
},
openScanDialog(){
this.getFocus('focusInput')
// 获取当前part的 标准标签数量
let params={
site:this.detail.site,
partNo:this.detail.partNo
}
getPartValue(params).then(({data})=>{
if (data && data.code === 0){
this.partValue = data.data;
}else {
this.$message.warning(data.msg)
}
}).catch((error)=>{
this.$message.error(error)
})
},
scanLabel(){
let paramsScan={
site:this.detail.site,
delNotifyNo: this.detail.delNotifyNo,
delNotifyItemNo: this.detail.delNotifyItemNo,
}
scanLabel(paramsScan).then(({data})=>{
if (data && data.code === 0){
this.scanLabelDetailList = data.rows;
this.$emit("changeAllNum",this.total)
}else {
this.$message.warning(data.msg)
}
}).catch((error)=>{
this.$message.error(error)
})
this.getPhoto();
},
scanLabelEnter(){
if (this.total > this.notifyQty){
this.$message.warning("扫描累计数量不允许超过要求发货数量")
return;
}
let arr = this.model.label.split(";");
if (arr.length < 5){//site;partNo;qty;seqNo;printId
if (!arr[3]){
this.$message.warning("标签jobNo为空")
return;
}
if (!arr[2] || arr[2] === '0'){
this.$message.warning("数量不存在或是0")
return;
}
if (!arr[1]){
this.$message.warning("产品编码为空")
return;
}
if (!arr[0]){
this.$message.warning("site编码为空")
return;
}
this.$message.warning("标签格式错误")
return
}
if (arr[0] !== this.detail.site || arr[1] !== this.detail.partNo){
this.$message.warning(`产品不匹配或每袋/每卷数量未维护`)
return;
}
if (this.partValue===0){
this.$message.warning(`每袋/每卷数量未维护`)
return;
}
// if (this.model.flag !== 'Y' && this.partValue != arr[2]){
// this.$message.warning(`标签数量与标准袋装数量不匹配`)
// return;
// }
if (new Decimal(this.total).add(new Decimal(arr[2])).toNumber()> this.notifyQty){
this.$message.warning("扫描累计数量不允许超过要求发货数量")
return;
}// 保存数据 通知单数量:this.detail.notifyQty
let params={
site:this.detail.site,
delNotifyNo: this.detail.delNotifyNo,
delNotifyItemNo: this.detail.delNotifyItemNo,
scanQty:arr[2],
scanType:parseInt(arr[2]) !== this.partValue?'零散数量':'标准数量',
seqNo:arr[3],
printId:arr[4]?arr[4]:'',
weight:arr[5],
createBy:this.$store.state.user.name,
createData:dayjs().format("YYYY-MM-DD")
}
saveScanLabel(params).then(({data})=>{
if (data && data.code === 0){
this.$message.success(data.msg)
this.scanLabel();
}else {
this.$message.warning(data.msg)
}
// 重置标签
this.model.flag = "";
this.model.label = '';
}).catch((error)=>{
this.$message.warning(error)
this.model.flag = "";
this.model.label = '';
})
},
closeScanDialog(){
this.model = {
label: '',
flag: '',
}
if (this.isReport === false && this.total < this.notifyQty){
this.$message.warning("扫描数量未达到通知单数量")
// this.$alert("扫描数量未达到通知单数量", '提示', {
// confirmButtonText: '确定',
// });
}
this.scanLabelDetailList = [];
},
getPhoto(){
let params = {
site:this.detail.site,
partNo:this.detail.partNo,
}
this.photoDatas = [];
this.num=1;
getPhotoAddressData(params).then(({data}) => {
this.photoDatas = data.rows;
if(this.photoDatas.length===0){
setTimeout(() => {
this.$alert('该物料没有上传图片!', '错误', {
confirmButtonText: '确定'
})
}, 500);
return false;
}
})
},
lastPicture(){
this.$refs.photoCarousel.prev();
},
nextPicture(){
this.$refs.photoCarousel.next();
},
changePhoto(index){
this.num=index+1;
}
}
}
</script>
<template>
<div>
<el-dialog
title="出货扫描" v-drag
:visible.sync="flag"
width="80%"
@open="scanLabel"
@close="closeScanDialog" @opened="openScanDialog">
<div style="display:flex;justify-content:space-between;align-items:flex-start;">
<div style="width: 60%">
<el-form :model="model" :inline="true" label-position="top">
<!-- <el-form-item label=" ">-->
<!-- <el-select v-model="model.flag" clearable>-->
<!-- <el-option value="" label="标准袋数"></el-option>-->
<!-- <el-option value="Y" label="零数袋"></el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="标签" style="width: 200px " v-if="!isReport">
<el-input ref="focusInput" v-model="model.label" @keyup.enter.native="scanLabelEnter"></el-input>
</el-form-item>
<el-form-item label="合计">
<el-input-number disabled :controls="false" style="margin-top: -5px;text-align: right" v-model="total"></el-input-number>
</el-form-item>
<el-form-item label="袋数">
<el-input-number disabled :controls="false" style="margin-top: -5px;text-align: right" v-model="totalNum"></el-input-number>
</el-form-item>
<el-form-item label="总重量">
<el-input-number disabled :controls="false" style="margin-top: -5px;text-align: right" v-model="totalWeight"></el-input-number>
</el-form-item>
<el-form-item label=" " v-if="isReport">
<download-excel
:fields="exportDataStandard"
:data="scanLabelDetailList.map(item=>{item.partNo=detail.partNo;return item;})"
type="xlsx"
:name="exportName"
worksheet="导出信息"
class="el-button el-button--primary el-button--medium">
导出
</download-excel>
</el-form-item>
</el-form>
<el-table :data="scanLabelDetailList" stripe border height="500" highlight-current-row>
<el-table-column label="操作" align="center" v-if="!isReport">
<template slot-scope="{row,$index}">
<el-link style="cursor:pointer;" @click="removeScanLabel(row)">删除</el-link>
</template>
</el-table-column>
<el-table-column label="通知单号" min-width="120px" header-align="center" align="center" show-overflow-tooltip prop="delNotifyNo"/>
<el-table-column label="通知单号序号" min-width="100px" header-align="center" align="left" show-overflow-tooltip prop="delNotifyItemNo"/>
<el-table-column label="产品编码" min-width="100px" header-align="center" show-overflow-tooltip>
<template slot-scope="{row,$index}">
{{detail.partNo}}
</template>
</el-table-column>
<el-table-column label="数量" min-width="60px" header-align="center" align="center" show-overflow-tooltip prop="scanQty"/>
<el-table-column label="重量" min-width="60px" header-align="center" align="center" show-overflow-tooltip prop="weight"/>
<el-table-column label="类型" min-width="100px" header-align="center" align="center" show-overflow-tooltip prop="scanType"/>
<el-table-column label="JOB NO." min-width="100px" header-align="center" align="left" show-overflow-tooltip prop="seqNo"/>
<el-table-column label="序号" min-width="100px" header-align="center" align="left" show-overflow-tooltip prop="printId"/>
<el-table-column label="操作员" min-width="100px" header-align="center" align="left" show-overflow-tooltip prop="createBy"/>
<el-table-column label="扫描时间" min-width="100px" header-align="center" align="center" show-overflow-tooltip prop="createData"/>
</el-table>
</div>
<div class="photo" style="width: 40%;padding-left: 10px">
<el-form label-position="top" size="medium">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="产品编码:">
<el-input v-model="detail.partNo" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item style="height: 30px;" label=" ">
<div>
<el-button @click="lastPicture()" style="height: 30px;width: 80px" type="primary">
上一张
</el-button>
<el-button @click="nextPicture()" style="height: 30px;width: 80px" type="primary">
下一张
</el-button>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="18">
<el-form-item :label="`文件名(${photoDatas[this.num-1]?this.num:0}/${this.photoDatas.length})`">
<el-input :value="photoDatas[this.num-1]?photoDatas[this.num-1].attaFileNameDb:''" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div id="padPhoto" style="text-align: center;width: 100%;vertical-align:middle;margin-top: 5px">
<el-carousel height="400px" @change="changePhoto" ref="photoCarousel" :autoplay="false" indicator-position="none" :interval="5000" arrow="never">
<el-carousel-item v-for="(item,index) in this.photoDatas" :key="index">
<img style="max-width:100%;height: 400px;object-fit: cover;object-position: center center" :src="$store.state.user.padSopUrl+item.attaFileNameDb">
</el-carousel-item>
</el-carousel>
</div>
</div>
</div>
<div style="height: 20px"></div>
</el-dialog>
</div>
</template>
<style scoped>
.el-input-number /deep/ .el-input__inner{
text-align: left;
margin-top: 5px;
padding-right: 5px !important;
padding-left: 5px !important;
}
.photo .el-form-item--medium /deep/ .el-form-item__label {
font-size: 16px;
line-height: 30px;
height: 30px;
}
.photo .el-form-item--medium /deep/ .el-form-item__content {
margin-bottom: 5px;
}
.photo .el-form-item--medium /deep/ .el-form-item__content .el-button {
width: 80px;
height: 30px;
}
.photo .el-form-item--medium /deep/ .el-form-item__content .el-input .el-input__inner {
font-size: 16px;
line-height: 30px;
height: 30px !important;
}
</style>