Merge remote-tracking branch '惠信/feature/NoScanning' into feature/NoScanning

This commit is contained in:
曹鹏飞 2026-06-01 18:22:48 +08:00
commit b676d1b910
1 changed files with 194 additions and 0 deletions

View File

@ -7,8 +7,12 @@ import cn.hutool.core.lang.Pair;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.wms.admin.pojo.dto.PdfPageDTO;
import com.nflg.wms.admin.pojo.request.NoScanningItemDataRequest;
import com.nflg.wms.admin.pojo.request.NoScanningItemRequest;
import com.nflg.wms.admin.pojo.request.NoScanningRequest;
import com.nflg.wms.admin.repository.InMaterialScanRecordRespository;
import com.nflg.wms.admin.service.BasdeSerialNumberControllerService;
import com.nflg.wms.admin.service.NoScanningBaseControllerService;
import com.nflg.wms.admin.service.SapService;
import com.nflg.wms.admin.util.*;
import com.nflg.wms.common.constant.BarCodeProcessStage;
@ -17,8 +21,11 @@ import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.document.InMaterialScanRecord;
import com.nflg.wms.common.pojo.dto.InventoryInDTO;
import com.nflg.wms.common.pojo.dto.OptRecordDTO;
import com.nflg.wms.common.pojo.dto.QrCodeMasterPrintDTO;
import com.nflg.wms.common.pojo.dto.Zwm00Mb107DTO;
import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.util.DateTimeUtil;
import com.nflg.wms.common.pojo.vo.*;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil;
@ -31,6 +38,7 @@ 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.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
@ -42,8 +50,10 @@ import java.io.ByteArrayOutputStream;
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.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@ -62,6 +72,15 @@ public class InProduceOrderSurplusController extends BaseController {
@Resource
private BasdeSerialNumberControllerService serialNumberControllerService;
@Resource
private IWmsInProduceOrderService produceOrderService;
@Resource
private IWmsInProduceOrderItemService produceOrderItemService;
@Resource
private IWmsBomService bomService;
@Resource
private IWmsInProduceOrderSurplusService inProduceOrderSurplusService;
@ -80,12 +99,21 @@ public class InProduceOrderSurplusController extends BaseController {
@Resource
private IWmsInventoryService inventoryService;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private IWmsQrCodeMasterService qrCodeMasterService;
@Resource
private IWmsWarehouseService warehouseService;
@Resource
private IOptRecordService optRecordService;
@Resource
private NoScanningBaseControllerService noScanningBaseControllerService;
/**
* 从SAP查询订单信息
*/
@ -154,6 +182,67 @@ public class InProduceOrderSurplusController extends BaseController {
return ApiResult.success();
}
/**
* 无码保存
* @param request 请求参数
*/
@Transactional
@PostMapping("saveNoScanning")
public ApiResult<Long> saveNoScanning(@Valid @RequestBody InProduceOrderGenerateMaterialsQO request) {
return ApiResult.success(saveNoScanningOrder(request));
}
private Long saveNoScanningOrder(InProduceOrderGenerateMaterialsQO request) {
WmsInProduceOrder order = new WmsInProduceOrder()
.setId(IdUtil.getSnowflakeNextId())
.setDataType(request.getDataType())
.setNo(serialNumberControllerService.generateSerialNumber(8))
.setOrderNo(request.getAufnr())
.setList(request.getList())
.setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now());
produceOrderService.save(order);
String date = DateTimeUtil.format(LocalDate.now(), "yyMMdd");
stringRedisTemplate.opsForValue().setIfAbsent("index:batchNo:" + date, "0", 24 - LocalDateTime.now().getHour(), TimeUnit.HOURS);
String index = StrUtil.padPre(String.valueOf(stringRedisTemplate.opsForValue().increment("index:batchNo:" + date)), 4, "0");
WmsInProduceOrderItem parent = new WmsInProduceOrderItem()
.setId(IdUtil.getSnowflakeNextId())
.setOrderId(order.getId())
.setParentId(0L)
.setNum(request.getNum())
.setMaterialNo(request.getMatnr())
.setMaterialDesc(request.getMaktx())
.setUnit(request.getMeins())
.setFactoryNo(request.getPwerk())
.setWarehouseNo(request.getLgort())
.setOrderNum(request.getPsmng())
.setBatchNo(date + index)
.setSernr(request.getSernr());
produceOrderItemService.save(parent);
if (request.getList()) {
List<WmsBom> children = bomService.getChildren(request.getMatnr());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(children)).throwMessage("请先添加齐套物料");
List<WmsInProduceOrderItem> items = children.stream()
.map(it -> new WmsInProduceOrderItem()
.setId(IdUtil.getSnowflakeNextId())
.setOrderId(order.getId())
.setParentId(parent.getId())
.setNum(it.getNum())
.setMaterialNo(it.getNo())
.setMaterialDesc(it.getDescribe())
.setUnit(request.getMeins())
.setFactoryNo(request.getPwerk())
.setWarehouseNo(request.getLgort())
.setOrderNum(request.getPsmng())
.setBatchNo(parent.getBatchNo())
.setSernr(request.getSernr())
)
.toList();
produceOrderItemService.saveBatch(items);
}
return order.getId();
}
/**
* 搜索订单
*/
@ -387,6 +476,111 @@ public class InProduceOrderSurplusController extends BaseController {
return ApiResult.success();
}
/**
* 无码收货和入库
* @param requests 请求参数
*/
@Transactional
@PostMapping("receiveNoScanning")
public ApiResult<Void> receiveNoScanning(@Valid @RequestBody @NotEmpty List<NoScanningRequest> requests) {
List<InventoryInDTO> inventories = new ArrayList<>();
List<Zwm00Mb107QO> input1 = new ArrayList<>();
List<String> sernrs = new ArrayList<>();
Set<Long> orderIds = new HashSet<>();
for (NoScanningRequest request : requests) {
WmsInProduceOrder order = produceOrderService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在");
VUtil.trueThrowBusinessError(!Objects.equals(order.getState(), (short) 0))
.throwMessage("该订单非待收货状态");
List<WmsInProduceOrderItem> orderItems = produceOrderItemService.lambdaQuery()
.eq(WmsInProduceOrderItem::getOrderId, order.getId())
.list();
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(orderItems)).throwMessage("订单项不存在");
Map<Long, WmsInProduceOrderItem> orderItemMap = orderItems.stream()
.collect(Collectors.toMap(WmsInProduceOrderItem::getId, item -> item));
orderIds.add(order.getId());
VUtil.trueThrowBusinessError(orderIds.size() != 1).throwMessage("请一次只提交同一个订单的无码收货");
for (NoScanningItemRequest item : request.getItems()) {
WmsInProduceOrderItem orderItem = orderItemMap.get(item.getOrderItemId());
VUtil.trueThrowBusinessError(Objects.isNull(orderItem)).throwMessage("订单项不存在");
VUtil.trueThrowBusinessError(!StrUtil.equals(item.getMaterialNo(), orderItem.getMaterialNo()))
.throwMessage("订单项与物料不匹配:" + item.getMaterialNo());
VUtil.trueThrowBusinessError(noScanningBaseControllerService.existsQrCode(orderItem.getMaterialNo()))
.throwMessage("物料" + orderItem.getMaterialNo() + "已生成二维码,不允许无码收货");
BigDecimal totalNum = item.getDatas().stream()
.peek(data -> VUtil.trueThrowBusinessError(Objects.isNull(data.getNum()) || data.getNum().compareTo(BigDecimal.ZERO) <= 0)
.throwMessage("物料" + orderItem.getMaterialNo() + "的无码收货数量必须大于0"))
.map(NoScanningItemDataRequest::getNum)
.reduce(BigDecimal.ZERO, BigDecimal::add);
VUtil.trueThrowBusinessError(totalNum.compareTo(orderItem.getNum()) != 0)
.throwMessage("物料" + orderItem.getMaterialNo() + "的无码收货数量与订单数量不一致");
item.getDatas().forEach(data -> {
inventories.add(new InventoryInDTO()
.setMaterialNo(orderItem.getMaterialNo())
.setFactoryNo(orderItem.getFactoryNo())
.setWarehouseNo(orderItem.getWarehouseNo())
.setBatchNo(StrUtil.blankToDefault(data.getBatchNo(), ""))
.setSerialNo(StrUtil.blankToDefault(data.getSerialNo(), ""))
.setBinLocation(StrUtil.blankToDefault(data.getBinNo(), ""))
.setNum(data.getNum())
);
});
}
input1.addAll(orderItems.stream()
.filter(it -> Objects.equals(it.getParentId(), 0L))
.map(it -> new Zwm00Mb107QO()
.setPWERK(it.getFactoryNo())
.setPSMNG(it.getNum())
.setAMEIN(it.getUnit())
.setLGORT(it.getWarehouseNo())
.setCHARG(it.getBatchNo()))
.toList());
sernrs.addAll(orderItems.stream()
.filter(it -> Objects.equals(it.getParentId(), 0L))
.map(WmsInProduceOrderItem::getSernr)
.toList());
}
inventoryService.in(mergeInventories(inventories));
WmsInProduceOrder order = produceOrderService.getById(requests.get(0).getId());
OptRecordDTO optRecordDTO = new OptRecordDTO();
optRecordDTO.setOperationType((short) 1)
.setOrderId(order.getNo());
optRecordService.add(optRecordDTO);
Zwm00Mb107DTO dto = sapService.zwm00_mb107(order.getOrderNo(), UserUtil.getUserName(), input1, sernrs);
order.setMblnr(dto.getE_MBLNR());
order.setMjahr(dto.getE_MJAHR());
order.setState((short) 1);
order.setUpdateBy(UserUtil.getUserName());
order.setUpdateTime(LocalDateTime.now());
produceOrderService.updateById(order);
return ApiResult.success();
}
private List<InventoryInDTO> mergeInventories(List<InventoryInDTO> inventories) {
return inventories.stream()
.collect(Collectors.groupingBy(InventoryInDTO::getKey))
.values()
.stream()
.map(items -> new InventoryInDTO()
.setMaterialNo(items.get(0).getMaterialNo())
.setFactoryNo(items.get(0).getFactoryNo())
.setWarehouseNo(items.get(0).getWarehouseNo())
.setBatchNo(items.get(0).getBatchNo())
.setSerialNo(items.get(0).getSerialNo())
.setBinLocation(items.get(0).getBinLocation())
.setNum(items.stream().map(InventoryInDTO::getNum).reduce(BigDecimal.ZERO, BigDecimal::add))
)
.toList();
}
/**
* 搜索入库单
*/