| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.jeecg.modules.dry.controller; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.jeecg.common.api.vo.Result; |
| | | import org.jeecg.common.config.TenantContext; |
| | | import org.jeecg.common.system.query.QueryGenerator; |
| | | import org.jeecg.common.util.oConvertUtils; |
| | | import org.jeecg.config.mybatis.MybatisPlusSaasConfig; |
| | | import org.jeecg.modules.dry.entity.DryEquipment; |
| | | import org.jeecg.modules.dry.entity.DryOrder; |
| | | import org.jeecg.modules.dry.service.IDryEquipmentService; |
| | | import org.jeecg.modules.dry.service.IDryOrderService; |
| | | import org.jeecg.modules.dry.service.IDryOrderTrendService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | |
| | | /** |
| | | * æ¥è¡¨æ¨¡åç¸å
³èåæ¥å£ |
| | | */ |
| | | @Api(tags="æ¥è¡¨ç®¡ç") |
| | | @RestController |
| | | @RequestMapping("/dry/report") |
| | | @Slf4j |
| | | public class ReportController{ |
| | | @Autowired |
| | | private IDryOrderService dryOrderService; |
| | | @Autowired |
| | | private IDryOrderTrendService dryOrderTrendService; |
| | | @Autowired |
| | | private IDryEquipmentService dryEquipmentService; |
| | | |
| | | private final Integer FINISH_ORDER_STATU = 4; |
| | | |
| | | |
| | | |
| | | @ApiOperation(value="æ¥è¡¨ç®¡ç-æ¹æ¬¡è´¨éåæ", notes="å¹²ç¥å·¥å(å页å表æ¥è¯¢)-æ¹æ¬¡è´¨éåæ") |
| | | @GetMapping(value = "/batchQualityList") |
| | | public Result<IPage<DryOrder>> queryPageList(DryOrder dryOrder, |
| | | @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, |
| | | @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, |
| | | HttpServletRequest req) { |
| | | //------------------------------------------------------------------------------------------------ |
| | | //æ¯å¦å¼å¯ç³»ç»ç®¡ç模åçå¤ç§æ·æ°æ®é离ãSAASå¤ç§æ·æ¨¡å¼ã |
| | | if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ |
| | | dryOrder.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(),0)); |
| | | } |
| | | //------------------------------------------------------------------------------------------------ |
| | | QueryWrapper<DryOrder> queryWrapper = QueryGenerator.initQueryWrapper(dryOrder, req.getParameterMap()); |
| | | queryWrapper.isNotNull("herb_id") // è¯æä¸ä¸ºç©º |
| | | .ge("origin_weight", 50)// è¯æåå§ééä¸ä½äº50 |
| | | .ge("yield", 0)// è¯æå¹²æééä¸ä½äº0 |
| | | .ge("order_status", FINISH_ORDER_STATU)// å·¥åç¶æä¸ºå·²å®æ |
| | | .ge("dry_time", 30)// å¹²ç¥æ¶é´å¤§äº30åé |
| | | .ge("watt", 0) //çµè½æ¶è大äº0 |
| | | .ge("steam", 0);//è¸æ±½æ¶è大äº0 |
| | | |
| | | Page<DryOrder> page = new Page<DryOrder>(pageNo, pageSize); |
| | | IPage<DryOrder> pageList = dryOrderService.page(page, queryWrapper); |
| | | return Result.OK(pageList); |
| | | } |
| | | |
| | | |
| | | @ApiOperation(value="æ¥è¡¨ç®¡ç-æ¹æ¬¡è´¨éåæ", notes="å¹²ç¥å·¥å(ç»è®¡æ°æ®)-æ¹æ¬¡è´¨éåæ") |
| | | @GetMapping(value = "/batchQualityStatis") |
| | | public Result<?> queryBatchQualityStatis(DryOrder dryOrder, |
| | | @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, |
| | | @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, |
| | | HttpServletRequest req) { |
| | | //------------------------------------------------------------------------------------------------ |
| | | //æ¯å¦å¼å¯ç³»ç»ç®¡ç模åçå¤ç§æ·æ°æ®é离ãSAASå¤ç§æ·æ¨¡å¼ã |
| | | if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ |
| | | dryOrder.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(),0)); |
| | | } |
| | | //------------------------------------------------------------------------------------------------ |
| | | QueryWrapper<DryOrder> queryWrapper = QueryGenerator.initQueryWrapper(dryOrder, req.getParameterMap()); |
| | | LambdaQueryWrapper<DryOrder> lambda = queryWrapper.lambda() |
| | | .isNotNull(DryOrder::getHerbId) // è¯æä¸ä¸ºç©º |
| | | .ne(DryOrder::getHerbId, "") |
| | | .isNotNull(DryOrder::getOriginWeight)// è¯æåå§ééä¸ä½äº50 |
| | | .ge(DryOrder::getOriginWeight, 50) |
| | | .ge(DryOrder::getYield, 0)// è¯æå¹²æééä¸ä½äº0 |
| | | .eq(DryOrder::getOrderStatus, FINISH_ORDER_STATU)// å·¥åç¶æä¸ºå·²å®æ |
| | | .isNotNull(DryOrder::getDryTime)// å¹²ç¥æ¶é´å¤§äº30åé |
| | | .ge(DryOrder::getDryTime, 30) |
| | | .ge(DryOrder::getWatt, 0) //çµè½æ¶è大äº0 |
| | | .ge(DryOrder::getSteam, 0);//è¸æ±½æ¶è大äº0 |
| | | |
| | | List<DryOrder> list = dryOrderService.list(lambda); |
| | | // å¹³åæç |
| | | double efficiencyAvg = list.stream() |
| | | .map(vo -> { |
| | | if (vo == null) { |
| | | return null; |
| | | } |
| | | |
| | | Integer dt = vo.getDryTime(); |
| | | Double originWeight = vo.getOriginWeight(); |
| | | Double yield = vo.getYield(); |
| | | |
| | | // æ£æ¥ originWeight å yield æ¯å¦ä¸ºç©º |
| | | if (originWeight == null || yield == null) { |
| | | return null; |
| | | } |
| | | |
| | | Double ow = originWeight - yield; |
| | | |
| | | if (dt != null && dt > 0 && ow != null) { |
| | | double hours = dt / 60.0; |
| | | if (hours > 0) { |
| | | return ow / hours; |
| | | } |
| | | } |
| | | return null; |
| | | }) |
| | | .filter(Objects::nonNull) |
| | | .mapToDouble(Double::doubleValue) |
| | | .average() |
| | | .orElse(0.0); |
| | | // å¹³å嫿°´ç |
| | | double moistureDeviationAvg = list.stream() |
| | | .map(vo -> { |
| | | Double moisture = vo.getMoisture(); |
| | | Double target = vo.getTarget(); |
| | | if (moisture != null && moisture > 0 && target != null) { |
| | | return Math.abs(moisture - target); |
| | | } |
| | | return null; |
| | | }) |
| | | .filter(Objects::nonNull) |
| | | .mapToDouble(Double::doubleValue) |
| | | .average() |
| | | .orElse(0.0); |
| | | // å¹³åå¾åï¼ç®åè®¡ç®æ¹å¼ï¼å«æ°´çæ¯ç¸å·®1ä¸ªç¹æ£5åï¼ |
| | | double qualityScoreAvg = list.stream() |
| | | .map(vo -> { |
| | | Double moisture = vo.getMoisture(); |
| | | Double target = vo.getTarget(); |
| | | if (moisture != null && moisture > 0 && target != null) { |
| | | double diff = Math.abs(moisture - target); |
| | | double score = 100 - diff * 5; |
| | | if (score < 0) score = 0; |
| | | if (score > 100) score = 100; |
| | | return score; |
| | | } |
| | | return null; |
| | | }) |
| | | .filter(Objects::nonNull) |
| | | .mapToDouble(Double::doubleValue) |
| | | .average() |
| | | .orElse(0.0); |
| | | |
| | | Map<String, Object> stat = new HashMap<>(); |
| | | stat.put("effeAvg", String.format("%.2f", efficiencyAvg)); |
| | | stat.put("moistureAvg", String.format("%.2f", moistureDeviationAvg)); |
| | | stat.put("scoreAvg", String.format("%.2f", qualityScoreAvg)); |
| | | stat.put("count", list.size()); |
| | | return Result.OK(stat); |
| | | } |
| | | |
| | | @ApiOperation(value="æ¥è¡¨ç®¡ç-车é´ç»è®¡", notes="车é´ç»è®¡-åç§æ±æ»") |
| | | @GetMapping(value = "/workshopStatis") |
| | | public Result<?> queryWorkshopStatis(DryOrder dryOrder, |
| | | @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, |
| | | @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, |
| | | HttpServletRequest req) { |
| | | //------------------------------------------------------------------------------------------------ |
| | | //æ¯å¦å¼å¯ç³»ç»ç®¡ç模åçå¤ç§æ·æ°æ®é离ãSAASå¤ç§æ·æ¨¡å¼ã |
| | | if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ |
| | | dryOrder.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(),0)); |
| | | } |
| | | //------------------------------------------------------------------------------------------------ |
| | | QueryWrapper<DryOrder> queryWrapper = QueryGenerator.initQueryWrapper(dryOrder, req.getParameterMap()); |
| | | LambdaQueryWrapper<DryOrder> lambda = queryWrapper.lambda() |
| | | .isNotNull(DryOrder::getHerbId) // è¯æä¸ä¸ºç©º |
| | | .ne(DryOrder::getHerbId, "") |
| | | .isNotNull(DryOrder::getOriginWeight)// è¯æåå§ééä¸ä½äº50 |
| | | .ge(DryOrder::getOriginWeight, 50) |
| | | .ge(DryOrder::getYield, 0)// è¯æå¹²æééä¸ä½äº0 |
| | | .eq(DryOrder::getOrderStatus, FINISH_ORDER_STATU)// å·¥åç¶æä¸ºå·²å®æ |
| | | .isNotNull(DryOrder::getDryTime)// å¹²ç¥æ¶é´å¤§äº30åé |
| | | .ge(DryOrder::getDryTime, 30) |
| | | .ge(DryOrder::getWatt, 0) //çµè½æ¶è大äº0 |
| | | .ge(DryOrder::getSteam, 0);//è¸æ±½æ¶è大äº0 |
| | | |
| | | List<DryOrder> list = dryOrderService.list(lambda); |
| | | |
| | | List<Map<String, Object>> statList = list.stream() |
| | | .collect(Collectors.groupingBy(DryOrder::getHerbId)) |
| | | .entrySet().stream() |
| | | .map(e -> { |
| | | String herbId = e.getKey(); |
| | | List<DryOrder> group = e.getValue(); |
| | | String herbName = group.stream() |
| | | .map(DryOrder::getHerbName) |
| | | .filter(Objects::nonNull) |
| | | .findFirst() |
| | | .orElse(""); |
| | | |
| | | // ææéå计 |
| | | long feedSum = group.stream() |
| | | .map(DryOrder::getFeed) |
| | | .filter(Objects::nonNull) |
| | | .mapToLong(Integer::longValue) |
| | | .sum(); |
| | | |
| | | // 产éå计 |
| | | double yieldSum = group.stream() |
| | | .map(DryOrder::getYield) |
| | | .filter(Objects::nonNull) |
| | | .mapToDouble(Double::doubleValue) |
| | | .sum(); |
| | | |
| | | // è¸åéå计 = åå§éé(originWeight) - 产é(yield)ï¼è´å¼æ0å¤çåæ±å |
| | | double evaporationSum = group.stream() |
| | | .map(vo -> { |
| | | double ow = vo.getOriginWeight() != null ? vo.getOriginWeight() : 0.0; |
| | | double y = vo.getYield() != null ? vo.getYield() : 0.0; |
| | | double evap = ow - y; |
| | | return evap < 0 ? 0.0 : evap; |
| | | }) |
| | | .mapToDouble(Double::doubleValue) |
| | | .sum(); |
| | | |
| | | // å¹²ç¥æ¶é¿å计ï¼åéï¼ |
| | | int dryMinutes = group.stream() |
| | | .map(DryOrder::getDryTime) |
| | | .filter(Objects::nonNull) |
| | | .mapToInt(Integer::intValue) |
| | | .sum(); |
| | | |
| | | // å¹²ç¥æ¶é¿å±ç¤ºä¸º xå°æ¶xåé |
| | | int hoursPart = dryMinutes / 60; |
| | | int minutesPart = dryMinutes % 60; |
| | | String dryDuration = String.format("%då°æ¶%dåé", hoursPart, minutesPart); |
| | | |
| | | double dryHours = dryMinutes / 60.0; |
| | | // å¹²ç¥æç = è¸åéå计 / å¹²ç¥æ¶é¿ï¼å°æ¶ï¼ |
| | | double efficiency = dryHours > 0 ? (evaporationSum / dryHours) : 0.0; |
| | | |
| | | // è¸æ±½æ¶èå计 |
| | | double steamSum = group.stream() |
| | | .map(DryOrder::getSteam) |
| | | .filter(Objects::nonNull) |
| | | .mapToDouble(Double::doubleValue) |
| | | .sum(); |
| | | |
| | | // åä½è¸æ±½æ¶è = è¸æ±½æ¶èå计 / è¸åéå计 |
| | | double unitSteam = evaporationSum > 0 ? (steamSum / evaporationSum) : 0.0; |
| | | |
| | | // çµè½æ¶èå计 |
| | | double wattSum = group.stream() |
| | | .map(DryOrder::getWatt) |
| | | .filter(Objects::nonNull) |
| | | .mapToDouble(Double::doubleValue) |
| | | .sum(); |
| | | |
| | | // åä½çµè½æ¶è = çµè½æ¶èå计 / è¸åéå计 |
| | | double unitWatt = evaporationSum > 0 ? (wattSum / evaporationSum) : 0.0; |
| | | |
| | | Map<String, Object> m = new HashMap<>(); |
| | | m.put("herbId", herbId); |
| | | m.put("herbName", herbName); |
| | | m.put("feed", feedSum); |
| | | m.put("yield", String.format("%.2f", yieldSum)); |
| | | m.put("evaporation", String.format("%.2f", evaporationSum)); |
| | | m.put("dryDuration", dryDuration); |
| | | m.put("efficiency", String.format("%.2f", efficiency)); |
| | | m.put("steam", String.format("%.2f", steamSum)); |
| | | m.put("unitSteam", String.format("%.2f", unitSteam)); |
| | | m.put("watt", String.format("%.2f", wattSum)); |
| | | m.put("unitWatt", String.format("%.2f", unitWatt)); |
| | | |
| | | return m; |
| | | }) |
| | | .sorted(Comparator.comparing(m -> (String) m.get("herbName"), Comparator.nullsLast(Comparator.naturalOrder()))) |
| | | .collect(Collectors.toList()); |
| | | |
| | | return Result.OK(statList); |
| | | } |
| | | |
| | | @ApiOperation(value="æ¥è¡¨ç®¡ç-åç§ç»è®¡", notes="åç§ç»è®¡-æºå°æ±æ»") |
| | | @GetMapping(value = "/herbStatis") |
| | | public Result<?> queryHerbStatis(DryOrder dryOrder, |
| | | @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, |
| | | @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, |
| | | HttpServletRequest req) { |
| | | //------------------------------------------------------------------------------------------------ |
| | | //æ¯å¦å¼å¯ç³»ç»ç®¡ç模åçå¤ç§æ·æ°æ®é离ãSAASå¤ç§æ·æ¨¡å¼ã |
| | | if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ |
| | | dryOrder.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(),0)); |
| | | } |
| | | //------------------------------------------------------------------------------------------------ |
| | | QueryWrapper<DryOrder> queryWrapper = QueryGenerator.initQueryWrapper(dryOrder, req.getParameterMap()); |
| | | LambdaQueryWrapper<DryOrder> lambda = queryWrapper.lambda() |
| | | .isNotNull(DryOrder::getHerbId) // è¯æä¸ä¸ºç©º |
| | | .ne(DryOrder::getHerbId, "") |
| | | .isNotNull(DryOrder::getOriginWeight)// è¯æåå§ééä¸ä½äº50 |
| | | .ge(DryOrder::getOriginWeight, 50) |
| | | .ge(DryOrder::getYield, 0)// è¯æå¹²æééä¸ä½äº0 |
| | | .eq(DryOrder::getOrderStatus, FINISH_ORDER_STATU)// å·¥åç¶æä¸ºå·²å®æ |
| | | .isNotNull(DryOrder::getDryTime)// å¹²ç¥æ¶é´å¤§äº30åé |
| | | .ge(DryOrder::getDryTime, 30) |
| | | .ge(DryOrder::getWatt, 0) //çµè½æ¶è大äº0 |
| | | .ge(DryOrder::getSteam, 0);//è¸æ±½æ¶è大äº0 |
| | | |
| | | List<DryOrder> list = dryOrderService.list(lambda); |
| | | |
| | | Integer tenantId = dryOrder.getTenantId(); |
| | | if (tenantId == null && MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { |
| | | tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); |
| | | } |
| | | DryEquipment eqParam = new DryEquipment(); |
| | | eqParam.setTenantId(tenantId); |
| | | List<DryEquipment> eqs = dryEquipmentService.queryEqusByTenantId(eqParam); |
| | | Map<String, String> eqNameById = eqs.stream().collect(Collectors.toMap(DryEquipment::getId, DryEquipment::getName)); |
| | | |
| | | List<String> yAxis = list.stream() |
| | | .map(DryOrder::getEquId) |
| | | .filter(Objects::nonNull) |
| | | .map(id -> eqNameById.getOrDefault(id, "")) |
| | | .filter(name -> name != null && !name.isEmpty()) |
| | | .distinct() |
| | | .sorted() |
| | | .collect(Collectors.toList()); |
| | | |
| | | Map<String, Map<String, Double>> yieldByHerb = new HashMap<>(); |
| | | for (DryOrder vo : list) { |
| | | String herbName = vo.getHerbName(); |
| | | if (herbName == null || herbName.isEmpty()) { |
| | | continue; |
| | | } |
| | | String eqName = eqNameById.getOrDefault(vo.getEquId(), ""); |
| | | if (eqName == null || eqName.isEmpty()) { |
| | | continue; |
| | | } |
| | | double y = vo.getYield() != null ? vo.getYield() : 0.0; |
| | | Map<String, Double> perEq = yieldByHerb.computeIfAbsent(herbName, k -> new HashMap<>()); |
| | | perEq.put(eqName, perEq.getOrDefault(eqName, 0.0) + y); |
| | | } |
| | | |
| | | List<Map<String, Object>> series = yieldByHerb.entrySet().stream() |
| | | .sorted(Map.Entry.comparingByKey()) |
| | | .map(e -> { |
| | | String herbName = e.getKey(); |
| | | Map<String, Double> perEq = e.getValue(); |
| | | List<Double> equProList = yAxis.stream() |
| | | .map(eq -> { |
| | | double v = perEq.getOrDefault(eq, 0.0); |
| | | return Math.round(v * 10.0) / 10.0; |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | Map<String, Object> m = new HashMap<>(); |
| | | m.put("name", herbName); |
| | | m.put("equProList", equProList); |
| | | return m; |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | |
| | | List<Map<String, Object>> statList = list.stream() |
| | | // æºå°ç»´åº¦åç» |
| | | .collect(Collectors.groupingBy(DryOrder::getEquId)) |
| | | .entrySet().stream() |
| | | .map(e -> { |
| | | String equId = e.getKey(); |
| | | List<DryOrder> group = e.getValue(); |
| | | |
| | | String herbId = group.stream() |
| | | .map(DryOrder::getHerbId) |
| | | .filter(h -> h != null && !h.isEmpty()) |
| | | .distinct() // å»é |
| | | .collect(Collectors.joining(",")); |
| | | |
| | | String herbName = group.stream() |
| | | .map(DryOrder::getHerbName) |
| | | .filter(Objects::nonNull) |
| | | .distinct() |
| | | .collect(Collectors.joining(",")); |
| | | |
| | | // ææéå计 |
| | | long feedSum = group.stream() |
| | | .map(DryOrder::getFeed) |
| | | .filter(Objects::nonNull) |
| | | .mapToLong(Integer::longValue) |
| | | .sum(); |
| | | |
| | | // 产éå计 |
| | | double yieldSum = group.stream() |
| | | .map(DryOrder::getYield) |
| | | .filter(Objects::nonNull) |
| | | .mapToDouble(Double::doubleValue) |
| | | .sum(); |
| | | |
| | | // è¸åéå计 = åå§éé(originWeight) - 产é(yield)ï¼è´å¼æ0å¤çåæ±å |
| | | double evaporationSum = group.stream() |
| | | .map(vo -> { |
| | | double ow = vo.getOriginWeight() != null ? vo.getOriginWeight() : 0.0; |
| | | double y = vo.getYield() != null ? vo.getYield() : 0.0; |
| | | double evap = ow - y; |
| | | return evap < 0 ? 0.0 : evap; |
| | | }) |
| | | .mapToDouble(Double::doubleValue) |
| | | .sum(); |
| | | |
| | | // å¹²ç¥æ¶é¿å计ï¼åéï¼ |
| | | int dryMinutes = group.stream() |
| | | .map(DryOrder::getDryTime) |
| | | .filter(Objects::nonNull) |
| | | .mapToInt(Integer::intValue) |
| | | .sum(); |
| | | |
| | | // å¹²ç¥æ¶é¿å±ç¤ºä¸º xå°æ¶xåé |
| | | int hoursPart = dryMinutes / 60; |
| | | int minutesPart = dryMinutes % 60; |
| | | String dryDuration = String.format("%då°æ¶%dåé", hoursPart, minutesPart); |
| | | |
| | | double dryHours = dryMinutes / 60.0; |
| | | // å¹²ç¥æç = è¸åéå计 / å¹²ç¥æ¶é¿ï¼å°æ¶ï¼ |
| | | double efficiency = dryHours > 0 ? (evaporationSum / dryHours) : 0.0; |
| | | |
| | | // è¸æ±½æ¶èå计 |
| | | double steamSum = group.stream() |
| | | .map(DryOrder::getSteam) |
| | | .filter(Objects::nonNull) |
| | | .mapToDouble(Double::doubleValue) |
| | | .sum(); |
| | | |
| | | // åä½è¸æ±½æ¶è = è¸æ±½æ¶èå计 / è¸åéå计 |
| | | double unitSteam = evaporationSum > 0 ? (steamSum / evaporationSum) : 0.0; |
| | | |
| | | // çµè½æ¶èå计 |
| | | double wattSum = group.stream() |
| | | .map(DryOrder::getWatt) |
| | | .filter(Objects::nonNull) |
| | | .mapToDouble(Double::doubleValue) |
| | | .sum(); |
| | | |
| | | // åä½çµè½æ¶è = çµè½æ¶èå计 / è¸åéå计 |
| | | double unitWatt = evaporationSum > 0 ? (wattSum / evaporationSum) : 0.0; |
| | | |
| | | Map<String, Object> m = new HashMap<>(); |
| | | m.put("equId", equId); |
| | | m.put("equName", eqNameById.getOrDefault(equId, "")); |
| | | m.put("herbId", herbId); |
| | | m.put("herbName", herbName); |
| | | m.put("feed", feedSum); |
| | | m.put("yield", String.format("%.2f", yieldSum)); |
| | | m.put("evaporation", String.format("%.2f", evaporationSum)); |
| | | m.put("dryDuration", dryDuration); |
| | | m.put("dryTime", dryMinutes); |
| | | m.put("efficiency", String.format("%.2f", efficiency)); |
| | | m.put("steam", String.format("%.2f", steamSum)); |
| | | m.put("unitSteam", String.format("%.2f", unitSteam)); |
| | | m.put("watt", String.format("%.2f", wattSum)); |
| | | m.put("unitWatt", String.format("%.2f", unitWatt)); |
| | | return m; |
| | | }) |
| | | .sorted(Comparator.comparing(m -> (String) m.get("equName"), Comparator.nullsLast(Comparator.naturalOrder()))) |
| | | .collect(Collectors.toList()); |
| | | |
| | | Map<String, Object> resp = new HashMap<>(); |
| | | resp.put("statList", statList); |
| | | resp.put("yAxis", yAxis); |
| | | resp.put("series", series); |
| | | return Result.OK(resp); |
| | | } |
| | | |
| | | } |