package com.gxwebsoft.open.controller;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.gxwebsoft.common.core.annotation.OperationLog;
import com.gxwebsoft.common.core.exception.BusinessException;
import com.gxwebsoft.common.core.utils.CommonUtil;
import com.gxwebsoft.common.core.utils.JSONUtil;
import com.gxwebsoft.common.core.web.*;
import com.gxwebsoft.common.system.entity.Menu;
import com.gxwebsoft.common.system.entity.RoleMenu;
import com.gxwebsoft.common.system.entity.Tenant;
import com.gxwebsoft.common.system.param.TenantParam;
import com.gxwebsoft.common.system.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 租户控制器
 *
 * @author WebSoft
 * @since 2022-11-17 17:13:39
 */
@Api(tags = "租户管理")
@RestController
@RequestMapping("/api/open/tenant")
public class OpenTenantController extends BaseController {
  @Resource
  private TenantService tenantService;
  @Resource
  private UserService userService;
  @Resource
  private RoleService roleService;
  @Resource
  private UserRoleService userRoleService;
  @Resource
  private MenuService menuService;
  @Resource
  private RoleMenuService roleMenuService;
  @Resource
  private StringRedisTemplate stringRedisTemplate;
  @Resource
  private DictService dictService;
  @Resource
  private DictDataService dictDataService;

  @ApiOperation("分页查询租户")
  @GetMapping("/page")
  public ApiResult<PageResult<Tenant>> page(TenantParam param) {
    // 特殊验证签名
    if (!param.getTenantCode().equals("ZAcxbdmDQFwUKC3e")) {
      throw new BusinessException("签名失败");
    }
    PageParam<Tenant, TenantParam> page = new PageParam<>(param);
    page.setDefaultOrder("create_time desc");
//        return success(tenantService.page(page, page.getWrapper()));
    // 使用关联查询
    return success(tenantService.pageRel(param));
  }

  @PreAuthorize("hasAuthority('oa:tenant:list')")
  @ApiOperation("查询全部租户")
  @GetMapping()
  public ApiResult<List<Tenant>> list(TenantParam param) {
    // 验证签名
    isCheckSign();
    PageParam<Tenant, TenantParam> page = new PageParam<>(param);
    page.setDefaultOrder("create_time desc");
    return success(tenantService.list(page.getOrderWrapper()));
    // 使用关联查询
    //return success(tenantService.listRel(param));
  }

  @PreAuthorize("hasAuthority('oa:tenant:list')")
  @ApiOperation("根据id查询租户")
  @GetMapping("/{id}")
  public ApiResult<Tenant> get(@PathVariable("id") Integer id) {
    // 验证签名
    isCheckSign();
    return success(tenantService.getById(id));
    // 使用关联查询
//        return success(tenantService.getByIdRel(id));
  }

//  @Transactional(rollbackFor = {Exception.class})
//  @PreAuthorize("hasAuthority('oa:tenant:save')")
//  @OperationLog
//  @ApiOperation("添加租户(已废弃)")
//  @PostMapping()
//  public ApiResult<?> save(@RequestBody Tenant tenant) {
//    // 验证签名
//    isCheckSign();
//    // 记录当前登录用户id、租户id
//    User loginUser = getLoginUser();
//    if (loginUser != null) {
//      tenant.setUserId(loginUser.getUserId());
//      if (loginUser.getTenantId() != 5) return fail("权限不足!");
//    }
//    // 添加租户
//    tenant.setTenantCode(CommonUtil.randomUUID16());
//    tenantService.save(tenant);
//
//    // 添加超级管理员
//    User user = new User();
//    user.setUsername("admin");
//    user.setNickname("超级管理员");
//    user.setPassword(userService.encodePassword(tenant.getPassword()));
//    user.setTenantId(tenant.getTenantId());
//    boolean result = userService.save(user);
//    Integer superAdminUserId = user.getUserId();
//
//    // 创建角色
//    if (result) {
//      Role role = new Role();
//      role.setRoleName("超级管理员");
//      role.setRoleCode("superAdmin");
//      role.setComments("超级管理员");
//      role.setTenantId(tenant.getTenantId());
//      roleService.save(role);
//
//      // 保存超级管理员角色ID
//      Integer superAdminRoleId = role.getRoleId();
//      role.setRoleName("注册用户");
//      role.setRoleCode("user");
//      role.setComments("普通注册用户");
//      roleService.save(role);
//      role.setRoleName("游客");
//      role.setRoleCode("guest");
//      role.setComments("用于未登录时的浏览权限");
//      roleService.save(role);
//      Integer guestRoleId = role.getRoleId();
//
//      // 添加默认字典
//      final Dict dict = new Dict();
//      dict.setDictName("性别");
//      dict.setDictCode("sex");
//      dict.setTenantId(tenant.getTenantId());
//      dictService.save(dict);
//      final DictData dictData = new DictData();
//      dictData.setDictId(dict.getDictId());
//      dictData.setDictDataName("男");
//      dictData.setDictDataCode("1");
//      dictData.setTenantId(tenant.getTenantId());
//      dictDataService.save(dictData);
//      dictData.setDictDataName("女");
//      dictData.setDictDataCode("2");
//      dictData.setTenantId(tenant.getTenantId());
//      dictDataService.save(dictData);
//
//      // 添加游客账号
//      user.setUsername("www");
//      user.setNickname("游客");
//      user.setPassword(userService.encodePassword("123456"));
//      userService.save(user);
//
//      // 添加超管用户角色
//      UserRole userRole = new UserRole();
//      userRole.setUserId(superAdminUserId);
//      userRole.setRoleId(superAdminRoleId);
//      userRole.setTenantId(tenant.getTenantId());
//      userRoleService.save(userRole);
//
//      // 添加游客用户角色
//      userRole.setUserId(user.getUserId());
//      userRole.setRoleId(guestRoleId);
//      boolean resultUserRole = userRoleService.save(userRole);
//
//      /// 添加系统菜单
//      if (resultUserRole) {
//        Menu menu = new Menu();
//        // 10.系统管理
//        menu.setTitle("系统管理");
//        menu.setParentId(0);
//        menu.setPath("/system");
//        menu.setIcon("setting-outlined");
//        menu.setSortNumber(10);
//        menu.setTenantId(tenant.getTenantId());
//        menuService.save(menu);
//        Integer parentId = menu.getMenuId();
//        menu.setParentId(menu.getMenuId());
//        menu.setTitle("用户管理");
//        menu.setPath("/system/user");
//        menu.setComponent("/system/user");
//        menu.setIcon("team-outlined");
//        menu.setSortNumber(2);
//        menuService.save(menu);
//        Integer userParentId = menu.getMenuId();
//        menu.setParentId(userParentId);
//        menu.setMenuType(1);
//        menu.setTitle("查询");
//        menu.setIcon("");
//        menu.setAuthority("sys:user:list");
//        menuService.save(menu);
//        menu.setParentId(userParentId);
//        menu.setTitle("添加");
//        menu.setAuthority("sys:user:save");
//        menuService.save(menu);
//        menu.setParentId(userParentId);
//        menu.setTitle("修改");
//        menu.setAuthority("sys:user:update");
//        menuService.save(menu);
//        menu.setParentId(userParentId);
//        menu.setTitle("删除");
//        menu.setAuthority("sys:user:remove");
//        menuService.save(menu);
//        menu.setMenuType(0);
//        menu.setParentId(parentId);
//        menu.setTitle("角色管理");
//        menu.setPath("/system/role");
//        menu.setComponent("/system/role");
//        menu.setIcon("idcard-outlined");
//        menu.setAuthority("");
//        menu.setSortNumber(3);
//        menuService.save(menu);
//        Integer roleParentId = menu.getMenuId();
//        menu.setParentId(roleParentId);
//        menu.setMenuType(1);
//        menu.setIcon("");
//        menu.setPath("");
//        menu.setComponent("");
//        menu.setTitle("查询");
//        menu.setAuthority("sys:role:list");
//        menuService.save(menu);
//        menu.setParentId(roleParentId);
//        menu.setTitle("添加");
//        menu.setAuthority("sys:role:save");
//        menuService.save(menu);
//        menu.setParentId(roleParentId);
//        menu.setTitle("修改");
//        menu.setAuthority("sys:role:update");
//        menuService.save(menu);
//        menu.setParentId(roleParentId);
//        menu.setTitle("删除");
//        menu.setAuthority("sys:role:remove");
//        menuService.save(menu);
//        menu.setMenuType(0);
//        menu.setParentId(parentId);
//        menu.setTitle("菜单管理");
//        menu.setPath("/system/menu");
//        menu.setComponent("/system/menu");
//        menu.setIcon("appstore-outlined");
//        menu.setAuthority("");
//        menu.setSortNumber(1);
//        menuService.save(menu);
//        Integer menuParentId = menu.getMenuId();
//        menu.setParentId(menuParentId);
//        menu.setMenuType(1);
//        menu.setTitle("查询");
//        menu.setAuthority("sys:menu:list");
//        menu.setIcon("");
//        menu.setPath("");
//        menu.setComponent("");
//        menuService.save(menu);
//        menu.setParentId(menuParentId);
//        menu.setTitle("添加");
//        menu.setAuthority("sys:menu:save");
//        menuService.save(menu);
//        menu.setParentId(menuParentId);
//        menu.setTitle("修改");
//        menu.setAuthority("sys:menu:update");
//        menuService.save(menu);
//        menu.setParentId(menuParentId);
//        menu.setTitle("删除");
//        menu.setAuthority("sys:menu:remove");
//        menuService.save(menu);
//        menu.setMenuType(0);
//        menu.setParentId(parentId);
//        menu.setTitle("机构管理");
//        menu.setPath("/system/organization");
//        menu.setComponent("/system/organization");
//        menu.setIcon("bank-outlined");
//        menu.setAuthority("");
//        menu.setSortNumber(5);
//        menuService.save(menu);
//        Integer orgParentId = menu.getMenuId();
//        menu.setParentId(orgParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setComponent("");
//        menu.setIcon("");
//        menu.setTitle("查询");
//        menu.setAuthority("sys:org:list");
//        menuService.save(menu);
//        menu.setParentId(orgParentId);
//        menu.setTitle("添加");
//        menu.setAuthority("sys:org:save");
//        menuService.save(menu);
//        menu.setParentId(orgParentId);
//        menu.setTitle("修改");
//        menu.setAuthority("sys:org:update");
//        menuService.save(menu);
//        menu.setParentId(orgParentId);
//        menu.setTitle("删除");
//        menu.setAuthority("sys:org:remove");
//        menuService.save(menu);
//        menu.setMenuType(0);
//        menu.setParentId(parentId);
//        menu.setTitle("字典管理");
//        menu.setPath("/system/dict");
//        menu.setComponent("/system/dict");
//        menu.setIcon("profile-outlined");
//        menu.setAuthority("");
//        menu.setSortNumber(4);
//        menuService.save(menu);
//        Integer dictParentId = menu.getMenuId();
//        menu.setParentId(dictParentId);
//        menu.setMenuType(1);
//        menu.setTitle("查询");
//        menu.setAuthority("sys:dict:list");
//        menu.setIcon("");
//        menu.setPath("");
//        menu.setComponent("");
//        menuService.save(menu);
//        menu.setParentId(dictParentId);
//        menu.setTitle("添加");
//        menu.setAuthority("sys:dict:save");
//        menuService.save(menu);
//        menu.setParentId(dictParentId);
//        menu.setTitle("修改");
//        menu.setAuthority("sys:dict:update");
//        menuService.save(menu);
//        menu.setParentId(dictParentId);
//        menu.setTitle("删除");
//        menu.setAuthority("sys:dict:remove");
//        menuService.save(menu);
//        menu.setMenuType(0);
//        menu.setParentId(parentId);
//        menu.setTitle("登录日志");
//        menu.setPath("/system/login-record");
//        menu.setComponent("/system/login-record");
//        menu.setIcon("calendar-outlined");
//        menu.setAuthority("sys:login-record:list");
//        menu.setSortNumber(7);
//        menuService.save(menu);
//        menu.setParentId(parentId);
//        menu.setTitle("操作日志");
//        menu.setPath("/system/operation-record");
//        menu.setComponent("/system/operation-record");
//        menu.setIcon("file-search-outlined");
//        menu.setAuthority("sys:operation-record:list");
//        menu.setSortNumber(8);
//        menuService.save(menu);
//        menu.setParentId(parentId);
//        menu.setTitle("文件管理");
//        menu.setPath("/system/file");
//        menu.setComponent("/system/file");
//        menu.setIcon("folder-outlined");
//        menu.setAuthority("");
//        menu.setSortNumber(6);
//        menuService.save(menu);
//        Integer fileParentId = menu.getMenuId();
//        menu.setParentId(fileParentId);
//        menu.setMenuType(1);
//        menu.setTitle("查看记录");
//        menu.setPath("");
//        menu.setComponent("");
//        menu.setIcon("");
//        menu.setAuthority("sys:file:list");
//        menuService.save(menu);
//        menu.setParentId(fileParentId);
//        menu.setTitle("上传文件");
//        menu.setAuthority("sys:file:upload");
//        menuService.save(menu);
//        menu.setParentId(fileParentId);
//        menu.setTitle("修改文件");
//        menu.setAuthority("sys:file:update");
//        menuService.save(menu);
//        menu.setParentId(fileParentId);
//        menu.setTitle("删除文件");
//        menu.setAuthority("sys:org:remove");
//        menuService.save(menu);
//        menu.setMenuType(0);
//        menu.setParentId(parentId);
//        menu.setTitle("系统设置");
//        menu.setPath("/system/setting");
//        menu.setComponent("/system/setting");
//        menu.setIcon("setting-outlined");
//        menu.setAuthority("sys:setting:save");
//        menu.setSortNumber(10);
//        menuService.save(menu);
//        menu.setParentId(parentId);
//        menu.setTitle("用户信息");
//        menu.setPath("/system/user-info");
//        menu.setComponent("/system/user-info");
//        menu.setIcon("team-outlined");
//        menu.setAuthority("");
//        menu.setHide(1);
//        menu.setMenuType(0);
//        menu.setSortNumber(9);
//        menuService.save(menu);
//        Integer userInfoParentId = menu.getMenuId();
//        menu.setParentId(userInfoParentId);
//        menu.setMenuType(1);
//        menu.setTitle("修改个人密码");
//        menu.setAuthority("sys:auth:password");
//        menu.setIcon("");
//        menu.setPath("");
//        menu.setComponent("");
//        menuService.save(menu);
//        menu.setParentId(userInfoParentId);
//        menu.setTitle("修改个人资料");
//        menu.setAuthority("sys:auth:user");
//        menuService.save(menu);
//        menu.setTitle("扩展插件");
//        menu.setParentId(parentId);
//        menu.setIcon("AppstoreAddOutlined");
//        menu.setPath("/system/appstore");
//        menu.setComponent("/system/appstore");
//        menu.setMenuType(0);
//        menu.setAuthority("oa:app:list");
//        menu.setSortNumber(100);
//        menu.setHide(0);
//        menuService.save(menu);
//        // 1.控制台
//        menu.setParentId(0);
//        menu.setTitle("控制台");
//        menu.setPath("/dashboard");
//        menu.setIcon("home-outlined");
//        menu.setComponent("");
//        menu.setAuthority("");
//        menu.setSortNumber(1);
//        menu.setMenuType(0);
//        menuService.save(menu);
//        Integer dashboardParentId = menu.getMenuId();
//        menu.setTitle("工作台");
//        menu.setPath("/dashboard/workplace");
//        menu.setComponent("/dashboard/workplace");
//        menu.setIcon("DesktopOutlined");
//        menu.setParentId(dashboardParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        menu.setTitle("统计分析");
//        menu.setPath("/dashboard/analysis");
//        menu.setComponent("/dashboard/analysis");
//        menu.setIcon("BarChartOutlined");
//        menu.setParentId(dashboardParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(1);
//        menuService.save(menu);
//        // 2.办公协同
//        menu.setParentId(0);
//        menu.setTitle("办公协同");
//        menu.setPath("/oa");
//        menu.setComponent("");
//        menu.setAuthority("");
//        menu.setMenuType(0);
//        menu.setIcon("LaptopOutlined");
//        menu.setHide(0);
//        menu.setSortNumber(2);
//        menuService.save(menu);
//        Integer oaParentId = menu.getMenuId();
//        menu.setParentId(oaParentId);
//        menu.setTitle("服务器管理");
//        menu.setPath("/oa/assets/server");
//        menu.setComponent("/oa/assets/server");
//        menu.setIcon("AuditOutlined");
//        menu.setMenuType(0);
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        Integer serverParentId = menu.getMenuId();
//        menu.setTitle("查询");
//        menu.setParentId(serverParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setAuthority("oa:assets:list");
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("oa:assets:save");
//        menuService.save(menu);
//        menu.setTitle("更新");
//        menu.setAuthority("oa:assets:update");
//        menuService.save(menu);
//        menu.setTitle("移除");
//        menu.setAuthority("oa:assets:remove");
//        menuService.save(menu);
//        menu.setParentId(oaParentId);
//        menu.setMenuType(0);
//        menu.setTitle("客户管理");
//        menu.setPath("/oa/customer");
//        menu.setComponent("/oa/customer");
//        menu.setIcon("TeamOutlined");
//        menu.setSortNumber(1);
//        menuService.save(menu);
//        Integer customerParentId = menu.getMenuId();
//        menu.setParentId(customerParentId);
//        menu.setTitle("查询");
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setSortNumber(0);
//        menu.setAuthority("oa:customer:list");
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("oa:customer:save");
//        menuService.save(menu);
//        menu.setTitle("更新");
//        menu.setAuthority("oa:customer:update");
//        menuService.save(menu);
//        menu.setTitle("移除");
//        menu.setAuthority("oa:customer:remove");
//        menuService.save(menu);
//        // 3.商户管理
//        menu.setParentId(0);
//        menu.setTitle("商户管理");
//        menu.setPath("/merchant");
//        menu.setIcon("ShopOutlined");
//        menu.setComponent("");
//        menu.setAuthority("");
//        menu.setSortNumber(3);
//        menu.setMenuType(0);
//        menuService.save(menu);
//        Integer merchantParentId = menu.getMenuId();
//        menu.setTitle("商户列表");
//        menu.setPath("/merchant/index");
//        menu.setComponent("/merchant/index");
//        menu.setIcon("ShopOutlined");
//        menu.setParentId(merchantParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        Integer shopInfoParentId = menu.getMenuId();
//        menu.setTitle("列表");
//        menu.setParentId(shopInfoParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setAuthority("shop:merchant:list");
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("shop:merchant:save");
//        menuService.save(menu);
//        menu.setTitle("编辑");
//        menu.setAuthority("shop:merchant:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("shop:merchant:remove");
//        menuService.save(menu);
//        menu.setTitle("入驻审核");
//        menu.setPath("/merchant/apply");
//        menu.setComponent("/merchant/apply");
//        menu.setIcon("HourglassOutlined");
//        menu.setParentId(merchantParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(1);
//        menuService.save(menu);
//        menu.setTitle("地址管理");
//        menu.setPath("/merchant/address");
//        menu.setComponent("/merchant/address");
//        menu.setIcon("EnvironmentOutlined");
//        menu.setParentId(merchantParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(2);
//        menuService.save(menu);
//        menu.setTitle("店铺装修");
//        menu.setPath("/merchant/decorate");
//        menu.setComponent("/merchant/decorate");
//        menu.setIcon("FormatPainterOutlined");
//        menu.setParentId(merchantParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(3);
//        menuService.save(menu);
//        menu.setTitle("主题风格");
//        menu.setPath("/merchant/theme");
//        menu.setComponent("/merchant/theme");
//        menu.setIcon("BgColorsOutlined");
//        menu.setParentId(merchantParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(4);
//        menuService.save(menu);
//        menu.setTitle("资金提现");
//        menu.setPath("/merchant/withdraw");
//        menu.setComponent("/merchant/withdraw");
//        menu.setIcon("RedEnvelopeOutlined");
//        menu.setParentId(merchantParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(5);
//        menuService.save(menu);
//        // 4.商品管理
//        menu.setParentId(0);
//        menu.setTitle("商品管理");
//        menu.setPath("/goods");
//        menu.setIcon("ShoppingOutlined");
//        menu.setComponent("");
//        menu.setAuthority("");
//        menu.setSortNumber(4);
//        menu.setMenuType(0);
//        menuService.save(menu);
//        Integer goodsParentId = menu.getMenuId();
//        menu.setTitle("商品列表");
//        menu.setPath("/goods/index");
//        menu.setComponent("/goods/index");
//        menu.setIcon("SkinOutlined");
//        menu.setParentId(goodsParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        Integer shopIndexParentId = menu.getMenuId();
//        menu.setTitle("列表");
//        menu.setParentId(shopIndexParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setAuthority("shop:goods:list");
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("shop:goods:save");
//        menuService.save(menu);
//        menu.setTitle("编辑");
//        menu.setAuthority("shop:goods:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("shop:goods:remove");
//        menuService.save(menu);
//        menu.setTitle("商品分类");
//        menu.setPath("/goods/category");
//        menu.setComponent("/goods/category");
//        menu.setIcon("ApartmentOutlined");
//        menu.setParentId(goodsParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(1);
//        menuService.save(menu);
//        Integer goodsCategoryParentId = menu.getMenuId();
//        menu.setTitle("列表");
//        menu.setParentId(goodsCategoryParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setAuthority("shop:category:list");
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("shop:category:save");
//        menuService.save(menu);
//        menu.setTitle("编辑");
//        menu.setAuthority("shop:category:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("shop:category:remove");
//        menuService.save(menu);
//        menu.setTitle("商品评价");
//        menu.setPath("/goods/comment");
//        menu.setComponent("/goods/comment");
//        menu.setIcon("GiftOutlined");
//        menu.setParentId(goodsParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(2);
//        menuService.save(menu);
//        Integer goodsCommentParentId = menu.getMenuId();
//        menu.setTitle("列表");
//        menu.setParentId(goodsCommentParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setAuthority("shop:comment:list");
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("shop:comment:save");
//        menuService.save(menu);
//        menu.setTitle("编辑");
//        menu.setAuthority("shop:comment:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("shop:comment:remove");
//        menuService.save(menu);
//        menu.setTitle("服务承诺");
//        menu.setPath("/goods/service");
//        menu.setComponent("/goods/service");
//        menu.setIcon("InsuranceOutlined");
//        menu.setParentId(goodsParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(3);
//        menuService.save(menu);
//        Integer goodsServiceParentId = menu.getMenuId();
//        menu.setTitle("列表");
//        menu.setParentId(goodsServiceParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setAuthority("shop:goodsService:list");
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("shop:goodsService:save");
//        menuService.save(menu);
//        menu.setTitle("编辑");
//        menu.setAuthority("shop:goodsService:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("shop:goodsService:remove");
//        menuService.save(menu);
//        // 5.订单管理
//        menu.setParentId(0);
//        menu.setTitle("订单管理");
//        menu.setPath("/order");
//        menu.setIcon("CalendarOutlined");
//        menu.setComponent("");
//        menu.setAuthority("");
//        menu.setSortNumber(5);
//        menu.setMenuType(0);
//        menuService.save(menu);
//        Integer orderParentId = menu.getMenuId();
//        menu.setTitle("全部订单");
//        menu.setPath("/order/all");
//        menu.setComponent("/order/all");
//        menu.setIcon("ProfileOutlined");
//        menu.setParentId(orderParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        Integer orderAllParentId = menu.getMenuId();
//        menu.setTitle("列表");
//        menu.setParentId(orderAllParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setAuthority("shop:order:list");
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("shop:order:save");
//        menuService.save(menu);
//        menu.setTitle("编辑");
//        menu.setAuthority("shop:order:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("shop:order:remove");
//        menuService.save(menu);
//        menu.setTitle("退款单");
//        menu.setPath("/order/refund");
//        menu.setComponent("/order/refund");
//        menu.setIcon("MoneyCollectOutlined");
//        menu.setParentId(orderParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(1);
//        menuService.save(menu);
//        menu.setTitle("发货管理");
//        menu.setPath("/order/delivery");
//        menu.setComponent("/order/delivery");
//        menu.setIcon("CarOutlined");
//        menu.setParentId(orderParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(2);
//        menuService.save(menu);
//        menu.setTitle("订单导出");
//        menu.setPath("/order/export");
//        menu.setComponent("/order/export");
//        menu.setIcon("UploadOutlined");
//        menu.setParentId(orderParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(3);
//        menuService.save(menu);
//        // 6.用户管理
//        menu.setParentId(0);
//        menu.setTitle("用户管理");
//        menu.setPath("/user");
//        menu.setIcon("TeamOutlined");
//        menu.setComponent("");
//        menu.setAuthority("");
//        menu.setSortNumber(6);
//        menu.setMenuType(0);
//        menuService.save(menu);
//        Integer outUserParentId = menu.getMenuId();
//        menu.setTitle("用户列表");
//        menu.setPath("/user/index");
//        menu.setComponent("/user/index");
//        menu.setIcon("TeamOutlined");
//        menu.setParentId(outUserParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        Integer memberListParentId = menu.getMenuId();
//        menu.setTitle("列表");
//        menu.setParentId(memberListParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setAuthority("shop:member:list");
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("shop:member:save");
//        menuService.save(menu);
//        menu.setTitle("编辑");
//        menu.setAuthority("shop:member:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("shop:member:remove");
//        menuService.save(menu);
//        menu.setTitle("余额明细");
//        menu.setPath("/user/balance-log");
//        menu.setComponent("/user/balance-log");
//        menu.setIcon("WalletOutlined");
//        menu.setParentId(outUserParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(1);
//        menuService.save(menu);
//        Integer balanceLogParentId = menu.getMenuId();
//        menu.setTitle("列表");
//        menu.setParentId(balanceLogParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setAuthority("shop:memberBalanceLog:list");
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("shop:memberBalanceLog:save");
//        menuService.save(menu);
//        menu.setTitle("编辑");
//        menu.setAuthority("shop:memberBalanceLog:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("shop:memberBalanceLog:remove");
//        menuService.save(menu);
//        menu.setTitle("充值记录");
//        menu.setPath("/user/recharge");
//        menu.setComponent("/user/recharge");
//        menu.setIcon("UngroupOutlined");
//        menu.setParentId(outUserParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(2);
//        menuService.save(menu);
//        Integer userRechargeParentId = menu.getMenuId();
//        menu.setTitle("列表");
//        menu.setParentId(userRechargeParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setAuthority("shop:memberRecharge:list");
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("shop:memberRecharge:save");
//        menuService.save(menu);
//        menu.setTitle("编辑");
//        menu.setAuthority("shop:memberRecharge:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("shop:memberRecharge:remove");
//        menuService.save(menu);
//        menu.setTitle("消息提醒");
//        menu.setPath("/user/notice");
//        menu.setComponent("/user/notice");
//        menu.setIcon("SoundOutlined");
//        menu.setParentId(outUserParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(3);
//        menuService.save(menu);
//        Integer userNoticeParentId = menu.getMenuId();
//        menu.setTitle("列表");
//        menu.setParentId(userNoticeParentId);
//        menu.setMenuType(1);
//        menu.setPath("");
//        menu.setIcon("");
//        menu.setComponent("");
//        menu.setAuthority("shop:memberNotice:list");
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("shop:memberNotice:save");
//        menuService.save(menu);
//        menu.setTitle("编辑");
//        menu.setAuthority("shop:memberNotice:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("shop:memberNotice:remove");
//        menuService.save(menu);
//        // 7.内容管理
//        menu.setParentId(0);
//        menu.setTitle("内容管理");
//        menu.setPath("/cms");
//        menu.setComponent("");
//        menu.setAuthority("");
//        menu.setIcon("FileSearchOutlined");
//        menu.setHide(0);
//        menu.setMenuType(0);
//        menu.setSortNumber(7);
//        menuService.save(menu);
//        Integer contentParentId = menu.getMenuId();
//        menu.setTitle("文章管理");
//        menu.setPath("/cms/article");
//        menu.setComponent("/cms/article");
//        menu.setIcon("FileSearchOutlined");
//        menu.setAuthority("");
//        menu.setSortNumber(1);
//        menu.setMenuType(0);
//        menu.setParentId(contentParentId);
//        menuService.save(menu);
//        Integer articleParentId = menu.getMenuId();
//        menu.setParentId(articleParentId);
//        menu.setMenuType(1);
//        menu.setIcon("");
//        menu.setPath("");
//        menu.setComponent("");
//        menu.setTitle("查询");
//        menu.setSortNumber(0);
//        menu.setAuthority("cms:article:list");
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("cms:article:save");
//        menuService.save(menu);
//        menu.setTitle("修改");
//        menu.setAuthority("cms:article:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("cms:article:remove");
//        menuService.save(menu);
//        menu.setTitle("文章分类");
//        menu.setPath("/cms/category");
//        menu.setComponent("/cms/category");
//        menu.setIcon("ApartmentOutlined");
//        menu.setAuthority("");
//        menu.setMenuType(0);
//        menu.setSortNumber(2);
//        menu.setParentId(contentParentId);
//        menuService.save(menu);
//        Integer categoryParentId = menu.getMenuId();
//        menu.setParentId(categoryParentId);
//        menu.setMenuType(1);
//        menu.setIcon("");
//        menu.setPath("");
//        menu.setComponent("");
//        menu.setSortNumber(0);
//        menu.setTitle("查询");
//        menu.setAuthority("cms:articleCategory:list");
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("cms:articleCategory:save");
//        menuService.save(menu);
//        menu.setTitle("修改");
//        menu.setAuthority("cms:articleCategory:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("cms:articleCategory:remove");
//        menuService.save(menu);
//        menu.setTitle("文档管理");
//        menu.setPath("/cms/docs/:id");
//        menu.setComponent("/cms/docs");
//        menu.setIcon("ReadOutlined");
//        menu.setAuthority("");
//        menu.setSortNumber(3);
//        menu.setMenuType(0);
//        menu.setParentId(contentParentId);
//        menuService.save(menu);
//        Integer docsParentId = menu.getMenuId();
//        menu.setParentId(docsParentId);
//        menu.setMenuType(1);
//        menu.setIcon("");
//        menu.setPath("");
//        menu.setComponent("");
//        menu.setSortNumber(0);
//        menu.setTitle("查询");
//        menu.setAuthority("cms:docs:list");
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("cms:docs:save");
//        menuService.save(menu);
//        menu.setTitle("修改");
//        menu.setAuthority("cms:docs:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("cms:docs:remove");
//        menuService.save(menu);
//        menu.setTitle("视频管理");
//        menu.setPath("/cms/video");
//        menu.setComponent("/cms/video");
//        menu.setIcon("YoutubeOutlined");
//        menu.setAuthority("");
//        menu.setSortNumber(4);
//        menu.setMenuType(0);
//        menu.setParentId(contentParentId);
//        menuService.save(menu);
//        Integer cmsVideoParentId = menu.getMenuId();
//        menu.setParentId(cmsVideoParentId);
//        menu.setMenuType(1);
//        menu.setIcon("");
//        menu.setPath("");
//        menu.setComponent("");
//        menu.setSortNumber(0);
//        menu.setTitle("列表");
//        menu.setAuthority("cms:file:list");
//        menuService.save(menu);
//        menu.setTitle("上传");
//        menu.setAuthority("sys:file:upload");
//        menuService.save(menu);
//        menu.setTitle("编辑");
//        menu.setAuthority("sys:file:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("sys:file:remove");
//        menuService.save(menu);
//        menu.setTitle("视频播放");
//        menu.setIcon("");
//        menu.setPath("/cms/video/player");
//        menu.setComponent("/cms/video/player");
//        menu.setMenuType(0);
//        menu.setHide(1);
//        menu.setMeta("{\"active\": \"/cms/video\", \"tabUnique\": false}");
//        menuService.save(menu);
//        menu.setTitle("文件下载");
//        menu.setPath("/cms/down");
//        menu.setComponent("/cms/down");
//        menu.setIcon("LinkOutlined");
//        menu.setAuthority("");
//        menu.setHide(0);
//        menu.setSortNumber(5);
//        menu.setMenuType(0);
//        menu.setParentId(contentParentId);
//        menuService.save(menu);
//        // 8.营销管理
//        menu.setParentId(0);
//        menu.setTitle("营销管理");
//        menu.setPath("/market");
//        menu.setIcon("CrownOutlined");
//        menu.setComponent("");
//        menu.setAuthority("");
//        menu.setSortNumber(8);
//        menu.setMenuType(0);
//        menuService.save(menu);
//        Integer marketParentId = menu.getMenuId();
//        menu.setTitle("优惠券");
//        menu.setPath("/market/coupon");
//        menu.setComponent("/market/coupon");
//        menu.setIcon("TagsOutlined");
//        menu.setParentId(marketParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        Integer marketCouponParentId = menu.getMenuId();
//        menu.setParentId(marketCouponParentId);
//        menu.setMenuType(1);
//        menu.setIcon("");
//        menu.setPath("");
//        menu.setComponent("");
//        menu.setTitle("查询");
//        menu.setSortNumber(0);
//        menu.setAuthority("cms:coupon:list");
//        menuService.save(menu);
//        menu.setTitle("添加");
//        menu.setAuthority("cms:coupon:save");
//        menuService.save(menu);
//        menu.setTitle("修改");
//        menu.setAuthority("cms:coupon:update");
//        menuService.save(menu);
//        menu.setTitle("删除");
//        menu.setAuthority("cms:coupon:remove");
//        menuService.save(menu);
//        menu.setTitle("会员充值");
//        menu.setPath("/market/recharge");
//        menu.setComponent("/market/recharge");
//        menu.setIcon("MoneyCollectOutlined");
//        menu.setParentId(marketParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(1);
//        menuService.save(menu);
//        menu.setTitle("积分管理");
//        menu.setPath("/market/points");
//        menu.setComponent("/market/points");
//        menu.setIcon("PayCircleOutlined");
//        menu.setParentId(marketParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(2);
//        menuService.save(menu);
//        // 9.应用中心
//        menu.setParentId(0);
//        menu.setTitle("应用中心");
//        menu.setPath("/apps");
//        menu.setIcon("AppstoreAddOutlined");
//        menu.setComponent("");
//        menu.setAuthority("");
//        menu.setSortNumber(9);
//        menu.setMenuType(0);
//        menuService.save(menu);
//
//        // 个人中心
//        menu.setParentId(0);
//        menu.setTitle("个人中心");
//        menu.setPath("/user-center");
//        menu.setIcon("UserOutlined");
//        menu.setComponent("");
//        menu.setAuthority("");
//        menu.setMenuType(0);
//        menu.setHide(1);
//        menu.setSortNumber(99);
//        menuService.save(menu);
//        Integer userCenterParentId = menu.getMenuId();
//        menu.setTitle("个人资料");
//        menu.setPath("/user/profile");
//        menu.setComponent("/user/profile");
//        menu.setIcon("IdcardOutlined");
//        menu.setParentId(userCenterParentId);
//        menu.setMenuType(0);
//        menu.setSortNumber(0);
//        menuService.save(menu);
//        Integer userProfileParentId = menu.getMenuId();
//        menu.setParentId(userProfileParentId);
//        menu.setMenuType(1);
//        menu.setIcon("");
//        menu.setPath("");
//        menu.setComponent("");
//        menu.setTitle("修改资料");
//        menu.setSortNumber(0);
//        menu.setAuthority("sys:auth:user");
//        menuService.save(menu);
//        menu.setTitle("修改密码");
//        menu.setAuthority("sys:auth:password");
//        menuService.save(menu);
//        menu.setTitle("上传头像");
//        menu.setAuthority("sys:file:upload");
//        menu.setTitle("预览头像");
//        menu.setAuthority("sys:file:list");
//        menu.setTitle("保存头像");
//        menu.setAuthority("sys:user:update");
//        menuService.save(menu);
//        menu.setParentId(userCenterParentId);
//        menu.setTitle("用户注册");
//        menu.setAuthority("sys:user:save");
//        menuService.save(menu);
//        menu.setTitle("字典查询");
//        menu.setAuthority("sys:dict:list");
//
//        boolean resultMenu = menuService.save(menu);
//        // 添加菜单ID到超级管理员所属角色ID
//        if (resultMenu) {
//          saveRedis(tenant);
//          return success("创建成功");
//        }
//      }
//    }
//    throw new BusinessException("创建失败");
//  }

  @PreAuthorize("hasAuthority('oa:tenant:update')")
  @OperationLog
  @ApiOperation("修改租户")
  @PutMapping()
  public ApiResult<?> update(@RequestBody Tenant tenant) {
    // 验证签名
    isCheckSign();
    saveRedis(tenant);
    if (tenantService.updateById(tenant)) {
      return success("修改成功");
    }
    return fail("修改失败");
  }

  // 缓存租户信息
  private void saveRedis(Tenant tenant) {
    String key = "cache:tenant";
    String tenantId = tenant.getTenantId().toString();
    if (StrUtil.isEmpty(tenant.getTenantCode())) {
      tenant.setTenantCode(CommonUtil.randomUUID16());
    }
    String data = JSONUtil.toJSONString(tenant);
    stringRedisTemplate.opsForHash().put(key,tenantId, data);
  }

  @PreAuthorize("hasAuthority('oa:tenant:remove')")
  @OperationLog
  @ApiOperation("删除租户")
  @DeleteMapping("/{id}")
  public ApiResult<?> remove(@PathVariable("id") Integer id) {
    // 验证签名
    isCheckSign();
    if (tenantService.removeById(id)) {
      String key = "cache:tenant";
      stringRedisTemplate.opsForHash().delete(key,id.toString());
      return success("删除成功");
    }
    return fail("删除失败");
  }

  @PreAuthorize("hasAuthority('oa:tenant:save')")
  @OperationLog
  @ApiOperation("批量添加租户")
  @PostMapping("/batch")
  public ApiResult<?> saveBatch(@RequestBody List<Tenant> list) {
    // 验证签名
    isCheckSign();
    if (tenantService.saveBatch(list)) {
      return success("添加成功");
    }
    return fail("添加失败");
  }

  @PreAuthorize("hasAuthority('oa:tenant:update')")
  @OperationLog
  @ApiOperation("批量修改租户")
  @PutMapping("/batch")
  public ApiResult<?> removeBatch(@RequestBody BatchParam<Tenant> batchParam) {
    // 验证签名
    isCheckSign();
    if (batchParam.update(tenantService, "tenant_id")) {
      return success("修改成功");
    }
    return fail("修改失败");
  }

  @PreAuthorize("hasAuthority('oa:tenant:remove')")
  @OperationLog
  @ApiOperation("批量删除租户")
  @DeleteMapping("/batch")
  public ApiResult<?> removeBatch(@RequestBody List<Integer> ids) {
    // 验证签名
    isCheckSign();
    if (tenantService.removeByIds(ids)) {
      return success("删除成功");
    }
    return fail("删除失败");
  }

  @ApiOperation("租户角色权限初始化")
  @GetMapping("/role-menu/{id}")
  public ApiResult<List<Menu>> initialization(@PathVariable("id") Integer roleId) {
    // 验证签名
    isCheckSign();
    List<Menu> menus = menuService.list(new LambdaQueryWrapper<Menu>().orderByAsc(Menu::getSortNumber));
    List<RoleMenu> roleMenus = roleMenuService.list(new LambdaQueryWrapper<RoleMenu>()
      .eq(RoleMenu::getRoleId, roleId));
    for (Menu menu : menus) {
      menu.setChecked(roleMenus.stream().anyMatch((d) -> d.getMenuId().equals(menu.getMenuId())));
    }
    List<Integer> menuIds = menus.stream().map(Menu::getMenuId).collect(Collectors.toList());
    roleMenuService.remove(new LambdaUpdateWrapper<RoleMenu>().eq(RoleMenu::getRoleId, roleId));
    if (menuIds.size() > 0) {
      List<RoleMenu> roleMenuList = new ArrayList<>();
      for (Integer menuId : menuIds) {
        RoleMenu roleMenu = new RoleMenu();
        roleMenu.setRoleId(roleId);
        roleMenu.setMenuId(menuId);
        roleMenuList.add(roleMenu);
      }
      if (!roleMenuService.saveBatch(roleMenuList)) {
        throw new BusinessException("保存失败");
      }
    }
    return success(menus);
  }

}
