<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>
					<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="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";
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
            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;
            }, []);

            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;
}
.headerTitle {
  padding: 20rpx;
  font-weight: 600;
  .items {
    line-height: 40rpx;
  }
}
.btn {
  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;
  }
}
.blue {
  color: #3f9dcc;
}
.total {
  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;
}
.cardContent {
  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;
  }
}
.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;
      }
    }
  }
}
/deep/ .u-sticky {
  top: 0 !important;
  background: #fff;
}
.checkedCase {
  margin-top: 10rpx;
}
</style>
