package com.cyksj.task; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.cyksj.common.constant.Constant; import com.cyksj.mapper.manage.CustomerServiceEveryMonthDetailMapper; import com.cyksj.mapper.manage.StatisticsCustomerServiceEveryMonthMapper; import com.cyksj.model.entity.CustomerServiceEveryMonthDetail; import com.cyksj.model.entity.CustomerServiceRenewOrderRecord; import com.cyksj.model.entity.RealGoodsOrderHandle; import com.cyksj.model.entity.StatisticsCustomerServiceEveryMonth; import com.ejlchina.searcher.BeanSearcher; import com.ejlchina.searcher.param.Operator; import com.ejlchina.searcher.util.MapUtils; import com.google.common.util.concurrent.AtomicDouble; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; /* *项目名: netflix *文件名: OrderCustomerHandleScheduler *创建者: JavaZou *创建时间:2022/11/29 16:44 */ @Component @Slf4j @RequiredArgsConstructor public class OrderCustomerHandleScheduler { private final CustomerServiceEveryMonthDetailMapper detailMapper; private final StatisticsCustomerServiceEveryMonthMapper statisticsEveryMonthMapper; private final BeanSearcher beanSearcher; /** * 客服业绩数据统计 */ @Scheduled(cron = "59 59 23 L * ?") public void orderCustomerHandle() { DateTime now = DateTime.now(); DateTime begin = DateUtil.beginOfMonth(now); String statisticsDate = DateUtil.format(now, "yyyy-MM"); List realGoodsOrderHandles = beanSearcher.searchAll(RealGoodsOrderHandle.class, MapUtils.builder() .field(RealGoodsOrderHandle::getStatus, Constant.noOrderAllStatus).op(Operator.NotIn) .field(RealGoodsOrderHandle::getCreatedTime, begin, now).op(Operator.Between) .build()); Map> before = realGoodsOrderHandles.stream().collect(Collectors.groupingBy(RealGoodsOrderHandle::getBeforeServiceName)); Map> after = realGoodsOrderHandles.stream().collect(Collectors.groupingBy(RealGoodsOrderHandle::getAfterServiceName)); StatisticsCustomerServiceEveryMonth statistics = new StatisticsCustomerServiceEveryMonth(); statistics.setStatisticsData(statisticsDate); statisticsEveryMonthMapper.insert(statistics); before.forEach((k, v) -> { customerServiceRecord(k, v, 1, statistics.getId()); }); after.forEach((k, v) -> { customerServiceRecord(k, v, 2, statistics.getId()); }); //续费业绩 List customerServiceRecords = beanSearcher.searchAll(CustomerServiceRenewOrderRecord.class, MapUtils.builder() .field(RealGoodsOrderHandle::getCreatedTime, begin, now).op(Operator.Between) .build()); Map> renews = customerServiceRecords.stream().collect(Collectors.groupingBy(CustomerServiceRenewOrderRecord::getCustomerService)); renews.forEach((k,v)->{ renewServiceOrderRecord(k, v, 3, statistics.getId()); }); } public void customerServiceRecord(String serviceName, List handlers, Integer type, Long statisticsId) { if (StrUtil.isNotBlank(serviceName)) { CustomerServiceEveryMonthDetail record = new CustomerServiceEveryMonthDetail(); record.setType(type); record.setCustomerServiceName(serviceName); record.setStatisticsId(statisticsId); AtomicDouble numOfOrder = new AtomicDouble(0); handlers.forEach(handler -> { if ("red_book".equals(handler.getLabelSource())) { numOfOrder.addAndGet(1.5); return; } numOfOrder.addAndGet(1); }); record.setNumOfOrder(BigDecimal.valueOf(numOfOrder.doubleValue())); Optional money = handlers.stream().map(RealGoodsOrderHandle::getMoney).reduce(BigDecimal::add); record.setMoney(money.isPresent() ? money.get() : BigDecimal.ZERO); detailMapper.insert(record); } } public void renewServiceOrderRecord(String serviceName, List renewOrderRecords, Integer type, Long statisticsId) { if (StrUtil.isNotBlank(serviceName)) { CustomerServiceEveryMonthDetail record = new CustomerServiceEveryMonthDetail(); record.setType(type); record.setCustomerServiceName(serviceName); record.setStatisticsId(statisticsId); record.setNumOfOrder(BigDecimal.valueOf(renewOrderRecords.size())); record.setMoney(BigDecimal.ZERO); detailMapper.insert(record); } } }