package com.vincent.rsf.server.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.controller.params.PakinItem; import com.vincent.rsf.server.manager.controller.params.WaitPakinParam; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.mapper.WaitPakinMapper; import com.vincent.rsf.server.manager.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @Service("waitPakinService") public class WaitPakinServiceImpl extends ServiceImpl implements WaitPakinService { @Autowired private AsnOrderService asnOrderService; @Autowired private AsnOrderItemService asnOrderItemService; @Autowired private WaitPakinService waitPakinService; @Autowired private WaitPakinItemService waitPakinItemService; @Autowired private LocService locService; /** * @author Ryan * @description 组拖 * @param * @return * @time 2025/3/29 14:42 */ @Override @Transactional(rollbackFor = Exception.class) public WaitPakin mergeItems(WaitPakinParam waitPakin) { if (waitPakin.getItems().isEmpty()) { throw new CoolException("参数错误:物料跟踪码为空!"); } if (StringUtils.isBlank(waitPakin.getBarcode())) { throw new CoolException("参数错误:托盘码为空!!"); } List list = waitPakinService.list(new LambdaQueryWrapper().eq(WaitPakin::getBarcode, waitPakin.getBarcode())); if (!list.isEmpty()) { List stringList = list.stream().map(WaitPakin::getCode).collect(Collectors.toList()); String join = StringUtils.join(stringList, ","); throw new CoolException("拖盘码:" + waitPakin.getBarcode() + "已被组拖单:" + join + "使用!!"); } List locs = locService.list(new LambdaQueryWrapper().eq(Loc::getBarcode, waitPakin.getBarcode())); if (!locs.isEmpty()) { List locCodes = locs.stream().map(Loc::getCode).collect(Collectors.toList()); String join = StringUtils.join(locCodes, ","); throw new CoolException("拖盘码:" + waitPakin.getBarcode() + "已被库位:" + join + "使用!!"); } double sum = waitPakin.getItems().stream().mapToDouble(PakinItem::getReceiptQty).sum(); WaitPakin pakin = new WaitPakin(); String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_WAIT_PAKIN_CODE, null); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("编码规则错误: 编码规则「SYS_WAIT_PAKIN_CODE」规则是不存在"); } pakin.setCode(ruleCode) //状态修改为入库中 .setIoStatus(Short.parseShort("1")) .setAnfme(sum) .setBarcode(waitPakin.getBarcode()); if (!this.save(pakin)) { throw new CoolException("主单保存失败!!"); } /**物料跟踪码*/ List tracks = waitPakin.getItems().stream().map(PakinItem::getTrackCode).collect(Collectors.toList()); List asnOrderItems = asnOrderItemService.list(new LambdaQueryWrapper() .in(AsnOrderItem::getTrackCode, tracks)); if (Objects.isNull(asnOrderItems) || asnOrderItems.isEmpty()) { throw new CoolException("单据不存在!!"); } List items = new ArrayList<>(); for (AsnOrderItem item : asnOrderItems) { WaitPakinItem pakinItem = new WaitPakinItem(); pakinItem.setAnfme(item.getAnfme()) .setPakinId(pakin.getId()) .setAsnId(item.getAsnId()) .setAsnCode(item.getAsnCode()) .setAsnItemId(item.getId()) .setMatnrCode(item.getMatnrCode()) .setBatch(item.getSplrBatch()) .setUnit(item.getStockUnit()) .setFieldsIndex(item.getFieldsIndex()) .setUnit(item.getStockUnit()) .setMatnrId(StringUtils.isNotBlank(item.getMatnrId()) ? Long.parseLong(item.getMatnrId()) : null) .setMaktx(item.getMaktx()) .setMatnrCode(item.getMatnrCode()); for (PakinItem waitPakinItem : waitPakin.getItems()) { if (waitPakinItem.getTrackCode().equals(item.getTrackCode())) { Double v = item.getWorkQty() + waitPakinItem.getReceiptQty(); pakinItem.setWorkQty(v) .setAnfme(waitPakinItem.getReceiptQty()) .setTrackCode(waitPakinItem.getTrackCode()); /**更新单据执行中库存*/ if (v.compareTo(item.getAnfme()) > 0) {throw new CoolException("执行中数量大于收货数量!!");} if (!asnOrderItemService.update(new LambdaUpdateWrapper() .eq(AsnOrderItem::getTrackCode, waitPakinItem.getTrackCode()).set(AsnOrderItem::getWorkQty, v))) { throw new CoolException("执行中库存更新失败!!"); } } } items.add(pakinItem); } if (!waitPakinItemService.saveBatch(items)) { throw new CoolException("组拖明细保存失败!!"); } return pakin; } /** * @author Ryan * @description 组拖解绑 * @param * @return * @time 2025/3/29 14:42 */ @Override public WaitPakin unBind(WaitPakinParam param) { String barcode = param.getBarcode(); if (StringUtils.isNotBlank(barcode)) { WaitPakin waitPakins = waitPakinService.getOne(new LambdaQueryWrapper().eq(WaitPakin::getBarcode, barcode), false); if (Objects.isNull(waitPakins)) { throw new CoolException("组拖不存在!!"); } List paramItems = param.getItems(); if (Objects.isNull(paramItems) || paramItems.isEmpty()) { throw new CoolException("解绑物料不能为空!!"); } List list = paramItems.stream().map(PakinItem::getMatnrId).collect(Collectors.toList()); List pakinItems = waitPakinItemService.list(new LambdaQueryWrapper() .eq(WaitPakinItem::getPakinId, waitPakins.getId()) .in(WaitPakinItem::getMatnrId, list)); if (pakinItems.isEmpty()) { throw new CoolException("数据错误:组拖明细不存在!!"); } List ids = pakinItems.stream().map(WaitPakinItem::getId).collect(Collectors.toList()); if (!waitPakinItemService.removeByIds(ids)) { throw new CoolException("组拖明细解绑失败!!"); } return waitPakins; } return new WaitPakin(); } }