diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/DeviceScreenController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/DeviceScreenController.java new file mode 100644 index 00000000..a636c0b2 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/DeviceScreenController.java @@ -0,0 +1,95 @@ +package org.nl.wms.ext.bigScreen.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.annotation.Log; +import org.nl.wms.ext.bigScreen.service.DeviceScreenService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Api(tags = "设备监控大屏") +@RequestMapping("/api/deviceScreen") +@Slf4j +public class DeviceScreenController { + private final DeviceScreenService deviceScreenService; + + @PostMapping("/deviceStatus") + @Log("设备实时状态") + @ApiOperation("设备实时状态") + public ResponseEntity getData(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(deviceScreenService.deviceStatus(whereJson), HttpStatus.OK); + } + + @PostMapping("/oeeAndTeep") + @Log("设备综合效率OEE&产能利用效率TEEP") + @ApiOperation("设备综合效率OEE&产能利用效率TEEP") + public ResponseEntity oeeAndTeep(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(deviceScreenService.oeeAndTeep(whereJson), HttpStatus.OK); + } + + @PostMapping("/queryDeviceByWork") + @Log("运行设备大类产能比") + @ApiOperation("运行设备大类产能比") + public ResponseEntity queryDeviceByWork(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(deviceScreenService.queryDeviceByWork(whereJson), HttpStatus.OK); + } + + @PostMapping("/deviceErrorNum") + @Log("设备TOP10故障次数") + @ApiOperation("设备TOP10故障次数") + public ResponseEntity deviceErrorNum(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(deviceScreenService.deviceErrorNum(whereJson), HttpStatus.OK); + } + + @PostMapping("/deviceManage") + @Log("设备管理") + @ApiOperation("设备管理") + public ResponseEntity deviceManage(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(deviceScreenService.deviceManage(whereJson), HttpStatus.OK); + } + + @PostMapping("/deviceCensus") + @Log("设备综合统计") + @ApiOperation("设备综合统计") + public ResponseEntity deviceCensus(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(deviceScreenService.deviceCensus(whereJson), HttpStatus.OK); + } + + @PostMapping("/deviceErrorInfo") + @Log("设备报警信息") + @ApiOperation("设备报警信息") + public ResponseEntity deviceErrorInfo(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(deviceScreenService.deviceErrorInfo(whereJson), HttpStatus.OK); + } + + @PostMapping("/deviceUseRate") + @Log("设备产能利用") + @ApiOperation("设备产能利用") + public ResponseEntity deviceUseRate(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(deviceScreenService.deviceUseRate(whereJson), HttpStatus.OK); + } + + @PostMapping("/deviceStatusList") + @Log("设备状态列表") + @ApiOperation("设备状态列表") + public ResponseEntity deviceStatusList(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(deviceScreenService.deviceStatusList(whereJson), HttpStatus.OK); + } + + @PostMapping("/errCensus") + @Log("近30天设备故障统计") + @ApiOperation("近30天设备故障统计") + public ResponseEntity errCensus(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(deviceScreenService.errCensus(whereJson), HttpStatus.OK); + } + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/DeviceScreenService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/DeviceScreenService.java new file mode 100644 index 00000000..d8254e8f --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/DeviceScreenService.java @@ -0,0 +1,25 @@ +package org.nl.wms.ext.bigScreen.service; + +import com.alibaba.fastjson.JSONObject; + +public interface DeviceScreenService { + public JSONObject deviceStatus(JSONObject param); + + public JSONObject oeeAndTeep(JSONObject param); + + public JSONObject queryDeviceByWork(JSONObject param); + + public JSONObject deviceErrorNum(JSONObject param); + + public JSONObject deviceManage(JSONObject param); + + public JSONObject deviceCensus(JSONObject param); + + public JSONObject deviceErrorInfo(JSONObject param); + + public JSONObject deviceUseRate(JSONObject param); + + public JSONObject deviceStatusList(JSONObject param); + + public JSONObject errCensus(JSONObject param); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/DeviceScreenServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/DeviceScreenServiceImpl.java new file mode 100644 index 00000000..f2a3ab02 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/DeviceScreenServiceImpl.java @@ -0,0 +1,330 @@ +package org.nl.wms.ext.bigScreen.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.ext.bigScreen.service.DeviceScreenService; +import org.nl.wql.WQL; +import org.nl.wql.core.bean.WQLObject; + +import java.util.Date; + +public class DeviceScreenServiceImpl implements DeviceScreenService { + @Override + public JSONObject deviceStatus(JSONObject param) { + //正常运行:有工单正在工作的;暂未生产:有工单没有在工作的;空闲设备:没有工单的,没故障的;故障设备:状态为故障的 + JSONArray device_rows = WQLObject.getWQLObject("PDM_BI_Device").query("is_active = '1' AND is_delete = '0'").getResultJSONArray(0); + int total_num = device_rows.size(); + int run_device = 0; + int prepare_device = 0; + int free_device = 0; + int err_device = 0; + + JSONObject result = new JSONObject(); + result.put("total_num", total_num); + result.put("run_device", run_device); + result.put("prepare_device", prepare_device); + result.put("free_device", free_device); + result.put("err_device", err_device); + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "查询成功!"); + returnjo.put("result", result); + return returnjo; + } + + @Override + public JSONObject oeeAndTeep(JSONObject param) { + JSONObject oee = new JSONObject(); + JSONObject teep = new JSONObject(); + //value1:过去一个月;value2:目标;value3:实际 + oee.put("value1", "78.0%"); + oee.put("value2", "67.0%"); + oee.put("value3", "48.0%"); + teep.put("value1", "46.0%"); + teep.put("value2", "51.0%"); + teep.put("value3", "32.0%"); + JSONObject result = new JSONObject(); + result.put("oee", oee); + result.put("teep", teep); + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "查询成功!"); + returnjo.put("result", result); + return returnjo; + } + + @Override + public JSONObject queryDeviceByWork(JSONObject param) { + JSONArray result = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "1").process().getResultJSONArray(0); + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "查询成功!"); + returnjo.put("result", result); + return returnjo; + } + + @Override + public JSONObject deviceErrorNum(JSONObject param) { + JSONArray result = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "2").process().getResultJSONArray(0); + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "查询成功!"); + returnjo.put("result", result); + return returnjo; + } + + @Override + public JSONObject deviceManage(JSONObject param) { + String today = DateUtil.today()+"%"; + Date today_begin = DateUtil.beginOfDay(DateUtil.date()); + //弯头工段 + JSONObject jo1 = new JSONObject(); + jo1.put("oee", "45.8%"); + double wt_mibf = 0; + double wt_mttr = 0; + //计算mibf + JSONArray wt_run_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "3").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); + for (int i = 0; i < wt_run_rows.size(); i++) { + JSONObject device = wt_run_rows.getJSONObject(i); + String start_time = device.getString("start_time"); + String end_time = device.getString("end_time"); + if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mibf += between; + } + if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.date(); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mibf += between; + } + if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date2 = DateUtil.date(); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mibf += between; + } + if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mibf += between; + } + } + + //计算mmttr + JSONArray wt_err_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "4").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); + for (int i = 0; i < wt_err_rows.size(); i++) { + JSONObject device = wt_err_rows.getJSONObject(i); + String start_time = device.getString("start_time"); + String end_time = device.getString("end_time"); + if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mttr += between; + } + if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.date(); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mttr += between; + } + if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date2 = DateUtil.date(); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mttr += between; + } + if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mttr += between; + } + } + + jo1.put("MIBF", wt_mibf); + jo1.put("MTTR", wt_mttr); + jo1.put("err_times", wt_err_rows.size()); + //综合工段 + JSONObject jo2 = new JSONObject(); + jo2.put("oee", "45.8%"); + double zh_mibf = 0; + double zh_mttr = 0; + //计算mibf + JSONArray zh_run_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "3").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); + for (int i = 0; i < zh_run_rows.size(); i++) { + JSONObject device = zh_run_rows.getJSONObject(i); + String start_time = device.getString("start_time"); + String end_time = device.getString("end_time"); + if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mibf += between; + } + if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.date(); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mibf += between; + } + if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date2 = DateUtil.date(); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mibf += between; + } + if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mibf += between; + } + } + + //计算mmttr + JSONArray zh_err_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "4").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); + for (int i = 0; i < zh_err_rows.size(); i++) { + JSONObject device = zh_err_rows.getJSONObject(i); + String start_time = device.getString("start_time"); + String end_time = device.getString("end_time"); + if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mttr += between; + } + if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.date(); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mttr += between; + } + if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date2 = DateUtil.date(); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mttr += between; + } + if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mttr += between; + } + } + + jo2.put("MIBF", zh_mibf); + jo2.put("MTTR", zh_mttr); + jo2.put("err_times", zh_err_rows.size()); + //成品工段 + JSONObject jo3 = new JSONObject(); + jo3.put("oee", "45.8%"); + double cp_mibf = 0; + double cp_mttr = 0; + //计算mibf + JSONArray cp_run_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "3").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); + for (int i = 0; i < cp_run_rows.size(); i++) { + JSONObject device = cp_run_rows.getJSONObject(i); + String start_time = device.getString("start_time"); + String end_time = device.getString("end_time"); + if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mibf += between; + } + if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.date(); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mibf += between; + } + if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date2 = DateUtil.date(); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mibf += between; + } + if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mibf += between; + } + } + + //计算mmttr + JSONArray cp_err_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "4").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); + for (int i = 0; i < cp_err_rows.size(); i++) { + JSONObject device = cp_err_rows.getJSONObject(i); + String start_time = device.getString("start_time"); + String end_time = device.getString("end_time"); + if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mttr += between; + } + if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date1 = DateUtil.parse(start_time); + Date date2 = DateUtil.date(); + long between = DateUtil.between(date1, date2, DateUnit.HOUR); + wt_mttr += between; + } + if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { + Date date2 = DateUtil.date(); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mttr += between; + } + if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { + Date date2 = DateUtil.parse(end_time); + long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); + wt_mttr += between; + } + } + + jo3.put("MIBF", cp_mibf); + jo3.put("MTTR", cp_mttr); + jo3.put("err_times", cp_err_rows.size()); + + JSONObject result = new JSONObject(); + result.put("jo1",jo1); + result.put("jo2",jo2); + result.put("jo3",jo3); + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "查询成功!"); + returnjo.put("result", result); + return returnjo; + } + + @Override + public JSONObject deviceCensus(JSONObject param) { + return null; + } + + @Override + public JSONObject deviceErrorInfo(JSONObject param) { + String today = DateUtil.today()+"%"; + JSONArray result = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "5").addParam("today",today).process().getResultJSONArray(0); + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "查询成功!"); + returnjo.put("result", result); + return returnjo; + } + + @Override + public JSONObject deviceUseRate(JSONObject param) { + return null; + } + + @Override + public JSONObject deviceStatusList(JSONObject param) { + return null; + } + + @Override + public JSONObject errCensus(JSONObject param) { + return null; + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql new file mode 100644 index 00000000..f450cafe --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql @@ -0,0 +1,145 @@ +[交易说明] + 交易名: 物料分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.worksection_type_scode TYPEAS s_string + 输入.today TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + MAX( productivity ) AS max_productivity, + MIN( productivity ) AS min_productivity, + ROUND( SUM( productivity )/ COUNT( device_id ), 3 ) AS ave_productivity, + MAX(pro.workprocedure_name) AS workprocedure_name + FROM + pdm_bi_device device + LEFT JOIN pdm_bi_workprocedure pro ON pro.workprocedure_id = device.workprocedure_id + WHERE + device.is_active = '1' + AND + device.is_delete = '0' + GROUP BY + device.workprocedure_id + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + COUNT(run.device_id) AS err_num, + MAX(device.device_name) AS device_name + FROM + pdm_bi_devicerunstatusrecord run + LEFT JOIN pdm_bi_device device ON device.device_id = run.device_id + GROUP BY + run.device_id + LIMIT 10 + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + device.device_id, + run.start_time, + run.end_time + FROM + pdm_bi_device device + LEFT JOIN pdm_bi_workprocedure pro ON pro.workprocedure_id = device.workprocedure_id + INNER JOIN pdm_bi_devicerunstatusrecord run ON run.device_id = device.device_id + WHERE + pro.worksection_type_scode = 输入.worksection_type_scode + AND ( + run.start_time LIKE 输入.today + OR run.end_time LIKE 输入.today + OR run.end_time IS NULL + OR run.end_time = '' + ) + AND run.status_type = '03' + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + device.device_id, + run.start_time, + run.end_time + FROM + pdm_bi_device device + LEFT JOIN pdm_bi_workprocedure pro ON pro.workprocedure_id = device.workprocedure_id + INNER JOIN pdm_bi_devicerunstatusrecord run ON run.device_id = device.device_id + WHERE + pro.worksection_type_scode = 输入.worksection_type_scode + AND ( + run.start_time LIKE 输入.today + OR run.end_time LIKE 输入.today + OR run.end_time IS NULL + OR run.end_time = '' + ) + AND run.status_type = '05' + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "5" + QUERY + SELECT + run.start_time, + device.device_code, + device.device_name, + err.err_name + FROM + pdm_bi_devicerunstatusrecord run + LEFT JOIN pdm_bi_devicerunerrorlink err ON err.err_status_id = run.err_status_id + LEFT JOIN pdm_bi_device device ON run.device_id = device.device_id + WHERE + run.status_type = '05' + AND + run.start_time like 输入.today + ENDSELECT + ENDQUERY + ENDIF + + + + +