This commit is contained in:
psh
2024-03-14 17:15:25 +08:00
38 changed files with 1740 additions and 167 deletions

View File

@@ -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>

View File

@@ -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;
}
/**
* 访问首页提示
*

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,6 @@
package org.nl.common.utils;
@FunctionalInterface
public interface ColaBeanUtilsCallBack<S, T> {
void callBack(S t, T s);
}

View File

@@ -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;
}
}

View File

@@ -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());
}
}

View File

@@ -36,4 +36,6 @@ public class AsyncTaskProperties {
private int keepAliveSeconds;
private int queueCapacity;
private int awaitTerminationSeconds;
}

View File

@@ -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";
}
}

View File

@@ -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()
);
}
}
}

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -3,6 +3,9 @@ package org.nl.wms.cockpit.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.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();
}

View File

@@ -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<>();
}
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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();
}

View File

@@ -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>

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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() {
}
}

View File

@@ -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();
}

View File

@@ -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>

View File

@@ -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;

View File

@@ -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);

View File

@@ -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}
# 初始连接数

View File

@@ -29,6 +29,8 @@ task:
keep-alive-seconds: 60
# 队列容量
queue-capacity: 50
# 主线程等待子线程执行时间
awaitTerminationSeconds: 50
#七牛云
qiniu: