diff --git a/wms/nladmin-system/nlsso-server/pom.xml b/wms/nladmin-system/nlsso-server/pom.xml index 8ad737a..3e46026 100644 --- a/wms/nladmin-system/nlsso-server/pom.xml +++ b/wms/nladmin-system/nlsso-server/pom.xml @@ -236,17 +236,17 @@ org.apache.poi poi-ooxml-schemas - 3.17 + 4.0.0 org.apache.poi poi - 3.17 + 4.0.0 org.apache.poi poi-ooxml - 3.17 + 4.0.0 xerces diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/FileUtil.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/FileUtil.java index a03479e..b8eaaeb 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/FileUtil.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/FileUtil.java @@ -1,4 +1,4 @@ -/* +package org.nl.common.utils;/* * Copyright 2019-2020 Zheng Jie * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,18 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.nl.common.utils; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.poi.excel.BigExcelWriter; import cn.hutool.poi.excel.ExcelUtil; +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.streaming.SXSSFSheet; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.nl.common.exception.BadRequestException; -import org.nl.config.language.LangProcess; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; @@ -34,6 +36,7 @@ import java.io.*; import java.security.MessageDigest; import java.text.DecimalFormat; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; @@ -44,9 +47,10 @@ import java.util.Map; * @author Zheng Jie * @date 2018-12-27 */ +@Slf4j public class FileUtil extends cn.hutool.core.io.FileUtil { - private static final Logger log = LoggerFactory.getLogger(FileUtil.class); + private Integer batchWriteExcelRowAmount = 500; /** * 系统临时目录 @@ -205,26 +209,116 @@ public class FileUtil extends cn.hutool.core.io.FileUtil { * 导出excel */ public static void downloadExcel(List> list, HttpServletResponse response) throws IOException { - String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx"; - File file = new File(tempPath); - BigExcelWriter writer = ExcelUtil.getBigWriter(file); - // 一次性写出内容,使用默认样式,强制输出标题 - writer.write(list, true); - SXSSFSheet sheet = (SXSSFSheet)writer.getSheet(); - //上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法 - sheet.trackAllColumnsForAutoSizing(); - //列宽自适应 - writer.autoSizeColumnAll(); - //response为HttpServletResponse对象 - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); - //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 - response.setHeader("Content-Disposition", "attachment;filename=file.xlsx"); - ServletOutputStream out = response.getOutputStream(); - // 终止后删除临时文件 - file.deleteOnExit(); - writer.flush(out, true); - //此处记得关闭输出Servlet流 - IoUtil.close(out); + ServletOutputStream out = null; + BigExcelWriter writer; + try { + String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx"; + File file = new File(tempPath); + writer = ExcelUtil.getBigWriter(file); + // 一次性写出内容,使用默认样式,强制输出标题 + writer.write(list, true); + SXSSFSheet sheet = (SXSSFSheet) writer.getSheet(); + //上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法 + sheet.trackAllColumnsForAutoSizing(); + //列宽自适应 + writer.autoSizeColumnAll(); + //response为HttpServletResponse对象 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 + response.setHeader("Content-Disposition", "attachment;filename=file.xlsx"); + out = response.getOutputStream(); + // 终止后删除临时文件 + file.deleteOnExit(); + writer.flush(out, true); + } finally { + //此处记得关闭输出Servlet流 + if (ObjectUtil.isNotEmpty(out)) { + IoUtil.close(out); + } + } + + } + + /** + * 流导出:后续改成导出文件 + * @param list + * @param response + * @throws IOException + */ + public void downloadExcelIO(List> list, String[] columnExcelNameArr, HttpServletResponse response) { + List> lastRestDataList = list; + List>> dataPiece = Lists.partition(list, 5000); + int blockNum = 0; + int blockNumMax = dataPiece.size(); + List allFileLocations = new ArrayList<>(); + ServletOutputStream out = null; + try { + boolean allFinish = false; + while (!allFinish) { + int thisFileRowNumber = 1; + SXSSFWorkbook wb = null; + try { +// if (blockNum columnMap = lastRestDataList.get(i); + for (int cellNum = 0; cellNum < columnExcelNameArr.length; cellNum++) { + Cell cell = dataRow.createCell(cellNum); + String valueStr = columnMap.get(columnExcelNameArr[cellNum]); + cell.setCellValue(valueStr); + } + thisFileRowNumber++; + } + } + + String localFilePath = SYS_TEM_DIR + IdUtil.fastSimpleUUID()+ blockNum + ".xlsx"; + allFileLocations.add(localFilePath); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename="+localFilePath); + out = response.getOutputStream(); + wb.write(out); + // 必须清理流式写入Excel生成的临时文件 + wb.dispose(); + allFinish = true; + }catch (Exception ex){ + log.warn(ex.getMessage()); + throw new BadRequestException(ex.getMessage()); + } finally { + if (out != null) { + try { + out.flush(); + out.close(); + } catch (IOException e) {log.warn(e.getMessage());} + } + if (wb != null) { + try { + wb.dispose(); + } catch (Exception e) {log.warn(e.getMessage());} + } + } + } + }finally { + if (out != null) { + try { + out.flush(); + out.close(); + } catch (IOException e) {log.warn(e.getMessage());} + } + } } public static String getFileType(String type) { @@ -249,7 +343,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil { // 1M int len = 1024 * 1024; if (size > (maxSize * len)) { - throw new BadRequestException(LangProcess.msg("error_File_1")); + throw new BadRequestException("文件超出规定大小!"); } } @@ -343,5 +437,6 @@ public class FileUtil extends cn.hutool.core.io.FileUtil { public static String getMd5(File file) { return getMd5(getByte(file)); } - } + + diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/start/Init.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/start/Init.java index eee9df9..e69783a 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/start/Init.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/start/Init.java @@ -29,7 +29,7 @@ public class Init implements ApplicationRunner { public void run(ApplicationArguments args) throws Exception { // initTwoAttr(4,30,3,2, "2"); // createAttr(); -// initTwoAttr2(9,11,3); +// initTwoAttr2(4,10,3); } @@ -66,15 +66,15 @@ public class Init implements ApplicationRunner { col_num = "0" + i; } - String struct_code = "B" + row + "-" + col_num + "-" + layer_num + ""; + String struct_code = "Z" + row + "-" + col_num + "-" + layer_num + ""; // 新增仓位 - json.setSect_id("1945408460665524224"); - json.setSect_code("ZC01"); - json.setSect_name("主存区"); - json.setStor_id("1582991156504039424"); - json.setStor_code("BA01"); - json.setStor_name("北安仓库"); + json.setSect_id("1993215690856861696"); + json.setSect_code("ZZC01"); + json.setSect_name("中间站(2)主存区"); + json.setStor_id("1582991156504039423"); + json.setStor_code("ZJZ01"); + json.setStor_name("中间站(2)仓库"); json.setLock_type("0"); json.setRow_num(BigDecimal.valueOf(row_num)); @@ -83,17 +83,9 @@ public class Init implements ApplicationRunner { json.setBlock_num(BigDecimal.valueOf(1)); json.setStruct_code(struct_code); - json.setStruct_name(row + "排" + col_num+ "列"+ layer_num +"层"); + json.setStruct_name("Z"+row + "排" + col_num+ "列"+ layer_num +"层"); json.setSimple_name(json.getStruct_name()); - // 长宽高 - json.setZdepth(BigDecimal.valueOf(2700)); - json.setWidth(BigDecimal.valueOf(1100)); - json.setHeight(BigDecimal.valueOf(4000)); - - // 载具类型 - json.setStoragevehicle_type("3"); - json.setCreate_id("1"); json.setCreate_name("管理员"); json.setCreate_time(DateUtil.now()); diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/logging/SysLogController.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/logging/SysLogController.java index f9d98b8..13dd4ca 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/logging/SysLogController.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/logging/SysLogController.java @@ -13,6 +13,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.Map; /** @@ -67,5 +69,11 @@ public class SysLogController { logService.delAllByInfo(); return new ResponseEntity<>(HttpStatus.OK); } + + @Log("导出数据") + @GetMapping(value = "/download") + public void download(@RequestParam Map map, HttpServletResponse response, String[] product_area) throws IOException { + logService.download(map, response, product_area); + } } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java index 6fb8bef..787109e 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java @@ -94,14 +94,14 @@ public class UserController { @PostMapping(value = "/updatePass") public ResponseEntity updatePass(@RequestBody JSONObject passVo) throws Exception { // 解密,得到字符密码 - String oldPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey,passVo.getString("oldPass")); - String newPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey,passVo.getString("newPass")); + String oldPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, passVo.getString("oldPass")); + String newPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, passVo.getString("newPass")); SysUser user = userService.getOne(new LambdaQueryWrapper().eq(SysUser::getUsername, SecurityUtils.getCurrentUsername())); - if (!SaSecureUtil.md5BySalt(user.getPassword(), "salt").equals(SaSecureUtil.md5BySalt(oldPass, "salt"))) { - throw new BadRequestException(LangProcess.msg("login_pwd_1")); + if (!user.getPassword().equals(SaSecureUtil.md5BySalt(oldPass,"salt"))) { + throw new BadRequestException("修改失败,旧密码错误"); } - if (!SaSecureUtil.md5BySalt(user.getPassword(), "salt").equals(SaSecureUtil.md5BySalt(newPass, "salt"))) { - throw new BadRequestException(LangProcess.msg("login_pwd_2")); + if (user.getPassword().equals(SaSecureUtil.md5BySalt(newPass, "salt"))) { + throw new BadRequestException("新密码不能与旧密码相同"); } user.setPassword(SaSecureUtil.md5BySalt(newPass, "salt")); userService.updateById(user); diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/ISysLogService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/ISysLogService.java index 7300bd1..5701586 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/ISysLogService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/ISysLogService.java @@ -7,6 +7,8 @@ import org.nl.common.domain.query.PageQuery; import org.nl.system.service.logging.dao.SysLog; import org.springframework.scheduling.annotation.Async; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.Map; /** @@ -54,4 +56,6 @@ public interface ISysLogService extends IService { */ @Async void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, SysLog log); + + void download(Map map, HttpServletResponse response, String[] product_area) throws IOException; } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java index eac87a4..b899b87 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java @@ -15,6 +15,8 @@ import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.reflect.MethodSignature; import org.nl.common.domain.query.PageQuery; import org.nl.common.logging.annotation.Log; +import org.nl.common.utils.FileUtil; +import org.nl.common.utils.SecurityUtils; import org.nl.common.utils.StringUtils; import org.nl.common.utils.ValidationUtil; import org.nl.system.service.logging.ISysLogService; @@ -25,12 +27,11 @@ import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.lang.reflect.Method; import java.lang.reflect.Parameter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** *

@@ -112,6 +113,38 @@ public class SysLogServiceImpl extends ServiceImpl impleme logDto.setCreate_time(DateUtil.now()); logMapper.insert(logDto); } + + @Override + public void download(Map map, HttpServletResponse response, String[] product_area) throws IOException { + String blurry = ObjectUtil.isNotEmpty(map.get("blurry"))?map.get("blurry").toString():null; + String log_type = ObjectUtil.isNotEmpty(map.get("log_type"))?map.get("log_type").toString():null; + String username = ObjectUtil.isNotEmpty(map.get("username"))?map.get("username").toString():null; + String begin_time = ObjectUtil.isNotEmpty(map.get("begin_time"))?map.get("begin_time").toString():null; + String end_time = ObjectUtil.isNotEmpty(map.get("end_time"))?map.get("end_time").toString():null; + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.eq(ObjectUtil.isNotEmpty(log_type), SysLog::getLog_type, log_type) + .eq(ObjectUtil.isNotEmpty(username), SysLog::getUsername, username) + .like(ObjectUtil.isNotEmpty(blurry), SysLog::getDescription, blurry) + .le(ObjectUtil.isNotEmpty(end_time), SysLog::getCreate_time, end_time) + .ge(ObjectUtil.isNotEmpty(begin_time), SysLog::getCreate_time, begin_time) + .orderByDesc(SysLog::getCreate_time); + List dataList = this.list(lam); + List> list = new ArrayList<>(); + for (int i = 0; i < dataList.size(); i++) { + SysLog sysLog = dataList.get(i); + Map mp = new LinkedHashMap<>(); + mp.put("用户名", SecurityUtils.getCurrentNickName()); + mp.put("IP", sysLog.getRequest_ip()); + mp.put("IP来源", sysLog.getAddress()); + mp.put("描述", sysLog.getDescription()); + mp.put("浏览器", sysLog.getBrowser()); + mp.put("请求耗时", sysLog.getTime() + "ms"); + mp.put("创建日期", sysLog.getCreate_time()); + list.add(mp); + } + FileUtil.downloadExcel(list, response); + } + /** * 根据方法和传入的参数获取请求参数 */ diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/BuckController.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/BuckController.java index 651d213..1b1fc72 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/BuckController.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/BuckController.java @@ -5,6 +5,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.common.base.TableDataInfo; import org.nl.common.domain.query.PageQuery; +import org.nl.common.exception.BadRequestException; import org.nl.common.logging.annotation.Log; import org.nl.wms.basedata_manage.service.IMdPdGroupbucketService; import org.nl.wms.basedata_manage.service.dao.MdPdGroupbucket; diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/MdMeMaterialbase.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/MdMeMaterialbase.java index b4675ee..4f84f00 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/MdMeMaterialbase.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/MdMeMaterialbase.java @@ -187,5 +187,20 @@ public class MdMeMaterialbase implements Serializable { */ private String execution_stand; + /** + * 供应商编码 + */ + private String supp_code; + + /** + * 质量代码 + */ + private String quality_code; + + /** + * 生产商 + */ + private String produce_name; + } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdMeMaterialbaseMapper.xml b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdMeMaterialbaseMapper.xml index 0af4b95..273a39e 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdMeMaterialbaseMapper.xml +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdMeMaterialbaseMapper.xml @@ -5,10 +5,12 @@ diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/controller/AcsToWmsController.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/controller/AcsToWmsController.java index 9ccba63..0948fb5 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/controller/AcsToWmsController.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/controller/AcsToWmsController.java @@ -42,4 +42,11 @@ public class AcsToWmsController { return new ResponseEntity<>(acsToWmsService.resultCar(whereJson), HttpStatus.OK); } + @PostMapping("/applyTask") + @Log(value = "ACS向WMS申请任务") + @SaIgnore + public ResponseEntity applyTask(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(acsToWmsService.applyTask(whereJson), HttpStatus.OK); + } + } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/AcsToWmsService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/AcsToWmsService.java index 8a16b0a..25aacb6 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/AcsToWmsService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/AcsToWmsService.java @@ -34,4 +34,14 @@ public interface AcsToWmsService { * @return BaseResponse */ BaseResponse resultCar(JSONObject whereJson); + + /** + * ACS向WMS申请任务 + * @param whereJson { + * type:1-缠绕机 2- 机械手 + * type_dtl:1-申请取货 2-申请放货 + * } + * @return BaseResponse + */ + BaseResponse applyTask(JSONObject whereJson); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/WmsToNotCarService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/WmsToNotCarService.java index 10749e5..7d0d96e 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/WmsToNotCarService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/WmsToNotCarService.java @@ -54,4 +54,19 @@ public interface WmsToNotCarService { * @return NoCarResponse */ NoCarResponse callNotCat(JSONObject whereJson); + + /** + * 装货任务完成反馈 + * + * @param param { + * "requestType": "WCS_110", + * "accessId": "1", + * "requestId": "唯一标识", + * "data": { + * "taskNo":"呼叫时的任务号" + * } + * } + * @return NoCarResponse + */ + NoCarResponse continueTask(JSONObject param); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java index 7e971ac..e87cfd3 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java @@ -1,28 +1,21 @@ package org.nl.wms.ext.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.io.unit.DataUnit; -import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import lombok.Data; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.nl.common.exception.BadRequestException; -import org.nl.common.hikvision.HikvisionSnapshotUtil; import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService; -import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo; import org.nl.wms.ext.enums.ResultAcsStatus; import org.nl.wms.ext.service.AcsToWmsService; import org.nl.wms.ext.util.BaseResponse; import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.ISchBaseTaskService; -import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.sch_manage.service.SecondaryPackagingService; import org.nl.wms.sch_manage.service.dao.SchBaseTask; import org.nl.wms.sch_manage.service.util.AbstractTask; import org.nl.wms.sch_manage.service.util.TaskFactory; -import org.nl.wms.sch_manage.service.util.tasks.EmpVehicleInTask; import org.nl.wms.warehouse_management.enums.IOSConstant; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; @@ -74,6 +67,12 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Autowired private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService; + /** + * 申请任务 + */ + @Autowired + private SecondaryPackagingService secondaryPackagingService; + @Override @Transactional(rollbackFor = Exception.class) @SneakyThrows @@ -150,4 +149,54 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { log.info("ACS向WMS反馈任务车号,返回参数:--------------------------------------" + BaseResponse.responseOk().toString()); return BaseResponse.responseOk(); } + + @Override + @Transactional(rollbackFor = Exception.class) + @SneakyThrows + public BaseResponse applyTask(JSONObject whereJson) { + log.info("ACS向WMS申请任务,请求参数:--------------------------------------" + whereJson.toString()); + String device_code = whereJson.getString("device_code"); + String type = whereJson.getString("type"); + String type_dtl = whereJson.getString("type_dtl"); + + RLock lock = redissonClient.getLock(device_code); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock) { + // 缠绕机 + if (type.equals(IOSConstant.ONE)) { + if (type_dtl.equals(IOSConstant.ONE)) { + // 下料 + secondaryPackagingService.wrappingDown(whereJson); + } + if (type_dtl.equals(IOSConstant.TWO)) { + // 上料 由码垛下料生成 + // secondaryPackagingService.wrappingCall(whereJson); + } + } + // 机械手 + if (type.equals(IOSConstant.TWO)) { + if (type_dtl.equals(IOSConstant.ONE)) { + // 下料 + secondaryPackagingService.palletizingDown(whereJson); + } + if (type_dtl.equals(IOSConstant.TWO)) { + // 上料 + secondaryPackagingService.palletizingCallEmpty(whereJson); + } + } + } else { + throw new BadRequestException("设备编码为:" + device_code + "的设备正在操作中!"); + } + } catch (Exception e) { + log.info("ACS向WMS申请任务,返回参数:--------------------------------------" + BaseResponse.requestError(e.getMessage()).toString()); + return BaseResponse.requestError(e.getMessage()); + } finally { + if (tryLock) { + lock.unlock(); + } + } + log.info("ACS向WMS申请任务,返回参数:--------------------------------------" + BaseResponse.responseOk().toString()); + return BaseResponse.responseOk(); + } } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/NotCarToWmsServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/NotCarToWmsServiceImpl.java index ac8b37e..cc413e0 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/NotCarToWmsServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/NotCarToWmsServiceImpl.java @@ -5,6 +5,10 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.nl.config.SpringContextHolder; +import org.nl.system.service.param.ISysParamService; +import org.nl.system.service.param.dao.Param; +import org.nl.system.service.param.impl.SysParamServiceImpl; import org.nl.wms.ext.service.NotCarToWmsService; import org.nl.wms.ext.util.NoCarResponse; import org.nl.wms.sch_manage.service.ISchBasePointService; @@ -50,6 +54,12 @@ public class NotCarToWmsServiceImpl implements NotCarToWmsService { @Resource private NoCarUnloadTask noCarUnloadTask; + /** + * 系统参数服务 + */ + @Resource + private ISysParamService iSysParamService; + @Override @SneakyThrows public NoCarResponse sendTask(JSONObject whereJson) { @@ -121,6 +131,17 @@ public class NotCarToWmsServiceImpl implements NotCarToWmsService { if (tryLock) { JSONObject data = whereJson.getJSONObject("data"); String statusType = data.getString("statusType"); + if (statusType.equals(IOSConstant.ZERO)) { + // 判断任务号是否一致 + Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("NO_CAR_TASK"); + String taskNo = data.getString("taskNo"); + if (!taskNo.equals(sysParamService.getValue())) { + return NoCarResponse.requestError("任务号与呼叫时不一致!"); + } + // 更新值为1 + sysParamService.setRemark(IOSConstant.ONE); + iSysParamService.updateById(sysParamService); + } // 前往点位 } else { log.info("无人车到达输出参数:{}", NoCarResponse.requestError("当前任务正在执行中,请稍后在试...").toString()); @@ -131,7 +152,7 @@ public class NotCarToWmsServiceImpl implements NotCarToWmsService { lock.unlock(); } } - // log.info("无人车到达输出参数:{}", NoCarResponse.responseOk().toString()); + log.info("无人车到达输出参数:{}", NoCarResponse.responseOk().toString()); return NoCarResponse.responseOk(); } } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/WmsToNotCarServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/WmsToNotCarServiceImpl.java index 28d2a65..555bd58 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/WmsToNotCarServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/WmsToNotCarServiceImpl.java @@ -106,4 +106,45 @@ public class WmsToNotCarServiceImpl implements WmsToNotCarService { } return resultCar; } + + @Override + public NoCarResponse continueTask(JSONObject param) { + log.info("下发无人车接口continueTask的输入参数为:-------------------" + param.toString()); + // 返回参数 + NoCarResponse resultCar; + + // 系统参数类 + SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class); + //判断是否连接无人车系统 + Param isConnectCar = sysParamService.findByCode(SysParamConstant.IS_NOT_CAR); + if (ObjectUtil.isEmpty(isConnectCar)) { + return NoCarResponse.requestError("系统参数表中:" + SysParamConstant.IS_NOT_CAR + "不存在"); + } + if (isConnectCar.getValue().equals(IOSConstant.ONE)) { + return NoCarResponse.responseOk("下发成功,未连接无人车系统!"); + } + + //无人车系统地址ip + Param acsUrlParam = sysParamService.findByCode(SysParamConstant.CAR_URL); + if (ObjectUtil.isEmpty(acsUrlParam)) { + return NoCarResponse.requestError("系统参数表中:" + SysParamConstant.CAR_URL + "不存在"); + } + + String url = acsUrlParam.getValue() + "openapi/task/continueTask"; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute().body(); + // 格式转换 + JSONObject result = JSONObject.parseObject(resultMsg); + resultCar = JSONObject.toJavaObject(result, NoCarResponse.class); + log.info("下发无人车接口continueTask的输出参数为:-------------------" + resultMsg); + } catch (Exception e) { + //网络不通 + String msg = e.getMessage(); + log.error("连接失败:{}", msg); + return NoCarResponse.requestError("网络不通,操作失败!"); + } + return resultCar; + } } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaNotCarController.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaNotCarController.java index d815bd4..ef1a497 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaNotCarController.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaNotCarController.java @@ -74,4 +74,40 @@ public class PdaNotCarController { return new ResponseEntity<>(notCarService.back(whereJson), HttpStatus.OK); } + @PostMapping("/queryZhRegion") + @Log("无人车装货 - 查询装货区下拉框") + @SaIgnore + public ResponseEntity queryZhRegion() { + return new ResponseEntity<>(notCarService.queryZhRegion(), HttpStatus.OK); + } + + @PostMapping("/queryZhPoint") + @Log("无人车装货 - 查询装货区下的点位") + @SaIgnore + public ResponseEntity queryZhPoint(JSONObject whereJson) { + return new ResponseEntity<>(notCarService.queryZhPoint(whereJson), HttpStatus.OK); + } + + @PostMapping("/callCar") + @Log("无人车装货 - 呼叫无人车") + @SaIgnore + public ResponseEntity callCar(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(notCarService.callCar(whereJson), HttpStatus.OK); + } + + @PostMapping("/install") + @Log("无人车装货 - 装货") + @SaIgnore + public ResponseEntity install(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(notCarService.install(whereJson), HttpStatus.OK); + } + + @PostMapping("/installConfirm") + @Log("无人车装货 - 装货完成") + @SaIgnore + public ResponseEntity installConfirm() { + return new ResponseEntity<>(notCarService.installConfirm(), HttpStatus.OK); + } + + } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaPointAndPointController.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaPointAndPointController.java index 5af8886..1ad947c 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaPointAndPointController.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaPointAndPointController.java @@ -5,6 +5,7 @@ import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; import org.nl.common.logging.annotation.Log; import org.nl.wms.pda.general_management.service.PdaPointAndPointBoxService; import org.springframework.beans.factory.annotation.Autowired; diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaPrintController.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaPrintController.java new file mode 100644 index 0000000..1cad42e --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaPrintController.java @@ -0,0 +1,56 @@ +package org.nl.wms.pda.general_management.controller; + + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.logging.annotation.Log; +import org.nl.wms.pda.general_management.service.PdaPrintService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +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; + +/** + *

+ * 手持打印 + *

+ * + * @author Liuxy + * @since 2026-02-04 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/print") +@Slf4j +public class PdaPrintController { + + @Autowired + private PdaPrintService pdaPrintService; + + @PostMapping("/printBag") + @Log("组袋管理 - 打印") + @SaIgnore + public ResponseEntity printBag(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaPrintService.printBag(whereJson), HttpStatus.OK); + } + + @PostMapping("/printBucked") + @Log("组桶管理 - 打印") + @SaIgnore + public ResponseEntity printBucked(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaPrintService.printBucked(whereJson), HttpStatus.OK); + } + + @PostMapping("/getPrint") + @Log("手持配置 - 获取打印机下拉框") + @SaIgnore + public ResponseEntity getPrint() { + return new ResponseEntity<>(pdaPrintService.getPrint(), HttpStatus.OK); + } + +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaNotCarService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaNotCarService.java index db819c9..30e0cd2 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaNotCarService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaNotCarService.java @@ -67,4 +67,45 @@ public interface PdaNotCarService { * @return PdaResponse */ PdaResponse back(JSONObject whereJson); + + /** + * 无人车装货 - 查询装货区下拉框 + * @return PdaResponse + */ + PdaResponse queryZhRegion(); + + /** + * 无人车装货 - 查询装货区下的点位 + * @param whereJson { + * region_code: 区域编码 + * } + * @return PdaResponse + */ + PdaResponse queryZhPoint(JSONObject whereJson); + + /** + * 无人车装货 - 呼叫无人车 + * @param whereJson { + * region_code: 区域编码 + * rows: [明细] + * } + * @return PdaResponse + */ + PdaResponse callCar(JSONObject whereJson); + + /** + * 无人车装货 - 装货 + * @param whereJson { + * region_code: 区域编码 + * rows: [明细] + * } + * @return PdaResponse + */ + PdaResponse install(JSONObject whereJson); + + /** + * 无人车装货 - 装货完成 + * @return PdaResponse + */ + PdaResponse installConfirm(); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaPrintService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaPrintService.java new file mode 100644 index 0000000..b329e54 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaPrintService.java @@ -0,0 +1,47 @@ +package org.nl.wms.pda.general_management.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.pda.util.PdaResponse; + +/** + *

+ * 手持打印 服务类 + *

+ * + * @author Liuxy + * @since 2026-02-04 + */ +public interface PdaPrintService { + + /** + * 组袋管理 - 打印 + * @param whereJson { + * + * } + * @return PdaResponse + */ + PdaResponse printBag(JSONObject whereJson); + + /** + * 组桶管理 - 打印 + * @param whereJson { + * + * } + * @return PdaResponse + */ + PdaResponse printBucked(JSONObject whereJson); + + /** + * PC条码打印 + * @param whereJson { + * + * } + */ + void printCode(JSONObject whereJson); + + /** + * 手持配置 - 获取打印机下拉框 + * @return PdaResponse + */ + PdaResponse getPrint(); +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/dto/AssemblyBagParam.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/dto/AssemblyBagParam.java index 093ed48..aac2a33 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/dto/AssemblyBagParam.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/dto/AssemblyBagParam.java @@ -22,7 +22,6 @@ public class AssemblyBagParam { private String bagNo; @NotBlank(message = "物料不能为空") private String materialId; - @NotBlank(message = "供应商不能为空") private String suppCode; @NotBlank(message = "批次号不能为空") private String pcsn; diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/dto/AssemblyBucketParam.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/dto/AssemblyBucketParam.java index ab9c437..4606446 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/dto/AssemblyBucketParam.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/dto/AssemblyBucketParam.java @@ -21,7 +21,6 @@ public class AssemblyBucketParam { private String material_id; @NotBlank(message = "批次号不能为空") private String pcsn; - @NotNull(message = "数量不能为空") private BigDecimal qty; } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaCommonServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaCommonServiceImpl.java index ccfac78..a7e6a58 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaCommonServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaCommonServiceImpl.java @@ -32,6 +32,7 @@ import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.ISchBaseTaskService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; import org.nl.wms.sch_manage.service.dao.SchBaseTask; +import org.nl.wms.sch_manage.service.util.ACSTaskTypeEnum; import org.nl.wms.sch_manage.service.util.tasks.EmpStackPlatesTask; import org.nl.wms.sch_manage.service.util.tasks.EmpVehicleOutTask; import org.nl.wms.warehouse_management.enums.IOSConstant; @@ -315,6 +316,7 @@ public class PdaCommonServiceImpl implements PdaCommonService { jsonTask.put("point_code1", whereJson.getString("point_code")); jsonTask.put("point_code2", IOSConstant.AGVZJZ001); jsonTask.put("point_code3", row.getString("point_code")); + jsonTask.put("task_type", ACSTaskTypeEnum.F003.getCode()); empStackPlatesTask.create(jsonTask); return PdaResponse.requestOk(); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaNotCarServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaNotCarServiceImpl.java index 90a7da3..b262c1a 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaNotCarServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaNotCarServiceImpl.java @@ -1,8 +1,15 @@ package org.nl.wms.pda.general_management.service.impl; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.nl.common.exception.BadRequestException; +import org.nl.config.IdUtil; +import org.nl.config.SpringContextHolder; +import org.nl.system.enums.SysParamConstant; +import org.nl.system.service.param.ISysParamService; +import org.nl.system.service.param.dao.Param; +import org.nl.system.service.param.impl.SysParamServiceImpl; import org.nl.wms.ext.service.WmsToNotCarService; import org.nl.wms.pda.general_management.service.PdaNotCarService; import org.nl.wms.pda.util.PdaResponse; @@ -10,6 +17,7 @@ import org.nl.wms.sch_manage.service.ISchBaseRegionService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; import org.nl.wms.sch_manage.service.dao.SchBaseRegion; import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper; +import org.nl.wms.sch_manage.service.util.tasks.NoCarInstallTask; import org.nl.wms.sch_manage.service.util.tasks.PdaNotCarUnloadTask; import org.nl.wms.warehouse_management.enums.IOSConstant; import org.nl.wms.warehouse_management.enums.IOSEnum; @@ -17,6 +25,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; /** @@ -54,6 +63,18 @@ public class PdaNotCarServiceImpl implements PdaNotCarService { @Resource private WmsToNotCarService wmsToNotCarService; + /** + * 系统参数服务 + */ + @Resource + private ISysParamService iSysParamService; + + /** + * 无人车装货任务服务 + */ + @Resource + private NoCarInstallTask noCarInstallTask; + @Override public PdaResponse queryXhRegion() { List list = iSchBaseRegionService.list( @@ -110,6 +131,97 @@ public class PdaNotCarServiceImpl implements PdaNotCarService { return PdaResponse.requestOk(); } + @Override + public PdaResponse queryZhRegion() { + return null; + } + + @Override + public PdaResponse queryZhPoint(JSONObject whereJson) { + // 查询此区域下的空位 + List pointList = schBasePointMapper.selectList( + new QueryWrapper().lambda() + .eq(SchBasePoint::getRegion_code, whereJson.getString("region_code")) + .eq(SchBasePoint::getIs_used, IOSConstant.ONE) + .eq(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料")) + ); + return PdaResponse.requestParamOk(pointList); + } + + @Override + @Transactional + public PdaResponse callCar(JSONObject whereJson) { + // 根据区域找对应的无人车对接点 + String taskNo = IdUtil.getStringId(); + // 将任务号存在系统中 + Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("NO_CAR_TASK"); + sysParamService.setValue(taskNo); + iSysParamService.updateById(sysParamService); + + JSONObject param = new JSONObject(); + param.put("requestType", "WCS_101"); + param.put("accessId", IOSConstant.ONE); + param.put("requestId", IdUtil.getStringId()); + + JSONObject data = new JSONObject(); + List detail = new ArrayList<>(); + JSONObject json = new JSONObject(); + json.put("taskNo", taskNo); + json.put("taskType", "MV"); + json.put("taskDate", DateUtil.now()); + json.put("taskState", "00"); + json.put("priority", IOSConstant.ONE); + json.put("wareCode", "W02"); + // 目标点位 + json.put("toLoc", ""); + // 地图 + json.put("udf02", ""); + + detail.add(json); + data.put("detail", detail); + param.put("data", data); + // 呼叫无人车 + wmsToNotCarService.callNotCat(param); + return PdaResponse.requestOk(); + } + + @Override + @Transactional + public PdaResponse install(JSONObject whereJson) { + // 判断无人车是否到位 + Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("NO_CAR_TASK"); + if (!sysParamService.getRemark().equals(IOSConstant.ONE)) { + throw new BadRequestException("无人车未到位!"); + } + // 查询无人车上的点位 + // 创建装货任务 + List rows = whereJson.getJSONArray("rows").toJavaList(JSONObject.class); + if (rows.size() > 2) { + throw new BadRequestException("选择物料不能大于2条!"); + } + for (int i = 0; i < rows.size(); i++) { + JSONObject json = rows.get(i); + JSONObject task = new JSONObject(); + task.put("point_code1", json.getString("point_code")); + task.put("point_code2", ""); + task.put("contact_task", sysParamService.getValue()); + noCarInstallTask.create(task); + } + return PdaResponse.requestOk(); + } + + @Override + public PdaResponse installConfirm() { + // 判断无人车是否到位 + Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("NO_CAR_TASK"); + sysParamService.setRemark(IOSConstant.ZERO); + iSysParamService.updateById(sysParamService); + + // 调用无人装货任务类 + noCarInstallTask.backParam(sysParamService.getValue()); + return PdaResponse.requestOk(); + } + /** * 根据数量找到对应可用点位 * diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaPrintServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaPrintServiceImpl.java new file mode 100644 index 0000000..bf39ba6 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaPrintServiceImpl.java @@ -0,0 +1,347 @@ +package org.nl.wms.pda.general_management.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.common.exception.BadRequestException; +import org.nl.config.SpringContextHolder; +import org.nl.system.enums.SysParamConstant; +import org.nl.system.service.dict.ISysDictService; +import org.nl.system.service.dict.dao.Dict; +import org.nl.system.service.param.dao.Param; +import org.nl.system.service.param.impl.SysParamServiceImpl; +import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService; +import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase; +import org.nl.wms.pda.general_management.service.PdaPrintService; +import org.nl.wms.pda.util.PdaResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.Socket; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 手持打印 实现类 + *

+ * + * @author Liuxy + * @since 2026-02-04 + */ +@Service +public class PdaPrintServiceImpl implements PdaPrintService { + + @Autowired + private ISysDictService iSysDictService; + + @Autowired + private IMdMeMaterialbaseService iMdMeMaterialbaseService; + + @Override + public PdaResponse printBag(JSONObject whereJson) { + OutputStream outputStream=null; + Socket socket=null; + try { + // 打印机地址 + String print_id = whereJson.getString("print_id"); + if (ObjectUtil.isEmpty(print_id)) { + throw new BadRequestException("打印机IP为空,请选择打印机!"); + } + JSONObject row = whereJson.getJSONObject("row"); + + MdMeMaterialbase materDao = iMdMeMaterialbaseService.getByCode(row.getString("material_code")); + // 记录编号 + SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class); + String record_no = sysParamService.findByCode("RECORD_NO").getValue(); + // 物料名称 + String material_name = row.getString("material_name"); + // 物料批号+批次 + String pcsn = row.getString("material_code")+"-"+row.getString("pcsn"); + // 经销商 + String supp_name = row.getString("supp_name"); + // 生产商 + String produce_name = materDao.getProduce_name(); + // 日期 + String data = DateUtil.today(); + // 数量 + String qty = NumberUtil.round(row.getString("qty"), 2).toString(); + // 袋码 + String bag_code = row.getString("bag_code"); + // 1. 创建Socket连接打印机 + socket = new Socket(print_id, 9100); + // 设置超时 + socket.setSoTimeout(5000); + // 2. 获取输出流 + outputStream = socket.getOutputStream(); + // 3. 发送ZPL指令(注意编码) + String zplContent = "^XA\n" + + "^CW1,E:SIMSUN.FNT \n" + + "^CI28\n" + + "~TA000\n" + + "~JSN\n" + + "^LT0\n" + + "^MNW\n" + + "^MTT\n" + + "^PON\n" + + "^PMN\n" + + "^LH0,0\n" + + "^JMA\n" + + "^PR6,6\n" + + "~SD10\n" + + "^JUS\n" + + "^LRN\n" + + "^CI27\n" + + "^PA0,1,1,0\n" + + "^XZ\n" + + "^XA\n" + + "^MMT\n" + + "^PW799\n" + + "^LL1199\n" + + "^LS0\n" + + "^FO16,15^GB771,1167,4^FS\n" + + "^FO333,1127^GFA,457,624,24,:Z64:eJxN0jFuwjAUBuDfsuQsKKypauAKRiwMrXIVjuCRATVGSGFBzAyoZ7FkqV16BIZUXICRgeI+Ow7BWZxPf16en8yRlgUE+pUZZlfMgDVADm4xBr0BwyZrLO34tSCHpid6jg/Y91pwo4JLZpPTxk7rjJtF8CxDl2cm+toGZ/vkA/Dom40Jjp/OdWXJmdsi+vLhDm5a47xH5X1D7SSfi+izTyjq3/u7oB+Sv+yivx7bOgrJh4UNzunjXAbPvA8uSuvKO/jaVHf5lBcr65hhFNJSPtUf/BpyuI3RctXnJ39nBOdbqNHpqU7xBVd58D3URNqHY563eRrM28j0vpTkNU0YuE3ozJfkRfIC7DTu+4fS5Duqh+wY+2/nE728UeiSSwnvr62XNETHDtxoSEm16pSXlP9mB4Dug5yDi66O1rCdawj+qK8Q7gkWdEYVr1b0f/83kEc=:1B97\n" + + "^FO134,1086^GFA,801,1856,64,:Z64:eJy91DFr3DAUAOBnBNIi5PUNIv4LuqUIGri/4pC9+JZyQ+g5ZE/WLv0vzwSav5BRpZCxGLp4CL0+yfbVl/NdDwqVh8NP+qx3epIATrSinY9v6JT609aXs+EsHPnu21bqeV+78zyZ2bAA/398mM9fTPLHRaeCvhEFLPl5Ck5LaB6oRMgIbjxK6MSn7IGuA0IFWrQyq5s2lCiCFvm2w6U2Xkuxom+0oleXfFf2Pm9Rinvx/bYrP/jkjWVPS/4+KwHg0Eq0WglqKFCoMHoKrvdgUSoluMutMXlrooeqRGujrxCl1+zrpr4injZ5Gr1GKYWoOVD1nt+j537U0fOvBMke+KMxvO95fp3dQRkDyYMa53cyepp4d+BVd+BF9EUYfMZeT73r/bB+thp9uedXNHhRI64n/irVjx6H+iEOPgYmvixHD1hQ75ttC24Dyf+C3rvRx0DyxTZ6Gr3kKWDwdcy/9zT63fqNHtP8NK6fmfNZ8mJ7htfsTao/NBTr7701Wez3eZ+/6evPoOA/qK1U4jbm77n+CpC9TvuPk+b9Vzp/eSG4v1rbtH72Iu2/3fpro9Qdv3G/NTmfQ9SeE4h+xY8L9sc7yZksnjHVT3/k/X8dt2bvlRVfvvLAxbPx8j2XDFXL52/zCBTPX0H504ulZV189uyLoF6yTnBPPXjRZt0rbbhfBfETSv4HsamDM47Rt8N10UfYD+efxnsknPbjsDd+d4/wpvsnn9W9NzMe5/z+fciVPe7tGV7B8fzNGfnL0R+2tH//5vNte9RPhh0Zkjp+A9KjCn0=:1582\n" + + "^FO178,1047^GFA,833,1792,56,:Z64:eJyd1b1u2zAQAOAjCJRLK64eXOkV2i0FFOuVWnRxAaNm4CGj1xYImldI97SgkcFbvWYpwryAQ6OLjCpi7/hjy3BcGOGgo6T7JJE8SQBHtJ7f8mNSd1o/uux5TkXHNG5OwolsJwUEZoXz+87Q8aIFsLlTFeVIwJ6gWJnCsoe6/GD2HAvOKbCF0854hz3vnC1q5ppyte+4eU1uik7O9dp6hz1yrK57I2hG5foJZ9+SExrdZGbr4CbBmRGUUJfR9ZJ7QUO/uifHyfEZJnrHoyvR2T33khybzTTk3IDN+E10WXAA5Ex0bzaOOoKfnZvoxI0ugxNdNzr17mTjaNGkYFOAnJFzk+TiOsAA3UN9+khukNzyPYZMvrqAcD/Zcj0I42vBj8+16JwJrkiupb0se1cnpzdOR9egayA4+SW6MRVH1qdiyLlmVtLDBEclBkWcz+jEbXCTS0XuJK4Dx3nR0YV5qYIzo+q3X4fo3IJc/9McQ3GuhZVCpfsJmpcxs0O637C629YLd/65oP/xq9JQLNTYyruNu0MnHKxrdI91dCUWB/C/So7J/fl+prCQ4bPFxOiwh+4B8FrOjG1yYwr8StZ+ZzVRkLcwtLyhhSaHPXRTqDS6SleX3uHFyV23FAbtPe7mEMYc173T6EA1JVe5kPNzSaHS8+VRTrrbVGcUMrb41nGjg07YVC9S+3h2vXVmePg503tk/fTsOGbqJ53susbXNb6AF1u3sslJ1XGi48SPZYhMbRzE71LHwcaxJuSrXyHyjvOlfsAVyYXvZ8Y7GQUcblkZXb7v/tt2XU7V+gyXHe0G0aU/Gbp/h8MsyA==:9CD0\n" + + "^FO51,941^GFA,2989,8280,92,:Z64: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:D49A\n" + + "^FO515,910^GFA,529,792,33,:Z64:eJx10sFK60AUBuB/OHCyGabbAUP7ClOEEEHsq6Sbu450cVdXJwj6EoKvMqWgG19BbRGuS3UjhSude8akipLOKuF8Sf5zToD+o92OQncO8wrK76qOPFwemJYqLuXWZEvHyNZELyN/YuQ5CxR35wMaL8I0CDB1KeCSsvIg3LAAl8BVtqCVnwlAXiZgyOT1qrnowMMajwPlf4chYO0hg5m0rqbN2RYAs1L5Py046gAqddYIIEwisC8Jj4MWkBcCMtIGNeYtKB6G2PMJSAar9wUQacY4zucepxsU9xtMbA9oggBoARrP5RbY8blkyCTDtPFbYOkm/wLXLZAufBRg5StOXTCq43YO7lrmMDC5Wy2kC4rxBexAwOlrAqZ2f2WSozTJJ+5WxCeDGJeVepdr2cUv8Hr2sYsOWH7jCqhSHjmuAHebTECmNIm3aMGwB8igyuw7GP4ElqWT9wSwG6Q3UBvZmU9A3bI2LoH4rwP8CVT8AMrXiFG2G/r+SelChboNUPWBb4X/iF6Lsg==:5CBC\n" + + "^FO16,894^GB771,0,4^FS\n" + + "^FO439,848^GFA,741,1204,43,:Z64:eJyV1DFr20AUB/AnDNZS7lYHVOsruHQ5Y2F9FX2CciGQGByqCx68FLz2u3ToGUO8GHvtENoLHryERJBFpULX/0m2kxoXtwfSQ9JP6N17dyI6PZJ/MP9BDY4WaICoiZOLUf2ood1ZIAxqKinOEQJq4rWQUr+7sZwDqjRjOJd+xsvuEjSX1A+ajrKK2vGf9Mb6+ZZqSSIIHA2bhri3nnc380lFrwego7kSfPJCJagIA+TmTUHHk4mjg4qOVMR59xHTmUs9CAyZViLETMFuuhu/ptJR1dAR4z1QuTxX+VsNaoScbynnq4pmO9p2VCwvKE8VmTMtEiTkWdCypqlxCVgd8cLRaHFJ9gnF+qk6t/mWZltKO2ocZasPFDHQIb1bZMS8KajiT9W0QP3RCJR6JSoweyDXofuvdP4Zda0rwGoqGfGqAiz+CDotkDCR/U4XXzToej5cT5h1VGBaIeoa+e2KavQXvc2C5Opyqji6ZdclSx2NMS17Yxt2XFR0lmrQtgmzq+sZrlP/x31R01Az+qXKhh3ljjZvcRc5PPTpOS93y62muyssNEfZJiPvjugxp/LshcaHtI9QJNRYoQUt6ry/+yvtg8afJMqMuvaIOsWehkdoG6vKbyLdoSL57ZCy15RaEfE3qCtYsjikfHejokJQjA8bUKP3lB+jnYxCt7dar+nxcW6IyWobevoEfdausWQi7JUTVOJ5BoqpVf+EEyPZ/11+A6Z/CwE=:52F4\n" + + "^FO17,834^GB769,0,4^FS\n" + + "^FO561,790^GFA,673,810,27,:Z64:eJxt0jFr20AUB/D/8UC3qNJ6wRfrKxgy2Cam/iqGQrKqZPFgmguGeCmeCy30K3Qq2XrGg5aSOUMgFwTxlmgqghir705ukqE33KH76Ul37z3gzRi0i2oXMm9ouicRNiXP+T/a+WnSEkFa/7Jud52f8kC5RDIBPjGdv1ANxX+pmPhhzJReONuSa6kfqM8ki7kRFrSNA4n6FDHTkdEQjxJMcqc9zYUt4phcdGQ1sI0CJbo0ipZitei+ay6+CU/TxBNFo41V9Jnmi9Ghk1dwnjTIWopmT/zBL7SQuUZWwakeZkxrptstVPaDln2n6cBhoiZ4HIAai0hVUGlFy1OjJVOuLDY9oAQTn/DMkS7QbYYWvQMr1hUnlInfzJ6dHF4jK88ths9GrJiS1EelDVl5/DNCOTYYfwXdcDJlY5Kpkzf0Sx6fxCgJeJ9B1A4pH6Nb79CZV3L8oLCR4boYOLDgz2GNzp1J66JGwbnbMvVsKOlDxidcG7m6y1FEoFtO8kcO4RKehPQ6iMsKBUdo3ZK/cuLQkRXo0vkoxNxDH34D95brx/T9ivPsxDrjZ+6y+90rNQbS12iGQCVXf9WS6uyJb5pMIThIMKX73mAiDqZrJs4TrR23X0uJDA1GT/tObnxLVRjtKey1i4/0w1Mk8b+h2+UvUrvC/Q==:2E9F\n" + + "^FO432,753^GFA,597,817,43,:Z64:eJyN07Fq3EAQBuBZFmYbRW43WJxeYY7Aoav8KjIB1xvcpAhnCYHUhNR+jHuD7CKQu3uF6DDErUKaK0SSGemSU6pkQYWGD/HPzCpLi58w6hPoEfF6AHejCgKi3QpH8wO4RDZtys9oMFv77+XBRKAPiKkFd196oS/adDECl8iuffhWG4Q8P7ZNhKAbxMQCHIPQdVsZtEwTpnkeQn0l1LfaatAa0UYAPvRCywq1UBtNtOhe1QAzLSZqhQ4SQFWIJJS/Cnko69dMyT/rQjGtZ3rcT7RdUBLawcPg3yqhiqljevsoFFpMJurIPgyhQdtB7i409QtqBsmaes7qwojUzW2B8lNWkKwfz1khka8CZdIW0t2SxnNbn5i+4wng1ZxVaFkzdT3PVWiDK5vJXGumQ1thrHhbNqP3rg9Vnd9lW9kWcNaD2UTc1n3ZEGz3L1onvCCMHJ223j9hvsnS4guMQj/or6YHuFEVQUq7NJx4h2j6N49pM+zQb6QRfpjC+ahyz8MGfpcJzDUP6FczlW39J000XGgx/EXdRExxpnKz/kXjmcp9vVB3pvEiwB+qTktKQvnIX/C7aiD+BeFJuEw=:D211\n" + + "^FO16,742^GB771,0,4^FS\n" + + "^FO589,119^GFA,473,720,24,:Z64:eJxt0rFOwzAQBuDfilQvFV4ZIHmFjEay6lfpI3g8REXzADxDnoGxE8pURlam4i2rpS4Zopq7FJY0nk6fE5/vzsDC6pZQvF5kFWvoRjdTzP9eo6JROUF3VQwWYZ/6torJQZ8bdeTvO59IfOhbjpzPRTd5Q2TZX13fErGnqwNkHTuJW+tQ8/k/SRzlnwfnxKFOln2HktipbzG5hjqK+84MCC+DeMm+gvp8ikCVNPs+9u1+vHrxlaUi8bSHuHHIb8jDndRIxQGJIHnNqIc1PCzXRaQPKklestVYvEs/ArslY3Wy1H8Q+RG19C3ynk+l9cGnfPFpx3lVg7MMoIrObkIV86WK5EDcWS+NNR3XH0z3fDJNcPAqwqyug7D/EwlOZWxh1jeupWWP37cuR9th5px32q5nzvfEPft25lzX9gHIcebVCCr5uO728ez+Hs18beQJLbisoll2bt0verSeQw==:6681\n" + + "^FO268,702^GFA,461,570,19,:Z64:eJxd0j1LAzEYB/B/CFyWcrde4fC+gm4BhX4VQdD1ilAdxAbcdXbqV3B0M3LQLqVzl2qOgptw4HLg2fgkubZiloTf5eV5OSCMlOP/kLGfRIs6t7YGmJaZkwIDoWh1CIzNTcoU8gLJPRwNbIuR5LC2AW8jR7mlI0WEYxiwOvMHBdEoBocGarmjiwy8/6rQFDtaPyPqzzRbmEAtiupRR6s38FJ7opcKnZt49QQxCXHRi1dli/hTgX+p7V1jmyKrFKWELQ1LorMHUCR/qcc3YC8dHRA1lPY52DoQ2xAtWfX9AX7niU9ajMuU2eme2oJ2SVz3iKwPgplTf9dJNqddIa7ahCDSOURHR9pTLBeU0NITVxjOLMQhUd0VR+HynYo81GDKbOk2T8GqKZCE4vAGqZBAZcF/PDHXSk8GSalca7lLT/SowW5G6LZfwjUIyf6noEC6T7/TcY1g:949E\n" + + "^FO644,662^GFA,277,460,20,:Z64:eJxt0EsKwjAQBuApgbopdBuh6BUCbtz1KlO8QI+QUtClV5qQhZcQzBFcFgR1kvSl7b/I4oN5BSAmIQABvxGwtHTFspnllh56/2Qz+iW3H8cmHXZUK2/NNVOAbEqhI1KwA9NuJqNKB7uIFIMBm4l2FqI3iWRBwSEYBSs7tO1giY79jvgWo9E4w1vVTLXe7GD93GONJljL+6V16e8oHJ78DLpNd+S2K30/uvO9hYz78ettyGh6aUkwoecGtGL1fy2H/zkmCf/8BS5zVgM=:0CCA\n" + + "^FO286,666^GFA,269,323,17,:Z64:eJxdzzEKwzAMQFEFg7uIZM0Qmit49FDIVVRyAfcGhkC69Uw23nuF5ggeM5i0shtaiCbzMB+pCe5l+1gtvU0XEQ22C63OKFA3/5BSK1SKFucYaBQSUWdwV5tBZGiRX84XACEBO4SWXAAGA9UM/GdYKUwZzuI9N1uNStMmMohJzFjLEi0AIUe/EP5wStqQL0DhLuuuw26hsUSVf8oTb9qEdeBGlfiWYYoKAXij0gCQADvYA1RHAHcE8wM+Lk8fYZ8mfQAIF0gB:9E77\n" + + "^FO17,650^GB769,0,4^FS\n" + + "^FO494,614^GFA,653,1116,36,:Z64:eJyF071q3TAUB/C/EERLc70a4kav4NBFlwrrVbp1CUVbVTC1Ql6rwymFTiFP0IKnZilBpYsHc2+PFOc2LXGiSZZ+1sc5R8DjTcaVif9M/YxRdAS7IBXzP6cQpMr3aRnh8VHBNnnB7OH1OMT3Sc+8vh+iHmVUs4JC1/BCeyrGpSEOk1uMSzLqYkxtsU8qr+z7IKkPts9GUggyOqtwzSbAU5X39iEICiYUk3syWqv0LYyZANL5eN7bYuxi+A7BquYdzDaxCcWkYvxi+oOpX7d8XzoYfzCOijG3qFM2eMRovpe3yu1wwgbTUTbpgUmCBJvEe3Wo2w5V0vnuyRcTFoNQTHvOpofGR46hSMHcG8Em3BlzjpPf6c0or9iolOPjjeH4KDamGLn9iab1lDY17+U4F272JueC+7NbznPN5iwGY/jIHec0m5zTjk3OKRts0IQBXfuKjfG8Fpvqk4yGTUXFXO6gP99Ac5bvqqhEyh564BjugGOuMzHeYM2IrwQxbfj7x6rBixFqaiAvrlaMtWhGHH+fIC//NbmSc4/vYGHfxu2XCUp8e/gUrIr370DPeLkfP5BB1dcrpprFfsQv8qjIYK0NXIJnbLjyV03Hz00Sw6deK28sqF2fL4aens9N/DV/AHRf7PI=:F8C9\n" + + "^FO17,601^GB767,0,4^FS\n" + + "^FO478,562^GFA,633,1178,38,:Z64:eJyF1L1qHDEQB/BZBKfmyLUXsvG+giGNDMvtq6RLE4IghQd8sQR5DT+MqpSuXbhQSBuCIIVViNv8pdV92b6LYNAt+7vV7Iy0RKeGsGXyJ8GBatx5Jd1sZ6WdonEXmPM/tyG9zPcRo5WOdOdJXwdjO2+CcNdBKxP+3skiZs04JspqCKRNNHYIJgpnIlR8quoNAeXVNDPpNQvHfNsLt2atbvus7qHmxMuSpmaVo3GsGIqVxgzV/SmKqtL9pHR/pNovuNnuFO0VV8VPj68pDUX9DbLXUDdxfJQqr7jcKZO2yvhJGQ81bCZlSpMCVKiKqiKodlWU2JRKBGRfFU8KpYG6/AylSDzMUNUmIPOiUAmuinNeWUU8bg4lA7OcFFhWHBWPSVz9RgursgM6NCD7IWEOQ9LqWxzCJsn2nrqYq5pfcoVur4rqfOezGmLnU5LoYXcJ8C7m/PTCqqIWbuGy6tTCQX3Hy30AMOFg1027UtS9CZXL9dWSSPqMan7g5y9L8uGcojlq7nG5/HharamF+olY+pfKTldxTf0nWzJ/e6imYfbq/ehFomcrVkVb1Yw+n4rtzjka/d6HKtRLtR+rfITa/6lymC+OHv+qctPcnlUHH5J/QLn9yg==:9CAE\n" + + "^FO17,547^GB767,0,4^FS\n" + + "^FO16,401^GB771,0,4^FS\n" + + "^FO16,345^GB771,0,4^FS\n" + + "^FO16,284^GB771,0,4^FS\n" + + "^FO525,242^GFA,473,896,32,:Z64:eJx10zFuwyAUBuCHkOolstdUisoVMlIVxVfJEdiCVCsgZegS9QQ9DFM79QYd2DqG0YNl94ENcdQYyQP6bHj8PAMsjRU+W2DD4P/bFuChBNAeNnFCTWGSEUvsi4Fd8O3k2jFHDbXhPe0PXjs6oMvsvvbZW93i7C04n7xRSiU/ikaJlp7K9dUVVzy5Eoo3qjitJPjsQoq5Hzn6nswcrq7QRTWcLRm6yeXMX1vJB1HYbwsdZNddrt9J3gugl5DIPq0/cyzbi77QJmR1p77odakh5Jp8dj4VvPhhpCe/d/Lh0Wlbgq77lG9I1NRd8NoHB3S22+T8w/2Mzlx0WXlca/KDrUzyyo7fM9wvuYw3Ty3A2AfolwaIkwsuBfnC/nJuwRUnn+hy0RV9R3+2My9MqG500RYd+uOt6+yYxgd6ZW4dkjMH603cbPRxiNz/CHz0+/9HKDE4LDt/iv4HFbzIMA==:6D54\n" + + "^FO47,242^GFA,549,1008,36,:Z64:eJx90zFuwyAUANCPkMqS2msqWfEVOlIV2VfJEdiCVCsgZehStRfoYZjaqeoFOrB1DKMHy+4Hx8RRkyBZMvwn+HwA4FJb4Hcf/8ph8P/jGLvJALSPtIgD1DAzxYkl9tFAFcz9zGhXOmqoDVb7jdeODmgkhrJkfO2TaXWLvedg+Mw0SqnJbEWjREt32TKagpjRKK74ZJRQvFFst5Dgg2GHeZSQYm62HM2aoHFFlgwcjUIj8uHFkqEDXxQHI2fmqZV8EMx+WegA2oIno7u0Lyd5L4DuQ8XWDaY1rTUzuB0veqZNqGe1cOdyjqbONIT6l7c2mdneVTDspyQ9+QX2Zs7UkEdD2wx03QN8TyZW39RdMLUPBtCUFUbz43mFMx1N6aKRucc5Z+e1sbmZTG7HeUpce25kvDnUAoz3CM2+AeJwfHXJSEE+8XI5B1BdMoqTDzTyqlH0Fc2DjaGjYSZkPBrRsg7NXTDbE6OTwWq9o8mxUw+nBiZTOlgWcWE9THUem0jvC4N8NLW59AZD2sHAlXeKja+S+QOb8Ngz:8A9E\n" + + "^FO639,196^GFA,453,540,18,:Z64:eJxV0b9Kw0AcB/BvOMgt5bJmqO0rRLoELPgqFgc3e6GDAZG7LrqUujoIPoQgjgcO3eoD6HDQwcUh0iGFBuPvLm3UI4Hjw/3u9+cAJAA4/Qb75SQCApJAx60YMJsgI+EaMoQQAmyTQDkxkAKR6IFpiWyW7mXebeQu9VEUsYwbeXx2N5NgmTgx47IV+pie6NFH+k/OMHr9lSHJ+V+pKwQPFco3L9knom+K2uRQPHHZVZVAsGltcvDwUHOjqs4JtYHCSoThgGpWsmPq2yH1bSHC0tc81n0jwWAR1U8+10KzLwseFFB01uVaAJcGvSvNtug6qW+Avkb0onEEN0O+vvZTZTTrAVIvcy9u+hfW1zyZAQfvpBZKSH/zPZAWwHGBVSOSMubS97bi1gvFrqk6CjxFIzlVQM9HpbBpeyYjSd0cveSx2+6kffuduPUDsax2Ew==:D7EB\n" + + "^FO560,165^GFA,393,644,28,:Z64:eJyN0TFKxEAUBuA/BGaaIdsGDOYKzy6CkKskNxiw2UJ0wsLuJTyEN/ANAbfzDJPGWjuLFL5xEyG7uviaCf+XTN68AY6r5pPop2z425j+YytmHtXalIGoTj6hA189g8cbea4C+1dlzKUlut08wlg7fDiJdAYi7ndiRUU07DPkeem9i5EGgftULM/lrRclhtZ9R+nSWAFinYtR4qpoW7FCLGjArHy0rZE+xZJoRqxJUY6V3yFGQMJLk+/bcTI0y//J2rpEIh3Nz2YPfVLbdRKlDGr6+XzvQ59B1nazkQhr5M3bNJfrpziXzFa81xIhk3neyTwfzEUop3nW7r7gsXZ6mriRI891uD6F9BfD0jJTnJg5Y+rMnnJ/cx0bpOcva3R33Q==:1FCC\n" + + "^FO17,161^GB767,0,4^FS\n" + + "^FO623,702^GFA,445,600,20,:Z64:eJxV0rFKBDEQBuA/DFwa2XqL5fYVtDLFga8iCNrmODibw40I2vgAioWvYZljC0tbu4vcC5xcs2C4OO7E1Usz8DGTZDIBZJUkMYd+mUKidkCd0gZQ3lSgjrP00qECDoEmLErlIgroVuwkRcwNYTKpoEmsToC1I4xnZjBotjnXrTds+LMLrmvDvq1fQEu2WjmxCPvx6Hv7IslLHayvAy0/ndZFNuCyjaD1E7Suhv2aVILObtnMYNO2hJ7eQzd237hpfR6yjdk6DtzHyIupHds79DGbFqPniIZrafvAd5Z+KVrOM6gDv+lWTIXTfr9FSFB3ud9N6M+1b5w4ynbke8OKB1Jk43ecvnKd/7Fdvp/DbNVB8cyQwmBXdQl144hHk2s7lNw7XXsVKzH1M+Le+FwjM+c0toP+D/yafArIGebfhyGXPw7wDQqRfyE=:532F\n" + + "^FO611,288^GB0,259,4^FS\n" + + "^FO202,288^GB0,261,4^FS\n" + + "^FO408,288^GB0,259,4^FS\n" + + "^FO659,508^GFA,213,270,9,:Z64:eJxjYzjAAAZ8zA1QBjuEZpBnY0gAUgkMsn1gRQ8YZGQYQYoeSMjINoMYH2RkJI+DlP7/I2PxDsR4JyNjkVYAUWPA/gPMkP3wnwHMkP9/DMKQKcBk/AMxHv6QKfgGYry/If8BLPUMKHUORQ1W7YX/D0AY30FqGB/YyLeDpBgf/2FjBGlnBAqDGQxAxzEehvqQEep3kN/AAADpXz7P:9688\n" + + "^FO16,457^GB768,0,4^FS\n" + + "^FO675,478^GFA,133,136,8,:Z64:eJzjbz+4j+F/A4PFgYOPmRsbGAwSEg+2MTYwMCQkNvaAaIPEZh4I3S4BpOs/JP4B0QkGiQ0gGqgeRjeDaIkDCcdBNH/zjxoQDTSIQQZK80BpNigNsg8MgPYDAEdZJAA=:BBCA\n" + + "^FO432,509^GFA,509,580,20,:Z64:eJw1kUFLw0AQhd+w0FxKc1UozV+IeImg9K/k5jU3C0qTk14KXv0ZQkGP7q2XYq8KQbcU9FI03iKErm+2GMiS+TLzZvYNBkBiAaz1KPkOgVHkd5jKTeWQ+BYwO2LjKyTmDQ1ihmNGyCAVousWBdCjzozlBeQOpi74E70c6AeWdJD2SlnZ7JnDmArNl/ajHsZOGfWQb/Nh0EMX8g45QbNqOOi529daJDXw40FWFoGJxQnbv9bKPlLIrVN2RIn6RdmigXS5sotnyHJoB5D3DGYW2A+ZlWoAs1BWBOYhizmUdTBPgdEgWT2QCYWjWaoMUYvfnfZA4qL+RFnkbdyeVWquR+yZZMeeQVqyr2etWerdYh44blh7ql97X+gwilR9Mazrl5YsuacvO2VTC/FOPc3o5vpRPXUOfsvaCbIJsJkrWztkqpfhsoZ8prqYb3o1CCueUMml7CSOLGafEdourMrBbDjBFJpbVirBCwl3JK0OiQP8P/l+3j+CKJSy:21AF\n" + + "^FO417,470^GFA,377,576,24,:Z64:eJxl0bFqxDAMBmAbg7zoyKpCwK+gbh1Kn8Xhho7NmKFQh0C6HPSVcmToUjrf2NK1Q6B7qS1fkrurFokPGxv9Sn2os3JD7jrMkAeupRkzH9SBUvN84WrAEwcoujukh+5RT6gcYF21E5iAVneA1IzvtgRlAN3nM9nkajRI9bZHAKV7VFWPhQ1UiPstlNZkD+KbID4CGfFiH2D1anGKvukHoiH5kwHWbUhevfxe7Wb3i3O1g+j833tMzj76TXw3e0nR6c2TeHM9+y3tO+JD9Psf93pwJv5Hh+Lr27XtlDzuK69O/hkwrfncrbhk0HD0MTtC9hgU14yLp30e3Ysfy0yQbkk2NcNJ5Dh7OnXha9rrTCf+BwwfYUQ=:4F4C\n" + + "^FO257,508^GFA,281,348,12,:Z64:eJxNkL0KwjAUhU8ImKWYVSHY1+hQ6KvkEYQuDkLzSI5OEt8kU0fJ2EGs5yYqXkjul3DuL0BTAT/Tf2ziH+ei2wINDN9TwhTQCU+LDjbCYwN03kSdEIXhbVBZfbgHMpMLJw+cGFiYp99WPmvACetoFstijrxmGwZ6h2ldcFQze+wwvCRFw56uODC2d9SqXPK0uz2HqGyvQyxFzMKvMRRm70gj9fQrXZzlgsyi7l8OXMWDtcj6AnNrPpxgkqvciobMcfGUJTV1V6fq3mAkPtI=:F834\n" + + "^FO255,470^GFA,209,252,12,:Z64:eJx9z7EKAjEMBuDIQbqUc81weK8Qt04+S8EX0MU54noPc4+QUtDHsI/gbTeI2oJSXcz08ZOEBOBdDLX+GE1MV9DZjL2g9X6SOHQ3l5CYk0aknediVcWcOCTiINrkhJCJ45cfcHnyWmzpUTg3xW2ZXUT8OBzzzr3YlfW8PYWhm8QeTLhvWp2Xo1K98Meu2nO1S/WZXl7pyziN:E0CE\n" + + "^FO61,509^GFA,317,348,12,:Z64:eJwtzr1KxTAUwPH/IdAuoV0dgr7CHTsU76v0BcSCi4PQTE59AB+lY0TwOSIOd5NM4lCIJ+k9Q/LjcL6ghJXMWHVqOvr3WD24DvPt6bRgHPTN4hfPcDv/wEtLH5j6rxVGrYsE+bBw75AkwbzaG542SMab1Z5ICZ5bWmcnucTa0w82sKt1Tzc/BCRA5+hy9qBudFZe4FFtBuTzTmeoZcOsek8sTrRvV5MwWx/J5f6I/J31O8x5R4olYnaLXH4p+xav3l31iN4/DbqrzNKcSdUS1Hk+HJ2my0ytSUdfjdld+0o0Nf8PBaxQzQ==:B2ED\n" + + "^FO55,474^GFA,217,272,16,:Z64:eJxjYz9gYcDf2HjAjo2xgYGBgU0mwaLA4mDjgcdQvoSBRYVBYuOBg80QPoNBTgVDYnMCI4wvkXODwbA5geFgI4x/Bplv/yPtTP3HNsP/Bw6C+QYSx84kGLYZNkD4fBIGx3sMEtsMDjb+h/HbDBJ7JA42g/XL8SQ2t0kc7JFIhrinjP1gMxt/Y48E1L0IgI8PYqLzmdHUM4LtBwBRqT1Z:F006\n" + + "^FT542,424^A0I,23,25^FH\\^CI28^FD"+qty+"^FS^CI27\n" + + "^FO17,105^GB771,0,4^FS\n" + + "^BY3,3,58^FT561,42^BCI,,Y,N\n" + + "^FH\\^FD>:YL292929201^FS\n" + + "^FT786,424^A0I,23,25^FH\\^CI28^FD{data}^FS^CI27\n" + + "^FT429,758^A0I,23,25^FH\\^CI28^FD{pcsn}^FS^CI27\n" + + "^FT439,854^A0I,23,25^FH\\^CI28^FD{是神恩撒旦法}^FS^CI27\n" + + "^FT507,918^A0I,23,25^FH\\^CI28^FD{code}^FS^CI27\n" + + "^PQ1,0,1,Y\n" + + "^XZ\n"; + byte[] zplBytes = zplContent.getBytes(StandardCharsets.UTF_8); + outputStream.write(zplBytes); + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + // 4. 关闭连接 + try { + if (outputStream != null) outputStream.close(); + if (socket != null) socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return PdaResponse.requestOk(); + } + + @Override + public PdaResponse printBucked(JSONObject whereJson) { + OutputStream outputStream=null; + Socket socket=null; + try { + // 打印机地址 + String print_id = whereJson.getString("print_id"); + if (ObjectUtil.isEmpty(print_id)) { + throw new BadRequestException("打印机IP为空,请选择打印机!"); + } + JSONObject row = whereJson.getJSONObject("row"); + // 记录编号 + SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class); + String record_no = sysParamService.findByCode("RECORD_NO").getValue(); + // 物料名称 + String material_name = row.getString("material_name"); + // 物料批号+批次 + String pcsn = row.getString("material_code")+"-"+row.getString("pcsn"); + // 数量 + String bucket_weight = NumberUtil.round(row.getString("bucket_weight"), 2).toString(); + // 桶号 + String bucket_code = row.getString("bucket_code"); + // 1. 创建Socket连接打印机 + socket = new Socket(print_id, 9100); + // 设置超时 + socket.setSoTimeout(5000); + // 2. 获取输出流 + outputStream = socket.getOutputStream(); + // 3. 发送ZPL指令(注意编码) + String zplContent = "^XA\n" + + "^CW1,E:SIMSUN.FNT \n" + + "^CI28\n" + + "~TA000\n" + + "~JSN\n" + + "^LT0\n" + + "^MNW\n" + + "^MTT\n" + + "^PON\n" + + "^PMN\n" + + "^LH0,0\n" + + "^JMA\n" + + "^PR6,6\n" + + "~SD10\n" + + "^JUS\n" + + "^LRN\n" + + "^CI27\n" + + "^PA0,1,1,0\n" + + "^XZ\n" + + "^XA\n" + + "^MMT\n" + + "^PW799\n" + + "^LL1199\n" + + "^LS0\n" + + "^FO16,15^GB771,1167,4^FS\n" + + "^FO333,1127^GFA,457,624,24,:Z64:eJxN0jFuwjAUBuDfsuQsKKypauAKRiwMrXIVjuCRATVGSGFBzAyoZ7FkqV16BIZUXICRgeI+Ow7BWZxPf16en8yRlgUE+pUZZlfMgDVADm4xBr0BwyZrLO34tSCHpid6jg/Y91pwo4JLZpPTxk7rjJtF8CxDl2cm+toGZ/vkA/Dom40Jjp/OdWXJmdsi+vLhDm5a47xH5X1D7SSfi+izTyjq3/u7oB+Sv+yivx7bOgrJh4UNzunjXAbPvA8uSuvKO/jaVHf5lBcr65hhFNJSPtUf/BpyuI3RctXnJ39nBOdbqNHpqU7xBVd58D3URNqHY563eRrM28j0vpTkNU0YuE3ozJfkRfIC7DTu+4fS5Duqh+wY+2/nE728UeiSSwnvr62XNETHDtxoSEm16pSXlP9mB4Dug5yDi66O1rCdawj+qK8Q7gkWdEYVr1b0f/83kEc=:1B97\n" + + "^FO134,1086^GFA,801,1856,64,:Z64:eJy91DFr3DAUAOBnBNIi5PUNIv4LuqUIGri/4pC9+JZyQ+g5ZE/WLv0vzwSav5BRpZCxGLp4CL0+yfbVl/NdDwqVh8NP+qx3epIATrSinY9v6JT609aXs+EsHPnu21bqeV+78zyZ2bAA/398mM9fTPLHRaeCvhEFLPl5Ck5LaB6oRMgIbjxK6MSn7IGuA0IFWrQyq5s2lCiCFvm2w6U2Xkuxom+0oleXfFf2Pm9Rinvx/bYrP/jkjWVPS/4+KwHg0Eq0WglqKFCoMHoKrvdgUSoluMutMXlrooeqRGujrxCl1+zrpr4injZ5Gr1GKYWoOVD1nt+j537U0fOvBMke+KMxvO95fp3dQRkDyYMa53cyepp4d+BVd+BF9EUYfMZeT73r/bB+thp9uedXNHhRI64n/irVjx6H+iEOPgYmvixHD1hQ75ttC24Dyf+C3rvRx0DyxTZ6Gr3kKWDwdcy/9zT63fqNHtP8NK6fmfNZ8mJ7htfsTao/NBTr7701Wez3eZ+/6evPoOA/qK1U4jbm77n+CpC9TvuPk+b9Vzp/eSG4v1rbtH72Iu2/3fpro9Qdv3G/NTmfQ9SeE4h+xY8L9sc7yZksnjHVT3/k/X8dt2bvlRVfvvLAxbPx8j2XDFXL52/zCBTPX0H504ulZV189uyLoF6yTnBPPXjRZt0rbbhfBfETSv4HsamDM47Rt8N10UfYD+efxnsknPbjsDd+d4/wpvsnn9W9NzMe5/z+fciVPe7tGV7B8fzNGfnL0R+2tH//5vNte9RPhh0Zkjp+A9KjCn0=:1582\n" + + "^FO178,1047^GFA,833,1792,56,:Z64:eJyd1b1u2zAQAOAjCJRLK64eXOkV2i0FFOuVWnRxAaNm4CGj1xYImldI97SgkcFbvWYpwryAQ6OLjCpi7/hjy3BcGOGgo6T7JJE8SQBHtJ7f8mNSd1o/uux5TkXHNG5OwolsJwUEZoXz+87Q8aIFsLlTFeVIwJ6gWJnCsoe6/GD2HAvOKbCF0854hz3vnC1q5ppyte+4eU1uik7O9dp6hz1yrK57I2hG5foJZ9+SExrdZGbr4CbBmRGUUJfR9ZJ7QUO/uifHyfEZJnrHoyvR2T33khybzTTk3IDN+E10WXAA5Ex0bzaOOoKfnZvoxI0ugxNdNzr17mTjaNGkYFOAnJFzk+TiOsAA3UN9+khukNzyPYZMvrqAcD/Zcj0I42vBj8+16JwJrkiupb0se1cnpzdOR9egayA4+SW6MRVH1qdiyLlmVtLDBEclBkWcz+jEbXCTS0XuJK4Dx3nR0YV5qYIzo+q3X4fo3IJc/9McQ3GuhZVCpfsJmpcxs0O637C629YLd/65oP/xq9JQLNTYyruNu0MnHKxrdI91dCUWB/C/So7J/fl+prCQ4bPFxOiwh+4B8FrOjG1yYwr8StZ+ZzVRkLcwtLyhhSaHPXRTqDS6SleX3uHFyV23FAbtPe7mEMYc173T6EA1JVe5kPNzSaHS8+VRTrrbVGcUMrb41nGjg07YVC9S+3h2vXVmePg503tk/fTsOGbqJ53susbXNb6AF1u3sslJ1XGi48SPZYhMbRzE71LHwcaxJuSrXyHyjvOlfsAVyYXvZ8Y7GQUcblkZXb7v/tt2XU7V+gyXHe0G0aU/Gbp/h8MsyA==:9CD0\n" + + "^FO51,941^GFA,2989,8280,92,:Z64:eJzt2EFr3EgWB/AnCkqXsnStYI37K5QxOApp3F+lmgbPxWQUcvFAcKtpsC/e5BqYye5XCOSwp4VqBM7Fm73msAeZgHNZFoWF3V7GtPb/Sup2h3Q2TEbZy6YIsWXLvy49Vb16VURfpYnq67i+GdGN4zb8TAd5F/RGRW/8xF/dRDAPXY/GJZFUkUKoJdlBR7Y4j7J7rrSNHSVsX+W2C1uGMjHZLPf2jtIR7FnuurGl1NoOG3tbaUmCityabmyCPSJv7ykt2KasE1tFZLRb2uea325Bpnt7l+2gPu3KlmwP8+EC9hD2YDbp0k7cQx4YUtnLCP2enlKadmNL2FllSSxghzlRIbuyxQ7bvZIiqdwlVV3awT8Rb5tZ0rCPKCF6JbuKN0m2Hdtb+REh4Ifd2jwv2e5jxtOh6MiWtJzzK/uB6Ghertsx9ZFPqC+6yiewjZ21dqLYDjrKgwJTJtvl/B2xjfxNfeoof4tw0a47YhFRwks85n03684nVt1O7M1KN+v85tZRffKt/X+1YPFbb/h0E2e/9YZPN/m5ufTZG/6XdjgXW/PY9ay7CE7DkgbicX9rXsWOzICt2WSWn+C+QQz7VKpeqWJ3Iqq7JY1z3DIPS0Wxm01+j2pZVMYeFCd9UdW84wl/FvF5Uu6WrjiTSUZvpxcyPtdpSebRpLEnBb7iQpxJVMGZSsp3YXpg6EdnHk1/VpmitJxNprCj1NhR8VZGKfG6E0YiUmlmS+cWWJzIFVMZKY211FzN2J7OpoEj4osF7CRV6cPiSZIaykpz9SrSWmHlbWylsAIBUMrbUgoljSmtc0KiUHRCSIVVCnst19jDKadRvhCwQZndybkymqw17kJ6m1qbzNAVwamila2McR/Yas0+hW0/tE2Q4z9vO1TfH9p5AaC1Q7ZTtk8k1rqysVO2r7z9cMrvnC9O2E5wd+AitjPjypAQgLS1o9aOWhuflvrCaHYhUSj22U51zPbQ27uNPcyDC7YVh8NJU5LlxxW9G4yT1haO7UgKt7TjsrGnkkoKYcelxutr7fNbe7pmD/LWxoNQ4BobJQ/suaSsjXfI77m1DYpnDhdeFGVNvM/vTBz5eDe2Tpp4E+KdId74Ab5tbc02Sha9sv27nK3ZamWPYefVyo687ceJ8fbF0p7CDhtbLO0wijFmMb4L2BgeM7YTVEpUYUjjYZ/dyXfIj2/YO7i3n2bFKbaUGN/VVRHhB4RRfQY7VlxhFSGertfMy55MeV5e413iSYewZYoKL6h4KtLs2VYumnkZXIT7mJeP/bzUJf04qzAvo+wxaTv7M+yfuHobzZ5gx9nEZP5IVJxPHs9upM8nYjCtFrELzSAuYb/Yynle4iK4Eddq++rS5xMknB/OfD65ukQ+cf/+gwv+4fOJuwHQ2G3OshSu8h1XXdwC7vcLDEznL/wN+jbN2fWcF0ybosTiZjZhb8uPb/zYLqpVpfQr7L11O9pkl+F0zU4224Fr7WzN3v+8LSZ5Yb7EHvz3mGAMwi6m5ktissleNSSV8cyJ/ETc/vaTdn5ro9Vf86TtW/vWvjW0sOzG2Vis2ma/uP3Zv97/4K+W3yCxPGZh467TNJ/Y2D4XitLx1t1IzZ+rJcULckG5z0ePk5LdIJ/TeE5YvPK47Z3caDcZaJ/zXZVhjU8FqjsARhrLpxoRRSH+3uLTRf1UUGRJuMus0pk2B7RVkL2v+dysivMDqoGhQNNhSYrcSfN8+70bEaLeSFDaof6hYQ47U5buRnQZpkZ6O3ga5Mfod+XmNqn07jWpMLcj2DrUSflo4lo7SWHPCr+20hGFp+Je7qTIvT32Nqp29O0izLSyW6hIg5+wUKEvaeHsd5W+e3hroxy3V74uVrqvTUIqmAZ5a8trcX8XFS+t+m3TtFLmAZWhVXppH6K+oeQ12R5iAjtubOPLrKKx97VR2IuckfNrwhuSfXFwLw9O12z9sIrMa5u9s3iv0sF+iSIQtprDxzPB3s5Hjc3l4UVjH2ojeZ9D5cqmg+9yusQbY/usXlj13tvpO+L32thcl5EsV/Zeaydkd/PW/p6LfClOybIdvCBUTAd/yemY+62s77ccZeHuE0d7JAxGCj71JSm244uVPWpsu26P2Ba1IquWdvCngrxdePvakszE3tPcuVTYB7BJ72VqD1/vv17ZIh9hqLMCu6DiBnYBezwVS7sMFo2dwr5QKFp3z0qts+BlPKnKMiiPA8RBj1y0D/v9q3XbL9SA7uVvc9/v2bOET9IUZWyjU9KwPagrUV8qPcRQtKnO6F9jOn6UB6XFo5H+nnb6sIezXMPO1m0F+6p0FN7AxnTlfVdjO7af13OMdkFvlB5P6tIO5ujbgHYGKNItH1HrMe2nR8SnZL2bjKo1W/ZhlwNHibozeYaHvLXRbwp+V5C3K6WGk3Pr+216KOTZRr/j+i2NzBFeUz3XNA7+eO3tesFJ5W+It0O/jbqTv0FogyereK/ZdaXoamVHJBJv+3hTYY8peOYrJcHxDudNv0nBnuVsb2NE408u18YJBc+LZodnVQB7XKZ63Kv/zhQ66sfJCE+YeRj/pH+XNBJ+06n8OGnsY2QTupTL8b1d/7KynRLDSX2NfuMeBARjzB0tbT7rbWwe6jBGQnu7nfMr+69yOS81Zt3zuurVZWufH7JNfBzrbZ6XiLe3e7WvHlt7UH1o79AxUgAdh8t8wvak8GtTkMeLWzsKEBDjDtmmH97XnKJ9v0tvc0wMX/JhwrS1U822WObBpX2KIV6THDe25dLdGcIOmPMgjfDBjT1YsC3qX/KlrcsR5++EbeRvOg6W+Tuua1EXhBzLfVcy8PHO/LYgo+RDe1DjaTPuN6450yDX3rTrTniTUIp1B+5y3fErnuAdMK+rCvlX8twJ6ydsR86vO2zzsY4Po/Y2ufKT6yUt18vG5pOrxlaSB4Sg5uShsfEuvf1x23y6vFzn5fp9CdvNVfPF2f3mV8F0o735MO0L6pP/APpnxbY=:D49A\n" + + "^FO515,910^GFA,529,792,33,:Z64:eJx10sFK60AUBuB/OHCyGabbAUP7ClOEEEHsq6Sbu450cVdXJwj6EoKvMqWgG19BbRGuS3UjhSude8akipLOKuF8Sf5zToD+o92OQncO8wrK76qOPFwemJYqLuXWZEvHyNZELyN/YuQ5CxR35wMaL8I0CDB1KeCSsvIg3LAAl8BVtqCVnwlAXiZgyOT1qrnowMMajwPlf4chYO0hg5m0rqbN2RYAs1L5Py046gAqddYIIEwisC8Jj4MWkBcCMtIGNeYtKB6G2PMJSAar9wUQacY4zucepxsU9xtMbA9oggBoARrP5RbY8blkyCTDtPFbYOkm/wLXLZAufBRg5StOXTCq43YO7lrmMDC5Wy2kC4rxBexAwOlrAqZ2f2WSozTJJ+5WxCeDGJeVepdr2cUv8Hr2sYsOWH7jCqhSHjmuAHebTECmNIm3aMGwB8igyuw7GP4ElqWT9wSwG6Q3UBvZmU9A3bI2LoH4rwP8CVT8AMrXiFG2G/r+SelChboNUPWBb4X/iF6Lsg==:5CBC\n" + + "^FO16,894^GB771,0,4^FS\n" + + "^FO439,848^GFA,741,1204,43,:Z64:eJyV1DFr20AUB/AnDNZS7lYHVOsruHQ5Y2F9FX2CciGQGByqCx68FLz2u3ToGUO8GHvtENoLHryERJBFpULX/0m2kxoXtwfSQ9JP6N17dyI6PZJ/MP9BDY4WaICoiZOLUf2ood1ZIAxqKinOEQJq4rWQUr+7sZwDqjRjOJd+xsvuEjSX1A+ajrKK2vGf9Mb6+ZZqSSIIHA2bhri3nnc380lFrwego7kSfPJCJagIA+TmTUHHk4mjg4qOVMR59xHTmUs9CAyZViLETMFuuhu/ptJR1dAR4z1QuTxX+VsNaoScbynnq4pmO9p2VCwvKE8VmTMtEiTkWdCypqlxCVgd8cLRaHFJ9gnF+qk6t/mWZltKO2ocZasPFDHQIb1bZMS8KajiT9W0QP3RCJR6JSoweyDXofuvdP4Zda0rwGoqGfGqAiz+CDotkDCR/U4XXzToej5cT5h1VGBaIeoa+e2KavQXvc2C5Opyqji6ZdclSx2NMS17Yxt2XFR0lmrQtgmzq+sZrlP/x31R01Az+qXKhh3ljjZvcRc5PPTpOS93y62muyssNEfZJiPvjugxp/LshcaHtI9QJNRYoQUt6ry/+yvtg8afJMqMuvaIOsWehkdoG6vKbyLdoSL57ZCy15RaEfE3qCtYsjikfHejokJQjA8bUKP3lB+jnYxCt7dar+nxcW6IyWobevoEfdausWQi7JUTVOJ5BoqpVf+EEyPZ/11+A6Z/CwE=:52F4\n" + + "^FO17,834^GB769,0,4^FS\n" + + "^FO561,790^GFA,673,810,27,:Z64:eJxt0jFr20AUB/D/8UC3qNJ6wRfrKxgy2Cam/iqGQrKqZPFgmguGeCmeCy30K3Qq2XrGg5aSOUMgFwTxlmgqghir705ukqE33KH76Ul37z3gzRi0i2oXMm9ouicRNiXP+T/a+WnSEkFa/7Jud52f8kC5RDIBPjGdv1ANxX+pmPhhzJReONuSa6kfqM8ki7kRFrSNA4n6FDHTkdEQjxJMcqc9zYUt4phcdGQ1sI0CJbo0ipZitei+ay6+CU/TxBNFo41V9Jnmi9Ghk1dwnjTIWopmT/zBL7SQuUZWwakeZkxrptstVPaDln2n6cBhoiZ4HIAai0hVUGlFy1OjJVOuLDY9oAQTn/DMkS7QbYYWvQMr1hUnlInfzJ6dHF4jK88ths9GrJiS1EelDVl5/DNCOTYYfwXdcDJlY5Kpkzf0Sx6fxCgJeJ9B1A4pH6Nb79CZV3L8oLCR4boYOLDgz2GNzp1J66JGwbnbMvVsKOlDxidcG7m6y1FEoFtO8kcO4RKehPQ6iMsKBUdo3ZK/cuLQkRXo0vkoxNxDH34D95brx/T9ivPsxDrjZ+6y+90rNQbS12iGQCVXf9WS6uyJb5pMIThIMKX73mAiDqZrJs4TrR23X0uJDA1GT/tObnxLVRjtKey1i4/0w1Mk8b+h2+UvUrvC/Q==:2E9F\n" + + "^FO432,753^GFA,597,817,43,:Z64:eJyN07Fq3EAQBuBZFmYbRW43WJxeYY7Aoav8KjIB1xvcpAhnCYHUhNR+jHuD7CKQu3uF6DDErUKaK0SSGemSU6pkQYWGD/HPzCpLi58w6hPoEfF6AHejCgKi3QpH8wO4RDZtys9oMFv77+XBRKAPiKkFd196oS/adDECl8iuffhWG4Q8P7ZNhKAbxMQCHIPQdVsZtEwTpnkeQn0l1LfaatAa0UYAPvRCywq1UBtNtOhe1QAzLSZqhQ4SQFWIJJS/Cnko69dMyT/rQjGtZ3rcT7RdUBLawcPg3yqhiqljevsoFFpMJurIPgyhQdtB7i409QtqBsmaes7qwojUzW2B8lNWkKwfz1khka8CZdIW0t2SxnNbn5i+4wng1ZxVaFkzdT3PVWiDK5vJXGumQ1thrHhbNqP3rg9Vnd9lW9kWcNaD2UTc1n3ZEGz3L1onvCCMHJ223j9hvsnS4guMQj/or6YHuFEVQUq7NJx4h2j6N49pM+zQb6QRfpjC+ahyz8MGfpcJzDUP6FczlW39J000XGgx/EXdRExxpnKz/kXjmcp9vVB3pvEiwB+qTktKQvnIX/C7aiD+BeFJuEw=:D211\n" + + "^FO16,742^GB771,0,4^FS\n" + + "^FO589,119^GFA,473,720,24,:Z64:eJxt0rFOwzAQBuDfilQvFV4ZIHmFjEay6lfpI3g8REXzADxDnoGxE8pURlam4i2rpS4Zopq7FJY0nk6fE5/vzsDC6pZQvF5kFWvoRjdTzP9eo6JROUF3VQwWYZ/6torJQZ8bdeTvO59IfOhbjpzPRTd5Q2TZX13fErGnqwNkHTuJW+tQ8/k/SRzlnwfnxKFOln2HktipbzG5hjqK+84MCC+DeMm+gvp8ikCVNPs+9u1+vHrxlaUi8bSHuHHIb8jDndRIxQGJIHnNqIc1PCzXRaQPKklestVYvEs/ArslY3Wy1H8Q+RG19C3ynk+l9cGnfPFpx3lVg7MMoIrObkIV86WK5EDcWS+NNR3XH0z3fDJNcPAqwqyug7D/EwlOZWxh1jeupWWP37cuR9th5px32q5nzvfEPft25lzX9gHIcebVCCr5uO728ez+Hs18beQJLbisoll2bt0verSeQw==:6681\n" + + "^FO268,702^GFA,461,570,19,:Z64:eJxd0j1LAzEYB/B/CFyWcrde4fC+gm4BhX4VQdD1ilAdxAbcdXbqV3B0M3LQLqVzl2qOgptw4HLg2fgkubZiloTf5eV5OSCMlOP/kLGfRIs6t7YGmJaZkwIDoWh1CIzNTcoU8gLJPRwNbIuR5LC2AW8jR7mlI0WEYxiwOvMHBdEoBocGarmjiwy8/6rQFDtaPyPqzzRbmEAtiupRR6s38FJ7opcKnZt49QQxCXHRi1dli/hTgX+p7V1jmyKrFKWELQ1LorMHUCR/qcc3YC8dHRA1lPY52DoQ2xAtWfX9AX7niU9ajMuU2eme2oJ2SVz3iKwPgplTf9dJNqddIa7ahCDSOURHR9pTLBeU0NITVxjOLMQhUd0VR+HynYo81GDKbOk2T8GqKZCE4vAGqZBAZcF/PDHXSk8GSalca7lLT/SowW5G6LZfwjUIyf6noEC6T7/TcY1g:949E\n" + + "^FO644,662^GFA,277,460,20,:Z64:eJxt0EsKwjAQBuApgbopdBuh6BUCbtz1KlO8QI+QUtClV5qQhZcQzBFcFgR1kvSl7b/I4oN5BSAmIQABvxGwtHTFspnllh56/2Qz+iW3H8cmHXZUK2/NNVOAbEqhI1KwA9NuJqNKB7uIFIMBm4l2FqI3iWRBwSEYBSs7tO1giY79jvgWo9E4w1vVTLXe7GD93GONJljL+6V16e8oHJ78DLpNd+S2K30/uvO9hYz78ettyGh6aUkwoecGtGL1fy2H/zkmCf/8BS5zVgM=:0CCA\n" + + "^FO286,666^GFA,269,323,17,:Z64:eJxdzzEKwzAMQFEFg7uIZM0Qmit49FDIVVRyAfcGhkC69Uw23nuF5ggeM5i0shtaiCbzMB+pCe5l+1gtvU0XEQ22C63OKFA3/5BSK1SKFucYaBQSUWdwV5tBZGiRX84XACEBO4SWXAAGA9UM/GdYKUwZzuI9N1uNStMmMohJzFjLEi0AIUe/EP5wStqQL0DhLuuuw26hsUSVf8oTb9qEdeBGlfiWYYoKAXij0gCQADvYA1RHAHcE8wM+Lk8fYZ8mfQAIF0gB:9E77\n" + + "^FO17,650^GB769,0,4^FS\n" + + "^FO494,614^GFA,653,1116,36,:Z64:eJyF071q3TAUB/C/EERLc70a4kav4NBFlwrrVbp1CUVbVTC1Ql6rwymFTiFP0IKnZilBpYsHc2+PFOc2LXGiSZZ+1sc5R8DjTcaVif9M/YxRdAS7IBXzP6cQpMr3aRnh8VHBNnnB7OH1OMT3Sc+8vh+iHmVUs4JC1/BCeyrGpSEOk1uMSzLqYkxtsU8qr+z7IKkPts9GUggyOqtwzSbAU5X39iEICiYUk3syWqv0LYyZANL5eN7bYuxi+A7BquYdzDaxCcWkYvxi+oOpX7d8XzoYfzCOijG3qFM2eMRovpe3yu1wwgbTUTbpgUmCBJvEe3Wo2w5V0vnuyRcTFoNQTHvOpofGR46hSMHcG8Em3BlzjpPf6c0or9iolOPjjeH4KDamGLn9iab1lDY17+U4F272JueC+7NbznPN5iwGY/jIHec0m5zTjk3OKRts0IQBXfuKjfG8Fpvqk4yGTUXFXO6gP99Ac5bvqqhEyh564BjugGOuMzHeYM2IrwQxbfj7x6rBixFqaiAvrlaMtWhGHH+fIC//NbmSc4/vYGHfxu2XCUp8e/gUrIr370DPeLkfP5BB1dcrpprFfsQv8qjIYK0NXIJnbLjyV03Hz00Sw6deK28sqF2fL4aens9N/DV/AHRf7PI=:F8C9\n" + + "^FO17,601^GB767,0,4^FS\n" + + "^FO478,562^GFA,633,1178,38,:Z64:eJyF1L1qHDEQB/BZBKfmyLUXsvG+giGNDMvtq6RLE4IghQd8sQR5DT+MqpSuXbhQSBuCIIVViNv8pdV92b6LYNAt+7vV7Iy0RKeGsGXyJ8GBatx5Jd1sZ6WdonEXmPM/tyG9zPcRo5WOdOdJXwdjO2+CcNdBKxP+3skiZs04JspqCKRNNHYIJgpnIlR8quoNAeXVNDPpNQvHfNsLt2atbvus7qHmxMuSpmaVo3GsGIqVxgzV/SmKqtL9pHR/pNovuNnuFO0VV8VPj68pDUX9DbLXUDdxfJQqr7jcKZO2yvhJGQ81bCZlSpMCVKiKqiKodlWU2JRKBGRfFU8KpYG6/AylSDzMUNUmIPOiUAmuinNeWUU8bg4lA7OcFFhWHBWPSVz9RgursgM6NCD7IWEOQ9LqWxzCJsn2nrqYq5pfcoVur4rqfOezGmLnU5LoYXcJ8C7m/PTCqqIWbuGy6tTCQX3Hy30AMOFg1027UtS9CZXL9dWSSPqMan7g5y9L8uGcojlq7nG5/HharamF+olY+pfKTldxTf0nWzJ/e6imYfbq/ehFomcrVkVb1Yw+n4rtzjka/d6HKtRLtR+rfITa/6lymC+OHv+qctPcnlUHH5J/QLn9yg==:9CAE\n" + + "^FO17,547^GB767,0,4^FS\n" + + "^FO16,401^GB771,0,4^FS\n" + + "^FO16,345^GB771,0,4^FS\n" + + "^FO16,284^GB771,0,4^FS\n" + + "^FO525,242^GFA,473,896,32,:Z64:eJx10zFuwyAUBuCHkOolstdUisoVMlIVxVfJEdiCVCsgZegS9QQ9DFM79QYd2DqG0YNl94ENcdQYyQP6bHj8PAMsjRU+W2DD4P/bFuChBNAeNnFCTWGSEUvsi4Fd8O3k2jFHDbXhPe0PXjs6oMvsvvbZW93i7C04n7xRSiU/ikaJlp7K9dUVVzy5Eoo3qjitJPjsQoq5Hzn6nswcrq7QRTWcLRm6yeXMX1vJB1HYbwsdZNddrt9J3gugl5DIPq0/cyzbi77QJmR1p77odakh5Jp8dj4VvPhhpCe/d/Lh0Wlbgq77lG9I1NRd8NoHB3S22+T8w/2Mzlx0WXlca/KDrUzyyo7fM9wvuYw3Ty3A2AfolwaIkwsuBfnC/nJuwRUnn+hy0RV9R3+2My9MqG500RYd+uOt6+yYxgd6ZW4dkjMH603cbPRxiNz/CHz0+/9HKDE4LDt/iv4HFbzIMA==:6D54\n" + + "^FO47,242^GFA,549,1008,36,:Z64:eJx90zFuwyAUANCPkMqS2msqWfEVOlIV2VfJEdiCVCsgZehStRfoYZjaqeoFOrB1DKMHy+4Hx8RRkyBZMvwn+HwA4FJb4Hcf/8ph8P/jGLvJALSPtIgD1DAzxYkl9tFAFcz9zGhXOmqoDVb7jdeODmgkhrJkfO2TaXWLvedg+Mw0SqnJbEWjREt32TKagpjRKK74ZJRQvFFst5Dgg2GHeZSQYm62HM2aoHFFlgwcjUIj8uHFkqEDXxQHI2fmqZV8EMx+WegA2oIno7u0Lyd5L4DuQ8XWDaY1rTUzuB0veqZNqGe1cOdyjqbONIT6l7c2mdneVTDspyQ9+QX2Zs7UkEdD2wx03QN8TyZW39RdMLUPBtCUFUbz43mFMx1N6aKRucc5Z+e1sbmZTG7HeUpce25kvDnUAoz3CM2+AeJwfHXJSEE+8XI5B1BdMoqTDzTyqlH0Fc2DjaGjYSZkPBrRsg7NXTDbE6OTwWq9o8mxUw+nBiZTOlgWcWE9THUem0jvC4N8NLW59AZD2sHAlXeKja+S+QOb8Ngz:8A9E\n" + + "^FO639,196^GFA,453,540,18,:Z64:eJxV0b9Kw0AcB/BvOMgt5bJmqO0rRLoELPgqFgc3e6GDAZG7LrqUujoIPoQgjgcO3eoD6HDQwcUh0iGFBuPvLm3UI4Hjw/3u9+cAJAA4/Qb75SQCApJAx60YMJsgI+EaMoQQAmyTQDkxkAKR6IFpiWyW7mXebeQu9VEUsYwbeXx2N5NgmTgx47IV+pie6NFH+k/OMHr9lSHJ+V+pKwQPFco3L9knom+K2uRQPHHZVZVAsGltcvDwUHOjqs4JtYHCSoThgGpWsmPq2yH1bSHC0tc81n0jwWAR1U8+10KzLwseFFB01uVaAJcGvSvNtug6qW+Avkb0onEEN0O+vvZTZTTrAVIvcy9u+hfW1zyZAQfvpBZKSH/zPZAWwHGBVSOSMubS97bi1gvFrqk6CjxFIzlVQM9HpbBpeyYjSd0cveSx2+6kffuduPUDsax2Ew==:D7EB\n" + + "^FO560,165^GFA,393,644,28,:Z64:eJyN0TFKxEAUBuA/BGaaIdsGDOYKzy6CkKskNxiw2UJ0wsLuJTyEN/ANAbfzDJPGWjuLFL5xEyG7uviaCf+XTN68AY6r5pPop2z425j+YytmHtXalIGoTj6hA189g8cbea4C+1dlzKUlut08wlg7fDiJdAYi7ndiRUU07DPkeem9i5EGgftULM/lrRclhtZ9R+nSWAFinYtR4qpoW7FCLGjArHy0rZE+xZJoRqxJUY6V3yFGQMJLk+/bcTI0y//J2rpEIh3Nz2YPfVLbdRKlDGr6+XzvQ59B1nazkQhr5M3bNJfrpziXzFa81xIhk3neyTwfzEUop3nW7r7gsXZ6mriRI891uD6F9BfD0jJTnJg5Y+rMnnJ/cx0bpOcva3R33Q==:1FCC\n" + + "^FO17,161^GB767,0,4^FS\n" + + "^FO623,702^GFA,445,600,20,:Z64:eJxV0rFKBDEQBuA/DFwa2XqL5fYVtDLFga8iCNrmODibw40I2vgAioWvYZljC0tbu4vcC5xcs2C4OO7E1Usz8DGTZDIBZJUkMYd+mUKidkCd0gZQ3lSgjrP00qECDoEmLErlIgroVuwkRcwNYTKpoEmsToC1I4xnZjBotjnXrTds+LMLrmvDvq1fQEu2WjmxCPvx6Hv7IslLHayvAy0/ndZFNuCyjaD1E7Suhv2aVILObtnMYNO2hJ7eQzd237hpfR6yjdk6DtzHyIupHds79DGbFqPniIZrafvAd5Z+KVrOM6gDv+lWTIXTfr9FSFB3ud9N6M+1b5w4ynbke8OKB1Jk43ecvnKd/7Fdvp/DbNVB8cyQwmBXdQl144hHk2s7lNw7XXsVKzH1M+Le+FwjM+c0toP+D/yafArIGebfhyGXPw7wDQqRfyE=:532F\n" + + "^FO611,288^GB0,259,4^FS\n" + + "^FO202,288^GB0,261,4^FS\n" + + "^FO408,288^GB0,259,4^FS\n" + + "^FO659,508^GFA,213,270,9,:Z64:eJxjYzjAAAZ8zA1QBjuEZpBnY0gAUgkMsn1gRQ8YZGQYQYoeSMjINoMYH2RkJI+DlP7/I2PxDsR4JyNjkVYAUWPA/gPMkP3wnwHMkP9/DMKQKcBk/AMxHv6QKfgGYry/If8BLPUMKHUORQ1W7YX/D0AY30FqGB/YyLeDpBgf/2FjBGlnBAqDGQxAxzEehvqQEep3kN/AAADpXz7P:9688\n" + + "^FO16,457^GB768,0,4^FS\n" + + "^FO675,478^GFA,133,136,8,:Z64:eJzjbz+4j+F/A4PFgYOPmRsbGAwSEg+2MTYwMCQkNvaAaIPEZh4I3S4BpOs/JP4B0QkGiQ0gGqgeRjeDaIkDCcdBNH/zjxoQDTSIQQZK80BpNigNsg8MgPYDAEdZJAA=:BBCA\n" + + "^FO432,509^GFA,509,580,20,:Z64:eJw1kUFLw0AQhd+w0FxKc1UozV+IeImg9K/k5jU3C0qTk14KXv0ZQkGP7q2XYq8KQbcU9FI03iKErm+2GMiS+TLzZvYNBkBiAaz1KPkOgVHkd5jKTeWQ+BYwO2LjKyTmDQ1ihmNGyCAVousWBdCjzozlBeQOpi74E70c6AeWdJD2SlnZ7JnDmArNl/ajHsZOGfWQb/Nh0EMX8g45QbNqOOi529daJDXw40FWFoGJxQnbv9bKPlLIrVN2RIn6RdmigXS5sotnyHJoB5D3DGYW2A+ZlWoAs1BWBOYhizmUdTBPgdEgWT2QCYWjWaoMUYvfnfZA4qL+RFnkbdyeVWquR+yZZMeeQVqyr2etWerdYh44blh7ql97X+gwilR9Mazrl5YsuacvO2VTC/FOPc3o5vpRPXUOfsvaCbIJsJkrWztkqpfhsoZ8prqYb3o1CCueUMml7CSOLGafEdourMrBbDjBFJpbVirBCwl3JK0OiQP8P/l+3j+CKJSy:21AF\n" + + "^FO417,470^GFA,377,576,24,:Z64:eJxl0bFqxDAMBmAbg7zoyKpCwK+gbh1Kn8Xhho7NmKFQh0C6HPSVcmToUjrf2NK1Q6B7qS1fkrurFokPGxv9Sn2os3JD7jrMkAeupRkzH9SBUvN84WrAEwcoujukh+5RT6gcYF21E5iAVneA1IzvtgRlAN3nM9nkajRI9bZHAKV7VFWPhQ1UiPstlNZkD+KbID4CGfFiH2D1anGKvukHoiH5kwHWbUhevfxe7Wb3i3O1g+j833tMzj76TXw3e0nR6c2TeHM9+y3tO+JD9Psf93pwJv5Hh+Lr27XtlDzuK69O/hkwrfncrbhk0HD0MTtC9hgU14yLp30e3Ysfy0yQbkk2NcNJ5Dh7OnXha9rrTCf+BwwfYUQ=:4F4C\n" + + "^FO257,508^GFA,281,348,12,:Z64:eJxNkL0KwjAUhU8ImKWYVSHY1+hQ6KvkEYQuDkLzSI5OEt8kU0fJ2EGs5yYqXkjul3DuL0BTAT/Tf2ziH+ei2wINDN9TwhTQCU+LDjbCYwN03kSdEIXhbVBZfbgHMpMLJw+cGFiYp99WPmvACetoFstijrxmGwZ6h2ldcFQze+wwvCRFw56uODC2d9SqXPK0uz2HqGyvQyxFzMKvMRRm70gj9fQrXZzlgsyi7l8OXMWDtcj6AnNrPpxgkqvciobMcfGUJTV1V6fq3mAkPtI=:F834\n" + + "^FO255,470^GFA,209,252,12,:Z64:eJx9z7EKAjEMBuDIQbqUc81weK8Qt04+S8EX0MU54noPc4+QUtDHsI/gbTeI2oJSXcz08ZOEBOBdDLX+GE1MV9DZjL2g9X6SOHQ3l5CYk0aknediVcWcOCTiINrkhJCJ45cfcHnyWmzpUTg3xW2ZXUT8OBzzzr3YlfW8PYWhm8QeTLhvWp2Xo1K98Meu2nO1S/WZXl7pyziN:E0CE\n" + + "^FO61,509^GFA,317,348,12,:Z64:eJwtzr1KxTAUwPH/IdAuoV0dgr7CHTsU76v0BcSCi4PQTE59AB+lY0TwOSIOd5NM4lCIJ+k9Q/LjcL6ghJXMWHVqOvr3WD24DvPt6bRgHPTN4hfPcDv/wEtLH5j6rxVGrYsE+bBw75AkwbzaG542SMab1Z5ICZ5bWmcnucTa0w82sKt1Tzc/BCRA5+hy9qBudFZe4FFtBuTzTmeoZcOsek8sTrRvV5MwWx/J5f6I/J31O8x5R4olYnaLXH4p+xav3l31iN4/DbqrzNKcSdUS1Hk+HJ2my0ytSUdfjdld+0o0Nf8PBaxQzQ==:B2ED\n" + + "^FO55,474^GFA,217,272,16,:Z64:eJxjYz9gYcDf2HjAjo2xgYGBgU0mwaLA4mDjgcdQvoSBRYVBYuOBg80QPoNBTgVDYnMCI4wvkXODwbA5geFgI4x/Bplv/yPtTP3HNsP/Bw6C+QYSx84kGLYZNkD4fBIGx3sMEtsMDjb+h/HbDBJ7JA42g/XL8SQ2t0kc7JFIhrinjP1gMxt/Y48E1L0IgI8PYqLzmdHUM4LtBwBRqT1Z:F006\n" + + "^FT542,424^A0I,23,25^FH\\^CI28^FD"+record_no+"^FS^CI27\n" + + "^FO17,105^GB771,0,4^FS\n" + + "^BY3,3,58^FT561,42^BCI,,Y,N\n" + + "^FH\\^FD>:YL292929201^FS\n" + + "^FT786,424^A0I,23,25^FH\\^CI28^FD{data}^FS^CI27\n" + + "^FT429,758^A0I,23,25^FH\\^CI28^FD{pcsn}^FS^CI27\n" + + "^FT439,854^A0I,23,25^FH\\^CI28^FD{是神恩撒旦法}^FS^CI27\n" + + "^FT507,918^A0I,23,25^FH\\^CI28^FD{code}^FS^CI27\n" + + "^PQ1,0,1,Y\n" + + "^XZ\n"; + byte[] zplBytes = zplContent.getBytes(StandardCharsets.UTF_8); + outputStream.write(zplBytes); + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + // 4. 关闭连接 + try { + if (outputStream != null) outputStream.close(); + if (socket != null) socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return PdaResponse.requestOk(); + } + + @Override + public void printCode(JSONObject whereJson) { + OutputStream outputStream=null; + Socket socket=null; + try { + SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class); + String print_id = sysParamService.findByCode("PRINT_ID").getValue(); + // 条码内容 + String code = whereJson.getString("code"); + // 1. 创建Socket连接打印机 + socket = new Socket(print_id, 9100); + socket.setSoTimeout(5000); // 设置超时 + // 2. 获取输出流 + outputStream = socket.getOutputStream(); + // 3. 发送ZPL指令(注意编码) + String zplContent = "^XA\n" + + "^CW1,E:SIMSUN.FNT\n" + + "^CI28\n" + + "^FO50,50\n" + + "^A1N,36,36\n" + + "^FD中文内容123^FS\n" + + "^XZ"; + byte[] zplBytes = zplContent.getBytes(StandardCharsets.UTF_8); // 根据打印机编码调整 + outputStream.write(zplBytes); + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + // 4. 关闭连接 + try { + if (outputStream != null) outputStream.close(); + if (socket != null) socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @Override + public PdaResponse getPrint() { + List dictList = iSysDictService.getDictByName("PDA_CONFIG_PRINT"); + List collect = dictList.stream() + .map(row -> JSONObject.parseObject(JSONObject.toJSONString(row), JSONObject.class)) + .collect(Collectors.toList()); + collect.forEach(item -> { + item.put("text", item.getString("label")); + item.put("value", item.getString("value")); + }); + return PdaResponse.requestParamOk(collect); + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaProductionServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaProductionServiceImpl.java index 5820b8f..364ac09 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaProductionServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaProductionServiceImpl.java @@ -2,6 +2,7 @@ package org.nl.wms.pda.general_management.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -703,7 +704,7 @@ public class PdaProductionServiceImpl implements PdaProductionService { } // todo:获取ACS的重量! res.put("total", bucketInfo.getBigDecimal("qty")); - res.put("rows", infoByBucket); + res.put("row", infoByBucket); return PdaResponse.requestParamOk(res); } @@ -769,8 +770,8 @@ public class PdaProductionServiceImpl implements PdaProductionService { JSONObject row = param.getJSONObject("row"); String currentPoint = param.getString("current_point"); String vehicleCode = param.getString("vehicle_code"); - // ACS 获取的重量 - BigDecimal currentTotal = param.getBigDecimal("weight"); + // ACS 获取的重量(毛重) + BigDecimal currentTotal = NumberUtil.sub(param.getBigDecimal("weight"), row.getBigDecimal("bucket_weight")); BigDecimal originalQty = row.getBigDecimal("qty"); Param threshold = paramService.findByCode("weighing_threshold"); // 对比与组盘的重量是否大于阈值 diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaWarehouseServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaWarehouseServiceImpl.java index faa39b1..054e301 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaWarehouseServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaWarehouseServiceImpl.java @@ -273,7 +273,7 @@ public class PdaWarehouseServiceImpl implements PdaWarehouseService { // 校验托盘数据与入库是否匹配 // 入库前检测 AssemblyPalletParam checkParam = new AssemblyPalletParam(); - checkParam.setVehicle_code(param.getString("vehicel_code")); + checkParam.setVehicle_code(param.getString("vehicle_code")); // res中包含g.*(md_pb_groupplate字段),但也会额外带一些展示字段;这里只取校验必需字段即可 List rows = param.getJSONArray("rows").toJavaList(JSONObject.class); List groupPlates = rows.stream().map(row -> { diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/packaging_management/service/impl/PdaPackagingServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/packaging_management/service/impl/PdaPackagingServiceImpl.java index 4a83956..0d04710 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/packaging_management/service/impl/PdaPackagingServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/packaging_management/service/impl/PdaPackagingServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.IdUtil; import org.nl.common.utils.JSONObjectOf; @@ -17,6 +18,7 @@ import org.nl.wms.pdm_management.service.dao.MdPdmPackaging; import org.nl.wms.pdm_management.service.dao.mapper.MdPdmPackagingMapper; import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.sch_manage.service.util.ACSTaskTypeEnum; import org.nl.wms.sch_manage.service.util.tasks.PackagingMiddleTask; import org.nl.wms.warehouse_management.enums.IOSConstant; import org.nl.wms.warehouse_management.enums.IOSEnum; @@ -89,6 +91,13 @@ public class PdaPackagingServiceImpl implements PdaPackagingService { MdPdmPackaging dto = JSONObject.parseObject(JSONObject.toJSONString(whereJson), MdPdmPackaging.class); // 调用新增 iMdPdmPackagingService.create(dto); + // 更新点位状态 + iSchBasePointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料")) + .eq(SchBasePoint::getPoint_code, dto.getPoint_code()) + .set(SchBasePoint::getIng_task_code, "") + ); return PdaResponse.requestOk(); } @@ -147,6 +156,13 @@ public class PdaPackagingServiceImpl implements PdaPackagingService { insertPackList.forEach(row -> { iMdPdmPackagingService.create(row); }); + // 更新点位状态 + iSchBasePointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料")) + .eq(SchBasePoint::getPoint_code, in_point) + .set(SchBasePoint::getIng_task_code, "") + ); return PdaResponse.requestOk(); } @@ -197,6 +213,7 @@ public class PdaPackagingServiceImpl implements PdaPackagingService { jsonTask.put("point_code4", whereJson.getString("in_point_code")); jsonTask.put("material_id", rows.get(0).getString("material_id")); jsonTask.put("material_qty", whereJson.getString("total_qty")); + jsonTask.put("task_type", ACSTaskTypeEnum.AGV_TASK.getCode()); packagingMiddleTask.create(jsonTask); return PdaResponse.requestOk(); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/SchBaseTaskController.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/SchBaseTaskController.java index 4446e8f..8717982 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/SchBaseTaskController.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/SchBaseTaskController.java @@ -14,6 +14,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.Map; import java.util.Set; @@ -71,4 +73,10 @@ public class SchBaseTaskController { return new ResponseEntity<>(HttpStatus.NO_CONTENT); } + @Log("导出数据") + @GetMapping(value = "/download") + public void download(@RequestParam Map map, HttpServletResponse response, String[] product_area) throws IOException { + schBaseTaskService.download(map, response, product_area); + } + } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java index 90220ec..b222bea 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java @@ -150,6 +150,14 @@ public interface ISchBasePointService extends IService { */ List getNoTaskPointByRegionAndType(String region, String type, String pointStatus); + /** + * 获取可用点位(成品-需要按照入库顺序排序) + * @param region + * @param type + * @return + */ + List getNoTaskPointByRegionAndTypeCp(String region, String type, String pointStatus); + /** * 获取可以直接上料的缠绕机 * @return diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBaseTaskService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBaseTaskService.java index 4ffc5b6..c80c8fc 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBaseTaskService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBaseTaskService.java @@ -8,6 +8,8 @@ import org.nl.common.domain.query.PageQuery; import org.nl.wms.sch_manage.service.dao.SchBaseTask; import org.nl.wms.sch_manage.service.dto.SchBaseTaskQuery; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Set; @@ -81,4 +83,6 @@ public interface ISchBaseTaskService extends IService { List getTaskByQuery(LambdaQueryWrapper lam); Integer haveTaskAll(String deviceCode); + + void download(Map map, HttpServletResponse response, String[] product_area) throws IOException; } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBaseTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBaseTask.java index fea160f..338558b 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBaseTask.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBaseTask.java @@ -122,10 +122,6 @@ public class SchBaseTask implements Serializable { private String update_time; - /** - * 任务类型 - * 1-载具,2-料箱 - */ private String task_type; private String contact_task; diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.java index 0257ca2..655f55a 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.java @@ -81,5 +81,7 @@ public interface SchBasePointMapper extends BaseMapper { List getNoTaskPointByRegionAndType(String region, String type, String pointStatus); + List getNoTaskPointByRegionAndTypeCp(String region, String type, String pointStatus); + List getCRUsedDevice(); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml index 7e9b819..dc862b2 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml @@ -185,10 +185,25 @@ t.point_code2 = p.point_code OR t.point_code3 = p.point_code OR t.point_code4 = p.point_code) AND '5' > t.task_status) + +