feat: 一些调整

This commit is contained in:
曹鹏飞 2025-02-06 13:19:24 +08:00
parent d22fe7edec
commit 58a3d12fce
19 changed files with 284 additions and 39 deletions

View File

@ -5,13 +5,11 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
@SpringBootApplication
@MapperScan("com.nflg.mobilebroken.repository.mapper")
@ComponentScan(basePackages = {"com.nflg.mobilebroken.repository.service", "com.nflg.mobilebroken.admin"
, "com.nflg.mobilebroken.starter"})
@EnableMongoRepositories(basePackages = "com.nflg.mobilebroken.repository.service")
@EnableDiscoveryClient
public class AdminApplication {

View File

@ -39,14 +39,13 @@ public class MenuController extends ControllerBase {
private IAdminMenuButtonApiMapService adminMenuButtonApiMapService;
/**
* 获取所有菜单
*
* @return 菜单列表
* 搜索菜单
* @param request 请求信息
*/
@GetMapping("getAllMenu")
@MethodInfoMark(value = "获取所有菜单", menuName = "菜单管理")
public ApiResult<PageData<MenuVO>> getAllMenu(@RequestBody PageRequest request) {
return ApiResult.success(adminMenuService.getAll(request));
@PostMapping("searchMenu")
@MethodInfoMark(value = "搜索菜单", menuName = "菜单管理")
public ApiResult<PageData<MenuVO>> searchMenu(@Valid @RequestBody MenuSearchRequest request) {
return ApiResult.success(adminMenuService.search(request));
}
/**

View File

@ -1,9 +1,11 @@
package com.nflg.mobilebroken.admin.controller;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AdminUserVO;
import com.nflg.mobilebroken.common.pojo.vo.AuthorizeMenuVO;
import com.nflg.mobilebroken.common.pojo.vo.RoleVO;
import com.nflg.mobilebroken.repository.service.*;
import com.nflg.mobilebroken.starter.annotation.MethodInfoMark;
import org.springframework.transaction.annotation.Transactional;
@ -61,6 +63,17 @@ public class RoleController extends ControllerBase {
return ApiResult.success();
}
/**
* 搜索角色
*
* @param request 请求参数
*/
@PostMapping("searchRoles")
@MethodInfoMark(value = "搜索角色", menuName = "角色管理")
public ApiResult<PageData<RoleVO>> searchRoles(@Valid @RequestBody RoleSearchRequest request) {
return ApiResult.success(adminRoleService.search(request));
}
/**
* 启用/禁用角色
*

View File

@ -5,13 +5,11 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
@SpringBootApplication
@MapperScan("com.nflg.mobilebroken.repository.mapper")
@ComponentScan(basePackages = {"com.nflg.mobilebroken.repository.service", "com.nflg.mobilebroken.cfs"
,"com.nflg.mobilebroken.starter"})
@EnableMongoRepositories(basePackages = "com.nflg.mobilebroken.repository.service")
@EnableDiscoveryClient
public class CfsApplication {

View File

@ -1,6 +1,7 @@
package com.nflg.mobilebroken.cfs.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.mobilebroken.common.constant.TicketState;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.PageData;
@ -8,9 +9,8 @@ import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.*;
import com.nflg.mobilebroken.common.util.AppUserUtil;
import com.nflg.mobilebroken.common.util.MultilingualUtil;
import com.nflg.mobilebroken.repository.entity.AppUser;
import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.entity.TicketChat;
import com.nflg.mobilebroken.common.util.PageUtil;
import com.nflg.mobilebroken.repository.entity.*;
import com.nflg.mobilebroken.repository.service.*;
import org.springframework.web.bind.annotation.*;
@ -58,6 +58,15 @@ public class TiketController extends ControllerBase {
@Resource
private IDictionaryItemTranslateService dictionaryItemTranslateService;
@Resource
private IAdminUserService adminUserService;
@Resource
private IAppAreaService appAreaService;
@Resource
private ITBaseCustomerService customerService;
/**
* 搜索设备
*
@ -109,7 +118,14 @@ public class TiketController extends ControllerBase {
**/
@PostMapping("searchTickets")
public ApiResult<PageData<TicketVO>> searchTickets(@Valid @RequestBody TicketSearchRequest request){
return ApiResult.success(ticketService.search(request, AppUserUtil.getUser()));
IPage<TicketVO> datas = ticketService.search(request, AppUserUtil.getUser());
return ApiResult.success(PageUtil.convert(datas, d -> {
if (StrUtil.isNotBlank(d.getHandle())) {
List<AdminUser> adminUsers = adminUserService.listByIds(StrUtil.split(",", d.getHandle()));
d.setHandleBy(adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()));
}
return d;
}));
}
/**
@ -132,14 +148,19 @@ public class TiketController extends ControllerBase {
public ApiResult<TicketInfoVO> getTicket(@Valid @RequestParam @NotNull Integer id) {
Ticket ticket = ticketService.getById(id);
AppUser user = appUserService.getById(ticket.getUserId());
AppArea appArea = appAreaService.getById(user.getAreaId());
TBaseCustomer company = customerService.getById(Integer.valueOf(user.getCompanyId()));
TicketInfoVO vo = new TicketInfoVO()
.setId(ticket.getId())
.setTitle(ticket.getTitle())
.setDescription(ticket.getDescription())
.setState(ticket.getState())
.setAttachments(StrUtil.split(",", ticket.getAttachments()))
.setAttachments(StrUtil.isNotBlank(ticket.getAttachments()) ? StrUtil.split(",", ticket.getAttachments()) : Collections.emptyList())
.setCreateUserId(ticket.getUserId())
.setCreateUserName(user.getName())
.setCreateUserAvatar(user.getAvatar());
.setCreateUserAvatar(user.getAvatar())
.setAreaName(appArea.getName())
.setCompanyName(company.getAgencyCompanyName());
return ApiResult.success(vo);
}

View File

@ -0,0 +1,12 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
@Data
public class MenuSearchRequest extends PageRequest {
//菜单名称
private String name;
}

View File

@ -0,0 +1,11 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
@Data
public class RoleSearchRequest extends PageRequest {
private String name;
}

View File

@ -3,6 +3,7 @@ package com.nflg.mobilebroken.common.pojo.vo;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Data
@ -10,6 +11,9 @@ public class MenuVO {
private Integer id;
//父级菜单id
private Integer parentId;
// 菜单名称
private String name;
@ -38,5 +42,5 @@ public class MenuVO {
private LocalDateTime updateTime;
//下级菜单
private List<MenuVO> children;
private List<MenuVO> children = new ArrayList<>();
}

View File

@ -0,0 +1,25 @@
package com.nflg.mobilebroken.common.pojo.vo;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class RoleVO {
//创建人
public String createBy;
//创建时间
public LocalDateTime createTime;
//更新人
public String updateBy;
//更新时间
public LocalDateTime updateTime;
private Integer id;
//角色编号
private String code;
//角色名称
private String name;
//是否启用
private boolean enable;
}

View File

@ -30,6 +30,12 @@ public class TicketInfoVO {
//工单状态
private Byte state;
//所属公司
private String companyName;
//所属区域
private String areaName;
//附件
private List<String> attachments;
}

View File

@ -1,5 +1,7 @@
package com.nflg.mobilebroken.common.pojo.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.nflg.mobilebroken.common.constant.TicketState;
import lombok.Data;
import lombok.experimental.Accessors;
@ -31,12 +33,22 @@ public class TicketVO {
//创建时间
private LocalDateTime createTime;
@JsonIgnore
private String handle;
//处理人
private List<String> handleBy;
@JsonIgnore
private byte state;
//工单状态
private String stateDesc;
public String getStateDesc() {
return TicketState.findByValue(state).getDescription();
}
//区域名称
private String areaName;

View File

@ -1,8 +1,12 @@
package com.nflg.mobilebroken.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.mobilebroken.common.pojo.request.RoleSearchRequest;
import com.nflg.mobilebroken.common.pojo.vo.ButtonVO;
import com.nflg.mobilebroken.common.pojo.vo.MenuVO;
import com.nflg.mobilebroken.common.pojo.vo.RoleVO;
import com.nflg.mobilebroken.repository.entity.AdminRole;
import java.util.List;
@ -22,4 +26,6 @@ public interface AdminRoleMapper extends BaseMapper<AdminRole> {
List<MenuVO> getMenusByRoleCodes(List<String> roleCodes);
List<ButtonVO> getButtonsByRoleCodes(List<String> roleCodes);
IPage<RoleVO> search(RoleSearchRequest request, Page<?> page);
}

View File

@ -1,11 +1,9 @@
package com.nflg.mobilebroken.repository.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.EnableMenuRequest;
import com.nflg.mobilebroken.common.pojo.request.MenuAddRequest;
import com.nflg.mobilebroken.common.pojo.request.MenuUpdateRequest;
import com.nflg.mobilebroken.common.pojo.request.PageRequest;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AuthorizeMenuVO;
import com.nflg.mobilebroken.common.pojo.vo.MenuVO;
import com.nflg.mobilebroken.repository.entity.AdminMenu;
@ -31,4 +29,6 @@ public interface IAdminMenuService extends IService<AdminMenu> {
void enableMenu(EnableMenuRequest request);
List<AuthorizeMenuVO> getMenuForAuthorize(Integer roleId);
IPage<MenuVO> search(MenuSearchRequest request);
}

View File

@ -1,11 +1,14 @@
package com.nflg.mobilebroken.repository.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.mobilebroken.common.pojo.request.EnableRoleRequest;
import com.nflg.mobilebroken.common.pojo.request.RoleAddRequest;
import com.nflg.mobilebroken.common.pojo.request.RoleSearchRequest;
import com.nflg.mobilebroken.common.pojo.request.RoleUpdateRequest;
import com.nflg.mobilebroken.common.pojo.vo.ButtonVO;
import com.nflg.mobilebroken.common.pojo.vo.MenuVO;
import com.nflg.mobilebroken.common.pojo.vo.RoleVO;
import com.nflg.mobilebroken.repository.entity.AdminRole;
import java.util.List;
@ -31,4 +34,6 @@ public interface IAdminRoleService extends IService<AdminRole> {
List<MenuVO> getMenusByRoleCodes(List<String> roles);
List<ButtonVO> getButtonsByRoleCodes(List<String> roles);
IPage<RoleVO> search(RoleSearchRequest request);
}

View File

@ -2,14 +2,13 @@ package com.nflg.mobilebroken.repository.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.EnableMenuRequest;
import com.nflg.mobilebroken.common.pojo.request.MenuAddRequest;
import com.nflg.mobilebroken.common.pojo.request.MenuUpdateRequest;
import com.nflg.mobilebroken.common.pojo.request.PageRequest;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AuthorizeMenuVO;
import com.nflg.mobilebroken.common.pojo.vo.MenuVO;
import com.nflg.mobilebroken.common.util.AdminUserUtil;
@ -27,7 +26,10 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
@ -115,6 +117,118 @@ public class AdminMenuServiceImpl extends ServiceImpl<AdminMenuMapper, AdminMenu
return vos;
}
@Override
public IPage<MenuVO> search(MenuSearchRequest request) {
if (StrUtil.isBlank(request.getName())) {
return getPage(request);
} else {
LambdaQueryWrapper<AdminMenu> queryWrapper = new LambdaQueryWrapper<>();
if (StrUtil.isNotBlank(request.getName())) {
queryWrapper.like(AdminMenu::getName, request.getName());
}
queryWrapper.orderByDesc(AdminMenu::getId);
List<AdminMenu> list = baseMapper.selectList(queryWrapper);
//找出非根节点
List<AdminMenu> roots = list.stream().filter(l -> Objects.equals(l.getParentId(), 0)).collect(Collectors.toList());
List<MenuVO> children = convert(CollectionUtil.subtractToList(list, roots));
if (CollectionUtil.isEmpty(children)) {
return convertToPage1(roots, request.getPage(), request.getPageSize());
}
List<MenuVO> datas = new ArrayList<>();
for (MenuVO c : children) {
if (datas.stream().noneMatch(i -> i.getId().equals(c.getId()))) {
datas.add(c);
}
getParent(c, datas);
}
Iterator<MenuVO> it = datas.iterator();
while (it.hasNext()) {
MenuVO d = it.next();
MenuVO aa = datas.stream().filter(r -> Objects.equals(d.getParentId(), r.getId())).findFirst().orElse(null);
if (Objects.nonNull(aa)) {
aa.getChildren().add(d);
it.remove();
}
}
roots.removeIf(r -> datas.stream().map(MenuVO::getId).anyMatch(i -> i.equals(r.getId())));
if (CollectionUtil.isNotEmpty(roots)) {
datas.addAll(convert(roots));
}
datas.sort((o1, o2) -> o1.getId().compareTo(o2.getId()));
return convertToPage2(datas, request.getPage(), request.getPageSize());
}
}
private void getParent(MenuVO child, List<MenuVO> datas) {
AdminMenu parent = lambdaQuery().eq(AdminMenu::getId, child.getParentId()).one();
if (Objects.nonNull(parent)) {
if (datas.stream().noneMatch(i -> i.getId().equals(parent.getId()))) {
MenuVO p = convert(parent);
datas.add(p);
getParent(p, datas);
}
}
}
private IPage<MenuVO> convertToPage1(List<AdminMenu> list, Integer pageNum, Integer pageSize) {
int num = (pageNum - 1) * pageSize;
if (num >= list.size()) {
return new Page<>();
}
list = list.stream().skip(num).limit(pageSize).collect(Collectors.toList());
IPage<MenuVO> page = new Page<>();
page.setRecords(convert(list));
page.setTotal(list.size());
page.setCurrent(pageNum);
return page;
}
private IPage<MenuVO> convertToPage2(List<MenuVO> list, Integer pageNum, Integer pageSize) {
int num = (pageNum - 1) * pageSize;
if (num >= list.size()) {
return new Page<>();
}
list = list.stream().skip(num).limit(pageSize).collect(Collectors.toList());
IPage<MenuVO> page = new Page<>();
page.setRecords(list);
page.setTotal(list.size());
page.setCurrent(pageNum);
return page;
}
private IPage<MenuVO> getPage(MenuSearchRequest request) {
IPage<AdminMenu> page = new Page<>();
page.setCurrent(request.getPage());
page.setSize(request.getPageSize());
lambdaQuery().eq(AdminMenu::getParentId, 0)
.orderByAsc(AdminMenu::getId)
.page(page);
List<MenuVO> datas = convert(page.getRecords());
datas.forEach(d -> d.setChildren(getChildren(d.getId())));
IPage<MenuVO> po = new Page<>();
po.setSize(page.getSize());
po.setCurrent(page.getCurrent());
po.setTotal(page.getTotal());
po.setRecords(datas);
return po;
}
private List<MenuVO> getChildren(Integer parentId) {
List<MenuVO> datas = convert(lambdaQuery().eq(AdminMenu::getParentId, parentId)
.orderByAsc(AdminMenu::getId)
.list());
datas.forEach(d -> d.setChildren(getChildren(d.getId())));
return datas;
}
private MenuVO convert(AdminMenu area) {
return Convert.convert(MenuVO.class, area);
}
private List<MenuVO> convert(List<AdminMenu> areas) {
return Convert.toList(MenuVO.class, areas);
}
private Boolean menuIsSelected(Integer roleId, Integer menuId) {
return adminRoleMenuMapService.lambdaQuery()
.eq(AdminRoleMenuMap::getMenuId, menuId)

View File

@ -1,11 +1,15 @@
package com.nflg.mobilebroken.repository.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.pojo.request.EnableRoleRequest;
import com.nflg.mobilebroken.common.pojo.request.RoleAddRequest;
import com.nflg.mobilebroken.common.pojo.request.RoleSearchRequest;
import com.nflg.mobilebroken.common.pojo.request.RoleUpdateRequest;
import com.nflg.mobilebroken.common.pojo.vo.ButtonVO;
import com.nflg.mobilebroken.common.pojo.vo.MenuVO;
import com.nflg.mobilebroken.common.pojo.vo.RoleVO;
import com.nflg.mobilebroken.common.util.AdminUserUtil;
import com.nflg.mobilebroken.repository.entity.AdminRole;
import com.nflg.mobilebroken.repository.mapper.AdminRoleMapper;
@ -73,4 +77,9 @@ public class AdminRoleServiceImpl extends ServiceImpl<AdminRoleMapper, AdminRole
public List<ButtonVO> getButtonsByRoleCodes(List<String> roleCodes) {
return baseMapper.getButtonsByRoleCodes(roleCodes);
}
@Override
public IPage<RoleVO> search(RoleSearchRequest request) {
return baseMapper.search(request, new Page<>(request.getPage(), request.getPageSize()));
}
}

View File

@ -92,11 +92,11 @@ public class AppAreaServiceImpl extends ServiceImpl<AppAreaMapper, AppArea> impl
}
private IPage<AreaVO> convertToPage1(List<AppArea> list, Integer pageNum, Integer pageSize) {
int num = pageNum * pageSize;
int num = (pageNum - 1) * pageSize;
if (num >= list.size()) {
return new Page<>();
}
list = list.stream().skip(num).limit(pageNum).collect(Collectors.toList());
list = list.stream().skip(num).limit(pageSize).collect(Collectors.toList());
IPage<AreaVO> page = new Page<>();
page.setRecords(convert(list));
page.setTotal(list.size());
@ -105,11 +105,11 @@ public class AppAreaServiceImpl extends ServiceImpl<AppAreaMapper, AppArea> impl
}
private IPage<AreaVO> convertToPage2(List<AreaVO> list, Integer pageNum, Integer pageSize) {
int num = pageNum * pageSize;
int num = (pageNum - 1) * pageSize;
if (num >= list.size()) {
return new Page<>();
}
list = list.stream().skip(num).limit(pageNum).collect(Collectors.toList());
list = list.stream().skip(num).limit(pageSize).collect(Collectors.toList());
IPage<AreaVO> page = new Page<>();
page.setRecords(list);
page.setTotal(list.size());

View File

@ -45,4 +45,15 @@
#{code}
</foreach>
</select>
<select id="search" resultType="com.nflg.mobilebroken.common.pojo.vo.RoleVO">
SELECT id,code,name,enable,create_by AS 'createBy',create_time AS 'createTime',update_by AS 'updateBy'
,update_time AS 'updateTime'
FROM admin_role
<where>
<if test="request.name != null and request.name != ''">
AND name LIKE CONCAT('%',#{request.name},'%')
</if>
</where>
</select>
</mapper>

View File

@ -65,29 +65,30 @@
</sql>
<select id="searchMy" resultType="com.nflg.mobilebroken.common.pojo.vo.TicketVO">
SELECT t.*,a.`name` AS 'areaName'
SELECT t.*,a.`name` AS 'areaName',IF(tf.id IS NULL, false, true) AS 'followed',u.`name` AS 'createBy'
FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id AND u.enable=1
LEFT JOIN app_area a ON u.area_id=a.id AND a.`enable`=1
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN app_area a ON u.area_id=a.id
LEFT JOIN ticket_follow tf ON t.id=tf.ticket_id
WHERE t.user_id=#{userId}
<include refid="searchWhereCondition"/>
</select>
<select id="searchFollow" resultType="com.nflg.mobilebroken.common.pojo.vo.TicketVO">
SELECT t.*,a.`name` AS 'areaName'
SELECT t.*,a.`name` AS 'areaName',true AS 'followed',u.`name` AS 'createBy'
FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id AND u.enable=1
LEFT JOIN app_area a ON u.area_id=a.id AND a.`enable`=1
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN app_area a ON u.area_id=a.id
LEFT JOIN ticket_follow tf ON t.id=tf.ticket_id
WHERE tf.user_id=#{userId}
<include refid="searchWhereCondition"/>
</select>
<select id="searchArea" resultType="com.nflg.mobilebroken.common.pojo.vo.TicketVO">
SELECT t.*,a.`name` AS 'areaName'
SELECT t.*,a.`name` AS 'areaName',u.`name` AS 'createBy'
FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id AND u.enable=1
LEFT JOIN app_area a ON u.area_id=a.id AND a.`enable`=1
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN app_area a ON u.area_id=a.id
WHERE u.company_id IN
<foreach collection="companyIds" item="companyId" open="(" separator="," close=")">
#{companyId}