Commit 3c0a4a87 authored by 何远江's avatar 何远江

生产发料修改

parent bf258b9d
<template>
<view class="page">
<StickyNavBar>
<NavBar title="生产发料"></NavBar>
<view class="headerTitle">
<view class="">
<view class="items">领料申请:{{goodsList[0]&&goodsList[0].applyNo}}</view>
<view class="items">{{goodsList[0]&&goodsList[0].workstationCode}}/{{goodsList[0]&&goodsList[0].workstationName}}</view>
<view class="items">计划日期:{{goodsList[0]&&goodsList[0].startTime}}</view>
</view>
<view class="checkedCase">
<checkbox-group @change="checkedChange">
<checkbox value="r1" :checked="checkedBox" />是否结案
</checkbox-group>
</view>
</view>
<view class="btn">
<uni-easyinput
prefixIcon="search"
:disabled="isDisabled"
v-model="wxparams"
:focus="isFocus"
placeholder="请扫描产品包装条码/外箱码"
@input="handleInputPlnr"
></uni-easyinput>
</view>
<view class="total">
<view class="left">物料明细</view>
<view class="right">
物料数量:
<!-- <text class="blue">{{ totalNum }}</text>
<view class="page">
<StickyNavBar>
<NavBar title="生产发料"></NavBar>
<view class="headerTitle">
<view class="">
<view class="items"
>领料申请:{{ goodsList[0] && goodsList[0].applyNo }}</view
>
<view class="items"
>{{ goodsList[0] && goodsList[0].workstationCode }}/{{
goodsList[0] && goodsList[0].workstationName
}}</view
>
<view class="items"
>计划日期:{{ goodsList[0] && goodsList[0].startTime }}</view
>
</view>
<view class="checkedCase">
<checkbox-group @change="checkedChange">
<checkbox value="r1" :checked="checkedBox" />是否结案
</checkbox-group>
</view>
</view>
<view class="btn">
<uni-easyinput
prefixIcon="search"
:disabled="isDisabled"
v-model="wxparams"
:focus="isFocus"
placeholder="请扫描产品包装条码/外箱码"
@input="handleInputPlnr"
></uni-easyinput>
</view>
<view class="total">
<view class="left">物料明细</view>
<view class="right">
物料数量:
<!-- <text class="blue">{{ totalNum }}</text>
<text class="line">/</text> -->
<text class="">{{ goodsList.length }}</text>
</view>
</view>
</StickyNavBar>
<ContentLoadingMore class="cardbox" :list='goodsList'>
<view class="cardContent" v-for="(item, index) in goodsList" :key="index">
<scanningList :item='item' :list='list'/>
</view>
</ContentLoadingMore>
<BottomBtn :btnArr="btnArr" @getBtnHandle="getBtnHandle"></BottomBtn>
</view>
<text class="">{{ goodsList.length }}</text>
</view>
</view>
</StickyNavBar>
<ContentLoadingMore class="cardbox" :list="goodsList">
<view class="cardContent" v-for="(item, index) in goodsList" :key="index">
<scanningList :item="item" :list="item.details" />
</view>
</ContentLoadingMore>
<BottomBtn :btnArr="btnArr" @getBtnHandle="getBtnHandle"></BottomBtn>
</view>
</template>
<script>
import StickyNavBar from '@/components/StickyNavBar/index.vue';
import ContentLoadingMore from '@/components/ContentLoadingMore/index.vue';
import BottomBtn from '@/components/BottomBtn/index.vue';
import scanningList from "./scanningList.vue"
import StickyNavBar from "@/components/StickyNavBar/index.vue";
import ContentLoadingMore from "@/components/ContentLoadingMore/index.vue";
import BottomBtn from "@/components/BottomBtn/index.vue";
import scanningList from "./scanningList.vue";
export default {
components: {
StickyNavBar,
ContentLoadingMore,
BottomBtn,
scanningList
},
data() {
return {
checkedBox: false,
r1:'',
// totalNum: 0,
number: 0,
show: true,
nlpla: 'YD-02-02-3',
wxparams: '',
btnArr: [
{
style: '',
type: 'warning',
text: '返回',
way: 'goBack'
},
{
style: '',
type: 'primary',
text: '提交',
way: 'goSubmit'
}
],
goodsList: [],
isFocus: true,
isDisabled: false,
OrderNum: '',
list: []
};
},
computed:{
totalNum(){
let num = 0
let i=null,j=null
const data = JSON.parse(JSON.stringify(this.list))
const result = data.filter((item, index, self) => {
return self.findIndex(t => t.itemCode === item.itemCode) === index;
});
for(i = 0; i < this.goodsList.length; i++){
if(this.goodsList[i].itemCode === result[i].itemCode && result[i].vista){
num++
}
}
return num || 0
},
},
onLoad(option) {
if(option && option.order){
this.OrderNum = option.order
this.getOrder(option.order)
}
},
watch: {
},
created() {
},
methods: {
reset(){
setTimeout(() => {
this.wxparams = '';
this.isFocus = true;
this.isDisabled = false;
}, 1000);
},
getOrder(applyNo) {
this.$u.api.mesApi
.pdaMaterialcreate({
pageNum:1,
pageSize:10,
applyNo
})
.then((res) => {
if (res && res.code - 200 === 0) {
// list 第二层显示 也是最后提交的数据(改动最小)
// goodsList 第一层显示
// 第二层显示的数据和第一层必须属于同一个物料 itemCode一样
this.list = res.rows
const data = res.rows
const result = data.filter((item, index, self) => {
return self.findIndex(t => t.sapItemCode === item.sapItemCode) === index;
});
this.goodsList = [...result]
} else {
this.$u.toast(res.msg);
}
this.loading = false;
});
},
checkedChange(){
this.checkedBox = !this.checkedBox
},
getBtnHandle(row) {
this[row.way]();
},
goBack() {
console.log('进来')
uni.navigateBack({
delta: 0
});
},
goSubmit() {
if (this.list.length === 0) {
return;
}
let arr = this.list.filter(ele=>ele.vista)
components: {
StickyNavBar,
ContentLoadingMore,
BottomBtn,
scanningList,
},
data() {
return {
checkedBox: false,
r1: "",
// totalNum: 0,
number: 0,
show: true,
nlpla: "YD-02-02-3",
wxparams: "",
btnArr: [
{
style: "",
type: "warning",
text: "返回",
way: "goBack",
},
{
style: "",
type: "primary",
text: "提交",
way: "goSubmit",
},
],
goodsList: [],
isFocus: true,
isDisabled: false,
OrderNum: "",
list: [],
};
},
computed: {
totalNum() {
let num = 0;
let i = null,
j = null;
const data = JSON.parse(JSON.stringify(this.list));
const result = data.filter((item, index, self) => {
return self.findIndex((t) => t.itemCode === item.itemCode) === index;
});
for (i = 0; i < this.goodsList.length; i++) {
if (
this.goodsList[i].itemCode === result[i].itemCode &&
result[i].vista
) {
num++;
}
}
return num || 0;
},
},
onLoad(option) {
if (option && option.order) {
this.OrderNum = option.order;
this.getOrder(option.order);
}
},
watch: {},
created() {},
methods: {
reset() {
setTimeout(() => {
this.wxparams = "";
this.isFocus = true;
this.isDisabled = false;
}, 1000);
},
getOrder(applyNo) {
this.$u.api.mesApi
.pdaMaterialcreate({
pageNum: 1,
pageSize: 10,
applyNo,
})
.then((res) => {
if (res && res.code - 200 === 0) {
// list 第二层显示 也是最后提交的数据(改动最小)
// goodsList 第一层显示
// 第二层显示的数据和第一层必须属于同一个物料 itemCode一样
// this.list = res.rows
this.goodsList = res.rows.reduce((pre, cur) => {
if (pre.length === 0) {
pre.push({
...cur,
details: [{ ...cur, vista: 0 }],
});
} else {
const item = pre.find((v) => v.sapItemCode == cur.sapItemCode);
if (item) {
item.details.push({ ...cur, vista: 0 });
} else {
pre.push({
...cur,
details: [{ ...cur, vista: 0 }],
});
}
}
return pre;
}, []);
// "windCase": null,是否结案 Y是 N否
arr.forEach((ele,index) => {
ele.windCase = this.checkedBox ? 'Y': 'N'
ele.AUFNR = ele.workorderCode
ele.ERFMG = ele.vista
ele.MTSNR = ele.applyNo
ele.ZEILE = index+1
ele.RSNUM = ele.requirementNumber
ele.RSPOS = ele.requirementProjectNumber
})
const params = {
'zencode': 'A008',
'item': arr
}
this.$u.api.sapApi
.sapProiss(params)
.then((res) => {
this.loading = false;
if(!Array.isArray(res)){
return
}
if (res.every((item) => item.TYPE === 'S')) {
// this.$u.toast('提交成功');
this.handleMes(arr,res[0].MESSAGE_V1)
}
const foundObject = res.find(item => item.TYPE === 'E');
if(foundObject && foundObject.MESSAGE){
this.$u.toast(foundObject.MESSAGE);
}
});
},
handleMes(arr,num){
arr.forEach(ele => {
ele.batchCode = ele.CHARG
ele.quantityIssued = ele.vista
ele.issueCode = num
ele.issueType = ele.materialType
});
this.$u.api.mesApi
.pdaSapissuecreate(arr)
.then((res) => {
this.loading = false;
console.log(res);
if(res && res.code == 200){
this.$u.toast('提交成功');
setTimeout(() => {
this.goBack()
}, 1000);
}else{
this.$u.toast(res.msg);
}
});
},
handleInputPlnr(e) {
e && this.getPlnr(e);
},
getPlnr(plnr) {
this.isDisabled = true;
this.isFocus = false
this.$u.api.sapApi
.sapBlpl({
plnr,
ztype: '002'
})
.then((res) => {
if (res && res.MSG[0].TYPE === 'S') {
if (this.list.some((item) => item.PLNR === plnr)) {
this.reset()
this.$u.toast('已经存在当前条码');
return
}
this.factorial({...res.BLPL[0]},plnr,0)
this.reset()
} else {
this.reset()
this.$u.toast(res.MSG[0].MESSAGE);
}
this.loading = false;
});
},
handleAddList(idx,vista,res){
const newCard = {
...this.list[idx],
vista,
// vista : ((this.list[idx].applyNum - 0)-(this.list[idx].vista-0)).toFixed(3),
add: '1',
... res
}
this.list.splice(idx+1, 0, newCard);
},
factorial(res,plnr,idx,num=0) {
// 找出符合条件的数组长度
const count = this.list.filter(item => item.sapItemCode == res.MATNR).length
if(!count){
this.$u.toast('没有匹配到对应物料');
return
}
// PACMG包装数量 applyNum申请数量 vista这一个工单分配了多少数量
// 总的来说逻辑是
// 1)
// 录入一个pl接口返回的数据 里面有包装数量 size 仓位
// 如果第一个applyNum申请数量满足不到 就把当前pl数据和第一个数据整合
// 再扫第二个 检查第一个是否满足,不满足 就先满足第一个,剩余的满足第二个
// 2)
// 如果满足第一个工单applyNum申请数量 就要往下满足 直到分配完。
for (let m = 0; m < this.list.length; m++) {
if(this.list[m].sapItemCode == res.MATNR){
// 递归的方法 满足下一个
if(idx){
if(this.list[idx]){
if(num > this.list[idx].applyNum){
this.$set(this.list,idx,{...this.list[idx],vista : this.list[idx].applyNum,... res})
this.factorial(res,plnr,idx+1,num-this.list[idx].applyNum)
}else{
this.$set(this.list,idx,{...this.list[idx],vista : num,... res})
this.factorial(res,plnr,idx+1,0)
}
}
return
}
// 没有填入数据的
if(!this.list[m].vista){
// 上一位的数据是否满足
if(this.list[m-1] && this.list[m-1].vista < this.list[m-1].applyNum){
this.handleAddList(m,((this.list[m-1].applyNum-0) - (this.list[m-1].vista-0)),res)
if( res.PACMG > (this.list[m-1].applyNum - this.list[m-1].vista)){
this.factorial(res,plnr, m+1, res.PACMG - (this.list[m-1].applyNum - this.list[m-1].vista))
}
return
}
// 只有一个
// if(count === 1){
// this.$set(this.list,m,{...this.list[m],vista : res.PACMG,... res})
// }else{
// 包装数量大于申请数量
if( res.PACMG > this.list[m].applyNum){
// 最后一个工单处理
if(count === m){
this.$set(this.list,m,{...this.list[m],vista : res.PACMG,... res})
return
}
this.list[m].vista = this.list[m].applyNum
this.$set(this.list,m,{...this.list[m],vista : this.list[m].applyNum,... res})
this.factorial(res,plnr,m+1,res.PACMG-this.list[m].applyNum)
return;
}else{
// 包装数量小于等于申请数量
this.$set(this.list,m,{...this.list[m],vista : res.PACMG,... res})
return
}
// }
}else{
// 当前填入的数量小于申请数量 就把当前所有工单找出来 一个个的去检查是否满足
if(this.list[m].vista < this.list[m].applyNum){
let arr = []
this.list.forEach(ele => {
if(ele.workorderCode === this.list[m].workorderCode){
arr.push(ele)
}
});
// 工单申请数量
let totalApplyNum = (arr[0].applyNum-0)
// 当前工单已经录入了总数量 vista是每一个录入数量
let totalVista =0
arr.forEach(ele => {
totalVista = totalVista + (ele.vista?(ele.vista-0):0)
});
// 最终填入的数量
let endVista = 0
endVista = ((this.list[m].applyNum - 0)-(this.list[m].vista-0)).toFixed(3)
// 处理最后一行
if(m === this.list.length - 1){
endVista = res.PACMG - 0
}
// 工单录入数量总和小于总的申请数量 那就要新增一行
if(totalVista < totalApplyNum){
this.handleAddList(m,endVista,res)
// 当前包装数量 大于(总的申请数量 减 工单录入数量总)就要往下一个分配
if((res.PACMG-0)-endVista >0){
this.factorial(res,plnr,m+2,(res.PACMG-0)-endVista)
}
return
}
}else{
this.$u.toast('暂无剩余物料');
}
}
}
}
}
}
console.log("----goodsList----", this.goodsList);
// const data = res.rows
// const result = data.filter((item, index, self) => {
// return self.findIndex(t => t.sapItemCode === item.sapItemCode) === index;
// });
// this.goodsList = [...result]
} else {
this.$u.toast(res.msg);
}
this.loading = false;
});
},
checkedChange() {
this.checkedBox = !this.checkedBox;
},
getBtnHandle(row) {
this[row.way]();
},
goBack() {
console.log("进来");
uni.navigateBack({
delta: 0,
});
},
goSubmit() {
if (this.list.length === 0) {
return;
}
let arr = this.list.filter((ele) => ele.vista);
// "windCase": null,是否结案 Y是 N否
arr.forEach((ele, index) => {
ele.windCase = this.checkedBox ? "Y" : "N";
ele.AUFNR = ele.workorderCode;
ele.ERFMG = ele.vista;
ele.MTSNR = ele.applyNo;
ele.ZEILE = index + 1;
ele.RSNUM = ele.requirementNumber;
ele.RSPOS = ele.requirementProjectNumber;
});
const params = {
zencode: "A008",
item: arr,
};
this.$u.api.sapApi.sapProiss(params).then((res) => {
this.loading = false;
if (!Array.isArray(res)) {
return;
}
if (res.every((item) => item.TYPE === "S")) {
// this.$u.toast('提交成功');
this.handleMes(arr, res[0].MESSAGE_V1);
}
const foundObject = res.find((item) => item.TYPE === "E");
if (foundObject && foundObject.MESSAGE) {
this.$u.toast(foundObject.MESSAGE);
}
});
},
handleMes(arr, num) {
arr.forEach((ele) => {
ele.batchCode = ele.CHARG;
ele.quantityIssued = ele.vista;
ele.issueCode = num;
ele.issueType = ele.materialType;
});
this.$u.api.mesApi.pdaSapissuecreate(arr).then((res) => {
this.loading = false;
console.log(res);
if (res && res.code == 200) {
this.$u.toast("提交成功");
setTimeout(() => {
this.goBack();
}, 1000);
} else {
this.$u.toast(res.msg);
}
});
},
handleInputPlnr(e) {
e && this.getPlnr(e);
},
getPlnr(plnr) {
this.isDisabled = true;
this.isFocus = false;
this.$u.api.sapApi
.sapBlpl({
plnr,
ztype: "002",
})
.then((res) => {
if (res && res.MSG[0].TYPE === "S") {
if (
this.goodsList.some((item) =>
item.details.some((v) => v.PLNR == plnr)
)
) {
this.reset();
this.$u.toast("已经存在当前条码");
return;
}
// this.factorial({...res.BLPL[0]},plnr,0)
this.handleDetails(res.BLPL, plnr);
this.reset();
} else {
this.reset();
this.$u.toast(res.MSG[0].MESSAGE);
}
this.loading = false;
});
},
handleDetails(data, plnr) {
data.forEach((ele) => {
let num = ele.PACMG;
// 相同的物料
const item = this.goodsList.find((v) => v.sapItemCode == ele.MATNR);
if (item) {
// 用于缓存新添加的 details
const map = new Map();
item.details.some((v, i) => {
// 如果没有数量了,终止分配
if (num <= 0) return true;
// 没有分配数量时
if (v.vista == 0) {
// 如果是最最后一项 直接分配所有的数量
if (i == item.details.length - 1) {
v.vista = num;
} else {
v.vista = num > v.applyNum ? v.applyNum : num;
}
num = +(num - v.vista).toFixed(3);
v.PLNR = plnr;
v.LGORT = ele.LGORT;
v.LGOBE = ele.LGOBE;
v.NLPLA = ele.NLPLA;
// 添加两个字段,使用数量和剩余数量
v.usedNum = v.vista;
v.remainNum = +(v.applyNum - v.usedNum).toFixed(3);
} else if (v.remainNum > 0) {
// 已经分配,但是未分配满的情况 需要创建一条新的申请
let vista = 0;
// 如果是最后一项,直接分配所有的数量
if (i == item.details.length - 1) {
vista = num;
} else {
// 如果下项的工单号于目前工单号一样跳过
if (v.workorderCode == item.details[i + 1].workorderCode) {
return false;
}
vista = num > v.remainNum ? v.remainNum : +num;
}
const reAddItem = {
...v,
PLNR: plnr,
LGORT: ele.LGORT,
LGOBE: ele.LGOBE,
NLPLA: ele.NLPLA,
usedNum: +(v.usedNum + vista).toFixed(3),
remainNum: +(v.remainNum - vista).toFixed(3),
vista,
};
map.set(i + 1, reAddItem);
num = +(num - vista).toFixed(3);
}
});
// 新增的申请插入到明细中
for (const [key, value] of map.entries()) {
item.details.splice(key, 0, value);
}
} else {
this.$u.toast("没有物料");
}
});
console.log("----goodsList--------", this.goodsList);
},
handleAddList(idx, vista, res) {
const newCard = {
...this.list[idx],
vista,
// vista : ((this.list[idx].applyNum - 0)-(this.list[idx].vista-0)).toFixed(3),
add: "1",
...res,
};
this.list.splice(idx + 1, 0, newCard);
},
factorial(res, plnr, idx, num = 0) {
// 找出符合条件的数组长度
const count = this.list.filter(
(item) => item.sapItemCode == res.MATNR
).length;
if (!count) {
this.$u.toast("没有匹配到对应物料");
return;
}
// PACMG包装数量 applyNum申请数量 vista这一个工单分配了多少数量
// 总的来说逻辑是
// 1)
// 录入一个pl接口返回的数据 里面有包装数量 size 仓位
// 如果第一个applyNum申请数量满足不到 就把当前pl数据和第一个数据整合
// 再扫第二个 检查第一个是否满足,不满足 就先满足第一个,剩余的满足第二个
// 2)
// 如果满足第一个工单applyNum申请数量 就要往下满足 直到分配完。
for (let m = 0; m < this.list.length; m++) {
if (this.list[m].sapItemCode == res.MATNR) {
// 递归的方法 满足下一个
if (idx) {
if (this.list[idx]) {
if (num > this.list[idx].applyNum) {
this.$set(this.list, idx, {
...this.list[idx],
vista: this.list[idx].applyNum,
...res,
});
this.factorial(
res,
plnr,
idx + 1,
num - this.list[idx].applyNum
);
} else {
this.$set(this.list, idx, {
...this.list[idx],
vista: num,
...res,
});
this.factorial(res, plnr, idx + 1, 0);
}
}
return;
}
// 没有填入数据的
if (!this.list[m].vista) {
// 上一位的数据是否满足
if (
this.list[m - 1] &&
this.list[m - 1].vista < this.list[m - 1].applyNum
) {
this.handleAddList(
m,
this.list[m - 1].applyNum - 0 - (this.list[m - 1].vista - 0),
res
);
if (
res.PACMG >
this.list[m - 1].applyNum - this.list[m - 1].vista
) {
this.factorial(
res,
plnr,
m + 1,
res.PACMG -
(this.list[m - 1].applyNum - this.list[m - 1].vista)
);
}
return;
}
// 只有一个
// if(count === 1){
// this.$set(this.list,m,{...this.list[m],vista : res.PACMG,... res})
// }else{
// 包装数量大于申请数量
if (res.PACMG > this.list[m].applyNum) {
// 最后一个工单处理
if (count === m) {
this.$set(this.list, m, {
...this.list[m],
vista: res.PACMG,
...res,
});
return;
}
this.list[m].vista = this.list[m].applyNum;
this.$set(this.list, m, {
...this.list[m],
vista: this.list[m].applyNum,
...res,
});
this.factorial(
res,
plnr,
m + 1,
res.PACMG - this.list[m].applyNum
);
return;
} else {
// 包装数量小于等于申请数量
this.$set(this.list, m, {
...this.list[m],
vista: res.PACMG,
...res,
});
return;
}
// }
} else {
// 当前填入的数量小于申请数量 就把当前所有工单找出来 一个个的去检查是否满足
if (this.list[m].vista < this.list[m].applyNum) {
let arr = [];
this.list.forEach((ele) => {
if (ele.workorderCode === this.list[m].workorderCode) {
arr.push(ele);
}
});
// 工单申请数量
let totalApplyNum = arr[0].applyNum - 0;
// 当前工单已经录入了总数量 vista是每一个录入数量
let totalVista = 0;
arr.forEach((ele) => {
totalVista = totalVista + (ele.vista ? ele.vista - 0 : 0);
});
// 最终填入的数量
let endVista = 0;
endVista = (
this.list[m].applyNum -
0 -
(this.list[m].vista - 0)
).toFixed(3);
// 处理最后一行
if (m === this.list.length - 1) {
endVista = res.PACMG - 0;
}
// 工单录入数量总和小于总的申请数量 那就要新增一行
if (totalVista < totalApplyNum) {
this.handleAddList(m, endVista, res);
// 当前包装数量 大于(总的申请数量 减 工单录入数量总)就要往下一个分配
if (res.PACMG - 0 - endVista > 0) {
this.factorial(res, plnr, m + 2, res.PACMG - 0 - endVista);
}
return;
}
} else {
this.$u.toast("暂无剩余物料");
}
}
}
}
},
},
};
</script>
<style lang="scss" scoped>
page {
background: #f8f8f8;
background: #f8f8f8;
}
.headerTitle{
padding: 20rpx;
font-weight: 600;
.items{
line-height: 40rpx;
}
.headerTitle {
padding: 20rpx;
font-weight: 600;
.items {
line-height: 40rpx;
}
}
.btn {
padding: 20rpx;
background: #fff;
.topSearch {
margin-bottom: 20rpx;
}
padding: 20rpx;
background: #fff;
.topSearch {
margin-bottom: 20rpx;
}
}
.bottomBtn {
position: sticky;
padding: 20rpx;
display: flex;
justify-content: space-between;
background: #fff;
bottom: 0rpx;
margin-top: 20rpx;
.u-btn {
width: 300rpx;
}
position: sticky;
padding: 20rpx;
display: flex;
justify-content: space-between;
background: #fff;
bottom: 0rpx;
margin-top: 20rpx;
.u-btn {
width: 300rpx;
}
}
.blue {
color: #3f9dcc;
color: #3f9dcc;
}
.total {
background: #fff;
color: #000;
padding: 0rpx 40rpx;
display: flex;
justify-content: space-between;
font-size: 32rpx;
.line {
margin: 0px 10rpx;
}
background: #fff;
color: #000;
padding: 0rpx 40rpx;
display: flex;
justify-content: space-between;
font-size: 32rpx;
.line {
margin: 0px 10rpx;
}
}
.cardbox {
min-height: calc(100vh - 480rpx);
padding: 0rpx 20rpx;
margin-top: 20rpx;
min-height: calc(100vh - 480rpx);
padding: 0rpx 20rpx;
margin-top: 20rpx;
}
.cardContent {
border-radius: 8px;
background: #fff;
margin-bottom: 20rpx;
border-radius: 8px;
background: #fff;
margin-bottom: 20rpx;
}
.listItemTitle {
display: flex;
justify-content: space-between;
padding: 20rpx;
border-bottom: 2px solid #f8f8f8;
.u-btn {
width: 150rpx;
margin: 0px;
margin-top: 10rpx;
}
.item {
line-height: 50rpx;
color: #333;
font-size: 28rpx;
font-weight: 500;
word-break: break-all;
font-weight: 600;
}
display: flex;
justify-content: space-between;
padding: 20rpx;
border-bottom: 2px solid #f8f8f8;
.u-btn {
width: 150rpx;
margin: 0px;
margin-top: 10rpx;
}
.item {
line-height: 50rpx;
color: #333;
font-size: 28rpx;
font-weight: 500;
word-break: break-all;
font-weight: 600;
}
}
.listBottom {
.bottomTitle {
height: 80rpx;
position: relative;
.desc {
color: #bbb;
font-size: 24rpx;
line-height: 80rpx;
padding-left: 20rpx;
}
.topIcons {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: #aaa;
}
}
.bottomBox {
padding: 20rpx;
.bottomItem {
background: #f8f8f8;
padding: 20rpx;
margin-bottom: 20rpx;
.items {
color: #333;
font-size: 24rpx;
height: 40rpx;
line-height: 40rpx;
}
}
}
.bottomTitle {
height: 80rpx;
position: relative;
.desc {
color: #bbb;
font-size: 24rpx;
line-height: 80rpx;
padding-left: 20rpx;
}
.topIcons {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: #aaa;
}
}
.bottomBox {
padding: 20rpx;
.bottomItem {
background: #f8f8f8;
padding: 20rpx;
margin-bottom: 20rpx;
.items {
color: #333;
font-size: 24rpx;
height: 40rpx;
line-height: 40rpx;
}
}
}
}
/deep/ .u-sticky {
top: 0 !important;
background: #fff;
top: 0 !important;
background: #fff;
}
.checkedCase{
margin-top: 10rpx;
.checkedCase {
margin-top: 10rpx;
}
</style>
\ No newline at end of file
</style>
<template>
<view>
<view class="listItemTitle">
<view>
<view class="item">物料编号:{{ item.sapItemCode }}</view>
<view class="item">物料描述:{{ item.itemName }}</view>
</view>
<view class="right">
<text class="blue">{{totalVistaNum}}</text>
<text class="line">/</text>
<text class="">{{totalNum}}</text>
</view>
</view>
<view class="listBottom">
<view class="bottomTitle" @click="show = !show">
<view class="desc">卷条码明细</view>
<view class="topIcons">
<view v-if="show">
<u-icon name="arrow-down" color="#aaa" size="32"></u-icon>
展开
</view>
<view v-else>
<u-icon name="arrow-up" color="#aaa" size="32"></u-icon>
收起
</view>
</view>
</view>
<view v-if="!show" class="bottomBox">
<view class="bottomItem" v-for="(ele, idx) in list" :key="ele.workorderCode+idx" v-if="ele.itemCode === item.itemCode">
<view class="proItem">
<view class="items">生产单号:{{ ele.workorderCode }}</view>
<view class="progress">
<progress :percent="handleVista(ele)" show-info />
<!-- <u-line-progress active-color="#2979ff" :percent="handleVista(ele)"></u-line-progress> -->
</view>
</view>
<view class="items">PL:{{ ele.PLNR }}</view>
<view class="items">库位:{{ ele.NLPLA }}</view>
<!-- <view class="items">{{ item.MATNR }}</view> -->
<view class="items inputItem">
数量:
<!-- <uni-easyinput v-model="item.vista"></uni-easyinput> -->
{{ele.vista}}
/
{{ ele.applyNum }}
</view>
</view>
</view>
</view>
<!-- <BottomBtn :btnArr="btnArr" @getBtnHandle="getBtnHandle"></BottomBtn> -->
</view>
<view>
<view class="listItemTitle">
<view>
<view class="item">物料编号:{{ item.sapItemCode }}</view>
<view class="item">物料描述:{{ item.itemName }}</view>
</view>
<view class="right">
<text class="blue">{{ totalVistaNum }}</text>
<text class="line">/</text>
<text class="">{{ totalNum }}</text>
</view>
</view>
<view class="listBottom">
<view class="bottomTitle" @click="show = !show">
<view class="desc">卷条码明细</view>
<view class="topIcons">
<view v-if="show">
<u-icon name="arrow-down" color="#aaa" size="32"></u-icon>
展开
</view>
<view v-else>
<u-icon name="arrow-up" color="#aaa" size="32"></u-icon>
收起
</view>
</view>
</view>
<view v-if="!show" class="bottomBox">
<view
class="bottomItem"
v-for="(ele, idx) in details"
:key="ele.workorderCode"
>
<view class="proItem">
<view class="items">生产单号:{{ ele.workorderCode }}</view>
<view class="progress">
<progress :percent="handleVista(ele)" show-info />
<!-- <u-line-progress active-color="#2979ff" :percent="handleVista(ele)"></u-line-progress> -->
</view>
</view>
<view class="items inputItem">
数量:
<!-- <uni-easyinput v-model="item.vista"></uni-easyinput> -->
{{ handleUseVista(ele) }}
/
{{ ele.applyNum }}
</view>
<template v-for="item in ele.details">
<view class="items">PL:{{ item.PLNR }}</view>
<view class="items">库位:{{ item.LGORT }} - {{ item.LGOBE }}</view>
<view class="items">仓位:{{ item.NLPLA }}</view>
<!-- <view class="items">{{ item.MATNR }}</view> -->
</template>
</view>
</view>
</view>
<!-- <BottomBtn :btnArr="btnArr" @getBtnHandle="getBtnHandle"></BottomBtn> -->
</view>
</template>
<script>
import StickyNavBar from '@/components/StickyNavBar/index.vue';
import ContentLoadingMore from '@/components/ContentLoadingMore/index.vue';
import BottomBtn from '@/components/BottomBtn/index.vue';
import StickyNavBar from "@/components/StickyNavBar/index.vue";
import ContentLoadingMore from "@/components/ContentLoadingMore/index.vue";
import BottomBtn from "@/components/BottomBtn/index.vue";
export default {
components: {
StickyNavBar,
ContentLoadingMore,
BottomBtn
components: {
StickyNavBar,
ContentLoadingMore,
BottomBtn,
},
props: {
item: {
type: Object,
default: function () {
return {};
},
},
list: {
type: Array,
default: function () {
return [];
},
},
},
computed: {
details() {
return this.list.reduce((acc, cur) => {
const item = acc.find((v) => v.workorderCode === cur.workorderCode);
if (item) {
item.details.push({ ...cur });
} else {
acc.push({ ...cur, details: [{ ...cur }] });
}
return acc;
}, []);
},
totalNum() {
const workCodes = [];
return this.list.reduce((acc, cur) => {
if (workCodes.includes(cur.workorderCode)) {
return acc;
} else {
workCodes.push(cur.workorderCode);
return acc + cur.applyNum;
}
}, 0);
},
totalVistaNum() {
// let num = 0
// this.list.forEach(ele => {
// if(ele.itemCode === this.item.itemCode){
// num += (ele.vista-0)
// }
// });
// return num || ''
return this.list.reduce((acc, cur) => {
return acc + cur.vista;
}, 0);
},
},
watch: {
details: {
handler: function (val, oldVal) {
console.log(val, "00-------");
},
immediate: true,
deep: true,
},
},
data() {
return {
number: 0,
nlpla: "",
wxparams: "",
btnArr: [
{
style: "",
type: "warning",
text: "返回",
way: "goBack",
},
{
style: "",
type: "primary",
text: "提交",
way: "goSubmit",
},
],
isFocus: false,
show: true,
num1: 0,
};
},
created() {},
methods: {
handleUseVista(items) {
return items.details.reduce((acc, cur) => cur.vista + acc, 0)
},
props: {
item: {
type: Object,
default: function () {
return {};
}
},
list: {
type: Array,
default: function () {
return [];
}
}
},
computed:{
totalNum(){
let num = 0
this.list.forEach(ele => {
if(ele.itemCode === this.item.itemCode && !ele.add){
num += ele.applyNum
}
});
return num
},
totalVistaNum(){
let num = 0
this.list.forEach(ele => {
if(ele.itemCode === this.item.itemCode){
num += (ele.vista-0)
}
});
return num || ''
},
},
// watch: {
// goodsList: {
// handler: function(val, oldVal) {
// this.goodsList = val
// },
// immediate: true
// }
// },
data() {
return {
number: 0,
nlpla: '',
wxparams: '',
btnArr: [
{
style: '',
type: 'warning',
text: '返回',
way: 'goBack'
},
{
style: '',
type: 'primary',
text: '提交',
way: 'goSubmit'
}
],
isFocus: false,
show: true,
num1: 0
};
},
created() {
},
methods: {
handleVista(items){
let num = 0
this.list.forEach(ele => {
if(ele.workorderCode === items.workorderCode){
console.log(`output->`,ele.vista,items.workorderCode)
num += ((ele.vista?ele.vista: 0)-0)
}
});
console.log(`output->num`,num)
return ((num/items.applyNum).toFixed(2)*100-0)>100? 100 : (num/items.applyNum).toFixed(2)*100|| 0
}
}
handleVista(items) {
let num = 0;
this.list.forEach((ele) => {
if (ele.workorderCode === items.workorderCode) {
console.log(`output->`, ele.vista, items.workorderCode);
num += (ele.vista ? ele.vista : 0) - 0;
}
});
console.log(`output->num`, num);
return (num / items.applyNum).toFixed(2) * 100 - 0 > 100
? 100
: (num / items.applyNum).toFixed(2) * 100 || 0;
},
},
};
</script>
<style lang="scss" scoped>
page {
background: #f8f8f8;
background: #f8f8f8;
}
.headerTitle {
padding: 20rpx;
font-weight: 600;
.items {
line-height: 40rpx;
}
padding: 20rpx;
font-weight: 600;
.items {
line-height: 40rpx;
}
}
.btn {
padding: 20rpx;
background: #fff;
.topSearch {
margin-bottom: 20rpx;
}
padding: 20rpx;
background: #fff;
.topSearch {
margin-bottom: 20rpx;
}
}
.bottomBtn {
position: sticky;
padding: 20rpx;
display: flex;
justify-content: space-between;
background: #fff;
bottom: 0rpx;
margin-top: 20rpx;
.u-btn {
width: 300rpx;
}
position: sticky;
padding: 20rpx;
display: flex;
justify-content: space-between;
background: #fff;
bottom: 0rpx;
margin-top: 20rpx;
.u-btn {
width: 300rpx;
}
}
.blue {
color: #3f9dcc;
color: #3f9dcc;
}
.total {
background: #fff;
color: #000;
padding: 0rpx 40rpx;
display: flex;
justify-content: space-between;
font-size: 32rpx;
.line {
margin: 0px 10rpx;
}
background: #fff;
color: #000;
padding: 0rpx 40rpx;
display: flex;
justify-content: space-between;
font-size: 32rpx;
.line {
margin: 0px 10rpx;
}
}
.listItemTitle {
display: flex;
justify-content: space-between;
padding: 20rpx;
border-bottom: 2px solid #f8f8f8;
.u-btn {
width: 150rpx;
margin: 0px;
margin-top: 10rpx;
}
.item {
line-height: 50rpx;
color: #333;
font-size: 28rpx;
font-weight: 500;
word-break: break-all;
font-weight: 600;
}
display: flex;
justify-content: space-between;
padding: 20rpx;
border-bottom: 2px solid #f8f8f8;
.u-btn {
width: 150rpx;
margin: 0px;
margin-top: 10rpx;
}
.item {
line-height: 50rpx;
color: #333;
font-size: 28rpx;
font-weight: 500;
word-break: break-all;
font-weight: 600;
}
}
.listBottom {
.bottomTitle {
height: 80rpx;
position: relative;
.desc {
color: #bbb;
font-size: 24rpx;
line-height: 80rpx;
padding-left: 20rpx;
}
.topIcons {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: #aaa;
}
}
.bottomBox {
padding: 20rpx;
.bottomItem {
background: #f8f8f8;
padding: 20rpx;
margin-bottom: 20rpx;
.items {
color: #333;
font-size: 24rpx;
line-height: 40rpx;
word-break: break-all;
/deep/ .uni-easyinput{
width: 200rpx;
}
}
.inputItem{
display: inline-flex;
// line-height: 76rpx;
}
}
}
.bottomTitle {
height: 80rpx;
position: relative;
.desc {
color: #bbb;
font-size: 24rpx;
line-height: 80rpx;
padding-left: 20rpx;
}
.topIcons {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: #aaa;
}
}
.bottomBox {
padding: 20rpx;
.bottomItem {
background: #f8f8f8;
padding: 20rpx;
margin-bottom: 20rpx;
.items {
color: #333;
font-size: 24rpx;
line-height: 40rpx;
word-break: break-all;
/deep/ .uni-easyinput {
width: 200rpx;
}
}
.inputItem {
display: inline-flex;
// line-height: 76rpx;
}
}
}
}
/deep/ .u-sticky {
top: 0 !important;
background: #fff;
top: 0 !important;
background: #fff;
}
.progress{
width: 45%;
margin-left: 20rpx;
/deep/ .uni-progress-info{
font-size: 24rpx;
}
.progress {
width: 45%;
margin-left: 20rpx;
/deep/ .uni-progress-info {
font-size: 24rpx;
}
}
/deep/ .uni-progress{
line-height: 40rpx;
/deep/ .uni-progress {
line-height: 40rpx;
}
.proItem{
display: flex;
.proItem {
display: flex;
}
</style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment