From db9a9783a58b8df17567f186583a9325b418c3a1 Mon Sep 17 00:00:00 2001
From: TanYibin <5491541@qq.com>
Date: Mon, 13 Mar 2023 10:15:44 +0800
Subject: [PATCH] 多仓支持提交(1)

---
 ant-design-vue-jeecg/src/views/user/LoginAccount.vue                                                               |  6 +++---
 huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java                            | 10 ++++------
 huaheng-wms-core/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java                                  |  7 +++++++
 huaheng-wms-core/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml                               |  7 ++++++-
 huaheng-wms-core/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java                       | 30 +++++++++++++++++++++++++++---
 huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/supplier/controller/SupplierController.java            |  5 ++---
 huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java |  7 +++----
 huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java                                                 | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 8 files changed, 129 insertions(+), 24 deletions(-)

diff --git a/ant-design-vue-jeecg/src/views/user/LoginAccount.vue b/ant-design-vue-jeecg/src/views/user/LoginAccount.vue
index cb5a247..daee67f 100644
--- a/ant-design-vue-jeecg/src/views/user/LoginAccount.vue
+++ b/ant-design-vue-jeecg/src/views/user/LoginAccount.vue
@@ -2,7 +2,7 @@
   <div>
     <a-form-model ref="form" :model="model" :rules="validatorRules">
       <a-form-model-item required prop="username">
-        <a-input v-model="model.username" size="large" placeholder="请输入帐户名 / admin" @blur="getWarehouse">
+        <a-input v-model="model.username" size="large" placeholder="请输入帐户名  / admin" @blur="getWarehouse">
           <a-icon slot="prefix" type="user" :style="{ color: 'rgba(0,0,0,.25)' }"/>
         </a-input>
       </a-form-model-item>
@@ -16,7 +16,7 @@
       <a-form-model-item prop="warehouseCode">
         <a-select
           show-search
-          placeholder="请选择仓库!"
+          placeholder="请选择仓库"
           option-filter-prop="label"
           v-model="model.warehouseCode">
           <a-select-option v-for="item in warehouseList" :key="item.name" :value="item.code">{{
@@ -61,7 +61,7 @@ export default {
           required: true, message: '请输入密码!', validator: 'click'
         }],
         warehouseCode: [{
-          required: true, message: '请选择仓库!', trigger: "change" ,validator: 'click'
+          required: true, message: '请选择仓库!', trigger: "change" , validator: 'click'
         }],
       }
     }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java
index 1375e75..76e06eb 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java
@@ -62,7 +62,7 @@ public class LoginController {
     public RedisTemplate<String, ?> redisTemplate;
     @Autowired
     private ISysDictService sysDictService;
-    @Resource
+    @Autowired
     private BaseCommonService baseCommonService;
 
     @ApiOperation("登录接口")
@@ -112,12 +112,10 @@ public class LoginController {
             result.error500("用户名或密码错误");
             return result;
         }
-
         if (StringUtils.isEmpty(warehouseCode)) {
-            result.error500("仓库编码错误");
+            result.error500("请选择仓库编码");
             return result;
         }
-
         // 用户登录信息
         result = userInfo(sysUser, warehouseCode);
         // update-begin--Author:liusq Date:20210126 for:登录成功,删除redis中的验证码
@@ -444,9 +442,9 @@ public class LoginController {
 //                }
 //            }
 //        }
-        // update-end--Author:sunjianlei Date:20210802 for:获取用户租户信息
+        List<String> roles = sysBaseAPI.getRolesByUsername(username);
         // 生成token
-        String token = HuahengJwtUtil.sign(username, syspassword, warehouseCode);
+        String token = HuahengJwtUtil.sign(username, syspassword, warehouseCode, roles);
         // 设置token缓存有效时间
         redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
         redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, HuahengJwtUtil.EXPIRE_TIME / 1000);
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
index ad49db9..e24adb2 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
@@ -143,4 +143,11 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
      * @return
      */
     public List<Map<String, Object>> getWarehouseByUserName(@Param("username") String username);
+    
+    /**
+     * 查询所有仓库
+     * @param  username
+     * @return
+     */
+    public List<Map<String, Object>> getWarehouses();
 }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
index 7121ad9..d39b4d5 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
@@ -180,7 +180,6 @@
         </if>
     </select>
 
-
     <select id="getWarehouseByUserName" resultType="java.util.HashMap">
         SELECT r.name, r.code
         FROM sys_user u
@@ -189,5 +188,11 @@
         WHERE u.username = #{username,jdbcType=VARCHAR}
           AND r.enable = 1
     </select>
+    
+    <select id="getWarehouses" resultType="java.util.HashMap">
+        SELECT r.name, r.code 
+          FROM warehouse r
+         WHERE r.enable = 1
+    </select>
 
 </mapper>
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
index 4e45d7d..222215a 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
@@ -25,6 +25,7 @@ import org.jeecg.modules.wms.config.sysUserWarehouse.entity.SysUserWarehouse;
 import org.jeecg.modules.wms.config.sysUserWarehouse.service.ISysUserWarehouseService;
 import org.jeecg.modules.wms.config.warehouse.entity.Warehouse;
 import org.jeecg.modules.wms.config.warehouse.service.IWarehouseService;
+import org.jeecg.utils.HuahengJwtUtil;
 import org.jeecg.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheEvict;
@@ -54,36 +55,52 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     @Autowired
     private SysUserMapper userMapper;
+
     @Autowired
     private SysPermissionMapper sysPermissionMapper;
+
     @Autowired
     private SysUserRoleMapper sysUserRoleMapper;
+
     @Autowired
     private SysUserDepartMapper sysUserDepartMapper;
+
     @Resource
     private ISysUserService sysUserService;
+
     @Resource
     private ISysRoleService sysRoleService;
+
     @Resource
     private ISysUserWarehouseService sysUserWarehouseService;
+
     @Autowired
     private ISysBaseAPI sysBaseAPI;
+
     @Autowired
     private SysDepartMapper sysDepartMapper;
+
     @Autowired
     private SysRoleMapper sysRoleMapper;
+
     @Autowired
     private SysDepartRoleUserMapper departRoleUserMapper;
+
     @Autowired
     private SysDepartRoleMapper sysDepartRoleMapper;
+
     @Resource
     private BaseCommonService baseCommonService;
+
     @Autowired
     private SysThirdAccountMapper sysThirdAccountMapper;
+
     @Resource
     private IWarehouseService warehouseService;
+
     @Autowired
     ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
+
     @Autowired
     ThirdAppDingtalkServiceImpl dingtalkService;
 
@@ -592,9 +609,16 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     @Override
     public List<Map<String, Object>> getWarehouseByUserCode(String username) {
-        List<Map<String, Object>> list = null;
-        list = userMapper.getWarehouseByUserName(username);
-        return list;
+        List<String> roles = sysBaseAPI.getRolesByUsername(username);
+        if (!StringUtils.isEmpty(roles) && roles.contains(HuahengJwtUtil.USER_ROLE_INSPECTOR)) {
+            List<Map<String, Object>> returnList = userMapper.getWarehouses();
+            Map<String, Object> inspectorWarehouse = new HashMap<String, Object>();
+            inspectorWarehouse.put("name", HuahengJwtUtil.ALL_WAREHOUSE_NAME);
+            inspectorWarehouse.put("code", HuahengJwtUtil.ALL_WAREHOUSE_CODE);
+            returnList.add(inspectorWarehouse);
+            return returnList;
+        }
+        return userMapper.getWarehouseByUserName(username);
     }
 
 }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/supplier/controller/SupplierController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/supplier/controller/SupplierController.java
index 1efa367..f1e7b75 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/supplier/controller/SupplierController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/supplier/controller/SupplierController.java
@@ -180,10 +180,9 @@ public class SupplierController extends JeecgController<Supplier, ISupplierServi
      * @param req
      */
     @RequestMapping(value = "/getSupplierList")
-    public Result<?> getSupplierList(HttpServletRequest req) {
-        String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req);
+    public Result<?> getSupplierList(HttpServletRequest request) {
         LambdaQueryWrapper<Supplier> supplierLambdaQueryWrapper = Wrappers.lambdaQuery();
-        supplierLambdaQueryWrapper.eq(Supplier::getWarehouseCode, warehouseCode);
+        HuahengJwtUtil.setWarehouseCode(supplierLambdaQueryWrapper, Supplier.class, request);
         List<Supplier> supplierList = supplierService.list(supplierLambdaQueryWrapper);
         return Result.OK(supplierList);
     }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java
index 5e7442c..e62a211 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java
@@ -95,10 +95,9 @@ public class ReceiptHeaderController extends JeecgController<ReceiptHeader, IRec
     @ApiOperation(value = "入库表主表-分页列表查询", notes = "入库表主表-分页列表查询")
     @GetMapping(value = "/list")
     public Result<IPage<ReceiptHeader>> queryPageList(ReceiptHeader receiptHeader, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
-        @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) {
-        String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req);
-        receiptHeader.setWarehouseCode(warehouseCode);
-        QueryWrapper<ReceiptHeader> queryWrapper = QueryGenerator.initQueryWrapper(receiptHeader, req.getParameterMap());
+        @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) {
+        HuahengJwtUtil.setWarehouseCode(request, receiptHeader);
+        QueryWrapper<ReceiptHeader> queryWrapper = QueryGenerator.initQueryWrapper(receiptHeader, request.getParameterMap());
         Page<ReceiptHeader> page = new Page<ReceiptHeader>(pageNo, pageSize);
         IPage<ReceiptHeader> pageList = receiptHeaderService.page(page, queryWrapper);
         return Result.OK(pageList);
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java
index abbfbc8..39ef290 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java
@@ -1,7 +1,9 @@
 package org.jeecg.utils;
 
+import java.lang.reflect.Field;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.List;
 import java.util.UUID;
 
 import javax.servlet.http.HttpServletRequest;
@@ -12,22 +14,36 @@ import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.wms.framework.aspectj.dto.ApiAuthentication;
 import org.jeecg.modules.wms.framework.aspectj.dto.RSA256Key;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
 import com.auth0.jwt.JWT;
 import com.auth0.jwt.JWTVerifier;
 import com.auth0.jwt.algorithms.Algorithm;
 import com.auth0.jwt.exceptions.JWTDecodeException;
 import com.auth0.jwt.interfaces.DecodedJWT;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ReflectUtil;
 
+@Component
 public class HuahengJwtUtil {
 
     /** token失效时间 1天 */
     public static final long EXPIRE_TIME = 12 * 60 * 60 * 1000;
 
     public static final String HUAHENG_SYSTEM_ID = "HUAHENG-WMS4";
+    
+    /** 仓库视察员角色 */
+    public static final String USER_ROLE_INSPECTOR = "inspector";
+    
+    /** 全仓中文名称 */
+    public static final String ALL_WAREHOUSE_NAME = "全部仓库";
+    
+    /** 全仓CODE */
+    public static final String ALL_WAREHOUSE_CODE = "ALL_WAREHOUSE";
 
     /**
      * 根据request中的token获取用户账号
@@ -35,7 +51,7 @@ public class HuahengJwtUtil {
      * @return
      * @throws JeecgBootException
      */
-    public static String getUserNameByToken(HttpServletRequest request) throws JeecgBootException {
+    public static String getUserNameByToken(HttpServletRequest request) {
         String accessToken = request.getHeader("X-Access-Token");
         String username = getUsername(accessToken);
         if (oConvertUtils.isEmpty(username)) {
@@ -56,6 +72,19 @@ public class HuahengJwtUtil {
             return null;
         }
     }
+    
+    /**
+     * 获得token中的信息无需secret解密也能获得
+     * @return token中包含的角色信息
+     */
+    public static List<String> getRoles(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim("roles").asList(String.class);
+        } catch (JWTDecodeException e) {
+            return null;
+        }
+    }
 
     /**
      * 根据request中的token获取用户账号
@@ -63,7 +92,7 @@ public class HuahengJwtUtil {
      * @return
      * @throws JeecgBootException
      */
-    public static String getWarehouseCodeByToken(HttpServletRequest request) throws JeecgBootException {
+    public static String getWarehouseCodeByToken(HttpServletRequest request) {
         String accessToken = request.getHeader("X-Access-Token");
         String warehouseCode = getWarehouseCode(accessToken);
         if (oConvertUtils.isEmpty(warehouseCode)) {
@@ -72,6 +101,49 @@ public class HuahengJwtUtil {
         return warehouseCode;
     }
 
+    public static List<String> getRolesByToken(HttpServletRequest request) {
+        String accessToken = request.getHeader("X-Access-Token");
+        List<String> roles = getRoles(accessToken);
+        if (CollectionUtils.isEmpty(roles)) {
+            throw new JeecgBootException("未获取到仓库编码");
+        }
+        return roles;
+    }
+
+    public static <T> void setWarehouseCode(HttpServletRequest request, T t) {
+        try {
+            Field warehouseCodeField = ReflectUtil.getField(t.getClass(), "warehouseCode");
+            if (warehouseCodeField != null) {
+                List<String> roles = HuahengJwtUtil.getRolesByToken(request);
+                String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(request);
+                if (roles.contains("inspector")) {
+                    return;
+                }
+                ReflectUtil.setFieldValue(t, "warehouseCode", warehouseCode);
+
+            }
+        } catch (Exception e) {
+            return;
+        }
+    }
+    
+    public static <T> void setWarehouseCode(LambdaQueryWrapper<T> lambdaQueryWrapper, Class<T> clazz, HttpServletRequest request) {
+        try {
+            Field warehouseCodeField = ReflectUtil.getField(clazz, "warehouseCode");
+            if (warehouseCodeField != null) {
+                List<String> roles = HuahengJwtUtil.getRolesByToken(request);
+                String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(request);
+                if (roles.contains("inspector")) {
+                    return;
+                }
+                lambdaQueryWrapper.apply("warehouse_code = {0}", warehouseCode);
+
+            }
+        } catch (Exception e) {
+            return;
+        }
+    }
+    
     /**
      * 生成签名
      * @param  username 用户名
@@ -90,13 +162,14 @@ public class HuahengJwtUtil {
      * @param  username      用户名
      * @param  secret        用户的密码
      * @param  warehouseCode 登录仓库
+     * @param  roles         用户的角色
      * @return               加密的token
      */
-    public static String sign(String username, String secret, String warehouseCode) {
+    public static String sign(String username, String secret, String warehouseCode, List<String> roles) {
         Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
         Algorithm algorithm = Algorithm.HMAC256(secret);
         // 附带username信息
-        return JWT.create().withClaim("username", username).withClaim("warehouseCode", warehouseCode).withExpiresAt(date).sign(algorithm);
+        return JWT.create().withClaim("username", username).withClaim("warehouseCode", warehouseCode).withClaim("roles", roles).withExpiresAt(date).sign(algorithm);
     }
 
     /**
--
libgit2 0.22.2