package com.vincent.rsf.server.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.Query; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.common.domain.PageResult; import com.vincent.rsf.server.manager.controller.params.OrgLocParams; import com.vincent.rsf.server.manager.controller.params.TransferItemParams; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.enums.*; import com.vincent.rsf.server.manager.mapper.TransferMapper; 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.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; @Service("transferService") public class TransferServiceImpl extends ServiceImpl implements TransferService { @Autowired private TransferItemService transferItemService; @Autowired private WarehouseAreasService warehouseAreasService; @Autowired private OutStockService outStockService; @Autowired private OutStockItemService outStockItemService; @Autowired private TransferOrderService transferOrderService; @Autowired private TransferService transferService; @Autowired private AsnOrderService asnOrderService; @Autowired private AsnOrderItemService asnOrderItemService; @Autowired private LocItemService locItemService; @Autowired private LocService locService; /** * @author Ryan * @date 2025/7/25 * @description: 保存调拔单及明细 * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public R saveTransfer(TransferItemParams params, Long loginUserId) { if (Objects.isNull(params.getTransfer())) { throw new CoolException("主单信息不能为空"); } Transfer transfer = params.getTransfer(); if (StringUtils.isBlank(transfer.getType() + "")) { throw new CoolException("业务类型不能为空!!"); } String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TRANSFER_ORDER_CODE, transfer); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("编码规则错误:请检查「SYS_TRANSFER_ORDER_CODE」是否设置正确!!"); } WarehouseAreas orgWarehosue = warehouseAreasService.getById(transfer.getOrgAreaId()); if (Objects.isNull(orgWarehosue)) { throw new CoolException("所选原库区不存在!!"); } WarehouseAreas tarWarehouse = warehouseAreasService.getById(transfer.getTarAreaId()); if (Objects.isNull(tarWarehouse)) { throw new CoolException("所选目标库区不存在!!"); } transfer.setCode(ruleCode) .setExceStatus(CheckExceStatus.CHECK_ORDER_STATUS_UN_EXCE.val) .setSource(OrderSourceType.ORDER_SOURCE_TYPE_SYSTEM.val) .setOrgAreaId(orgWarehosue.getId()) .setOrgAreaName(orgWarehosue.getName()) .setOrgWareId(orgWarehosue.getWarehouseId()) .setOrgWareName(orgWarehosue.getWarehouseId$()) .setTarAreaId(tarWarehouse.getId()) .setTarWareId(tarWarehouse.getWarehouseId()) .setTarAreaName(tarWarehouse.getName()) .setTarWareName(tarWarehouse.getWarehouseId$()) .setUpdateTime(new Date()) .setCreateTime(new Date()) .setUpdateBy(loginUserId) .setCreateBy(loginUserId); if (!this.save(transfer)) { throw new CoolException("主单保存失败!!"); } if (params.getItems().isEmpty()) { throw new CoolException("收货通知单明细不能为空!!"); } params.setTransfer(transfer); try { svaeOrUpdateOrderItem(params, loginUserId); } catch (Exception e) { throw new CoolException(e.getMessage()); } /***保存成功,自动生成出库单*/ genOutStock(transfer, loginUserId); return R.ok(); } /** * @author Ryan * @date 2025/7/28 * @description: 调拔单据修改 * @version 1.0 */ private void svaeOrUpdateOrderItem(TransferItemParams params, Long loginUserId) { Transfer orders = params.getTransfer(); params.getItems().forEach(item -> { item.put("transferId", orders.getId()); item.put("transferCode", orders.getCode()); item.put("createBy", loginUserId); item.put("updateBy", loginUserId); if (!transferItemService.fieldsSave(item, loginUserId)) { throw new CoolException("明细保存失败!!"); } }); // List orderItems = transferItemService.list(new LambdaQueryWrapper() // .eq(TransferItem::getTransferId, params.getTransfer().getId())); // Double sum = orderItems.stream().mapToDouble(TransferItem::getAnfme).sum(); if (!this.updateById(orders)) { throw new CoolException("计划收货数量修改失败!!"); } } /** * @author Ryan * @date 2025/7/25 * @description: 调拔单及明细修改 * @version 1.0 */ @Override public R updateTransfer(TransferItemParams params, Long loginUserId) { Transfer orders = params.getTransfer(); if (Objects.isNull(orders)) { throw new CoolException("主单信息不能为空!!"); } if (Objects.isNull(orders.getId())) { throw new CoolException("数据错误:单据ID不能为空!!"); } if (!this.updateById(orders)) { throw new CoolException("主单修改失败!!"); } if (Objects.isNull(params.getItems()) || params.getItems().isEmpty()) { return R.ok("明细参数不能为空!!"); } svaeOrUpdateOrderItem(params, loginUserId); return R.ok("修改完成!!"); } /** * @author Ryan * @date 2025/7/28 * @description: 获取调拔单关联订单 * @version 1.0 */ @Override public IPage transfersPage(PageParam pageParam, QueryWrapper transferQueryWrapper) { Transfer one = this.getOne(transferQueryWrapper); if (Objects.isNull(one)) { throw new CoolException("单据不存在!!"); } return this.baseMapper.transfersPage(pageParam, one.getId()); } /** * @author Ryan * @date 2025/7/28 * @description: 调拔单生成出库单 * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public Transfer genOutStock(Transfer param, Long loginUserId) { Transfer transfer = this.getById(param.getId()); if (Objects.isNull(transfer)) { throw new CoolException("数据错误:单据不存在!!"); } List items = transferItemService.list(new LambdaQueryWrapper().eq(TransferItem::getTransferId, transfer.getId())); if (items.isEmpty()) { throw new CoolException("数据错误:调拔单明细不存在!!"); } WkOrder wkOrder = new WkOrder(); String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, transfer); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("出库单生成失败!!"); } Double anfmes = items.stream().mapToDouble(TransferItem::getAnfme).sum(); wkOrder.setCode(ruleCode) .setAnfme(anfmes) .setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val) .setType(OrderType.ORDER_OUT.type) .setWkType(OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type) .setCreateBy(loginUserId) .setUpdateBy(loginUserId) .setCreateTime(new Date()) .setUpdateTime(new Date()) .setPoCode(transfer.getCode()) .setPoId(transfer.getId()); if (!outStockService.saveOrUpdate(wkOrder)) { throw new CoolException("出库单保存失败!!"); } List orderItems = new ArrayList<>(); items.forEach(item -> { WkOrderItem orderItem = new WkOrderItem(); BeanUtils.copyProperties(item, orderItem); orderItem.setOrderCode(wkOrder.getCode()) .setSplrBatch(item.getBatch()) .setSplrCode(item.getSplrCode()) .setSplrName(item.getSplrName()) .setOrderId(wkOrder.getId()); orderItems.add(orderItem); }); if (!outStockItemService.saveBatch(orderItems)) { throw new CoolException("出库单明细保存失败!!"); } transfer.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val); if (!this.updateById(transfer)) { throw new CoolException("调拔单更新失败!!"); } TransferOrder transferOrder = new TransferOrder(); transferOrder.setTransferId(transfer.getId()) .setOrderId(wkOrder.getId()) .setType(OrderType.ORDER_OUT.type); if (!transferOrderService.save(transferOrder)) { throw new CoolException("单据关联失败!!"); } try { /**生成入库单据信息*/ genInStock(wkOrder, orderItems); } catch (Exception e) { throw new CoolException(e.getMessage()); } return transfer; } /** * @author Ryan * @date 2025/7/29 * @description: TODO * @version 1.0 */ @Transactional(rollbackFor = Exception.class) public void genInStock(WkOrder wkOrder, List orderItems) throws Exception { WkOrder order = new WkOrder(); BeanUtils.copyProperties(wkOrder, order); order.setType(OrderType.ORDER_IN.type) .setWkType(OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.type) .setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val) .setId(null); String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, order); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("入库单号生成失败!!"); } order.setCode(ruleCode); if (!asnOrderService.save(order)) { throw new CoolException("单据保存失败!!"); } orderItems.forEach(item -> { item.setOrderId(order.getId()) .setOrderCode(order.getCode()) .setId(null); if (!asnOrderItemService.save(item)) { throw new CoolException("入库单明细保存失败!!"); } }); TransferOrder transferOrder = new TransferOrder(); transferOrder.setTransferId(wkOrder.getPoId()) .setOrderId(order.getId()) .setType(OrderType.ORDER_IN.type); if (!transferOrderService.save(transferOrder)) { throw new CoolException("单据关联失败!!"); } } /** * @author Ryan * @date 2025/7/29 * @description: 删除调拔单 * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public boolean removeTransfer(List list) { List wkOrders = outStockService.list(new LambdaQueryWrapper().in(WkOrder::getPoId, list)); if (!wkOrders.isEmpty()) { Set longs = wkOrders.stream().map(WkOrder::getId).collect(Collectors.toSet()); if (!outStockService.remove(new LambdaQueryWrapper() .in(WkOrder::getId, longs) .eq(WkOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val))) { throw new CoolException("当前出库单已执行,不支持删除!!"); } outStockItemService.remove(new LambdaQueryWrapper().in(WkOrderItem::getOrderId, longs)); transferOrderService.remove(new LambdaQueryWrapper().in(TransferOrder::getTransferId, list)); } transferService.removeByIds(list); transferItemService.remove(new LambdaQueryWrapper().in(TransferItem::getTransferId, list)); return true; } /** * @author Ryan * @date 2025/7/29 * @description: 获取原库区物料信息 * @version 1.0 */ @Override public IPage getLocsItems(OrgLocParams params, Long loginUserId) { List locs = locService.list(new LambdaQueryWrapper() .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type) .eq(!Objects.isNull(params.getOrgAreaId()), Loc::getAreaId, params.getOrgAreaId())); if (!locs.isEmpty()) { Page page = new Page<>(params.getCurrent(), params.getPageSize()); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.select("id, matnr_id, maktx, matnr_code, SUM(anfme) anfme, SUM(work_qty) work_qty, SUM(qty) qty, batch, unit, fields_index, model, spec, loc_id, loc_code ") .lambda() .eq(StringUtils.isNotBlank(params.getMatnrCode()), LocItem::getMatnrCode, params.getMatnrCode()) .like(StringUtils.isNotBlank(params.getMaktx()), LocItem::getMaktx, params.getMaktx()); Set locIds = locs.stream().map(Loc::getId).collect(Collectors.toSet()); wrapper.lambda().in(LocItem::getLocId, locIds) .groupBy(LocItem::getBatch, LocItem::getMatnrId); return locItemService.page(page, wrapper); } else { IPage page = new Page<>(params.getCurrent(), params.getPageSize()); return page; } } }