package com.ruoyi.buss.controller; import com.ruoyi.buss.common.DateUtils; import com.ruoyi.buss.domain.DmHarbor2; import com.ruoyi.buss.domain.DsTask; import com.ruoyi.buss.domain.DsTaskList2; import com.ruoyi.buss.domain.dto.AllocationReqDTO; import com.ruoyi.buss.domain.dto.DsTaskQueryParam; import com.ruoyi.buss.domain.vo.TaskListStatis; import com.ruoyi.buss.service.IDmHarbor2Service; import com.ruoyi.buss.service.IDsTaskList2Service; import com.ruoyi.buss.service.IDsTaskService; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.web.domain.server.Sys; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @Tag(name = "基地任务接口") @RestController @RequestMapping("/buss/task/ex") public class DMTaskController extends BaseController { @Autowired private IDsTaskService iDsTaskService; @Autowired private IDsTaskList2Service iDsTaskListService; @Autowired private IDmHarbor2Service iDmHarborService; @Operation(summary = "获取所有任务列表") @PostMapping("/histask/list") @ResponseBody public AjaxResult getTaskList(@RequestBody DsTaskQueryParam param) { if(null != param.getEtime()){ param.setEtime(DateUtils.setToNextDayZero(param.getEtime())); } List dsTaskList = iDsTaskService.selectDsTaskListByParam(param); return success(dsTaskList); } @Operation(summary = "任务完成接口_通过ID") @PostMapping("/complete/{id}") @ResponseBody public AjaxResult complete(@Parameter(name = "id", required = true, description = "任务ID") @PathVariable("id") Long id) { DsTaskList2 taskList2 = iDsTaskListService.selectDsTaskListByPkid(id); if(null != taskList2){ taskList2.setStatus("10"); taskList2.setUpdateBy(getUsername()); int flag = iDsTaskListService.updateDsTaskList(taskList2); if(flag == 1){ return success("任务完成成功"); } return error("任务完成失败"); } return error("未获取到任务"); } @Operation(summary = "任务完成接口_通过任务Id和舷号") @PostMapping("/complete/taskandship/{taskid}/{shipno}") @ResponseBody public AjaxResult completeWithShipAndTaskId(@Parameter(name = "taskid", required = true, description = "任务ID") @PathVariable("taskid") Long taskid, @Parameter(name = "shipno", required = true, description = "舷号") @PathVariable("shipno") String shipno) { DsTaskList2 queryParam = new DsTaskList2(); queryParam.setTaskId(taskid); queryParam.setShipNo(shipno); List taskList2 = iDsTaskListService.selectDsTaskListList(queryParam); if(null != taskList2 && taskList2.size() > 0){ DsTaskList2 tmpTask = taskList2.get(0); tmpTask.setStatus("10"); tmpTask.setUpdateBy(getUsername()); int flag = iDsTaskListService.updateDsTaskList(tmpTask); if(flag == 1){ return success("任务完成成功"); } return error("任务完成失败"); } return error("未获取到任务"); } @Operation(summary = "任务列表_默认获取正在执行的任务") @PostMapping("/list") @ResponseBody public AjaxResult runningTask(@Parameter(name = "deptid", required = false, description = "部门编码") @RequestParam(value = "deptid", required = false) Long deptid, @Parameter(name = "status", description = "状态编码") @RequestParam(value = "status", required = false, defaultValue = "2") String status) { if(StringUtils.isBlank(status)){status = "2";} DsTaskList2 queryParam = new DsTaskList2(); queryParam.setStatus(status); if(null != deptid){queryParam.setDeptId(deptid);} List taskList2 = iDsTaskListService.selectDsTaskListList(queryParam); return success(taskList2); } @Operation(summary = "基地任务下发") @Log(title = "基地任务下发", businessType = BusinessType.UPDATE) @PostMapping("/apply/{taskid}") @ResponseBody public AjaxResult apply(@Parameter(name = "taskid", required = true, description = "任务ID") @PathVariable("taskid") Long taskid) { DsTask dsTask = iDsTaskService.selectDsTaskByPKID(taskid); dsTask.setStatus("1"); dsTask.setUpdateBy(getUsername()); int flag = iDsTaskService.updateDsTask(dsTask); List taskList2s = iDsTaskListService.selectDsTaskListByTaskId(taskid); for(DsTaskList2 task : taskList2s){ task.setStatus("1"); iDsTaskListService.updateDsTaskList(task); } if(flag == 1){ return success(dsTask); } return error("下发失败,请重试"); } @Operation(summary = "根据任务ID获取任务列表") @GetMapping("/taskId/{taskid}") @ResponseBody public AjaxResult getByTaskId(@Parameter(name = "taskid", required = true, description = "任务ID") @PathVariable("taskid") Long taskid) { List dsTaskList2s = iDsTaskListService.selectDsTaskListByTaskId(taskid); return success(covertTaskToStatis(dsTaskList2s)); } /** * 码头调度分配接口 * */ @Operation(summary = "码头调度分配") @PostMapping("/allocation") @ResponseBody public AjaxResult allocation(@RequestBody AllocationReqDTO reqDTO) { String shipnos = reqDTO.getShipnos(); String rule = reqDTO.getRule(); String harborIds = reqDTO.getHarborids(); // if(StringUtils.isBlank(shipnos)){ // return error("舷号不能为空"); // } String[] shipArr = shipnos.split(","); List taskLists = iDsTaskListService.selectCurrentDsTaskListWithShipNoV2(shipArr); if(taskLists.size() == 0){ return error("所选舰艇为空,请重新检查参数"); } if (StringUtils.isBlank(harborIds)) { return error("码头ID不能为空"); } String[] harborIdArr = harborIds.split(","); List harborIdList = Arrays.stream(harborIdArr) .map(Long::parseLong) .collect(Collectors.toList()); List harborList = iDmHarborService.selectDmHarborByPKIDs(harborIdList); // 重新组织数据结构,然后发送 List allocTaskList = allocationHarbor(taskLists, harborList, rule); // 重新设定对象结构,按照码头分组 return success(covertTaskToStatis(allocTaskList)); } /** * 新增保存任务列表信息 */ @Operation(summary = "调配信息更新接口") @PostMapping("/tasklist/add") @ResponseBody public AjaxResult addTaskListSave(@RequestBody List taskList) { // 缺少数据非空以及合法性校验 // 删除已经存在的船舰数据 List dsTaskList2s = iDsTaskListService.selectCurrentDsTaskListV2(); // 增加一个任务并保存 DsTask dsTask = new DsTask(); String taskName = String.format("任务: %tF # %d", new Date(), System.currentTimeMillis()); dsTask.setNAME(taskName); int addTag = iDsTaskService.insertDsTask(dsTask); try{ if(addTag > 0){ // 使用Map优化查找效率 Map existingTaskMap = dsTaskList2s.stream() .collect(Collectors.toMap(DsTaskList2::getPKID, Function.identity())); // 批量更新任务列表 List tasksToUpdate = taskList.stream() .filter(tmpTaskList -> existingTaskMap.containsKey(tmpTaskList.getPKID())) .map(tmpTaskList -> { DsTaskList2 existingTask = existingTaskMap.get(tmpTaskList.getPKID()); existingTask.setTaskId(dsTask.getPKID()); existingTask.setHarborName(tmpTaskList.getHarborName()); existingTask.setHarborId(tmpTaskList.getHarborId()); existingTask.setDeptId(tmpTaskList.getDeptId()); existingTask.setDeptName(tmpTaskList.getDeptName()); return existingTask; }) .collect(Collectors.toList()); // 批量更新数据库 if (!tasksToUpdate.isEmpty()) { iDsTaskListService.batchUpdateDsTaskList(tasksToUpdate); } return success(dsTask); } }catch (Exception e){ iDsTaskService.deleteDsTaskByPKID(dsTask.getPKID()); } return error("创建任务失败,请重试"); } /** * 查询任务列表信息列表 */ @Operation(summary = "NEW-获取当日需要分配的舰艇信息") @PostMapping("/current/list") @ResponseBody public AjaxResult curListV2() { List list = iDsTaskListService.selectCurrentDsTaskListV2(); return success(list); } /** * 查询任务列表信息列表 */ @Operation(summary = "获取当日需要分配的舰艇信息V1") @PostMapping("/current/list/v1") @ResponseBody public AjaxResult curListV1() { List list = iDsTaskListService.selectCurrentDsTaskList(); return success(list); } /** * 对泊位按照规则进行分配 * @param list * @param rule * @return */ private List allocationHarbor(List list, List harborList, String rule){ List dsTaskList2s = new ArrayList<>(); if(null != list && list.size() > 0){ switch (rule){ case "ZSBD": // 战术编队 // 前提说明:油量都是指oil_a 字段, 剩余油量指港口油存量减去已经分配舰艇需要的油需求量,可用泊位为 berth_no 港口顺序是指 已分配舰艇数量/可用泊位 正序排列 // 1 先筛选出有战术编队的舰艇,根据战术编队进行分组, // 2 分别计算每组总的加油量,并计算该组的最大水深, // 3 如果该战术编队的位置区域字段值不为空,首选根据港口水深判断该区域是否满足,如果满足再判断该区域港口已有油量满足需求,如果都满足则分配该港口, // 4 如果有一个条件不满足则获取下一个港口进行判断,如果所有港口都不满足则选择第一个港口,并在remark 字段增加判断失败的原因。 // 5 如果位置区域字段为空,则根据港口顺序依次选择港口进行判断,每个港口先根据港口水深判断该区域是否满足,如果满足再判断该区域港口已有油量满足需求,如果都满足则分配该港口, // 6 如果有条件不满足则依次选择下一个港口进行判断直到港口遍历完,如果还未找到则分配第一个港口,并在remark 字段增加判断失败的原因 // 1-先筛选出有战术编队的舰艇,根据战术编队进行分组, Map> tacticalGroupMap = list.stream() .collect(Collectors.groupingBy(task -> task.getGrpName() != null && !task.getGrpName().isEmpty() ? task.getGrpName() : UUID.randomUUID().toString())); Map allocatedOilMap = new HashMap<>(); // 1.1- 计算该组总的oil_a量,根据总oil_a量选择合适的港口, for (Map.Entry> entry : tacticalGroupMap.entrySet()) { List groupTasks = entry.getValue(); double totalOilB = groupTasks.stream().mapToDouble(task -> { double oilA = 0.0; if (task.getOilB() != null) oilA += task.getOilB(); return oilA; }).sum(); double maxDepth = groupTasks.stream().mapToDouble(task -> task.getDraft() != null ? task.getDraft() : 0).max().orElse(0); DmHarbor2 selectedHarbor = null; List suitableHarbors = harborList.stream() .filter(harbor -> (harbor.getOilB() != null && harbor.getOilB() >= totalOilB) && harbor.getDraft() >= maxDepth) .collect(Collectors.toList()); if (!suitableHarbors.isEmpty()) { if (StringUtils.isNotBlank(groupTasks.get(0).getPosArea())) { selectedHarbor = suitableHarbors.stream() .filter(harbor -> harbor.getHarborName() != null && harbor.getHarborName().equals(groupTasks.get(0).getPosArea()) && (harbor.getAllocatedShipCount() != null ? harbor.getAllocatedShipCount() : 0) < harbor.getBerthNo()) .findFirst() .orElse(suitableHarbors.stream() .filter(harbor -> (harbor.getAllocatedShipCount() != null ? harbor.getAllocatedShipCount() : 0) < harbor.getBerthNo()) .findFirst() .orElse(suitableHarbors.get(0))); } else { selectedHarbor = suitableHarbors.stream() .filter(harbor -> (harbor.getOilB() != null ? harbor.getOilB() : 0) - (harbor.getAllocatedOilA() != null ? harbor.getAllocatedOilA() : 0) >= totalOilB && (harbor.getAllocatedShipCount() != null ? harbor.getAllocatedShipCount() : 0) < harbor.getBerthNo()) .findFirst() .orElse(suitableHarbors.stream() .filter(harbor -> (harbor.getAllocatedShipCount() != null ? harbor.getAllocatedShipCount() : 0) < harbor.getBerthNo()) .findFirst() .orElse(suitableHarbors.get(0))); } } else { selectedHarbor = harborList.stream() .filter(harbor -> (harbor.getAllocatedShipCount() != null ? harbor.getAllocatedShipCount() : 0) < harbor.getBerthNo()) .min(Comparator.comparingDouble(harbor -> (double) (harbor.getBerthNo() - (harbor.getAllocatedShipCount() != null ? harbor.getAllocatedShipCount() : 0)) / harbor.getBerthNo())) .orElse(harborList.get(0)); } DmHarbor2 finalSelectedHarbor = selectedHarbor; groupTasks.forEach(task -> { if (finalSelectedHarbor != null) { task.setHarborId(finalSelectedHarbor.getPKID()); task.setHarborName(finalSelectedHarbor.getHarborName()); task.setDeptId(finalSelectedHarbor.getDeptId()); task.setDeptName(finalSelectedHarbor.getDeptName()); double allocatedOilA = finalSelectedHarbor.getAllocatedOilA() != null ? finalSelectedHarbor.getAllocatedOilA() : 0; finalSelectedHarbor.setAllocatedOilA(allocatedOilA + (task.getOilB() != null ? task.getOilB() : 0)); int allocatedShipCount = finalSelectedHarbor.getAllocatedShipCount() != null ? finalSelectedHarbor.getAllocatedShipCount() : 0; finalSelectedHarbor.setAllocatedShipCount(allocatedShipCount + 1); dsTaskList2s.add(task); } // 重新计算空置比 harborList.forEach(harbor -> { int currentAllocatedShipCount = harbor.getAllocatedShipCount() != null ? harbor.getAllocatedShipCount() : 0; double vacancyRatio = (double) (harbor.getBerthNo() - currentAllocatedShipCount) / harbor.getBerthNo(); // 可以在此处使用vacancyRatio进行进一步的逻辑处理 }); }); } break; case "JTXH": // 舰艇型号 // 1- 先根据舰艇型号进行分组,根据分组信息,如果同一组的优先分配同一个码头, // 1.1- 计算每一组的总加油量,根据加油量选择合适的港口, // 1.2- 如果多个港口加油量都可以满足则按照位置区域选择港口, // 1.3- 如果无位置区域,则选择第一个港口。 // 1- 先根据舰艇型号进行分组 Map> shipTypeGroupMap = list.stream() .collect(Collectors.groupingBy(DsTaskList2::getShipType)); for (Map.Entry> entry : shipTypeGroupMap.entrySet()) { List groupTasks = entry.getValue(); double totalOilB = groupTasks.stream().mapToDouble(task -> { double oilB = 0.0; if (task.getOilB() != null) oilB += task.getOilB(); return oilB; }).sum(); double maxDepth = groupTasks.stream().mapToDouble(task -> task.getDraft() != null ? task.getDraft() : 0).max().orElse(0); DmHarbor2 selectedHarbor = null; boolean harborFound = false; // 3- 如果分组的位置区域字段值不为空 if (groupTasks != null && !groupTasks.isEmpty() && groupTasks.get(0).getPosArea() != null && !groupTasks.get(0).getPosArea().isEmpty()) { for (DmHarbor2 harbor : harborList) { if (harbor != null && harbor.getDraft() >= maxDepth && (harbor.getOilB() != null && harbor.getAllocatedOilA() != null && (harbor.getOilB() - harbor.getAllocatedOilA() >= totalOilB)) && harbor.getHarborName() != null && harbor.getHarborName().equals(groupTasks.get(0).getPosArea())) { selectedHarbor = harbor; harborFound = true; break; } } } // 5- 如果位置区域字段为空 if (!harborFound) { for (DmHarbor2 harbor : harborList.stream().sorted(Comparator.comparingDouble(h -> { int allocatedShipCount = h.getAllocatedShipCount() != null ? h.getAllocatedShipCount() : 0; return (double) allocatedShipCount / (h.getBerthNo() != null ? h.getBerthNo() : 1); })).collect(Collectors.toList())) { double allocatedOilA = harbor.getAllocatedOilA() != null ? harbor.getAllocatedOilA() : 0; if (harbor.getDraft() >= maxDepth && (harbor.getOilB() != null && (harbor.getOilB() - allocatedOilA >= totalOilB))) { selectedHarbor = harbor; harborFound = true; break; } } } // 4- 如果所有港口都不满足则选择第一个港口,并在remark 字段增加判断失败的原因 if (!harborFound && !harborList.isEmpty()) { selectedHarbor = harborList.get(0); groupTasks.forEach(task -> task.setRemark("所有港口均不满足条件")); } DmHarbor2 finalSelectedHarbor = selectedHarbor; groupTasks.forEach(task -> { if (finalSelectedHarbor != null) { task.setHarborId(finalSelectedHarbor.getPKID()); task.setHarborName(finalSelectedHarbor.getHarborName()); finalSelectedHarbor.setAllocatedOilA((finalSelectedHarbor.getAllocatedOilA() != null ? finalSelectedHarbor.getAllocatedOilA() : 0) + (task.getOilB() != null ? task.getOilB() : 0)); finalSelectedHarbor.setAllocatedShipCount((finalSelectedHarbor.getAllocatedShipCount() != null ? finalSelectedHarbor.getAllocatedShipCount() : 0) + 1); dsTaskList2s.add(task); } else { task.setRemark("未找到合适的港口"); } }); } break; case "BJZD": // 补给重点 for (DsTaskList2 task : list) { Double taskDraft = task.getDraft() != null ? task.getDraft() : 0.0; boolean ammoSupplyNeeded = (task.getAmmoD() != null && task.getAmmoD() > 0) || (task.getAmmoO() != null && task.getAmmoO() > 0) || (task.getAmmoP() != null && task.getAmmoP() > 0) || (task.getAmmoS() != null && task.getAmmoS() > 0); //harborList.stream().mapToDouble(h -> h.getDraft() != null ? h.getDraft() : 0.0).min().orElse(0.0); DmHarbor2 selectedHarbor = null; boolean harborFound = false; if (ammoSupplyNeeded) { boolean canDockAtQingyuOrJiaotou = harborList.stream() .anyMatch(harbor -> (harbor.getHarborName().equals("青屿") || harbor.getHarborName().equals("礁头")) && harbor.getDraft() >= taskDraft); if (canDockAtQingyuOrJiaotou) { for (DmHarbor2 harbor : harborList) { if ((harbor.getHarborName().equals("青屿") || harbor.getHarborName().equals("礁头")) && harbor.getDraft() >= taskDraft && (harbor.getOilB() - (harbor.getAllocatedOilA() != null ? harbor.getAllocatedOilA() : 0) >= task.getOilB()) && (harbor.getAllocatedShipCount() != null ? harbor.getAllocatedShipCount() : 0) / (harbor.getBerthNo() != null ? harbor.getBerthNo() : 1) < 1) { selectedHarbor = harbor; harborFound = true; break; } } } else { for (DmHarbor2 harbor : harborList) { if (harbor.getDraft() >= taskDraft) { selectedHarbor = harbor; harborFound = true; break; } } } } if (!harborFound) { for (DmHarbor2 harbor : harborList) { if (harbor.getDraft() >= taskDraft) { selectedHarbor = harbor; break; } } } if (selectedHarbor != null) { task.setHarborId(selectedHarbor.getPKID()); task.setHarborName(selectedHarbor.getHarborName()); selectedHarbor.setAllocatedOilA((selectedHarbor.getAllocatedOilA() != null ? selectedHarbor.getAllocatedOilA() : 0) + (task.getOilB() != null ? task.getOilB() : 0)); selectedHarbor.setAllocatedShipCount((selectedHarbor.getAllocatedShipCount() != null ? selectedHarbor.getAllocatedShipCount() : 0) + 1); dsTaskList2s.add(task); } else { task.setRemark("未找到合适的港口"); } } break; case "WZQJ": // 位置区间 // 1- 先按照包含位置区间的进行分组 // 2- 剩余的按照泊位数量占比进行分配, // 3- 如果占比类似则按照顺序进行区分。 // 1- 先按照是否包含位置区间进行区分 // 1- 先按照位置区间进行分组 Map> posAreaGroupMap = list.stream() .collect(Collectors.groupingBy(task -> { String posArea = task.getPosArea(); return (posArea != null && !posArea.isEmpty()) ? posArea : UUID.randomUUID().toString(); })); // 2- 分别计算每组总的加油量,以及最大水深, for (Map.Entry> entry : posAreaGroupMap.entrySet()) { List groupTasks = entry.getValue(); double totalOilB = groupTasks.stream().mapToDouble(task -> { Double oilB = task.getOilB(); return (oilB != null) ? oilB : 0.0; }).sum(); double maxDepth = groupTasks.stream().mapToDouble(task -> { Double draft = task.getDraft(); return (draft != null) ? draft : 0.0; }).max().orElse(0.0); DmHarbor2 selectedHarbor = null; boolean harborFound = false; // 3- 先遍历位置区间不为空的组 if (groupTasks.get(0).getPosArea() != null && !groupTasks.get(0).getPosArea().isEmpty()) { for (DmHarbor2 harbor : harborList) { Double harborDraft = harbor.getDraft() != null ? harbor.getDraft() : 0.0; Double harborOilB = harbor.getOilB() != null ? harbor.getOilB() : 0.0; Double allocatedOilA = harbor.getAllocatedOilA() != null ? harbor.getAllocatedOilA() : 0.0; if (harborDraft >= maxDepth && (harborOilB - allocatedOilA >= totalOilB)) { selectedHarbor = harbor; harborFound = true; break; } } } // 5- 再遍历位置区间为空的组 if (!harborFound) { for (DmHarbor2 harbor : harborList.stream() .sorted(Comparator.comparingDouble(h -> { int allocatedShipCount = h.getAllocatedShipCount() != null ? h.getAllocatedShipCount() : 0; long berthNo = h.getBerthNo() != null ? h.getBerthNo() : 1; return (double) allocatedShipCount / berthNo; })) .collect(Collectors.toList())) { Double harborDraft = harbor.getDraft() != null ? harbor.getDraft() : 0.0; Double harborOilB = harbor.getOilB() != null ? harbor.getOilB() : 0.0; Double allocatedOilA = harbor.getAllocatedOilA() != null ? harbor.getAllocatedOilA() : 0.0; if (harborDraft >= maxDepth && (harborOilB - allocatedOilA >= totalOilB)) { selectedHarbor = harbor; harborFound = true; break; } } } if (!harborFound) { selectedHarbor = harborList.stream() .min(Comparator.comparingDouble(h -> { int allocatedShipCount = h.getAllocatedShipCount() != null ? h.getAllocatedShipCount() : 0; long berthNo = h.getBerthNo() != null ? h.getBerthNo() : 1; return (double) allocatedShipCount / berthNo; })) .orElse(harborList.get(0)); } DmHarbor2 finalSelectedHarbor = selectedHarbor; groupTasks.forEach(task -> { task.setHarborId(finalSelectedHarbor.getPKID()); task.setHarborName(finalSelectedHarbor.getHarborName()); task.setDeptId(finalSelectedHarbor.getDeptId()); task.setDeptName(finalSelectedHarbor.getDeptName()); double allocatedOilA = finalSelectedHarbor.getAllocatedOilA() != null ? finalSelectedHarbor.getAllocatedOilA() : 0.0; finalSelectedHarbor.setAllocatedOilA(allocatedOilA + (task.getOilB() != null ? task.getOilB() : 0.0)); int allocatedShipCount = finalSelectedHarbor.getAllocatedShipCount() != null ? finalSelectedHarbor.getAllocatedShipCount() : 0; finalSelectedHarbor.setAllocatedShipCount(allocatedShipCount + 1); dsTaskList2s.add(task); }); } break; default: if(null != harborList && harborList.size() > 0){ int harborLen1 = harborList.size(); int shipCount1 = list.size(); int harborWithShipCount1 = (int)Math.ceil((double) shipCount1 / harborLen1); for(int i=0; i covertTaskToStatis(List allocTaskList){ List taskListStatis = new ArrayList<>(); Map> tmpTaskMap = new HashMap<>(); allocTaskList.stream().forEach(item -> { Long harborId = item.getHarborId(); List itemTaskLists = new ArrayList<>(); if(tmpTaskMap.containsKey(harborId)){ itemTaskLists = tmpTaskMap.get(harborId); } itemTaskLists.add(item); tmpTaskMap.put(harborId, itemTaskLists); }); tmpTaskMap.forEach((harborId, tasks) -> { TaskListStatis statis = new TaskListStatis(); DmHarbor2 harbor = iDmHarborService.selectDmHarborByPKID(harborId); statis.setHarbor(harbor); statis.setTasks(tasks); // 统计tasks数值字段的值 DsTaskList2 taskStatis = new DsTaskList2(); tasks.forEach(task -> { taskStatis.setOilB((taskStatis.getOilB() == null ? 0 : taskStatis.getOilB()) + (task.getOilB() == null ? 0 : task.getOilB())); taskStatis.setOilG((taskStatis.getOilG() == null ? 0 : taskStatis.getOilG()) + (task.getOilG() == null ? 0 : task.getOilG())); taskStatis.setOilA((taskStatis.getOilA() == null ? 0 : taskStatis.getOilA()) + (task.getOilA() == null ? 0 : task.getOilA())); taskStatis.setAmmoD((taskStatis.getAmmoD() == null ? 0 : taskStatis.getAmmoD()) + (task.getAmmoD() == null ? 0 : task.getAmmoD())); taskStatis.setAmmoP((taskStatis.getAmmoP() == null ? 0 : taskStatis.getAmmoP()) + (task.getAmmoP() == null ? 0 : task.getAmmoP())); taskStatis.setAmmoS((taskStatis.getAmmoS() == null ? 0 : taskStatis.getAmmoS()) + (task.getAmmoS() == null ? 0 : task.getAmmoS())); taskStatis.setAmmoO((taskStatis.getAmmoO() == null ? 0 : taskStatis.getAmmoO()) + (task.getAmmoO() == null ? 0 : task.getAmmoO())); taskStatis.setWATER((taskStatis.getWATER() == null ? 0 : taskStatis.getWATER()) + (task.getWATER() == null ? 0 : task.getWATER())); taskStatis.setWaterP((taskStatis.getWaterP() == null ? 0 : taskStatis.getWaterP()) + (task.getWaterP() == null ? 0 : task.getWaterP())); taskStatis.setFOOD((taskStatis.getFOOD() == null ? 0 : taskStatis.getFOOD()) + (task.getFOOD() == null ? 0 : task.getFOOD())); taskStatis.setFoodW((taskStatis.getFoodW() == null ? 0 : taskStatis.getFoodW()) + (task.getFoodW() == null ? 0 : task.getFoodW())); taskStatis.setFoodO((taskStatis.getFoodO() == null ? 0 : taskStatis.getFoodO()) + (task.getFoodO() == null ? 0 : task.getFoodO())); }); statis.setStatis(taskStatis); taskListStatis.add(statis); }); return taskListStatis; } /** * 根据对象ID获取对应对象 * @param list * @param id * @return */ private DsTaskList2 getDsTaskListById(List list, Long id){ for(DsTaskList2 task : list){ if(task.getPKID() == id){ return task; } } return null; } }