Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

caozj před 2 roky
rodič
revize
91e41dc43a
22 změnil soubory, kde provedl 714 přidání a 209 odebrání
  1. 79 0
      bladex/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/AppMenu.java
  2. 40 0
      bladex/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/AppRoleMenu.java
  3. 9 0
      bladex/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Tenant.java
  4. 20 0
      bladex/blade-service-api/blade-system-api/src/main/java/org/springblade/system/enums/TenantTypeEnum.java
  5. 9 0
      bladex/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
  6. 57 0
      bladex/blade-service/blade-system/src/main/java/org/springblade/system/controller/AppMenuController.java
  7. 16 0
      bladex/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AppMenuMapper.java
  8. 5 0
      bladex/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AppMenuMapper.xml
  9. 16 0
      bladex/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AppRoleMenuMapper.java
  10. 5 0
      bladex/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AppRoleMenuMapper.xml
  11. 21 0
      bladex/blade-service/blade-system/src/main/java/org/springblade/system/service/AppMenuService.java
  12. 21 0
      bladex/blade-service/blade-system/src/main/java/org/springblade/system/service/AppRoleMenuService.java
  13. 70 0
      bladex/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AppMenuServiceImpl.java
  14. 42 0
      bladex/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AppRoleMenuServiceImpl.java
  15. 251 198
      bladex/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java
  16. 7 0
      bladex/blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java
  17. 3 0
      bladex/blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
  18. 19 4
      bladex/blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java
  19. 4 7
      hx-common/hx-tool/src/main/java/com/fjhx/utils/HmacUtil.java
  20. 12 0
      hx-service/storage/src/main/java/com/fjhx/applet/mapper/FabricStatisticsMapper.java
  21. 4 0
      hx-service/storage/src/main/java/com/fjhx/applet/mapper/InkStatisticsMapper.java
  22. 4 0
      hx-service/storage/src/main/java/com/fjhx/task/mapper/ScheduleTaskMapper.java

+ 79 - 0
bladex/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/AppMenu.java

@@ -0,0 +1,79 @@
+package org.springblade.system.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * app目录
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-28
+ */
+@Data
+public class AppMenu implements Serializable {
+
+    /**
+     * 主键
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 菜单名称
+     */
+    private String name;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 键值
+     */
+    private String menuKey;
+
+    /**
+     * 图标
+     */
+    private String icon;
+
+    /**
+     * 父级ID
+     */
+    private Long parentId;
+
+    /**
+     * 状态   0隐藏  1显示
+     */
+    private Integer status;
+
+    /**
+     * 描述
+     */
+    private String remark;
+
+    /**
+     * 租户id
+     */
+    private String tenantId;
+
+    /**
+     * 是否已删除
+     */
+    @TableLogic
+    @ApiModelProperty(value = "是否已删除")
+    private Integer isDeleted;
+
+
+}

+ 40 - 0
bladex/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/AppRoleMenu.java

@@ -0,0 +1,40 @@
+package org.springblade.system.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-28
+ */
+@Data
+public class AppRoleMenu implements Serializable {
+
+    /**
+     * 主键
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * app菜单id
+     */
+    private Long appMenuId;
+
+    /**
+     * 角色id
+     */
+    private Long roleId;
+
+
+}

+ 9 - 0
bladex/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Tenant.java

@@ -111,5 +111,14 @@ public class Tenant extends BaseEntity {
      */
     private Long provinceId;
 
+    /**
+     * 租户类型 1终端企业 2服务商
+     */
+    private Integer type;
+
+    /**
+     * logo
+     */
+    private String logoUrl;
 
 }

+ 20 - 0
bladex/blade-service-api/blade-system-api/src/main/java/org/springblade/system/enums/TenantTypeEnum.java

@@ -0,0 +1,20 @@
+package org.springblade.system.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum TenantTypeEnum {
+
+    TERMINAL_ENTERPRISE(1, "终端企业"),
+    SERVICE_PROVIDER(2, "服务商");
+
+    private final Integer code;
+
+    private final String message;
+
+    TenantTypeEnum(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+}

+ 9 - 0
bladex/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java

@@ -29,6 +29,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * User Feign接口类
@@ -52,6 +53,8 @@ public interface IUserClient {
     String USER_INFO_BY_IDS = API_PREFIX + "/user-info-by-ids";
     String UPDATE_USER_BY_ID = API_PREFIX + "/user-update-by-id";
     String GET_USER_INFO_BY_APPLET_OPEN_ID = API_PREFIX + "/get-user-info-by-id";
+    String GET_TENANT_USER_NUM = API_PREFIX + "/get-tenant-user-num";
+
 
     /**
      * 获取用户信息
@@ -152,4 +155,10 @@ public interface IUserClient {
     @PostMapping(GET_USER_INFO_BY_APPLET_OPEN_ID)
     User getUserInfoByAppletOpenId(@RequestParam("openId") String openId);
 
+    /**
+     * 获取指定租户的用户数量
+     */
+    @GetMapping(GET_TENANT_USER_NUM)
+    Map<String, Long> getTenantUserNum(@RequestParam("tenantIdList") List<String> tenantIdList);
+
 }

+ 57 - 0
bladex/blade-service/blade-system/src/main/java/org/springblade/system/controller/AppMenuController.java

@@ -0,0 +1,57 @@
+package org.springblade.system.controller;
+
+import org.springblade.core.tool.api.R;
+import org.springblade.system.entity.AppMenu;
+import org.springblade.system.entity.AppRoleMenu;
+import org.springblade.system.service.AppMenuService;
+import org.springblade.system.service.AppRoleMenuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/appMenu")
+public class AppMenuController {
+
+    @Autowired
+    private AppMenuService appMenuService;
+
+    @Autowired
+    private AppRoleMenuService appRoleMenuService;
+
+    @PostMapping("/tree")
+    public R tree(@RequestBody Map<String, String> condition) {
+        List<Map<String, Object>> result = appMenuService.tree(condition);
+        return R.success(result);
+    }
+
+    @PostMapping("/bindRole")
+    public R bindRole(Map<String, Object> condition) {
+        appRoleMenuService.bindRole(condition);
+        return R.success();
+    }
+
+    @PostMapping("/add")
+    public R add(@RequestBody AppMenu appMenu) {
+        appMenuService.save(appMenu);
+        return R.success();
+    }
+
+    @PostMapping("/edit")
+    public R edit(@RequestBody AppMenu appMenu) {
+        appMenuService.updateById(appMenu);
+        return R.success();
+    }
+
+    @PostMapping("/delete")
+    public R delete(@RequestBody AppMenu appMenu) {
+        appMenuService.removeById(appMenu.getId());
+        return R.success();
+    }
+
+}

+ 16 - 0
bladex/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AppMenuMapper.java

@@ -0,0 +1,16 @@
+package org.springblade.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.system.entity.AppMenu;
+
+/**
+ * <p>
+ * app目录 Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-28
+ */
+public interface AppMenuMapper extends BaseMapper<AppMenu> {
+
+}

+ 5 - 0
bladex/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AppMenuMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.system.mapper.AppMenuMapper">
+
+</mapper>

+ 16 - 0
bladex/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AppRoleMenuMapper.java

@@ -0,0 +1,16 @@
+package org.springblade.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.system.entity.AppRoleMenu;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-28
+ */
+public interface AppRoleMenuMapper extends BaseMapper<AppRoleMenu> {
+
+}

+ 5 - 0
bladex/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AppRoleMenuMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.system.mapper.AppRoleMenuMapper">
+
+</mapper>

+ 21 - 0
bladex/blade-service/blade-system/src/main/java/org/springblade/system/service/AppMenuService.java

@@ -0,0 +1,21 @@
+package org.springblade.system.service;
+
+import com.fjhx.base.BaseService;
+import org.springblade.system.entity.AppMenu;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * app目录 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-28
+ */
+public interface AppMenuService extends BaseService<AppMenu> {
+
+    List<Map<String, Object>> tree(Map<String, String> condition);
+
+}

+ 21 - 0
bladex/blade-service/blade-system/src/main/java/org/springblade/system/service/AppRoleMenuService.java

@@ -0,0 +1,21 @@
+package org.springblade.system.service;
+
+import com.fjhx.base.BaseService;
+import org.springblade.system.entity.AppRoleMenu;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-28
+ */
+public interface AppRoleMenuService extends BaseService<AppRoleMenu> {
+
+    void bindRole(Map<String, Object> condition);
+
+}

+ 70 - 0
bladex/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AppMenuServiceImpl.java

@@ -0,0 +1,70 @@
+package org.springblade.system.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.utils.TreeUtil;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.system.entity.AppMenu;
+import org.springblade.system.entity.AppRoleMenu;
+import org.springblade.system.mapper.AppMenuMapper;
+import org.springblade.system.service.AppMenuService;
+import org.springblade.system.service.AppRoleMenuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * app目录 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-28
+ */
+@Service
+public class AppMenuServiceImpl extends ServiceImpl<AppMenuMapper, AppMenu> implements AppMenuService {
+
+    @Autowired
+    private AppRoleMenuService appRoleMenuService;
+
+    @Override
+    public List<Map<String, Object>> tree(Map<String, String> condition) {
+
+        // 获取目录
+        String status = condition.get("status");
+        String own = condition.get("own");
+
+        LambdaQueryChainWrapper<AppMenu> appMenuLambdaQueryChainWrapper = lambdaQuery();
+
+        // 是否之查当前用户拥有权限的菜单
+        if (ObjectUtil.isNotEmpty(own) && own.equals("1")) {
+            // 获取用户角色
+            String userRole = AuthUtil.getUserRole();
+            String[] userRoleList = userRole.split(",");
+            if (userRoleList.length == 0) throw new ServiceException("没有角色权限");
+
+            // 获取角色访问目录权限
+            List<AppRoleMenu> list = appRoleMenuService.list(
+                    Wrappers.<AppRoleMenu>lambdaUpdate().in(AppRoleMenu::getRoleId, (Object[]) userRoleList));
+            if (list.size() == 0) throw new ServiceException("没有目录访问权限");
+            List<Long> appMenuId = list.stream().map(AppRoleMenu::getAppMenuId).collect(Collectors.toList());
+
+            appMenuLambdaQueryChainWrapper.in(AppMenu::getId, appMenuId);
+        } else {
+            appMenuLambdaQueryChainWrapper.eq(AppMenu::getTenantId, AuthUtil.getTenantId());
+        }
+
+        List<AppMenu> appMenuList = appMenuLambdaQueryChainWrapper
+                .eq(ObjectUtil.isNotEmpty(status), AppMenu::getStatus, status)
+                .orderByAsc(AppMenu::getSort)
+                .list();
+
+        return TreeUtil.buildTreeObj(appMenuList);
+    }
+}

+ 42 - 0
bladex/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AppRoleMenuServiceImpl.java

@@ -0,0 +1,42 @@
+package org.springblade.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.system.entity.AppRoleMenu;
+import org.springblade.system.mapper.AppRoleMenuMapper;
+import org.springblade.system.service.AppRoleMenuService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-28
+ */
+@Service
+public class AppRoleMenuServiceImpl extends ServiceImpl<AppRoleMenuMapper, AppRoleMenu> implements AppRoleMenuService {
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void bindRole(Map<String, Object> condition) {
+        Long roleId = (Long) condition.get("roleId");
+        List<Long> appMenuIdList = (List<Long>) condition.get("appMenuIdList");
+
+        List<AppRoleMenu> appRoleMenuList = appMenuIdList.stream().map(item -> {
+            AppRoleMenu appRoleMenu = new AppRoleMenu();
+            appRoleMenu.setRoleId(roleId);
+            appRoleMenu.setAppMenuId(item);
+            return appRoleMenu;
+        }).collect(Collectors.toList());
+
+        remove(AppRoleMenu::getRoleId, roleId);
+        saveBatch(appRoleMenuList);
+    }
+
+}

+ 251 - 198
bladex/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java

@@ -16,10 +16,13 @@
  */
 package org.springblade.system.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.utils.Assert;
 import com.fjhx.utils.HxBeanUtil;
 import lombok.AllArgsConstructor;
 import org.springblade.core.cache.utils.CacheUtil;
@@ -35,6 +38,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.system.cache.ParamCache;
 import org.springblade.system.entity.*;
+import org.springblade.system.enums.TenantTypeEnum;
 import org.springblade.system.mapper.TenantMapper;
 import org.springblade.system.service.*;
 import org.springblade.system.user.entity.User;
@@ -58,204 +62,253 @@ import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 @AllArgsConstructor
 public class TenantServiceImpl extends BaseServiceImpl<TenantMapper, Tenant> implements ITenantService {
 
-	private final TenantId tenantId;
-	private final IRoleService roleService;
-	private final IMenuService menuService;
-	private final IDeptService deptService;
-	private final IPostService postService;
-	private final IRoleMenuService roleMenuService;
-	private final IDictBizService dictBizService;
-	private final IUserClient userClient;
-
-	@Override
-	public IPage<Tenant> selectTenantPage(IPage<Tenant> page, Tenant tenant) {
-		return page.setRecords(baseMapper.selectTenantPage(page, tenant));
-	}
-
-	@Override
-	public Tenant getByTenantId(String tenantId) {
-		return getOne(Wrappers.<Tenant>query().lambda().eq(Tenant::getTenantId, tenantId));
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public boolean submitTenant(Tenant tenant) {
-		if (Func.isEmpty(tenant.getId())) {
-			List<Tenant> tenants = baseMapper.selectList(Wrappers.<Tenant>query().lambda().eq(Tenant::getIsDeleted, BladeConstant.DB_NOT_DELETED));
-			List<String> codes = tenants.stream().map(Tenant::getTenantId).collect(Collectors.toList());
-			String tenantId = getTenantId(codes);
-			tenant.setTenantId(tenantId);
-			// 获取参数配置的账号额度
-			int accountNumber = Func.toInt(ParamCache.getValue(ACCOUNT_NUMBER_KEY), DEFAULT_ACCOUNT_NUMBER);
-			tenant.setAccountNumber(accountNumber);
-			// 新建租户对应的默认角色
-			Role role = new Role();
-			role.setTenantId(tenantId);
-			role.setParentId(BladeConstant.TOP_PARENT_ID);
-			role.setRoleName("管理员");
-			role.setRoleAlias("admin");
-			role.setSort(2);
-			role.setIsDeleted(BladeConstant.DB_NOT_DELETED);
-			roleService.save(role);
-			// 新建租户对应的角色菜单权限
-			LinkedList<Menu> userMenus = new LinkedList<>();
-			// 获取参数配置的默认菜单集合,逗号隔开
-			List<String> menuCodes = Func.toStrList(ParamCache.getValue(ACCOUNT_MENU_CODE_KEY));
-			List<Menu> menus = getMenus((menuCodes.size() > 0 ? menuCodes : MENU_CODES), userMenus);
-			List<RoleMenu> roleMenus = new ArrayList<>();
-			menus.forEach(menu -> {
-				RoleMenu roleMenu = new RoleMenu();
-				roleMenu.setMenuId(menu.getId());
-				roleMenu.setRoleId(role.getId());
-				roleMenus.add(roleMenu);
-			});
-			roleMenuService.saveBatch(roleMenus);
-			// 新建租户对应的默认部门
-			Dept dept = new Dept();
-			dept.setTenantId(tenantId);
-			dept.setParentId(BladeConstant.TOP_PARENT_ID);
-			dept.setAncestors(String.valueOf(BladeConstant.TOP_PARENT_ID));
-			dept.setDeptName(tenant.getTenantName());
-			dept.setFullName(tenant.getTenantName());
-			dept.setDeptCategory(1);
-			dept.setSort(2);
-			dept.setIsDeleted(BladeConstant.DB_NOT_DELETED);
-			deptService.save(dept);
-			// 新建租户对应的默认岗位
-			Post post = new Post();
-			post.setTenantId(tenantId);
-			post.setCategory(1);
-			post.setPostCode("ceo");
-			post.setPostName("首席执行官");
-			post.setSort(1);
-			postService.save(post);
-			// 新建租户对应的默认业务字典
-			LinkedList<DictBiz> dictBizs = new LinkedList<>();
-			List<DictBiz> dictBizList = getDictBizs(tenantId, dictBizs);
-			dictBizService.saveBatch(dictBizList);
-			// 新建租户对应的默认管理用户
-			User user = new User();
-			user.setTenantId(tenantId);
-			user.setName("admin");
-			user.setRealName("admin");
-			user.setAccount("admin");
-			// 获取参数配置的密码
-			String password = Func.toStr(ParamCache.getValue(PASSWORD_KEY), DEFAULT_PASSWORD);
-			user.setPassword(password);
-			user.setRoleId(String.valueOf(role.getId()));
-			user.setDeptId(String.valueOf(dept.getId()));
-			user.setPostId(String.valueOf(post.getId()));
-			user.setBirthday(new Date());
-			user.setSex(1);
-			user.setUserType(UserEnum.WEB.getCategory());
-			user.setIsDeleted(BladeConstant.DB_NOT_DELETED);
-			boolean temp = super.saveOrUpdate(tenant);
-			R<Boolean> result = userClient.saveUser(user);
-			if (!result.isSuccess()) {
-				throw new ServiceException(result.getMsg());
-			}
-			return temp;
-		} else {
-			CacheUtil.clear(SYS_CACHE, tenant.getTenantId());
-			return super.saveOrUpdate(tenant);
-		}
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public boolean removeTenant(List<Long> ids) {
-		List<String> tenantIds = this.list(Wrappers.<Tenant>query().lambda().in(Tenant::getId, ids))
-			.stream().map(tenant -> Func.toStr(tenant.getTenantId())).distinct().collect(Collectors.toList());
-		CacheUtil.clear(SYS_CACHE, tenantIds);
-		if (tenantIds.contains(BladeConstant.ADMIN_TENANT_ID)) {
-			throw new ServiceException("不可删除管理租户!");
-		}
-		boolean tenantTemp = this.deleteLogic(ids);
-		R<Boolean> result = userClient.removeUser(StringUtil.join(tenantIds));
-		if (!result.isSuccess()) {
-			throw new ServiceException(result.getMsg());
-		}
-		return tenantTemp;
-	}
-
-	@Override
-	public boolean setting(Integer accountNumber, Date expireTime, String ids) {
-		List<String> tenantIds = this.list(Wrappers.<Tenant>query().lambda().in(Tenant::getId, ids))
-			.stream().map(tenant -> Func.toStr(tenant.getTenantId())).distinct().collect(Collectors.toList());
-		CacheUtil.clear(SYS_CACHE, tenantIds);
-		Func.toLongList(ids).forEach(id -> {
-			Kv kv = Kv.create().set("accountNumber", accountNumber).set("expireTime", expireTime).set("id", id);
-			String licenseKey = DesUtil.encryptToHex(JsonUtil.toJson(kv), DES_KEY);
-			update(
-				Wrappers.<Tenant>update().lambda()
-					.set(Tenant::getAccountNumber, accountNumber)
-					.set(Tenant::getExpireTime, expireTime)
-					.set(Tenant::getLicenseKey, licenseKey)
-					.eq(Tenant::getId, id)
-			);
-		});
-		return true;
-	}
-
-	@Override
-	public IPage<Map<String, Object>> listPackaging(IPage<Tenant> pages) {
-
-		Page<Map<String, Object>> mapPage = HxBeanUtil.copyPageEx(pages);
-
-
-		return mapPage;
-	}
-
-	private String getTenantId(List<String> codes) {
-		String code = tenantId.generate();
-		if (codes.contains(code)) {
-			return getTenantId(codes);
-		}
-		return code;
-	}
-
-	private List<Menu> getMenus(List<String> codes, LinkedList<Menu> menus) {
-		codes.forEach(code -> {
-			Menu menu = menuService.getOne(Wrappers.<Menu>query().lambda().eq(Menu::getCode, code).eq(Menu::getIsDeleted, BladeConstant.DB_NOT_DELETED));
-			if (menu != null) {
-				menus.add(menu);
-				recursionMenu(menu.getId(), menus);
-			}
-		});
-		return menus;
-	}
-
-	private void recursionMenu(Long parentId, LinkedList<Menu> menus) {
-		List<Menu> menuList = menuService.list(Wrappers.<Menu>query().lambda().eq(Menu::getParentId, parentId).eq(Menu::getIsDeleted, BladeConstant.DB_NOT_DELETED));
-		menus.addAll(menuList);
-		menuList.forEach(menu -> recursionMenu(menu.getId(), menus));
-	}
-
-	private List<DictBiz> getDictBizs(String tenantId, LinkedList<DictBiz> dictBizs) {
-		List<DictBiz> dictBizList = dictBizService.list(Wrappers.<DictBiz>query().lambda().eq(DictBiz::getParentId, BladeConstant.TOP_PARENT_ID).eq(DictBiz::getIsDeleted, BladeConstant.DB_NOT_DELETED));
-		dictBizList.forEach(dictBiz -> {
-			Long oldParentId = dictBiz.getId();
-			Long newParentId = IdWorker.getId();
-			dictBiz.setId(newParentId);
-			dictBiz.setTenantId(tenantId);
-			dictBizs.add(dictBiz);
-			recursionDictBiz(tenantId, oldParentId, newParentId, dictBizs);
-		});
-		return dictBizs;
-	}
-
-	private void recursionDictBiz(String tenantId, Long oldParentId, Long newParentId, LinkedList<DictBiz> dictBizs) {
-		List<DictBiz> dictBizList = dictBizService.list(Wrappers.<DictBiz>query().lambda().eq(DictBiz::getParentId, oldParentId).eq(DictBiz::getIsDeleted, BladeConstant.DB_NOT_DELETED));
-		dictBizList.forEach(dictBiz -> {
-			Long oldSubParentId = dictBiz.getId();
-			Long newSubParentId = IdWorker.getId();
-			dictBiz.setId(newSubParentId);
-			dictBiz.setTenantId(tenantId);
-			dictBiz.setParentId(newParentId);
-			dictBizs.add(dictBiz);
-			recursionDictBiz(tenantId, oldSubParentId, newSubParentId, dictBizs);
-		});
-	}
+    private final TenantId tenantId;
+    private final IRoleService roleService;
+    private final IMenuService menuService;
+    private final IDeptService deptService;
+    private final IPostService postService;
+    private final IRoleMenuService roleMenuService;
+    private final IDictBizService dictBizService;
+    private final IUserClient userClient;
+
+    @Override
+    public IPage<Tenant> selectTenantPage(IPage<Tenant> page, Tenant tenant) {
+        return page.setRecords(baseMapper.selectTenantPage(page, tenant));
+    }
+
+    @Override
+    public Tenant getByTenantId(String tenantId) {
+        return getOne(Wrappers.<Tenant>query().lambda().eq(Tenant::getTenantId, tenantId));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean submitTenant(Tenant tenant) {
+        if (Func.isEmpty(tenant.getId())) {
+
+//            List<Tenant> tenants = baseMapper.selectList(Wrappers.<Tenant>lambdaQuery().eq(Tenant::getIsDeleted, BladeConstant.DB_NOT_DELETED));
+//            List<String> codes = tenants.stream().map(Tenant::getTenantId).collect(Collectors.toList());
+//            String tenantId = getTenantId(codes);
+//            tenant.setTenantId(tenantId);
+
+            String tenantId = tenant.getTenantId();
+            Assert.notEmpty(tenantId, "租户id不能为空");
+
+            int count = count(Wrappers.<Tenant>lambdaQuery().eq(Tenant::getTenantId, tenant));
+            Assert.eqZero(count, "租户id已存在");
+
+            Integer type = tenant.getType();
+            Assert.notEmpty(type, "租户类型不能为空");
+
+            // 获取参数配置的账号额度
+            int accountNumber = Func.toInt(ParamCache.getValue(ACCOUNT_NUMBER_KEY), DEFAULT_ACCOUNT_NUMBER);
+            tenant.setAccountNumber(accountNumber);
+
+            // 新建租户对应的默认角色
+            Role role = new Role();
+            role.setTenantId(tenantId);
+            role.setParentId(BladeConstant.TOP_PARENT_ID);
+            role.setRoleName("管理员");
+            role.setRoleAlias("admin");
+            role.setSort(2);
+            role.setIsDeleted(BladeConstant.DB_NOT_DELETED);
+
+            // 类型为服务商新增运维人员角色
+            if (type.equals(TenantTypeEnum.SERVICE_PROVIDER.getCode())) {
+                Role serviceRole = new Role();
+                serviceRole.setTenantId(tenantId);
+                serviceRole.setParentId(BladeConstant.TOP_PARENT_ID);
+                serviceRole.setRoleName("运维人员");
+                serviceRole.setRoleAlias("devPos");
+                serviceRole.setSort(3);
+                serviceRole.setIsDeleted(BladeConstant.DB_NOT_DELETED);
+                roleService.saveBatch(Arrays.asList(role, serviceRole));
+            } else {
+                roleService.save(role);
+            }
+
+            // 新建租户对应的角色菜单权限
+            LinkedList<Menu> userMenus = new LinkedList<>();
+            // 获取参数配置的默认菜单集合,逗号隔开
+            List<String> menuCodes = Func.toStrList(ParamCache.getValue(ACCOUNT_MENU_CODE_KEY));
+            List<Menu> menus = getMenus((menuCodes.size() > 0 ? menuCodes : MENU_CODES), userMenus);
+            List<RoleMenu> roleMenus = new ArrayList<>();
+            menus.forEach(menu -> {
+                RoleMenu roleMenu = new RoleMenu();
+                roleMenu.setMenuId(menu.getId());
+                roleMenu.setRoleId(role.getId());
+                roleMenus.add(roleMenu);
+            });
+            roleMenuService.saveBatch(roleMenus);
+
+            // 新建租户对应的默认部门
+            Dept dept = new Dept();
+            dept.setTenantId(tenantId);
+            dept.setParentId(BladeConstant.TOP_PARENT_ID);
+            dept.setAncestors(String.valueOf(BladeConstant.TOP_PARENT_ID));
+            dept.setDeptName(tenant.getTenantName());
+            dept.setFullName(tenant.getTenantName());
+            dept.setDeptCategory(1);
+            dept.setSort(2);
+            dept.setIsDeleted(BladeConstant.DB_NOT_DELETED);
+            deptService.save(dept);
+
+            // 新建租户对应的默认岗位
+            Post post = new Post();
+            post.setTenantId(tenantId);
+            post.setCategory(1);
+            post.setPostCode("ceo");
+            post.setPostName("首席执行官");
+            post.setSort(1);
+            postService.save(post);
+
+            // 新建租户对应的默认业务字典
+            LinkedList<DictBiz> dictBizs = new LinkedList<>();
+            List<DictBiz> dictBizList = getDictBizs(tenantId, dictBizs);
+            dictBizService.saveBatch(dictBizList);
+
+            // 新建租户对应的默认管理用户
+            User user = new User();
+            user.setTenantId(tenantId);
+            user.setName("admin");
+            user.setRealName("admin");
+            user.setAccount("admin");
+            // 获取参数配置的密码
+            String password = Func.toStr(ParamCache.getValue(PASSWORD_KEY), DEFAULT_PASSWORD);
+            user.setPassword(password);
+            user.setRoleId(String.valueOf(role.getId()));
+            user.setDeptId(String.valueOf(dept.getId()));
+            user.setPostId(String.valueOf(post.getId()));
+            user.setBirthday(new Date());
+            user.setSex(1);
+            user.setUserType(UserEnum.WEB.getCategory());
+            user.setIsDeleted(BladeConstant.DB_NOT_DELETED);
+            boolean temp = super.saveOrUpdate(tenant);
+
+            R<Boolean> result = userClient.saveUser(user);
+            if (!result.isSuccess()) {
+                throw new ServiceException(result.getMsg());
+            }
+            return temp;
+        } else {
+            CacheUtil.clear(SYS_CACHE, tenant.getTenantId());
+            return super.saveOrUpdate(tenant);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean removeTenant(List<Long> ids) {
+        List<String> tenantIds = this.list(Wrappers.<Tenant>query().lambda().in(Tenant::getId, ids))
+                .stream().map(tenant -> Func.toStr(tenant.getTenantId())).distinct().collect(Collectors.toList());
+        CacheUtil.clear(SYS_CACHE, tenantIds);
+        if (tenantIds.contains(BladeConstant.ADMIN_TENANT_ID)) {
+            throw new ServiceException("不可删除管理租户!");
+        }
+        boolean tenantTemp = this.deleteLogic(ids);
+        R<Boolean> result = userClient.removeUser(StringUtil.join(tenantIds));
+        if (!result.isSuccess()) {
+            throw new ServiceException(result.getMsg());
+        }
+        return tenantTemp;
+    }
+
+    @Override
+    public boolean setting(Integer accountNumber, Date expireTime, String ids) {
+        List<String> tenantIds = this.list(Wrappers.<Tenant>query().lambda().in(Tenant::getId, ids))
+                .stream().map(tenant -> Func.toStr(tenant.getTenantId())).distinct().collect(Collectors.toList());
+        CacheUtil.clear(SYS_CACHE, tenantIds);
+        Func.toLongList(ids).forEach(id -> {
+            Kv kv = Kv.create().set("accountNumber", accountNumber).set("expireTime", expireTime).set("id", id);
+            String licenseKey = DesUtil.encryptToHex(JsonUtil.toJson(kv), DES_KEY);
+            update(
+                    Wrappers.<Tenant>update().lambda()
+                            .set(Tenant::getAccountNumber, accountNumber)
+                            .set(Tenant::getExpireTime, expireTime)
+                            .set(Tenant::getLicenseKey, licenseKey)
+                            .eq(Tenant::getId, id)
+            );
+        });
+        return true;
+    }
+
+    @Override
+    public IPage<Map<String, Object>> listPackaging(IPage<Tenant> pages) {
+
+        // 查询租户已开通账号数
+        List<Tenant> records = pages.getRecords();
+        List<String> tantIdList = records.stream().map(Tenant::getTenantId).collect(Collectors.toList());
+        Map<String, Long> tenantUserNumMap = userClient.getTenantUserNum(tantIdList);
+
+        Page<Map<String, Object>> mapPage = HxBeanUtil.copyPageEx(pages);
+
+        for (Map<String, Object> record : mapPage.getRecords()) {
+            // 赋值租户开通账户数量
+            String tenantId = record.get("tenantId").toString();
+            Long userNum = tenantUserNumMap.get(tenantId);
+            record.put("userNum", userNum);
+
+            // 日期账户到期数据格式化为yyyy-MM-dd
+            Object expireTime = record.get("expireTime");
+            if (ObjectUtil.isNotEmpty(expireTime)) {
+                record.put("expireTime", DateUtil.format((Date) expireTime, "yyyy-MM-dd"));
+            }
+
+        }
+
+        return mapPage;
+    }
+
+    private String getTenantId(List<String> codes) {
+        String code = tenantId.generate();
+        if (codes.contains(code)) {
+            return getTenantId(codes);
+        }
+        return code;
+    }
+
+    private List<Menu> getMenus(List<String> codes, LinkedList<Menu> menus) {
+        codes.forEach(code -> {
+            Menu menu = menuService.getOne(Wrappers.<Menu>query().lambda().eq(Menu::getCode, code).eq(Menu::getIsDeleted, BladeConstant.DB_NOT_DELETED));
+            if (menu != null) {
+                menus.add(menu);
+                recursionMenu(menu.getId(), menus);
+            }
+        });
+        return menus;
+    }
+
+    private void recursionMenu(Long parentId, LinkedList<Menu> menus) {
+        List<Menu> menuList = menuService.list(Wrappers.<Menu>query().lambda().eq(Menu::getParentId, parentId).eq(Menu::getIsDeleted, BladeConstant.DB_NOT_DELETED));
+        menus.addAll(menuList);
+        menuList.forEach(menu -> recursionMenu(menu.getId(), menus));
+    }
+
+    private List<DictBiz> getDictBizs(String tenantId, LinkedList<DictBiz> dictBizs) {
+        List<DictBiz> dictBizList = dictBizService.list(Wrappers.<DictBiz>query().lambda().eq(DictBiz::getParentId, BladeConstant.TOP_PARENT_ID).eq(DictBiz::getIsDeleted, BladeConstant.DB_NOT_DELETED));
+        dictBizList.forEach(dictBiz -> {
+            Long oldParentId = dictBiz.getId();
+            Long newParentId = IdWorker.getId();
+            dictBiz.setId(newParentId);
+            dictBiz.setTenantId(tenantId);
+            dictBizs.add(dictBiz);
+            recursionDictBiz(tenantId, oldParentId, newParentId, dictBizs);
+        });
+        return dictBizs;
+    }
+
+    private void recursionDictBiz(String tenantId, Long oldParentId, Long newParentId, LinkedList<DictBiz> dictBizs) {
+        List<DictBiz> dictBizList = dictBizService.list(Wrappers.<DictBiz>query().lambda().eq(DictBiz::getParentId, oldParentId).eq(DictBiz::getIsDeleted, BladeConstant.DB_NOT_DELETED));
+        dictBizList.forEach(dictBiz -> {
+            Long oldSubParentId = dictBiz.getId();
+            Long newSubParentId = IdWorker.getId();
+            dictBiz.setId(newSubParentId);
+            dictBiz.setTenantId(tenantId);
+            dictBiz.setParentId(newParentId);
+            dictBizs.add(dictBiz);
+            recursionDictBiz(tenantId, oldSubParentId, newSubParentId, dictBizs);
+        });
+    }
 
 
 }

+ 7 - 0
bladex/blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java

@@ -32,6 +32,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 用户服务Feign实现类
@@ -111,4 +112,10 @@ public class UserClient implements IUserClient {
         return service.getUserInfoByAppletOpenId(openId);
     }
 
+    @GetMapping(GET_TENANT_USER_NUM)
+    @Override
+    public Map<String, Long> getTenantUserNum(List<String> tenantIdList) {
+        return service.getTenantUserNum(tenantIdList);
+    }
+
 }

+ 3 - 0
bladex/blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java

@@ -29,6 +29,7 @@ import org.springblade.system.user.excel.UserExcel;
 import org.springblade.system.user.vo.UserVO;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 服务类
@@ -210,4 +211,6 @@ public interface IUserService extends BaseService<User> {
 
 	User getUserInfoByAppletOpenId(String openId);
 
+    Map<String, Long> getTenantUserNum(List<String> tenantIdList);
+
 }

+ 19 - 4
bladex/blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -19,6 +19,7 @@ package org.springblade.system.user.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -56,10 +57,8 @@ import org.springblade.system.user.wrapper.UserWrapper;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static org.springblade.common.constant.CommonConstant.DEFAULT_PARAM_PASSWORD;
 
@@ -450,4 +449,20 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         return getOne(wrapper);
     }
 
+    @Override
+    public Map<String, Long> getTenantUserNum(List<String> tenantIdList) {
+
+        QueryWrapper<User> wrapper = Wrappers.<User>query()
+                .select("tenant_id tenantId", "count(tenant_id) num")
+                .in("tenant_id", tenantIdList)
+                .groupBy("tenant_id");
+
+        List<Map<String, Object>> list = listMaps(wrapper);
+
+        return list.stream().collect(Collectors.toMap(
+                item -> item.get("tenantId").toString(),
+                item -> (Long) item.get("num"))
+        );
+    }
+
 }

+ 4 - 7
hx-common/hx-tool/src/main/java/com/fjhx/utils/HmacUtil.java

@@ -10,6 +10,7 @@ import java.security.NoSuchAlgorithmException;
 
 /**
  * hmac签名
+ *
  * @Author:caozj
  * @DATE:2022/7/27 19:51
  */
@@ -22,7 +23,7 @@ public class HmacUtil {
      * HmacSHA256加密
      *
      * @param input 需要加密得参数
-     * @param key 密钥
+     * @param key   密钥
      * @return 加密后的值
      **/
     public static String encrypt(String input, String key) {
@@ -48,7 +49,7 @@ public class HmacUtil {
     /**
      * byte数组转16进制字符串
      *
-     * @param  bytes byte数组
+     * @param bytes byte数组
      * @return hex字符串
      */
     public static String bytesToHexStr(byte[] bytes) {
@@ -62,9 +63,5 @@ public class HmacUtil {
         }
         return hexStr.toString();
     }
-    public static void main(String[] args) {
-        System.out.println(System.currentTimeMillis());
-        String valSha256 = HmacUtil.encrypt("fjhx"+ System.currentTimeMillis(), "fjhx@2012");
-        System.out.println(valSha256);
-    }
+
 }

+ 12 - 0
hx-service/storage/src/main/java/com/fjhx/applet/mapper/FabricStatisticsMapper.java

@@ -4,32 +4,44 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fjhx.base.BaseEntity;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.core.tenant.annotation.TenantIgnore;
 
 import java.util.List;
 import java.util.Map;
 
 public interface FabricStatisticsMapper extends BaseMapper<BaseEntity> {
 
+    @TenantIgnore
     List<Map<String, Object>> selectFabricDetails();
 
+    @TenantIgnore
     List<Map<String, Object>> selectFabricTypeDetails(@Param("ew") QueryWrapper<Object> wrapper);
 
+    @TenantIgnore
     List<Map<String, Object>> selectFabricWDetails(@Param("ew") QueryWrapper<Object> wrapper);
 
+    @TenantIgnore
     List<Map<String, Object>> selectFabricWTypeDetails(@Param("ew") QueryWrapper<Object> wrapper);
 
+    @TenantIgnore
     List<Map<String, Object>> getInOutBill(@Param("ew") QueryWrapper<Object> wrapper);
 
+    @TenantIgnore
     List<Map<String, Object>> getWaterStatistics(@Param("ew") QueryWrapper<Object> wrapper);
 
+    @TenantIgnore
     List<Map<String, Object>> getReturnMaterial(@Param("ew") QueryWrapper<Object> wrapper);
 
+    @TenantIgnore
     List<Map<String, Object>> selectFabricStatistics(@Param("ew") QueryWrapper<Object> wrapper);
 
+    @TenantIgnore
     List<Map<String, Object>> selectPickingQuantitySum(@Param("ew") QueryWrapper<Object> wrapper);
 
+    @TenantIgnore
     List<Map<String, Object>> selectFabricEW(@Param("ew") QueryWrapper<Object> wrapper);
 
+    @TenantIgnore
     List<Map<String, Object>> selectFabricW(@Param("ew") QueryWrapper<Object> wrapper);
 
 }

+ 4 - 0
hx-service/storage/src/main/java/com/fjhx/applet/mapper/InkStatisticsMapper.java

@@ -5,16 +5,20 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fjhx.base.BaseEntity;
 import com.fjhx.entity.stock.StockInoutbill;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.core.tenant.annotation.TenantIgnore;
 
 import java.util.List;
 import java.util.Map;
 
 public interface InkStatisticsMapper extends BaseMapper<BaseEntity> {
 
+    @TenantIgnore
     List<Map<String, Object>> selectInkStatistics();
 
+    @TenantIgnore
     List<Map<String, Object>> selectInkW(@Param("ew") QueryWrapper<Object> wrapper);
 
+    @TenantIgnore
     List<Map<String, Object>> selectInkEWDetails(@Param("ew") QueryWrapper<Object> wrapper);
 
 }

+ 4 - 0
hx-service/storage/src/main/java/com/fjhx/task/mapper/ScheduleTaskMapper.java

@@ -1,6 +1,7 @@
 package com.fjhx.task.mapper;
 
 import org.apache.ibatis.annotations.Param;
+import org.springblade.core.tenant.annotation.TenantIgnore;
 
 import java.util.List;
 import java.util.Map;
@@ -15,10 +16,13 @@ import java.util.Map;
  */
 public interface ScheduleTaskMapper {
 
+    @TenantIgnore
     List<Map<String, Object>> selectPublished(@Param("selectPublishedSql") String selectPublishedSql);
 
+    @TenantIgnore
     Map<String, String> selectUserIdAndJobNo(@Param("userId") String userId);
 
+    @TenantIgnore
     void updatePublished(@Param("updatePublishedSql") String updatePublishedSql);
 
 }