1、批次管理新增申城数控加工程序确认表功能并实现打印功能
2、调整批次管理新增/修改信息弹窗样式
3、删除设备监控页面异常反馈功能
4、车间看板详情弹窗与设备监控页面详情弹窗保持一致
已添加1个文件
已修改6个文件
已删除1个文件
1933 ■■■■ 文件已修改
src/views/dnc/base/modules/ProductStructure/DeviceCustomType/DeviceCustomTypeTableList.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/ProductStructure/GuideCardBatch/GuideCardBatchEditForm.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/ProductStructure/GuideCardBatch/GuideCardBatchList.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/ProductStructure/GuideCardBatch/GuideCardBatchModal.Style#Drawer.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/ProductStructure/GuideCardBatch/GuideCardPrintModal.vue 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/MdcWorkshopSignage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/DeviceBaseInfo/EquipmentList.vue 235 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/WorkshopSignage/EquipmentDetailModal.vue 1542 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/ProductStructure/DeviceCustomType/DeviceCustomTypeTableList.vue
@@ -1,6 +1,6 @@
<template>
  <div style="flex: 0.25;margin-right: 10px">
    <a-table :columns="columns" :data-source="dataSource" bordered :pagination="false"
    <a-table :columns="columns" :data-source="dataSource" bordered :pagination="false" :loading="loading"
             :scroll="{y:265}" :customRow="customRow" :size="size" rowKey="id" @change="handleTableChange">
    </a-table>
@@ -70,6 +70,7 @@
      console.log('currentLevelInfo', this.currentTreeNodeInfo)
      const { id, type } = this.currentTreeNodeInfo
      this.queryParam = Object.assign({}, { attributionId: id, attributionType: type })
      this.dataSource = []
      this.loadData()
    },
src/views/dnc/base/modules/ProductStructure/GuideCardBatch/GuideCardBatchEditForm.vue
@@ -10,7 +10,7 @@
          </a-col>
          <a-col :span="24">
            <a-form-model-item label="图片" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="picture">
              <j-image-upload isMultiple :number="1" v-model="model.picture" ></j-image-upload>
              <j-image-upload  :number="1" v-model="model.picture" ></j-image-upload>
            </a-form-model-item>
          </a-col>
          <a-col :span="24">
src/views/dnc/base/modules/ProductStructure/GuideCardBatch/GuideCardBatchList.vue
@@ -71,7 +71,7 @@
          <a-divider type="vertical" />
          <a @click="handleDetail(record)">生成数控加工程序确认表</a>
          <a @click="handleOpenPrintModal(record)">生成数控加工程序确认表</a>
          <a-divider type="vertical" />
@@ -89,6 +89,8 @@
    <guide-card-batch-modal ref="modalForm" @ok="modalFormOk"></guide-card-batch-modal>
    <GuideCardBatchModalDrawer  ref="modalEditForm" @ok="modalFormOk"></GuideCardBatchModalDrawer>
    <guide-card-print-modal ref="guideCardPrintModal"/>
  </a-card>
</template>
@@ -100,6 +102,7 @@
  import GuideCardBatchModal from './GuideCardBatchModal'
  import GuideCardBatchModalDrawer from './GuideCardBatchModal.Style#Drawer.vue'
  import { getAction } from '@api/manage'
  import GuideCardPrintModal from './GuideCardPrintModal'
  export default {
    name: 'GuideCardBatchList',
@@ -113,6 +116,7 @@
      }
    },
    components: {
      GuideCardPrintModal,
      GuideCardBatchModal,
      GuideCardBatchModalDrawer
    },
@@ -242,6 +246,11 @@
        this.$refs.modalEditForm.title = "上传/修改信息";
        this.$refs.modalEditForm.disableSubmit = false;
      },
      handleOpenPrintModal(record){
        this.$refs.guideCardPrintModal.visible = true
        this.$refs.guideCardPrintModal.detail = Object.assign({},record)
      }
    }
  }
</script>
src/views/dnc/base/modules/ProductStructure/GuideCardBatch/GuideCardBatchModal.Style#Drawer.vue
@@ -9,8 +9,10 @@
    :visible="visible">
    <GuideCardBatchEditForm ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></GuideCardBatchEditForm>
    <div class="drawer-footer">
      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
      <a-space>
        <a-button @click="handleCancel">关闭</a-button>
        <a-button v-if="!disableSubmit"  @click="handleOk" type="primary">提交</a-button>
      </a-space>
    </div>
  </a-drawer>
</template>
@@ -64,21 +66,14 @@
</script>
<style lang="less" scoped>
/** Button按钮间距 */
  .ant-btn {
    margin-left: 30px;
    margin-bottom: 30px;
    float: right;
  }
  .drawer-footer{
    position: absolute;
    bottom: -8px;
    bottom: 0;
    width: 100%;
    border-top: 1px solid #e8e8e8;
    padding: 10px 16px;
    text-align: right;
    left: 0;
    background: #fff;
    border-radius: 0 0 2px 2px;
  }
</style>
src/views/dnc/base/modules/ProductStructure/GuideCardBatch/GuideCardPrintModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,123 @@
<template>
  <a-modal title="数控加工加工程序确认表" :width="1000" :visible="visible" @cancel="handleCancel" centered>
    <div id="table">
      <div class="table-header">
        <h3>数控加工程序确认表</h3>
        <div>
          <div>单位:<span>机加中心</span></div>
          <div>编号:<span>25-C140-PST-293</span></div>
        </div>
      </div>
      <table border="1">
        <tr>
          <th colspan="2">程序文件名</th>
          <td colspan="9">TY9F-11-2507-002-TY9F1W0130-30-3</td>
        </tr>
        <tr>
          <th colspan="2">零件图号</th>
          <td colspan="4">TY9F-11-2507-002-TY9F1W0130</td>
          <th>零件名称</th>
          <td colspan="4">转接头</td>
        </tr>
        <tr>
          <th colspan="2">零件材料</th>
          <td colspan="4">钢棒</td>
          <th>夹具</th>
          <td colspan="4">{{detail.fixtureInformation}}</td>
        </tr>
        <tr>
          <th colspan="2">工序(工步号)</th>
          <td colspan="2">30-3</td>
          <th>加工批次</th>
          <td>S2501</td>
          <th>加工数量</th>
          <td colspan="2">20</td>
          <th>加工设备</th>
          <td>3140123</td>
        </tr>
        <tr style="height: 500px">
          <td colspan="11">
            <img :src="getImageUrl(detail.picture)" width="300" height="300"/>
          </td>
        </tr>
        <tr style="height: 100px;">
          <th colspan="2" style="text-align: left">说明</th>
          <td colspan="9" style="text-align: left;white-space: pre-wrap" v-html="detail.remake"></td>
        </tr>
        <tr>
          <th colspan="2">编写日期</th>
          <td colspan="2">张三/2025-4-16</td>
          <th>加工批次</th>
          <td colspan="2">李四/2025-4-18</td>
          <th colspan="2">操作者/首检日期</th>
          <td colspan="2">赵五/2025-4-18</td>
        </tr>
        <tr style="height: 70px">
          <th colspan="7">根据首件检验情况,同意该程序用于本批次生产:</th>
          <th colspan="2">审批/日期</th>
          <td colspan="2">王六/2025-4-20</td>
        </tr>
      </table>
    </div>
    <template slot="footer">
      <a-button type="primary" v-print="'#table'">打印</a-button>
    </template>
  </a-modal>
</template>
<script>
  export default {
    name: 'GuideCardPrintModal',
    data() {
      return {
        visible: false,
        detail: {}
      }
    },
    methods: {
      getImageUrl(imgSrcSuffix) {
        return `${window._CONFIG['domianURL']}/${imgSrcSuffix}`
      },
      handleCancel() {
        this.visible = false
      }
    }
  }
</script>
<style scopedl lang="less">
  .table-header {
    display: flex;
    flex-direction: column;
    align-items: center;
    > div {
      width: 100%;
      display: flex;
      justify-content: space-between;
      padding: 10px 5px;
    }
  }
  table {
    width: 100%;
    table-layout: fixed;
    text-align: center;
    font-size: 12px;
    th, td {
      padding: 10px 5px;
    }
  }
</style>
src/views/mdc/base/MdcWorkshopSignage.vue
@@ -108,7 +108,7 @@
  import VueDragResize from 'vue-drag-resize'
  import api from '@/api/mdc'
  import { getFileAccessHttpUrl } from '@/api/manage'
  import EquipmentDetailModal from './modules/WorkshopSignage/EquipmentDetailModal'
  import EquipmentDetailModal from './modules/DeviceBaseInfo/EquipmentDetailModal.vue'
  import { message } from 'ant-design-vue'
  message.config({
src/views/mdc/base/modules/DeviceBaseInfo/EquipmentList.vue
@@ -3,80 +3,80 @@
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <!--<div class="table-page-search-wrapper">-->
      <!--<a-form layout="inline" @keyup.enter.native="searchQuery">-->
        <!--<a-row :gutter="24">-->
          <!--<a-col :md="7" :sm="7">-->
            <!--<a-form-item label="设备名称">-->
              <!--<a-input placeholder="输入设备名称查询" v-model="queryParam.equipmentName"></a-input>-->
            <!--</a-form-item>-->
          <!--</a-col>-->
          <!--<a-col :md="7" :sm="7">-->
            <!--<a-form-item label="状态">-->
              <!--<a-select v-model="queryParam.status" placeholder="请选择">-->
                <!--<a-select-option value="">请选择</a-select-option>-->
                <!--<a-select-option value="0">关机</a-select-option>-->
                <!--<a-select-option value="2">待机</a-select-option>-->
                <!--<a-select-option value="3">运行</a-select-option>-->
                <!--<a-select-option value="22">报警</a-select-option>-->
              <!--</a-select>-->
            <!--</a-form-item>-->
          <!--</a-col>-->
          <!--<a-col :md="3" :sm="3">-->
             <!--<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">-->
              <!--<a @click="handleToggleSearch" style="margin-left: 8px">-->
                <!--{{ toggleSearchStatus ? '收起' : '展开' }}-->
                <!--<a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>-->
              <!--</a>-->
            <!--</span>-->
          <!--</a-col>-->
        <!--</a-row>-->
        <!--<a-row :gutter="24">-->
          <!--<template v-if="toggleSearchStatus">-->
            <!--<a-col :md="12" :sm="12">-->
              <!--<a-form-item label="采集时间">-->
                <!--<a-range-picker @change="dateParamChange" v-model="dates"/>-->
              <!--</a-form-item>-->
            <!--</a-col>-->
          <!--</template>-->
    <!--<a-form layout="inline" @keyup.enter.native="searchQuery">-->
    <!--<a-row :gutter="24">-->
    <!--<a-col :md="7" :sm="7">-->
    <!--<a-form-item label="设备名称">-->
    <!--<a-input placeholder="输入设备名称查询" v-model="queryParam.equipmentName"></a-input>-->
    <!--</a-form-item>-->
    <!--</a-col>-->
    <!--<a-col :md="7" :sm="7">-->
    <!--<a-form-item label="状态">-->
    <!--<a-select v-model="queryParam.status" placeholder="请选择">-->
    <!--<a-select-option value="">请选择</a-select-option>-->
    <!--<a-select-option value="0">关机</a-select-option>-->
    <!--<a-select-option value="2">待机</a-select-option>-->
    <!--<a-select-option value="3">运行</a-select-option>-->
    <!--<a-select-option value="22">报警</a-select-option>-->
    <!--</a-select>-->
    <!--</a-form-item>-->
    <!--</a-col>-->
    <!--<a-col :md="3" :sm="3">-->
    <!--<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">-->
    <!--<a @click="handleToggleSearch" style="margin-left: 8px">-->
    <!--{{ toggleSearchStatus ? '收起' : '展开' }}-->
    <!--<a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>-->
    <!--</a>-->
    <!--</span>-->
    <!--</a-col>-->
    <!--</a-row>-->
    <!--<a-row :gutter="24">-->
    <!--<template v-if="toggleSearchStatus">-->
    <!--<a-col :md="12" :sm="12">-->
    <!--<a-form-item label="采集时间">-->
    <!--<a-range-picker @change="dateParamChange" v-model="dates"/>-->
    <!--</a-form-item>-->
    <!--</a-col>-->
    <!--</template>-->
        <!--</a-row>-->
      <!--</a-form>-->
    <!--</a-row>-->
    <!--</a-form>-->
    <!--</div>-->
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <!--<div class="table-operator" style="border-top: 5px">-->
      <!--<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>-->
      <!--<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>-->
    <!--<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>-->
    <!--<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>-->
    <!--</div>-->
    <div class="equipmentList" id="DeviceList">
      <!--<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>-->
      <!--<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-table ref="table" bordered size="middle" rowKey="equipmentId" :columns="columns" :dataSource="dataSource"
               :pagination="false" :loading="loading" :scroll="{x:'max-content',y:scrollY}">
        <template slot="equipmentId" slot-scope="text, record">
          <div :style="{color:record.equipmentStatus!==0?'#f00':null}">{{text}}</div>
        </template>
        <template slot="equipmentName" slot-scope="text, record">
          <div :style="{color:record.equipmentStatus!==0?'#f00':null}">{{text}}</div>
        </template>
        <template slot="oporationDict" slot-scope="text, record">
          <div :style="{color:record.equipmentStatus!==0?'#f00':null}">{{text}}</div>
        </template>
        <!--<template slot="equipmentId" slot-scope="text, record">-->
        <!--<div :style="{color:record.equipmentStatus!==0?'#f00':null}">{{text}}</div>-->
        <!--</template>-->
        <!--<template slot="equipmentName" slot-scope="text, record">-->
        <!--<div :style="{color:record.equipmentStatus!==0?'#f00':null}">{{text}}</div>-->
        <!--</template>-->
        <!--<template slot="oporationDict" slot-scope="text, record">-->
        <!--<div :style="{color:record.equipmentStatus!==0?'#f00':null}">{{text}}</div>-->
        <!--</template>-->
        <template slot="equipmentStatus" slot-scope="text">
          <div :style="{color:text!==0?'#f00':null}">{{text===0?'正常':'异常'}}</div>
          <div>{{text===0?'正常':'异常'}}</div>
        </template>
        <template slot="collecttime" slot-scope="text, record">
          <div :style="{color:record.equipmentStatus!==0?'#f00':null}">{{text}}</div>
        </template>
        <template slot="action" slot-scope="text, record">
          <a-popconfirm title="确定反馈吗?" @confirm="$emit('editEquipmentStatus',record)" v-has="'deiveBaseInfo:responseStatus'">
            <a>状态反馈</a>
          </a-popconfirm>
        </template>
        <!--<template slot="collecttime" slot-scope="text, record">-->
        <!--<div :style="{color:record.equipmentStatus!==0?'#f00':null}">{{text}}</div>-->
        <!--</template>-->
        <!--<template slot="action" slot-scope="text, record">-->
        <!--<a-popconfirm title="确定反馈吗?" @confirm="$emit('editEquipmentStatus',record)" v-has="'deiveBaseInfo:responseStatus'">-->
        <!--<a>状态反馈</a>-->
        <!--</a-popconfirm>-->
        <!--</template>-->
      </a-table>
    </div>
@@ -88,112 +88,113 @@
  export default {
    name: 'EquipmentLayout',
    components: {   },
    components: {},
    data() {
      return {
        loading:false,
        url: {
        },
        loading: false,
        url: {},
        columns: [
          {
            title: '设备ID',
            align: "center",
            align: 'center',
            dataIndex: 'equipmentId',
            scopedSlots: {customRender: 'equipmentId'},
            width:210
            width: 210
          },
          {
            title: '设备名称',
            align: "center",
            align: 'center',
            dataIndex: 'equipmentName',
            scopedSlots: {customRender: 'equipmentName'},
            width:300
            width: 300
          },
          {
            title: '状态',
            align: "center",
            align: 'center',
            dataIndex: 'oporationDict',
            scopedSlots: {customRender: 'oporationDict'},
            width:200
            width: 200
          },
          {
            title: '设备异常',
            align: "center",
            align: 'center',
            dataIndex: 'equipmentStatus',
            scopedSlots: {customRender: 'equipmentStatus'},
            width:200
            scopedSlots: { customRender: 'equipmentStatus' },
            width: 200
          },
          {
            title: '采集时间',
            align: "center",
            align: 'center',
            dataIndex: 'collecttime',
            defaultSortOrder:'descend',
            sorter: (a, b) => {return a.collecttime>b.collecttime?1:-1},
            scopedSlots: {customRender: 'collecttime'},
            width:350
          },
          {
            title: '操作',
            dataIndex: 'action',
            scopedSlots: {customRender: 'action'},
            align: "center",
            width: 150,
            fixed:'right'
            defaultSortOrder: 'descend',
            sorter: (a, b) => {
              return a.collecttime > b.collecttime ? 1 : -1
            },
            width: 350
          }
          // {
          //   title: '操作',
          //   dataIndex: 'action',
          //   scopedSlots: {customRender: 'action'},
          //   align: "center",
          //   width: 150,
          //   fixed:'right'
          // }
        ],
        scrollY:465,
        scrollY: 465
      }
    },
    props: { dataSource: {
    props: {
      dataSource: {
        type: Array,
        required: true,
        default: []
      } },
    watch: {
      }
    },
    watch: {},
    methods: {
      handleWindowResize(){
        const boxHeight = +window.getComputedStyle(document.getElementById('DeviceList')).height.slice(0,-2)
        const tableHeadHeight = +window.getComputedStyle(document.querySelector('.ant-table-thead th')).height.slice(0,-2)
      handleWindowResize() {
        const boxHeight = +window.getComputedStyle(document.getElementById('DeviceList')).height.slice(0, -2)
        const tableHeadHeight = +window.getComputedStyle(document.querySelector('.ant-table-thead th')).height.slice(0, -2)
        this.scrollY = boxHeight - tableHeadHeight
      },
      }
    },
    mounted(){
      window.addEventListener('resize',this.handleWindowResize)
    mounted() {
      window.addEventListener('resize', this.handleWindowResize)
      this.handleWindowResize()
    },
    }
  }
</script>
<style scoped>
  .equipmentList{
  .equipmentList {
    flex: 1;
    overflow: hidden;
  }
  @media screen and (min-width: 1920px){
    .equipmentList{
      height: 640px!important;
  @media screen and (min-width: 1920px) {
    .equipmentList {
      height: 640px !important;
    }
  }
  @media screen and (min-width: 1680px) and (max-width: 1920px){
    .equipmentList{
      height: 640px!important;
  @media screen and (min-width: 1680px) and (max-width: 1920px) {
    .equipmentList {
      height: 640px !important;
    }
  }
  @media screen and (min-width: 1400px) and (max-width: 1680px){
    .equipmentList{
      height: 493px!important;
  @media screen and (min-width: 1400px) and (max-width: 1680px) {
    .equipmentList {
      height: 493px !important;
    }
  }
  @media screen and (min-width: 1280px) and (max-width: 1400px){
    .equipmentList{
      height: 493px!important;
  @media screen and (min-width: 1280px) and (max-width: 1400px) {
    .equipmentList {
      height: 493px !important;
    }
  }
  @media screen and (max-width: 1280px){
    .equipmentList{
      height: 394px!important;
  @media screen and (max-width: 1280px) {
    .equipmentList {
      height: 394px !important;
    }
  }
src/views/mdc/base/modules/WorkshopSignage/EquipmentDetailModal.vue
ÎļþÒÑɾ³ý