|
|
@@ -1,44 +1,42 @@
|
|
|
package org.dromara.server.hik.controller;
|
|
|
|
|
|
import cn.dev33.satoken.annotation.SaIgnore;
|
|
|
-import cn.hutool.core.collection.CollectionUtil;
|
|
|
-import cn.hutool.json.JSONObject;
|
|
|
-import cn.hutool.json.JSONUtil;
|
|
|
-import io.undertow.servlet.spec.PartImpl;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
import jakarta.servlet.http.HttpServletRequest;
|
|
|
-import jakarta.servlet.http.HttpServletResponse;
|
|
|
import jakarta.servlet.http.Part;
|
|
|
-import jodd.util.StringUtil;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.apache.commons.fileupload.FileItemFactory;
|
|
|
-import org.apache.commons.fileupload.disk.DiskFileItemFactory;
|
|
|
-import org.apache.commons.fileupload.servlet.ServletFileUpload;
|
|
|
-import org.apache.commons.io.FileUtils;
|
|
|
import org.apache.commons.io.IOUtils;
|
|
|
+import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
import org.dromara.common.core.domain.R;
|
|
|
-import org.dromara.common.core.utils.StringUtils;
|
|
|
+import org.dromara.common.core.domain.model.ErrorInfo;
|
|
|
+import org.dromara.common.core.domain.model.ErrorResult;
|
|
|
+import org.dromara.common.core.enums.CreditTypeEnum;
|
|
|
+import org.dromara.consume.api.RemoteConsumeService;
|
|
|
+import org.dromara.consume.api.domain.bo.RemoteConsumeBo;
|
|
|
+import org.dromara.consume.api.domain.bo.RemoteResultDto;
|
|
|
import org.dromara.server.hik.domain.dto.DeviceDto;
|
|
|
import org.dromara.server.hik.domain.dto.QueryDto;
|
|
|
import org.dromara.server.hik.domain.dto.UploadEmpDto;
|
|
|
import org.dromara.server.hik.event.EventHandleRouter;
|
|
|
import org.dromara.server.hik.event.domain.FileContent;
|
|
|
import org.dromara.server.hik.service.ISendDeviceService;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.http.HttpStatus;
|
|
|
+import org.springframework.http.ResponseEntity;
|
|
|
import org.springframework.util.StreamUtils;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
-import org.springframework.web.multipart.MultipartHttpServletRequest;
|
|
|
-import org.springframework.web.multipart.MultipartResolver;
|
|
|
-import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
|
|
|
|
|
|
import java.io.BufferedReader;
|
|
|
-import java.io.File;
|
|
|
import java.io.IOException;
|
|
|
import java.io.InputStream;
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.nio.charset.Charset;
|
|
|
-import java.nio.file.Path;
|
|
|
-import java.util.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* 海康消费机
|
|
|
@@ -61,6 +59,9 @@ public class TestController {
|
|
|
|
|
|
private final EventHandleRouter eventHandleRouter;
|
|
|
|
|
|
+ @DubboReference
|
|
|
+ private final RemoteConsumeService remoteConsumeService;
|
|
|
+
|
|
|
//region 设备监听相关
|
|
|
/**
|
|
|
* 设置指定设备监听服务地址
|
|
|
@@ -232,6 +233,7 @@ public class TestController {
|
|
|
return sendDeviceService.upLoadEmpToDevice();
|
|
|
}
|
|
|
//endregion
|
|
|
+
|
|
|
/**
|
|
|
* 删除指定设备上某个用户的所有卡片信息。
|
|
|
* <p>
|
|
|
@@ -246,6 +248,18 @@ public class TestController {
|
|
|
return sendDeviceService.deleteAllCardByUserNo(device,userNo);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 接收并处理发送到服务器的设备推送数据。
|
|
|
+ * 该方法处理不同类型的 content,包括 multipart/form-data 和 application/json。
|
|
|
+ * 对于 multipart/form-data,它分别处理 JSON 和 image/jpeg 部分。
|
|
|
+ * 对于 application/json,它直接处理 JSON 负载。
|
|
|
+ * 如果内容类型不受支持,则记录警告并返回 null。
|
|
|
+ *
|
|
|
+ * @param request 包含传入数据和元数据的 HttpServletRequest 对象。
|
|
|
+ * 它必须包含适合处理的内容类型和有效负载。
|
|
|
+ * @return 一个包含由 eventHandleRouter 路由的处理数据的 Map<String, Object>。
|
|
|
+ * 如果在处理过程中发生错误或内容类型不受支持,则返回 null。
|
|
|
+ */
|
|
|
@PostMapping(("/info"))
|
|
|
public Map<String, Object> receiveDevicePushData(HttpServletRequest request) throws IOException {
|
|
|
try {
|
|
|
@@ -317,8 +331,88 @@ public class TestController {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- // 处理 JSON 请求
|
|
|
+ /**
|
|
|
+ * 根据提供的消费信息处理海康消费机的消费请求。
|
|
|
+ * 该方法处理传入的请求,验证消费详情,
|
|
|
+ * 并执行必要的操作以完成消费请求。
|
|
|
+ *
|
|
|
+ * @param mapConsumeInfo 包含消费详细信息的键值对的 Map
|
|
|
+ * @return 表示消费请求处理结果的 Object
|
|
|
+ */
|
|
|
+ @PostMapping("/requestConsume")
|
|
|
+ public Object requestConsume(@RequestBody Map<String, Object> mapConsumeInfo) {
|
|
|
+ RemoteConsumeBo remoteBo = new RemoteConsumeBo();
|
|
|
+ if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("userNo"))){
|
|
|
+ remoteBo.setUserNo(Long.valueOf(mapConsumeInfo.get("userNo").toString()));
|
|
|
+ }
|
|
|
+ if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("factoryId"))){
|
|
|
+ remoteBo.setFactoryId(Long.valueOf(mapConsumeInfo.get("factoryId").toString()));
|
|
|
+ } else {
|
|
|
+ remoteBo.setFactoryId(0L);
|
|
|
+ }
|
|
|
+ if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("consumeDate"))){
|
|
|
+ remoteBo.setConsumeDate(DateUtil.parseDateTime(mapConsumeInfo.get("consumeDate").toString()));
|
|
|
+ }
|
|
|
+ if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("termRecordId"))){
|
|
|
+ remoteBo.setTermRecordId(Long.valueOf(mapConsumeInfo.get("termRecordId").toString()));
|
|
|
+ }
|
|
|
+ if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("consumeMoney"))){
|
|
|
+ remoteBo.setConsumeMoney(new BigDecimal(mapConsumeInfo.get("consumeMoney").toString()));
|
|
|
+ }
|
|
|
+ if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("termMac"))){
|
|
|
+ remoteBo.setTermMac(mapConsumeInfo.get("termMac").toString());
|
|
|
+ }
|
|
|
+ remoteBo.setCardNo(0L);
|
|
|
+ remoteBo.setStatusFlag(4);
|
|
|
+ remoteBo.setCreditType(CreditTypeEnum.TERM_CONSUME.code());
|
|
|
+
|
|
|
+ RemoteResultDto result = remoteConsumeService.dealHikRequestConsume(remoteBo);
|
|
|
+ R<ErrorInfo> errorInfo = result.getErrorInfo();
|
|
|
+ if (R.isError(errorInfo)) {
|
|
|
+ ErrorResult errResult = new ErrorResult();
|
|
|
+ errResult.setStatusCode(HttpStatus.NOT_FOUND.value());
|
|
|
+ errResult.setMessage(errorInfo.getMsg());
|
|
|
+ errResult.getErrors().add(errorInfo.getData());
|
|
|
+ return new ResponseEntity<Object>(errResult, null, HttpStatus.NOT_FOUND);
|
|
|
+ }
|
|
|
+ // if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("qrCode"))){
|
|
|
+ // remoteBo.setUserNo(Long.valueOf(mapConsumeInfo.get("qrCode").toString()));
|
|
|
+ // }
|
|
|
+ return result.getUpdatedRemoteBo();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将消费记录上传到服务器。
|
|
|
+ *
|
|
|
+ * @param mapConsumeInfo 包含要上传的消费信息的 Map。
|
|
|
+ * 键表示字段名称,值表示相应的数据。
|
|
|
+ * @return 表示上传操作结果的 Object。
|
|
|
+ * 这可能是成功消息、错误详情或其他相关信息。
|
|
|
+ */
|
|
|
+ @PostMapping("/uploadRecord")
|
|
|
+ public Object uploadConsumeRecord(@RequestBody Map<String, Object> mapConsumeInfo) {
|
|
|
+
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将离线记录上传到服务器。
|
|
|
+ * 该方法处理提供的消费信息并负责上传过程。
|
|
|
+ *
|
|
|
+ * @param mapConsumeInfo 包含要上传的消费信息的 Map
|
|
|
+ * @return 表示上传操作结果的 Object
|
|
|
+ */
|
|
|
+ @PostMapping("/offlineRecord")
|
|
|
+ public Object uploadOfflineRecord(@RequestBody Map<String, Object> mapConsumeInfo) {
|
|
|
+
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理 JSON 请求
|
|
|
private String handleJsonRequest(HttpServletRequest request) throws IOException {
|
|
|
+
|
|
|
if (request.getContentType() != null
|
|
|
&& request.getContentType().contains("application/json")) {
|
|
|
|
|
|
@@ -331,9 +425,9 @@ public class TestController {
|
|
|
|
|
|
return requestData.toString();
|
|
|
// 使用任意 JSON 库解析
|
|
|
-// JSONObject jsonObject = JSONUtil.parseObj(requestData.toString());
|
|
|
-// System.out.println("收到 JSON 数据:");
|
|
|
-// System.out.println(jsonObject.toString());
|
|
|
+ // JSONObject jsonObject = JSONUtil.parseObj(requestData.toString());
|
|
|
+ // System.out.println("收到 JSON 数据:");
|
|
|
+ // System.out.println(jsonObject.toString());
|
|
|
}
|
|
|
}
|
|
|
return null;
|