Explorar el Código

部门管理支持批量保存排序

RuoYi hace 3 meses
padre
commit
01fd7be61a

+ 14 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java

@@ -1,6 +1,7 @@
 package com.ruoyi.web.controller.system;
 
 import java.util.List;
+import java.util.Map;
 import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -111,6 +112,19 @@ public class SysDeptController extends BaseController
     }
 
     /**
+     * 保存部门排序
+     */
+    @Log(title = "保存部门排序", businessType = BusinessType.UPDATE)
+    @PutMapping("/updateSort")
+    public AjaxResult updateSort(@RequestBody Map<String, String> params)
+    {
+        String[] deptIds = params.get("deptIds").split(",");
+        String[] orderNums = params.get("orderNums").split(",");
+        deptService.updateDeptSort(deptIds, orderNums);
+        return success();
+    }
+
+    /**
      * 删除部门
      */
     @PreAuthorize("@ss.hasPermi('system:dept:remove')")

+ 7 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java

@@ -109,6 +109,13 @@ public interface SysDeptMapper
     public int updateDeptChildren(@Param("depts") List<SysDept> depts);
 
     /**
+     * 保存部门排序
+     *
+     * @param dept 部门信息
+     */
+    public void updateDeptSort(SysDept dept);
+
+    /**
      * 删除部门管理信息
      * 
      * @param deptId 部门ID

+ 8 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java

@@ -115,6 +115,14 @@ public interface ISysDeptService
     public int updateDept(SysDept dept);
 
     /**
+     * 保存部门排序
+     *
+     * @param deptIds 部门ID数组
+     * @param orderNums 排序数组
+     */
+    public void updateDeptSort(String[] deptIds, String[] orderNums);
+
+    /**
      * 删除部门管理信息
      * 
      * @param deptId 部门ID

+ 27 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java

@@ -6,6 +6,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import com.ruoyi.common.annotation.DataScope;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.TreeSelect;
@@ -281,6 +282,32 @@ public class SysDeptServiceImpl implements ISysDeptService
     }
 
     /**
+     * 保存部门排序
+     *
+     * @param deptIds 部门ID数组
+     * @param orderNums 排序数组
+     */
+    @Override
+    @Transactional
+    public void updateDeptSort(String[] deptIds, String[] orderNums)
+    {
+        try
+        {
+            for (int i = 0; i < deptIds.length; i++)
+            {
+                SysDept dept = new SysDept();
+                dept.setDeptId(Convert.toLong(deptIds[i]));
+                dept.setOrderNum(Convert.toInt(orderNums[i]));
+                deptMapper.updateDeptSort(dept);
+            }
+        }
+        catch (Exception e)
+        {
+            throw new ServiceException("保存排序异常,请联系管理员");
+        }
+    }
+
+    /**
      * 删除部门管理信息
      * 
      * @param deptId 部门ID

+ 5 - 1
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml

@@ -152,8 +152,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
 	</update>
 	
+	<update id="updateDeptSort" parameterType="SysDept">
+		update sys_dept set order_num = #{orderNum} where dept_id = #{deptId}
+	</update>
+	
 	<delete id="deleteDeptById" parameterType="Long">
 		update sys_dept set del_flag = '2' where dept_id = #{deptId}
 	</delete>
 
-</mapper> 
+</mapper>

+ 9 - 0
ruoyi-ui/src/api/system/dept.js

@@ -43,6 +43,15 @@ export function updateDept(data) {
   })
 }
 
+// 保存部门排序
+export function updateDeptSort(data) {
+  return request({
+    url: '/system/dept/updateSort',
+    method: 'put',
+    data: data
+  })
+}
+
 // 删除部门
 export function delDept(deptId) {
   return request({

+ 54 - 2
ruoyi-ui/src/views/system/dept/index.vue

@@ -38,6 +38,16 @@
       </el-col>
       <el-col :span="1.5">
         <el-button
+          type="warning"
+          plain
+          icon="el-icon-check"
+          size="mini"
+          @click="handleSaveSort"
+          v-hasPermi="['system:dept:edit']"
+        >保存排序</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
           type="info"
           plain
           icon="el-icon-sort"
@@ -57,7 +67,11 @@
       :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
     >
       <el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
-      <el-table-column prop="orderNum" label="排序" width="200"></el-table-column>
+      <el-table-column prop="orderNum" label="排序" width="200">
+        <template slot-scope="scope">
+          <el-input-number v-model="scope.row.orderNum" controls-position="right" :min="0" size="mini" style="width: 88px" />
+        </template>
+      </el-table-column>
       <el-table-column prop="status" label="状态" width="100">
         <template slot-scope="scope">
           <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
@@ -158,7 +172,7 @@
 </template>
 
 <script>
-import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept"
+import { listDept, getDept, delDept, addDept, updateDept, updateDeptSort, listDeptExcludeChild } from "@/api/system/dept"
 import Treeselect from "@riophae/vue-treeselect"
 import "@riophae/vue-treeselect/dist/vue-treeselect.css"
 
@@ -184,6 +198,8 @@ export default {
       isExpandAll: true,
       // 重新渲染表格状态
       refreshTable: true,
+      // 记录原始排序,用于对比变更
+      originalOrders: {},
       // 查询参数
       queryParams: {
         deptName: undefined,
@@ -228,6 +244,8 @@ export default {
       this.loading = true
       listDept(this.queryParams).then(response => {
         this.deptList = this.handleTree(response.data, "deptId")
+        // 记录原始排序值
+        this.recordOriginalOrders(this.deptList)
         this.loading = false
       })
     },
@@ -326,6 +344,40 @@ export default {
         }
       })
     },
+    /** 递归记录原始排序 */
+    recordOriginalOrders(list) {
+      list.forEach(item => {
+        this.originalOrders[item.deptId] = item.orderNum
+        if (item.children && item.children.length) {
+          this.recordOriginalOrders(item.children)
+        }
+      })
+    },
+    /** 保存排序 */
+    handleSaveSort() {
+      const changedDeptIds = []
+      const changedOrderNums = []
+      const collectChanged = (list) => {
+        list.forEach(item => {
+          if (String(this.originalOrders[item.deptId]) !== String(item.orderNum)) {
+            changedDeptIds.push(item.deptId)
+            changedOrderNums.push(item.orderNum)
+          }
+          if (item.children && item.children.length) {
+            collectChanged(item.children)
+          }
+        })
+      }
+      collectChanged(this.deptList)
+      if (changedDeptIds.length === 0) {
+        this.$modal.msgWarning("未检测到排序修改")
+        return
+      }
+      updateDeptSort({ deptIds: changedDeptIds.join(","), orderNums: changedOrderNums.join(",") }).then(() => {
+        this.$modal.msgSuccess("排序保存成功")
+        this.recordOriginalOrders(this.deptList)
+      })
+    },
     /** 删除按钮操作 */
     handleDelete(row) {
       this.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?').then(function() {