Commit a7f70342190b4edbb45ac43c811bc6c7955b2a0c

Authored by xp.Huang
2 parents 267b5ff5 45fed0b1

Merge branch 'fix_webcam' into 'master_dev'

Fix webcam

See merge request yunteng/thingskit!398
@@ -3,6 +3,9 @@ package org.thingsboard.server.controller.yunteng; @@ -3,6 +3,9 @@ package org.thingsboard.server.controller.yunteng;
3 import org.springframework.http.ResponseEntity; 3 import org.springframework.http.ResponseEntity;
4 import org.springframework.web.bind.annotation.*; 4 import org.springframework.web.bind.annotation.*;
5 import org.springframework.web.multipart.MultipartFile; 5 import org.springframework.web.multipart.MultipartFile;
  6 +import org.thingsboard.server.common.data.StringUtils;
  7 +import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException;
  8 +import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
6 import org.thingsboard.server.common.data.yunteng.core.utils.FileStorageService; 9 import org.thingsboard.server.common.data.yunteng.core.utils.FileStorageService;
7 import org.thingsboard.server.common.data.yunteng.dto.FileUploadResponse; 10 import org.thingsboard.server.common.data.yunteng.dto.FileUploadResponse;
8 11
@@ -29,4 +32,11 @@ public class TkOssFileController { @@ -29,4 +32,11 @@ public class TkOssFileController {
29 @PathVariable String fileName, HttpServletRequest request, HttpServletResponse response) { 32 @PathVariable String fileName, HttpServletRequest request, HttpServletResponse response) {
30 return fileStorageService.download(fileName, request, response); 33 return fileStorageService.download(fileName, request, response);
31 } 34 }
  35 + @DeleteMapping
  36 + public ResponseEntity<Boolean> deleteFile(@RequestParam("deleteFilePath") String deleteFilePath){
  37 + if(StringUtils.isEmpty(deleteFilePath)){
  38 + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
  39 + }
  40 + return ResponseEntity.ok(fileStorageService.deleteFile(deleteFilePath));
  41 + }
32 } 42 }
@@ -28,4 +28,6 @@ public interface FileStorageService { @@ -28,4 +28,6 @@ public interface FileStorageService {
28 String fileName, HttpServletRequest request, HttpServletResponse response); 28 String fileName, HttpServletRequest request, HttpServletResponse response);
29 29
30 String uploadFile(String fileName, String contentType, InputStream inputStream) throws Exception; 30 String uploadFile(String fileName, String contentType, InputStream inputStream) throws Exception;
  31 +
  32 + boolean deleteFile(String deleteFilePath);
31 } 33 }
@@ -131,6 +131,12 @@ public class LocalFileStorageService implements FileStorageService { @@ -131,6 +131,12 @@ public class LocalFileStorageService implements FileStorageService {
131 return ossStaticPath; 131 return ossStaticPath;
132 } 132 }
133 133
  134 + @Override
  135 + public boolean deleteFile(String deleteFilePath) {
  136 + //TODO delete local file or delete datafile
  137 + return false;
  138 + }
  139 +
134 private String storeFileByInputStream(String fileName, InputStream inputStream) 140 private String storeFileByInputStream(String fileName, InputStream inputStream)
135 throws IOException { 141 throws IOException {
136 // random fileName if needed 142 // random fileName if needed
@@ -16,6 +16,7 @@ import org.springframework.util.StringUtils; @@ -16,6 +16,7 @@ import org.springframework.util.StringUtils;
16 import org.springframework.web.context.request.RequestContextHolder; 16 import org.springframework.web.context.request.RequestContextHolder;
17 import org.springframework.web.context.request.ServletRequestAttributes; 17 import org.springframework.web.context.request.ServletRequestAttributes;
18 import org.springframework.web.multipart.MultipartFile; 18 import org.springframework.web.multipart.MultipartFile;
  19 +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
19 import org.thingsboard.server.common.data.yunteng.core.exception.FileStorageException; 20 import org.thingsboard.server.common.data.yunteng.core.exception.FileStorageException;
20 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; 21 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException;
21 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; 22 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
@@ -173,6 +174,25 @@ public class MinioFileStorageService implements FileStorageService { @@ -173,6 +174,25 @@ public class MinioFileStorageService implements FileStorageService {
173 } 174 }
174 } 175 }
175 176
  177 + @Override
  178 + public boolean deleteFile(String deleteFilePath) {
  179 + boolean result =false;
  180 + try{
  181 + String bucketName = fileStorageProperties.getBucketName();
  182 + int one = FastIotConstants.MagicNumber.ONE;
  183 + String[] split = deleteFilePath.split(bucketName + "/");
  184 + if(split.length>one){
  185 + deleteFilePath = split[one];
  186 + }
  187 + minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName)
  188 + .object(deleteFilePath).build());
  189 + result = true;
  190 + }catch (Exception e){
  191 + log.error("文件删除失败:{}",deleteFilePath);
  192 + }
  193 + return result;
  194 + }
  195 +
176 private void checkBucket() 196 private void checkBucket()
177 throws ServerException, InsufficientDataException, ErrorResponseException, IOException, 197 throws ServerException, InsufficientDataException, ErrorResponseException, IOException,
178 NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, 198 NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException,
@@ -16,7 +16,8 @@ public class TkDataViewContentInfoDTO { @@ -16,7 +16,8 @@ public class TkDataViewContentInfoDTO {
16 private Integer state; 16 private Integer state;
17 @ApiModelProperty(value = "组织ID") 17 @ApiModelProperty(value = "组织ID")
18 private String organizationId; 18 private String organizationId;
19 - 19 + @ApiModelProperty(value = "缩略图")
  20 + private String thumbnail;
20 @ApiModelProperty(value = "大屏内容",required = true) 21 @ApiModelProperty(value = "大屏内容",required = true)
21 private TkDataViewContentDTO dataViewContent; 22 private TkDataViewContentDTO dataViewContent;
22 } 23 }
1 package org.thingsboard.server.common.data.yunteng.utils; 1 package org.thingsboard.server.common.data.yunteng.utils;
2 2
  3 +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
3 import org.thingsboard.server.common.data.yunteng.enums.AttributeSourceDataTypeEnum; 4 import org.thingsboard.server.common.data.yunteng.enums.AttributeSourceDataTypeEnum;
4 import org.thingsboard.server.common.data.yunteng.enums.HexByteOrderEnum; 5 import org.thingsboard.server.common.data.yunteng.enums.HexByteOrderEnum;
5 import java.nio.ByteOrder; 6 import java.nio.ByteOrder;
@@ -252,7 +253,11 @@ public class HexConvertUtils { @@ -252,7 +253,11 @@ public class HexConvertUtils {
252 case INT16_BA: 253 case INT16_BA:
253 case UINT16_BA: 254 case UINT16_BA:
254 hex = convertHexOrder(hex, dataTypeEnum); 255 hex = convertHexOrder(hex, dataTypeEnum);
255 - value = intFormat.format(int16OrUint16ToShort(hex) * scaleFactor); 256 + if((int16OrUint16ToShort(hex) * scaleFactor) % 1 == FastIotConstants.MagicNumber.ZERO){
  257 + value = int16OrUint16ToShort(hex);
  258 + }else{
  259 + value = intFormat.format(int16OrUint16ToShort(hex) * scaleFactor);
  260 + }
256 break; 261 break;
257 case INT32_AB_CD: 262 case INT32_AB_CD:
258 case UINT32_AB_CD: 263 case UINT32_AB_CD:
@@ -13,6 +13,7 @@ import org.apache.commons.lang3.StringUtils; @@ -13,6 +13,7 @@ import org.apache.commons.lang3.StringUtils;
13 import org.thingsboard.common.util.JacksonUtil; 13 import org.thingsboard.common.util.JacksonUtil;
14 import org.thingsboard.server.common.adaptor.AdaptorException; 14 import org.thingsboard.server.common.adaptor.AdaptorException;
15 import org.thingsboard.server.common.data.DataConstants; 15 import org.thingsboard.server.common.data.DataConstants;
  16 +import org.thingsboard.server.common.data.Device;
16 import org.thingsboard.server.common.data.DeviceProfile; 17 import org.thingsboard.server.common.data.DeviceProfile;
17 import org.thingsboard.server.common.data.DeviceTransportType; 18 import org.thingsboard.server.common.data.DeviceTransportType;
18 import org.thingsboard.server.common.data.device.profile.TkTcpDeviceProfileTransportConfiguration; 19 import org.thingsboard.server.common.data.device.profile.TkTcpDeviceProfileTransportConfiguration;
@@ -138,7 +139,6 @@ public class TcpUdpDataHandler implements SessionMsgListener { @@ -138,7 +139,6 @@ public class TcpUdpDataHandler implements SessionMsgListener {
138 } 139 }
139 deviceSessionCtx.tryProcessQueuedMsgs(msg -> processDeviceSessionMsg(ctx, msg)); 140 deviceSessionCtx.tryProcessQueuedMsgs(msg -> processDeviceSessionMsg(ctx, msg));
140 } 141 }
141 -  
142 private void processAuthTokenConnect(ChannelHandlerContext ctx, TcpAuthEntry accessToken) { 142 private void processAuthTokenConnect(ChannelHandlerContext ctx, TcpAuthEntry accessToken) {
143 143
144 log.debug( 144 log.debug(
@@ -519,6 +519,20 @@ public class TcpUdpDataHandler implements SessionMsgListener { @@ -519,6 +519,20 @@ public class TcpUdpDataHandler implements SessionMsgListener {
519 } 519 }
520 520
521 @Override 521 @Override
  522 + public void onDeviceProfileUpdate(
  523 + TransportProtos.SessionInfoProto sessionInfo, DeviceProfile deviceProfile) {
  524 + deviceSessionCtx.onDeviceProfileUpdate(sessionInfo, deviceProfile);
  525 + }
  526 +
  527 + @Override
  528 + public void onDeviceUpdate(
  529 + TransportProtos.SessionInfoProto sessionInfo,
  530 + Device device,
  531 + Optional<DeviceProfile> deviceProfileOpt) {
  532 + deviceSessionCtx.onDeviceUpdate(sessionInfo, device, deviceProfileOpt);
  533 + deviceSessionCtx.setDeviceCode(JacksonUtil.toString(device.getAdditionalInfo()));
  534 + }
  535 + @Override
522 public void onDeviceDeleted(DeviceId deviceId) { 536 public void onDeviceDeleted(DeviceId deviceId) {
523 context.onAuthFailure(address); 537 context.onAuthFailure(address);
524 if (isTcp) { 538 if (isTcp) {
@@ -24,6 +24,7 @@ @@ -24,6 +24,7 @@
24 24
25 <resultMap id="dataViewInfoMap" 25 <resultMap id="dataViewInfoMap"
26 type="org.thingsboard.server.common.data.yunteng.dto.request.TkDataViewContentInfoDTO"> 26 type="org.thingsboard.server.common.data.yunteng.dto.request.TkDataViewContentInfoDTO">
  27 + <result property="thumbnail" column="thumbnail"/>
27 <result property="dataViewId" column="id"/> 28 <result property="dataViewId" column="id"/>
28 <result property="dataViewName" column="name"/> 29 <result property="dataViewName" column="name"/>
29 <result property="state" column="state"/> 30 <result property="state" column="state"/>
@@ -61,7 +62,7 @@ @@ -61,7 +62,7 @@
61 </select> 62 </select>
62 63
63 <select id="getDataViewInfoById" resultMap="dataViewInfoMap"> 64 <select id="getDataViewInfoById" resultMap="dataViewInfoMap">
64 - SELECT icc.id,icc.name,icc.state,icc.organization_id,icc.thumbnail,icct.id AS content_id,icct.content FROM tk_data_view icc LEFT JOIN 65 + SELECT icc.id,icc.thumbnail,icc.name,icc.state,icc.organization_id,icc.thumbnail,icct.id AS content_id,icct.content FROM tk_data_view icc LEFT JOIN
65 tk_data_view_content icct ON icc.id = icct.view_id 66 tk_data_view_content icct ON icc.id = icct.view_id
66 WHERE icc.id = #{id} AND icc.tenant_id = #{tenantId} 67 WHERE icc.id = #{id} AND icc.tenant_id = #{tenantId}
67 </select> 68 </select>