From 16d2a38e7bb7a31d6e355d031115a58bffd0109d Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期三, 26 七月 2023 15:01:39 +0800
Subject: [PATCH] 增加菜单管理中,从其他菜单克隆按钮功能、

---
 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java                         |    8 +
 Source/UBCS-WEB/src/views/system/menu.vue                                                                                |  290 +++++++++++++++++++++++++++++++++++++---
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java |    2 
 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java                    |   12 +
 Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/ButtonCloneVO.java                     |   18 ++
 Source/UBCS-WEB/vue.config.js                                                                                            |    4 
 Source/UBCS-WEB/src/api/system/menu.js                                                                                   |    6 
 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java                 |   40 +++++
 8 files changed, 350 insertions(+), 30 deletions(-)

diff --git a/Source/UBCS-WEB/src/api/system/menu.js b/Source/UBCS-WEB/src/api/system/menu.js
index 7547aa0..ba197bb 100644
--- a/Source/UBCS-WEB/src/api/system/menu.js
+++ b/Source/UBCS-WEB/src/api/system/menu.js
@@ -106,3 +106,9 @@
     topMenuId,
   }
 });
+
+export const cloneMenuButton = (data) => request({
+  url: '/api/ubcs-system/menu/cloneMenuButton',
+  method: 'post',
+  data: data
+});
\ No newline at end of file
diff --git a/Source/UBCS-WEB/src/views/system/menu.vue b/Source/UBCS-WEB/src/views/system/menu.vue
index bbc8ff1..710ca16 100644
--- a/Source/UBCS-WEB/src/views/system/menu.vue
+++ b/Source/UBCS-WEB/src/views/system/menu.vue
@@ -32,7 +32,7 @@
           size="small"
           icon="el-icon-connection"
           plain
-          @click="cloneButton">浠庡叾浠栬彍鍗曞厠闅嗘寜閽�
+          @click="cloneMenuButton">浠庡叾浠栬彍鍗曞厠闅嗘寜閽�
         </el-button>
       </template>
       <template slot-scope="scope" slot="menu">
@@ -52,25 +52,40 @@
         </div>
       </template>
     </avue-crud>
-
     <!-- 浠庡叾浠栬彍鍗曞厠闅嗘寜閽� -->
     <el-dialog title="浠庡叾浠栬彍鍗曞厠闅嗘寜閽�"
         append-to-body
-        :visible.sync="cloneButtonSettingBox"
-        width="800px"
-        style="height: 116vh; margin-top: -10vh;">
-        <avue-crud
-          :option="dialogeOption"
-          :table-loading="dialogLoading"
-          :data="useRangeData"
-          @refresh-change="refreshUseRangeChange">
+        :visible.sync="cloneOtherMenuButtons.cloneButtonSettingBox"
+        width="1100px"
+        @close="cleanCloneSelections"
+        style="height: 110vh; margin-top: -10vh;">
+        <avue-crud :option="cloneOtherMenuButtons.cloneOption"
+          :table-loading="cloneOtherMenuButtons.cloneLoading"
+          :data="cloneOtherMenuButtons.cloneData"
+          ref="cloneCrud"
+          @search-change="searchCloneChange"
+          @search-reset="searchCloneReset"
+          @selection-change="selectionCloneChange"
+          @row-click="clickRowCloneChange"
+          @refresh-change="refreshCloneChange"
+          @on-load="cloneOnLoad"
+          @tree-load="treeLoad">
+          <template slot-scope="{row}" slot="source">
+            <div style="text-align:center">
+              <i :class="row.source"/>
+            </div>
+          </template>
         </avue-crud>
-      </el-dialog>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="cloneButtonsToMenu">淇� 瀛�</el-button>
+          <el-button @click="cloneOtherMenuButtons.cloneButtonSettingBox = false">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
   </basic-container>
 </template>
 
 <script>
-  import {getLazyList, remove, update, add, getMenu} from "@/api/system/menu";
+  import {getLazyList, remove, update, add, getMenu ,cloneMenuButton} from "@/api/system/menu";
   import {mapGetters} from "vuex";
   import iconList from "@/config/iconList";
   import func from "@/util/func";
@@ -275,7 +290,130 @@
         // 浠庡叾浠栬彍鍗曞厠闅嗘寜閽�
         cloneOtherMenuButtons: {
           cloneButtonSettingBox: false,
-          
+          selectCloneButtons: [],
+          cloneOption: {
+            height: "auto",
+            menu: false,
+            addBtn: false,
+            lazy: true,
+            tip: false,
+            simplePage: true,
+            searchShow: true,
+            searchMenuSpan: 6,
+            dialogWidth: "60%",
+            tree: true,
+            border: true,
+            index: true,
+            selection: true,
+            columnBtn: false,
+            searchShowBtn: false,
+            menuWidth: 300,
+            dialogClickModal: false,
+            highlightCurrentRow: true, //琛岄�変腑鏃堕珮浜�
+            column: [
+              {
+                label: "鑿滃崟鍚嶇О",
+                prop: "name",
+                search: true,
+              },
+              {
+                label: "璺敱鍦板潃",
+                prop: "path",
+              },
+              {
+                label: "涓婄骇鑿滃崟",
+                prop: "parentId",
+                type: "tree",
+                hide: true,
+                addDisabled: false,
+                props: {
+                  label: "title"
+                },
+              },
+              {
+                label: "鑿滃崟鍥炬爣",
+                prop: "source",
+                type: "icon",
+                slot: true,
+                iconList: iconList,
+              },
+              {
+                label: "鑿滃崟缂栧彿",
+                prop: "code",
+                search: true,
+              },
+              {
+                label: "鑿滃崟绫诲瀷",
+                prop: "category",
+                type: "radio",
+                dicData: [
+                  {
+                    label: "鑿滃崟",
+                    value: 1
+                  },
+                  {
+                    label: "鎸夐挳",
+                    value: 2
+                  }
+                ],
+              },
+              {
+                label: "鑿滃崟鍒悕",
+                prop: "alias",
+                search: true,
+              },
+              {
+                label: "鏂扮獥鍙�",
+                prop: "isOpen",
+                type: "radio",
+                dicData: [
+                  {
+                    label: "鍚�",
+                    value: 1
+                  },
+                  {
+                    label: "鏄�",
+                    value: 2
+                  }
+                ],
+              },
+              {
+                label: "鑿滃崟鎺掑簭",
+                prop: "sort",
+                type: "number",
+              },
+              {
+                label: "璺敱缂撳瓨",
+                prop: "keepAlive",
+                type: "switch",
+                dicData: [
+                  {
+                    label: "鍚�",
+                    value: "false"
+                  },
+                  {
+                    label: "鏄�",
+                    value: "true"
+                  }
+                ],
+              },
+              {
+                label: "鑿滃崟澶囨敞",
+                prop: "remark",
+                type: "textarea",
+                span: 24,
+                minRows: 2,
+              }
+            ]
+          },
+          cloneLoading: false,
+          cloneData: [],
+          cloneQuery: {},
+          clonePage: {
+            pageSize: 10,
+            currentPage: 1,
+            total: 0,
+          },
         }
       };
     },
@@ -311,6 +449,108 @@
       }
     },
     methods: {
+
+      /** 浠庡叾浠栬彍鍗曞厠闅嗘寜閽� */
+      cloneMenuButton(){
+        if(this.selectionList.length != 1 || this.selectionList[0].category === 2){
+          this.$message({
+            type: "warning",
+            message: "璇烽�夋嫨涓�鏉¢潪鎸夐挳绫诲瀷鐨勬暟鎹�!"
+          });
+          return;
+        }
+        this.cloneOtherMenuButtons.cloneButtonSettingBox = true;
+      },
+      /** 鍏嬮殕鎸夐挳鍒伴�変腑鐨勮彍鍗曚笅 */
+      cloneButtonsToMenu(){
+        if(this.selectionList.length != 1){
+          this.$message({
+            type: "warning",
+            message: "瑕佸厠闅嗘寜閽殑鑿滃崟淇℃伅宸蹭涪澶憋紝璇烽噸鏂伴�夋嫨!"
+          });
+          return;
+        }
+        if(this.cloneOtherMenuButtons.selectCloneButtons.length <= 0){
+          this.$message({
+            type: "warning",
+            message: "璇烽�夋嫨瑕佸厠闅嗘寜閽暟鎹�!"
+          });
+          return;
+        }
+        this.$confirm("纭畾灏嗛�変腑鐨勬寜閽厠闅嗗埌銆�"+this.selectionList[0].name+"銆戣彍鍗曚腑?", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "info"
+        })
+        .then(() => {
+          let buttonIds = [];
+          let flag = true;
+          this.cloneOtherMenuButtons.selectCloneButtons.forEach(function(item) {
+            if(item.category != 2){
+              flag = false;
+            }else {
+              buttonIds.push(item.id);
+            }
+          });
+          // 閫夋嫨浜嗛潪鎸夐挳绫诲瀷鐨勬暟鎹�
+          if(!flag){
+            this.$message({
+              type: "warning",
+              message: "鍙兘閫夋嫨鎸夐挳绫诲瀷鐨勮〃鏍艰!"
+            });
+            return;
+          }
+          // console.log(buttonIds);
+          return cloneMenuButton({"menuId":this.selectionList[0].id,"buttonIds": buttonIds});
+        })
+        .then(res => {
+          this.$message({
+            type: res.data.success ? "success":"error",
+            message: res.data.msg,
+          });
+          this.cloneOtherMenuButtons.cloneButtonSettingBox = false;
+          // 鏁版嵁鍥炶皟杩涜鍒锋柊
+          this.onLoad(this.page);
+        });
+      },
+      /** 閫変腑琚厠闅嗙殑鎸夐挳鏃惰Е鍙� */
+      selectionCloneChange(list) {
+        this.cloneOtherMenuButtons.selectCloneButtons = list;
+        this.$refs.cloneCrud.setCurrentRow(this.cloneOtherMenuButtons.selectCloneButtons[list.length-1]);
+      },
+      clickRowCloneChange(row){
+        this.cloneOtherMenuButtons.selectCloneButtons.push(row);
+        this.$refs.cloneCrud.setCurrentRow(row);
+        this.$refs.cloneCrud.toggleRowSelection(row); //閫変腑褰撳墠琛�
+      },
+      /** 鍏抽棴瀵硅瘽妗嗘椂娓呯┖閫変腑鐨勫垪琛� */
+      cleanCloneSelections(){
+        this.cloneOtherMenuButtons.selectCloneButtons = [];
+        this.$refs.cloneCrud.toggleSelection();
+      },
+      cloneOnLoad(page, params = {}) {
+        this.cloneOtherMenuButtons.cloneLoading = true;
+        getLazyList(this.parentId, Object.assign(params, this.cloneOtherMenuButtons.cloneQuery)).then(res => {
+          this.cloneOtherMenuButtons.cloneData = res.data.data;
+          this.cloneOtherMenuButtons.cloneLoading = false;
+        });
+      },
+      searchCloneChange(params, done){
+        this.cloneOtherMenuButtons.cloneQuery = params;
+        this.parentId = '';
+        this.cloneOtherMenuButtons.clonePage.currentPage = 1;
+        this.cloneOnLoad(this.cloneOtherMenuButtons.clonePage, params);
+        done();
+      },
+      searchCloneReset(){
+        this.cloneOtherMenuButtons.cloneQuery = {};
+        this.parentId = 0;
+        this.cloneOnLoad(this.cloneOtherMenuButtons.clonePage);
+      },
+      refreshCloneChange(){
+        this.onLoad(this.cloneOtherMenuButtons.clonePage, this.cloneOtherMenuButtons.cloneQuery);
+      },
+
       initData() {
         getMenuTree().then(res => {
           const column = this.findObject(this.option.column, "parentId");
@@ -359,17 +599,17 @@
           cancelButtonText: "鍙栨秷",
           type: "warning"
         })
-          .then(() => {
-            return remove(row.id);
-          })
-          .then(() => {
-            this.$message({
-              type: "success",
-              message: "鎿嶄綔鎴愬姛!"
-            });
-            // 鏁版嵁鍥炶皟杩涜鍒锋柊
-            done(row);
+        .then(() => {
+          return remove(row.id);
+        })
+        .then(() => {
+          this.$message({
+            type: "success",
+            message: "鎿嶄綔鎴愬姛!"
           });
+          // 鏁版嵁鍥炶皟杩涜鍒锋柊
+          done(row);
+        });
       },
       handleDelete() {
         if (this.selectionList.length === 0) {
@@ -397,10 +637,6 @@
               message: "鎿嶄綔鎴愬姛!"
             });
           });
-      },
-      /** 浠庡叾浠栬彍鍗曞厠闅嗘寜閽� */
-      cloneButton(){
-        
       },
       searchReset() {
         this.query = {};
diff --git a/Source/UBCS-WEB/vue.config.js b/Source/UBCS-WEB/vue.config.js
index 0991057..ad43a75 100644
--- a/Source/UBCS-WEB/vue.config.js
+++ b/Source/UBCS-WEB/vue.config.js
@@ -26,10 +26,10 @@
     proxy: {
       '/api': {
         //鏈湴鏈嶅姟鎺ュ彛鍦板潃
-        // target: 'http://localhost:37000',
+        target: 'http://localhost:37000',
         // target: 'http://192.168.1.51:37000',
         // target: 'http://192.168.1.46:37000',
-        target: 'http://dev.vci-tech.com:37000',
+        // target: 'http://dev.vci-tech.com:37000',
         // target: 'http://192.168.1.51:37000/',
         // target: 'http://192.168.1.104:37000',
         // target: 'http://192.168.1.63:37000',
diff --git a/Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/ButtonCloneVO.java b/Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/ButtonCloneVO.java
new file mode 100644
index 0000000..75bc58c
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/ButtonCloneVO.java
@@ -0,0 +1,18 @@
+package com.vci.ubcs.system.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author ludc
+ * @date 2023/7/26 12:11
+ */
+@Data
+public class ButtonCloneVO {
+
+	private Long menuId;
+
+	private List<String> buttonIds;
+
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java
index 82ae965..0023217 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java
@@ -712,7 +712,7 @@
 			return dataGrid;
 		}
 		//杩欎釜涓氬姟绫诲瀷涓嬬殑鎵�鏈夊睘鎬�
-		R<BtmTypeVO> btmTypeVOR = btmTypeClient.getAllAttributeByBtmOid(codeClassifyTemplateDO.getBtmTypeId());
+		R<BtmTypeVO> btmTypeVOR = btmTypeClient.getAllAttributeByBtmId(codeClassifyTemplateDO.getBtmTypeId());
 		if(!btmTypeVOR.isSuccess()){
 			throw new ServiceException("涓氬姟绫诲瀷feign璋冪敤閿欒锛�");
 		}
diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java
index 6204bfc..92e402f 100644
--- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java
+++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java
@@ -24,6 +24,7 @@
 import com.vci.ubcs.system.entity.TopMenu;
 import com.vci.ubcs.system.service.IMenuService;
 import com.vci.ubcs.system.service.ITopMenuService;
+import com.vci.ubcs.system.vo.ButtonCloneVO;
 import com.vci.ubcs.system.vo.CheckedTreeVO;
 import com.vci.ubcs.system.vo.GrantTreeVO;
 import com.vci.ubcs.system.vo.MenuVO;
@@ -285,4 +286,15 @@
 		}
 		return R.data(menuService.authRoutes(user));
 	}
+
+	/**
+	 * 鍏嬮殕鍏朵粬鑿滃崟涓嬫寜閽�
+	 * @param buttonCloneVO 瑕佸厠闅嗙殑鑿滃崟鎸夐挳涓婚敭 琚厠闅嗙殑鎸夐挳涓婚敭
+	 * @return
+	 */
+	@PostMapping("/cloneMenuButton")
+	public R cloneMenuButton(@RequestBody ButtonCloneVO buttonCloneVO) {
+		return menuService.cloneMenuButton(buttonCloneVO.getMenuId(), buttonCloneVO.getButtonIds());
+	}
+
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java
index 48cc81b..8c799fb 100644
--- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java
+++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java
@@ -182,4 +182,12 @@
 	 */
 	void handleKeepAlive(List<MenuVO> childMenu);
 
+	/**
+	 * 鍏嬮殕鍏朵粬鑿滃崟涓嬫寜閽�
+	 * @param menuId 瑕佸厠闅嗙殑鑿滃崟鎸夐挳涓婚敭
+	 * @param buttonIds 琚厠闅嗙殑鎸夐挳涓婚敭
+	 * @return
+	 */
+	R cloneMenuButton(Long menuId, List<String> buttonIds);
+
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java
index 07612e6..aa566ac 100644
--- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java
@@ -323,4 +323,44 @@
 		});
 	}
 
+	/**
+	 * 鍏嬮殕鍏朵粬鑿滃崟涓嬫寜閽�
+	 * @param menuId 瑕佸厠闅嗙殑鑿滃崟鎸夐挳涓婚敭
+	 * @param buttonIds 琚厠闅嗙殑鎸夐挳涓婚敭
+	 * @return
+	 */
+	@Override
+	public R cloneMenuButton(Long menuId, List<String> buttonIds) {
+		if(Func.isEmpty(menuId)){
+			return R.fail("瑕佸厠闅嗙殑鑿滃崟涓婚敭涓嶈兘涓虹┖锛�");
+		}
+		if(buttonIds.isEmpty() || buttonIds.size() <= 0){
+			return R.fail("琚厠闅嗙殑鎸夐挳涓婚敭涓嶈兘涓虹┖锛�");
+		}
+		// 鍏堟牴鎹富閿煡璇㈠嚭鎵�鏈夋寜閽殑淇℃伅
+		List<Menu> buttons = this.listByIds(buttonIds);
+		List<Menu> newButtons = new ArrayList<>();
+		List<String> addButtonCodes = new ArrayList();
+		buttons.parallelStream().forEach(item->{
+			// 鍒ゆ柇鏄惁涓烘寜閽紝闈炴寜閽笉澶勭悊
+			if(item.getCategory().equals(2)){
+				// 鏀瑰彉鐖惰妭鐐逛俊鎭�
+				item.setParentId(menuId);
+				// 灏嗕富閿祴绌�
+				item.setId(null);
+				addButtonCodes.add(item.getCode());
+				newButtons.add(item);
+			}
+		});
+		//妫�楠屾槸鍚﹂噸澶嶈彍鍗曞埆鍚嶏紝鍙牎楠屽悓涓�鐖跺垎绫昏彍鍗曚笅鐨勭紪鍙锋槸鍚﹂噸澶�
+		LambdaQueryWrapper<Menu> menuQueryWrapper = Wrappers.<Menu>lambdaQuery()
+			.eq(Menu::getParentId,menuId)
+			.and(a -> a.in( Menu::getCode, addButtonCodes));
+		Long cnt = baseMapper.selectCount(menuQueryWrapper);
+		if (cnt > 0L) {
+			return R.fail("璇ヨ彍鍗曚笅宸插瓨鍦ㄧ殑缂栧彿涓庤鍏嬮殕鐨勬寜閽紪鍙峰瓨鍦ㄩ噸澶�!");
+		}
+		return this.saveBatch(newButtons) ? R.success("鎸夐挳鍏嬮殕鎴愬姛锛�"):R.fail("鎸夐挳鍏嬮殕澶辫触锛�");
+	}
+
 }

--
Gitblit v1.9.3