package com.jeesite.modules.mes.web; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.jeesite.common.collect.ListUtils; import com.jeesite.common.collect.MapUtils; import com.jeesite.common.config.Global; import com.jeesite.common.entity.Page; import com.jeesite.common.lang.DateUtils; import com.jeesite.common.mybatis.mapper.query.QueryType; import com.jeesite.common.utils.excel.ExcelExport; import com.jeesite.common.utils.excel.annotation.ExcelField.Type; import com.jeesite.common.web.BaseController; import com.jeesite.modules.mes.entity.MesDeviceFault; import com.jeesite.modules.mes.entity.MesDeviceFaultCate; import com.jeesite.modules.mes.entity.MesDeviceFaultMaintain; import com.jeesite.modules.mes.entity.MesDeviceOee; import com.jeesite.modules.mes.resp.CommonResp; import com.jeesite.modules.mes.service.MesDeviceFaultCateService; import com.jeesite.modules.mes.service.MesDeviceFaultMaintainService; import com.jeesite.modules.mes.service.MesDeviceFaultService; import com.jeesite.modules.mes.service.MesDeviceOeeService; import com.jeesite.modules.mes.util.CommonUitl; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; /** * 设备故障记录Controller * @author hzd * @version 2024-07-23 */ @Controller @RequestMapping(value = "${adminPath}/mes/mesDeviceFault") public class MesDeviceFaultController extends BaseController { @Autowired private MesDeviceFaultService mesDeviceFaultService; @Autowired private MesDeviceFaultCateService mesDeviceFaultCateService; @Autowired private MesDeviceFaultMaintainService mesDeviceFaultMaintainService; @Autowired private MesDeviceOeeService mesDeviceOeeService; /** * 获取数据 */ @ModelAttribute public MesDeviceFault get(String id, boolean isNewRecord) { return mesDeviceFaultService.get(id, isNewRecord); } /** * 查询列表 */ @RequiresPermissions("mes:mesDeviceFault:view") @RequestMapping(value = {"list", ""}) public String list(MesDeviceFault mesDeviceFault, Model model) { model.addAttribute("mesDeviceFault", mesDeviceFault); MesDeviceFaultCate mesDeviceFaultCate = new MesDeviceFaultCate(); mesDeviceFaultCate.setStatus("0"); model.addAttribute("mesDeviceFaultCate", mesDeviceFaultCateService.findList(mesDeviceFaultCate)); MesDeviceFaultMaintain mesDeviceFaultMaintain = new MesDeviceFaultMaintain(); mesDeviceFaultMaintain.setStatus("0"); model.addAttribute("mesDeviceFaultMaintain", mesDeviceFaultMaintainService.findList(mesDeviceFaultMaintain)); return "modules/mes/mesDeviceFaultList"; } /** * 查询列表数据 */ @RequiresPermissions("mes:mesDeviceFault:view") @RequestMapping(value = "listData") @ResponseBody public Page listData(MesDeviceFault mesDeviceFault, HttpServletRequest request, HttpServletResponse response) { mesDeviceFault.setPage(new Page<>(request, response)); Page page = mesDeviceFaultService.findPage(mesDeviceFault); return page; } /** * 查看编辑表单 */ @RequiresPermissions("mes:mesDeviceFault:view") @RequestMapping(value = "form") public String form(MesDeviceFault mesDeviceFault, Model model) { model.addAttribute("mesDeviceFault", mesDeviceFault); MesDeviceFaultCate mesDeviceFaultCate = new MesDeviceFaultCate(); mesDeviceFaultCate.setStatus("0"); model.addAttribute("mesDeviceFaultCate", mesDeviceFaultCateService.findList(mesDeviceFaultCate)); MesDeviceFaultMaintain mesDeviceFaultMaintain = new MesDeviceFaultMaintain(); mesDeviceFaultMaintain.setStatus("0"); model.addAttribute("mesDeviceFaultMaintain", mesDeviceFaultMaintainService.findList(mesDeviceFaultMaintain)); return "modules/mes/mesDeviceFaultForm"; } @RequiresPermissions("mes:mesDeviceFault:view") @RequestMapping(value = "tj") public String tj(MesDeviceFault mesDeviceFault, Model model) { model.addAttribute("mesDeviceFault", mesDeviceFault); MesDeviceFaultCate mesDeviceFaultCate = new MesDeviceFaultCate(); mesDeviceFaultCate.setStatus("0"); model.addAttribute("mesDeviceFaultCate", mesDeviceFaultCateService.findList(mesDeviceFaultCate)); MesDeviceFaultMaintain mesDeviceFaultMaintain = new MesDeviceFaultMaintain(); mesDeviceFaultMaintain.setStatus("0"); model.addAttribute("mesDeviceFaultMaintain", mesDeviceFaultMaintainService.findList(mesDeviceFaultMaintain)); MesDeviceOee mesDeviceOee = new MesDeviceOee(); mesDeviceOee.setStatus("0"); model.addAttribute("mesDeviceOee", mesDeviceOeeService.findList(mesDeviceOee)); return "modules/mes/mesDeviceFaultTj"; } @RequiresPermissions("mes:mesDeviceFault:view") @RequestMapping(value = "tj2") public String tj2(MesDeviceFault mesDeviceFault, Model model) { model.addAttribute("mesDeviceFault", mesDeviceFault); MesDeviceFaultCate mesDeviceFaultCate = new MesDeviceFaultCate(); mesDeviceFaultCate.setStatus("0"); model.addAttribute("mesDeviceFaultCate", mesDeviceFaultCateService.findList(mesDeviceFaultCate)); MesDeviceFaultMaintain mesDeviceFaultMaintain = new MesDeviceFaultMaintain(); mesDeviceFaultMaintain.setStatus("0"); model.addAttribute("mesDeviceFaultMaintain", mesDeviceFaultMaintainService.findList(mesDeviceFaultMaintain)); return "modules/mes/mesDeviceFaultTj2"; } @RequestMapping(value = "tjData1") @ResponseBody public CommonResp tjData1(MesDeviceFault mesDeviceFault) { CommonResp> resp = new CommonResp<>(); Map map = MapUtils.newHashMap(); mesDeviceFault.setStatus("0"); MesDeviceFaultCate mesDeviceFaultCate2 = new MesDeviceFaultCate(); mesDeviceFaultCate2.setStatus("0"); List cates = mesDeviceFaultCateService.findList(mesDeviceFaultCate2); List lists = new ArrayList<>(); for (MesDeviceFaultCate mesDeviceFaultCate:cates){ Map map2 = MapUtils.newHashMap(); map2.put("name",mesDeviceFaultCate.getTitle()); mesDeviceFault.setCateId(mesDeviceFaultCate.getId()); Long jpp1 = mesDeviceFaultService.findCount(mesDeviceFault); map2.put("value",jpp1); lists.add(map2); } map.put("lists",lists); resp.setData(map); resp.setResult(Global.TRUE); return resp; } @RequestMapping(value = "tjData2") @ResponseBody public CommonResp tjData2(MesDeviceFault mesDeviceFault) { CommonResp> resp = new CommonResp<>(); Map map = MapUtils.newHashMap(); mesDeviceFault.setStatus("0"); MesDeviceFaultCate mesDeviceFaultCate2 = new MesDeviceFaultCate(); mesDeviceFaultCate2.setStatus("0"); List cates = mesDeviceFaultCateService.findList(mesDeviceFaultCate2); List> list1 = new ArrayList<>(); Map map21 = MapUtils.newHashMap(); map21.put("id","1"); map21.put("title","A"); list1.add(map21); Map map211 = MapUtils.newHashMap(); map211.put("id","2"); map211.put("title","B"); list1.add(map211); Map map22 = MapUtils.newHashMap(); map22.put("id","3"); map22.put("title","C"); list1.add(map22); Map map23 = MapUtils.newHashMap(); map23.put("id","4"); map23.put("title","D"); list1.add(map23); List lists = new ArrayList<>(); for (Map map3:list1){ Map map4 = MapUtils.newHashMap(); map4.put("name",map3.get("title")); mesDeviceFault.setLevel(map3.get("id")); Long jpp1 = mesDeviceFaultService.findCount(mesDeviceFault); map4.put("value",jpp1); lists.add(map4); } map.put("lists",lists); resp.setData(map); resp.setResult(Global.TRUE); return resp; } @RequestMapping(value = "tjData3") @ResponseBody public CommonResp tjData3(MesDeviceFault mesDeviceFault) { CommonResp> resp = new CommonResp<>(); Map map = MapUtils.newHashMap(); mesDeviceFault.setStatus("0"); List days = CommonUitl.getBeforeDays(30); Collections.sort(days); List pNums = new ArrayList<>(); for(String day:days){ String csdate = day + " 00:00:00"; String cedate = day + " 23:59:59"; mesDeviceFault.setStartDate_gte(CommonUitl.String2Date(csdate)); mesDeviceFault.setStartDate_lte(CommonUitl.String2Date(cedate)); Long jpp1 = mesDeviceFaultService.findCount(mesDeviceFault); pNums.add(jpp1); } map.put("days",days); map.put("lists",pNums); resp.setData(map); resp.setResult(Global.TRUE); return resp; } @RequestMapping(value = "tjData4") @ResponseBody public CommonResp tjData4(MesDeviceFault mesDeviceFault) { CommonResp> resp = new CommonResp<>(); Map map = MapUtils.newHashMap(); mesDeviceFault.setStatus("0"); List days = CommonUitl.getBeforeDays(30); Collections.sort(days); List pNums = new ArrayList<>(); for(String day:days){ String csdate = day + " 00:00:00"; String cedate = day + " 23:59:59"; mesDeviceFault.setStartDate_gte(CommonUitl.String2Date(csdate)); mesDeviceFault.setStartDate_lte(CommonUitl.String2Date(cedate)); List mdfs = mesDeviceFaultService.findList(mesDeviceFault); Integer mins = 0; for (MesDeviceFault mesDeviceFault1:mdfs){ mins += mesDeviceFault1.getDuration(); } pNums.add(mins); } map.put("days",days); map.put("lists",pNums); resp.setData(map); resp.setResult(Global.TRUE); return resp; } //mtbf mttr @RequestMapping(value = "tjData6") @ResponseBody public CommonResp tjData6(MesDeviceFault mesDeviceFault) { CommonResp>> resp = new CommonResp<>(); Date startDate = mesDeviceFault.getStartDate(); Date endDate = mesDeviceFault.getEndDate(); if (startDate == null && endDate == null) { LocalDateTime now = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0); endDate = Date.from(now.atZone(ZoneId.systemDefault()).toInstant()); startDate = Date.from(now.minusDays(7).atZone(ZoneId.systemDefault()).toInstant()); } else if (startDate == null || endDate == null) { resp.setResult(Global.FALSE); resp.setMessage("开始时间和结束时间必须同时填写!"); return resp; } MesDeviceFaultMaintain mesDeviceFaultMaintain = new MesDeviceFaultMaintain(); mesDeviceFaultMaintain.setId(mesDeviceFault.getMaintainId()); List list = mesDeviceFaultMaintainService.findList(mesDeviceFaultMaintain); // Initialize JSON objects ObjectMapper mapper = new ObjectMapper(); ObjectNode chartData = mapper.createObjectNode(); ArrayNode xAxisData = mapper.createArrayNode(); ArrayNode legendData = mapper.createArrayNode(); ArrayNode seriesData = mapper.createArrayNode(); legendData.add("mttr"); legendData.add("mtbf"); List mttrList = new ArrayList<>(); List mtbfList = new ArrayList<>(); for (MesDeviceFaultMaintain deviceFaultMaintain : list) { String id = deviceFaultMaintain.getId(); MesDeviceFault mesDeviceFault1 = new MesDeviceFault(); mesDeviceFault1.setMaintainId(id); mesDeviceFault1.getSqlMap().getWhere().and("a.start_date", QueryType.GTE, startDate); mesDeviceFault1.getSqlMap().getWhere().and("a.end_date", QueryType.LTE, endDate); List mesDeviceFaults = mesDeviceFaultService.findList(mesDeviceFault1); // Calculate MTTR int hour = 0; for (MesDeviceFault deviceFault : mesDeviceFaults) { Integer duration = deviceFault.getDuration(); hour += duration / 60; } double mttr = (double) hour / mesDeviceFaults.size(); mttrList.add(mttr); // Calculate MTBF Instant startInstant = startDate.toInstant(); Instant endInstant = endDate.toInstant(); double hours = Duration.between(startInstant, endInstant).toMillis() / (1000.0 * 60 * 60); double hourAll = hours * mesDeviceFaults.size(); double mtbf = hourAll / mesDeviceFaults.size(); mtbfList.add(mtbf); xAxisData.add(deviceFaultMaintain.getTitle()); } // Create series data ObjectNode mttrSeries = mapper.createObjectNode(); mttrSeries.put("name", "mttr"); mttrSeries.set("data", mapper.valueToTree(mttrList)); seriesData.add(mttrSeries); ObjectNode mtbfSeries = mapper.createObjectNode(); mtbfSeries.put("name", "mtbf"); mtbfSeries.set("data", mapper.valueToTree(mtbfList)); seriesData.add(mtbfSeries); // Add all data to the root JSON object chartData.put("title", "Fault Analysis"); chartData.set("xAxisData", xAxisData); chartData.set("legendData", legendData); chartData.set("seriesData", seriesData); HashMap> dataMap = new HashMap<>(); dataMap.put("xAxisData", mapper.convertValue(xAxisData, List.class)); dataMap.put("legendData", mapper.convertValue(legendData, List.class)); dataMap.put("seriesData", mapper.convertValue(seriesData, List.class)); System.out.println(dataMap.toString()); resp.setData(dataMap); resp.setResult(Global.TRUE); return resp; } /** * 保存数据 */ @RequiresPermissions("mes:mesDeviceFault:edit") @PostMapping(value = "save") @ResponseBody public String save(@Validated MesDeviceFault mesDeviceFault) { if(mesDeviceFault.getStartDate() != null && mesDeviceFault.getEndDate() != null){ if(mesDeviceFault.getStartDate().getTime() >= mesDeviceFault.getEndDate().getTime()){ return renderResult(Global.FALSE, text("结束时间必须大于开始时间!")); } Integer interval = Math.round((mesDeviceFault.getEndDate().getTime() - mesDeviceFault.getStartDate().getTime())/60000); logger.info("duration:"+interval); mesDeviceFault.setDuration(interval); }else{ mesDeviceFault.setDuration(0); } mesDeviceFaultService.save(mesDeviceFault); return renderResult(Global.TRUE, text("保存设备故障记录成功!")); } /** * 导出数据 */ @RequiresPermissions("mes:mesDeviceFault:view") @RequestMapping(value = "exportData") public void exportData(MesDeviceFault mesDeviceFault, HttpServletResponse response) { List list = mesDeviceFaultService.findList(mesDeviceFault); String fileName = "设备故障记录" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; try(ExcelExport ee = new ExcelExport("设备故障记录", MesDeviceFault.class)){ ee.setDataList(list).write(response, fileName); } } /** * 下载模板 */ @RequiresPermissions("mes:mesDeviceFault:view") @RequestMapping(value = "importTemplate") public void importTemplate(HttpServletResponse response) { MesDeviceFault mesDeviceFault = new MesDeviceFault(); List list = ListUtils.newArrayList(mesDeviceFault); String fileName = "设备故障记录模板.xlsx"; try(ExcelExport ee = new ExcelExport("设备故障记录", MesDeviceFault.class, Type.IMPORT)){ ee.setDataList(list).write(response, fileName); } } /** * 导入数据 */ @ResponseBody @RequiresPermissions("mes:mesDeviceFault:edit") @PostMapping(value = "importData") public String importData(MultipartFile file) { try { String message = mesDeviceFaultService.importData(file); return renderResult(Global.TRUE, "posfull:"+message); } catch (Exception ex) { return renderResult(Global.FALSE, "posfull:"+ex.getMessage()); } } /** * 删除数据 */ @RequiresPermissions("mes:mesDeviceFault:edit") @RequestMapping(value = "delete") @ResponseBody public String delete(MesDeviceFault mesDeviceFault) { mesDeviceFaultService.delete(mesDeviceFault); return renderResult(Global.TRUE, text("删除设备故障记录成功!")); } }