package com.moral.api.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.moral.api.config.mybatis.wrapper.NullFilterWrapper;
import com.moral.api.entity.Group;
import com.moral.api.entity.Organization;
import com.moral.api.entity.User;
import com.moral.api.entity.UserGroup;
import com.moral.api.mapper.*;
import com.moral.api.pojo.dto.user.UserDTO;
import com.moral.api.pojo.dto.user.UserQueryDTO;
import com.moral.api.pojo.form.user.UserDeleteForm;
import com.moral.api.pojo.form.user.UserInsertForm;
import com.moral.api.pojo.form.user.UserQueryForm;
import com.moral.api.pojo.form.user.UserUpdateForm;
import com.moral.api.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.api.util.CompareFieldUtils;
import com.moral.api.util.LogUtils;
import com.moral.constant.Constants;
import com.moral.constant.ResponseCodeEnum;
import com.moral.pojo.CompareFieldResult;
import com.moral.util.ConvertUtils;
import com.moral.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.SimpleFormatter;
/**
*
* 用户表 服务实现类
*
*
* @author moral
* @since 2021-03-09
*/
@Service
public class UserServiceImpl extends ServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Autowired
OrganizationMapper organizationMapper;
@Autowired
GroupMapper groupMapper;
@Autowired
UserGroupMapper userGroupMapper;
@Autowired
GroupMenuMapper groupMenuMapper;
@Override
public UserQueryDTO queryUsers(UserQueryForm form) {
//创建返回对象
UserQueryDTO dto = new UserQueryDTO();
//取参
Integer page = form.getPage();
Integer size = form.getSize();
String email = form.getEmail();
String mobile = form.getMobile();
String wechat = form.getWechat();
String order = form.getOrder();
String orderType = form.getOrderType();
Integer organizationId = form.getOrganizationId();
Date exipreStartTime = form.getExpireStartTime();
Date exipreEndTime = form.getExpireEndTime();
Date createStartTime = form.getCreateStartTime();
Date createEndTime = form.getCreateEndTime();
Integer isDelete = form.getIsDelete();
//组装查询条件
Page queryPage = new Page<>(page, size);
NullFilterWrapper wrapper = new NullFilterWrapper<>();
wrapper.like("email", email);
wrapper.like("wechat", wechat);
wrapper.like("mobile", mobile);
wrapper.eq("is_admin", 1);
wrapper.eq("organization_id", organizationId);
wrapper.between("create_time", createStartTime, createEndTime);
wrapper.between("expire_time", exipreStartTime, exipreEndTime);
//排序顺序条件构造
if (!ObjectUtils.isEmpty(order) && !ObjectUtils.isEmpty(orderType)) {
if (orderType.equals(Constants.ORDER_ASC))
wrapper.orderByAsc(ConvertUtils.toLine(order));
else
wrapper.orderByDesc(ConvertUtils.toLine(order));
}
//逻辑删除条件构造
if (!ObjectUtils.isEmpty(isDelete))
wrapper.eq("is_delete", isDelete);
else
wrapper.eq("is_delete", Constants.NOT_DELETE);
//查询结果
Page resultPage = userMapper.selectPage(queryPage, wrapper);
List users = resultPage.getRecords();
//查询用户对应组织
List userDTOS = new ArrayList<>();
for (User user : users) {
UserDTO userDTO = new UserDTO();
Organization organization = new Organization();
organization.setId(user.getOrganizationId());
organization.setIsDelete(Constants.NOT_DELETE);
QueryWrapper organizationWrapper = new QueryWrapper<>();
organizationWrapper.setEntity(organization);
organization = organizationMapper.selectOne(organizationWrapper);
userDTO.setUser(user);
userDTO.setOrganization(organization);
userDTOS.add(userDTO);
}
//封装返回结果
dto.setUserDTOS(userDTOS);
dto.setCurrent(resultPage.getCurrent());
dto.setPages(resultPage.getPages());
dto.setSize(resultPage.getSize());
dto.setTotal(resultPage.getTotal());
dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return dto;
}
@Override
@Transactional
public UserDTO updateUser(UserUpdateForm form) {
//创建返回对象
UserDTO dto = new UserDTO();
//取参
User user = form.formConvertEntity();
//查找要更新的用户 用于插入日志
QueryWrapper oldUserWrapper = new QueryWrapper<>();
User oldUser = new User();
oldUser.setId(user.getId());
oldUser.setIsDelete(Constants.NOT_DELETE);
oldUserWrapper.setEntity(oldUser);
oldUser = userMapper.selectOne(oldUserWrapper);
if (ObjectUtils.isEmpty(oldUser)) {
dto.setCode(ResponseCodeEnum.USER_NOT_EXIST.getCode());
dto.setMsg(ResponseCodeEnum.USER_NOT_EXIST.getMsg());
return dto;
}
//更新
userMapper.updateById(user);
//获取更新后的用户
user = userMapper.selectById(user.getId());
//插入日志
updatelog(oldUser,user);
//封装返回结果
dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return dto;
}
@Override
@Transactional
public UserDTO insertUser(UserInsertForm form) {
//创建返回对象
UserDTO dto = new UserDTO();
//取参
User user = form.formConvertEntity();
//判断账号是否存在
User existUser = new User();
existUser.setAccount(user.getAccount());
existUser.setIsDelete(Constants.NOT_DELETE);
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.setEntity(existUser);
User existUserResult = userMapper.selectOne(wrapper);
if (!ObjectUtils.isEmpty(existUserResult)) {
dto.setCode(ResponseCodeEnum.USER_EXIST.getCode());
dto.setMsg(ResponseCodeEnum.USER_EXIST.getMsg());
return dto;
}
//判断组织是否已经存在管理员账号
Integer organizationId = user.getOrganizationId();
User organizationUser = new User();
organizationUser.setIsAdmin(true);
organizationUser.setIsDelete(Constants.NOT_DELETE);
organizationUser.setOrganizationId(organizationId);
QueryWrapper organizationUserWrapper = new QueryWrapper<>();
organizationUserWrapper.setEntity(organizationUser);
organizationUser = userMapper.selectOne(organizationUserWrapper);
if (!ObjectUtils.isEmpty(organizationUser)) {
dto.setCode(ResponseCodeEnum.ORGANIZATION_USER_EXIST.getCode());
dto.setMsg(ResponseCodeEnum.ORGANIZATION_USER_EXIST.getMsg());
return dto;
}
//插入用户表
userMapper.insert(user);
//创建组织admin角色
Group group = new Group();
group.setOrganizationId(organizationId);
group.setGroupName("admin");
groupMapper.insert(group);
//插入账号角色关联表
UserGroup userGroup = new UserGroup();
userGroup.setUserId(user.getId());
userGroup.setGroupId(group.getId());
userGroup.setOrganizationId(organizationId);
userGroupMapper.insert(userGroup);
//更新组织
Organization organization = new Organization();
organization.setAdminUserId(user.getId());
organization.setId(organizationId);
organizationMapper.updateById(organization);
//操作插入日志
insertLog(user,organizationId);
//封装返回结果
dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return dto;
}
@Override
@Transactional
public UserDTO deleteUsersByOrganizationId(Integer organizationId) {
//创建返回对象
UserDTO dto = new UserDTO();
//逻辑删除,删除账号以及该组织下的所有账号
UpdateWrapper deleteUserChildrenWrapper = new UpdateWrapper<>();
deleteUserChildrenWrapper.eq("organization_id", organizationId);
deleteUserChildrenWrapper.set("is_delete", Constants.DELETE);
userMapper.update(null, deleteUserChildrenWrapper);
//逻辑删除,groupMenu
UpdateWrapper deleteGroupMenuWrapper = new UpdateWrapper();
deleteGroupMenuWrapper.eq("organization_id", organizationId);
deleteGroupMenuWrapper.set("is_delete", Constants.DELETE);
groupMenuMapper.update(null, deleteGroupMenuWrapper);
//逻辑删除,userGroup
UpdateWrapper deleteUserGroupWrapper = new UpdateWrapper();
deleteUserGroupWrapper.eq("organization_id", organizationId);
deleteUserGroupWrapper.set("is_delete", Constants.DELETE);
userGroupMapper.update(null, deleteUserGroupWrapper);
//逻辑删除,group
UpdateWrapper deleteGroupWrapper = new UpdateWrapper();
deleteGroupWrapper.eq("organization_id", organizationId);
deleteGroupWrapper.set("is_delete", Constants.DELETE);
groupMapper.update(null, deleteGroupWrapper);
//返回结果
dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return dto;
}
/**
* @Description: 插入操作插入日志
* @Param: [user, organizationId]
* @return: void
* @Author: 陈凯裕
* @Date: 2021/8/24
*/
private void insertLog(User user,Integer organizationId) {
StringBuilder content = new StringBuilder("添加了前台用户;");
content.append("角色:admin;");
//查询添加admin用户的组织
Organization organization = organizationMapper.selectById(organizationId);
content.append("组织:"+organization.getName()+";");
content.append("账号:"+user.getAccount()+";");
content.append("用户名称:"+user.getUserName()+";");
content.append("过期时间:"+ DateUtils.dateToDateString(user.getExpireTime(),"yyyy-MM-dd")+";");
if(user.getEmail()!=null)
content.append("邮箱:"+user.getEmail()+";");
if(user.getMobile()!=null)
content.append("手机:"+user.getMobile()+";");
if(user.getWechat()!=null)
content.append("微信:"+user.getWechat()+";");
LogUtils.saveOperationForManage(content.toString(), Constants.INSERT_OPERATE_TYPE);
}
/**
* @Description: 更新操作插入日志
* @Param: [oldUser, newUser]
* @return: void
* @Author: 陈凯裕
* @Date: 2021/8/24
*/
private void updatelog(User oldUser,User newUser){
List results = CompareFieldUtils.compare(User.class, oldUser, newUser);
StringBuilder content = new StringBuilder("修改了前台用户;");
content.append("所属组织:"+organizationMapper.selectById(oldUser.getOrganizationId()).getName()+";");
//密码特殊处理
if(newUser.getPassword()!=null)
content.append("修改了密码;");
String resultContent = CompareFieldUtils.resultsConvertContent(results,content.toString());
LogUtils.saveOperationForManage(resultContent, Constants.UPDATE_OPERATE_TYPE);
}
}