From 46810f941d164886e3aeeb7e45d68c153f68bd8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=A4=B4=E4=BA=BA?= <3076767823@qq.com> Date: Fri, 14 Mar 2025 16:02:00 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E4=BC=98=E5=8C=96=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E6=9C=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dpkj/common/utils/ThirdService.java | 91 +++++++++++++++++++ .../print/controller/MS439Controller.java | 4 +- .../print/controller/RegisterController.java | 10 +- .../modules/print/request/MS439Request.java | 3 + .../print/service/MS439PrintService.java | 2 +- .../service/impl/MS439PrintServiceImpl.java | 79 ++++++++++------ .../service/impl/RegisterServiceImpl.java | 38 ++++++-- 7 files changed, 187 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/dpkj/common/utils/ThirdService.java b/src/main/java/com/dpkj/common/utils/ThirdService.java index b0c4549..d68870d 100644 --- a/src/main/java/com/dpkj/common/utils/ThirdService.java +++ b/src/main/java/com/dpkj/common/utils/ThirdService.java @@ -16,6 +16,8 @@ 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; /** @@ -34,10 +36,17 @@ public class ThirdService { @Value("${app.custom.lexMarkServicePort}") private String lexMarkServicePort; + private static final Map devNameMap = new HashMap<>(); + static { + devNameMap.put("HtmPrinter", "激光打印机"); + devNameMap.put("ReceiptPrinter", "凭条打印机"); + } + /** * 利盟台式机-立体机 接口请求 * * @param lexMarkDTO 请求DTO + * @param clazz 返回类型 * @return result */ public LexMarkResultDTO callDevice(LexMarkDTO lexMarkDTO, Class clazz) { @@ -110,5 +119,87 @@ public class ThirdService { return callDevice(lexMarkDTO, JSONObject.class); } + /** + * 打开设备连接或者 链接+初始化 + * @param devName 设备名称 + * @param resterType 初始化类型,如果不设置,那么就不会进行初始化 + */ + public void open(String devName, Integer resterType) { + // 优先自动连接对应的设备 + LexMarkDTO lexMarkDTO = new LexMarkDTO(); + lexMarkDTO.setActionName("OpenConnection"); + lexMarkDTO.setCallID(19283); + lexMarkDTO.setDevName(devName); + lexMarkDTO.setPluginMethod("exec"); + JSONObject param = new JSONObject(); + param.put("", String.format("{\"ServiceName\":\"%s\",\"TimeOut\":90000}", devName)); + lexMarkDTO.setParam(param.toString()); + LexMarkResultDTO jsonObjectLexMarkResultDTO = this.callDevice(lexMarkDTO, JSONObject.class); + JSONObject data = jsonObjectLexMarkResultDTO.getData(); + if (data != null) { + if (!String.valueOf(data.get("result")).equals("0")) { + throw new RRException("设备: " + devNameMap.get(devName) + " 打开失败!"); + } + } + + // 打开后直接进行重置 + if ( resterType != null && data != null) { + lexMarkDTO.setActionName("Reset"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("", String.format("{\"ResetAction\":%d,\"binNumber\":0}", resterType)); + lexMarkDTO.setParam(jsonObject.toString()); + LexMarkResultDTO resultDTO = this.callDevice(lexMarkDTO, JSONObject.class); + JSONObject data1 = resultDTO.getData(); + if (data1 != null) { + if (!String.valueOf(data1.get("result")).equals("0")) { + throw new RRException("设备: " + devNameMap.get(devName) + " _ " + resterType + " 初始化失败!"); + } + } + } + } + + /** + * 关闭设备练级 + * @param devName 设备名称 + */ + public void close(String devName) { + LexMarkDTO lexMarkDTO = new LexMarkDTO(); + lexMarkDTO.setActionName("CloseConnection"); + lexMarkDTO.setCallID(19283); + lexMarkDTO.setDevName(devName); + lexMarkDTO.setPluginMethod("exec"); + LexMarkResultDTO jsonObjectLexMarkResultDTO = this.callDevice(lexMarkDTO, JSONObject.class); + JSONObject data = jsonObjectLexMarkResultDTO.getData(); + if (data != null) { + if (!String.valueOf(data.get("result")).equals("0")) { + throw new RRException("设备: " + devNameMap.get(devName) + " 关闭失败!"); + } + } + } + + /** + * 切纸,但是目前凭条和ms439打印机都是可以自动切纸的 + * @param devName 设备名称 + * @param actionName action名称,实际的动作函数名称 + * @param 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(); + param.put("", String.format("{\"mediaCtrol\":%d}", mediaType)); + lexMarkDTO.setParam(param.toString()); + + LexMarkResultDTO jsonObjectLexMarkResultDTO = this.callDevice(lexMarkDTO, JSONObject.class); + JSONObject data = jsonObjectLexMarkResultDTO.getData(); + if (data != null) { + if (!String.valueOf(data.get("result")).equals("0")) { + throw new RRException("设备: " + devNameMap.get(devName) + " 切纸失败!"); + } + } + } } diff --git a/src/main/java/com/dpkj/modules/print/controller/MS439Controller.java b/src/main/java/com/dpkj/modules/print/controller/MS439Controller.java index 745bedf..e0c633b 100644 --- a/src/main/java/com/dpkj/modules/print/controller/MS439Controller.java +++ b/src/main/java/com/dpkj/modules/print/controller/MS439Controller.java @@ -29,8 +29,8 @@ public class MS439Controller { } @PostMapping("/getStatus") - public Result print(){ - this.ms439PrintService.getStatus(); + public Result print(@RequestParam(defaultValue = "A4") String papersource){ + this.ms439PrintService.getStatus(papersource); return Result.ok(); } diff --git a/src/main/java/com/dpkj/modules/print/controller/RegisterController.java b/src/main/java/com/dpkj/modules/print/controller/RegisterController.java index 9d84b37..25a57c3 100644 --- a/src/main/java/com/dpkj/modules/print/controller/RegisterController.java +++ b/src/main/java/com/dpkj/modules/print/controller/RegisterController.java @@ -3,8 +3,10 @@ package com.dpkj.modules.print.controller; import com.alibaba.fastjson.JSONObject; import com.dpkj.common.dto.LexMarkResultDTO; import com.dpkj.common.vo.Result; +import com.dpkj.modules.print.request.ReceiptPrintRequest; import com.dpkj.modules.print.service.PrintService; import com.dpkj.modules.print.vo.PrinterStatus; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -36,9 +38,11 @@ public class RegisterController { /** * 挂号,通过文件路径 */ - @PostMapping("/register") - public Result registerByFilePath(@RequestParam(defaultValue = "D:\\images") String filePath){ - return Result.ok((LexMarkResultDTO)printService.printImage(null, null, 0, 0, filePath)); + @PostMapping("/print") + public Result registerByFilePath(@RequestBody @Validated ReceiptPrintRequest request){ + String testData = "{\"hospitalName\":\"澜沧县中医医院\",\"registeTerminalName\":\"中国农业银行自助终端\",\"registeType\":\"自助挂号\",\"name\":\"刘博雅\",\"gender\":\"男\",\"age\":28,\"birthDate\":\"1996-06-31\",\"cardNumber\":\"6221**********0731\",\"outpatientNumber\":\"2501150038\",\"department\":\"普外科门诊\",\"visitLevel\":\"普通号\",\"doctor\":\"普通门诊\",\"sequence\":\"1\",\"registerDate\":\"2025-01-15\",\"totalFee\":4.00,\"paymentMethod\":\"微信扫码支付\",\"orderNumber\":\"\",\"transactionNumber\":\"2025011513090412092794szztzzj\",\"qrCodeBase64_2base64Type_1_250_250\":\"maby this is a Base64 code data if has\",\"terminalNumber\":\"12092794\",\"printTime\":\"2025-01-15 13:10:08\"}"; +// String testData = "{\"hospitalName\":\"澜沧县中医医院\",\"registeTerminalName\":\"中国农业银行自助终端\",\"registeType\":\"自助挂号\",\"name\":\"刘博雅\",\"gender\":\"男\",\"age\":28,\"birthDate\":\"1996-06-31\",\"cardNumber\":\"6221**********0731\",\"outpatientNumber\":\"2501150038\",\"department\":\"普外科门诊\",\"visitLevel\":\"普通号\",\"doctor\":\"普通门诊\",\"sequence\":\"1\",\"registerDate\":\"2025-01-15\",\"totalFee\":4.00,\"paymentMethod\":\"微信扫码支付\",\"orderNumber\":\"\",\"transactionNumber\":\"2025011513090412092794szztzzj\",\"qrCodeBase64_2base64Type_2_500_160\":\"maby this is a Base64 code data if has\",\"terminalNumber\":\"12092794\",\"printTime\":\"2025-01-15 13:10:08\"}"; + return Result.ok((LexMarkResultDTO)printService.printImage(JSONObject.parseObject(testData), request.getTemplateName(), request.getWidth(), request.getHeight(), request.getFileDir())); } /** diff --git a/src/main/java/com/dpkj/modules/print/request/MS439Request.java b/src/main/java/com/dpkj/modules/print/request/MS439Request.java index fb200ac..61aaec1 100644 --- a/src/main/java/com/dpkj/modules/print/request/MS439Request.java +++ b/src/main/java/com/dpkj/modules/print/request/MS439Request.java @@ -5,6 +5,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; + +import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import java.io.Serializable; @@ -28,6 +30,7 @@ public class MS439Request implements Serializable { /** * 份数,默认1 */ + @Min(value = 1, message = "份数最少要为一份") private Integer copies = 1; /** diff --git a/src/main/java/com/dpkj/modules/print/service/MS439PrintService.java b/src/main/java/com/dpkj/modules/print/service/MS439PrintService.java index 9bfaa43..47af1af 100644 --- a/src/main/java/com/dpkj/modules/print/service/MS439PrintService.java +++ b/src/main/java/com/dpkj/modules/print/service/MS439PrintService.java @@ -9,5 +9,5 @@ public interface MS439PrintService { LexMarkResultDTO printImage(MS439Request request); - LexMarkResultDTO getStatus(); + LexMarkResultDTO getStatus(String papersource); } 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 4abd860..fcbc23e 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 @@ -14,6 +14,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Objects; /** * 利盟MS439打印机服务 @@ -31,29 +32,10 @@ public class MS439PrintServiceImpl implements MS439PrintService { @Override public LexMarkResultDTO printImage(MS439Request request) { - LexMarkResultDTO status = this.getStatus(); + LexMarkResultDTO status = this.getStatus(request.getPagesource()); + thirdService.open("HtmPrinter", 0); PrinterStatus ms439 = status.getData(); - String stPaperEx = ms439.getStPaperEx(); - if (stPaperEx == null || stPaperEx.equals("")) { - throw new RRException("获取打印机纸张状态出问题"); - } - String[] papers = stPaperEx.split("\\|"); - if ( papers.length < 2) { - throw new RRException("打印机纸盒数量不对"); - } - String paperStatus = ""; - // 如果是A4,当前是取第一层纸盒作为A4 - if (request.getPagesource().equals("A4")) { - paperStatus = papers[0]; - } - // 如果是A5,当前是取第二层纸盒只作为A5 - if (request.getPagesource().equals("A5")) { - paperStatus = papers[1]; - } - if ( !(paperStatus.equals(MS439PaperStatusEnum.PAPERFULL.getPrintCode()) || !paperStatus.equals(MS439PaperStatusEnum.PAPERLOW.getPrintCode()))){ - throw new RRException(MS439PaperStatusEnum.getPCode(paperStatus), MS439PaperStatusEnum.getMessage(paperStatus)); - } // 如果是要盖章,校验盖章机器是否正常 if ( request.getStamp() == 1) { @@ -61,7 +43,7 @@ public class MS439PrintServiceImpl implements MS439PrintService { if (deviceExStatus == null || deviceExStatus.equals("")) { throw new RRException("获取打印机设备状态出问题"); } - String[] devices = stPaperEx.split("\\|"); + String[] devices = deviceExStatus.split("\\|"); if (devices.length < 2) { throw new RRException("打印机默认设备数量不对"); } @@ -81,15 +63,34 @@ public class MS439PrintServiceImpl implements MS439PrintService { lexMarkDTO.setPluginMethod("exec"); JSONObject param = new JSONObject(); - param.put("prtData", String.format("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())); + + + // printType 选择箱子 +// 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())); + 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(), // 盖章事件分数,和打印份数一致 + Objects.equals(request.getPagesource(), "A4") ? 1 : 2, // 打印类型1-A4或者2-A5 + request.getStamp(), // 是否盖章 + request.getFileDir(), // 要打印的文件的路径 + request.getCopies(), // 盖章事件分数,和打印份数一致 + request.getCopies(), // 实际要打印的份数 + request.getStamp(), // 是否盖章 0-不盖章 1-盖章 + request.getDuplex(), // 单面还是双面打印 1-单面 2-双面 + request.getColor(), // 打印的颜色0-黑色,1-彩色 + request.getDirection())); + lexMarkDTO.setParam(param.toString()); - return thirdService.callDevice(lexMarkDTO, LexMarkResultDTO.Param.class); + LexMarkResultDTO paramLexMarkResultDTO = thirdService.callDevice(lexMarkDTO, LexMarkResultDTO.Param.class); + thirdService.close("HtmPrinter"); + return paramLexMarkResultDTO; } @Override - public LexMarkResultDTO getStatus() { + public LexMarkResultDTO getStatus(String papersource) { + thirdService.open("HtmPrinter", 0); + LexMarkDTO lexMarkDTO = new LexMarkDTO(); lexMarkDTO.setActionName("GetStatus"); lexMarkDTO.setCallID(19283); @@ -101,6 +102,27 @@ public class MS439PrintServiceImpl implements MS439PrintService { throw new RRException(ErrorCodeConstants.MS439_PRINT_ERROR_CODE.get(status.getResult())); } + String stPaperEx = status.getData().getStPaperEx(); + if (stPaperEx == null || stPaperEx.equals("")) { + throw new RRException("获取打印机纸张状态出问题"); + } + String[] papers = stPaperEx.split("\\|"); + if ( papers.length < 2) { + throw new RRException("打印机纸盒数量不对"); + } + String paperStatus = ""; + // 如果是A4,当前是取第一层纸盒作为A4 + if (papersource.equals("A4")) { + paperStatus = papers[0]; + } + // 如果是A5,当前是取第二层纸盒只作为A5 + if (papersource.equals("A5")) { + paperStatus = papers[1]; + } + if ( !(paperStatus.equals(MS439PaperStatusEnum.PAPERFULL.getPrintCode()) || paperStatus.equals(MS439PaperStatusEnum.PAPERLOW.getPrintCode()))){ + throw new RRException(500, paperStatus); + } + PrinterStatus ms439 = status.getData(); // 校验打印机是否正常,除了HEALTHY都抛异常 if (!ms439.getStDeviceStatus().equals(MS439DeviceStatusEnum.HEALTHY.getPrintCode()) ) { @@ -118,11 +140,12 @@ public class MS439PrintServiceImpl implements MS439PrintService { } // 校验墨盒 满或者少才放行,当前获取为未知 - if ( !(ms439.getStInk().equals(MS439InkStatusEnum.INKFULL.getPrintCode()) || ms439.getStInk().equals(MS439InkStatusEnum.INKLOW.getPrintCode()) + if ( false && !(ms439.getStInk().equals(MS439InkStatusEnum.INKFULL.getPrintCode()) || ms439.getStInk().equals(MS439InkStatusEnum.INKLOW.getPrintCode()) || ms439.getStInk().equals(MS439InkStatusEnum.INKUNKNOWN.getPrintCode()))){ throw new RRException(500, ms439.getStInk()); } + thirdService.close("HtmPrinter"); return status; } 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 212b372..d666f74 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 @@ -11,10 +11,12 @@ import com.dpkj.common.utils.ThirdService; import com.dpkj.modules.print.enums.*; import com.dpkj.modules.print.service.PrintService; import com.dpkj.modules.print.vo.PrinterStatus; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.thymeleaf.util.StringUtils; import javax.annotation.Resource; +import java.io.File; /** * 挂号服务打印 @@ -23,6 +25,7 @@ import javax.annotation.Resource; * @version 1.0 * @since 2025-02-08 10:36:25 */ +@Slf4j @Service("registerService") public class RegisterServiceImpl implements PrintService { @@ -31,6 +34,8 @@ public class RegisterServiceImpl implements PrintService { @Override public LexMarkResultDTO printImage(JSONObject data, String template, int width, int height, String saveDir) { + thirdService.open("ReceiptPrinter", 1); + StringBuilder filePath = new StringBuilder(saveDir); // 校验是否选中了模板,如果没选中模板的话则不需要另外生成了 if ( !StringUtils.isEmpty(template) && !StringUtils.isEmpty(saveDir)){ @@ -52,11 +57,31 @@ public class RegisterServiceImpl implements PrintService { param.put("mediaCtrl", 1); param.put("fields", "LOGO=" + filePath); lexMarkDTO.setParam(param.toJSONString()); - return thirdService.callDevice(lexMarkDTO, LexMarkResultDTO.Param.class); + LexMarkResultDTO paramLexMarkResultDTO = thirdService.callDevice(lexMarkDTO, LexMarkResultDTO.Param.class); + // 切纸 + this.thirdService.cutPaper("ReceiptPrinter", "ControlMedia", 4); + + File file = new File(filePath.toString()); + // 检查文件是否存在 + if (file.exists() ) { + // 尝试删除文件 + if (file.delete()) { + log.info("文件删除成功: " + filePath); + } else { + log.info("文件删除失败: " + filePath); + } + } else { + log.info("文件不存在: " + filePath); + } + + this.thirdService.close("ReceiptPrinter"); + return paramLexMarkResultDTO; } @Override public LexMarkResultDTO getStatus() { + thirdService.open("ReceiptPrinter", 1); + LexMarkDTO lexMarkDTO = new LexMarkDTO(); lexMarkDTO.setActionName("GetStatus"); lexMarkDTO.setCallID(11225); @@ -71,12 +96,12 @@ public class RegisterServiceImpl implements PrintService { PrinterStatus ms439 = status.getData(); // 获取打印机纸张 String stPaperEx = ms439.getStPaperEx(); - if (stPaperEx == null || stPaperEx.equals("")) { - throw new RRException(501, "获取打印机纸张状态出问题"); + if (stPaperEx == null || stPaperEx.isEmpty()) { + throw new RRException("获取打印机纸张状态出问题"); } String[] papers = stPaperEx.split("\\|"); if ( papers.length < 1) { - throw new RRException(501, "打印机纸盒数量不对"); + throw new RRException("打印机纸盒数量不对"); } String paperStatus = papers[0]; if ( !(paperStatus.equals(MS439PaperStatusEnum.PAPERFULL.getPrintCode()) || paperStatus.equals(MS439PaperStatusEnum.PAPERLOW.getPrintCode()))){ @@ -94,16 +119,17 @@ public class RegisterServiceImpl implements PrintService { } // 校验磁带 满或者少才放行 - if ( !(ms439.getStToner().equals(MS439TonerStatusEnum.TONERFULL.getPrintCode()) || ms439.getStToner().equals(MS439TonerStatusEnum.TONERLOW.getPrintCode()))){ + if ( false && !(ms439.getStToner().equals(MS439TonerStatusEnum.TONERFULL.getPrintCode()) || ms439.getStToner().equals(MS439TonerStatusEnum.TONERLOW.getPrintCode()))){ throw new RRException(500, ms439.getStToner()); } // 校验墨盒 满或者少才放行,当前获取为未知 - if ( !(ms439.getStInk().equals(MS439InkStatusEnum.INKFULL.getPrintCode()) || ms439.getStInk().equals(MS439InkStatusEnum.INKLOW.getPrintCode()) + if ( false && !(ms439.getStInk().equals(MS439InkStatusEnum.INKFULL.getPrintCode()) || ms439.getStInk().equals(MS439InkStatusEnum.INKLOW.getPrintCode()) || ms439.getStInk().equals(MS439InkStatusEnum.INKUNKNOWN.getPrintCode()))){ throw new RRException(500, ms439.getStInk()); } + this.thirdService.close("ReceiptPrinter"); return status; }