zhangherong
2025-03-18 c172f50f28cb37b982eb39a0a9a257cbc60b3a3e
Merge remote-tracking branch 'origin/master'
已添加6个文件
已修改13个文件
1668 ■■■■ 文件已修改
src/api/dnc.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue 715 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/DeviceStructure/DeviceStructureTreeContextMenu.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/DeviceStructure/Document/HasReceivedDocumentTableList.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/DeviceStructure/Document/HasSentDocumentTableList.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/ProductStructure/DeviceCustomType/DeviceCustomTypeModal.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionInfo.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dnc/common/DocumentInfo.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/EquipmentShutDownReasonList.vue 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/EquipmentStandbyShutDown.vue 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/EquipmentShutDownReasonList/EquipmentShutDownReasonModal.vue 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/EquipmentStandbyShutDown/EquipmentStandbyShutdownList.vue 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/EquipmentStandbyShutDown/EquipmentStandbyShutdownModal.vue 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/dnc.js
@@ -28,7 +28,7 @@
  // æŒ‡æ´¾æ–‡æ¡£åˆ°è®¾å¤‡
  assignDocumentToDeviceApi: params => postAction('/nc/activit/assign/file/apply', params),
  // ä¸‹è½½æ–‡æ¡£
  downloadDocumentApi: ({ docId, docName }) => downloadFile(`/nc/doc/download/${docId}`, docName),
  downloadDocumentApi: ({ docId, docName }) => requestGetDownLoad(`/nc/doc/download/${docId}`, docName),
  // åˆ é™¤æ–‡æ¡£
  deleteDocumentApi: docId => deleteAction(`/nc/doc/delete?id=${docId}`),
  // æ–‡æ¡£å‡ºåº“
src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue
@@ -3,12 +3,12 @@
    <template v-if="+currentTreeNodeInfo.type===2">
      <div style="height: 100%;max-height: 748px">
        <!--产品结构树右侧顶部区域-->
        <div style="height: 45%;overflow: hidden">
        <div style="height: 55%;overflow: hidden">
          <DeviceStructureMainTop :size="containerSize" ref="mainTopRef" :currentTreeNodeInfo="currentTreeNodeInfo"/>
        </div>
        <!--产品结构树右侧底部区域-->
        <div style="height: 55%;overflow: hidden">
        <div style="height: 45%;overflow: hidden">
          <DeviceStructureMainBottom :size="containerSize" :currentTreeNodeInfo="currentTreeNodeInfo"/>
        </div>
      </div>
src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue
@@ -4,11 +4,13 @@
            v-if="Object.keys(currentTreeNodeInfo).length!==0">
      <a-tab-pane :key="1" tab="发送">
        <HasSentDocumentTableList ref="hasSentDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
                                  :currentTypeOfDevice="currentTypeOfDevice"
                                  @handleTableContextMenuOpen="handleTableContextMenuOpen" :size="tableContainerSize"/>
      </a-tab-pane>
      <a-tab-pane :key="2" tab="接收">
        <HasReceivedDocumentTableList ref="hasReceivedDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
                                      :currentTypeOfDevice="currentTypeOfDevice"
                                      @handleTableContextMenuOpen="handleTableContextMenuOpen"
                                      :size="tableContainerSize"/>
      </a-tab-pane>
@@ -22,403 +24,408 @@
</template>
<script>
  import dncApi from '@/api/dnc'
  import TableContextMenu from '../../../common/TableContextMenu'
  import HasSentDocumentTableList from './Document/HasSentDocumentTableList'
  import HasReceivedDocumentTableList from './Document/HasReceivedDocumentTableList'
  import DocumentBatchDeleteModal from '../../../common/DocumentBatchDeleteModal'
import dncApi from '@/api/dnc'
import TableContextMenu from '../../../common/TableContextMenu'
import HasSentDocumentTableList from './Document/HasSentDocumentTableList'
import HasReceivedDocumentTableList from './Document/HasReceivedDocumentTableList'
import DocumentBatchDeleteModal from '../../../common/DocumentBatchDeleteModal'
  export default {
    name: 'DeviceStructureMainTop',
    components: { DocumentBatchDeleteModal, HasReceivedDocumentTableList, HasSentDocumentTableList, TableContextMenu },
    props: {
      currentTreeNodeInfo: {
        type: Object
      }
export default {
  name: 'DeviceStructureMainTop',
  components: { DocumentBatchDeleteModal, HasReceivedDocumentTableList, HasSentDocumentTableList, TableContextMenu },
  props: {
    currentTreeNodeInfo: {
      type: Object
    }
  },
  data() {
    return {
      activeTabKey: 1,
      tableContainerSize: 'small',
      currentTypeOfDevice: 7,// äº§å“ç»“构树中定义的设备层级type为7
      currentRightClickedTableRowInfo: {},
      hasLoadedDataTabKeyArray: []
    }
  },
  created() {
    this.$bus.$on('reloadDocumentListData', this.reloadDocumentListData)
    this.$bus.$on('tableMenuItemMethodTrigger', this.triggerCorrespondingMethod)
  },
  beforeDestroy() {
    this.$bus.$off('reloadDocumentListData', this.reloadDocumentListData)
    this.$bus.$off('tableMenuItemMethodTrigger', this.triggerCorrespondingMethod)
  },
  methods: {
    /**
     * æŽ§åˆ¶å³é”®èœå•开启
     * @param record å½“前表格行信息
     */
    handleTableContextMenuOpen(record) {
      this.currentRightClickedTableRowInfo = Object.assign({}, record)
      this.$refs.tableContextMenuRef.currentMenuLevel = record.param
      this.$refs.tableContextMenuRef.menuStyle.top = event.clientY + 'px'
      this.$refs.tableContextMenuRef.menuStyle.left = event.clientX + 'px'
      this.$refs.tableContextMenuRef.menuVisible = true
      document.body.addEventListener('click', this.handleMenuClose)
    },
    data() {
      return {
        activeTabKey: 1,
        tableContainerSize: 'small',
        currentRightClickedTableRowInfo: {},
        hasLoadedDataTabKeyArray: []
      }
    },
    created() {
      this.$bus.$on('reloadDocumentListData', this.reloadDocumentListData)
      this.$bus.$on('tableMenuItemMethodTrigger', this.triggerCorrespondingMethod)
    },
    methods: {
      /**
       * æŽ§åˆ¶å³é”®èœå•开启
       * @param record å½“前表格行信息
       */
      handleTableContextMenuOpen(record) {
        this.currentRightClickedTableRowInfo = Object.assign({}, record)
        this.$refs.tableContextMenuRef.currentMenuLevel = record.param
        this.$refs.tableContextMenuRef.menuStyle.top = event.clientY + 'px'
        this.$refs.tableContextMenuRef.menuStyle.left = event.clientX + 'px'
        this.$refs.tableContextMenuRef.menuVisible = true
        document.body.addEventListener('click', this.handleMenuClose)
      },
      /**
       * å½“树组件选中设备层级节点时触发获取已发送文档列表
       * @param treeNodeInfo æ ‘节点信息
       */
      loadHasSentDocumentListData(treeNodeInfo) {
        this.$nextTick(() => {
          if (this.$refs.hasSentDocumentTableListRef) {
            this.$refs.hasSentDocumentTableListRef.loadData(1)
            this.hasLoadedDataTabKeyArray.push(this.activeTabKey)
          }
        })
      },
      /**
       * tab标签切换时触发
       * @param activeTabKey å½“前已激活tab的key
       */
      handleTabChange(activeTabKey) {
        this.$bus.$emit('handleSwitchDeviceDocClassCode', activeTabKey)
        if (activeTabKey && !this.hasLoadedDataTabKeyArray.includes(activeTabKey)) {
          if (activeTabKey === 1) {
            this.$nextTick(() => {
              if (this.$refs.hasSentDocumentTableListRef) this.$refs.hasSentDocumentTableListRef.loadData(1)
            })
          } else {
            this.$nextTick(() => {
              if (this.$refs.hasReceivedDocumentTableListRef) this.$refs.hasReceivedDocumentTableListRef.loadData(1)
            })
          }
          this.hasLoadedDataTabKeyArray.push(activeTabKey)
    /**
     * å½“树组件选中设备层级节点时触发获取已发送文档列表
     * @param treeNodeInfo æ ‘节点信息
     */
    loadHasSentDocumentListData(treeNodeInfo) {
      this.$nextTick(() => {
        if (this.$refs.hasSentDocumentTableListRef) {
          this.$refs.hasSentDocumentTableListRef.loadData(1)
          this.hasLoadedDataTabKeyArray.push(this.activeTabKey)
        }
      },
      })
    },
      /**
       * æ–‡æ¡£ä»¥åŠNC程序导入/出库/入库/删除成功后触发重新加载文档列表
       * @param docClassCode æ–‡æ¡£ç±»åˆ«
       * @param attributionId èŠ‚ç‚¹Id
       */
      reloadDocumentListData({ docClassCode, attributionId }) {
        // å¦‚果上传的文档不是所属于当前所展示节点的文档则不重新获取文档列表
        if (this.currentTreeNodeInfo.key !== attributionId) return
        if (docClassCode === 'SEND') {
          if (this.$refs.hasSentDocumentTableListRef) this.$refs.hasSentDocumentTableListRef.loadData(1)
        } else {
          if (this.$refs.hasReceivedDocumentTableListRef) this.$refs.hasReceivedDocumentTableListRef.loadData(1)
        }
      },
      // ä¸‹è½½å½“前右键选中文档
      handleDownload() {
        const that = this
        const { docId, docName } = this.currentRightClickedTableRowInfo
        dncApi.downloadDocumentApi({ docId, docName })
          .then(res => {
            if (res && !res.success) {
              that.$notification.error({
                message: '消息',
                description: res.message
              })
            }
    /**
     * tab标签切换时触发
     * @param activeTabKey å½“前已激活tab的key
     */
    handleTabChange(activeTabKey) {
      this.$bus.$emit('handleSwitchDeviceDocClassCode', activeTabKey)
      if (activeTabKey && !this.hasLoadedDataTabKeyArray.includes(activeTabKey)) {
        if (activeTabKey === 1) {
          this.$nextTick(() => {
            if (this.$refs.hasSentDocumentTableListRef) this.$refs.hasSentDocumentTableListRef.loadData(1)
          })
          .catch(err => {
        } else {
          this.$nextTick(() => {
            if (this.$refs.hasReceivedDocumentTableListRef) this.$refs.hasReceivedDocumentTableListRef.loadData(1)
          })
        }
        this.hasLoadedDataTabKeyArray.push(activeTabKey)
      }
    },
    /**
     * æ–‡æ¡£ä»¥åŠNC程序导入/出库/入库/删除成功后触发重新加载文档列表
     * @param docClassCode æ–‡æ¡£ç±»åˆ«
     * @param attributionId èŠ‚ç‚¹Id
     */
    reloadDocumentListData({ docClassCode, attributionId }) {
      // å¦‚果上传的文档不是所属于当前所展示节点的文档则不重新获取文档列表
      if (this.currentTreeNodeInfo.key !== attributionId) return
      if (docClassCode === 'SEND') {
        if (this.$refs.hasSentDocumentTableListRef) this.$refs.hasSentDocumentTableListRef.loadData(1)
      } else {
        if (this.$refs.hasReceivedDocumentTableListRef) this.$refs.hasReceivedDocumentTableListRef.loadData(1)
      }
    },
    // ä¸‹è½½å½“前右键选中文档
    handleDownload() {
      const that = this
      const { docId, docName } = this.currentRightClickedTableRowInfo
      dncApi.downloadDocumentApi({ docId, docName })
        .then(res => {
          if (res && !res.success) {
            that.$notification.error({
              message: '消息',
              description: err.message
              description: res.message
            })
          }
        })
        .catch(err => {
          that.$notification.error({
            message: '消息',
            description: err.message
          })
      },
      // åˆ é™¤å½“前右键选中文档
      handleDelete() {
        const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
        const that = this
        that.$confirm({
          title: '提示',
          content: `删除后不可取消,确认删除吗?`,
          okText: '确认',
          cancelText: '取消',
          onOk: () => {
            dncApi.deleteDeviceRelativeDocumentApi({ docId, attributionId })
              .then((res) => {
                if (res.success) {
                  that.$notification.success({
                    message: '消息',
                    description: res.message
                  })
                  that.reloadDocumentListData({ docClassCode: param, attributionId })
                } else {
                  that.$notification.warning({
                    message: '消息',
                    description: res.message
                  })
                }
              })
              .finally(() => {
                that.$destroyAll()
              })
          },
          onCancel: () => {
            that.$destroyAll()
          }
        })
      },
    },
      /**
       * ç‚¹å‡»æ‰¹é‡åˆ é™¤åŽå‡ºçŽ°å¼¹çª—
       * @param modalTitle å¼¹çª—标题
       */
      handleBatchRemove(modalTitle) {
        if (!this.$refs.documentBatchDeleteModalRef) return
        this.$refs.documentBatchDeleteModalRef.title = modalTitle
        this.$refs.documentBatchDeleteModalRef.visible = true
      },
    // åˆ é™¤å½“前右键选中文档
    handleDelete() {
      const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
      const that = this
      that.$confirm({
        title: '提示',
        content: `删除后不可取消,确认删除吗?`,
        okText: '确认',
        cancelText: '取消',
        onOk: () => {
          dncApi.deleteDeviceRelativeDocumentApi({ docId, attributionId })
            .then((res) => {
              if (res.success) {
                that.$notification.success({
                  message: '消息',
                  description: res.message
                })
                that.reloadDocumentListData({ docClassCode: param, attributionId })
              } else {
                that.$notification.warning({
                  message: '消息',
                  description: res.message
                })
              }
            })
            .finally(() => {
              that.$destroyAll()
            })
        },
        onCancel: () => {
          that.$destroyAll()
        }
      })
    },
      /**
       * å‡ºåº“当前右键选中文档
       * @param menuLabel
       */
      handlePull(menuLabel) {
        const that = this
        const { docId, docName, param, attributionId } = this.currentRightClickedTableRowInfo
        that.$confirm({
          title: '提示',
          content: `确认${menuLabel}吗?`,
          okText: '确认',
          cancelText: '取消',
          onOk: () => {
            dncApi.documentOutboundApi({ docId, docName })
              .then(res => {
                console.log('res------------------', res)
                if (res.success) {
                  this.reloadDocumentListData({ docClassCode: param, attributionId })
                  that.$notification.success({
                    message: '消息',
                    description: `${menuLabel}成功`
                  })
                } else {
                  that.$notification.error({
                    message: '消息',
                    description: res.message
                  })
                }
              })
              .catch(err => {
    /**
     * ç‚¹å‡»æ‰¹é‡åˆ é™¤åŽå‡ºçŽ°å¼¹çª—
     * @param modalTitle å¼¹çª—标题
     */
    handleBatchRemove(modalTitle) {
      if (!this.$refs.documentBatchDeleteModalRef) return
      this.$refs.documentBatchDeleteModalRef.title = modalTitle
      this.$refs.documentBatchDeleteModalRef.visible = true
    },
    /**
     * å‡ºåº“当前右键选中文档
     * @param menuLabel
     */
    handlePull(menuLabel) {
      const that = this
      const { docId, docName, param, attributionId } = this.currentRightClickedTableRowInfo
      that.$confirm({
        title: '提示',
        content: `确认${menuLabel}吗?`,
        okText: '确认',
        cancelText: '取消',
        onOk: () => {
          dncApi.documentOutboundApi({ docId, docName })
            .then(res => {
              console.log('res------------------', res)
              if (res.success) {
                this.reloadDocumentListData({ docClassCode: param, attributionId })
                that.$notification.success({
                  message: '消息',
                  description: `${menuLabel}成功`
                })
              } else {
                that.$notification.error({
                  message: '消息',
                  description: err.message
                  description: res.message
                })
              }
            })
            .catch(err => {
              that.$notification.error({
                message: '消息',
                description: err.message
              })
              .finally(() => {
                that.$destroyAll()
              })
          },
          onCancel: () => {
            that.$destroyAll()
          }
        })
      },
            })
            .finally(() => {
              that.$destroyAll()
            })
        },
        onCancel: () => {
          that.$destroyAll()
        }
      })
    },
      /**
       * å‘布当前右键选中文档
       * @param menuLabel
       */
      handleCancelPull(menuLabel) {
        const that = this
        const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
        that.$confirm({
          title: '提示',
          content: `确认${menuLabel}吗?`,
          okText: '确认',
          cancelText: '取消',
          onOk: () => {
            dncApi.documentCancelOutboundApi(docId)
              .then(res => {
                if (res.success) {
                  this.reloadDocumentListData({ docClassCode: param, attributionId })
                  that.$notification.success({
                    message: '消息',
                    description: res.message
                  })
                } else {
                  that.$notification.error({
                    message: '消息',
                    description: res.message
                  })
                }
              })
              .catch(err => {
    /**
     * å‘布当前右键选中文档
     * @param menuLabel
     */
    handleCancelPull(menuLabel) {
      const that = this
      const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
      that.$confirm({
        title: '提示',
        content: `确认${menuLabel}吗?`,
        okText: '确认',
        cancelText: '取消',
        onOk: () => {
          dncApi.documentCancelOutboundApi(docId)
            .then(res => {
              if (res.success) {
                this.reloadDocumentListData({ docClassCode: param, attributionId })
                that.$notification.success({
                  message: '消息',
                  description: res.message
                })
              } else {
                that.$notification.error({
                  message: '消息',
                  description: err.message
                  description: res.message
                })
              }
            })
            .catch(err => {
              that.$notification.error({
                message: '消息',
                description: err.message
              })
              .finally(() => {
                that.$destroyAll()
              })
          },
          onCancel: () => {
            that.$destroyAll()
          }
        })
      },
            })
            .finally(() => {
              that.$destroyAll()
            })
        },
        onCancel: () => {
          that.$destroyAll()
        }
      })
    },
      /**
       * ç‚¹å‡»å‘布时触发当前文档发布
       * @param menuLabel
       */
      handlePublish(menuLabel) {
        const that = this
        const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
        that.$confirm({
          title: '提示',
          content: `确认${menuLabel}吗?`,
          okText: '确认',
          cancelText: '取消',
          onOk: () => {
            dncApi.documentPublishApi(docId)
              .then(res => {
                if (res.success) {
                  this.reloadDocumentListData({ docClassCode: param, attributionId })
                  this.$bus.$emit('reloadMainBottomTableData', 'documentVersion')
                  that.$notification.success({
                    message: '消息',
                    description: res.message
                  })
                } else {
                  that.$notification.error({
                    message: '消息',
                    description: res.message
                  })
                }
              })
              .catch(err => {
    /**
     * ç‚¹å‡»å‘布时触发当前文档发布
     * @param menuLabel
     */
    handlePublish(menuLabel) {
      const that = this
      const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
      that.$confirm({
        title: '提示',
        content: `确认${menuLabel}吗?`,
        okText: '确认',
        cancelText: '取消',
        onOk: () => {
          dncApi.documentPublishApi(docId)
            .then(res => {
              if (res.success) {
                this.reloadDocumentListData({ docClassCode: param, attributionId })
                this.$bus.$emit('reloadMainBottomTableData', 'documentVersion')
                that.$notification.success({
                  message: '消息',
                  description: res.message
                })
              } else {
                that.$notification.error({
                  message: '消息',
                  description: err.message
                  description: res.message
                })
              }
            })
            .catch(err => {
              that.$notification.error({
                message: '消息',
                description: err.message
              })
              .finally(() => {
                that.$destroyAll()
              })
          },
          onCancel: () => {
            that.$destroyAll()
          }
        })
      },
            })
            .finally(() => {
              that.$destroyAll()
            })
        },
        onCancel: () => {
          that.$destroyAll()
        }
      })
    },
      /**
       * é‡æ–°å‘布当前右键选中文档并重新发布退回上一文档版本
       * @param menuLabel
       */
      handleRepublish(menuLabel) {
        const that = this
        const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
        that.$confirm({
          title: '提示',
          content: `确认${menuLabel}吗?`,
          okText: '确认',
          cancelText: '取消',
          onOk: () => {
            dncApi.documentRepublishApi(docId)
              .then(res => {
                if (res.success) {
                  this.reloadDocumentListData({ docClassCode: param, attributionId })
                  that.$notification.success({
                    message: '消息',
                    description: res.message
                  })
                } else {
                  that.$notification.error({
                    message: '消息',
                    description: res.message
                  })
                }
              })
              .catch(err => {
    /**
     * é‡æ–°å‘布当前右键选中文档并重新发布退回上一文档版本
     * @param menuLabel
     */
    handleRepublish(menuLabel) {
      const that = this
      const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
      that.$confirm({
        title: '提示',
        content: `确认${menuLabel}吗?`,
        okText: '确认',
        cancelText: '取消',
        onOk: () => {
          dncApi.documentRepublishApi(docId)
            .then(res => {
              if (res.success) {
                this.reloadDocumentListData({ docClassCode: param, attributionId })
                that.$notification.success({
                  message: '消息',
                  description: res.message
                })
              } else {
                that.$notification.error({
                  message: '消息',
                  description: err.message
                  description: res.message
                })
              }
            })
            .catch(err => {
              that.$notification.error({
                message: '消息',
                description: err.message
              })
              .finally(() => {
                that.$destroyAll()
              })
          },
          onCancel: () => {
            that.$destroyAll()
          }
        })
      },
            })
            .finally(() => {
              that.$destroyAll()
            })
        },
        onCancel: () => {
          that.$destroyAll()
        }
      })
    },
      /**
       * é‡å½’档当前右键选中文档且后续无法继续发布或归档
       * @param menuLabel
       */
      handlePigeonhole(menuLabel) {
        const that = this
        const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
        that.$confirm({
          title: '提示',
          content: `${menuLabel}后不可取消,确认${menuLabel}吗?`,
          okText: '确认',
          cancelText: '取消',
          onOk: () => {
            dncApi.documentPigeonholeApi(docId)
              .then(res => {
                if (res.success) {
                  this.reloadDocumentListData({ docClassCode: param, attributionId })
                  that.$notification.success({
                    message: '消息',
                    description: res.message
                  })
                } else {
                  that.$notification.error({
                    message: '消息',
                    description: res.message
                  })
                }
              })
              .catch(err => {
    /**
     * é‡å½’档当前右键选中文档且后续无法继续发布或归档
     * @param menuLabel
     */
    handlePigeonhole(menuLabel) {
      const that = this
      const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
      that.$confirm({
        title: '提示',
        content: `${menuLabel}后不可取消,确认${menuLabel}吗?`,
        okText: '确认',
        cancelText: '取消',
        onOk: () => {
          dncApi.documentPigeonholeApi(docId)
            .then(res => {
              if (res.success) {
                this.reloadDocumentListData({ docClassCode: param, attributionId })
                that.$notification.success({
                  message: '消息',
                  description: res.message
                })
              } else {
                that.$notification.error({
                  message: '消息',
                  description: err.message
                  description: res.message
                })
              }
            })
            .catch(err => {
              that.$notification.error({
                message: '消息',
                description: err.message
              })
              .finally(() => {
                that.$destroyAll()
              })
          },
          onCancel: () => {
            that.$destroyAll()
          }
        })
      },
            })
            .finally(() => {
              that.$destroyAll()
            })
        },
        onCancel: () => {
          that.$destroyAll()
        }
      })
    },
      // é‡ç½®tabKey并且释放加载文档列表的接口
      releaseLoadDocumentListApi() {
        this.hasLoadedDataTabKeyArray = []
        this.handleTabChange(this.activeTabKey)
      },
    // é‡ç½®tabKey并且释放加载文档列表的接口
    releaseLoadDocumentListApi() {
      this.hasLoadedDataTabKeyArray = []
      this.handleTabChange(this.activeTabKey)
    },
      // æŽ§åˆ¶å³é”®èœå•关闭
      handleMenuClose() {
        this.$refs.tableContextMenuRef.menuVisible = false
        document.body.removeEventListener('click', this.handleMenuClose)
      },
    // æŽ§åˆ¶å³é”®èœå•关闭
    handleMenuClose() {
      this.$refs.tableContextMenuRef.menuVisible = false
      document.body.removeEventListener('click', this.handleMenuClose)
    },
      triggerCorrespondingMethod({ methodName, modalTitle }) {
        if (this[methodName]) this[methodName](modalTitle)
      }
    triggerCorrespondingMethod({ methodName, modalTitle }) {
      if (this[methodName]) this[methodName](modalTitle)
    }
  }
}
</script>
<style scoped>
  /deep/ .ant-table-tbody .ant-table-row {
    cursor: pointer;
  }
/deep/ .ant-table-tbody .ant-table-row {
  cursor: pointer;
}
</style>
src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue
@@ -78,6 +78,10 @@
      this.$bus.$on('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
      this.$bus.$on('handleSwitchDeviceDocClassCode', this.setCurrentDeviceDocClassCode)
    },
    beforeDestroy() {
      this.$bus.$off('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
      this.$bus.$off('handleSwitchDeviceDocClassCode', this.setCurrentDeviceDocClassCode)
    },
    methods: {
      getTreeDataByApi() {
        this.loading = true
@@ -119,7 +123,6 @@
        this.$bus.$emit('sendDeviceTreeNodeInfo', this.currentSelected)
        if (selectedKeys.length === 0) return
        this.selectedKeys = selectedKeys
      },
      /**
src/views/dnc/base/modules/DeviceStructure/DeviceStructureTreeContextMenu.vue
@@ -51,8 +51,8 @@
        const { param } = this.treeParams
        const treeNodeInfo = Object.assign({}, this.treeParams, { param })
        console.log('treeNodeInfo++++++++++++++++++++++++++++', treeNodeInfo)
        if (treeNodeInfo.type === 2) treeNodeInfo.type = 4
        // è®¾å¤‡ç»“构树节点中的设备层级为2,但在产品结构树中将设备层级的type设置为4,为保证两个结构树共用的方法能正常运行,因此在此处同样设置为4
        if (treeNodeInfo.type === 2) treeNodeInfo.type = 7
        // è®¾å¤‡ç»“构树节点中的设备层级为2,但在产品结构树中将设备层级的type设置为7,因此在此处设置为7
        const menuKeyArray = menuKey.split('_')
        const isCommonMethod = this.defaultContextMenuList[level].find(item => item.code === menuKey).isCommonMethod
        // product_add => handleAdd è§¦å‘对应组件事件
src/views/dnc/base/modules/DeviceStructure/Document/HasReceivedDocumentTableList.vue
@@ -1,7 +1,7 @@
<template>
  <div>
    <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination"
             :scroll="{y:189}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange">
             :scroll="{y:265}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange">
    </a-table>
@@ -21,6 +21,9 @@
    props: {
      currentTreeNodeInfo: {
        type: Object
      },
      currentTypeOfDevice:{
        type:Number
      },
      size: {
        type: String
@@ -109,7 +112,7 @@
        var params = this.getQueryParams()//查询条件
        console.log('currentTreeNodeInfo', this.currentTreeNodeInfo)
        params.attributionId = this.currentTreeNodeInfo.key
        params.attributionType = 4
        params.attributionType = this.currentTypeOfDevice
        params.docClassCode = 'REC'
        if (!params) return false
        this.dataSource = []
src/views/dnc/base/modules/DeviceStructure/Document/HasSentDocumentTableList.vue
@@ -1,7 +1,7 @@
<template>
  <div>
    <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination"
             :scroll="{y:189}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange">
             :scroll="{y:265}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange">
    </a-table>
@@ -21,6 +21,9 @@
    props: {
      currentTreeNodeInfo: {
        type: Object
      },
      currentTypeOfDevice:{
        type:Number
      },
      size: {
        type: String
@@ -119,7 +122,7 @@
        var params = this.getQueryParams()//查询条件
        console.log('currentTreeNodeInfo', this.currentTreeNodeInfo)
        params.attributionId = this.currentTreeNodeInfo.key
        params.attributionType = 4
        params.attributionType = this.currentTypeOfDevice
        params.docClassCode = 'SEND'
        if (!params) return false
        this.dataSource = []
src/views/dnc/base/modules/ProductStructure/DeviceCustomType/DeviceCustomTypeModal.vue
@@ -69,8 +69,8 @@
    },
    triggerCorrespondingMethod({ methodName, modalTitle, treeNodeInfo, tableRowInfo }) {
      console.log('触发右键菜单')
      if (this[methodName]) {
        console.log('触发右键菜单')
        this.title = modalTitle
        this[methodName](treeNodeInfo, tableRowInfo)
      }
src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
<template>
  <a-descriptions bordered :size="size" :column="4">
    <a-descriptions-item label="工艺规程版本号" :span="2">{{ currentLevelDetails.processSpecVersionCode }}
    </a-descriptions-item>
    <a-descriptions-item label="工艺规程版本名称" :span="2">{{ currentLevelDetails.processSpecVersionName }}
    </a-descriptions-item>
    <a-descriptions-item label="创建人">{{ currentLevelDetails.createBy_dictText }}</a-descriptions-item>
    <a-descriptions-item label="创建时间">{{ currentLevelDetails.createTime }}</a-descriptions-item>
    <a-descriptions-item label="修改人">{{ currentLevelDetails.updateBy_dictText }}</a-descriptions-item>
    <a-descriptions-item label="修改时间">{{ currentLevelDetails.updateTime }}</a-descriptions-item>
    <a-descriptions-item label="描述" :span="4">{{ currentLevelDetails.description }}</a-descriptions-item>
  </a-descriptions>
</template>
<script>
export default {
  name: 'ProcessSpecVersionInfo',
  components: {},
  props: {
    currentLevelDetails: {
      type: Object
    },
    size: {
      type: String
    }
  },
  data() {
    return {}
  },
  methods: {}
}
</script>
<style scoped>
</style>
src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue
@@ -1,5 +1,5 @@
<template>
  <div v-if="+currentLevelInfo.type!==4" style="height: 100%">
  <div style="height: 100%">
    <a-tabs style="height: 100%" v-model="activeTabKey" v-if="Object.keys(currentLevelInfo).length>0"
            @change="handleTabChange">
      <a-tab-pane :key="1" tab="属性信息" v-if="+currentLevelInfo.type===1">
@@ -12,6 +12,10 @@
      <a-tab-pane :key="1" tab="零件属性" v-if="+currentLevelInfo.type===3">
        <PartInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
      </a-tab-pane>
      <a-tab-pane :key="1" tab="属性信息" v-if="+currentLevelInfo.type===4">
        <ProcessSpecVersionInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
      </a-tab-pane>
      <a-tab-pane :key="1" tab="工序属性" v-if="+currentLevelInfo.type===5">
@@ -72,13 +76,16 @@
import UseDocumentEquipmentTableList from './Document/UseNcDocumentEquipmentTableList'
import FilePreview from '../../../common/FilePreview'
import TableContextMenu from '../../../common/TableContextMenu'
import { getAction } from '@/api/manage'
import UseDeviceCustomTypeEquipmentTableList
  from '@views/dnc/base/modules/ProductStructure/DeviceCustomType/UseDeviceCustomTypeEquipmentTableList.vue'
import ProcessSpecVersionInfo
  from '@views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionInfo.vue'
import { getAction } from '@/api/manage'
export default {
  name: 'ProductStructureMainBottom',
  components: {
    ProcessSpecVersionInfo,
    UseDeviceCustomTypeEquipmentTableList,
    CutterTableList,
    TableContextMenu,
src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue
@@ -1,5 +1,5 @@
<template>
  <div v-if="+currentTreeNodeInfo.type!==4">
  <div>
    <a-tabs v-model="activeTabKey" @contextmenu.native="e=>e.preventDefault()" @change="handleTabChange"
            v-if="Object.keys(currentTreeNodeInfo).length!==0">
      <a-tab-pane :key="1" tab="NC管理" v-if="+currentTreeNodeInfo.type===5||+currentTreeNodeInfo.type===6">
@@ -69,6 +69,12 @@
    this.getDeviceTypeListDisplayPermission('dnc_device_type_process', 'isProcessHasDeviceTypeList')
    this.getDeviceTypeListDisplayPermission('dnc_device_type_step', 'isProcessStepHasDeviceTypeList')
  },
  beforeDestroy() {
    this.$bus.$off('sendCurrentTreeNodeInfo', this.receiveCurrentTreeNodeInfo)
    this.$bus.$off('sendCurrentClickedTypeInfo', this.receiveCurrentClickedTypeInfo)
    this.$bus.$off('reloadDocumentListData', this.reloadDocumentListData)
    this.$bus.$off('tableMenuItemMethodTrigger', this.triggerCorrespondingMethod)
  },
  methods: {
    /**
     * èŽ·å–è®¾å¤‡ç±»åž‹åˆ—è¡¨åœ¨å·¥åºå’Œå·¥æ­¥å±‚çº§çš„å±•ç¤ºæƒé™
@@ -89,15 +95,24 @@
     */
    receiveCurrentTreeNodeInfo(treeNodeInfo) {
      console.log('treeNodeInfo', treeNodeInfo)
      const { id, type } = treeNodeInfo
      // ä»Žæ ‘组件接受树节点信息后从父组件流入子组件
      this.currentTreeNodeInfo = treeNodeInfo
      this.currentNCDocumentAttributionInfo = Object.assign({}, {
        attributionId: id,
        attributionType: type,
        docClassCode: 'NC'
      })
      // æ¸…空上一节点已经加载过得文档列表tabKey
      this.hasLoadedDataTabKeyArray = []
      if (+treeNodeInfo.type === 5 || +treeNodeInfo.type === 6) {
      if (+type === 5 || +type === 6) {
        this.activeTabKey = 1
        this.$nextTick(() => {
          if (this.$refs.deviceCustomTypeTableList) this.$refs.deviceCustomTypeTableList.setQueryParamAndLoadData()
          else if (this.$refs.ncDocumentTableListRef) this.$refs.ncDocumentTableListRef.loadData(1)
          if (this.$refs.deviceCustomTypeTableList) {
            this.$refs.deviceCustomTypeTableList.setQueryParamAndLoadData()
            // åˆ‡æ¢æ ‘之后清空NC程序列表
            if (this.$refs.ncDocumentTableListRef && this.$refs.ncDocumentTableListRef.dataSource.length > 0) this.$refs.ncDocumentTableListRef.dataSource = []
          } else if (this.$refs.ncDocumentTableListRef) this.$refs.ncDocumentTableListRef.loadData(1)
        })
      } else {
        this.activeTabKey = 2
@@ -179,7 +194,7 @@
      const { docId, docName } = this.currentRightClickedTableRowInfo
      dncApi.downloadDocumentApi({ docId, docName })
        .then(res => {
          if (res && !res.success) {
          if (!res.success) {
            that.$notification.error({
              message: '消息',
              description: res.message
@@ -254,7 +269,6 @@
        onOk: () => {
          dncApi.documentOutboundApi({ docId, docName })
            .then(res => {
              console.log('res------------------', res)
              if (res.success) {
                that.reloadDocumentListData({ docClassCode: param, attributionId, attributionType })
                that.$notification.success({
src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
@@ -114,6 +114,9 @@
    this.getTreeDataByApi()
    this.$bus.$on('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
  },
  beforeDestroy() {
    this.$bus.$off('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
  },
  methods: {
    getTreeDataByApi() {
      this.loading = true
@@ -243,6 +246,7 @@
    /**
     * è‡ªåŠ¨å±•å¼€æ·»åŠ ä¸‹çº§èŠ‚ç‚¹çš„çˆ¶èŠ‚ç‚¹
     * @param isAddNextLevel æ˜¯å¦éœ€è¦å±•开下级
     */
    modalFormSubmitSuccess(isAddNextLevel) {
      // åˆ¤æ–­æ˜¯å¦ä¸ºæ·»åŠ ä¸‹çº§å¹¶ä¸”åˆ¤æ–­çˆ¶èŠ‚ç‚¹æ˜¯å¦å±•å¼€
src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue
@@ -70,6 +70,7 @@
          { label: '创建工艺规程版本', code: 'version_add', icon: 'plus', isCommonMethod: false },
          { label: '创建工序', code: 'version_add_child', icon: 'plus', isCommonMethod: false },
          { label: '编辑工艺规程版本信息', code: 'version_edit', icon: 'edit', isCommonMethod: false },
          { label: '导入其他文档', code: 'version_import', icon: 'import', isCommonMethod: true },
          { label: '删除', code: 'version_delete', icon: 'delete', isCommonMethod: true },
          { label: '权限配置', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true }
        ],
@@ -122,6 +123,8 @@
          return 'OTHER'
        case 3:
          return 'OTHER'
        case 4:
          return 'OTHER'
        case 5:
          return 'NC'
        case 6:
src/views/dnc/common/DocumentInfo.vue
@@ -1,18 +1,18 @@
<template>
  <a-descriptions bordered :size="size">
  <a-descriptions bordered :size="size" :column="4">
    <a-descriptions-item label="文档名称">{{currentLevelDetails.docName}}</a-descriptions-item>
    <a-descriptions-item label="代码版本">{{currentLevelDetails.docAlias}}</a-descriptions-item>
    <a-descriptions-item label="设备编号    ">{{currentLevelDetails.docCode}}</a-descriptions-item>
    <a-descriptions-item label="设备编号">{{currentLevelDetails.docCode}}</a-descriptions-item>
    <a-descriptions-item label="文档后缀">{{currentLevelDetails.docSuffix}}</a-descriptions-item>
    <a-descriptions-item label="文档状态">{{currentLevelDetails.docStatus_dictText}}</a-descriptions-item>
    <a-descriptions-item label="系统指定版本">{{currentLevelDetails.publishVersion}}</a-descriptions-item>
    <a-descriptions-item label="出库状态">{{currentLevelDetails.pullStatus_dictText}}</a-descriptions-item>
    <a-descriptions-item label="出库人" :span="2">{{currentLevelDetails.pullUser_dictText}}</a-descriptions-item>
    <a-descriptions-item label="出库人">{{currentLevelDetails.pullUser_dictText}}</a-descriptions-item>
    <a-descriptions-item label="创建人">{{currentLevelDetails.createBy_dictText}}</a-descriptions-item>
    <a-descriptions-item label="创建时间" :span="2">{{currentLevelDetails.createTime}}</a-descriptions-item>
    <a-descriptions-item label="创建时间">{{currentLevelDetails.createTime}}</a-descriptions-item>
    <a-descriptions-item label="修改人">{{currentLevelDetails.updateBy_dictText}}</a-descriptions-item>
    <a-descriptions-item label="修改时间" :span="2">{{currentLevelDetails.updateTime}}</a-descriptions-item>
    <a-descriptions-item label="描述" :span="3">{{currentLevelDetails.description}}</a-descriptions-item>
    <a-descriptions-item label="修改时间">{{currentLevelDetails.updateTime}}</a-descriptions-item>
    <a-descriptions-item label="描述" :span="4">{{currentLevelDetails.description}}</a-descriptions-item>
  </a-descriptions>
</template>
src/views/mdc/base/EquipmentShutDownReasonList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,170 @@
<template>
  <a-card :bordered="false">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
          <a-col :md="4" :sm="4">
            <a-form-item label="停机类型">
              <a-radio-group v-model="queryParam.downtimeType" placeholder="请选择停机类型" @change="searchQuery">
                <a-radio :value="0">计划停机</a-radio>
                <a-radio :value="1">非计划停机</a-radio>
              </a-radio-group>
            </a-form-item>
          </a-col>
          <a-col :md="5" :sm="5">
            <a-form-item label="停机原因描述">
              <a-input v-model="queryParam.downtimeDescription" placeholder="请输入停机原因"/>
            </a-form-item>
          </a-col>
          <a-col :md="4" :sm="4">
            <a-space>
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
              <a-button type="primary" @click="searchReset" icon="reload">重置</a-button>
            </a-space>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <div class="table-operator">
      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
      <a-dropdown v-if="selectedRowKeys.length > 0">
        <a-menu slot="overlay" @click="handleMenuClick">
          <a-menu-item key="1">
            <a-icon type="delete" @click="batchDel"/>
            åˆ é™¤
          </a-menu-item>
        </a-menu>
        <a-button style="margin-left: 8px">
          æ‰¹é‡æ“ä½œ
          <a-icon type="down"/>
        </a-button>
      </a-dropdown>
    </div>
    <!-- table区域-begin -->
    <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-table
        ref="table"
        bordered
        size="middle"
        rowKey="id"
        :scroll="{x:'max-content',y:600}"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
        @change="handleTableChange">
        <template slot="downtimeType" slot-scope="text">
          {{ text === 0 ? '计划停机' : '非计划停机' }}
        </template>
        <template slot="action" slot-scope="text, record">
          <a @click="handleEdit(record)">编辑</a>
          <a-divider type="vertical"/>
          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
            <a>删除</a>
          </a-popconfirm>
        </template>
      </a-table>
    </div>
    <!-- table区域-end -->
    <EquipmentShutDownReasonModal ref="modalForm" @ok="modalFormOk"/>
  </a-card>
</template>
<script>
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import EquipmentShutDownReasonModal from '@views/mdc/base/modules/EquipmentShutDownReasonList/EquipmentShutDownReasonModal.vue'
export default {
  name: 'EquipmentShutDownReasonList',
  mixins: [JeecgListMixin],
  components: {
    EquipmentShutDownReasonModal
  },
  data() {
    return {
      queryParam: {},
      /* åˆ†é¡µå‚æ•° */
      ipagination: {
        current: 1,
        pageSize: 30,
        pageSizeOptions: ['30', '50', '100'],
        showTotal: (total, range) => {
          return range[0] + '-' + range[1] + ' å…±' + total + '条'
        },
        showQuickJumper: true,
        showSizeChanger: true,
        total: 0
      },
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          }
        },
        {
          title: '停机原因',
          align: 'center',
          width: 350,
          dataIndex: 'downtimeDescription'
        },
        {
          title: '停机类型',
          align: 'center',
          scopedSlots: { customRender: 'downtimeType' },
          dataIndex: 'downtimeType',
          width: 350
        },
        {
          title: '备注',
          align: 'center',
          dataIndex: 'remark',
          width: 350
        },
        {
          title: '操作',
          dataIndex: 'action',
          scopedSlots: { customRender: 'action' },
          align: 'center',
          width: 150
        }
      ],
      url: {
        list: '/mdc/mdcDowntimeReason/list',
        delete: '/mdc/mdcDowntimeReason/delete',
        deleteBatch: '/mdc/mdcDowntimeReason/deleteBatch'
      }
    }
  },
  methods: {
    handleMenuClick(e) {
      if (e.key == 1) {
        this.batchDel()
      }
    }
  }
}
</script>
src/views/mdc/base/EquipmentStandbyShutDown.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
<template>
  <div style="width: 100%; height: 100%;">
    <a-card :bordered="false">
      <a-row type="flex" :gutter="16">
        <a-col :md="5">
          <a-tabs :activeKey="activeKey" @change="tabChange">
            <a-tab-pane key="1" tab="车间层级" force-render>
              <base-tree @getCurrSelected="changeSelectionNode"></base-tree>
            </a-tab-pane>
            <a-tab-pane v-if="isDepartType == 0" key="2" tab="部门层级">
              <depart-tree @getCurrSelectedDD="changeSelectionNodedd"></depart-tree>
            </a-tab-pane>
          </a-tabs>
        </a-col>
        <a-col :md="19">
          <EquipmentStandbyShutdownList :node='selectedEquipment' :Type="selectedTypeTree"/>
        </a-col>
      </a-row>
    </a-card>
  </div>
</template>
<script>
import BaseTree from '../common/BaseTree'
import DepartTree from './modules/DepartList/DepartListTree/DepartTree'
import { mapActions } from 'vuex'
import EquipmentStandbyShutdownList
  from '@views/mdc/base/modules/EquipmentStandbyShutDown/EquipmentStandbyShutdownList.vue'
export default {
  name: 'EquipmentStandbyShutDown',
  components: {
    EquipmentStandbyShutdownList,
    BaseTree,
    DepartTree
  },
  data() {
    return {
      activeKey: '1',
      selectedEquipment: {},
      selectedTypeTree: '',
      isDepartType: ''
    }
  },
  created() {
    this.queryTreeData()
  },
  methods: {
    ...mapActions(['QueryDepartTree']),
    queryTreeData() {
      this.QueryDepartTree()
        .then(res => {
          if (res.success) {
            this.isDepartType = res.result[0].value
          } else {
            this.$notification.warning({
              message: '消息',
              description: res.message
            })
          }
        })
    },
    tabChange(val) {
      this.activeKey = val
      this.selectedTypeTree = val
    },
    changeSelectionNode(val) {
      this.selectedEquipment = val
      this.selectedTypeTree = '1'
    },
    changeSelectionNodedd(val) {
      this.selectedEquipment = val
      this.selectedTypeTree = '2'
    }
  }
}
</script>
<style scoped>
@import '~@assets/less/common.less';
.equipMessage {
  width: 100%;
  height: 10%;
}
.equipMessage table {
  width: 60%;
  height: 100%;
  line-height: 50%;
}
.equipMessage table td {
  text-align: center;
}
.equipMessage table td span {
  display: inline-block;
  width: 15px;
  height: 15px;
}
.equipMessage table td .equipShutdown {
  background-color: #808080;
}
.equipMessage table td .equipStandby {
  background-color: #ffbf37;
}
.equipMessage table td .equipRun {
  background-color: #19FE01;
}
.equipMessage table td .equipAlarm {
  background-color: #FD0008;
}
</style>
src/views/mdc/base/modules/EquipmentShutDownReasonList/EquipmentShutDownReasonModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
<template>
  <a-modal
    :title="title"
    :maskClosable="true"
    :width="modalWidth"
    @cancel="handleCancel"
    :visible="visible">
    <a-spin :spinning="confirmLoading">
      <a-form-model ref="form" :form="form" :model="model" :rules="validatorRules" :labelCol="labelColLong"
                    :wrapperCol="wrapperColLong">
        <a-row :gutter="24">
          <a-col :span="24">
            <a-form-model-item prop="downtimeType" label="停机类型">
<!--              <a-select v-model="model.downtimeType" placeholder="请选择停机类型">-->
<!--                <a-select-option :key="0">计划停机</a-select-option>-->
<!--                <a-select-option :key="1">非计划停机</a-select-option>-->
<!--              </a-select>-->
              <a-radio-group v-model="model.downtimeType" placeholder="请选择停机类型">
                <a-radio :value="0">计划停机</a-radio>
                <a-radio :value="1">非计划停机</a-radio>
              </a-radio-group>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="24">
            <a-form-model-item prop="downtimeDescription" label="停机原因">
              <a-input v-model="model.downtimeDescription" placeholder="请输入停机原因"/>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="24">
            <a-form-model-item  label="备注">
              <a-textarea v-model="model.remark" placeholder="请输入备注"/>
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-form-model>
    </a-spin>
    <template slot="footer">
      <a-space>
        <a-button @click="handleCancel">取消</a-button>
        <a-button @click="handleSubmit" type="primary" :loading="confirmLoading">提交</a-button>
      </a-space>
    </template>
  </a-modal>
</template>
<script>
import { postAction } from '@/api/manage'
export default {
  name: 'EquipmentCloseReasonModal',
  components: {},
  data() {
    return {
      modalWidth: 500,
      form: this.$form.createForm(this),
      validatorRules: {
        downtimeType: [
          {
            required: true, message: '请选择停机类型'
          }
        ],
        downtimeDescription: [
          {
            required: true, message: '请输入停机原因'
          }
        ]
      },
      title: '操作',
      visible: false,
      model: {},
      labelColLong: {
        xs: { span: 24 },
        sm: { span: 6 }
      },
      wrapperColLong: {
        xs: { span: 24 },
        sm: { span: 17 }
      },
      confirmLoading: false,
      url: {
        add: '/mdc/mdcDowntimeReason/add',
        edit: '/mdc/mdcDowntimeReason/edit'
      }
    }
  },
  methods: {
    add() {
      this.model = {}
      this.visible = true
    },
    edit(record) {
      this.model = Object.assign({}, record)
      this.visible = true
    },
    handleSubmit() {
      const that = this
      // è§¦å‘表单验证
      this.$refs.form.validate(valid => {
        if (valid) {
          that.confirmLoading = true
          let apiUrl
          if (!this.model.id) {
            apiUrl = that.url.add
          } else {
            apiUrl = that.url.edit
          }
          postAction(apiUrl, that.model)
            .then((res) => {
              if (res.success) {
                that.$notification.success({
                  message: '消息',
                  description: res.message
                })
                that.$emit('ok')
                that.handleCancel()
              } else {
                that.$notification.warning({
                  message: '消息',
                  description: res.message
                })
              }
            })
            .finally(() => {
              that.confirmLoading = false
            })
        } else {
          return false
        }
      })
    },
    handleCancel() {
      this.visible = false
      this.removeValidate()
    },
    // å…³é—­å¼¹çª—时清楚表单校验
    removeValidate() {
      if (this.$refs.form) this.$refs.form.clearValidate()
    }
  }
}
</script>
<style scoped>
</style>
src/views/mdc/base/modules/EquipmentStandbyShutDown/EquipmentStandbyShutdownList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,213 @@
<template>
  <div class="page-container">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div>
      <div class="table-page-search-wrapper">
        <a-form layout="inline" @keyup.enter.native="searchQuery">
          <a-row :gutter="24">
            <a-col :md="4" :sm="4">
              <a-form-item label="日期">
                <a-date-picker value-format="YYYY-MM-DD" style="width: 100%" v-model="queryParam.theDate"/>
              </a-form-item>
            </a-col>
            <a-col :md="2" :sm="2" :xs="2">
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
            </a-col>
          </a-row>
        </a-form>
      </div>
    </div>
    <div style="overflow: hidden;width: 100%;flex: 1" id="DeviceList">
      <a-table ref="table" bordered :scroll="{x:'max-content',y:scrollY}"
               size="middle" rowKey="id" :columns="columns"
               @change="handleTableChange"
               :dataSource="dataSource" :pagination="ipagination"
               :loading="loading">
        <template slot="downtimeType" slot-scope="text">
          {{ text !== null ? text === 0 ? '计划停机' : '非计划停机' : '' }}
        </template>
        <template slot="action" slot-scope="text, record">
          <a @click="handleReport(record)">上报</a>
          <a-divider type="vertical"/>
          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
            <a>删除</a>
          </a-popconfirm>
        </template>
      </a-table>
    </div>
    <EquipmentStandbyShutdownModal ref="modalForm" @ok="modalFormOk"/>
  </div>
</template>
<script>
import moment from 'moment'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import EquipmentStandbyShutdownModal
  from '@views/mdc/base/modules/EquipmentStandbyShutDown/EquipmentStandbyShutdownModal.vue'
export default {
  name: 'EquipmentStandbyShutdownList',
  components: { EquipmentStandbyShutdownModal },
  mixins: [JeecgListMixin],
  data() {
    return {
      disableMixinCreated: true,
      scrollY: 465,
      queryParam: {
        theDate: moment().subtract('days', 1).format('YYYY-MM-DD')
      },
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          }
        },
        {
          title: '设备编号',
          align: 'center',
          dataIndex: 'equipmentId',
          width: 200
        },
        {
          title: '设备名称',
          align: 'center',
          dataIndex: 'equipmentName',
          width: 200
        },
        {
          title: '停机类型',
          align: 'center',
          dataIndex: 'downtimeType',
          scopedSlots: { customRender: 'downtimeType' },
          width: 150
        },
        {
          title: '停机原因',
          align: 'center',
          dataIndex: 'downtimeDescription',
          width: 200
        },
        {
          title: '开始时间',
          align: 'center',
          dataIndex: 'startDate',
          width: 150
        },
        {
          title: '结束时间',
          align: 'center',
          dataIndex: 'endDate',
          width: 150
        },
        {
          title: '备注',
          align: 'center',
          dataIndex: 'remark',
          width: 200
        },
        {
          title: '操作',
          dataIndex: 'action',
          align: 'center',
          width: 150,
          scopedSlots: { customRender: 'action' },
          fixed: 'right'
        }
      ],
      url: {
        list: '/mdc/mdcDowntime/list',
        delete: '/mdc/mdcDowntime/delete'
      }
    }
  },
  props: { node: {}, Type: '' },
  created() {
    this.queryParam.typeTree = '1'
    this.loadData()
  },
  mounted() {
    window.addEventListener('resize', this.handleWindowResize)
    this.handleWindowResize()
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.handleWindowResize)
  },
  watch: {
    Type(valmath) {
      this.queryParam.typeTree = valmath
    },
    node(val) { //监听currSelected å˜åŒ–,将变化后的数值传递给 getCurrSelected äº‹ä»¶
      if (JSON.stringify(val) != '{}') {
        if (val.equipmentId != null) {
          this.queryParam.equipmentId = val.equipmentId
          this.queryParam.parentId = ''
        } else {
          this.queryParam.parentId = val.key
          this.queryParam.equipmentId = ''
        }
        this.loadData(1)
      }
    }
  },
  methods: {
    handleReport(record) {
      this.$refs.modalForm.edit(record)
      this.$refs.modalForm.title = '上报'
    },
    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 - 50
    }
  }
}
</script>
<style scoped>
.page-container {
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
@media screen and (min-width: 1920px) {
  .page-container {
    height: 812px !important;
  }
}
@media screen and (min-width: 1680px) and (max-width: 1920px) {
  .page-container {
    height: 812px !important;
  }
}
@media screen and (min-width: 1400px) and (max-width: 1680px) {
  .page-container {
    height: 664px !important;
  }
}
@media screen and (min-width: 1280px) and (max-width: 1400px) {
  .page-container {
    height: 565px !important;
  }
}
@media screen and (max-width: 1280px) {
  .page-container {
    height: 565px !important;
  }
}
</style>
src/views/mdc/base/modules/EquipmentStandbyShutDown/EquipmentStandbyShutdownModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,167 @@
<template>
  <a-modal :title="title" :width="500" :visible="visible" :confirmLoading="confirmLoading" @ok="handleOk"
           @cancel="handleCancel" cancelText="关闭">
    <a-spin :spinning="confirmLoading">
      <a-form-model ref="form" :form="form" :model="model" :rules="validatorRules" :labelCol="labelColLong"
                    :wrapperCol="wrapperColLong">
        <a-row :gutter="24">
          <a-col :span="24">
            <a-form-model-item label="停机类型" prop="downtimeType">
              <a-radio-group v-model="model.downtimeType" placeholder="请选择停机类型"
                             @change="handleDowntimeTypeChange">
                <a-radio :value="0">计划停机</a-radio>
                <a-radio :value="1">非计划停机</a-radio>
              </a-radio-group>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="24">
            <a-form-model-item label="停机原因" prop="reasonId">
              <a-select v-model="model.reasonId" placeholder="请选择停机原因">
                <a-select-option v-for="item in downtimeDescriptionList" :key="item.id">
                  {{ item.downtimeDescription }}
                </a-select-option>
              </a-select>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="24">
            <a-form-model-item label="备注">
              <a-textarea v-model="model.remark" placeholder="请输入备注"/>
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-form-model>
    </a-spin>
  </a-modal>
</template>
<script>
import { getAction, postAction } from '@api/manage'
export default {
  name: 'EquipmentStandbyShutdownModal',
  components: {},
  props: {},
  data() {
    return {
      title: '',
      visible: false,
      model: {},
      downtimeDescriptionList: [],
      labelColLong: {
        xs: {
          span: 24
        },
        sm: {
          span: 5
        }
      },
      wrapperColLong: {
        xs: {
          span: 24
        },
        sm: {
          span: 17
        }
      },
      confirmLoading: false,
      form: this.$form.createForm(this),
      validatorRules: {
        downtimeType: [
          {
            required: true, message: '请选择停机类型'
          }
        ],
        reasonId: [
          {
            required: true, message: '请选择停机原因'
          }
        ]
      },
      url: {
        edit: '/mdc/mdcDowntime/edit',
        getDowntimeDescriptionListByDowntimeType: '/mdc/mdcDowntimeReason/downtimeReasonList'
      }
    }
  },
  methods: {
    edit(record) {
      this.model = Object.assign({}, record)
      this.getDowntimeDescriptionListByApi()
      if (this.model.downtimeType === null) {
        delete this.model.downtimeType
        delete this.model.reasonId
      }
      this.visible = true
    },
    // åœæœºç±»åž‹å€¼å‘生改变时触发清空停机原因并重新获取对应停机类型的停机原因列表
    handleDowntimeTypeChange() {
      if (this.model.reasonId) delete this.model.reasonId
      this.removeValidate()
      this.getDowntimeDescriptionListByApi()
    },
    // è°ƒç”¨æŽ¥å£èŽ·å–åœæœºåŽŸå› åˆ—è¡¨
    getDowntimeDescriptionListByApi() {
      const that = this
      this.downtimeDescriptionList = []
      getAction(this.url.getDowntimeDescriptionListByDowntimeType, { downtimeType: this.model.downtimeType })
        .then(res => {
          if (res.success) that.downtimeDescriptionList = res.result
        })
    },
    handleOk() {
      const that = this
      // è§¦å‘表单验证
      this.$refs.form.validate(valid => {
        if (valid) {
          that.confirmLoading = true
          postAction(this.url.edit, that.model)
            .then((res) => {
              if (res.success) {
                that.$notification.success({
                  message: '消息',
                  description: res.message
                })
                that.$emit('ok', res.result)
                that.handleCancel()
              } else {
                that.$notification.warning({
                  message: '消息',
                  description: res.message
                })
              }
            })
            .finally(() => {
              that.confirmLoading = false
            })
        } else {
          return false
        }
      })
    },
    handleCancel() {
      this.visible = false
      this.removeValidate()
    },
    // å…³é—­å¼¹çª—时清楚表单校验
    removeValidate() {
      if (this.$refs.form) this.$refs.form.clearValidate()
    }
  }
}
</script>