huanghongfa
2021-01-05 d9eee1919dbff7ffddc48b1f4fee2ec41a54a2a2
springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/service/impl/UserServiceImpl.java
New file
@@ -0,0 +1,1120 @@
package com.panzhihua.service_user.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.panzhihua.common.constants.UserConstants;
import com.panzhihua.common.model.dtos.PageDTO;
import com.panzhihua.common.model.dtos.community.NoticeReadDTO;
import com.panzhihua.common.model.dtos.user.PageFeedBackDTO;
import com.panzhihua.common.model.dtos.user.PageUserAppletsBackstageDTO;
import com.panzhihua.common.model.dtos.user.SysUserFeedbackDTO;
import com.panzhihua.common.model.vos.IndexDataKanbanVO;
import com.panzhihua.common.model.vos.LoginUserInfoVO;
import com.panzhihua.common.model.vos.R;
import com.panzhihua.common.model.vos.SystemmanagementConfigVO;
import com.panzhihua.common.model.vos.partybuilding.ActivityManagerVO;
import com.panzhihua.common.model.vos.user.*;
import com.panzhihua.service_user.dao.*;
import com.panzhihua.service_user.model.dos.*;
import com.panzhihua.service_user.model.dtos.DataKanbanDTO;
import com.panzhihua.service_user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @program: springcloud_k8s_panzhihuazhihuishequ
 * @description: 用户
 * @author: huang.hongfa weixin hhf9596 qq 959656820
 * @create: 2020-11-24 09:13
 **/
@Slf4j
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserDao userDao;
    @Resource
    private RoleDAO roleDAO;
    @Resource
    private ComMngUserTagDAO comMngUserTagDAO;
    @Resource
    private ComMngFamilyInfoDAO comMngFamilyInfoDAO;
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private SysUserRoleDAO sysUserRoleDAO;
    @Resource
    private SysOperLogDAO sysOperLogDAO;
    @Resource
    private SysUserAgreementDAO sysUserAgreementDAO;
    @Resource
    private SysUserFeedbackDAO sysUserFeedbackDAO;
    @Resource
    private SysUserNoticeDAO sysUserNoticeDAO;
    /**
     * 小程序微信用户信息更新
     *
     * @param openid     小程序唯一ID
     * @param sessionKey 会话密钥
     * @param unionid    用户在开放平台的唯一标识符
     * @return token
     */
    @Override
    public R updateInsertUser(String openid, String sessionKey, String unionid) {
        SysUserDO sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getOpenid, openid));
        boolean empty = ObjectUtils.isEmpty(sysUserDO);
        int num = 0;
        if (empty) {
            SysUserDO sysUserDO1 = new SysUserDO();
            Date date = new Date();
            String encode = new BCryptPasswordEncoder().encode(UserConstants.PASSWORD);
            sysUserDO1.setOpenid(openid);
            sysUserDO1.setUnionid(unionid);
            sysUserDO1.setSessionKey(sessionKey);
            sysUserDO1.setCreateAt(date);
            sysUserDO1.setLastLoginTime(date);
            sysUserDO1.setPassword(encode);
            sysUserDO1.setType(1);
            num = userDao.insert(sysUserDO1);
        } else {
            String encode = new BCryptPasswordEncoder().encode(UserConstants.PASSWORD);
            sysUserDO.setUnionid(unionid);
            sysUserDO.setSessionKey(sessionKey);
            sysUserDO.setPassword(encode);
            sysUserDO.setType(1);
            num = userDao.updateById(sysUserDO);
        }
        if (num > 0) {
            return R.ok();
        } else {
            return R.fail("登录失败");
        }
    }
    /**
     * 维护小程序用户基本信息 头像 昵称 性别
     *
     * @param userId    数据库用户ID
     * @param nickName  昵称
     * @param gender    性别
     * @param avatarUrl 头像
     * @return 维护结果
     */
    @Override
    public R updateUserWeiXinInfo(Long userId, String nickName, int gender, String avatarUrl) {
        SysUserDO sysUserDO = new SysUserDO();
        sysUserDO.setSex(gender);
        sysUserDO.setNickName(nickName);
        sysUserDO.setImageUrl(avatarUrl);
        sysUserDO.setUserId(userId);
        int i = userDao.updateById(sysUserDO);
        if (i > 0) {
            return R.ok();
        } else {
            return R.fail("维护微信基本信息失败");
        }
    }
    /**
     * 维护微信用户手机号
     *
     * @param userId          数据库ID
     * @param purePhoneNumber 没有区号的手机号
     * @return 维护结果
     */
    @Override
    public R updateUserWeiXinPhone(Long userId, String purePhoneNumber) {
        SysUserDO sysUserDO = new SysUserDO();
        sysUserDO.setPhone(purePhoneNumber);
        sysUserDO.setUserId(userId);
        int i = userDao.updateById(sysUserDO);
        if (i > 0) {
            return R.ok();
        } else {
            return R.fail("维护微信手机号失败");
        }
    }
    /**
     * 认证中心获取平台用户信息
     *
     * @param name 登录账户
     * @param type 用户类型 用户类型 1 小程序 2 运营平台 3 社区平台
     * @return 用户基本信息、角色
     */
    @Override
    public R<LoginUserInfoVO> getUserInfo(String name, int type) {
        SysUserDO sysUserDO = null;
        if (1 == type) {
            sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getType, type).eq(SysUserDO::getOpenid, name));
        } else {
            LambdaQueryWrapper<SysUserDO> wrapper = new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getType, type);
            wrapper.and(sysUserDOLambdaQueryWrapper ->sysUserDOLambdaQueryWrapper .eq(SysUserDO::getAccount, name).or().eq(SysUserDO::getPhone, name));
            sysUserDO = userDao.selectOne(wrapper);
        }
        boolean empty = ObjectUtils.isEmpty(sysUserDO);
        if (empty) {
            return R.fail();
        }
        LoginUserInfoVO loginUserInfoVO=new LoginUserInfoVO();
        loginUserInfoVO.setUserId(sysUserDO.getUserId());
        loginUserInfoVO.setName(sysUserDO.getName());
        loginUserInfoVO.setPassword(sysUserDO.getPassword());
        loginUserInfoVO.setStatus(sysUserDO.getStatus());
        loginUserInfoVO.setAccount(name);
        loginUserInfoVO.setType(sysUserDO.getType());
        List<SysRoleDO> roleDOList=roleDAO.selectByUserId(sysUserDO.getUserId());
        Set<String> set=new HashSet<>();
        if (!ObjectUtils.isEmpty(roleDOList)) {
            roleDOList.forEach(sysRoleDO -> {
                set.add(sysRoleDO.getRoleKey());
            });
        }
        return R.ok(loginUserInfoVO);
    }
    /**
     * 三端获取用户信息
     *
     * @param userId 用户ID
     * @return 用户基本信息、角色
     */
    @Override
    public R<LoginUserInfoVO> getUserInfo(String userId) {
        SysUserDO sysUserDO = userDao.selectById(userId);
        boolean empty = ObjectUtils.isEmpty(sysUserDO);
        if (empty) {
            return R.fail();
        }
        LoginUserInfoVO loginUserInfoVO=new LoginUserInfoVO();
        BeanUtils.copyProperties(sysUserDO,loginUserInfoVO);
        List<SysRoleDO> roleDOList=roleDAO.selectByUserId(sysUserDO.getUserId());
        Set<String> set=new HashSet<>();
        if (!ObjectUtils.isEmpty(roleDOList)) {
            roleDOList.forEach(sysRoleDO -> {
                set.add(sysRoleDO.getRoleKey());
            });
            loginUserInfoVO.setRoles(set);
        }
        return R.ok(loginUserInfoVO);
    }
    /**
     * 修改用户登录密码
     *
     * @param changePasswordVO 新密码
     * @return 修改结果
     */
    @Override
    public R changePassword(ChangePasswordVO changePasswordVO) {
        Long userId = changePasswordVO.getUserId();
        SysUserDO sysUserDO1 = userDao.selectById(userId);
        String oldPassoword = sysUserDO1.getPassword();
        String newPassword = changePasswordVO.getNewPassword();
        if (oldPassoword.equals(newPassword)) {
            return R.fail("新老密码不能相同");
        }
         oldPassoword = new BCryptPasswordEncoder().encode(oldPassoword);
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        if( !encoder.matches(oldPassoword,newPassword)){
            return R.fail("老密码错误");
        }
        SysUserDO sysUserDO=new SysUserDO();
        sysUserDO.setUserId(userId);
        String encode = new BCryptPasswordEncoder().encode(newPassword);
        sysUserDO.setPassword(encode);
        int update = userDao.updateById(sysUserDO);
        if (update>0) {
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 某社区后台人员查询
     *
     * @param param       名字
     * @param communityId 社区id
     * @return 人员集合
     */
    @Override
    public R listActivityManager(String param, Long communityId) {
        LambdaQueryWrapper<SysUserDO> queryWrapper=new LambdaQueryWrapper<>();
        List<ActivityManagerVO> activityManagerVOS=new ArrayList<>();
        queryWrapper = new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getCommunityId, communityId).eq(SysUserDO::getStatus, 1).eq(SysUserDO::getType,3);
        if (!ObjectUtils.isEmpty(param)) {
            queryWrapper = queryWrapper.eq(SysUserDO::getName, param);
        }
        List<SysUserDO> sysUserDOS = userDao.selectList(queryWrapper);
        if (!ObjectUtils.isEmpty(sysUserDOS)) {
            sysUserDOS.forEach(sysUserDO -> {
                ActivityManagerVO activityManagerVO=new ActivityManagerVO();
                activityManagerVO.setManagerId(sysUserDO.getUserId());
                activityManagerVO.setName(sysUserDO.getName());
                activityManagerVOS.add(activityManagerVO);
            });
        }
        return R.ok(activityManagerVOS);
    }
    /**
     * 分页查询人脸识别
     *
     * @param loginUserInfoVO 查询参数
     * @return 分页集合
     */
    @Override
    public R pageUserFace(LoginUserInfoVO loginUserInfoVO) {
        Page page = new Page<>();
        Long pageNum = loginUserInfoVO.getPageNum();
        Long pageSize = loginUserInfoVO.getPageSize();
        if (null==pageNum||0==pageNum) {
            pageNum = 1l;
        }
        if (null==pageSize||0==pageSize) {
            pageSize = 10l;
        }
        page.setSize(pageSize);
        page.setCurrent(pageNum);
        IPage<LoginUserInfoVO> iPage = userDao.pageUserFace(page, loginUserInfoVO);
        return R.ok(iPage);
    }
    /**
     * 编辑人脸采集数据通过、驳回、删除
     *
     * @param loginUserInfoVO 操作信息
     * @return 操作结果
     */
    @Override
    public R putUserFace(LoginUserInfoVO loginUserInfoVO) {
        int operationType = loginUserInfoVO.getOperationType().intValue();
        Long userId = loginUserInfoVO.getUserId();
        SysUserDO sysUserDO=new SysUserDO();
        sysUserDO.setUserId(userId);
        switch (operationType){
            case 1:
                sysUserDO.setFaceState(1);
                break;
            case 2:
                sysUserDO.setFaceState(3);
                break;
            case 3:
                break;
            default:
                break;
        }
        int num=0;
        if (operationType==3) {
            num=userDao.deleteById(userId);
        } else {
            num=userDao.updateById(sysUserDO);
        }
        if (num>0) {
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 分页查询人口管理
     *
     * @param loginUserInfoVO 查询参数
     * @return 分页数据
     */
    @Override
    public R pageUser(LoginUserInfoVO loginUserInfoVO) {
        Page page = new Page<>();
        Long pageNum = loginUserInfoVO.getPageNum();
        Long pageSize = loginUserInfoVO.getPageSize();
        if (null==pageNum||0==pageNum) {
            pageNum = 1l;
        }
        if (null==pageSize||0==pageSize) {
            pageSize = 10l;
        }
        page.setSize(pageSize);
        page.setCurrent(pageNum);
        IPage<LoginUserInfoVO> iPage = userDao.pageUser(page, loginUserInfoVO);
        return R.ok(iPage);
    }
    /**
     * 查询所有人员标签
     *
     * @return 标签集合
     */
    @Override
    public R listTag() {
        List<String> list=new ArrayList<>();
        List<ComMngUserTagDO> comMngUserTagDOS = comMngUserTagDAO.selectList(null);
        if (!ObjectUtils.isEmpty(comMngUserTagDOS)) {
            list=comMngUserTagDOS.stream().map(comMngUserTagDO -> comMngUserTagDO.getTagName()).collect(Collectors.toList());
        }
        return R.ok(list);
    }
    /**
     * 人员详情
     *
     * @param userId 用户id
     * @return 人员详情
     */
    @Override
    public R detailUser(Long userId) {
        SysUserDO sysUserDO = userDao.selectById(userId);
        if (ObjectUtils.isEmpty(sysUserDO)) {
            return R.fail("人员不存在");
        }
        LoginUserInfoVO loginUserInfoVO=new LoginUserInfoVO();
        BeanUtils.copyProperties(sysUserDO,loginUserInfoVO);
        List<ComMngFamilyInfoDO> comMngFamilyInfoDOS = comMngFamilyInfoDAO.selectList(new QueryWrapper<ComMngFamilyInfoDO>().lambda().eq(ComMngFamilyInfoDO::getUserId, userId));
        if (!ObjectUtils.isEmpty(comMngFamilyInfoDOS)) {
            List<ComMngFamilyInfoVO>comMngFamilyInfoVOS=new ArrayList<>();
            comMngFamilyInfoDOS.forEach(comMngFamilyInfoDO -> {
                ComMngFamilyInfoVO comMngFamilyInfoVO=new ComMngFamilyInfoVO();
                BeanUtils.copyProperties(comMngFamilyInfoDO,comMngFamilyInfoVO);
                comMngFamilyInfoVOS.add(comMngFamilyInfoVO);
            });
            loginUserInfoVO.setComMngFamilyInfoVOS(comMngFamilyInfoVOS);
        }
        return R.ok(loginUserInfoVO);
    }
    /**
     * 设置用户标签
     *
     * @param loginUserInfoVO 标签信息
     * @return 设置结果
     */
    @Override
    public R putUserTag(LoginUserInfoVO loginUserInfoVO) {
        SysUserDO sysUserDO=new SysUserDO();
        sysUserDO.setUserId(loginUserInfoVO.getUserId());
        sysUserDO.setTags(loginUserInfoVO.getTags());
        int update = userDao.updateById(sysUserDO);
        if (update>0) {
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 修改用户志愿者状态
     *
     * @param phone 志愿者手机号
     * @param type
     */
    @Override
    public R putUserIsVolunteer(String phone, int type) {
        SysUserDO sysUserDO=new SysUserDO();
        sysUserDO.setIsVolunteer(type);
        int update = userDao.update(sysUserDO, new UpdateWrapper<SysUserDO>().lambda().eq(SysUserDO::getPhone, phone));
        if (update>0) {
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 用户绑定社区、小区
     *
     * @param loginUserInfoVO 社区小区数据
     * @return 绑定结果
     */
    @Override
    public R putUserCommunityArea(LoginUserInfoVO loginUserInfoVO) {
        SysUserDO sysUserDO=new SysUserDO();
        sysUserDO.setCommunityId(loginUserInfoVO.getCommunityId());
        sysUserDO.setAreaId(loginUserInfoVO.getAreaId());
        sysUserDO.setUserId(loginUserInfoVO.getUserId());
        int update = userDao.updateById(sysUserDO);
        if (update>0) {
            //删除用户信息缓存
            String userKey = UserConstants.LOGIN_USER_INFO + loginUserInfoVO.getUserId();
            stringRedisTemplate.delete(userKey);
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 用户实名认证
     *
     * @param loginUserInfoVO 认证数据
     * @return 认证结果
     */
    @Override
    public R putUserAuthentication(LoginUserInfoVO loginUserInfoVO) {
        SysUserDO sysUserDO=new SysUserDO();
        sysUserDO.setName(loginUserInfoVO.getName());
        sysUserDO.setIdCard(loginUserInfoVO.getIdCard());
        sysUserDO.setSex(loginUserInfoVO.getSex());
        sysUserDO.setBirthday(loginUserInfoVO.getBirthday());
        sysUserDO.setJob(loginUserInfoVO.getJob());
        sysUserDO.setUserId(loginUserInfoVO.getUserId());
        sysUserDO.setFaceUrl(loginUserInfoVO.getFaceUrl());
        sysUserDO.setFaceState(0);
        SysUserDO sysUserDO1 = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getIdCard, loginUserInfoVO.getIdCard()));
        if (!ObjectUtils.isEmpty(sysUserDO1)) {
            return R.fail("身份证已经存在");
        }
        int update = userDao.updateById(sysUserDO);
        if (update>0) {
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 修改用户手机号
     *
     * @param userPhoneVO 手机号信息
     * @return 修改结果
     */
    @Override
    public R putUserphone(UserPhoneVO userPhoneVO) {
        String oldPhone = userPhoneVO.getOldPhone();
        String newPhone = userPhoneVO.getNewPhone();
        String smsCode = userPhoneVO.getSmsCode();
        if (oldPhone.equals(newPhone)) {
            return R.fail("新旧手机号不能重复");
        }
        String key = UserConstants.PHONE_PUT + newPhone;
        Boolean hasKey = stringRedisTemplate.hasKey(key);
        if (!hasKey) {
            return R.fail("重新发送验证码");
        }
        SysUserDO sysUserDO1 = userDao.selectById(userPhoneVO.getUserId());
        String phone = sysUserDO1.getPhone();
        if (!StringUtils.isEmpty(phone)&& !phone.equals(oldPhone)) {
            return R.fail("旧手机号错误");
        }
        ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
        String code = valueOperations.get(key);
        if (!code.equals(smsCode)) {
            return R.fail("验证码错误");
        }
        SysUserDO sysUserDO=new SysUserDO();
        sysUserDO.setUserId(userPhoneVO.getUserId());
        sysUserDO.setPhone(newPhone);
        int update = userDao.updateById(sysUserDO);
        if (update>0) {
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 修改用户信息
     *
     * @param loginUserInfoVO 修改内容
     * @return 修改结果
     */
    @Override
    public R putUser(LoginUserInfoVO loginUserInfoVO) {
        Integer faceState = loginUserInfoVO.getFaceState();
        if (null==faceState||0==faceState) {
            loginUserInfoVO.setFaceState(null);
        }
        Integer isPartymember = loginUserInfoVO.getIsPartymember();
        if (null==isPartymember||0==isPartymember) {
            loginUserInfoVO.setIsPartymember(null);
        }
        Integer isVolunteer = loginUserInfoVO.getIsVolunteer();
        if (null==isVolunteer||0==isVolunteer) {
            loginUserInfoVO.setIsVolunteer(null);
        }
        Integer operationType = loginUserInfoVO.getOperationType();
        if (null==operationType||0==operationType) {
            loginUserInfoVO.setOperationType(null);
        }
        Integer sex = loginUserInfoVO.getSex();
        if (null==sex||0==sex) {
            loginUserInfoVO.setSex(null);
        }
        Integer status = loginUserInfoVO.getStatus();
        if (null==status||0==status) {
            loginUserInfoVO.setStatus(null);
        }
        Integer type = loginUserInfoVO.getType();
        if (null==type||0==type) {
            loginUserInfoVO.setType(null);
        }
        Long communityId = loginUserInfoVO.getCommunityId();
        if (null==communityId||0==communityId) {
            loginUserInfoVO.setCommunityId(null);
        }
        SysUserDO sysUserDO=new SysUserDO();
        BeanUtils.copyProperties(loginUserInfoVO,sysUserDO);
        int update = userDao.updateById(sysUserDO);
        if (update>0) {
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 家庭成员列表
     *
     * @param userId 登录用户
     * @return 成员集合
     */
    @Override
    public R listFamily(Long userId) {
        List<ComMngFamilyInfoVO>comMngFamilyInfoVOS=new ArrayList<>();
        List<ComMngFamilyInfoDO> comMngFamilyInfoDOS = comMngFamilyInfoDAO.selectList(new QueryWrapper<ComMngFamilyInfoDO>().lambda().eq(ComMngFamilyInfoDO::getUserId, userId));
        if (!ObjectUtils.isEmpty(comMngFamilyInfoDOS)) {
            comMngFamilyInfoDOS.forEach(comMngFamilyInfoDO -> {
                ComMngFamilyInfoVO comMngFamilyInfoVO=new ComMngFamilyInfoVO();
                BeanUtils.copyProperties(comMngFamilyInfoDO,comMngFamilyInfoVO);
                comMngFamilyInfoVOS.add(comMngFamilyInfoVO);
            });
        }
        return R.ok(comMngFamilyInfoVOS);
    }
    /**
     * 新增家庭成员
     *
     * @param comMngFamilyInfoVO 家庭成员基本信息
     * @return 增加结果
     */
    @Override
    public R addFamily(ComMngFamilyInfoVO comMngFamilyInfoVO) {
        ComMngFamilyInfoDO comMngFamilyInfoDO=new ComMngFamilyInfoDO();
        BeanUtils.copyProperties(comMngFamilyInfoVO,comMngFamilyInfoDO);
        ComMngFamilyInfoDO comMngFamilyInfoDO1 = comMngFamilyInfoDAO.selectOne(new QueryWrapper<ComMngFamilyInfoDO>().lambda().eq(ComMngFamilyInfoDO::getIdCard, comMngFamilyInfoVO.getIdCard()).eq(ComMngFamilyInfoDO::getUserId, comMngFamilyInfoVO.getUserId()));
        if (!ObjectUtils.isEmpty(comMngFamilyInfoDO1)) {
            return R.fail("家庭成员已经存在");
        }
        int insert = comMngFamilyInfoDAO.insert(comMngFamilyInfoDO);
        if (insert>0) {
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 编辑家庭成员
     *
     * @param comMngFamilyInfoVO 家庭成员信息
     * @return 编辑结果
     */
    @Override
    public R putFamily(ComMngFamilyInfoVO comMngFamilyInfoVO) {
        ComMngFamilyInfoDO comMngFamilyInfoDO=new ComMngFamilyInfoDO();
        BeanUtils.copyProperties(comMngFamilyInfoVO,comMngFamilyInfoDO);
        int update = comMngFamilyInfoDAO.updateById(comMngFamilyInfoDO);
        if (update>0) {
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 新增运营后台账户
     *
     * @param administratorsUserVO 账户信息
     * @return 新增结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R addUserBackstage(AdministratorsUserVO administratorsUserVO) {
        SysUserDO sysUserDO=new SysUserDO();
        SysRoleDO roleDO = roleDAO.selectById(administratorsUserVO.getRoleId());
        if (ObjectUtils.isEmpty(roleDO)) {
            return R.fail("角色不存在");
        }
        String encode = new BCryptPasswordEncoder().encode(administratorsUserVO.getPassword());
        administratorsUserVO.setPassword(encode);
        BeanUtils.copyProperties(administratorsUserVO,sysUserDO);
        int insert = 0;
        try {
            insert = userDao.insert(sysUserDO);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("新增后台用户报错【{}】",e.getMessage());
            if (e.getMessage().contains("union_phone_type")) {
                return R.fail("手机号已经存在");
            }
        }
        if (insert>0) {
            SysUserDO sysUserDO1 = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getType, administratorsUserVO.getType()).eq(SysUserDO::getPhone, administratorsUserVO.getPhone()));
            Long userId = sysUserDO1.getUserId();
            SysUserRoleDO sysUserRoleDO=new SysUserRoleDO();
            sysUserRoleDO.setUserId(userId);
            sysUserRoleDO.setRoleId(roleDO.getRoleId());
            int insert1 = sysUserRoleDAO.insert(sysUserRoleDO);
            if (insert1>0) {
                return R.ok();
            }
        }
        return R.fail();
    }
    /**
     * 编辑运营后台账户
     *
     * @param administratorsUserVO 编辑账户内容
     * @return 编辑结果
     */
    @Override
    public R putUserBackstage(AdministratorsUserVO administratorsUserVO) {
        SysUserDO sysUserDO=new SysUserDO();
        Long roleId = administratorsUserVO.getRoleId();
        SysRoleDO roleDO=null;
        if (null!=roleId&&0!=roleId) {
             roleDO = roleDAO.selectById(roleId);
            if (ObjectUtils.isEmpty(roleDO)) {
                return R.fail("角色不存在");
            }
        }
        String password = administratorsUserVO.getPassword();
        if (!ObjectUtils.isEmpty(password)) {
            String encode = new BCryptPasswordEncoder().encode(password);
            administratorsUserVO.setPassword(encode);
        }
        BeanUtils.copyProperties(administratorsUserVO,sysUserDO);
        int update=0;
        try {
             update = userDao.updateById(sysUserDO);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("编辑后台用户出错【{}】",e.getMessage());
            if (e.getMessage().contains("union_phone_type")) {
                return R.fail("手机号已经存在");
            }
        }
        if (update>0&&null!=roleDO) {
            SysUserRoleDO sysUserRoleDO=new SysUserRoleDO();
            sysUserRoleDO.setRoleId(roleDO.getRoleId());
            int update1 = sysUserRoleDAO.update(sysUserRoleDO,new UpdateWrapper<SysUserRoleDO>().lambda().eq(SysUserRoleDO::getUserId,administratorsUserVO.getUserId()));
            if (update1>0) {
                return R.ok();
            }else{
                sysUserRoleDO.setUserId(administratorsUserVO.getUserId());
                sysUserRoleDAO.insert(sysUserRoleDO);
            }
        }
        return R.ok();
    }
    /**
     * 删除后台用户
     *
     * @param administratorsUserVO 用户主键
     * @return 删除结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R deleteUserBackstage(AdministratorsUserVO administratorsUserVO) {
        Long userId = administratorsUserVO.getUserId();
        SysUserDO sysUserDO = userDao.selectById(userId);
        if (ObjectUtils.isEmpty(sysUserDO)) {
            return R.fail("用户不存在");
        }
        Long communityId = sysUserDO.getCommunityId();
        Long communityId1 = administratorsUserVO.getCommunityId();
        if (communityId1.intValue()!=communityId.intValue()) {
            return R.fail("用户不属于当前平台");
        }
        //删除用户
        int delete = userDao.deleteById(userId);
        //删除用户角色关系
        if (delete>0) {
            int delete1 = sysUserRoleDAO.delete(new QueryWrapper<SysUserRoleDO>().lambda().eq(SysUserRoleDO::getUserId, userId));
            if (delete1==0) {
                return R.fail("用户没有角色关系");
            }
        }
        return R.ok();
    }
    /**
     * 分页查询后台用户
     *
     * @param administratorsUserVO 查询参数
     * @return 后台用户
     */
    @Override
    public R pageUserBackstage(AdministratorsUserVO administratorsUserVO) {
        Page page = new Page<>();
        Long pageNum = administratorsUserVO.getPageNum();
        Long pageSize = administratorsUserVO.getPageSize();
        if (null==pageNum||pageNum==0) {
            pageNum = 1l;
        }
        if (null==pageSize||pageSize==0) {
            pageSize = 10l;
        }
        page.setSize(pageSize);
        page.setCurrent(pageNum);
        IPage<AdministratorsUserVO> iPage = userDao.pageUserBackstage(page, administratorsUserVO);
        return R.ok(iPage);
    }
    /**
     * 保存操作日志
     *
     * @param operlog 日志内容
     * @return 保存结果
     */
    @Override
    public R addOperLog(SysOperLogVO operlog) {
        SysOperLogDO sysOperLogDO=new SysOperLogDO();
        BeanUtils.copyProperties(operlog,sysOperLogDO);
        int insert = sysOperLogDAO.insert(sysOperLogDO);
        if (insert>0) {
            return R.ok();
        }
       return R.fail();
    }
    /**
     * 分页展示操作日志
     *
     * @param sysOperLogVO 分页参数
     * @return 分页集合
     */
    @Override
    public R pageOperLog(SysOperLogVO sysOperLogVO) {
        Page page = new Page<>();
        Long pageNum = sysOperLogVO.getPageNum();
        Long pageSize = sysOperLogVO.getPageSize();
        if (null==pageNum||pageNum==0) {
            pageNum = 1l;
        }
        if (null==pageSize||pageSize==0) {
            pageSize = 10l;
        }
        page.setSize(pageSize);
        page.setCurrent(pageNum);
        IPage<SysOperLogVO> iPage = sysOperLogDAO.pageOperLog(page, sysOperLogVO);
        return R.ok(iPage);
    }
    /**
     * 用户协议
     *
     * @return 协议集合
     */
    @Override
    public R listAgreement() {
        List<SysUserAgreementDO> sysUserAgreementDOS = sysUserAgreementDAO.selectList(null);
        if (ObjectUtils.isEmpty(sysUserAgreementDOS)) {
            return R.fail();
        }
        List<SysUserAgreementVO> sysUserAgreementVOS=new ArrayList<>();
        sysUserAgreementDOS.forEach(sysUserAgreementDO -> {
            SysUserAgreementVO sysUserAgreementVO=new SysUserAgreementVO();
            BeanUtils.copyProperties(sysUserAgreementDO,sysUserAgreementVO);
            sysUserAgreementVOS.add(sysUserAgreementVO);
        });
        return R.ok(sysUserAgreementVOS);
    }
    /**
     * 编辑用户协议
     *
     * @param sysUserAgreementVO 编辑内容
     * @return 编辑结果
     */
    @Override
    public R putAgreement(SysUserAgreementVO sysUserAgreementVO) {
        SysUserAgreementDO sysUserAgreementDO=new SysUserAgreementDO();
        BeanUtils.copyProperties(sysUserAgreementVO,sysUserAgreementDO);
        int update = sysUserAgreementDAO.updateById(sysUserAgreementDO);
        if (update==0) {
            return R.fail("协议不存在");
        }
        return R.ok();
    }
    /**
     * 用户标签
     *
     * @param communityId 社区id
     * @return 标签集合
     */
    @Override
    public R listComMngUserTag(Long communityId) {
        List<ComMngUserTagDO> comMngUserTagDOS = comMngUserTagDAO.selectList(new QueryWrapper<ComMngUserTagDO>().lambda().eq(ComMngUserTagDO::getCommunityId, communityId));
        if (ObjectUtils.isEmpty(comMngUserTagDOS)) {
            return R.fail();
        }
        List<ComMngUserTagVO> comMngUserTagVOList=new ArrayList<>();
        comMngUserTagDOS.forEach(comMngUserTagDO -> {
            ComMngUserTagVO comMngUserTagVO=new ComMngUserTagVO();
            BeanUtils.copyProperties(comMngUserTagDO,comMngUserTagVO);
            comMngUserTagVOList.add(comMngUserTagVO);
        });
        return R.ok(comMngUserTagVOList);
    }
    /**
     * 新增删除用户标签
     *
     * @param systemmanagementConfigVO 操作内容
     * @return 操作结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R putComMngUserTag(SystemmanagementConfigVO systemmanagementConfigVO) {
        Long communityId = systemmanagementConfigVO.getCommunityId();
        List<ComMngUserTagVO> comMngUserTagVOList = systemmanagementConfigVO.getComMngUserTagVOList();
        if (!ObjectUtils.isEmpty(comMngUserTagVOList)) {
            comMngUserTagDAO.delete(null);
            comMngUserTagVOList.forEach(comMngUserTagVO -> {
                ComMngUserTagDO comMngUserTagDO=new ComMngUserTagDO();
                comMngUserTagDO.setCommunityId(communityId);
                comMngUserTagDO.setTagName(comMngUserTagVO.getTagName());
                comMngUserTagDAO.insert(comMngUserTagDO);
            });
            return R.ok();
        }else {
            return R.fail("用户标签不能为空");
        }
    }
    /**
     * 分页查询小程序用户
     *
     * @param pageUserAppletsBackstageDTO 查询参数
     * @return 分页集合
     */
    @Override
    public R pageUserAppletsBackstage(PageUserAppletsBackstageDTO pageUserAppletsBackstageDTO) {
        Page page = new Page<>();
        Long pageNum = pageUserAppletsBackstageDTO.getPageNum();
        Long pageSize = pageUserAppletsBackstageDTO.getPageSize();
        page.setSize(pageSize);
        page.setCurrent(pageNum);
        IPage<SysUserVO> iPage = userDao.pageUserAppletsBackstage(page, pageUserAppletsBackstageDTO);
        return R.ok(iPage);
    }
    /**
     * 编辑用户状态
     *
     * @param pageUserAppletsBackstageDTO 启用或者禁用 1 启用 2 禁用
     * @return 编辑结果
     */
    @Override
    public R putUserAppletsBackstage(PageUserAppletsBackstageDTO pageUserAppletsBackstageDTO) {
        Long userId = pageUserAppletsBackstageDTO.getUserId();
        Integer status = pageUserAppletsBackstageDTO.getStatus();
        SysUserDO sysUserDO=new SysUserDO();
        sysUserDO.setUserId(userId);
        sysUserDO.setStatus(status);
        int update = userDao.updateById(sysUserDO);
        if (update>0) {
            return R.ok();
        }
        return R.fail("用户不存在");
    }
    /**
     * 调试接口--清除昵称、社区、小区
     *
     * @param userId 登录用户id
     * @return 清除结果
     */
    @Override
    public R deleteUserTest(Long userId) {
        int num=userDao.deleteUserTest(userId);
        if (num>0) {
            return R.ok();
        }
        return R.fail("清除失败");
    }
    /**
     * 用户协议和隐私政策
     *
     * @param type 所属app 1居民端app 2网格员端app 3商家端app
     * @return 协议内容
     */
    @Override
    public R userAgreement(int type) {
        SysUserAgreementDO sysUserAgreementDO = sysUserAgreementDAO.selectOne(new QueryWrapper<SysUserAgreementDO>().lambda().eq(SysUserAgreementDO::getType, type));
        return R.ok(sysUserAgreementDO);
    }
    /**
     * 意见反馈
     *
     * @param sysUserFeedbackDTO 反馈内容
     * @return 反馈结果
     */
    @Override
    public R addFeedback(SysUserFeedbackDTO sysUserFeedbackDTO) {
        SysUserFeedbackDO sysUserFeedbackDO=new SysUserFeedbackDO();
        BeanUtils.copyProperties(sysUserFeedbackDTO,sysUserFeedbackDO);
        int insert = sysUserFeedbackDAO.insert(sysUserFeedbackDO);
        if (insert>0) {
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 分页通知列表
     *
     * @param pageDTO 分页参数
     * @return 分页结果
     */
    @Override
    public R pageNotice(PageDTO pageDTO) {
        Long userId=pageDTO.getUserId();
        Integer type = pageDTO.getType();
        int integer =0;
        if (null!=type&&type.intValue()>0) {
            integer=sysUserNoticeDAO.selectCount(new QueryWrapper<SysUserNoticeDO>().lambda().eq(SysUserNoticeDO::getUserId, userId).eq(SysUserNoticeDO::getStatus, 0).eq(SysUserNoticeDO::getType,type));
        }else{
            integer=sysUserNoticeDAO.selectCount(new QueryWrapper<SysUserNoticeDO>().lambda().eq(SysUserNoticeDO::getUserId, userId).eq(SysUserNoticeDO::getStatus, 0));
        }
        Page page = new Page<>();
        Long pageNum = pageDTO.getPageNum();
        Long pageSize = pageDTO.getPageSize();
        page.setSize(pageSize);
        page.setCurrent(pageNum);
        IPage<SysUserNoticeVO> iPage = userDao.pageNotice(page, pageDTO);
        Map<String,Object> map=new HashMap<>(2);
        map.put("page",iPage);
        map.put("unreadNum",integer);
        return R.ok(map);
    }
    /**
     * 通知已读
     *
     * @param noticeReadDTO 通知已读
     * @return 修改状态
     */
    @Override
    public R putNotice(NoticeReadDTO noticeReadDTO) {
        Integer all = noticeReadDTO.getAll();
        Long userId = noticeReadDTO.getUserId();
        int num=0;
        SysUserNoticeDO sysUserNoticeDO=new SysUserNoticeDO();
        if (null!=all&&1==all.intValue()) {
            sysUserNoticeDO.setStatus(1);
            num=sysUserNoticeDAO.update(sysUserNoticeDO,new UpdateWrapper<SysUserNoticeDO>().lambda().eq(SysUserNoticeDO::getUserId,userId).eq(SysUserNoticeDO::getStatus,0));
        }else{
            sysUserNoticeDO.setId(noticeReadDTO.getId());
            sysUserNoticeDO.setStatus(1);
            num=sysUserNoticeDAO.updateById(sysUserNoticeDO);
        }
        if (num>0) {
            return R.ok();
        }
       return R.fail("通知不存在");
    }
    /**
     * 分页查询用户意见反馈
     *
     * @param pageFeedBackDTO 分页查询参数
     * @return 意见集合
     */
    @Override
    public R pageFeedback(PageFeedBackDTO pageFeedBackDTO) {
        Page page = new Page<>();
        Long pageNum = pageFeedBackDTO.getPageNum();
        Long pageSize = pageFeedBackDTO.getPageSize();
        page.setSize(pageSize);
        page.setCurrent(pageNum);
        IPage<SysUserFeedbackVO> iPage = sysUserFeedbackDAO.pageFeedback(page, pageFeedBackDTO);
        return R.ok(iPage);
    }
    /**
     * 未读消息汇总
     *
     * @param userId 登录用户信息
     * @return 未读汇总
     */
    @Override
    public R noticeUnreadNum(Long userId) {
        NoticeUnReadVO noticeUnReadVO=sysUserNoticeDAO.noticeUnreadNum(userId);
        List<SysUserNoticeVO> sysUserNoticeVOList=new ArrayList<>();
        List<SysUserNoticeDO> sysUserNoticeDOS = sysUserNoticeDAO.selectList(new QueryWrapper<SysUserNoticeDO>().lambda().eq(SysUserNoticeDO::getUserId, userId).orderByDesc(SysUserNoticeDO::getCreateAt).groupBy(SysUserNoticeDO::getType));
        if (!ObjectUtils.isEmpty(sysUserNoticeDOS)) {
            sysUserNoticeDOS.forEach(sysUserNoticeDO -> {
                SysUserNoticeVO sysUserNoticeVO=new SysUserNoticeVO();
                BeanUtils.copyProperties(sysUserNoticeDO,sysUserNoticeVO);
                sysUserNoticeVOList.add(sysUserNoticeVO);
            });
        }
        noticeUnReadVO.setSysUserNoticeVOList(sysUserNoticeVOList);
        return R.ok(noticeUnReadVO);
    }
    /**
     * 反馈意见详情
     *
     * @param id 反馈主键
     * @return 反馈详情
     */
    @Override
    public R detailFeedback(Long id) {
        SysUserFeedbackVO sysUserFeedbackVO=sysUserFeedbackDAO.detailFeedback(id);
        return R.ok(sysUserFeedbackVO);
    }
    /**
     * 运营小程序后台数据看板
     *
     * @return 展示数据
     */
    @Override
    public R dataKanban() {
        IndexDataKanbanVO indexDataKanbanVO=userDao.selectIndexDataKanban();
        List<DataKanbanDTO> dataKanbanDTOS=userDao.selectCommunityUserOrder();
        List<DataKanbanDTO> dataKanbanDTOS1=userDao.selectCommunityActiveUserOrder();
        List<String> communityUserX=new ArrayList<>();
        List<Integer> communityUserY=new ArrayList<>();
        List<String> communityActiveUserX=new ArrayList<>();
        List<Integer> communityActiveUserY=new ArrayList<>();
        if (!ObjectUtils.isEmpty(dataKanbanDTOS)) {
            dataKanbanDTOS.forEach(dataKanbanDTO -> {
                communityUserX.add(dataKanbanDTO.getName());
                communityUserY.add(dataKanbanDTO.getNum());
            });
        }
        if (!ObjectUtils.isEmpty(dataKanbanDTOS1)) {
            dataKanbanDTOS1.forEach(dataKanbanDTO -> {
                communityActiveUserX.add(dataKanbanDTO.getName());
                communityActiveUserY.add(dataKanbanDTO.getNum());
            });
        }
        indexDataKanbanVO.setCommunityActiveUserX(communityActiveUserX);
        indexDataKanbanVO.setCommunityActiveUserY(communityActiveUserY);
        indexDataKanbanVO.setCommunityUserX(communityUserX);
        indexDataKanbanVO.setCommunityUserY(communityUserY);
        return R.ok(indexDataKanbanVO);
    }
    public static void main(String[] args) {
        String encode = new BCryptPasswordEncoder().encode("123456");
        System.out.println(encode);
    }
}