From a95bec239fd7599b4c8766eff35c3d96e813cb25 Mon Sep 17 00:00:00 2001 From: lyh <925863403@qq.com> Date: 星期四, 17 四月 2025 15:27:24 +0800 Subject: [PATCH] 新增检索电子样板 --- src/views/dnc/base/modules/ProductStructure/Document/NcDocumentSearchModal.vue | 507 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue | 9 src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue | 4 3 files changed, 517 insertions(+), 3 deletions(-) diff --git a/src/views/dnc/base/modules/ProductStructure/Document/NcDocumentSearchModal.vue b/src/views/dnc/base/modules/ProductStructure/Document/NcDocumentSearchModal.vue new file mode 100644 index 0000000..e1acbe1 --- /dev/null +++ b/src/views/dnc/base/modules/ProductStructure/Document/NcDocumentSearchModal.vue @@ -0,0 +1,507 @@ +<template> + <a-modal width="75%" :title="title" :visible="visible" @cancel="visible=false" :maskClosable="false" centered + @ok="handleAssignDocumentToDevice"> + <div class="tabs-container"> + <div style="width: 72%"> + <a-tabs> + <a-tab-pane tab="鏂囨。鍒楄〃"> + <div class="table-page-search-wrapper"> + <a-form layout="inline" @keyup.enter.native="searchQuery"> + <a-row :gutter="24"> + <a-col :md="7" :sm="7"> + <a-form-item label="鏂囦欢鍚嶇О"> + <a-input placeholder="璇疯緭鍏ユ枃浠跺悕绉�" v-model="queryParam.docName" allow-clear></a-input> + </a-form-item> + </a-col> + + <a-col :md="11" :sm="11"> + <a-form-item label="涓婁紶鏃堕棿"> + <a-range-picker v-model="date" value-format="YYYY-MM-DD" + @change="handleDateChange" allow-clear></a-range-picker> + </a-form-item> + </a-col> + + <a-col :md="7" :sm="7"> + <a-form-item label="鑺傜偣鍚嶇О"> + <a-input placeholder="璇疯緭鍏ヨ妭鐐瑰悕绉�" v-model="queryParam.treeName" allow-clear></a-input> + </a-form-item> + </a-col> + + <a-col :md="7" :sm="7"> + <a-form-item label="鑺傜偣浠e彿"> + <a-input placeholder="璇疯緭鍏ヨ妭鐐逛唬鍙�" v-model="queryParam.treeCode" allow-clear></a-input> + </a-form-item> + </a-col> + + <a-col :md="7" :sm="7"> + <a-form-item label="鏉愯川"> + <a-input placeholder="璇疯緭鍏ユ潗璐�" v-model="queryParam.structureType" allow-clear></a-input> + </a-form-item> + </a-col> + + <a-col :md="4" :sm="4"> + <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button> + </a-col> + </a-row> + </a-form> + </div> + + + <a-table :columns="columns" :data-source="dataSource" bordered :pagination="false" :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys,selectedRows:selectionRows, onChange: onSelectChange}" + @change="handleTableChange" + :scroll="{y:456}" :size="size" rowKey="docId"> + + </a-table> + </a-tab-pane> + </a-tabs> + </div> + + <div style="width: 25%"> + <a-tabs> + <a-tab-pane tab="璁惧鍒楄〃"> + <a-spin :spinning="spinning"> + <div style="display: flex;flex-direction: column;"> + <div style="display: flex"> + <a-input placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�" allowClear v-model="searchInput" + @change="handleSearchInputChange"/> + <a-button type="primary" @click="isExpandAllTreeNode=!isExpandAllTreeNode" style="margin: 0 8px"> + 灞曞紑/鎶樺彔 + </a-button> + </div> + + <!--浜у搧缁撴瀯鏍�--> + <div style="overflow:auto;margin-top: 10px;height: 400px"> + <a-tree blockNode checkable :checkedKeys="checkedKeys" :expandedKeys.sync="expandedKeys" + :autoExpandParent="autoExpandParent" @select="handleTreeNodeSelect" + :treeData="treeDataSource" @check="handleTreeNodeCheck" @expand="handleTreeNodeExpand"> + <template slot="title" slot-scope="{ title, parentId, entity, key:treeKey,type}"> + <span v-if="title.indexOf(searchValue) > -1">{{ title.substr(0, title.indexOf(searchValue)) }}<span + class="replaceSearch">{{ + searchValue + }}</span>{{ title.substr(title.indexOf(searchValue) + searchValue.length) }}</span> + <span v-else>{{ title }}</span> + </template> + </a-tree> + </div> + + <div> + <a-form> + <a-form-item label="鎸囨淳鍘熷洜"> + <a-textarea v-model="queryParam.applyReason" rows="3" style="resize: none"></a-textarea> + </a-form-item> + </a-form> + </div> + </div> + </a-spin> + </a-tab-pane> + </a-tabs> + </div> + </div> + </a-modal> +</template> + +<script> +import { getAction } from '@/api/manage' +import dncApi from '@/api/dnc' +import { JeecgListMixin } from '@/mixins/JeecgListMixin' + +export default { + name: 'NcDocumentAssignModal', + components: {}, + mixins: [JeecgListMixin], + props: { + currentDocumentInfo: { + type: Object + }, + size: { + type: String + } + }, + data() { + return { + disableMixinCreated: true, + visible: false, + title: '', + columns: [ + { + title: '搴忓彿', + dataIndex: 'rowIndex', + key: 'rowIndex', + width: 50, + align: 'center', + customRender: function(t, r, index) { + return parseInt(index) + 1 + } + }, + { + title: '鑺傜偣鍚嶇О', + dataIndex: 'nodeName', + align: 'center', + width: 80, + sorter: false + }, + { + title: '鑺傜偣浠e彿', + dataIndex: 'nodeCode', + align: 'center', + width: 80, + sorter: false + }, + { + title: '鏂囦欢鍚嶇О', + dataIndex: 'docName', + key: 'docName', + align: 'center', + width: 200, + sorter: true + }, + { + title: '鍑哄簱鐘舵��', + dataIndex: 'pullStatus_dictText', + key: 'pullStatus', + align: 'center', + width: 100, + filters: [ + { text: '鏈嚭搴�', value: 1 }, + { text: '宸插嚭搴�', value: 2 } + ] + }, + { + title: '鐘� 鎬�', + dataIndex: 'docDispatchStatus_dictText', + key: 'docDispatchStatus', + align: 'center', + width: 60, + filters: [ + { text: '缂栧埗', value: 1 }, + { text: '鏍″', value: 2 }, + { text: '鎵瑰噯', value: 3 }, + { text: '璇曞垏', value: 4 }, + { text: '瀹氬瀷', value: 5 } + ] + }, + { + title: '鍒涘缓鏃堕棿', + dataIndex: 'createTime', + align: 'center', + width: 150, + sorter: true + } + ], + searchValue: '', + searchInput: '', + spinning: false, + treeDataSource: [], + allTreeKeys: [], + checkedKeys: [], + expandedKeys: [], + autoExpandParent: true, + isExpandAllTreeNode: true, + date: [], + url: { + list: '/nc/product/query' + } + } + }, + watch: { + visible: { + handler(value) { + if (value) { + this.resetData() + this.loadData() + this.getDocumentAssignDeviceTreeByApi() + } + } + }, + isExpandAllTreeNode: { + handler(value) { + if (value) this.expandedKeys = this.allTreeKeys + else this.expandedKeys = [] + } + } + }, + created() { + this.$bus.$on('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod) + }, + methods: { + handleSearch() { + this.visible = true + }, + // 鑾峰彇褰撳墠瀵瑰簲鏂囨。鍒楄〃 + loadData() { + this.dataSource = [] + if (!this.url.list) { + this.$message.error('璇疯缃畊rl.list灞炴��!') + return + } + var params = this.getQueryParams()//鏌ヨ鏉′欢 + if (!params) return false + params.attributionType = this.currentDocumentInfo.type + params.attributionId = this.currentDocumentInfo.key + this.loading = true + getAction(this.url.list, params).then((res) => { + if (res.success) this.dataSource = res.result + else this.$message.warning(res.message) + }).finally(() => { + this.loading = false + }) + }, + + // 鑾峰彇DNC璁惧鏍� + getDocumentAssignDeviceTreeByApi() { + this.spinning = 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.allTreeKeys + } else { + this.$message.warn(res.message) + } + }) + .finally(() => { + this.spinning = false + }) + }, + + // 鏃堕棿閫夋嫨鍣ㄩ�夋嫨瀹屾垚鍚庤Е鍙� + handleDateChange(value) { + this.queryParam.startTime = value[0] + this.queryParam.endTime = value[1] + }, + + /** + * 琛ㄦ牸鍒嗛〉銆佹帓搴忔敼鍙樸�佺瓫閫夋椂瑙﹀彂 + * @param pagination 鍒嗛〉鍣ㄩ�夐」 + * @param filters 绛涢�夐�夐」 + * @param sorter 鎺掑簭閫夐」 + */ + handleTableChange(pagination, filters, sorter) { + if (sorter.order) { + this.isorter.column = sorter.field + this.isorter.order = sorter.order === 'ascend' ? 'asc' : 'desc' + } else { + this.isorter.column = 'createTime' + this.isorter.order = 'desc' + } + for (let key in filters) { + this.filters[key] = filters[key].join(',') + } + this.loadData() + }, + + // 鎸囨淳鍒拌澶囩獥鍙g偣鍑荤‘瀹氭寚娲捐澶囧悗瑙﹀彂 + handleAssignDocumentToDevice() { + const { + checkedKeys, + selectedRowKeys, + selectionRows, + dataList, + $confirm, + $notification, + currentDocumentInfo, + queryParam: { applyReason }, + $destroyAll, + $bus + } = this + const { attributionId, attributionType } = currentDocumentInfo + const paramsArray = [] + // 杩囨护杞﹂棿key浠呮斁鍏ヨ澶噆ey + const treeCheckedDeviceKeys = [] + checkedKeys.forEach(checkedKey => { + const device = dataList.find(item => item.key === checkedKey && item.type === 2) + if (device) treeCheckedDeviceKeys.push(device.key) + }) + + if (treeCheckedDeviceKeys.length === 0 || selectedRowKeys.length === 0) { + $notification.warning({ + message: '娑堟伅', + description: '璇烽�夋嫨璁惧鎴栨枃妗�' + }) + return + } + + $confirm({ + title: '鎻愮ず', + content: `纭鎻愪氦鍚楋紵`, + okText: '纭', + cancelText: '鍙栨秷', + onOk: () => { + // 鍙岄噸寰幆纭畾姣忎竴缁勮澶囦笌鏂囨。鐨勫弬鏁� + treeCheckedDeviceKeys.forEach(deviceId => { + selectionRows.forEach(({ docId, publishFileId ,attributionId,attributionType}) => { + paramsArray.push({ + docId, + deviceId, + fileId: publishFileId, + attributionId, + attributionType, + applyReason + }) + }) + }) + + paramsArray.forEach(item => { + dncApi.assignDocumentToDeviceApi(item) + .then(res => { + if (res.success) { + $bus.$emit('reloadMainBottomTableData', 'useDocumentEquipment') + $notification.success({ + message: '娑堟伅', + description: res.message + }) + } else { + $notification.error({ + message: '娑堟伅', + description: res.message + }) + } + }) + .catch(err => { + $notification.error({ + message: '娑堟伅', + description: err.message + }) + }) + .finally(() => { + $destroyAll() + }) + }) + }, + onCancel: () => { + $destroyAll() + } + }) + }, + + /* 杈撳叆鏌ヨ鍐呭鍙樺寲鏃惰Е鍙� */ + handleSearchInputChange() { + let search = this.searchInput + console.log('data', this.dataList) + console.log('search', search) + let 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) + Object.assign(this, { + expandedKeys, + searchValue: search, + autoExpandParent: true + }) + }, + + /** + * 鏍戣妭鐐瑰睍寮�鍚堝苟鏃惰Е鍙� + * @param expandedKeys 灞曞紑椤筴ey + */ + handleTreeNodeExpand(expandedKeys) { + this.expandedKeys = expandedKeys + this.autoExpandParent = false + }, + + /** + * 鏍戣妭鐐瑰閫夋閫変腑鏃惰Е鍙� + * @param selectedKeys 閫変腑鑺傜偣key + * @param {node} node 鑺傜偣瀵硅薄 + */ + handleTreeNodeCheck(checkedKeys, { node }) { + let record = node.dataRef + this.checkedKeys = checkedKeys + }, + + /** + * 鏍戣妭鐐归�変腑鏃惰Е鍙戯紙妯℃嫙鏍戣妭鐐瑰閫夋閫変腑鏃剁殑鏁堟灉锛� + * @param selectedKeys 閫変腑鑺傜偣key + * @param {node} node 鑺傜偣瀵硅薄 + */ + handleTreeNodeSelect(selectedKeys, { node }) { + node.$el.childNodes[1].click() + }, + + /** + * 閫掑綊鑾峰緱杈撳叆椤圭殑鐖剁骇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 + console.log('parentKey', parentKey) + } 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 + const type = node.type + this.dataList.push({ key, title, type }) + this.allTreeKeys.push(key) + if (node.children) this.generateList(node.children) + } + }, + + resetData() { + this.searchInput = '' + this.expandedKeys = [] + this.selectedRowKeys = [] + this.selectionRows = {} + this.checkedKeys = [] + this.filters = {} + this.isorter = Object.assign({}, this.defaultSorter) + }, + triggerCorrespondingMethod({ methodName, modalTitle }) { + if (this[methodName]) { + this[methodName]() + this.title = modalTitle + } + } + } +} +</script> + +<style scoped lang="less"> +/deep/ .ant-modal { + .tabs-container { + display: flex; + justify-content: space-between; + + .replaceSearch { + color: #40a9ff; + font-weight: bold; + background-color: rgb(204, 204, 204); + } + } + +} + +::-webkit-scrollbar { + width: 8px; +} +</style> \ No newline at end of file diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue index 7e5bd4b..a734005 100644 --- a/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue +++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue @@ -61,6 +61,8 @@ <ProcessStepModal :currentTreeNodeInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/> <!--鏉冮檺閰嶇疆寮圭獥--> <AssignPermissionModal :currentTreeNodeInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/> + <!--妫�绱㈢數瀛愭ā鏉垮脊绐�--> + <NcDocumentSearchModal :currentDocumentInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/> <!--浜у搧缁撴瀯鏍戝熀鏈彸閿彍鍗�(绌虹櫧澶勮Е鍙�)--> <ProductStructureBaseContextMenu ref="baseContextmenuRef"/> </a-card> @@ -78,8 +80,8 @@ 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' +import ProductStructureBaseContextMenu from '@views/dnc/base/modules/ProductStructure/ProductStructureBaseContextMenu.vue' +import NcDocumentSearchModal from '@views/dnc/base/modules/ProductStructure/Document/NcDocumentSearchModal.vue' export default { name: 'ProductStructureTree', @@ -93,7 +95,8 @@ PartModal, ComponentModal, ProductModal, - ProductStructureTreeContextMenu + ProductStructureTreeContextMenu, + NcDocumentSearchModal }, data() { return { diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue index 6e4eacb..36b9b8a 100644 --- a/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue +++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue @@ -40,6 +40,7 @@ { label: '缂栬緫浜у搧淇℃伅', code: 'product_edit', icon: 'edit', isCommonMethod: false }, // { label: '瀵煎嚭鏂囨。', code: 'product_export', icon: 'export', isCommonMethod: true }, { label: '瀵煎叆鍏朵粬鏂囨。', code: 'product_import', icon: 'import', isCommonMethod: true }, + { label: '妫�绱㈢數瀛愭牱鏉�', code: 'product_search', icon: 'search', isCommonMethod: true }, { label: '鍒犻櫎', code: 'product_delete', icon: 'delete', isCommonMethod: true }, { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true } ], @@ -51,6 +52,7 @@ { label: '缂栬緫閮ㄤ欢淇℃伅', code: 'component_edit', icon: 'edit', isCommonMethod: false }, // { label: '瀵煎嚭鏂囨。', code: 'component_export', icon: 'export', isCommonMethod: true }, { label: '瀵煎叆鍏朵粬鏂囨。', code: 'component_import', icon: 'import', isCommonMethod: true }, + { label: '妫�绱㈢數瀛愭牱鏉�', code: 'component_search', icon: 'search', isCommonMethod: true }, { label: '鍒犻櫎', code: 'component_delete', icon: 'delete', isCommonMethod: true }, { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true } ], @@ -62,6 +64,7 @@ { label: '缂栬緫闆朵欢淇℃伅', code: 'parts_edit', icon: 'edit', isCommonMethod: false }, // { label: '瀵煎嚭鏂囨。', code: 'parts_export', icon: 'export', isCommonMethod: true }, { label: '瀵煎叆鍏朵粬鏂囨。', code: 'parts_import', icon: 'import', isCommonMethod: true }, + { label: '妫�绱㈢數瀛愭牱鏉�', code: 'parts_search', icon: 'search', isCommonMethod: true }, { label: '鍒犻櫎', code: 'parts_delete', icon: 'delete', isCommonMethod: true }, { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true } ], @@ -71,6 +74,7 @@ { 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_search', icon: 'search', isCommonMethod: true }, { label: '鍒犻櫎', code: 'version_delete', icon: 'delete', isCommonMethod: true }, { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true } ], -- Gitblit v1.9.3