package cn.exrick.xboot.your.schedulings;
import cn.exrick.xboot.your.entity.Area;
import cn.exrick.xboot.your.entity.AreaSection;
import cn.exrick.xboot.your.entity.Customer;
import cn.exrick.xboot.your.entity.OrderTask;
import cn.exrick.xboot.your.service.IAreaSectionService;
import cn.exrick.xboot.your.service.IAreaService;
import cn.exrick.xboot.your.service.ICustomerService;
import cn.exrick.xboot.your.service.IOrderTaskService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
//大屏配送分析
@Component
public class StatisticPc2ScheduleImpl {
@Autowired
private IAreaService iAreaService;
@Autowired
private IAreaSectionService iAreaSectionService;
@Autowired
private ICustomerService iCustomerService;
@Autowired
private IOrderTaskService iOrderTaskService;
@Scheduled(cron="0 0 20 * * ?")//每晚8点执行
public void execute(){
List list = iAreaService.list();
for(Area area:list){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("area_id",area.getId());
int count = iCustomerService.count(wrapper);
area.setCustomerSum(count);
iAreaService.saveOrUpdate(area);
}
List list2 = iAreaSectionService.list();
for(AreaSection areaSection:list2){
String id = areaSection.getId();
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("area_section_id",id);
int count = iCustomerService.count(wrapper);
areaSection.setCustomerNum(count);
List orderTasks = iOrderTaskService.sumTime(id);
int sum = 0;
List listTime = new ArrayList<>();
for(OrderTask orderTask:orderTasks){
sum+=orderTask.getTime();
listTime.add(orderTask.getTime());
}
Collections.sort(listTime);
double v = (sum * 1.0) / (1000 * 60 * 60) / listTime.size();
areaSection.setAvgTime((double) Math.round(v * 10) / 10);
if(listTime.size()>0){
double v1 = (listTime.get(0) * 1.0) / (1000 * 60 * 60);
areaSection.setMinTime((double) Math.round(v1 * 10) / 10);
double v2 = (listTime.get(listTime.size()-1) * 1.0) / (1000 * 60 * 60);
areaSection.setMaxTime((double) Math.round(v2 * 10) / 10);
}
double variance = Variance(listTime);
areaSection.setStability(variance);
iAreaSectionService.saveOrUpdate(areaSection);
}
}
public double Variance(List x) {
List y = new ArrayList<>();
for(Integer s:x){
y.add(trans((s*1.0)/(3600*1000)));
}
int m = x.size();
double sum = 0;
for (int i = 0; i < m; i++) {
sum += y.get(i);
}
double dAve = sum / m;
double dVar = 0;
for (int i = 0; i < m; i++) {
dVar += (y.get(i) - dAve) * (y.get(i) - dAve);
}
double v = dVar / m;
return trans2(v);
}
public double trans(double v2){
return (double) Math.round(v2 * 10) / 10;
}
public double trans2(double v2){
return (double) Math.round(v2 * 100) / 100;
}
}