组织机构部门拖拽

公司的组织机构图一般用树形展示,大括号内为部门代码,默认隐藏,显隐可以切换;

 要实现拖动某个部门到另一部门下,自动产生新的部门代码,部门表结构如下:

CREATE TABLE [dbo].[DEPTCODE](
    [DEPT_ID] [bigint] NOT NULL,--部门id
    [DEPT_CODE] [varchar](20) NULL,--部门代码
    [PARENT] [varchar](20) NULL,--父级部门代码
    [CONTENT] [varchar](128) NULL,--部门名称
    [GRADE] [int] NULL,--部门级别
    [CREATEDATE] [datetime] NULL,--创建日期
    [DEPTOUT] [int] NULL--是否作废
    --此处忽略与本文无关的字段,
    )

要想产生新的部门代码,需要获取对应部门级别由几位数字组成,系统由一个表保存,结构如下:

CREATE TABLE [dbo].[DEPTGRADE](
    [GRADE] [varchar](30) NULL
    --各级部门使用几个数字保存,最多20级,每级一个数字,如33333333330000000000
)

后台使用存储过程实现拖拽部门,参数为拖动前后部门代码,其中调用函数获取目标部门子级部门的级别、总位数、当前级别位数,具体代码如下;

/****** Object:  UserDefinedFunction [dbo].[FGetDeptInfo]    Script Date: 08/12/2017 20:41:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[FGetDeptInfo]
    (
      @Dept_code VARCHAR(200) ,
      @rType VARCHAR(20)
    )
RETURNS INT
AS 
    BEGIN
        DECLARE @grade VARCHAR(20)
        DECLARE @p INT ,
            @isum INT
            
        --设置部门级数信息    
        SELECT  @grade = GRADE
        FROM    deptGrade
        
        SET @p = 0
        SET @isum = 0
        
        WHILE @isum < LEN(@Dept_code) 
            BEGIN
                SET @p = @p + 1
                SELECT  @isum = @isum + SUBSTRING(@grade, @p, 1)
            END
            
        RETURN CASE @rType WHEN 'Grade' THEN @p
                            WHEN 'TotalLength' THEN @isum
                            WHEN 'SubLength' THEN SUBSTRING(@grade, @p, 1)
                            END
                            
    END


/****** Object:  StoredProcedure [dbo].[pDeptDrag]    Script Date: 08/12/2017 15:54:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*从源部门拖动到新部门,输入拖动前后部门代码*/
CREATE PROCEDURE [dbo].[pDeptDrag]
    @Source_Dept_code VARCHAR(200) ,
    @New_Parent_code VARCHAR(200)
AS 
    BEGIN
        DECLARE @SDept_code VARCHAR(200)
        DECLARE @NDept_code VARCHAR(200)
        DECLARE @SubDeptsn INT
        DECLARE @SubDept_Code VARCHAR(200)
        DECLARE @MinSubDept_Code VARCHAR(200)
        DECLARE @SubLength INT
        DECLARE @i INT
        
        SET @SDept_code = @Source_Dept_code
        SET @NDept_code = @New_Parent_code
        
        --拖动到父级部门,等于没动
        IF @NDept_code = ( SELECT   PARENT
                           FROM     deptcode
                           WHERE    dept_code = @SDept_code
                         ) 
            RETURN
        --拖动到子级部门,不允许
        IF EXISTS( SELECT  1
                           FROM     deptcode
                           WHERE    dept_code  = @NDept_code
                           AND dept_code LIKE @SDept_code+ '%'
                         ) 
            RETURN            

       --找出新父级部门下不存在的最小子部门

        SET @SubLength = [dbo].[FGetDeptInfo](@NDept_code, 'SubLength')
        SET @SubDeptsn = 1
        SET @SubDept_Code = ''
        SET @i = 1
        
        --子级部门代码长度
        WHILE @i <= @SubLength 
            BEGIN
                SET @SubDept_Code = @SubDept_Code + '0'
                SET @i = @i + 1
            END
            
        WHILE EXISTS ( SELECT   1
                       FROM     deptcode
                       WHERE    DEPT_CODE = @NDept_code + LEFT(@SubDept_Code,
                                                              @SubLength
                                                              - LEN(@SubDeptsn))
                                + CONVERT(VARCHAR(2), @SubDeptsn) ) 
            BEGIN
                
                SET @SubDeptsn = @SubDeptsn + 1
                
            END
            
        SET @MinSubDept_Code = @NDept_code + LEFT(@SubDept_Code,
                                                  @SubLength - LEN(@SubDeptsn))
            + CONVERT(VARCHAR(2), @SubDeptsn)
              
        --更新原部门下所有部门的部门代码、级数、父级部门,如有必要,请更新临时表
        --本级部门
        UPDATE  dbo.DEPTCODE
        SET     DEPT_CODE = @MinSubDept_Code ,
                Grade = [dbo].[FGetDeptInfo](@MinSubDept_Code, 'Grade') ,
                parent = @NDept_code
        WHERE   DEPT_CODE = @SDept_code
        
        --下属部门
        UPDATE  dbo.DEPTCODE
        SET     DEPT_CODE = STUFF(DEPT_CODE, 1, LEN(Parent), @MinSubDept_Code) ,
                Grade = [dbo].[FGetDeptInfo](STUFF(DEPT_CODE, 1,
                                                   LEN(Parent),
                                                   @MinSubDept_Code), 'Grade')
                - 1 ,
                parent = @MinSubDept_Code
        WHERE   DEPT_CODE LIKE @SDept_code + '%'
                AND DEPT_CODE <> @SDept_code
                
    END

猜你喜欢

转载自www.cnblogs.com/yuqiaoQA/p/11839090.html