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
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>
|