diff --git a/nflg-wms-admin/pom.xml b/nflg-wms-admin/pom.xml
index 70c71b11..41faa6f7 100644
--- a/nflg-wms-admin/pom.xml
+++ b/nflg-wms-admin/pom.xml
@@ -61,11 +61,6 @@
org.springframework.boot
spring-boot-starter-mail
-
- cglib
- cglib
- compile
-
commons-io
commons-io
diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java
index 347796a5..1cdaa43f 100644
--- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java
+++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java
@@ -3,6 +3,7 @@ package com.nflg.wms.admin.controller;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
@@ -20,8 +21,10 @@ import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.PackageMaterialDTO;
import com.nflg.wms.common.pojo.dto.SAPOrderDTO;
+import com.nflg.wms.common.pojo.dto.SAPSyncFromDTO;
import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.*;
+import com.nflg.wms.common.util.BeanUtil;
import com.nflg.wms.common.util.EecExcelUtil;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil;
@@ -35,6 +38,7 @@ import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.transaction.annotation.Transactional;
@@ -47,7 +51,6 @@ import java.io.InputStream;
import java.math.BigDecimal;
import java.net.URL;
import java.time.Instant;
-import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@@ -55,6 +58,7 @@ import java.util.stream.Collectors;
/**
* 钢构件订单管理
*/
+@Slf4j
@RestController
@RequestMapping("/deliver/order/package")
public class StructuralPackageOrderController extends BaseController {
@@ -89,6 +93,9 @@ public class StructuralPackageOrderController extends BaseController {
@Resource
private IWmsStructuralPackageDeliverOrderMapService structuralPackageDeliverOrderMapService;
+ @Resource
+ private IWmsStructuralPackageStorageTaskService structuralPackageStorageTaskService;
+
/**
* 搜索SAP订单
* @param request 请求参数
@@ -141,7 +148,7 @@ public class StructuralPackageOrderController extends BaseController {
.setMaterialDesc(material.getName())
.setVersion(material.getVersion())
.setWeight(material.getWeight())
- .setPlanNum(material.getNum().multiply(BigDecimal.valueOf(num)))
+ .setPlanNum(material.getNum()*num)
.setImage(material.getImage())
);
if (Objects.nonNull(material.getWeight())) {
@@ -194,7 +201,7 @@ public class StructuralPackageOrderController extends BaseController {
.setOrderId(order.getId())
.setNo(it.getNo())
.setWeight(BigDecimal.ZERO)
- .setNum(BigDecimal.ZERO)
+ .setNum(0)
.setStation(it.getStation())
.setTray(it.getTray())).toList();
List items = new ArrayList<>();
@@ -204,8 +211,8 @@ public class StructuralPackageOrderController extends BaseController {
WmsStructuralPackageOrderTrayItem item = Convert.convert(WmsStructuralPackageOrderTrayItem.class, it);
item.setOrderId(order.getId());
item.setTrayId(tray.getId());
- tray.setNum(tray.getNum().add(item.getPlanNum().multiply(BigDecimal.valueOf(order.getNum()))));
- tray.setWeight(tray.getWeight().add(item.getPlanNum().multiply(it.getWeight())));
+ tray.setNum(tray.getNum()+(item.getPlanNum()*order.getNum()));
+ tray.setWeight(tray.getWeight().add(NumberUtil.mul(it.getWeight(),new BigDecimal(item.getPlanNum()))));
return item;
}).toList()
);
@@ -391,12 +398,17 @@ public class StructuralPackageOrderController extends BaseController {
DeliverStructuralPackageOrderExtendVO trayVO = deliverStructuralPackageOrderTrayService.getInfo(id);
VUtil.trueThrowBusinessError(Objects.isNull(trayVO)).throwMessage("数据不存在");
List list = deliverStructuralPackageOrderTrayItemService.getListByTrayId(id);
+ List datas = new ArrayList<>();
for (DeliverStructuralPackageOrderTrayItemVO it : list) {
- it.setQrCode(com.nflg.wms.common.util.DateTimeUtil.format(LocalDate.now(),"yyyyMMdd")+RandomUtil.randomString(6) +"_"+it.getMaterialNo() + "_" + it.getTrayNo() + "_1");
- it.setQrCodeImage("data:image/png;base64," + Base64.getEncoder().encodeToString(QRCodeUtil.generateQRCode(it.getQrCode(), 200, 200)));
+ for (int i = 0; i < it.getPlanNum(); i++) {
+ DeliverStructuralPackageOrderTrayItemVO vo = BeanUtil.copy(it, DeliverStructuralPackageOrderTrayItemVO.class);
+ vo.setQrCode(it.getId() + "-" + (i + 1) + "^" + it.getMaterialNo() + "_" + it.getTrayNo() + "_1");
+ vo.setQrCodeImage("data:image/png;base64," + Base64.getEncoder().encodeToString(QRCodeUtil.generateQRCode(vo.getQrCode(), 200, 200)));
+ datas.add(vo);
+ }
}
Map variables = new HashMap<>();
- variables.put("list", list);
+ variables.put("list", datas);
String html = ThymeleafUtil.generator("/template/qrcode/", "spitem", ".html", variables);
URL baseUrl = new ClassPathResource("template/qrcode/").getURL();
PdfGeneratorUtil.generatePdf(trayVO.getExternalOrderNo() + "-" + trayVO.getWorkbenchCode() + "标签", html, baseUrl.toString(), response);
@@ -439,7 +451,7 @@ public class StructuralPackageOrderController extends BaseController {
}
/**
- * 根据托盘号获取托盘信息(打包用)
+ * 根据托盘号获取托盘信息(PDA使用)
*/
@GetMapping("getTrayInfoByNo")
public ApiResult getTrayInfoByNo(@Valid @RequestParam @NotBlank String trayNo){
@@ -459,13 +471,13 @@ public class StructuralPackageOrderController extends BaseController {
WmsStructuralPackageOrderTray tray = deliverStructuralPackageOrderTrayService.lambdaQuery().eq(WmsStructuralPackageOrderTray::getNo, request.getTrayNo()).one();
VUtil.trueThrowBusinessError(Objects.isNull(tray)).throwMessage("托盘不存在");
VUtil.trueThrowBusinessError(!Objects.equals(tray.getState(), OrderState.Unpackaged.getState())).throwMessage("请勿重复打包");
- VUtil.trueThrowBusinessError(tray.getNum().compareTo(BigDecimal.valueOf(request.getQrCodes().size())) == 0).throwMessage("打包数量不足");
+ VUtil.trueThrowBusinessError(tray.getNum().compareTo(request.getQrCodes().size()) != 0).throwMessage("打包数量不足");
VUtil.trueThrowBusinessError(!deliverStructuralPackageOrderTrayService.lambdaUpdate()
.set(WmsStructuralPackageOrderTray::getState, OrderState.Packaged.getState())
.set(WmsStructuralPackageOrderTray::getPackBy, UserUtil.getUserName())
.set(WmsStructuralPackageOrderTray::getPackTime, LocalDateTime.now())
.eq(WmsStructuralPackageOrderTray::getState, OrderState.Unpackaged.getState())
- .eq(WmsStructuralPackageOrderTray::getTray, request.getTrayNo())
+ .eq(WmsStructuralPackageOrderTray::getNo, request.getTrayNo())
.update()).throwMessage("打包失败,请重试");
packageMaterialScanRecordRepository.saveAll(request.getQrCodes().stream().map(qrCode -> {
List qrContents = StrUtil.split(qrCode, "^");
@@ -519,7 +531,7 @@ public class StructuralPackageOrderController extends BaseController {
.throwMessage("采购单号必须一致");
Long packageId = trays.get(0).getPackageId();
String externalOrderNo = trays.get(0).getExternalOrderNo();
- Long supplierId=trays.get(0).getSupplierId();
+ Long supplierId = trays.get(0).getSupplierId();
List tids = deliverStructuralPackageOrderTrayService.getIdsByMaterialAndExternalOrderNo(packageId, externalOrderNo);
VUtil.trueThrowBusinessError(tids.size() != ids.size()).throwMessage("数据未齐套");
String deliverOrderNo = RandomUtil.randomString(10);
@@ -532,6 +544,7 @@ public class StructuralPackageOrderController extends BaseController {
structuralPackageDeliverOrderMapService.saveBatch(ids.stream().map(id -> new WmsStructuralPackageDeliverOrderMap()
.setDeliverId(deliverOrder.getId())
.setOrderId(id)).toList());
+ deliverStructuralPackageOrderTrayService.setStateByIds(ids, OrderState.InTransit);
return ApiResult.success();
}
@@ -545,12 +558,92 @@ public class StructuralPackageOrderController extends BaseController {
}
/**
- * 根据送货单号查询订单信息
+ * 根据送货单号查询订单信息(PDA使用)
* @param orderNo 送货单号
*/
@GetMapping("getInfoByExternalOrderNo")
- public ApiResult getInfoByExternalOrderNo(@Valid @RequestParam @NotBlank String orderNo){
- List datas=deliverStructuralPackageOrderService.getInfoByExternalOrderNo(orderNo);
- return ApiResult.success(new DeliverStructuralPackageOrderForPackageVO());
+ public ApiResult getInfoByExternalOrderNo(@Valid @RequestParam @NotBlank String orderNo) {
+ List datas = deliverStructuralPackageOrderService.getInfoByExternalOrderNo(orderNo);
+ VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(datas)).throwMessage("未找到数据");
+ datas.forEach(it -> {
+ it.setTrayNos(deliverStructuralPackageOrderTrayService.lambdaQuery()
+ .select(WmsStructuralPackageOrderTray::getNo)
+ .eq(WmsStructuralPackageOrderTray::getOrderId, it.getId())
+ .list()
+ .stream()
+ .map(WmsStructuralPackageOrderTray::getNo)
+ .toList());
+ //SAP
+ SAPMaterialInfoInOrderDTO dto1 = sapService.getMaterialInfoInOrder(it.getExternalOrderNo(), it.getSupplierCode(), it.getPackageNo());
+ if (Objects.isNull(dto1)) {
+ log.error("{},{},{}未从SAP的ZIM_004接口查询到数据", it.getExternalOrderNo(), it.getSupplierCode(), it.getPackageNo());
+ } else if (StrUtil.isBlank(dto1.getWarehouseNo())) {
+ log.error("{},{},{}未从SAP的ZIM_004接口查询仓库为空", it.getExternalOrderNo(), it.getSupplierCode(), it.getPackageNo());
+ } else {
+ it.setWarehouseNo(dto1.getWarehouseNo());
+ List dtos = sapService.getStorage("1010", List.of(dto1.getWarehouseNo()), List.of(it.getPackageNo()), null, null);
+ if (CollectionUtil.isEmpty(dtos)) {
+ log.error("{},{},{}未从SAP的ZWM3A01接口查询到数据", "1010", dto1.getWarehouseNo(), it.getPackageNo());
+ } else {
+ it.setBinNos(dtos.get(0).getBinNos());
+ }
+ }
+ });
+ DeliverStructuralPackageOrderForPackageVO vo = new DeliverStructuralPackageOrderForPackageVO();
+ vo.setItems(datas);
+ vo.setSupplierCode(datas.get(0).getSupplierCode());
+ vo.setSupplierName(datas.get(0).getSupplierName());
+ return ApiResult.success(vo);
+ }
+
+ /**
+ * 收货(PDA使用)
+ * @param request 请求参数
+ */
+ @Transactional
+ @PostMapping("receive")
+ public ApiResult receive(@Valid @RequestBody @NotNull StructuralPackageOrderReceiveQO request) {
+ List trayNos = deliverStructuralPackageOrderTrayService.lambdaQuery()
+ .select(WmsStructuralPackageOrderTray::getNo)
+ .eq(WmsStructuralPackageOrderTray::getOrderId, request.getId())
+ .list()
+ .stream()
+ .map(WmsStructuralPackageOrderTray::getNo)
+ .toList();
+ VUtil.trueThrowBusinessError(!new HashSet<>(trayNos).equals(new HashSet<>(request.getTrayNos())))
+ .throwMessage("托盘未齐套");
+ VUtil.trueThrowBusinessError(!deliverStructuralPackageOrderTrayService.lambdaQuery()
+ .eq(WmsStructuralPackageOrderTray::getOrderId, request.getId())
+ .eq(WmsStructuralPackageOrderTray::getState, OrderState.InTransit.getState())
+ .exists())
+ .throwMessage("没有需要收货的数据");
+ deliverStructuralPackageOrderTrayService.lambdaUpdate()
+ .set(WmsStructuralPackageOrderTray::getState, OrderState.Received.getState())
+ .set(WmsStructuralPackageOrderTray::getReceiveBy,UserUtil.getUserName())
+ .set(WmsStructuralPackageOrderTray::getReceiveTime, LocalDateTime.now())
+ .eq(WmsStructuralPackageOrderTray::getOrderId, request.getId())
+ .eq(WmsStructuralPackageOrderTray::getState, OrderState.InTransit.getState())
+ .update();
+ //创建上架任务
+ String deliverOrderNo = structuralPackageDeliverOrderService.getNoByOrderId(request.getId());
+ String taskNo = "NFS" + deliverOrderNo;
+ if (Objects.isNull(structuralPackageStorageTaskService.lambdaQuery().eq(WmsStructuralPackageStorageTask::getNo, taskNo).one())){
+ structuralPackageStorageTaskService.save(new WmsStructuralPackageStorageTask()
+ .setNo(taskNo)
+ .setSourceFrom(1)
+ .setSourceNo(deliverOrderNo)
+ .setCreateTime(LocalDateTime.now())
+ );
+ }
+ return ApiResult.success();
+ }
+
+ /**
+ * 搜索上架任务
+ * @param request 查询参数
+ */
+ @PostMapping("searchStorageTask")
+ public ApiResult> searchStorageTask(@Valid @RequestBody @NotNull StructuralPackageStorageTaskSearchQO request){
+ return ApiResult.success(structuralPackageStorageTaskService.search(request));
}
}
\ No newline at end of file
diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/SAPMaterialInfoInOrderDTO.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/SAPMaterialInfoInOrderDTO.java
index 8958556b..3848c4a7 100644
--- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/SAPMaterialInfoInOrderDTO.java
+++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/SAPMaterialInfoInOrderDTO.java
@@ -13,4 +13,9 @@ public class SAPMaterialInfoInOrderDTO {
* 未收货数量
*/
private BigDecimal transportNum;
+
+ /**
+ * 仓库编号
+ */
+ private String warehouseNo;
}
diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java
index 3d389bc5..14d0ba8b 100644
--- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java
+++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java
@@ -6,15 +6,13 @@ import com.nflg.wms.admin.pojo.dto.SAPMaterialInfoInOrderDTO;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.dto.SAPOrderDTO;
+import com.nflg.wms.common.pojo.dto.SAPSyncFromDTO;
import com.sap.conn.jco.*;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
@Slf4j
@Component
@@ -26,9 +24,57 @@ public class SapService {
@Resource
private JCoRepository repository;
+ /**
+ * 获取库存信息
+ * @param factory 工厂编号
+ * @param warehouseNos 仓库编号列表
+ * @param beginTime 开始时间,格式yyyyMMdd
+ * @param endTime 结束时间,格式yyyyMMdd
+ */
+ public List getStorage(String factory, List warehouseNos,List materialNos, String beginTime, String endTime) {
+ Map parameters = new HashMap<>();
+ parameters.put("I_WERKS", factory);
+ parameters.put("I_TYPE", Objects.nonNull(beginTime) || Objects.nonNull(endTime) ? "I" : "A");
+ if (Objects.nonNull(beginTime)) {
+ parameters.put("S_DATE", beginTime);
+ }
+ if (Objects.nonNull(endTime)) {
+ parameters.put("E_DATE", endTime);
+ }
+
+ Map>> tables = new HashMap<>();
+ List