cuilei
14 小时以前 f851850e65df71a252c0e21dc8d969d5910a03f8
排产工单列表页面调整
已修改2个文件
486 ■■■■ 文件已修改
src/views/mes/MesProductionWorkOrderListView.vue 480 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/modules/MesProductionWorkOrderReportModal.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/MesProductionWorkOrderListView.vue
@@ -5,26 +5,40 @@
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="工单号(任务号)">
              <j-input placeholder="请输入工单号(任务号)" v-model="queryParam.workOrderCode"></j-input>
            <a-form-item label="产线">
              <j-tree-select dict="base_factory,factory_name,id" pid-field="parent_id"
                             v-model="queryParam.factoryId" style="width: 100%"></j-tree-select>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="物料编号">
              <j-input placeholder="请输入物料编号" v-model="queryParam.materialNumber"></j-input>
            <a-form-item label="物料编码">
              <a-input placeholder="请输入物料编码" v-model="queryParam.materialNumber"></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="物料名称">
              <a-input placeholder="请输入物料名称" v-model="queryParam.materialName"></a-input>
            </a-form-item>
          </a-col>
          <template v-if="toggleSearchStatus">
            <a-col :xl="6" :lg="7" :md="8" :sm="24">
              <a-form-item label="工单状态">
                <j-dict-select-tag dictCode="work_order_status" placeholder="请输入工单状态"
                <j-dict-select-tag dictCode="work_order_status" placeholder="请选择工单状态"
                                   v-model="queryParam.workOrderStatus"></j-dict-select-tag>
              </a-form-item>
            </a-col>
            <a-col :xl="6" :lg="7" :md="8" :sm="24">
              <a-form-item label="重发布人">
                <j-select-user-by-dep placeholder="请输入重发布人"
                                      v-model="queryParam.republisher"></j-select-user-by-dep>
              <a-form-item label="工单号(任务号)">
                <a-input placeholder="请输入工单号(任务号)" v-model="queryParam.workOrderCode"></a-input>
              </a-form-item>
            </a-col>
            <a-col :xl="6" :lg="7" :md="8" :sm="24">
              <a-form-item label="排产日期">
                <a-range-picker
                  style="width: 100%"
                  @change="dateRangeChange"
                  :value="dateRange">
                </a-range-picker>
              </a-form-item>
            </a-col>
          </template>
@@ -41,8 +55,24 @@
        </a-row>
        <a-row>
          <a-button type="primary" @click="productionSchedule" icon="retweet" style="margin-bottom: 8px">排产</a-button>
          <a-dropdown v-if="selectedRowKeys.length > 1">
            <a-menu slot="overlay">
              <a-menu-item key="1" @click="batchPublish">
                <a-icon type="check"/>
                发布
              </a-menu-item>
            </a-menu>
            <a-button style="margin-left: 8px">
              批量操作
              <a-icon type="down"/>
            </a-button>
          </a-dropdown>
        </a-row>
      </a-form>
    </div>
    <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
      <i class="anticon anticon-info-circle ant-alert-icon"></i>已选择&nbsp;<a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项&nbsp;&nbsp;
      <a style="margin-left: 24px" @click="onClearSelected">清空</a>
    </div>
    <a-spin :spinning="confirmLoading">
      <div>
@@ -56,30 +86,11 @@
          :dataSource="dataSource"
          :pagination="ipagination"
          :loading="loading"
          :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange,type: 'radio'}"
          :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange,type: 'checkbox'}"
          class="j-table-force-nowrap"
          @change="handleTableChange">
          <template slot="htmlSlot" slot-scope="text">
            <div v-html="text"></div>
          </template>
          <template slot="imgSlot" slot-scope="text,record">
            <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
            <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt=""
                 style="max-width:80px;font-size: 12px;font-style: italic;" />
          </template>
          <template slot="fileSlot" slot-scope="text">
            <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
            <a-button
              v-else
              :ghost="true"
              type="primary"
              icon="download"
              size="small"
              @click="downloadFile(text)">
              下载
            </a-button>
          </template>
          @change="handleTableChange"
          :customRow="clickSelect"
        >
          <span slot="action" slot-scope="text, record">
            <span v-if="record.workOrderStatus === 'NEW'">
@@ -95,11 +106,11 @@
              <a-divider type="vertical" />
              <a @click="handleCompletenessCheck(record)">齐套性检查</a>
            </span>
            <span v-if="record.workOrderStatus === 'PUBLISHED' && record.equipmentInspectionFlag === '0'">
            <span v-if="record.workOrderStatus === 'PUBLISHED' && record.completenessCheckFlag === '1' && record.equipmentInspectionFlag === '0'">
              <a-divider type="vertical" />
              <a @click="handleCompletenessCheck(record)">设备点检</a>
            </span>
            <span v-if="record.workOrderStatus === 'PUBLISHED' && record.processInspectionFlag === '0'">
            <span v-if="record.workOrderStatus === 'PUBLISHED' && record.completenessCheckFlag === '1' && record.equipmentInspectionFlag === '1' && record.processInspectionFlag === '0'">
              <a-divider type="vertical" />
              <a @click="handleCompletenessCheck(record)">工艺点检</a>
            </span>
@@ -130,65 +141,45 @@
              </a-menu-item>
            </a-menu>
          </a-dropdown>
        </span>
        </a-table>
      </div>
      <a-tabs v-model="activeKey" @change="handleChangeTabs">
        <a-tab-pane tab="工单报工" :key="refKeys1[0]" :forceRender="true">
          <div style="display: flex; align-items: center; margin-bottom: 10px;">
          </div>
          <j-vxe-table
            keep-source
            :ref="refKeys1[0]"
        <a-tab-pane tab="工单报工" :key="tabsRefKeys[0]" :forceRender="true">
          <a-table
            :ref="tabsRefKeys[0]"
            :loading="mesWorkReporting.loading"
            :columns="mesWorkReporting.columns"
            :dataSource="mesWorkReporting.dataSource"
            :maxHeight="300"
            :rowNumber="true"
            :rowSelection="true"
            :toolbar="false">
            <template slot="showDetail" slot-scope="{row}">
              <a-button type="primary" @click="handleOrderDetail(row)" size="small">
                <a-icon type="eye" />订单详情
              </a-button>
            </template>
          </j-vxe-table>
            :pagination="false"
            :scroll="{ y: 300 }"
            size="middle"
            bordered>
          </a-table>
        </a-tab-pane>
        <a-tab-pane tab="上下料查询" :key="refKeys3[0]" :forceRender="true">
          <div style="display: flex; align-items: center; margin-bottom: 10px;">
          </div>
          <j-vxe-table
            keep-source
            :ref="refKeys3[0]"
        <a-tab-pane tab="上下料查询" :key="tabsRefKeys[1]" :forceRender="true">
          <a-table
            :ref="tabsRefKeys[1]"
            :loading="mesMaterialLoading.loading"
            :columns="mesMaterialLoading.columns"
            :dataSource="mesMaterialLoading.dataSource"
            :maxHeight="300"
            :rowNumber="true"
            :rowSelection="true"
            :toolbar="false">
            <template slot="showUnloadingDetail" slot-scope="{row}">
              <a-button type="primary" @click="handleUnLoadingDetail(row)" size="small">
                <a-icon type="eye" />下料详情
              </a-button>
            </template>
          </j-vxe-table>
            :pagination="false"
            :scroll="{ y: 300 }"
            size="middle"
            bordered>
          </a-table>
        </a-tab-pane>
        <a-tab-pane tab="齐套性检查记录" :key="refKeys4[0]" :forceRender="true">
          <div style="display: flex; align-items: center; margin-bottom: 10px;">
          </div>
          <j-vxe-table
            keep-source
            :ref="refKeys4[0]"
        <a-tab-pane tab="齐套性检查记录" :key="tabsRefKeys[2]" :forceRender="true">
          <a-table
            :ref="tabsRefKeys[2]"
            :loading="mesKittingCompletenessCheck.loading"
            :columns="mesKittingCompletenessCheck.columns"
            :dataSource="mesKittingCompletenessCheck.dataSource"
            :maxHeight="300"
            :rowNumber="true"
            :rowSelection="true"
            :toolbar="false"
          />
            :pagination="false"
            :scroll="{ y: 300 }"
            size="middle"
            bordered>
          </a-table>
        </a-tab-pane>
      </a-tabs>
    </a-spin>
@@ -208,8 +199,6 @@
import { mixinDevice } from '@/utils/mixin'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import MesProductionWorkOrderModal from './modules/MesProductionWorkOrderModal'
import { JVxeTableModelMixin } from '@/mixins/JVxeTableModelMixin.js'
import { JVXETypes } from '@/components/jeecg/JVxeTable'
import { filterMultiDictText } from '@/components/dict/JDictSelectUtil'
import { getAction, requestPut } from '@api/manage'
import MesProductionOrderModal from '@views/mes/modules/MesProductionOrderModal.vue'
@@ -218,11 +207,14 @@
import MesProductionWorkOrderRepublishModal from '@views/mes/modules/MesProductionWorkOrderRepublishModal.vue'
import MesProductionWorkOrderReportModal from '@views/mes/modules/MesProductionWorkOrderReportModal.vue'
import MesProductionWorkOrderCompletenessCheckModal from '@views/mes/modules/MesProductionWorkOrderCompletenessCheckModal.vue'
import JSelectFactory from '@comp/jeecgbiz/JSelectFactory.vue'
import moment from 'moment/moment'
export default {
  name: 'MesProductionWorkOrderList',
  mixins: [JeecgListMixin, mixinDevice, JVxeTableModelMixin, JVXETypes],
  mixins: [JeecgListMixin, mixinDevice],
  components: {
    JSelectFactory,
    MesProductionWorkOrderModal,
    MesProductionOrderModal,
    MesMaterialUnloadingList,
@@ -235,15 +227,20 @@
    return {
      description: '排产工单管理页面',
      activeKey : 'mesWorkReporting',
      // 工单报工
      refKeys1: ['mesWorkReporting'],
      tableKeys1: ['mesWorkReporting'],
      //上料
      refKeys3: ['mesMaterialLoading'],
      tableKeys3: ['mesMaterialLoading'],
      //齐套性检查记录
      refKeys4: ['mesKittingCompletenessCheck'],
      tableKeys4: ['mesKittingCompletenessCheck'],
      confirmLoading: false,
      tabsRefKeys: ['mesWorkReporting', 'mesMaterialLoading', 'mesKittingCompletenessCheck'],
      /* 分页参数 */
      ipagination:{
        current: 1,
        pageSize: 5,
        pageSizeOptions: ['5', '10', '20'],
        showTotal: (total, range) => {
          return range[0] + "-" + range[1] + " 共" + total + "条"
        },
        showQuickJumper: true,
        showSizeChanger: true,
        total: 0
      },
      // 表头
      columns: [
        {
@@ -340,93 +337,65 @@
        dataSource: [],
        columns: [
          {
            title: '操作',
            key: 'action',
            type: JVXETypes.slot,
            slotName: 'showDetail',
            width: '120px',
            align: 'center'
            title: '#',
            dataIndex: '',
            key: 'rowIndex',
            width: 60,
            align: 'center',
            customRender: function(t, r, index) {
              return parseInt(index) + 1
            }
          },
          {
            title: '订单号',
            key: 'orderCode',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'orderCode'
          },
          {
            title: '工单号',
            key: 'workOrderCode',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'workOrderCode'
          },
          {
            title: '产线名称',
            key: 'factoryName',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'factoryName'
          },
          {
            title: '批次号',
            key: 'batchNumber',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'batchNumber'
          },
          {
            title: '托号',
            key: 'palletNumber',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'palletNumber'
          },
          {
            title: '数量',
            key: 'quantity',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'quantity'
          },
          {
            title: '报工人',
            key: 'reporter',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'reporter'
          },
          {
            title: '报工时间',
            key: 'reportTime',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'reportTime'
          },
          {
            title: '线边仓名称',
            key: 'warehouseName',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'warehouseName'
          },
          {
            title: '成品下线打印状态',
            key: 'printStatus',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
          },
          // {
          //   title: '成品下线打印状态',
          //   align: 'center',
          //   dataIndex: 'printStatus'
          // }
        ]
      },
      mesMaterialLoading: {
@@ -434,85 +403,60 @@
        dataSource: [],
        columns: [
          {
            title: '操作',
            key: 'action',
            type: JVXETypes.slot,
            slotName: 'showUnloadingDetail',
            width: '120px',
            align: 'center'
            title: '#',
            dataIndex: '',
            key: 'rowIndex',
            width: 60,
            align: 'center',
            customRender: function(t, r, index) {
              return parseInt(index) + 1
            }
          },
          {
            title: '工单号',
            key: 'workOrderCode',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'workOrderCode'
          },
          {
            title: '设备ID',
            key: 'equipmentId',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            title: '设备',
            align: 'center',
            dataIndex: 'equipmentId'
          },
          {
            title: '工序编码',
            key: 'processCode',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'processCode'
          },
          {
            title: '工序名称',
            key: 'processName',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'processName'
          },
          {
            title: '物料编码',
            key: 'materialNumber',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'materialNumber'
          },
          {
            title: '物料名称',
            key: 'materialName',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'materialName'
          },
          {
            title: '批次号',
            key: 'batchNumber',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'batchNumber'
          },
          {
            title: '数量',
            key: 'quantity',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'quantity'
          },
          {
            title: '剩余数量',
            key: 'remainingQuantity',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
          },
            align: 'center',
            dataIndex: 'remainingQuantity'
          }
        ]
      },
      mesKittingCompletenessCheck: {
@@ -520,53 +464,48 @@
        dataSource: [],
        columns: [
          {
            title: '#',
            dataIndex: '',
            key: 'rowIndex',
            width: 60,
            align: 'center',
            customRender: function(t, r, index) {
              return parseInt(index) + 1
            }
          },
          {
            title: '工单号',
            key: 'workOrderCode',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'workOrderCode'
          },
          {
            title: '物料编号',
            key: 'materialNumber',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'materialNumber'
          },
          {
            title: '物料名称',
            key: 'materialName',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'materialName'
          },
          {
            title: '需求数量',
            key: 'requiredQuantity',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'requiredQuantity'
          },
          {
            title: '实际数量',
            key: 'actualQuantity',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
            align: 'center',
            dataIndex: 'actualQuantity'
          },
          {
            title: '是否齐备',
            key: 'checkFlag',
            type: JVXETypes.input,
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: ''
          },
            align: 'center',
            dataIndex: 'checkFlag',
            customRender: function(text) {
              return text === '0' ? '否' : text === '1' ? '是' : ''
            }
          }
        ]
      },
      url: {
@@ -584,21 +523,96 @@
        execute: '/mes/mesProductionWorkOrder/execute',
      },
      dictOptions: {},
      superFieldList: []
      superFieldList: [],
      dateRange: []
    }
  },
  created() {
    this.getSuperFieldList()
  },
  computed: {
    tabsKeyMap() {
      return {
        mesWorkReporting: {
          url: this.url.queryWorkReportingByWorkOrderId,
          loading: this.mesWorkReporting.loading,
          data: this.mesWorkReporting.dataSource,
          setLoading: (loading) => { this.mesWorkReporting.loading = loading },
          setData: (data) => { this.mesWorkReporting.dataSource = data }
        },
        mesMaterialLoading: {
          url: this.url.queryLoadingByWorkOrderId,
          loading: this.mesMaterialLoading.loading,
          data: this.mesMaterialLoading.dataSource,
          setLoading: (loading) => { this.mesMaterialLoading.loading = loading },
          setData: (data) => { this.mesMaterialLoading.dataSource = data }
        },
        mesKittingCompletenessCheck: {
          url: this.url.queryCompletenessCheckByWorkOrderId,
          loading: this.mesKittingCompletenessCheck.loading,
          data: this.mesKittingCompletenessCheck.dataSource,
          setLoading: (loading) => { this.mesKittingCompletenessCheck.loading = loading },
          setData: (data) => { this.mesKittingCompletenessCheck.dataSource = data }
        }
      }
    },
    importExcelUrl: function() {
      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
    }
  },
  methods: {
    handleChangeTabs(key) {
      this.activeKey = key
      this.selectTabData(key, this.selectedRowKeys[0])
    },
    clickSelect(record) {
      return {
        on: {
          click: () => {
            this.selectedRowKeys = [record.id]
            this.selectTabData(this.activeKey, record.id)
          }
        }
      }
    },
    selectTabData(tabKey, workOrderId) {
      const tab = this.tabsKeyMap[tabKey]
      if (tab) {
        tab.setLoading(true)
        getAction(tab.url, { workOrderId: workOrderId }).then(res => {
          if (res.success) {
            tab.setData(res.result || [])
          }
        }).catch(error => {
          console.error('Error loading tab data:', error)
          tab.setData([])
        }).finally(() => {
          tab.setLoading(false)
        })
      }
    },
    searchReset() {
      this.queryParam = {}
      this.dateRange = []
      this.loadData(1);
    },
    dateRangeChange(dates, dateStrings) {
      this.dateRange = dates
      this.queryParam.startDate = dateStrings[0]
      this.queryParam.endDate = dateStrings[1]
    },
    productionSchedule() {
      this.$refs.MesProductionWorkOrderScheduleModal.scheduleOpen()
    },
    batchPublish() {
      if (this.selectedRowKeys.length < 1) {
        this.$message.warning('请选择多条记录!')
        return
      }
      const ids = this.selectedRowKeys.join(',')
      this.handlePublish(ids)
      this.selectedRowKeys = []
    },
    handlePublish(id) {
      requestPut(this.url.publish, null, { ids: id }).then((res) => {
        if (res.success) {
src/views/mes/modules/MesProductionWorkOrderReportModal.vue
@@ -171,8 +171,8 @@
      });
    },
    // 打印标签
    printLabel() {
      this.generateQRCode('成品托标签'); // 先生成二维码
    printLabel(palletNumber) {
      this.generateQRCode(palletNumber); // 先生成二维码
      setTimeout(() => {
        printJS({
          printable: 'printLabel',
@@ -279,7 +279,7 @@
                }
                //成品托标签打印
                this.$nextTick(() => {
                  this.printLabel()
                  this.printLabel(data.palletNumber)
                })
              }
              this.submitCallback()