永康嘉持电器有限公司前端
小小儁爺
2025-03-05 c34f771c22b4650c858b7d468ab00541a693bb4f
1.生产工单中    新增批量修改功能
已修改5个文件
已添加1个文件
5496 ■■■■■ 文件已修改
src/api/WorkOrder.js 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/basicSettings.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/directive/el-drag-dialog/drag.js 150 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/workOrder/workOrderList.vue 593 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/workOrder/workOrderList2_back.vue 4713 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/WorkOrder.js
@@ -277,12 +277,21 @@
  })
}
// ç”Ÿäº§æ‰§è¡Œ,报工弃审数据提交
export function MesOrderStepReportNotVerifySeave(data) {
// MES工单批量绑定获取工序数据
export function UpdateMesOrderStepListSearch(data) {
  return request({
    url: 'WorkOrder/MesOrderStepReportNotVerifySeave',
    url: 'WorkOrder/UpdateMesOrderStepListSearch',
    method: 'post',
    params: data
    data
  })
}
// MES工单新增、编辑批量绑定提交
export function AddUpdateMesOrderList(data) {
  return request({
    url: 'WorkOrder/AddUpdateMesOrderList?OperType=Update',
    method: 'post',
    data
  })
}
src/api/basicSettings.js
@@ -515,3 +515,21 @@
  })
}
// äº§å“ç¼–码批量查找关联的工艺信息
export function PartSelectRputeList(data) {
  return request({
    url: 'BasicSetting/PartSelectRputeList',
    method: 'post',
    data
  })
}
// æ ¹æ®å·¥è‰ºä¿¡æ¯(工艺路线编码)批量查找关联工序集合
export function RouteSelectStepList(data) {
  return request({
    url: 'BasicSetting/RouteSelectStepList',
    method: 'post',
    data
  })
}
src/directive/el-drag-dialog/drag.js
@@ -1,77 +1,77 @@
export default {
  bind(el, binding, vnode) {
    const dialogHeaderEl = el.querySelector('.el-dialog__header')
    const dragDom = el.querySelector('.el-dialog')
    dialogHeaderEl.style.cssText += ';cursor:move;'
    dragDom.style.cssText += ';top:0px;'
    // èŽ·å–åŽŸæœ‰å±žæ€§ ie dom元素.currentStyle ç«ç‹è°·æ­Œ window.getComputedStyle(dom元素, null);
    const getStyle = (function() {
      if (window.document.currentStyle) {
        return (dom, attr) => dom.currentStyle[attr]
      } else {
        return (dom, attr) => getComputedStyle(dom, false)[attr]
      }
    })()
    dialogHeaderEl.onmousedown = (e) => {
      // é¼ æ ‡æŒ‰ä¸‹ï¼Œè®¡ç®—当前元素距离可视区的距离
      const disX = e.clientX - dialogHeaderEl.offsetLeft
      const disY = e.clientY - dialogHeaderEl.offsetTop
      const dragDomWidth = dragDom.offsetWidth
      const dragDomHeight = dragDom.offsetHeight
      const screenWidth = document.body.clientWidth
      const screenHeight = document.body.clientHeight
      const minDragDomLeft = dragDom.offsetLeft
      const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
      const minDragDomTop = dragDom.offsetTop
      const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
      // èŽ·å–åˆ°çš„å€¼å¸¦px æ­£åˆ™åŒ¹é…æ›¿æ¢
      let styL = getStyle(dragDom, 'left')
      let styT = getStyle(dragDom, 'top')
      if (styL.includes('%')) {
        styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100)
        styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100)
      } else {
        styL = +styL.replace(/\px/g, '')
        styT = +styT.replace(/\px/g, '')
      }
      document.onmousemove = function(e) {
        // é€šè¿‡äº‹ä»¶å§”托,计算移动的距离
        let left = e.clientX - disX
        let top = e.clientY - disY
        // è¾¹ç•Œå¤„理
        if (-(left) > minDragDomLeft) {
          left = -minDragDomLeft
        } else if (left > maxDragDomLeft) {
          left = maxDragDomLeft
        }
        if (-(top) > minDragDomTop) {
          top = -minDragDomTop
        } else if (top > maxDragDomTop) {
          top = maxDragDomTop
        }
        // ç§»åŠ¨å½“å‰å…ƒç´ 
        dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
        // emit onDrag event
        vnode.child.$emit('dragDialog')
      }
      document.onmouseup = function(e) {
        document.onmousemove = null
        document.onmouseup = null
      }
    }
  }
  // bind(el, binding, vnode) {
  //   const dialogHeaderEl = el.querySelector('.el-dialog__header')
  //   const dragDom = el.querySelector('.el-dialog')
  //   dialogHeaderEl.style.cssText += ';cursor:move;'
  //   dragDom.style.cssText += ';top:0px;'
  //
  //   // èŽ·å–åŽŸæœ‰å±žæ€§ ie dom元素.currentStyle ç«ç‹è°·æ­Œ window.getComputedStyle(dom元素, null);
  //   const getStyle = (function() {
  //     if (window.document.currentStyle) {
  //       return (dom, attr) => dom.currentStyle[attr]
  //     } else {
  //       return (dom, attr) => getComputedStyle(dom, false)[attr]
  //     }
  //   })()
  //
  //   dialogHeaderEl.onmousedown = (e) => {
  //     // é¼ æ ‡æŒ‰ä¸‹ï¼Œè®¡ç®—当前元素距离可视区的距离
  //     const disX = e.clientX - dialogHeaderEl.offsetLeft
  //     const disY = e.clientY - dialogHeaderEl.offsetTop
  //
  //     const dragDomWidth = dragDom.offsetWidth
  //     const dragDomHeight = dragDom.offsetHeight
  //
  //     const screenWidth = document.body.clientWidth
  //     const screenHeight = document.body.clientHeight
  //
  //     const minDragDomLeft = dragDom.offsetLeft
  //     const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
  //
  //     const minDragDomTop = dragDom.offsetTop
  //     const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
  //
  //     // èŽ·å–åˆ°çš„å€¼å¸¦px æ­£åˆ™åŒ¹é…æ›¿æ¢
  //     let styL = getStyle(dragDom, 'left')
  //     let styT = getStyle(dragDom, 'top')
  //
  //     if (styL.includes('%')) {
  //       styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100)
  //       styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100)
  //     } else {
  //       styL = +styL.replace(/\px/g, '')
  //       styT = +styT.replace(/\px/g, '')
  //     }
  //
  //     document.onmousemove = function(e) {
  //       // é€šè¿‡äº‹ä»¶å§”托,计算移动的距离
  //       let left = e.clientX - disX
  //       let top = e.clientY - disY
  //
  //       // è¾¹ç•Œå¤„理
  //       if (-(left) > minDragDomLeft) {
  //         left = -minDragDomLeft
  //       } else if (left > maxDragDomLeft) {
  //         left = maxDragDomLeft
  //       }
  //
  //       if (-(top) > minDragDomTop) {
  //         top = -minDragDomTop
  //       } else if (top > maxDragDomTop) {
  //         top = maxDragDomTop
  //       }
  //
  //       // ç§»åŠ¨å½“å‰å…ƒç´ 
  //       dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
  //
  //       // emit onDrag event
  //       vnode.child.$emit('dragDialog')
  //     }
  //
  //     document.onmouseup = function(e) {
  //       document.onmousemove = null
  //       document.onmouseup = null
  //     }
  //   }
  // }
}
src/views/workOrder/workOrderList.vue
@@ -8,7 +8,11 @@
          <el-button v-waves type="success" icon="el-icon-connection" @click="send">派发</el-button>
        </div>
        <!--        <el-button v-waves icon="el-icon-switch-button" @click="orderClose">关闭工单</el-button>-->
        <el-button v-waves type="primary" @click="batchUpdate"><i
          class="el-icon-edit-outline"
          style="margin-right: 0;"
        /> æ‰¹é‡ä¿®æ”¹
        </el-button>
      </div>
      <div class="bodyTopFormGroup">
@@ -175,6 +179,20 @@
              <div v-if="row.status==='SCHED'">已排程</div>
            </template>
          </el-table-column>
          <el-table-column
            prop="isstep"
            label="工艺状态"
            sortable="custom"
            width="110"
            show-tooltip-when-overflow
          >
            <template slot-scope="{row}">
              <el-tag v-if="row.isstep==='Y'" type="success" size="mini">已绑定</el-tag>
              <el-tag v-if="row.isstep==='N'" type="danger" size="mini">未绑定</el-tag>
            </template>
          </el-table-column>
          <el-table-column
            prop="wo_code"
            label="工单编号"
@@ -707,8 +725,8 @@
            :popper-append-to-body="false"
            style="width: 200px;"
            placeholder="请选择车间"
            @change="getMesOrderNewStepContent"
          >
            <!--            @change="getMesOrderNewStepContent"-->
            <!--            @change="sourceType? getMesOrderNewStepContent():routecodeChange()"-->
            <el-option
              v-for="item in wkshopArr"
@@ -2336,6 +2354,255 @@
      </span>
    </el-dialog>
    <!--   æ‰¹é‡ä¿®æ”¹-->
    <el-dialog
      v-el-drag-dialog
      title="批量修改"
      :visible.sync="dialogVisibleBatchUpdate"
      width="1200px"
      top="8vh"
      :close-on-click-modal="false"
      @closed="handleCloseBatchUpdate"
      @close="handleCloseBatchUpdate"
    >
      <div
        v-if="formData3.filter(i => !i.routecode).length>0&&mesSetting.route"
        style="display: flex;align-items: center"
      >
        <div style="height: 34px;width: 80%;margin-bottom: 10px;">
          <el-alert
            :title="'当前选中'+multipleSelection.length+'个工单,有'+(formData3.filter(i => !i.routecode).length)+'个工单未指定工艺路线,请先指定!'"
            type="error"
            :closable="false"
          />
        </div>
        <el-button
          v-waves
          type="text"
          style="margin-left: 20px;"
          @click="dialogVisibleBatchUpdate=false;$router.push('../materialManager/inventoryList')"
        >点击跳转存货绑定工艺
        </el-button>
      </div>
      <div v-for="(i,index) in formData3" :key="index" class="customDiv">
        <el-form
          ref="dialogForm"
          inline
          :model="i"
          label-width="110px"
        >
          <el-divider content-position="left">基本信息 {{ index + 1 }}</el-divider>
          <el-form-item
            label="工单状态"
            prop="mesorderstus"
          >
            <div style="width: 200px;">{{ erporderstusArr.find(item => item.code === i.mesorderstus).name }}</div>
          </el-form-item>
          <el-form-item label="工单编号" prop="mesordercode">
            <div style="width: 200px;">{{ i.mesordercode }}</div>
          </el-form-item>
          <el-form-item label="工单类型" prop="mesorderstus">
            <div style="width: 200px;">{{ ordertypeArr.find(item => item.code === i.ordertype).name }}</div>
          </el-form-item>
          <el-form-item label="源单单号">
            <div style="width: 200px;">{{ i.sourceorder }}</div>
          </el-form-item>
          <el-form-item label="工单数量" prop="mesqty">
            <div style="width: 200px;">{{ i.mesqty }}</div>
          </el-form-item>
          <el-form-item label="所属车间" prop="wkshopcode">
            <el-select
              v-model="i.wkshopcode"
              filterable
              :popper-append-to-body="false"
              style="width: 200px;"
              placeholder="请选择车间"
            >
              <!--              @change="val=>getMesOrderNewStepContentBatchUpdate(val,index)"-->
              <el-option
                v-for="item in wkshopArr"
                :key="item.torg_code"
                :label="item.torg_name"
                :value="item.torg_code"
              />
            </el-select>
          </el-form-item>
          <el-form-item
            label="产品名称"
            prop="partcode"
          >
            <div style="width: 200px;">{{ partArr.find(item => item.partcode === i.partcode).partname }}</div>
          </el-form-item>
          <el-form-item
            label="产品编码"
            prop="partcode"
          >
            <div style="width: 200px;">{{ i.partcode }}</div>
          </el-form-item>
          <el-form-item label="产品规格" prop="partspec">
            <div style="width: 200px;">{{
              partArr.find(item => item.partcode === i.partcode).partspec ? partArr.find(item => item.partcode === i.partcode).partspec : '/'
            }}
            </div>
          </el-form-item>
          <el-form-item v-if="mesSetting.route" label="工艺路线" prop="wkshopcode">
            <el-select
              v-model="i.routecode"
              filterable
              :popper-append-to-body="false"
              style="width: 200px;"
              placeholder="请选择工艺路线"
              @change="val=>routecodeChangeBatchUpdate(val,index)"
            >
              <el-option
                v-for="item in i.routecodeArr"
                :key="item.route_code"
                :label="item.route_name"
                :value="item.route_code"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="预计交付日期" prop="deliverydate">
            <el-date-picker
              v-model="i.deliverydate"
              type="date"
              size="mini"
              :clearable="false"
              class="dateMini"
              :picker-options="pickerOptions"
              format="yyyy-MM-dd"
              value-format="yyyy-MM-dd"
              placeholder="选择日期"
            />
          </el-form-item>
          <el-form-item label="工序来源" required>
            <el-switch
              v-model="i.sourceType"
              style="width: 200px;"
              inactive-text="基础设置"
              active-text="历史最新"
              :disabled="!i.wkshopcode"
              @change="val=>sourceTypeChangeBatchUpdate(val,index)"
            />
          </el-form-item>
          <el-divider content-position="left">工序信息 {{ index + 1 }}</el-divider>
          <div style="display: flex;align-items: center">
            <div style="font-weight: bolder">工序选择:</div>
            <el-select
              v-model="i.stepSelectedValue"
              class="stepSelectedValueClass"
              style="width: 930px;"
              multiple
              placeholder="请选择相对应工序"
              @change="val=>stepSelectedValueChangeBatchUpdate(val,index)"
            >
              <el-option
                v-for="item in stepSelectArr"
                :key="item.stepcode"
                :label="item.stepname"
                :value="item.stepcode"
              />
            </el-select>
          </div>
          <el-table
            :ref="'stepTableDataRef'+index"
            :key="index"
            :data="i.stepTableData"
            border
            :row-class-name="tableRowClassName"
            height="300"
            :header-cell-style="{
              background: '#f8f8fa', padding: '0', color: '#000', fontWeight: 500
            }"
            :cell-style="{padding: '5px 0'}"
            style="width: 100%;margin-top: 15px;"
            highlight-current-row
            row-key="stepcode"
          >
            <el-table-column
              type="index"
              label="序号"
              width="50"
            />
            <el-table-column
              prop="stepcode"
              show-tooltip-when-overflow
              label="工序编码"
            />
            <el-table-column
              prop="stepname"
              label="工序名称"
              show-tooltip-when-overflow
            />
            <el-table-column
              prop="stepprice"
              label="生产单价"
              show-tooltip-when-overflow
            >
              <template slot-scope="{row}">
                <el-input
                  v-model="row.stepprice"
                  placeholder="请输入工序单价"
                  oninput="value=value.replace(/[^0-9.]/g,'')"
                  style="width: 100%"
                />
              </template>
            </el-table-column>
            <el-table-column
              label="操作"
              width="120"
            >
              <template slot-scope="scope">
                <div class="operationClass">
                  <!--                   <i-->
                  <!--                    class="el-icon-rank"-->
                  <!--                    :style="{color:$store.state.settings.theme}"-->
                  <!--                    style="cursor: move"-->
                  <!--                  />-->
                  <el-tooltip v-del-tab-index class="item" effect="dark" content="删除" placement="top">
                    <i
                      class="el-icon-delete"
                      :style="{color:$store.state.settings.theme}"
                      style="margin-left: 15px;"
                      @click="stepDelBatchUpdate(index,scope.$index)"
                    />
                  </el-tooltip>
                </div>
              </template>
            </el-table-column>
          </el-table>
        </el-form>
      </div>
      <span slot="footer" class="dialog-footer">
        <div class="footerButton">
          <el-button v-waves @click="dialogVisibleCancelBatchUpdate">取 æ¶ˆ</el-button>
          <el-button
            v-waves
            type="primary"
            :loading="$store.state.app.buttonIsDisabled"
            :disabled="$store.state.app.buttonIsDisabled"
            @click="dialogVisibleConfirmBatchUpdate"
          >ç¡® å®š</el-button>
        </div>
      </span>
    </el-dialog>
  </div>
</template>
@@ -2349,9 +2616,9 @@
import waves from '@/directive/waves'
import {
  AddMesOrderCodeSearch,
  AddUpdateMesOrder, DeleteMesOrder,
  AddUpdateMesOrder, AddUpdateMesOrderList, DeleteMesOrder,
  MesBadOrderSearch, MesOrderDistribution, MesOrderNewStepContent, MesOrderProcessSopSearch,
  MesOrderSearch, MesOrderSopSearch,
  MesOrderSearch, MesOrderSopSearch, UpdateMesOrderStepListSearch,
  UpdateMesOrderStepSearch
} from '@/api/WorkOrder'
import { PartSelect } from '@/api/ProductModel'
@@ -2360,7 +2627,7 @@
import ElDragSelect from '@/components/DragSelect'
import { MesOrderPrintSearch } from '@/api/GridReport' // base on element-ui
import DateType from '@/components/DateType'
import { PartSelectRpute, RouteSelectStep } from '@/api/basicSettings'
import { PartSelectRpute, PartSelectRputeList, RouteSelectStep, RouteSelectStepList } from '@/api/basicSettings'
import { DeviceSopSearch } from '@/api/DeviceManager'
export default {
@@ -2645,7 +2912,10 @@
      },
      sopArr: [],
      routeCode: '', // å·¥è‰ºè·¯çº¿code
      partCode: ''
      partCode: '',
      dialogVisibleBatchUpdate: false, // æ‰¹é‡ä¿®æ”¹
      formData3: []
    }
  },
  watch: {
@@ -2686,6 +2956,279 @@
    // })
  },
  methods: {
    stepDelBatchUpdate(index, ind) {
      this.formData3[index].stepTableData.splice(ind, 1)
      this.formData3[index].stepSelectedValue = this.formData3[index].stepTableData.map(i => i.stepcode)
    },
    // æ‰¹é‡ä¿®æ”¹
    async batchUpdate() {
      if (this.multipleSelection.length === 0) {
        return this.$message.info('请先勾选相对应的工单!')
      }
      const loading = this.$loading({
        lock: true,
        text: '正在加载数据,请稍等...',
        spinner: 'el-icon-loading',
        customClass: 'osloading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
      const data2 = []
      const data3 = []
      this.formData3 = []
      const partcodeArr = []
      this.multipleSelection.forEach(i => {
        partcodeArr.push({
          partcode: i.partcode
        })
        if (this.mesSetting.route) {
          data2.push(
            { partcode: i.partcode, routecode: i.route_code ? i.route_code : i.default_route }
          )
        }
        data3.push({
          sourceid: i.sourceid,
          sourcewo: i.m_po,
          wocode: i.wo_code,
          data_sources: i.data_sources
        })
        this.formData3.push({
          mesorderstus: i.status, // å·¥å•状态码
          mesordercode: i.wo_code, // å·¥å•编号
          ordertype: i.wotype, // å·¥å•类型
          sourceorderid: i.sourceid, // æºå•id
          sourceorder: i.m_po, // æºå•单号
          partcode: i.partcode, // äº§å“ç¼–码
          partname: i.partname, // äº§å“åç§°
          partspec: i.partspec, // äº§å“è§„æ ¼
          mesqty: i.plan_qty, // å·¥å•数量
          wkshopcode: i.wkshp_code, // ç”Ÿäº§è½¦é—´ç¼–码
          wkshopname: i.wkshp_name, // ç”Ÿäº§è½¦é—´åç§°
          deliverydate: i.saleOrderDeliveryDate.substring(0, 11), // äº¤ä»˜æ—¶é—´
          data_sources: i.data_sources, // æ•°æ®æ¥æº
          sourceType: this.sourceType, // å·¥åºæ¥æº
          routecode: i.route_code ? i.route_code : i.default_route, // å·¥è‰ºè·¯çº¿
          routecodeArr: [], // å·¥è‰ºè·¯çº¿æ•°ç»„
          stepSelectedValue: [], // ä¸‹æ‹‰é€‰ä¸­å€¼
          stepTableData: []// å·¥åºè¡¨å€¼
        })
      })
      const { data: res3 } = await UpdateMesOrderStepListSearch(data3)
      res3.forEach((i, index) => {
        if (i.stepdata.length > 0) {
          this.formData3[index].stepTableData = i.stepdata
          this.formData3[index].stepSelectedValue = i.stepdata.map(j => j.stepcode)
        }
      })
      const { data: res } = await PartSelectRputeList(partcodeArr)
      if (this.mesSetting.route) {
        res.forEach((i, index) => {
          if (i.routedata.length > 0) {
            this.formData3[index].routecodeArr = i.routedata
          }
        })
      } else {
        this.formData3.forEach((i, index) => {
          if (i.stepTableData.length === 0) {
            i.stepTableData = res[index].stepdata
            i.stepSelectedValue = res[index].stepdata.length > 0 ? res[index].stepdata.map(j => j.stepcode) : []
          }
        })
      }
      if (this.mesSetting.route) {
        const { data: res2 } = await RouteSelectStepList(data2)
        this.formData3.forEach((i, index) => {
          if (i.stepTableData.length === 0) {
            i.stepTableData = res2[index].stepdata
            i.stepSelectedValue = res2[index].stepdata.length > 0 ? res2[index].stepdata.map(j => j.stepcode) : []
          }
        })
      }
      // this.formData3 = this.multipleSelection
      this.dialogVisibleBatchUpdate = true
      loading.close()
    },
    // å¯¹è¯æ¡†å…³é—­
    handleCloseBatchUpdate() {
      this.multipleSelection = []
      this.formData3 = []
      this.$refs.tableDataRef.clearSelection()
    },
    dialogVisibleCancelBatchUpdate() {
      this.dialogVisibleBatchUpdate = false
    },
    async dialogVisibleConfirmBatchUpdate() {
      this.$store.state.app.buttonIsDisabled = true
      let flag = false
      const data = []
      this.formData3.forEach((i, index) => {
        const workListSub = []
        if (i.stepTableData.length > 0) {
          i.stepTableData.forEach((it, j) => {
            workListSub.push(
              {
                stepseq: j + 1,
                stepcode: it.stepcode,
                stepprice: it.stepprice,
                isbott: j === 0 ? 'Y' : 'N',
                isend: j === i.stepTableData.length - 1 ? 'Y' : 'N'
              }
            )
          })
        } else {
          flag = true
        }
        data.push({
          wostatus: i.mesorderstus, // å·¥å•状态
          wocode: i.mesordercode, // å·¥å•号
          wotype: i.ordertype, // å·¥å•类型
          sourceid: i.sourceorderid, // æºå•id
          sourcewo: i.sourceorder, // æºå•单号
          partcode: i.partcode, // äº§å“ç¼–号
          wkshopcode: i.wkshopcode,
          woqty: i.mesqty, // å·¥å•数量
          deliverydate: i.deliverydate, // äº¤ä»˜æ—¶é—´
          data_sources: i.data_sources, // æ•°æ®æ¥æº
          isstep: workListSub.length > 0 ? 'Y' : 'N', //
          difference: 0, // æ•°æ®å·®å€¼
          routecode: i.routecode,
          workListSub
        })
      })
      if (flag) {
        this.$store.state.app.buttonIsDisabled = false
        return this.$message.error('数据未维护好,请先检查!')
      }
      const res = await AddUpdateMesOrderList(data)
      if (res.code === '200') {
        this.$message.success('修改操作成功!')
        this.$store.state.app.buttonIsDisabled = false
      }
      await this.getMesOrderSearch()
      this.dialogVisibleBatchUpdate = false
    },
    async sourceTypeChangeBatchUpdate(val, index) {
      if (val) {
        const data = {
          routecode: this.formData3[index].routecode,
          wkshopcode: this.formData3[index].wkshopcode,
          partcode: this.formData3[index].partcode
        }
        const { data: res } = await MesOrderNewStepContent(data)
        this.formData3[index].stepSelectedValue = []
        this.formData3[index].stepTableData = []
        if (res.length > 0) {
          res.forEach(i => {
            this.formData3[index].stepTableData.push(
              {
                stepcode: i.step_code,
                stepname: i.step_name,
                stepprice: i.stepprice
              }
            )
          })
          this.formData3[index].stepSelectedValue = this.formData3[index].stepTableData.map(i => i.stepcode)
        }
      } else {
        if (this.mesSetting.route) {
          // this.routecodeChange()
          const data = {
            partcode: this.formData3[index].partcode,
            routecode: this.formData3[index].routecode
          }
          const { data: res } = await RouteSelectStep(data)
          this.formData3[index].stepSelectedValue = []
          this.formData3[index].stepTableData = []
          if (res.length > 0) {
            res.sort((a, b) => a.step_seq - b.step_seq)
            res.forEach(i => {
              this.formData3[index].stepTableData.push(
                {
                  stepcode: i.step_code,
                  stepname: i.step_name,
                  stepprice: i.unprice
                }
              )
            })
            this.formData3[index].stepSelectedValue = this.formData3[index].stepTableData.map(i => i.stepcode)
          }
        } else {
          // this.getBasicProcessData()
          const { data: res } = await PartSelectRpute({ partcode: this.formData3[index].partcode })
          res.sort((a, b) => a.step_seq - b.step_seq)
          this.formData3[index].stepSelectedValue = []
          this.formData3[index].stepTableData = []
          res.forEach(i => {
            this.formData3[index].stepTableData.push(
              {
                stepcode: i.step_code,
                stepname: i.step_name,
                stepprice: i.unprice
              }
            )
          })
          this.formData3[index].stepSelectedValue = this.formData3[index].stepTableData.map(i => i.stepcode)
        }
      }
    },
    async getMesOrderNewStepContentBatchUpdate(val, index) {
      const data = {
        routecode: this.formData3[index].routecode,
        wkshopcode: this.formData3[index].wkshopcode,
        partcode: this.formData3[index].partcode
      }
      const { data: res } = await MesOrderNewStepContent(data)
      this.formData3[index].stepSelectedValue = []
      this.formData3[index].stepTableData = []
      if (res.length > 0) {
        res.forEach(i => {
          this.formData3[index].stepTableData.push(
            {
              stepcode: i.step_code,
              // stepname: i.stepname,
              stepprice: i.stepprice
            }
          )
        })
        this.formData3[index].stepSelectedValue = this.formData3[index].stepTableData.map(i => i.stepcode)
      }
    },
    async routecodeChangeBatchUpdate(val, index) {
      // this.sourceType
      const data = {
        partcode: this.formData3[index].partcode,
        routecode: this.formData3[index].routecode
      }
      const { data: res } = await RouteSelectStep(data)
      this.formData3[index].stepSelectedValue = []
      this.formData3[index].stepTableData = []
      if (res.length > 0) {
        res.sort((a, b) => a.step_seq - b.step_seq)
        res.forEach(i => {
          this.formData3[index].stepTableData.push(
            {
              stepcode: i.step_code,
              stepname: i.step_name,
              stepprice: i.unprice
            }
          )
        })
        this.formData3[index].stepSelectedValue = this.formData3[index].stepTableData.map(i => i.stepcode)
      }
    },
    // å¼¹å‡ºæ¡†å…³é—­
    handleSopClose() {
      this.SopDialogVisible = false
@@ -2904,11 +3447,12 @@
      this.dialogVisibleTask = false
    },
    handleSelectionChange(val) {
      this.multipleSelection = val.map(i => i.wo_code)
      this.multipleSelection = val
    },
    selected(row, index) {
      return row.status === 'NEW' && row.isstep === 'Y'
      return row.status === 'NEW'
      // return row.status === 'NEW' && row.isstep === 'Y'
    },
    // æ´¾å‘
    send() {
@@ -2921,7 +3465,7 @@
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        MesOrderDistribution(this.multipleSelection).then(res => {
        MesOrderDistribution(this.multipleSelection.map(i => i.wo_code)).then(res => {
          if (res.code === '200') {
            this.$notify.success('派发成功!')
            this.getMesOrderSearch()
@@ -2989,13 +3533,17 @@
      }
      const { data: res } = await UpdateMesOrderStepSearch(data)
      this.dialogForm.mesmaxqty = res.canupdate_qty
      if (this.mesSetting.route) { // æŒ‰å·¥è‰ºè·¯çº¿èµ°æ¨¡å¼
        if (!this.dialogForm.routecode) {
          await this.getPartcodeChangeDialog()
        } else {
          const { data: res } = await PartSelectRpute({ partcode: this.dialogForm.partcode })
          this.routecodeArr = res
        }
        if (res.stepdata.length > 0) {
          this.stepTableData = []
          this.stepSelectedValue = []
          res.stepdata.forEach(i => {
            this.stepTableData.push(
              {
@@ -3783,6 +4331,18 @@
    stepSelectedValueChange(val) {
      // console.log(val, 123)
    },
    stepSelectedValueChangeBatchUpdate(val, index) {
      console.log(val, index)
      this.formData3[index].stepTableData = []
      val.forEach(i => {
        this.formData3[index].stepTableData.push({
          stepcode: i,
          stepname: this.stepSelectArr.find(j => j.stepcode === i).stepname,
          stepprice: 0
        })
      })
    },
    getSummaries(param) {
      const { columns, data } = param
      const sums = []
@@ -3824,8 +4384,8 @@
<style lang="scss" scoped>
$main_color: #42b983;
.stepSelectedValueClass{
  ::v-deep input{
.stepSelectedValueClass {
  ::v-deep input {
    //min-height: 34px !important;
    height: 68px !important;
  }
@@ -4128,6 +4688,14 @@
    height: 100% !important;
  }
}
.customDiv {
  ::v-deep .el-divider:first-child {
    width: 120%;
    margin-left: -10%;
  }
}
</style>
<style>
@@ -4141,3 +4709,4 @@
  color: #fff !important;
  background: #42b983 !important;
}
</style>
src/views/workOrder/workOrderList2_back.vue
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
vue.config.js
@@ -52,8 +52,9 @@
    },
    proxy: {
      [process.env.VUE_APP_BASE_API]: {
        // target: 'http://121.196.36.24:8035', // æœ¬åœ°
        target: 'http://192.168.2.138:8002', // å˜‰æŒç”µå™¨
        target: 'http://121.196.36.24:8035', // æœ¬åœ°
        // target: 'http://192.168.2.138:8002', // å˜‰æŒç”µå™¨ æ­£å¼ç‰ˆåœ°å€
        // target: 'http://192.168.2.138:8090', // å˜‰æŒç”µå™¨ éªŒæ”¶ç‰ˆåœ°å€
        changeOrigin: true, // è¯·æ±‚跨域时,需 é…ç½®æ­¤é¡¹
        pathRewrite: { // è·¯å¾„重写,替换target中的请求地址
          ['^' + process.env.VUE_APP_BASE_API]: '/api/'