package com.yuanchu.limslaboratory.service.impl; import com.yuanchu.limslaboratory.mapper.InspectionMapper; import com.yuanchu.limslaboratory.mapper.InspectionProductMapper; import com.yuanchu.limslaboratory.pojo.vo.LineChartVO; import com.yuanchu.limslaboratory.pojo.vo.LineSeriesVO; import com.yuanchu.limslaboratory.pojo.vo.ProjectNumVo; import com.yuanchu.limslaboratory.pojo.vo.StatisticsDataVo; import com.yuanchu.limslaboratory.service.HomeService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @Service public class HomeServiceImpl implements HomeService { @Resource InspectionMapper inspectionMapper; @Resource InspectionProductMapper inspectionProductMapper; //计算检验与未检验的单子与项目的数量接口 @Override public ProjectNumVo checkProjectNum() { ProjectNumVo projectNumVo = new ProjectNumVo(); //已检验的检验单数量 projectNumVo.setInsNum(inspectionMapper.seleCountIns()); //未检验的检验单数量 projectNumVo.setInsUnNum(inspectionMapper.seleCountUnIns()); //已检验的检验项目数量 projectNumVo.setInsproNum(inspectionProductMapper.seleCountInspro()); //未检验的检验项目数量 projectNumVo.setInsproUnNum(inspectionProductMapper.seleCountUnInspro()); return projectNumVo; } //已检验top3 @Override public List> checktop3() { //获取检验单总数 Integer allIns = inspectionMapper.getcount(); //检验结论,检验数量 List> mapList = inspectionMapper.getResultNum(); for (Map map : mapList) { //遍历获取数量 Long num = (Long) map.get("num"); //计算百分比并存入map中 map.put("chact", getRadio(allIns, num)); } return mapList; } //未检验tpo4 @Override public List> unchecktop4() { //检验项目,设备,检验开始时间,执行人,检验结束时间 List> mapList = inspectionProductMapper.getResultNum(); return mapList; } //计算原材料与成品的合格率 @Override @Transactional(rollbackFor = Exception.class) public StatisticsDataVo qualified() { StatisticsDataVo statisticsDataVo = new StatisticsDataVo(); //原材料检验单总数 Integer allmater = inspectionMapper.getallmater(); //原材料合格率 Long mater = inspectionMapper.qualified(1); statisticsDataVo.setMaterial(getRadio(allmater, mater)); //原材料不合格率 Long unmater = inspectionMapper.qualified(0); statisticsDataVo.setUnmaterial(getRadio(allmater, unmater)); //原材料未检验率 Long notmater = inspectionMapper.qualified(null); statisticsDataVo.setNotmaterial(getRadio(allmater, notmater)); //成品检验单总数 Integer allfin = inspectionMapper.getallfin(); //成品合格率 Long finished = inspectionMapper.qualifiedfin(1); statisticsDataVo.setFinished(getRadio(allfin, finished)); //成品不合格率 Long unfinished = inspectionMapper.qualifiedfin(0); statisticsDataVo.setUnfinished(getRadio(allfin, unfinished)); //成品未检验率 Long notfinished = inspectionMapper.qualifiedfin(null); statisticsDataVo.setNotfinished(getRadio(allfin, notfinished)); return statisticsDataVo; } //统计 @Override @Transactional(rollbackFor = Exception.class) public LineChartVO turno(Integer type) { LineChartVO lineChartVO = new LineChartVO(); List series = new ArrayList<>(); //构建第一个lineSeriesVO1(原材料检验数量) LineSeriesVO lineSeriesVO1 = new LineSeriesVO(); lineSeriesVO1.setName("原材料检验数量"); //构建第二个lineSeriesVO2(成品检验数量) LineSeriesVO lineSeriesVO2 = new LineSeriesVO(); lineSeriesVO2.setName("成品检验数量"); //构建第三个lineSeriesVO3(原材料合格率) LineSeriesVO lineSeriesVO3 = new LineSeriesVO(); lineSeriesVO3.setName("原材料合格率"); //构建第四个lineSeriesVO4(成品合格率) LineSeriesVO lineSeriesVO4 = new LineSeriesVO(); lineSeriesVO4.setName("成品合格率"); List list1 = new ArrayList<>(); List list2 = new ArrayList<>(); List list3 = new ArrayList<>(); List list4 = new ArrayList<>(); switch (type) { /*本周*/ case 1: List dayofWeeks = getDayofWeeks(); lineChartVO.setXAxis(dayofWeeks); for (String dayofWeek : dayofWeeks) { //查询该日期的原材料检验数量 Integer allMaterByDay = inspectionMapper.getMaterByDay(dayofWeek); list1.add(allMaterByDay); //查询该日期的成品检验数量 Integer allFinByDay = inspectionMapper.getFinByDay(dayofWeek); list2.add(allFinByDay); //查询该日期的原材料合格率 Long okMaterByDay = inspectionMapper.getOkMaterByDay(dayofWeek); list3.add(getRadio(allMaterByDay, okMaterByDay)); //查询该日期的成品合格率 Long okFinByDay = inspectionMapper.getOkFinByDay(dayofWeek); list4.add(getRadio(allFinByDay, okFinByDay)); } break; /*本月*/ case 2: List dayofMonths = getDayofMonth(); lineChartVO.setXAxis(dayofMonths); for (String dayofMonth : dayofMonths) { //查询该日期的原材料检验数量 Integer allMaterByDay = inspectionMapper.getMaterByDay(dayofMonth); list1.add(allMaterByDay); //查询该日期的成品检验数量 Integer allFinByDay = inspectionMapper.getFinByDay(dayofMonth); list2.add(allFinByDay); //查询该日期的原材料合格率 Long okMaterByDay = inspectionMapper.getOkMaterByDay(dayofMonth); list3.add(getRadio(allMaterByDay, okMaterByDay)); //查询该日期的成品合格率 Long okFinByDay = inspectionMapper.getOkFinByDay(dayofMonth); list4.add(getRadio(allFinByDay, okFinByDay)); } break; /*本年*/ case 3: List monthofYears = getMonthofYear(); lineChartVO.setXAxis(monthofYears); for (String monthofYear : monthofYears) { //查询该日期范围内的原材料检验数量 Integer allMaterByDay = inspectionMapper.getMaterByMonth(monthofYear); list1.add(allMaterByDay); //查询该日期的成品检验数量 Integer allFinByDay = inspectionMapper.getFinByMonth(monthofYear); list2.add(allFinByDay); //查询该日期的原材料合格率 Long okMaterByDay = inspectionMapper.getOkMaterByMonth(monthofYear); list3.add(getRadio(allMaterByDay, okMaterByDay)); //查询该日期的成品合格率 Long okFinByDay = inspectionMapper.getOkFinByMonth(monthofYear); list4.add(getRadio(allFinByDay, okFinByDay)); } break; } lineSeriesVO1.setData(list1); lineSeriesVO2.setData(list2); lineSeriesVO3.setData(list3); lineSeriesVO4.setData(list4); series.add(lineSeriesVO1); series.add(lineSeriesVO2); series.add(lineSeriesVO3); series.add(lineSeriesVO4); lineChartVO.setSeries(series); return lineChartVO; } /*计算百分比*/ private BigDecimal getRadio(Integer all, Long num) { if (all.intValue() == 0) { return new BigDecimal(0); } BigDecimal numBigDecimal = new BigDecimal(num); BigDecimal allBigDecimal = new BigDecimal(all); BigDecimal divide = numBigDecimal.divide(allBigDecimal, 4, BigDecimal.ROUND_HALF_UP); return divide.multiply(new BigDecimal(100)); } /*获取本年月份list集合*/ private List getMonthofYear() { // 获取当前年份 int year = YearMonth.now().getYear(); // 创建月份列表 List months = new ArrayList<>(); // 添加月份到列表 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); for (int i = 1; i <= 12; i++) { YearMonth month = YearMonth.of(year, i); String monthString = month.format(formatter); months.add(monthString); } return months; } /*获取本月日份list集合*/ private List getDayofMonth() { // 获取当前日期 LocalDate now = LocalDate.now(); // 获取当前月份 YearMonth currentMonth = YearMonth.from(now); // 获取该月的天数 int daysInMonth = currentMonth.lengthOfMonth(); // 创建日期列表 List dates = new ArrayList<>(); // 添加日期到列表 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); for (int i = 1; i <= daysInMonth; i++) { LocalDate date = currentMonth.atDay(i); String dateString = date.format(formatter); dates.add(dateString); } return dates; } /*获取本周日份list集合*/ private List getDayofWeeks() { // 获取当前日期 LocalDate now = LocalDate.now(); // 获取本周的第一天和最后一天 LocalDate startOfWeek = now.with(DayOfWeek.MONDAY); LocalDate endOfWeek = now.with(DayOfWeek.SUNDAY); // 创建日期列表 List dates = new ArrayList<>(); // 添加日期到列表 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); while (!startOfWeek.isAfter(endOfWeek)) { String dateString = startOfWeek.format(formatter); dates.add(dateString); startOfWeek = startOfWeek.plusDays(1); } return dates; } }