package com.dpkj.common.utils; 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; import com.dpkj.common.exception.RRException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; /** * 第三方服务,主要是调用打印机等 * * @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; 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) { try { String urlStr = lexMarkServiceIp + ":" + lexMarkServicePort + "/CallDevice"; log.info("[ThirdService][callDevice][激光打印机打印] 利盟打印接口-url:{}", urlStr); String params = JSONObject.toJSONString(lexMarkDTO); log.info("[ThirdService][callDevice][激光打印机打印] 利盟打印接口-入参:{}", params); String bodyStr = HttpRequest.post(urlStr) .header("Content-Type", "application/json") .body(params) .timeout(30000) .execute() .body(); log.info("[ThirdService][callDevice][激光打印机打印] 利盟打印接口-响应:{}", bodyStr); JSONObject bodyJson = (JSONObject) JSONObject.parse(bodyStr); if (StrUtil.isEmpty(bodyJson.getString("param"))) { throw new RRException("利盟服务请求失败,结果响应为空"); } // 将响应JSON字符串转换为LexMarkResultDTO对象 LexMarkResultDTO obj = JSONObject.toJavaObject(bodyJson, LexMarkResultDTO.class); T paramObj = JSONObject.toJavaObject(bodyJson.getJSONObject("param"), clazz); obj.setData(paramObj); return obj; } catch (Exception e) { log.error("利盟服务请求失败:{}", lexMarkDTO, e); if (e instanceof RRException) { throw new RRException(((RRException) e).getCode(), e.getMessage()); } throw new RRException("利盟服务请求失败"); } } /** * 数据对象的data采用JSONObject进行接收 * * @param lexMarkDTO 请求参数 * @return result */ public LexMarkResultDTO callDevice(LexMarkDTO lexMarkDTO) { 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) + " 切纸失败!"); } } } }