张天森
2022-07-13 2c292948b4067a0a14a815919f657eba30ddde1d
springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/service/impl/UserServiceImpl.java
@@ -2,18 +2,37 @@
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.capitalize;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.panzhihua.common.model.dtos.community.microCommercialStreet.BindUserPhoneDTO;
import com.panzhihua.common.model.vos.community.ComAreaTownCommunityVO;
import com.panzhihua.common.model.vos.community.acid.ComActAcidCheckRecordVO;
import com.panzhihua.common.model.vos.community.acid.ComActAcidMemberVO;
import com.panzhihua.common.model.vos.community.acid.ComActAcidRecordVO;
import com.panzhihua.common.model.vos.community.microCommercialStreet.McsLoginUserInfoVO;
import com.panzhihua.common.model.vos.user.*;
import com.panzhihua.common.utlis.*;
import com.panzhihua.service_user.dao.*;
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;
@@ -38,6 +57,7 @@
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;
@@ -64,42 +84,6 @@
import com.panzhihua.common.model.vos.grid.admin.GridMemberBuildingVO;
import com.panzhihua.common.model.vos.partybuilding.ActivityManagerVO;
import com.panzhihua.common.model.vos.shop.ShopStoreVO;
import com.panzhihua.common.model.vos.user.AdministratorsUserVO;
import com.panzhihua.common.model.vos.user.ChangePasswordVO;
import com.panzhihua.common.model.vos.user.ComMngFamilyInfoVO;
import com.panzhihua.common.model.vos.user.ComMngUserTagVO;
import com.panzhihua.common.model.vos.user.CommunityUserInfoVO;
import com.panzhihua.common.model.vos.user.MenuRoleVO;
import com.panzhihua.common.model.vos.user.NoticeUnReadVO;
import com.panzhihua.common.model.vos.user.SysOperLogVO;
import com.panzhihua.common.model.vos.user.SysUserAgreementVO;
import com.panzhihua.common.model.vos.user.SysUserFeedbackVO;
import com.panzhihua.common.model.vos.user.SysUserNoticeVO;
import com.panzhihua.common.model.vos.user.SysUserVO;
import com.panzhihua.common.model.vos.user.UpdateUserArchivesVO;
import com.panzhihua.common.model.vos.user.UserArchivesVO;
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.Snowflake;
import com.panzhihua.common.utlis.StringUtils;
import com.panzhihua.common.utlis.WxUtil;
import com.panzhihua.common.utlis.WxXCXTempSend;
import com.panzhihua.service_user.dao.ComActFourMemberDao;
import com.panzhihua.service_user.dao.ComMngFamilyInfoDAO;
import com.panzhihua.service_user.dao.ComMngUserTagDAO;
import com.panzhihua.service_user.dao.EventGridMemberBuildingRelationMapper;
import com.panzhihua.service_user.dao.LcCompareMemberCodeMapper;
import com.panzhihua.service_user.dao.RoleDAO;
import com.panzhihua.service_user.dao.SysMenuDAO;
import com.panzhihua.service_user.dao.SysOperLogDAO;
import com.panzhihua.service_user.dao.SysRoleMenuDAO;
import com.panzhihua.service_user.dao.SysUserAgreementDAO;
import com.panzhihua.service_user.dao.SysUserFeedbackDAO;
import com.panzhihua.service_user.dao.SysUserInputDAO;
import com.panzhihua.service_user.dao.SysUserNoticeDAO;
import com.panzhihua.service_user.dao.SysUserRoleDAO;
import com.panzhihua.service_user.dao.UserDao;
import com.panzhihua.service_user.model.dos.ComActFourMember;
import com.panzhihua.service_user.model.dos.ComMngFamilyInfoDO;
import com.panzhihua.service_user.model.dos.ComMngUserTagDO;
@@ -133,6 +117,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
@@ -167,6 +154,22 @@
    private LcCompareMemberCodeMapper lcCompareMemberCodeMapper;
    @Resource
    private ComActFourMemberDao comActFourMemberDao;
    @Resource
    private SysAppConfigDao sysAppConfigDao;
    @Resource
    private SysTemplateConfigDao sysTemplateConfigDao;
    @Resource
    private ObjectMapper objectMapper;
    private static final Integer ALLCOUNTY=1;
    private static final Integer ALLSTREET=2;
    private static final Integer ALLCOMMUNITY=3;
    private static final Integer BYSTREET=4;
    private static final Integer BYAREA=5;
    private static final String OTHERUSER="其他用户";
    private static final String UPDATEACIDCHECKRECORD="修改排查数据";
    private static final String UPDATEACIDMEMBER="修改防疫工作人员信息";
    private static final String UPDATEACIDRECORD="修改防疫信息数据";
    // @Resource
    // private GridService gridService;
@@ -174,11 +177,11 @@
        // String encode = new BCryptPasswordEncoder().encode("lbsq123456");
        // System.out.println(encode);
        List<Date> dates = new ArrayList<>();
        List<String> dates = new ArrayList<>();
        Date date = new Date();
        for (int i = 6; i >= 0; i--) {
        for (int i = 19; i >= 0; i--) {
            Date date1 = DateUtils.addDays(date, -i);
            dates.add(date1);
            dates.add(DateFormatUtils.format(date1,"MM-dd" ));
        }
        System.out.println(dates);
@@ -271,17 +274,20 @@
     */
    @Override
    public R updateUserWeiXinPhone(Long userId, String purePhoneNumber) {
        SysUserDO sysUserDO = new SysUserDO();
        sysUserDO.setPhone(purePhoneNumber);
        sysUserDO.setUserId(userId);
        userDao.updateMemberRole(purePhoneNumber, purePhoneNumber);
        userDao.updateServiceTeam(purePhoneNumber, purePhoneNumber);
        int i = userDao.updateById(sysUserDO);
        if (i > 0) {
            return R.ok(purePhoneNumber);
        } else {
            return R.fail("维护微信手机号失败");
        SysUserDO sysUserDO=userDao.selectById(userId);
        if(sysUserDO!=null){
            userDao.updateMemberRole(purePhoneNumber, sysUserDO.getPhone());
            userDao.updateServiceTeam(purePhoneNumber, sysUserDO.getPhone());
            sysUserDO.setPhone(purePhoneNumber);
            sysUserDO.setUserId(userId);
            int i = userDao.updateById(sysUserDO);
            if (i > 0) {
                return R.ok(purePhoneNumber);
            } else {
                return R.fail("维护微信手机号失败");
            }
        }
        return R.ok(sysUserDO.getPhone());
    }
    /**
@@ -301,8 +307,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);
@@ -318,7 +329,20 @@
        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);
                String areaName=userDao.selectAreaCodeByStreetId(comActVO.getStreetId());
                if(StringUtils.isNotEmpty(areaName)){
                    loginUserInfoVO.setAreaName(areaName);
                }
                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<>();
@@ -359,6 +383,8 @@
        loginUserInfoVO.setIsCommunityWorker(2);
        loginUserInfoVO.setIsPropertyWorker(2);
        loginUserInfoVO.setIsSocialWorker(2);
        loginUserInfoVO.setIsFmsMember(2);
        loginUserInfoVO.setIsAcidMember(0);
        // 志愿者状态
        String phone = sysUserDO.getPhone();
        Long userCommunityId = sysUserDO.getCommunityId();
@@ -366,6 +392,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)) {
@@ -385,6 +418,39 @@
            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);
            }
            //是否是防疫工作人员
            ComActAcidMemberVO acidMember = userDao.selectAcidMemberByPhone(phone);
            if (nonNull(acidMember)) {
                if(acidMember.getRelationName().equals("panzhihua")||acidMember.getRelationName().equals("西区")||acidMember.getRelationName().equals("东区")||acidMember.getRelationName().equals("仁和区")||acidMember.getRelationName().equals("米易县")||acidMember.getRelationName().equals("盐边县")){
                    loginUserInfoVO.setIsAcidMember(1);
                }
                else {
                    loginUserInfoVO.setIsAcidMember(2);
                }
                loginUserInfoVO.setRelationName(acidMember.getRelationName());
            }
            Integer count=userDao.selectOrgAdmin(phone);
            if(count>0){
                loginUserInfoVO.setIsCheckUnitAdmin(1);
            }
            Long checkUnitId=userDao.selectCheckUnitId(phone);
            if(checkUnitId!=null){
                loginUserInfoVO.setCheckUnitId(checkUnitId);
            }
            else {
                loginUserInfoVO.setIsCheckUnitAdmin(0);
            }
            //是否网格员
            int easyPhotoMember = userDao.countEasyPhotoMember(phone, userCommunityId);
            if (easyPhotoMember > 0) {
                loginUserInfoVO.setIsEasyPhotoMember(1);
            }
            // 是否是"管理员"或者 本社区 "社区团队"、"党委成员"
            Integer countTeam = userDao.selectCountTeam(phone, userCommunityId);
@@ -620,7 +686,7 @@
     * @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);
@@ -679,11 +745,35 @@
        }
        ComActVO comActVO = userDao.selectCommunity(loginUserInfoVO.getCommunityId());
        if (!ObjectUtils.isEmpty(comActVO)) {
            String areaName=userDao.selectAreaCodeByStreetId(comActVO.getStreetId());
            if(StringUtils.isNotEmpty(areaName)){
                loginUserInfoVO.setAreaName(areaName);
            }
            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.setIsAcidMember(0);
        ComActAcidMemberVO acidMember = userDao.selectAcidMemberByPhone(loginUserInfoVO.getPhone());
        if (nonNull(acidMember)) {
            if(acidMember.getRelationName().equals("panzhihua")||acidMember.getRelationName().equals("西区")||acidMember.getRelationName().equals("东区")||acidMember.getRelationName().equals("仁和区")||acidMember.getRelationName().equals("米易县")||acidMember.getRelationName().equals("盐边县")){
                loginUserInfoVO.setIsAcidMember(1);
            }
            else {
                loginUserInfoVO.setIsAcidMember(2);
            }
            loginUserInfoVO.setRelationName(acidMember.getRelationName());
        }
        loginUserInfoVO.setIdCard(SensitiveUtil.desensitizedIdNumber(loginUserInfoVO.getIdCard()));
        loginUserInfoVO.setPhone(SensitiveUtil.desensitizedPhoneNumber(loginUserInfoVO.getPhone()));
        //判断账号类型
@@ -855,7 +945,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("身份证已经存在");
        }
@@ -878,10 +968,11 @@
                // 实名认证成功推送订阅消息给用户
                try {
                    WxXCXTempSend util = new WxXCXTempSend();
                    String accessToken = util.getAppAccessToken();
                    String accessToken = util.getAccessToken();
                    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());
                }
@@ -1067,6 +1158,21 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R addUserBackstage(AdministratorsUserVO administratorsUserVO) {
        ComActVO comActVO = userDao.selectCommunity(administratorsUserVO.getCommunityId());
        if (nonNull(comActVO)) {
            List<ComAreaTownCommunityVO> areaTownList = userDao.selectAreaTownCommunity(comActVO.getName());
            if (!areaTownList.isEmpty()) {
                administratorsUserVO.setRelationName(comActVO.getName());
                String address = comActVO.getAddress();
                if (areaTownList.size() > 1 && isNotBlank(address)) {
                    ComAreaTownCommunityVO townCommunityVO = areaTownList.stream()
                            .filter(e -> address.contains(e.getArea()) && address.contains(e.getTown())).findFirst().orElse(null);
                    if (nonNull(townCommunityVO)) {
                        administratorsUserVO.setRelationName(String.join(",", townCommunityVO.getArea(), townCommunityVO.getTown(), townCommunityVO.getCommunity()));
                    }
                }
            }
        }
        SysUserDO sysUserDO = new SysUserDO();
        Long roleId = administratorsUserVO.getRoleId();
        if (roleId.intValue() == 999999999 || roleId.intValue() == 888888888) {
@@ -1158,31 +1264,6 @@
                throw new ServiceException("手机号已存在");
            }
        }
        if (insert > 0 && sysUserDO.getType() == 3 &&sysUserDO.getStreetId()==null) {// 添加的用户是社区账号时
            // 添加网格综合治理管理后台用户
            SysUserDO sysUserDOWangGe = new SysUserDO();
            BeanUtils.copyProperties(sysUserDO, sysUserDOWangGe);
            sysUserDOWangGe.setUserId(null);
            sysUserDOWangGe.setType(7);// 网格综治后台
            try {
                int addWange = userDao.insert(sysUserDOWangGe);
                if (addWange != 1) {
                    throw new ServiceException("新增网格综合治理管理后台用户失败");
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("网格综合治理管理后台用户报错【{}】", e.getMessage());
                if (e.getMessage().contains("union_phone_type")) {
                    throw new ServiceException("手机号已经存在");
                } else if (e.getMessage().contains("union_account_type")) {
                    throw new ServiceException("账户已经存在");
                }else if(e.getMessage().contains("23000")){
                    throw new ServiceException("手机号已存在");
                }
            }
        }
        if (insert > 0) {
            SysUserDO sysUserDO1 = userDao
@@ -1331,7 +1412,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());
@@ -1419,7 +1500,6 @@
     * @return 删除结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R deleteUserBackstage(AdministratorsUserVO administratorsUserVO) {
        Long userId = administratorsUserVO.getUserId();
        SysUserDO sysUserDO = userDao.selectById(userId);
@@ -1477,6 +1557,17 @@
     */
    @Override
    public R addOperLog(SysOperLogVO operlog) {
        //判断是否需要保存修改前的数据
        final Boolean flag=(operlog.getTitle().equals(UPDATEACIDCHECKRECORD) || operlog.getTitle().equals(UPDATEACIDMEMBER)
                                                      || operlog.getTitle().equals(UPDATEACIDRECORD));
        if (flag){
            //保存数据
            try {
                operlog.setBeforeUpdateData(saveBeforeUpdateData(operlog));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        SysOperLogDO sysOperLogDO = new SysOperLogDO();
        BeanUtils.copyProperties(operlog, sysOperLogDO);
        int insert = sysOperLogDAO.insert(sysOperLogDO);
@@ -1813,9 +1904,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(new Page(1L, 9999L), areaCode).getRecords();
        List<String> communityUserX = new ArrayList<>();
        List<Integer> communityUserY = new ArrayList<>();
@@ -1923,6 +2014,30 @@
                stringRedisTemplate.delete(userKey);
            }
            log.info("新增党员修改用户党员状态成功 身份证号【{}】", idCard);
        }
        return R.ok();
    }
    /**
     * 修改用户的党员状态
     *
     * @param phone
     *            身份证号
     * @return 修改结果
     */
    @Override
    public R updateUserIsPartymemberByPhone(String phone) {
        SysUserDO sysUserDO = userDao.selectOne(
                new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getPhone, phone).eq(SysUserDO::getType, 1));
        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);
            }
            log.info("新增党员修改用户党员状态成功 手机号【{}】", phone);
        }
        return R.ok();
    }
@@ -2097,9 +2212,9 @@
    @Override
    public R getSysUserVOByPhone(String phone) {
        SysUserDO sysUserDO = userDao
            .selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getPhone, phone).eq(SysUserDO::getType, 1));
            .selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getPhone, phone).eq(SysUserDO::getType, 1).orderByDesc(SysUserDO::getCreateAt).last("limit 1"));
        if (ObjectUtils.isEmpty(sysUserDO)) {
            return R.fail("用户不存在");
            return R.fail("账号或密码错误");
        }
        SysUserVO sysUserVO = new SysUserVO();
        BeanUtils.copyProperties(sysUserDO, sysUserVO);
@@ -2134,7 +2249,7 @@
        query.eq(SysUserDO::getType, type);
        SysUserDO sysUserDO = userDao.selectOne(query);
        if (ObjectUtils.isEmpty(sysUserDO)) {
            return R.fail("用户不存在");
            return R.fail("账号或密码错误");
        }
        SysUserVO sysUserVO = new SysUserVO();
        BeanUtils.copyProperties(sysUserDO, sysUserVO);
@@ -2270,7 +2385,7 @@
    /**
     * 修改app用户密码
     *
     *
     * @param userInfoAppDTO
     *            请求参数
     * @return 修改结果
@@ -2302,7 +2417,7 @@
    /**
     * 添加网格员
     *
     *
     * @param eventGridMemberAddDTO
     *            请求参数
     * @return 结果
@@ -2419,7 +2534,7 @@
    /**
     * 网格员管理
     *
     *
     * @param memberRelationDTO
     *            请求参数
     * @return 网格员列表
@@ -2456,7 +2571,7 @@
    /**
     * 修改网格员信息
     *
     *
     * @param gridMemberDTO
     *            请求参数
     * @return 修改结果
@@ -2552,7 +2667,7 @@
    /**
     * 重置网格员密码
     *
     *
     * @param gridMemberDTO
     *            请求参数
     * @return 重置结果
@@ -2570,7 +2685,7 @@
    /**
     * 批量删除网格员
     *
     *
     * @param Ids
     *            网格员id集合
     * @return 删除结果
@@ -2609,7 +2724,7 @@
    /**
     * 查询社区的收益说明
     *
     *
     * @param communityId
     *            社区id
     * @return 收益说明
@@ -2656,7 +2771,7 @@
    /**
     * 根据用户id查询用户openid
     *
     *
     * @param userId
     *            用户id
     * @return openid
@@ -2672,7 +2787,7 @@
    /**
     * 查询社区后台工作人员列表
     *
     *
     * @param communityId
     *            社区id
     * @return 社区后台工作人员列表
@@ -2806,7 +2921,7 @@
        userDao.disableOrEnableMerchantUsers(disableOrEnableConvenientMerchantDTO.getType(), disableOrEnableConvenientMerchantDTO.getUserIds());
        return R.ok();
    }
    /**
     * 根据openid维护社区团队里是否注册
     * @param openid    用户微信唯一标识
@@ -2829,7 +2944,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<>();
@@ -2838,10 +2953,18 @@
        List<Integer> communityActiveUserZ = new ArrayList<>();
        List<DataKanbanDTO> dataKanbanDTOS = null;
        Page page = new Page<>();
        if (nonNull(dataKanBansDto.getPageNum()) && nonNull(dataKanBansDto.getPageSize())) {
            page.setCurrent(dataKanBansDto.getPageNum());
            page.setSize(dataKanBansDto.getPageSize());
        } else {
            page.setCurrent(1L);
            page.setSize(20L);
        }
        if(dataKanBansDto.getType() != null && dataKanBansDto.getType().equals(DataKanBansDto.type.by)){
            dataKanbanDTOS = userDao.selectCommunityUserOrderMonth();
            dataKanbanDTOS = userDao.selectCommunityUserOrderMonth(page, dataKanBansDto.getAreaCode()).getRecords();
        }else{
            dataKanbanDTOS = userDao.selectCommunityUserOrder();
            dataKanbanDTOS = userDao.selectCommunityUserOrder(page, dataKanBansDto.getAreaCode()).getRecords();
        }
        if (!ObjectUtils.isEmpty(dataKanbanDTOS)) {
            dataKanbanDTOS.forEach(dataKanbanDTO -> {
@@ -2854,7 +2977,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());
@@ -2872,11 +2995,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);
@@ -2886,8 +3009,8 @@
    }
    @Override
    public R communityStatisticsExport(){
        return R.ok(userDao.getUserCommunityExcelExport());
    public R communityStatisticsExport(String areaCode){
        return R.ok(userDao.getUserCommunityExcelExport(areaCode));
    }
    /**
@@ -2899,7 +3022,7 @@
    public R getUserInfoByUnionId(String unionId) {
        SysUserDO sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getUnionid, unionId));
        if (isNull(sysUserDO)) {
            return R.fail("用户不存在");
            return R.fail("账号或密码错误");
        }
        LoginUserInfoVO loginUserInfoVO = new LoginUserInfoVO();
        BeanUtils.copyProperties(sysUserDO, loginUserInfoVO);
@@ -2913,4 +3036,699 @@
        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();
    }
    @Override
    public R uuLogin(UuLoginVO uuLoginVO) {
        uuLoginVO.setAppid("10000");
        String timeStamp=PayUtil.create_timestamp();
        uuLoginVO.setTimestamp(timeStamp);
        try {
            uuLoginVO.setSign(PayUtil.MD5(uuLoginVO.getAppid()+"e10adc3949ba59abbe56e057f20f883e"+timeStamp).toLowerCase(Locale.ROOT));
        } catch (Exception e) {
            e.printStackTrace();
        }
        Map<String, String> headerMap=new HashMap<>();
        headerMap.put("appid","10000");
        String resultJson=HttpClientUtil.get("https://api.uucsh.cn/member/wx/get-access?province="+uuLoginVO.getProvince()+"&city="+uuLoginVO.getCity()+"&area="+uuLoginVO.getArea()+"&appid=10000&timestamp="+uuLoginVO.getTimestamp()+"&sign="+uuLoginVO.getSign()+"&mobile="+uuLoginVO.getMobile(),headerMap,null);
        JSONObject result = JSON.parseObject(resultJson);
        if(result.get("status").equals(1)){
            return R.ok(result.get("data"));
        }
        return R.fail("信息错误");
    }
    @Override
    public R checkExport(String account, String password,String oldPassword) {
        if(new BCryptPasswordEncoder().matches(password, oldPassword)){
            return R.ok();
        }
        return R.fail();
    }
    @Override
    public R newIndexData(Integer type, Long streetId,Long areaCode) {
        IndexDataKanbanVO indexDataKanbanVO = userDao.selectIndexDataKanban(null);
        IndexDataAnalysisVO vo=new IndexDataAnalysisVO();
        if (ObjectUtils.isEmpty(type)){
            //不传默认为所有区县
            type=ALLCOUNTY;
        }
        if (type.equals(ALLCOUNTY) || type.equals(ALLCOMMUNITY) || type.equals(ALLSTREET)){
            BeanUtils.copyProperties(indexDataKanbanVO,vo);
        }else {
            IndexDataKanbanVO indexDataVO = userDao.dataKanBanStreet(streetId,areaCode,null);
            BeanUtils.copyProperties(indexDataVO,vo);
        }
//            List<UserProportion> userProportionsTotal = userDao.userAnalysis(type, null, streetId,areaCode);
//            Integer streetUser = userDao.streetUserCount(streetId,areaCode);
//            for (UserProportion userProportion : userProportionsTotal) {
//                if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(userProportion)){
//                    if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(userProportion.getUser())){
//                        //计算占比
//                        //userProportion.setAreaCode(null);
//                        if (type.equals(BYSTREET)){
//                            userProportion.setRate(getRate(streetUser,userProportion.getUser()));
//                        }
//                        userProportion.setRate(getRate(vo.getAllUser(),userProportion.getUser()));
//                    }
//                }
//            }
//            List<UserProportion> userProportionsMonth = userDao.userAnalysis(type, DateUtil.beginOfMonth(new Date()).toString(), streetId,areaCode);
//            for (UserProportion userProportion : userProportionsMonth) {
//                if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(userProportion)){
//                    if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(userProportion.getUser())){
//                        //计算占比
//                        //userProportion.setAreaCode(null);
//                        if (type.equals(BYSTREET)){
//                            userProportion.setRate(getRate(streetUser,userProportion.getUser()));
//                        }
//                        userProportion.setRate(getRate(vo.getAllUser(),userProportion.getUser()));
//                    }
//                }
//            }
//            vo.setUserProportionTotal(userProportionsTotal);
//            vo.setUserProportionMonth(userProportionsMonth);
//            List<RealUser> realUsersTotal = userDao.realUserCount(type, null, streetId,areaCode);
//            List<RealUser> realUsersMonth = userDao.realUserCount(type, DateUtil.beginOfMonth(new Date()).toString(), streetId,areaCode);
//            vo.setRealUsersTotal(realUsersTotal);
//            vo.setRealUsersMonth(realUsersMonth);
//            vo.setRealUser(getStreetRealUser(realUsersTotal));
//            vo.setRealUserRate(getRate(vo.getAllUser(),vo.getRealUser()));
//            List<Date> twentyDays = getTwentyDays();
//            List<Date> monthTwentyDays = getMonthTwentyDays();
//            vo.setUserActivityXAll(getMAndD(getTwentyDays()));
//            vo.setUserActivityXMonth(getMAndD(getMonthTwentyDays()));
//            List<String> addUserYAll=new ArrayList<>();
//            List<String> addUserYMonth=new ArrayList<>();
//            List<String> activeUserYAll=new ArrayList<>();
//            List<String> activeUserYMonth=new ArrayList<>();
//            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//            //获取用户行为Y轴
//            for (Date date : twentyDays) {
//                //查询当天的新增和日活
//                Map<String, Long> map = userDao.getDailyAddAndActive(DateUtil.parse(sdf.format(date)), streetId,areaCode);
//                addUserYAll.add(map.get("addUser").toString());
//                activeUserYAll.add(map.get("activeUser").toString());
//            }
//            for (Date date : monthTwentyDays) {
//                Map<String, Long> map = userDao.getDailyAddAndActive(DateUtil.parse(sdf.format(date)), streetId,areaCode);
//                addUserYMonth.add(map.get("addUser").toString());
//                activeUserYMonth.add(map.get("activeUser").toString());
//            }
//            vo.setAddUserYAll(addUserYAll);
//            vo.setAddUserYWeek(addUserYMonth);
//            vo.setActiveUserYAll(activeUserYAll);
//            vo.setActiveUserYMonth(activeUserYMonth);
//            if (type.equals(BYSTREET) || type.equals(ALLCOMMUNITY) || type.equals(ALLSTREET)){
//                //获取其他用户
//                vo.setOtherUser(indexDataKanbanVO.getAllUser()-countUser(vo.getUserProportionTotal()));
//                vo.setOtherUserRate(getRate(indexDataKanbanVO.getAllUser(),vo.getOtherUser()));
//            }
        return R.ok(vo);
    }
    @Override
    public R userRate(Integer type, Long streetId, Long areaCode, Integer range) {
        IndexDataAnalysisVO analysisVO=new IndexDataAnalysisVO();
        if (type.equals(BYSTREET) || type.equals(BYAREA)){
            //街道,区县筛选
            IndexDataKanbanVO indexDataVO = userDao.dataKanBanStreet(streetId,areaCode,null);
            BeanUtils.copyProperties(indexDataVO,analysisVO );
        }else {
            //总量数据
            IndexDataKanbanVO indexDataKanbanVO = userDao.selectIndexDataKanban(null);
            BeanUtils.copyProperties(indexDataKanbanVO,analysisVO );
        }
        String date="";
        if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(range)){
            if (range.equals(1)){
                DateTime dateTime = DateUtil.beginOfMonth(new Date());
                date = DateUtil.parse(dateTime.toString(), "yyyy-MM-dd HH:mm:ss").toString();
            }
        }
        List<UserProportion> userProportions = userDao.userAnalysis(type, date, streetId,areaCode);
        List<UserRateAnalysisVO> userRateAnalysisVOList=new ArrayList<>();
        final Boolean monthRange=range.equals(1);
        if (userProportions.size()>0){
            for (UserProportion userProportion : userProportions) {
                if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(userProportion)){
                    UserRateAnalysisVO vo=new UserRateAnalysisVO();
                    vo.setName(typeToName(type,userProportion ));
                    if (monthRange){
                        //获取本月的用户总数作为计算占比的用户总数
                        IndexDataKanbanVO data = userDao.dataKanBanStreet(streetId, areaCode, date);
                        vo.setRate(getRate(data.getAllUser(),userProportion.getUser()));
                    }else{
                        vo.setRate(getRate(analysisVO.getAllUser(),userProportion.getUser()));
                    }
                    vo.setCount(userProportion.getUser());
                    userRateAnalysisVOList.add(vo);
                }
            }
        }
        //计算其他用户占比
        final Boolean flag=(type.equals(ALLSTREET) || type.equals(ALLCOMMUNITY) || type.equals(BYSTREET) || type.equals(BYAREA));
        if (flag){
            UserRateAnalysisVO vo=new UserRateAnalysisVO();
            vo.setName(OTHERUSER);
            vo.setCount(analysisVO.getAllUser()-countUser(userRateAnalysisVOList));
            vo.setRate(getRate(analysisVO.getAllUser(), vo.getCount()));
            userRateAnalysisVOList.add(vo);
        }
        UserRateVO userRate=new UserRateVO();
        userRate.setUserList(userRateAnalysisVOList);
        return R.ok(userRate);
    }
    @Override
    public R realUser(Integer type, Long streetId, Long areaCode, Integer range) {
        IndexDataAnalysisVO analysisVO=new IndexDataAnalysisVO();
        if (type.equals(BYSTREET) || type.equals(BYAREA)){
            //街道,区县筛选
            IndexDataKanbanVO indexDataVO = userDao.dataKanBanStreet(streetId,areaCode,null);
            BeanUtils.copyProperties(indexDataVO,analysisVO );
        }else {
            //总量数据
            IndexDataKanbanVO indexDataKanbanVO = userDao.selectIndexDataKanban(null);
            BeanUtils.copyProperties(indexDataKanbanVO,analysisVO );
        }
        String date="";
        if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(range)){
            if (range.equals(1)){
                DateTime dateTime = DateUtil.beginOfMonth(new Date());
                date = DateUtil.parse(dateTime.toString(), "yyyy-MM-dd HH:mm:ss").toString();
            }
        }
        RealUserVO realUserVO=new RealUserVO();
        List<RealUser> realUsers = userDao.realUserCount(type, date, streetId, areaCode);
        List<RealUserAnalysisVO> realUserList=new ArrayList<>();
        realUserVO.setRealUserCount(getStreetRealUser(realUsers));
        realUserVO.setRealUserRate(NumberUtil.div(realUserVO.getRealUserCount(), analysisVO.getAllUser()).doubleValue());
        for (RealUser realUser : realUsers) {
            RealUserAnalysisVO vo=new RealUserAnalysisVO();
            vo.setCount(realUser.getCount());
            vo.setName(typeToNameRealUser(type, realUser));
            realUserList.add(vo);
        }
        realUserVO.setRealUserList(realUserList);
        return R.ok(realUserVO);
    }
    @Override
    public R userActivity(Integer type, Long streetId, Long areaCode, Integer range) {
        UserActivityAnalysisVO vo=new UserActivityAnalysisVO();
        List<Date> activeX=getTwentyDays();
        List<String> activeY=new ArrayList<>();
        List<String> adY=new ArrayList<>();
        if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(range)){
            if (range.equals(1)){
                //本月数据
                activeX = getMonthTwentyDays();
            }
        }
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        for (Date date : activeX) {
            Map<String, Long> map = userDao.getDailyAddAndActive(DateUtil.parse(sdf.format(date)), streetId,areaCode);
            adY.add(map.get("addUser").toString());
            activeY.add(map.get("activeUser").toString());
        }
        vo.setUserX(getMAndD(activeX));
        vo.setAddUserY(adY);
        vo.setActiveUserY(activeY);
        return R.ok(vo);
    }
    @Override
    public R getAreaAndStreet() {
        List<Integer> areaCodeList=areaCodeList();
        List<AreaVO> areaVOList=new ArrayList<>();
        for (Integer code : areaCodeList) {
            AreaVO vo=new AreaVO();
            vo.setId(code);
            vo.setName(areaCodeToName(code.longValue()));
            vo.setStreetList(userDao.selectStreetByAreaCode(code));
            areaVOList.add(vo);
        }
        return R.ok(areaVOList);
    }
    /**
     * 获取最近20天数据
     *
     * @return
     */
    private List<Date> getTwentyDays() {
        List<Date> dates = new ArrayList<>();
        Date date = new Date();
        for (int i = 19; i >= 0; i--) {
            Date date1 = DateUtils.addDays(date, -i);
            dates.add(date1);
        }
        return dates;
    }
    /**
     * 获取最近本月20天数据
     *
     * @return
     */
    private List<Date> getMonthTwentyDays() {
        List<Date> dates = new ArrayList<>();
        Date date = new Date();
        Long offset = DateUtil.between(new Date(), DateUtil.beginOfMonth(date), DateUnit.DAY);
        if (offset>=20){
            for (int i = 19; i >= 0; i--) {
                Date date1 = DateUtils.addDays(date, -i);
                dates.add(date1);
            }
        }else{
            //距离月初不足20天
            for (int i = offset.intValue(); i >= 0; i--) {
                Date date1 = DateUtils.addDays(date, -i);
                dates.add(date1);
            }
        }
        return dates;
    }
    /**
     * 计算占比
     * */
    private Integer getRate(Integer total,Integer count){
        if (0 != total && null != total){
            if (0 != count && null != count){
                BigDecimal div = NumberUtil.div(count.toString(), total.toString(),2);
                BigDecimal mul = NumberUtil.mul(div, 100);
                return mul.intValue();
            }
        }
        return null;
    }
    /**
     * 计算街道实名用户总数
     * */
    private Integer getStreetRealUser(List<RealUser> list){
        Integer count=0;
        if (list.size()>0){
            for (RealUser realUser : list) {
                if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(realUser)){
                    if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(realUser.getCount())){
                        count+=realUser.getCount();
                    }
                }
            }
        }
        return count;
    }
    /**
     * 计算当前统计范围内的所有用户数
     * */
    public Integer countUser(List<UserRateAnalysisVO> list){
        Integer count=0;
        if (list.size()>0){
            for (UserRateAnalysisVO proportion : list) {
                if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(proportion)){
                    if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(proportion.getCount())){
                        count+=proportion.getCount();
                    }
                }
            }
        }
        return count;
    }
    /**
     * 截取月,日
     * */
    public List<String> getMAndD(List<Date> list){
        List<String> dateList=new ArrayList<>();
        if (list.size()>0){
            for (Date date : list) {
                dateList.add(DateFormatUtils.format(date,"MM-dd" ));
            }
        }
        return dateList;
    }
    /**
     * areaCode转区县名
     * */
    private  String areaCodeToName(Long areaCode){
        String code = areaCode.toString();
        String name="不正确的areaCode";
        switch (code){
            case "510423" :
                name= "西区";
                break;
            case "510402":
                name="东区";
            case "510411":
                name="仁和区";
                break;
            case "510421":
                name="米易县";
                break;
            case "510422":
                name="盐边县";
                break;
        }
        return name;
    }
    /**
     *根据type选择要设置的名称
     * */
    private String typeToName(Integer type,UserProportion proportion){
        String name="";
        if (type.equals(ALLCOUNTY)){
            name=areaCodeToName(proportion.getAreaCode());
        }else if(type.equals(ALLSTREET) || type.equals(BYAREA)){
            name=proportion.getStreetName();
        }else if (type.equals(ALLCOMMUNITY) || type.equals(BYSTREET)){
            name=proportion.getCommunityName();
        }
        return name;
    }
    /**
     *根据type选择要设置的名称
     * */
    private String typeToNameRealUser(Integer type,RealUser proportion){
        String name="";
        if (type.equals(ALLCOUNTY)){
            name=areaCodeToName(Long.parseLong(proportion.getAreaCode()));
        }else if(type.equals(ALLSTREET) || type.equals(BYAREA)){
            name=proportion.getStreetName();
        }else if (type.equals(ALLCOMMUNITY) || type.equals(BYSTREET)){
            name=proportion.getCommunityName();
        }
        return name;
    }
    /**
     * 生成区县code列表
     * */
    private List<Integer> areaCodeList(){
        List<Integer> list=new ArrayList<>();
        list.add(510423);
        list.add(510402);
        list.add(510411);
        list.add(510421);
        list.add(510422);
        return list;
    }
    /**
     * 根据日志保存修改之前的信息
     * */
    private String saveBeforeUpdateData(SysOperLogVO operlog) throws JsonProcessingException {
        if (operlog.getTitle().equals(UPDATEACIDCHECKRECORD)){
            //
            ComActAcidCheckRecordVO comActAcidCheckRecordVO = objectMapper.readValue(operlog.getOperParam(), ComActAcidCheckRecordVO.class);
            ComActAcidCheckRecordVO comActAcidCheckRecordVO1 = userDao.selectComActAcidCheckRecordById(comActAcidCheckRecordVO.getId());
            return JSONObject.toJSONString(comActAcidCheckRecordVO1);
        }else if (operlog.getTitle().equals(UPDATEACIDRECORD)){
            ComActAcidRecordVO comActAcidRecordVO = objectMapper.readValue(operlog.getOperParam(), ComActAcidRecordVO.class);
            return JSONObject.toJSONString(userDao.selectComActAcidRecord(comActAcidRecordVO.getId()));
        }else if(operlog.getTitle().equals(UPDATEACIDMEMBER)){
            ComActAcidMemberVO comActAcidMemberVO = objectMapper.readValue(operlog.getOperParam(), ComActAcidMemberVO.class);
            return JSONObject.toJSONString(userDao.selectComActAcidMember(comActAcidMemberVO.getId()));
        }
        return null;
    }
}