1 建表语句


-- ----------------------------
-- Table structure for sys_tenants
-- ----------------------------
DROP TABLE IF EXISTS sys_tenants;
CREATE TABLE sys_tenants  (
  tenant varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '租户,对应乐创者的 userTenantIdent',
  user_code_prefix varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '员工工号的前缀',
  default_roles varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '新建用户默认分配的角色,支持一个或多个角色。是 一个或多个 role_inner_name 值的逗号连接',
  op_last varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '/' COMMENT '修改人',
  op_last_time datetime NOT NULL COMMENT '修改时间',
  default_org varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '默认组织',
  PRIMARY KEY (tenant) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for sys_divisions
-- ----------------------------
DROP TABLE IF EXISTS sys_divisions;
CREATE TABLE sys_divisions  (
  tenant varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  division_inner_id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  division_inner_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  division_code varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  division_name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  org_inner_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  parent_inner_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  level_code varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  sx_ int(11) NULL DEFAULT NULL,
  is_leaf smallint(6) NULL DEFAULT NULL,
  is_abort smallint(6) NULL DEFAULT NULL,
  is_delete smallint(6) NULL DEFAULT NULL,
  op_first varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  op_first_time datetime NULL DEFAULT NULL,
  op_last varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  op_last_time datetime NULL DEFAULT NULL,
  op_delete varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  op_detete_time datetime NULL DEFAULT NULL,
  parent_inner_name_alter varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (division_inner_id, tenant) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for sys_orgs
-- ----------------------------
DROP TABLE IF EXISTS sys_orgs;
CREATE TABLE sys_orgs  (
  tenant varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'lcz' COMMENT '标准字段-主键-租户',
  org_inner_id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-主键-组织 ID',
  org_inner_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-组织 NAME',
  org_name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-组织 ALIAS',
  parent_inner_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-上级组织的 NAME',
  level_code varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-组织层码',
  is_leaf smallint(1) NOT NULL DEFAULT 1 COMMENT '标准字段-组织是否为叶节点',
  org_code varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-组织代码',
  is_abort smallint(1) NOT NULL DEFAULT 0 COMMENT '标准字段-组织禁用标记',
  op_first varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-创建人工号',
  op_first_time datetime NOT NULL COMMENT '标准字段-创建时间',
  op_last varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-修改人工号',
  op_last_time datetime NOT NULL COMMENT '标准字段-修改时间',
  is_delete smallint(1) NOT NULL DEFAULT 0 COMMENT '标准字段-假删标记',
  parent_inner_name_alter varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-上级组织Name 修改新值',
  is_managed smallint(6) NULL DEFAULT NULL,
  division_inner_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  op_delete varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  op_delete_time datetime NULL DEFAULT NULL,
  PRIMARY KEY (org_inner_id) USING BTREE,
  UNIQUE INDEX idx_t_inner_name(tenant, org_inner_name) USING BTREE,
  UNIQUE INDEX idx_t_code(tenant, org_code) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统-组织(部门)表-符合标准规范' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for sys_roles
-- ----------------------------
DROP TABLE IF EXISTS sys_roles;
CREATE TABLE sys_roles  (
  tenant varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'lcz' COMMENT '标准字段-租户',
  role_inner_id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-角色 ID',
  role_inner_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-角色 NAME',
  role_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-角色 ALIAS',
  sx smallint(1) NOT NULL DEFAULT 0 COMMENT '标准字段-顺序',
  is_abort smallint(1) NOT NULL DEFAULT 0 COMMENT '标准字段-禁用标记',
  op_first varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-创建人工号',
  op_first_time datetime NOT NULL COMMENT '标准字段-创建时间',
  op_last varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-修改人工号',
  op_last_time datetime NOT NULL COMMENT '标准字段-修改时间',
  is_delete smallint(1) NOT NULL DEFAULT 0 COMMENT '标准字段-假删标记',
  division_inner_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  op_delete varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  op_delete_time datetime NULL DEFAULT NULL,
  PRIMARY KEY (role_inner_id) USING BTREE,
  UNIQUE INDEX idx_t_name(tenant, role_inner_name) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统-角色表-符合标准规范' ROW_FORMAT = Dynamic;


-- ----------------------------
-- Table structure for sys_users
-- ----------------------------
DROP TABLE IF EXISTS sys_users;
CREATE TABLE sys_users  (
  tenant varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'lcz' COMMENT '标准字段-租户',
  user_inner varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-主键-用户 ID',
  user_no int(6) NULL DEFAULT NULL COMMENT '标准字段-企业内员工编号',
  user_code varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-用户工号',
  user_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-用户 ALIAS',
  login_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-登录名-用户 NAME',
  password varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
  sx int(6) NOT NULL DEFAULT 0 COMMENT '标准字段-顺序,作用于同一个部门内的排序',
  org_inner_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-所属组织的组织 NAME',
  supervisor_inner varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-直接主管的 ID',
  supervisor_inner_alter varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-为调整直接主管服务',
  level_code_supervisor varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-用户的隶属关系层码',
  is_leaf_supervisor smallint(1) NOT NULL DEFAULT 1 COMMENT '标准字段-隶属关系是否为叶节点',
  is_abort smallint(1) NOT NULL DEFAULT 0 COMMENT '标准字段-停用标记',
  is_delete smallint(1) NOT NULL DEFAULT 0 COMMENT '标准字段-假删标记',
  op_first varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-创建人工号',
  op_first_time datetime NOT NULL COMMENT '标准字段-创建时间',
  op_last varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-修改人工号',
  op_last_time datetime NOT NULL COMMENT '标准字段-修改时间',
  id_card varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-身份证号码',
  sex smallint(1) NULL DEFAULT NULL COMMENT '标准字段-业务字段-性别:0 男;1 女',
  is_married smallint(1) NULL DEFAULT NULL COMMENT '标准字段-业务字段-是否已婚',
  birth_date date NULL DEFAULT NULL COMMENT '标准字段-业务字段-生日',
  on_board_date date NULL DEFAULT NULL COMMENT '标准字段-业务字段-入职日期',
  enroll_date date NULL DEFAULT NULL COMMENT '标准字段-业务字段-转正日期',
  quit_date date NULL DEFAULT NULL COMMENT '标准字段-业务字段-离职日期',
  contract_begin_date date NULL DEFAULT NULL COMMENT '标准字段-业务字段-合同开始日期',
  contract_end_date date NULL DEFAULT NULL COMMENT '标准字段-业务字段-合同结束日期',
  mobile varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-手机号码',
  phone varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-固定电话号码',
  email varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-电邮地址',
  qq varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-QQ',
  postal_code varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-邮编',
  ding_user_id varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-钉钉企业内部用户编码',
  ding_union_id varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-钉钉用户全局编码',
  ding_gov_emp_code varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-政务钉人员编码',
  ding_gov_account_id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-政务钉账户编码',
  wecorp_user_id varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-企业微信企业内部用户编码',
  wechat_union_id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标准字段-业务字段-微信用户全局编码',
  user_no_alter int(6) NULL DEFAULT NULL COMMENT '标准字段-业务字段-编号老值',
  level_code_order int(6) NULL DEFAULT NULL COMMENT '标准字段-业务字段-隶属关系排序字段',
  division_inner_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  account_type int(10) UNSIGNED NULL DEFAULT NULL,
  main_account varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  default_account varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  op_delete varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  op_delete_time datetime NULL DEFAULT NULL,
  PRIMARY KEY (user_inner) USING BTREE,
  UNIQUE INDEX idx_user_login(tenant, login_name) USING BTREE,
  INDEX idx_user_no(tenant, user_no) USING BTREE,
  INDEX idx_user_code(tenant, user_code) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统-用户(员工)表-符合标准规范' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for sys_users_roles
-- ----------------------------
DROP TABLE IF EXISTS sys_users_roles;
CREATE TABLE sys_users_roles  (
  user_role_id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-映射关系主键',
  tenant varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'lcz' COMMENT '标准字段-租户',
  user_inner varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-用户 ID',
  role_inner_id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标准字段-角色 ID',
  division_inner_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  op_first varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  op_first_time datetime NULL DEFAULT NULL,
  PRIMARY KEY (user_role_id) USING BTREE,
  UNIQUE INDEX idx_t_user_role(tenant, user_inner, role_inner_id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统-用户角色映射关系表-符合标准规范' ROW_FORMAT = Dynamic;


2 存储过程

-- ----------------------------
-- Function structure for replace_levelcode
-- ----------------------------
DROP FUNCTION IF EXISTS `replace_levelcode`;
delimiter ;;
CREATE DEFINER=`root`@`%` FUNCTION `replace_levelcode`(`p_levelcode` varchar(100),`p_old_parent_levelcode` varchar(100),`p_new_parent_levelcode` varchar(100)) RETURNS varchar(100) CHARSET utf8
BEGIN
    RETURN CONCAT(p_new_parent_levelcode, SUBSTRING(p_levelcode, LENGTH(p_old_parent_levelcode) + 1));
END
;;
delimiter ;

-- ----------------------------
-- Procedure structure for sp_sys_init
-- ----------------------------
DROP PROCEDURE IF EXISTS `sp_sys_init`;
delimiter ;;
CREATE DEFINER=`root`@`%` PROCEDURE `sp_sys_init`()
BEGIN
    #初始化系统数据,初始化用户体系 确实字段-序号【user_id】,工号【jobNumber】,隶属关系层码【levelCode】;初始化组织层码
    # 定义接受游标的变量
  DECLARE row_org_id, temp_org_self_name, temp_org_parent_name, temp_org_self_levelcode, temp_tenant_id varchar(50);
    DECLARE row_user_id, temp_user_no, temp_supervisor_id, temp_user_jobnumber, temp_user_levelcode varchar(50);
    # 定义循环退出标志符变量
    DECLARE flag INT DEFAULT 0;
    #用户游标
    DECLARE c_user CURSOR
    FOR
SELECT dn_user.id FROM dn_user where (levelCode is null or levelCode = '' OR jobNumber is null OR jobNumber = '' OR user_no is null OR user_no = 0)
                                 AND is_delete = 0 AND id NOT LIKE 'dn_sys%' AND `type` = 0;
#组织游标
DECLARE c_org CURSOR
    FOR
SELECT dn_organization.id FROM dn_organization where (levelCode is null or levelCode = '') AND is_delete = 0 order by `index` asc;
# 定义EXIT 监听器
    -- DECLARE EXIT HANDLER FOR NOT FOUND set flag :=1;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;

    # 开始循环处理组织
    open c_org;
  REPEAT
FETCH c_org INTO row_org_id;
        set temp_org_self_levelcode = NULL;
        set temp_org_self_name = NULL;
        set temp_org_parent_name = NULL;
        # 重新查询层码,可能在递归时已处理
select `name`, parentId, levelCode, tenantId into temp_org_self_name, temp_org_parent_name, temp_org_self_levelcode, temp_tenant_id from dn_organization where id = row_org_id;
IF temp_org_self_levelcode is null OR temp_org_self_levelcode = '' THEN
            # 生成层码并更新
            call sp_sys_org_init(temp_tenant_id, temp_org_self_name);
END IF;
  UNTIL flag=1 END REPEAT;
    # 循环结束
    # 关闭游标
    CLOSE c_org;

    set flag = 0;

    # 开始循环处理用户
    open c_user;
  REPEAT
FETCH c_user INTO row_user_id;
        set temp_user_levelcode = NULL;
        # 重新查询,可能在递归时已处理
SELECT supervisorId, tenantId, user_no, jobNumber, levelCode INTO temp_supervisor_id, temp_tenant_id, temp_user_no, temp_user_jobnumber, temp_user_levelcode FROM dn_user WHERE id = row_user_id;
IF temp_user_levelcode is null OR temp_user_levelcode = '' OR temp_user_jobnumber is null OR temp_user_jobnumber = '' OR temp_user_no is null OR temp_user_no = 0 THEN
            # 更新用户
            call sp_sys_user_init(temp_tenant_id, row_user_id);
END IF;
  UNTIL flag=1 END REPEAT;
    # 循环结束
    # 关闭游标
    CLOSE c_user;
END
;;
delimiter ;

-- ----------------------------
-- Function structure for sp_sys_level_code_from_user_supervisor
-- ----------------------------
DROP FUNCTION IF EXISTS `sp_sys_level_code_from_user_supervisor`;
delimiter ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `sp_sys_level_code_from_user_supervisor`(`v_tenant` varchar(50),`v_user_inner` varchar(50),`v_user_no` int) RETURNS varchar(255) CHARSET utf8
BEGIN
    DECLARE v_supervisor_inner VARCHAR(50) DEFAULT NULL; 
    DECLARE v_level_code VARCHAR(255) DEFAULT ''; 
    DECLARE parent_level_code VARCHAR(255) DEFAULT '';

    SELECT supervisor_inner INTO v_supervisor_inner FROM sys_users WHERE tenant = v_tenant AND user_inner = v_user_inner;
    IF v_supervisor_inner IS NOT NULL THEN
        SELECT level_code_supervisor INTO parent_level_code FROM sys_users WHERE tenant = v_tenant AND user_inner = v_supervisor_inner; 
    END IF;
    RETURN CONCAT(parent_level_code, LPAD(conv(v_user_no,10,36),3,'0'));

--     WHILE v_user_inner_tmp IS NOT NULL DO 
--         SET v_supervisor_inner = NULL;
--         SET i_user_id = NULL; 
--         SELECT user_id,supervisor_inner INTO i_user_id,v_supervisor_inner FROM sys_users WHERE tenant = v_tenant AND user_inner = v_user_inner_tmp; 
--         IF i_user_id IS NOT NULL THEN #把当前 user_id 进行了从 10 位数转换到 36 位数,最终形成 3 位 
--             SET v_level_code = CONCAT(parent_level_code, LPAD(conv(i_user_id,10,36),3,'0')); 
--         END IF; 
--         SET v_user_inner_tmp = v_supervisor_inner; 
--     END WHILE; 
--     RETURN v_level_code;
END
;;
delimiter ;

-- ----------------------------
-- Function structure for sp_sys_next_tenant_user_no
-- ----------------------------
DROP FUNCTION IF EXISTS `sp_sys_next_tenant_user_no`;
delimiter ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `sp_sys_next_tenant_user_no`(`v_tenant` varchar(50)) RETURNS int(11)
BEGIN
    DECLARE i_user_no INT DEFAULT NULL; 
    SELECT MAX(user_no) INTO i_user_no FROM sys_users WHERE sys_users.tenant = v_tenant; 
    IF ISNULL(i_user_no) OR i_user_no = ''  THEN SET i_user_no = 0; 
    END IF; 
    RETURN i_user_no + 1;
END
;;
delimiter ;

-- ----------------------------
-- Procedure structure for sp_sys_org_add
-- ----------------------------
DROP PROCEDURE IF EXISTS `sp_sys_org_add`;
delimiter ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_sys_org_add`(IN `v_tenant` varchar(50),IN `v_org_inner` varchar(50))
BEGIN
    DECLARE v_org_parent_inner_name,v_org_parent_inner_name_alter VARCHAR(50) DEFAULT NULL; 
    select parent_inner_name,parent_inner_name_alter into v_org_parent_inner_name,v_org_parent_inner_name_alter from sys_orgs where tenant = v_tenant and org_inner_id = v_org_inner;
    IF v_org_parent_inner_name = v_org_parent_inner_name_alter THEN
      -- do nothing
        set v_org_parent_inner_name_alter = v_org_parent_inner_name_alter;
    ELSE
        UPDATE sys_orgs
        SET 
            level_code = sp_sys_org_next_levelcode(v_tenant,v_org_parent_inner_name,'null'),
            parent_inner_name_alter = v_org_parent_inner_name
        WHERE
            tenant = v_tenant AND org_inner_id = v_org_inner;
    END IF;
    # 上级处理是否叶子
    update sys_orgs set is_leaf = 0 where tenant = v_tenant AND org_inner_name = v_org_parent_inner_name;
END
;;
delimiter ;

-- ----------------------------
-- Procedure structure for sp_sys_org_delete
-- ----------------------------
DROP PROCEDURE IF EXISTS `sp_sys_org_delete`;
delimiter ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_sys_org_delete`(IN `v_tenant` varchar(50),IN `v_org_inner` varchar(50),IN `v_parent_org_inner` varchar(50))
BEGIN
    DECLARE v_parent_leafcount int; 
    DECLARE v_levelcode VARCHAR(50) DEFAULT NULL; 
    select level_code into v_levelcode from sys_orgs WHERE tenant = v_tenant and parent_inner_name = v_org_inner;
    # 查询更新上级层码的是否叶子
    SELECT count(org_inner_id) into v_parent_leafcount FROM sys_orgs where tenant = v_tenant and parent_inner_name = v_parent_org_inner;
    IF v_parent_leafcount = 0 THEN 
        UPDATE sys_orgs SET is_leaf = 1
        WHERE tenant = v_tenant AND org_inner_name = v_parent_org_inner;
    END IF;
    # 删除子用户 及  子组织 及子组织下的用户
    IF v_levelcode IS NOT NULL AND v_levelcode != '' THEN
        call sp_sys_org_del_cursor(tenant_id, v_levelcode);
    END IF;
END
;;
delimiter ;

-- ----------------------------
-- Procedure structure for sp_sys_org_del_cursor
-- ----------------------------
DROP PROCEDURE IF EXISTS `sp_sys_org_del_cursor`;
delimiter ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_sys_org_del_cursor`(IN `v_tenant` varchar(50),IN `v_del_org_levelcode` varchar(50))
BEGIN
# 删除子用户 及  子组织 及子组织下的用户
    # 定义接受游标的变量
  DECLARE row_org_name varchar(50);
    # 定义循环退出标志符变量
    DECLARE flag INT DEFAULT 0;
    DECLARE c_org_name CURSOR
    FOR
    SELECT org_inner_name FROM sys_orgs where level_code like v_del_org_levelcode || '%' AND is_delete = 0 AND tenant = v_tenant;
    # 定义EXIT 监听器
    DECLARE EXIT HANDLER FOR NOT FOUND set flag :=1;
    # 打开游标 
    open c_org_name;
    # 开始循环
  REPEAT
        FETCH c_org_name INTO row_org_name;
        # 先删除用户
        UPDATE sys_users set is_delete = 1 WHERE org_inner_name = row_org_name AND tenant = v_tenant;
        # 删除组织
        UPDATE sys_orgs set is_delete = 1 WHERE org_inner_name = row_org_name AND tenant = v_tenant;
  UNTIL flag=1 END REPEAT;
    # 循环结束

    # 关闭游标
    CLOSE c_org_name;
END
;;
delimiter ;

-- ----------------------------
-- Procedure structure for sp_sys_org_modify
-- ----------------------------
DROP PROCEDURE IF EXISTS `sp_sys_org_modify`;
delimiter ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_sys_org_modify`(IN `v_tenant` varchar(50),IN `v_org_inner` varchar(50), IN `v_old_inner_name` varchar(50))
BEGIN
    DECLARE v_parent, v_parent_name, v_parent_name_alter VARCHAR(255) DEFAULT ''; 
    DECLARE v_org_inner_name VARCHAR(50) DEFAULT ''; 
    DECLARE v_old_parent_leafcount int; 
    DECLARE v_old_level_code,v_new_level_code VARCHAR(50) DEFAULT ''; 
    select org_inner_name, level_code, parent_inner_name, parent_inner_name_alter into v_org_inner_name, v_old_level_code, v_parent_name, v_parent_name_alter from sys_orgs where tenant = v_tenant and org_inner_id = v_org_inner;
    select parent_inner_name into v_parent from sys_orgs where tenant = v_tenant and org_inner_name = v_org_inner_name;
    # 如果父编码变化了则需要修改层码,否则不需要
    IF v_parent_name != v_parent_name_alter THEN 
        set v_new_level_code = sp_sys_org_next_levelcode(v_tenant,v_parent_name,v_org_inner_name);
        # 更新层码
        UPDATE sys_orgs
        SET
                level_code = replace_levelcode(
                                level_code,v_old_level_code,v_new_level_code
                        )
        WHERE
                tenant = v_tenant  AND level_code LIKE CONCAT(v_old_level_code,'%') AND is_delete = 0;
        # 更新parent_inner_name_alter字段
        UPDATE sys_orgs
        SET
                parent_inner_name_alter = parent_inner_name
        WHERE
                tenant = v_tenant  AND org_inner_id = v_org_inner;
        # 查询更新老上级层码的是否叶子
        SELECT count(org_inner_id) into v_old_parent_leafcount FROM sys_orgs where tenant = v_tenant and parent_inner_name = v_parent_name_alter;
        IF v_old_parent_leafcount = 0 THEN 
            UPDATE sys_orgs SET is_leaf = 1
            WHERE tenant = v_tenant AND org_inner_name = v_parent_name_alter;
        END IF;
        # 更新当前上级为非叶子节点
        UPDATE sys_orgs SET is_leaf = 0
        WHERE tenant = v_tenant AND org_inner_name = v_parent_name and is_leaf = 1;
    END IF;
    # 如果内部名称inner_name变化了则需要子组织和用户表,否则不需要
    IF v_org_inner_name != v_old_inner_name AND v_old_inner_name is not null AND v_old_inner_name != '' THEN 
        # 更新子组织
        UPDATE sys_orgs
        SET 
            parent_inner_name = v_org_inner_name
        WHERE
            tenant = v_tenant AND parent_inner_name = v_old_inner_name AND is_delete = 0;
        UPDATE sys_orgs
        SET 
            parent_inner_name_alter = v_org_inner_name
        WHERE
            tenant = v_tenant AND parent_inner_name_alter = v_old_inner_name AND is_delete = 0;
        # 更新组织下用户
        UPDATE sys_users
        SET 
            org_inner_name = v_org_inner_name
        WHERE
            tenant = v_tenant AND org_inner_name = v_old_inner_name AND is_delete = 0;
    END IF;
END
;;
delimiter ;

-- ----------------------------
-- Function structure for sp_sys_org_next_levelcode
-- ----------------------------
DROP FUNCTION IF EXISTS `sp_sys_org_next_levelcode`;
delimiter ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `sp_sys_org_next_levelcode`(`v_tenant` varchar(50), `parentOrgInnerName` varchar(50), `selfOrgInnerName` varchar(50)) RETURNS varchar(255) CHARSET utf8
BEGIN
    DECLARE parent_level_code VARCHAR(255) DEFAULT ''; 
    DECLARE maxlevelcode VARCHAR(255) DEFAULT NULL; 
    DECLARE maxlevelNum int DEFAULT NULL; 
    # 父节点的层码
    select level_code into parent_level_code from sys_orgs where org_inner_name = parentOrgInnerName and tenant = v_tenant;
    # 子节点的最大层码
    select max(level_code) into maxlevelcode from sys_orgs where parent_inner_name = parentOrgInnerName and tenant = v_tenant and is_delete = 0 and org_inner_name <> selfOrgInnerName;
    IF maxlevelcode = '' THEN 
        set maxlevelcode = '000';
        RETURN CONCAT(parent_level_code, maxlevelcode);
    END IF;
    IF maxlevelcode is NULL THEN 
        set maxlevelcode = '000';
        RETURN CONCAT(parent_level_code, maxlevelcode);
    END IF;
    set maxlevelNum = CAST(maxlevelcode  AS  UNSIGNED) % 1000;
    -- set maxlevelNum = conv(right(maxlevelcode, 3),36,10);
    RETURN CONCAT(parent_level_code, LPAD(maxlevelNum+1,3,'0'));
END
;;
delimiter ;

-- ----------------------------
-- Procedure structure for sp_sys_user_add
-- ----------------------------
DROP PROCEDURE IF EXISTS `sp_sys_user_add`;
delimiter ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_sys_user_add`(IN `v_tenant` varchar(50),IN `v_user_inner` varchar(50))
BEGIN
    DECLARE v_user_code,v_supervisor_inner VARCHAR(50) DEFAULT NULL; 
    DECLARE i_user_no INT DEFAULT NULL; 
    select user_code,user_no into v_user_code,i_user_no FROM sys_users WHERE tenant = v_tenant AND user_inner = v_user_inner; 
    IF i_user_no is not null AND    i_user_no != '' THEN
        START TRANSACTION;
        #设置本员工的字段 
        UPDATE sys_users 
        SET 
            level_code_supervisor = sp_sys_level_code_from_user_supervisor(v_tenant,user_inner,i_user_no), 
            supervisor_inner_alter = supervisor_inner,
            user_no_alter = user_no,
            is_leaf_supervisor = 1
        WHERE
            tenant = v_tenant AND user_inner = v_user_inner; 
        #获取直接主管的用户 ID 
        SELECT supervisor_inner INTO v_supervisor_inner 
        FROM sys_users 
        WHERE tenant = v_tenant AND user_inner = v_user_inner;
        #设置直接主管的 is_leaf_supervisor 字段 
        UPDATE sys_users SET is_leaf_supervisor = 0 WHERE tenant = v_tenant AND user_inner = v_supervisor_inner; #赋予默认角色 
        INSERT INTO sys_users_roles(user_role_id,tenant,user_inner,role_inner_id)
            SELECT LEFT(UUID(),20),v_tenant,v_user_inner,role_inner_id 
            FROM sys_roles 
            WHERE tenant = v_tenant 
                AND INSTR( 
                    (SELECT CONCAT(',',default_roles,',') 
                    FROM sys_tenants 
                    WHERE tenant = v_tenant), CONCAT(',',role_inner_id,',') 
                ) > 0; 
        COMMIT;
    END IF;
END
;;
delimiter ;

-- ----------------------------
-- Procedure structure for sp_sys_user_delete
-- ----------------------------
DROP PROCEDURE IF EXISTS `sp_sys_user_delete`;
delimiter ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_sys_user_delete`(IN `v_tenant` varchar(50),IN `v_supervisor_inner` varchar(50))
BEGIN
    # 上级是否叶子
    DECLARE v_supervisor_leafcount int; 
    SELECT count(user_inner) into v_supervisor_leafcount FROM sys_users where tenant = v_tenant and supervisor_inner = v_supervisor_inner;
    IF v_supervisor_leafcount = 0 THEN
        UPDATE sys_users SET is_leaf_supervisor = 1 
        WHERE tenant = v_tenant AND user_inner = v_supervisor_inner; 
    END IF;
END
;;
delimiter ;

-- ----------------------------
-- Procedure structure for sp_sys_user_modify
-- ----------------------------
DROP PROCEDURE IF EXISTS `sp_sys_user_modify`;
delimiter ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_sys_user_modify`(IN `v_tenant` varchar(50),IN `v_user_inner` varchar(50))
BEGIN
    DECLARE v_supervisor_inner_old,v_supervisor_inner_new VARCHAR(50) DEFAULT NULL; 
    DECLARE v_level_code_supervisor_old,v_level_code_supervisor_new VARCHAR(255) DEFAULT NULL; 
    DECLARE v_user_no, v_user_no_alter int DEFAULT NULL; 
    DECLARE i_count_child INT DEFAULT 0; 

    SELECT supervisor_inner,supervisor_inner_alter,level_code_supervisor, user_no, user_no_alter
    INTO v_supervisor_inner_new,v_supervisor_inner_old,v_level_code_supervisor_old, v_user_no, v_user_no_alter
    FROM sys_users 
    WHERE tenant = v_tenant AND user_inner = v_user_inner;

    #判断直接主管是否被修改
    IF ISNULL(v_supervisor_inner_old) OR v_supervisor_inner_old <> v_supervisor_inner_new OR v_user_no_alter <> v_user_no THEN 
        # START TRANSACTION; 
        #更新本员工及其下属的隶属关系层码 
        SET v_level_code_supervisor_new = sp_sys_level_code_from_user_supervisor(v_tenant,v_user_inner, v_user_no); 

        UPDATE sys_users 
        SET level_code_supervisor = REPLACE( 
            level_code_supervisor,v_level_code_supervisor_old,v_level_code_supervisor_new 
        )
        WHERE
            tenant = v_tenant 
            AND level_code_supervisor LIKE CONCAT(v_level_code_supervisor_old,'%'); 
        #更新直接主管的 is_leaf_supervisor 
        UPDATE sys_users SET is_leaf_supervisor = 0 
        WHERE tenant = v_tenant AND user_inner = v_supervisor_inner_new; 
        # 用到了 v_sys_users_supervisor_tree 
        # 直接用 sys_users 也是可以的,但是可能会包含一些已经无效的人员导致误差 
        SELECT COUNT(user_inner) INTO i_count_child FROM sys_users 
        WHERE tenant = v_tenant AND supervisor_inner = v_supervisor_inner_old AND is_delete = 0; 
        IF 0 = i_count_child THEN 
            UPDATE sys_users SET is_leaf_supervisor = 1 
            WHERE tenant = v_tenant AND user_inner = v_supervisor_inner_old; 
        END IF;
        UPDATE sys_users 
            SET supervisor_inner_alter = supervisor_inner,
                    user_no_alter = user_no
        WHERE tenant = v_tenant AND user_inner = v_user_inner;
        # COMMIT; 
    END IF;
END
;;
delimiter ;
作者:wangjingxin  创建时间:2025-01-14 10:08
最后编辑:wangjingxin  更新时间:2025-04-24 11:27