Kaynağa Gözat

feat(screen-service): 添加大屏控制功能

- 新增 ScreenControl 实体类,用于大屏控制记录
- 添加 FileController,支持文件上传和删除
- 扩展 TestController,增加大屏控制相关接口
- 新增 ScreenControlMapper 和 ScreenControlService,用于大屏控制数据操作
- 添加 MinIO 配置,支持文件存储- 新增 Dockerfile,用于构建 screen-service 镜像
nahida 1 yıl önce
ebeveyn
işleme
960fe5db52

+ 2 - 0
lamp-service/src/main/java/com/zksy/lamp/server/ExecutionServer.java

@@ -1,5 +1,6 @@
 package com.zksy.lamp.server;
 
+import com.zksy.common.exception.CommonException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -97,6 +98,7 @@ public class ExecutionServer {
                 String s = "AT+ACK\r\n";
                 writer.write(s);
                 writer.flush();
+                throw new CommonException("当次设置失败,请再次设置",456);
             }
             System.out.println("指令执行成功!");
             return returnMsgReplace;

+ 9 - 0
screen-service/Dockerfile

@@ -0,0 +1,9 @@
+# 基础镜像
+FROM openjdk:11.0-jre-buster
+# 设定时区
+ENV TZ=Asia/Shanghai
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+# 拷贝jar包
+COPY screen-service.jar /app.jar
+# 入口
+ENTRYPOINT ["java", "-Xms256m", "-Xmx512m", "-jar", "/app.jar"]

+ 4 - 0
screen-service/pom.xml

@@ -71,6 +71,10 @@
             <groupId>com.squareup.okhttp3</groupId>
             <artifactId>okhttp</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.zksy</groupId>
+            <artifactId>minioutil</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 31 - 0
screen-service/src/main/java/com/zksy/screen/controller/FileController.java

@@ -0,0 +1,31 @@
+package com.zksy.screen.controller;
+
+import com.zksy.common.core.domain.Result;
+import com.zksy.service.MinioFileStorageService;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+@RestController
+@RequestMapping("/file")
+public class FileController {
+    @Autowired
+    private MinioFileStorageService minioFileStorageService;
+    @Value("${minio.readPath}")
+    private String readPath;
+    @Value("${minio.bucket}")
+    private String bucket;
+    @SneakyThrows
+    @PostMapping("/upload")
+    public Result<String> uploadFile(@RequestParam("file") MultipartFile file) {
+        String s = minioFileStorageService.uploadFile(file, "大屏图片");
+        return Result.ok(readPath+bucket+s);
+    }
+    @DeleteMapping("/delete")
+    public Result<String> deleteFile(String path) {
+        minioFileStorageService.deleteFile(path);
+        return Result.ok("删除成功");
+    }
+}

+ 179 - 49
screen-service/src/main/java/com/zksy/screen/controller/TestController.java

@@ -1,11 +1,19 @@
 package com.zksy.screen.controller;
 
+import cn.hutool.core.util.BooleanUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONConfig;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.zksy.common.core.domain.Result;
+import com.zksy.screen.domain.po.ScreenControl;
 import com.zksy.screen.domain.request.InvokeBuild;
 import com.zksy.screen.domain.request.TopWebPage;
+import com.zksy.screen.service.ScreenControlService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -17,6 +25,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
 
 @RestController
 @Api(tags = "灯杆大屏", description = "灯杆大屏")
@@ -26,27 +37,39 @@ public class TestController {
     @Autowired
     private OkHttpClient httpClient;
     private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
+    private final String BASE_URL = "http://172.16.102.52:8016/command/";
+    @Autowired
+    private ScreenControlService screenControlService;
+
     @GetMapping("/a")
-    private String test(){
-        return "性与暴力";
+    private Result<String> test() {
+        return Result.ok("爱与和平");
+    }
+
+    @PostMapping("/a")
+    private String test2() {
+        return "爱与和平";
     }
+
     @ApiOperation(value = "清屏,清除顶层网页内容")
     @PostMapping("/clearTopWebPage")
-    public Result clearTopWebPage(@ApiParam(value = "设备编码",required = true) @RequestParam(value = "deviceCode",defaultValue = "")String deviceCode,
-                                  @ApiParam(value = "入参类型",required = true) @RequestParam(value = "type",defaultValue = "clear")String type) {
+    public Result clearTopWebPage(
+            @ApiParam(value = "设备编码", required = true) @RequestParam(value = "deviceCode", defaultValue = "") String deviceCode) {
         ObjectMapper objectMapper = new ObjectMapper();
+        ObjectNode jsonNodes = objectMapper.createObjectNode();
+        jsonNodes.put("type", "clear");
         String jsonParams = null;
         try {
-            jsonParams = objectMapper.writeValueAsString(type);
+            jsonParams = objectMapper.writeValueAsString(jsonNodes);
         } catch (JsonProcessingException e) {
-            log.error("JSON序列化失败: {}", e);
+            log.error("JSON序列化失败: {}", e.getMessage());
             return Result.error("请求失败");
         }
         // 创建请求体
         RequestBody body = RequestBody.create(jsonParams, JSON);
         // 构建请求
         Request requestHttp = new Request.Builder()
-                .url("http://172.16.102.52:8016/command/"+deviceCode)
+                .url(BASE_URL + deviceCode)
                 .post(body)
                 .build();
         // 发送请求
@@ -58,39 +81,44 @@ public class TestController {
             if (responseBody != null) {
                 String responseString = responseBody.string();
                 JsonNode rootNode = objectMapper.readTree(responseString);
-                JsonNode success = rootNode.path("success");
-                if("true".equals(success.asText())) {
-                    JsonNode dataNode = rootNode.path("data");
-                    if (dataNode != null) {
-                        return Result.ok(dataNode);
-                    } else {
-                        return Result.ok(null);
-                    }
-                }else {
+                JsonNode success = rootNode.path("_type");
+                if ("success".equals(success.asText())) {
+                    return Result.ok("清屏成功");
+                } else {
                     return Result.error("清屏,清除顶层网页内容失败");
                 }
             }
         } catch (IOException e) {
-            log.error("请求失败: {}", e);
+            log.error("请求失败: {}", e.getMessage());
         }
         return Result.error("请求失败");
     }
+
     @ApiOperation(value = "加载顶层网页")
     @PostMapping("/getTopWebPage")
-    public Result getTopWebPage(TopWebPage request,@ApiParam(value = "设备编码",required = true) @RequestParam(value = "deviceCode",defaultValue = "") String deviceCode) {
+    public Result getTopWebPage(
+            TopWebPage request,
+            @ApiParam(value = "设备编码", required = true) @RequestParam(value = "deviceCode", defaultValue = "") String deviceCode) {
+        if(StrUtil.isBlank(request.getUrl())){
+            return Result.error("url不能为空");
+        }
         ObjectMapper objectMapper = new ObjectMapper();
+        ObjectNode jsonNodes = objectMapper.createObjectNode();
+        jsonNodes.put("type",Optional.ofNullable(request.getType()).orElse("loadUrl"));
+        jsonNodes.put("persistent",Optional.ofNullable(request.getPersistent()).orElse(true));
+        jsonNodes.put("url",request.getUrl());
         String jsonParams = null;
         try {
-            jsonParams = objectMapper.writeValueAsString(request);
+            jsonParams = objectMapper.writeValueAsString(jsonNodes);
         } catch (JsonProcessingException e) {
-            log.error("JSON序列化失败: {}", e);
+            log.error("JSON序列化失败: {}", e.getMessage());
             return Result.error("请求失败");
         }
         // 创建请求体
         RequestBody body = RequestBody.create(jsonParams, JSON);
         // 构建请求
         Request requestHttp = new Request.Builder()
-                .url("http://172.16.102.52:8016/command/"+deviceCode)
+                .url(BASE_URL + deviceCode)
                 .post(body)
                 .build();
         // 发送请求
@@ -102,40 +130,89 @@ public class TestController {
             if (responseBody != null) {
                 String responseString = responseBody.string();
                 JsonNode rootNode = objectMapper.readTree(responseString);
-                JsonNode success = rootNode.path("success");
-                if("true".equals(success.asText())) {
-                    JsonNode dataNode = rootNode.path("data");
-                    if (dataNode != null) {
-                        return Result.ok(dataNode);
-                    } else {
-                        return Result.ok(null);
-                    }
-                }else {
+                JsonNode success = rootNode.path("_type");
+                if ("success".equals(success.asText())) {
+                    return Result.ok("加载顶层网页成功");
+                } else {
                     return Result.error("加载顶层网页失败");
                 }
             }
         } catch (IOException e) {
-            log.error("请求失败: {}", e);
+            log.error("请求失败: {}", e.getMessage());
+        }
+        return Result.error("请求失败");
+    }
+
+    @ApiOperation(value = "开关屏")
+    @PostMapping("/turnOffOrLight")
+    public Result turnOffOrLight(
+            @ApiParam(value = "设备编码", required = true) @RequestParam(value = "deviceCode", defaultValue = "") String deviceCode,
+            @ApiParam(value = "指令", required = true) @RequestParam(value = "cmd") Boolean cmd){
+        if(cmd == null){
+            return Result.error("cmd不能为空");
+        }
+        ObjectMapper objectMapper = new ObjectMapper();
+        ObjectNode jsonNodes = objectMapper.createObjectNode();
+        jsonNodes.put("type","callCardService");
+        jsonNodes.put("fn","setScreenOpen");
+        jsonNodes.put("arg1",cmd);
+        String jsonParams = null;
+        try {
+            jsonParams = objectMapper.writeValueAsString(jsonNodes);
+        } catch (JsonProcessingException e) {
+            log.error("JSON序列化失败: {}", e.getMessage());
+            return Result.error("请求失败");
+        }
+        // 创建请求体
+        RequestBody body = RequestBody.create(jsonParams, JSON);
+        // 构建请求
+        Request requestHttp = new Request.Builder()
+                .url(BASE_URL + deviceCode)
+                .post(body)
+                .build();
+        // 发送请求
+        try (Response response = httpClient.newCall(requestHttp).execute()) {
+            if (!response.isSuccessful()) {
+                return Result.error("请求失败");
+            }
+            ResponseBody responseBody = response.body();
+            if (responseBody != null) {
+                String responseString = responseBody.string();
+                JsonNode rootNode = objectMapper.readTree(responseString);
+                JsonNode success = rootNode.path("_type");
+                if ("success".equals(success.asText())) {
+                    return Result.ok("发送指令成功");
+                } else {
+                    return Result.error("发送指令失败");
+                }
+            }
+        } catch (IOException e) {
+            log.error("请求失败: {}", e.getMessage());
         }
         return Result.error("请求失败");
     }
-    @ApiOperation(value = "滚动文字")
-    @PostMapping("/getInvokeBuild")
-    public Result getInvokeBuild(InvokeBuild request,
-                                 @ApiParam(value = "设备编码",required = true) @RequestParam(value = "deviceCode",defaultValue = "") String deviceCode) {
+
+    @ApiOperation(value = "查询屏幕状态")
+    @PostMapping("/checkScreenState")
+    public Result checkScreenState(
+            @ApiParam(value = "设备编码", required = true) @RequestParam(value = "deviceCode", defaultValue = "") String deviceCode
+    ){
         ObjectMapper objectMapper = new ObjectMapper();
+        ObjectNode jsonNodes = objectMapper.createObjectNode();
+        jsonNodes.put("type","callCardService");
+        jsonNodes.put("fn","isScreenOpen");
         String jsonParams = null;
         try {
-            jsonParams = objectMapper.writeValueAsString(request);
+            jsonParams = objectMapper.writeValueAsString(jsonNodes);
         } catch (JsonProcessingException e) {
-            log.error("JSON序列化失败: {}", e);
+            log.error("JSON序列化失败: {}", e.getMessage());
             return Result.error("请求失败");
         }
         // 创建请求体
         RequestBody body = RequestBody.create(jsonParams, JSON);
         // 构建请求
         Request requestHttp = new Request.Builder()
-                .url("http://172.16.102.52:8016/command/"+deviceCode)
+                .url(BASE_URL + deviceCode)
                 .post(body)
                 .build();
         // 发送请求
@@ -147,21 +224,74 @@ public class TestController {
             if (responseBody != null) {
                 String responseString = responseBody.string();
                 JsonNode rootNode = objectMapper.readTree(responseString);
-                JsonNode success = rootNode.path("success");
-                if("true".equals(success.asText())) {
-                    JsonNode dataNode = rootNode.path("data");
-                    if (dataNode != null) {
-                        return Result.ok(dataNode);
-                    } else {
-                        return Result.ok(null);
-                    }
-                }else {
-                    return Result.error("滚动文字失败");
+                JsonNode success = rootNode.path("_type");
+                if ("success".equals(success.asText())) {
+                    boolean result = rootNode.path("result").asBoolean();
+                    return Result.ok(result);
+                } else {
+                    return Result.error("发送指令失败");
                 }
             }
         } catch (IOException e) {
-            log.error("请求失败: {}", e);
+            log.error("请求失败: {}", e.getMessage());
         }
         return Result.error("请求失败");
     }
+
+    @ApiOperation(value = "添加屏幕控制")
+    @PostMapping("/addScreenControl")
+    public Result addScreenControl(@org.springframework.web.bind.annotation.RequestBody ScreenControl screenControl) {
+        screenControl.setCreateTime(new Date());
+        boolean saved = screenControlService.save(screenControl);
+        if (saved) {
+            return Result.ok("添加成功");
+        } else {
+            return Result.error("添加失败");
+        }
+    }
+
+    @ApiOperation(value = "删除屏幕控制")
+    @DeleteMapping("/deleteScreenControl/{id}")
+    public Result deleteScreenControl(@PathVariable Long id) {
+        boolean deleted = screenControlService.removeById(id);
+        if (deleted) {
+            return Result.ok("删除成功");
+        } else {
+            return Result.error("删除失败");
+        }
+    }
+
+    @ApiOperation(value = "更新屏幕控制")
+    @PutMapping("/updateScreenControl")
+    public Result updateScreenControl(@org.springframework.web.bind.annotation.RequestBody ScreenControl screenControl) {
+        screenControl.setUpdateTime(new Date());
+        boolean updated = screenControlService.updateById(screenControl);
+        if (updated) {
+            return Result.ok("更新成功");
+        } else {
+            return Result.error("更新失败");
+        }
+    }
+
+    @ApiOperation(value = "根据设备id获取屏幕控制")
+    @GetMapping("/getScreenControl/{deviceId}")
+    public Result getScreenControl(@PathVariable String deviceId) {
+        ScreenControl screenControl = screenControlService.getOne(new QueryWrapper<ScreenControl>().eq("device_id", deviceId));
+        if (screenControl != null) {
+            return Result.ok(screenControl);
+        } else {
+            return Result.error("记录不存在");
+        }
+    }
+
+    @ApiOperation(value = "获取全部屏幕控制")
+    @GetMapping("/getAllScreenControl")
+    public Result getAllScreenControl() {
+        List<ScreenControl> screenControls = screenControlService.list();
+        if (screenControls != null) {
+            return Result.ok(screenControls);
+        } else {
+            return Result.error("记录不存在");
+        }
+    }
 }

+ 101 - 0
screen-service/src/main/java/com/zksy/screen/domain/po/ScreenControl.java

@@ -0,0 +1,101 @@
+package com.zksy.screen.domain.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 大屏控制
+ * @TableName screen_control
+ */
+@TableName(value ="screen_control")
+@Data
+public class ScreenControl implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 资源路径
+     */
+    private String url;
+
+    /**
+     * 设备id
+     */
+    private String deviceId;
+
+    /**
+     * 状态 1-图片 2-视频
+     */
+    private Integer state;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        ScreenControl other = (ScreenControl) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getUrl() == null ? other.getUrl() == null : this.getUrl().equals(other.getUrl()))
+            && (this.getDeviceId() == null ? other.getDeviceId() == null : this.getDeviceId().equals(other.getDeviceId()))
+            && (this.getState() == null ? other.getState() == null : this.getState().equals(other.getState()))
+            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))
+            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getUrl() == null) ? 0 : getUrl().hashCode());
+        result = prime * result + ((getDeviceId() == null) ? 0 : getDeviceId().hashCode());
+        result = prime * result + ((getState() == null) ? 0 : getState().hashCode());
+        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
+        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", url=").append(url);
+        sb.append(", deviceId=").append(deviceId);
+        sb.append(", state=").append(state);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 18 - 0
screen-service/src/main/java/com/zksy/screen/mapper/ScreenControlMapper.java

@@ -0,0 +1,18 @@
+package com.zksy.screen.mapper;
+
+import com.zksy.screen.domain.po.ScreenControl;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author hxb
+* @description 针对表【screen_control(大屏控制)】的数据库操作Mapper
+* @createDate 2025-02-19 14:51:45
+* @Entity com.zksy.screen.domain.po.ScreenControl
+*/
+public interface ScreenControlMapper extends BaseMapper<ScreenControl> {
+
+}
+
+
+
+

+ 13 - 0
screen-service/src/main/java/com/zksy/screen/service/ScreenControlService.java

@@ -0,0 +1,13 @@
+package com.zksy.screen.service;
+
+import com.zksy.screen.domain.po.ScreenControl;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author hxb
+* @description 针对表【screen_control(大屏控制)】的数据库操作Service
+* @createDate 2025-02-19 14:51:45
+*/
+public interface ScreenControlService extends IService<ScreenControl> {
+
+}

+ 22 - 0
screen-service/src/main/java/com/zksy/screen/service/impl/ScreenControlServiceImpl.java

@@ -0,0 +1,22 @@
+package com.zksy.screen.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.screen.domain.po.ScreenControl;
+import com.zksy.screen.service.ScreenControlService;
+import com.zksy.screen.mapper.ScreenControlMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author hxb
+* @description 针对表【screen_control(大屏控制)】的数据库操作Service实现
+* @createDate 2025-02-19 14:51:45
+*/
+@Service
+public class ScreenControlServiceImpl extends ServiceImpl<ScreenControlMapper, ScreenControl>
+    implements ScreenControlService{
+
+}
+
+
+
+

+ 7 - 1
screen-service/src/main/resources/application-dev.yaml

@@ -14,4 +14,10 @@ spring:
       discovery:
         server-addr: 192.168.110.30:8848
       config:
-        server-addr: 192.168.110.30:8848
+        server-addr: 192.168.110.30:8848
+minio:
+  endpoint: http://192.168.110.30:9000
+  accessKey: minio
+  secretKey: minio123
+  bucket: zksy-file
+  readPath: http://192.168.110.30:9000/

+ 7 - 1
screen-service/src/main/resources/application-prod.yaml

@@ -8,4 +8,10 @@ zksy:
 spring:
   redis:
     host: 172.16.102.52
-    port: 6379
+    port: 6379
+minio:
+  endpoint: http://172.16.102.52:9000
+  accessKey: minio
+  secretKey: minio123
+  bucket: test
+  readPath: http://172.16.102.52:9000/

+ 20 - 0
screen-service/src/main/resources/mapper/ScreenControlMapper.xml

@@ -0,0 +1,20 @@
+<?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="com.zksy.screen.mapper.ScreenControlMapper">
+
+    <resultMap id="BaseResultMap" type="com.zksy.screen.domain.po.ScreenControl">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="url" column="url" jdbcType="VARCHAR"/>
+            <result property="deviceId" column="device_id" jdbcType="VARCHAR"/>
+            <result property="state" column="state" jdbcType="TINYINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,url,device_id,
+        state,create_time,update_time
+    </sql>
+</mapper>