loulijun2021
2023-02-14 b46bc2dba51a3885a68e4c58316b41a31ea16bb2
src/views/scgl/zdpc.vue
@@ -208,7 +208,7 @@
                  size="small"
                  :picker-options="pickerOptions1"
                  :clearable="false"
                  @change="change_time"
                  @change="dateChange"
                />
              </el-form-item>
              <el-form-item label="排程方式" style=" display: flex;">
@@ -216,7 +216,7 @@
                  v-model="formBottom.types"
                  :disabled="radioSelectedId===''"
                  style="width:120px"
                  @change="changeTypes"
                  @change="typesChange"
                >
                  <el-option value="N" label="设备优先" />
                  <el-option value="Y" label="时间优先" />
@@ -240,8 +240,8 @@
              </el-form-item>
              <el-form-item label="预排进度" style=" display: flex;">
                <span>
                  <span style="text-decoration:underline;">{{ formBottom.real_num }}</span> /
                  <span style="text-decoration:underline">{{ formBottom.meter }}</span>
                  <span style="text-decoration:underline;">{{ formBottom.canArrangeNumber }}</span> /
                  <span style="text-decoration:underline">{{ formBottom.needArrangeNumber }}</span>
                </span>
              </el-form-item>
            </div>
@@ -254,7 +254,7 @@
                :disabled="radioSelectedId===''"
                type="primary"
                icon="el-icon-document-remove"
                @click="click_schedule"
                @click="prepareArrange"
              >预排
              </el-button>
              <el-button
@@ -262,11 +262,17 @@
                type="primary"
                :disabled="radioSelectedId===''"
                icon="el-icon-document-checked"
                @click="click_yes"
                @click="prepareSubmit"
              >提交
              </el-button>
            </div>
          </el-form>
          <div class="colorDescription">
            <div class="colorDescriptionItem"><i class="el-icon-s-opportunity" style="margin-right: 5px;color: rgba(5, 185, 100, 0.5)" />产能</div>
            <div class="colorDescriptionItem"><i class="el-icon-s-opportunity" style="margin-right: 5px;color: rgba(5, 185, 100, 1)" />已排</div>
            <div class="colorDescriptionItem"><i class="el-icon-s-opportunity" style="margin-right: 5px;color:rgba(128,0,128,0.7)" />预排</div>
            <!--            <div class="colorDescriptionItem"><i class="el-icon-s-opportunity" style="margin-right: 5px;color: #a7a7a7" />失效产能</div>-->
          </div>
          <div
            class="bodyTopFormExpand"
            style="height: 5px"
@@ -309,7 +315,7 @@
                  <el-checkbox
                    v-model="data.status"
                    style="margin-right:5px;"
                    @change="click_box(data)"
                    @change="checkboxSingle(data)"
                  />
                  {{ data.id }} {{ data.name }}
                </div>
@@ -328,7 +334,7 @@
                v-model="ganttCheckboxAll"
                class="box_style"
                :disabled="radioSelectedId===''"
                @change="changeLift()"
                @change="checkboxAll()"
              />
              <input
                v-model.number="cellWidth"
@@ -353,7 +359,7 @@
import Test from '@/components/Test'
import dayjs from 'dayjs'
import { AdvancedSchedulingSearch, OnclickAdvancedSchedulingDevice, SubmitAlreadyScheduling } from '@/api/scgl'
import { handleDatetime } from '@/utils/global'
import { handleDatetime, handleDatetime2 } from '@/utils/global'
import waves from '@/directive/waves'
export default {
@@ -411,28 +417,28 @@
        types: 'N', // 排程方式
        scale: 60, // 时间刻度
        times: 0, // 换型时间
        real_num: 0, // 可排数量
        meter: 0// 需排数量
        canArrangeNumber: 0, // 可排数量
        needArrangeNumber: 0// 需排数量
      },
      schedulingData: [], // 排程的最终数据
      timeTopTempData: [], // 时间优先的临时数据
      eqpTopTempData: [], //  设备优先的临时数据
      formUpdata: {
      formUpdate: {
        WorkCode: '',
        BotProceCode: '',
        json: []
      },
      currentTime: dayjs(),
      // currentTime: dayjs(),
      cellWidth: 50,
      cellHeight: 30,
      titleHeight: 40,
      titleWidth: 250,
      dataKey: 'id',
      timeList: `0,30,60,120,240,480`.split(',').map(n => parseInt(n)),
      // timeList: `0,30,60,120,240,480`.split(',').map(n => parseInt(n)),
      scaleList: `30,60,240,360`.split(',').map(n => parseInt(n)),
      hideHeader: false,
      arrayKeys: ['gtArray', 'error'],
      title_list: []
      arrayKeys: ['gtArray', 'error']
    }
  },
@@ -504,18 +510,26 @@
    /*
     排程部分的方法
     */
    resetFormcx() {
      this.$nextTick(() => {
        this.$refs.form.resetFields()
      })
    },
    // 确保换型时间为非负数
    no_zero() {
      if (this.formBottom.times < 0) {
        this.formBottom.times = 0
      }
    },
    // 工位列表复选框操作
    changeLift() {
    // 排程方式改变
    typesChange() {
      this.getOnclickAdvancedSchedulingDevice()
    },
    // 排程日期值改变时
    dateChange() {
      this.time_data[0] = this.formBottom.scheDate[0] + ' 00:00'
      this.time_data[1] = this.formBottom.scheDate[1] + ' 23:59'
      this.forms.startdate = this.formBottom.scheDate[0]
      this.forms.enddate = this.formBottom.scheDate[1]
      this.getOnclickAdvancedSchedulingDevice()
    },
    // 工位列表复选框操作  (全选、全不选)
    checkboxAll() {
      if (this.ganttCheckboxAll) {
        this.ganttLeftArrId = []
        this.getOnclickAdvancedSchedulingDevice()
@@ -528,26 +542,15 @@
          this.timeTopTempData[i].gtArray = []
        }
      }
      // this.click_schedule()
    },
    changeTypes() {
      this.getOnclickAdvancedSchedulingDevice()
    },
    // 排程日期值改变时
    change_time() {
      this.time_data[0] = this.formBottom.scheDate[0] + ' 00:00'
      this.time_data[1] = this.formBottom.scheDate[1] + ' 23:59'
      this.forms.startdate = this.formBottom.scheDate[0]
      this.forms.enddate = this.formBottom.scheDate[1]
      this.getOnclickAdvancedSchedulingDevice()
      // this.prepareArrange()
    },
    // 甘特图左侧checkbox值选中或者取消时
    click_box(val) {
    checkboxSingle(val) {
      if (!val.status) {
        for (const i in this.timeTopTempData) {
          const new_arr = []
          for (const j in this.timeTopTempData[i].gtArray) {
            if (this.timeTopTempData[i].gtArray[j].id == val.id) {
            if (this.timeTopTempData[i].gtArray[j].id === val.id) {
            } else {
              new_arr.push(this.timeTopTempData[i].gtArray[j])
            }
@@ -582,16 +585,15 @@
      for (const i in this.schedulingData) {
        const arr = []
        for (const j in this.schedulingData[i].gtArray) {
          if (this.schedulingData[i].gtArray[j].type != 'schedule') {
          if (this.schedulingData[i].gtArray[j].type !== 'schedule') {
            arr.push(this.schedulingData[i].gtArray[j])
          }
        }
        this.schedulingData[i].gtArray = arr
      }
      this.formBottom.real_num = 0
      // this.click_schedule()
      this.formBottom.canArrangeNumber = 0
      // this.prepareArrange()
    },
    // 点击带出数据
    async getOnclickAdvancedSchedulingDevice() {
      const res = await OnclickAdvancedSchedulingDevice(this.forms)
@@ -602,95 +604,47 @@
      const data = res.rows // 拿到待排数据  对数据进行改造
      const cont = res.Cont // 拿到已排数据  对数据进行改造
      this.formBottom.real_num = 0
      this.formBottom.canArrangeNumber = 0
      // 将五个时间段进行赋值
      for (const i in data) {
        for (const j in data[i].children) {
          if (data[i].children[j].OneStartDate != '') {
            data[i].children[
              j
            ].OneStartDate = data[i].children[
              j
            ].OneStartDate.split('~')
            data[i].children[j].OneStartDate[0] =
              data[i].YearDate +
              ' ' +
              data[i].children[j].OneStartDate[0]
            data[i].children[j].OneStartDate[1] =
              data[i].YearDate +
              ' ' +
              data[i].children[j].OneStartDate[1]
      data.forEach(item => {
        item.children.forEach(it => {
          if (it.OneStartDate !== '') {
            it.OneStartDate = it.OneStartDate.split('~')
            it.OneStartDate[0] = item.YearDate + ' ' + it.OneStartDate[0] + ':00'
            it.OneStartDate[1] = item.YearDate + ' ' + it.OneStartDate[1] + ':00'
          }
          if (data[i].children[j].TwoStartDate != '') {
            data[i].children[
              j
            ].TwoStartDate = data[i].children[
              j
            ].TwoStartDate.split('~')
            data[i].children[j].TwoStartDate[0] =
              data[i].YearDate +
              ' ' +
              data[i].children[j].TwoStartDate[0]
            data[i].children[j].TwoStartDate[1] =
              data[i].YearDate +
              ' ' +
              data[i].children[j].TwoStartDate[1]
          }
          if (data[i].children[j].ThreeStartDate != '') {
            data[i].children[
              j
            ].ThreeStartDate = data[i].children[
              j
            ].ThreeStartDate.split('~')
            data[i].children[j].ThreeStartDate[0] =
              data[i].YearDate +
              ' ' +
              data[i].children[j].ThreeStartDate[0]
            data[i].children[j].ThreeStartDate[1] =
              data[i].YearDate +
              ' ' +
              data[i].children[j].ThreeStartDate[1]
          }
          if (data[i].children[j].FourStartDate != '') {
            data[i].children[
              j
            ].FourStartDate = data[i].children[
              j
            ].FourStartDate.split('~')
            data[i].children[j].FourStartDate[0] =
              data[i].YearDate +
              ' ' +
              data[i].children[j].FourStartDate[0]
            data[i].children[j].FourStartDate[1] =
              data[i].YearDate +
              ' ' +
              data[i].children[j].FourStartDate[1]
          }
          if (data[i].children[j].FiveStartDate != '') {
            data[i].children[
              j
            ].FiveStartDate = data[i].children[
              j
            ].FiveStartDate.split('~')
            data[i].children[j].FiveStartDate[0] =
              data[i].YearDate +
              ' ' +
              data[i].children[j].FiveStartDate[0]
            data[i].children[j].FiveStartDate[1] =
              data[i].YearDate +
              ' ' +
              data[i].children[j].FiveStartDate[1]
          }
        }
      }
          if (it.TwoStartDate !== '') {
            it.TwoStartDate = it.TwoStartDate.split('~')
            it.TwoStartDate[0] = item.YearDate + ' ' + it.TwoStartDate[0] + ':00'
            it.TwoStartDate[1] = item.YearDate + ' ' + it.TwoStartDate[1] + ':00'
          }
          if (it.ThreeStartDate !== '') {
            it.ThreeStartDate = it.ThreeStartDate.split('~')
            it.ThreeStartDate[0] = item.YearDate + ' ' + it.ThreeStartDate[0] + ':00'
            it.ThreeStartDate[1] = item.YearDate + ' ' + it.ThreeStartDate[1] + ':00'
          }
          if (it.FourStartDate !== '') {
            it.FourStartDate = it.FourStartDate.split('~')
            it.FourStartDate[0] = item.YearDate + ' ' + it.FourStartDate[0] + ':00'
            it.FourStartDate[1] = item.YearDate + ' ' + it.FourStartDate[1] + ':00'
          }
          if (it.FiveStartDate !== '') {
            it.FiveStartDate = it.FiveStartDate.split('~')
            it.FiveStartDate[0] = item.YearDate + ' ' + it.FiveStartDate[0] + ':00'
            it.FiveStartDate[1] = item.YearDate + ' ' + it.FiveStartDate[1] + ':00'
          }
        })
      })
      // 构建 按设备优先排程的 数据格式 schedulingData
      const list = [] // 临时list  暂存
      for (const i in data[0].children) {
      data[0].children.forEach(item => {
        const obj = {
          id: '',
          name: '',
          AdvaDevicRhythm: '',
          AdvaDevicRhythm: '', // 节拍多少秒生产一个(生产节拍)
          status: true,
          colorPair: {
            dark: 'rgb(83, 186, 241,0.8)',
@@ -701,19 +655,17 @@
          },
          gtArray: []
        }
        obj.id = data[0].children[i].AdvaDevicNumber
        obj.name = data[0].children[i].AdvaDevicName
        obj.AdvaDevicRhythm = data[0].children[
          i
        ].AdvaDevicRhythm
        obj.id = item.AdvaDevicNumber
        obj.name = item.AdvaDevicName
        obj.AdvaDevicRhythm = item.AdvaDevicRhythm
        list.push(obj)
      }
      })
      // 组合新的结构
      // 组合新的结构     浅绿色背景条
      const newList = []
      for (const i in data) {
        for (const j in data[i].children) {
          if (data[i].children[j].OneStartDate != '') {
          if (data[i].children[j].OneStartDate !== '') {
            const data1 = {
              id: '',
              start: '',
@@ -723,12 +675,11 @@
            data1.id = data[i].children[j].AdvaDevicNumber
            data1.start = data[i].children[j].OneStartDate[0]
            data1.end = data[i].children[j].OneStartDate[1]
            data1.mod =
              (data[i].children[j].AdvaDevicCropMob * 1) /
              100
            // AdvaDevicCropMob 稼动率     AdvaDevicRhythm  生产节拍
            data1.mod = (data[i].children[j].AdvaDevicCropMob * 1) / 100 // 稼动率
            newList.push(data1)
          }
          if (data[i].children[j].TwoStartDate != '') {
          if (data[i].children[j].TwoStartDate !== '') {
            const data2 = {
              id: '',
              start: '',
@@ -738,12 +689,10 @@
            data2.id = data[i].children[j].AdvaDevicNumber
            data2.start = data[i].children[j].TwoStartDate[0]
            data2.end = data[i].children[j].TwoStartDate[1]
            data2.mod =
              (data[i].children[j].AdvaDevicCropMob * 1) /
              100
            data2.mod = (data[i].children[j].AdvaDevicCropMob * 1) / 100
            newList.push(data2)
          }
          if (data[i].children[j].ThreeStartDate != '') {
          if (data[i].children[j].ThreeStartDate !== '') {
            const data3 = {
              id: '',
              start: '',
@@ -751,16 +700,12 @@
              mod: ''
            }
            data3.id = data[i].children[j].AdvaDevicNumber
            data3.start = data[i].children[
              j
            ].ThreeStartDate[0]
            data3.start = data[i].children[j].ThreeStartDate[0]
            data3.end = data[i].children[j].ThreeStartDate[1]
            data3.mod =
              (data[i].children[j].AdvaDevicCropMob * 1) /
              100
            data3.mod = (data[i].children[j].AdvaDevicCropMob * 1) / 100
            newList.push(data3)
          }
          if (data[i].children[j].FourStartDate != '') {
          if (data[i].children[j].FourStartDate !== '') {
            const data4 = {
              id: '',
              start: '',
@@ -768,16 +713,12 @@
              mod: ''
            }
            data4.id = data[i].children[j].AdvaDevicNumber
            data4.start = data[i].children[
              j
            ].FourStartDate[0]
            data4.start = data[i].children[j].FourStartDate[0]
            data4.end = data[i].children[j].FourStartDate[1]
            data4.mod =
              (data[i].children[j].AdvaDevicCropMob * 1) /
              100
            data4.mod = (data[i].children[j].AdvaDevicCropMob * 1) / 100
            newList.push(data4)
          }
          if (data[i].children[j].FiveStartDate != '') {
          if (data[i].children[j].FiveStartDate !== '') {
            const data5 = {
              id: '',
              start: '',
@@ -785,13 +726,9 @@
              mod: ''
            }
            data5.id = data[i].children[j].AdvaDevicNumber
            data5.start = data[i].children[
              j
            ].FiveStartDate[0]
            data5.start = data[i].children[j].FiveStartDate[0]
            data5.end = data[i].children[j].FiveStartDate[1]
            data5.mod =
              (data[i].children[j].AdvaDevicCropMob * 1) /
              100
            data5.mod = (data[i].children[j].AdvaDevicCropMob * 1) / 100
            newList.push(data5)
          }
        }
@@ -803,30 +740,29 @@
      this.schedulingData = list
      if (cont != '') {
      if (cont !== '') {
        for (const i in cont) {
          for (const j in this.schedulingData) {
            if (this.schedulingData[j].id == cont[i].eqp_code) {
            if (this.schedulingData[j].id === cont[i].eqp_code) {
              const data = {
                id: cont[i].eqp_code,
                number: cont[i].alloc_qty,
                cl_name: cont[i].part_name,
                cl_code: this.cl_code,
                cl_code: cont[i].part_code,
                AdvaScheUom: cont[i].uom_name, // 单位
                work_order: cont[i].wo_code,
                STATUS: this.AdvaScheUom,
                // status: this.AdvaScheUom,
                start: cont[i].time_start,
                end: cont[i].time_end,
                type: cont[i].status == 'S' ? 'h_schedule' : 'bm_schedule'
                // type: cont[i].status === 'S' ? 'h_schedule' : 'bm_schedule'
                type: 'h_schedule'
              }
              this.schedulingData[j].flag = 'isCont'
              this.schedulingData[j].gtArray.unshift(data)
            }
          }
        }
      }
      if (this.ganttLeftArrId != '') {
      if (this.ganttLeftArrId !== '') {
        for (const j in this.schedulingData) {
          if (this.ganttLeftArrId.indexOf(this.schedulingData[j].id) >= 0) {
            this.schedulingData[j].gtArray = []
@@ -836,7 +772,7 @@
      }
      // 设备优先的数据格式
      this.title_list = []
      this.eqpTopTempData = []
      for (const i in data[0].children) {
        const obj = {
          id: '',
@@ -858,35 +794,36 @@
        obj.AdvaDevicRhythm = data[0].children[i].AdvaDevicRhythm
        // obj.mod =data[0].children[i].AdvaDevicCropMob *1
        this.title_list.push(obj)
        this.eqpTopTempData.push(obj)
      }
      // 更改格式
      this.timeTopTempData = []
      // 构建按时间优先的排程数据格式 timeTopTempData
      for (const i in data) {
        const time = {
          date: data[i].YearDate,
          AdvaDevicRhythm: '',
          gtArray: []
        }
        if (data[i].children != '') {
        if (data[i].children !== '') {
          time.AdvaDevicRhythm = data[i].children[0].AdvaDevicRhythm
        }
        for (const j in data[i].children) {
          if (data[i].children[j].OneStartDate != '') {
          if (data[i].children[j].OneStartDate !== '') {
            const icu1 = {
              name: data[i].children[j].AdvaDevicName,
              id: data[i].children[j].AdvaDevicNumber,
              type: 'capacity',
              rhythm: data[i].children[j].AdvaDevicRhythm,
              rhythm: data[i].children[j].AdvaDevicRhythm, // 生产节拍
              start: data[i].children[j].OneStartDate[0],
              end: data[i].children[j].OneStartDate[1],
              mod: (data[i].children[j].AdvaDevicCropMob * 1) / 100
            }
            time.gtArray.push(icu1)
          }
          if (data[i].children[j].TwoStartDate != '') {
          if (data[i].children[j].TwoStartDate !== '') {
            const icu2 = {
              name: data[i].children[j].AdvaDevicName,
              id: data[i].children[j].AdvaDevicNumber,
@@ -898,7 +835,7 @@
            }
            time.gtArray.push(icu2)
          }
          if (data[i].children[j].ThreeStartDate != '') {
          if (data[i].children[j].ThreeStartDate !== '') {
            const icu3 = {
              name: data[i].children[j].AdvaDevicName,
              id: data[i].children[j].AdvaDevicNumber,
@@ -910,7 +847,7 @@
            }
            time.gtArray.push(icu3)
          }
          if (data[i].children[j].FourStartDate != '') {
          if (data[i].children[j].FourStartDate !== '') {
            const icu4 = {
              name: data[i].children[j].AdvaDevicName,
              id: data[i].children[j].AdvaDevicNumber,
@@ -922,7 +859,7 @@
            }
            time.gtArray.push(icu4)
          }
          if (data[i].children[j].FiveStartDate != '') {
          if (data[i].children[j].FiveStartDate !== '') {
            const icu5 = {
              name: data[i].children[j].AdvaDevicName,
              id: data[i].children[j].AdvaDevicNumber,
@@ -939,7 +876,7 @@
        this.timeTopTempData.push(time)
      }
      if (cont != '') {
      if (cont !== '') {
        for (const i in cont) {
          for (const j in this.timeTopTempData) {
            const data = {
@@ -947,34 +884,28 @@
              date: cont[i].time_start.split(' ')[0],
              number: cont[i].alloc_qty,
              cl_name: cont[i].part_name,
              cl_code: this.cl_code,
              cl_code: cont[i].part_code,
              AdvaScheUom: cont[i].uom_name, // 单位
              work_order: cont[i].wo_code,
              start: cont[i].time_start,
              end: cont[i].time_end,
              type: 'h_schedule'
            }
            if (this.timeTopTempData[j].date == data.date) {
            if (this.timeTopTempData[j].date === data.date) {
              this.timeTopTempData[j].gtArray.unshift(data)
            }
          }
        }
      }
      // console.log('执行了!')
      // console.log(this.schedulingData, '  this.schedulingData')
      // console.log(this.timeTopTempData, 'this.timeTopTempData')
      // this.$forceUpdate()
    },
    // 换型时间
    MinutesTest(time) {
      const t = new Date(time)
      console.log(t.getMinutes(), 800)
      t.setMinutes(t.getMinutes() + this.formBottom.times * 1)
      var now =
      const now =
        t.getFullYear() +
        '-' +
        this.add_one(t.getMonth()).toString().padStart(2, '0') +
        (t.getMonth() + 1).toString().padStart(2, '0') +
        '-' +
        t.getDate().toString().padStart(2, '0') +
        ' ' +
@@ -983,17 +914,12 @@
        t.getMinutes().toString().padStart(2, '0') +
        ':' +
        t.getSeconds().toString().padStart(2, '0')
      console.log('now', now)
      return now
    },
    // +1
    add_one(date) {
      return parseInt(date) + 1
    },
    // 插入产能时间段
    pushItem(newList, id, arr) {
      for (const i in newList) {
        if (newList[i].id == id) {
        if (newList[i].id === id) {
          const data = {
            start: newList[i].start,
            end: newList[i].end,
@@ -1009,7 +935,7 @@
    getCurrentRow(row) {
      this.radioSelectedId = row.AdvaScheId // 排程id赋值给选中行id
      this.formBottom.meter = row.AdvaScheQty * 1 - row.AdvaScheYPQty * 1 // 需排数量 = 未排程数量 - 已排程数量
      this.formBottom.needArrangeNumber = row.AdvaScheQty * 1 - row.AdvaScheYPQty * 1 // 需排数量 = 未排程数量 - 已排程数量
      this.formBottom.scheDate = [] // 排程日期置空
      this.cl_name = row.AdvaSchePartName // 产品名称
      this.cl_code = row.AdvaSchePartNumber // 产品编码
@@ -1018,7 +944,7 @@
      this.formBottom.scheDate.push(handleDatetime(new Date())) //  当前日期(今天)
      this.formBottom.scheDate.push(row.AdvaScheEndDate) //  要求交付时间
      if (this.formBottom.scheDate != '') {
      if (this.formBottom.scheDate !== '') {
        this.time_data[0] = this.formBottom.scheDate[0] + ' 00:00' // 排程开始时间
        this.time_data[1] = this.formBottom.scheDate[1] + ' 23:59' // 排程结束时间
      }
@@ -1029,23 +955,23 @@
      this.forms.startdate = handleDatetime(new Date()) // 当前日期(今天)
      this.forms.enddate = row.AdvaScheEndDate //  要求交付时间
      this.getOnclickAdvancedSchedulingDevice()
      this.formUpdata.WorkCode = row.AdvaScheWorkCode // 工单编号
      this.formUpdata.BotProceCode = row.AdvaScheBotProcid // 工艺路线编码
      this.formUpdate.WorkCode = row.AdvaScheWorkCode // 工单编号
      this.formUpdate.BotProceCode = row.AdvaScheBotProcid // 工艺路线编码
    },
    // 提交排程
    async click_yes() {
      if (this.formBottom.real_num !== this.formBottom.meter) {
    async prepareSubmit() {
      if (this.formBottom.canArrangeNumber !== this.formBottom.needArrangeNumber) {
        this.$message.error('数量未排完,请设置产能时间!')
      } else {
        const list = [] // 提交数组
        for (const i in this.schedulingData) {
          const arr = []
          for (const j in this.schedulingData[i].gtArray) {
            if (this.schedulingData[i].gtArray[j].type == 'schedule') {
            if (this.schedulingData[i].gtArray[j].type === 'schedule') {
              arr.push(this.schedulingData[i].gtArray[j])
            }
          }
          if (arr != '') {
          if (arr !== '') {
            for (const i in arr) {
              const data = {
                AlreDevicNumber: '',
@@ -1063,24 +989,24 @@
        }
        // 排程相同设备获取开始时间 结束时间 数量的总和
        // 过滤
        let updata = []
        let update = []
        for (const i in list) {
          if (list[i].AlreStartDate != '') {
            updata.push(list[i])
          if (list[i].AlreStartDate !== '') {
            update.push(list[i])
          }
        }
        updata = JSON.stringify(updata)
        this.formUpdata.json = updata
        if (list == '') {
        update = JSON.stringify(update)
        this.formUpdate.json = update
        if (list === '') {
          this.$message.error('请先预排')
          return false
        }
        const formData = new FormData()
        formData.append('wocode', this.formUpdata.WorkCode)
        formData.append('botprocecode', this.formUpdata.BotProceCode)
        formData.append('json', this.formUpdata.json)
        formData.append('wocode', this.formUpdate.WorkCode)
        formData.append('botprocecode', this.formUpdate.BotProceCode)
        formData.append('json', this.formUpdate.json)
        const res = await SubmitAlreadyScheduling(formData)
@@ -1088,14 +1014,14 @@
          this.$message.success(res.Message)
        }
        this.formBottom.meter = 0
        this.formBottom.real_num = 0
        this.formBottom.needArrangeNumber = 0
        this.formBottom.canArrangeNumber = 0
        await this.getOnclickAdvancedSchedulingDevice()
        await this.getAdvancedSchedulingSearch()
      }
    },
    // 时间/设备优先排程
    click_schedule() {
    prepareArrange() {
      const timestamp = new Date().toLocaleDateString()
      if (new Date(this.formBottom.scheDate[1]) < new Date(timestamp)) {
@@ -1106,22 +1032,14 @@
      // 设备优先或者时间优先 对数据进行的格式转换
      if (this.schedulingData !== '' && this.formBottom.types === 'N') { // 设备优先
        this.fun_time()
        this.eqpDataTransition()
        this.editLastValue(this.schedulingData)
      } else if (this.timeTopTempData !== '' && this.formBottom.types === 'Y') { // 时间优先
        this.filterAlreadyScheduleTime() // 手动过滤所有时间已排程
        this.fun_facility()
        this.timeDataTransition()
        this.dataTransition()
        this.editLastValue(this.schedulingData)
      }
      // console.log('执行了!')
      // console.log(this.schedulingData, '  this.schedulingData')
      // console.log(JSON.stringify(this.schedulingData), '  this.schedulingData')
      // console.log(this.timeTopTempData, 'this.timeTopTempData')
      // console.log(JSON.stringify(this.timeTopTempData), 'this.timeTopTempData')
      // this.$forceUpdate()
    },
    // 手动过滤所有时间已排程
    filterAlreadyScheduleTime() {
@@ -1141,86 +1059,81 @@
    },
    // 给排程最后一个修改数量
    editLastValue(arr) {
      this.formBottom.real_num = 0 // 真实已排数量
      this.formBottom.canArrangeNumber = 0 // 真实已排数量
      let num = 0 // 取整已排数量
      const arr_num = [] // 已排数据
      let mend_num = 0
      const len = 0
      let need_num = 0
      for (const i in arr) {
        for (const j in arr[i].gtArray) {
          if (arr[i].gtArray[j].type == 'schedule') {
          if (arr[i].gtArray[j].type === 'schedule') {
            arr_num.unshift(arr[i].gtArray[j])
          }
        }
      }
      for (const n in arr_num) {
        this.formBottom.real_num += arr_num[n].real_number
        this.formBottom.canArrangeNumber += arr_num[n].real_number
        num += arr_num[n].number * 1
      }
      this.formBottom.real_num = Math.ceil(this.formBottom.real_num)
      const y10 = this.formBottom.meter - this.formBottom.real_num
      this.formBottom.canArrangeNumber = Math.ceil(this.formBottom.canArrangeNumber)
      const y10 = this.formBottom.needArrangeNumber - this.formBottom.canArrangeNumber
      if (y10 <= 10) {
        this.formBottom.real_num = this.formBottom.meter
        mend_num = this.formBottom.meter - num
        this.formBottom.canArrangeNumber = this.formBottom.needArrangeNumber
        need_num = this.formBottom.needArrangeNumber - num
      } else {
      }
      if (this.formBottom.real_num * 1 == this.formBottom.meter * 1) {
        // mend_num =  this.formBottom.meter - num
      } else {
        // this.submit_flag = true
      }
      for (const i in this.schedulingData) {
        for (const j in this.schedulingData[i].gtArray) {
          if (
            this.schedulingData[i].gtArray[j].type == 'schedule' &&
            this.schedulingData[i].gtArray[j].type === 'schedule' &&
            this.schedulingData[i].gtArray[j].end_num
          ) {
            this.schedulingData[i].gtArray[j].number =
              this.schedulingData[i].gtArray[j].number * 1 + mend_num
              this.schedulingData[i].gtArray[j].number * 1 + need_num
          }
        }
      }
    },
    fun_time() {
      let all_num = this.formBottom.meter
      const all_time = []
    // 设备优先   数据格式转换
    eqpDataTransition() {
      let needNumber = this.formBottom.needArrangeNumber // 需排数量
      let flag1 = 0
      const mod = this.schedulingData[0].mod
      //  let nowTime = this.schedulingData[0].AdvaDevicRhythm*all_num
      for (const i in this.schedulingData) {
        let end_arr = [] // 已排程的数组
        let nend_arr = [] // 待排程的数组
        const add_arr = [] // 已排程的数组
        let need_arr = [] // 待排程的数组
        let capacity_arr = [] // 要排程的数组
        this.schedulingData[i].gtArray.sort((a, b) => new Date(a.end).getTime() - new Date(b.end).getTime())
        // let capacity_end = ''
        end_arr = this.schedulingData[i].gtArray.filter(item => item.type == 'h_schedule')
        nend_arr = this.schedulingData[i].gtArray.filter(item => item.type == 'capacity')
        end_arr = JSON.parse(JSON.stringify(this.schedulingData[i].gtArray.filter(item => item.type === 'h_schedule'))) // 已排程数组
        need_arr = JSON.parse(JSON.stringify(this.schedulingData[i].gtArray.filter(item => item.type === 'capacity'))) // 容量
        if (end_arr && end_arr.length > 0) {
          capacity_arr = nend_arr.map(item => {
          capacity_arr = need_arr.map(item => {
            // 排除掉已经排程的存在hshedule,start,end都相等的情况
            const schedule = end_arr.filter(schedule => {
              return new Date(item.start).getTime() <= new Date(schedule.start).getTime() &&
                new Date(item.end).getTime() > new Date(schedule.end).getTime()
            const schedule = end_arr.filter(it => {
              return new Date(item.start).getTime() <= new Date(it.start).getTime() &&
                new Date(item.end).getTime() >= new Date(it.end).getTime()
            })
            if (schedule && schedule.length > 0) {
              item.start = this.MinutesTest(schedule[0]['end'])
              item.start = this.MinutesTest(schedule[schedule.length - 1]['end'])
            }
            const schedule1 = end_arr.filter(schedule => {
              return new Date(item.start).getTime() == new Date(schedule.start).getTime() &&
                new Date(item.end).getTime() == new Date(schedule.end).getTime()
              return new Date(item.start).getTime() === new Date(schedule.start).getTime() &&
                new Date(item.end).getTime() === new Date(schedule.end).getTime()
            })
            if (schedule1 && schedule1.length > 0) {
              item.capacity = false
            }
            return item
          }).filter(item => item.capacity != false)
          }).filter(item => item.capacity !== false)
        } else {
          capacity_arr = nend_arr
          capacity_arr = need_arr
        }
        const id_obj = {
@@ -1230,6 +1143,9 @@
        if (end_arr != '') {
          (id_obj.id = end_arr[0].id), (id_obj.start_time = end_arr[0].end)
        }
        capacity_arr = this.filterOutTime(capacity_arr) // 过滤掉当前时间之前的不能排程
        for (const w in capacity_arr) {
          let end_time = ''
          let mistiming = ''
@@ -1241,21 +1157,21 @@
            cl_name: this.cl_name,
            cl_code: this.cl_code,
            work_order: this.work_order,
            AdvaScheUom: this.AdvaScheUom,
            number: 0,
            real_number: 0
          }
          if (
            id_obj.start_time != '' &&
            flag1 == 0 &&
            new Date(id_obj.start_time) >= new Date(capacity_arr[w].start)
            id_obj.start_time !== '' &&
            flag1 === 0 &&
            new Date(id_obj.start_time).getTime() >= new Date(capacity_arr[w].start).getTime()
          ) {
            data.start = this.MinutesTest(id_obj.start_time)
            flag1 = 1
          } else {
            data.start = capacity_arr[w].start
          }
          let nowTime =
            (this.schedulingData[i].AdvaDevicRhythm * all_num) / capacity_arr[w].mod
          let nowTime = (this.schedulingData[i].AdvaDevicRhythm * needNumber) / capacity_arr[w].mod
          end_time = this.formSeconds(nowTime, data.start, capacity_arr[w].mod) // 总共的结束时间
          data.end = end_time
          mistiming = this.compareTime(
@@ -1264,12 +1180,6 @@
            capacity_arr[w].mod
          ) // 总共的结束时间-当前的结束时间 = 剩下多久时间
          if (mistiming >= 0) {
            // console.log(
            //   new Date(data.end) - new Date(data.start),
            //   capacity_arr[w].mod,
            //   this.schedulingData[i].AdvaDevicRhythm,
            //   '阿斯顿发斯蒂芬'
            // )
            data.number =
              ((new Date(data.end) - new Date(data.start)) *
                capacity_arr[w].mod) /
@@ -1286,26 +1196,34 @@
            } else {
              this.schedulingData[i].gtArray.push(data)
            }
            return false
          } else {
            data.end = capacity_arr[w].end
            if (new Date(data.end).getTime() < new Date(data.start)) {
              continue // 因为开始时间比结束时间大 需要跳过后面步骤
            }
            // 这里除以一千是因为 new Date() 得到的是毫秒  毫秒转化为秒是千进制
            // 一段时间段内的生产量=两者时间差(毫秒)/1000  / 生产节拍 * 稼动率
            data.number =
              ((new Date(data.end) - new Date(data.start)) *
                capacity_arr[w].mod) /
              this.schedulingData[i].AdvaDevicRhythm /
              1000
            data.real_number =
              ((new Date(data.end) - new Date(data.start)) *
                capacity_arr[w].mod) /
              this.schedulingData[i].AdvaDevicRhythm /
              1000
            data.number = data.number.toFixed(0)
            nowTime =
              (all_num - data.real_number) * this.schedulingData[i].AdvaDevicRhythm
            all_num = all_num - data.real_number
            nowTime = (needNumber - data.real_number) * this.schedulingData[i].AdvaDevicRhythm
            needNumber = needNumber - data.real_number
            if (new Date(data.start) >= new Date(data.end)) {
            } else {
              this.schedulingData[i].gtArray.push(data)
            }
@@ -1313,8 +1231,8 @@
        }
      }
    },
    // 设备排程方法
    fun_facility() {
    // 时间优先  数据格式转换
    timeDataTransition() {
      // 排除未勾选项
      for (const i in this.timeTopTempData) {
        const newArr = []
@@ -1325,105 +1243,86 @@
        }
        this.timeTopTempData[i].gtArray = newArr
      }
      let all_num = this.formBottom.meter
      const all_time = []
      const flag1 = 0
      // let nowTime = this.timeTopTempData[0].AdvaDevicRhythm*all_num  //数量OK
      console.log(this.timeTopTempData, 889)
      console.log(JSON.stringify(this.timeTopTempData), 889)
      let needNumber = this.formBottom.needArrangeNumber // 需排数量
      //  里面逻辑要搞清楚 很重要
      for (const i in this.timeTopTempData) {
        console.log(i, 90)
        let end_arr = []
        let nend_arr = [] // 排程的数组
        const add_arr = [] // 已排程的数组
        let need_arr = [] // 排程的数组
        let capacity_arr = [] // 要排程的数组
        // console.log(parseFloat('SV002'.substring(4, 5)))
        this.timeTopTempData[i].gtArray.sort((a, b) => new Date(a.end).getTime() - new Date(b.end).getTime())
        // this.timeTopTempData[i].gtArray.sort((a, b) => parseFloat(a.id.substring(4, 5)) - parseFloat(b.id.substring(4, 5)))
        // let capacity_end = ''
        // console.log(JSON.stringify(this.timeTopTempData), 671)
        end_arr = JSON.parse(JSON.stringify(this.timeTopTempData[i].gtArray.filter(item => item.type === 'h_schedule'))) // 已排程数据
        need_arr = JSON.parse(JSON.stringify(this.timeTopTempData[i].gtArray.filter(item => item.type === 'capacity'))) // 容量
        end_arr = this.timeTopTempData[i].gtArray.filter(item => item.type === 'h_schedule') // 已排程数据
        nend_arr = this.timeTopTempData[i].gtArray.filter(item => item.type === 'capacity') // 要排程数据
        console.log(end_arr, nend_arr, 670)
        // console.log(end_arr, 672)
        // console.log(JSON.stringify(end_arr), 672)
        // console.log(nend_arr, 673)
        // console.log(JSON.stringify(nend_arr), 673)
        capacity_arr = JSON.parse(JSON.stringify(nend_arr))
        capacity_arr = JSON.parse(JSON.stringify(need_arr)) // 容量
        console.log(capacity_arr, 902)
        end_arr.forEach(item => {
          for (let i = 0; i < capacity_arr.length; i++) {
            if (new Date(capacity_arr[i].start).getTime() === new Date(item.start).getTime()) {
              console.log(i, capacity_arr[i], '哇哈哈')
              console.log(capacity_arr.splice(i, 1))
              break
        // 获取可排程的时间   以便接着往后排程    遍历结束要得到的是 当前日期可排容量
        end_arr.forEach((item, index) => { // 已排程的数组
          capacity_arr.forEach((it, ind) => { // 容量(日产能)
            if (item.id === it.id &&
              new Date(item.start).getTime() >= new Date(it.start).getTime() &&
              new Date(item.end).getTime() === new Date(it.end).getTime() // new Date(item.end).getTime() <= new Date(it.end).getTime()
            ) {
              capacity_arr.splice(ind, 1)
            }
          }
          })
        })
        console.log(capacity_arr, '大西瓜')
        if (!capacity_arr || capacity_arr.length === 0) break
        // const firstCapacity = capacity_arr[0]
        // continue:表示跳出本次循环,也就是不执行本次循环continue之后的操作
        // break:表示跳出当前的循环,针对整个循环体终止后续的遍历;
        if (!capacity_arr || capacity_arr.length === 0) {
          continue
        }
        const schedule_arr = end_arr.filter(item => {
          const remain = nend_arr.some(it => {
            // return (new Date(it.start).getTime() === new Date(item.start).getTime() &&
            //     new Date(item.end).getTime() < new Date(it.end).getTime()) || (
            //   new Date(it.end).getTime() === new Date(item.end).getTime() &&
            //   new Date(item.start).getTime() > new Date(it.start).getTime())
            return (new Date(it.start).getTime() === new Date(item.start).getTime() &&
          const remain = need_arr.some(it => {
            return (new Date(item.start).getTime() >= new Date(it.start).getTime() &&
              new Date(item.end).getTime() < new Date(it.end).getTime())
          })
          return remain
        })
        // schedule_arr.sort((a, b) => new Date(b.end).getTime() - new Date(a.end).getTime())
        // schedule_arr = schedule_arr.filter((currentValue, currentIndex, selfArr) => {
        //   return selfArr.findIndex(item => item.id === currentValue.id) === currentIndex
        // })
        // schedule_arr = [{ cl_code: '302',
        //   cl_name: '8504光机',
        //   date: '2023-02-09',
        //   end: '2023-02-09 14:53:20',
        //   id: 'SB004',
        //   number: 100,
        //   start: '2023-02-09 13:30:00',
        //   type: 'h_schedule',
        //   work_order: 'MO-2022-11-0035_1' }]
        console.log(schedule_arr, 1002)
        // schedule_arr = [schedule_arr[0]]
        // 下面逻辑很重要
        if (schedule_arr && schedule_arr.length > 0) {
          const scheduleCan = schedule_arr.map(item => {
            const temp = nend_arr.filter(it => {
            const temp = need_arr.filter(it => {
              if (it.id === item.id) {
                return (new Date(it.start).getTime() === new Date(item.start).getTime() &&
                return (new Date(item.start).getTime() >= new Date(it.start).getTime() &&
                  new Date(item.end).getTime() < new Date(it.end).getTime())
                //   ||
                // (new Date(item.start).getTime() > new Date(it.start).getTime() &&
                // new Date(item.end).getTime() < new Date(it.end).getTime())
              }
            })[0]
            console.log('capacity', temp)
            console.log('capacity', item.end)
            temp.start = this.MinutesTest(item.end)
            // temp.start = item.end
            return temp
          })
          const newSchedule = JSON.parse(JSON.stringify(scheduleCan))
          capacity_arr = newSchedule.concat(capacity_arr)
          capacity_arr.forEach(item => {
            newSchedule.forEach(it => {
              if (item.id === it.id && new Date(item.start).getTime() < new Date(it.start).getTime()) {
                item.start = it.start
              }
            })
          })
        }
        console.log(schedule_arr)
        console.log('可排程数组', capacity_arr)
        const id_obj = {}
        if (end_arr != '') {
          (id_obj.id = end_arr[0].id), (id_obj.start_time = end_arr[0].end)
        }
        capacity_arr = this.filterOutTime(capacity_arr) // 过滤掉当前时间之前的不能排程
        for (const w in capacity_arr) {
          let end_time
          let mistiming
          const data = {
            id: capacity_arr[w].id,
            start: '',
@@ -1432,52 +1331,39 @@
            cl_name: this.cl_name,
            cl_code: this.cl_code,
            work_order: this.work_order,
            AdvaScheUom: this.AdvaScheUom, // 单位
            number: 0,
            real_number: 0
          }
          //  console.log(id_obj.start_time)
          if (
            id_obj &&
            new Date(id_obj.start_time).getTime() >=
            new Date(capacity_arr[w].start).getTime()
          ) {
            if (data.id == id_obj.id) {
            if (data.id === id_obj.id) {
              data.start = this.MinutesTest(id_obj.start_time)
              console.log(data.start, 999)
              //  flag1 =1
            } else {
              data.start = capacity_arr[w].start
              console.log(data.start, 1000)
              //  console.log(data.start)
              //  flag1 =1
            }
          } else {
            data.start = capacity_arr[w].start
            console.log(data.start, 1001)
          }
          // let nowTime = this.timeTopTempData[0].AdvaDevicRhythm*all_num
          let nowTime =
            (capacity_arr[w].rhythm * all_num) / capacity_arr[w].mod
          end_time = this.formSeconds(nowTime, data.start)
          let nowTime = (capacity_arr[w].rhythm * needNumber) / capacity_arr[w].mod
          const end_time = this.formSeconds(nowTime, data.start)
          data.end = end_time
          mistiming = this.compareTime(end_time, capacity_arr[w].end)
          const mistiming = this.compareTime(end_time, capacity_arr[w].end)
          if (mistiming >= 0) {
            data.number =
              ((new Date(data.end) - new Date(data.start)) *
                capacity_arr[w].mod) /
              capacity_arr[w].rhythm /
              1000
            data.real_number =
              ((new Date(data.end) - new Date(data.start)) *
                capacity_arr[w].mod) /
              capacity_arr[w].rhythm /
              1000
            data.number = ((new Date(data.end) - new Date(data.start)) * capacity_arr[w].mod) / capacity_arr[w].rhythm / 1000
            data.real_number = ((new Date(data.end) - new Date(data.start)) * capacity_arr[w].mod) / capacity_arr[w].rhythm / 1000
            data.number = data.number.toFixed(0)
            data.end_num = true
            if (new Date(data.start) >= new Date(data.end)) {
            } else {
              this.timeTopTempData[i].gtArray.push(data)
            }
@@ -1485,21 +1371,12 @@
            return false
          } else {
            data.end = capacity_arr[w].end
            data.number =
              ((new Date(data.end) - new Date(data.start)) *
                capacity_arr[w].mod) /
              capacity_arr[w].rhythm /
              1000
            data.real_number =
              ((new Date(data.end) - new Date(data.start)) *
                capacity_arr[w].mod) /
              capacity_arr[w].rhythm /
              1000
            data.number = ((new Date(data.end) - new Date(data.start)) * capacity_arr[w].mod) / capacity_arr[w].rhythm / 1000
            data.real_number = ((new Date(data.end) - new Date(data.start)) * capacity_arr[w].mod) / capacity_arr[w].rhythm / 1000
            data.number = data.number.toFixed(0)
            nowTime = (all_num - data.real_number) * capacity_arr[w].rhythm
            all_num = all_num - data.real_number
            nowTime = (needNumber - data.real_number) * capacity_arr[w].rhythm
            needNumber = needNumber - data.real_number
            //  nowTime = mistiming * -1
            if (new Date(data.start) >= new Date(data.end)) {
            } else {
              this.timeTopTempData[i].gtArray.push(data)
@@ -1508,13 +1385,30 @@
        }
      }
    },
    // 给设备转换格式
    // 过滤掉当前时间之前的不能排程
    filterOutTime(capacity_arr) {
      // 这里要将容量和当前时间做对比   做时间处理   如果在当前时间之前的不能排程
      capacity_arr.forEach((item, index) => {
        // 当前时间 大于等于开始时间   且小于等于结束时间
        if (new Date(item.start).getTime() <= new Date(handleDatetime2(new Date())).getTime() && new Date(item.end).getTime() >= new Date(handleDatetime2(new Date())).getTime()) {
          item.start = handleDatetime2(new Date())
        }
        // 当前时间比开始时间大  比结束时间也大
        if (new Date(item.start).getTime() < new Date(handleDatetime2(new Date())).getTime() && new Date(item.end).getTime() < new Date(handleDatetime2(new Date())).getTime()) {
          item.capacity = false
        }
      })
      return capacity_arr.filter(item => item.capacity !== false)
    },
    // 时间优先 给设备转换格式
    dataTransition() {
      this.schedulingData = []
      const data = this.timeTopTempData
      const all = []
      const list = this.title_list
      const list = this.eqpTopTempData
      for (const i in data) {
        for (const j in data[i].gtArray) {
          all.push(data[i].gtArray[j])
@@ -1532,13 +1426,12 @@
        }
      }
      // console.log(list)
      this.schedulingData = list
    },
    // 插入产能时间段
    pushTimes(newList, id, arr) {
      for (const i in newList) {
        if (newList[i].id == id) {
        if (newList[i].id === id) {
          arr.push(newList[i])
        }
      }
@@ -1612,6 +1505,16 @@
  height: 490px;
}
.colorDescription {
  display: flex;
  padding: 5px 30px 0;
}
.colorDescriptionItem {
  display: flex;
  margin-right: 20px;
}
label {
  margin-left: 10px;
}