101captain
2022-01-24 088db509965dd9ec1346992f4d80f855f9634b48
springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/service/impl/UserServiceImpl.java
@@ -16,8 +16,14 @@
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import com.alibaba.fastjson.JSONObject;
import com.panzhihua.common.model.dtos.community.microCommercialStreet.BindUserPhoneDTO;
import com.panzhihua.common.model.vos.community.microCommercialStreet.McsLoginUserInfoVO;
import com.panzhihua.service_user.dao.*;
import com.panzhihua.service_user.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;
@@ -91,21 +97,6 @@
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;
@@ -139,6 +130,9 @@
@Slf4j
@Service
public class UserServiceImpl implements UserService {
    private static final String DEFAULT_IMAGE_URL = "https://www.psciio.com//idcard/91313573d071436ab1f934231b31c6e5.jpg";
    @Resource
    private UserDao userDao;
    @Resource
@@ -173,6 +167,10 @@
    private LcCompareMemberCodeMapper lcCompareMemberCodeMapper;
    @Resource
    private ComActFourMemberDao comActFourMemberDao;
    @Resource
    private SysAppConfigDao sysAppConfigDao;
    @Resource
    private SysTemplateConfigDao sysTemplateConfigDao;
    // @Resource
    // private GridService gridService;
@@ -324,7 +322,16 @@
        loginUserInfoVO.setType(sysUserDO.getType());
        loginUserInfoVO.setIsRealNamed(sysUserDO.getIdCard() != null);// 暂时 身份证判断实名制
        if(sysUserDO.getCommunityId()!=null){
            ComActVO comActVO = userDao.selectCommunity(sysUserDO.getCommunityId());
            loginUserInfoVO.setCommunityId(sysUserDO.getCommunityId());
            if(comActVO!=null){
                loginUserInfoVO.setComActVO(comActVO);
                SysAppConfig sysAppConfig=sysAppConfigDao.selectOne(new QueryWrapper<SysAppConfig>().lambda().eq(SysAppConfig::getAreaCode,comActVO.getAreaCode()));
                if(sysAppConfig!=null){
                    loginUserInfoVO.setAppId(sysAppConfig.getAppId());
                    loginUserInfoVO.setAppSecret(sysAppConfig.getSecret());
                }
            }
        }
        List<SysRoleDO> roleDOList = roleDAO.selectByUserId(sysUserDO.getUserId());
        Set<String> set = new HashSet<>();
@@ -371,6 +378,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)) {
@@ -621,7 +635,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);
@@ -681,6 +695,10 @@
        ComActVO comActVO = userDao.selectCommunity(loginUserInfoVO.getCommunityId());
        if (!ObjectUtils.isEmpty(comActVO)) {
            loginUserInfoVO.setCommunityName(comActVO.getName());
            loginUserInfoVO.setAreaCode(comActVO.getAreaCode());
        }
        else{
            loginUserInfoVO.setAreaCode("510423");
        }
        //是否是社区物业人员
        int countPropertyWorker = userDao.countPropertyWorker(userId, loginUserInfoVO.getCommunityId());
@@ -867,9 +885,10 @@
                try {
                    WxXCXTempSend util = new WxXCXTempSend();
                    String accessToken = util.getAppAccessToken();
                    SysTemplateConfig sysTemplateConfig=sysTemplateConfigDao.selectOne(new QueryWrapper<SysTemplateConfig>().lambda().eq(SysTemplateConfig::getAreaCode, loginUserInfoVO.getComActVO()).eq(SysTemplateConfig::getType,5));
                    // 用户实名认证推送消息
                    WxUtil.sendSubscribeRZSH(user.getOpenid(), accessToken, "实名认证",
                        com.panzhihua.common.utlis.DateUtils.getCurrentDateStr(), "认证成功");
                        com.panzhihua.common.utlis.DateUtils.getCurrentDateStr(), "认证成功",sysTemplateConfig.getTemplateId());
                } catch (Exception e) {
                    log.error("推送用户订阅消息失败,失败原因:" + e.getMessage());
                }
@@ -1236,7 +1255,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());
@@ -1713,9 +1732,9 @@
     * @return 展示数据
     */
    @Override
    public R dataKanban() {
        IndexDataKanbanVO indexDataKanbanVO = userDao.selectIndexDataKanban();
        List<DataKanbanDTO> dataKanbanDTOS = userDao.selectCommunityUserOrder();
    public R dataKanban(String areaCode) {
        IndexDataKanbanVO indexDataKanbanVO = userDao.selectIndexDataKanban(areaCode);
        List<DataKanbanDTO> dataKanbanDTOS = userDao.selectCommunityUserOrder(areaCode);
        List<String> communityUserX = new ArrayList<>();
        List<Integer> communityUserY = new ArrayList<>();
@@ -2729,7 +2748,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<>();
@@ -2739,9 +2758,9 @@
        List<DataKanbanDTO> dataKanbanDTOS = null;
        if(dataKanBansDto.getType() != null && dataKanBansDto.getType().equals(DataKanBansDto.type.by)){
            dataKanbanDTOS = userDao.selectCommunityUserOrderMonth();
            dataKanbanDTOS = userDao.selectCommunityUserOrderMonth(dataKanBansDto.getAreaCode());
        }else{
            dataKanbanDTOS = userDao.selectCommunityUserOrder();
            dataKanbanDTOS = userDao.selectCommunityUserOrder(dataKanBansDto.getAreaCode());
        }
        if (!ObjectUtils.isEmpty(dataKanbanDTOS)) {
            dataKanbanDTOS.forEach(dataKanbanDTO -> {
@@ -2754,7 +2773,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());
@@ -2772,11 +2791,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);
@@ -2786,8 +2805,8 @@
    }
    @Override
    public R communityStatisticsExport(){
        return R.ok(userDao.getUserCommunityExcelExport());
    public R communityStatisticsExport(String areaCode){
        return R.ok(userDao.getUserCommunityExcelExport(areaCode));
    }
    /**
@@ -2816,13 +2835,23 @@
    public R addMcsMerchantUser(McsMerchantDTO mcsMerchantDTO) {
        SysUserDO sysUserDO;
        sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda()
                .eq(SysUserDO::getAccount, mcsMerchantDTO.getAccount()).eq(SysUserDO::getType, 11));
                .eq(SysUserDO::getPhone, mcsMerchantDTO.getPhone()).eq(SysUserDO::getType, 11));
        String encode = new BCryptPasswordEncoder().encode(mcsMerchantDTO.getPassword());
        if (nonNull(sysUserDO)) {
            return R.fail("账户已经存在");
            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();
        String encode = new BCryptPasswordEncoder().encode(mcsMerchantDTO.getPassword());
        BeanUtils.copyProperties(mcsMerchantDTO, sysUserDO);
        sysUserDO.setAccount(mcsMerchantDTO.getAccount());
        sysUserDO.setType(11);
@@ -2831,6 +2860,7 @@
        sysUserDO.setPhone(mcsMerchantDTO.getPhone());
        sysUserDO.setPassword(encode);
        sysUserDO.setPlaintextPassword(mcsMerchantDTO.getPassword());
        sysUserDO.setImageUrl(mcsMerchantDTO.getLogo());
        try {
            userDao.insert(sysUserDO);
            McsLoginUserInfoVO loginUserInfoVO = new McsLoginUserInfoVO();
@@ -2839,12 +2869,8 @@
        } 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")) {
            if (e.getMessage().contains("union_account_type") || e.getMessage().contains("23000")) {
                return R.fail("账户已经存在");
            }else if(e.getMessage().contains("23000")){
                return R.fail("手机号已存在");
            } else {
                return R.fail("账户或手机号已存在,请重新填写尝试");
            }
@@ -2865,6 +2891,7 @@
        String account = mcsMerchantDTO.getAccount();
        String phone = mcsMerchantDTO.getPhone();
        Integer accountStatus = mcsMerchantDTO.getAccountStatus();
        String name = mcsMerchantDTO.getName();
        if (isNotBlank(account)) {
            sysUserDO.setAccount(account);
        }
@@ -2873,6 +2900,9 @@
        }
        if (nonNull(accountStatus)) {
            sysUserDO.setStatus(accountStatus);
        }
        if (isNotBlank(name)) {
            sysUserDO.setName(name);
        }
        try {
            userDao.updateById(sysUserDO);
@@ -2925,7 +2955,7 @@
    }
    /**
     * 发送验证码登录
     * 发送验证码
     * @param phone 手机号
     * @param clientIP 用户ip
     * @param prefixKey redis Key 前缀
@@ -2934,13 +2964,13 @@
     * @return
     */
    @Override
    public R sendMessageCodeForLogin(String phone, String clientIP, String prefixKey, Integer limit, Integer timeout) {
    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("请求频繁,请稍后再试");
                return R.fail(String.format("请求过于频繁,请%d分钟后再次尝试!", timeout/60));
            }
            stringRedisTemplate.expire(redisKey, timeout, TimeUnit.SECONDS);
        }
@@ -2958,4 +2988,78 @@
        }
        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();
    }
}