101captain
2022-08-09 e8fd15536978e831f90d9709f98c33c12e33893e
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.capitalize;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.math.BigDecimal;
@@ -12,15 +13,23 @@
import javax.annotation.Resource;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ArrayUtil;
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.*;
@@ -35,6 +44,7 @@
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -99,6 +109,7 @@
import cn.hutool.core.util.IdcardUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestParam;
// import com.panzhihua.common.service.grid.GridService;
@@ -152,10 +163,17 @@
    private SysAppConfigDao sysAppConfigDao;
    @Resource
    private SysTemplateConfigDao sysTemplateConfigDao;
    public static final Integer ALLCOUNTY=1;
    public static final Integer ALLSTREET=2;
    public static final Integer ALLCOMMUNITY=3;
    public static final Integer BYSTREET=4;
    @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;
@@ -164,11 +182,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);
@@ -287,7 +305,7 @@
     * @return 用户基本信息、角色
     */
    @Override
    public R<LoginUserInfoVO> getUserInfo(String name, int type) {
    public R<LoginUserInfoVO> getUserInfo(String name, int type,String appId) {
        SysUserDO sysUserDO = null;
        if (1 == type) {
            sysUserDO = userDao.selectOne(
@@ -296,9 +314,9 @@
            LambdaQueryWrapper<SysUserDO> wrapper = new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getType, type);
            if (type == 11) {
                //只允许通过account登录
                wrapper.and(sysUserDOLambdaQueryWrapper -> sysUserDOLambdaQueryWrapper.eq(SysUserDO::getAccount, name));
                wrapper.and(sysUserDOLambdaQueryWrapper -> sysUserDOLambdaQueryWrapper.eq(SysUserDO::getAccount, name).eq(SysUserDO::getAppId,appId));
            } else {
                wrapper.and(sysUserDOLambdaQueryWrapper -> sysUserDOLambdaQueryWrapper.eq(SysUserDO::getAccount, name).or()
                wrapper.and(sysUserDOLambdaQueryWrapper -> sysUserDOLambdaQueryWrapper.eq(SysUserDO::getAppId,appId).eq(SysUserDO::getAccount, name).or()
                        .eq(SysUserDO::getPhone, name));
            }
            sysUserDO = userDao.selectOne(wrapper);
@@ -324,11 +342,11 @@
                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());
                }
//                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());
@@ -675,12 +693,10 @@
    @Override
    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));
@@ -693,43 +709,6 @@
                });
                loginUserInfoVO.setComMngFamilyInfoVOS(comMngFamilyInfoVOS);
            }
        } else {
            // 导入社区人员
            SysUserInputDO sysUserInputDO = sysUserInputDAO.selectById(userId - 100000000);
            if (ObjectUtils.isEmpty(sysUserInputDO)) {
                return R.fail("人员不存在");
            }
            String name1 = sysUserInputDO.getName();
            BeanUtils.copyProperties(sysUserInputDO, loginUserInfoVO);
            String doorNumber = sysUserInputDO.getDoorNumber();
            Long areaId = sysUserInputDO.getAreaId();
            List<SysUserInputDO> sysUserInputDOS = sysUserInputDAO.selectList(new QueryWrapper<SysUserInputDO>()
                .lambda().eq(SysUserInputDO::getDoorNumber, doorNumber).eq(SysUserInputDO::getAreaId, areaId));
            if (!ObjectUtils.isEmpty(sysUserInputDOS)) {
                List<ComMngFamilyInfoVO> comMngFamilyInfoVOS = new ArrayList<>();
                sysUserInputDOS.forEach(sysUserInputDO1 -> {
                    String name = sysUserInputDO1.getName();
                    if (name1.equals(name)) {
                        return;
                    }
                    Integer isRent = sysUserInputDO1.getIsRent();
                    ComMngFamilyInfoVO comMngFamilyInfoVO = new ComMngFamilyInfoVO();
                    comMngFamilyInfoVO.setIdCard(SensitiveUtil.desensitizedIdNumber(sysUserInputDO1.getIdCard()));
                    comMngFamilyInfoVO.setName(name);
                    comMngFamilyInfoVO.setPhone(SensitiveUtil.desensitizedPhoneNumber(sysUserInputDO1.getPhone()));
                    if (isRent.intValue() == 0) {
                        comMngFamilyInfoVO.setRelationship("家人");
                    } else {
                        comMngFamilyInfoVO.setRelationship("合租");
                    }
                    comMngFamilyInfoVO.setAge(IdCard.IdNOToAge(sysUserInputDO1.getIdCard()));
                    comMngFamilyInfoVOS.add(comMngFamilyInfoVO);
                });
                loginUserInfoVO.setComMngFamilyInfoVOS(comMngFamilyInfoVOS);
            }
        }
        ComActVO comActVO = userDao.selectCommunity(loginUserInfoVO.getCommunityId());
        if (!ObjectUtils.isEmpty(comActVO)) {
            String areaName=userDao.selectAreaCodeByStreetId(comActVO.getStreetId());
@@ -1544,6 +1523,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);
@@ -1729,9 +1719,9 @@
     * @return 协议内容
     */
    @Override
    public R userAgreement(int type) {
    public R userAgreement(int type,String appId) {
        SysUserAgreementDO sysUserAgreementDO = sysUserAgreementDAO
            .selectOne(new QueryWrapper<SysUserAgreementDO>().lambda().eq(SysUserAgreementDO::getType, type));
            .selectOne(new QueryWrapper<SysUserAgreementDO>().lambda().eq(SysUserAgreementDO::getType, type).eq(SysUserAgreementDO::getAppId,appId));
        return R.ok(sysUserAgreementDO);
    }
@@ -2050,9 +2040,9 @@
     * @return 协议内容
     */
    @Override
    public R agreement(Integer type) {
    public R agreement(Integer type,String appId) {
        SysUserAgreementDO sysUserAgreementDO = sysUserAgreementDAO
            .selectOne(new QueryWrapper<SysUserAgreementDO>().lambda().eq(SysUserAgreementDO::getType, type));
            .selectOne(new QueryWrapper<SysUserAgreementDO>().lambda().eq(SysUserAgreementDO::getType, type).eq(SysUserAgreementDO::getAppId,appId));
        if (ObjectUtils.isEmpty(sysUserAgreementDO)) {
            return R.fail("协议不存在");
        }
@@ -3309,7 +3299,7 @@
    }
    @Override
    public R newIndexData(Integer type, Long streetId) {
    public R newIndexData(Integer type, Long streetId,Long areaCode) {
        IndexDataKanbanVO indexDataKanbanVO = userDao.selectIndexDataKanban(null);
        IndexDataAnalysisVO vo=new IndexDataAnalysisVO();
        if (ObjectUtils.isEmpty(type)){
@@ -3319,77 +3309,227 @@
        if (type.equals(ALLCOUNTY) || type.equals(ALLCOMMUNITY) || type.equals(ALLSTREET)){
            BeanUtils.copyProperties(indexDataKanbanVO,vo);
        }else {
            IndexDataKanbanVO indexDataVO = userDao.dataKanBanStreet(streetId);
            IndexDataKanbanVO indexDataVO = userDao.dataKanBanStreet(streetId,areaCode,null);
            BeanUtils.copyProperties(indexDataVO,vo);
        }
            List<UserProportion> userProportionsTotal = userDao.userAnalysis(type, null, streetId);
            Integer streetUser = userDao.streetUserCount(streetId);
            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);
            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);
            List<RealUser> realUsersMonth = userDao.realUserCount(type, DateUtil.beginOfMonth(new Date()).toString(), streetId);
            vo.setRealUsersTotal(realUsersTotal);
            vo.setRealUsersMonth(realUsersMonth);
            vo.setRealUser(getStreetRealUser(realUsersTotal));
            vo.setRealUserRate(getRate(vo.getAllUser(),vo.getRealUser()));
        List<Date> twentyDays = getTwentyDays();
        SimpleDateFormat sdf1=new SimpleDateFormat("MM");
        for (Date twentyDay : twentyDays) {
            sdf1.format(twentyDay);
//            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 );
        }
        vo.setUserActivityXAll(getTwentyDays());
            vo.setUserActivityXMonth(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 : vo.getUserActivityXAll()) {
                //查询当天的新增和日活
                Map<String, Long> map = userDao.getDailyAddAndActive(DateUtil.parse(sdf.format(date)), streetId);
                addUserYAll.add(map.get("addUser").toString());
                activeUserYAll.add(map.get("activeUser").toString());
        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();
            }
            for (Date date : vo.getUserActivityXMonth()) {
                Map<String, Long> map = userDao.getDailyAddAndActive(DateUtil.parse(sdf.format(date)), streetId);
                addUserYMonth.add(map.get("addUser").toString());
                activeUserYMonth.add(map.get("activeUser").toString());
        }
        List<UserProportion> userProportions = userDao.userAnalysis(type, date, streetId,areaCode);
        List<UserRateAnalysisVO> userRateAnalysisVOList=new ArrayList<>();
        Boolean monthRange=false;
        if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(range)){
            if (range.equals(1)){
                monthRange=true;
            }
            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()));
        }
        if (userProportions.size()>0){
            for (UserProportion userProportion : userProportions) {
                if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(userProportion)){
                    UserRateAnalysisVO vo=new UserRateAnalysisVO();
                    if (monthRange){
                        if (userProportion.getCommunityId().equals("11")){
                            continue;
                        }
                        //获取本月的用户总数作为计算占比的用户总数
                        //IndexDataKanbanVO data = userDao.dataKanBanStreet(streetId, areaCode, date);
                        Integer monthUsers = userDao.getMonthUsers(streetId, areaCode, date);
                        vo.setRate(getRate(monthUsers,userProportion.getUser()));
                    }else{
                        vo.setRate(getRate(analysisVO.getAllUser(),userProportion.getUser()));
                    }
                    vo.setName(typeToName(type,userProportion ));
                    vo.setCount(userProportion.getUser());
                    userRateAnalysisVOList.add(vo);
                }
            }
        }
        if (ObjectUtils.isEmpty(range)){
            //查看累计数据时才计算其他用户的比例 || type.equals(BYSTREET) || type.equals(BYAREA))
            final Boolean flag=(type.equals(ALLSTREET) || type.equals(ALLCOMMUNITY));
            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));
        Integer rate = getRate(analysisVO.getAllUser(), realUserVO.getRealUserCount());
        if (null == rate){
            realUserVO.setRealUserRate(0.0);
        }else{
            realUserVO.setRealUserRate(rate.doubleValue());
        }
        for (RealUser realUser : realUsers) {
            if (!(type.equals(ALLCOUNTY))){
                if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(realUser)){
                    if (realUser.getCommunityId().equals("11")){
                        continue;
                    }
                }
            }
            RealUserAnalysisVO vo=new RealUserAnalysisVO();
            vo.setCount(realUser.getCount());
            vo.setName(typeToNameRealUser(type, realUser));
            realUserList.add(vo);
        }
        realUserVO.setRealUserList(realUserList);
        //使用索引迭代避免从列表移除数据后出现空指针异常
        if (type.equals(BYSTREET) || type.equals(ALLCOMMUNITY)){
            for (int i = 0; i < realUserList.size() ; i++) {
                RealUserAnalysisVO realUserAnalysisVO = realUserList.get(i);
                if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(realUserAnalysisVO)){
                    if (StringUtils.isNotEmpty(realUserAnalysisVO.getName())){
                        if (realUserAnalysisVO.getName().equals("请选择社区")){
                            realUserList.remove(i);
                        }
                    }
                }
            }
        }else {
            //只保留十条
            if (realUserList.size()>=11){
                realUserList.remove(10);
            }
        }
        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);
    }
@@ -3399,26 +3539,148 @@
            SysUserDO sysUserDO=userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getPhone,phone).orderByDesc(SysUserDO::getCreateAt).last("limit 1"));
            if(sysUserDO!=null&&StringUtils.isNotEmpty(sysUserDO.getOpenid())){
                String status="";
                switch (orderStatus){
                    case 2 : status="等待分配车美";break;
                    case 3 : status="已分配车美";break;
                    case 4 : status="车美已开始服务";break;
                    case 5 : status="车美已结束服务";break;
                    case 6 : status="订单确认完成";break;
                    case 9 : status="订单已取消";break;
                }
                String accessToken="";
                WxXCXTempSend util = new WxXCXTempSend();
                try {
                    String accessToken = util.getAccessToken();
                    WxUtil.sendUuWash(sysUserDO.getOpenid(),accessToken,status,washName,washPhone,phone,"Eft5ksvsnOQANy2uNOGY43CC3pb33eDGA_lgCEoxuiw");
                    accessToken = util.getAccessToken();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                switch (orderStatus){
                    case 3 : status="已分配车美";
                        WxUtil.sendUuWash3(sysUserDO.getOpenid(),accessToken,status,washName,washPhone,phone,"sU18zbyzxFldHAdOREaQCR5uq_uMvCKTmGtklO1xw-w");
                    break;
                    case 4 : status="车美已开始服务";
                        WxUtil.sendUuWash4(sysUserDO.getOpenid(),accessToken,status,washName,washPhone,phone,"Eft5ksvsnOQANy2uNOGY43CC3pb33eDGA_lgCEoxuiw");
                    break;
                    case 6 : status="订单确认完成";
                        WxUtil.sendUuWash6(sysUserDO.getOpenid(),accessToken,status,washName,washPhone,phone,"k1aV97H3pDNNcNcDTeZBD9jQemNDADnRE801HhTXweI");
                    break;
                    case 9 : status="订单已取消";
                        WxUtil.sendUuWash(sysUserDO.getOpenid(),accessToken,status,washName,washPhone,phone,"9_2FhQPDxZoUqmAuIZ1L1zjjYXokdNvu7A0gzKfvruI");
                    break;
                }
            }
        }
        return R.ok();
    }
    @Override
    public R getCommunityList(String name,Long id) {
        //区级账号名
        String[] streetList={"bingcaogangjiedao","donghuajiedao","nongnongpingjiedao","dadukoujiedaojiedao","guazipingjiedao",
        "yinjiangzhen","qingxiangpingjiedao","yuquanjiedao","hemenkoujiedao","dabaodingjiedao","taojiadujiedao","gelipinzhen","dahezhonglujiedao",
        "jingjiangzhen","renhezhen","pingdizhen","datianzhen","tongdezhen","futianzhen","qianjinzhen","panlianzhen","binguzhen","baimazhen",
        "salianzhen","puweizhen","deshizhen","wanqiuyizuxiang","caochangzhen","xinshanlisuzuxiang","tongzilinzhen","yongxingzhen","yumenzhen",
        "honggezhen","hongguoyizuxiang"};
        List<Integer> ids = userDao.selectIdsByAccount(streetList);
        //村或社区账号
        Integer type=isVilliage(name);
        //是否为市级账号
        Boolean cityAccount = isCityAccount(name);
        if (cityAccount){
            List<Integer> areaList=areaCodeList();
            List<AreaVOS> areaVOList=new ArrayList<>();
            for (Integer code : areaList) {
                AreaVOS areaVO=new AreaVOS();
                areaVO.setId(code);
                areaVO.setName(areaCodeToName(code.longValue()));
                List<StreetVOS> streetVOS = userDao.selectStreetByAreaCode(code);
                Iterator<StreetVOS> iterator = streetVOS.listIterator();
                while (iterator.hasNext()){
                    StreetVOS vo = iterator.next();
                    List<CommunityVO> communityVOS = userDao.selectCommunityByStreetId(vo.getId(), type);
                    vo.setChildList(communityVOS);
                    if (type!=3){
                        if (communityVOS==null || communityVOS.size()==0){
                            iterator.remove();
                        }
                    }
                }
                areaVO.setChildList(streetVOS);
                areaVOList.add(areaVO);
            }
            return R.ok(areaVOList);
        }else{
            Boolean areaAccount = isAreaAccount(name);
            if (areaAccount){
                Integer areaCode = accountToCode(name);
                List<Integer> areaList=new ArrayList<>();
                areaList.add(areaCode);
                List<AreaVOS> areaVOList=new ArrayList<>();
                for (Integer code : areaList) {
                    AreaVOS areaVO=new AreaVOS();
                    areaVO.setId(code);
                    areaVO.setName(areaCodeToName(code.longValue()));
                    List<StreetVOS> streetVOS = userDao.selectStreetByAreaCode(code);
                    Iterator<StreetVOS> iterator = streetVOS.listIterator();
                    while (iterator.hasNext()){
                        StreetVOS vo = iterator.next();
                        List<CommunityVO> communityVOS = userDao.selectCommunityByStreetId(vo.getId(), type);
                        vo.setChildList(communityVOS);
                    }
                    areaVO.setChildList(streetVOS);
                    areaVOList.add(areaVO);
                }
                return R.ok(areaVOList);
            }else{
                //非区县账号,只看街道下属社区
                if (ArrayUtil.contains(streetList, name)){
                    List<StreetVOS> list=new ArrayList<>();
                    //只看当前街道下属社区
                    StreetVOS streetVOS = userDao.selectStreetByName(name);
                    List<CommunityVO> communityVOS = userDao.selectCommunityByStreetName(name);
                    if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(streetVOS)) {
                        streetVOS.setChildList(communityVOS);
                    }
                    list.add(streetVOS);
                    return R.ok(list);
                }
            }
        }
        return R.ok(null);
    }
    @Override
    public R resetPassword(Integer type, String account) {
        SysUserDO sysUserDO=userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getAccount,account).eq(SysUserDO::getType,type));
        if(sysUserDO!=null){
            sysUserDO.setPassword("$2a$10$F/2lE2NMhKNHJfi5.FLmfu7jIr7ImRWgCTTeO6m3IRNR2V4sv8YR.");
            userDao.updateById(sysUserDO);
        }
        return R.ok();
    }
    @Override
    public R tfLogin(UuLoginVO uuLoginVO) {
        SysUserDO sysUserDO=userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getPhone,uuLoginVO.getMobile()).eq(SysUserDO::getType,16));
        if(sysUserDO==null){
            sysUserDO=new SysUserDO();
            sysUserDO.setPassword("$2a$10$F/2lE2NMhKNHJfi5.FLmfu7jIr7ImRWgCTTeO6m3IRNR2V4sv8YR.");
            sysUserDO.setType(16);
            sysUserDO.setStatus(1);
            sysUserDO.setPhone(uuLoginVO.getMobile());
            sysUserDO.setAccount(uuLoginVO.getMobile());
            sysUserDO.setAppId("wx0cef797390444b75");
            userDao.insert(sysUserDO);
        }
        return R.ok();
    }
    @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.selectStreetsByAreaCode(code));
            areaVOList.add(vo);
        }
        return R.ok(areaVOList);
    }
    /**
     * 获取最近20天数据
@@ -3463,11 +3725,12 @@
    /**
     * 计算占比
     * */
    private Double getRate(Integer total,Integer count){
    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);
                return div.doubleValue();
                BigDecimal mul = NumberUtil.mul(div, 100);
                return mul.intValue();
            }
        }
        return null;
@@ -3494,13 +3757,13 @@
    /**
     * 计算当前统计范围内的所有用户数
     * */
    public Integer countUser(List<UserProportion> list){
    public Integer countUser(List<UserRateAnalysisVO> list){
        Integer count=0;
        if (list.size()>0){
            for (UserProportion proportion : list) {
            for (UserRateAnalysisVO proportion : list) {
                if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(proportion)){
                    if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(proportion.getUser())){
                        count+=proportion.getUser();
                    if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(proportion.getCount())){
                        count+=proportion.getCount();
                    }
                }
            }
@@ -3508,4 +3771,180 @@
        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="东区";
                break;
            case "510411":
                name="仁和区";
                break;
            case "510421":
                name="米易县";
                break;
            case "510422":
                name="盐边县";
                break;
            case "510424":
                name="钒钛新区";
                break;
        }
        return name;
    }
    /**
     *根据type选择要设置的名称
     * */
    private String typeToName(Integer type,UserProportion proportion){
        log.info("当前code"+proportion.getAreaCode());
        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(510402);
        list.add(510423);
        list.add(510411);
        list.add(510421);
        list.add(510422);
        list.add(510424);
        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;
    }
    /**
     * 是否需要区分村落/社区
     * */
    private Integer isVilliage(String name){
        if ("fangyipingtai".equals(name)){
            return 3;
        }else if ("pandashujuzhongxin".equals(name)){
            return 1;
        }else if ("pannongyenongcunju".equals(name)){
            return 2;
        }
        return 3;
    }
    /**
     * 是否为市级账号
     * */
    private Boolean isCityAccount(String name){
        if(("fangyipingtai").equals(name) || ("pandashujuzhongxin").equals(name) || ("pannongyenongcunju").equals(name)){
            return true;
        }
        return false;
    }
    /**
     * 是否为区级账号
     * */
    private Boolean isAreaAccount(String name){
        Boolean flag=false;
        switch (name){
            case "dongqu":
            case "xiqu":
            case "renhequ":
            case "miyixian":
            case "yanbianxian":
                flag=true;
                break;
        }
        return flag;
    }
    /**
     * account转区areaCode
     * */
    private  Integer accountToCode(String code){
        String name="100000";
        switch (code){
            case "xiqu" :
                name= "510423";
                break;
            case "dongqu":
                name="510402";
                break;
            case "renhequ":
                name="510411";
                break;
            case "miyixian":
                name="510421";
                break;
            case "yanbianxian":
                name="510422";
                break;
            case "fantaixinqu":
                name="510424";
                break;
        }
        return Integer.parseInt(name);
    }
}