package com.ruoyi.buss.controller; import com.ruoyi.buss.common.DateUtils; import com.ruoyi.buss.common.NumberUtils; import com.ruoyi.buss.domain.*; import com.ruoyi.buss.domain.vo.TaskAssess; import com.ruoyi.buss.service.*; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.system.service.ISysDictDataService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.text.DecimalFormat; import java.util.*; import java.util.stream.Collectors; /** * 支队效能评估逻辑Controller * * @author yl * @date 2025-03-20 */ @Tag(name = "支队效能评估") @Controller @RequestMapping("/buss/zd/effect") public class ZdEffectEstimateController extends BaseController { private static final Logger log = LoggerFactory.getLogger(ZdEffectEstimateController.class); private static DecimalFormat df = new DecimalFormat("#.00"); private static DecimalFormat df2 = new DecimalFormat("#.0"); @Autowired private IDsTaskList2Service dsTaskList2Service; @Autowired private IDmBerth2Service dmBerth2Service; @Autowired private ISysDictDataService sysDictDataService; @Autowired private IDsTaskDetailService iDsTaskDetailService; @Autowired private IDsEffectAssessService dsEffectAssessService; @Autowired private IDsEffectAssessListService dsEffectAssessListService; @Autowired private IDmHarbor2Service dmHarbor2Service; private final static double B11_VALUE = 24; // 舰船平均任务时间 private final static int X_TOLERANCE_VALUE = 0; // 船舶数量 private final static Double OIL_PLACE_PER = 0.3; private final static Double MAT_PLACE_PER = 0.2; private final static Double AMMO_PLACE_PER = 0.5; private final static int SUPPLY_X_TIME = 2; /** * 计算支队效能评估 * @return */ @Operation(description = "支队效能评估计算") @Log(title = "支队效能评估计算", businessType = BusinessType.INSERT) @PostMapping("/estimate") @ResponseBody public AjaxResult estimate(@Parameter(name = "type", required = true, description = "评估类型") String type, @Parameter(name = "taskId", required = true, description = "任务ID") Long taskId, @Parameter(name = "deptId", required = true, description = "部门ID") Long deptId) { DmHarbor2 dmHarbor2 = new DmHarbor2(); dmHarbor2.setDeptId(deptId); List dmHarbor2List = dmHarbor2Service.selectDmHarborList(dmHarbor2); String dmHarborPkIds = ""; if (dmHarbor2List != null || dmHarbor2List.size() > 0) { for (DmHarbor2 dmHarbor : dmHarbor2List){ dmHarbor.getPKID(); dmHarborPkIds += dmHarbor.getPKID() + ","; } dmHarborPkIds = dmHarborPkIds.substring(0, dmHarborPkIds.length() - 1); dmHarborPkIds = "(" + dmHarborPkIds + ")"; } DsEffectAssessList assess = new DsEffectAssessList(); assess.setTYPE(type); List dsEffectAssessLists = dsEffectAssessListService.selectDsEffectAssessListList(assess); List dsTaskDetailList = iDsTaskDetailService.selectDsTaskDetailByTaskIdAndHarborIds(taskId, dmHarborPkIds); if (dsEffectAssessLists != null && dsEffectAssessLists.size() > 0) { for(int i = 0; i < dsEffectAssessLists.size(); i++){ DsEffectAssessList dsEffectAssessList = dsEffectAssessLists.get(i); log.debug("【" + dsEffectAssessList.getCODE() + "】 DsEffectAssessList Obj =====: " + dsEffectAssessList); String code = dsEffectAssessList.getCODE(); double weights = dsEffectAssessList.getWEIGHT(); double classifyWeight = dsEffectAssessList.getClassifyWeight(); double itemResult = calcNormItemResult(code, weights, dsTaskDetailList); DsEffectAssessList asscessList = new DsEffectAssessList(); asscessList.setPKID(dsEffectAssessList.getPKID()); asscessList.setVal(itemResult); dsEffectAssessListService.updateDsEffectAssessList(asscessList); } } // 计算最终评估结果 List dsEffectAssessLists2 = dsEffectAssessListService.selectDsEffectAssessListList(assess); double score = getScore(dsEffectAssessLists2); log.debug("Score =====: " + score); DsEffectAssess dsEffectAssess = new DsEffectAssess(taskId, score); dsEffectAssess.setCreateTime(new Date()); dsEffectAssess.setCreateBy(getUsername()); dsEffectAssess.setDeptId(getDeptId()); // 保存评估结果 dsEffectAssessService.updateOrInsertDsEffectAssess(dsEffectAssess); log.debug("完成更新/新增Access记录。"); TaskAssess taskAssess = new TaskAssess(); taskAssess.setList(dsEffectAssessLists); taskAssess.setAssess(dsEffectAssess); if(null != dsEffectAssessLists){ return success(taskAssess); } return error("获取能效评估详情失败,请重试"); } private double calcNormItemResult(String code, double weights, List dsTaskDetailList) { int result = 0; if ("B11".equals(code)) { // 独立参考指标不参与加权计算 } else if ("B12".equals(code)) { result = calcB12(dsTaskDetailList); } else if ("B13".equals(code)) { result = calcB13(dsTaskDetailList); } else if ("B14".equals(code)) { result = calcB14(dsTaskDetailList); } else if ("B15".equals(code)) { result = calcB15(dsTaskDetailList); } else if ("B16".equals(code)) { result = calcB16(dsTaskDetailList); } else if ("B17".equals(code)) { result = calcB17(dsTaskDetailList); } else if ("B21".equals(code)) { result = calcB21(dsTaskDetailList); } else if ("B22".equals(code)) { result = calcB22(dsTaskDetailList); } else if ("B23".equals(code)) { result = calcB23(dsTaskDetailList); } else if ("B24".equals(code)) { result = calcB24(dsTaskDetailList); } else if ("B25".equals(code)) { result = calcB25(dsTaskDetailList); } else if ("B31".equals(code)) { // 独立参考指标不参与加权计算 } else if ("B32".equals(code)) { result = calcB32(dsTaskDetailList); } else if ("B33".equals(code)) { // 独立参考指标不参与加权计算 } else if ("B34".equals(code)) { result = calcB34(dsTaskDetailList); } else if ("B35".equals(code)) { // 独立参考指标不参与加权计算 } else if ("B36".equals(code)) { result = calcB36(dsTaskDetailList); } else if ("B41".equals(code)) { result = calcB41(dsTaskDetailList); } else if ("B42".equals(code)) { result = calcB42(dsTaskDetailList); } else if ("B43".equals(code)) { result = calcB43(dsTaskDetailList); } else if ("B44".equals(code)) { result = calcB44(dsTaskDetailList); } else if ("B45".equals(code)) { result = calcB45(dsTaskDetailList); } log.debug("【" + code + "】权重值 ===:" + weights); log.debug("【" + code + "】计算结果 ===:" + result); log.debug("【" + code + "】加权值 ===:" + result * weights); return result * weights; } // 计算最终分数 private Double getScore(List list){ Double score = 0.0; if(null != list && list.size() > 0){ Map> groupedByCode = list.stream() .collect(Collectors.groupingBy(item -> item.getCODE().substring(0, 2))); for (Map.Entry> berthEntry : groupedByCode.entrySet()) { DsEffectAssessList effectAssess = berthEntry.getValue().get(0); Double classifyWeight = null == effectAssess.getClassifyWeight()?0.0:effectAssess.getClassifyWeight(); Double totalValue = berthEntry.getValue().stream() .mapToDouble(item -> item.getVal() * item.getWEIGHT()) .sum(); score += totalValue * classifyWeight; } } return NumberUtils.roundToTwoDecimalPlaces(score); } /** * B12:舰船平均任务时间:本港从T时刻起算,所有舰船从等待到完成补给的平均时间。 * 公式:10*(该原始指标/B11)。注:计算的是舰船平均补给时间与平均任务时间的比例,该值越大越好 * @return */ private int calcB12(List dsTaskDetails) { double result = 0; if (dsTaskDetails != null && dsTaskDetails.size() > 0) { for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail1 = dsTaskDetails.get(i); int oilTime = dsTaskDetail1.getOilTime(); int matTime = dsTaskDetail1.getMatTime(); int ammoTime = dsTaskDetail1.getAmmoTime(); int waterTime = dsTaskDetail1.getWaterTime(); // result += DateUtils.getDisHourOfTowDate(tTime,eTime1); result += oilTime + matTime + ammoTime + waterTime; } } double temp = (result / dsTaskDetails.size() / B11_VALUE) > 1 ? 1 : (result / dsTaskDetails.size() / B11_VALUE); log.debug("B12 Value =====:" + (10 * Double.parseDouble(df2.format(temp)))); return (int) (10 * Double.parseDouble(df2.format(temp))); } /** * B13:舰船平均等待时间:本港从T时刻起算,后续所有舰船等待时间均值。 * 公式:10*(1-该原始指标/B11)。注:计算的是舰船平均等待时间与平均任务时间的比例,等待时间越小越好,所以折算指标用1减去该值 * @return */ private int calcB13(List dsTaskDetails){ // 按加油需求、船类型和抵港时间排序 dsTaskDetails.sort(Comparator.comparing(DsTaskDetail::getBerthId).thenComparing(DsTaskDetail::getSupplySeq)); // 按泊位号进行分组 Map> detailMap = new HashMap<>(); for (DsTaskDetail detail : dsTaskDetails) { Long berthId = detail.getBerthId(); detailMap.computeIfAbsent(berthId, k -> new ArrayList<>()).add(detail); } double waitTime = 0.0; for (List groupDsTaskDetails : detailMap.values()) { Date startTDate = null; for (int i = 0; i < groupDsTaskDetails.size(); i++) { DsTaskDetail detail = groupDsTaskDetails.get(i); if (i == 0) { startTDate = detail.getT1(); } Date sTime = detail.getSTIME(); waitTime += DateUtils.getDisHourOfTowDate(startTDate, sTime); } } double temp = (waitTime / B11_VALUE) > 1 ? 1 : (waitTime / B11_VALUE); log.debug("B13 Value =====:" + (10 * (1 - Double.parseDouble(df2.format(temp))))); return (int) (10 * (1 - Double.parseDouble(df2.format(temp)))); } /** * B14:单舰折叠补给时间:本港补给起止时间差/舰艇数量。 * 24小时以上0分,18-24小时2分,12-18小时4分,8-12小时6分,4-8小时8分,4小时以下10分 * @return */ private int calcB14(List dsTaskDetails){ double result = 0; if (dsTaskDetails != null && dsTaskDetails.size() > 0) { for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail = dsTaskDetails.get(i); // Date sTime1 = dsTaskDetail.getSTIME(); int oilTime = dsTaskDetail.getOilTime(); int matTime = dsTaskDetail.getMatTime(); int ammoTime = dsTaskDetail.getAmmoTime(); int waterTime = dsTaskDetail.getWaterTime(); result += oilTime + matTime + ammoTime + waterTime; // result += DateUtils.getDisHourOfTowDate(sTime1, eTime1); } double point = result / (dsTaskDetails.size()); log.debug("B14 Value =====:" + point); if(point >= 24){ return 0; }else if(point > 18 && point <= 24){ return 2; }else if(point > 12 && point <= 18){ return 4; }else if(point > 8 && point <= 12){ return 6; }else if(point > 4 && point <= 8){ return 8; }else if(point <= 4){ return 10; } } return 0; } /** * B15:舰船同时补给数量:本港根据泊位数和并靠策略,计算可同时补给的舰船数。 * 10*原始指标/(2*总泊位数),注:按本港所有泊位可用且双舰并靠为参考数,大于10时取10 * @return */ private int calcB15(List dsTaskDetails){ int berthCount = getBerthCountOfHarbor(); if (dsTaskDetails != null && dsTaskDetails.size() > 0) { String parkingType = dsTaskDetails.get(0).getParkingType(); if ("1".equals(parkingType)) { if (dsTaskDetails.size() >= berthCount) { return berthCount; } else if (dsTaskDetails.size() < berthCount) { return dsTaskDetails.size(); } } else if ("2".equals(parkingType)) { if (dsTaskDetails.size() / 2 >= berthCount) { return berthCount * 2; } else if (dsTaskDetails.size() / 2 < berthCount) { if (dsTaskDetails.size() % 2 == 0) { return dsTaskDetails.size() / 2; } else { return (dsTaskDetails.size() / 2) + 1; } } } else if ("3".equals(parkingType)) { if (dsTaskDetails.size() / 3 >= berthCount) { return berthCount * 3; } else if (dsTaskDetails.size() / 3 < berthCount) { if (dsTaskDetails.size() % 3 == 0) { return dsTaskDetails.size() / 3; } else { return (dsTaskDetails.size() / 3) + 1; } } } } return 0; } /** * B16:各泊位结束时间最大差:本港各泊位补给作业最终结束时间最大差值。 * 24小时以上0分,16-24小时2分,12-16小时4分,8-12小时6分,4-8小时8分,4小时以内10分 * @return */ private int calcB16(List dsTaskDetails){ List eTimeList = new ArrayList<>(); if(dsTaskDetails != null && dsTaskDetails.size() > 0){ for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail1 = dsTaskDetails.get(i); Date sTime = dsTaskDetail1.getSTIME(); int oilTime = dsTaskDetail1.getOilTime(); int matTime = dsTaskDetail1.getMatTime(); int ammoTime = dsTaskDetail1.getAmmoTime(); int waterTime = dsTaskDetail1.getWaterTime(); int result = oilTime + matTime + ammoTime + waterTime; Date eTime = DateUtils.getDateAfterHours(sTime, result); eTimeList.add(eTime); } // 获取最小时间 Date minDate = Collections.min(eTimeList); // 获取最大时间 Date maxDate = Collections.max(eTimeList); // 计算时间差 double dateInterval = DateUtils.getDisHourOfTowDate(minDate, maxDate); log.debug("B16 Value =====:" + dateInterval); if(dateInterval >= 24){ return 0; }else if(dateInterval >= 16 && dateInterval < 24){ return 2; }else if(dateInterval >= 12 && dateInterval < 16){ return 4; }else if (dateInterval >= 8 && dateInterval < 12){ return 6; }else if (dateInterval >= 4 && dateInterval < 8){ return 8; }else if (dateInterval < 4){ return 10; } } return 0; } /** * B17:补给容差占比均值:本港各舰容差X相对于补给时间A2所占比例的平均值。 * 10*(1-该原始指标值) * @return */ private int calcB17(List dsTaskDetails) { double allValue = 0.0; for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail detail = dsTaskDetails.get(i); int oilTime = detail.getOilTime(); int ammoTime = detail.getAmmoTime(); int matTime = detail.getMatTime(); int waterTime = detail.getWaterTime(); int totalTime = oilTime + ammoTime + matTime + waterTime; allValue += (double) totalTime / SUPPLY_X_TIME; } double avg = allValue / dsTaskDetails.size() > 1 ? 1 : allValue / dsTaskDetails.size(); log.debug("B17 Value =====:" + (10 * (1 - Double.parseDouble(df2.format(avg))))); return (int) (10 * (1 - Double.parseDouble(df2.format(avg)))); } /** * B21:单舰平均停靠时间:本港各舰艇从T时刻到T+X补给结束的平均值。 * 48小时以上4分,36-48小时6分,24-30小时8分,18-24小时10分,12-18小时8分,12小时以下6分,以24小时为中心的正态分布。 * @return */ private int calcB21(List dsTaskDetails) { double dateInterval = 0; if (dsTaskDetails != null && dsTaskDetails.size() > 0) { for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail1 = dsTaskDetails.get(i); Date tTime = dsTaskDetail1.getT1(); int oilTime = dsTaskDetail1.getOilTime(); int ammoTime = dsTaskDetail1.getAmmoTime(); int matTime = dsTaskDetail1.getMatTime(); int waterTime = dsTaskDetail1.getWaterTime(); int totalTime = oilTime + ammoTime + matTime + waterTime; dateInterval += totalTime + 1; } double avg = dateInterval / dsTaskDetails.size(); log.debug("B21 Value =====:" + avg); if (avg >= 48) { return 4; } else if (avg >= 36 && avg < 48) { return 6; } else if (avg >= 24 && avg < 30) { return 8; } else if (avg >= 18 && avg < 24) { return 10; } else if (avg >= 12 && avg < 18) { return 8; } else if (avg < 12) { return 6; } } return 0; } /** * B22:补给作业时间均值:各舰艇主线补给作业时间的平均值。 * 36小时以上4分,24-36小时6分,20-24小时8分,16-20小时10分,12-16小时8分,8小时以下6分,以18小时为中心的正态分布。 * @return */ private int calcB22(List dsTaskDetails){ double dateInterval = 0; if (dsTaskDetails != null && dsTaskDetails.size() > 0) { for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail1 = dsTaskDetails.get(i); Date sTime = dsTaskDetail1.getSTIME(); int oilTime = dsTaskDetail1.getOilTime(); int matTime = dsTaskDetail1.getMatTime(); int ammoTime = dsTaskDetail1.getAmmoTime(); int waterTime = dsTaskDetail1.getWaterTime(); int result = oilTime + matTime + ammoTime + waterTime; dateInterval += result - X_TOLERANCE_VALUE; } double avg = dateInterval / dsTaskDetails.size(); log.debug("B22 Value =====:" + avg); if(avg >= 36){ return 4; }else if(avg >= 24 && avg < 36){ return 6; }else if(avg >= 20 && avg < 24){ return 8; }else if (avg >= 16 && avg < 20){ return 10; }else if (avg >= 12 && avg < 16){ return 8; }else if (avg < 8){ return 6; } } return 0; } /** * B23:补给非作业时间均值:(各舰艇停泊时间-作业时间)的平均值。 * 24小时以上0分,16-24小时2分,12-16小时4分,8-12小时6分,4-8小时8分,4小时以内10分。该值越小越好,但也不可能为0,所以4小时以下均为最好。 * @return */ private int calcB23(List dsTaskDetails){ double allTime = 0; if (dsTaskDetails != null && dsTaskDetails.size() > 0) { for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail1 = dsTaskDetails.get(i); int oilTime = dsTaskDetail1.getOilTime(); int ammoTime = dsTaskDetail1.getAmmoTime(); int matTime = dsTaskDetail1.getMatTime(); int waterTime = dsTaskDetail1.getWaterTime(); int totalTime = oilTime + ammoTime + matTime + waterTime; //int elecSTime = dsTaskDetail1.getElecStime(); //int elecETime = dsTaskDetail1.getElecEtime(); int waterSTime = dsTaskDetail1.getWaterStime(); int waterETime = dsTaskDetail1.getWaterEtime(); int oilSTime = dsTaskDetail1.getOilStime(); int oilETime = dsTaskDetail1.getOilEtime(); int ammoSTime = dsTaskDetail1.getAmmoStime(); int ammoETime = dsTaskDetail1.getAmmoEtime(); int matSTime = dsTaskDetail1.getMatStime(); int matETime = dsTaskDetail1.getMatEtime(); int workTime = (waterETime - waterSTime) + (oilETime - oilSTime) + (ammoETime - ammoSTime) + (matETime - matSTime); allTime += Math.abs(totalTime + 1 - workTime); } double avg = allTime / dsTaskDetails.size(); log.debug("B23 Value =====:" + avg); if(avg >= 24){ return 0; }else if(avg >= 16 && avg < 24){ return 2; }else if(avg >= 12 && avg < 16){ return 4; }else if (avg >= 8 && avg < 12){ return 6; }else if (avg >= 4 && avg < 8){ return 8; }else if (avg < 4){ return 10; } } return 0; } /** * B24:补给作业停泊比例:各舰累计补给时间总和/累计靠泊时间总和 * 10*该原始指标值。 * @return */ private int calcB24(List dsTaskDetails) { double allBerthTime = 0; double allWorkTime = 0; if (dsTaskDetails != null && dsTaskDetails.size() > 0) { for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail1 = dsTaskDetails.get(i); int oilTime = dsTaskDetail1.getOilTime(); int ammoTime = dsTaskDetail1.getAmmoTime(); int matTime = dsTaskDetail1.getMatTime(); int waterTime = dsTaskDetail1.getWaterTime(); int totalTime = oilTime + ammoTime + matTime + waterTime; int waterSTime = dsTaskDetail1.getWaterStime(); int waterETime = dsTaskDetail1.getWaterEtime(); int oilSTime = dsTaskDetail1.getOilStime(); int oilETime = dsTaskDetail1.getOilEtime(); int ammoSTime = dsTaskDetail1.getAmmoStime(); int ammoETime = dsTaskDetail1.getAmmoEtime(); int matSTime = dsTaskDetail1.getMatStime(); int matETime = dsTaskDetail1.getMatEtime(); allWorkTime += (waterETime - waterSTime) + (oilETime - oilSTime) + (ammoETime - ammoSTime) + (matETime - matSTime); allBerthTime += Math.abs(totalTime); } double temp = allWorkTime / allBerthTime > 1 ? 1 : allWorkTime / allBerthTime; log.debug("B24 Value =====:" + (10 * (Double.parseDouble(df2.format(temp))))); return (int) (10 * (Double.parseDouble(df2.format(temp)))); } return 0; } /** * B25:补给时间折叠比例:本批补给起止时间差/各舰补给时间总和 * 10*(1-该原始指标值) * @return */ private int calcB25(List dsTaskDetails){ List eTimeList = new ArrayList<>(); double allWorkTime = 0; if (dsTaskDetails != null && dsTaskDetails.size() > 0) { for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail1 = dsTaskDetails.get(i); eTimeList.add(dsTaskDetail1.getSTIME()); int oilTime = dsTaskDetail1.getOilTime(); int ammoTime = dsTaskDetail1.getAmmoTime(); int matTime = dsTaskDetail1.getMatTime(); int waterTime = dsTaskDetail1.getWaterTime(); int totalTime = oilTime + ammoTime + matTime + waterTime + X_TOLERANCE_VALUE; Date eTime = DateUtils.getDateAfterHours(dsTaskDetail1.getSTIME(), totalTime); eTimeList.add(eTime); int waterSTime = dsTaskDetail1.getWaterStime(); int waterETime = dsTaskDetail1.getWaterEtime(); int oilSTime = dsTaskDetail1.getOilStime(); int oilETime = dsTaskDetail1.getOilEtime(); int ammoSTime = dsTaskDetail1.getAmmoStime(); int ammoETime = dsTaskDetail1.getAmmoEtime(); int matSTime = dsTaskDetail1.getMatStime(); int matETime = dsTaskDetail1.getMatEtime(); allWorkTime += (waterETime - waterSTime) + (oilETime - oilSTime) + (ammoETime - ammoSTime) + (matETime - matSTime); } // 获取最小时间 Date minDate = Collections.min(eTimeList); // 获取最大时间 Date maxDate = Collections.max(eTimeList); // 计算时间差 double dateInterval = DateUtils.getDisHourOfTowDate(maxDate, minDate); double temp = (dateInterval / allWorkTime) > 1 ? 1 : (dateInterval / allWorkTime); log.debug("B25 Value =====:" + (10 * (1 - Double.parseDouble(df2.format(temp))))); return (int) (10 * (1 - Double.parseDouble(df2.format(temp)))); } return 0; } /** * B32:水电保障日作业强度:各水电小组24小时内平均作业时间/24小时,平均值 * 10 * 该原始指标值 * @return */ private int calcB32(List dsTaskDetails){ double allTime = 0; for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail1 = dsTaskDetails.get(i); // int elecSTime = dsTaskDetail1.getElecStime(); // int elecETime = dsTaskDetail1.getElecEtime(); // int eleTime = elecETime - elecSTime; int waterTime = dsTaskDetail1.getWaterTime(); allTime += waterTime; } double avgValue = (allTime / (dsTaskDetails.size() * 24)) > 1 ? 1 : (allTime / (dsTaskDetails.size() * 24)); log.debug("B32 Value =====:" + (10 * Double.parseDouble(df2.format(avgValue)))); return (int) (10 * Double.parseDouble(df2.format(avgValue))); } /** * B34:油料补给日作业强度:各加油小组24小时内平均作业时间/24小时,平均值 * 10 * 该原始指标值 * @return */ private int calcB34(List dsTaskDetails){ double days = 0; double allTime = 0; for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail1 = dsTaskDetails.get(i); Date sTime= dsTaskDetail1.getSTIME(); int oilTime = dsTaskDetail1.getOilTime(); Date oilEndTime = DateUtils.getDateAfterHours(sTime, oilTime); double hourDistance = DateUtils.getDisHourOfTowDate(sTime, oilEndTime); if(hourDistance < 24){ days += 1; }else { days += (int) Math.ceil(hourDistance / 24); } allTime += oilTime; } double avgValue = (allTime / (days * 24)) > 1 ? 1 : (allTime / (days * 24)); log.debug("B34 Value =====:" + (10 * Double.parseDouble(df2.format(avgValue)))); return (int) (10 * Double.parseDouble(df2.format(avgValue))); } /** * B36:物资补给日作业强度:各物资车辆24小时内作业时间/24小时,平均值 * 10 * 该原始指标值 * @return */ private int calcB36(List dsTaskDetails) { double days = 0; double allTime = 0; for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail1 = dsTaskDetails.get(i); Date sTime= dsTaskDetail1.getSTIME(); int matTime = dsTaskDetail1.getMatTime(); Date matEndTime = DateUtils.getDateAfterHours(sTime, matTime); double hourDistance = DateUtils.getDisHourOfTowDate(sTime, matEndTime); if(hourDistance < 24){ days += 1; }else { days += (int) Math.ceil(hourDistance / 24); } allTime += matTime; } double avgValue = (allTime / (days * 24)) > 1 ? 1 : (allTime / (days * 24)); log.debug("B36 Value =====:" + (10 * Double.parseDouble(df2.format(avgValue)))); return (int) (10 * Double.parseDouble(df2.format(avgValue))); } /** * B41:泊位日均周转艘次:本港补给舰船总数量/天数/泊位数 * 10 * 该原始指标值/3,注:3为参考值,通常最大周转量不大于3(就是三艘并靠1天的情况),如果大于10则取值为10 * @return */ private int calcB41(List dsTaskDetails) { List timeList = new ArrayList<>(); for (int i = 0; i < dsTaskDetails.size() - 1; i++) { DsTaskDetail dsTaskDetail1 = dsTaskDetails.get(i); timeList.add(dsTaskDetail1.getSTIME()); int oilTime = dsTaskDetail1.getOilTime(); int ammoTime = dsTaskDetail1.getAmmoTime(); int matTime = dsTaskDetail1.getMatTime(); int waterTime = dsTaskDetail1.getWaterTime(); int totalTime = oilTime + ammoTime + matTime + waterTime; Date eTime = DateUtils.getDateAfterHours(dsTaskDetail1.getSTIME(), totalTime + X_TOLERANCE_VALUE); timeList.add(eTime); } // 获取最小时间 Date minDate = Collections.min(timeList); // 获取最大时间 Date maxDate = Collections.max(timeList); // 计算时间差 double days = DateUtils.getSubtractOfTowDate(maxDate, minDate); int berthCount = getBerthCountOfHarbor(); double originalValue = (dsTaskDetails.size() / days / berthCount / 3) > 1 ? 1 : (dsTaskDetails.size() / days / berthCount / 3); log.debug("B41 Value =====:" + (10 * Double.parseDouble(df2.format(originalValue)))); return (int) (10 * Double.parseDouble(df2.format(originalValue))); } /** * B42:前沿占地最大均值:本港补给各港各码头各泊位最大占地均值 * 检索各前沿场地占用率,取最大值均值 * @return */ private int calcB42(List dsTaskDetails) { double allValue = 0.0; for (int i = 1; i <= 24; i++) { String timeSlot = "t" + i; int oilCount = 0; int ammoCount = 0; int matCount = 0; for (DsTaskDetail task : dsTaskDetails) { if (task.getOilStime() != null && task.getOilStime() <= i && task.getOilEtime() >= i) { oilCount++; } else if (task.getAmmoStime() != null && task.getAmmoStime() <= i && task.getAmmoEtime() >= i) { ammoCount++; } else if (task.getMatStime() != null && task.getMatStime() <= i && task.getMatEtime() >= i) { matCount++; } } Double totalSupply = NumberUtils.roundToTwoDecimalPlaces(oilCount * OIL_PLACE_PER + ammoCount * AMMO_PLACE_PER + matCount * MAT_PLACE_PER); double maxPlat = 0.0; if(maxPlat < totalSupply){ maxPlat = totalSupply; } allValue += maxPlat; } double temp = (allValue / dsTaskDetails.size()) > 1 ? 1 : (allValue / dsTaskDetails.size()); log.debug("B42 Value =====:" + (10 * Double.parseDouble(df2.format(temp)))); return (int) (10 * Double.parseDouble(df2.format(temp))); } /** * B43:前沿占半时长均值:本港补给各泊位首个24小时内占地0.5以上的时间均值 * 10*该原始指标值/24,注:基准值取24小时 * @return */ private int calcB43(List dsTaskDetails) { Integer platTime = 0; for (int i = 1; i <= 24; i++) { int oilCount = 0; int ammoCount = 0; int matCount = 0; for (DsTaskDetail task : dsTaskDetails) { if (task.getOilStime() != null && task.getOilStime() <= i && task.getOilEtime() >= i) { oilCount++; } else if (task.getAmmoStime() != null && task.getAmmoStime() <= i && task.getAmmoEtime() >= i) { ammoCount++; } else if (task.getMatStime() != null && task.getMatStime() <= i && task.getMatEtime() >= i) { matCount++; } } Double totalSupply = NumberUtils.roundToTwoDecimalPlaces(oilCount * OIL_PLACE_PER + ammoCount * AMMO_PLACE_PER + matCount * MAT_PLACE_PER); if(totalSupply >= 0.5){ platTime++; } } double temp = (platTime / 24) > 1 ? 1 : (platTime / 24); log.debug("B43 Value =====:" + (10 * Double.parseDouble(df2.format(temp)))); return (int) (10 * Double.parseDouble(df2.format(temp))); } /** * B44:加油设施日均使用率:本港按泊位统计设施首个24小时内加油作业时间/24小时,求均值 * 检索各泊位首个24小时内加油作业时间/24 * @return */ private int calcB44(List dsTaskDetails) { // 按加油需求、船类型和抵港时间排序 dsTaskDetails.sort(Comparator.comparing(DsTaskDetail::getBerthId).thenComparing(DsTaskDetail::getSupplySeq)); // 按泊位号进行分组 Map> detailMap = new HashMap<>(); for (DsTaskDetail detail : dsTaskDetails) { Long berthId = detail.getBerthId(); detailMap.computeIfAbsent(berthId, k -> new ArrayList<>()).add(detail); } Date after24Hour = null; // 首个24小时截止时间 double allTime = 0.0; for (List groupDsTaskDetails : detailMap.values()) { for (int i = 0; i < groupDsTaskDetails.size(); i++) { DsTaskDetail detail1 = groupDsTaskDetails.get(i); int oilStartTime = detail1.getOilStime(); int oilEndTime = detail1.getOilEtime(); int oilTime = detail1.getOilTime(); Date t1Date = detail1.getT1(); Date oilStartDate = DateUtils.getDateAfterHours(t1Date, oilStartTime); Date oilEndDate = DateUtils.getDateAfterHours(t1Date, oilTime); if (i == 0) { after24Hour = DateUtils.getDateAfterHours(t1Date, 24); } if (oilStartDate.before(after24Hour) && oilEndDate.before(after24Hour)) { allTime += oilTime; } else if (oilStartDate.before(after24Hour) && oilEndDate.after(after24Hour)) { allTime += DateUtils.getDisHourOfTowDate(oilStartDate, after24Hour); } else { allTime += 0; } } } double temp = (allTime / 24) > 1 ? 1 : (allTime / 24); log.debug("B44 Value =====:" + (10 * Double.parseDouble(df2.format(temp)))); return (int) (10 * Double.parseDouble(df2.format(temp))); } /** * B45:各泊位物资车次均值:本港补给各泊位首个24小时内物资车辆来往次数的均值 * 10 * 该原始指标值/24,注:基准值取24,即平均每小时1车次补给。 * @return */ private static final int VECHILE_COUNT = 10; // 车辆数量 private int calcB45(List dsTaskDetails) { // 按泊位、补给顺序排序 dsTaskDetails.sort(Comparator.comparing(DsTaskDetail::getBerthId).thenComparing(DsTaskDetail::getSupplySeq)); // 按泊位号进行分组 Map> detailMap = new HashMap<>(); for (DsTaskDetail detail : dsTaskDetails) { Long berthId = detail.getBerthId(); detailMap.computeIfAbsent(berthId, k -> new ArrayList<>()).add(detail); } Date after24Hour = null; // 首个24小时截止时间 double allCount = 0.0; for (List groupDsTaskDetails : detailMap.values()) { for (int i = 0; i < groupDsTaskDetails.size(); i++) { DsTaskDetail detail1 = groupDsTaskDetails.get(i); int matStartTime = detail1.getMatStime(); int matEndTime = detail1.getMatEtime(); int matTime = detail1.getMatTime(); Date t1Date = detail1.getT1(); Date matStartDate = DateUtils.getDateAfterHours(t1Date, matStartTime); Date matEndDate = DateUtils.getDateAfterHours(t1Date, matEndTime); if (i == 0) { after24Hour = DateUtils.getDateAfterHours(t1Date, 24); } if (matStartDate.before(after24Hour) && matEndDate.before(after24Hour)) { allCount += detail1.getFood() + detail1.getFoodO() + detail1.getFoodW(); } else { allCount += 0; } } } double temp = (allCount / VECHILE_COUNT / 24) > 1? 1 : (allCount / VECHILE_COUNT / 24); log.debug("B45 Value =====:" + (10 * Double.parseDouble(df2.format(temp)))); return (int) (10 * Double.parseDouble(df2.format(temp))); } /** * 根据用户当前所在部门,获取用户管辖下的港口泊位数量。 * @return */ private int getBerthCountOfHarbor(){ LoginUser sysUser = getLoginUser(); Long deptId = sysUser.getDeptId(); DmBerth2 dmBerth2 = new DmBerth2(); dmBerth2.setDeptId(deptId); List dmBerth2List = dmBerth2Service.selectDmBerthList(dmBerth2); return dmBerth2List.size(); } }