package com.vincent.rsf.server.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.controller.params.ReviseLogParams; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.enums.CommonExceStatus; import com.vincent.rsf.server.manager.enums.OrderType; import com.vincent.rsf.server.manager.enums.OrderWorkType; import com.vincent.rsf.server.manager.mapper.ReviseLogMapper; import com.vincent.rsf.server.manager.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @Service("reviseLogService") public class ReviseLogServiceImpl extends ServiceImpl implements ReviseLogService { @Autowired private LocReviseService locReviseService; @Autowired private ReviseLogService reviseLogService; @Autowired private LocItemService locItemService; @Autowired private LocService locService; @Autowired private ReviseLogItemService reviseLogItemService; /** * 库存调整单明细添加 * * @param revise * @param loginUserId * @return */ @Override @Transactional(rollbackFor = Exception.class) public List reviseLoc(ReviseLogParams revise, Long loginUserId) { LocRevise locRevise = locReviseService.getById(revise.getReviseId()); if (Objects.isNull(locRevise)) { throw new CoolException("调整单据不存在!!"); } List items = revise.getItems(); if (items.isEmpty()) { throw new CoolException("调整单明细参数为空!!"); } items.forEach(item -> { ReviseLog reviseLog = new ReviseLog(); BeanUtils.copyProperties(item, reviseLog); reviseLog.setAreaId(locRevise.getAreaId()) .setReviseId(locRevise.getId()) .setCreateBy(loginUserId) .setUpdateBy(loginUserId) .setReviseCode(locRevise.getCode()); if (!reviseLogService.save(reviseLog)) { throw new CoolException("调整单明细保存失败!!"); } List locItems = locItemService.list(new LambdaQueryWrapper() .eq(LocItem::getLocCode, item.getLocCode())); if (!locItems.isEmpty()) { locItems.forEach(ote -> { ReviseLogItem logItem = new ReviseLogItem(); BeanUtils.copyProperties(ote, logItem); logItem.setReviseLogId(reviseLog.getId()); if (!reviseLogItemService.save(logItem)) { throw new CoolException("明细保存失败!!"); } }); } Double sum = locItems.stream().mapToDouble(LocItem::getAnfme).sum(); locRevise.setAnfme(Math.round((sum + locRevise.getAnfme()) * 1000000) / 1000000.0); }); locRevise.setExceStatus(CommonExceStatus.COMMON_EXCE_STATUS_UN_EXCE.val); if (!locReviseService.updateById(locRevise)) { throw new CoolException("状态更新失败!!"); } return items; } /** * @author Ryan * @date 2025/8/18 * @description: 确认调整库存 * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public R complete(Long id, Long loginUserId) { LocRevise revise = locReviseService.getById(id); if (Objects.isNull(revise)) { throw new CoolException("调整单不存在!!"); } if (!revise.getExceStatus().equals(CommonExceStatus.COMMON_EXCE_STATUS_EXCE_ING.val)) { throw new CoolException("单据状态未执行或已完成,无法执行完成操作!!"); } List logs = reviseLogService.list(new LambdaQueryWrapper().eq(ReviseLog::getReviseId, revise.getId())); if (logs.isEmpty()) { throw new CoolException("库存日志不存在!!"); } Set longs = logs.stream().map(ReviseLog::getId).collect(Collectors.toSet()); List logItems = reviseLogItemService.list(new LambdaQueryWrapper().in(ReviseLogItem::getReviseLogId, longs)); if (logItems.isEmpty()) { throw new CoolException("调整明细为空!!"); } // 按库位ID分组,如果locId为null则按locCode分组 Map> listMap = logItems.stream() .filter(item -> item.getLocCode() != null && !item.getLocCode().isEmpty()) .collect(Collectors.groupingBy(item -> { // 优先使用locId,如果为null则使用locCode作为key return item.getLocId() != null ? String.valueOf(item.getLocId()) : item.getLocCode(); })); listMap.keySet().forEach(key -> { List reviseItems = listMap.get(key); if (Objects.isNull(reviseItems) || reviseItems.isEmpty()) { throw new CoolException("调整明细为空!!"); } // 获取第一个明细的库位信息 ReviseLogItem firstItem = reviseItems.get(0); String locCode = firstItem.getLocCode(); Long locId = firstItem.getLocId(); // 查询库位:优先使用locId,如果为null则使用locCode Loc loc = null; if (locId != null) { loc = locService.getById(locId); } if (loc == null && locCode != null && !locCode.isEmpty()) { loc = locService.getOne(new LambdaQueryWrapper().eq(Loc::getCode, locCode).eq(Loc::getDeleted, 0)); } if (Objects.isNull(loc)) { throw new CoolException("库位不存在!库位编码:" + locCode + ", 库位ID:" + locId); } // 删除原库位的库存明细(如果存在) locItemService.remove(new LambdaQueryWrapper().eq(LocItem::getLocId, loc.getId())); Loc finalLoc = loc; reviseItems.forEach(logItem -> { LocItem locDetl = new LocItem(); BeanUtils.copyProperties(logItem, locDetl); locDetl.setLocId(finalLoc.getId()) .setType(OrderType.ORDER_REVISE.type) .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_REVISE.type)) .setLocCode(finalLoc.getCode()) .setAnfme(logItem.getReviseQty()) .setUpdateBy(loginUserId) .setId(null) .setCreateBy(loginUserId); if (!locItemService.save(locDetl)) { throw new CoolException("库存明细保存失败!!"); } }); }); revise.setExceStatus(CommonExceStatus.COMMON_EXCE_STATUS_TASK_DONE.val); if (!locReviseService.updateById(revise)) { throw new CoolException("调整单修改失败!!"); } return R.ok(); } }