From 5427d7c414258b597b5f7af725462da873bcd13c Mon Sep 17 00:00:00 2001 From: zhaoyf <1783123481@qq.com> Date: Wed, 6 May 2026 14:29:00 +0800 Subject: [PATCH] =?UTF-8?q?add:=E5=A4=A7=E5=B1=8F=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E5=8A=9F=E8=83=BD-=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=B8=BAzpl=E6=8C=87=E4=BB=A4=E7=BD=91=E7=BB=9C=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HandheldController.java | 12 +++ .../wms/ext/handheld/dto/PrintEntityDto.java | 20 +++++ .../ext/handheld/service/HandheldService.java | 6 ++ .../service/impl/HandheldServiceImpl.java | 67 ++++++++++++++--- .../banmaSDK/BrowserPrint-3.1.250.min.js | 17 ----- .../BrowserPrint-Zebra-1.1.250.min.js | 26 ------- .../src/views/wms/produceScreen/index.vue | 73 ++++++++++++++++--- 7 files changed, 160 insertions(+), 61 deletions(-) create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/dto/PrintEntityDto.java delete mode 100644 lms/nladmin-ui/public/banmaSDK/BrowserPrint-3.1.250.min.js delete mode 100644 lms/nladmin-ui/public/banmaSDK/BrowserPrint-Zebra-1.1.250.min.js diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/controller/HandheldController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/controller/HandheldController.java index b621987..387bb46 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/controller/HandheldController.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/controller/HandheldController.java @@ -13,6 +13,7 @@ import org.nl.common.logging.annotation.Log; import org.nl.wms.ext.fab.service.dto.CallEmpVo; import org.nl.wms.ext.fab.service.impl.FabServiceImpl; import org.nl.wms.ext.handheld.dto.EmptyVehicleWarehousingDto; +import org.nl.wms.ext.handheld.dto.PrintEntityDto; import org.nl.wms.ext.handheld.service.HandheldService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -262,4 +263,15 @@ public class HandheldController { fabService.createAgvTask(toJSON, "cnt"); return new ResponseEntity(TableDataInfo.build(), HttpStatus.OK); } + + /** + * 大屏打印订单 + * @return + */ + @Log("大屏打印订单标签") + @PostMapping("/print") + public ResponseEntity print(@RequestBody PrintEntityDto printEntityDto) { + handheldService.print(printEntityDto); + return new ResponseEntity<>(HttpStatus.OK); + } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/dto/PrintEntityDto.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/dto/PrintEntityDto.java new file mode 100644 index 0000000..a8a0ba6 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/dto/PrintEntityDto.java @@ -0,0 +1,20 @@ +package org.nl.wms.ext.handheld.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class PrintEntityDto { + @JsonProperty("order_code") + private String orderCode; + @JsonProperty("create_time") + private String createTime; + @JsonProperty("material_qty") + private String materialQty; + @JsonProperty("material_id") + private String materialId; + @JsonProperty("material_code") + private String MaterialCode; + @JsonProperty("username") + private String username; +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/HandheldService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/HandheldService.java index e3130e6..b89876c 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/HandheldService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/HandheldService.java @@ -3,6 +3,7 @@ package org.nl.wms.ext.handheld.service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.nl.wms.ext.handheld.dto.EmptyVehicleWarehousingDto; +import org.nl.wms.ext.handheld.dto.PrintEntityDto; import org.nl.wms.sch.group_delete_log.service.dto.SD01GroupLogRespondDto; import java.util.List; @@ -207,4 +208,9 @@ public interface HandheldService { */ JSONObject queryVehicleTaskStatus(String vehicleCode); + /** + * 大屏打印订单标签 + * @param printEntityDto 打印内容实体 + */ + void print(PrintEntityDto printEntityDto); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/impl/HandheldServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/impl/HandheldServiceImpl.java index bb82df9..1b3261d 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/impl/HandheldServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/impl/HandheldServiceImpl.java @@ -1,21 +1,16 @@ package org.nl.wms.ext.handheld.service.impl; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; -import java.math.BigDecimal; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.Synchronized; import nl.basjes.shaded.org.springframework.util.Assert; import org.apache.commons.lang3.StringUtils; import org.nl.common.enums.GoodsEnum; @@ -24,13 +19,13 @@ import org.nl.common.enums.region.RegionEnum; import org.nl.system.service.dict.ISysDictService; import org.nl.system.service.dict.dao.Dict; import org.nl.wms.ext.handheld.dto.EmptyVehicleWarehousingDto; +import org.nl.wms.ext.handheld.dto.PrintEntityDto; import org.nl.wms.ext.handheld.dto.VehicleDto; import org.nl.wms.sch.group_delete_log.service.dao.SchBaseVehiclematerialgroupDeleteLog; import org.nl.wms.sch.group_delete_log.service.ISchBaseVehiclematerialgroupDeleteLogService; import org.nl.wms.sch.group_delete_log.service.dto.LogMaterialDto; import org.nl.wms.sch.group_delete_log.service.dto.SD01GroupLogRespondDto; import org.nl.wms.sch.task.service.dao.SchBaseTask; -import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.RedisUtils; import org.nl.common.utils.SecurityUtils; @@ -59,17 +54,20 @@ import org.nl.wms.sch.task_manage.GeneralDefinition; import org.nl.wms.sch.task_manage.task.TaskFactory; import org.nl.wms.sch.task_manage.task.core.TaskStatus; import org.nl.wms.sch.task_manage.task.core.TaskType; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicBoolean; + import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; @@ -117,6 +115,9 @@ public class HandheldServiceImpl implements HandheldService { // 线程池,用于异步执行任务 private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + @Autowired + private SysParamServiceImpl sysParamServiceImpl; + @Override @@ -1720,4 +1721,52 @@ public class HandheldServiceImpl implements HandheldService { } } + + @Override + public void print(PrintEntityDto printEntityDto) { + String ip = sysParamServiceImpl.findByCode("printerIP").getValue(); + String port = sysParamServiceImpl.findByCode("printerPort").getValue(); + if (ip == null || StringUtils.isBlank(ip)) { + throw new BadRequestException("打印出错:未配置打印机IP(printerIP)"); + } + if (port == null || StringUtils.isBlank(port)) { + throw new BadRequestException("打印出错:未配置打印机端口(printerPort)"); + } + try (Socket client = new Socket()) { + // 3. 设置超时时间,防止网络不通时线程卡死 (单位:毫秒) + client.connect(new InetSocketAddress(ip, Integer.parseInt(port)), 3000); // 连接超时 3秒 + client.setSoTimeout(10000); // 读取超时 10秒 + + try (OutputStream outputStream = client.getOutputStream()) { + StringBuilder zplStr = new StringBuilder(); + // TODO: 在此拼接 ZPL 指令 + zplStr.append("^XA");//开始 + zplStr.append("^CI28");// 启用UTF-8字符集,支持中文显示(部分老机型若乱码请改用 ^CI13) + zplStr.append("^CW1,E:SIMSUN.FNT");//设置中文字体 + zplStr.append("^FO50,75^A1,55,55^FD订单号:^FS"); + zplStr.append("^FO250,50^BC,50,50^FD"+printEntityDto.getOrderCode()+"^FS");//订单号条码 + zplStr.append("^FO250,100^A1,50,50^FD"+printEntityDto.getOrderCode()+"^FS");//订单号 + zplStr.append("^FO50,175^A1,55,55^FD物料号:^FS"); + zplStr.append("^FO250,150^BC,50,50^FD"+printEntityDto.getOrderCode()+"^FS");//物料号条码 + zplStr.append("^FO250,200^A1,50,50^FD"+printEntityDto.getOrderCode()+"^FS");//物料号 + zplStr.append("^FO50,275^A1,55,55^FD数量:^FS"); + zplStr.append("^FO250,275^A1,50,50^FD"+printEntityDto.getMaterialQty()+"^FS");//数量 + zplStr.append("^FO50,350^A1,55,55^FD日期:^FS"); + zplStr.append("^FO250,350^A1,50,50^FD"+printEntityDto.getCreateTime()+"^FS");//日期 + zplStr.append("^FO50,425^A1,55,55^FD人员:^FS"); + zplStr.append("^FO250,425^A1,50,50^FD"+printEntityDto.getUsername()+"^FS");//人员 + zplStr.append("^XZ");//结束 + + // 4. 将 ZPL 指令写入输出流并发送 + if (zplStr.length() > 0) { + outputStream.write(zplStr.toString().getBytes(StandardCharsets.UTF_8)); + outputStream.flush(); // 必须 flush,确保数据发送到打印机 + } + } + } catch (IOException e) { + // 5. 异常处理:不要仅仅抛出 e.getMessage(),有时候它为空 + throw new BadRequestException("打印出错,连接打印机失败: " + e.getMessage()); + } + + } } diff --git a/lms/nladmin-ui/public/banmaSDK/BrowserPrint-3.1.250.min.js b/lms/nladmin-ui/public/banmaSDK/BrowserPrint-3.1.250.min.js deleted file mode 100644 index 509159a..0000000 --- a/lms/nladmin-ui/public/banmaSDK/BrowserPrint-3.1.250.min.js +++ /dev/null @@ -1,17 +0,0 @@ -var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.checkStringArgs=function(e,g,k){if(null==e)throw new TypeError("The 'this' value for String.prototype."+k+" must not be null or undefined");if(g instanceof RegExp)throw new TypeError("First argument to String.prototype."+k+" must not be a regular expression");return e+""};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1; -$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(e,g,k){e!=Array.prototype&&e!=Object.prototype&&(e[g]=k.value)};$jscomp.getGlobal=function(e){return"undefined"!=typeof window&&window===e?e:"undefined"!=typeof global&&null!=global?global:e};$jscomp.global=$jscomp.getGlobal(this); -$jscomp.polyfill=function(e,g,k,h){if(g){k=$jscomp.global;e=e.split(".");for(h=0;h=g}},"es6","es3"); -var BrowserPrint=function(){function e(a,c){var b=new XMLHttpRequest;"withCredentials"in b?b.open(a,c,!0):"undefined"!=typeof XDomainRequest?(b=new XDomainRequest,b.open(a,c)):b=null;return b}function g(a,c,b,d){void 0!==a&&(void 0===b&&(b=a.sendFinishedCallback),void 0===d&&(d=a.sendErrorCallback));return h(c,b,d)}function k(a,c,b){void 0===c&&(c=f.defaultSuccessCallback);void 0===b&&(b=f.defaultErrorCallback);return h(a,c,b)}function h(a,c,b){a.onreadystatechange=function(){a.readyState===XMLHttpRequest.DONE&& -200===a.status?""===a.responseType?c(a.responseText):c(a.response):a.readyState===XMLHttpRequest.DONE&&(b?b(a.response):console.log("error occurred with no errorCallback set."))};return a}var f={},p={},q=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);navigator.userAgent.indexOf("Trident/7.0");var m="http://127.0.0.1:9100/";q&&"https:"===location.protocol&&(m="https://127.0.0.1:9101/");f.Device=function(a){var c=this;this.name=a.name;this.deviceType=a.deviceType;this.connection=a.connection; -this.uid=a.uid;this.version=2;this.provider=a.provider;this.manufacturer=a.manufacturer;this.readRetries="bluetooth"===this.connection?1:0;this.sendErrorCallback=function(b){};this.sendFinishedCallback=function(b){};this.readErrorCallback=function(b){};this.readFinishedCallback=function(b){};this.send=function(b,a,l){var d=e("POST",m+"write");d&&(g(c,d,a,l),d.send(JSON.stringify({device:{name:this.name,uid:this.uid,connection:this.connection,deviceType:this.deviceType,version:this.version,provider:this.provider, -manufacturer:this.manufacturer},data:b})))};this.sendUrl=function(b,a,l,r){var d=e("POST",m+"write");d&&(g(c,d,a,l),b={device:{name:this.name,uid:this.uid,connection:this.connection,deviceType:this.deviceType,version:this.version,provider:this.provider,manufacturer:this.manufacturer},url:b},null!=r&&void 0!=r&&(b.options=r),d.send(JSON.stringify(b)))};this.sendFile=function(b,a,l){if("string"===typeof b)f.loadFileFromUrl(b,function(b){c.sendFile(b,a,l)},l);else{var d=e("POST",m+"write");if(d){d.responseType= -"text";k(d,a,l);var n=new FormData,g={};g.device=c;n.append("json",JSON.stringify(g));n.append("blob",b);d.send(n)}}};this.convertAndSendFile=function(b,a,l,c){c||(c={});c.action||(c.action="print");f.convert(b,this,c,a,l)};this.read=function(b,a){var d=e("POST",m+"read");d&&(void 0!==c&&(void 0===b&&(b=c.readFinishedCallback),void 0===a&&(a=c.readErrorCallback)),h(d,b,a),d.send(JSON.stringify({device:{name:this.name,uid:this.uid,connection:this.connection,deviceType:this.deviceType,version:this.version, -provider:this.provider,manufacturer:this.manufacturer}})))};this.readUntilStringReceived=function(a,d,c,e,f){f||(f="");void 0===e&&(e=this.readRetries);d=function(b,d,c,l,e){return function(f){if(f&&0!==f.length)l=0;else if(0>=l){d(e);return}f=e+f;""!==a&&-1 + +
+
自定义打印
+
+
+ +
+
订单号
+
+
+ + +
+
物料号
+
+
+ + +
+
数量
+
+
+ + +
+
日期
+
+
+ + +
+
人员
+
+
+
+
+ + + + + + + + +
@@ -452,8 +497,6 @@ import crudProduceScreen from './produceScreen' import {getAgvStatus} from '@/api/agv_alarm' // import crudProduceScreen from './mork' -const bp = window.BrowserPrint -console.log('斑马打印sdk加载',bp) export default { data() { return { @@ -482,7 +525,16 @@ export default { errorDetails: [], errorShow: false, printShow: false, + customPrintShow: false, printData: {}, + customPrintData: { + order_code: '', + create_time: new Date().toLocaleString() || '', + material_qty: '', + material_id: '', + material_code: '', + username: JSON.parse(localStorage.getItem('screenData')).username + } } }, computed: { @@ -583,21 +635,24 @@ export default { this.show = true } }, - doPrint(row){ - console.log(localStorage.getItem('screenData')) - + doPrint(row) { + console.log(row) this.printShow = true this.printData = row this.printData.username = JSON.parse(localStorage.getItem('screenData')).username || '' - }, - confirmPrint(){ + confirmCustomPrint() { + console.log(this.customPrintData) + this.customPrintShow = false + }, + confirmPrint() { console.log(this.printData) this.printShow = false this.printData = {} }, - customPrint(){ - + customPrint() { + this.customPrintData.create_time = new Date().toLocaleString() + this.customPrintShow = true }, handleCurrentChange(val) { if (val) {