|
|
@ -0,0 +1,652 @@ |
|
|
|
package org.nl.wms.cockpit.service.impl; |
|
|
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
|
import com.alibaba.fastjson.JSONArray; |
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.nl.config.thread.ThreadPoolExecutorUtil; |
|
|
|
import org.nl.modules.wql.WQL; |
|
|
|
import org.nl.modules.wql.core.bean.WQLObject; |
|
|
|
import org.nl.wms.cockpit.service.BigScreenService; |
|
|
|
import org.nl.wms.cockpit.service.dto.*; |
|
|
|
import org.nl.wms.cockpit.service.enums.ColorEnum; |
|
|
|
import org.nl.wms.cockpit.service.enums.DeviceEnum; |
|
|
|
import org.nl.wms.util.MapOf; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.math.RoundingMode; |
|
|
|
import java.util.*; |
|
|
|
import java.util.concurrent.CompletableFuture; |
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
import java.util.concurrent.CopyOnWriteArrayList; |
|
|
|
import java.util.concurrent.ThreadPoolExecutor; |
|
|
|
|
|
|
|
/** |
|
|
|
* @Author: lyd |
|
|
|
* @Description: |
|
|
|
* @Date: 2023/5/30 |
|
|
|
*/ |
|
|
|
@Service |
|
|
|
@RequiredArgsConstructor |
|
|
|
@Slf4j |
|
|
|
public class BigScreenServiceImpl implements BigScreenService { |
|
|
|
/** |
|
|
|
* 車间情况大屏信息 |
|
|
|
* |
|
|
|
* @author gbx |
|
|
|
* @since 2023/3/1 |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public ConcurrentHashMap<String, Object> workshopCondition() { |
|
|
|
ThreadPoolExecutor pool = ThreadPoolExecutorUtil.getPoll(); |
|
|
|
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>(); |
|
|
|
// 1、当日混料生产
|
|
|
|
CompletableFuture<List<NumberDto>> mixDayProductionTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<NumberDto> res = new CopyOnWriteArrayList<>(); |
|
|
|
// 查找sql
|
|
|
|
JSONArray result = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "1", "region_code", "HL")) |
|
|
|
.process() |
|
|
|
.getResultJSONArray(0); |
|
|
|
if (ObjectUtil.isNotEmpty(result)) { |
|
|
|
res = result.toJavaList(NumberDto.class); |
|
|
|
// 设备空数据值
|
|
|
|
setResultCompleteInProcessProduction(res, "HL"); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
mixDayProductionTask.thenAccept((result) -> { |
|
|
|
map.put("HLDayList", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("当日混料生产: {}", e.getMessage(), e); |
|
|
|
List<NumberDto> dtos = new ArrayList<>(); |
|
|
|
setResultCompleteInProcessProduction(dtos, "HL"); |
|
|
|
map.put("HLDayList", dtos); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 2、当日压制
|
|
|
|
CompletableFuture<List<NumberDto>> pressDayProductionTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<NumberDto> res = new CopyOnWriteArrayList<>(); |
|
|
|
// 查找所有混捻每周的数据
|
|
|
|
JSONArray result = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "1", "region_code", "YZ")).process().getResultJSONArray(0); |
|
|
|
if (ObjectUtil.isNotEmpty(result)) { |
|
|
|
res = result.toJavaList(NumberDto.class); |
|
|
|
setResultCompleteInProcessProduction(res, "YZ"); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
pressDayProductionTask.thenAccept((result) -> { |
|
|
|
map.put("YZDayList", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("当日混料生产: {}", e.getMessage(), e); |
|
|
|
List<NumberDto> dtos = new ArrayList<>(); |
|
|
|
setResultCompleteInProcessProduction(dtos, "YZ"); |
|
|
|
map.put("YZDayList", dtos); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 3、当日成品
|
|
|
|
CompletableFuture<List<ManufacturedProductsDto>> manufacturedProductsDayProductionTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<ManufacturedProductsDto> res = new ArrayList<>(); |
|
|
|
Random random = new Random(); |
|
|
|
// 使用随机数
|
|
|
|
for (int i = 1; i <= 5; i++) { |
|
|
|
ManufacturedProductsDto manufacturedProductsDto = new ManufacturedProductsDto(); |
|
|
|
manufacturedProductsDto.setInventory_qty(random.nextInt(2000 - 100 + 1) + 100); |
|
|
|
manufacturedProductsDto.setQualified_in_qty(random.nextInt(2000 - 100 + 1) + 100); |
|
|
|
manufacturedProductsDto.setUnqualified_in_qty(random.nextInt(2000 - 100 + 1) + 100); |
|
|
|
manufacturedProductsDto.setMaterial_code("成品" + i); |
|
|
|
res.add(manufacturedProductsDto); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
manufacturedProductsDayProductionTask.thenAccept((result) -> { |
|
|
|
map.put("CPDayList", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("当日成品生产: {}", e.getMessage(), e); |
|
|
|
map.put("CPDayList", null); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 4、设备运行情况
|
|
|
|
CompletableFuture<List<OperationConditionDto>> deviceConditionTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<OperationConditionDto> res = new ArrayList<>(); |
|
|
|
for (int i = 0; i < 4; i++) { |
|
|
|
DeviceEnum deviceEnumByIndex = DeviceEnum.getDeviceEnumByIndex(i); |
|
|
|
OperationConditionDto dto = new OperationConditionDto(); |
|
|
|
dto.setDevice_name(deviceEnumByIndex.getDevice_name()); |
|
|
|
dto.setRunning(3); |
|
|
|
dto.setFailure(5); |
|
|
|
dto.setShutdown(2); |
|
|
|
dto.setStandby(6); |
|
|
|
res.add(dto); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
deviceConditionTask.thenAccept((result) -> { |
|
|
|
map.put("DeviceConditionList", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("设备运行情况: {}", e.getMessage(), e); |
|
|
|
map.put("DeviceConditionList", null); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 5、近一个月故障次数前5台设备
|
|
|
|
CompletableFuture<List<OperationConditionDto>> lastMonthFailureTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<OperationConditionDto> res = new ArrayList<>(); |
|
|
|
Random random = new Random(); |
|
|
|
for (int i = 0; i < 5; i++) { |
|
|
|
OperationConditionDto dto = new OperationConditionDto(); |
|
|
|
dto.setDevice_name("机器" + (i + 1)); |
|
|
|
dto.setFailure(random.nextInt(30 - 10 + 1) + 10); |
|
|
|
res.add(dto); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
lastMonthFailureTask.thenAccept(result -> { |
|
|
|
map.put("LastMonthFailureList", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("近一个月故障次数前5台设备: {}", e.getMessage(), e); |
|
|
|
map.put("LastMonthFailureList", null); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 6、最近10次设备故障
|
|
|
|
CompletableFuture<List<FailureDeviceInfoDto>> lastTenFailureTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<FailureDeviceInfoDto> res = new ArrayList<>(); |
|
|
|
for (int i = 0; i < 5; i++) { |
|
|
|
FailureDeviceInfoDto dto = new FailureDeviceInfoDto(); |
|
|
|
dto.setDevice_code("hn01"); |
|
|
|
dto.setDevice_name("混黏01"); |
|
|
|
dto.setFailure_time("05-30 09:50:12"); |
|
|
|
dto.setFailure_info("机器故障"); |
|
|
|
dto.setDevice_status_name("待机"); |
|
|
|
res.add(dto); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
lastTenFailureTask.thenAccept(result -> { |
|
|
|
map.put("LastTenFailureList", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("最近10次设备故障: {}", e.getMessage(), e); |
|
|
|
map.put("LastTenFailureList", null); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 7、码垛位情况显示
|
|
|
|
CompletableFuture<JSONArray> stackingPositionTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
JSONArray res = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "5", "region_code", "YZ")) |
|
|
|
.process() |
|
|
|
.getResultJSONArray(0); |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
stackingPositionTask.thenAccept(result -> { |
|
|
|
for (int i = 0; i < result.size(); i++) { |
|
|
|
JSONObject jsonObject = result.getJSONObject(i); |
|
|
|
jsonObject.put("color_status", ColorEnum.RED.getIndex()); |
|
|
|
} |
|
|
|
map.put("StackingPositionList", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("码垛位情况显示: {}", e.getMessage(), e); |
|
|
|
map.put("StackingPositionList", null); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 8、压机信息显示
|
|
|
|
CompletableFuture<JSONArray> pressMachineTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
JSONArray res = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "6")) |
|
|
|
.process() |
|
|
|
.getResultJSONArray(0); |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
pressMachineTask.thenAccept(result -> { |
|
|
|
map.put("PressMachineList", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("压机信息显示: {}", e.getMessage(), e); |
|
|
|
map.put("PressMachineList", null); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 9、混料机信息显示
|
|
|
|
CompletableFuture<JSONArray> mixMachineTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
JSONArray res = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "7")) |
|
|
|
.process() |
|
|
|
.getResultJSONArray(0); |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
mixMachineTask.thenAccept(result -> { |
|
|
|
map.put("MixMachineList", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("混料机信息显示: {}", e.getMessage(), e); |
|
|
|
map.put("MixMachineList", null); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 10、困料货架的信息显示
|
|
|
|
CompletableFuture<JSONArray> trappedMaterialShelfTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
JSONArray res = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "8")) |
|
|
|
.process() |
|
|
|
.getResultJSONArray(0); |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
trappedMaterialShelfTask.thenAccept(result -> { |
|
|
|
map.put("TrappedMaterialShelfList", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("困料货架的信息显示: {}", e.getMessage(), e); |
|
|
|
map.put("TrappedMaterialShelfList", null); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 11、半成品货架数据显示
|
|
|
|
CompletableFuture<JSONArray> semiFinishedProductShelfTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
JSONArray res = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "9")) |
|
|
|
.process() |
|
|
|
.getResultJSONArray(0); |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
semiFinishedProductShelfTask.thenAccept(result -> { |
|
|
|
map.put("SemiFinishedProductShelfList", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("半成品货架数据显示: {}", e.getMessage(), e); |
|
|
|
map.put("SemiFinishedProductShelfList", null); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
CompletableFuture<Void> allQuery = CompletableFuture.allOf( |
|
|
|
mixDayProductionTask, |
|
|
|
pressDayProductionTask, |
|
|
|
manufacturedProductsDayProductionTask, |
|
|
|
deviceConditionTask, |
|
|
|
lastMonthFailureTask, |
|
|
|
stackingPositionTask, |
|
|
|
pressMachineTask, |
|
|
|
mixMachineTask, |
|
|
|
trappedMaterialShelfTask, |
|
|
|
semiFinishedProductShelfTask); |
|
|
|
CompletableFuture<ConcurrentHashMap<String, Object>> future = allQuery.thenApply((result) -> map).exceptionally((e) -> { |
|
|
|
log.error(e.getMessage(), e); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
future.join(); |
|
|
|
return map; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 工序生产 |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public ConcurrentHashMap<String, Object> processProduction() { |
|
|
|
// 工序生产:混料、压制(成型)、包装、成品
|
|
|
|
ThreadPoolExecutor pool = ThreadPoolExecutorUtil.getPoll(); |
|
|
|
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>(); |
|
|
|
// 1.1 获取混料当日计划与实际生产、生产率 单位(吨)需要除1000
|
|
|
|
CompletableFuture<List<NumberDto>> mixMaterialStorage = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<NumberDto> res = new CopyOnWriteArrayList<>(); |
|
|
|
// 查找所有混料设备的数据
|
|
|
|
JSONArray result = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "1", "region_code", "HL")).process().getResultJSONArray(0); |
|
|
|
if (ObjectUtil.isNotEmpty(result)) { |
|
|
|
res = result.toJavaList(NumberDto.class); |
|
|
|
// 设备空数据值
|
|
|
|
setResultCompleteInProcessProduction(res, "HL"); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
mixMaterialStorage.thenAccept((result) -> { |
|
|
|
// 整理数据
|
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
int sumRealDay = 0; |
|
|
|
int sumPlanDay = 0; |
|
|
|
for (NumberDto numberDto : result) { |
|
|
|
sumRealDay += numberDto.getReal_qty(); |
|
|
|
sumPlanDay += numberDto.getPlan_qty(); |
|
|
|
} |
|
|
|
res.put("hl_plan_day", BigDecimal.valueOf((double) sumPlanDay / 1000).setScale(2, RoundingMode.HALF_UP).toString()); |
|
|
|
res.put("hl_real_day", BigDecimal.valueOf((double) sumRealDay / 1000).setScale(2, RoundingMode.HALF_UP).toString()); |
|
|
|
res.put("hl_productivity", sumRealDay / sumPlanDay); |
|
|
|
res.put("HLDayList", result); |
|
|
|
if (map.containsKey("HL")) { // 如果存在
|
|
|
|
JSONObject hl = (JSONObject) map.get("HL"); |
|
|
|
res.put("HLWeekList", hl.getJSONArray("HLWeekList")); |
|
|
|
map.put("HL", res); |
|
|
|
} else { |
|
|
|
map.put("HL", res); |
|
|
|
} |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("获取混料设备生产信息: {}", e.getMessage(), e); |
|
|
|
List<NumberDto> dtos = new ArrayList<>(); |
|
|
|
setResultCompleteInProcessProduction(dtos, "HL"); |
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
res.put("hl_plan_day", "0.00"); |
|
|
|
res.put("hl_real_day", "0.00"); |
|
|
|
res.put("hl_productivity", 0); |
|
|
|
res.put("HLDayList", dtos); |
|
|
|
if (map.containsKey("HL")) { // 如果存在
|
|
|
|
JSONObject hl = (JSONObject) map.get("HL"); |
|
|
|
res.put("HLWeekList", hl.getJSONArray("HLWeekList")); |
|
|
|
map.put("HL", res); |
|
|
|
} else { |
|
|
|
map.put("HL", res); |
|
|
|
} |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 1.2 获取每台混捻设备的每周数据
|
|
|
|
CompletableFuture<List<NumberDto>> mixDeviceWeekDayStorage = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<NumberDto> res = new CopyOnWriteArrayList<>(); |
|
|
|
// 查找所有混捻每周的数据
|
|
|
|
JSONArray result = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "2", "region_code", "HL")).process().getResultJSONArray(0); |
|
|
|
if (ObjectUtil.isNotEmpty(result)) { |
|
|
|
res = result.toJavaList(NumberDto.class); |
|
|
|
setResultCompleteInProcessProduction(res, "HL"); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
mixDeviceWeekDayStorage.thenAccept((result) -> { |
|
|
|
//每周的数据
|
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
res.put("HLWeekList", result); |
|
|
|
if (map.containsKey("HL")) { // 如果存在
|
|
|
|
JSONObject hl = (JSONObject) map.get("HL"); |
|
|
|
res.put("hl_plan_day", hl.getString("hl_plan_day")); |
|
|
|
res.put("hl_real_day", hl.getString("hl_real_day")); |
|
|
|
res.put("hl_productivity", hl.getString("hl_productivity")); |
|
|
|
res.put("HLDayList", hl.getJSONArray("HLDayList")); |
|
|
|
map.put("HL", res); |
|
|
|
} else { |
|
|
|
map.put("HL", res); |
|
|
|
} |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("获取混捻(每周)信息: {}", e.getMessage(), e); |
|
|
|
List<NumberDto> dtos = new ArrayList<>(); |
|
|
|
setResultCompleteInProcessProduction(dtos, "HL"); |
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
res.put("HLWeekList", dtos); |
|
|
|
if (map.containsKey("HL")) { // 如果存在
|
|
|
|
JSONObject hl = (JSONObject) map.get("HL"); |
|
|
|
res.put("hl_plan_day", hl.getString("hl_plan_day")); |
|
|
|
res.put("hl_real_day", hl.getString("hl_real_day")); |
|
|
|
res.put("hl_productivity", hl.getString("hl_productivity")); |
|
|
|
res.put("HLDayList", hl.getJSONArray("HLDayList")); |
|
|
|
map.put("HL", res); |
|
|
|
} else { |
|
|
|
map.put("HL", res); |
|
|
|
} |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 2.1 获取成型的计划与实际生产数量:单位万块, 每天的合格与不合格数量
|
|
|
|
CompletableFuture<List<NumberDto>> yzPlanAndRealStorage = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<NumberDto> res = new CopyOnWriteArrayList<>(); |
|
|
|
// 查找所有混捻每周的数据
|
|
|
|
JSONArray result = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "1", "region_code", "YZ")).process().getResultJSONArray(0); |
|
|
|
if (ObjectUtil.isNotEmpty(result)) { |
|
|
|
res = result.toJavaList(NumberDto.class); |
|
|
|
setResultCompleteInProcessProduction(res, "YZ"); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
yzPlanAndRealStorage.thenAccept((result) -> { |
|
|
|
// 整理数据
|
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
int sumRealDay = 0; |
|
|
|
int sumPlanDay = 0; |
|
|
|
for (NumberDto numberDto : result) { |
|
|
|
sumRealDay += numberDto.getReal_qty(); |
|
|
|
sumPlanDay += numberDto.getPlan_qty(); |
|
|
|
} |
|
|
|
res.put("yz_plan_day", BigDecimal.valueOf((double) sumPlanDay / 10000).setScale(2, RoundingMode.HALF_UP).toString()); |
|
|
|
res.put("yz_real_day", BigDecimal.valueOf((double) sumRealDay / 10000).setScale(2, RoundingMode.HALF_UP).toString()); |
|
|
|
res.put("yz_productivity", sumRealDay / sumPlanDay); |
|
|
|
res.put("YZDayList", result); |
|
|
|
if (map.containsKey("YZ")) { // 如果存在
|
|
|
|
JSONObject yz = (JSONObject) map.get("YZ"); |
|
|
|
res.put("YZWeekList", yz.getJSONArray("YZWeekList")); |
|
|
|
map.put("YZ", res); |
|
|
|
} else { |
|
|
|
map.put("YZ", res); |
|
|
|
} |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("获取压制设备生产信息: {}", e.getMessage(), e); |
|
|
|
List<NumberDto> dtos = new ArrayList<>(); |
|
|
|
setResultCompleteInProcessProduction(dtos, "YZ"); |
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
res.put("yz_plan_day", "0.00"); |
|
|
|
res.put("yz_real_day", "0.00"); |
|
|
|
res.put("yz_productivity", 0); |
|
|
|
res.put("YZDayList", dtos); |
|
|
|
if (map.containsKey("YZ")) { // 如果存在
|
|
|
|
JSONObject yz = (JSONObject) map.get("YZ"); |
|
|
|
res.put("YZWeekList", yz.getJSONArray("YZWeekList")); |
|
|
|
map.put("YZ", res); |
|
|
|
} else { |
|
|
|
map.put("YZ", res); |
|
|
|
} |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 2.2 压制每周的合格与不合格数量
|
|
|
|
CompletableFuture<List<NumberDto>> yzDeviceWeekDayStorage = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<NumberDto> res = new CopyOnWriteArrayList<>(); |
|
|
|
// 查找所有压制每周的数据
|
|
|
|
JSONArray result = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "2", "region_code", "YZ")).process().getResultJSONArray(0); |
|
|
|
if (ObjectUtil.isNotEmpty(result)) { |
|
|
|
res = result.toJavaList(NumberDto.class); |
|
|
|
setResultCompleteInProcessProduction(res, "YZ"); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
yzDeviceWeekDayStorage.thenAccept((result) -> { |
|
|
|
//每周的数据
|
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
res.put("YZWeekList", result); |
|
|
|
if (map.containsKey("YZ")) { // 如果存在
|
|
|
|
JSONObject yz = (JSONObject) map.get("YZ"); |
|
|
|
res.put("yz_plan_day", yz.getString("yz_plan_day")); |
|
|
|
res.put("yz_real_day", yz.getString("yz_real_day")); |
|
|
|
res.put("yz_productivity", yz.getString("yz_productivity")); |
|
|
|
res.put("YZDayList", yz.getJSONArray("YZDayList")); |
|
|
|
map.put("YZ", res); |
|
|
|
} else { |
|
|
|
map.put("YZ", res); |
|
|
|
} |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("获取压制(每周)信息: {}", e.getMessage(), e); |
|
|
|
List<NumberDto> dtos = new ArrayList<>(); |
|
|
|
setResultCompleteInProcessProduction(dtos, "YZ"); |
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
res.put("YZWeekList", dtos); |
|
|
|
if (map.containsKey("YZ")) { // 如果存在
|
|
|
|
JSONObject yz = (JSONObject) map.get("YZ"); |
|
|
|
res.put("yz_plan_day", yz.getString("yz_plan_day")); |
|
|
|
res.put("yz_real_day", yz.getString("yz_real_day")); |
|
|
|
res.put("yz_productivity", yz.getString("yz_productivity")); |
|
|
|
res.put("YZDayList", yz.getJSONArray("YZDayList")); |
|
|
|
map.put("YZ", res); |
|
|
|
} else { |
|
|
|
map.put("YZ", res); |
|
|
|
} |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 3.1 获取包装的计划与实际生产数量:单位万块, 每天的合格与不合格数量
|
|
|
|
CompletableFuture<List<NumberDto>> bzPlanAndRealStorage = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<NumberDto> res = new CopyOnWriteArrayList<>(); |
|
|
|
// 查找所有包装每天的数据
|
|
|
|
JSONArray result = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "3")).process().getResultJSONArray(0); |
|
|
|
if (ObjectUtil.isNotEmpty(result)) { |
|
|
|
res = result.toJavaList(NumberDto.class); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
bzPlanAndRealStorage.thenAccept((result) -> { |
|
|
|
// 整理数据
|
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
int sumRealDay = 0; |
|
|
|
int sumPlanDay = 0; |
|
|
|
for (NumberDto numberDto : result) { |
|
|
|
sumRealDay += numberDto.getReal_qty(); |
|
|
|
sumPlanDay += numberDto.getPlan_qty(); |
|
|
|
} |
|
|
|
res.put("bz_plan_day", BigDecimal.valueOf((double) sumPlanDay / 10000).setScale(2, RoundingMode.HALF_UP).toString()); |
|
|
|
res.put("bz_real_day", BigDecimal.valueOf((double) sumRealDay / 10000).setScale(2, RoundingMode.HALF_UP).toString()); |
|
|
|
res.put("bz_productivity", sumRealDay / sumPlanDay); |
|
|
|
res.put("BZDayList", result); |
|
|
|
if (map.containsKey("BZ")) { // 如果存在
|
|
|
|
JSONObject bz = (JSONObject) map.get("BZ"); |
|
|
|
res.put("BZWeekList", bz.getJSONArray("BZWeekList")); |
|
|
|
map.put("BZ", res); |
|
|
|
} else { |
|
|
|
map.put("BZ", res); |
|
|
|
} |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("获取包装设备生产信息: {}", e.getMessage(), e); |
|
|
|
List<NumberDto> dtos = new ArrayList<>(); |
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
res.put("bz_plan_day", "0.00"); |
|
|
|
res.put("bz_real_day", "0.00"); |
|
|
|
res.put("bz_productivity", 0); |
|
|
|
res.put("BZDayList", dtos); |
|
|
|
if (map.containsKey("BZ")) { // 如果存在
|
|
|
|
JSONObject bz = (JSONObject) map.get("BZ"); |
|
|
|
res.put("BZWeekList", bz.getJSONArray("BZWeekList")); |
|
|
|
map.put("BZ", res); |
|
|
|
} else { |
|
|
|
map.put("BZ", res); |
|
|
|
} |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 3.2 包装每周的合格与不合格数量
|
|
|
|
CompletableFuture<List<NumberDto>> bzDeviceWeekDayStorage = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<NumberDto> res = new CopyOnWriteArrayList<>(); |
|
|
|
// 查找所有包装每周的数据
|
|
|
|
JSONArray result = WQL.getWO("COCKPIT_PROCESS_PRODUCTION").addParamMap(MapOf.of("flag", "4")).process().getResultJSONArray(0); |
|
|
|
if (ObjectUtil.isNotEmpty(result)) { |
|
|
|
res = result.toJavaList(NumberDto.class); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
bzDeviceWeekDayStorage.thenAccept((result) -> { |
|
|
|
//每周的数据
|
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
res.put("BZWeekList", result); |
|
|
|
if (map.containsKey("BZ")) { // 如果存在
|
|
|
|
JSONObject bz = (JSONObject) map.get("BZ"); |
|
|
|
res.put("bz_plan_day", bz.getString("bz_plan_day")); |
|
|
|
res.put("bz_real_day", bz.getString("bz_real_day")); |
|
|
|
res.put("bz_productivity", bz.getString("bz_productivity")); |
|
|
|
res.put("BZDayList", bz.getJSONArray("BZDayList")); |
|
|
|
map.put("BZ", res); |
|
|
|
} else { |
|
|
|
map.put("BZ", res); |
|
|
|
} |
|
|
|
}).exceptionally((e) -> { |
|
|
|
log.error("获取包装(每周)信息: {}", e.getMessage(), e); |
|
|
|
List<NumberDto> dtos = new ArrayList<>(); |
|
|
|
JSONObject res = new JSONObject(); |
|
|
|
res.put("BZWeekList", dtos); |
|
|
|
if (map.containsKey("BZ")) { // 如果存在
|
|
|
|
JSONObject bz = (JSONObject) map.get("BZ"); |
|
|
|
res.put("bz_plan_day", bz.getString("bz_plan_day")); |
|
|
|
res.put("bz_real_day", bz.getString("bz_real_day")); |
|
|
|
res.put("bz_productivity", bz.getString("bz_productivity")); |
|
|
|
res.put("BZDayList", bz.getJSONArray("BZDayList")); |
|
|
|
map.put("BZ", res); |
|
|
|
} else { |
|
|
|
map.put("BZ", res); |
|
|
|
} |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 4 成品出入库
|
|
|
|
CompletableFuture<List<InventoryDto>> cpDeviceDataStorage = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<InventoryDto> res = new CopyOnWriteArrayList<>(); |
|
|
|
// 查找所有包装每周的数据
|
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
cpDeviceDataStorage.thenAccept((result) -> { |
|
|
|
//数据
|
|
|
|
JSONObject result1 = new JSONObject(); |
|
|
|
JSONArray jsonArray = new JSONArray(); |
|
|
|
for (int i = 1; i <= 5; i++) { |
|
|
|
InventoryDto dto = new InventoryDto(); |
|
|
|
dto.setInventory_qty(1000000); |
|
|
|
dto.setRegion_out_qty(5000); |
|
|
|
dto.setRegion_in_qty(9995000); |
|
|
|
dto.setMaterial_code("成品" + i); |
|
|
|
jsonArray.add(dto); |
|
|
|
} |
|
|
|
result1.put("in_qty", "100.00"); |
|
|
|
result1.put("out_qty", "10.00"); |
|
|
|
result1.put("inventory_qty", "90.00"); |
|
|
|
result1.put("in_productivity", 30); |
|
|
|
result1.put("out_productivity", 60); |
|
|
|
result1.put("inv_productivity", 80); |
|
|
|
result1.put("KCDayList", jsonArray); |
|
|
|
result1.put("KCWeekList", jsonArray); |
|
|
|
map.put("KC", result1); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
JSONObject result = new JSONObject(); |
|
|
|
JSONArray jsonArray = new JSONArray(); |
|
|
|
for (int i = 1; i <= 5; i++) { |
|
|
|
InventoryDto dto = new InventoryDto(); |
|
|
|
dto.setInventory_qty(1000000); |
|
|
|
dto.setRegion_out_qty(5000); |
|
|
|
dto.setRegion_in_qty(9995000); |
|
|
|
dto.setMaterial_code("成品" + i); |
|
|
|
jsonArray.add(dto); |
|
|
|
} |
|
|
|
result.put("in_qty", "100.00"); |
|
|
|
result.put("out_qty", "10.00"); |
|
|
|
result.put("inventory_qty", "90.00"); |
|
|
|
result.put("in_productivity", 30); |
|
|
|
result.put("out_productivity", 60); |
|
|
|
result.put("inv_productivity", 80); |
|
|
|
result.put("KCDayList", jsonArray); |
|
|
|
result.put("KCWeekList", jsonArray); |
|
|
|
map.put("KC", result); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
CompletableFuture<Void> allQuery = CompletableFuture.allOf( |
|
|
|
mixMaterialStorage, |
|
|
|
mixDeviceWeekDayStorage, |
|
|
|
yzPlanAndRealStorage, |
|
|
|
yzDeviceWeekDayStorage, |
|
|
|
bzPlanAndRealStorage, |
|
|
|
bzDeviceWeekDayStorage, |
|
|
|
cpDeviceDataStorage); |
|
|
|
CompletableFuture<ConcurrentHashMap<String, Object>> future = allQuery.thenApply((result) -> map).exceptionally((e) -> { |
|
|
|
log.error(e.getMessage(), e); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
future.join(); |
|
|
|
return map; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 处理空白数据 - 工序 |
|
|
|
* |
|
|
|
* @param result |
|
|
|
*/ |
|
|
|
private void setResultCompleteInProcessProduction(List<NumberDto> result, String region_code) { |
|
|
|
HashSet<String> existingLabels = new HashSet<>(); // 创建一个 HashSet 对象
|
|
|
|
// 遍历 result 列表中的每个 ProductionStatisticsDto 对象
|
|
|
|
for (NumberDto dto : result) { |
|
|
|
// 检查 device_code 字段是否存在于 existingLabels 集合中
|
|
|
|
if (!existingLabels.contains(dto.getDevice_code())) { |
|
|
|
// 将缺少的标签值添加到 existingLabels 集合中
|
|
|
|
existingLabels.add(dto.getDevice_code()); |
|
|
|
} |
|
|
|
} |
|
|
|
// 获取所有设备编码
|
|
|
|
WQLObject deviceTab = WQLObject.getWQLObject("pdm_bi_device"); |
|
|
|
JSONArray resultJSONArray = deviceTab.query("region_code = '" + region_code + "' AND is_workorder = '1'").getResultJSONArray(0); |
|
|
|
for (int i = 0; i < resultJSONArray.size(); i++) { |
|
|
|
JSONObject jsonObject = resultJSONArray.getJSONObject(i); |
|
|
|
if (!existingLabels.contains(jsonObject.getString("device_code"))) { |
|
|
|
NumberDto dto = new NumberDto(); |
|
|
|
dto.setDevice_code(jsonObject.getString("device_code")); |
|
|
|
dto.setRegion_code(jsonObject.getString("region_code")); |
|
|
|
dto.setDevice_name(jsonObject.getString("device_name")); |
|
|
|
dto.setPlan_qty(0); |
|
|
|
dto.setReal_qty(0); |
|
|
|
dto.setQualified_qty(0); |
|
|
|
dto.setUnqualified_qty(0); |
|
|
|
result.add(dto); |
|
|
|
} else { |
|
|
|
result.forEach(numberDto -> { |
|
|
|
if (numberDto.getDevice_code().equals(jsonObject.getString("device_code"))) { |
|
|
|
numberDto.setDevice_name(jsonObject.getString("device_name")); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
Collections.sort(result, Comparator.comparing(NumberDto::getDevice_code)); |
|
|
|
} |
|
|
|
} |