diff --git a/src/main/java/com/dpkj/common/dto/LexMarkDTO.java b/src/main/java/com/dpkj/common/dto/LexMarkDTO.java
new file mode 100644
index 0000000..5bc292a
--- /dev/null
+++ b/src/main/java/com/dpkj/common/dto/LexMarkDTO.java
@@ -0,0 +1,63 @@
+package com.dpkj.common.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * 利盟请求参数DTO
+ *
+ * @author 石头人
+ * @version 1.0
+ * @since 2025-02-08 10:46:44
+ */
+@Data
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+public class LexMarkDTO implements Serializable {
+
+ /**
+ * 默认异步
+ * 0:代表同步,1:代表异步,3:代表属性
+ */
+ private Integer methodType = 1;
+
+ /**
+ * 默认:com.gwi.device
+ * 插件名称:如果是设备调用,则固定填写com.gwi.device;如果是插件调用,此处填
+ * 写插件动态库文件名(去掉文件名前面的lib和文件后缀名,如:GWI_Plugin)
+ */
+ private String pluginName = "com.gwi.device";
+
+ /**
+ * 固定填写execute
+ */
+ private String pluginMethod = "execute";
+
+ /**
+ * 设备名。如果是设备调用,则填写设备名称,需要和SP服务配置中的 DevList.ini 配置的设备名称一致;
+ * 如果是插件调用,可忽略此参数
+ */
+ private String devName;
+
+ /**
+ * 调用id,应用生成,用于区分不同的调用
+ */
+ private Integer callID;
+
+ /**
+ * 调用的函数名称,设备执行的动作名称,简称动作名
+ */
+ private String actionName;
+
+ /**
+ * 设备执行的输入参数,格式为json字符串(注意,此处为字符串,不是json对象)
+ */
+ private String param;
+
+}
+
diff --git a/src/main/java/com/dpkj/common/dto/LexMarkResultDTO.java b/src/main/java/com/dpkj/common/dto/LexMarkResultDTO.java
new file mode 100644
index 0000000..9f84919
--- /dev/null
+++ b/src/main/java/com/dpkj/common/dto/LexMarkResultDTO.java
@@ -0,0 +1,101 @@
+package com.dpkj.common.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * 利盟接口返回值DTO
+ *
+ * @author 石头人
+ * @version 1.0
+ * @since 2025-02-08 11:03:06
+ */
+@Data
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+public class LexMarkResultDTO implements Serializable {
+
+
+ /**
+ * 对应发送请求中的devName
+ */
+ private String devName;
+
+ /**
+ * 事件名,由发送请求中的actionName+Over组成。
+ */
+ private String msgName;
+
+ /**
+ * 对应发送请求的callID。
+ */
+ private int callID;
+
+ /**
+ * 错误码:0表示成功;其他表示失败,比如-4表示取消,-48表示超时,-14表示硬件故障
+ */
+ private int result;
+
+ /**
+ * 发送请求中的actionName
+ */
+ private String cmdName;
+
+ /**
+ * 返回参数
+ */
+ private Param param;
+
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class Param { // 不同的actionName导致返回值不同,需要的参数可以加上
+
+ /**
+ * 请求ID
+ */
+ private int RequestID;
+
+ /**
+ * 命令编码
+ */
+ private int dwCommandCode;
+
+ /**
+ * 事件名,由发送请求中的actionName+Over组成。
+ */
+ private String eventName;
+
+ /**
+ * 事件类型编码
+ */
+ private int eventType;
+
+ /**
+ * 服务
+ */
+ private int hService;
+
+ /**
+ * 对应发送请求中的devName
+ */
+ private String cmdName;
+
+ /**
+ * 错误码:0表示成功;其他表示失败,比如-4表示取消,-48表示超时,-14表示硬件故障
+ */
+ private int result;
+
+ /**
+ * 详情描述
+ */
+ private String desc;
+ }
+}
+
diff --git a/src/main/java/com/dpkj/common/utils/TemplateUtils.java b/src/main/java/com/dpkj/common/utils/TemplateUtils.java
index a70d93e..2aba8ee 100644
--- a/src/main/java/com/dpkj/common/utils/TemplateUtils.java
+++ b/src/main/java/com/dpkj/common/utils/TemplateUtils.java
@@ -63,7 +63,7 @@ public class TemplateUtils {
* @param saveDir 图片的保存路径,如果为空,那么不进行图片的保存
* @return 图片字节数组
*/
- public byte[] generateReceiptImage(JSONObject data, String template, int width, int height, String saveDir) {
+ public byte[] generateReceiptImage(JSONObject data, String template, int width, int height, StringBuilder saveDir) {
try {
// 获取模板上下文
Context context = this.getContext(data);
@@ -90,11 +90,12 @@ public class TemplateUtils {
BufferedImage image = this.generate(html, width, height);
// 保存图片
- if (saveDir != null && !"".equals(saveDir)) {
- String outputPath = saveDir + "\\genera_image_" + System.currentTimeMillis() + ".png";
+ if (saveDir != null && !"".equals(saveDir.toString())) {
+ String outputPath = saveDir.toString() + "\\genera_image_" + System.currentTimeMillis() + ".png";
ImageIO.write(image, "PNG", new File(outputPath));
+ saveDir.reverse();
+ saveDir.append(outputPath);
}
-
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ImageIO.write(image, "PNG", byteOutputStream);
return byteOutputStream.toByteArray();
@@ -134,19 +135,21 @@ public class TemplateUtils {
private Context getContext(JSONObject data) {
// 创建Thymeleaf上下文
Context context = new Context();
- Set keys = data.keySet();
- for (String key : keys) {
- // 判单是否有图片生成,统一后面采用的是_2base64Type
- String[] split = key.split("_");
- if (split.length > 1 && split[1].equals("2base64Type")) {
- int width = split.length > 2 ? Integer.parseInt(split[2]) : 100;
- int height = split.length > 3 ? Integer.parseInt(split[3]) : 100;
- // 如果是图片类型,需要进行base64转换
- String base64 = this.generateQRCode(String.valueOf(data.get(key)), width, height);
- context.setVariable(split[0], "data:image/jpeg;base64," + base64);
- } else {
- // 普通字段直接设置
- context.setVariable(key, data.get(key));
+ if ( data != null) {
+ Set keys = data.keySet();
+ for (String key : keys) {
+ // 判单是否有图片生成,统一后面采用的是_2base64Type
+ String[] split = key.split("_");
+ if (split.length > 1 && split[1].equals("2base64Type")) {
+ int width = split.length > 2 ? Integer.parseInt(split[2]) : 100;
+ int height = split.length > 3 ? Integer.parseInt(split[3]) : 100;
+ // 如果是图片类型,需要进行base64转换
+ String base64 = this.generateQRCode(String.valueOf(data.get(key)), width, height);
+ context.setVariable(split[0], "data:image/jpeg;base64," + base64);
+ } else {
+ // 普通字段直接设置
+ context.setVariable(key, data.get(key));
+ }
}
}
diff --git a/src/main/java/com/dpkj/common/utils/ThirdService.java b/src/main/java/com/dpkj/common/utils/ThirdService.java
new file mode 100644
index 0000000..510193f
--- /dev/null
+++ b/src/main/java/com/dpkj/common/utils/ThirdService.java
@@ -0,0 +1,80 @@
+package com.dpkj.common.utils;
+
+import com.dpkj.common.dto.LexMarkDTO;
+import com.dpkj.common.dto.LexMarkResultDTO;
+import com.dpkj.common.exception.RRException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 第三方服务,主要是调用打印机等
+ *
+ * @author 石头人
+ * @version 1.0
+ * @since 2025-02-08 10:45:01
+ */
+@Slf4j
+@Component
+public class ThirdService {
+
+ @Value("${app.custom.lexMarkServiceIp}")
+ private String lexMarkServiceIp;
+ @Value("${app.custom.lexMarkServicePort}")
+ private String lexMarkServicePort;
+
+ /**
+ * 利盟台式机-立体机 接口请求
+ * @param lexMarkDTO 请求DTO
+ * @return result
+ */
+ public LexMarkResultDTO callDevice(LexMarkDTO lexMarkDTO) {
+ try {
+ URL url = new URL(lexMarkServiceIp + ":" + lexMarkServicePort + "/CallDevice");
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setRequestMethod("POST");
+ connection.setDoOutput(true);
+ connection.setRequestProperty("Content - Type", "application/json");
+
+ // 将LexMarkDTO对象转换为JSON字符串
+ ObjectMapper objectMapper = new ObjectMapper();
+ String jsonInputString = objectMapper.writeValueAsString(lexMarkDTO);
+
+ try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) {
+ byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
+ wr.write(input, 0, input.length);
+ }
+
+ int responseCode = connection.getResponseCode();
+ if (responseCode!= HttpURLConnection.HTTP_OK) {
+ log.error("利盟服务请求失败,响应码:{},请求参数:{}", responseCode, lexMarkDTO);
+ throw new RRException("利盟服务请求失败,响应码:" + responseCode);
+ }
+
+ BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+ String inputLine;
+ StringBuilder response = new StringBuilder();
+ while ((inputLine = in.readLine())!= null) {
+ response.append(inputLine);
+ }
+ in.close();
+
+ // 将响应JSON字符串转换为LexMarkResultDTO对象
+ ObjectMapper resultMapper = new ObjectMapper();
+ return resultMapper.readValue(response.toString(), LexMarkResultDTO.class);
+ }catch (Exception e){
+ log.error("利盟服务请求失败:{}", lexMarkDTO, e);
+ throw new RRException("利盟服务请求失败");
+ }
+ }
+
+}
+
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 0fc081b..df769d9 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -25,3 +25,12 @@ server:
enabled: true
min-response-size: 1024
mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*
+
+
+# 自定义app参数
+app:
+ custom:
+ lexMarkServiceIp: http://127.0.0.1
+ lexMarkServicePort: 12346
+
+