CalcWaybillAuditServiceImpl.java 13 KB
package com.bsth.service.calc.impl;

import com.bsth.data.BasicData;
import com.bsth.entity.Cars;
import com.bsth.entity.calc.CalcWaybillAudit;
import com.bsth.entity.realcontrol.ChildTaskPlan;
import com.bsth.entity.realcontrol.ScheduleRealInfo;
import com.bsth.repository.calc.CalcWaybillAuditRepository;
import com.bsth.repository.realcontrol.ScheduleRealInfoRepository;
import com.bsth.service.calc.CalcWaybillAuditService;
import com.bsth.service.report.CulateMileageService;
import com.bsth.util.Arith;
import com.bsth.util.ReportUtils;
import com.github.stuxuhai.jpinyin.PinyinException;
import com.github.stuxuhai.jpinyin.PinyinFormat;
import com.github.stuxuhai.jpinyin.PinyinHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;


@Component
@Service
public class CalcWaybillAuditServiceImpl implements CalcWaybillAuditService {

	@Autowired
	ScheduleRealInfoRepository scheduleRealInfoRepository;

	@Autowired
	CalcWaybillAuditRepository calcWaybillAuditRepository;

	@Autowired
	CulateMileageService culateService;




	Logger logger = LoggerFactory.getLogger(this.getClass());


	//统计3天前的数据
	@Scheduled(cron = "0 0 2 * * *")
	public void clear() {
		LocalDate dateTime = LocalDate.now().minusDays(3);
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
/*		dateTime= LocalDate.parse("2025-03-03",formatter);*/
		String date = dateTime.format(formatter);
		this.create(date);
	}

	//数据统计
	@Override
	public void create(String date) {
		List<CalcWaybillAudit> list = new ArrayList<>();
		//查询数据
		List<ScheduleRealInfo> listAll = scheduleRealInfoRepository.auditReport(date);
		//按车辆分组
		Map<String, List<ScheduleRealInfo>> data=listAll.stream().collect(Collectors.groupingBy(sch-> sch.getScheduleDateStr()+"-"+sch.getXlBm()+"-"+sch.getClZbh()));
		data.forEach((k,v)->{
			CalcWaybillAudit c=new CalcWaybillAudit();
			c.setRq(v.get(0).getScheduleDateStr());
			c.setLineCode(v.get(0).getXlBm());
			c.setLineName(v.get(0).getXlName());
			c.setNbbm(v.get(0).getClZbh());
			double sjyygl=culateService.culateSjgl(v);//实际营运公里
			double ljgl = culateService.culateLjgl(v);//临加公里
			c.setYylc(Arith.add(sjyygl,ljgl));
			Map<String, Double> ks=this.culateksgl(v);
			c.setInlc(ks.get("in"));
			c.setOutlc(ks.get("out"));
			c.setKslc(ks.get("ksgl"));
			c.setZkslc(ks.get("zksgl"));
			c.setZlc(Arith.add(Arith.add(sjyygl,ljgl),ks.get("zksgl")));
			c.setFgsbm(v.get(0).getFgsBm());
			c.setFgsName(v.get(0).getFgsName());
			c.setGsbm(v.get(0).getGsBm());
			c.setGsName(v.get(0).getGsName());
			list.add(c);
		});
		if(!list.isEmpty()){
			calcWaybillAuditRepository.delete(date);
			calcWaybillAuditRepository.save(list);
		}
	}

	//汇总生成报表
	@Override
	public List<Map<String, Object>> auditReport(String gsdm,String fgsdm,String date, String date2,
												 String line,String nbbm, String type, String xlName) {
		List<Map<String, Object>> lMap = new ArrayList<>();
		//查询数据
		List<CalcWaybillAudit> listAll = calcWaybillAuditRepository.auditReport(date, date2,gsdm,fgsdm, line, nbbm);
		//按车辆分组
		Map<String, List<CalcWaybillAudit>> data=listAll.stream().collect(Collectors.groupingBy(audit-> audit.getLineCode()+"-"+audit.getNbbm()));
		data.forEach((k,v)->{
			Map<String, Object> resMap = new HashMap<>();
			Map<String,Double> sum=sum(v);
			resMap.put("lineName", v.get(0).getLineName());
			String clzbh=v.get(0).getNbbm();
			resMap.put("plate", BasicData.nbbmCompanyPlateMap.get(clzbh)!=null?BasicData.nbbmCompanyPlateMap.get(clzbh):"");
			Cars car=BasicData.nbbm2CarMap.get(clzbh);
			resMap.put("carClass",car!=null&&car.getCarClass()!=null? car.getCarClass():"");
			resMap.put("sfdc",car!=null&&car.getSfdc()!=null? (car.getSfdc()==true?"是":"否"):"");
			resMap.put("sfmix",car!=null&&car.getSfmix()!=null? (car.getSfmix()==true?"是":"否"):"");
			resMap.put("yylc", sum.get("yylc"));
			resMap.put("in", sum.get("inlc"));
			resMap.put("out", sum.get("outlc"));
			resMap.put("kslc", sum.get("kslc"));
			resMap.put("zkslc", sum.get("zkslc"));
			resMap.put("zlc", sum.get("zlc"));
			resMap.put("fgsBm", v.get(0).getFgsbm());
			resMap.put("xlBm", v.get(0).getLineCode());
			resMap.put("fgsName", v.get(0).getFgsName());
			try {
				resMap.put("xlNamePy", PinyinHelper.convertToPinyinString(v.get(0).getFgsbm()+v.get(0).getLineName(), "", PinyinFormat.WITHOUT_TONE));
			} catch (PinyinException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			lMap.add(resMap);
		});

		Collections.sort(lMap, new AccountXlbm());
		if (type != null && type.length() != 0 && type.equals("export")) {
			SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
					sdfSimple = new SimpleDateFormat("yyyyMMdd");
			List<Iterator<?>> listI = new ArrayList<>();
			Map<String, Object> m = new HashMap<>();
			m.put("date", date + "至" + date2);
			ReportUtils ee = new ReportUtils();
			try {
				String dateTime = "";
				if (date.equals(date2)) {
					dateTime = sdfSimple.format(sdfMonth.parse(date));
				} else {
					dateTime = sdfSimple.format(sdfMonth.parse(date))
							+ "-" + sdfSimple.format(sdfMonth.parse(date2));
				}
				listI.add(lMap.iterator());
				String path = this.getClass().getResource("/").getPath() + "static/pages/forms/";
				ee.excelReplace(listI, new Object[]{m}, path + "mould/auditReport.xls",
						path + "export/" + dateTime  + "-" + xlName +  "-路单审计.xls");
			} catch (Exception e) {
				logger.error("", e);
			}
		}

		return lMap;
	}

	//求和
	public static Map<String,Double> sum(List<CalcWaybillAudit> lists) {
		Map<String,Double> sum=new HashMap<>();
		double yylc=0;
		double inlc=0;
		double outlc=0;
		double kslc=0;
		double zkslc=0;
		double zlc=0;

		for (int i = 0; i < lists.size(); i++) {
			CalcWaybillAudit audit=lists.get(i);
			yylc=Arith.add(yylc,audit.getYylc());
			inlc=Arith.add(inlc,audit.getInlc());
			outlc=Arith.add(outlc,audit.getOutlc());
			kslc=Arith.add(kslc,audit.getKslc());
			zkslc=Arith.add(zkslc,audit.getZkslc());
			zlc=Arith.add(zlc,audit.getZlc());
		}
		sum.put("yylc",yylc);
		sum.put("inlc",inlc);
		sum.put("outlc",outlc);
		sum.put("kslc",kslc);
		sum.put("zkslc",zkslc);
		sum.put("zlc",zlc);
		return sum;
	}



	//计算少驶里程
	//"normal-正常班次、out-出场、in-进场、region-区间、venting-放空班次、major-放站班次、ldks-两点间空驶"
	@Override
	public Map<String, Double> culateksgl(List<ScheduleRealInfo> lists) {
		Map<String, Double> result=new HashMap<>();
		double out =0;
		double in =0;
		double venting =0;
		double major =0;
		double ldks =0;
		double normal =0;
		double region =0;
		double ksgl =0;//除进出场以外的空驶
		double zksgl =0;
		for (int i = 0; i < lists.size(); i++) {
			ScheduleRealInfo scheduleRealInfo=lists.get(i);
			if (scheduleRealInfo.getBcType().equals("in")) {
				Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
				if(childTaskPlans.isEmpty()){
					if(!scheduleRealInfo.isDestroy())
						in =Arith.add(in, scheduleRealInfo.getJhlc()==null?0:scheduleRealInfo.getJhlc());
				}else{
					Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
					while (it.hasNext()) {
						ChildTaskPlan childTaskPlan = it.next();
						if(childTaskPlan.getMileageType().equals("empty") && childTaskPlan.getCcId()==null){
							if (!childTaskPlan.isDestroy()) {
								Float jhgl=childTaskPlan.getMileage()==null?0:childTaskPlan.getMileage();
								in=Arith.add(in,jhgl);
							}
						}
					}
				}
			}else if (scheduleRealInfo.getBcType().equals("out")) {
				Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
				if(childTaskPlans.isEmpty()){
					if(!scheduleRealInfo.isDestroy())
						out =Arith.add(out, scheduleRealInfo.getJhlc()==null?0:scheduleRealInfo.getJhlc());
				}else{
					Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
					while (it.hasNext()) {
						ChildTaskPlan childTaskPlan = it.next();
						if(childTaskPlan.getMileageType().equals("empty") && childTaskPlan.getCcId()==null){
							if (!childTaskPlan.isDestroy()) {
								Float jhgl=childTaskPlan.getMileage()==null?0:childTaskPlan.getMileage();
								out=Arith.add(out,jhgl);
							}
						}
					}
				}
			}else if (scheduleRealInfo.getBcType().equals("venting")) {
				Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
				if(childTaskPlans.isEmpty()){
					if(!scheduleRealInfo.isDestroy())
						venting =Arith.add(venting, scheduleRealInfo.getJhlc()==null?0:scheduleRealInfo.getJhlc());
				}else{
					Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
					while (it.hasNext()) {
						ChildTaskPlan childTaskPlan = it.next();
						if(childTaskPlan.getMileageType().equals("empty") && childTaskPlan.getCcId()==null){
							if (!childTaskPlan.isDestroy()) {
								Float jhgl=childTaskPlan.getMileage()==null?0:childTaskPlan.getMileage();
								venting=Arith.add(venting,jhgl);
							}
						}
					}
				}
			}else if (scheduleRealInfo.getBcType().equals("major")) {
				Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
				if(childTaskPlans.isEmpty()){
					if(!scheduleRealInfo.isDestroy())
						major =Arith.add(major, scheduleRealInfo.getJhlc()==null?0:scheduleRealInfo.getJhlc());
				}else{
					Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
					while (it.hasNext()) {
						ChildTaskPlan childTaskPlan = it.next();
						if(childTaskPlan.getMileageType().equals("empty") && childTaskPlan.getCcId()==null){
							if (!childTaskPlan.isDestroy()) {
								Float jhgl=childTaskPlan.getMileage()==null?0:childTaskPlan.getMileage();
								major=Arith.add(major,jhgl);
							}
						}
					}
				}
			}else if (scheduleRealInfo.getBcType().equals("ldks")) {
				Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
				if(childTaskPlans.isEmpty()){
					if(!scheduleRealInfo.isDestroy())
						ldks =Arith.add(ldks, scheduleRealInfo.getJhlc()==null?0:scheduleRealInfo.getJhlc());
				}else{
					Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
					while (it.hasNext()) {
						ChildTaskPlan childTaskPlan = it.next();
						if(childTaskPlan.getMileageType().equals("empty") && childTaskPlan.getCcId()==null){
							if (!childTaskPlan.isDestroy()) {
								Float jhgl=childTaskPlan.getMileage()==null?0:childTaskPlan.getMileage();
								ldks=Arith.add(ldks,jhgl);
							}
						}
					}
				}
			}else if (scheduleRealInfo.getBcType().equals("normal")) {
				Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
				if(!childTaskPlans.isEmpty()){
					Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
					while (it.hasNext()) {
						ChildTaskPlan childTaskPlan = it.next();
						if(childTaskPlan.getMileageType().equals("empty") && childTaskPlan.getCcId()==null){
							if (!childTaskPlan.isDestroy()) {
								Float jhgl=childTaskPlan.getMileage()==null?0:childTaskPlan.getMileage();
								normal=Arith.add(normal,jhgl);
							}
						}
					}
				}
			}else if (scheduleRealInfo.getBcType().equals("region")) {
				Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
				if(!childTaskPlans.isEmpty()){
					Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
					while (it.hasNext()) {
						ChildTaskPlan childTaskPlan = it.next();
						if(childTaskPlan.getMileageType().equals("empty") && childTaskPlan.getCcId()==null){
							if (!childTaskPlan.isDestroy()) {
								Float jhgl=childTaskPlan.getMileage()==null?0:childTaskPlan.getMileage();
								region=Arith.add(region,jhgl);
							}
						}
					}
				}
			}
		}
		ksgl =Arith.add(Arith.add(Arith.add(Arith.add(venting,major),ldks),normal),region);
		zksgl=Arith.add(Arith.add(ksgl,in),out);
		result.put("out",out);
		result.put("in",in);
		result.put("venting",venting);
		result.put("major",major);
		result.put("in",in);
		result.put("ldks",ldks);
		result.put("normal",normal);
		result.put("region",region);
		result.put("ksgl",ksgl);
		result.put("zksgl",zksgl);
		return result;
	}

	@Override
	public List<Map<String, String>> carList() {
		List<Map<String, String>>  list=new ArrayList<>();
		Map<String, Cars> cars=BasicData.nbbm2CarMap;
		Iterator<String> iterator = cars.keySet().iterator();
		String key;
		while (iterator.hasNext()) {
			Map<String, String> map = new HashMap<>();
			key = iterator.next();
			Cars car=cars.get(key);
			map.put("nbbm", car.getInsideCode());
			map.put("carPlate", car.getCarPlate());
			map.put("gsbm", car.getBusinessCode());
			map.put("fgsbm", car.getBrancheCompanyCode());
			list.add(map);
		}
		return list;
	}

	class AccountXlbm implements Comparator<Map<String, Object>> {
		@Override
		public int compare(Map<String, Object> o1, Map<String, Object> o2) {
			return o1.get("xlNamePy").toString().compareTo(
					o2.get("xlNamePy").toString());
		}
	}
}