1、MDC零件加工管理和OEE页面开发100%
2、DNC结构树取消搜索框侧边下拉菜单改为树组件空白处右键菜单
| | |
| | | addWorkshopApi: params => postAction('/mdc/mdcWorkshopInfo/add', params), |
| | | // ç¼è¾è½¦é´ä¿¡æ¯ |
| | | editWorkshopApi: params => putAction('/mdc/mdcWorkshopInfo/edit', params), |
| | | // å é¤å个车é´ä¿¡æ¯ |
| | | deleteSingleWorkshopApi: id => deleteAction('/mdc/mdcWorkshopInfo/delete', { id }), |
| | | // æ¹éå é¤è½¦é´ä¿¡æ¯ |
| | | deleteBatchWorkshopApi: ids => deleteAction('/mdc/mdcWorkshopInfo/deleteBatch', { ids }), |
| | | // æ°å¢å¤§å±è½¦é´å设å¤å
³ç³» |
| | | addDeviceInWorkshopApi: params => postAction('/mdc/mdcWorkshopInfo/addWorkshopEquipment', params), |
| | | // å é¤å个大å±è½¦é´å设å¤å
³ç³» |
| | | deleteSingleDeviceInWorkshopApi: params => deleteAction('/mdc/mdcWorkshopInfo/deleteWorkshopEquipment', params), |
| | | // æ¹éå é¤å¤§å±è½¦é´å设å¤å
³ç³» |
| | | deleteBatchDeviceInWorkshopApi: params => deleteAction('/mdc/mdcWorkshopInfo/deleteWorkshopEquipmentBatch', params), |
| | | // -------------------------------------设å¤åæ°éå¼ç®¡ç页é¢-------------------------------------------- |
| | | // æ ¹æ®é©±å¨ç±»åè·ååæ° |
| | | getParamListByDriveTypeApi: controlSystemType => getAction(`/mdc/mdcDriveTypeParamConfig/getDriveParamOptionsByType?controlSystemType=${controlSystemType}`), |
| | |
| | | addParamThresholdApi: params => postAction('/mdc/mdcEquipmentThreshold/add', params), |
| | | // ç¼è¾è®¾å¤åæ°éå¼ |
| | | editParamThresholdApi: params => postAction('/mdc/mdcEquipmentThreshold/edit', params), |
| | | // å é¤è®¾å¤åæ°éå¼ |
| | | deleteParamThresholdApi: id => deleteAction('/mdc/mdcEquipmentThreshold/delete', { id }), |
| | | // å é¤è®¾å¤åæ°éå¼ |
| | | deleteBatchParamThresholdApi: ids => deleteAction('/mdc/mdcEquipmentThreshold/deleteBatch', { ids }) |
| | | // -------------------------------------OEE页é¢-------------------------------------------- |
| | | // 计ç®OEE |
| | | computeOeeApi: params => postAction('/mdc/mdcOeeInfo/computeOee', params), |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <a-menu :style="menuStyle" @click="menuItemClick" v-if="menuVisible" mode="vertical"> |
| | | <template v-for="menuItem in baseContextMenuList"> |
| | | <a-menu-item :key="menuItem.code" v-has="menuItem.code" v-if="menuItem.isHasPermission"> |
| | | <a-icon :type="menuItem.icon"/> |
| | | {{ menuItem.label }} |
| | | </a-menu-item> |
| | | |
| | | <a-menu-item :key="menuItem.code" v-else> |
| | | <a-icon :type="menuItem.icon"/> |
| | | {{ menuItem.label }} |
| | | </a-menu-item> |
| | | </template> |
| | | </a-menu> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'DeviceStructureBaseContextMenu', |
| | | components: {}, |
| | | props: { |
| | | tableRowInfo: { |
| | | type: Object |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | menuVisible: false, |
| | | menuStyle: { |
| | | position: 'fixed', |
| | | top: 0, |
| | | left: 0, |
| | | border: '1px solid #eee', |
| | | boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)', |
| | | zIndex: 999 |
| | | }, |
| | | currentMenuLevel: '', |
| | | baseContextMenuList: [ |
| | | { label: 'å·æ°', code: 'tree_reload', icon: 'reload', isHasPermission: false, isCommonMethod: false }, |
| | | ] |
| | | } |
| | | }, |
| | | methods: { |
| | | menuItemClick({ key }) { |
| | | console.log('menuKey', key) |
| | | const isCommonMethod = this.baseContextMenuList.find(item => item.code === key).isCommonMethod |
| | | const modalTitle = this.baseContextMenuList.find(item => item.code === key).label |
| | | const menuKeyArray = key.split('_') |
| | | // product_add => handleAdd 触å对åºç»ä»¶äºä»¶ |
| | | let methodName |
| | | // 夿æ¯å¦ä¸ºå
Œ
±æ¹æ³ï¼å¦æä¸ºå
Œ
±æ¹æ³åæªå䏿屿§product/component/part/processçåæ®µ |
| | | if (isCommonMethod) { |
| | | methodName = 'handle' + menuKeyArray.map(item => item[0].toUpperCase() + item.slice(1)).slice(1).join('') |
| | | } else { |
| | | methodName = 'handle' + menuKeyArray.map(item => item[0].toUpperCase() + item.slice(1)).join('') |
| | | } |
| | | this.$bus.$emit('treeMenuItemMethodTrigger', { methodName, modalTitle }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | /deep/ .ant-menu-item { |
| | | height: 32px; |
| | | line-height: 32px; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <a-card class="tree_con" :loading="cardLoading" :bordered="false" @contextmenu.native="e=>e.preventDefault()"> |
| | | <a-card class="tree_con" :loading="cardLoading" :bordered="false" @contextmenu.native.stop="openBaseContextMenu"> |
| | | <a-spin :spinning="loading"> |
| | | <div style="display: flex;flex-direction: column;height: 100%"> |
| | | <div style="display: flex"> |
| | | <a-input placeholder="è¾å
¥å
³é®åè¿è¡æç´¢" allowClear v-model="searchInput" |
| | | @change="handleSearchInputChange"/> |
| | | <a-dropdown :trigger="['click']" placement="bottomCenter" style="margin: 0 8px"> |
| | | <a-menu slot="overlay"> |
| | | <a-menu-item key="1" @click="expandedKeys = allTreeKeys">å±å¼ææ</a-menu-item> |
| | | <a-menu-item key="2" @click="expandedKeys = ['-1']">åå¹¶ææ</a-menu-item> |
| | | <a-menu-item key="3" @click="getTreeDataByApi">å·æ°</a-menu-item> |
| | | </a-menu> |
| | | <a-button> |
| | | <a-icon type="bars"/> |
| | | </a-button> |
| | | </a-dropdown> |
| | | <!-- <a-dropdown :trigger="['click']" placement="bottomCenter" style="margin: 0 8px">--> |
| | | <!-- <a-menu slot="overlay">--> |
| | | <!-- <a-menu-item key="1" @click="expandedKeys = allTreeKeys">å±å¼ææ</a-menu-item>--> |
| | | <!-- <a-menu-item key="2" @click="expandedKeys = ['-1']">åå¹¶ææ</a-menu-item>--> |
| | | <!-- <a-menu-item key="3" @click="getTreeDataByApi">å·æ°</a-menu-item>--> |
| | | <!-- </a-menu>--> |
| | | <!-- <a-button>--> |
| | | <!-- <a-icon type="bars"/>--> |
| | | <!-- </a-button>--> |
| | | <!-- </a-dropdown>--> |
| | | </div> |
| | | |
| | | <!--设å¤ç»ææ --> |
| | | <div style="flex: 1;overflow:auto;margin-top: 10px"> |
| | | <div id="tree-container" style="flex: 1;overflow:auto;margin-top: 10px"> |
| | | <a-tree blockNode show-icon :expandedKeys.sync="expandedKeys" |
| | | :selectedKeys="selectedKeys" :treeData="treeDataSource" :autoExpandParent="autoExpandParent" |
| | | @select="handleTreeSelect" @expand="handleTreeExpand" @rightClick="handleTreeRightClick"> |
| | |
| | | |
| | | <!--æéé
置弹çª--> |
| | | <AssignPermissionModal :currentTreeNodeInfo="rightClickSelected" @submitSuccess="getTreeDataByApi"/> |
| | | <!--产åç»ææ åºæ¬å³é®èå(空ç½å¤è§¦å)--> |
| | | <DeviceStructureBaseContextMenu ref="baseContextmenuRef"/> |
| | | </a-card> |
| | | </template> |
| | | |
| | | <script> |
| | | import dncApi from '@/api/dnc' |
| | | import DeviceStructureTreeContextMenu from './DeviceStructureTreeContextMenu' |
| | | import AssignPermissionModal from './Permission/AssignPermissionModal' |
| | | import dncApi from '@/api/dnc' |
| | | import DeviceStructureTreeContextMenu from './DeviceStructureTreeContextMenu' |
| | | import AssignPermissionModal from './Permission/AssignPermissionModal' |
| | | import DeviceStructureBaseContextMenu |
| | | from '@views/dnc/base/modules/DeviceStructure/DeviceStructureBaseContextMenu.vue' |
| | | |
| | | export default { |
| | | name: 'DeviceStructureTree', |
| | | components: { |
| | | AssignPermissionModal, |
| | | DeviceStructureTreeContextMenu |
| | | }, |
| | | data() { |
| | | return { |
| | | searchInput: '', |
| | | cardLoading: false, |
| | | loading: false, |
| | | treeDataSource: [], |
| | | selectedKeys: [], |
| | | expandedKeys: [], |
| | | beforeSearchExpandedKeys: [], |
| | | searchValue: '', |
| | | dataList: [], |
| | | autoExpandParent: true, |
| | | checkStrictly: true, |
| | | allTreeKeys: [], |
| | | currentSelected: {}, |
| | | rightClickSelected: {}, |
| | | currentDeviceDocClassCode: 'SEND', |
| | | url: { |
| | | delete: '/nc/product/delete' |
| | | } |
| | | } |
| | | }, |
| | | created() { |
| | | this.getTreeDataByApi() |
| | | 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 |
| | | this.cardLoading = true |
| | | this.treeDataSource = [] |
| | | dncApi.getDeviceTreeDataApi() |
| | | .then(res => { |
| | | if (res.success) { |
| | | this.dataList = [] |
| | | this.allTreeKeys = [] |
| | | this.treeDataSource = res.result |
| | | this.generateList(this.treeDataSource) |
| | | this.expandedKeys = this.beforeSearchExpandedKeys = this.allTreeKeys |
| | | this.$bus.$emit('sendDeviceTreeNodeInfo', this.treeDataSource[0]) |
| | | } else { |
| | | this.$message.warn(res.message) |
| | | } |
| | | }) |
| | | .finally(() => { |
| | | this.loading = false |
| | | this.cardLoading = false |
| | | }) |
| | | }, |
| | | |
| | | setCurrentDeviceDocClassCode(documentActiveTabKey) { |
| | | if (documentActiveTabKey === 1) this.currentDeviceDocClassCode = 'SEND' |
| | | else this.currentDeviceDocClassCode = 'REC' |
| | | }, |
| | | |
| | | /** |
| | | * æ èç¹é䏿¶è§¦å |
| | | * @param selectedKeys éä¸èç¹key |
| | | * @param {node} node èç¹å¯¹è±¡ |
| | | */ |
| | | handleTreeSelect(selectedKeys, { node }) { |
| | | let record = node.dataRef |
| | | this.currentSelected = Object.assign({}, record) |
| | | // åå³ä¾§ç¶çº§ç»ä»¶åéå½åé䏿 èç¹ä¿¡æ¯ |
| | | this.$bus.$emit('sendDeviceTreeNodeInfo', this.currentSelected) |
| | | if (selectedKeys.length === 0) return |
| | | this.selectedKeys = selectedKeys |
| | | }, |
| | | |
| | | /** |
| | | * æ èç¹å³é®åå»èç¹æ¶è§¦å |
| | | * @param event äºä»¶å¯¹è±¡ |
| | | * @param node èç¹å¯¹è±¡ |
| | | */ |
| | | handleTreeRightClick({ event, node }) { |
| | | const record = node.dataRef |
| | | // è¥å³é®æ¶å½åå³ä¾§å±ç¤ºå±çº§ä¸ºè®¾å¤å±çº§ä¸å½åå³é®æ å±çº§å为设å¤å±çº§æ¶åå¨è§¦åå³é®èååè½æ¶åæ¶è§¦åå·¦é®éä¸åè½ |
| | | if (this.currentSelected.type === 2 && record.type === 2) this.handleTreeSelect([record.key], { node }) |
| | | this.rightClickSelected = Object.assign({}, record) |
| | | }, |
| | | |
| | | /** |
| | | * æ èç¹å±å¼åå¹¶æ¶è§¦å |
| | | * @param expandedKeys å±å¼é¡¹key |
| | | */ |
| | | handleTreeExpand(expandedKeys) { |
| | | this.expandedKeys = this.beforeSearchExpandedKeys = expandedKeys |
| | | console.log('beforeSearchExpandedKeys', this.beforeSearchExpandedKeys) |
| | | this.autoExpandParent = false |
| | | }, |
| | | |
| | | /* è¾å
¥æ¥è¯¢å
容ååæ¶è§¦å */ |
| | | handleSearchInputChange() { |
| | | let search = this.searchInput |
| | | let expandedKeys |
| | | let autoExpandParent |
| | | if (search !== '') { |
| | | expandedKeys = this.dataList |
| | | .map(item => { |
| | | if (item.title != null) { |
| | | if (item.title.indexOf(search) > -1) { |
| | | return this.getParentKey(item.key, this.treeDataSource) |
| | | } |
| | | return null |
| | | } |
| | | }) |
| | | .filter((item, i, self) => item && self.indexOf(item) === i) |
| | | autoExpandParent = true |
| | | } else { |
| | | expandedKeys = this.beforeSearchExpandedKeys |
| | | autoExpandParent = false |
| | | } |
| | | |
| | | Object.assign(this, { |
| | | expandedKeys, |
| | | searchValue: search, |
| | | autoExpandParent |
| | | }) |
| | | }, |
| | | |
| | | /** |
| | | * éå½è·å¾è¾å
¥é¡¹çç¶çº§key |
| | | * @param key å项key |
| | | * @param tree å项 |
| | | */ |
| | | getParentKey(key, tree) { |
| | | let parentKey |
| | | for (let i = 0; i < tree.length; i++) { |
| | | const node = tree[i] |
| | | if (node.children) { |
| | | if (node.children.some(item => item.key === key)) { |
| | | parentKey = node.key |
| | | } else if ( |
| | | this.getParentKey(key, node.children)) { |
| | | parentKey = this.getParentKey(key, node.children) |
| | | } |
| | | } |
| | | } |
| | | return parentKey |
| | | }, |
| | | |
| | | /** |
| | | * éå½è·å¾æææ èç¹key |
| | | * @param data |
| | | */ |
| | | generateList(data) { |
| | | for (let i = 0; i < data.length; i++) { |
| | | const node = data[i] |
| | | const key = node.key |
| | | const title = node.title |
| | | this.dataList.push({ key, title }) |
| | | this.allTreeKeys.push(key) |
| | | this.setTreeNodeIcon(node) |
| | | if (node.children) this.generateList(node.children) |
| | | } |
| | | }, |
| | | |
| | | triggerCorrespondingMethod({ methodName }) { |
| | | if (this[methodName]) this[methodName]() |
| | | }, |
| | | |
| | | /** |
| | | * 设置æ èç¹å¾æ |
| | | * @param treeNode |
| | | */ |
| | | setTreeNodeIcon(treeNode) { |
| | | if (!treeNode.equipmentId) { |
| | | treeNode.slots = { icon: 'workshop' } |
| | | } else { |
| | | treeNode.slots = { icon: 'device' } |
| | | } |
| | | export default { |
| | | name: 'DeviceStructureTree', |
| | | components: { |
| | | DeviceStructureBaseContextMenu, |
| | | AssignPermissionModal, |
| | | DeviceStructureTreeContextMenu |
| | | }, |
| | | data() { |
| | | return { |
| | | searchInput: '', |
| | | cardLoading: false, |
| | | loading: false, |
| | | treeDataSource: [], |
| | | selectedKeys: [], |
| | | expandedKeys: [], |
| | | beforeSearchExpandedKeys: [], |
| | | searchValue: '', |
| | | dataList: [], |
| | | autoExpandParent: true, |
| | | checkStrictly: true, |
| | | allTreeKeys: [], |
| | | currentSelected: {}, |
| | | rightClickSelected: {}, |
| | | currentDeviceDocClassCode: 'SEND', |
| | | url: { |
| | | delete: '/nc/product/delete' |
| | | } |
| | | } |
| | | }, |
| | | created() { |
| | | this.getTreeDataByApi() |
| | | 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 |
| | | this.cardLoading = true |
| | | this.treeDataSource = [] |
| | | dncApi.getDeviceTreeDataApi() |
| | | .then(res => { |
| | | if (res.success) { |
| | | this.dataList = [] |
| | | this.allTreeKeys = [] |
| | | this.treeDataSource = res.result |
| | | this.generateList(this.treeDataSource) |
| | | this.expandedKeys = this.beforeSearchExpandedKeys = this.allTreeKeys |
| | | this.$bus.$emit('sendDeviceTreeNodeInfo', this.treeDataSource[0]) |
| | | } else { |
| | | this.$message.warn(res.message) |
| | | } |
| | | }) |
| | | .finally(() => { |
| | | this.loading = false |
| | | this.cardLoading = false |
| | | }) |
| | | }, |
| | | |
| | | /** |
| | | * éè¿å³ä¾§tabæ æå¨activeKey设置å½å设å¤çNCææ¡£ç±»å |
| | | * @param documentActiveTabKey å³ä¾§tabæ çactiveKey |
| | | */ |
| | | setCurrentDeviceDocClassCode(documentActiveTabKey) { |
| | | if (documentActiveTabKey === 1) this.currentDeviceDocClassCode = 'SEND' |
| | | else this.currentDeviceDocClassCode = 'REC' |
| | | }, |
| | | |
| | | /** |
| | | * æ èç¹é䏿¶è§¦å |
| | | * @param selectedKeys éä¸èç¹key |
| | | * @param {node} node èç¹å¯¹è±¡ |
| | | */ |
| | | handleTreeSelect(selectedKeys, { node }) { |
| | | let record = node.dataRef |
| | | this.currentSelected = Object.assign({}, record) |
| | | // åå³ä¾§ç¶çº§ç»ä»¶åéå½åé䏿 èç¹ä¿¡æ¯ |
| | | this.$bus.$emit('sendDeviceTreeNodeInfo', this.currentSelected) |
| | | if (selectedKeys.length === 0) return |
| | | this.selectedKeys = selectedKeys |
| | | }, |
| | | |
| | | /** |
| | | * æ èç¹å³é®åå»èç¹æ¶è§¦å |
| | | * @param event äºä»¶å¯¹è±¡ |
| | | * @param node èç¹å¯¹è±¡ |
| | | */ |
| | | handleTreeRightClick({ event, node }) { |
| | | if (this.$refs.baseContextmenuRef) this.$refs.baseContextmenuRef.menuVisible = false |
| | | const record = node.dataRef |
| | | // è¥å³é®æ¶å½åå³ä¾§å±ç¤ºå±çº§ä¸ºè®¾å¤å±çº§ä¸å½åå³é®æ å±çº§å为设å¤å±çº§æ¶åå¨è§¦åå³é®èååè½æ¶åæ¶è§¦åå·¦é®éä¸åè½ |
| | | if (this.currentSelected.type === 2 && record.type === 2) this.handleTreeSelect([record.key], { node }) |
| | | this.rightClickSelected = Object.assign({}, record) |
| | | }, |
| | | |
| | | /** |
| | | * æ èç¹å±å¼åå¹¶æ¶è§¦å |
| | | * @param expandedKeys å±å¼é¡¹key |
| | | */ |
| | | handleTreeExpand(expandedKeys) { |
| | | this.expandedKeys = this.beforeSearchExpandedKeys = expandedKeys |
| | | console.log('beforeSearchExpandedKeys', this.beforeSearchExpandedKeys) |
| | | this.autoExpandParent = false |
| | | }, |
| | | |
| | | /* è¾å
¥æ¥è¯¢å
容ååæ¶è§¦å */ |
| | | handleSearchInputChange() { |
| | | let search = this.searchInput |
| | | let expandedKeys |
| | | let autoExpandParent |
| | | if (search !== '') { |
| | | expandedKeys = this.dataList |
| | | .map(item => { |
| | | if (item.title != null) { |
| | | if (item.title.indexOf(search) > -1) { |
| | | return this.getParentKey(item.key, this.treeDataSource) |
| | | } |
| | | return null |
| | | } |
| | | }) |
| | | .filter((item, i, self) => item && self.indexOf(item) === i) |
| | | autoExpandParent = true |
| | | } else { |
| | | expandedKeys = this.beforeSearchExpandedKeys |
| | | autoExpandParent = false |
| | | } |
| | | |
| | | Object.assign(this, { |
| | | expandedKeys, |
| | | searchValue: search, |
| | | autoExpandParent |
| | | }) |
| | | }, |
| | | |
| | | /** |
| | | * éå½è·å¾è¾å
¥é¡¹çç¶çº§key |
| | | * @param key å项key |
| | | * @param tree å项 |
| | | */ |
| | | getParentKey(key, tree) { |
| | | let parentKey |
| | | for (let i = 0; i < tree.length; i++) { |
| | | const node = tree[i] |
| | | if (node.children) { |
| | | if (node.children.some(item => item.key === key)) { |
| | | parentKey = node.key |
| | | } else if ( |
| | | this.getParentKey(key, node.children)) { |
| | | parentKey = this.getParentKey(key, node.children) |
| | | } |
| | | } |
| | | } |
| | | return parentKey |
| | | }, |
| | | |
| | | /** |
| | | * éå½è·å¾æææ èç¹key |
| | | * @param data |
| | | */ |
| | | generateList(data) { |
| | | for (let i = 0; i < data.length; i++) { |
| | | const node = data[i] |
| | | const key = node.key |
| | | const title = node.title |
| | | this.dataList.push({ key, title }) |
| | | this.allTreeKeys.push(key) |
| | | this.setTreeNodeIcon(node) |
| | | if (node.children) this.generateList(node.children) |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * æ æå¨ç¶å
ç´ çå³é®äºä»¶ |
| | | * @param event äºä»¶å¯¹è±¡ |
| | | */ |
| | | openBaseContextMenu(event) { |
| | | event.preventDefault() |
| | | if (event.target.id !== 'tree-container') return |
| | | this.$refs.baseContextmenuRef.menuStyle.top = event.clientY + 'px' |
| | | this.$refs.baseContextmenuRef.menuStyle.left = event.clientX + 'px' |
| | | this.$refs.baseContextmenuRef.menuVisible = true |
| | | document.body.addEventListener('click', this.handleBaseContextMenuClose) |
| | | }, |
| | | |
| | | /** |
| | | * 设置æ èç¹å¾æ |
| | | * @param treeNode |
| | | */ |
| | | setTreeNodeIcon(treeNode) { |
| | | if (!treeNode.equipmentId) { |
| | | treeNode.slots = { icon: 'workshop' } |
| | | } else { |
| | | treeNode.slots = { icon: 'device' } |
| | | } |
| | | }, |
| | | |
| | | // æ§å¶åºç¡å³é®èåå
³é |
| | | handleBaseContextMenuClose() { |
| | | this.$refs.baseContextmenuRef.menuVisible = false |
| | | document.body.removeEventListener('click', this.handleBaseContextMenuClose) |
| | | }, |
| | | |
| | | // å·æ°éæ°è·åæ çæ°æ® |
| | | handleTreeReload() { |
| | | this.getTreeDataByApi() |
| | | }, |
| | | |
| | | triggerCorrespondingMethod({ methodName }) { |
| | | if (this[methodName]) this[methodName]() |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | /deep/ .ant-card-body { |
| | | padding: 0 12px 0 0; |
| | | } |
| | | /deep/ .ant-card-body { |
| | | padding: 0 12px 0 0; |
| | | } |
| | | |
| | | /deep/ .ant-card-body, /deep/ .ant-spin-nested-loading, /deep/ .ant-spin-container { |
| | | height: 100%; |
| | | } |
| | | /deep/ .ant-card-body, /deep/ .ant-spin-nested-loading, /deep/ .ant-spin-container { |
| | | height: 100%; |
| | | } |
| | | |
| | | /deep/ .ant-tree-title, .ant-tree-title .ant-dropdown-trigger { |
| | | display: inline-block; |
| | | width: calc(100% - 24px) !important; |
| | | } |
| | | /deep/ .ant-tree-title, .ant-tree-title .ant-dropdown-trigger { |
| | | display: inline-block; |
| | | width: calc(100% - 24px) !important; |
| | | } |
| | | |
| | | ::-webkit-scrollbar { |
| | | width: 8px; |
| | | } |
| | | ::-webkit-scrollbar { |
| | | width: 8px; |
| | | } |
| | | |
| | | @media screen and (min-width: 1920px) { |
| | | .tree_con { |
| | | height: 748px !important; |
| | | } |
| | | @media screen and (min-width: 1920px) { |
| | | .tree_con { |
| | | height: 748px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (min-width: 1680px) and (max-width: 1920px) { |
| | | .tree_con { |
| | | height: 748px !important; |
| | | } |
| | | @media screen and (min-width: 1680px) and (max-width: 1920px) { |
| | | .tree_con { |
| | | height: 748px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (min-width: 1400px) and (max-width: 1680px) { |
| | | .tree_con { |
| | | height: 600px !important; |
| | | } |
| | | @media screen and (min-width: 1400px) and (max-width: 1680px) { |
| | | .tree_con { |
| | | height: 600px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (min-width: 1280px) and (max-width: 1400px) { |
| | | .tree_con { |
| | | height: 501px !important; |
| | | } |
| | | @media screen and (min-width: 1280px) and (max-width: 1400px) { |
| | | .tree_con { |
| | | height: 501px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (max-width: 1280px) { |
| | | .tree_con { |
| | | height: 501px !important; |
| | | } |
| | | @media screen and (max-width: 1280px) { |
| | | .tree_con { |
| | | height: 501px !important; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div> |
| | | <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination" |
| | | <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination" :loading="loading" |
| | | :scroll="{y:265}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange"> |
| | | |
| | | </a-table> |
| | |
| | | <template> |
| | | <div> |
| | | <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination" |
| | | <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination" :loading="loading" |
| | | :scroll="{y:265}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange"> |
| | | |
| | | </a-table> |
| | |
| | | <template> |
| | | <a-table :columns="columns" :data-source="dataSource" bordered :pagination="false" :size="size" rowKey="id" :scroll="{y:189}"> |
| | | <a-table :columns="columns" :data-source="dataSource" bordered :pagination="false" :loading="loading" :size="size" |
| | | rowKey="id" :scroll="{y:189}"> |
| | | |
| | | </a-table> |
| | | </template> |
| | | |
| | | <script> |
| | | import { JeecgListMixin } from '@/mixins/JeecgListMixin' |
| | | import { JeecgListMixin } from '@/mixins/JeecgListMixin' |
| | | |
| | | export default { |
| | | name: 'UseDeviceCustomTypeEquipmentTableList', |
| | | components: {}, |
| | | mixins: [JeecgListMixin], |
| | | props: { |
| | | currentLevelDetails: { |
| | | type: Object |
| | | }, |
| | | size: { |
| | | type: String |
| | | } |
| | | export default { |
| | | name: 'UseDeviceCustomTypeEquipmentTableList', |
| | | components: {}, |
| | | mixins: [JeecgListMixin], |
| | | props: { |
| | | currentLevelDetails: { |
| | | type: Object |
| | | }, |
| | | data() { |
| | | return { |
| | | disableMixinCreated: true, |
| | | columns: [ |
| | | { |
| | | title: '设å¤ç¼å·', |
| | | align: 'center', |
| | | dataIndex: 'equipmentId', |
| | | width:250 |
| | | }, |
| | | { |
| | | title: '设å¤åç§°', |
| | | align: 'center', |
| | | dataIndex: 'equipmentName', |
| | | width:250 |
| | | }, |
| | | { |
| | | title: '设å¤åå·', |
| | | align: 'center', |
| | | dataIndex: 'equipmentModel', |
| | | width:250 |
| | | }, |
| | | { |
| | | title: 'æºåºIP', |
| | | align: 'center', |
| | | dataIndex: 'equipmentIp', |
| | | width:200 |
| | | }, |
| | | { |
| | | title: '驱å¨ç±»å', |
| | | align: 'center', |
| | | dataIndex: 'driveType' |
| | | }, |
| | | { |
| | | title: '端å£', |
| | | align: 'center', |
| | | dataIndex: 'dataPort' |
| | | }, |
| | | { |
| | | title: 'æ°æ§ç³»ç»', |
| | | align: 'center', |
| | | dataIndex: 'controlSystem' |
| | | } |
| | | ], |
| | | url: { |
| | | list: '/nc/deviceManagement/getEquipmentListById' |
| | | size: { |
| | | type: String |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | disableMixinCreated: true, |
| | | columns: [ |
| | | { |
| | | title: '设å¤ç¼å·', |
| | | align: 'center', |
| | | dataIndex: 'equipmentId', |
| | | width: 250 |
| | | }, |
| | | { |
| | | title: '设å¤åç§°', |
| | | align: 'center', |
| | | dataIndex: 'equipmentName', |
| | | width: 250 |
| | | }, |
| | | { |
| | | title: '设å¤åå·', |
| | | align: 'center', |
| | | dataIndex: 'equipmentModel', |
| | | width: 250 |
| | | }, |
| | | { |
| | | title: 'æºåºIP', |
| | | align: 'center', |
| | | dataIndex: 'equipmentIp', |
| | | width: 200 |
| | | }, |
| | | { |
| | | title: '驱å¨ç±»å', |
| | | align: 'center', |
| | | dataIndex: 'driveType' |
| | | }, |
| | | { |
| | | title: '端å£', |
| | | align: 'center', |
| | | dataIndex: 'dataPort' |
| | | }, |
| | | { |
| | | title: 'æ°æ§ç³»ç»', |
| | | align: 'center', |
| | | dataIndex: 'controlSystem' |
| | | } |
| | | ], |
| | | url: { |
| | | list: '/nc/deviceManagement/getEquipmentListById' |
| | | } |
| | | }, |
| | | methods: { |
| | | setQueryParamAndLoadData() { |
| | | const { deviceManagementId } = this.currentLevelDetails |
| | | this.queryParam = Object.assign({}, { id: deviceManagementId }) |
| | | this.loadData() |
| | | }, |
| | | } |
| | | }, |
| | | methods: { |
| | | setQueryParamAndLoadData() { |
| | | const { deviceManagementId } = this.currentLevelDetails |
| | | this.queryParam = Object.assign({}, { id: deviceManagementId }) |
| | | this.loadData() |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | |
| | | <template> |
| | | <div style="flex: 1"> |
| | | <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination" |
| | | <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination" :loading="loading" |
| | | :scroll="{y:265}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange"> |
| | | |
| | | </a-table> |
| | |
| | | watch: { |
| | | currentNCDocumentAttributionInfo: { |
| | | handler(value) { |
| | | this.currentClickedDocumentInfo = {} |
| | | this.currentClickedDocumentInfo = this.currentRightClickedDocumentInfo = {} |
| | | }, |
| | | immediate: true |
| | | } |
| | |
| | | <template> |
| | | <div> |
| | | <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination" |
| | | <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination" :loading="loading" |
| | | :scroll="{y:265}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange"> |
| | | |
| | | </a-table> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <a-menu :style="menuStyle" @click="menuItemClick" v-if="menuVisible" mode="vertical"> |
| | | <template v-for="menuItem in baseContextMenuList"> |
| | | <a-menu-item :key="menuItem.code" v-has="menuItem.code" v-if="menuItem.isHasPermission"> |
| | | <a-icon :type="menuItem.icon"/> |
| | | {{ menuItem.label }} |
| | | </a-menu-item> |
| | | |
| | | <a-menu-item :key="menuItem.code" v-else> |
| | | <a-icon :type="menuItem.icon"/> |
| | | {{ menuItem.label }} |
| | | </a-menu-item> |
| | | </template> |
| | | </a-menu> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'ProductStructureBaseContextMenu', |
| | | components: {}, |
| | | props: { |
| | | tableRowInfo: { |
| | | type: Object |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | menuVisible: false, |
| | | menuStyle: { |
| | | position: 'fixed', |
| | | top: 0, |
| | | left: 0, |
| | | border: '1px solid #eee', |
| | | boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)', |
| | | zIndex: 999 |
| | | }, |
| | | currentMenuLevel: '', |
| | | baseContextMenuList: [ |
| | | { label: 'å·æ°', code: 'tree_reload', icon: 'reload', isHasPermission: false, isCommonMethod: false }, |
| | | { label: 'æ·»å 产å', code: 'product_add', icon: 'plus', isHasPermission: true, isCommonMethod: false } |
| | | ] |
| | | } |
| | | }, |
| | | methods: { |
| | | menuItemClick({ key }) { |
| | | console.log('menuKey', key) |
| | | const isCommonMethod = this.baseContextMenuList.find(item => item.code === key).isCommonMethod |
| | | const modalTitle = this.baseContextMenuList.find(item => item.code === key).label |
| | | const menuKeyArray = key.split('_') |
| | | // product_add => handleAdd 触å对åºç»ä»¶äºä»¶ |
| | | let methodName |
| | | // 夿æ¯å¦ä¸ºå
Œ
±æ¹æ³ï¼å¦æä¸ºå
Œ
±æ¹æ³åæªå䏿屿§product/component/part/processçåæ®µ |
| | | if (isCommonMethod) { |
| | | methodName = 'handle' + menuKeyArray.map(item => item[0].toUpperCase() + item.slice(1)).slice(1).join('') |
| | | } else { |
| | | methodName = 'handle' + menuKeyArray.map(item => item[0].toUpperCase() + item.slice(1)).join('') |
| | | } |
| | | this.$bus.$emit('treeMenuItemMethodTrigger', { methodName, modalTitle }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | /deep/ .ant-menu-item { |
| | | height: 32px; |
| | | line-height: 32px; |
| | | } |
| | | </style> |
| | |
| | | receiveCurrentTreeNodeInfo(treeNodeInfo) { |
| | | console.log('treeNodeInfo', treeNodeInfo) |
| | | const { id, type } = treeNodeInfo |
| | | // 仿 ç»ä»¶æ¥åæ èç¹ä¿¡æ¯åä»ç¶ç»ä»¶æµå
¥åç»ä»¶ |
| | | // 仿 ç»ä»¶æ¥åæ èç¹ä¿¡æ¯åä»ç¶ç»ä»¶æµå
¥åç»ä»¶å¹¶éç½®æ°æ® |
| | | this.currentClickedTypeInfo = this.currentRightClickedTableRowInfo = {} |
| | | this.currentTreeNodeInfo = treeNodeInfo |
| | | this.currentNCDocumentAttributionInfo = Object.assign({}, { |
| | | attributionId: id, |
| | | attributionType: type, |
| | | docClassCode: 'NC' |
| | | }) |
| | | // æ¸
空ä¸ä¸èç¹å·²ç»å è½½è¿å¾ææ¡£å表tabKey |
| | | this.hasLoadedDataTabKeyArray = [] |
| | | |
| | | if (+type === 5 || +type === 6) { |
| | | this.activeTabKey = 1 |
| | | this.$nextTick(() => { |
| | |
| | | this.hasLoadedDataTabKeyArray.push(this.activeTabKey) |
| | | }, |
| | | |
| | | /** |
| | | * æ¥åå½åç¹å»ç设å¤ç±»ä¿¡æ¯ |
| | | * @param record å½åç¹å»ç设å¤ç±»è¡ä¿¡æ¯ |
| | | */ |
| | | receiveCurrentClickedTypeInfo(record) { |
| | | const { id, attributionType } = record |
| | | this.currentClickedTypeInfo = Object.assign({}, record) |
| | |
| | | */ |
| | | handleTableContextMenuOpen(record) { |
| | | this.currentRightClickedTableRowInfo = Object.assign({}, record) |
| | | console.log('currentRightClickedTableRowInfo', this.currentRightClickedTableRowInfo) |
| | | this.$refs.tableContextMenuRef.currentMenuLevel = record.param |
| | | this.$refs.tableContextMenuRef.menuStyle.top = event.clientY + 'px' |
| | | this.$refs.tableContextMenuRef.menuStyle.left = event.clientX + 'px' |
| | |
| | | this.hasLoadedDataTabKeyArray.push(activeTabKey) |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * ææ¡£ä»¥åNCç¨åºå¯¼å
¥/åºåº/å
¥åºæåå触åéæ°å è½½ææ¡£å表 |
| | | * ææ¡£ä»¥åNCç¨åºå¯¼å
¥/åºåº/å
¥åº/åæ¶åºåº/åå¸/彿¡£æåå触åéæ°å è½½ææ¡£å表 |
| | | * @param docClassCode ææ¡£ç±»å« |
| | | * @param attributionType ææ¡£ç¶çº§typeç±»å |
| | | * @param attributionId ææ¡£ç¶çº§Id |
| | |
| | | console.log('docClassCode, attributionType, attributionId', docClassCode, attributionType, attributionId) |
| | | // 卿¤å¤è®¾å¤NCææ¡£ç¶çº§åæ°æ¯å¯æ¤æ¹æ³æ¯ç»ææ 以å设å¤ç±»ä¸¤ç§ä¸å导å
¥æ¹å¼çå
±ååºå£ |
| | | this.currentNCDocumentAttributionInfo = Object.assign({}, { docClassCode, attributionId, attributionType }) |
| | | // è¥å¼å
¥è®¾å¤ç±»ååªéè¦å¤æå½ååºç°çææ¡£æå±æ¯å¦æ¯å½åå·¦é®éä¸çææ¡£ï¼è¥ä¸æ¯å½åéä¸çææ¡£åä¸å·æ°ææ¡£å表(é¿å
æ æå·æ°) |
| | | if (this.currentRightClickedTableRowInfo.hasOwnProperty('deviceManagementId')) { |
| | | if (this.currentClickedTypeInfo.id !== attributionId) return |
| | | } else { |
| | | if (this.currentTreeNodeInfo.id !== attributionId) return |
| | | |
| | | // 夿å½åå³ä¾§å±ç¤ºçææ¡£çæå±æ¯å¦æ¯å½åå·¦é®é䏿 èç¹æè®¾å¤ç±»ï¼è¥ä¸æ¯å½åå·¦é®éä¸çåå¨å¯¼å
¥åä¸å·æ°å³ä¾§çææ¡£å表(é¿å
æ æå·æ°) |
| | | // 夿æ¯å¦æ¯å¨ææ¡£å表ä¸è¿è¡åºåº/å
¥åº/åå¸/彿¡£çæä½,è¥æ¯å¨ææ¡£åè¡¨ä¸æä½åæä½æååç´æ¥å·æ°ææ¡£å表 |
| | | if (!this.currentRightClickedTableRowInfo.hasOwnProperty('docId')) { |
| | | if (this.currentRightClickedTableRowInfo.hasOwnProperty('deviceManagementId')) { |
| | | // æ¤ç§æ
嵿¯å¨å¼å
¥è®¾å¤ç±»å¹¶å¨è®¾å¤ç±»å表ä¸è¿è¡NCææ¡£å¯¼å
¥ |
| | | if (this.currentClickedTypeInfo.id !== attributionId) return |
| | | } else { |
| | | // æ¤ç§æ
嵿¯å¨ç»ææ èç¹ä¸è¿è¡ææ¡£å¯¼å
¥ |
| | | if (this.currentTreeNodeInfo.id !== attributionId) return |
| | | } |
| | | } |
| | | |
| | | if (docClassCode === 'NC') { |
| | | this.$nextTick(() => { |
| | | if (this.$refs.ncDocumentTableListRef) this.$refs.ncDocumentTableListRef.loadData(1) |
| | |
| | | }, |
| | | |
| | | /** |
| | | * é彿¡£å½åå³é®éä¸ææ¡£ä¸åç»æ æ³ç»§ç»å叿彿¡£ |
| | | * 彿¡£å½åå³é®éä¸ææ¡£ä¸åç»æ æ³ç»§ç»å叿彿¡£ |
| | | * @param menuLabel |
| | | */ |
| | | handlePigeonhole(menuLabel) { |
| | |
| | | <template> |
| | | <a-card class="tree_con" :loading="cardLoading" :bordered="false" @contextmenu.native="e=>e.preventDefault()"> |
| | | <a-card class="tree_con" :loading="cardLoading" :bordered="false" @contextmenu.native.stop="openBaseContextMenu"> |
| | | <a-spin :spinning="loading"> |
| | | <div style="display: flex;flex-direction: column;height: 100%"> |
| | | <div style="display: flex;justify-content: space-between"> |
| | | <a-input placeholder="è¾å
¥å
³é®åè¿è¡æç´¢" allowClear v-model="searchInput" |
| | | @change="handleSearchInputChange"/> |
| | | <a-tooltip title="å·æ°"> |
| | | <a-button icon="reload" @click="getTreeDataByApi" style="width: 18%;margin-left: 8px"></a-button> |
| | | </a-tooltip> |
| | | <a-button type="primary" v-has="'product_add'" icon="plus" style="margin-left: 8px" |
| | | @click="$refs.productModalFormRef.triggerCorrespondingMethod({modalTitle:'æ·»å 产å',methodName:'handleProductAdd'})"> |
| | | 产å |
| | | </a-button> |
| | | <!-- <a-tooltip title="å·æ°">--> |
| | | <!-- <a-button icon="reload" @click="handleTreeReload" style="width: 18%;margin-left: 8px"></a-button>--> |
| | | <!-- </a-tooltip>--> |
| | | <!-- <a-button type="primary" v-has="'product_add'" icon="plus" style="margin-left: 8px"--> |
| | | <!-- @click="$refs.productModalFormRef.triggerCorrespondingMethod({modalTitle:'æ·»å 产å',methodName:'handleProductAdd'})">--> |
| | | <!-- 产å--> |
| | | <!-- </a-button>--> |
| | | <!-- <a-dropdown :trigger="['click']" placement="bottomCenter" style="margin: 0 8px">--> |
| | | <!-- <a-menu slot="overlay">--> |
| | | <!-- <a-menu-item key="1" @click="expandedKeys = allTreeKeys">å±å¼ææ</a-menu-item>--> |
| | |
| | | </div> |
| | | |
| | | <!--产åç»ææ --> |
| | | <div style="flex: 1;overflow:auto;margin-top: 10px"> |
| | | <div id="tree-container" style="flex: 1;overflow:auto;margin-top: 10px"> |
| | | <a-tree blockNode show-icon :expandedKeys.sync="expandedKeys" |
| | | :selectedKeys="selectedKeys" :treeData="treeDataSource" :autoExpandParent="autoExpandParent" |
| | | @select="handleTreeSelect" @expand="handleTreeExpand" @rightClick="handleTreeRightClick"> |
| | |
| | | <ProcessStepModal :currentTreeNodeInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/> |
| | | <!--æéé
置弹çª--> |
| | | <AssignPermissionModal :currentTreeNodeInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/> |
| | | <!--产åç»ææ åºæ¬å³é®èå(空ç½å¤è§¦å)--> |
| | | <ProductStructureBaseContextMenu ref="baseContextmenuRef"/> |
| | | </a-card> |
| | | </template> |
| | | |
| | |
| | | import ProcessStepModal from './ProcessStep/ProcessStepModal' |
| | | import AssignPermissionModal from './Permission/AssignPermissionModal' |
| | | import DeviceCustomTypeModal from '@views/dnc/base/modules/ProductStructure/DeviceCustomType/DeviceCustomTypeModal.vue' |
| | | import ProductStructureBaseContextMenu |
| | | from '@views/dnc/base/modules/ProductStructure/ProductStructureBaseContextMenu.vue' |
| | | |
| | | export default { |
| | | name: 'ProductStructureTree', |
| | | components: { |
| | | ProductStructureBaseContextMenu, |
| | | DeviceCustomTypeModal, |
| | | AssignPermissionModal, |
| | | ProcessStepModal, |
| | |
| | | this.$bus.$off('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod) |
| | | }, |
| | | methods: { |
| | | // è°ç¨æ¥å£è·åæ çæ°æ® |
| | | getTreeDataByApi() { |
| | | this.loading = true |
| | | this.cardLoading = true |
| | |
| | | * @param node èç¹å¯¹è±¡ |
| | | */ |
| | | handleTreeRightClick({ node }) { |
| | | if (this.$refs.baseContextmenuRef) this.$refs.baseContextmenuRef.menuVisible = false |
| | | const that = this |
| | | const record = node.dataRef |
| | | const { id, type } = record |
| | |
| | | } |
| | | }, |
| | | |
| | | triggerCorrespondingMethod({ methodName }) { |
| | | if (this[methodName]) this[methodName]() |
| | | /** |
| | | * æ æå¨ç¶å
ç´ çå³é®äºä»¶ |
| | | * @param event äºä»¶å¯¹è±¡ |
| | | */ |
| | | openBaseContextMenu(event) { |
| | | event.preventDefault() |
| | | if (event.target.id !== 'tree-container') return |
| | | this.$refs.baseContextmenuRef.menuStyle.top = event.clientY + 'px' |
| | | this.$refs.baseContextmenuRef.menuStyle.left = event.clientX + 'px' |
| | | this.$refs.baseContextmenuRef.menuVisible = true |
| | | document.body.addEventListener('click', this.handleBaseContextMenuClose) |
| | | }, |
| | | |
| | | /** |
| | |
| | | break |
| | | default: |
| | | } |
| | | }, |
| | | |
| | | // æ§å¶åºç¡å³é®èåå
³é |
| | | handleBaseContextMenuClose() { |
| | | this.$refs.baseContextmenuRef.menuVisible = false |
| | | document.body.removeEventListener('click', this.handleBaseContextMenuClose) |
| | | }, |
| | | |
| | | // å·æ°éæ°è·åæ çæ°æ® |
| | | handleTreeReload() { |
| | | this.getTreeDataByApi() |
| | | }, |
| | | |
| | | triggerCorrespondingMethod({ methodName }) { |
| | | if (this[methodName]) this[methodName]() |
| | | } |
| | | |
| | | } |
| | | } |
| | | </script> |
| | |
| | | </a-button> |
| | | </a-upload> |
| | | |
| | | <div style="margin-top: 16px">已鿩{{fileList.length}}个æä»¶</div> |
| | | <div style="margin-top: 16px">已鿩{{ fileList.length }}个æä»¶</div> |
| | | |
| | | <template slot="footer"> |
| | | <a-button @click="handleModalClose">åæ¶</a-button> |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import dncApi from '@/api/dnc' |
| | | import dncApi from '@/api/dnc' |
| | | |
| | | export default { |
| | | name: 'ImportFileModal', |
| | | components: {}, |
| | | data() { |
| | | return { |
| | | visible: false, |
| | | title: '', |
| | | fileList: [], |
| | | uploadParams: {}, |
| | | uploading: false, |
| | | isUploadMultiple: true, |
| | | currentDeviceDocClassCode: 'SEND', |
| | | currentTitleAfterClass: '' |
| | | export default { |
| | | name: 'ImportFileModal', |
| | | components: {}, |
| | | data() { |
| | | return { |
| | | visible: false, |
| | | title: '', |
| | | fileList: [], |
| | | uploadParams: {}, |
| | | uploading: false, |
| | | isUploadMultiple: true, |
| | | currentDeviceDocClassCode: 'SEND', |
| | | currentTitleAfterClass: '' |
| | | } |
| | | }, |
| | | created() { |
| | | this.$bus.$on('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod) |
| | | this.$bus.$on('tableMenuItemMethodTrigger', this.triggerCorrespondingMethod) |
| | | }, |
| | | methods: { |
| | | /** |
| | | * ç¹å»å¯¼å
¥ææ¡£æNCç¨åºæ¶è§¦å |
| | | * @param treeNodeInfo ç¹å»æ èç¹å³é®èå导å
¥ç¨åºæ¶ä¼ å
¥æ èç¹ä¿¡æ¯ |
| | | * @param tableRowInfo å³é®è¡¨æ ¼è¡æ¶ä¼ å
¥è¡ä¿¡æ¯ |
| | | * @param modalTitle å¼¹çªæ é¢ |
| | | */ |
| | | handleImport(treeNodeInfo, tableRowInfo, modalTitle) { |
| | | this.isUploadMultiple = true |
| | | let attributionId // ææ¡£æå±å±çº§Id |
| | | let attributionType // ææ¡£æå±å±çº§ç±»å |
| | | let docClassCode // ææ¡£ç±»å |
| | | if (treeNodeInfo) { |
| | | attributionId = treeNodeInfo.treeKey |
| | | attributionType = treeNodeInfo.type |
| | | docClassCode = treeNodeInfo.param |
| | | } else { |
| | | // è¥å·¥åºåå·¥æ¥å±çº§ä¸æè®¾å¤ç±»æ¶å导å
¥NCçåæ°éè¦è°æ´ |
| | | attributionId = tableRowInfo.param === 'deviceCustomType' ? tableRowInfo.id : tableRowInfo.attributionId |
| | | attributionType = tableRowInfo.attributionType |
| | | docClassCode = tableRowInfo.param === 'deviceCustomType' ? 'NC' : tableRowInfo.param |
| | | } |
| | | this.setModalTitle(modalTitle, docClassCode) |
| | | this.uploadParams = Object.assign({}, { attributionId, attributionType, docClassCode }) |
| | | console.log('uploadParams=====================', this.uploadParams) |
| | | this.visible = true |
| | | }, |
| | | |
| | | /** |
| | | * ç¹å»ææ¡£çå½å¨æçå
¥åºæ¶è§¦å |
| | | * @param _ |
| | | * @param tableRowInfo å³é®è¡¨æ ¼è¡æ¶ä¼ å
¥è¡ä¿¡æ¯ |
| | | */ |
| | | handlePush(_, tableRowInfo) { |
| | | this.isUploadMultiple = false |
| | | const { docId, attributionId, attributionType, param } = tableRowInfo |
| | | this.uploadParams = Object.assign({}, { |
| | | docId, |
| | | attributionId, |
| | | attributionType, |
| | | docClassCode: param |
| | | }) |
| | | this.visible = true |
| | | }, |
| | | |
| | | /** |
| | | * 鿩好æä»¶ç¹å»ç¡®å®å |
| | | * @param file æä»¶å¯¹è±¡ |
| | | */ |
| | | beforeUpload(file) { |
| | | if (this.isUploadMultiple) { |
| | | if (!this.fileList.find(item => item.name === file.name)) this.fileList = [...this.fileList, file] |
| | | } else this.fileList.splice(0, 1, file) |
| | | return false |
| | | }, |
| | | |
| | | // ç¹å»ä¸ä¼ è³æå¡å¨æé®æ¶è§¦å |
| | | handleUpload() { |
| | | const { fileList, $notification, isUploadMultiple, uploadParams, $bus, handleModalClose } = this |
| | | this.uploading = true |
| | | let uploadedFileCount = 0 |
| | | let uploadSuccessFileCount = 0 |
| | | let apiMethod,params |
| | | |
| | | fileList.forEach((file, index) => { |
| | | const formData = new FormData() |
| | | formData.append('file', file) |
| | | file.status = 'uploading' |
| | | // ç®åæ ¹æ®æ¯å¦ä¸ä¼ å¤ä¸ªæä»¶å¤æä¸¤ä¸ªåè½ï¼è¥åç»å¢å åè½æè°æ´éæ±åè°æ´å¤ææ¡ä»¶ |
| | | if (isUploadMultiple) { |
| | | apiMethod = dncApi.importDocumentFromLocalApi |
| | | params = Object.assign({}, { params: uploadParams, formData }) |
| | | } else { |
| | | apiMethod = dncApi.documentVersionUpdateApi |
| | | params = Object.assign({}, { docId: uploadParams.docId, formData }) |
| | | } |
| | | apiMethod(params) |
| | | .then(res => { |
| | | if (res.success) { |
| | | file.status = 'done' |
| | | uploadSuccessFileCount++ |
| | | $notification.success({ |
| | | message: 'æ¶æ¯', |
| | | description: res.message |
| | | }) |
| | | } else { |
| | | file.status = 'error' |
| | | $notification.error({ |
| | | message: 'æ¶æ¯', |
| | | description: res.message |
| | | }) |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | file.status = 'error' |
| | | }) |
| | | .finally(() => { |
| | | uploadedFileCount++ |
| | | fileList.splice(index, 1, file) |
| | | // 彿件å
¨é¨ä¸ä¼ 宿å |
| | | if (uploadedFileCount === fileList.length) { |
| | | // è³å°æä¸ä¸ªæä»¶ä¸ä¼ æååå°±éè¦éæ°å è½½ææ¡£å表 |
| | | if (uploadSuccessFileCount > 0) { |
| | | $bus.$emit('reloadDocumentListData', uploadParams) |
| | | if (!isUploadMultiple) { |
| | | $bus.$emit('reloadMainBottomTableData', 'documentVersion') |
| | | handleModalClose() //æ æ³è¿ç»å
¥åºå¤ä¸ªçæ¬å æ¤å
¥åºæååå³å¯éåºçªå£ |
| | | } |
| | | } |
| | | this.uploading = false |
| | | } |
| | | }) |
| | | }) |
| | | }, |
| | | |
| | | /** |
| | | * å 餿件å表项æ¶è§¦å |
| | | * @param file æä»¶å¯¹è±¡ |
| | | */ |
| | | handleRemove(file) { |
| | | const index = this.fileList.indexOf(file) |
| | | const newFileList = this.fileList.slice() |
| | | newFileList.splice(index, 1) |
| | | this.fileList = newFileList |
| | | }, |
| | | |
| | | // æ§å¶æä»¶ä¸ä¼ çªå£å
³éå¹¶æ¸
空æä»¶å表 |
| | | handleModalClose() { |
| | | this.visible = false |
| | | this.fileList = [] |
| | | }, |
| | | |
| | | /** |
| | | * è®¾ç½®å¼¹çªæ é¢ |
| | | * @param modalTitle å¼¹çªæ é¢ |
| | | * @param docClassCode ææ¡£ç±»å |
| | | */ |
| | | setModalTitle(modalTitle, docClassCode) { |
| | | switch (docClassCode) { |
| | | case 'SEND': |
| | | this.title = modalTitle + 'ï¼åéï¼' |
| | | break |
| | | case 'REC': |
| | | this.title = modalTitle + 'ï¼æ¥æ¶ï¼' |
| | | break |
| | | } |
| | | }, |
| | | created() { |
| | | this.$bus.$on('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod) |
| | | this.$bus.$on('tableMenuItemMethodTrigger', this.triggerCorrespondingMethod) |
| | | }, |
| | | methods: { |
| | | /** |
| | | * ç¹å»å¯¼å
¥ææ¡£æNCç¨åºæ¶è§¦å |
| | | * @param treeNodeInfo ç¹å»æ èç¹å³é®èå导å
¥ç¨åºæ¶ä¼ å
¥æ èç¹ä¿¡æ¯ |
| | | * @param tableRowInfo å³é®è¡¨æ ¼è¡æ¶ä¼ å
¥è¡ä¿¡æ¯ |
| | | * @param modalTitle å¼¹çªæ é¢ |
| | | */ |
| | | handleImport(treeNodeInfo, tableRowInfo, modalTitle) { |
| | | this.isUploadMultiple = true |
| | | let attributionId // ææ¡£æå±å±çº§Id |
| | | let attributionType // ææ¡£æå±å±çº§ç±»å |
| | | let docClassCode // ææ¡£ç±»å |
| | | if (treeNodeInfo) { |
| | | attributionId = treeNodeInfo.treeKey |
| | | attributionType = treeNodeInfo.type |
| | | docClassCode = treeNodeInfo.param |
| | | } else { |
| | | // è¥å·¥åºåå·¥æ¥å±çº§ä¸æè®¾å¤ç±»æ¶å导å
¥NCçåæ°éè¦è°æ´ |
| | | attributionId = tableRowInfo.param==='deviceCustomType'?tableRowInfo.id:tableRowInfo.attributionId |
| | | attributionType = tableRowInfo.attributionType |
| | | docClassCode = tableRowInfo.param==='deviceCustomType'?'NC':tableRowInfo.param |
| | | } |
| | | this.setModalTitle(modalTitle, docClassCode) |
| | | this.uploadParams = Object.assign({}, { attributionId, attributionType, docClassCode }) |
| | | console.log('uploadParams=====================', this.uploadParams) |
| | | this.visible = true |
| | | }, |
| | | |
| | | /** |
| | | * ç¹å»ææ¡£çå½å¨æçå
¥åºæ¶è§¦å |
| | | * @param _ |
| | | * @param tableRowInfo å³é®è¡¨æ ¼è¡æ¶ä¼ å
¥è¡ä¿¡æ¯ |
| | | */ |
| | | handlePush(_, tableRowInfo) { |
| | | this.isUploadMultiple = false |
| | | console.log('tableRowInfo', tableRowInfo) |
| | | this.uploadParams = Object.assign({}, { |
| | | docId: tableRowInfo.docId, |
| | | attributionId: tableRowInfo.attributionId, |
| | | docClassCode: tableRowInfo.param |
| | | }) |
| | | this.visible = true |
| | | }, |
| | | |
| | | /** |
| | | * 鿩好æä»¶ç¹å»ç¡®å®å |
| | | * @param file æä»¶å¯¹è±¡ |
| | | */ |
| | | beforeUpload(file) { |
| | | if (this.isUploadMultiple) { |
| | | if (!this.fileList.find(item => item.name === file.name)) this.fileList = [...this.fileList, file] |
| | | } |
| | | else this.fileList.splice(0, 1, file) |
| | | return false |
| | | }, |
| | | |
| | | // ç¹å»ä¸ä¼ è³æå¡å¨æé®æ¶è§¦å |
| | | handleUpload() { |
| | | const { fileList, $notification, isUploadMultiple, uploadParams, $bus, handleModalClose } = this |
| | | this.uploading = true |
| | | let uploadedFileCount = 0 |
| | | let uploadSuccessFileCount = 0 |
| | | let apiMethod |
| | | let params |
| | | |
| | | fileList.forEach((file, index) => { |
| | | const formData = new FormData() |
| | | formData.append('file', file) |
| | | file.status = 'uploading' |
| | | // ç®åæ ¹æ®æ¯å¦ä¸ä¼ å¤ä¸ªæä»¶å¤æä¸¤ä¸ªåè½ï¼è¥åç»å¢å åè½æè°æ´éæ±åè°æ´å¤ææ¡ä»¶ |
| | | if (isUploadMultiple) { |
| | | apiMethod = dncApi.importDocumentFromLocalApi |
| | | params = Object.assign({}, { params: uploadParams, formData }) |
| | | } else { |
| | | apiMethod = dncApi.documentVersionUpdateApi |
| | | params = Object.assign({}, { docId: uploadParams.docId, formData }) |
| | | } |
| | | apiMethod(params) |
| | | .then(res => { |
| | | if (res.success) { |
| | | file.status = 'done' |
| | | uploadSuccessFileCount++ |
| | | console.log('uploadSuccessFileCount++', uploadSuccessFileCount) |
| | | $notification.success({ |
| | | message: 'æ¶æ¯', |
| | | description: res.message |
| | | }) |
| | | } else { |
| | | file.status = 'error' |
| | | $notification.error({ |
| | | message: 'æ¶æ¯', |
| | | description: res.message |
| | | }) |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | file.status = 'error' |
| | | }) |
| | | .finally(() => { |
| | | uploadedFileCount++ |
| | | fileList.splice(index, 1, file) |
| | | // 彿件å
¨é¨ä¸ä¼ 宿å |
| | | if (uploadedFileCount === fileList.length) { |
| | | // è³å°æä¸ä¸ªæä»¶ä¸ä¼ æååå°±éè¦éæ°å è½½ææ¡£å表 |
| | | if (uploadSuccessFileCount > 0) { |
| | | $bus.$emit('reloadDocumentListData', uploadParams) |
| | | if (!isUploadMultiple) { |
| | | $bus.$emit('reloadMainBottomTableData', 'documentVersion') |
| | | handleModalClose() //æ æ³è¿ç»å
¥åºå¤ä¸ªçæ¬å æ¤å
¥åºæååå³å¯éåºçªå£ |
| | | } |
| | | } |
| | | this.uploading = false |
| | | } |
| | | }) |
| | | }) |
| | | }, |
| | | |
| | | /** |
| | | * å 餿件å表项æ¶è§¦å |
| | | * @param file æä»¶å¯¹è±¡ |
| | | */ |
| | | handleRemove(file) { |
| | | const index = this.fileList.indexOf(file) |
| | | const newFileList = this.fileList.slice() |
| | | newFileList.splice(index, 1) |
| | | this.fileList = newFileList |
| | | }, |
| | | |
| | | // æ§å¶æä»¶ä¸ä¼ çªå£å
³éå¹¶æ¸
空æä»¶å表 |
| | | handleModalClose() { |
| | | this.visible = false |
| | | this.fileList = [] |
| | | }, |
| | | |
| | | /** |
| | | * è®¾ç½®å¼¹çªæ é¢ |
| | | * @param modalTitle å¼¹çªæ é¢ |
| | | * @param docClassCode ææ¡£ç±»å |
| | | */ |
| | | setModalTitle(modalTitle, docClassCode) { |
| | | switch (docClassCode) { |
| | | case 'SEND': |
| | | this.title = modalTitle + 'ï¼åéï¼' |
| | | break |
| | | case 'REC': |
| | | this.title = modalTitle + 'ï¼æ¥æ¶ï¼' |
| | | break |
| | | } |
| | | }, |
| | | |
| | | triggerCorrespondingMethod({ methodName, modalTitle, treeNodeInfo, tableRowInfo }) { |
| | | if (this[methodName]) { |
| | | this.title = modalTitle |
| | | this[methodName](treeNodeInfo, tableRowInfo, modalTitle) |
| | | } |
| | | triggerCorrespondingMethod({ methodName, modalTitle, treeNodeInfo, tableRowInfo }) { |
| | | if (this[methodName]) { |
| | | this.title = modalTitle |
| | | this[methodName](treeNodeInfo, tableRowInfo, modalTitle) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="less"> |
| | | /deep/ .ant-btn-primary#custom-upload-button { |
| | | color: #fff; |
| | | background-color: #67C23A; |
| | | border-color: #67C23A; |
| | | /deep/ .ant-btn-primary#custom-upload-button { |
| | | color: #fff; |
| | | background-color: #67C23A; |
| | | border-color: #67C23A; |
| | | |
| | | &[disabled] { |
| | | color: rgba(0, 0, 0, 0.25); |
| | | background-color: #f5f5f5; |
| | | border-color: #d9d9d9; |
| | | } |
| | | &[disabled] { |
| | | color: rgba(0, 0, 0, 0.25); |
| | | background-color: #f5f5f5; |
| | | border-color: #d9d9d9; |
| | | } |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <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"> |
| | | <OEEAnalysisList :nodePeople='selectPeople' :nodeTree='selectEquipment' :Type="selectTypeTree"/> |
| | | </a-col> |
| | | </a-row> |
| | | </a-card> |
| | | </div> |
| | | |
| | | </template> |
| | | |
| | | <script> |
| | | import { JeecgListMixin } from '@/mixins/JeecgListMixin' |
| | | import BaseTree from '../common/BaseTree' |
| | | import OEEAnalysisList from './modules/OEEAnalysis/OEEAnalysisList' |
| | | import DepartTree from './modules/DepartList/DepartListTree/DepartTree' |
| | | import { mapActions } from 'vuex' |
| | | |
| | | export default { |
| | | name: 'OEEAnalysis', |
| | | components: { |
| | | BaseTree, |
| | | DepartTree, |
| | | OEEAnalysisList |
| | | }, |
| | | data() { |
| | | return { |
| | | activeKey: '1', |
| | | selectEquipmentId: '', |
| | | selectEquipment: {}, |
| | | selectPeople: {}, |
| | | selectTypeTree: '', |
| | | isDepartType: '' |
| | | } |
| | | }, |
| | | created() { |
| | | this.queryTreeData() |
| | | }, |
| | | methods: { |
| | | ...mapActions(['QueryDepartTree']), |
| | | queryTreeData() { |
| | | this.QueryDepartTree().then(res => { |
| | | if (res.success) { |
| | | this.isDepartType = res.result[0].value |
| | | } else { |
| | | // this.$message.warn(res.message) |
| | | this.$notification.warning({ |
| | | message: 'æ¶æ¯', |
| | | description: res.message |
| | | }) |
| | | } |
| | | }).finally(() => { |
| | | }) |
| | | }, |
| | | tabChange(val) { |
| | | this.activeKey = val |
| | | this.selectTypeTree = val |
| | | }, |
| | | changeSelectionNode(val) { |
| | | this.selectEquipment = val |
| | | this.selectTypeTree = '1' |
| | | }, |
| | | changeSelectionNodedd(val) { |
| | | this.selectPeople = val |
| | | this.selectTypeTree = '2' |
| | | } |
| | | } |
| | | |
| | | } |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <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"> |
| | | <PartsMatchingList :nodePeople='selectPeople' :nodeTree='selectEquipment' :Type="selectTypeTree"/> |
| | | </a-col> |
| | | </a-row> |
| | | </a-card> |
| | | </div> |
| | | |
| | | </template> |
| | | |
| | | <script> |
| | | import { JeecgListMixin } from '@/mixins/JeecgListMixin' |
| | | import BaseTree from '../common/BaseTree' |
| | | import PartsMatchingList from './modules/PartsMatchingManagement/PartsMatchingList' |
| | | import DepartTree from './modules/DepartList/DepartListTree/DepartTree' |
| | | import { mapActions } from 'vuex' |
| | | |
| | | export default { |
| | | name: 'PartsMatchingManagement', |
| | | components: { |
| | | BaseTree, |
| | | DepartTree, |
| | | PartsMatchingList |
| | | }, |
| | | data() { |
| | | return { |
| | | activeKey: '1', |
| | | selectEquipmentId: '', |
| | | selectEquipment: {}, |
| | | selectPeople: {}, |
| | | selectTypeTree: '', |
| | | isDepartType: '' |
| | | } |
| | | }, |
| | | created() { |
| | | this.queryTreeData() |
| | | }, |
| | | methods: { |
| | | ...mapActions(['QueryDepartTree']), |
| | | queryTreeData() { |
| | | this.QueryDepartTree().then(res => { |
| | | if (res.success) { |
| | | this.isDepartType = res.result[0].value |
| | | } else { |
| | | // this.$message.warn(res.message) |
| | | this.$notification.warning({ |
| | | message: 'æ¶æ¯', |
| | | description: res.message |
| | | }) |
| | | } |
| | | }).finally(() => { |
| | | }) |
| | | }, |
| | | tabChange(val) { |
| | | this.activeKey = val |
| | | this.selectTypeTree = val |
| | | }, |
| | | changeSelectionNode(val) { |
| | | this.selectEquipment = val |
| | | this.selectTypeTree = '1' |
| | | }, |
| | | changeSelectionNodedd(val) { |
| | | this.selectPeople = val |
| | | this.selectTypeTree = '2' |
| | | } |
| | | } |
| | | |
| | | } |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <a-modal title="计ç®OEE" :visible="visible" :width="550" @cancel="handleModalClose" @ok="handleComputeOee" |
| | | :maskClosable="false"> |
| | | <a-form-model :model="model" :labelCol="labelColLong" :wrapperCol="wrapperColLong"> |
| | | <a-row> |
| | | <a-col :span="24"> |
| | | <a-form-model-item label="æ¥æ"> |
| | | <a-range-picker v-model="dates" style="width: 100%" value-format="YYYY-MM-DD" |
| | | @change="dateParamChange"></a-range-picker> |
| | | </a-form-model-item> |
| | | </a-col> |
| | | </a-row> |
| | | </a-form-model> |
| | | </a-modal> |
| | | </template> |
| | | |
| | | <script> |
| | | import mdcApi from '@/api/mdc' |
| | | |
| | | export default { |
| | | name: 'ComputeOeeModal', |
| | | components: {}, |
| | | data() { |
| | | return { |
| | | visible: false, |
| | | model: {}, |
| | | dates: [], |
| | | labelColLong: { |
| | | xs: { span: 24 }, |
| | | sm: { span: 3 } |
| | | }, |
| | | wrapperColLong: { |
| | | xs: { span: 24 }, |
| | | sm: { span: 21 } |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | handleComputeOee() { |
| | | console.log('model', this.model) |
| | | if (this.dates.length === 0) { |
| | | this.$notification.warning({ |
| | | message: 'æ¶æ¯', |
| | | description: 'è¯·éæ©æ¶é´' |
| | | }) |
| | | return |
| | | } |
| | | |
| | | mdcApi.computeOeeApi(this.model) |
| | | .then(res => { |
| | | if (res.success) { |
| | | this.$notification.success({ |
| | | message: 'æ¶æ¯', |
| | | description: res.message |
| | | }) |
| | | this.visible = false |
| | | } else { |
| | | this.$notification.error({ |
| | | message: 'æ¶æ¯', |
| | | description: '计ç®å¤±è´¥' |
| | | }) |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | this.$notification.error({ |
| | | message: 'æ¶æ¯', |
| | | description: '计ç®å¤±è´¥' |
| | | }) |
| | | }) |
| | | }, |
| | | |
| | | dateParamChange(value1, value2) { |
| | | this.model.startTime = value2[0] |
| | | this.model.endTime = value2[1] |
| | | }, |
| | | |
| | | handleModalClose() { |
| | | this.visible = false |
| | | this.model = {} |
| | | this.dates = [] |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="device_list"> |
| | | <!-- æ¥è¯¢åºå --> |
| | | <div class="table-page-search-wrapper"> |
| | | <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="设å¤ç¼å·"> |
| | | <a-input placeholder="请è¾å
¥è®¾å¤ç¼å·" v-model="queryParam.equipmentId"/> |
| | | </a-form-item> |
| | | </a-col> |
| | | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
| | | <a-form-item label="æ¥æ"> |
| | | <a-range-picker v-model="dates" style="width: 100%" @change="dateParamChange"></a-range-picker> |
| | | </a-form-item> |
| | | </a-col> |
| | | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
| | | <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> |
| | | <!-- æ¥è¯¢åºå-END --> |
| | | |
| | | <!-- æä½æé®åºå --> |
| | | <div class="table-operator"> |
| | | <a-button type="primary" icon="download" @click="handleExportXls('OEE')">导åº</a-button> |
| | | <a-button type="primary" icon="edit" @click="handleComputeModalOpen">计ç®</a-button> |
| | | </div> |
| | | |
| | | <!-- tableåºå-begin --> |
| | | <div id="DeviceList" style="flex: 1;overflow: hidden"> |
| | | <a-table |
| | | ref="table" |
| | | size="middle" |
| | | :scroll="{x:'max-content',y:scrollY}" |
| | | bordered |
| | | rowKey="id" |
| | | :columns="columns" |
| | | :dataSource="dataSource" |
| | | :pagination="ipagination" |
| | | :loading="loading"> |
| | | <template slot="percent" slot-scope="text"> |
| | | {{text+'%'}} |
| | | </template> |
| | | </a-table> |
| | | </div> |
| | | |
| | | <ComputeOeeModal ref="computeOeeModalRef"/> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import moment from 'moment' |
| | | import { JeecgListMixin } from '@/mixins/JeecgListMixin' |
| | | import ComputeOeeModal from './ComputeOeeModal' |
| | | |
| | | export default { |
| | | name: 'OEEAnalysisList', |
| | | mixins: [JeecgListMixin], |
| | | components: { ComputeOeeModal }, |
| | | props: { nodeTree: '', Type: '', nodePeople: '' }, |
| | | data() { |
| | | return { |
| | | description: 'OEE页é¢', |
| | | disableMixinCreated: true, |
| | | /* å页忰 */ |
| | | ipagination: { |
| | | current: 1, |
| | | pageSize: 30, |
| | | pageSizeOptions: ['30', '50', '100'], |
| | | showTotal: (total, range) => { |
| | | return range[0] + '-' + range[1] + ' å
±' + total + 'æ¡' |
| | | }, |
| | | showQuickJumper: true, |
| | | showSizeChanger: true, |
| | | total: 0 |
| | | }, |
| | | dates: [moment().subtract(1, 'day'), moment()], |
| | | queryParam: {}, |
| | | // 表头 |
| | | columns: [ |
| | | { |
| | | title: '#', |
| | | dataIndex: '', |
| | | key: 'rowIndex', |
| | | width: 60, |
| | | align: 'center', |
| | | customRender: function(t, r, index) { |
| | | return parseInt(index) + 1 |
| | | } |
| | | }, |
| | | { |
| | | title: '设å¤ç¼å·', |
| | | align: 'center', |
| | | dataIndex: 'equipmentId', |
| | | width: 230 |
| | | }, |
| | | { |
| | | title: 'æ¥æ', |
| | | align: 'center', |
| | | dataIndex: 'theDate', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'æ¥å工使¶é´(min)', |
| | | align: 'center', |
| | | dataIndex: 'calendarLong', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: '计ååæºæ¶é´(min)', |
| | | align: 'center', |
| | | dataIndex: 'planCloseLong', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'è´è·æ¶é´(min)', |
| | | align: 'center', |
| | | dataIndex: 'loadLong', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'é计ååæºæ¶é´(min)', |
| | | align: 'center', |
| | | dataIndex: 'noplanCloseLong', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'å¼å¨æ¶é´(min)', |
| | | align: 'center', |
| | | dataIndex: 'actuateLong', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'æ¶é´å¼å¨ç', |
| | | align: 'center', |
| | | dataIndex: 'timeActuationRate', |
| | | width: 150, |
| | | scopedSlots: { customRender: 'percent' } |
| | | }, |
| | | { |
| | | title: 'ææè¿è¡æ¶é´(min)', |
| | | align: 'center', |
| | | dataIndex: 'effectiveRunLong', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'æ§è½å¼å¨ç', |
| | | align: 'center', |
| | | dataIndex: 'performanceRate', |
| | | width: 150, |
| | | scopedSlots: { customRender: 'percent' } |
| | | }, |
| | | { |
| | | title: 'å å·¥é¶ä»¶æ°é', |
| | | align: 'center', |
| | | dataIndex: 'processCount', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'åæ ¼é¶ä»¶æ°é', |
| | | align: 'center', |
| | | dataIndex: 'passCount', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: '䏿¬¡åæ ¼ç', |
| | | align: 'center', |
| | | dataIndex: 'passRate', |
| | | width: 150, |
| | | scopedSlots: { customRender: 'percent' } |
| | | }, |
| | | { |
| | | title: 'OEE', |
| | | align: 'center', |
| | | dataIndex: 'oee', |
| | | width: 150, |
| | | scopedSlots: { customRender: 'percent' } |
| | | } |
| | | ], |
| | | scrollY: 465, |
| | | url: { |
| | | list: '/mdc/mdcOeeInfo/list', |
| | | exportXlsUrl: '/mdc/mdcOeeInfo/exportXls' |
| | | } |
| | | } |
| | | }, |
| | | watch: { |
| | | Type(valmath) { |
| | | this.dataList = [] |
| | | this.queryParam.typeTree = valmath |
| | | // console.log(this.queryParam.typeTree) |
| | | }, |
| | | nodeTree(val) { //çå¬currSelected ååï¼å°åååçæ°å¼ä¼ éç» getCurrSelected äºä»¶ |
| | | if (JSON.stringify(val) != '{}') { |
| | | if (val.equipmentId) { |
| | | this.queryParam.parentId = '' |
| | | this.queryParam.equipmentId = val.equipmentId |
| | | } else { |
| | | this.queryParam.parentId = val.key |
| | | this.queryParam.equipmentId = '' |
| | | } |
| | | this.searchQuery() |
| | | } |
| | | }, |
| | | nodePeople(val) { |
| | | if (JSON.stringify(val) != '{}') { |
| | | if (val.equipmentId) { |
| | | this.queryParam.parentId = '' |
| | | this.queryParam.equipmentId = val.equipmentId |
| | | } else { |
| | | this.queryParam.parentId = val.key |
| | | this.queryParam.equipmentId = '' |
| | | } |
| | | this.searchQuery() |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | handleComputeModalOpen() { |
| | | this.$refs.computeOeeModalRef.visible = true |
| | | }, |
| | | |
| | | dateParamChange(v1, v2) { |
| | | this.queryParam.startTime = v2[0] |
| | | this.queryParam.endTime = v2[1] |
| | | this.dates = [v1[0], v1[1]] |
| | | }, |
| | | |
| | | searchReset() { |
| | | this.dates = [moment().subtract(1, 'day'), moment()] |
| | | this.queryParam = { |
| | | startTime: this.dates[0].format('YYYY-MM-DD'), |
| | | endTime: this.dates[1].format('YYYY-MM-DD') |
| | | } |
| | | this.loadData(1) |
| | | }, |
| | | |
| | | /** |
| | | * 彿µè§å¨å¯è§çªå£å°ºå¯¸åçæ¹åæ¶è§¦å |
| | | */ |
| | | 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 |
| | | } |
| | | }, |
| | | created() { |
| | | this.queryParam.startTime = this.dates[0].format('YYYY-MM-DD') |
| | | this.queryParam.endTime = this.dates[1].format('YYYY-MM-DD') |
| | | this.loadData() |
| | | }, |
| | | mounted() { |
| | | window.addEventListener('resize', this.handleWindowResize) |
| | | this.handleWindowResize() |
| | | }, |
| | | beforeDestroy() { |
| | | window.removeEventListener('resize', this.handleWindowResize) |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped> |
| | | @import '~@assets/less/common.less'; |
| | | |
| | | .device_list { |
| | | display: flex; |
| | | flex-direction: column; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | @media screen and (min-width: 1920px) { |
| | | .device_list { |
| | | height: 811px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (min-width: 1680px) and (max-width: 1920px) { |
| | | .device_list { |
| | | height: 811px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (min-width: 1400px) and (max-width: 1680px) { |
| | | .device_list { |
| | | height: 663px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (min-width: 1280px) and (max-width: 1400px) { |
| | | .device_list { |
| | | height: 564px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (max-width: 1280px) { |
| | | .device_list { |
| | | height: 564px !important; |
| | | } |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <a-spin :spinning="confirmLoading"> |
| | | <j-form-container :disabled="formDisabled"> |
| | | <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail"> |
| | | <a-row> |
| | | <a-col :span="24"> |
| | | <a-form-model-item label="设å¤ç»" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="equipmentIds"> |
| | | <a-input-search :readOnly="true" v-model="model.equipmentIds" |
| | | @search="deviceSearch" :disabled="disableSelectDevice" enter-button |
| | | placeholder="è¯·éæ©è®¾å¤"></a-input-search> |
| | | </a-form-model-item> |
| | | </a-col> |
| | | <a-col :span="24"> |
| | | <a-form-model-item label="é¶ä»¶å·" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="partId"> |
| | | <a-input placeholder="请è¾å
¥é¶ä»¶å·" v-model="model.partId" allowClear/> |
| | | </a-form-model-item> |
| | | </a-col> |
| | | <a-col :span="24"> |
| | | <a-form-model-item label="æ åå 工工æ¶(min)" :labelCol="labelCol" :wrapperCol="wrapperCol" |
| | | prop="standardProcessLong"> |
| | | <a-input-number :min="0" placeholder="请è¾å
¥æ åå 工工æ¶(min)" v-model="model.standardProcessLong" |
| | | @change="inputNumberChange"/> |
| | | </a-form-model-item> |
| | | </a-col> |
| | | <a-col :span="24"> |
| | | <a-form-model-item label="å å·¥é¶ä»¶æ°é" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="processCount"> |
| | | <a-input-number :min="0" v-model="model.processCount" placeholder="请è¾å
¥å å·¥é¶ä»¶æ°é" |
| | | @change="inputNumberChange"></a-input-number> |
| | | </a-form-model-item> |
| | | </a-col> |
| | | <a-col :span="24"> |
| | | <a-form-model-item label="åæ ¼é¶ä»¶æ°é" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="passCount"> |
| | | <a-input-number :min="0" v-model="model.passCount" placeholder="请è¾å
¥åæ ¼é¶ä»¶æ°é"></a-input-number> |
| | | </a-form-model-item> |
| | | </a-col> |
| | | <a-col :span="24"> |
| | | <a-form-model-item label="å å·¥æ»æ¶é¿" :labelCol="labelCol" :wrapperCol="wrapperCol"> |
| | | <a-input v-model="model.totalProcessLong" placeholder="å å·¥é¶ä»¶æ°é X æ åå 工工æ¶" readOnly></a-input> |
| | | </a-form-model-item> |
| | | </a-col> |
| | | <a-col :span="24"> |
| | | <a-form-model-item label="æ¥æ" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="theDate"> |
| | | <a-date-picker v-model="model.theDate" :disabled="disabled" format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD" style="width: 100%"></a-date-picker> |
| | | </a-form-model-item> |
| | | </a-col> |
| | | </a-row> |
| | | </a-form-model> |
| | | </j-form-container> |
| | | |
| | | <select-device-drawer ref="selectDeviceDrawer" @selectFinished="selectOK" :title="'éæ©è®¾å¤'"/> |
| | | </a-spin> |
| | | </template> |
| | | |
| | | <script> |
| | | import { httpAction, getAction } from '@/api/manage' |
| | | import SelectDeviceDrawer from '@/views/system/modules/SelectDeviceDrawer' |
| | | |
| | | export default { |
| | | name: 'PartsMatchingForm', |
| | | components: { SelectDeviceDrawer }, |
| | | props: { |
| | | //表åç¦ç¨ |
| | | disabled: { |
| | | type: Boolean, |
| | | default: false, |
| | | required: false |
| | | }, |
| | | disableSelectDevice: { |
| | | type: Boolean, |
| | | default: false |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | model: { |
| | | passCount: 0 |
| | | }, |
| | | labelCol: { |
| | | xs: { span: 24 }, |
| | | sm: { span: 5 } |
| | | }, |
| | | wrapperCol: { |
| | | xs: { span: 24 }, |
| | | sm: { span: 16 } |
| | | }, |
| | | confirmLoading: false, |
| | | validatorRules: { |
| | | equipmentIds: [ |
| | | { required: true, message: 'è¯·éæ©è®¾å¤!' } |
| | | ], |
| | | partId: [ |
| | | { required: true, message: '请è¾å
¥é¶ä»¶å·!' } |
| | | ], |
| | | standardProcessLong: [ |
| | | { required: true, message: '请è¾å
¥æ åå 工工æ¶(min)!' } |
| | | ], |
| | | processCount: [ |
| | | { required: true, message: '请è¾å
¥å å·¥é¶ä»¶æ°é!' } |
| | | ], |
| | | passCount: [ |
| | | { required: true, message: '请è¾å
¥åæ ¼é¶ä»¶æ°é!' } |
| | | ], |
| | | theDate: [ |
| | | { required: true, message: 'è¯·éæ©æ¥æ!' } |
| | | ] |
| | | }, |
| | | url: { |
| | | add: '/mdc/mdcPartProcessInfo/add', |
| | | edit: '/mdc/mdcPartProcessInfo/edit' |
| | | } |
| | | } |
| | | }, |
| | | computed: { |
| | | formDisabled() { |
| | | return this.disabled |
| | | } |
| | | }, |
| | | created() { |
| | | //å¤ä»½modelåå§å¼ |
| | | this.modelDefault = JSON.parse(JSON.stringify(this.model)) |
| | | }, |
| | | methods: { |
| | | add() { |
| | | this.edit(this.modelDefault) |
| | | }, |
| | | edit(record) { |
| | | this.model = Object.assign({}, { equipmentIds: record.equipmentId }, record) |
| | | console.log('model', this.model) |
| | | this.visible = true |
| | | }, |
| | | inputNumberChange() { |
| | | if (this.model.standardProcessLong && this.model.processCount) { |
| | | this.model.totalProcessLong = this.model.standardProcessLong * this.model.processCount |
| | | } |
| | | }, |
| | | submitForm() { |
| | | const that = this |
| | | // 触å表åéªè¯ |
| | | this.$refs.form.validate(valid => { |
| | | if (valid) { |
| | | that.confirmLoading = true |
| | | let httpUrl = '' |
| | | let method = 'post' |
| | | if (!this.model.id) { |
| | | httpUrl += this.url.add |
| | | } else { |
| | | httpUrl += this.url.edit |
| | | } |
| | | httpAction(httpUrl, this.model, method).then((res) => { |
| | | if (res.success) { |
| | | that.$notification.success({ |
| | | message: 'æ¶æ¯', |
| | | description: res.message |
| | | }) |
| | | that.$emit('ok') |
| | | } else { |
| | | that.$notification.warning({ |
| | | message: 'æ¶æ¯', |
| | | description: res.message |
| | | }) |
| | | } |
| | | }).finally(() => { |
| | | that.confirmLoading = false |
| | | }) |
| | | } |
| | | |
| | | }) |
| | | }, |
| | | deviceSearch() { |
| | | this.$refs.selectDeviceDrawer.visible = true |
| | | this.$refs.selectDeviceDrawer.selectedRowKeys = [] |
| | | this.$refs.selectDeviceDrawer.selectedRows = [] |
| | | this.$refs.selectDeviceDrawer.checkedKeys = this.model.equipmentIds ? this.model.equipmentIds.split(',') : [] |
| | | }, |
| | | /** |
| | | * 鿩已æè®¾å¤åç¹å»ç¡®å®æ¶è§¦å |
| | | * @param data 已鿩çè®¾å¤ |
| | | */ |
| | | selectOK(data) { |
| | | this.$set(this.model, 'equipmentIds', data.join(',')) |
| | | if (this.model.equipmentIds) this.$refs.form.clearValidate('equipmentIds') |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped lang="less"> |
| | | /deep/ .ant-input-number { |
| | | width: 100% !important; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="device_list"> |
| | | <!-- æ¥è¯¢åºå --> |
| | | <div class="table-page-search-wrapper"> |
| | | <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="设å¤ç¼å·"> |
| | | <a-input placeholder="请è¾å
¥è®¾å¤ç¼å·" v-model="queryParam.equipmentId"/> |
| | | </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.partId" allowClear/> |
| | | </a-form-item> |
| | | </a-col> |
| | | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
| | | <a-form-item label="æ¥æ"> |
| | | <a-range-picker v-model="dates" style="width: 100%" @change="dateParamChange"></a-range-picker> |
| | | </a-form-item> |
| | | </a-col> |
| | | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
| | | <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> |
| | | <!-- æ¥è¯¢åºå-END --> |
| | | |
| | | <!-- æä½æé®åºå --> |
| | | <div class="table-operator"> |
| | | <a-button @click="handleAdd" type="primary" icon="plus">æ°å¢</a-button> |
| | | <a-button type="primary" icon="download" @click="importTemplate('é¶ä»¶å 工管ç')">导å
¥æ¨¡æ¿</a-button> |
| | | <a-button type="primary" icon="download" @click="handleExportXls('é¶ä»¶å 工管ç')">导åº</a-button> |
| | | <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" |
| | | @change="handleImportExcel"> |
| | | <a-button type="primary" icon="import">导å
¥</a-button> |
| | | </a-upload> |
| | | |
| | | <a-dropdown v-if="selectedRowKeys.length > 0"> |
| | | <a-menu slot="overlay"> |
| | | <a-menu-item key="1" @click="batchDel"> |
| | | <a-icon type="delete"/> |
| | | å é¤ |
| | | </a-menu-item> |
| | | </a-menu> |
| | | <a-button style="margin-left: 8px"> æ¹éæä½ |
| | | <a-icon type="down"/> |
| | | </a-button> |
| | | </a-dropdown> |
| | | </div> |
| | | |
| | | <!-- tableåºå-begin --> |
| | | <div id="DeviceList" style="flex: 1;overflow: hidden"> |
| | | <a-table |
| | | ref="table" |
| | | size="middle" |
| | | :scroll="{x:'max-content',y:scrollY}" |
| | | bordered |
| | | rowKey="id" |
| | | :columns="columns" |
| | | :dataSource="dataSource" |
| | | :pagination="ipagination" |
| | | :loading="loading" |
| | | :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" |
| | | class="j-table-force-nowrap" |
| | | @change="handleTableChange"> |
| | | |
| | | <span slot="action" slot-scope="text, record"> |
| | | <a @click="handleEdit(record)">ç¼è¾</a> |
| | | |
| | | <a-divider type="vertical"/> |
| | | <a-dropdown> |
| | | <a class="ant-dropdown-link">æ´å¤ <a-icon type="down"/></a> |
| | | <a-menu slot="overlay"> |
| | | <a-menu-item> |
| | | <a @click="handleDetail(record)">详æ
</a> |
| | | </a-menu-item> |
| | | <a-menu-item> |
| | | <a-popconfirm title="ç¡®å®å é¤å?" @confirm="() => handleDelete(record.id)"> |
| | | <a>å é¤</a> |
| | | </a-popconfirm> |
| | | </a-menu-item> |
| | | </a-menu> |
| | | </a-dropdown> |
| | | </span> |
| | | |
| | | </a-table> |
| | | </div> |
| | | |
| | | <PartsMatchingModal ref="modalForm" @ok="modalFormOk"/> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import moment from 'moment' |
| | | import { JeecgListMixin } from '@/mixins/JeecgListMixin' |
| | | import PartsMatchingModal from './PartsMatchingModal' |
| | | |
| | | export default { |
| | | name: 'PartsMatchingList', |
| | | mixins: [JeecgListMixin], |
| | | components: { |
| | | PartsMatchingModal |
| | | }, |
| | | props: { nodeTree: '', Type: '', nodePeople: '' }, |
| | | data() { |
| | | return { |
| | | description: 'partsMatching管ç页é¢', |
| | | /* å页忰 */ |
| | | ipagination: { |
| | | current: 1, |
| | | pageSize: 30, |
| | | pageSizeOptions: ['30', '50', '100'], |
| | | showTotal: (total, range) => { |
| | | return range[0] + '-' + range[1] + ' å
±' + total + 'æ¡' |
| | | }, |
| | | showQuickJumper: true, |
| | | showSizeChanger: true, |
| | | total: 0 |
| | | }, |
| | | queryParam: {}, |
| | | disableMixinCreated: true, |
| | | dates: [moment().subtract(1, 'day'), moment()], |
| | | // 表头 |
| | | columns: [ |
| | | { |
| | | title: '#', |
| | | dataIndex: '', |
| | | key: 'rowIndex', |
| | | width: 60, |
| | | align: 'center', |
| | | customRender: function(t, r, index) { |
| | | return parseInt(index) + 1 |
| | | } |
| | | }, |
| | | { |
| | | title: 'æ¥æ', |
| | | align: 'center', |
| | | dataIndex: 'theDate', |
| | | width: 200 |
| | | }, |
| | | { |
| | | title: '设å¤ç¼å·', |
| | | align: 'center', |
| | | dataIndex: 'equipmentId', |
| | | width: 230 |
| | | }, |
| | | { |
| | | title: 'é¶ä»¶å·', |
| | | align: 'center', |
| | | dataIndex: 'partId', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'æ åå 工工æ¶(min)', |
| | | align: 'center', |
| | | dataIndex: 'standardProcessLong', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'å å·¥é¶ä»¶æ°é', |
| | | align: 'center', |
| | | dataIndex: 'processCount', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'åæ ¼é¶ä»¶æ°é', |
| | | align: 'center', |
| | | dataIndex: 'passCount', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'å å·¥æ»æ¶é¿', |
| | | align: 'center', |
| | | dataIndex: 'totalProcessLong', |
| | | width: 150 |
| | | }, |
| | | { |
| | | title: 'æä½', |
| | | dataIndex: 'action', |
| | | align: 'center', |
| | | fixed: 'right', |
| | | width: 150, |
| | | scopedSlots: { customRender: 'action' } |
| | | } |
| | | ], |
| | | scrollY: 465, |
| | | url: { |
| | | list: '/mdc/mdcPartProcessInfo/list', |
| | | delete: '/mdc/mdcPartProcessInfo/delete', |
| | | deleteBatch: '/mdc/mdcPartProcessInfo/deleteBatch', |
| | | exportXlsUrl: '/mdc/mdcPartProcessInfo/exportXls', |
| | | importExcelUrl: '/mdc/mdcPartProcessInfo/importExcel' |
| | | } |
| | | } |
| | | }, |
| | | watch: { |
| | | Type(valmath) { |
| | | this.dataList = [] |
| | | this.queryParam.typeTree = valmath |
| | | // console.log(this.queryParam.typeTree) |
| | | }, |
| | | nodeTree(val) { //çå¬currSelected ååï¼å°åååçæ°å¼ä¼ éç» getCurrSelected äºä»¶ |
| | | if (JSON.stringify(val) != '{}') { |
| | | if (val.equipmentId) { |
| | | this.queryParam.parentId = '' |
| | | this.queryParam.equipmentId = val.equipmentId |
| | | } else { |
| | | this.queryParam.parentId = val.key |
| | | this.queryParam.equipmentId = '' |
| | | } |
| | | this.searchQuery() |
| | | } |
| | | }, |
| | | nodePeople(val) { |
| | | if (JSON.stringify(val) != '{}') { |
| | | if (val.equipmentId) { |
| | | this.queryParam.parentId = '' |
| | | this.queryParam.equipmentId = val.equipmentId |
| | | } else { |
| | | this.queryParam.parentId = val.key |
| | | this.queryParam.equipmentId = '' |
| | | } |
| | | this.searchQuery() |
| | | } |
| | | } |
| | | }, |
| | | computed: { |
| | | importExcelUrl: function() { |
| | | return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}` |
| | | } |
| | | }, |
| | | methods: { |
| | | dateParamChange(v1, v2) { |
| | | this.queryParam.startTime = v2[0] |
| | | this.queryParam.endTime = v2[1] |
| | | this.dates = [v1[0], v1[1]] |
| | | }, |
| | | importTemplate(fileName) { |
| | | var a = document.createElement('a') |
| | | a.href = `/static/${fileName}.xls` |
| | | a.download = `${fileName}.xls` |
| | | a.style.display = 'none' |
| | | document.body.appendChild(a) |
| | | a.click() |
| | | a.remove() |
| | | }, |
| | | searchReset() { |
| | | this.dates = [moment().subtract(1, 'day'), moment()] |
| | | this.queryParam = { |
| | | startTime: this.dates[0].format('YYYY-MM-DD'), |
| | | endTime: this.dates[1].format('YYYY-MM-DD') |
| | | } |
| | | this.loadData(1) |
| | | }, |
| | | /** |
| | | * 彿µè§å¨å¯è§çªå£å°ºå¯¸åçæ¹åæ¶è§¦å |
| | | */ |
| | | 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 |
| | | } |
| | | }, |
| | | created() { |
| | | this.queryParam.startTime = this.dates[0].format('YYYY-MM-DD') |
| | | this.queryParam.endTime = this.dates[1].format('YYYY-MM-DD') |
| | | this.loadData() |
| | | }, |
| | | mounted() { |
| | | window.addEventListener('resize', this.handleWindowResize) |
| | | this.handleWindowResize() |
| | | }, |
| | | beforeDestroy() { |
| | | window.removeEventListener('resize', this.handleWindowResize) |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped> |
| | | @import '~@assets/less/common.less'; |
| | | |
| | | .device_list { |
| | | display: flex; |
| | | flex-direction: column; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | @media screen and (min-width: 1920px) { |
| | | .device_list { |
| | | height: 811px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (min-width: 1680px) and (max-width: 1920px) { |
| | | .device_list { |
| | | height: 811px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (min-width: 1400px) and (max-width: 1680px) { |
| | | .device_list { |
| | | height: 663px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (min-width: 1280px) and (max-width: 1400px) { |
| | | .device_list { |
| | | height: 564px !important; |
| | | } |
| | | } |
| | | |
| | | @media screen and (max-width: 1280px) { |
| | | .device_list { |
| | | height: 564px !important; |
| | | } |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <j-modal |
| | | :title="title" |
| | | :width="width" |
| | | :visible="visible" |
| | | switchFullscreen |
| | | @ok="handleOk" |
| | | :okButtonProps="{ class:{'jee-hidden': disableSubmit} }" |
| | | @cancel="handleCancel" |
| | | cancelText="å
³é"> |
| | | <PartsMatchingForm ref="realForm" @ok="submitCallback" :disabled="disableSubmit" |
| | | :disableSelectDevice="disableSelectDevice"/> |
| | | </j-modal> |
| | | </template> |
| | | |
| | | <script> |
| | | import PartsMatchingForm from './PartsMatchingForm' |
| | | |
| | | export default { |
| | | name: 'PartsMatchingModal', |
| | | components: { |
| | | PartsMatchingForm |
| | | }, |
| | | data() { |
| | | return { |
| | | title: '', |
| | | width: 800, |
| | | visible: false, |
| | | disableSubmit: false, |
| | | disableSelectDevice: false |
| | | } |
| | | }, |
| | | methods: { |
| | | add() { |
| | | this.visible = true |
| | | this.disableSelectDevice = false |
| | | this.$nextTick(() => { |
| | | this.$refs.realForm.add() |
| | | }) |
| | | }, |
| | | edit(record) { |
| | | this.visible = true |
| | | this.disableSelectDevice = true |
| | | this.$nextTick(() => { |
| | | this.$refs.realForm.edit(record) |
| | | }) |
| | | }, |
| | | close() { |
| | | this.$emit('close') |
| | | this.visible = false |
| | | }, |
| | | handleOk() { |
| | | this.$refs.realForm.submitForm() |
| | | }, |
| | | submitCallback() { |
| | | this.$emit('ok') |
| | | this.visible = false |
| | | }, |
| | | handleCancel() { |
| | | this.close() |
| | | } |
| | | } |
| | | } |
| | | </script> |