commit 141566b563cb56869cb3ab55dddef8c8e026ebad Author: xiaodaozi Date: Fri Feb 7 09:20:09 2025 +0800 初始化 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/doc/win/command.txt b/doc/win/command.txt new file mode 100644 index 0000000..2919c2f --- /dev/null +++ b/doc/win/command.txt @@ -0,0 +1,14 @@ +# 安装服务 +yinyitong-dll-stand.exe install + +# 启动服务 +yinyitong-dll-stand.exe start + +# 查看服务运行状态 +yinyitong-dll-stand.exe status + +# 重启服务 +yinyitong-dll-stand.exe restart + +# 停止服务 +yinyitong-dll-stand.exe stop diff --git a/doc/win/yinyitong-dll-stand.exe b/doc/win/yinyitong-dll-stand.exe new file mode 100644 index 0000000..45a8182 Binary files /dev/null and b/doc/win/yinyitong-dll-stand.exe differ diff --git a/doc/win/yinyitong-dll-stand.xml b/doc/win/yinyitong-dll-stand.xml new file mode 100644 index 0000000..eec13c0 --- /dev/null +++ b/doc/win/yinyitong-dll-stand.xml @@ -0,0 +1,8 @@ + + yinyitong-dll-stand + yinyitong-dll-stand + 银医通-台式机-DLL调用服务 + + java + -jar %BASE%\yinyitong-dll-stand.jar + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..1cb387a --- /dev/null +++ b/pom.xml @@ -0,0 +1,109 @@ + + + 4.0.0 + + com.dpkj + 银医通-澜沧中医院-DLL-台式机 + 0.0.1-SNAPSHOT + ems-express-call-dll + ems-express-call-dll + + + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + + + + + 1.8 + 5.8.25 + 5.14.0 + 3.0.2 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + junit + junit + test + + + + cn.hutool + hutool-crypto + ${hutool.version} + + + + net.java.dev.jna + jna + ${jna.version} + + + net.java.dev.jna + jna-platform + ${jna.version} + + + + + org.apache.pdfbox + pdfbox + ${pdfbox.version} + + + + + ems-express-call-dll + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + src/main/resources + + **/** + + false + + + + + + + + dev + + + + + + pro + + + + + + + diff --git a/src/main/java/com/dpkj/Application.java b/src/main/java/com/dpkj/Application.java new file mode 100644 index 0000000..5a4672d --- /dev/null +++ b/src/main/java/com/dpkj/Application.java @@ -0,0 +1,30 @@ +package com.dpkj; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.Environment; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +@Slf4j +@SpringBootApplication +public class Application { + + public static void main(String[] args) throws UnknownHostException { + ConfigurableApplicationContext application = SpringApplication.run(Application.class, args); + Environment env = application.getEnvironment(); + String ip = InetAddress.getLocalHost().getHostAddress(); + String port = env.getProperty("server.port"); + String path = StrUtil.trim(env.getProperty("server.servlet.context-path")); + log.info("\n----------------------------------------------------------\n\t" + + "Application is running! Access URLs:\n\t" + + "Local: \t\thttp://localhost:" + port + path + "/\n\t" + + "External: \thttp://" + ip + ":" + port + path + "/\n\t" + + "----------------------------------------------------------"); + } + +} diff --git a/src/main/java/com/dpkj/common/config/FileConfig.java b/src/main/java/com/dpkj/common/config/FileConfig.java new file mode 100644 index 0000000..16d04e7 --- /dev/null +++ b/src/main/java/com/dpkj/common/config/FileConfig.java @@ -0,0 +1,22 @@ +package com.dpkj.common.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @Auther: 萧道子 + * @Date: 2024/4/28 14:55 + * @Description: + */ +@Data +@Component +@ConfigurationProperties(prefix = "dpkj.file") +public class FileConfig { + + /** + * 文件地址 + */ + private String path; + +} diff --git a/src/main/java/com/dpkj/common/config/PrinterConfig.java b/src/main/java/com/dpkj/common/config/PrinterConfig.java new file mode 100644 index 0000000..78a034d --- /dev/null +++ b/src/main/java/com/dpkj/common/config/PrinterConfig.java @@ -0,0 +1,32 @@ +package com.dpkj.common.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +/** + * @Auther: 萧道子 + * @Date: 2024/4/28 14:55 + * @Description: + */ +@Data +@Component +@ConfigurationProperties(prefix = "dpkj.printer") +public class PrinterConfig { + + /** + * 打印机连接方式 USB: usb连接 | BTMS:串口连接 + */ + private String connectionType; + + /** + * 打印端口 串口连接下使用 + */ + private String portName; + + /** + * 波特率 串口连接下使用 + */ + private Integer baudRate; +} diff --git a/src/main/java/com/dpkj/common/constant/CommonConst.java b/src/main/java/com/dpkj/common/constant/CommonConst.java new file mode 100644 index 0000000..3f712e8 --- /dev/null +++ b/src/main/java/com/dpkj/common/constant/CommonConst.java @@ -0,0 +1,9 @@ +package com.dpkj.common.constant; + +public interface CommonConst { + Integer SC_500 = 500; + Integer SC_404 = 404; + Integer SC_200 = 200; + + +} diff --git a/src/main/java/com/dpkj/common/vo/Result.java b/src/main/java/com/dpkj/common/vo/Result.java new file mode 100644 index 0000000..47c5e90 --- /dev/null +++ b/src/main/java/com/dpkj/common/vo/Result.java @@ -0,0 +1,81 @@ +package com.dpkj.common.vo; + +import com.dpkj.common.constant.CommonConst; +import lombok.Data; + +import java.io.Serializable; + +/** + * 接口返回数据格式 + */ +@Data +public class Result implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 成功标志 + */ + private boolean success = true; + + /** + * 返回处理消息 + */ + private String message = ""; + + /** + * 返回代码 + */ + private Integer code = 0; + + /** + * 返回数据对象 data + */ + private T result; + + /** + * 时间戳 + */ + private long timestamp = System.currentTimeMillis(); + + public Result() { + } + + public static Result ok() { + return ok("", null); + } + + public static Result ok(String msg) { + return ok(msg, null); + } + + public static Result ok(T data) { + return error("", data); + } + + public static Result ok(String msg, T data) { + Result r = new Result(); + r.setSuccess(true); + r.setCode(CommonConst.SC_200); + r.setMessage(msg); + r.setResult(data); + return r; + } + + public static Result error(String msg, T data) { + return error(CommonConst.SC_500, msg, data); + } + + public static Result error(String msg) { + return error(CommonConst.SC_500, msg, null); + } + + public static Result error(int code, String msg, T data) { + Result r = new Result(); + r.setCode(code); + r.setMessage(msg); + r.setSuccess(false); + r.setResult(data); + return r; + } + +} diff --git a/src/main/java/com/dpkj/modules/express/controller/PrinterController.java b/src/main/java/com/dpkj/modules/express/controller/PrinterController.java new file mode 100644 index 0000000..2823665 --- /dev/null +++ b/src/main/java/com/dpkj/modules/express/controller/PrinterController.java @@ -0,0 +1,88 @@ +package com.dpkj.modules.express.controller; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import com.dpkj.common.config.FileConfig; +import com.dpkj.common.vo.Result; +import com.dpkj.modules.express.service.PrinterService; +import com.dpkj.modules.express.utils.FileUtils; +import com.dpkj.modules.express.utils.PrinterUtil; +import com.dpkj.modules.express.vo.Print; +import com.dpkj.modules.express.vo.PrinterStatus; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.util.List; + +/** + * @Auther: 萧道子 + * @Date: 2024/4/28 13:58 + * @Description: 打印机 + */ +@Slf4j +@RestController +@RequestMapping("printer") +public class PrinterController { + @Autowired + private PrinterService printerService; + @Autowired + private FileConfig fileConfig; + + /** + * 获取打印机状态 + * + * @return com.dpkj.common.vo.Result + * @author 萧道子 2024/4/28 + */ + @GetMapping("status") + public Result getStatus() { + try { + PrinterStatus val = printerService.getPrinterStatus(); + return Result.ok("获取成功", val); + } catch (Exception e) { + e.printStackTrace(); + log.info("[printer][PrinterController.getStatus]获取打印机状态失败 {}", e.getMessage()); + return Result.error("打印机状态获取失败"); + } + } + + /** + * 打印文件 + * + * @return com.dpkj.common.vo.Result + * @author 萧道子 2024/4/29 + */ + @PostMapping("print") + public Result print(@RequestBody Print val) { + try { + String base64 = val.getBase64(); + if (StrUtil.isEmpty(base64)) throw new Exception("参数缺失!"); + + List files = FileUtils.saveBase64ToBmp(base64); + if (files.isEmpty()) throw new Exception("打印失败,面单未生成!"); + + File file = files.get(0); + String filePath = file.getAbsolutePath(); + Integer num = printerService.printBmpByPath(filePath);// 打印 + FileUtil.del(file); // 删除文件 + + if (num != 0) throw new Exception("打印失败,请检查打印机是否连接正常!"); + + return Result.ok("打印成功"); + } catch (Exception e) { + e.printStackTrace(); + log.info("[printer][PrinterController.print] 打印面单 {}", e.getMessage()); + return Result.error(e.getMessage()); + } + } + + +} diff --git a/src/main/java/com/dpkj/modules/express/service/PrinterService.java b/src/main/java/com/dpkj/modules/express/service/PrinterService.java new file mode 100644 index 0000000..ef078f6 --- /dev/null +++ b/src/main/java/com/dpkj/modules/express/service/PrinterService.java @@ -0,0 +1,26 @@ +package com.dpkj.modules.express.service; + +import com.dpkj.modules.express.utils.PrinterUtil; +import com.dpkj.modules.express.vo.PrinterStatus; + +import java.util.Map; + +public interface PrinterService { + + /** + * 获取打印机状态 + * + * @return com.dpkj.modules.express.vo.PrinterStatus + * @author 萧道子 2024/4/28 + */ + PrinterStatus getPrinterStatus(); + + /** + * 通过路径打印BMP文件 + * + * @param path : + * @return java.lang.Integer + * @author 萧道子 2024/4/29 + */ + Integer printBmpByPath(String path) throws Exception; +} diff --git a/src/main/java/com/dpkj/modules/express/service/impl/PrinterServiceImpl.java b/src/main/java/com/dpkj/modules/express/service/impl/PrinterServiceImpl.java new file mode 100644 index 0000000..99274e7 --- /dev/null +++ b/src/main/java/com/dpkj/modules/express/service/impl/PrinterServiceImpl.java @@ -0,0 +1,147 @@ +package com.dpkj.modules.express.service.impl; + +import cn.hutool.core.lang.Console; +import cn.hutool.core.util.StrUtil; +import com.dpkj.common.config.PrinterConfig; +import com.dpkj.modules.express.service.PrinterService; +import com.dpkj.modules.express.utils.PrinterUtil; +import com.dpkj.modules.express.vo.PrinterStatus; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +/** + * @Auther: 萧道子 + * @Date: 2024/4/28 14:34 + * @Description: + */ +@Slf4j +@Service +public class PrinterServiceImpl implements PrinterService { + @Resource + private PrinterConfig printerConfig; + + private PrinterUtil.MsPrintSdk printSDK = PrinterUtil.getPrintSDK(); + + public PrinterServiceImpl() throws PrinterUtil.PrinterRegistrationException { + } + + @PostConstruct + public void postConstruct() { + log.info("[printer] 打印机初始化"); + initPrinter(); + } + + private void initPrinter() { + if (StrUtil.equals(printerConfig.getConnectionType(), "USB")) { + // USB连接 + Integer n = printSDK.SetUsbportauto(); + log.info("[printer][SetUsbportauto] USB自动识别 {}", n); + } else { + // 串口连接 + String portName = printerConfig.getPortName(); + Integer baudRate = printerConfig.getBaudRate(); + Integer n = printSDK.SetPrintPort(portName, baudRate); + log.info("[printer][SetPrintPort] 串口配置 {}", n); + } + Integer n = printSDK.SetInit(); + log.info("[printer][SetInit] 初始化打印机设置 {}", n); + } + + @Override + public PrinterStatus getPrinterStatus() { + Integer num = printSDK.GetStatusspecial(); + PrinterStatus statusVo = getStatusVo(num); + return statusVo; + } + + @Override + public Integer printBmpByPath(String path) { + initPrinter(); + + String formattedFilePath = path.replace("\\", "\\\\"); + int n = printSDK.PrintDiskimgfile(formattedFilePath); + log.info("[printer][PrintDiskimgfile] 打印BMP文件 {}", n); + + printMarkpositioncut(); + // printMarkcutpaper(); + printCutpaper(); + return n; + } + + private PrinterStatus getStatusVo(Integer num) { + PrinterStatus val = new PrinterStatus().setValue(num); + switch (num) { + case 0: + val.setText("打印机正常"); + break; + case 1: + val.setText("打印机未连接或未上电"); + break; + case 2: + val.setText("打印机和调用库不匹配"); + break; + case 3: + val.setText("当前使用打印机无特殊功能"); + break; + case 4: + val.setText("容纸器没有可靠上纸"); + break; + case 5: + val.setText("纸张堵在出票口,持续堆叠"); + break; + case 6: + val.setText("卡纸"); + break; + case 7: + val.setText("拽纸"); + break; + case 8: + val.setText("出纸传感器有纸"); + break; + default: + break; + } + return val; + } + + + /** + * 检测黑标进纸到切纸位置 + */ + private Integer printMarkpositioncut() { + int n = printSDK.PrintMarkpositioncut(); + log.info("[printer][PrintMarkpositioncut] 检测黑标进纸到切纸位置 {}", n); + return n; + } + + /** + * 打印切纸 + */ + private Integer printCutpaper() { + int n = printSDK.PrintCutpaper(0); + log.info("[printer][PrintCutpaper] 打印切纸 {}", n); + return n; + } + + /** + * 黑标切纸 + */ + private Integer printMarkcutpaper() { + int n = printSDK.PrintMarkcutpaper(0); + log.info("[printer][printMarkcutpaper] 打印黑标切纸 {}", n); + return n; + } + + + /** + * 检测黑标进纸到打印位置 + */ + private Integer printMarkpositionPrint() { + int n = printSDK.PrintMarkpositionPrint(); + log.info("[printer][printMarkpositionPrint] 检测黑标进纸到打印位置 {}", n); + return n; + } +} diff --git a/src/main/java/com/dpkj/modules/express/utils/FileUtils.java b/src/main/java/com/dpkj/modules/express/utils/FileUtils.java new file mode 100644 index 0000000..a469ddd --- /dev/null +++ b/src/main/java/com/dpkj/modules/express/utils/FileUtils.java @@ -0,0 +1,101 @@ +package com.dpkj.modules.express.utils; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; +import com.dpkj.common.config.FileConfig; +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.rendering.PDFRenderer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import java.util.UUID; + +/** + * @Auther: 萧道子 + * @Date: 2024/4/29 14:47 + * @Description: + */ +@Component +public class FileUtils { + + private static FileConfig fileConfig; + + @Autowired + public void setFileConfig(FileConfig fileConfig) { + this.fileConfig = fileConfig; + } + + /** + * base64Pdf 转字节流 + * + * @param base64Pdf : + * @return java.util.List + * @author 萧道子 2024/4/29 + */ + public static List convertBase64PdfToBufferedImage(String base64Pdf) throws IOException { + List images = new ArrayList<>(); + base64Pdf = base64Pdf.replaceAll("[^A-Za-z0-9+/=]", ""); + byte[] base64Bytes = Base64.getDecoder().decode(base64Pdf); + PDDocument document = Loader.loadPDF(base64Bytes); + PDFRenderer pdfRenderer = new PDFRenderer(document); + for (int i = 0; i < document.getNumberOfPages(); i++) { + BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(i, 188); + int h = bufferedImage.getHeight(); + int w = bufferedImage.getWidth(); + int x = 15; + int y = 28; + // int y = new BigDecimal(0.03).multiply(new BigDecimal(h)).setScale(0, BigDecimal.ROUND_UP).intValue(); + BufferedImage croppedImageTopOne = bufferedImage.getSubimage(x, y, w - x, h - y); + images.add(croppedImageTopOne); + } + document.close(); + return images; + } + + /** + * 将BufferedImage 保存为 BMP文件 + * + * @param images : + * @return java.util.List + * @author 萧道子 2024/4/29 + */ + public static List saveBufferedImageToBmp(List images) throws IOException { + List fileList = new ArrayList<>(); + String path = fileConfig.getPath(); + // 创建文件夹 + FileUtil.mkdir(fileConfig.getPath()); + for (BufferedImage bufferedImage : images) { + String filePath = path + "/" + IdUtil.simpleUUID() + ".bmp"; + filePath = FileUtil.normalize(filePath); + File bmpFile = new File(filePath); + // 使用ImageIO将BufferedImage保存为BMP文件 + ImageIO.write(bufferedImage, "BMP", bmpFile); + fileList.add(bmpFile); + } + return fileList; + } + + /** + * 将base64保存为Bmp文件 + * + * @param base64 : + * @return java.util.List + * @author 萧道子 2024/4/29 + */ + public static List saveBase64ToBmp(String base64) throws IOException { + List bufferedImages = FileUtils.convertBase64PdfToBufferedImage(base64); + List files = FileUtils.saveBufferedImageToBmp(bufferedImages); + return files; + } + +} diff --git a/src/main/java/com/dpkj/modules/express/utils/PrinterUtil.java b/src/main/java/com/dpkj/modules/express/utils/PrinterUtil.java new file mode 100644 index 0000000..3e3288a --- /dev/null +++ b/src/main/java/com/dpkj/modules/express/utils/PrinterUtil.java @@ -0,0 +1,224 @@ +package com.dpkj.modules.express.utils; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; + +@Slf4j +public class PrinterUtil { + + /** + * 获取 MsPrintSdk 实例,同时注册 MsPrintSdk 控件。 + * + * @return MsPrintSdk 实例 + * @throws PrinterRegistrationException 如果注册控件失败,抛出此异常 + */ + public static MsPrintSdk getPrintSDK() throws PrinterRegistrationException { +/* String ocxPath = "src/lib/Msprintsdk.ocx"; + ProcessBuilder processBuilder = new ProcessBuilder("regsvr32", "/s", ocxPath); + try { + Process process = processBuilder.start(); + int exitCode = process.waitFor(); +// if (exitCode != 0) { +// throw new PrinterRegistrationException("Failed to register MsPrintSdk OCX. Exit code: " + exitCode); +// } + } catch (InterruptedException | IOException e) { + throw new PrinterRegistrationException("Error occurred while registering MsPrintSdk OCX.", e); + }*/ + + try { + return Native.load("Msprintsdk.x64", MsPrintSdk.class); + } catch (UnsatisfiedLinkError e) { + log.info("[printer][PrinterUtil.getPrintSDK] SDK注册失败 {}", e.getMessage()); + throw new PrinterRegistrationException("Failed to load MsPrintSdk library: ", e); + } + } + + public static void convertAndPassStringAsJCharArray(String filePath) { + // 将字符串转换为char[] + char[] chars = filePath.toCharArray(); + } + + /** + * 定义接口映射本地库中的函数。 + */ + public interface MsPrintSdk extends Library { + + /** + * 设置打印端口和波特率。 + * + * @param strPort 打印端口名 + * @param baudRate 波特率 + * @return 返回操作结果代码 + */ + Integer SetPrintPort(String strPort, int baudRate); + + /** + * 设置打印连接方式、名称和值。 + * + * @param iConnWay 连接方式 + * @param strName 名称 + * @param strValue 值 + * @return 返回操作结果代码 + */ + Integer SetPrintConn(int iConnWay, String strName, String strValue); + + /** + * 设置 USB 端口自动识别。 + * + * @return 返回操作结果代码 + */ + Integer SetUsbportauto(); + + /** + * 获取打印机状态。 + * 0 打印机正常 + * 1 打印机未连接或未上电 + * 2 打印机和调用库不匹配 + * 3 打印头打开 + * 4 切刀未复位 + * 5 打印头温度异常 + * 6 黑标错误,可能的情况为 黑标传感器坏 | 使用错误白纸 | 黑标不标准,浓度偏低 + * 7 纸尽 + * 8 纸将尽 + * + * @return 返回打印机状态代码 0:成功 1:失败 + */ + Integer GetStatus(); + + /** + * 获取打印机特殊功能状态 + * 0 打印机正常 + * 1 打印机未连接或未上电 + * 2 打印机和调用库不匹配 + * 3 当前使用打印机无特殊功能 + * 4 容纸器没有可靠上纸 + * 5 纸张堵在出票口,持续堆叠 + * 6 卡纸,出纸口未堵的情况下,胶辊无法驱动纸持续前进了。 比如纸卷在胶辊上了、切刀堵住了纸的前进、纸张被拉住无法前进等 + * 7 拽纸,打印机感受到凭条被外力拖拽 + * 8 出纸传感器有纸 + * + * @return 返回打印机状态代码 0:成功 1:失败 + */ + Integer GetStatusspecial(); + + /** + * 初始化打印机设置。 + * + * @return 返回操作结果代码 + */ + Integer SetInit(); + + /** + * 打印二维码。 + * + * @param s 二维码数据 + * @param i 参数 i + * @param i1 参数 i1 + * @param i2 参数 i2 + */ + void PrintQrcode(String s, int i, int i1, int i2); + + /** + * 设置左边距。 + * + * @param i 左边距值 + */ + void SetLeftmargin(int i); + + /** + * 打印字符串。 + * + * @param s 字符串内容 + * @param i 参数 i + * @return 返回操作结果代码 + */ + Integer PrintString(String s, int i); + + /** + * 打印剩余的二维码。 + * + * @return 返回操作结果代码 + */ + Integer PrintRemainQR(); + + /** + * 设置 设置汉字模式 模式。 + * + * @param i 模式参数 + * @return 返回操作结果代码 + */ + Integer SetReadZKmode(int i); + + /** + * 切纸。 + * + * @param i 切纸参数 + * 0 全切 + * 1 半切 + * @return 返回操作结果代码 + */ + Integer PrintCutpaper(int i); + + /** + * 设置 HT 座位信息。 + * + * @param s 座位信息 + * @param i 参数 i + */ + void SetHTseat(String s, int i); + + /** + * 打印下一个 HT 数据。 + */ + void PrintNextHT(); + + /** + * 打印BMP + * + * @param strPath BMP文件路径 + */ + Integer PrintDiskbmpfile(String strPath); + + /** + * 打印BMP + * + * @param strPath BMP文件路径 + */ + Integer PrintDiskimgfile(String strPath); + + + /** + * 检测黑标进纸到打印位置 + */ + Integer PrintMarkpositionPrint(); + + /** + * 检测黑标进纸到切纸位置 + */ + Integer PrintMarkpositioncut(); + + /** + * 打印黑标切纸 + *

+ * 0 检测黑标全切 + * 1 不检测黑标半切 + */ + Integer PrintMarkcutpaper(int iMode); + } + + /** + * 定义自定义异常类,用于表示注册控件时发生的错误 + */ + public static class PrinterRegistrationException extends Exception { + public PrinterRegistrationException(String message) { + super(message); + } + + public PrinterRegistrationException(String message, Throwable cause) { + super(message, cause); + } + } +} diff --git a/src/main/java/com/dpkj/modules/express/vo/Print.java b/src/main/java/com/dpkj/modules/express/vo/Print.java new file mode 100644 index 0000000..cae33cc --- /dev/null +++ b/src/main/java/com/dpkj/modules/express/vo/Print.java @@ -0,0 +1,19 @@ +package com.dpkj.modules.express.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * @Auther: 萧道子 + * @Date: 2024/4/29 17:03 + * @Description: + */ +@Data +@Accessors(chain = true) +public class Print implements Serializable { + private static final long serialVersionUID = 1L; + + private String base64; +} diff --git a/src/main/java/com/dpkj/modules/express/vo/PrinterStatus.java b/src/main/java/com/dpkj/modules/express/vo/PrinterStatus.java new file mode 100644 index 0000000..a174007 --- /dev/null +++ b/src/main/java/com/dpkj/modules/express/vo/PrinterStatus.java @@ -0,0 +1,28 @@ +package com.dpkj.modules.express.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * @Auther: 萧道子 + * @Date: 2024/4/28 14:44 + * @Description: + */ +@Data +@Accessors(chain = true) +public class PrinterStatus implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 状态 + */ + private int value; + + /** + * 描述 + */ + private String text; + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..4a97d5e --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,13 @@ +dpkj: + file: + # 文件保存地址 + path: G:\Temp\img + # 打印机配置 + printer: + # 打印机连接方式 USB: usb连接 | BTMS:串口连接 + connection-type: USB + # 打印端口 串口连接下使用 + port-name: + # 波特率 串口连接下使用 + baud-rate: + diff --git a/src/main/resources/application-pro.yml b/src/main/resources/application-pro.yml new file mode 100644 index 0000000..adba7f4 --- /dev/null +++ b/src/main/resources/application-pro.yml @@ -0,0 +1,13 @@ +dpkj: + file: + # 文件保存地址 + path: D:\Project\Express\upload + # 打印机配置 + printer: + # 打印机连接方式 USB: usb连接 | BTMS:串口连接 + connection-type: USB + # 打印端口 串口连接下使用 + port-name: + # 波特率 串口连接下使用 + baud-rate: + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..0fc081b --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,27 @@ +spring: + servlet: + multipart: + max-file-size: 10MB + max-request-size: 10MB + resource: + static-locations: classpath:/static/,classpath:/public/ + application: + name: ems-express-bridge + profiles: + #active: '@profile.name@' + active: pro + +server: + port: 5946 + servlet: + context-path: /api + tomcat: + max-swallow-size: -1 + error: + include-exception: true + include-stacktrace: ALWAYS + include-message: ALWAYS + compression: + enabled: true + min-response-size: 1024 + mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/* diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..afb7e6c --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n + + + + + + + + ${LOG_HOME}/%d{yyyy-MM-dd}.%i.log + + 30 + 10MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n + + + + + + + + ERROR + + + + %p%d%msg%M%F{32}%L + + + ${LOG_HOME}/error-log.html + + + + + + + + ${LOG_HOME}/%d{yyyy-MM-dd}.%i.html + + 30 + 10MB + + + + %p%d%msg%M%F{32}%L + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/win32-x86-64/Msprintsdk.ocx b/src/main/resources/win32-x86-64/Msprintsdk.ocx new file mode 100644 index 0000000..b20f9da Binary files /dev/null and b/src/main/resources/win32-x86-64/Msprintsdk.ocx differ diff --git a/src/main/resources/win32-x86-64/Msprintsdk.x64.dll b/src/main/resources/win32-x86-64/Msprintsdk.x64.dll new file mode 100644 index 0000000..a8a5a5c Binary files /dev/null and b/src/main/resources/win32-x86-64/Msprintsdk.x64.dll differ diff --git a/src/test/java/com/dpkj/ems/EmsExpressBridgeApplicationTests.java b/src/test/java/com/dpkj/ems/EmsExpressBridgeApplicationTests.java new file mode 100644 index 0000000..f8f9d75 --- /dev/null +++ b/src/test/java/com/dpkj/ems/EmsExpressBridgeApplicationTests.java @@ -0,0 +1,13 @@ +package com.dpkj.ems; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class EmsExpressBridgeApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/src/test/java/com/dpkj/ems/utils/PrinterUtilTest.java b/src/test/java/com/dpkj/ems/utils/PrinterUtilTest.java new file mode 100644 index 0000000..ad6d250 --- /dev/null +++ b/src/test/java/com/dpkj/ems/utils/PrinterUtilTest.java @@ -0,0 +1,79 @@ +package com.dpkj.ems.utils; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Console; +import com.dpkj.Application; +import com.dpkj.common.config.FileConfig; +import com.dpkj.modules.express.service.PrinterService; +import com.dpkj.modules.express.utils.FileUtils; +import com.dpkj.modules.express.utils.PrinterUtil; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class) +class PrinterUtilTest { + + @Autowired + private PrinterService printerService; + @Autowired + private FileConfig fileConfig; + + @Test + void getPrintSDK() throws PrinterUtil.PrinterRegistrationException { + PrinterUtil.MsPrintSdk sdk = PrinterUtil.getPrintSDK(); + int i = sdk.SetUsbportauto(); + Console.log(i); + + int i1 = sdk.SetInit(); + Console.log(i1); + + int i2 = sdk.GetStatusspecial(); + Console.log(i2); + } + + @Test + void t2() throws IOException { + String base64Path = "G:\\Temp\\text\\base64.txt"; + String base64 = FileUtil.readString(FileUtil.file(base64Path), StandardCharsets.UTF_8); + + String bpmPath = "G:\\Temp\\img"; + List bufferedImages = FileUtils.convertBase64PdfToBufferedImage(base64); + FileUtils.saveBufferedImageToBmp(bufferedImages); + } + + + @Test + void t3() throws Exception { + String base64Path = "G:\\Temp\\text\\base64.txt"; + String base64 = FileUtil.readString(FileUtil.file(base64Path), StandardCharsets.UTF_8); + + // String bpmPath = "G:\\Temp\\img"; + String bpmPath = fileConfig.getPath(); + List bufferedImages = FileUtils.convertBase64PdfToBufferedImage(base64); + List files = FileUtils.saveBufferedImageToBmp(bufferedImages); + + /*for (File file : files) { + String filePath = file.getAbsolutePath(); + printerService.printBmpByPath(filePath); + }*/ + } + + @Test + void t4() throws IOException { + String base64Path = "G:\\Temp\\text\\base64.txt"; + String base64 = FileUtil.readString(FileUtil.file(base64Path), StandardCharsets.UTF_8); + + List bufferedImages = FileUtils.convertBase64PdfToBufferedImage(base64); + System.out.println(bufferedImages); + } +} diff --git a/src/test/java/com/dpkj/ems/utils/PrinterUtilTest2.java b/src/test/java/com/dpkj/ems/utils/PrinterUtilTest2.java new file mode 100644 index 0000000..3f198fd --- /dev/null +++ b/src/test/java/com/dpkj/ems/utils/PrinterUtilTest2.java @@ -0,0 +1,22 @@ +package com.dpkj.ems.utils; + +import cn.hutool.core.io.FileUtil; +import com.dpkj.modules.express.utils.FileUtils; +import org.junit.jupiter.api.Test; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; + +class PrinterUtilTest2 { + + @Test + void t4() throws IOException { + String base64Path = "G:\\Temp\\text\\base64.txt"; + String base64 = FileUtil.readString(FileUtil.file(base64Path), StandardCharsets.UTF_8); + + List bufferedImages = FileUtils.convertBase64PdfToBufferedImage(base64); + System.out.println(bufferedImages); + } +}