diff --git a/pom.xml b/pom.xml
index abd3fe7..c2d3919 100644
--- a/pom.xml
+++ b/pom.xml
@@ -94,7 +94,7 @@
com.alibaba
fastjson
- 1.2.83
+ 2.0.57
@@ -179,7 +179,6 @@
itext-asian
5.2.0
-
diff --git a/src/main/java/com/dpkj/common/dto/LexMarkResultDTO.java b/src/main/java/com/dpkj/common/dto/LexMarkResultDTO.java
index 9ebd3a8..6b0906e 100644
--- a/src/main/java/com/dpkj/common/dto/LexMarkResultDTO.java
+++ b/src/main/java/com/dpkj/common/dto/LexMarkResultDTO.java
@@ -1,10 +1,8 @@
package com.dpkj.common.dto;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import lombok.AllArgsConstructor;
import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.ToString;
+import lombok.experimental.Accessors;
import java.io.Serializable;
@@ -16,10 +14,9 @@ import java.io.Serializable;
* @since 2025-02-08 11:03:06
*/
@Data
-@ToString
-@AllArgsConstructor
-@NoArgsConstructor
-public class LexMarkResultDTO implements Serializable {
+@Accessors(chain = true)
+public class LexMarkResultDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
/**
@@ -35,12 +32,12 @@ public class LexMarkResultDTO implements Serializable {
/**
* 对应发送请求的callID。
*/
- private int callID;
+ private Integer callID;
/**
* 错误码:0表示成功;其他表示失败,比如-4表示取消,-48表示超时,-14表示硬件故障
*/
- private int result;
+ private Integer result;
/**
* 发送请求中的actionName
@@ -63,53 +60,5 @@ public class LexMarkResultDTO implements Serializable {
*/
private T data;
-
- @Data
- @AllArgsConstructor
- @NoArgsConstructor
- public static class Param {
-
- /**
- * 请求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/ThirdService.java b/src/main/java/com/dpkj/common/utils/ThirdService.java
index 29f1200..69645f0 100644
--- a/src/main/java/com/dpkj/common/utils/ThirdService.java
+++ b/src/main/java/com/dpkj/common/utils/ThirdService.java
@@ -1,6 +1,7 @@
package com.dpkj.common.utils;
-import com.alibaba.fastjson.JSON;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import com.dpkj.common.dto.LexMarkDTO;
import com.dpkj.common.dto.LexMarkResultDTO;
@@ -8,14 +9,7 @@ import com.dpkj.common.exception.RRException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
-import org.thymeleaf.util.StringUtils;
-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;
import java.util.HashMap;
import java.util.Map;
@@ -37,68 +31,48 @@ public class ThirdService {
private String lexMarkServicePort;
private static final Map devNameMap = new HashMap<>();
+
static {
devNameMap.put("HtmPrinter", "激光打印机");
devNameMap.put("ReceiptPrinter", "凭条打印机");
}
+
/**
* 利盟台式机-立体机 接口请求
*
* @param lexMarkDTO 请求DTO
- * @param clazz 返回类型
+ * @param clazz 返回类型
* @return result
*/
public LexMarkResultDTO callDevice(LexMarkDTO lexMarkDTO, Class clazz) {
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");
+ String urlStr = lexMarkServiceIp + ":" + lexMarkServicePort + "/CallDevice";
+ log.info("[ThirdService][callDevice][激光打印机打印] 利盟打印接口-url:{}", urlStr);
- // 将LexMarkDTO对象转换为JSON字符串
- String jsonInputString = JSON.toJSONString(lexMarkDTO);
- try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) {
- byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
- wr.write(input, 0, input.length);
- log.info(jsonInputString);
- }
+ String params = JSONObject.toJSONString(lexMarkDTO);
+ log.info("[ThirdService][callDevice][激光打印机打印] 利盟打印接口-入参:{}", params);
- int responseCode = connection.getResponseCode();
- if (responseCode != HttpURLConnection.HTTP_OK) {
- log.error("利盟服务请求失败,响应码:{},请求参数:{}", responseCode, lexMarkDTO);
- throw new RRException("利盟服务请求失败,响应码:" + responseCode);
- }
+ String bodyStr = HttpRequest.post(urlStr)
+ .header("Content-Type", "application/json")
+ .body(params)
+ .timeout(30000)
+ .execute()
+ .body();
+ log.info("[ThirdService][callDevice][激光打印机打印] 利盟打印接口-响应:{}", bodyStr);
- BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
- String inputLine;
- StringBuilder response = new StringBuilder();
- while ((inputLine = in.readLine()) != null) {
- response.append(inputLine);
+ JSONObject bodyJson = (JSONObject) JSONObject.parse(bodyStr);
+ if (StrUtil.isEmpty(bodyJson.getString("param"))) {
+ throw new RRException("利盟服务请求失败,结果响应为空");
}
- in.close();
// 将响应JSON字符串转换为LexMarkResultDTO对象
- LexMarkResultDTO lexMarkResultDTO = JSON.parseObject(response.toString(), LexMarkResultDTO.class);
-// if (lexMarkResultDTO.getResult() != 0) {
-// log.error("利盟服务请求出错:{}", lexMarkResultDTO);
-// throw new RRException(lexMarkResultDTO.toString());
-// }
+ LexMarkResultDTO obj = JSONObject.toJavaObject(bodyJson, LexMarkResultDTO.class);
- // 实例化param位data
- String param = lexMarkResultDTO.getParam();
- if (!StringUtils.isEmpty(param)) {
- try {
- T t = JSON.parseObject(param, clazz);
- lexMarkResultDTO.setData(t);
- }catch (Exception e){
- log.error("类型转换失败");
- throw new RRException("转换param位data时,类型与实际类型不匹配");
- }
- }
+ T paramObj = JSONObject.toJavaObject(bodyJson.getJSONObject("param"), clazz);
+ obj.setData(paramObj);
- return lexMarkResultDTO;
+ return obj;
} catch (Exception e) {
log.error("利盟服务请求失败:{}", lexMarkDTO, e);
if (e instanceof RRException) {
@@ -121,7 +95,8 @@ public class ThirdService {
/**
* 打开设备连接或者 链接+初始化
- * @param devName 设备名称
+ *
+ * @param devName 设备名称
* @param resterType 初始化类型,如果不设置,那么就不会进行初始化
*/
public void open(String devName, Integer resterType) {
@@ -131,7 +106,7 @@ public class ThirdService {
lexMarkDTO.setCallID(19283);
lexMarkDTO.setDevName(devName);
lexMarkDTO.setPluginMethod("exec");
- JSONObject param = new JSONObject();
+ JSONObject param = new JSONObject();
param.put("", String.format("{\"ServiceName\":\"%s\",\"TimeOut\":90000}", devName));
lexMarkDTO.setParam(param.toString());
LexMarkResultDTO jsonObjectLexMarkResultDTO = this.callDevice(lexMarkDTO, JSONObject.class);
@@ -143,7 +118,7 @@ public class ThirdService {
}
// 打开后直接进行重置
- if ( resterType != null && data != null) {
+ if (resterType != null && data != null) {
lexMarkDTO.setActionName("Reset");
JSONObject jsonObject = new JSONObject();
jsonObject.put("", String.format("{\"ResetAction\":%d,\"binNumber\":0}", resterType));
@@ -160,6 +135,7 @@ public class ThirdService {
/**
* 关闭设备练级
+ *
* @param devName 设备名称
*/
public void close(String devName) {
@@ -179,17 +155,18 @@ public class ThirdService {
/**
* 切纸,但是目前凭条和ms439打印机都是可以自动切纸的
- * @param devName 设备名称
+ *
+ * @param devName 设备名称
* @param actionName action名称,实际的动作函数名称
- * @param mediaType 媒介类型
+ * @param mediaType 媒介类型
*/
- public void cutPaper(String devName, String actionName, Integer mediaType){
+ public void cutPaper(String devName, String actionName, Integer mediaType) {
LexMarkDTO lexMarkDTO = new LexMarkDTO();
lexMarkDTO.setActionName(actionName);
lexMarkDTO.setCallID(19283);
lexMarkDTO.setDevName(devName);
lexMarkDTO.setPluginMethod("exec");
- JSONObject param = new JSONObject();
+ JSONObject param = new JSONObject();
param.put("", String.format("{\"mediaCtrol\":%d}", mediaType));
lexMarkDTO.setParam(param.toString());
diff --git a/src/main/java/com/dpkj/modules/print/service/impl/MS439PrintServiceImpl.java b/src/main/java/com/dpkj/modules/print/service/impl/MS439PrintServiceImpl.java
index 8595d7c..42d39b6 100644
--- a/src/main/java/com/dpkj/modules/print/service/impl/MS439PrintServiceImpl.java
+++ b/src/main/java/com/dpkj/modules/print/service/impl/MS439PrintServiceImpl.java
@@ -19,6 +19,7 @@ import com.dpkj.modules.print.service.MS439PrintService;
import com.dpkj.modules.print.utils.FolderUtils;
import com.dpkj.modules.print.utils.FontLoader;
import com.dpkj.modules.print.utils.PDFUtils;
+import com.dpkj.modules.print.vo.PrinterParam;
import com.dpkj.modules.print.vo.PrinterStatus;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
@@ -110,6 +111,7 @@ public class MS439PrintServiceImpl implements MS439PrintService {
// param.put("prtData", String.format("PrintType=%d;pagesource=%s;copies=%d;file[0]=%s;stamp=%d;duplex=%d;color=%d;direction=%d",
// request.getPagesource(), request.getCopies(), request.getFileDir(), request.getStamp(),
// request.getDuplex(), request.getColor(), request.getDirection()));
+
// 计算A4/A5归属
int printType = 1; // 默认使用第一层
if (printerConfig.getLevelOne().equals("A5")) {
@@ -121,7 +123,7 @@ public class MS439PrintServiceImpl implements MS439PrintService {
printType = 2;
}
}
- param.put("prtData", String.format("PaperNum=%d;PrintType=%d;Stamp=%d;File[0]=%s;WaitNum=%d;copies=%d;stamp=%d;duplex=%d;color=%d;direction=%d",
+ /*param.put("prtData", String.format("PaperNum=%d;PrintType=%d;Stamp=%d;File[0]=%s;WaitNum=%d;copies=%d;stamp=%d;duplex=%d;color=%d;direction=%d",
request.getCopies(), // 盖章事件分数,和打印份数一致
printType, // 打印类型1-A4或者2-A5
request.getStamp(), // 是否盖章
@@ -131,10 +133,19 @@ public class MS439PrintServiceImpl implements MS439PrintService {
request.getStamp(), // 是否盖章 0-不盖章 1-盖章
request.getDuplex(), // 单面还是双面打印 1-单面 2-双面
request.getColor(), // 打印的颜色0-黑色,1-彩色
- request.getDirection()));
+ request.getDirection()));*/
+
+ String prtData = StrUtil.format("PaperNum={};PrintType={};Stamp={};File[0]={};WaitNum={}",
+ request.getCopies(), // 盖章事件分数,和打印份数一致
+ printType, // 打印类型1-A4或者2-A5
+ request.getStamp(), // 是否盖章
+ request.getFileDir(), // 要打印的文件的路径
+ request.getCopies() // 盖章事件分数,和打印份数一致
+ );
+ param.put("prtData", prtData);
lexMarkDTO.setParam(param.toString());
- LexMarkResultDTO paramLexMarkResultDTO = thirdService.callDevice(lexMarkDTO, LexMarkResultDTO.Param.class);
+ LexMarkResultDTO paramLexMarkResultDTO = thirdService.callDevice(lexMarkDTO, PrinterParam.class);
if (paramLexMarkResultDTO.getData().getResult() != 0) {
throw new RRException(500, paramLexMarkResultDTO.getData().getResult() + "");
@@ -163,9 +174,12 @@ public class MS439PrintServiceImpl implements MS439PrintService {
lexMarkDTO.setDevName("HtmPrinter");
lexMarkDTO.setPluginMethod("exec");
+ // 获取状态
LexMarkResultDTO status = thirdService.callDevice(lexMarkDTO, PrinterStatus.class);
if (status.getResult() != 0) {
+ // 打开打印机
thirdService.open("HtmPrinter", 0);
+ // 打印
status = thirdService.callDevice(lexMarkDTO, PrinterStatus.class);
}
@@ -363,9 +377,9 @@ public class MS439PrintServiceImpl implements MS439PrintService {
item.put("loitemRv", range);// 参考区间
item.put("loitemUnit", unit);// 单位
item.put("inspectionMethod", method);// 测试方法
- item.put("oaflag", StrUtil.equals(oaflag,"0") || StrUtil.equals(oaflag,"1"));// 结果异常标志|-1-不计算改指标的参考、1-正常、2-偏低、3-偏高、4-阳性(异常)、5-警戒下限、6-警戒上限、7-复查下限、8-复查上限、9-线性异常
- item.put("oaflagLow", StrUtil.equals(oaflag,"2"));// 2显示下箭头
- item.put("oaflagHigh", StrUtil.equals(oaflag,"3"));// 3显示上箭头
+ item.put("oaflag", StrUtil.equals(oaflag, "0") || StrUtil.equals(oaflag, "1"));// 结果异常标志|-1-不计算改指标的参考、1-正常、2-偏低、3-偏高、4-阳性(异常)、5-警戒下限、6-警戒上限、7-复查下限、8-复查上限、9-线性异常
+ item.put("oaflagLow", StrUtil.equals(oaflag, "2"));// 2显示下箭头
+ item.put("oaflagHigh", StrUtil.equals(oaflag, "3"));// 3显示上箭头
items.add(item);
}
}
diff --git a/src/main/java/com/dpkj/modules/print/service/impl/RegisterServiceImpl.java b/src/main/java/com/dpkj/modules/print/service/impl/RegisterServiceImpl.java
index e887143..cf591af 100644
--- a/src/main/java/com/dpkj/modules/print/service/impl/RegisterServiceImpl.java
+++ b/src/main/java/com/dpkj/modules/print/service/impl/RegisterServiceImpl.java
@@ -9,9 +9,15 @@ import com.dpkj.common.dto.LexMarkResultDTO;
import com.dpkj.common.exception.RRException;
import com.dpkj.common.utils.TemplateUtils;
import com.dpkj.common.utils.ThirdService;
-import com.dpkj.modules.print.enums.*;
+import com.dpkj.modules.print.enums.MS439DeviceStatusEnum;
+import com.dpkj.modules.print.enums.MS439InkStatusEnum;
+import com.dpkj.modules.print.enums.MS439MediaStatusEnum;
+import com.dpkj.modules.print.enums.MS439PaperStatusEnum;
+import com.dpkj.modules.print.enums.MS439TonerStatusEnum;
+import com.dpkj.modules.print.enums.ReceiptTemplateEnum;
import com.dpkj.modules.print.service.PrintService;
import com.dpkj.modules.print.utils.FolderUtils;
+import com.dpkj.modules.print.vo.PrinterParam;
import com.dpkj.modules.print.vo.PrinterStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -47,7 +53,7 @@ public class RegisterServiceImpl implements PrintService {
private static final int FIXED_WIDTH = 730;
@Override
- public LexMarkResultDTO printImage(JSONObject data, String template, int width, int height, String saveDir) {
+ public LexMarkResultDTO printImage(JSONObject data, String template, int width, int height, String saveDir) {
FolderUtils.checkFolderAndCreate(saveDir);
if (height <= 0) {
@@ -172,7 +178,7 @@ public class RegisterServiceImpl implements PrintService {
param.put("mediaCtrl", 1); // 媒介类型,当前为:打印缓冲区 + 弹出 + 剪纸
param.put("fields", StringUtils.join(filePathList, "&"));
lexMarkDTO.setParam(param.toJSONString());
- LexMarkResultDTO paramLexMarkResultDTO = thirdService.callDevice(lexMarkDTO, LexMarkResultDTO.Param.class);
+ LexMarkResultDTO paramLexMarkResultDTO = thirdService.callDevice(lexMarkDTO, PrinterParam.class);
for (String path : deletePathList) {
if (path != null && !path.isEmpty()) {
diff --git a/src/main/java/com/dpkj/modules/print/vo/PrinterParam.java b/src/main/java/com/dpkj/modules/print/vo/PrinterParam.java
new file mode 100644
index 0000000..92b3694
--- /dev/null
+++ b/src/main/java/com/dpkj/modules/print/vo/PrinterParam.java
@@ -0,0 +1,61 @@
+package com.dpkj.modules.print.vo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 利盟接口返回值DTO
+ *
+ * @author 石头人
+ * @version 1.0
+ * @since 2025-02-08 11:03:06
+ */
+@Data
+@Accessors(chain = true)
+public class PrinterParam implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 请求ID
+ */
+ private Integer RequestID;
+
+ /**
+ * 命令编码
+ */
+ private Integer dwCommandCode;
+
+ /**
+ * 事件名,由发送请求中的actionName+Over组成。
+ */
+ private String eventName;
+
+ /**
+ * 事件类型编码
+ */
+ private Integer eventType;
+
+ /**
+ * 服务
+ */
+ private Integer hService;
+
+ /**
+ * 对应发送请求中的devName
+ */
+ private String cmdName;
+
+ /**
+ * 错误码:0表示成功;其他表示失败,比如-4表示取消,-48表示超时,-14表示硬件故障
+ */
+ private Integer result;
+
+ /**
+ * 详情描述
+ */
+ private String desc;
+
+}
+
diff --git a/src/main/java/com/dpkj/modules/print/vo/PrinterStatus.java b/src/main/java/com/dpkj/modules/print/vo/PrinterStatus.java
index 46d3b65..b09ae42 100644
--- a/src/main/java/com/dpkj/modules/print/vo/PrinterStatus.java
+++ b/src/main/java/com/dpkj/modules/print/vo/PrinterStatus.java
@@ -1,13 +1,15 @@
package com.dpkj.modules.print.vo;
-import lombok.AllArgsConstructor;
import lombok.Data;
-import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class PrinterStatus {
+@Accessors(chain = true)
+public class PrinterStatus implements Serializable {
+ private static final long serialVersionUID = 1L;
+
/**
* sp服务版本号
*/