yinyitong-zhongyuyuan-dll-hang/src/main/java/com/dpkj/modules/autoReplyPrint/controller/ReceiptPrintController.java

161 lines
6.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.dpkj.modules.autoReplyPrint.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dpkj.common.config.PrinterConfig;
import com.dpkj.common.exception.RRException;
import com.dpkj.common.vo.Result;
import com.dpkj.modules.autoReplyPrint.enums.ReceiptTemplateEnum;
import com.dpkj.modules.autoReplyPrint.request.ReceiptPrintRequest;
import com.dpkj.modules.autoReplyPrint.service.ImagePrintService;
import com.dpkj.modules.autoReplyPrint.service.impl.TemplateService;
import com.dpkj.modules.autoReplyPrint.utils.FolderUtils;
import com.dpkj.modules.autoReplyPrint.vo.PrinterStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
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.RestController;
import org.thymeleaf.util.StringUtils;
import javax.annotation.Resource;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 小票打印机控制层
*
* @author <a href="https://gitee.com/shi-chongli">石头人</a>
* @version 1.0
* @since 2025-03-10 9:29:22
*/
@Slf4j
@RestController
@RequestMapping("/receipt")
public class ReceiptPrintController {
@Resource
private PrinterConfig printerConfig;
private static final int MAX_HEIGHT = 1000;
private static final int FIXED_WIDTH = 730;
@Resource(name = "USBImagePrint")
private ImagePrintService usbImagePrintService;
@Resource
private TemplateService templateService;
@PostMapping("/print")
private Result<Void> print(@Validated @RequestBody ReceiptPrintRequest request) throws UnsupportedEncodingException {
FolderUtils.checkFolderAndCreate(request.getFileDir());
String devName = "VID:0x0FE6,PID:0x811E"; // 采用默认的devName不进行入参传值了
String templateName = ReceiptTemplateEnum.getTemplateName(request.getTemplateName());
// 宽度固定
request.setWidth(request.getWidth() > 610 ? 600 : request.getWidth());
JSONObject data = JSONObject.parseObject(URLDecoder.decode(request.getTemplateFillData(), "UTF-8"));
// 强行设置终端号 不需要固定,前端自己穿
// data.put("terminalNumber", printerConfig.getTerminalNumber());
// 强行设置打印时间
SimpleDateFormat sdf = new SimpleDateFormat(printerConfig.getTimeType());
String formattedDate = sdf.format(new Date());
data.put("printTime", formattedDate);
Integer height = request.getHeight();
int dinyHeight = 0;
if (templateName.equals("department")) {
// 由于是使用的门诊小票-T2那么默认的高度为1000强行设置通过动态修改渲染的图片的高度
height = 1100;
// 单行最大长度为10
int singleLineMaxLength = 10;
// 这里的长度取自于department.html模板中的项目单个tr高度并且略高于该高度
int singleLineHeight = 30;
// 动态计算长度
JSONArray items = data.getJSONArray("items");
for (Object item : items) {
JSONObject itemEntity = (JSONObject) item;
String projectName = String.valueOf(itemEntity.get("name"));
int length = projectName.length();
int count = (int) Math.ceil((double) length / singleLineMaxLength);
dinyHeight += count * singleLineHeight;
}
// 计算是否有门诊号
String outpatientNumber = data.getString("outpatientNumber");
if (!StringUtils.isEmpty(outpatientNumber)) {
dinyHeight += 28;
}
// 计算是否有就诊医生
String doctor = data.getString("doctor");
if (!StringUtils.isEmpty(doctor)) {
dinyHeight += 28;
}
// 计算是否有就诊科室
String department = data.getString("department");
if (!StringUtils.isEmpty(department)) {
dinyHeight += 28;
}
}
height += dinyHeight;
// 进行模板填充
// 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\"}";
StringBuilder filePath = new StringBuilder(request.getFileDir());
// 校验是否选中了模板,如果没选中模板的话则不需要另外生成了
if (!StringUtils.isEmpty(request.getTemplateName()) && !StringUtils.isEmpty(request.getFileDir())) {
byte[] image = templateService.generateReceiptImage(
data,
templateName,
request.getWidth(),
height,
filePath);
} else {
throw new RRException("模板渲染错误");
}
usbImagePrintService.imagePrintFromPath(devName,
request.getWidth(),
request.getHeight(),
filePath.toString(),
1,
0);
// 删除图片
File file = new File(filePath.toString());
// 检查文件是否存在
if (file.exists()) {
// 尝试删除文件
if (file.delete()) {
log.info("文件删除成功: " + filePath);
} else {
log.info("文件删除失败: " + filePath);
}
} else {
log.info("文件不存在: " + filePath);
}
return Result.ok();
}
@PostMapping("/getStatus")
public Result<PrinterStatus> print() {
String devName = "VID:0x0FE6,PID:0x811E"; // 采用默认的devName不进行入参传值了
return Result.ok(this.usbImagePrintService.getStatus(devName));
}
}