package com.nova.sankuai.service.impl; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nova.sankuai.domain.api.aliyunIP.AliyunUtil; import com.nova.sankuai.domain.dto.ChannelInfoDefaultVipDto; import com.nova.sankuai.domain.dto.ChannelInfoDto; import com.nova.sankuai.domain.dto.ChannelInfoPageDto; import com.nova.sankuai.domain.dto.ChannelLoanMarketHotLinkDto; import com.nova.sankuai.domain.entity.*; import com.nova.sankuai.domain.enums.CustomerInfoStatusEnum; import com.nova.sankuai.domain.enums.vipservice.VipCardTypeEnum; import com.nova.sankuai.domain.vo.ChannelVipConfigVo; import com.nova.sankuai.domain.vo.LoanSupermarketVo; import com.nova.sankuai.domain.vo.auth.AutoLoginVo; import com.nova.sankuai.domain.vo.channel.ChannelConfigVo; import com.nova.sankuai.domain.vo.channel.ChannelInfoVo; import com.nova.sankuai.infra.config.CommonException; import com.nova.sankuai.infra.constants.Constants; import com.nova.sankuai.infra.constants.ResultCode; import com.nova.sankuai.infra.mapper.*; import com.nova.sankuai.infra.utils.*; import com.nova.sankuai.security.UserDetail; import com.nova.sankuai.service.ChannelCityLinkService; import com.nova.sankuai.service.IChannelInfoService; import com.nova.sankuai.service.IChannelSupermarketService; import com.nova.sankuai.service.IH5ChannelLoanMarketService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author weikangdi */ @Service @RequiredArgsConstructor(onConstructor_ = @Autowired) @Slf4j public class ChannelInfoServiceImpl extends ServiceImpl implements IChannelInfoService { private final ChannelInfoMapper channelInfoMapper; private final ChannelLogMapper channelLogMapper; private final ChannelSupermarketMapper channelSupermarketMapper; private final IChannelSupermarketService channelSupermarketService; private final IH5ChannelLoanMarketService h5ChannelLoanMarketService; private final CustomerUserMapper customerUserMapper; private final CustomerMapper customerMapper; private final PageUtil pageUtil; private final SystemParamMapper systemParamMapper; private final H5ChannelLoanMarketMapper h5ChannelLoanMarketMapper; private final VipCardMapper vipCardMapper; private final LoanSupermarketMapper loanSupermarketMapper; private final ChannelCityLinkService channelCityLinkService; private final AliyunUtil aliyunUtil; private static final Logger loginLogger = LoggerFactory.getLogger("loginLogger"); @Value("${channelInfo.codeInit}") private Integer codeInit; @Override @Transactional(rollbackFor = Exception.class) public Long createSyncChannel(SyncConfig syncConfig) { ChannelInfo info = lambdaQuery().eq(ChannelInfo::getAppId, syncConfig.getAppId()).one(); if (info != null) { log.error("新增同步配置信息渠道失败,原始数据:" + syncConfig); throw new CommonException("该渠道Key已经用于其他渠道"); } ChannelInfo channelInfo = new ChannelInfo(); channelInfo.setAppId(syncConfig.getAppId()); channelInfo.setName(syncConfig.getName()); channelInfo.setStatus(Constants.ENABLE); channelInfo.setType(ChannelInfo.TYPE_EXPORT); channelInfo.setCode(generateCode()); channelInfo.setSystemFlag(Constants.ENABLE); channelInfo.setVersion2IsOpen(0); channelInfo.setQuotaApprovalTime(10); channelInfo.setMemberDiscount(10000); save(channelInfo); return channelInfo.getId(); } private Integer generateCode() { Integer code = channelInfoMapper.getMaxCode(); if (codeInit != null && code < codeInit) { return codeInit; } return code + 1; } @Override @Transactional(rollbackFor = Exception.class) public void updateSyncChannel(SyncConfig syncConfig) { ChannelInfo channelInfo = getById(syncConfig.getChannelId()); if (channelInfo == null) { log.error("更新同步配置信息渠道失败,原始数据:" + syncConfig); throw new CommonException("该同步配置对应的出口渠道为空"); } channelInfo.setName(syncConfig.getName()); channelInfo.setAppId(syncConfig.getAppId()); updateById(channelInfo); } @Override public ResultJson checkChannel(String appId, String importObjects) { log.info("渠道id检测开始,渠道id值:" + appId); ChannelInfo channelInfo = lambdaQuery().eq(ChannelInfo::getAppId, appId) .eq(ChannelInfo::getType, ChannelInfo.TYPE_IMPORT).one(); if (channelInfo == null) { log.error("checkChannel:渠道id检测不合法,appId:" + appId + ",原始数据信息:" + importObjects); return ResultJson.failure(ResultCode.SERVER_ERROR, "渠道id非法"); } if (Constants.ENABLE != channelInfo.getStatus()) { if (StringUtils.isNotBlank(importObjects)) { ChannelLog channelLog = new ChannelLog(); channelLog.setSource(channelInfo.getCode()); channelLog.setName(channelInfo.getName()); channelLog.setType(ChannelLog.IMPORT); channelLog.setStatus(ChannelLog.FAIL); channelLog.setMessage("渠道已被禁用"); channelLog.setImportObjects(importObjects); channelLog.setCreationDate(new Date()); channelLogMapper.insert(channelLog); } log.error("渠道id检测:渠道已经被禁用" + "原始数据信息:" + importObjects); return ResultJson.failure(ResultCode.SERVER_ERROR, "渠道已被禁用"); } return null; } @Override public IPage pageImportList(ChannelInfoPageDto pageDto) { Page page = pageUtil.getPage(pageDto); return channelInfoMapper.pageImportChannel(page, pageDto); } @Override @Transactional(rollbackFor = Exception.class) public ChannelInfoVo addChannelInfo(ChannelInfoDto channelInfoDto) { ChannelInfo channelInfo = new ChannelInfo(); BeanUtils.copyProperties(channelInfoDto, channelInfo); initChannel(channelInfo); save(channelInfo); channelSupermarketService.saveByChannel(channelInfo.getId()); h5ChannelLoanMarketService.saveByChannel(channelInfo.getId()); return ChannelInfoVo.parseVo(channelInfo); } private void initChannel(ChannelInfo channelInfo) { channelInfo.setType(ChannelInfo.TYPE_IMPORT); channelInfo.setCode(generateCode()); channelInfo.setAppId(IdUtil.randomUUID()); if (channelInfo.getQuotaApprovalTime() == null) { channelInfo.setQuotaApprovalTime(10); } if (channelInfo.getVersion2IsOpen() == null) { channelInfo.setVersion2IsOpen(0); } if (channelInfo.getMemberDiscount() == null) { channelInfo.setMemberDiscount(10000); } if (StringUtils.isEmpty(channelInfo.getDefaultCardId())) { VipCard defaultCard = vipCardMapper.getDefaultCardByType(VipCardTypeEnum.MEMBER_SERVICE.getCode()); channelInfo.setDefaultCardId(defaultCard.getCardId()); } } @Override @Transactional(rollbackFor = Exception.class) public void editChannelInfo(ChannelInfoDto channelInfoDto) { ChannelInfo channelInfoDb = checkChannelInfo(channelInfoDto.getId(), null); channelInfoDb.setName(channelInfoDto.getName()); channelInfoDb.setLoanMarketOnly(channelInfoDto.getLoanMarketOnly()); channelInfoDb.setVersion2IsOpen(channelInfoDto.getVersion2IsOpen()); channelInfoDb.setAndroidLink(channelInfoDto.getAndroidLink()); channelInfoDb.setIosLink(channelInfoDto.getIosLink()); channelInfoDb.setMemberDiscount(channelInfoDto.getMemberDiscount()); channelInfoDb.setQuotaApprovalTime(channelInfoDto.getQuotaApprovalTime()); channelInfoDb.setLoadAndroidLink(channelInfoDto.getLoadAndroidLink()); channelInfoDb.setLoadIosLink(channelInfoDto.getLoadIosLink()); channelInfoDb.setVersion3IsOpen(channelInfoDto.getVersion3IsOpen()); channelInfoDb.setQueueVipSwitch(channelInfoDto.getQueueVipSwitch()); channelInfoDb.setH5PageSwitch(channelInfoDto.getH5PageSwitch()); channelInfoDb.setVersion4IsOpen(channelInfoDto.getVersion4IsOpen()); channelInfoDb.setVipMode(channelInfoDto.getVipMode()); channelInfoDb.setLinkMode(channelInfoDto.getLinkMode()); // 于2022-11-15新增:直接放款 channelInfoDb.setDirectLoanIsOpen(channelInfoDto.getDirectLoanIsOpen()); // 完 channelInfoDb.setVipSwitch(channelInfoDto.getVipSwitch()); channelInfoDb.setBankCardIsOpen(channelInfoDto.getBankCardIsOpen()); channelInfoDb.setLoanProgressOld(channelInfoDto.getLoanProgressOld()); channelInfoDb.setVersion2Type(channelInfoDto.getVersion2Type()); channelInfoDb.setDhSwitch(channelInfoDto.getDhSwitch()); channelInfoDb.setYongxinIsOpen(channelInfoDto.getYongxinIsOpen()); channelInfoDb.setLianDeng(channelInfoDto.getLianDeng()); channelInfoDb.setH5Match(channelInfoDto.getH5Match()); // ab新增于2024-10-16 updateById(channelInfoDb); if(channelInfoDto.getVersion4IsOpen()!=null && channelInfoDto.getVersion4IsOpen().equals(0)){ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Customer::getSourceChannel, channelInfoDb.getCode()); queryWrapper.eq(Customer::getStatus, CustomerInfoStatusEnum.COMPANY_INFO.getCode()); queryWrapper.eq(Customer::getDeleteFlag, 0); List customers = customerMapper.selectList(queryWrapper); if(customers!= null && customers.size() >0){ for (Customer customer: customers) { customer.setStatus(CustomerInfoStatusEnum.BANKCARD_INFO.getCode()); customerMapper.updateById(customer); } } } } public ChannelInfo checkChannelInfo(Long channelId, String appId) { ChannelInfo channelInfo; if (channelId != null) { channelInfo = getById(channelId); } else { channelInfo = lambdaQuery().eq(ChannelInfo::getAppId, appId).one(); } if (channelInfo == null) { throw new CommonException("该渠道不存在"); } return channelInfo; } @Override public IPage pageSupermarkets(Long channelId, PageRequest pageRequest) { checkChannelInfo(channelId, null); return channelSupermarketMapper.pageSupermarketList(pageUtil.getPage(pageRequest), channelId); } @Override public ChannelInfo getChannelInfoByCode(Integer code) { return lambdaQuery().eq(ChannelInfo::getCode, code).one(); } @Override public void editMemberDefault(ChannelInfoDefaultVipDto channelInfo) { ChannelInfo channelInfoDb = checkChannelInfo(channelInfo.getId(), null); channelInfoDb.setDefaultCardId(channelInfo.getDefaultCardId()); updateById(channelInfoDb); } @Override public ChannelConfigVo getChannelInfoByKey(String appId, HttpServletRequest request) { String token = request.getHeader("Authorization"); UserDetail user = UserUtil.getUser(token); String phone = null; if (user != null) { phone = user.getPhone(); } ChannelInfo channelInfo = getChannelByUser(appId, phone); ChannelConfigVo channelConfigVo = ChannelConfigVo.parseChannelConfig(channelInfo); //获取用户的地理信息,并判断该渠道中是否存在该城市的下载链接 String uuid = IdUtil.randomUUID(); String ipAddr = IpUtil.getIpAddr(request); loginLogger.info("统一码为" + uuid + "," + "手机号为" + phone + ",获取到的IP为:{}", ipAddr); City cityInfo = aliyunUtil.getCityInfo(request, phone); if (cityInfo != null) { loginLogger.info("统一码为" + uuid + "," + "手机号为" + phone + ",获取到的用户信息:{}", cityInfo); ChannelCityLink channelCityLinkById = channelCityLinkService.getOne(new LambdaQueryWrapper() .eq(ChannelCityLink::getCityId, cityInfo.getCityId()) .eq(ChannelCityLink::getChannelId, channelInfo.getId()) .eq(ChannelCityLink::getIsDelete, 0)); //渠道城市下载链接若存在此信息则将安卓下载链接返回 if (channelCityLinkById != null && StringUtils.isNotEmpty(channelCityLinkById.getAndroidLink())) { channelConfigVo.setAndroidLink(channelCityLinkById.getAndroidLink()); loginLogger.info("统一码为" + uuid + "," + "手机号为" + phone + ",获取到的安卓下载链接:{}", channelCityLinkById.getAndroidLink()); } //渠道城市下载链接若存在此信息则将ios下载链接返回 if (channelCityLinkById != null && StringUtils.isNotEmpty(channelCityLinkById.getIosLink())) { loginLogger.info("统一码为" + uuid + "," + "手机号为" + phone + ",获取到的ios下载链接:{}", channelCityLinkById.getIosLink()); channelConfigVo.setIosLink(channelCityLinkById.getIosLink()); } } else { loginLogger.info("统一码为" + uuid + "," + "手机号为" + phone + ",未获取到相应城市的下载链接"); } SystemParam systemParam = systemParamMapper.getDefaultParam(); LoanSupermarket loanSupermarket = loanSupermarketMapper.selectById(channelInfo.getLoanMarketHotLinkId()); if (loanSupermarket != null) { channelConfigVo.setLoanMarketLinkUrl(loanSupermarket.getLinkUrl()); } //配置系统全局开关 channelConfigVo.setLoanMarketArray(systemParam.getLoanMarketArray()); channelConfigVo.setPageTabSwitch(systemParam.getPageTabSwitch()); channelConfigVo.setIdCardSwitch(systemParam.getIdCardSwitch()); loginLogger.info("统一码为" + uuid + "," + "手机号为" + phone + ",获取到的vo为:{}", channelConfigVo); if (0 == channelConfigVo.getLoanMarketHotLinkSwitch()) { channelConfigVo.setLoanMarketHotLinkId(null); channelConfigVo.setLoanMarketLinkUrl(null); } return channelConfigVo; } private ChannelInfo getChannelByUser(String appId, String phone) { ChannelInfo channelInfo = channelInfoMapper.getChannelByAppId(appId); if (channelInfo == null) { log.error("该渠道配置不存在,渠道值:" + appId); throw new CommonException("该渠道配置不存在"); } if (StringUtils.isNotEmpty(phone)) { CustomerUser user = customerUserMapper.selectOne(Wrappers.lambdaQuery() .eq(CustomerUser::getPhone, phone).eq(CustomerUser::getDeleteFlag, 0)); if (user != null) { ChannelInfo userChannel = lambdaQuery().eq(ChannelInfo::getCode, user.getSourceChannel()) .eq(ChannelInfo::getType, ChannelInfo.TYPE_IMPORT).one(); if (userChannel != null) { channelInfo = userChannel; } } } return channelInfo; } @Override public List getSupermarketListByKey(String appId, String phone) { ChannelInfo channelInfo = getChannelByUser(appId, phone); return channelSupermarketMapper.getSupermarketList(channelInfo.getId()); } @Override @Transactional(rollbackFor = Exception.class) public String createThirdChannel(AutoLoginVo autoLoginVo, ChannelInfo channelInfo) { String thirdCode = autoLoginVo.getAppId() + autoLoginVo.getChannelCode(); ChannelInfo thirdChannel = lambdaQuery().eq(ChannelInfo::getThirdChannelCode, thirdCode).one(); if (thirdChannel == null) { thirdChannel = new ChannelInfo(); BeanUtils.copyProperties(channelInfo, thirdChannel); thirdChannel.setId(null); thirdChannel.setThirdChannelCode(thirdCode); thirdChannel.setName(channelInfo.getName() + "-" + autoLoginVo.getChannelName()); thirdChannel.setCode(generateCode()); thirdChannel.setAppId(IdUtil.randomUUID()); thirdChannel.setAutoParentCode(channelInfo.getCode()); thirdChannel.setHasThirdChannel(0); thirdChannel.setCreationDate(new Date()); save(thirdChannel); channelSupermarketService.copyChannel(thirdChannel.getId(), channelInfo.getId()); h5ChannelLoanMarketService.copyChannel(thirdChannel.getId(), channelInfo.getId()); List channelCityLinks = channelCityLinkService.list(new LambdaQueryWrapper() .eq(ChannelCityLink::getChannelId, channelInfo.getId()) .eq(ChannelCityLink::getIsDelete, 0)); if (channelCityLinks != null && !channelCityLinks.isEmpty()) { ArrayList channelCityLinklist = new ArrayList<>(); for (ChannelCityLink channelCityLink : channelCityLinks) { ChannelCityLink channelCityLinkson = new ChannelCityLink(); channelCityLinkson.setChannelId(thirdChannel.getId()); channelCityLinkson.setCityId(channelCityLink.getCityId()); channelCityLinkson.setAndroidLink(channelCityLink.getAndroidLink()); channelCityLinkson.setIosLink(channelCityLink.getIosLink()); channelCityLinkson.setCreationDate(new Date()); channelCityLinklist.add(channelCityLinkson); } channelCityLinkService.saveBatch(channelCityLinklist); } } if (channelInfo.getHasThirdChannel() == 0) { update(Wrappers.lambdaUpdate() .set(ChannelInfo::getHasThirdChannel, 1) .eq(ChannelInfo::getId, channelInfo.getId())); } return thirdChannel.getAppId(); } @Override public List getH5LoanMarketListByKey(String appId) { ChannelInfo channelInfo = checkChannelInfo(null, appId); return h5ChannelLoanMarketMapper.getSupermarketList(channelInfo.getId()); } @Override public IPage pageH5LoanMarkets(Long channelId, PageRequest pageRequest) { checkChannelInfo(channelId, null); return h5ChannelLoanMarketMapper.pageSupermarketList(pageUtil.getPage(pageRequest), channelId); } @Override public void editLoanMarketHotLink(ChannelLoanMarketHotLinkDto loanMarketHotLinkDto) { ChannelInfo channelInfo = checkChannelInfo(loanMarketHotLinkDto.getChannelId(), null); update(Wrappers.lambdaUpdate() .set(ChannelInfo::getLoanMarketHotLinkId, loanMarketHotLinkDto.getLoanMarketHotLinkId()) .set(ChannelInfo::getLoanMarketHotLinkSwitch, loanMarketHotLinkDto.getLoanMarketHotLinkSwitch()) .eq(ChannelInfo::getId, channelInfo.getId())); } @Override public ChannelVipConfigVo getChannelVipConfig(String appId, String phone) { ChannelVipConfigVo vipConfigVo = new ChannelVipConfigVo(); ChannelInfo channelInfo = getChannelByUser(appId, phone); vipConfigVo.setDefaultCardId(channelInfo.getDefaultCardId()); vipConfigVo.setMemberDiscount(channelInfo.getMemberDiscount()); vipConfigVo.setQuotaApprovalTime(channelInfo.getQuotaApprovalTime()); return vipConfigVo; } }