huanghongfa
2022-04-13 c92c380b8f29ad485024d3d1948d0d0fce56b0d6
springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/service/impl/UserServiceImpl.java
@@ -2,6 +2,7 @@
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.util.ArrayList;
import java.util.Date;
@@ -9,16 +10,20 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import cn.hutool.core.util.IdcardUtil;
import com.panzhihua.common.model.dtos.DataKanBansDto;
import com.panzhihua.common.model.vos.community.*;
import com.alibaba.fastjson.JSONObject;
import com.panzhihua.common.model.dtos.community.microCommercialStreet.BindUserPhoneDTO;
import com.panzhihua.common.model.vos.community.microCommercialStreet.McsLoginUserInfoVO;
import com.panzhihua.service_user.dao.*;
import com.panzhihua.service_user.model.dos.*;
import com.panzhihua.service_user.entity.SysAppConfig;
import com.panzhihua.service_user.entity.SysTemplateConfig;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.BeanUtils;
@@ -37,11 +42,13 @@
import com.panzhihua.common.constants.Constants;
import com.panzhihua.common.constants.UserConstants;
import com.panzhihua.common.exceptions.ServiceException;
import com.panzhihua.common.model.dtos.DataKanBansDto;
import com.panzhihua.common.model.dtos.PageDTO;
import com.panzhihua.common.model.dtos.community.ExportUserDTO;
import com.panzhihua.common.model.dtos.community.NoticeReadDTO;
import com.panzhihua.common.model.dtos.community.convenient.ConvenientMerchantDTO;
import com.panzhihua.common.model.dtos.community.convenient.DisableOrEnableConvenientMerchantDTO;
import com.panzhihua.common.model.dtos.community.microCommercialStreet.McsMerchantDTO;
import com.panzhihua.common.model.dtos.grid.EventGridMemberAddDTO;
import com.panzhihua.common.model.dtos.grid.EventGridMemberEditAdminDTO;
import com.panzhihua.common.model.dtos.grid.EventGridMemberEditStatusDTO;
@@ -59,6 +66,11 @@
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.community.ComActVO;
import com.panzhihua.common.model.vos.community.ComMngVolunteerMngVO;
import com.panzhihua.common.model.vos.community.IndexUserCommunityVo;
import com.panzhihua.common.model.vos.community.IndexUserStatisticsVo;
import com.panzhihua.common.model.vos.community.IndexUserStreetVo;
import com.panzhihua.common.model.vos.grid.GridMemberVO;
import com.panzhihua.common.model.vos.grid.admin.GridMemberBuildingVO;
import com.panzhihua.common.model.vos.partybuilding.ActivityManagerVO;
@@ -80,14 +92,31 @@
import com.panzhihua.common.model.vos.user.UserPhoneVO;
import com.panzhihua.common.utlis.IdCard;
import com.panzhihua.common.utlis.SensitiveUtil;
import com.panzhihua.common.utlis.SmsUtil;
import com.panzhihua.common.utlis.Snowflake;
import com.panzhihua.common.utlis.StringUtils;
import com.panzhihua.common.utlis.WxUtil;
import com.panzhihua.common.utlis.WxXCXTempSend;
import com.panzhihua.service_user.model.dos.ComActFourMember;
import com.panzhihua.service_user.model.dos.ComMngFamilyInfoDO;
import com.panzhihua.service_user.model.dos.ComMngUserTagDO;
import com.panzhihua.service_user.model.dos.EventGridMemberBuildingRelationDO;
import com.panzhihua.service_user.model.dos.LcCompareCodeMemberDO;
import com.panzhihua.service_user.model.dos.SysMenuDO;
import com.panzhihua.service_user.model.dos.SysOperLogDO;
import com.panzhihua.service_user.model.dos.SysRoleDO;
import com.panzhihua.service_user.model.dos.SysRoleMenuDO;
import com.panzhihua.service_user.model.dos.SysUserAgreementDO;
import com.panzhihua.service_user.model.dos.SysUserDO;
import com.panzhihua.service_user.model.dos.SysUserFeedbackDO;
import com.panzhihua.service_user.model.dos.SysUserInputDO;
import com.panzhihua.service_user.model.dos.SysUserNoticeDO;
import com.panzhihua.service_user.model.dos.SysUserRoleDO;
import com.panzhihua.service_user.model.dtos.DataKanbanDTO;
import com.panzhihua.service_user.service.EventGridMemberBuildingRelationService;
import com.panzhihua.service_user.service.UserService;
import cn.hutool.core.util.IdcardUtil;
import lombok.extern.slf4j.Slf4j;
// import com.panzhihua.common.service.grid.GridService;
@@ -101,6 +130,9 @@
@Slf4j
@Service
public class UserServiceImpl implements UserService {
    private static final String DEFAULT_IMAGE_URL = "https://www.psciio.com//idcard/91313573d071436ab1f934231b31c6e5.jpg";
    @Resource
    private UserDao userDao;
    @Resource
@@ -135,6 +167,10 @@
    private LcCompareMemberCodeMapper lcCompareMemberCodeMapper;
    @Resource
    private ComActFourMemberDao comActFourMemberDao;
    @Resource
    private SysAppConfigDao sysAppConfigDao;
    @Resource
    private SysTemplateConfigDao sysTemplateConfigDao;
    // @Resource
    // private GridService gridService;
@@ -269,8 +305,13 @@
                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));
            if (type == 11) {
                //只允许通过account登录
                wrapper.and(sysUserDOLambdaQueryWrapper -> sysUserDOLambdaQueryWrapper.eq(SysUserDO::getAccount, name));
            } else {
                wrapper.and(sysUserDOLambdaQueryWrapper -> sysUserDOLambdaQueryWrapper.eq(SysUserDO::getAccount, name).or()
                        .eq(SysUserDO::getPhone, name));
            }
            sysUserDO = userDao.selectOne(wrapper);
        }
        boolean empty = ObjectUtils.isEmpty(sysUserDO);
@@ -286,7 +327,16 @@
        loginUserInfoVO.setType(sysUserDO.getType());
        loginUserInfoVO.setIsRealNamed(sysUserDO.getIdCard() != null);// 暂时 身份证判断实名制
        if(sysUserDO.getCommunityId()!=null){
            ComActVO comActVO = userDao.selectCommunity(sysUserDO.getCommunityId());
            loginUserInfoVO.setCommunityId(sysUserDO.getCommunityId());
            if(comActVO!=null){
                loginUserInfoVO.setComActVO(comActVO);
                SysAppConfig sysAppConfig=sysAppConfigDao.selectOne(new QueryWrapper<SysAppConfig>().lambda().eq(SysAppConfig::getAreaCode,comActVO.getAreaCode()));
                if(sysAppConfig!=null){
                    loginUserInfoVO.setAppId(sysAppConfig.getAppId());
                    loginUserInfoVO.setAppSecret(sysAppConfig.getSecret());
                }
            }
        }
        List<SysRoleDO> roleDOList = roleDAO.selectByUserId(sysUserDO.getUserId());
        Set<String> set = new HashSet<>();
@@ -325,6 +375,9 @@
        loginUserInfoVO.setIsmemberrole(2);
        loginUserInfoVO.setIsFourMember(2);
        loginUserInfoVO.setIsCommunityWorker(2);
        loginUserInfoVO.setIsPropertyWorker(2);
        loginUserInfoVO.setIsSocialWorker(2);
        loginUserInfoVO.setIsFmsMember(2);
        // 志愿者状态
        String phone = sysUserDO.getPhone();
        Long userCommunityId = sysUserDO.getCommunityId();
@@ -332,6 +385,13 @@
            ComActVO comActVO = userDao.selectCommunity(userCommunityId);
            if (comActVO != null) {
                loginUserInfoVO.setCommunityName(comActVO.getName());
                loginUserInfoVO.setComActVO(comActVO);
                loginUserInfoVO.setAreaCode(comActVO.getAreaCode());
                SysAppConfig sysAppConfig=sysAppConfigDao.selectOne(new QueryWrapper<SysAppConfig>().lambda().eq(SysAppConfig::getAreaCode,comActVO.getAreaCode()));
                if(sysAppConfig!=null){
                    loginUserInfoVO.setAppId(sysAppConfig.getAppId());
                    loginUserInfoVO.setAppSecret(sysAppConfig.getSecret());
                }
            }
        }
        if (!ObjectUtils.isEmpty(phone)) {
@@ -347,6 +407,16 @@
            if(countFourMember>0){
                loginUserInfoVO.setIsFourMember(1);
            }
            //是否是社区物业人员
            int countPropertyWorker = userDao.countPropertyWorker(Long.parseLong(userId), userCommunityId);
            if (countPropertyWorker > 0) {
                loginUserInfoVO.setIsPropertyWorker(1);
            }
            //是否微团队成员
            int countFmsMember = userDao.countFmsMember(phone, userCommunityId);
            if (countFmsMember > 0) {
                loginUserInfoVO.setIsFmsMember(1);
            }
            // 是否是"管理员"或者 本社区 "社区团队"、"党委成员"
            Integer countTeam = userDao.selectCountTeam(phone, userCommunityId);
            Integer selectCountMemberRole = userDao.selectCountMemberRole(phone, userCommunityId);
@@ -358,6 +428,10 @@
                loginUserInfoVO.setIsmemberrole(1);
            } else if (isSysUser != null && isSysUser > 0) {
                loginUserInfoVO.setIsmemberrole(1);
            }
            Integer countSocialWorker = userDao.countSocialWorker(phone,userCommunityId);
            if(countSocialWorker>0){
                loginUserInfoVO.setIsSocialWorker(1);
            }
        }
        loginUserInfoVO.setIsRealNamed(sysUserDO.getIdCard() != null);
@@ -577,13 +651,14 @@
     * @return 人员详情
     */
    @Override
    public R detailUser(Long userId) {
    public R<LoginUserInfoVO> detailUser(Long userId) {
        LoginUserInfoVO loginUserInfoVO = new LoginUserInfoVO();
        if (userId < 100000000l) {
            SysUserDO sysUserDO = userDao.selectById(userId);
            if (ObjectUtils.isEmpty(sysUserDO)) {
                return R.fail("人员不存在");
            }
            BeanUtils.copyProperties(sysUserDO, loginUserInfoVO);
            List<ComMngFamilyInfoDO> comMngFamilyInfoDOS = comMngFamilyInfoDAO
                .selectList(new QueryWrapper<ComMngFamilyInfoDO>().lambda().eq(ComMngFamilyInfoDO::getUserId, userId));
@@ -635,10 +710,34 @@
        }
        ComActVO comActVO = userDao.selectCommunity(loginUserInfoVO.getCommunityId());
        if (!ObjectUtils.isEmpty(comActVO)) {
            loginUserInfoVO.setComActVO(comActVO);
            loginUserInfoVO.setCommunityName(comActVO.getName());
            loginUserInfoVO.setAreaCode(comActVO.getAreaCode());
        }
        else{
            loginUserInfoVO.setAreaCode("510423");
        }
        //是否是社区物业人员
        int countPropertyWorker = userDao.countPropertyWorker(userId, loginUserInfoVO.getCommunityId());
        loginUserInfoVO.setIsPropertyWorker(countPropertyWorker > 0 ? 1 : 0);
        //是否微团队成员
        int countFmsMember = userDao.countFmsMember(loginUserInfoVO.getPhone(), loginUserInfoVO.getCommunityId());
        loginUserInfoVO.setIsFmsMember(countFmsMember > 0 ? 1 : 0);
        loginUserInfoVO.setIdCard(SensitiveUtil.desensitizedIdNumber(loginUserInfoVO.getIdCard()));
        loginUserInfoVO.setPhone(SensitiveUtil.desensitizedPhoneNumber(loginUserInfoVO.getPhone()));
        //判断账号类型
        int countSocialOrg=userDao.countSocialOrg(userId);
        if(countSocialOrg>0){
            loginUserInfoVO.setUserType(3);
        }
        else {
            if(loginUserInfoVO.getStreetId()!=null){
                loginUserInfoVO.setUserType(1);
            }
            else {
                loginUserInfoVO.setUserType(2);
            }
        }
        return R.ok(loginUserInfoVO);
    }
@@ -795,7 +894,7 @@
        }
        sysUserDO.setFaceState(null);
        SysUserDO sysUserDO1 =
            userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getIdCard, idCard));
            userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getIdCard, idCard).eq(SysUserDO::getCommunityId,loginUserInfoVO.getCommunityId()));
        if (!ObjectUtils.isEmpty(sysUserDO1)) {
            return R.fail("身份证已经存在");
        }
@@ -819,9 +918,10 @@
                try {
                    WxXCXTempSend util = new WxXCXTempSend();
                    String accessToken = util.getAppAccessToken();
                    SysTemplateConfig sysTemplateConfig=sysTemplateConfigDao.selectOne(new QueryWrapper<SysTemplateConfig>().lambda().eq(SysTemplateConfig::getAreaCode, loginUserInfoVO.getComActVO()).eq(SysTemplateConfig::getType,5));
                    // 用户实名认证推送消息
                    WxUtil.sendSubscribeRZSH(user.getOpenid(), accessToken, "实名认证",
                        com.panzhihua.common.utlis.DateUtils.getCurrentDateStr(), "认证成功");
                        com.panzhihua.common.utlis.DateUtils.getCurrentDateStr(), "认证成功",sysTemplateConfig.getTemplateId());
                } catch (Exception e) {
                    log.error("推送用户订阅消息失败,失败原因:" + e.getMessage());
                }
@@ -1037,6 +1137,46 @@
                this.putMenuRole(menuRoleVO);
            }
        }
        if(roleId.intValue()==777777777){
            SysRoleDO sysRoleDO = new SysRoleDO();
            sysRoleDO.setRoleName("超级管理员");
            sysRoleDO.setRoleKey(Constants.STREET_ROLE_KEY + administratorsUserVO.getStreetId());
            sysRoleDO.setRoleSort(0);
            sysRoleDO.setCreateBy(administratorsUserVO.getUserId());
            int insert = roleDAO.insert(sysRoleDO);
            if (insert > 0) {
                SysRoleDO sysRoleDO1 = roleDAO.selectOne(
                        new QueryWrapper<SysRoleDO>().lambda().eq(SysRoleDO::getRoleKey, sysRoleDO.getRoleKey()));
                roleId = sysRoleDO1.getRoleId();
                // 新街道管理员角色设置固定三社权限
                MenuRoleVO menuRoleVO = new MenuRoleVO();
                List<Long> menu=new ArrayList<>();
                if(administratorsUserVO.getSocialType()==1){
                    menu.add(233L);
                    menu.add(234L);
                    menu.add(235L);
                    menu.add(236L);
                    menu.add(237L);
                }
                else if(administratorsUserVO.getSocialType()==2){
                    menu.add(233L);
                    menu.add(234L);
                    menu.add(236L);
                    menu.add(237L);
                    menu.add(238L);
                }
                else if(administratorsUserVO.getSocialType()==3){
                    menu.add(233L);
                    menu.add(237L);
                }
                else {
                    menuRoleVO.setIsAll(1);
                }
                menuRoleVO.setMenuIds(menu);
                menuRoleVO.setRoleId(roleId);
                this.putMenuRole(menuRoleVO);
            }
        }
        SysRoleDO roleDO = roleDAO.selectById(roleId);
        if (ObjectUtils.isEmpty(roleDO)) {
            return R.fail("角色不存在");
@@ -1060,7 +1200,7 @@
        }
        if (insert > 0 && sysUserDO.getType() == 3) {// 添加的用户是社区账号时
        if (insert > 0 && sysUserDO.getType() == 3 &&sysUserDO.getStreetId()==null) {// 添加的用户是社区账号时
            // 添加网格综合治理管理后台用户
            SysUserDO sysUserDOWangGe = new SysUserDO();
            BeanUtils.copyProperties(sysUserDO, sysUserDOWangGe);
@@ -1104,6 +1244,47 @@
    public R addUserBackstageProperty(AdministratorsUserVO administratorsUserVO) {
        SysUserDO sysUserDO = new SysUserDO();
        Long roleId = administratorsUserVO.getRoleId();
        if(roleId.intValue()==777777777){
            SysRoleDO sysRoleDO = new SysRoleDO();
            sysRoleDO.setRoleName("三社超级管理员");
            List<Long> menu=new ArrayList<>();
            if(administratorsUserVO.getSocialType()==1){
                sysRoleDO.setRoleKey(Constants.STREET_ROLE_KEY + administratorsUserVO.getStreetId());
                menu.add(300L);
                menu.add(301L);
                menu.add(302L);
                menu.add(303L);
                menu.add(304L);
            }
            else if(administratorsUserVO.getSocialType()==2){
                sysRoleDO.setRoleKey("social_org" + administratorsUserVO.getStreetId());
                menu.add(300L);
                menu.add(301L);
                menu.add(302L);
                menu.add(303L);
            }
            else if(administratorsUserVO.getSocialType()==3){
                sysRoleDO.setRoleKey("social_org_member" + administratorsUserVO.getStreetId());
                menu.add(300L);
                menu.add(303L);
            }
            sysRoleDO.setRoleSort(0);
            sysRoleDO.setCreateBy(administratorsUserVO.getUserId());
            SysRoleDO sysRoleDO1 = roleDAO.selectOne(
                    new QueryWrapper<SysRoleDO>().lambda().eq(SysRoleDO::getRoleKey, sysRoleDO.getRoleKey()));
            if(sysRoleDO1!=null){
                sysRoleDO=sysRoleDO1;
                roleId = sysRoleDO.getRoleId();
            }else{
                roleDAO.insert(sysRoleDO);
                // 新街道管理员角色设置固定三社权限
                MenuRoleVO menuRoleVO = new MenuRoleVO();
                menuRoleVO.setMenuIds(menu);
                menuRoleVO.setRoleId(sysRoleDO.getRoleId());
                this.putMenuRole(menuRoleVO);
            }
        }
        SysRoleDO roleDO = roleDAO.selectById(roleId);
        if (ObjectUtils.isEmpty(roleDO)) {
            return R.fail("角色不存在");
@@ -1121,6 +1302,8 @@
                throw new ServiceException("手机号已经存在");
            } else if (e.getMessage().contains("union_account_type")) {
                throw new ServiceException("账户已经存在");
            }else if(e.getMessage().contains("23000")){
                throw new ServiceException("手机号已存在");
            }
        }
@@ -1188,7 +1371,7 @@
        // 获取所有权限id
        List<SysMenuDO> menuDOList = sysMenuDAO.selectList(new QueryWrapper<SysMenuDO>().lambda()
            .eq(SysMenuDO::getCommunityId, 2L).orderByAsc(SysMenuDO::getOrderNum));
            .eq(SysMenuDO::getCommunityId, 2L).eq(SysMenuDO::getVisible,0).orderByAsc(SysMenuDO::getOrderNum));
        if (!menuDOList.isEmpty()) {
            menuIds = menuDOList.stream().map(sysMenuDO -> sysMenuDO.getMenuId()).collect(Collectors.toList());
@@ -1198,7 +1381,12 @@
                        .anyMatch(sysRoleMenuDO -> sysRoleMenuDO.getMenuId().equals(menuId))).collect(Collectors.toList());
            }
            if (!menuIds.isEmpty()) {
                sysRoleMenuDAO.batchInsertWithRoleId(menuIds, roleId);
                if(menuRoleVO.getMenuIds()==null){
                    sysRoleMenuDAO.batchInsertWithRoleId(menuIds, roleId);
                }
                else {
                    sysRoleMenuDAO.batchInsertWithRoleId(menuRoleVO.getMenuIds(), roleId);
                }
            }
//            for (int i = 0; i < menuIds.size(); i++) {
//                SysRoleMenuDO sysRoleMenuDO = sysRoleMenuDAO.selectOne(new QueryWrapper<SysRoleMenuDO>().lambda()
@@ -1280,7 +1468,7 @@
        }
        Long communityId = sysUserDO.getCommunityId();
        Long communityId1 = administratorsUserVO.getCommunityId();
        if (communityId1.intValue() != communityId.intValue()) {
        if (communityId1!=null&&communityId1.intValue() != communityId.intValue()) {
            return R.fail("用户不属于当前平台");
        }
        // 删除用户
@@ -1665,9 +1853,9 @@
     * @return 展示数据
     */
    @Override
    public R dataKanban() {
        IndexDataKanbanVO indexDataKanbanVO = userDao.selectIndexDataKanban();
        List<DataKanbanDTO> dataKanbanDTOS = userDao.selectCommunityUserOrder();
    public R dataKanban(String areaCode) {
        IndexDataKanbanVO indexDataKanbanVO = userDao.selectIndexDataKanban(areaCode);
        List<DataKanbanDTO> dataKanbanDTOS = userDao.selectCommunityUserOrder(areaCode);
        List<String> communityUserX = new ArrayList<>();
        List<Integer> communityUserY = new ArrayList<>();
@@ -2063,7 +2251,7 @@
    @Override
    public R editSysUser(ShopStoreVO storeVO) {
        SysUserDO sysUserDO1 = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda()
            .eq(SysUserDO::getPhone, storeVO.getPhone()).eq(SysUserDO::getType, 5));
            .eq(SysUserDO::getPhone, storeVO.getStoreAccount()).eq(SysUserDO::getType, 5));
        if (sysUserDO1 == null) {
            return R.fail("未查询到后台管理用户!");
        }
@@ -2122,7 +2310,7 @@
    /**
     * 修改app用户密码
     *
     *
     * @param userInfoAppDTO
     *            请求参数
     * @return 修改结果
@@ -2154,7 +2342,7 @@
    /**
     * 添加网格员
     *
     *
     * @param eventGridMemberAddDTO
     *            请求参数
     * @return 结果
@@ -2271,7 +2459,7 @@
    /**
     * 网格员管理
     *
     *
     * @param memberRelationDTO
     *            请求参数
     * @return 网格员列表
@@ -2308,7 +2496,7 @@
    /**
     * 修改网格员信息
     *
     *
     * @param gridMemberDTO
     *            请求参数
     * @return 修改结果
@@ -2404,7 +2592,7 @@
    /**
     * 重置网格员密码
     *
     *
     * @param gridMemberDTO
     *            请求参数
     * @return 重置结果
@@ -2422,7 +2610,7 @@
    /**
     * 批量删除网格员
     *
     *
     * @param Ids
     *            网格员id集合
     * @return 删除结果
@@ -2461,7 +2649,7 @@
    /**
     * 查询社区的收益说明
     *
     *
     * @param communityId
     *            社区id
     * @return 收益说明
@@ -2508,7 +2696,7 @@
    /**
     * 根据用户id查询用户openid
     *
     *
     * @param userId
     *            用户id
     * @return openid
@@ -2524,7 +2712,7 @@
    /**
     * 查询社区后台工作人员列表
     *
     *
     * @param communityId
     *            社区id
     * @return 社区后台工作人员列表
@@ -2589,10 +2777,6 @@
        if (nonNull(sysUserDO)) {
            return R.fail("账户已经存在");
        }
        sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getPhone, convenientMerchantDTO.getPhone()));
        if (nonNull(sysUserDO)) {
            return R.fail("手机号已经存在");
        }
        // sys_user 表
        sysUserDO = new SysUserDO();
        String encode = new BCryptPasswordEncoder().encode(convenientMerchantDTO.getPassword());
@@ -2601,7 +2785,7 @@
        sysUserDO.setType(10);
        sysUserDO.setAreaId(null);
        sysUserDO.setStatus(1);
        sysUserDO.setPhone(convenientMerchantDTO.getPhone());
        sysUserDO.setPhone(null);
        sysUserDO.setName(convenientMerchantDTO.getContacts());
        sysUserDO.setPassword(encode);
        try {
@@ -2662,7 +2846,7 @@
        userDao.disableOrEnableMerchantUsers(disableOrEnableConvenientMerchantDTO.getType(), disableOrEnableConvenientMerchantDTO.getUserIds());
        return R.ok();
    }
    /**
     * 根据openid维护社区团队里是否注册
     * @param openid    用户微信唯一标识
@@ -2685,7 +2869,7 @@
     */
    @Override
    public R dataKanBans(DataKanBansDto dataKanBansDto){
        IndexDataKanbanVO indexDataKanbanVO = userDao.selectIndexDataKanban();
        IndexDataKanbanVO indexDataKanbanVO = userDao.selectIndexDataKanban(dataKanBansDto.getAreaCode());
        List<String> communityUserX = new ArrayList<>();
        List<Integer> communityUserY = new ArrayList<>();
@@ -2695,9 +2879,9 @@
        List<DataKanbanDTO> dataKanbanDTOS = null;
        if(dataKanBansDto.getType() != null && dataKanBansDto.getType().equals(DataKanBansDto.type.by)){
            dataKanbanDTOS = userDao.selectCommunityUserOrderMonth();
            dataKanbanDTOS = userDao.selectCommunityUserOrderMonth(dataKanBansDto.getAreaCode());
        }else{
            dataKanbanDTOS = userDao.selectCommunityUserOrder();
            dataKanbanDTOS = userDao.selectCommunityUserOrder(dataKanBansDto.getAreaCode());
        }
        if (!ObjectUtils.isEmpty(dataKanbanDTOS)) {
            dataKanbanDTOS.forEach(dataKanbanDTO -> {
@@ -2710,7 +2894,7 @@
        List<Date> serverndays = com.panzhihua.common.utlis.DateUtils.getOldDays();
        serverndays.forEach(date -> {
            // 查询社区活动数量
            DataKanbanDTO dataKanbanDTO = userDao.selectCommunityAddUserOrder(date);
            DataKanbanDTO dataKanbanDTO = userDao.selectCommunityAddUserOrder(dataKanBansDto.getAreaCode(),date);
            communityActiveUserX.add(DateFormatUtils.format(date, "MM-dd"));
            communityActiveUserY.add(dataKanbanDTO.getNum());
            communityActiveUserZ.add(dataKanbanDTO.getDayNum());
@@ -2728,11 +2912,11 @@
     * @return  用户数据统计汇总
     */
    @Override
    public R communityStatistics(){
    public R communityStatistics(String areaCode){
        //返回结果数据
        IndexUserStatisticsVo userStatisticsVo = new IndexUserStatisticsVo();
        //查询所有街道
        List<IndexUserStreetVo> streetList = userDao.getUserStreetList();
        List<IndexUserStreetVo> streetList = userDao.getUserStreetList(areaCode);
        streetList.forEach(street -> {
            List<IndexUserCommunityVo> communityList = userDao.getUserCommunityList(street.getStreetId());
            street.setCommunityList(communityList);
@@ -2742,7 +2926,298 @@
    }
    @Override
    public R communityStatisticsExport(){
        return R.ok(userDao.getUserCommunityExcelExport());
    public R communityStatisticsExport(String areaCode){
        return R.ok(userDao.getUserCommunityExcelExport(areaCode));
    }
    /**
     * 通过UnionId获取用户信息
     * @param unionId
     * @return
     */
    @Override
    public R getUserInfoByUnionId(String unionId) {
        SysUserDO sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getUnionid, unionId));
        if (isNull(sysUserDO)) {
            return R.fail("用户不存在");
        }
        LoginUserInfoVO loginUserInfoVO = new LoginUserInfoVO();
        BeanUtils.copyProperties(sysUserDO, loginUserInfoVO);
        return R.ok(loginUserInfoVO);
    }
    @Override
    public R updateStreetId(AdministratorsUserVO administratorsUserVO) {
        SysUserDO sysUserDO=new SysUserDO();
        BeanUtils.copyProperties(administratorsUserVO,sysUserDO);
        userDao.updateById(sysUserDO);
        return R.ok();
    }
    /**
     * 删除用户信息缓存
     * @param phone
     */
    @Override
    public R deleteUserCashByPhone(String phone) {
        SysUserDO sysUserDO = this.userDao.selectOne(new LambdaQueryWrapper<SysUserDO>().eq(SysUserDO::getPhone, phone).eq(SysUserDO::getType, 1));
        if (nonNull(sysUserDO)) {
            String userKey = UserConstants.LOGIN_USER_INFO + sysUserDO.getUserId();
            stringRedisTemplate.delete(userKey);
        }
        return R.ok();
    }
    /**
     * 微商业街新增商家账号
     * @param mcsMerchantDTO
     * @return 商家用户id
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R addMcsMerchantUser(McsMerchantDTO mcsMerchantDTO) {
        SysUserDO sysUserDO;
        sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda()
                .eq(SysUserDO::getPhone, mcsMerchantDTO.getPhone()).eq(SysUserDO::getType, 11));
        String encode = new BCryptPasswordEncoder().encode(mcsMerchantDTO.getPassword());
        if (nonNull(sysUserDO)) {
            sysUserDO.setAccount(mcsMerchantDTO.getAccount());
            sysUserDO.setStatus(mcsMerchantDTO.getAccountStatus());
            sysUserDO.setPhone(mcsMerchantDTO.getPhone());
            sysUserDO.setPassword(encode);
            sysUserDO.setPlaintextPassword(mcsMerchantDTO.getPassword());
            sysUserDO.setImageUrl(mcsMerchantDTO.getLogo());
            sysUserDO.setName(mcsMerchantDTO.getName());
            userDao.updateById(sysUserDO);
            McsLoginUserInfoVO loginUserInfoVO = new McsLoginUserInfoVO();
            BeanUtils.copyProperties(sysUserDO, loginUserInfoVO);
            return R.ok(loginUserInfoVO);
        }
        // sys_user 表
        sysUserDO = new SysUserDO();
        BeanUtils.copyProperties(mcsMerchantDTO, sysUserDO);
        sysUserDO.setAccount(mcsMerchantDTO.getAccount());
        sysUserDO.setType(11);
        sysUserDO.setAreaId(null);
        sysUserDO.setStatus(mcsMerchantDTO.getAccountStatus());
        sysUserDO.setPhone(mcsMerchantDTO.getPhone());
        sysUserDO.setPassword(encode);
        sysUserDO.setPlaintextPassword(mcsMerchantDTO.getPassword());
        sysUserDO.setImageUrl(mcsMerchantDTO.getLogo());
        try {
            userDao.insert(sysUserDO);
            McsLoginUserInfoVO loginUserInfoVO = new McsLoginUserInfoVO();
            BeanUtils.copyProperties(sysUserDO, loginUserInfoVO);
            return R.ok(loginUserInfoVO);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("修改数字商业街商家用户报错【{}】", e.getMessage());
            if (e.getMessage().contains("union_account_type") || e.getMessage().contains("23000")) {
                return R.fail("账户已经存在");
            } else {
                return R.fail("账户或手机号已存在,请重新填写尝试");
            }
        }
    }
    /**
     * 微商业街修改商家账号
     * @param mcsMerchantDTO
     * @return
     */
    @Override
    public R putMcsMerchantUser(McsMerchantDTO mcsMerchantDTO) {
        SysUserDO sysUserDO = userDao.selectById(mcsMerchantDTO.getUserId());
        if (isNull(sysUserDO)) {
            return R.fail("用户不存在");
        }
        String account = mcsMerchantDTO.getAccount();
        String phone = mcsMerchantDTO.getPhone();
        Integer accountStatus = mcsMerchantDTO.getAccountStatus();
        String name = mcsMerchantDTO.getName();
        if (isNotBlank(account)) {
            sysUserDO.setAccount(account);
        }
        if (isNotBlank(phone)) {
            sysUserDO.setPhone(phone);
        }
        if (nonNull(accountStatus)) {
            sysUserDO.setStatus(accountStatus);
        }
        if (isNotBlank(name)) {
            sysUserDO.setName(name);
        }
        try {
            userDao.updateById(sysUserDO);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("修改数字商业街商家用户报错【{}】", e.getMessage());
            if (e.getMessage().contains("union_phone_type")) {
                return R.fail("手机号已存在");
            } else if (e.getMessage().contains("union_account_type")) {
                return R.fail("账户已经存在");
            }else if(e.getMessage().contains("23000")){
                return R.fail("手机号已存在");
            } else {
                return R.fail("账户或手机号已存在,请重新填写尝试");
            }
        }
        return R.ok();
    }
    /**
     * 检查用户是否有效
     * @param userId
     * @param type
     * @return
     */
    @Override
    public Boolean checkUserIsValid(Long userId, Integer type) {
        SysUserDO sysUserDO = userDao.selectById(userId);
        if (isNull(sysUserDO) || sysUserDO.getStatus() != 1 || !sysUserDO.getType().equals(type)) {
            return false;
        }
        return true;
    }
    /**
     * 根据手机号、用户类型查询用户
     * @param phone
     * @param type
     * @return
     */
    @Override
    public R getSysUserByPhone(String phone, Integer type) {
        SysUserDO sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getPhone, phone).eq(SysUserDO::getType, type));
        McsLoginUserInfoVO loginUserInfoVO = null;
        if (nonNull(sysUserDO)) {
            loginUserInfoVO = new McsLoginUserInfoVO();
            BeanUtils.copyProperties(sysUserDO, loginUserInfoVO);
        }
        return R.ok(loginUserInfoVO);
    }
    /**
     * 发送验证码
     * @param phone 手机号
     * @param clientIP 用户ip
     * @param prefixKey redis Key 前缀
     * @param limit 获取次数限制
     * @param timeout 超次数获取时间等待
     * @return
     */
    @Override
    public R sendMessageCode(String phone, String clientIP, String prefixKey, Integer limit, Integer timeout) {
        ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
        if (isNotBlank(clientIP)) {
            String redisKey = String.join("::", prefixKey, clientIP);
            Long increment = opsForValue.increment(redisKey, 1);
            if (increment > limit) {
                return R.fail(String.format("请求过于频繁,请%d分钟后再次尝试!", timeout/60));
            }
            stringRedisTemplate.expire(redisKey, timeout, TimeUnit.SECONDS);
        }
        Random r = new Random();
        StringBuilder rs = new StringBuilder();
        for (int i = 0; i < 5; i++) {
            rs.append(r.nextInt(10));
        }
        String code = rs.toString();
        int result = SmsUtil.sendCode(phone, code);
        if (result == 1) {
            String codeKey = String.join("::", phone, code);
            opsForValue.set(codeKey, code, timeout, TimeUnit.SECONDS);
            return R.ok();
        }
        return R.fail();
    }
    /**
     * 根据openId获取微商业街用户
     * @param openid
     * @return
     */
    @Override
    public R getMcsUserByOpenId(String openid) {
        SysUserDO sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getOpenid, openid).eq(SysUserDO::getType, 11));
        McsLoginUserInfoVO loginUserInfoVO = null;
        if (nonNull(sysUserDO) && isNotBlank(sysUserDO.getOpenid())) {
            loginUserInfoVO = new McsLoginUserInfoVO();
            BeanUtils.copyProperties(sysUserDO, loginUserInfoVO);
        }
        return R.ok(loginUserInfoVO);
    }
    /**
     * 商业街用户微信授权-绑定手机号
     * @param bindUserPhoneDTO
     * @return
     */
    @Override
    public R bindOrAddMcsUser(BindUserPhoneDTO bindUserPhoneDTO) {
        String phone = bindUserPhoneDTO.getPhone();
        String openId = bindUserPhoneDTO.getOpenId();
        String redisKey = String.join("::", phone, bindUserPhoneDTO.getCode());
        Boolean hasKey = stringRedisTemplate.hasKey(redisKey);
        if (hasKey) {
            //通过验证
            SysUserDO sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getPhone, phone).eq(SysUserDO::getType, 11));
            if (nonNull(sysUserDO)) {
                //已有用户
                sysUserDO.setOpenid(openId);
                int result = userDao.updateById(sysUserDO);
                if (result > 0) {
                    McsLoginUserInfoVO loginUserInfoVO = new McsLoginUserInfoVO();
                    BeanUtils.copyProperties(sysUserDO, loginUserInfoVO);
                    stringRedisTemplate.delete(redisKey);
                    return R.ok(loginUserInfoVO);
                }
                return R.fail("绑定失败,请重试");
            } else {
                //自动创建用户
                McsMerchantDTO mcsMerchantDTO = new McsMerchantDTO();
                mcsMerchantDTO.setAccount(phone);
                mcsMerchantDTO.setPassword("88888888");
                mcsMerchantDTO.setAccountStatus(1);
                mcsMerchantDTO.setPhone(phone);
                mcsMerchantDTO.setName("用户" + retrieveRandomCode(5));
                mcsMerchantDTO.setImageUrl(DEFAULT_IMAGE_URL);
                mcsMerchantDTO.setOpenId(openId);
                R addUserResult = addMcsMerchantUser(mcsMerchantDTO);
                if (R.isOk(addUserResult)) {
                    McsLoginUserInfoVO loginUserInfoVO = JSONObject.parseObject(JSONObject.toJSONString(addUserResult.getData()), McsLoginUserInfoVO.class);
                    loginUserInfoVO.setPlaintextPassword("88888888");
                    stringRedisTemplate.delete(redisKey);
                    return R.ok(loginUserInfoVO);
                }
                return addUserResult;
            }
        } else {
            return R.fail("验证码错误");
        }
    }
    private String retrieveRandomCode(int length) {
        Random r = new Random();
        StringBuilder rs = new StringBuilder();
        for (int i = 0; i < length; i++) {
            rs.append(r.nextInt(10));
        }
        return rs.toString();
    }
    @Override
    public R updateUserPartyStatus(Long userId) {
        SysUserDO sysUserDO = userDao.selectById(userId);
        if (sysUserDO != null) {
            sysUserDO.setIsPartymember(1);
            int updated = userDao.updateById(sysUserDO);
            if (updated > 0) {
                // 删除用户信息缓存
                String userKey = UserConstants.LOGIN_USER_INFO + sysUserDO.getUserId();
                stringRedisTemplate.delete(userKey);
            }
        }
        return R.ok();
    }
}