opt:优化首页接口查询方式;

add:增加搬运管理接口
This commit is contained in:
2024-09-24 15:02:46 +08:00
parent 5631aaa361
commit 8faa7335a2
18 changed files with 237 additions and 713 deletions

View File

@@ -18,8 +18,8 @@ public enum AcsDefineEnum {
//agv状态 1-关机2-运行中3-交通管制4-任务等待5-充电中6-故障中7-低电量
AGV_STATUS(MapOf.of("关机", "1", "运行中", "2", "交通管制", "3", "任务等待", "4", "充电中", "5", "故障中", "6", "低电量", "7")),
//RGV状态 1-空闲 2-任务未派发 3-执行任务中 4-任务完成
RGV_STATUS(MapOf.of("1","IDLE","2","SENT","3","WORK","4","COMPLETE")),
//RGV状态 1-空闲 2-任务执行中 3-充电 4-故障 5-未知 6-不可利用
RGV_STATUS(MapOf.of("1","IDLE","2","EXECUTING","3","CHARGING","4","ERROR","5","UNKNOWN","6","UNAVAILABLE")),
//载具类型
VEHICLE_TYPE(MapOf.of("普涂", "1", "连涂", "2")),

View File

@@ -38,8 +38,8 @@ public class CockpitController {
}
@PostMapping("/allDeviceStatus")
@Log("接口")
@ApiOperation("接口")
@Log("接口")
@ApiOperation("接口")
public ResponseEntity<Object> allDeviceStatus() {
return new ResponseEntity<>(cockpitService.allDeviceStatus(), HttpStatus.OK);
}

View File

@@ -3,6 +3,9 @@ package org.nl.wms.cockpit.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Author: lyd
* @Description:
@@ -17,7 +20,7 @@ public interface CockpitService {
JSONArray acceptDeviceFaultInfo();
JSONObject getHomeInfo();
HashMap<String, Object> getHomeInfo();
JSONObject getHandlingInfo();

View File

@@ -1,34 +0,0 @@
package org.nl.wms.cockpit.service.dao;
import lombok.Data;
import lombok.experimental.FieldNameConstants;
import org.nl.common.base.ErrorData;
import org.nl.wms.cockpit.service.dao.home.DayData;
import java.util.ArrayList;
import java.util.List;
/**
* 公共类
*
* @author gbx
* @since 2024-01-04
*/
@Data
@FieldNameConstants
public class CommonData {
private WeekWorkorderStatistics week_workorder_statistics;
@Data
public static class WeekWorkorderStatistics extends ErrorData {
private List<DayData> day1 =new ArrayList<>();
private List<DayData> day2=new ArrayList<>();
private List<DayData> day3=new ArrayList<>();
private List<DayData> day4=new ArrayList<>();
private List<DayData> day5=new ArrayList<>();
private List<DayData> day6=new ArrayList<>();
private List<DayData> day7=new ArrayList<>();
}
}

View File

@@ -1,21 +0,0 @@
package org.nl.wms.cockpit.service.dao.ghs;
import lombok.Data;
/**
* 设备故障率
*
* @author gbx
* @since 2024-01-12
*/
@Data
public class DeviceFaultStatistics {
private final long totalFaults;
private final double faultRate;
public DeviceFaultStatistics(long totalFaults, double faultRate) {
this.totalFaults = totalFaults;
this.faultRate = faultRate;
}
}

View File

@@ -1,59 +0,0 @@
package org.nl.wms.cockpit.service.dao.ghs;
import lombok.Data;
import org.nl.wms.cockpit.service.dao.CommonData;
import java.io.Serializable;
/**
* 固化室大屏页面
*
* @author gbx
* @since 2024-01-04
*/
@Data
public class GhsInfo implements Serializable {
private CuringSummary curing_summary;
private CommonData.WeekWorkorderStatistics week_workorder_statistics;
private TaskInfo task_info;
private DeviceStatus device_status;
private FaultAlarm fault_alarm;
private MonthlyFaultStatistics monthly_fault_statistics;
@Data
public static class CuringSummary {
private String item_name;
private String item_qty;
}
@Data
public static class TaskInfo {
private String task_type;
private String device_name;
private String point_code1;
private String point_code2;
}
@Data
public static class DeviceStatus {
private String item_name;
private String item_qty;
}
@Data
public static class FaultAlarm {
private String device_name;
private String fault_cause;
private String alarm_time;
}
@Data
public static class MonthlyFaultStatistics {
private String device_name;
private String alarm_qty;
}
}

View File

@@ -1,90 +0,0 @@
package org.nl.wms.cockpit.service.dao.home;
import lombok.Data;
import lombok.experimental.FieldNameConstants;
import org.nl.common.base.ErrorData;
import java.util.ArrayList;
import java.util.List;
/**
* 首页总览大屏页面
*
* @author gbx
* @since 2024-01-04
*/
@Data
@FieldNameConstants
public class HomeInfo {
private TargetAchievement target_achievement;
private ZCStorageInfo zc_storage_info;
private TodayWork today_work;
private WorkorderStatistics workorder_statistics;
private DeviceStatus device_status;
private FaultAlarm fault_alarm;
private MonthlyFaultStatistics monthly_fault_statistics;
@Data
public static class ZCStorageInfo extends ErrorData {
private List<DayData> material_info;
private String empty_stock;
private String freePoint;
private String pointCount;
}
@Data
public static class TodayWork extends ErrorData {
private String workorder_code;
private String material_name;
private String plan_qty;
private String real_qty;
private String point_name;
private String workorder_status;
}
@Data
public static class WorkorderStatistics {
private Day1 day1;
@Data
public static class Day1 {
private String tb_real_qty;
private String gh_real_qty;
}
}
@Data
public static class DeviceStatus {
private StatusInfo status_info;
private StorageInfo storage_info;
@Data
public static class StatusInfo {
private String item_name;
private String item_qty;
}
@Data
public static class StorageInfo {
private String item_name;
private String tem_qty;
}
}
@Data
public static class FaultAlarm {
private String device_name;
private String fault_cause;
private String alarm_time;
}
@Data
public static class MonthlyFaultStatistics {
private String device_name;
private String alarm_qty;
}
}

View File

@@ -1,79 +0,0 @@
package org.nl.wms.cockpit.service.dao.tbx;
import lombok.Data;
import lombok.experimental.FieldNameConstants;
/**
* 涂板线大屏页面
*
* @author gbx
* @since 2024-01-04
*/
@Data
@FieldNameConstants
public class TbxInfo {
private TargetAchievement target_achievement;
private WeekWorkorderStatistics week_workorder_statistics;
private DeviceStatus device_status;
private FaultAlarm fault_alarm;
private MonthlyFaultStatistics monthly_fault_statistics;
@Data
public static class TargetAchievement {
private LTProduction lt_production;
private PTProduction pt_production;
@Data
public static class LTProduction {
private String plan_production;
private String actual_production;
private String percentage;
}
@Data
public static class PTProduction {
private String plan_production;
private String actual_production;
private String percentage;
}
}
@Data
public static class WeekWorkorderStatistics {
private Day1 day1;
@Data
public static class Day1 {
private String item_name;
private String item_qty;
}
}
@Data
public static class DeviceStatus {
private DeviceName device_name;
@Data
public static class DeviceName {
private String item_name;
private String item_qty;
}
}
@Data
public static class FaultAlarm {
private String device_name;
private String fault_cause;
private String alarm_time;
}
@Data
public static class MonthlyFaultStatistics {
private String device_name;
private String alarm_qty;
}
}

View File

@@ -1,16 +0,0 @@
package org.nl.wms.cockpit.service.dao.zcq;
import lombok.Data;
/**
* 暂存区库存结构
*
* @author gbx
* @since 2024-01-10
*/
@Data
public class Inventory {
private String point_name;
private String material_name;
private String quantity;
}

View File

@@ -1,56 +0,0 @@
package org.nl.wms.cockpit.service.dao.zcq;
import lombok.Data;
/**
* 暂存区大屏页面
*
* @author gbx
* @since 2024-01-04
*/
public class ZcqInfo {
private TemporaryStorage temporary_storage;
private Inventory inventory;
private TaskInfo task_info;
private DeviceStatus device_status;
private FaultAlarm fault_alarm;
private MonthlyFaultStatistics monthly_fault_statistics;
@Data
public static class TemporaryStorage {
private String total;
private String free;
private String percentage;
}
@Data
public static class Inventory {
private String material_name;
private String quantity;
}
@Data
public static class DeviceStatus {
private DeviceName device_name;
}
@Data
public static class DeviceName {
private String item_name;
private String item_qty;
}
@Data
public static class FaultAlarm {
private String device_name;
private String fault_cause;
private String alarm_time;
}
@Data
public static class MonthlyFaultStatistics {
private String device_name;
private String alarm_qty;
}
}

View File

@@ -3,43 +3,30 @@ package org.nl.wms.cockpit.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.enums.AcsDefineEnum;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.ColaBeanUtils;
import org.nl.common.utils.RedisUtils;
import org.nl.wms.cockpit.service.CockpitService;
import org.nl.wms.cockpit.service.dao.CommonData;
import org.nl.wms.cockpit.service.dao.home.DayData;
import org.nl.wms.cockpit.service.dao.home.HomeInfo;
import org.nl.wms.cockpit.service.dao.home.TargetAchievement;
import org.nl.wms.cockpit.service.dao.zcq.TaskInfo;
import org.nl.wms.cockpit.service.mapper.CockpitMapper;
import org.nl.wms.pdm.solidifyplan.service.impl.PdmBdSolidifyPlanServiceImpl;
import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService;
import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder;
import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task_manage.enums.RegionCodeConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -58,17 +45,9 @@ public class CockpitServiceImpl implements CockpitService {
@Autowired
private ISchBasePointService pointService;
@Autowired
private IPdmBdWorkorderService workorderService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private CockpitMapper cockpitMapper;
@Autowired
private ISchBaseVehiclematerialgroupService vehiclematerialgroupService;
@Autowired
@Qualifier("threadPoolExecutor")
@@ -86,77 +65,163 @@ public class CockpitServiceImpl implements CockpitService {
* 总览
*/
@Override
public JSONObject getHomeInfo() {
JSONObject getHomeInfo = new JSONObject();
//生产任务目标达成
JSONObject target_achievement = cockpitMapper.getProductTarget();
List<Map<String, Object>> productionSummaryList = new ArrayList<>();
for (String itemName : Arrays.asList("1", "2", "3")) {
Map<String, Object> item = new HashMap<>();
item.put("item_name", itemName);
item.put("item_qty", "0");
productionSummaryList.add(item);
}
JSONObject production_summary = cockpitMapper.getProductionsummary();
if (ObjectUtil.isNotEmpty(production_summary)) {
productionSummaryList.forEach(item -> {
String key = item.get("item_name").toString().toLowerCase();
if (ObjectUtil.isNotEmpty(production_summary.get(key))) {
item.put("item_qty", production_summary.get(key).toString());
}
});
}
//暂存库库存结构
JSONObject zc_storage_info = new JSONObject();
List<Map<String, Object>> material_info = cockpitMapper.getZcMaterialmsg();
zc_storage_info.put("material_info", material_info);
//库位使用占比
String percent = cockpitMapper.percent();
zc_storage_info.put("percent", percent);
//今日生产任务
List<Map<String, Object>> today_work = cockpitMapper.getTdWorkmsg();
if (ObjectUtil.isEmpty(today_work)) {
Map<String, Object> item1 = new HashMap<>();
item1.put("workorder_code", "240918001");
item1.put("material_name", "TS_12Z中负");
item1.put("plan_qty", "100");
item1.put("real_qty", "0");
item1.put("point_name", "普涂线01");
item1.put("workorder_status", "生产中");
today_work.add(item1);
}
List<Map<String, Object>> tb_real_qty = cockpitMapper.getTxQty("7", "TBX");
List<Map<String, Object>> gh_real_qty = cockpitMapper.getGhsQty("7");
List<Map<String, Object>> tb_real_qty_default = new ArrayList<>();
List<Map<String, Object>> gh_real_qty_default = new ArrayList<>();
getWeekWorkStatistics(tb_real_qty, tb_real_qty_default, "TBX", 7);
getWeekWorkStatistics(gh_real_qty, gh_real_qty_default, "GHS", 7);
public HashMap<String, Object> getHomeInfo() {
HashMap<String, Object> getHomeInfo = new HashMap<>();
//设备运行状态
JSONObject device_status = new JSONObject();
//库存结构
JSONObject zc_storage_info = new JSONObject();
//状态信息
List<Map<String, Object>> status_info = cockpitMapper.statusInfo();
CompletableFuture<List<Map<String, Object>>> task1 = CompletableFuture.supplyAsync(() -> cockpitMapper.statusInfo(), pool);
task1.thenAccept((result) -> {
device_status.put("status_info", result);
}).exceptionally((e) -> {
log.error("状态信息: {}", e.getMessage(), e);
return null;
});
//固化架信息
List<Map<String, Object>> storage_info = cockpitMapper.storageInfo();
device_status.put("status_info", status_info);
device_status.put("storage_info", storage_info);
CompletableFuture<List<Map<String, Object>>> task2 = CompletableFuture.supplyAsync(() -> cockpitMapper.storageInfo(), pool);
task2.thenAccept((result) -> {
device_status.put("storage_info", result);
}).exceptionally((e) -> {
log.error("固化架信息: {}", e.getMessage(), e);
return null;
});
//暂存库库存结构
CompletableFuture<List<Map<String, Object>>> task3 = CompletableFuture.supplyAsync(() -> cockpitMapper.getZcMaterialmsg(), pool);
task3.thenAccept((result) -> {
zc_storage_info.put("material_info", result);
}).exceptionally((e) -> {
log.error("暂存库库存结构: {}", e.getMessage(), e);
zc_storage_info.put("material_info", "");
return null;
});
//库位使用占比
CompletableFuture<String> task4 = CompletableFuture.supplyAsync(() -> cockpitMapper.percent(), pool);
task4.thenAccept((result) -> {
zc_storage_info.put("percent", result);
}).exceptionally((e) -> {
log.error("库位使用占比: {}", e.getMessage(), e);
zc_storage_info.put("percent", "");
return null;
});
//生产任务目标达成
CompletableFuture<JSONObject> task5 = CompletableFuture.supplyAsync(() -> cockpitMapper.getProductTarget(), pool);
task5.thenAccept((result) -> {
getHomeInfo.put("target_achievement", result);
}).exceptionally((e) -> {
log.error("获取生产任务目标达成: {}", e.getMessage(), e);
getHomeInfo.put("target_achievement", null);
return null;
});
//生产汇总
CompletableFuture<JSONObject> task6 = CompletableFuture.supplyAsync(() -> cockpitMapper.getProductionsummary(), pool);
task6.thenAccept((result) -> {
List<Map<String, Object>> productionSummaryList = new ArrayList<>();
for (String itemName : Arrays.asList("1", "2", "3")) {
Map<String, Object> item = new HashMap<>();
item.put("item_name", itemName);
item.put("item_qty", "0");
productionSummaryList.add(item);
}
if (ObjectUtil.isNotEmpty(result)) {
productionSummaryList.forEach(item -> {
String key = item.get("item_name").toString().toLowerCase();
if (ObjectUtil.isNotEmpty(result.get(key))) {
item.put("item_qty", result.get(key).toString());
}
});
}
getHomeInfo.put("production_summary", productionSummaryList);
}).exceptionally((e) -> {
log.error("生产汇总: {}", e.getMessage(), e);
getHomeInfo.put("production_summary", null);
return null;
});
//今日生产任务
CompletableFuture<List<Map<String, Object>>> task7 = CompletableFuture.supplyAsync(() -> cockpitMapper.getTdWorkmsg(), pool);
task7.thenAccept((result) -> {
List<Map<String, Object>> today_work = new ArrayList<>();
if (ObjectUtil.isEmpty(result)) {
//测试数据,上线后删除
Map<String, Object> item1 = new HashMap<>();
item1.put("workorder_code", "240918001");
item1.put("material_name", "TS_12Z中负");
item1.put("plan_qty", "100");
item1.put("real_qty", "0");
item1.put("point_name", "普涂线01");
item1.put("workorder_status", "生产中");
today_work.add(item1);
}
getHomeInfo.put("today_work", today_work);
}).exceptionally((e) -> {
log.error("今日生产任务: {}", e.getMessage(), e);
getHomeInfo.put("today_work", null);
return null;
});
//固化一周生产
CompletableFuture<List<Map<String, Object>>> task8 = CompletableFuture.supplyAsync(() -> cockpitMapper.getGhsQty("7"), pool);
task8.thenAccept((result) -> {
List<Map<String, Object>> gh_real_qty_default = new ArrayList<>();
getWeekWorkStatistics(result, gh_real_qty_default, "GHS", 7);
getHomeInfo.put("ghs_produce", gh_real_qty_default);
}).exceptionally((e) -> {
log.error("固化一周生产: {}", e.getMessage(), e);
getHomeInfo.put("ghs_produce", null);
return null;
});
//涂板一周生产
CompletableFuture<List<Map<String, Object>>> task9 = CompletableFuture.supplyAsync(() -> cockpitMapper.getTxQty("7", "TBX"), pool);
task9.thenAccept((result) -> {
List<Map<String, Object>> tb_real_qty_default = new ArrayList<>();
getWeekWorkStatistics(result, tb_real_qty_default, "TBX", 7);
getHomeInfo.put("tbx_produce", tb_real_qty_default);
}).exceptionally((e) -> {
log.error("涂板一周生产: {}", e.getMessage(), e);
getHomeInfo.put("tbx_produce", null);
return null;
});
//实时故障告警
List<Map<String, Object>> fault_alarm = cockpitMapper.faultAlarm();
faultAlarmDefault(fault_alarm, "TS_GHS02");
CompletableFuture<List<Map<String, Object>>> task10 = CompletableFuture.supplyAsync(() -> cockpitMapper.faultAlarm(), pool);
task10.thenAccept((result) -> {
//测试数据,上线后删除
faultAlarmDefault(result, "TS_GHS02");
getHomeInfo.put("fault_alarm", result);
}).exceptionally((e) -> {
log.error("实时故障告警: {}", e.getMessage(), e);
getHomeInfo.put("fault_alarm", null);
return null;
});
//近30日故障统计
JSONArray monthly_fault_statistics = cockpitMapper.monthlyFaultStatistics();
monthlyFaultStatisticsDefault(monthly_fault_statistics, "TS_GHS02");
CompletableFuture<JSONArray> task11 = CompletableFuture.supplyAsync(() -> cockpitMapper.monthlyFaultStatistics(), pool);
task11.thenAccept((result) -> {
//测试数据,上线后删除
monthlyFaultStatisticsDefault(result, "TS_GHS02");
getHomeInfo.put("monthly_fault_statistics", result);
}).exceptionally((e) -> {
log.error("近30日故障统计: {}", e.getMessage(), e);
getHomeInfo.put("monthly_fault_statistics", null);
return null;
});
//设备报警前十
List<Map<String, Object>> gh_statistics = cockpitMapper.ghStatistics();
getHomeInfo.put("target_achievement", target_achievement);
getHomeInfo.put("zc_storage_info", zc_storage_info);
getHomeInfo.put("today_work", today_work);
getHomeInfo.put("tbx_produce", tb_real_qty_default);
getHomeInfo.put("ghs_produce", gh_real_qty_default);
CompletableFuture<List<Map<String, Object>>> task12 = CompletableFuture.supplyAsync(() -> cockpitMapper.ghStatistics(), pool);
task12.thenAccept((result) -> {
getHomeInfo.put("gh_statistics", result);
}).exceptionally((e) -> {
log.error("设备报警前十: {}", e.getMessage(), e);
getHomeInfo.put("gh_statistics", null);
return null;
});
CompletableFuture<Void> allQuery = CompletableFuture.allOf(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12);
CompletableFuture<HashMap<String, Object>> future = allQuery.thenApply((result) -> getHomeInfo).exceptionally((e) -> {
log.error(e.getMessage(), e);
return null;
});
future.join();
getHomeInfo.put("device_status", device_status);
getHomeInfo.put("fault_alarm", fault_alarm);
getHomeInfo.put("monthly_fault_statistics", monthly_fault_statistics);
getHomeInfo.put("gh_statistics", gh_statistics);
getHomeInfo.put("production_summary", productionSummaryList);
getHomeInfo.put("zc_storage_info", zc_storage_info);
return getHomeInfo;
}
@@ -231,9 +296,11 @@ public class CockpitServiceImpl implements CockpitService {
}
//实时故障告警
List<Map<String, Object>> fault_alarm = cockpitMapper.FaultTime("TBX");
//测试数据,上线后删除
faultAlarmDefault(fault_alarm, "TS_LTX02");
//近30日故障统计
JSONArray monthly_fault_statistics = cockpitMapper.FaultTotal("TBX");
//测试数据,上线后删除
monthlyFaultStatisticsDefault(monthly_fault_statistics, "TS_LTX02");
List<Map<String, Object>> monthly_produce_statistics = cockpitMapper.getTbxMonthlyStatistics();
List<Map<String, Object>> tbxMonthlyStatistics = new ArrayList<>();
@@ -328,6 +395,7 @@ public class CockpitServiceImpl implements CockpitService {
}
});
} else {
//测试数据,上线后删除
Map<String, Object> item1 = new HashMap<>();
item1.put("material_name", "TS_1.9A正");
item1.put("material_spec", "正涂片极板1.9A/大片");
@@ -343,9 +411,11 @@ public class CockpitServiceImpl implements CockpitService {
}
//实时故障告警
List<Map<String, Object>> fault_alarm = cockpitMapper.FaultTime("GH");
//测试数据,上线后删除
faultAlarmDefault(fault_alarm, "TS_GHS02");
//近30日故障统计
JSONArray monthly_fault_statistics = cockpitMapper.FaultTotal("GH");
//测试数据,上线后删除
monthlyFaultStatisticsDefault(monthly_fault_statistics, "TS_GHS02");
getGhsInfo.put("curing_summary", curing_summary);
getGhsInfo.put("monthly_gh_qty", monthly_gh_qty_default);
@@ -437,6 +507,7 @@ public class CockpitServiceImpl implements CockpitService {
faultAlarmDefault(fault_alarm, "AGV08");
//近30日故障统计
JSONArray monthly_fault_statistics = cockpitMapper.monthlyFaultStatistics();
//测试数据,上线后删除
if (ObjectUtil.isEmpty(monthly_fault_statistics)) {
JSONObject item = new JSONObject();
item.put("region_name", "TS_GHS");
@@ -769,109 +840,70 @@ public class CockpitServiceImpl implements CockpitService {
@Override
public JSONArray allDeviceStatus() {
JSONArray array = new JSONArray();
// Random random = new Random();
// int lowerBound = 10000;
// int upperBound = 18000;
JSONArray baoshijian = (JSONArray) redisUtils.get("baoshijian1");
JSONArray guhuashi = (JSONArray) redisUtils.get("guhuashi1");
JSONArray AGV = (JSONArray) redisUtils.get("AGV1");
JSONArray RGV = (JSONArray) redisUtils.get("RGV1");
JSONArray site = (JSONArray) redisUtils.get("site1");
array.add(baoshijian);
array.add(guhuashi);
array.add(AGV);
array.add(RGV);
array.add(site);
//读取设备缓存信息
CompletableFuture<List<Map<String, Object>>> task1 = CompletableFuture.supplyAsync(() -> {
JSONArray baoshijian = (JSONArray) redisUtils.get("baoshijian1");
JSONArray guhuashi = (JSONArray) redisUtils.get("guhuashi1");
JSONArray AGV = (JSONArray) redisUtils.get("AGV1");
JSONArray RGV = (JSONArray) redisUtils.get("RGV1");
JSONArray site = (JSONArray) redisUtils.get("site1");
array.add(baoshijian);
array.add(guhuashi);
array.add(AGV);
array.add(RGV);
array.add(site);
return null;
}, pool);
task1.exceptionally((e) -> {
log.error("读取设备缓存信息: {}", e.getMessage(), e);
return null;
});
// 固化室详情
JSONArray ghsInteriorList = cockpitMapper.getGHSInteriorList();
JSONObject ghsDetail = new JSONObject();
ghsDetail.put("ghs_detail", ghsInteriorList);
array.add(ghsDetail);
CompletableFuture<JSONArray> task2 = CompletableFuture.supplyAsync(() -> cockpitMapper.getGHSInteriorList(), pool);
task2.thenAccept((result) -> {
JSONObject ghsDetail = new JSONObject();
ghsDetail.put("ghs_detail", result);
array.add(ghsDetail);
}).exceptionally((e) -> {
log.error("固化室详情{}", e.getMessage(), e);
JSONObject ghsDetail = new JSONObject();
ghsDetail.put("ghs_detail", null);
array.add(ghsDetail);
return null;
});
// 输送线详情
JSONArray ssxInteriorList = cockpitMapper.getSSXInteriorList();
JSONObject ssxDetail = new JSONObject();
ssxDetail.put("ssx_detail", ssxInteriorList);
array.add(ssxDetail);
// 库位
JSONArray zcList = cockpitMapper.getZCList();
JSONObject storage = new JSONObject();
storage.put("storage", zcList);
array.add(storage);
return array;
}
public ConcurrentHashMap<String, Object> equipmentInfo1(String deviceCode) {
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();
CompletableFuture<JSONArray> listCompletableFuture = CompletableFuture.supplyAsync(() -> {
JSONArray array = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("one", "1");
jsonObject.put("two", "2");
array.add(jsonObject);
return array;
}, pool);
listCompletableFuture.thenAccept(result -> {
map.put("DayShiftList", result);
CompletableFuture<JSONArray> task3 = CompletableFuture.supplyAsync(() -> cockpitMapper.getSSXInteriorList(), pool);
task3.thenAccept((result) -> {
JSONObject ssxDetail = new JSONObject();
ssxDetail.put("ssx_detail", result);
array.add(ssxDetail);
}).exceptionally((e) -> {
map.put("DayShiftList", null);
log.error("输送线详情{}", e.getMessage(), e);
JSONObject ssxDetail = new JSONObject();
ssxDetail.put("ssx_detail", ssxDetail);
array.add(ssxDetail);
return null;
});
CompletableFuture<JSONArray> listShiftProductionFuture = CompletableFuture.supplyAsync(() -> {
JSONArray array = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("one", "3");
jsonObject.put("two", "4");
array.add(jsonObject);
jsonObject.put("one", "6");
jsonObject.put("two", "7");
array.add(jsonObject);
return array;
}, pool);
listCompletableFuture.thenAccept(result -> {
map.put("DayShiftList", result);
// 库位详情
CompletableFuture<JSONArray> task4 = CompletableFuture.supplyAsync(() -> cockpitMapper.getZCList(), pool);
task4.thenAccept((result) -> {
JSONObject storage = new JSONObject();
storage.put("storage", result);
array.add(storage);
}).exceptionally((e) -> {
map.put("DayShiftList", null);
log.error("库位详情{}", e.getMessage(), e);
JSONObject storage = new JSONObject();
storage.put("storage", null);
array.add(storage);
return null;
});
CompletableFuture<JSONArray> listProductionTaskFuture = CompletableFuture.supplyAsync(() -> {
JSONArray array = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("one", "1");
jsonObject.put("two", "2");
array.add(jsonObject);
return array;
}, pool);
listCompletableFuture.thenAccept(result -> {
map.put("DayShiftList", result);
}).exceptionally((e) -> {
map.put("DayShiftList", null);
return null;
});
// 提交
CompletableFuture<Void> allQuery = CompletableFuture.allOf(listCompletableFuture, listShiftProductionFuture, listProductionTaskFuture);
CompletableFuture<ConcurrentHashMap<String, Object>> future = allQuery.thenApply((result) -> map).exceptionally((e) -> {
CompletableFuture<Void> allQuery = CompletableFuture.allOf(task1, task2, task3, task4);
CompletableFuture<JSONArray> future = allQuery.thenApply((result) -> array).exceptionally((e) -> {
log.error(e.getMessage(), e);
return null;
});
future.join();
return map;
}
/**
* 暂存区库存结构-空库存
*/
public HomeInfo.ZCStorageInfo getTemporaryStorage() {
HomeInfo.ZCStorageInfo zCStorageInfo = new HomeInfo.ZCStorageInfo();
zCStorageInfo.setMaterial_info(cockpitMapper.getTemporaryStorage());
List<SchBasePoint> pointList = pointService.list(new LambdaUpdateWrapper<SchBasePoint>().eq(SchBasePoint::getRegion_code, "ZC").eq(SchBasePoint::getIs_used, 1));
long freePoint = pointList.stream().filter(r -> "1".equals(r.getPoint_status())).count();
int pointCount = pointList.size();
//空库存百分比
double percentageFree = Math.round(((double) freePoint / (double) pointCount) * 100);
zCStorageInfo.setFreePoint(String.valueOf(freePoint));
zCStorageInfo.setPointCount(String.valueOf(pointCount));
zCStorageInfo.setEmpty_stock(String.valueOf(percentageFree));
return zCStorageInfo;
return array;
}
@@ -894,150 +926,7 @@ public class CockpitServiceImpl implements CockpitService {
}
/**
* 生产任务
*/
public List<HomeInfo.TodayWork> getWorkOrders(String type) {
// 获取今天的日期时间范围
LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
LocalDateTime endOfDay = startOfDay.plusDays(1).minusNanos(1);
// 查询今天的工单信息
List<PdmBdWorkorder> todayWorkOrders = workorderService.list(new LambdaUpdateWrapper<PdmBdWorkorder>()
.eq(PdmBdWorkorder::getIs_delete, 0)
.between(PdmBdWorkorder::getCreate_time, startOfDay, endOfDay)
.and(StringUtils.isNotBlank(type), i -> i.eq(PdmBdWorkorder::getRegion_code, type)));
return ColaBeanUtils.copyListProperties(todayWorkOrders, HomeInfo.TodayWork::new);
}
/**
* 生产目标达成
*/
public TargetAchievement getWorkOrderList(String regionCode, String type, Integer days) {
TargetAchievement targetAchievement;
targetAchievement = cockpitMapper.getCompletionPercent(regionCode, type, days);
if (targetAchievement != null) {
// 计算完成百分比
BigDecimal completionPercentage = targetAchievement.getActual_production().divide(targetAchievement.getExpected_production(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
int roundedPercentage = completionPercentage.intValue();
targetAchievement.setPercentage(roundedPercentage);
} else {
targetAchievement = new TargetAchievement();
}
return targetAchievement;
}
/**
* 7天生产统计
* type:1涂板线2固化室
*/
public CommonData.WeekWorkorderStatistics getWeekWorkStatistics(String type) {
// 过滤近5天的数据
CommonData.WeekWorkorderStatistics weekWorkorderStatistics = new CommonData.WeekWorkorderStatistics();
List<DayData> weekWorkorder;
List<TargetAchievement> tbxWorkOrder = new ArrayList<>();
List<TargetAchievement> ghworkOrders = new ArrayList<>();
//涂板线和固化室7天统计
if (RegionCodeConstant.COATED_PLATE_LINE_AREA.equals(type)) {
tbxWorkOrder = cockpitMapper.getWorkOrders(type, 7);
} else if (RegionCodeConstant.CURING_ZONE.equals(type)) {
ghworkOrders = cockpitMapper.getGhActualProduction(7);
} else {
tbxWorkOrder = cockpitMapper.getWorkOrders(RegionCodeConstant.COATED_PLATE_LINE_AREA, 7);
ghworkOrders = cockpitMapper.getGhActualProduction(7);
}
if (tbxWorkOrder.size() > 0 || ghworkOrders.size() > 0) {
weekWorkorder = isWithinLastDayss(tbxWorkOrder, ghworkOrders, 1, type);
weekWorkorderStatistics.setDay1(weekWorkorder);
weekWorkorder = isWithinLastDayss(tbxWorkOrder, ghworkOrders, 2, type);
weekWorkorderStatistics.setDay2(weekWorkorder);
weekWorkorder = isWithinLastDayss(tbxWorkOrder, ghworkOrders, 3, type);
weekWorkorderStatistics.setDay3(weekWorkorder);
weekWorkorder = isWithinLastDayss(tbxWorkOrder, ghworkOrders, 4, type);
weekWorkorderStatistics.setDay4(weekWorkorder);
weekWorkorder = isWithinLastDayss(tbxWorkOrder, ghworkOrders, 5, type);
weekWorkorderStatistics.setDay5(weekWorkorder);
weekWorkorder = isWithinLastDayss(tbxWorkOrder, ghworkOrders, 6, type);
weekWorkorderStatistics.setDay6(weekWorkorder);
weekWorkorder = isWithinLastDayss(tbxWorkOrder, ghworkOrders, 7, type);
weekWorkorderStatistics.setDay7(weekWorkorder);
}
return weekWorkorderStatistics;
}
/**
* 7天生产统计-获取每天对应的数值
* vehicle_type
*/
private List<DayData> isWithinLastDayss(List<TargetAchievement> tbxWorkOrder, List<TargetAchievement> ghworkOrders, int days, String type) {
List<DayData> dayDataList = new ArrayList<>();
DayData dayData = new DayData();
tbxWorkOrder = tbxWorkOrder.stream().filter(workOrder -> isThisDays(workOrder, days)).collect(Collectors.toList());
ghworkOrders = ghworkOrders.stream().filter(workOrder -> isThisDays(workOrder, days)).collect(Collectors.toList());
if (type.equals(RegionCodeConstant.COATED_PLATE_LINE_AREA)) {
List<TargetAchievement> lt;
List<TargetAchievement> pt;
dayData.setItem_name("连涂计划数");
lt = tbxWorkOrder.stream().filter(workOrder -> "1".equals(workOrder.getVehicle_type())).collect(Collectors.toList());
dayData.setItem_qty(calculateTotalPlanQty(lt));
dayDataList.add(dayData);
dayData = new DayData();
dayData.setItem_name("连涂完成数");
dayData.setItem_qty(calculateTotalRealQty(lt));
dayDataList.add(dayData);
pt = tbxWorkOrder.stream().filter(workOrder -> "2".equals(workOrder.getVehicle_type())).collect(Collectors.toList());
dayData = new DayData();
dayData.setItem_name("普涂计划数");
dayData.setItem_qty(calculateTotalRealQty(pt));
dayDataList.add(dayData);
dayData = new DayData();
dayData.setItem_name("普涂完成数");
dayData.setItem_qty(calculateTotalRealQty(pt));
dayDataList.add(dayData);
} else if (type.equals(RegionCodeConstant.CURING_ZONE)) {
dayData.setItem_name("固化生产");
dayData.setItem_qty(calculateTotalRealQty(ghworkOrders));
dayDataList.add(dayData);
} else {
dayData.setItem_name("连涂生产");
dayData.setItem_qty(calculateTotalRealQty(tbxWorkOrder));
dayDataList.add(dayData);
dayData = new DayData();
dayData.setItem_name("固化生产");
dayData.setItem_qty(calculateTotalRealQty(ghworkOrders));
dayDataList.add(dayData);
}
return dayDataList;
}
/**
* 7天生产统计-计算计划生产总和
*/
private String calculateTotalPlanQty(List<TargetAchievement> workOrders) {
BigDecimal result = workOrders.stream().map(TargetAchievement::getExpected_production).reduce(BigDecimal.ZERO, BigDecimal::add);
return result.toString();
}
/**
* 7天生产统计-计算实际生产总和
*/
private String calculateTotalRealQty(List<TargetAchievement> workOrders) {
BigDecimal result = workOrders.stream().map(TargetAchievement::getActual_production).reduce(BigDecimal.ZERO, BigDecimal::add);
return result.toString();
}
/**
* 7天生产统计-过滤某日的工单
*/
private boolean isThisDays(TargetAchievement workOrder, int days) {
LocalDate createDate = LocalDate.parse(workOrder.getCreate_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDate today = LocalDate.now();
LocalDate daysAgo = today.minusDays(days);
return !createDate.isBefore(daysAgo) && createDate.isBefore(today.plusDays(1));
}
/**
@@ -1066,15 +955,4 @@ public class CockpitServiceImpl implements CockpitService {
}
}
/**
* 定时统计近七天数据
*/
@Async("taskExecutor")
//@Scheduled(cron = "0/10 * * * * *")
public void executeWeekWorkStatistics() {
}
}

View File

@@ -1,15 +1,12 @@
package org.nl.wms.cockpit.service.mapper;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.nl.wms.cockpit.service.dao.DasDeviceFault;
import org.nl.wms.cockpit.service.dao.home.DayData;
import org.nl.wms.cockpit.service.dao.home.TargetAchievement;
import org.nl.wms.cockpit.service.dao.zcq.TaskInfo;
import java.util.List;
import java.util.Map;

View File

@@ -6,10 +6,10 @@ spring:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:xftn_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
# url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:stand_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
username: ${DB_USER:root}
password: ${DB_PWD:123456}
password: ${DB_PWD:123456789}
# password: ${DB_PWD:P@ssw0rd}
# 初始连接数
initial-size: 5