Browse Source

fix: 修复大屏

master
李永德 2 years ago
parent
commit
bffdc995c0
  1. 123
      lms/nladmin-system/src/main/java/org/nl/modules/common/utils/PointUpdateUtil.java
  2. 22
      lms/nladmin-system/src/main/java/org/nl/wms/cockpit/rest/CockpitController.java
  3. 5
      lms/nladmin-system/src/main/java/org/nl/wms/cockpit/service/CockpitService.java
  4. 76
      lms/nladmin-system/src/main/java/org/nl/wms/cockpit/service/dto/DeviceInfoDto.java
  5. 92
      lms/nladmin-system/src/main/java/org/nl/wms/cockpit/service/impl/CockpitServiceImpl.java
  6. 23
      lms/nladmin-system/src/main/java/org/nl/wms/cockpit/wql/COCKPIT_DEVICE.wql
  7. 2
      lms/nladmin-system/src/main/java/org/nl/wms/cockpit/wql/COCKPIT_STORAGE.wql
  8. 61
      lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/DeviceEnum.java
  9. 28
      lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/DeviceStatusEnum.java

123
lms/nladmin-system/src/main/java/org/nl/modules/common/utils/PointUpdateUtil.java

@ -0,0 +1,123 @@
package org.nl.modules.common.utils;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl;
import org.nl.wms.sch.manage.DeviceStatusEnum;
import org.nl.wms.sch.manage.PointEnum;
/**
* @author: lyd
* @description: 点位更新工具类
* @Date: 2022/11/23
*/
@Slf4j
public class PointUpdateUtil {
/**
* 清理点位
*/
public static void clearPoint(String point_code) {
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
JSONObject pointObj = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0);
pointObj.put("point_status", PointEnum.POINT_STATUS_EMPTY_POSITION.getCode());
pointObj.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode());
pointObj.put("vehicle_type", "");
pointObj.put("vehicle_code", "");
pointObj.put("vehicle_qty", "0");
pointObj.put("material_id", "");
pointObj.put("pcsn", "");
pointObj.put("ivt_qty", "0");
pointObj.put("qty_unit_id", "");
pointObj.put("ivt_weight", "0");
pointObj.put("weight_unit_id", "");
pointObj.put("instorage_time", "");
pointObj.put("is_full", "0");
pointObj.put("standing_time", "0");
pointObj.put("warn_time", "0");
pointObj.put("group_id", "");
pointTab.update(pointObj);
}
/**
* 点位空载具
*/
public static void setVehicle(JSONObject jsonObject) {
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
JSONObject pointObj = pointTab.query("point_code = '" + jsonObject.getString("point_code") + "'").uniqueResult(0);
pointObj.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode());
pointObj.put("point_status", PointEnum.POINT_STATUS_EMPTY_VEHICLE.getCode());
pointObj.put("vehicle_code", jsonObject.getString("vehicle_code"));
pointObj.put("vehicle_qty", "1");
pointObj.put("instorage_time", DateUtil.now());
pointObj.put("is_full", "1");
pointObj.put("ivt_qty", "0");
pointObj.put("pcsn", null);
pointObj.put("material_id", null);
pointObj.put("standing_time", "0");
pointTab.update(pointObj);
}
/**
* 访问acs获取点位数据更新点位信息
* 分拣呼叫空托盘空钢托盘叠盘架
* @param pointCodes
* @deprecated 只更新点位状态和载具类型
*/
public static void updatePoint(JSONArray pointCodes) {
WQLObject pointTable = WQLObject.getWQLObject("sch_base_point");
WmsToAcsServiceImpl wmsToAcsService = new WmsToAcsServiceImpl();
// 向ACS查询点位状态
JSONObject pointStatus = wmsToAcsService.getPointStatus(pointCodes);
// 找到对应的载具类型再去下发
JSONArray deviceDatas = pointStatus.getJSONArray("data");
if (ObjectUtil.isNotEmpty(deviceDatas)) {
for (int j = 0; j < deviceDatas.size(); j++) {
JSONObject pointObj = deviceDatas.getJSONObject(j);
String point_code = pointObj.getString("device_code");
String mode = pointObj.getString("mode"); // 工作状态:0脱机,其他正常
String error = pointObj.getString("error"); // 0是正常
String point_status = pointObj.getString("move"); // 点位状态:0无货,1有货(具体是空载具还是物料不知道)
//将托盘类型456....
String vehicle_type = pointObj.getString("container_type");
if (mode.equals("0") || !error.equals("0")) {
// 点位异常
vehicle_type = "";
point_status = "0";
if (point_code.startsWith("BZX")) point_status = "1";
}
JSONObject pointObj2 = pointTable.query("point_code = '" + point_code + "'").uniqueResult(0);
pointObj2.put("point_status", Integer.parseInt(point_status) + 1); // 1空位, 2空载具
pointObj2.put("vehicle_type", vehicle_type);
pointTable.update(pointObj2);
}
}
}
/**
* 查找设备状态: 单个
* @return
*/
public static String getDeviceStatus(String deviceCode) {
WmsToAcsServiceImpl wmsToAcsService = new WmsToAcsServiceImpl();
// 封装
JSONArray devices = new JSONArray();
JSONObject device = new JSONObject();
device.put("device_code", deviceCode);
devices.add(device);
// 向ACS查询点位状态
JSONObject deviceStatus = wmsToAcsService.getPointStatus(devices);
JSONArray statusJSONArray = deviceStatus.getJSONArray("data");
if (ObjectUtil.isEmpty(statusJSONArray)) return DeviceStatusEnum.SHUTDOWN.getCode();
JSONObject deviceJson = statusJSONArray.getJSONObject(0);
String point_code = deviceJson.getString("device_code");
String mode = deviceJson.getString("mode"); // 工作状态:0脱机,其他正常
String error = deviceJson.getString("error"); // 0是正常
log.info("device_code: " + point_code + ", mode: " + mode + ", error: " + error);
if (!error.equals("0")) return DeviceStatusEnum.FAILURE.getCode();
return mode.equals("0") ? DeviceStatusEnum.STANDBY.getCode() : DeviceStatusEnum.RUNNING.getCode();
}
}

22
lms/nladmin-system/src/main/java/org/nl/wms/cockpit/rest/CockpitController.java

@ -1,26 +1,30 @@
package org.nl.wms.cockpit.rest;
import cn.dev33.satoken.annotation.SaIgnore;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.modules.common.api.CommonResult;
import org.nl.modules.common.api.RestBusinessTemplate;
import org.nl.modules.common.api.ResultCode;
import org.nl.modules.common.exception.BizCoreException;
import org.nl.modules.logging.annotation.Log;
import org.nl.wms.cockpit.service.CockpitService;
import org.nl.wms.cockpit.service.dto.DeviceDetailDto;
import org.nl.wms.cockpit.service.dto.DeviceStatusDto;
import lombok.RequiredArgsConstructor;
import org.nl.modules.logging.annotation.Log;
import org.nl.wms.cockpit.service.dto.DeviceInfoDto;
import org.nl.wms.cockpit.service.dto.SchBasePointDto;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
* 大屏数据
* 大屏数据1
*
* @author gbx
* @since 2023/2/27
@ -30,7 +34,6 @@ import java.util.Map;
@Api(tags = "大屏数据")
@RequestMapping("/api/cockpit")
@Slf4j
@SaIgnore
public class CockpitController{
private final CockpitService cockpitService;
@ -72,10 +75,11 @@ public class CockpitController{
/**
* 设备监控
*/
@SaIgnore
@PostMapping("/deviceMonitor")
@Log("设备监控")
@ApiOperation("设备监控")
public CommonResult<List<DeviceStatusDto>> deviceMonitor() {
public CommonResult<List<DeviceInfoDto>> deviceMonitor() {
return RestBusinessTemplate.execute(cockpitService::deviceMonitor);
}

5
lms/nladmin-system/src/main/java/org/nl/wms/cockpit/service/CockpitService.java

@ -1,6 +1,7 @@
package org.nl.wms.cockpit.service;
import org.nl.wms.cockpit.service.dto.DeviceDetailDto;
import org.nl.wms.cockpit.service.dto.DeviceInfoDto;
import org.nl.wms.cockpit.service.dto.DeviceStatusDto;
import org.nl.wms.cockpit.service.dto.SchBasePointDto;
@ -9,7 +10,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 大屏服务接口
* 大屏服务接口1
*
* @author gbx
* @date 2023-02-27
@ -42,7 +43,7 @@ public interface CockpitService{
*
* @return 返回结果集
*/
List<DeviceStatusDto> deviceMonitor();
List<DeviceInfoDto> deviceMonitor();
/**
* 根据point_id获取设备信息

76
lms/nladmin-system/src/main/java/org/nl/wms/cockpit/service/dto/DeviceInfoDto.java

@ -0,0 +1,76 @@
package org.nl.wms.cockpit.service.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @Author: lyd
* @Description: 设备信息数据
* @Date: 2023/3/8
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DeviceInfoDto implements Serializable {
/**
* 设备编码
*/
private String device_code;
/**
* 设备名称
*/
private String device_name;
/**
* 设备类型
*/
private String device_model;
/**
* 设备状态枚举: 0关机停机1开机运行2故障
*/
private String device_status;
/**
* 设备状态RGV
*/
@Builder.Default
private String device_status_name = null;
/**
* 当前生产名称
*/
private String material_name;
/**
* 已工作时间
*/
@Builder.Default
private String work_time = "0";
/**
* 已生产数量
*/
private BigDecimal real_qty;
/**
* 生产时间
*/
private String realproducestart_date;
/**
* 载具数量当前窑车数
*/
private Integer vehicle_qty;
/**
* 载具类型
*/
private String vehicle_type;
/**
* 容量
*/
private Integer vehicle_max_qty;
/**
* 图片名字
*/
private String device_url;
}

92
lms/nladmin-system/src/main/java/org/nl/wms/cockpit/service/impl/CockpitServiceImpl.java

@ -1,30 +1,36 @@
package org.nl.wms.cockpit.service.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.*;
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.apache.commons.lang3.StringUtils;
import org.nl.config.thread.ThreadPoolExecutorUtil;
import org.nl.modules.common.utils.PointUpdateUtil;
import org.nl.modules.common.utils.enums.IsOrNotEnum;
import org.nl.modules.common.utils.enums.PointStatusEnum;
import org.nl.modules.common.utils.enums.ProductionStatisticsEnum;
import org.nl.modules.wql.WQL;
import org.nl.wms.cockpit.service.CockpitService;
import org.nl.wms.cockpit.service.dto.*;
import org.nl.wms.sch.manage.DeviceEnum;
import org.nl.wms.sch.manage.PointEnum;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.*;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import cn.hutool.core.util.ObjectUtil;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 大屏服务实现
* 大屏服务实现1
*
* @author gbx
* @date 2023-02-27
@ -33,6 +39,7 @@ import cn.hutool.core.util.ObjectUtil;
@RequiredArgsConstructor
@Slf4j
public class CockpitServiceImpl implements CockpitService{
/**
* 生产统计大屏
*
@ -114,6 +121,7 @@ public class CockpitServiceImpl implements CockpitService{
// 1、获取原料仓储信息
CompletableFuture<List<SchBasePointDto>> materialStorage = CompletableFuture.supplyAsync(() -> {
List<SchBasePointDto> res = new CopyOnWriteArrayList<>();
// 查找所有困料货架
JSONArray result = WQL.getWO("COCKPIT_STORAGE").addParam("flag", "1").process().getResultJSONArray(0);
if(ObjectUtil.isNotEmpty(result)) {
res = result.toJavaList(SchBasePointDto.class);
@ -143,7 +151,7 @@ public class CockpitServiceImpl implements CockpitService{
// 2、获取成品仓储信息
CompletableFuture<List<SchBasePointDto>> finishedStorage = CompletableFuture.supplyAsync(() -> {
List<SchBasePointDto> res = new CopyOnWriteArrayList<>();
JSONArray result = WQL.getWO("COCKPIT_STORAGE").addParam("flag", "1").process().getResultJSONArray(0);
JSONArray result = WQL.getWO("COCKPIT_STORAGE").addParam("flag", "2").process().getResultJSONArray(0);
if(ObjectUtil.isNotEmpty(result)) {
res = result.toJavaList(SchBasePointDto.class);
}
@ -193,22 +201,44 @@ public class CockpitServiceImpl implements CockpitService{
* @since 2023/2/28
*/
@Override
public List<DeviceStatusDto> deviceMonitor() {
List<DeviceStatusDto> res;
JSONArray result = WQL.getWO("COCKPIT_DEVICE").addParam("flag", "1").process().getResultJSONArray(0);
public List<DeviceInfoDto> deviceMonitor() {
List<DeviceInfoDto> res;
ConcurrentHashMap<String,List<DeviceInfoDto>> map = new ConcurrentHashMap<>();
JSONArray result = WQL.getWO("COCKPIT_DEVICE").addParam("flag", "3").process().getResultJSONArray(0);
if(ObjectUtil.isNotEmpty(result)) {
res = result.toJavaList(DeviceStatusDto.class);
//已工作时间
res.forEach(r -> {
//Todo 设备运行时间和图标相关暂为固定值,逻辑待完善
//设备运行时间
r.setWork_time("3.5");
//设备监控图标
r.setDevice_url("ylj");
//设备运行状态
if(StringUtils.isNotEmpty(r.getPoint_status())) {
r.setPoint_status_name(PointStatusEnum.getName(r.getPoint_status()));
res = result.toJavaList(DeviceInfoDto.class);
res.forEach(d -> {
if (ObjectUtil.isNotEmpty(d.getRealproducestart_date())) {
// 如果时间存在
LocalDateTime dateTime = LocalDateTimeUtil.parse(d.getRealproducestart_date().replace(" ", "T"));
LocalDateTime now = LocalDateTime.now();
Duration duration = Duration.between(dateTime, now);
d.setWork_time(duration.toHours() + "");
}
// 设备状态
d.setDevice_status(PointUpdateUtil.getDeviceStatus(d.getDevice_code()));
DeviceEnum deviceEnum = DeviceEnum.get(d.getDevice_model(), d.getDevice_code());
// 添加图片名字
d.setDevice_url(deviceEnum.getPictureName());
// todo: 区分窑与其他设备
if (d.getDevice_model().equals(DeviceEnum.YAO.getModel())) {
d.setVehicle_qty(15);
d.setVehicle_max_qty(20);
}
// todo: RGV
if (d.getDevice_model().equals(DeviceEnum.RGV.getModel())) {
d.setDevice_status_name("空位无车,满位有车");
}
// todo: 包装机、碟盘机
// 分类链表
// if (ObjectUtil.isEmpty(map.get(deviceEnum.getKeyName()))) {
// List<DeviceInfoDto> de = new ArrayList<>();
// de.add(d);
// map.put(deviceEnum.getKeyName(), de);
// } else {
// map.get(deviceEnum.getKeyName()).add(d);
// map.put(deviceEnum.getKeyName(), map.get(deviceEnum.getKeyName()));
// }
});
return res;
}
@ -281,9 +311,8 @@ public class CockpitServiceImpl implements CockpitService{
runningStatusList.add(DeviceStatisticsDto.builder().workorder_procedure("包装").deviceQty(9).faultyDevice(3).build());
//近一个月故障次数
List<DeviceStatisticsDto> faultyStatusList = new ArrayList<>();
faultyStatusList.add(DeviceStatisticsDto.builder().deviceName("压制机4").faultyFrequency(90).build());
faultyStatusList.add(DeviceStatisticsDto.builder().deviceName("压制机9").faultyFrequency(85).build());
faultyStatusList.add(DeviceStatisticsDto.builder().deviceName("压制机11").faultyFrequency(83).build());
faultyStatusList.add(DeviceStatisticsDto.builder().deviceName("压制机4").faultyFrequency(91).build());
faultyStatusList.add(DeviceStatisticsDto.builder().deviceName("压制机9").faultyFrequency(82).build());
faultyStatusList.add(DeviceStatisticsDto.builder().deviceName("混料机5").faultyFrequency(71).build());
faultyStatusList.add(DeviceStatisticsDto.builder().deviceName("压制机3").faultyFrequency(33).build());
//最近5个故障设备
@ -333,6 +362,9 @@ public class CockpitServiceImpl implements CockpitService{
else{
schBasePointDto.setStanding_status("静置完成");
}
if (schBasePointDto.getPoint_status().equals(PointEnum.POINT_STATUS_EMPTY_POSITION.getCode())) {
schBasePointDto.setPoint_status("空盅");
}
}
}
}

23
lms/nladmin-system/src/main/java/org/nl/wms/cockpit/wql/COCKPIT_DEVICE.wql

@ -65,3 +65,26 @@
ENDSELECT
ENDPAGEQUERY
ENDIF
IF 输入.flag = "3"
PAGEQUERY
SELECT
d.device_code,
d.device_name,
d.device_model,
w.real_qty,
w.realproducestart_date,
IF(NULLIF(m.material_name, '') IS NULL, '-', m.material_name) as material_name
FROM
`pdm_bi_device` d
LEFT JOIN pdm_bd_workorder w ON ( d.device_code = w.device_code
OR d.extend_code = w.device_code ) AND w.order_status <> '5'
LEFT JOIN md_me_materialbase m ON w.material_id = m.material_id
WHERE
d.is_used = '1'
ORDER BY
d.device_model,
d.device_code
ENDSELECT
ENDPAGEQUERY
ENDIF

2
lms/nladmin-system/src/main/java/org/nl/wms/cockpit/wql/COCKPIT_STORAGE.wql

@ -50,7 +50,7 @@
WHERE
point.region_code = 'KLHJ'
ORDER BY
point.create_time DESC
point.point_code DESC
ENDSELECT
ENDPAGEQUERY
ENDIF

61
lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/DeviceEnum.java

@ -0,0 +1,61 @@
package org.nl.wms.sch.manage;
import cn.hutool.core.util.StrUtil;
/**
* @Author: lyd
* @Description: 设备枚举
* @Date: 2023/3/9
*/
public enum DeviceEnum {
HLJ("1", "混料机", "HLJ", "HLJ"),
HLJ_S("2", "高速混料机", "HLJ_S", "HLJ_S"),
YZJ("3", "压制机", "YZJ", "YZJ"),
YZJ_S("4", "高速压制机", "YZJ_S", "YZJ_S"),
FJJXS("5", "分拣机械手", "FJJXS", "FJJXS"),
CPX("6", "拆盘线", "CPX", "CPX"),
BZX("6", "包装线", "BZX", "BZX"),
YAO("7", "窑设备", "YAO", "YAO"),
DPJ("8", "叠盘架", "DPJ", "DPJ"),
CPJ("9", "拆盘架", "CPJ", "CPJ"),
MDJXS("10", "码垛机械手", "MDJXS", "MDJXS"),
RGV("11", "RGV", "RGV", "RGV");
private final String model;
private final String name;
private final String keyName;
private final String pictureName;
DeviceEnum(String model, String name, String keyName, String pictureName) {
this.model = model;
this.name = name;
this.keyName = keyName;
this.pictureName = pictureName;
}
public static DeviceEnum get(String model, String code) {
for (DeviceEnum deviceEnum : DeviceEnum.values()) {
if (code.equals(BZX.pictureName)) return BZX;
if (StrUtil.equals(deviceEnum.model, model)) {
return deviceEnum;
}
}
return null;
}
public String getModel() {
return model;
}
public String getName() {
return name;
}
public String getKeyName() {
return keyName;
}
public String getPictureName() {
return pictureName;
}
}

28
lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/DeviceStatusEnum.java

@ -0,0 +1,28 @@
package org.nl.wms.sch.manage;
/**
* @Author: lyd
* @Description: 设备状态枚举
* @Date: 2023/3/10
*/
public enum DeviceStatusEnum {
STANDBY("1", "待机"),
RUNNING("2", "运行"),
FAILURE("3", "故障"),
SHUTDOWN("4", "关机");
private final String code;
private final String description;
DeviceStatusEnum(String code, String description) {
this.code = code;
this.description = description;
}
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
}
Loading…
Cancel
Save