无关风月
2024-08-22 a2620230c68cf6e8c732311b65aa4912efb350a4
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile

# Conflicts:
# ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml
24个文件已修改
1个文件已添加
1226 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TGoods.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/pom.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java 131 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java 512 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java 137 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserRoleServiceImpl.java 147 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/pojo/AppletUserLogin.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/template/充电桩申请记录.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TRoleSiteController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java
@@ -29,6 +29,11 @@
            public R<List<Site>> getSiteByIds(List<Integer> ids) {
                return R.fail("根据id集合获取站点数据调用失败:" + throwable.getMessage());
            }
            @Override
            public R<List<Site>> getSiteAll() {
                return R.fail("获取所有站点调用失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java
@@ -24,4 +24,11 @@
     */
    @PostMapping("/site/getSiteByIds")
    R<List<Site>> getSiteByIds(@RequestBody List<Integer> ids);
    /**
     * 获取所有站点
     * @return
     */
    @PostMapping("/site/getSiteAll")
    R<List<Site>> getSiteAll();
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TGoods.java
@@ -84,8 +84,8 @@
    private Integer underlyingSales;
    @ApiModelProperty(value = "商品描述")
    @TableField("describe")
    private String describe;
    @TableField("describes")
    private String describes;
    @ApiModelProperty(value = "商品介绍")
    @TableField("introduce")
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
@@ -127,6 +127,10 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    
    @ApiModelProperty(value = "禁用账户备注")
    @TableField("forbidden_remark")
    private String forbiddenRemark;
    @ApiModelProperty(value = "充电站")
    @TableField(exist = false)
    private List<String> siteNames;
@@ -407,6 +411,14 @@
        this.roleNames = roleNames;
    }
    
    public String getForbiddenRemark() {
        return forbiddenRemark;
    }
    public void setForbiddenRemark(String forbiddenRemark) {
        this.forbiddenRemark = forbiddenRemark;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java
@@ -27,7 +27,7 @@
            @Override
            public R<Boolean> updateSysUser(SysUser sysUser) {
                return R.fail("更新用户失败:" + cause.getMessage());
                throw new RuntimeException("更新用户失败:" + cause.getMessage());
            }
            @Override
ruoyi-auth/pom.xml
@@ -38,7 +38,12 @@
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-seata</artifactId>
        </dependency>
        <!-- SpringBoot Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -6,6 +6,7 @@
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -24,82 +25,74 @@
/**
 * token 控制
 *
 *
 * @author ruoyi
 */
@Slf4j
@RestController
public class TokenController
{
    @Autowired
    private TokenService tokenService;
    @Autowired
    private SysLoginService sysLoginService;
    @Resource
    private SysUserClient userClient;
    @PostMapping("login")
    public R<?> login(@RequestBody LoginBody form, HttpServletRequest request) {
        // 用户登录
        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(), request);
        HashMap<String, Object> map = new HashMap<>();
        map.put("token",tokenService.createToken(userInfo));
        List<SysRole> roles = userInfo.getSysUser().getRoles();
public class TokenController {
    @Autowired
    private TokenService tokenService;
    @Autowired
    private SysLoginService sysLoginService;
    @Resource
    private SysUserClient userClient;
    @PostMapping("login")
    @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
    public R<?> login(@RequestBody LoginBody form, HttpServletRequest request) {
        // 用户登录
        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(), request);
        HashMap<String, Object> map = new HashMap<>();
        map.put("token", tokenService.createToken(userInfo));
        List<SysRole> roles = userInfo.getSysUser().getRoles();
//        if(CollectionUtils.isEmpty(roles)){
//            return R.fail("请关联角色!");
//        }
//        map.put("roleName",roles.get(0).getRoleName());
        map.put("info",userInfo);
        // 修改用户最后登录时间
        SysUser sysUser = new SysUser();
        sysUser.setUserId(userInfo.getSysUser().getUserId());
        sysUser.setLoginDate(new Date());
        System.out.println("修改用户登录时间"+sysUser);
        userClient.updateSysUser(sysUser);
        return R.ok(map);
    }
    @DeleteMapping("logout")
    public R<?> logout(HttpServletRequest request) {
        String token = SecurityUtils.getToken(request);
        if (StringUtils.isNotEmpty(token))
        {
            String username = JwtUtils.getUserName(token);
            // 删除用户缓存记录
            AuthUtil.logoutByToken(token);
            // 记录用户退出日志
            sysLoginService.logout(username, request);
        }
        return R.ok();
    }
    @PostMapping("refresh")
    public R<?> refresh(HttpServletRequest request)
    {
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser))
        {
            // 刷新令牌有效期
            tokenService.refreshToken(loginUser);
            return R.ok();
        }
        return R.ok();
    }
    @PostMapping("register")
    public R<?> register(@RequestBody RegisterBody registerBody, HttpServletRequest request)
    {
        // 用户注册
        sysLoginService.register(registerBody.getUsername(), registerBody.getPassword(), request);
        return R.ok();
    }
        map.put("info", userInfo);
        // 修改用户最后登录时间
        SysUser sysUser = new SysUser();
        sysUser.setUserId(userInfo.getSysUser().getUserId());
        sysUser.setLoginDate(new Date());
        System.out.println("修改用户登录时间" + sysUser);
        userClient.updateSysUser(sysUser);
        return R.ok(map);
    }
    @DeleteMapping("logout")
    public R<?> logout(HttpServletRequest request) {
        String token = SecurityUtils.getToken(request);
        if (StringUtils.isNotEmpty(token)) {
            String username = JwtUtils.getUserName(token);
            // 删除用户缓存记录
            AuthUtil.logoutByToken(token);
            // 记录用户退出日志
            sysLoginService.logout(username, request);
        }
        return R.ok();
    }
    @PostMapping("refresh")
    public R<?> refresh(HttpServletRequest request) {
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser)) {
            // 刷新令牌有效期
            tokenService.refreshToken(loginUser);
            return R.ok();
        }
        return R.ok();
    }
    @PostMapping("register")
    public R<?> register(@RequestBody RegisterBody registerBody, HttpServletRequest request) {
        // 用户注册
        sysLoginService.register(registerBody.getUsername(), registerBody.getPassword(), request);
        return R.ok();
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
@@ -54,271 +54,259 @@
/**
 * 角色信息
 *
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/role")
@Api(tags = "角色模块")
public class SysRoleController extends BaseController
{
    @Resource
    private ISysRoleService roleService;
    @Resource
    private ISysUserService userService;
    @Resource
    private ISysDeptService deptService;
    @Resource
    private SysRoleMenuMapper sysRoleMenuMapper;
    @Resource
    private ISysUserRoleService sysUserRoleService;
    @Resource
    private SysMenuMapper menuMapper;
    @Resource
    private RoleSiteClient roleSiteClient;
    @Resource
    private SiteClient siteClient;
    @ApiOperation(value = "获取角色列表", tags = {"管理后台-系统用户管理"})
    @GetMapping("/list")
    public AjaxResult list() {
        List<SysRole> list = roleService.list(new LambdaQueryWrapper<SysRole>().eq(SysRole::getDelFlag, 0).eq(SysRole::getStatus, 0));
        return AjaxResult.success(list);
    }
    @ResponseBody
    @GetMapping("/listPage")
    @ApiOperation(value = "获取角色列表", tags = {"管理后台-角色管理"})
    public AjaxResult listPage(String name, BasePage basePage) {
        PageInfo<SysRole> pageInfo = new PageInfo<>(basePage.getPageCurr(), basePage.getPageSize());
        LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<SysRole>().eq(SysRole::getStatus, 0).eq(SysRole::getDelFlag, 0);
        if(StringUtils.isNotEmpty(name)){
            wrapper.like(SysRole::getRoleName, name);
        }
        PageInfo<SysRole> page = roleService.page(pageInfo, wrapper.orderByDesc(SysRole::getCreateTime));
        for (SysRole record : page.getRecords()) {
            List<Integer> data = roleSiteClient.getSiteIds(record.getRoleId()).getData();
            List<Site> sites = siteClient.getSiteByIds(data).getData();
            if(null != sites){
                List<String> collect = sites.stream().map(Site::getName).collect(Collectors.toList());
                record.setSiteNames(collect);
            }
        }
        return AjaxResult.success(page);
    }
    @ResponseBody
    @PostMapping("/roleAdd")
    @ApiOperation(value = "添加角色", tags = {"管理后台-角色管理"})
    @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
    public AjaxResult roleAdd(@Validated @RequestBody RoleAddDto dto)
    {
        SysRole role = new SysRole();
        role.setRoleName(dto.getRoleName());
        long count = roleService.count(Wrappers.lambdaQuery(SysRole.class)
                    .eq(SysRole::getRoleName,dto.getRoleName()));
        if(count>0){
            return AjaxResult.error("角色已存在,请重新输入");
        }
        List<Long> menuIds1 = dto.getMenuIds();
        if(CollectionUtils.isEmpty(menuIds1)){
            return AjaxResult.error("菜单id不能为空");
        }
        role.setMenuIds(dto.getMenuIds().toArray((new Long[dto.getMenuIds().size()])));
        // 添加角色
        role.setRemark(dto.getRemark());
        role.setCreateBy(SecurityUtils.getUsername());
        role.setCreateTime(new Date());
        roleService.insertRole(role);
        //添加站点权限
        List<TRoleSite> roleSites = new ArrayList<>();
        for (Integer siteId : dto.getSiteIds()) {
            TRoleSite roleSite = new TRoleSite();
            roleSite.setRoleId(role.getRoleId().intValue());
            roleSite.setSiteId(siteId);
            roleSites.add(roleSite);
        }
        roleSiteClient.addRoleSite(roleSites);
        return AjaxResult.success();
    }
    @GetMapping("/roleInfo")
    @ApiOperation(value = "角色详情", tags = {"管理后台-角色管理"})
    public AjaxResult roleInfo( @RequestParam Long id) {
        SysRole role = roleService.selectRoleById(id);
        RoleInfoVo roleInfoVo = new RoleInfoVo();
        roleInfoVo.setRoleId(role.getRoleId());
        roleInfoVo.setRoleName(role.getRoleName());
        // 获取当前角色的菜单id
        List<Long> menusId = sysRoleMenuMapper.selectList(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, id)).stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
        if(menusId.size()==0){
            return AjaxResult.success(new ArrayList<>());
        }
        //获取当前的权限菜单
        List<SysMenus> all = menuMapper.getAllInIds(menusId);
        // 第三级
        List<SysMenus> s3 = all.stream().filter(e -> e.getMenuType().equals("F")).collect(Collectors.toList());
        // 第二级
        List<SysMenus> s2 = all.stream().filter(e -> e.getMenuType().equals("C")).collect(Collectors.toList());
        // 第一级
        List<SysMenus> s1 = all.stream().filter(e -> e.getMenuType().equals("M")).collect(Collectors.toList());
        for (SysMenus menus : s2) {
            List<SysMenus> collect = s3.stream().filter(e -> e.getParentId().equals(menus.getMenuId())).collect(Collectors.toList());
            menus.setChildren(collect);
        }
        for (SysMenus menus : s1) {
            List<SysMenus> collect = s2.stream().filter(e -> e.getParentId().equals(menus.getMenuId())).collect(Collectors.toList());
            menus.setChildren(collect);
        }
        roleInfoVo.setMenus(menusId);
        roleInfoVo.setRemark(role.getRemark());
        List<Integer> siteIds = roleSiteClient.getSiteIds(role.getRoleId()).getData();
        List<Site> sites = siteClient.getSiteByIds(siteIds).getData();
        List<String> siteNames = sites.stream().map(Site::getName).collect(Collectors.toList());
        roleInfoVo.setSiteNames(siteNames);
        roleInfoVo.setSiteIds(siteIds);
        return AjaxResult.success(roleInfoVo);
    }
    @PostMapping("/roleUpdate")
    @ApiOperation(value = "编辑角色", tags = {"管理后台-角色管理"})
    @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
    public AjaxResult roleUpdate(@Validated @RequestBody RoleUpdateDto dto) {
        SysRole role = new SysRole();
        role.setRoleName(dto.getRoleName());
        SysRole one = roleService.getOne(new LambdaQueryWrapper<SysRole>().eq(SysRole::getRoleName, dto.getRoleName()));
        if(null != one && !one.getRoleId().equals(dto.getRoleId())){
            return AjaxResult.error("角色已存在,请重新输入");
        }
        role.setRemark(dto.getRemark());
        role.setUpdateBy(SecurityUtils.getUsername());
        role.setUpdateTime(new Date());
        role.setRoleId(dto.getRoleId());
        roleService.updateRole(role);
        ArrayList<SysRoleMenu> sysRoleMenus = new ArrayList<>();
        List<Long> menuIds = dto.getMenuIds();
        // 移除原来的权限菜单
        if(menuIds.contains(1061L)){
            sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>()
                    .eq(SysRoleMenu::getRoleId,dto.getRoleId()));
        }else {
            sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>()
                    .eq(SysRoleMenu::getRoleId,dto.getRoleId())
                    .ne(SysRoleMenu::getMenuId,1061L)
                    .ne(SysRoleMenu::getMenuId,1062L)
                    .ne(SysRoleMenu::getMenuId,1065L)
                    .ne(SysRoleMenu::getMenuId,1073L)
                    .ne(SysRoleMenu::getMenuId,1161L)
                    .ne(SysRoleMenu::getMenuId,1203L)
            );
        }
        for (Long menuId : menuIds) {
            SysRoleMenu sysRoleMenu = new SysRoleMenu();
            sysRoleMenu.setMenuId(menuId);
            sysRoleMenu.setRoleId(role.getRoleId());
            sysRoleMenus.add(sysRoleMenu);
        }
        sysRoleMenuMapper.batchRoleMenu(sysRoleMenus);
        //删除旧站点数据
        roleSiteClient.delRoleSite(dto.getRoleId());
        //添加站点权限
        List<TRoleSite> roleSites = new ArrayList<>();
        for (Integer siteId : dto.getSiteIds()) {
            TRoleSite roleSite = new TRoleSite();
            roleSite.setRoleId(role.getRoleId().intValue());
            roleSite.setSiteId(siteId);
            roleSites.add(roleSite);
        }
        roleSiteClient.addRoleSite(roleSites);
        return AjaxResult.success();
    }
    /**
     * 删除角色
     */
    @RequiresPermissions("system:role:remove")
    @Log(title = "角色管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{roleIds}")
    @ApiOperation(value = "删除角色", tags = {"管理后台-角色管理"})
    public AjaxResult remove(@PathVariable Long[] roleIds) {
        return toAjax(roleService.deleteRoleByIds(roleIds));
    }
    /**
     * 查询已分配用户角色列表
     */
    @RequiresPermissions("system:role:list")
    @GetMapping("/authUser/allocatedList")
    public TableDataInfo allocatedList(SysUser user)
    {
        startPage();
        List<SysUser> list = userService.selectAllocatedList(user);
        return getDataTable(list);
    }
    /**
     * 查询未分配用户角色列表
     */
    @RequiresPermissions("system:role:list")
    @GetMapping("/authUser/unallocatedList")
    public TableDataInfo unallocatedList(SysUser user)
    {
        startPage();
        List<SysUser> list = userService.selectUnallocatedList(user);
        return getDataTable(list);
    }
    /**
     * 获取对应角色部门树列表
     */
    @RequiresPermissions("system:role:query")
    @GetMapping(value = "/deptTree/{roleId}")
    public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
    {
        AjaxResult ajax = AjaxResult.success();
        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
        ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
        return ajax;
    }
    /**
     * 根据id集合获取数据
     * @param ids
     * @return
     */
    @ResponseBody
    @PostMapping(value = "/getSysRoleByIds")
    public R<List<SysRole>> getSysRoleByIds(@RequestBody GetSysRoleByIds ids){
        List<SysRole> sysRoleByIds = roleService.getSysRoleByIds(ids.getIds());
        return R.ok(sysRoleByIds);
    }
public class SysRoleController extends BaseController {
    @Resource
    private ISysRoleService roleService;
    @Resource
    private ISysUserService userService;
    @Resource
    private ISysDeptService deptService;
    @Resource
    private SysRoleMenuMapper sysRoleMenuMapper;
    @Resource
    private ISysUserRoleService sysUserRoleService;
    @Resource
    private SysMenuMapper menuMapper;
    @Resource
    private RoleSiteClient roleSiteClient;
    @Resource
    private SiteClient siteClient;
    @ApiOperation(value = "获取角色列表", tags = {"管理后台-系统用户管理"})
    @GetMapping("/list")
    public AjaxResult list() {
        List<SysRole> list = roleService.list(new LambdaQueryWrapper<SysRole>().eq(SysRole::getDelFlag, 0).eq(SysRole::getStatus, 0));
        return AjaxResult.success(list);
    }
    @ResponseBody
    @GetMapping("/listPage")
    @ApiOperation(value = "获取角色列表", tags = {"管理后台-角色管理"})
    public AjaxResult listPage(String name, BasePage basePage) {
        PageInfo<SysRole> pageInfo = new PageInfo<>(basePage.getPageCurr(), basePage.getPageSize());
        LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<SysRole>().eq(SysRole::getStatus, 0).eq(SysRole::getDelFlag, 0);
        if (StringUtils.isNotEmpty(name)) {
            wrapper.like(SysRole::getRoleName, name);
        }
        PageInfo<SysRole> page = roleService.page(pageInfo, wrapper.orderByDesc(SysRole::getCreateTime));
        for (SysRole record : page.getRecords()) {
            List<Integer> data = roleSiteClient.getSiteIds(record.getRoleId()).getData();
            List<Site> sites = siteClient.getSiteByIds(data).getData();
            if (null != sites) {
                List<String> collect = sites.stream().map(Site::getName).collect(Collectors.toList());
                record.setSiteNames(collect);
            }
        }
        return AjaxResult.success(page);
    }
    @ResponseBody
    @PostMapping("/roleAdd")
    @ApiOperation(value = "添加角色", tags = {"管理后台-角色管理"})
    @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
    public AjaxResult roleAdd(@Validated @RequestBody RoleAddDto dto) {
        SysRole role = new SysRole();
        role.setRoleName(dto.getRoleName());
        long count = roleService.count(Wrappers.lambdaQuery(SysRole.class)
                .eq(SysRole::getRoleName, dto.getRoleName()));
        if (count > 0) {
            return AjaxResult.error("角色已存在,请重新输入");
        }
        List<Long> menuIds1 = dto.getMenuIds();
        if (CollectionUtils.isEmpty(menuIds1)) {
            return AjaxResult.error("菜单id不能为空");
        }
        role.setMenuIds(dto.getMenuIds().toArray((new Long[dto.getMenuIds().size()])));
        // 添加角色
        role.setRemark(dto.getRemark());
        role.setCreateBy(SecurityUtils.getUsername());
        role.setCreateTime(new Date());
        roleService.insertRole(role);
        //添加站点权限
        List<TRoleSite> roleSites = new ArrayList<>();
        for (Integer siteId : dto.getSiteIds()) {
            TRoleSite roleSite = new TRoleSite();
            roleSite.setRoleId(role.getRoleId().intValue());
            roleSite.setSiteId(siteId);
            roleSites.add(roleSite);
        }
        roleSiteClient.addRoleSite(roleSites);
        return AjaxResult.success();
    }
    @GetMapping("/roleInfo")
    @ApiOperation(value = "角色详情", tags = {"管理后台-角色管理"})
    public AjaxResult roleInfo(@RequestParam Long id) {
        SysRole role = roleService.selectRoleById(id);
        RoleInfoVo roleInfoVo = new RoleInfoVo();
        roleInfoVo.setRoleId(role.getRoleId());
        roleInfoVo.setRoleName(role.getRoleName());
        // 获取当前角色的菜单id
        List<Long> menusId = sysRoleMenuMapper.selectList(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, id)).stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
        if (menusId.size() == 0) {
            return AjaxResult.success(new ArrayList<>());
        }
        //获取当前的权限菜单
        List<SysMenus> all = menuMapper.getAllInIds(menusId);
        // 第三级
        List<SysMenus> s3 = all.stream().filter(e -> e.getMenuType().equals("F")).collect(Collectors.toList());
        // 第二级
        List<SysMenus> s2 = all.stream().filter(e -> e.getMenuType().equals("C")).collect(Collectors.toList());
        // 第一级
        List<SysMenus> s1 = all.stream().filter(e -> e.getMenuType().equals("M")).collect(Collectors.toList());
        for (SysMenus menus : s2) {
            List<SysMenus> collect = s3.stream().filter(e -> e.getParentId().equals(menus.getMenuId())).collect(Collectors.toList());
            menus.setChildren(collect);
        }
        for (SysMenus menus : s1) {
            List<SysMenus> collect = s2.stream().filter(e -> e.getParentId().equals(menus.getMenuId())).collect(Collectors.toList());
            menus.setChildren(collect);
        }
        roleInfoVo.setMenus(menusId);
        roleInfoVo.setRemark(role.getRemark());
        List<Integer> siteIds = roleSiteClient.getSiteIds(role.getRoleId()).getData();
        if (null != siteIds && siteIds.size() > 0) {
            List<Site> sites = siteClient.getSiteByIds(siteIds).getData();
            List<String> siteNames = sites.stream().map(Site::getName).collect(Collectors.toList());
            roleInfoVo.setSiteNames(siteNames);
            roleInfoVo.setSiteIds(siteIds);
        }
        return AjaxResult.success(roleInfoVo);
    }
    @PostMapping("/roleUpdate")
    @ApiOperation(value = "编辑角色", tags = {"管理后台-角色管理"})
    @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
    public AjaxResult roleUpdate(@Validated @RequestBody RoleUpdateDto dto) {
        SysRole role = new SysRole();
        role.setRoleName(dto.getRoleName());
        SysRole one = roleService.getOne(new LambdaQueryWrapper<SysRole>().eq(SysRole::getRoleName, dto.getRoleName()));
        if (null != one && !one.getRoleId().equals(dto.getRoleId())) {
            return AjaxResult.error("角色已存在,请重新输入");
        }
        role.setRemark(dto.getRemark());
        role.setUpdateBy(SecurityUtils.getUsername());
        role.setUpdateTime(new Date());
        role.setRoleId(dto.getRoleId());
        roleService.updateRole(role);
        ArrayList<SysRoleMenu> sysRoleMenus = new ArrayList<>();
        List<Long> menuIds = dto.getMenuIds();
        // 移除原来的权限菜单
        if (menuIds.contains(1061L)) {
            sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>()
                    .eq(SysRoleMenu::getRoleId, dto.getRoleId()));
        } else {
            sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>()
                    .eq(SysRoleMenu::getRoleId, dto.getRoleId())
                    .ne(SysRoleMenu::getMenuId, 1061L)
                    .ne(SysRoleMenu::getMenuId, 1062L)
                    .ne(SysRoleMenu::getMenuId, 1065L)
                    .ne(SysRoleMenu::getMenuId, 1073L)
                    .ne(SysRoleMenu::getMenuId, 1161L)
                    .ne(SysRoleMenu::getMenuId, 1203L)
            );
        }
        for (Long menuId : menuIds) {
            SysRoleMenu sysRoleMenu = new SysRoleMenu();
            sysRoleMenu.setMenuId(menuId);
            sysRoleMenu.setRoleId(role.getRoleId());
            sysRoleMenus.add(sysRoleMenu);
        }
        sysRoleMenuMapper.batchRoleMenu(sysRoleMenus);
        //删除旧站点数据
        roleSiteClient.delRoleSite(dto.getRoleId());
        //添加站点权限
        List<TRoleSite> roleSites = new ArrayList<>();
        for (Integer siteId : dto.getSiteIds()) {
            TRoleSite roleSite = new TRoleSite();
            roleSite.setRoleId(role.getRoleId().intValue());
            roleSite.setSiteId(siteId);
            roleSites.add(roleSite);
        }
        roleSiteClient.addRoleSite(roleSites);
        return AjaxResult.success();
    }
    /**
     * 删除角色
     */
    @RequiresPermissions("system:role:remove")
    @Log(title = "角色管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{roleIds}")
    @ApiOperation(value = "删除角色", tags = {"管理后台-角色管理"})
    public AjaxResult remove(@PathVariable Long[] roleIds) {
        return toAjax(roleService.deleteRoleByIds(roleIds));
    }
    /**
     * 查询已分配用户角色列表
     */
    @RequiresPermissions("system:role:list")
    @GetMapping("/authUser/allocatedList")
    public TableDataInfo allocatedList(SysUser user) {
        startPage();
        List<SysUser> list = userService.selectAllocatedList(user);
        return getDataTable(list);
    }
    /**
     * 查询未分配用户角色列表
     */
    @RequiresPermissions("system:role:list")
    @GetMapping("/authUser/unallocatedList")
    public TableDataInfo unallocatedList(SysUser user) {
        startPage();
        List<SysUser> list = userService.selectUnallocatedList(user);
        return getDataTable(list);
    }
    /**
     * 获取对应角色部门树列表
     */
    @RequiresPermissions("system:role:query")
    @GetMapping(value = "/deptTree/{roleId}")
    public AjaxResult deptTree(@PathVariable("roleId") Long roleId) {
        AjaxResult ajax = AjaxResult.success();
        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
        ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
        return ajax;
    }
    /**
     * 根据id集合获取数据
     *
     * @param ids
     * @return
     */
    @ResponseBody
    @PostMapping(value = "/getSysRoleByIds")
    public R<List<SysRole>> getSysRoleByIds(@RequestBody GetSysRoleByIds ids) {
        List<SysRole> sysRoleByIds = roleService.getSysRoleByIds(ids.getIds());
        return R.ok(sysRoleByIds);
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -1,12 +1,9 @@
package com.ruoyi.system.controller;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.A;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
@@ -17,32 +14,19 @@
import com.ruoyi.other.api.feignClient.RoleSiteClient;
import com.ruoyi.other.api.feignClient.UserSiteClient;
import com.ruoyi.system.api.query.ChangeUserQuery;
import com.ruoyi.system.domain.dto.IndexDto;
import com.ruoyi.system.domain.vo.UserRoleVO;
import com.ruoyi.system.api.model.*;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.domain.dto.AddCompanyUserDto;
import com.ruoyi.system.domain.vo.CompanyUserVo;
import com.ruoyi.system.domain.vo.TCompanyToUserVo;
import com.ruoyi.system.query.GetSysUserList;
import com.ruoyi.system.query.ShopUserStart;
import com.ruoyi.system.service.*;
import io.seata.spring.annotation.GlobalTransactional;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.poi.ExcelUtil;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.log.annotation.Log;
@@ -300,10 +284,10 @@
        SysUser sysUser = userService.selectUserById(shopUserStart.getUserId());
        if (sysUser.getStatus().equals("0")) {
            sysUser.setStatus("1");
            sysUser.setRemark(shopUserStart.getRemark());
            sysUser.setForbiddenRemark(shopUserStart.getRemark());
        } else {
            sysUser.setStatus("0");
            sysUser.setRemark("");
            sysUser.setForbiddenRemark("");
        }
        return toAjax(userService.updateUser(sysUser));
    }
@@ -387,11 +371,13 @@
            sysUser.setUpdateBy(SecurityUtils.getUsername());
            sysUser.setUpdateTime(new Date());
            userService.updateUser(sysUser);
            userRoleService.deleteSysUserRoleByUserId(sysUser.getUserId());
            SysUserRole sysUserRole = new SysUserRole();
            sysUserRole.setRoleId(sysUser.getRoleId());
            sysUserRole.setUserId(sysUser.getUserId());
            userRoleService.insertSysUserRole(sysUserRole);
            if(null != sysUser.getRoleId()){
                userRoleService.deleteSysUserRoleByUserId(sysUser.getUserId());
                SysUserRole sysUserRole = new SysUserRole();
                sysUserRole.setRoleId(sysUser.getRoleId());
                sysUserRole.setUserId(sysUser.getUserId());
                userRoleService.insertSysUserRole(sysUserRole);
            }
            return R.ok(true);
        } catch (Exception e) {
            e.printStackTrace();
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java
@@ -25,82 +25,75 @@
/**
 * 用户和角色关联Controller
 *
 *
 * @author xiaochen
 * @date 2023-06-12
 */
@RestController
@RequestMapping("/userRole")
public class SysUserRoleController extends BaseController
{
    @Autowired
    private ISysUserRoleService sysUserRoleService;
    /**
     * 查询用户和角色关联列表
     */
    @RequiresPermissions("car:role:list")
    @GetMapping("/list")
    public TableDataInfo list(SysUserRole sysUserRole)
    {
        startPage();
        List<SysUserRole> list = sysUserRoleService.selectSysUserRoleList(sysUserRole);
        return getDataTable(list);
    }
    /**
     * 导出用户和角色关联列表
     */
    @RequiresPermissions("car:role:export")
    @Log(title = "用户和角色关联", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysUserRole sysUserRole)
    {
        List<SysUserRole> list = sysUserRoleService.selectSysUserRoleList(sysUserRole);
        ExcelUtil<SysUserRole> util = new ExcelUtil<SysUserRole>(SysUserRole.class);
        util.exportExcel(response, list, "用户和角色关联数据");
    }
    /**
     * 获取用户和角色关联详细信息
     */
    @RequiresPermissions("car:role:query")
    @GetMapping(value = "/{userId}")
    public AjaxResult getInfo(@PathVariable("userId") Long userId)
    {
        return success(sysUserRoleService.selectSysUserRoleByUserId(userId));
    }
    /**
     * 新增用户和角色关联
     */
    @RequiresPermissions("car:role:add")
    @Log(title = "用户和角色关联", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody SysUserRole sysUserRole)
    {
        return toAjax(sysUserRoleService.insertSysUserRole(sysUserRole));
    }
    /**
     * 修改用户和角色关联
     */
    @RequiresPermissions("car:role:edit")
    @Log(title = "用户和角色关联", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody SysUserRole sysUserRole)
    {
        return toAjax(sysUserRoleService.updateSysUserRole(sysUserRole));
    }
    /**
     * 删除用户和角色关联
     */
    @RequiresPermissions("car:role:remove")
    @Log(title = "用户和角色关联", businessType = BusinessType.DELETE)
public class SysUserRoleController extends BaseController {
    @Autowired
    private ISysUserRoleService sysUserRoleService;
    /**
     * 查询用户和角色关联列表
     */
    @RequiresPermissions("car:role:list")
    @GetMapping("/list")
    public TableDataInfo list(SysUserRole sysUserRole) {
        startPage();
        List<SysUserRole> list = sysUserRoleService.selectSysUserRoleList(sysUserRole);
        return getDataTable(list);
    }
    /**
     * 导出用户和角色关联列表
     */
    @RequiresPermissions("car:role:export")
    @Log(title = "用户和角色关联", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysUserRole sysUserRole) {
        List<SysUserRole> list = sysUserRoleService.selectSysUserRoleList(sysUserRole);
        ExcelUtil<SysUserRole> util = new ExcelUtil<SysUserRole>(SysUserRole.class);
        util.exportExcel(response, list, "用户和角色关联数据");
    }
    /**
     * 获取用户和角色关联详细信息
     */
    @RequiresPermissions("car:role:query")
    @GetMapping(value = "/{userId}")
    public AjaxResult getInfo(@PathVariable("userId") Long userId) {
        return success(sysUserRoleService.selectSysUserRoleByUserId(userId));
    }
    /**
     * 新增用户和角色关联
     */
    @RequiresPermissions("car:role:add")
    @Log(title = "用户和角色关联", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody SysUserRole sysUserRole) {
        return toAjax(sysUserRoleService.insertSysUserRole(sysUserRole));
    }
    /**
     * 修改用户和角色关联
     */
    @RequiresPermissions("car:role:edit")
    @Log(title = "用户和角色关联", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody SysUserRole sysUserRole) {
        return toAjax(sysUserRoleService.updateSysUserRole(sysUserRole));
    }
    /**
     * 删除用户和角色关联
     */
    @RequiresPermissions("car:role:remove")
    @Log(title = "用户和角色关联", businessType = BusinessType.DELETE)
    @DeleteMapping("/{userIds}")
    public AjaxResult remove(@PathVariable Long[] userIds)
    {
        return toAjax(sysUserRoleService.deleteSysUserRoleByUserIds(userIds));
    }
    public AjaxResult remove(@PathVariable Long[] userIds) {
        return toAjax(sysUserRoleService.deleteSysUserRoleByUserIds(userIds));
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserRoleServiceImpl.java
@@ -11,85 +11,78 @@
/**
 * 用户和角色关联Service业务层处理
 *
 *
 * @author xiaochen
 * @date 2023-06-12
 */
@Service
public class SysUserRoleServiceImpl  extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements ISysUserRoleService
{
    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;
    /**
     * 查询用户和角色关联
     *
     * @param userId 用户和角色关联主键
     * @return 用户和角色关联
     */
    @Override
    public SysUserRole selectSysUserRoleByUserId(Long userId)
    {
        return sysUserRoleMapper.selectSysUserRoleByUserId(userId);
    }
    /**
     * 查询用户和角色关联列表
     *
     * @param sysUserRole 用户和角色关联
     * @return 用户和角色关联
     */
    @Override
    public List<SysUserRole> selectSysUserRoleList(SysUserRole sysUserRole)
    {
        return sysUserRoleMapper.selectSysUserRoleList(sysUserRole);
    }
    /**
     * 新增用户和角色关联
     *
     * @param sysUserRole 用户和角色关联
     * @return 结果
     */
    @Override
    public int insertSysUserRole(SysUserRole sysUserRole)
    {
        return sysUserRoleMapper.insertSysUserRole(sysUserRole);
    }
    /**
     * 修改用户和角色关联
     *
     * @param sysUserRole 用户和角色关联
     * @return 结果
     */
    @Override
    public int updateSysUserRole(SysUserRole sysUserRole)
    {
        return sysUserRoleMapper.updateSysUserRole(sysUserRole);
    }
    /**
     * 批量删除用户和角色关联
     *
     * @param userIds 需要删除的用户和角色关联主键
     * @return 结果
     */
    @Override
    public int deleteSysUserRoleByUserIds(Long[] userIds)
    {
        return sysUserRoleMapper.deleteSysUserRoleByUserIds(userIds);
    }
    /**
     * 删除用户和角色关联信息
     *
     * @param userId 用户和角色关联主键
     * @return 结果
     */
    @Override
    public int deleteSysUserRoleByUserId(Long userId)
    {
        return sysUserRoleMapper.deleteSysUserRoleByUserId(userId);
    }
public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements ISysUserRoleService {
    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;
    /**
     * 查询用户和角色关联
     *
     * @param userId 用户和角色关联主键
     * @return 用户和角色关联
     */
    @Override
    public SysUserRole selectSysUserRoleByUserId(Long userId) {
        return sysUserRoleMapper.selectSysUserRoleByUserId(userId);
    }
    /**
     * 查询用户和角色关联列表
     *
     * @param sysUserRole 用户和角色关联
     * @return 用户和角色关联
     */
    @Override
    public List<SysUserRole> selectSysUserRoleList(SysUserRole sysUserRole) {
        return sysUserRoleMapper.selectSysUserRoleList(sysUserRole);
    }
    /**
     * 新增用户和角色关联
     *
     * @param sysUserRole 用户和角色关联
     * @return 结果
     */
    @Override
    public int insertSysUserRole(SysUserRole sysUserRole) {
        return sysUserRoleMapper.insertSysUserRole(sysUserRole);
    }
    /**
     * 修改用户和角色关联
     *
     * @param sysUserRole 用户和角色关联
     * @return 结果
     */
    @Override
    public int updateSysUserRole(SysUserRole sysUserRole) {
        return sysUserRoleMapper.updateSysUserRole(sysUserRole);
    }
    /**
     * 批量删除用户和角色关联
     *
     * @param userIds 需要删除的用户和角色关联主键
     * @return 结果
     */
    @Override
    public int deleteSysUserRoleByUserIds(Long[] userIds) {
        return sysUserRoleMapper.deleteSysUserRoleByUserIds(userIds);
    }
    /**
     * 删除用户和角色关联信息
     *
     * @param userId 用户和角色关联主键
     * @return 结果
     */
    @Override
    public int deleteSysUserRoleByUserId(Long userId) {
        return sysUserRoleMapper.deleteSysUserRoleByUserId(userId);
    }
}
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -22,6 +22,7 @@
        <result property="createTime"   column="create_time"  />
        <result property="updateBy"     column="update_by"    />
        <result property="updateTime"   column="update_time"  />
        <result property="forbiddenRemark"           column="forbidden_remark"/>
        <result property="remark"       column="remark"       />
        <result property="roleType"       column="roleType"       />
        <result property="objectId"       column="objectId"       />
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/pojo/AppletUserLogin.java
New file
@@ -0,0 +1,22 @@
package com.ruoyi.account.ali.pojo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@Data
@ApiModel(value = "支付宝小程序登录")
public class AppletUserLogin implements Serializable {
    @ApiModelProperty(value = "auth_code")
    @NotBlank(message = "auth_code不能为空")
    private String code;
    @ApiModelProperty(value = "获取用户信息加密串")
    @NotBlank(message = "获取用户信息加密串不能为空")
    private String token;
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java
@@ -1,16 +1,24 @@
package com.ruoyi.account.ali.tools;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.parser.Feature;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipayEncrypt;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.request.AlipayUserUserinfoShareRequest;
import com.alipay.api.request.AlipayUserInfoShareRequest;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.alipay.api.response.AlipayUserUserinfoShareResponse;
import com.alipay.api.response.AlipayUserInfoShareResponse;
import com.ruoyi.account.ali.Constant.AliConstant;
import com.ruoyi.account.ali.model.AliProperties;
import com.ruoyi.common.core.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;
/**
 * @author xiaochen
@@ -60,12 +68,12 @@
     * 支付宝小程序授权获取手机号
     * @return
     */
    public AlipayUserUserinfoShareResponse getUserInfo(String accessToken) {
    public AlipayUserInfoShareResponse getUserInfo(String accessToken) {
        try {
            // 初始化SDK
            AlipayClient alipayClient = new DefaultAlipayClient(new AliAppletTools(aliProperties).getAlipayConfig(AliConstant.LOGIN_SERVER_URL));
            //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.user.userinfo.share
            AlipayUserUserinfoShareRequest request = new AlipayUserUserinfoShareRequest();
            AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
            //授权类接口执行API调用时需要带上accessToken
            return alipayClient.execute(request,accessToken);
        } catch (AlipayApiException e) {
@@ -74,6 +82,53 @@
    }
    /**
     * 获取用户手机号
     * @param response
     * @return
     */
    public String getPhoneNumber(String response){
        //1. 获取验签和解密所需要的参数
        Map<String, String> openapiResult = JSON.parseObject(response,new TypeReference<Map<String, String>>() {}, Feature.OrderedField);
        String signType = "RSA2";
        String charset = "UTF-8";
        String encryptType = "AES";
        String sign = openapiResult.get("sign");
        String content = openapiResult.get("response");
        //判断是否为加密内容
        boolean isDataEncrypted = !content.startsWith("{");
        boolean signCheckPass = false;
        //2. 验签
        String signContent = content;
        if (isDataEncrypted) {
            signContent = "\"" + signContent + "\"";
        } try {
            signCheckPass = AlipaySignature.rsaCheck(signContent, sign, aliProperties.getAlipayPublicKey(), charset, signType);
        } catch (AlipayApiException e) {
            // 验签异常, 日志
        } if (!signCheckPass) {
            //验签不通过(异常或者报文被篡改),终止流程(不需要做解密)
            throw new ServiceException("验签失败");
        }
        //3. 解密
        String plainData = null;
        if (isDataEncrypted) {
            try {
                plainData = AlipayEncrypt.decryptContent(content, encryptType, "XABBSOeWDakvuG9TDez4Qg====", charset);
            } catch (AlipayApiException e) {
                //解密异常, 记录日志
                throw new ServiceException("解密异常");
            }} else {
            plainData = content;
        }
        log.info("解密后的数据:{}", plainData);
        String phoneNumber = "";
        if (plainData.contains("mobile")) {
            phoneNumber = JSON.parseObject(plainData).getString("mobile");
        }
        return phoneNumber;
    }
    /**
     * 初始化支付宝配置
     * @return
     */
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java
@@ -7,15 +7,18 @@
import com.alipay.api.diagnosis.DiagnosisUtils;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.alipay.api.response.AlipayUserInfoShareResponse;
import com.alipay.api.response.AlipayUserUserinfoShareResponse;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.account.ali.Constant.AliConstant;
import com.ruoyi.account.ali.model.AliProperties;
import com.ruoyi.account.ali.pojo.AppletUserLogin;
import com.ruoyi.account.ali.tools.AliAppletTools;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.account.service.TAppUserService;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.system.api.model.LoginUserApplet;
@@ -23,10 +26,7 @@
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@@ -50,17 +50,22 @@
    @Autowired
    private TAppUserService appUserService;
    @ApiOperation(value = "通过code获得openid",tags = {"支付宝小程序登录"})
    @GetMapping("/openIdByJsCode")
    public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestParam(name = "code")@ApiParam(value = "code", required = true) String code){
        log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", code);
    @PostMapping("/openIdByJsCode")
    public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserLogin appletUserLogin){
        log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", appletUserLogin.getCode());
        // 登录
        AlipaySystemOauthTokenResponse response = new AliAppletTools(aliProperties).login(code);
        AlipaySystemOauthTokenResponse response = new AliAppletTools(aliProperties).login(appletUserLogin.getCode());
        if (response.isSuccess()) {
            // 获取用户信息
            AlipayUserUserinfoShareResponse userInfo = new AliAppletTools(aliProperties).getUserInfo(response.getAccessToken());
            log.info("获取支付宝用户信息:{}", userInfo);
//            AlipayUserInfoShareResponse userInfo = new AliAppletTools(aliProperties).getUserInfo(response.getAccessToken());
            if(StringUtils.isEmpty(appletUserLogin.getToken())){
                return AjaxResult.success("已拒绝授权");
            }
            // 获取用户手机号
            String phoneNumber = new AliAppletTools(aliProperties).getPhoneNumber(appletUserLogin.getToken());
            log.info("获取支付宝用户信息:{}", phoneNumber);
            // 用户信息封装
            return AjaxResult.ok(appUserService.aliLogin(response,userInfo));
            return AjaxResult.success(appUserService.aliLogin(response,phoneNumber));
        } else {
             String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
             log.warn("诊断结果:{}",diagnosisUrl);
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -284,6 +284,9 @@
        if (userListQueryDto.getUserTagId() != null){
            String[] split = userListQueryDto.getUserTagId().split(",");
            userIds = appUserTagService.lambdaQuery().in(TAppUserTag::getUserTagId, Arrays.asList(split)).list().stream().map(TAppUserTag::getAppUserId).collect(Collectors.toList());
            if (userIds.isEmpty()){
                userIds.add(-1L);
            }
        }
        //列表查询
        Page<TAppUser> page = appUserService.lambdaQuery()
@@ -305,9 +308,11 @@
            //拿到最新的tagId
            TAppUserTag one = appUserTagService.lambdaQuery().eq(TAppUserTag::getAppUserId, appUser.getId()).orderByDesc(TAppUserTag::getCreateTime).last("limit 1").one();
            //设置最新的tagName
            R<TUserTag> byIdTag = otherClient.getByIdTag(one.getUserTagId());
            if (byIdTag.getData()!=null) {
                appUser.setTagName(byIdTag.getData().getName());
            if (one!=null){
                R<TUserTag> byIdTag = otherClient.getByIdTag(one.getUserTagId());
                if (byIdTag.getData()!=null) {
                    appUser.setTagName(byIdTag.getData().getName());
                }
            }
            //匹配vipMap的值
            appUser.setVipName(vipMap.getData().get(appUser.getVipId()));
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java
@@ -15,6 +15,7 @@
import com.ruoyi.account.wx.tools.WxAppletTools;
import com.ruoyi.account.wx.tools.WxUtils;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
@@ -22,7 +23,6 @@
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
@@ -60,8 +60,11 @@
//        if (StringUtils.isNotBlank(data.getSignature())) {
//            WxUtils.verifySignature(data.getRawData(), sessionKey, data.getSignature());
//        }
        if(StringUtils.isEmpty(data.getEncryptedData()) || StringUtils.isEmpty(data.getIv())){
            return AjaxResult.success("已拒绝授权");
        }
        AppletUserDecodeData appletUserDecodeData = WxUtils.encryptedData(data.getEncryptedData(), sessionKey,  data.getIv());
        appletUserDecodeData.setOpenId(openid);
        return AjaxResult.ok(appUserService.wxLogin(appletUserDecodeData));
        return AjaxResult.success(appUserService.wxLogin(appletUserDecodeData));
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java
@@ -1,6 +1,7 @@
package com.ruoyi.account.service;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.alipay.api.response.AlipayUserInfoShareResponse;
import com.alipay.api.response.AlipayUserUserinfoShareResponse;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.account.api.model.TAppUser;
@@ -27,10 +28,11 @@
    /**
     * 支付宝小程序登录用户封装
     * @param userInfo
     * @param response
     * @return
     */
    Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response,AlipayUserUserinfoShareResponse userInfo);
//    Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response, AlipayUserInfoShareResponse userInfo);
    Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response,String phone);
    /**
     * 封装用户信息和token
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.account.service.impl;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.alipay.api.response.AlipayUserInfoShareResponse;
import com.alipay.api.response.AlipayUserUserinfoShareResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -65,34 +66,59 @@
    }
    @Override
    public Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response, AlipayUserUserinfoShareResponse userInfo) {
    public Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response,String phone) {
        // 通过手机号查询用户,是否已存在手动导入用户,包含微信用户
        TAppUser appUser = this.getOne(Wrappers.lambdaQuery(TAppUser.class)
                .eq(TAppUser::getPhone, userInfo.getMobile())
                .eq(TAppUser::getPhone, phone)
                .isNull(TAppUser::getAliOpenid)
                .last("LIMIT 1"));
        if(Objects.isNull(appUser)){
            // 先使用openId和当前手机号进行查询
            appUser = this.getOne(Wrappers.lambdaQuery(TAppUser.class)
                    .eq(TAppUser::getAliOpenid, response.getOpenId())
                    .eq(TAppUser::getPhone, userInfo.getMobile())
                    .eq(TAppUser::getPhone, phone)
                    .last("LIMIT 1"));
            if(Objects.isNull(appUser)){
                appUser = new TAppUser();
                appUser.setPhone(userInfo.getMobile());
                appUser.setPhone(phone);
            }
        }
        if(Objects.nonNull(appUser.getStatus())){
            throwInfo(appUser.getStatus());
        }
        appUser.setAvatar(userInfo.getAvatar());
        appUser.setCity(userInfo.getCity());
        appUser.setName(userInfo.getNickName());
        appUser.setProvince(userInfo.getProvince());
        appUser.setAliOpenid(response.getOpenId());
        this.saveOrUpdate(appUser);
        return this.getUserInfo(appUser);
    }
//    @Override
//    public Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response, AlipayUserInfoShareResponse userInfo) {
//        // 通过手机号查询用户,是否已存在手动导入用户,包含微信用户
//        TAppUser appUser = this.getOne(Wrappers.lambdaQuery(TAppUser.class)
//                .eq(TAppUser::getPhone, userInfo.getMobile())
//                .isNull(TAppUser::getAliOpenid)
//                .last("LIMIT 1"));
//        if(Objects.isNull(appUser)){
//            // 先使用openId和当前手机号进行查询
//            appUser = this.getOne(Wrappers.lambdaQuery(TAppUser.class)
//                    .eq(TAppUser::getAliOpenid, response.getOpenId())
//                    .eq(TAppUser::getPhone, userInfo.getMobile())
//                    .last("LIMIT 1"));
//            if(Objects.isNull(appUser)){
//                appUser = new TAppUser();
//                appUser.setPhone(userInfo.getMobile());
//            }
//        }
//        if(Objects.nonNull(appUser.getStatus())){
//            throwInfo(appUser.getStatus());
//        }
//        appUser.setAvatar(userInfo.getAvatar());
//        appUser.setCity(userInfo.getCity());
//        appUser.setName(userInfo.getNickName());
//        appUser.setProvince(userInfo.getProvince());
//        appUser.setAliOpenid(response.getOpenId());
//        this.saveOrUpdate(appUser);
//        return this.getUserInfo(appUser);
//    }
    @Override
    public Map<String, Object> getUserInfo(TAppUser appUser) {
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -243,4 +243,16 @@
        List<Site> sites = siteService.listByIds(ids);
        return R.ok(sites);
    }
    /**
     * 获取所有站点数据
     * @return
     */
    @ResponseBody
    @PostMapping("/getSiteAll")
    public R<List<Site>> getSiteAll(){
        List<Site> list = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0));
        return R.ok(list);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java
@@ -98,7 +98,7 @@
            return R.fail("excel导出失败!");
        }
        try {
            List<TApplyChargingPile> list = applyChargingPileService.lambdaQuery().list();
            List<TApplyChargingPile> list = applyChargingPileService.lambdaQuery().last("limit 1").list();
            List<TApplyChargingPileExportDto> exportDtos =new ArrayList<>();
            for (TApplyChargingPile tApplyChargingPile : list) {
ruoyi-service/ruoyi-chargingPile/src/main/resources/template/充电桩申请记录.xlsx
Binary files differ
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml
@@ -57,11 +57,11 @@
            <if test="null != req.code and req.code!=''">
                and t1.code  LIKE CONCAT('%',#{req.code},'%')
            </if>
            <if test="req.type != null and ·req.type != '' and req.type == 1">
                and t1.coupon_discount_amount  != null and t1.coupon_discount_amount  != 0
            <if test="req.type != null and req.type != '' and req.type == 1">
                and t1.coupon_discount_amount  IS NOT NULL and t1.coupon_discount_amount  != 0
            </if>
            <if test="req.type != null and req.type != '' and req.type == 2">
                and t1.vip_discount_amount  != null and t1.vip_discount_amount  != 0
                and t1.vip_discount_amount  IS NOT NULL and t1.vip_discount_amount  != 0
            </if>
            <if test="null != req.userIds and req.userIds.size()>0" >
                and t1.app_user_id in
@@ -97,13 +97,13 @@
                and t2.code  LIKE CONCAT('%',#{req.code},'%')
            </if>
            <if test="req.type != null and req.type != '' and req.type == 1">
                and t2.coupon_discount_amount  != null and t1.coupon_discount_amount  != 0
                and t2.coupon_discount_amount  IS NOT NULL and t2.coupon_discount_amount  != 0
            </if>
            <if test="req.type != null and req.type != '' and req.type == 2">
                and t2.vip_discount_amount  != null and t1.vip_discount_amount  != 0
                and t2.vip_discount_amount  IS NOT NULL and t2.vip_discount_amount  != 0
            </if>
            <if test="req.type == null ">
                and t2.vip_discount_amount  != null and t1.vip_discount_amount  != 0 and t2.coupon_discount_amount  != null and t1.coupon_discount_amount  != 0
                and t2.vip_discount_amount  IS NOT NULL and t2.vip_discount_amount  != 0 and t2.coupon_discount_amount  IS NOT NULL and t2.coupon_discount_amount  != 0
            </if>
            <if test="null != req.userIds and req.userIds.size()>0" >
                and t2.app_user_id in
@@ -129,12 +129,12 @@
                3 as orderType
                from t_vip_order t3
                where 1 = 1
                and t3.type ==1
                and t3.type =1
                <if test="null != req.code and req.code!=''">
                    and t3.code  LIKE CONCAT('%',#{req.code},'%')
                </if>
                <if test="req.type == null ">
                    and t3.discount_amount  != null and t3.discount_amount  != 0
                    and t3.discount_amount  IS NOT NULL and t3.discount_amount  != 0
                </if>
                <if test="null != req.userIds and req.userIds.size()>0" >
                    and t3.app_user_id in
@@ -164,7 +164,7 @@
                    and t4.code  LIKE CONCAT('%',#{req.code},'%')
                </if>
                <if test="req.type == null ">
                    and t4.discount_amount  != null and t4.discount_amount  != 0
                    and t4.discount_amount  IS NOT NULL and t4.discount_amount  != 0
                </if>
                <if test="null != req.userIds and req.userIds.size()>0" >
                    and t4.app_user_id in
ruoyi-service/ruoyi-other/pom.xml
@@ -92,6 +92,10 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-swagger</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-chargingPile</artifactId>
        </dependency>
        <!-- 引入Druid依赖,阿里巴巴所提供的数据源 -->
        <dependency>
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TRoleSiteController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.TRoleSite;
import com.ruoyi.other.service.TRoleSiteService;
@@ -26,6 +28,11 @@
    @Resource
    private TRoleSiteService roleSiteService;
    
    @Resource
    private SiteClient siteClient;
    /**
     * 查询角色站点数据
     * @param roleId
@@ -35,6 +42,14 @@
    @PostMapping("/getSiteIds/{roleId}")
    public R<List<Integer>> getSiteIds(@PathVariable Long roleId){
        List<TRoleSite> list = roleSiteService.list(new LambdaQueryWrapper<TRoleSite>().eq(TRoleSite::getRoleId, roleId));
        if(list.size() == 1){
            Integer siteId = list.get(0).getSiteId();
            if(0 == siteId){
                List<Site> data = siteClient.getSiteAll().getData();
                List<Integer> collect = data.stream().map(Site::getId).collect(Collectors.toList());
                return R.ok(collect);
            }
        }
        List<Integer> collect = list.stream().map(TRoleSite::getSiteId).collect(Collectors.toList());
        return R.ok(collect);
    }