Merge branch 'master' of http://121.40.234.130:8899/root/xinFengTianNeng
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<!-- https://onew.me/logback/2018/09/17/logback_win.html-->
|
||||
<dependency>
|
||||
<groupId>org.fusesource.jansi</groupId>
|
||||
@@ -47,6 +48,12 @@
|
||||
<version>${hutool.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.dromara.dynamictp</groupId>
|
||||
<artifactId>dynamic-tp-spring-boot-starter-adapter-webserver</artifactId>
|
||||
<version>1.1.6.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-jdbc</artifactId>
|
||||
|
||||
@@ -6,6 +6,7 @@ import com.alicp.jetcache.anno.config.EnableMethodCache;
|
||||
import io.swagger.annotations.Api;
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.nl.config.SpringContextHolder;
|
||||
import org.nl.config.thread.ThreadPoolExecutorUtil;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
|
||||
@@ -54,6 +55,8 @@ public class AppRun {
|
||||
return fa;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 访问首页提示
|
||||
*
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package org.nl.common.base;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 异常信息
|
||||
*
|
||||
* @author gbx
|
||||
* @since 2024-01-04
|
||||
*/
|
||||
@Data
|
||||
public class ErrorData {
|
||||
private String error_info;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package org.nl.common.utils;
|
||||
|
||||
import org.springframework.beans.BeanUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class ColaBeanUtils extends BeanUtils {
|
||||
public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target) {
|
||||
return copyListProperties(sources, target, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @author Johnson
|
||||
* 使用场景:Entity、Bo、Vo层数据的复制,因为BeanUtils.copyProperties只能给目标对象的属性赋值,却不能在List集合下循环赋值,因此添加该方法
|
||||
* 如:List<AdminEntity> 赋值到 List<AdminVo> ,List<AdminVo>中的 AdminVo 属性都会被赋予到值
|
||||
* S: 数据源类 ,T: 目标类::new(eg: AdminVo::new)
|
||||
*/
|
||||
public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target, ColaBeanUtilsCallBack<S, T> callBack) {
|
||||
List<T> list = new ArrayList<>(sources.size());
|
||||
for (S source : sources) {
|
||||
T t = target.get();
|
||||
copyProperties(source, t);
|
||||
if (callBack != null) {
|
||||
// 回调
|
||||
callBack.callBack(source, t);
|
||||
}
|
||||
list.add(t);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package org.nl.common.utils;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface ColaBeanUtilsCallBack<S, T> {
|
||||
void callBack(S t, T s);
|
||||
}
|
||||
@@ -17,6 +17,7 @@ package org.nl.config.thread;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.scheduling.annotation.AsyncConfigurer;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||
@@ -67,4 +68,35 @@ public class AsyncTaskExecutePool implements AsyncConfigurer {
|
||||
log.error("exception method:"+method.getName());
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 线程池配置
|
||||
* @return java.util.concurrent.Executor
|
||||
* @author gbx
|
||||
* @since 2023-06-16
|
||||
*/
|
||||
@Bean(name = "taskExecutor")
|
||||
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
|
||||
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
|
||||
// 核心线程池大小
|
||||
threadPoolTaskExecutor.setCorePoolSize(config.getCorePoolSize());
|
||||
// 最大线程数
|
||||
threadPoolTaskExecutor.setMaxPoolSize(config.getMaxPoolSize());
|
||||
// 队列容量
|
||||
threadPoolTaskExecutor.setQueueCapacity(config.getQueueCapacity());
|
||||
// 活跃时间
|
||||
threadPoolTaskExecutor.setKeepAliveSeconds(config.getKeepAliveSeconds());
|
||||
// 主线程等待子线程执行时间
|
||||
threadPoolTaskExecutor.setAwaitTerminationSeconds(config.getAwaitTerminationSeconds());
|
||||
// threadPoolTaskExecutor.setAwaitTerminationSeconds(30);
|
||||
// 线程名字前缀
|
||||
threadPoolTaskExecutor.setThreadNamePrefix("test-thread-");
|
||||
// RejectedExecutionHandler:当pool已经达到max-size的时候,如何处理新任务
|
||||
// CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行
|
||||
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
|
||||
// 初始化
|
||||
threadPoolTaskExecutor.initialize();
|
||||
return threadPoolTaskExecutor;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
package org.nl.config.thread;
|
||||
|
||||
/**
|
||||
* @author gbx
|
||||
* @since 2024-01-04
|
||||
*/
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.function.Supplier;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.apache.poi.ss.formula.functions.T;
|
||||
|
||||
public class AsyncTaskHelper {
|
||||
public static <T> CompletableFuture<T> createAsyncTask(Supplier<T> taskSupplier, Executor pool, Supplier<T> defaultValueSupplier) {
|
||||
return CompletableFuture.supplyAsync(taskSupplier, pool)
|
||||
.exceptionally(ex -> defaultValueSupplier.get());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -36,4 +36,6 @@ public class AsyncTaskProperties {
|
||||
private int keepAliveSeconds;
|
||||
|
||||
private int queueCapacity;
|
||||
|
||||
private int awaitTerminationSeconds;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package org.nl.config.thread;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.dynamictp.common.entity.ThreadPoolStats;
|
||||
import org.dromara.dynamictp.core.monitor.collector.AbstractCollector;
|
||||
|
||||
/**
|
||||
* @Author: lyd
|
||||
* @Description: 线程监控
|
||||
* @Date: 2023/12/25
|
||||
*/
|
||||
@Slf4j
|
||||
public class ThreadMonitorCollector extends AbstractCollector {
|
||||
public static ThreadPoolStats TOMCAT_THREAD;
|
||||
public static ThreadPoolStats EL_THREAD;
|
||||
@Override
|
||||
public void collect(ThreadPoolStats threadPoolStats) {
|
||||
if ("tomcatTp".equals(threadPoolStats.getPoolName())) {
|
||||
ThreadMonitorCollector.TOMCAT_THREAD = threadPoolStats;
|
||||
} else {
|
||||
ThreadMonitorCollector.EL_THREAD = threadPoolStats;
|
||||
}
|
||||
log.info("线程池数据:{}", threadPoolStats);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String type() {
|
||||
return "test_collect";
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,12 @@
|
||||
package org.nl.config.thread;
|
||||
|
||||
|
||||
import org.dromara.dynamictp.core.support.DynamicTp;
|
||||
import org.nl.config.SpringContextHolder;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
@@ -27,17 +32,23 @@ import java.util.concurrent.TimeUnit;
|
||||
* @author Zheng Jie
|
||||
* @date 2019年10月31日18:16:47
|
||||
*/
|
||||
@Configuration
|
||||
public class ThreadPoolExecutorUtil {
|
||||
|
||||
public static ThreadPoolExecutor getPoll(){
|
||||
AsyncTaskProperties properties = SpringContextHolder.getBean(AsyncTaskProperties.class);
|
||||
@Autowired
|
||||
private AsyncTaskProperties asyncTaskProperties;
|
||||
|
||||
@Bean
|
||||
@Primary
|
||||
@DynamicTp("el-thread")
|
||||
public ThreadPoolExecutor threadPoolExecutor() {
|
||||
return new ThreadPoolExecutor(
|
||||
properties.getCorePoolSize(),
|
||||
properties.getMaxPoolSize(),
|
||||
properties.getKeepAliveSeconds(),
|
||||
asyncTaskProperties.getCorePoolSize(),
|
||||
asyncTaskProperties.getMaxPoolSize(),
|
||||
asyncTaskProperties.getKeepAliveSeconds(),
|
||||
TimeUnit.SECONDS,
|
||||
new ArrayBlockingQueue<>(properties.getQueueCapacity()),
|
||||
new ArrayBlockingQueue<>(asyncTaskProperties.getQueueCapacity()),
|
||||
new TheadFactoryName()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,8 @@ import org.nl.system.service.quartz.impl.SysQuartzJobServiceImpl;
|
||||
import org.quartz.DisallowConcurrentExecution;
|
||||
import org.quartz.JobExecutionContext;
|
||||
import org.quartz.JobExecutionException;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.scheduling.quartz.QuartzJobBean;
|
||||
|
||||
@@ -35,7 +37,10 @@ public class ExecutionJob extends QuartzJobBean {
|
||||
/**
|
||||
* 该处仅供参考
|
||||
*/
|
||||
private final static ThreadPoolExecutor EXECUTOR = ThreadPoolExecutorUtil.getPoll();
|
||||
@Autowired
|
||||
@Qualifier("threadPoolExecutor")
|
||||
private ThreadPoolExecutor EXECUTOR;
|
||||
|
||||
@Override
|
||||
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
|
||||
SysQuartzJob quartzJob = (SysQuartzJob) context.getMergedJobDataMap().get(SysQuartzJob.JOB_KEY);
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
package org.nl.wms.cockpit.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaIgnore;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.common.logging.annotation.Log;
|
||||
import org.nl.wms.cockpit.service.CockpitService;
|
||||
import org.nl.wms.ext.acs.service.dto.to.acs.DeviceInfoDto;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author: lyd
|
||||
@@ -32,14 +33,62 @@ public class CockpitController {
|
||||
@PostMapping("/getDeviceInfo")
|
||||
@Log("设备ui")
|
||||
@ApiOperation("设备ui")
|
||||
public ResponseEntity<Object> equipmentInfo(@RequestParam String deviceCode){
|
||||
public ResponseEntity<Object> equipmentInfo(@RequestParam String deviceCode) {
|
||||
return new ResponseEntity<>(cockpitService.equipmentInfo(deviceCode), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/allDeviceStatus")
|
||||
@Log("设备ui")
|
||||
@ApiOperation("设备ui")
|
||||
public ResponseEntity<Object> allDeviceStatus(){
|
||||
public ResponseEntity<Object> allDeviceStatus() {
|
||||
return new ResponseEntity<>(cockpitService.allDeviceStatus(), HttpStatus.OK);
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/acceptAllDeviceInfo")
|
||||
@Log("接收acs推送的设备信息")
|
||||
@ApiOperation("接收acs推送的设备信息")
|
||||
public ResponseEntity<Object> acceptAllDeviceInfo(@RequestBody JSONObject deviceInfo) {
|
||||
cockpitService.acceptAllDeviceInfo(deviceInfo);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/acceptDeviceFaultInfo")
|
||||
@Log("接收acs推送的设备故障信息")
|
||||
@ApiOperation("接收acs推送的设备故障信息")
|
||||
public ResponseEntity<Object> acceptDeviceFaultInfo(@RequestBody JSONObject deviceInfo) {
|
||||
cockpitService.acceptDeviceFaultInfo(deviceInfo);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/getHomeInfo")
|
||||
@Log("获取首页总览信息")
|
||||
@ApiOperation("获取首页总览信息")
|
||||
public ResponseEntity<Object> getHomeInfo() {
|
||||
return new ResponseEntity<>(cockpitService.getHomeInfo(), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/getTbxInfo")
|
||||
@Log("获取固化室信息")
|
||||
@ApiOperation("获取涂板线信息")
|
||||
public ResponseEntity<Object> getTbxInfo() {
|
||||
return new ResponseEntity<>(cockpitService.getTbxInfo(), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/getGhsInfo")
|
||||
@Log("获取固化室信息")
|
||||
@ApiOperation("获取固化室信息")
|
||||
public ResponseEntity<Object> getGhsInfo() {
|
||||
return new ResponseEntity<>(cockpitService.getGhsInfo(), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/getZcqInfo")
|
||||
@Log("获取暂存区信息")
|
||||
@ApiOperation("获取暂存区信息")
|
||||
public ResponseEntity<Object> getZcqInfo() {
|
||||
return new ResponseEntity<>(cockpitService.getZcqInfo(), HttpStatus.OK);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@ package org.nl.wms.cockpit.service;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* @Author: lyd
|
||||
* @Description:
|
||||
@@ -12,4 +15,18 @@ public interface CockpitService {
|
||||
JSONObject equipmentInfo(String deviceCode);
|
||||
|
||||
JSONArray allDeviceStatus();
|
||||
void acceptAllDeviceInfo(JSONObject deviceInfo);
|
||||
|
||||
void acceptDeviceFaultInfo(JSONObject deviceInfo);
|
||||
|
||||
|
||||
ConcurrentHashMap<String, Object> getHomeInfo();
|
||||
|
||||
ConcurrentHashMap<String, Object> getGhsInfo();
|
||||
|
||||
ConcurrentHashMap<String, Object> getTbxInfo();
|
||||
|
||||
ConcurrentHashMap<String, Object> getZcqInfo();
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
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<>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package org.nl.wms.cockpit.service.dao;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 设备故障表
|
||||
*
|
||||
* @author gbx
|
||||
* @since 2024-01-12
|
||||
*/
|
||||
|
||||
|
||||
@Data
|
||||
@TableName("das_device_fault")
|
||||
public class DasDeviceFault implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@TableId(value = "data_id", type = IdType.NONE)
|
||||
private String data_id;
|
||||
|
||||
private String region_code;
|
||||
|
||||
private String device_code;
|
||||
|
||||
private String failure_time;
|
||||
|
||||
private String failure_info;
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package org.nl.wms.cockpit.service.dao.home;
|
||||
|
||||
import lombok.Data;
|
||||
import org.nl.common.base.ErrorData;
|
||||
|
||||
/**
|
||||
* @author gbx
|
||||
* @since 2024-01-08
|
||||
*/
|
||||
@Data
|
||||
public class DayData extends ErrorData {
|
||||
private String item_name;
|
||||
private String item_qty;
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package org.nl.wms.cockpit.service.dao.home;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import lombok.Data;
|
||||
import org.nl.common.base.ErrorData;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 生产目标
|
||||
*
|
||||
* @author gbx
|
||||
* @since 2024-01-07
|
||||
*/
|
||||
|
||||
@Data
|
||||
public class TargetAchievement extends ErrorData {
|
||||
//接口文档待修改
|
||||
private BigDecimal expected_production = BigDecimal.valueOf(0);
|
||||
private BigDecimal actual_production= BigDecimal.valueOf(0);;
|
||||
private Integer percentage =0;
|
||||
private String await_curing = "1";
|
||||
private String curing = "1";
|
||||
private String complete = "1";
|
||||
private String material_name = "1";
|
||||
private String vehicle_type = "1";
|
||||
private String create_time = "1";
|
||||
private TbxTargetAchievement tbxTargetAchievement;
|
||||
|
||||
@Data
|
||||
public static class TbxTargetAchievement extends ErrorData {
|
||||
//接口文档待修改
|
||||
private TargetAchievement lt_production;
|
||||
private TargetAchievement pt_production;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
package org.nl.wms.cockpit.service.dao.mapper;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
/**
|
||||
* @Author: lyd
|
||||
* @Description:
|
||||
* @Date: 2023/11/22
|
||||
*/
|
||||
public interface CockpitMapper {
|
||||
/**
|
||||
* 获取最近n条工单数据
|
||||
* @param deviceCode
|
||||
* @param number
|
||||
* @return
|
||||
*/
|
||||
JSONArray getDeviceLimitOrders(@Param("deviceCode") String deviceCode, @Param("number") int number);
|
||||
|
||||
JSONObject getVehicleGroupInfo(String vehicleCode, String vehicleType);
|
||||
|
||||
/**
|
||||
* 固化室详情
|
||||
* @return
|
||||
*/
|
||||
JSONArray getGHSInteriorList();
|
||||
|
||||
JSONArray getSSXInteriorList();
|
||||
|
||||
JSONArray getZCList();
|
||||
|
||||
JSONArray getKJList();
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="org.nl.wms.cockpit.service.dao.mapper.CockpitMapper">
|
||||
<select id="getDeviceLimitOrders" resultType="com.alibaba.fastjson.JSONObject">
|
||||
SELECT
|
||||
w.plan_qty,
|
||||
w.real_qty,
|
||||
mm.material_name
|
||||
FROM
|
||||
`pdm_bd_workorder` w
|
||||
LEFT JOIN md_base_material mm ON mm.material_id = w.material_id
|
||||
WHERE w.point_code = #{deviceCode}
|
||||
LIMIT #{number}
|
||||
</select>
|
||||
<select id="getVehicleGroupInfo" resultType="com.alibaba.fastjson.JSONObject">
|
||||
SELECT vg.vehicle_type
|
||||
, vg.vehicle_code
|
||||
, ma.material_name
|
||||
, ma.material_code
|
||||
FROM sch_base_vehiclematerialgroup vg
|
||||
LEFT JOIN md_base_material ma ON vg.material_id = ma.material_id
|
||||
WHERE 1 = 1
|
||||
<if test="vehicle_code != null">
|
||||
AND vg.vehicle_code = #{vehicle_code}
|
||||
</if>
|
||||
<if test="vehicle_type != null">
|
||||
AND vg.vehicle_type = #{vehicle_type}
|
||||
</if>
|
||||
AND vg.is_delete = '0'
|
||||
</select>
|
||||
<select id="getGHSInteriorList" resultType="com.alibaba.fastjson.JSONObject">
|
||||
SELECT
|
||||
CAST(point_status - 1 AS SIGNED) AS move,
|
||||
point_code AS device_code,
|
||||
point_name AS device_name,
|
||||
IF(LENGTH(vehicle_type)>0, vehicle_type, '-') AS vehicle_type,
|
||||
parent_point_code AS device
|
||||
FROM
|
||||
`sch_base_point`
|
||||
WHERE region_code = 'GH' AND point_type = '2'
|
||||
</select>
|
||||
<select id="getSSXInteriorList" resultType="com.alibaba.fastjson.JSONObject">
|
||||
SELECT
|
||||
CAST(point_status - 1 AS SIGNED) AS move,
|
||||
point_code AS device_code,
|
||||
point_name AS device_name,
|
||||
"1" AS mode,
|
||||
"0" AS error,
|
||||
parent_point_code AS device
|
||||
FROM
|
||||
`sch_base_point`
|
||||
WHERE region_code = 'KJZC' AND point_type IN ('1', '3', '4')
|
||||
</select>
|
||||
<select id="getZCList" resultType="com.alibaba.fastjson.JSONObject">
|
||||
SELECT
|
||||
CAST(point_status - 1 AS SIGNED) AS move,
|
||||
point_code AS device_code,
|
||||
point_name AS device_name
|
||||
FROM
|
||||
`sch_base_point`
|
||||
WHERE region_code = 'ZC'
|
||||
</select>
|
||||
<select id="getKJList" resultType="com.alibaba.fastjson.JSONObject">
|
||||
SELECT
|
||||
CAST(point_status - 1 AS SIGNED) AS move,
|
||||
point_code AS device_code,
|
||||
vehicle_type,
|
||||
point_name AS device_name
|
||||
FROM
|
||||
`sch_base_point`
|
||||
WHERE region_code = 'KJW'
|
||||
</select>
|
||||
</mapper>
|
||||
@@ -0,0 +1,79 @@
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
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;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package org.nl.wms.cockpit.service.dao.zcq;
|
||||
|
||||
import lombok.Data;
|
||||
import org.nl.common.base.ErrorData;
|
||||
|
||||
/**
|
||||
* 任务
|
||||
*
|
||||
* @author gbx
|
||||
* @since 2024-01-11
|
||||
*/
|
||||
@Data
|
||||
public class TaskInfo extends ErrorData {
|
||||
private String car_no;
|
||||
private String point_code;
|
||||
private String point_code1;
|
||||
private String point_code2;
|
||||
private String material_name;
|
||||
private String vehicle_type;
|
||||
private String vehicle_code;
|
||||
private String task_type;
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -1,22 +1,60 @@
|
||||
package org.nl.wms.cockpit.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.nl.common.exception.BadRequestException;
|
||||
import org.nl.common.utils.ColaBeanUtils;
|
||||
import org.nl.common.utils.SecurityUtils;
|
||||
import org.nl.wms.cockpit.service.CockpitService;
|
||||
import org.nl.wms.cockpit.service.dao.mapper.CockpitMapper;
|
||||
import org.nl.wms.cockpit.service.dao.CommonData;
|
||||
import org.nl.wms.cockpit.service.dao.DasDeviceFault;
|
||||
import org.nl.wms.cockpit.service.dao.ghs.DeviceFaultStatistics;
|
||||
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.Inventory;
|
||||
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.service.dao.SchBaseTask;
|
||||
import org.nl.wms.sch.task.service.dao.mapper.SchBaseTaskMapper;
|
||||
import org.nl.wms.sch.task_manage.enums.RegionCodeConstant;
|
||||
import org.nl.wms.sch.task_manage.task.TaskServiceImpl;
|
||||
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.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@@ -25,21 +63,251 @@ import java.util.stream.Collectors;
|
||||
* @Date: 2023/11/22
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
@EnableScheduling
|
||||
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")
|
||||
private ThreadPoolExecutor pool;
|
||||
|
||||
@Autowired
|
||||
PdmBdSolidifyPlanServiceImpl pdmBdSolidifyPlanServiceImpl;
|
||||
|
||||
|
||||
/**
|
||||
* 总览
|
||||
*/
|
||||
@Override
|
||||
public ConcurrentHashMap<String, Object> getHomeInfo() {
|
||||
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();
|
||||
//生产任务目标达成
|
||||
CompletableFuture<TargetAchievement> task1 = CompletableFuture.supplyAsync(() -> {
|
||||
TargetAchievement targetAchievementResult = new TargetAchievement();
|
||||
try {
|
||||
targetAchievementResult = getWorkOrderList(null, null, 1);
|
||||
} catch (Exception e) {
|
||||
targetAchievementResult.setError_info(e.toString());
|
||||
}
|
||||
return targetAchievementResult;
|
||||
}, pool);
|
||||
//固化汇总
|
||||
CompletableFuture<List<DayData>> task2 = CompletableFuture.supplyAsync(() -> {
|
||||
List<DayData> dayDataList = new ArrayList<>();
|
||||
try {
|
||||
dayDataList = cockpitMapper.getGhCuringSummary();
|
||||
} catch (Exception e) {
|
||||
DayData dayData = new DayData();
|
||||
dayData.setError_info(e.toString());
|
||||
dayDataList.add(dayData);
|
||||
}
|
||||
return dayDataList;
|
||||
}, pool);
|
||||
//暂存库库存结构
|
||||
CompletableFuture<HomeInfo.ZCStorageInfo> task3 = CompletableFuture.supplyAsync(() -> {
|
||||
HomeInfo.ZCStorageInfo zCStorageInfo = new HomeInfo.ZCStorageInfo();
|
||||
try {
|
||||
zCStorageInfo = getTemporaryStorage();
|
||||
return zCStorageInfo;
|
||||
|
||||
} catch (Exception e) {
|
||||
zCStorageInfo.setError_info(e.toString());
|
||||
}
|
||||
return zCStorageInfo;
|
||||
}, pool);
|
||||
//今日生产任务
|
||||
CompletableFuture<List<HomeInfo.TodayWork>> task4 = CompletableFuture.supplyAsync(() -> {
|
||||
List<HomeInfo.TodayWork> targetAchievement = new ArrayList<>();
|
||||
try {
|
||||
targetAchievement = getWorkOrders("");
|
||||
} catch (Exception e) {
|
||||
HomeInfo.TodayWork todayWork = new HomeInfo.TodayWork();
|
||||
todayWork.setError_info(e.toString());
|
||||
targetAchievement.add(todayWork);
|
||||
}
|
||||
return targetAchievement;
|
||||
}, pool);
|
||||
// 7天生产统计
|
||||
CompletableFuture<CommonData.WeekWorkorderStatistics> task5 = CompletableFuture.supplyAsync(() -> {
|
||||
CommonData.WeekWorkorderStatistics targetAchievement = new CommonData.WeekWorkorderStatistics();
|
||||
try {
|
||||
targetAchievement = getWeekWorkStatistics("");
|
||||
} catch (Exception e) {
|
||||
targetAchievement.setError_info(e.toString());
|
||||
}
|
||||
return targetAchievement;
|
||||
}, pool);
|
||||
CompletableFuture.allOf(task1, task2, task3, task4, task5).join();
|
||||
map.put("target_achievement", task1.join());
|
||||
map.put("gh_statistics", task2.join());
|
||||
map.put("zc_storage_info", task3.join());
|
||||
map.put("today_work", task4.join());
|
||||
map.put("workorder_statistics", task5.join());
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 涂板线
|
||||
*/
|
||||
@Override
|
||||
public ConcurrentHashMap<String, Object> getTbxInfo() {
|
||||
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();
|
||||
//今日生产
|
||||
CompletableFuture<TargetAchievement.TbxTargetAchievement> task1 = CompletableFuture.supplyAsync(() -> {
|
||||
TargetAchievement.TbxTargetAchievement tbxTargetAchievement = new TargetAchievement.TbxTargetAchievement();
|
||||
try {
|
||||
//普涂
|
||||
TargetAchievement ptProduction = getWorkOrderList("TBX", "1", 1);
|
||||
//连涂
|
||||
TargetAchievement ltProduction = getWorkOrderList("TBX", "2", 1);
|
||||
tbxTargetAchievement.setPt_production(ptProduction);
|
||||
tbxTargetAchievement.setLt_production(ltProduction);
|
||||
|
||||
} catch (Exception e) {
|
||||
tbxTargetAchievement.setPt_production(new TargetAchievement());
|
||||
tbxTargetAchievement.setLt_production(new TargetAchievement());
|
||||
tbxTargetAchievement.setError_info(e.toString());
|
||||
}
|
||||
return tbxTargetAchievement;
|
||||
}, pool);
|
||||
//7天生产统计
|
||||
CompletableFuture<CommonData.WeekWorkorderStatistics> task2 = CompletableFuture.supplyAsync(() -> {
|
||||
CommonData.WeekWorkorderStatistics targetAchievement = new CommonData.WeekWorkorderStatistics();
|
||||
try {
|
||||
targetAchievement = getWeekWorkStatistics("TBX");
|
||||
} catch (Exception e) {
|
||||
targetAchievement.setError_info(e.toString());
|
||||
}
|
||||
return targetAchievement;
|
||||
}, pool);
|
||||
//今日涂板工单
|
||||
CompletableFuture<List<HomeInfo.TodayWork>> task3 = CompletableFuture.supplyAsync(() -> {
|
||||
List<HomeInfo.TodayWork> todayWorks = new ArrayList<>();
|
||||
try {
|
||||
todayWorks = getWorkOrders(RegionCodeConstant.COATED_PLATE_LINE_AREA);
|
||||
} catch (Exception e) {
|
||||
HomeInfo.TodayWork todayWork = new HomeInfo.TodayWork();
|
||||
todayWork.setError_info(e.toString());
|
||||
todayWorks.add(todayWork);
|
||||
}
|
||||
return todayWorks;
|
||||
}, pool);
|
||||
CompletableFuture.allOf(task1, task2, task3).join();
|
||||
map.put("target_achievement", task1.join());
|
||||
map.put("week_workorder_statistics", task2.join());
|
||||
map.put("today_work", task3.join());
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 固化室
|
||||
*/
|
||||
@Override
|
||||
public ConcurrentHashMap<String, Object> getGhsInfo() {
|
||||
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();
|
||||
//固化汇总
|
||||
CompletableFuture<List<DayData>> task1 = CompletableFuture.supplyAsync(() -> {
|
||||
List<DayData> dayDataList = new ArrayList<>();
|
||||
try {
|
||||
dayDataList = cockpitMapper.getGhCuringSummary();
|
||||
} catch (Exception e) {
|
||||
DayData dayData = new DayData();
|
||||
dayData.setError_info(e.toString());
|
||||
dayDataList.add(dayData);
|
||||
}
|
||||
return dayDataList;
|
||||
}, pool);
|
||||
|
||||
//7日固化
|
||||
CompletableFuture<CommonData.WeekWorkorderStatistics> task2 = CompletableFuture.supplyAsync(() -> {
|
||||
CommonData.WeekWorkorderStatistics targetAchievement = new CommonData.WeekWorkorderStatistics();
|
||||
try {
|
||||
targetAchievement = getWeekWorkStatistics("GH");
|
||||
} catch (Exception e) {
|
||||
targetAchievement.setError_info(e.toString());
|
||||
}
|
||||
return targetAchievement;
|
||||
}, pool);
|
||||
|
||||
//出入库任务
|
||||
CompletableFuture<List<TaskInfo>> task3 = CompletableFuture.supplyAsync(() -> {
|
||||
List<TaskInfo> tasks = new ArrayList<>();
|
||||
try {
|
||||
tasks = getTasks(RegionCodeConstant.CURING_ZONE);
|
||||
|
||||
} catch (Exception e) {
|
||||
TaskInfo taskInfo = new TaskInfo();
|
||||
taskInfo.setError_info(e.toString());
|
||||
tasks.add(taskInfo);
|
||||
}
|
||||
return tasks;
|
||||
}, pool);
|
||||
CompletableFuture.allOf(task1, task2, task3).join();
|
||||
map.put("curing_summary", task1.join());
|
||||
map.put("week_workorder_statistics", task2.join());
|
||||
map.put("task_info", task3.join());
|
||||
return map;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 暂存区
|
||||
*/
|
||||
@Override
|
||||
public ConcurrentHashMap<String, Object> getZcqInfo() {
|
||||
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();
|
||||
//暂存区库存结构
|
||||
CompletableFuture<HomeInfo.ZCStorageInfo> task1 = CompletableFuture.supplyAsync(() -> {
|
||||
HomeInfo.ZCStorageInfo zCStorageInfo = new HomeInfo.ZCStorageInfo();
|
||||
try {
|
||||
zCStorageInfo = getTemporaryStorage();
|
||||
return zCStorageInfo;
|
||||
} catch (Exception e) {
|
||||
zCStorageInfo.setError_info(e.toString());
|
||||
}
|
||||
return zCStorageInfo;
|
||||
}, pool);
|
||||
//出入库任务
|
||||
CompletableFuture<List<TaskInfo>> task2 = CompletableFuture.supplyAsync(() -> {
|
||||
List<TaskInfo> tasks = new ArrayList<>();
|
||||
try {
|
||||
tasks = getTasks(RegionCodeConstant.STAGING_AREA);
|
||||
|
||||
} catch (Exception e) {
|
||||
TaskInfo taskInfo = new TaskInfo();
|
||||
taskInfo.setError_info(e.toString());
|
||||
tasks.add(taskInfo);
|
||||
}
|
||||
return tasks;
|
||||
}, pool);
|
||||
CompletableFuture.allOf(task1, task2).join();
|
||||
map.put("temporary_storage", task1.join());
|
||||
map.put("inventory", task2.join());
|
||||
return map;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 设备ui
|
||||
*/
|
||||
@Override
|
||||
public JSONObject equipmentInfo(String deviceCode) {
|
||||
JSONObject res = new JSONObject();
|
||||
|
||||
JSONObject res = new JSONObject();
|
||||
SchBasePoint point = pointService.getById(deviceCode);
|
||||
List<SchBasePoint> points;
|
||||
switch (point.getRegion_code()) {
|
||||
@@ -70,7 +338,8 @@ public class CockpitServiceImpl implements CockpitService {
|
||||
}
|
||||
res.put("details", array);
|
||||
// 获取最近3条工单数据
|
||||
JSONArray productionTask = cockpitMapper.getDeviceLimitOrders(deviceCode, 3);
|
||||
List<TargetAchievement> targetAchievementList = cockpitMapper.getDeviceLimitOrders(deviceCode, 3);
|
||||
JSONArray productionTask = JSONArray.parseArray(JSON.toJSONString(targetAchievementList));
|
||||
res.put("production_tasks", productionTask);
|
||||
break;
|
||||
case RegionCodeConstant.CURING_ZONE:
|
||||
@@ -89,13 +358,14 @@ public class CockpitServiceImpl implements CockpitService {
|
||||
JSONArray ghsArray = new JSONArray();
|
||||
for (int i = 0; i < points.size(); i++) {
|
||||
SchBasePoint pointObj = points.get(i);
|
||||
if (pointObj.getPoint_type().equals("4")) break;
|
||||
if (pointObj.getPoint_type().equals("4")) {
|
||||
break;
|
||||
}
|
||||
JSONObject one = new JSONObject();
|
||||
one.put("device_code", pointObj.getPoint_code());
|
||||
one.put("device_name", pointObj.getPoint_name());
|
||||
one.put("move", (Integer.parseInt(pointObj.getPoint_status()) - 1));
|
||||
one.put("material_type", ObjectUtil.isNotEmpty(pointObj.getVehicle_type())
|
||||
? pointObj.getVehicle_type() : "-");
|
||||
one.put("material_type", ObjectUtil.isNotEmpty(pointObj.getVehicle_type()) ? pointObj.getVehicle_type() : "-");
|
||||
ghsArray.add(one);
|
||||
}
|
||||
res.put("details", ghsArray);
|
||||
@@ -110,8 +380,7 @@ public class CockpitServiceImpl implements CockpitService {
|
||||
res.put("standby_time", 20);
|
||||
res.put("production_time", 10);
|
||||
res.put("error_time", 8);
|
||||
res.put("material_type", ObjectUtil.isNotEmpty(point.getVehicle_type())
|
||||
? point.getVehicle_type() : "-");
|
||||
res.put("material_type", ObjectUtil.isNotEmpty(point.getVehicle_type()) ? point.getVehicle_type() : "-");
|
||||
res.put("end_time", "-");
|
||||
JSONArray ssxArray = new JSONArray();
|
||||
for (int i = 0; i < points.size(); i++) {
|
||||
@@ -129,18 +398,16 @@ public class CockpitServiceImpl implements CockpitService {
|
||||
res.put("device_code", deviceCode);
|
||||
res.put("device_name", point.getPoint_name());
|
||||
res.put("move", (Integer.parseInt(point.getPoint_status()) - 1));
|
||||
res.put("vehicle_type", ObjectUtil.isNotEmpty(point.getVehicle_type())
|
||||
? point.getVehicle_type() : "-");
|
||||
res.put("vehicle_type", ObjectUtil.isNotEmpty(point.getVehicle_type()) ? point.getVehicle_type() : "-");
|
||||
break;
|
||||
case RegionCodeConstant.STAGING_AREA:
|
||||
// 货位直接显示,获取组盘信息,组装数据反馈
|
||||
res.put("device_code", deviceCode);
|
||||
res.put("device_name", point.getPoint_name());
|
||||
res.put("vehicle_code", ObjectUtil.isNotEmpty(point.getVehicle_code())?point.getPoint_code():"-");
|
||||
res.put("vehicle_type", ObjectUtil.isNotEmpty(point.getVehicle_type())?point.getVehicle_type():"-");
|
||||
res.put("vehicle_code", ObjectUtil.isNotEmpty(point.getVehicle_code()) ? point.getPoint_code() : "-");
|
||||
res.put("vehicle_type", ObjectUtil.isNotEmpty(point.getVehicle_type()) ? point.getVehicle_type() : "-");
|
||||
if (ObjectUtil.isNotEmpty(point.getVehicle_type()) && ObjectUtil.isNotEmpty(point.getVehicle_code())) {
|
||||
JSONObject groupInfo = cockpitMapper.getVehicleGroupInfo(point.getVehicle_code(),
|
||||
point.getVehicle_type());
|
||||
JSONObject groupInfo = cockpitMapper.getVehicleGroupInfo(point.getVehicle_code(), point.getVehicle_type());
|
||||
if (ObjectUtil.isNotEmpty(groupInfo)) {
|
||||
res.put("storage_info", groupInfo);
|
||||
}
|
||||
@@ -150,6 +417,39 @@ public class CockpitServiceImpl implements CockpitService {
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 接收acs推送的设备信息
|
||||
*/
|
||||
@Override
|
||||
public void acceptAllDeviceInfo(JSONObject deviceInfo) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 接收acs推送的设备故障信息
|
||||
*/
|
||||
@Override
|
||||
public void acceptDeviceFaultInfo(JSONObject deviceInfo) {
|
||||
try {
|
||||
DasDeviceFault dasDeviceFault = new DasDeviceFault();
|
||||
String now = DateUtil.now();
|
||||
dasDeviceFault.setDevice_code(deviceInfo.getString("device_code"));
|
||||
dasDeviceFault.setRegion_code(pointService.getById(deviceInfo.getString("device_code")).getRegion_code());
|
||||
dasDeviceFault.setData_id(IdUtil.getSnowflake(1, 1).nextIdStr());
|
||||
dasDeviceFault.setFailure_time(now);
|
||||
dasDeviceFault.setFailure_info(deviceInfo.getString("failure_info"));
|
||||
cockpitMapper.insertDeviceFault(dasDeviceFault);
|
||||
} catch (Exception exception) {
|
||||
throw new BadRequestException(exception.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 秒级接口
|
||||
*/
|
||||
@Override
|
||||
public JSONArray allDeviceStatus() {
|
||||
JSONArray array = new JSONArray();
|
||||
@@ -199,8 +499,7 @@ public class CockpitServiceImpl implements CockpitService {
|
||||
rgv_m.put("error_time", 0);
|
||||
array.add(rgv_m);
|
||||
}
|
||||
List<SchBasePoint> tbx = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_type, "1")
|
||||
.eq(SchBasePoint::getRegion_code, "TBX"));
|
||||
List<SchBasePoint> tbx = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_type, "1").eq(SchBasePoint::getRegion_code, "TBX"));
|
||||
List<String> tbxList = tbx.stream().map(SchBasePoint::getPoint_code).collect(Collectors.toList());
|
||||
tbxList.forEach(s -> {
|
||||
JSONObject object = new JSONObject();
|
||||
@@ -216,8 +515,7 @@ public class CockpitServiceImpl implements CockpitService {
|
||||
object.put("material", "01200000");
|
||||
array.add(object);
|
||||
});
|
||||
List<SchBasePoint> tbxDjw = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_type, "2")
|
||||
.eq(SchBasePoint::getRegion_code, "TBX"));
|
||||
List<SchBasePoint> tbxDjw = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_type, "2").eq(SchBasePoint::getRegion_code, "TBX"));
|
||||
List<String> tbxDjwList = tbxDjw.stream().map(SchBasePoint::getPoint_code).collect(Collectors.toList());
|
||||
tbxDjwList.forEach(s -> {
|
||||
JSONObject object = new JSONObject();
|
||||
@@ -229,8 +527,7 @@ public class CockpitServiceImpl implements CockpitService {
|
||||
array.add(object);
|
||||
});
|
||||
// 缓存位
|
||||
List<SchBasePoint> hcx = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_type, "3")
|
||||
.eq(SchBasePoint::getRegion_code, "TBX"));
|
||||
List<SchBasePoint> hcx = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_type, "3").eq(SchBasePoint::getRegion_code, "TBX"));
|
||||
List<String> hcxList = hcx.stream().map(SchBasePoint::getPoint_code).collect(Collectors.toList());
|
||||
hcxList.forEach(s -> {
|
||||
JSONObject object = new JSONObject();
|
||||
@@ -239,8 +536,7 @@ public class CockpitServiceImpl implements CockpitService {
|
||||
object.put("move", "0");
|
||||
array.add(object);
|
||||
});
|
||||
List<SchBasePoint> gh = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_type, "1")
|
||||
.eq(SchBasePoint::getRegion_code, "GH"));
|
||||
List<SchBasePoint> gh = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_type, "1").eq(SchBasePoint::getRegion_code, "GH"));
|
||||
List<String> ghList = gh.stream().map(SchBasePoint::getPoint_code).collect(Collectors.toList());
|
||||
ghList.forEach(s -> {
|
||||
JSONObject object = new JSONObject();
|
||||
@@ -259,8 +555,7 @@ public class CockpitServiceImpl implements CockpitService {
|
||||
array.add(object);
|
||||
});
|
||||
// 整体
|
||||
List<SchBasePoint> kjzc = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_type, "5")
|
||||
.eq(SchBasePoint::getRegion_code, "KJZC"));
|
||||
List<SchBasePoint> kjzc = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_type, "5").eq(SchBasePoint::getRegion_code, "KJZC"));
|
||||
List<String> kjzcList = kjzc.stream().map(SchBasePoint::getPoint_code).collect(Collectors.toList());
|
||||
kjzcList.forEach(s -> {
|
||||
JSONObject object = new JSONObject();
|
||||
@@ -296,4 +591,274 @@ public class CockpitServiceImpl implements CockpitService {
|
||||
array.add(emptyCacheBit);
|
||||
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);
|
||||
}).exceptionally((e) -> {
|
||||
map.put("DayShiftList", null);
|
||||
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);
|
||||
// 此处为故意制造异常
|
||||
Integer sd = 5 / 0;
|
||||
jsonObject.put("one", "6");
|
||||
jsonObject.put("two", "7");
|
||||
array.add(jsonObject);
|
||||
return array;
|
||||
}, pool);
|
||||
listCompletableFuture.thenAccept(result -> {
|
||||
map.put("DayShiftList", result);
|
||||
}).exceptionally((e) -> {
|
||||
map.put("DayShiftList", null);
|
||||
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) -> {
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 今日任务
|
||||
*/
|
||||
public List<TaskInfo> getTasks(String type) {
|
||||
// 获取今天的日期时间范围
|
||||
LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
|
||||
LocalDateTime endOfDay = startOfDay.plusDays(1).minusNanos(1);
|
||||
List<TaskInfo> tasks = new ArrayList<>();
|
||||
if (RegionCodeConstant.CURING_ZONE.equals(type)) {
|
||||
// 固化室当天出入库任务
|
||||
List<SchBaseTask> todayTasks = taskService.list(new LambdaUpdateWrapper<SchBaseTask>().eq(SchBaseTask::getIs_delete, 0).between(SchBaseTask::getCreate_time, startOfDay, endOfDay).and(wrapper -> wrapper.eq(SchBaseTask::getConfig_code, "1").or().eq(SchBaseTask::getConfig_code, "2")));
|
||||
tasks = ColaBeanUtils.copyListProperties(todayTasks, TaskInfo::new);
|
||||
} else if (RegionCodeConstant.STAGING_AREA.equals(type)) {
|
||||
// 暂存区当天出入库任务
|
||||
List<TaskInfo> inTasks = cockpitMapper.getTemporaryInTask();
|
||||
List<TaskInfo> outTasks = cockpitMapper.getTemporaryOutTask();
|
||||
tasks.addAll(inTasks);
|
||||
tasks.addAll(outTasks);
|
||||
}
|
||||
return tasks;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 生产任务
|
||||
*/
|
||||
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));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询设备的故障次数和故障率
|
||||
*/
|
||||
private DeviceFaultStatistics getFaultsForDevice(String deviceCode) {
|
||||
long totalFaults = cockpitMapper.getFaultsForDevice(deviceCode);
|
||||
long last30Days = 30; // 假设固定为30天
|
||||
double faultRate = (totalFaults / (double) last30Days) * 100.0;
|
||||
// 返回包含故障数和故障率的对象
|
||||
return new DeviceFaultStatistics(totalFaults, faultRate);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 定时统计近七天数据
|
||||
*/
|
||||
@Async("taskExecutor")
|
||||
//@Scheduled(cron = "0/10 * * * * *")
|
||||
public void executeWeekWorkStatistics() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
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.Inventory;
|
||||
import org.nl.wms.cockpit.service.dao.zcq.TaskInfo;
|
||||
import org.nl.wms.cockpit.service.dao.zcq.ZcqInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: lyd
|
||||
* @Description:
|
||||
* @Date: 2023/11/22
|
||||
*/
|
||||
public interface CockpitMapper {
|
||||
/**
|
||||
* 获取最近n条工单数据
|
||||
*
|
||||
* @param deviceCode
|
||||
* @param number
|
||||
* @return
|
||||
*/
|
||||
List<TargetAchievement> getDeviceLimitOrders(@Param("deviceCode") String deviceCode, @Param("number") int number);
|
||||
|
||||
|
||||
List<DayData> getTemporaryStorage();
|
||||
|
||||
|
||||
List<TaskInfo> getTemporaryInTask();
|
||||
|
||||
|
||||
List<TaskInfo> getTemporaryOutTask();
|
||||
|
||||
|
||||
TargetAchievement getCompletionPercent(@Param("regionCode") String regionCode, @Param("vehicleType") String vehicleType, @Param("days") Integer days);
|
||||
|
||||
|
||||
List<TargetAchievement> getWorkOrders(@Param("regionCode") String regionCode, @Param("days") Integer days);
|
||||
|
||||
|
||||
List<TargetAchievement> getGhActualProduction(@Param("days") Integer days);
|
||||
|
||||
|
||||
@Select("SELECT COUNT(*) AS totalFaults, " +
|
||||
" (COUNT(*) / 30.0) * 100 AS faultRate " +
|
||||
"FROM das_device_fault " +
|
||||
"WHERE device_code = #{deviceCode} " +
|
||||
" AND failure_time >= NOW() - INTERVAL 30 DAY")
|
||||
Long getFaultsForDevice(@Param("deviceCode") String deviceCode);
|
||||
|
||||
|
||||
List<DayData> getGhCuringSummary();
|
||||
|
||||
@Insert("INSERT INTO das_device_fault (data_id,region_code, device_code, failure_time, failure_info) " +
|
||||
"VALUES (#{data_id},#{region_code}, #{device_code}, #{failure_time}, #{failure_info})")
|
||||
int insertDeviceFault(DasDeviceFault deviceFault);
|
||||
|
||||
|
||||
JSONObject getVehicleGroupInfo(String vehicleCode, String vehicleType);
|
||||
|
||||
/**
|
||||
* 固化室详情
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
JSONArray getGHSInteriorList();
|
||||
|
||||
JSONArray getSSXInteriorList();
|
||||
|
||||
JSONArray getZCList();
|
||||
|
||||
JSONArray getKJList();
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="org.nl.wms.cockpit.service.mapper.CockpitMapper">
|
||||
<select id="getDeviceLimitOrders" resultType="org.nl.wms.cockpit.service.dao.home.TargetAchievement">
|
||||
SELECT
|
||||
w.plan_qty,
|
||||
w.real_qty,
|
||||
m.material_name
|
||||
FROM
|
||||
`pdm_bd_workorder` w
|
||||
LEFT JOIN md_base_material m ON m.material_id = w.material_id
|
||||
WHERE 1=1
|
||||
AND w.is_delete = 0
|
||||
<if test="deviceCode != null and deviceCode != ''">
|
||||
AND w.point_code = #{deviceCode}
|
||||
</if>
|
||||
<if test="number != 0 ">
|
||||
LIMIT #{number}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<select id="getWorkOrders" resultType="org.nl.wms.cockpit.service.dao.home.TargetAchievement">
|
||||
SELECT
|
||||
w.plan_qty AS expected_production,
|
||||
w.real_qty AS actual_production,
|
||||
w.vehicle_type,
|
||||
w.create_time
|
||||
FROM
|
||||
`pdm_bd_workorder` w
|
||||
WHERE 1=1
|
||||
AND w.is_delete = 0
|
||||
<if test="days != null and days != ''">
|
||||
<![CDATA[
|
||||
AND w.create_time >= DATE_SUB(CURDATE(), INTERVAL #{days} DAY)
|
||||
AND w.create_time < CURDATE() + INTERVAL 1 DAY
|
||||
]]>
|
||||
</if>
|
||||
<if test="regionCode != null and regionCode != ''">
|
||||
AND w.region_code = #{regionCode}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
|
||||
<select id="getGhActualProduction" resultType="org.nl.wms.cockpit.service.dao.home.TargetAchievement">
|
||||
SELECT
|
||||
g.material_qty AS actual_production,
|
||||
t.task_id,
|
||||
t.create_time
|
||||
FROM
|
||||
`sch_base_task` t
|
||||
LEFT JOIN sch_base_vehiclematerialgroup g ON t.group_id = g.group_id
|
||||
WHERE
|
||||
1 = 1
|
||||
AND t.is_delete = 0
|
||||
AND t.config_code = 'GHSMLTask'
|
||||
<if test="days != null and days != ''">
|
||||
<![CDATA[
|
||||
AND t.create_time >= DATE_SUB(CURDATE(), INTERVAL #{days} DAY)
|
||||
AND t.create_time < CURDATE() + INTERVAL 1 DAY
|
||||
]]>
|
||||
</if>
|
||||
</select>
|
||||
|
||||
|
||||
<select id="getCompletionPercent" resultType="org.nl.wms.cockpit.service.dao.home.TargetAchievement">
|
||||
SELECT
|
||||
SUM( plan_qty ) AS expected_production,
|
||||
SUM( real_qty ) AS actual_production
|
||||
FROM
|
||||
pdm_bd_workorder
|
||||
WHERE
|
||||
is_delete = 0
|
||||
<if test="days != null and days != ''">
|
||||
<![CDATA[
|
||||
AND create_time >= DATE_SUB(CURDATE(), INTERVAL #{days} DAY)
|
||||
AND create_time < CURDATE() + INTERVAL 1 DAY
|
||||
]]>
|
||||
</if>
|
||||
<if test="regionCode != null and regionCode != ''">
|
||||
AND region_code = #{regionCode}
|
||||
</if>
|
||||
<if test="vehicleType != null and vehicleType != ''">
|
||||
AND vehicle_type = #{vehicleType}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
|
||||
<select id="getGhCuringSummary" resultType="org.nl.wms.cockpit.service.dao.home.DayData">
|
||||
SELECT CASE
|
||||
p.point_status
|
||||
WHEN '3' THEN
|
||||
'待固化'
|
||||
WHEN '4' THEN
|
||||
'固化中'
|
||||
WHEN '5' THEN
|
||||
'固化完毕'
|
||||
ELSE ''
|
||||
END AS item_name,
|
||||
COUNT(p.point_type) AS item_qty
|
||||
FROM `pdm_bd_workorder` w
|
||||
LEFT JOIN sch_base_point p ON w.point_code = p.point_code
|
||||
WHERE w.region_code = 'GH'
|
||||
AND w.is_delete = 0
|
||||
AND DATE_FORMAT(w.create_time, '%Y-%m-%d') = CURDATE()
|
||||
GROUP BY p.point_status;
|
||||
</select>
|
||||
|
||||
|
||||
<select id="getTemporaryStorage" resultType="org.nl.wms.cockpit.service.dao.home.DayData">
|
||||
SELECT p.point_code,
|
||||
m.material_name item_name,
|
||||
g.material_qty item_qty
|
||||
FROM `sch_base_point` p
|
||||
RIGHT JOIN sch_base_vehiclematerialgroup g ON p.point_code = g.point_code
|
||||
LEFT JOIN md_base_material m ON g.material_id = m.material_id
|
||||
WHERE p.region_code = 'ZC'
|
||||
AND g.group_bind_material_status = 2
|
||||
AND DATE_FORMAT(g.update_time, '%Y-%m-%d') = CURDATE()
|
||||
</select>
|
||||
|
||||
|
||||
<select id="getTemporaryInTask" resultType="org.nl.wms.cockpit.service.dao.zcq.TaskInfo">
|
||||
SELECT g.point_code,
|
||||
g.vehicle_code,
|
||||
CASE
|
||||
g.vehicle_type
|
||||
WHEN 1 THEN
|
||||
"普涂"
|
||||
ELSE "连涂"
|
||||
END AS vehicle_type,
|
||||
m.material_name,
|
||||
"出库" AS task_type
|
||||
FROM `sch_base_vehiclematerialgroup` g
|
||||
LEFT JOIN md_base_material m ON g.material_id = m.material_id
|
||||
WHERE g.region_code = 'ZC'
|
||||
AND g.group_bind_material_status = 3
|
||||
AND DATE_FORMAT(g.update_time, '%Y-%m-%d') = CURDATE()
|
||||
</select>
|
||||
|
||||
|
||||
<select id="getTemporaryOutTask" resultType="org.nl.wms.cockpit.service.dao.zcq.TaskInfo">
|
||||
SELECT p.point_code,
|
||||
m.material_name,
|
||||
g.vehicle_code,
|
||||
CASE
|
||||
g.vehicle_type
|
||||
WHEN 1 THEN
|
||||
"普涂"
|
||||
ELSE "连涂"
|
||||
END AS vehicle_type,
|
||||
"出库" as type
|
||||
FROM `sch_base_point` p
|
||||
RIGHT JOIN sch_base_vehiclematerialgroup g ON p.point_code = g.point_code
|
||||
LEFT JOIN md_base_material m ON g.material_id = m.material_id
|
||||
WHERE p.region_code = 'ZC'
|
||||
AND group_bind_material_status = 2
|
||||
AND DATE_FORMAT(p.update_time, '%Y-%m-%d') = CURDATE()
|
||||
</select>
|
||||
|
||||
|
||||
<select id="getVehicleGroupInfo" resultType="com.alibaba.fastjson.JSONObject">
|
||||
SELECT vg.vehicle_type
|
||||
, vg.vehicle_code
|
||||
, ma.material_name
|
||||
, ma.material_code
|
||||
FROM sch_base_vehiclematerialgroup vg
|
||||
LEFT JOIN md_base_material ma ON vg.material_id = ma.material_id
|
||||
WHERE 1 = 1
|
||||
<if test="vehicle_code != null">
|
||||
AND vg.vehicle_code = #{vehicle_code}
|
||||
</if>
|
||||
<if test="vehicle_type != null">
|
||||
AND vg.vehicle_type = #{vehicle_type}
|
||||
</if>
|
||||
AND vg.is_delete = '0'
|
||||
</select>
|
||||
<select id="getGHSInteriorList" resultType="com.alibaba.fastjson.JSONObject">
|
||||
SELECT CAST(point_status - 1 AS SIGNED) AS move,
|
||||
point_code AS device_code,
|
||||
point_name AS device_name,
|
||||
IF(LENGTH(vehicle_type) > 0, vehicle_type, '-') AS vehicle_type,
|
||||
parent_point_code AS device
|
||||
FROM `sch_base_point`
|
||||
WHERE region_code = 'GH'
|
||||
AND point_type = '2'
|
||||
</select>
|
||||
<select id="getSSXInteriorList" resultType="com.alibaba.fastjson.JSONObject">
|
||||
SELECT CAST(point_status - 1 AS SIGNED) AS move,
|
||||
point_code AS device_code,
|
||||
point_name AS device_name,
|
||||
"1" AS mode,
|
||||
"0" AS error,
|
||||
parent_point_code AS device
|
||||
FROM `sch_base_point`
|
||||
WHERE region_code = 'KJZC'
|
||||
AND point_type IN ('1', '3', '4')
|
||||
</select>
|
||||
<select id="getZCList" resultType="com.alibaba.fastjson.JSONObject">
|
||||
SELECT CAST(point_status - 1 AS SIGNED) AS move,
|
||||
point_code AS device_code,
|
||||
point_name AS device_name
|
||||
FROM `sch_base_point`
|
||||
WHERE region_code = 'ZC'
|
||||
</select>
|
||||
<select id="getKJList" resultType="com.alibaba.fastjson.JSONObject">
|
||||
SELECT CAST(point_status - 1 AS SIGNED) AS move,
|
||||
point_code AS device_code,
|
||||
vehicle_type,
|
||||
point_name AS device_name
|
||||
FROM `sch_base_point`
|
||||
WHERE region_code = 'KJW'
|
||||
</select>
|
||||
</mapper>
|
||||
@@ -25,6 +25,9 @@ public class SchBaseVehiclematerialgroup implements Serializable {
|
||||
@ApiModelProperty(value = "组盘标识")
|
||||
private String group_id;
|
||||
|
||||
@ApiModelProperty(value = "区域编码")
|
||||
private String region_code;
|
||||
|
||||
@ApiModelProperty(value = "载具编码")
|
||||
private String vehicle_code;
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.nl.common.domain.query.PageQuery;
|
||||
import org.nl.common.exception.BadRequestException;
|
||||
import org.nl.common.utils.SecurityUtils;
|
||||
@@ -17,6 +18,7 @@ import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService;
|
||||
import org.nl.wms.sch.group.service.dao.mapper.SchBaseVehiclematerialgroupMapper;
|
||||
import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup;
|
||||
import org.nl.wms.sch.group.service.dto.SchBaseVehiclematerialgroupQuery;
|
||||
import org.nl.wms.sch.point.service.ISchBasePointService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@@ -36,6 +38,9 @@ public class SchBaseVehiclematerialgroupServiceImpl extends ServiceImpl<SchBaseV
|
||||
@Autowired
|
||||
private SchBaseVehiclematerialgroupMapper vehiclematerialgroupMapper;
|
||||
|
||||
|
||||
@Autowired
|
||||
private ISchBasePointService pointService;
|
||||
@Override
|
||||
public IPage<SchBaseVehiclematerialgroup> queryAll(SchBaseVehiclematerialgroupQuery whereJson, PageQuery page){
|
||||
IPage<SchBaseVehiclematerialgroup> pages = new Page<>(page.getPage() + 1, page.getSize());
|
||||
@@ -48,7 +53,10 @@ public class SchBaseVehiclematerialgroupServiceImpl extends ServiceImpl<SchBaseV
|
||||
String currentUserId = SecurityUtils.getCurrentUserId();
|
||||
String nickName = SecurityUtils.getCurrentNickName();
|
||||
String now = DateUtil.now();
|
||||
|
||||
if(StringUtils.isNotBlank(entity.getPoint_code()))
|
||||
{
|
||||
entity.setRegion_code(pointService.getById(entity.getPoint_code()).getRegion_code());
|
||||
}
|
||||
entity.setGroup_id(IdUtil.getSnowflake(1,1).nextIdStr());
|
||||
entity.setCreate_id(currentUserId);
|
||||
entity.setCreate_name(nickName);
|
||||
|
||||
@@ -6,9 +6,9 @@ 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:tn_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}
|
||||
username: ${DB_USER:generallu}
|
||||
password: ${DB_PWD:123456}
|
||||
# password: ${DB_PWD:P@ssw0rd}
|
||||
# 初始连接数
|
||||
|
||||
@@ -29,6 +29,8 @@ task:
|
||||
keep-alive-seconds: 60
|
||||
# 队列容量
|
||||
queue-capacity: 50
|
||||
# 主线程等待子线程执行时间
|
||||
awaitTerminationSeconds: 50
|
||||
|
||||
#七牛云
|
||||
qiniu:
|
||||
|
||||
Reference in New Issue
Block a user