feat: 添加功能

This commit is contained in:
曹鹏飞 2025-01-27 22:34:35 +08:00
parent 4dc5382f9c
commit 7758098974
35 changed files with 862 additions and 43 deletions

View File

@ -27,8 +27,8 @@ import java.util.List;
* @author 曹鹏飞
*/
@RestController
@RequestMapping("/account")
public class AccountController {
@RequestMapping("/adminuser")
public class AdminUserController {
@Resource
private IAdminUserService adminUserService;

View File

@ -0,0 +1,157 @@
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.AppUserApplyforVO;
import com.nflg.mobilebroken.common.pojo.vo.AppUserForAdminVO;
import com.nflg.mobilebroken.common.pojo.vo.AreaSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.CompanySimpleVO;
import com.nflg.mobilebroken.repository.service.IAppUserApplyforService;
import com.nflg.mobilebroken.repository.service.IAppUserService;
import com.nflg.mobilebroken.repository.service.ITBaseAreaService;
import com.nflg.mobilebroken.repository.service.ITBaseCustomerService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
/**
* 代理商相关接口
*
* @author 曹鹏飞
*/
@RestController
@RequestMapping("/appuser")
public class AppUserController {
@Resource
private IAppUserService appUserService;
@Resource
private ITBaseCustomerService customerService;
@Resource
private ITBaseAreaService areaService;
@Resource
private IAppUserApplyforService appUserApplyforService;
/**
* 获取公司列表
*
* @return 部门列表
*/
@PostMapping("getSimpleCompanys")
public ApiResult<List<CompanySimpleVO>> getSimpleCompanys() {
return ApiResult.success(customerService.getSimpleCompanys());
}
/**
* 获取区域列表
*
* @return 部门列表
*/
@PostMapping("getSimpleAreas")
public ApiResult<List<AreaSimpleVO>> getSimpleAreas() {
return ApiResult.success(areaService.getSimpleAreas());
}
/**
* 添加代理商主账号
*
* @param request 请求参数
*/
@PostMapping("addPrimaryAppUser")
private ApiResult<Void> addPrimaryAppUser(@Valid @RequestBody PrimaryAppUserAddRequest request) {
appUserService.addPrimaryAppUser(request);
return ApiResult.success();
}
/**
* 更新代理商主账号
*
* @param request 请求参数
*/
@PostMapping("updatePrimaryAppUser")
private ApiResult<Void> updatePrimaryAppUser(@Valid @RequestBody PrimaryAppUserUpdateRequest request) {
appUserService.updatePrimaryAppUser(request);
return ApiResult.success();
}
/**
* 代理商子账号审核
*
* @param id 审批id
*/
@GetMapping("getAppUserApplyfor")
public ApiResult<AppUserApplyforVO> getAppUserApplyfor(@Valid @RequestParam Integer id) {
return ApiResult.success(appUserApplyforService.getAppUserApplyfor(id));
}
/**
* 代理商子账号审核
*
* @param request 审批信息
*/
@PostMapping("approveAppUserApplyfor")
public ApiResult<Void> approveAppUserApplyfor(@Valid @RequestBody ApproveAppUserApplyforRequest request) {
appUserApplyforService.approveAppUserApplyfor(request);
return ApiResult.success();
}
/**
* 代理商续期
*
* @param request 请求参数
*/
@PostMapping("renewalAppUser")
public ApiResult<Void> renewalAppUser(@Valid @RequestBody RenewalAppUserRequest request) {
//TODO 代理商续期
// appUserService.renewal(request);
return ApiResult.success();
}
/**
* 代理商迁移
*
* @param request 请求参数
*/
@PostMapping("migrateAppUser")
public ApiResult<Void> migrateAppUser(@Valid @RequestBody MigrateAppUserRequest request) {
appUserService.migrate(request);
return ApiResult.success();
}
/**
* 搜索代理商主账号列表
*
* @param request 请求参数
*/
@PostMapping("searchAppUserForAdmin")
public ApiResult<PageData<AppUserForAdminVO>> searchAppUserForAdmin(@Valid @RequestBody SearchAppUserForAdminRequest request) {
return ApiResult.success(appUserService.searchAppUserForAdmin(request));
}
/**
* 搜索代理商子账号列表
*
* @param id 主账号id
*/
@GetMapping("getChildrenOfAppUser")
public ApiResult<List<AppUserForAdminVO>> getChildrenOfAppUser(@Valid @RequestParam Integer id) {
return ApiResult.success(appUserService.getChildrenOfAppUser(id));
}
/**
* 启用/禁用代理商
*
* @param request 请求参数
*/
@PostMapping("enableAppUser")
public ApiResult<Void> enableAppUser(@Valid @RequestBody EnableAppUserRequest request) {
appUserService.enable(request);
return ApiResult.success();
}
}

View File

@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.chrono.ChronoLocalDate;
import java.util.Arrays;
import java.util.Objects;
@ -40,7 +41,7 @@ public class AppController {
AppUser user=appUserService.getUser(userName,password);
VUtils.trueThrow(Objects.isNull(user)).throwMessage(STATE.PassportErr,"用户名或密码错误");
VUtils.trueThrow(!user.getEnable()).throwMessage(STATE.PassportErr,"用户未启用,请联系管理员");
VUtils.trueThrow(user.getExpireTime().isBefore(LocalDateTime.now())).throwMessage(STATE.PassportErr,"用户已过期,请联系管理员");
VUtils.trueThrow(user.getExpireTime().isBefore(ChronoLocalDate.from(LocalDateTime.now()))).throwMessage(STATE.PassportErr, "用户已过期,请联系管理员");
SaTokenAppUtil.login(user.getId(), SaLoginConfig
.setExtra("name", user.getName())
.setExtra("companys", Arrays.asList(1,2))

View File

@ -6,6 +6,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDateTime;
@SpringBootTest(classes = {CfsApplication.class})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class UserTest {
@ -18,4 +20,10 @@ public class UserTest {
public void getUserCount(){
System.out.println("用户数量: "+userService.list().size());
}
@Test
public void test1() {
LocalDateTime date = LocalDateTime.of(LocalDateTime.now().getYear(), 1, 1, 0, 0, 0).plusYears(1).minusDays(1);
System.out.println(date);
}
}

View File

@ -0,0 +1,12 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
@Data
public class ApproveAppUserApplyforRequest {
private Integer id;
// 通过/不通过
private Boolean pass;
}

View File

@ -0,0 +1,15 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
import java.util.List;
@Data
public class EnableAppUserRequest {
// 是否启用
private Boolean enable;
// 用户id列表
private List<Integer> ids;
}

View File

@ -0,0 +1,13 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
@Data
public class MigrateAppUserRequest {
// 旧公司id
private Integer oldCompanyId;
// 新公司id
private Integer newCompanyId;
}

View File

@ -0,0 +1,46 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class PrimaryAppUserAddRequest {
//登录名
@NotBlank
private String loginName;
//用户名
@NotBlank
private String userName;
//公司id列表
@NotEmpty
private List<Integer> companyIds;
//销售人员姓名
@NotBlank
private String salesUserName;
//邮箱
@NotBlank
private String email;
//手机
private String phone;
//区域id
@NotNull
private Integer areaId;
//是否启用
@NotNull
private Boolean enable;
//头像
private String avatar;
}

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 PrimaryAppUserUpdateRequest extends PrimaryAppUserAddRequest {
private Integer id;
}

View File

@ -0,0 +1,9 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
@Data
public class RenewalAppUserRequest {
}

View File

@ -0,0 +1,24 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
@Data
public class SearchAppUserForAdminRequest extends PageRequest {
// 登录名
private String loginName;
// 姓名
private String name;
//公司名称
private String companyName;
// 是否启用
private Boolean enable;
//状态0审核中1使用中2已过期
private Integer state;
}

View File

@ -0,0 +1,41 @@
package com.nflg.mobilebroken.common.pojo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
@Data
@Accessors(chain = true)
public class AppUserApplyforInfoVO {
// 头像
private String avatar;
//申请类型0新增账号1账号启用2账号延期
private Integer type;
//公司名称
private String companyName;
//区域名称
private String areaName;
//邮箱
private String email;
//用户名
private String userName;
//职位
private String titleName;
//手机
private String phone;
//申请原因
private String reason;
//申请时间
private LocalDateTime createTime;
}

View File

@ -0,0 +1,20 @@
package com.nflg.mobilebroken.common.pojo.vo;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
@Data
public class AppUserApplyforVO {
// 申请信息
@Valid
@NotNull
private AppUserApplyforInfoVO applyfor;
@Valid
@NotNull
// 申请人信息
private AppUserVO user;
}

View File

@ -0,0 +1,66 @@
package com.nflg.mobilebroken.common.pojo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@Accessors(chain = true)
public class AppUserForAdminVO {
//账号id
private Integer id;
//头像
private String avatar;
//登录名
private String loginName;
//姓名
private String userName;
//公司名称
private String companyName;
//姓名
private String name;
//邮箱
private String email;
//销售人员姓名
private String salesUserName;
//区域名称
private String areaName;
//是否启用
private boolean enable;
//账号过期时间
private LocalDate expireTime;
//状态0审核中1使用中2已过期
private Integer state;
//创建人
private String createBy;
//创建时间
private LocalDateTime createTime;
//最后更新人
private String updateBy;
//最后更新时间
private LocalDateTime updateTime;
//最后登录时间
private LocalDateTime lastLoginTime;
//是否主账号
private boolean isPrimary;
}

View File

@ -3,6 +3,7 @@ package com.nflg.mobilebroken.common.pojo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@ -46,8 +47,11 @@ public class AppUserVO {
private LocalDateTime lastLoginTime;
//账号过期时间
private LocalDateTime expireTime;
private LocalDate expireTime;
//是否主账号
private boolean isPrimary;
//销售人员姓名
private String salesUserName;
}

View File

@ -10,7 +10,7 @@ import java.util.List;
public class AreaSimpleVO {
//区域id
private int id;
private Long id;
//区域名称
private String name;

View File

@ -0,0 +1,15 @@
package com.nflg.mobilebroken.common.pojo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class CompanySimpleVO {
// 公司id
private Long id;
// 公司名称
private String name;
}

View File

@ -11,7 +11,7 @@ import java.io.Serializable;
/**
* <p>
*
*
* </p>
*
* @author 代码生成器生成

View File

@ -11,7 +11,7 @@ import java.io.Serializable;
/**
* <p>
*
*
* </p>
*
* @author 代码生成器生成

View File

@ -3,12 +3,14 @@ package com.nflg.mobilebroken.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* <p>
* 用户端-用户
@ -29,9 +31,9 @@ public class AppUser implements Serializable {
private Integer id;
/**
* 用户编号
* 登录名
*/
private String code;
private String loginName;
/**
* 用户名称
@ -71,13 +73,23 @@ public class AppUser implements Serializable {
/**
* 公司id
*/
private Integer companyId;
private String companyId;
/**
* 是否是主账号0不是1
*/
private Boolean isPrimary;
/**
* 职位编码
*/
private String titleCode;
/**
* 所属销售代表
*/
private String salesUserName;
/**
* 创建人id
*/
@ -106,5 +118,5 @@ public class AppUser implements Serializable {
/**
* 过期时间
*/
private LocalDateTime expireTime;
private LocalDate expireTime;
}

View File

@ -3,12 +3,13 @@ package com.nflg.mobilebroken.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 用户端-用户申请
@ -78,11 +79,21 @@ public class AppUserApplyfor implements Serializable {
*/
private Byte type;
/**
* 职位编码
*/
private String titleCode;
/**
* 处理状态0待审核1审核通过2审核不通过
*/
private Byte state;
/**
* 所属销售代表
*/
private String salesUserName;
/**
* 创建人id
*/

View File

@ -17,4 +17,6 @@ public interface DictionaryItemMapper extends BaseMapper<DictionaryItem> {
@Select("SELECT di.id FROM dictionary_item di INNER JOIN dictionary d ON di.dictionary_id=d.id WHERE d.`name`=#{dictionaryName} AND di.`name`=#{dictionaryItemName}")
Integer getId(@Param("dictionaryName") String dictionaryName, @Param("dictionaryItemName") String dictionaryItemName);
String getName(String dictionaryCode, String itemCode);
}

View File

@ -3,7 +3,9 @@ package com.nflg.mobilebroken.repository.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.mobilebroken.common.pojo.request.AddUserRequest;
import com.nflg.mobilebroken.common.pojo.request.ApplyForExtensionRequest;
import com.nflg.mobilebroken.common.pojo.request.ApproveAppUserApplyforRequest;
import com.nflg.mobilebroken.common.pojo.request.EnableRequest;
import com.nflg.mobilebroken.common.pojo.vo.AppUserApplyforVO;
import com.nflg.mobilebroken.repository.entity.AppUserApplyfor;
/**
@ -21,4 +23,8 @@ public interface IAppUserApplyforService extends IService<AppUserApplyfor> {
void addEnable(EnableRequest request);
void applyForExtension(ApplyForExtensionRequest request);
AppUserApplyforVO getAppUserApplyfor(Integer id);
void approveAppUserApplyfor(ApproveAppUserApplyforRequest request);
}

View File

@ -2,11 +2,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.UpdatePasswordRequest;
import com.nflg.mobilebroken.common.pojo.request.UserSearchRequest;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AppUserForAdminVO;
import com.nflg.mobilebroken.common.pojo.vo.AppUserVO;
import com.nflg.mobilebroken.repository.entity.AppUser;
import java.util.List;
/**
* <p>
* 用户端-用户 服务类
@ -28,4 +31,16 @@ public interface IAppUserService extends IService<AppUser> {
void updatePassword(UpdatePasswordRequest request);
AppUserVO getInfo(Integer userId);
void addPrimaryAppUser(PrimaryAppUserAddRequest request);
void updatePrimaryAppUser(PrimaryAppUserUpdateRequest request);
void migrate(MigrateAppUserRequest request);
PageData<AppUserForAdminVO> searchAppUserForAdmin(SearchAppUserForAdminRequest request);
void enable(EnableAppUserRequest request);
List<AppUserForAdminVO> getChildrenOfAppUser(Integer id);
}

View File

@ -21,4 +21,6 @@ public interface IDictionaryItemService extends IService<DictionaryItem> {
void save(SaveDictionaryItemRequest request);
Integer getId(String dictionaryName, String dictionaryItemName);
String getTitleName(String titleCode);
}

View File

@ -1,10 +1,11 @@
package com.nflg.mobilebroken.repository.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.mobilebroken.common.pojo.query.PageBaseQuery;
import com.nflg.mobilebroken.common.pojo.vo.AreaSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.TBaseAreaVO;
import com.nflg.mobilebroken.repository.entity.TBaseArea;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -24,4 +25,6 @@ public interface ITBaseAreaService extends IService<TBaseArea> {
void delByIds(@Param("ids") List<Long> ids, String userNo, String userName);
Integer getCount();
List<AreaSimpleVO> getSimpleAreas();
}

View File

@ -1,9 +1,10 @@
package com.nflg.mobilebroken.repository.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.mobilebroken.common.pojo.query.PageBaseQuery;
import com.nflg.mobilebroken.repository.entity.TBaseCustomer;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.mobilebroken.common.pojo.query.PageBaseQuery;
import com.nflg.mobilebroken.common.pojo.vo.CompanySimpleVO;
import com.nflg.mobilebroken.repository.entity.TBaseCustomer;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -22,4 +23,6 @@ public interface ITBaseCustomerService extends IService<TBaseCustomer> {
Page<TBaseCustomer> getList(@Param("page")Page<PageBaseQuery> page, @Param("query") PageBaseQuery query);
void delByIds(@Param("ids") List<Long> ids ,@Param("userNo")String userNo , @Param("userName") String userName);
List<CompanySimpleVO> getSimpleCompanys();
}

View File

@ -5,16 +5,27 @@ import com.nflg.mobilebroken.common.constant.AppUserApplyForState;
import com.nflg.mobilebroken.common.constant.AppUserApplyforType;
import com.nflg.mobilebroken.common.pojo.request.AddUserRequest;
import com.nflg.mobilebroken.common.pojo.request.ApplyForExtensionRequest;
import com.nflg.mobilebroken.common.pojo.request.ApproveAppUserApplyforRequest;
import com.nflg.mobilebroken.common.pojo.request.EnableRequest;
import com.nflg.mobilebroken.common.pojo.vo.AppUserApplyforInfoVO;
import com.nflg.mobilebroken.common.pojo.vo.AppUserApplyforVO;
import com.nflg.mobilebroken.common.pojo.vo.AppUserVO;
import com.nflg.mobilebroken.common.util.TokenUtil;
import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.AppArea;
import com.nflg.mobilebroken.repository.entity.AppUser;
import com.nflg.mobilebroken.repository.entity.AppUserApplyfor;
import com.nflg.mobilebroken.repository.mapper.AppUserApplyforMapper;
import com.nflg.mobilebroken.repository.service.IAppAreaService;
import com.nflg.mobilebroken.repository.service.IAppUserApplyforService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import com.nflg.mobilebroken.repository.service.IAppUserService;
import com.nflg.mobilebroken.repository.service.IDictionaryItemService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* <p>
@ -27,7 +38,14 @@ import java.time.LocalDateTime;
@Service
public class AppUserApplyforServiceImpl extends ServiceImpl<AppUserApplyforMapper, AppUserApplyfor> implements IAppUserApplyforService {
private static final PasswordEncoder PASSWORDENCODER = new BCryptPasswordEncoder();
@Resource
private IAppAreaService appAreaService;
@Resource
private IDictionaryItemService dictionaryItemService;
@Resource
private IAppUserService appUserService;
@Override
public void add(AddUserRequest request) {
@ -69,4 +87,81 @@ public class AppUserApplyforServiceImpl extends ServiceImpl<AppUserApplyforMappe
.setCreateTime(LocalDateTime.now());
save(applyfor);
}
@Override
public AppUserApplyforVO getAppUserApplyfor(Integer id) {
AppUserApplyfor applyfor = getById(id);
VUtils.trueThrowBusinessError(Objects.isNull(applyfor)).throwMessage("审批信息不存在");
AppUserApplyforVO vo = new AppUserApplyforVO();
AppArea area = appAreaService.getById(applyfor.getAreaId());
String titleName = dictionaryItemService.getTitleName(applyfor.getTitleCode());
vo.setApplyfor(new AppUserApplyforInfoVO()
.setAreaName(area.getName())
.setPhone(applyfor.getUserPhone())
.setEmail(applyfor.getUserEmail())
.setAvatar(applyfor.getUserAvatar())
.setUserName(applyfor.getUserName())
.setTitleName(titleName)
.setReason(applyfor.getReason())
.setCreateTime(applyfor.getCreateTime()));
AppUser appUser = appUserService.getById(applyfor.getUserId());
area = appAreaService.getById(appUser.getAreaId());
vo.setUser(new AppUserVO()
.setAreaName(area.getName())
.setSalesUserName(appUser.getSalesUserName())
.setExpireTime(appUser.getExpireTime())
.setEmail(appUser.getEmail())
.setName(appUser.getName()));
return vo;
}
@Transactional
@Override
public void approveAppUserApplyfor(ApproveAppUserApplyforRequest request) {
AppUserApplyfor applyfor = getById(request.getId());
VUtils.trueThrowBusinessError(Objects.isNull(applyfor)).throwMessage("审批信息不存在");
if (request.getPass()) {
if (applyfor.getType() == AppUserApplyforType.ADD.getState().byteValue()) {
//新增账号
AppUser appUser = appUserService.getById(applyfor.getCreateBy());
AppUser user = new AppUser()
.setName(applyfor.getUserName())
.setEmail(applyfor.getUserEmail())
.setAvatar(applyfor.getUserAvatar())
.setPhone(applyfor.getUserPhone())
.setAreaId(applyfor.getAreaId())
.setCompanyId(String.valueOf(applyfor.getCompanyId()))
.setTitleCode(applyfor.getTitleCode())
.setEnable(true)
.setCreateBy(applyfor.getCreateBy())
.setCreateTime(LocalDateTime.now())
.setExpireTime(appUser.getExpireTime())
.setSalesUserName(appUser.getSalesUserName());
appUserService.save(user);
} else if (applyfor.getType() == AppUserApplyforType.ENABLE.getState().byteValue()) {
//账号启用
AppUser appUser = appUserService.getById(applyfor.getUserId());
appUser.setEnable(true)
.setUpdateBy(applyfor.getCreateBy())
.setUpdateTime(LocalDateTime.now());
appUserService.updateById(appUser);
} else if (applyfor.getType() == AppUserApplyforType.EXTENSION.getState().byteValue()) {
//账号延期
AppUser appUser = appUserService.getById(applyfor.getUserId());
appUser.setExpireTime(appUser.getExpireTime())
.setUpdateBy(applyfor.getCreateBy())
.setUpdateTime(LocalDateTime.now());
appUserService.updateById(appUser);
}
applyfor.setState(AppUserApplyForState.APPROVED.getState().byteValue())
.setUpdateBy(TokenUtil.getUserId())
.setUpdateTime(LocalDateTime.now());
updateById(applyfor);
} else {
applyfor.setState(AppUserApplyForState.REJECT.getState().byteValue())
.setUpdateBy(TokenUtil.getUserId())
.setUpdateTime(LocalDateTime.now());
updateById(applyfor);
}
}
}

View File

@ -1,22 +1,37 @@
package com.nflg.mobilebroken.repository.service.impl;
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.request.UpdatePasswordRequest;
import com.nflg.mobilebroken.common.pojo.request.UserSearchRequest;
import com.nflg.mobilebroken.common.constant.AppUserApplyForState;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AppUserForAdminVO;
import com.nflg.mobilebroken.common.pojo.vo.AppUserVO;
import com.nflg.mobilebroken.common.util.PageUtil;
import com.nflg.mobilebroken.common.util.TokenUtil;
import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.AppArea;
import com.nflg.mobilebroken.repository.entity.AppUser;
import com.nflg.mobilebroken.repository.entity.AppUserApplyfor;
import com.nflg.mobilebroken.repository.entity.TBaseCustomer;
import com.nflg.mobilebroken.repository.mapper.AppUserMapper;
import com.nflg.mobilebroken.repository.service.IAppAreaService;
import com.nflg.mobilebroken.repository.service.IAppUserApplyforService;
import com.nflg.mobilebroken.repository.service.IAppUserService;
import com.nflg.mobilebroken.repository.service.ITBaseCustomerService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.chrono.ChronoLocalDate;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* <p>
@ -31,11 +46,20 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
private static final PasswordEncoder PASSWORDENCODER = new BCryptPasswordEncoder();
@Resource
private IAppAreaService appAreaService;
@Resource
private IAppUserApplyforService appUserApplyforService;
@Resource
private ITBaseCustomerService customerService;
@Override
public AppUser getUser(String userName, String password) {
String encodePassword=PASSWORDENCODER.encode(password);
return lambdaQuery()
.eq(AppUser::getCode, userName)
.eq(AppUser::getLoginName, userName)
.eq(AppUser::getPassword, encodePassword)
.one();
}
@ -78,4 +102,172 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
public AppUserVO getInfo(Integer userId) {
return baseMapper.getInfo(userId);
}
}
@Override
public void addPrimaryAppUser(PrimaryAppUserAddRequest request) {
VUtils.trueThrowBusinessError(lambdaQuery().eq(AppUser::getLoginName, request.getLoginName()).exists())
.throwMessage("登录名已存在");
AppUser user = new AppUser()
.setLoginName(request.getLoginName())
.setName(request.getUserName())
.setEmail(request.getEmail())
.setPhone(request.getPhone())
.setAreaId(request.getAreaId())
.setCompanyId(StrUtil.join(",", request.getCompanyIds()))
.setIsPrimary(true)
.setSalesUserName(request.getSalesUserName())
.setCreateBy(TokenUtil.getUserId())
.setCreateTime(LocalDateTime.now())
.setEnable(request.getEnable())
.setExpireTime(LocalDateTime.of(LocalDateTime.now().getYear(), 12, 31, 0, 0, 0).toLocalDate());
save(user);
}
@Override
public void updatePrimaryAppUser(PrimaryAppUserUpdateRequest request) {
VUtils.trueThrowBusinessError(lambdaQuery()
.eq(AppUser::getLoginName, request.getLoginName())
.ne(AppUser::getId, request.getId())
.exists())
.throwMessage("登录名已存在");
AppUser user = new AppUser()
.setId(request.getId())
.setLoginName(request.getLoginName())
.setName(request.getUserName())
.setEmail(request.getEmail())
.setPhone(request.getPhone())
.setAreaId(request.getAreaId())
.setCompanyId(StrUtil.join(",", request.getCompanyIds()))
.setIsPrimary(true)
.setUpdateBy(TokenUtil.getUserId())
.setUpdateTime(LocalDateTime.now())
.setEnable(request.getEnable());
updateById(user);
}
@Override
public void migrate(MigrateAppUserRequest request) {
AppUser appUser = lambdaQuery()
.eq(AppUser::getCompanyId, "'" + request.getOldCompanyId() + "'")
.eq(AppUser::getIsPrimary, true)
.one();
VUtils.trueThrowBusinessError(Objects.isNull(appUser)).throwMessage("代理商主账号不存在");
lambdaUpdate()
.set(AppUser::getCompanyId, "'" + request.getNewCompanyId() + "'")
.set(AppUser::getExpireTime, appUser.getExpireTime())
.set(AppUser::getUpdateBy, TokenUtil.getUserId())
.set(AppUser::getUpdateTime, LocalDateTime.now())
.eq(AppUser::getCompanyId, request.getOldCompanyId().toString())
.eq(AppUser::getIsPrimary, false)
.update();
}
@Override
public PageData<AppUserForAdminVO> searchAppUserForAdmin(SearchAppUserForAdminRequest request) {
IPage<AppUser> page = lambdaQuery()
.eq(AppUser::getIsPrimary, true)
.like(StrUtil.isNotBlank(request.getLoginName()), AppUser::getLoginName, request.getLoginName())
.like(StrUtil.isNotBlank(request.getName()), AppUser::getName, request.getName())
.page(new Page<>(request.getPage(), request.getPageSize()));
return PageUtil.convert(page, d -> {
AppArea area = appAreaService.getById(d.getAreaId());
AppUser appUser = getById(d.getCreateBy());
String updateBy = null;
if (Objects.nonNull(d.getUpdateBy())) {
updateBy = getById(d.getUpdateBy()).getName();
}
return new AppUserForAdminVO()
.setId(d.getId())
.setAvatar(d.getAvatar())
.setLoginName(d.getLoginName())
.setUserName(d.getName())
.setCompanyName(d.getCompanyId())
.setName(d.getSalesUserName())
.setEmail(d.getEmail())
.setSalesUserName(d.getSalesUserName())
.setAreaName(area.getName())
.setEnable(d.getEnable())
.setEnable(d.getEnable())
.setExpireTime(d.getExpireTime())
.setCreateBy(appUser.getName())
.setCreateTime(d.getCreateTime())
.setUpdateBy(updateBy)
.setPrimary(true)
.setState(d.getExpireTime().isAfter(ChronoLocalDate.from(LocalDateTime.now())) ? 1 : 2)
.setLastLoginTime(d.getLastLoginTime());
});
}
@Override
public void enable(EnableAppUserRequest request) {
lambdaUpdate()
.set(AppUser::getEnable, request.getEnable())
.set(AppUser::getUpdateBy, TokenUtil.getUserId())
.set(AppUser::getUpdateTime, LocalDateTime.now())
.in(AppUser::getId, request.getIds())
.update();
}
@Override
public List<AppUserForAdminVO> getChildrenOfAppUser(Integer id) {
AppUser appUser = getById(id);
VUtils.trueThrowBusinessError(Objects.isNull(appUser)).throwMessage("主账号不存在");
String[] companyIds = appUser.getCompanyId().split(",");
LambdaQueryWrapper<AppUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AppUser::getIsPrimary, false);
queryWrapper.and(wrapper -> {
for (String companyId : companyIds) {
wrapper.or().eq(AppUser::getCompanyId, "'" + companyId + "'"); // 动态添加 OR 条件
}
});
List<AppUser> datas = baseMapper.selectList(queryWrapper);
List<AppUserForAdminVO> vos = datas.stream().map(d -> {
AppArea area = appAreaService.getById(d.getAreaId());
AppUser createUser = getById(d.getCreateBy());
String updateBy = null;
if (Objects.nonNull(d.getUpdateBy())) {
updateBy = getById(d.getUpdateBy()).getName();
}
return new AppUserForAdminVO()
.setId(d.getId())
.setAvatar(d.getAvatar())
.setLoginName(d.getLoginName())
.setUserName(d.getName())
.setCompanyName(d.getCompanyId())
.setName(d.getSalesUserName())
.setEmail(d.getEmail())
.setSalesUserName(d.getSalesUserName())
.setAreaName(area.getName())
.setEnable(d.getEnable())
.setPrimary(false)
.setEnable(d.getEnable())
.setExpireTime(d.getExpireTime())
.setCreateBy(createUser.getName())
.setCreateTime(d.getCreateTime())
.setUpdateBy(updateBy)
.setState(d.getExpireTime().isAfter(ChronoLocalDate.from(LocalDateTime.now())) ? 1 : 2)
.setLastLoginTime(d.getLastLoginTime());
}).collect(Collectors.toList());
List<AppUserApplyfor> applyforList = appUserApplyforService.lambdaQuery()
.eq(AppUserApplyfor::getState, AppUserApplyForState.PENDINGAPPROVAL.getState().byteValue())
.list();
vos.addAll(applyforList.stream().map(d -> {
AppArea area = appAreaService.getById(d.getAreaId());
TBaseCustomer company = customerService.getById(d.getCompanyId());
return new AppUserForAdminVO()
.setId(d.getId())
.setAvatar(d.getUserAvatar())
.setLoginName(d.getUserEmail())
.setUserName(d.getUserName())
.setCompanyName(company.getAgencyCompanyName())
.setName(d.getSalesUserName())
.setEmail(d.getUserEmail())
.setSalesUserName(d.getSalesUserName())
.setAreaName(area.getName())
.setEnable(false)
.setPrimary(false)
.setState(0);
}).collect(Collectors.toList()));
return vos;
}
}

View File

@ -5,6 +5,7 @@ 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.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.pojo.request.DictionaryItemSearchRequest;
import com.nflg.mobilebroken.common.pojo.request.SaveDictionaryItemRequest;
import com.nflg.mobilebroken.common.pojo.request.TranslateMap;
@ -114,4 +115,9 @@ public class DictionaryItemServiceImpl extends ServiceImpl<DictionaryItemMapper,
public Integer getId(String dictionaryName, String dictionaryItemName) {
return baseMapper.getId(dictionaryName, dictionaryItemName);
}
@Override
public String getTitleName(String titleCode) {
return baseMapper.getName(Constant.DICTIONARY_TYPE_TITLE, titleCode);
}
}

View File

@ -1,16 +1,18 @@
package com.nflg.mobilebroken.repository.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.pojo.query.PageBaseQuery;
import com.nflg.mobilebroken.common.pojo.vo.AreaSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.TBaseAreaVO;
import com.nflg.mobilebroken.repository.entity.TBaseArea;
import com.nflg.mobilebroken.repository.mapper.TBaseAreaMapper;
import com.nflg.mobilebroken.repository.service.ITBaseAreaService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
@ -35,4 +37,18 @@ public class TBaseAreaServiceImpl extends ServiceImpl<TBaseAreaMapper, TBaseArea
public Integer getCount(){
return this.getBaseMapper().getCount();
}
@Override
public List<AreaSimpleVO> getSimpleAreas() {
List<TBaseArea> datas = lambdaQuery().eq(TBaseArea::getAreaState, 1).eq(TBaseArea::getParentAreaRowId, 0).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getAreaName())).collect(Collectors.toList());
vos.forEach(this::bindChildren);
return vos;
}
private void bindChildren(AreaSimpleVO vo) {
List<TBaseArea> datas = lambdaQuery().eq(TBaseArea::getParentAreaRowId, vo.getId()).eq(TBaseArea::getAreaState, 1).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getAreaName())).collect(Collectors.toList());
vos.forEach(this::bindChildren);
}
}

View File

@ -1,15 +1,17 @@
package com.nflg.mobilebroken.repository.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.pojo.query.PageBaseQuery;
import com.nflg.mobilebroken.common.pojo.vo.CompanySimpleVO;
import com.nflg.mobilebroken.repository.entity.TBaseCustomer;
import com.nflg.mobilebroken.repository.mapper.TBaseCustomerMapper;
import com.nflg.mobilebroken.repository.service.ITBaseCustomerService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
@ -29,4 +31,10 @@ public class TBaseCustomerServiceImpl extends ServiceImpl<TBaseCustomerMapper, T
public void delByIds(@Param("ids") List<Long> ids ,@Param("userNo")String userNo , @Param("userName") String userName){
this.getBaseMapper().delByIds(ids,userNo,userName);
}
@Override
public List<CompanySimpleVO> getSimpleCompanys() {
List<TBaseCustomer> datas = lambdaQuery().eq(TBaseCustomer::getEnableState, 1).eq(TBaseCustomer::getDelIs, 0).list();
return datas.stream().map(d -> new CompanySimpleVO().setId(d.getId()).setName(d.getAgencyCompanyName())).collect(Collectors.toList());
}
}

View File

@ -3,11 +3,11 @@
<mapper namespace="com.nflg.mobilebroken.repository.mapper.AppUserMapper">
<select id="search" resultType="com.nflg.mobilebroken.common.pojo.vo.AppUserVO">
SELECT u.id,c.`name` AS 'companyName',u.`name`,u.email,u.avatar,a.`name` AS 'areaName',u.`enable`,uc.`name` AS 'createBy',u.create_time AS 'createTime',uu.`name` AS 'updateBy',u.update_time AS 'updateTime',u.last_login_time AS 'lastLoginTime',u.expire_time AS 'expireTime',u.is_primary AS 'isPrimary'
SELECT u.id,c.agency_company_name AS 'companyName',u.`name`,u.email,u.avatar,a.`name` AS 'areaName',u.`enable`,uc.`name` AS 'createBy',u.create_time AS 'createTime',uu.`name` AS 'updateBy',u.update_time AS 'updateTime',u.last_login_time AS 'lastLoginTime',u.expire_time AS 'expireTime',u.is_primary AS 'isPrimary'
FROM app_user u
INNER JOIN company c ON u.company_id=c.id
INNER JOIN t_base_customer c ON u.company_id=c.id
INNER JOIN app_area a ON u.area_id=a.id
INNER JOIN app_user uc ON u.create_by=uc.id
LEFT JOIN app_user uc ON u.create_by=uc.id
LEFT JOIN app_user uu ON u.update_by=uu.id
WHERE u.company_id = #{request.companyId}
<where>
@ -25,11 +25,11 @@
</where>
</select>
<select id="getInfo" resultType="com.nflg.mobilebroken.common.pojo.vo.AppUserVO">
SELECT u.id,c.`name` AS 'companyName',u.`name`,u.email,u.avatar,a.`name` AS 'areaName',u.`enable`,uc.`name` AS 'createBy',u.create_time AS 'createTime',uu.`name` AS 'updateBy',u.update_time AS 'updateTime',u.last_login_time AS 'lastLoginTime',u.expire_time AS 'expireTime',u.is_primary AS 'isPrimary'
SELECT u.id,c.agency_company_name AS 'companyName',u.`name`,u.email,u.avatar,a.`name` AS 'areaName',u.`enable`,uc.`name` AS 'createBy',u.create_time AS 'createTime',uu.`name` AS 'updateBy',u.update_time AS 'updateTime',u.last_login_time AS 'lastLoginTime',u.expire_time AS 'expireTime',u.is_primary AS 'isPrimary'
FROM app_user u
INNER JOIN company c ON u.company_id=c.id
INNER JOIN t_base_customer c ON u.company_id=c.id
INNER JOIN app_area a ON u.area_id=a.id
INNER JOIN app_user uc ON u.create_by=uc.id
LEFT JOIN app_user uc ON u.create_by=uc.id
LEFT JOIN app_user uu ON u.update_by=uu.id
WHERE u.id = #{userId}
</select>

View File

@ -2,4 +2,10 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.mobilebroken.repository.mapper.DictionaryItemMapper">
<select id="getName" resultType="java.lang.String">
SELECT di.`name`
FROM dictionary d
INNER JOIN dictionary_item di ON d.id=di.dictionary_id
WHERE d.`code`=#{dictionaryCode} AND di.`code`=#{itemCode}
</select>
</mapper>

View File

@ -93,10 +93,10 @@
</select>
<select id="searchFromAdmin">
SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName',c.`name` AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime',t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime'
SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName',c.agency_company_name AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime',t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime'
FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN company c ON u.company_id=c.id
LEFT JOIN t_base_customer c ON u.company_id=c.id
LEFT JOIN app_area a ON u.area_id=a.id
<include refid="adminSearchWhereCondition"/>
</select>
@ -120,29 +120,29 @@
</select>
<select id="searchAllFromAdmin" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO">
SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName',c.`name` AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime',t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime'
SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName',c.agency_company_name AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime',t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime'
FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN company c ON u.company_id=c.id
LEFT JOIN t_base_customer c ON u.company_id=c.id
LEFT JOIN app_area a ON u.area_id=a.id
<include refid="adminSearchWhereCondition"/>
</select>
<select id="searchFromAdminAndFollow">
SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName',c.`name` AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime',t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime'
SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName',c.agency_company_name AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime',t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime'
FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN company c ON u.company_id=c.id
LEFT JOIN t_base_customer c ON u.company_id=c.id
LEFT JOIN app_area a ON u.area_id=a.id
INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId}
<include refid="adminSearchWhereCondition"/>
</select>
<select id="searchAllFromAdminAndFollow" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO">
SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName',c.`name` AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime',t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime'
SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName',c.agency_company_name AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime',t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime'
FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN company c ON u.company_id=c.id
LEFT JOIN t_base_customer c ON u.company_id=c.id
LEFT JOIN app_area a ON u.area_id=a.id
INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId}
<include refid="adminSearchWhereCondition"/>