<template>
  <div>
    <div class="top_fixed">
      <el-button type="primary" size="mini" @click="save(2, 'all')"
        >一键报工</el-button
      >
      <el-button type="primary" size="mini" @click="removeCacheFn('all')"
        >清空缓存</el-button
      >
      <el-button
        v-if="taskObj.type == 1"
        type="primary"
        size="mini"
        @click="save(1, 'all')"
        >缓存</el-button
      >
    </div>

    <div class="job_box">
      <div
        v-for="(item, index) in List"
        :key="index"
        class="card_box"
        v-if="isLoad"
      >
        <div class="title_box rx-bc">
          <div class="name">工单信息 </div>

          <div class="rx-bc">
            <el-button
              type="text"
              size="mini"
              @click="openPicking(item.workOrderId, item)"
              >添加物料</el-button
            >
            <el-button
              type="text"
              size="mini"
              @click="removeCacheFn(item.workOrderId)"
              >清空缓存</el-button
            >
            <el-button
              v-if="taskObj.type == 1"
              type="text"
              size="mini"
              @click="save(1, index)"
              >缓存</el-button
            >
          </div>
        </div>

        <workOrderBom :item="item"></workOrderBom>
        <paramBom
          v-if="item.paramDetailList.length != 0"
          :list="item.paramDetailList"
        ></paramBom>

        <jobBom
          :item="item"
          :notFormed="item.notFormedList"
          :warehouseList="warehouseList"
        ></jobBom>

        <deviceBom
          v-if="item.equipmentList.length != 0"
          :list="item.equipmentList"
        ></deviceBom>

        <modelBom
          v-if="item.modelList.length != 0"
          :list="item.modelList"
          pattern="job"
          ref="modelRef"
        ></modelBom>

        <palletBom
          v-if="item.palletList.length != 0"
          :list="item.palletList"
        ></palletBom>

        <revolvingDiskBom
          v-if="item.revolvingDiskList.length > 0"
          pattern="job"
          :list="objData.revolvingDiskList"
        >
        </revolvingDiskBom>

        <semiProductJobBom
          :singleReport="item.singleReport"
          v-if="
            item.semiProductList &&
            item.semiProductList.length != 0 &&
            taskObj.type != 4 &&
            taskObj.type != 6 &&
            item.singleReport == 1
          "
          :item="item"
          :list="item.semiProductList"
          :equipmentList="item.equipmentList"
        ></semiProductJobBom>

        <semiProductJobBomPL
          :singleReport="item.singleReport"
          v-if="
            item.semiProductList &&
            item.semiProductList.length != 0 &&
            taskObj.type != 4 &&
            taskObj.type != 6 &&
            item.singleReport == 0
          "
          :item="item"
          :list="item.semiProductList"
          :equipmentList="item.equipmentList"
        ></semiProductJobBomPL>

        <oneJobQualityBom
          :singleReport="item.singleReport"
          v-if="
            item.semiProductList &&
            item.semiProductList.length != 0 &&
            taskObj.type == 6 &&
            item.singleReport == 1
          "
          :item="item"
          :list="item.semiProductList"
        >
        </oneJobQualityBom>

        <byProductBom
          v-if="item.productRecycleList.length != 0"
          :list="item.productRecycleList"
        >
        </byProductBom>

        <turnoverBom
          v-if="item.turnover.length != 0"
          :list="item.turnover"
          :wordItem="item"
          pattern="job"
        >
        </turnoverBom>

        <aridRegion
          v-if="item.aridRegionList.length != 0"
          :list="item.aridRegionList"
          :isType="true"
        ></aridRegion>

        <!-- <packingBom :taskId='taskObj.id' :workOrderId="item.workOrderId" :objData="item" ref="packRef"
          v-if='taskObj.type == 4 && clientEnvironmentId != 3 && item'></packingBom> -->

        <packingTgBom
          v-if="
            item.pickOutInList &&
            item.pickOutInList.length != 0 &&
            taskObj.type == 4 &&
            clientEnvironmentId == 3
          "
          :list="item.pickOutInList"
          :item="item"
        ></packingTgBom>
      </div>
    </div>

    <pickingList
      isType="job"
      ref="pickingListRef"
      @allSelection="allSelection"
    ></pickingList>
  </div>
</template>

<script>
  import { listByIdsReport } from '@/api/produce/job';
  import { getWarehouseList } from '@/api/produce/index';
  import {
    jobSave,
    saveCache,
    getCache,
    removeCache
  } from '@/api/produce/workOrder';
  import pickingList from '../picking/pickingList.vue';

  import workOrderBom from '../feeding/components/workOrderBom.vue';
  import paramBom from '../feeding/components/paramBom.vue';
  import jobBom from './components/jobBom.vue';
  import deviceBom from '../feeding/components/deviceBom.vue';
  import modelBom from '../feeding/components/modelBom.vue';
  import palletBom from './components/palletBom.vue';
  import revolvingDiskBom from '../feeding/components/revolvingDiskBom.vue';
  import oneJobQualityBom from './components/oneJobQualityBom.vue';
  import semiProductJobBom from './components/semiProductJobBom.vue';
  import semiProductJobBomPL from './components/semiProductJobBomPL.vue';

  import byProductBom from './components/byProductBom.vue';
  import turnoverBom from './components/turnoverBom.vue';
  import aridRegion from '../feeding/components/aridRegion.vue';
  import packingBom from './components/packingBom.vue';
  import packingTgBom from './components/packingTgBom';

  export default {
    components: {
      pickingList,

      workOrderBom,
      paramBom,
      jobBom,
      deviceBom,
      modelBom,
      palletBom,
      revolvingDiskBom,
      oneJobQualityBom,
      semiProductJobBom,
      semiProductJobBomPL,
      byProductBom,
      turnoverBom,
      aridRegion,
      packingBom,
      packingTgBom
    },
    props: {
      workListIds: {
        type: Array,
        default() {
          return [];
        }
      }
    },

    computed: {
      taskObj() {
        return this.$store.state.user.taskObj;
      }
    },

    data() {
      return {
        List: [],
        idsList: [],
        isLoad: false,

        warehouseList: [],

        loading: null
      };
    },

    computed: {
      taskObj() {
        return this.$store.state.user.taskObj;
      },

      clientEnvironmentId() {
        return this.$store.state.user.info.clientEnvironmentId;
      }
    },

    watch: {
      workListIds: {
        handler(val) {
          this.getList(val);
        },
        deep: true,
        immediate: true
      }
    },

    created() {
      this.getWarehouseListFn();
    },

    methods: {
      getList(ids) {
        this.idsList = ids || [];
        let param = {
          ids: ids,
          taskId: this.taskObj.id,
          type: 0
        };
        this.isLoad = false;
        listByIdsReport(param)
          .then((res) => {
            this.List = res.map((obj) => {
              if (!Object.prototype.hasOwnProperty.call(obj, 'turnover')) {
                obj['turnover'] = [];
              }
              if (
                !Object.prototype.hasOwnProperty.call(obj, 'aridRegionList')
              ) {
                obj['aridRegionList'] = [];
              }

              if (!Object.prototype.hasOwnProperty.call(obj, 'instanceList')) {
                obj['instanceList'] = [];
              }

              if (!Object.prototype.hasOwnProperty.call(obj, 'palletList')) {
                obj['palletList'] = [];
              }

              if (
                !Object.prototype.hasOwnProperty.call(obj, 'revolvingDiskList')
              ) {
                obj['revolvingDiskList'] = [];
              }

              if (obj.palletList.length > 0) {
                obj.palletList = obj.palletList.map((m) => {
                  return {
                    hideKc: true, // 不显示库存
                    quantity: m.feedQuantity,
                    ...m
                  };
                });
              }

              if (this.taskObj.type == 6 && this.clientEnvironmentId == 3) {
                obj.semiProductList = obj.pickOutInList;
              }

              if (this.clientEnvironmentId == 3 && obj.singleReport == 0) {
                obj.semiProductList.map((a) => {
                  a.extInfo.batchReportInfo = [
                    {
                      allFeedQuantity: '',
                      allReportWeight: '',
                      taskId: '',
                      taskName: ''
                    }
                  ];
                  return {
                    a
                  };
                });
                obj.semiProductList = JSON.parse(
                  JSON.stringify(obj.semiProductList)
                );
              }

              obj.workReportInfo = {
                formingNum: null,
                formingWeight: null,
                formedNum: null,
                formedWeight: null,
                taskId: this.taskObj.id
              };

              obj.notFormedList = [
                {
                  notFormedNum: null,
                  notFormedWeight: null,
                  weightUnit: obj.weightUnit,
                  unit: obj.unit,
                  warehouseId: null // 处置 仓库id
                }
              ];

              if (obj.semiProductList.length > 0) {
                // 预制体报工
                obj.workReportInfo.formedNum = obj.semiProductList.length;
              }

              obj.workReportInfo.formingNum = obj.formingNum;
              obj.workReportInfo.formingWeight = obj.formingWeight;
              obj.workReportInfo.unit = obj.unit;
              obj.workReportInfo.weightUnit = obj.weightUnit;
              obj.workReportInfo.workOrderId = obj.workOrderId;

              obj.paramDetailList.map((m) => {
                if (m.extInfo.textType == 5) {
                  m.remainingTime = m.extInfo.remainingTime;
                }
                return {
                  ...m.extInfo
                };
              });
              console.log(obj, 444);

              return {
                ...obj
              };
            });
          })
          .finally(() => {
            this.isLoad = true;

            if (this.taskObj.type == 1) {
              this.getCacheFn();
            }
          });
      },

      openPicking(id, item) {
        this.$refs.pickingListRef.open(id, item);
      },

      allSelection(id, selectList) {
        this.List.forEach((m) => {
          if (m.workOrderId == id) {
            let turnover = [];
            let equipmentList = []; // 生产设备

            selectList.forEach((f) => {
              if (f.rootCategoryLevelId == 4) {
                equipmentList = equipmentList.concat(f);
              }
              if (f.rootCategoryLevelId == 7) {
                turnover = turnover.concat(f);
              }
            });

            this.$set(m, 'equipmentList', equipmentList);
            this.$set(m, 'turnover', turnover);

            this.$forceUpdate();
          }
        });
      },

      async save(type) {
        this.loading = this.$loading({
          lock: true,
          text: '加载中',
          background: 'rgba(0, 0, 0, 0.7)'
        });

        let bol2;
        bol2 = this.List.every((e) => {
          return (
            e.workReportInfo['formedNum'] && e.workReportInfo['formedNum'] != 0
          );
        });

        if (!bol2) {
          this.$message.warning('请输入合格品数量');
          this.loading.close();
          return false;
        }

        // 预制体

        let wId;
        let bol = true;
        let _i;
        this.List.forEach((L) => {
          if (
            L.semiProductList.length > 0 &&
            this.taskObj.type != 4 &&
            L.singleReport == 1
          ) {
            bol = L.semiProductList.every((e, i) => {
              _i = i + 1;
              wId = L.code;

              if (this.taskObj.type == 6) {
                return (
                  Object.prototype.hasOwnProperty.call(e.extInfo, 'taskId') &&
                  e.extInfo.taskId
                );
              } else {
                return (
                  Object.prototype.hasOwnProperty.call(e.extInfo, 'taskId') &&
                  e.extInfo.taskId &&
                  e.extInfo.reportWeight
                );
              }
            });
          }
        });

        if (!bol) {
          this.$message.warning(`请完善工单${wId}第${_i}处置方式`);
          this.loading.close();

          return false;
        }

        if (this.clientEnvironmentId != 2) {
          let succ = this.List.some((L) => {
            return L.productRecycleList.length > 0;
          });

          if (succ) {
            const isRecycle = await this.checkRecycle();
            if (!isRecycle) {
              return false;
            }
          }
        }

        // if (this.taskObj.type == 4 && this.clientEnvironmentId != 3) {
        // 	const isPack = await this.checkPack()

        // 	if (!isPack) {
        // 		return false
        // 	}
        // }

        if (this.taskObj.type == 1) {
          const isCache = await this.checkCache(type);

          if (!isCache) {
            return false;
          }
        }

        jobSave(this.List)
          .then((res) => {
            this.loading.close();
            this.$message.success('报工成功');
            this.getList(this.idsList);
          })
          .catch(() => {
            this.loading.close();
          })
          .finally(() => {
            setTimeout(function () {
              // this.loading.close();
            }, 3000);
          });
      },

      checkRecycle() {
        this.loading.close();
        return new Promise((resolve) => {
          this.$confirm('是否跳过副产品回收处置！', '提示', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          })
            .then(() => {
              resolve(true);
            })
            .catch(() => {
              resolve(false);
            });
        });
      },

      checkCache(type) {
        return new Promise((resolve) => {
          if (type == 1) {
            saveCache(this.List).then((rr) => {
              this.$message.success('缓存成功');
              this.loading.close();
            });
            resolve(false);
          } else if (type == 2) {
            resolve(true);
          }
        });
      },

      getCacheFn() {
        let parma = {
          workOrderIds: this.idsList,
          taskId: this.taskObj.id,
          type: 1
        };

        getCache(parma).then((res) => {
          console.log(res);
        });
      },

      removeCacheFn(type) {
        this.$confirm('是否清空缓存', '缓存')
          .then(() => {
            let parma = {
              workOrderIds: type == 'all' ? this.idsList : [type],
              taskId: this.taskObj.id,
              type: 1
            };
            removeCache(parma).then((res) => {
              this.$message.success('已经清空缓存');
              this.getList(this.idsList);
            });
          })
          .catch(() => {});
      },

      getWarehouseListFn() {
        getWarehouseList().then((res) => {
          this.warehouseList = res.data;
        });
      }
    }
  };
</script>

<style scoped lang="scss">
  .top_fixed {
    width: 100%;
    height: 40px;
    background: #fff;
    display: flex;
    align-items: center;
    justify-content: flex-end;
  }

  .title_box {
    .name {
      font-size: 14px;
      font-style: normal;
      font-weight: 400;
      color: #157a2c;
      padding-left: 5px;
      position: relative;

      &:before {
        position: absolute;
        content: '';
        left: 0px;
        top: 0px;
        bottom: 0px;
        width: 2px;
        height: 14px;
        background: #157a2c;
        margin: auto;
      }
    }
  }

  .job_box {
    margin-top: 6px;
    width: 100%;
    height: calc(100vh - 70px - 50px - 80px - 60px);
    overflow-y: scroll;
    overflow-x: hidden;
  }

  .card_box {
    background: #fff;
    padding: 8px;
    border-radius: 2px;
  }
</style>
