package com.nova.sankuai.service.impl; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nova.sankuai.domain.dto.SyncConfigPageDto; import com.nova.sankuai.domain.entity.*; import com.nova.sankuai.domain.vo.SyncDateResponse; 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.SyncConfigMapper; import com.nova.sankuai.infra.utils.PageRequest; import com.nova.sankuai.infra.utils.PageUtil; import com.nova.sankuai.service.*; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author weikangdi */ @Service @AllArgsConstructor @Slf4j public class SyncConfigServiceImpl extends ServiceImpl implements ISyncConfigService { private final SyncConfigMapper syncConfigMapper; private final PageUtil pageUtil; private IChannelLogService channelLogService; private IChannelInfoService channelInfoService; private ICityService cityService; private ISyncChannelConfigService syncChannelConfigService; @Override public void invalidSyncConfig(Long id, Integer status) { SyncConfig syncConfigDb = getById(id); if (syncConfigDb == null) { throw new CommonException("该同步配置不存在"); } syncConfigDb.setEnableFlag(status); updateById(syncConfigDb); } @Override @Transactional(rollbackFor = Exception.class) public void deleteSyncConfig(Long id) { SyncConfig syncConfigDb = getById(id); if (syncConfigDb == null) { throw new CommonException("该同步配置不存在"); } removeById(syncConfigDb.getId()); } @Override @Transactional(rollbackFor = Exception.class) public void editSyncConfig(SyncConfig syncConfig) { SyncConfig syncConfigDb = getById(syncConfig.getId()); if (syncConfigDb == null) { throw new CommonException("该同步配置不存在"); } syncConfigDb.setEndpoint(syncConfig.getEndpoint()); syncConfigDb.setName(syncConfig.getName()); syncConfigDb.setAppId(syncConfig.getAppId()); syncConfigDb.setEnableFlag(syncConfig.getEnableFlag()); syncConfigDb.setDeliveryCity(syncConfig.getDeliveryCity()); syncConfigDb.setDeliveryCityName(syncConfig.getDeliveryCityName()); syncConfigDb.setChannelConfig(syncConfig.getChannelConfig()); updateById(syncConfigDb); channelInfoService.updateSyncChannel(syncConfigDb); syncChannelConfigService.updateConfig(syncConfig); } @Override @Transactional(rollbackFor = Exception.class) public void addSyncConfig(SyncConfig syncConfig) { syncConfig.setCreationDate(new Date()); Long channelId = channelInfoService.createSyncChannel(syncConfig); syncConfig.setChannelId(channelId); save(syncConfig); syncChannelConfigService.updateConfig(syncConfig); } @Override public IPage pageSyncConfig(SyncConfigPageDto pageDto, PageRequest pageRequest) { IPage page = syncConfigMapper.pageModel(pageUtil.getPage(pageRequest), pageDto); List records = page.getRecords(); List newRecords = new ArrayList<>(); for (SyncConfig record : records) { List channelIds = syncChannelConfigService.getChannelsByConfigId(record.getId()); record.setChannelIds(channelIds); newRecords.add(record); } page.setRecords(newRecords); return page; } @Override public void syncData(Customer customer) { try { List list = new ArrayList<>(); ChannelInfo customerChannel = channelInfoService.getChannelInfoByCode(customer.getSourceChannel()); City city = cityService.lambdaQuery().eq(City::getCityId, customer.getCity()).one(); if (city != null) { String provinceId = city.getProvinceId(); List syncConfigs = syncConfigMapper.selectMatchSyncConfig(customer.getCity(), provinceId); for (SyncConfig syncConfig : syncConfigs) { log.info("根据同步渠道配置进行筛选:原始同步配置:" + syncConfig.toString() + "原始客户信息" + customer.toString()); if (SyncConfig.CHANNEL_NONE == syncConfig.getChannelConfig()) { list.add(syncConfig); } else { List channelIds = syncChannelConfigService.getChannelsByConfigId(syncConfig.getId()); syncConfig.setChannelIds(channelIds); if (SyncConfig.CHANNEL_INCLUDE == syncConfig.getChannelConfig() && channelIds.contains(customerChannel.getId())) { list.add(syncConfig); } else if (SyncConfig.CHANNEL_UNINCLUDE == syncConfig.getChannelConfig() && !channelIds.contains(customerChannel.getId())) { list.add(syncConfig); } } } } else { log.error("数据同步逻辑警告:客户的城市信息为空"); log.error("原始客户信息:" + customer.toString()); } if (list.size() > 0) { log.info("数据同步开始"); JSONObject param = parseSyncParam(customer, customerChannel); for (SyncConfig syncConfig : list) { param.putOnce("appid", syncConfig.getAppId()); log.info("同步原始数据" + param.toString()); log.info("同步配置信息:" + syncConfig.toString()); String result = HttpUtil.post(syncConfig.getEndpoint(), param.toString(), Constants.TIME_OUT); ChannelInfo channelInfo = channelInfoService.getById(syncConfig.getChannelId()); try { log.info("同步请求返回数据" + result); SyncDateResponse response = JSONUtil.toBean(result, SyncDateResponse.class); if (response.getCode() == ResultCode.SUCCESS.getCode()) { channelLogService.createExportLog(customer.getSourceChannel(), channelInfo.getCode(), ChannelLog.SUCCESS, customer.getId(), result); } else { channelLogService.createExportLog(customer.getSourceChannel(), channelInfo.getCode(), ChannelLog.FAIL, customer.getId(), result); } } catch (Exception e) { e.printStackTrace(); log.error("同步数据失败,请求返回结果:" + result); channelLogService.createExportLog(customer.getSourceChannel(), channelInfo.getCode(), ChannelLog.FAIL, customer.getId(), result); } } } } catch (Exception e) { log.error("同步数据异常", e); } } private JSONObject parseSyncParam(Customer customer, ChannelInfo customerChannel) { JSONObject param = new JSONObject(); param.putOnce("name", customer.getName()); param.putOnce("phone", customer.getPhone()); param.putOnce("professionInfo", customer.getProfessionInfo()); param.putOnce("sesame", customer.getSesame()); param.putOnce("socialSecurity", customer.getSocialSecurity()); param.putOnce("providentFund", customer.getProvidentFund()); param.putOnce("houseStatus", customer.getHouseStatus()); param.putOnce("carStatus", customer.getCarStatus()); param.putOnce("insurancePolicy", customer.getInsurancePolicy()); param.putOnce("creditCard", customer.getCreditCard()); param.putOnce("city", customer.getCity()); param.putOnce("cityName", customer.getCityName()); param.putOnce("loanAmount", customer.getLoanAmount()); param.putOnce("loanTerm", customer.getLoanTerm()); param.putOnce("approvalLoanAmount", customer.getApprovalLoanAmount()); param.putOnce("approvalLoanTerm", customer.getApprovalLoanTerm()); param.putOnce("maritalStatus", customer.getMaritalStatus()); param.putOnce("education", customer.getEducation()); param.putOnce("useOfLoan", customer.getUseOfLoan()); param.putOnce("monthlyIncome", customer.getMonthlyIncome()); param.putOnce("address", customer.getAddress()); param.putOnce("age", customer.getAge()); param.putOnce("largeLoanAmount", customer.getLargeLoanAmount()); param.putOnce("enterpriseInfo", customer.getEnterpriseInfo()); param.putOnce("payrollAgency", customer.getPayrollAgency()); param.putOnce("workStatus", customer.getWorkStatus()); param.putOnce("microLoan", customer.getMicroLoan()); param.putOnce("houseAttributes", customer.getHouseAttributes()); param.putOnce("housePayment", customer.getHousePayment()); param.putOnce("syncChannelCode", customerChannel.getCode()); param.putOnce("syncChannelName", customerChannel.getName()); return param; } }