| 
					
				 | 
			
			
				@@ -4,6 +4,7 @@ import com.ruoyi.biz.domain.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.biz.service.ITwinCalc2hrService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.biz.service.ITwinCalcDayService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.biz.service.ITwinDeviceService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.biz.service.ITwinRecordAlarmsService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.biz.service.impl.AsyncServiceImpl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.biz.service.impl.IotTokenServiceImpl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.common.core.controller.BaseController; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -11,14 +12,28 @@ import com.ruoyi.common.core.domain.R; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.common.utils.DateUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import io.swagger.annotations.Api; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import io.swagger.annotations.ApiOperation; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import lombok.extern.slf4j.Slf4j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.poi.ss.usermodel.Cell; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.poi.ss.usermodel.Row; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.poi.ss.usermodel.Sheet; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.poi.ss.usermodel.Workbook; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.beans.factory.annotation.Value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.web.bind.annotation.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import javax.annotation.Resource; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import javax.servlet.http.HttpServletResponse; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.BufferedOutputStream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.FileInputStream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.IOException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.OutputStream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.net.URLEncoder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.time.LocalDate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.time.ZoneOffset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.concurrent.ExecutionException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.concurrent.Future; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.atomic.AtomicInteger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * swagger 用户测试方法 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -27,6 +42,7 @@ import java.util.concurrent.Future; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Api("数据接口") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @RestController 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@Slf4j 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @RequestMapping("/api/") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public class ApiController extends BaseController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Resource 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -34,11 +50,16 @@ public class ApiController extends BaseController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private ITwinCalc2hrService calc2hrService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private ITwinRecordAlarmsService recordAlarmsService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private ITwinDeviceService deviceService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private IotTokenServiceImpl iotTokenService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private AsyncServiceImpl asyncService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${excel.template}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String excelTemplate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @ApiOperation("首页统计数据") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @GetMapping("/index") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -187,5 +208,138 @@ public class ApiController extends BaseController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return R.ok(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @ApiOperation("设备具体数据") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @GetMapping("/export") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @CrossOrigin(origins = "*") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void export(Date start, Date end, HttpServletResponse response) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (start == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            LocalDate localDate = LocalDate.now().minusDays(7); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            start = Date.from(localDate.atStartOfDay(ZoneOffset.of("+8")).toInstant()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<TwinCalc2hr> list = calc2hrService.calc2hrList(start, end); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, Object> queryMap = new HashMap<>(16); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        queryMap.put("start", start); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        queryMap.put("end", end); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TwinRecordAlarms recordAlarms = new TwinRecordAlarms(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        recordAlarms.setAlarmType("stop"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        recordAlarms.setParams(queryMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<TwinRecordAlarms> alarms = recordAlarmsService.selectTwinRecordAlarmsList(recordAlarms); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // path是指想要下载的文件的路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 读取现有的xlsx文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try (FileInputStream inputStream = new FileInputStream(excelTemplate); Workbook wb = new XSSFWorkbook(inputStream); OutputStream outputStream = new BufferedOutputStream(response.getOutputStream())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Sheet sheet = wb.getSheetAt(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            AtomicInteger rowNum = new AtomicInteger(2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //填充数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            list.forEach(calc2hr -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Row row = sheet.createRow(rowNum.get()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Cell[] cells = new Cell[25]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (int i = 0; i < cells.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    cells[i] = row.createCell(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //设备名称 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[0].setCellValue(calc2hr.getRemark()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[1].setCellValue(DateUtils.parseDateToStr(calc2hr.getDataDate())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //总长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[2].setCellValue(calc2hr.getLengthA().add(calc2hr.getLengthB()).floatValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //总重 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[3].setCellValue(calc2hr.getWeightA().add(calc2hr.getWeightB()).floatValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //稼动率 TODO 暂时无数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[4].setCellValue(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 总电量 TODO 暂时无数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[5].setCellValue(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //告警次数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[6].setCellValue(calc2hr.getAlarm()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //A班米长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[7].setCellValue(calc2hr.getLengthA().floatValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //A班重量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[8].setCellValue(calc2hr.getWeightA().floatValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //A班开机时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[9].setCellValue(calc2hr.getOpenTimeA().floatValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //A班停机时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[10].setCellValue(calc2hr.getCloseTimeA().floatValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //A班稼动率 TODO 暂时无数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[11].setCellValue(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //A班电量 TODO 暂时无数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[12].setCellValue(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //A班停经片停机次数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[13].setCellValue(calc2hr.getStop1A()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //A班CCD停机次数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[14].setCellValue(calc2hr.getStop2A()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //A班人工停机次数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[15].setCellValue(calc2hr.getStop3A()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //B班米长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[16].setCellValue(calc2hr.getLengthB().floatValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //B班重量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[17].setCellValue(calc2hr.getWeightB().floatValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //B班开机时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[18].setCellValue(calc2hr.getOpenTimeB().floatValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //B班停机时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[19].setCellValue(calc2hr.getCloseTimeB().floatValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //B班稼动率 TODO 暂时无数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[20].setCellValue(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //B班电量 TODO 暂时无数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[21].setCellValue(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //B班停经片停机次数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[22].setCellValue(calc2hr.getStop1B()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //B班CCD停机次数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[23].setCellValue(calc2hr.getStop2B()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //B班人工停机次数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cells[24].setCellValue(calc2hr.getStop3B()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                rowNum.getAndIncrement(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            AtomicInteger row1num = new AtomicInteger(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Sheet sheet1 = wb.getSheetAt(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //填充数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            alarms.forEach(alarm -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Row row = sheet1.createRow(row1num.get()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Cell cell = row.createCell(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cell.setCellValue(alarm.getRemark()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cell = row.createCell(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cell.setCellValue(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, alarm.getDataTime())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cell = row.createCell(2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                switch (alarm.getAlarmCode().intValue()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    case 1: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        cell.setCellValue("停经片停机"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    case 2: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        cell.setCellValue("CCD停机"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    case 3: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        cell.setCellValue("人工停机"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    case 4: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        cell.setCellValue("断电停机"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    case 5: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        cell.setCellValue("设备故障停机"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    case 6: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        cell.setCellValue("落布米数达到停机"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    case 7: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        cell.setCellValue("盘头剩余圈数达到停机"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                row1num.getAndIncrement(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 清空response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            response.reset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 设置response的Header 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            response.setCharacterEncoding("UTF-8"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("数据导出" + System.currentTimeMillis() + ".xlsx", "UTF-8")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            response.setContentType("application/octet-stream"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            wb.write(outputStream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            outputStream.flush(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (IOException ex) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ex.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-; 
			 |