|
|
|
@ -3,19 +3,26 @@ package cn.iocoder.yudao.module.erp.service.stock;
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
|
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
|
|
|
|
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
|
|
|
|
|
|
|
|
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
|
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
|
|
|
|
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
|
|
|
import cn.iocoder.yudao.module.common.controller.admin.mold.vo.MoldBrandSaveReqVO;
|
|
|
|
import cn.iocoder.yudao.module.common.controller.admin.mold.vo.MoldBrandSaveReqVO;
|
|
|
|
import cn.iocoder.yudao.module.common.dal.dataobject.mold.MoldBrandDO;
|
|
|
|
import cn.iocoder.yudao.module.common.dal.dataobject.mold.MoldBrandDO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
|
|
|
|
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.out.ErpStockOutAuditReqVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.out.ErpStockOutPageReqVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.out.ErpStockOutPageReqVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.out.ErpStockOutSaveReqVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.out.ErpStockOutSaveReqVO;
|
|
|
|
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.out.ErpStockOutSubmitReqVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
|
|
|
|
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockOutApproveRecordDO;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockOutDO;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockOutDO;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockOutItemDO;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockOutItemDO;
|
|
|
|
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockOutApproveRecordMapper;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockOutItemMapper;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockOutItemMapper;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockOutMapper;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockOutMapper;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
|
|
|
|
import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
|
|
|
|
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
|
|
|
|
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
|
|
|
|
|
|
|
|
import cn.iocoder.yudao.module.erp.enums.stock.ErpStockOutApproveActionEnum;
|
|
|
|
import cn.iocoder.yudao.module.erp.enums.stock.ErpStockRecordBizTypeEnum;
|
|
|
|
import cn.iocoder.yudao.module.erp.enums.stock.ErpStockRecordBizTypeEnum;
|
|
|
|
import cn.iocoder.yudao.module.erp.service.mold.MoldBrandService;
|
|
|
|
import cn.iocoder.yudao.module.erp.service.mold.MoldBrandService;
|
|
|
|
import cn.iocoder.yudao.module.erp.service.mold.MoldService;
|
|
|
|
import cn.iocoder.yudao.module.erp.service.mold.MoldService;
|
|
|
|
@ -23,27 +30,27 @@ import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
|
|
|
|
import cn.iocoder.yudao.module.erp.service.sale.ErpCustomerService;
|
|
|
|
import cn.iocoder.yudao.module.erp.service.sale.ErpCustomerService;
|
|
|
|
import cn.iocoder.yudao.module.erp.service.stock.bo.ErpStockRecordCreateReqBO;
|
|
|
|
import cn.iocoder.yudao.module.erp.service.stock.bo.ErpStockRecordCreateReqBO;
|
|
|
|
import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
|
|
|
|
import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
|
|
|
|
|
|
|
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
import java.util.Collection;
|
|
|
|
import java.util.*;
|
|
|
|
import java.util.Collections;
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
|
|
|
import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
|
|
|
|
|
|
|
|
|
|
|
|
// TODO 芋艿:记录操作日志
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* ERP 其它出库单 Service 实现类
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @author 芋道源码
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Service
|
|
|
|
@Service
|
|
|
|
@Validated
|
|
|
|
@Validated
|
|
|
|
public class ErpStockOutServiceImpl implements ErpStockOutService {
|
|
|
|
public class ErpStockOutServiceImpl implements ErpStockOutService {
|
|
|
|
@ -56,10 +63,10 @@ public class ErpStockOutServiceImpl implements ErpStockOutService {
|
|
|
|
private ErpStockOutMapper stockOutMapper;
|
|
|
|
private ErpStockOutMapper stockOutMapper;
|
|
|
|
@Resource
|
|
|
|
@Resource
|
|
|
|
private ErpStockOutItemMapper stockOutItemMapper;
|
|
|
|
private ErpStockOutItemMapper stockOutItemMapper;
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
|
|
|
private ErpStockOutApproveRecordMapper stockOutApproveRecordMapper;
|
|
|
|
@Resource
|
|
|
|
@Resource
|
|
|
|
private ErpNoRedisDAO noRedisDAO;
|
|
|
|
private ErpNoRedisDAO noRedisDAO;
|
|
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
@Resource
|
|
|
|
private ErpProductService productService;
|
|
|
|
private ErpProductService productService;
|
|
|
|
@Resource
|
|
|
|
@Resource
|
|
|
|
@ -73,40 +80,44 @@ public class ErpStockOutServiceImpl implements ErpStockOutService {
|
|
|
|
@Resource
|
|
|
|
@Resource
|
|
|
|
private ErpStockRecordService stockRecordService;
|
|
|
|
private ErpStockRecordService stockRecordService;
|
|
|
|
@Resource
|
|
|
|
@Resource
|
|
|
|
|
|
|
|
private AdminUserApi adminUserApi;
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
private ConfigApi configApi;
|
|
|
|
private ConfigApi configApi;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
public Long createStockOut(ErpStockOutSaveReqVO createReqVO) {
|
|
|
|
public Long createStockOut(ErpStockOutSaveReqVO createReqVO) {
|
|
|
|
// 1.1 校验出库项的有效性
|
|
|
|
List<ErpStockOutItemDO> stockOutItems = validateStockOutItems(createReqVO.getItems(), createReqVO.getOutType());
|
|
|
|
List<ErpStockOutItemDO> stockOutItems = validateStockOutItems(createReqVO.getItems(),createReqVO.getOutType());
|
|
|
|
if (createReqVO.getCustomerId() != null) {
|
|
|
|
// 1.2 校验客户
|
|
|
|
customerService.validateCustomer(createReqVO.getCustomerId());
|
|
|
|
//customerService.validateCustomer(createReqVO.getCustomerId());
|
|
|
|
}
|
|
|
|
// 1.3 生成出库单号,并校验唯一性
|
|
|
|
if (createReqVO.getResponserId() != null) {
|
|
|
|
|
|
|
|
adminUserApi.validateUser(createReqVO.getResponserId());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (createReqVO.getAuditUserId() != null) {
|
|
|
|
|
|
|
|
adminUserApi.validateUser(createReqVO.getAuditUserId());
|
|
|
|
|
|
|
|
}
|
|
|
|
String no = noRedisDAO.generate(ErpNoRedisDAO.STOCK_OUT_NO_PREFIX);
|
|
|
|
String no = noRedisDAO.generate(ErpNoRedisDAO.STOCK_OUT_NO_PREFIX);
|
|
|
|
if (stockOutMapper.selectByNo(no) != null) {
|
|
|
|
if (stockOutMapper.selectByNo(no) != null) {
|
|
|
|
throw exception(STOCK_OUT_NO_EXISTS);
|
|
|
|
throw exception(STOCK_OUT_NO_EXISTS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2.1 插入出库单
|
|
|
|
|
|
|
|
boolean needAudit = needAudit();
|
|
|
|
boolean needAudit = needAudit();
|
|
|
|
Integer status = needAudit ? ErpAuditStatus.PROCESS.getStatus() : ErpAuditStatus.APPROVE.getStatus();
|
|
|
|
Integer status = needAudit ? ErpAuditStatus.DRAFT.getStatus() : ErpAuditStatus.APPROVE.getStatus();
|
|
|
|
ErpStockOutDO stockOut = BeanUtils.toBean(createReqVO, ErpStockOutDO.class, in -> in
|
|
|
|
ErpStockOutDO stockOut = BeanUtils.toBean(createReqVO, ErpStockOutDO.class, out -> out
|
|
|
|
.setNo(no).setStatus(status)
|
|
|
|
.setNo(no)
|
|
|
|
|
|
|
|
.setNeedAudit(needAudit)
|
|
|
|
|
|
|
|
.setStatus(status)
|
|
|
|
.setTotalCount(getSumValue(stockOutItems, ErpStockOutItemDO::getCount, BigDecimal::add))
|
|
|
|
.setTotalCount(getSumValue(stockOutItems, ErpStockOutItemDO::getCount, BigDecimal::add))
|
|
|
|
.setTotalPrice(getSumValue(stockOutItems, ErpStockOutItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)));
|
|
|
|
.setTotalPrice(getSumValue(stockOutItems, ErpStockOutItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)));
|
|
|
|
stockOutMapper.insert(stockOut);
|
|
|
|
stockOutMapper.insert(stockOut);
|
|
|
|
// 2.2 插入出库单项
|
|
|
|
stockOutItems.forEach(item -> item.setOutId(stockOut.getId()));
|
|
|
|
stockOutItems.forEach(o -> o.setOutId(stockOut.getId()));
|
|
|
|
|
|
|
|
stockOutItemMapper.insertBatch(stockOutItems);
|
|
|
|
stockOutItemMapper.insertBatch(stockOutItems);
|
|
|
|
// for (ErpStockOutItemDO item : stockOutItems) {
|
|
|
|
|
|
|
|
// MoldDO moldDO = moldService.getMold(item.getProductId());
|
|
|
|
|
|
|
|
// moldDO.setStatus(ErpAuditStatus.PROCESS.getStatus()); // 未审核
|
|
|
|
|
|
|
|
// moldService.updateMold(BeanUtils.toBean(moldDO, MoldSaveReqVO.class));
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
if (!needAudit) {
|
|
|
|
if (!needAudit) {
|
|
|
|
operateStockOutEffect(stockOut, stockOutItems, true, ErpAuditStatus.APPROVE.getStatus());
|
|
|
|
applyStockOutEffect(stockOut, stockOutItems, null);
|
|
|
|
|
|
|
|
createApproveRecord(stockOut.getId(), ErpStockOutApproveActionEnum.AUTO_APPROVE, null,
|
|
|
|
|
|
|
|
ErpAuditStatus.APPROVE.getStatus(), null, "无需审核,系统自动出库");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return stockOut.getId();
|
|
|
|
return stockOut.getId();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -114,141 +125,124 @@ public class ErpStockOutServiceImpl implements ErpStockOutService {
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
public void updateStockOut(ErpStockOutSaveReqVO updateReqVO) {
|
|
|
|
public void updateStockOut(ErpStockOutSaveReqVO updateReqVO) {
|
|
|
|
// 1.1 校验存在
|
|
|
|
|
|
|
|
ErpStockOutDO stockOut = validateStockOutExists(updateReqVO.getId());
|
|
|
|
ErpStockOutDO stockOut = validateStockOutExists(updateReqVO.getId());
|
|
|
|
if (ErpAuditStatus.APPROVE.getStatus().equals(stockOut.getStatus())) {
|
|
|
|
if (ErpAuditStatus.APPROVE.getStatus().equals(stockOut.getStatus())) {
|
|
|
|
throw exception(STOCK_OUT_UPDATE_FAIL_APPROVE, stockOut.getNo());
|
|
|
|
throw exception(STOCK_OUT_UPDATE_FAIL_APPROVE, stockOut.getNo());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 1.2 校验客户
|
|
|
|
if (ErpAuditStatus.PROCESS.getStatus().equals(stockOut.getStatus())) {
|
|
|
|
// customerService.validateCustomer(updateReqVO.getCustomerId());
|
|
|
|
throw exception(STOCK_OUT_UPDATE_FAIL_PROCESS, stockOut.getNo());
|
|
|
|
// 1.3 校验出库项的有效性
|
|
|
|
}
|
|
|
|
List<ErpStockOutItemDO> stockOutItems = validateStockOutItems(updateReqVO.getItems(),updateReqVO.getOutType());
|
|
|
|
if (updateReqVO.getCustomerId() != null) {
|
|
|
|
|
|
|
|
customerService.validateCustomer(updateReqVO.getCustomerId());
|
|
|
|
// 2.1 更新出库单
|
|
|
|
}
|
|
|
|
ErpStockOutDO updateObj = BeanUtils.toBean(updateReqVO, ErpStockOutDO.class, in -> in
|
|
|
|
if (updateReqVO.getResponserId() != null) {
|
|
|
|
|
|
|
|
adminUserApi.validateUser(updateReqVO.getResponserId());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (updateReqVO.getAuditUserId() != null) {
|
|
|
|
|
|
|
|
adminUserApi.validateUser(updateReqVO.getAuditUserId());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
List<ErpStockOutItemDO> stockOutItems = validateStockOutItems(updateReqVO.getItems(), updateReqVO.getOutType());
|
|
|
|
|
|
|
|
boolean needAudit = needAudit();
|
|
|
|
|
|
|
|
ErpStockOutDO updateObj = BeanUtils.toBean(updateReqVO, ErpStockOutDO.class, out -> out
|
|
|
|
|
|
|
|
.setNeedAudit(needAudit)
|
|
|
|
.setTotalCount(getSumValue(stockOutItems, ErpStockOutItemDO::getCount, BigDecimal::add))
|
|
|
|
.setTotalCount(getSumValue(stockOutItems, ErpStockOutItemDO::getCount, BigDecimal::add))
|
|
|
|
.setTotalPrice(getSumValue(stockOutItems, ErpStockOutItemDO::getTotalPrice, BigDecimal::add)));
|
|
|
|
.setTotalPrice(getSumValue(stockOutItems, ErpStockOutItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)));
|
|
|
|
stockOutMapper.updateById(updateObj);
|
|
|
|
stockOutMapper.updateById(updateObj);
|
|
|
|
// 2.2 更新出库单项
|
|
|
|
|
|
|
|
updateStockOutItemList(updateReqVO.getId(), stockOutItems);
|
|
|
|
updateStockOutItemList(updateReqVO.getId(), stockOutItems);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
public void updateStockOutStatus(Long id, Integer status, Integer bizType) {
|
|
|
|
public void updateStockOutStatus(Long id, Integer status, Integer bizType) {
|
|
|
|
boolean approve = ErpAuditStatus.APPROVE.getStatus().equals(status);
|
|
|
|
|
|
|
|
ErpStockOutDO stockOut = validateStockOutExists(id);
|
|
|
|
ErpStockOutDO stockOut = validateStockOutExists(id);
|
|
|
|
if (stockOut.getStatus().equals(status)) {
|
|
|
|
boolean approve = ErpAuditStatus.APPROVE.getStatus().equals(status);
|
|
|
|
throw exception(approve ? STOCK_OUT_APPROVE_FAIL : STOCK_OUT_PROCESS_FAIL);
|
|
|
|
if (approve) {
|
|
|
|
|
|
|
|
if (!ErpAuditStatus.PROCESS.getStatus().equals(stockOut.getStatus())) {
|
|
|
|
|
|
|
|
throw exception(STOCK_OUT_APPROVE_FAIL);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
if (!ErpAuditStatus.APPROVE.getStatus().equals(stockOut.getStatus())) {
|
|
|
|
|
|
|
|
throw exception(STOCK_OUT_PROCESS_FAIL);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int updateCount = stockOutMapper.updateByIdAndStatus(id, stockOut.getStatus(), new ErpStockOutDO().setStatus(status));
|
|
|
|
int updateCount = stockOutMapper.updateByIdAndStatus(id, stockOut.getStatus(),
|
|
|
|
|
|
|
|
new ErpStockOutDO().setStatus(status));
|
|
|
|
|
|
|
|
if (updateCount == 0) {
|
|
|
|
if (updateCount == 0) {
|
|
|
|
throw exception(approve ? STOCK_OUT_APPROVE_FAIL : STOCK_OUT_PROCESS_FAIL);
|
|
|
|
throw exception(approve ? STOCK_OUT_APPROVE_FAIL : STOCK_OUT_PROCESS_FAIL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
List<ErpStockOutItemDO> stockOutItems = stockOutItemMapper.selectListByOutId(id);
|
|
|
|
List<ErpStockOutItemDO> stockOutItems = stockOutItemMapper.selectListByOutId(id);
|
|
|
|
operateStockOutEffect(stockOut, stockOutItems, approve, status);
|
|
|
|
if (approve) {
|
|
|
|
}
|
|
|
|
applyStockOutEffect(stockOut, stockOutItems, bizType);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
private void operateStockOutEffect(ErpStockOutDO stockOut, List<ErpStockOutItemDO> stockOutItems,
|
|
|
|
cancelStockOutEffect(stockOut, stockOutItems, bizType);
|
|
|
|
boolean approve, Integer status) {
|
|
|
|
|
|
|
|
stockOutItems.forEach(stockOutItem -> {
|
|
|
|
|
|
|
|
BigDecimal count = approve ? stockOutItem.getCount().negate() : stockOutItem.getCount();
|
|
|
|
|
|
|
|
if (Objects.equals(stockOut.getOutType(), "模具出库")) {
|
|
|
|
|
|
|
|
MoldBrandDO moldDO = moldBrandService.getMoldBrand(stockOutItem.getMoldSetId());
|
|
|
|
|
|
|
|
stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO(
|
|
|
|
|
|
|
|
stockOutItem.getProductId(), moldDO.getId(), stockOutItem.getWarehouseId(), count,
|
|
|
|
|
|
|
|
ErpStockRecordBizTypeEnum.OTHER_OUT.getType(), stockOutItem.getOutId(), stockOutItem.getId(), stockOut.getNo(), stockOut.getOutTime()));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
ErpProductRespVO product = productService.getProduct(stockOutItem.getProductId());
|
|
|
|
|
|
|
|
stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO(
|
|
|
|
|
|
|
|
stockOutItem.getProductId(), product.getCategoryId(), stockOutItem.getWarehouseId(), count,
|
|
|
|
|
|
|
|
ErpStockRecordBizTypeEnum.getTypeByName(stockOut.getOutType(), status), stockOutItem.getOutId(), stockOutItem.getId(), stockOut.getNo(), stockOut.getOutTime()));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Objects.equals(stockOut.getOutType(), "模具出库")) {
|
|
|
|
|
|
|
|
for (ErpStockOutItemDO item : stockOutItems) {
|
|
|
|
|
|
|
|
if (item.getMoldSetId() != null) {
|
|
|
|
|
|
|
|
MoldBrandDO moldDO = moldBrandService.getMoldBrand(item.getMoldSetId());
|
|
|
|
|
|
|
|
if (Objects.equals(moldDO.getStatus(), 3)) {
|
|
|
|
|
|
|
|
throw exception(STOCK_ALERADY_OUT, moldDO.getCode() + "-" + moldDO.getName());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
moldDO.setStatus(3);
|
|
|
|
|
|
|
|
moldBrandService.updateMoldBrand(BeanUtils.toBean(moldDO, MoldBrandSaveReqVO.class));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private boolean needAudit() {
|
|
|
|
@Override
|
|
|
|
return !AUDIT_CONFIG_DISABLE_VALUE.equals(configApi.getConfigValueByCategoryAndKey(AUDIT_CONFIG_CATEGORY, AUDIT_CONFIG_KEY));
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
}
|
|
|
|
public void submitStockOutAudit(ErpStockOutSubmitReqVO submitReqVO) {
|
|
|
|
|
|
|
|
ErpStockOutDO stockOut = validateStockOutExists(submitReqVO.getId());
|
|
|
|
private List<ErpStockOutItemDO> validateStockOutItems(List<ErpStockOutSaveReqVO.Item> list,String outType) {
|
|
|
|
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
|
|
|
if (Objects.equals(outType, "模具出库")) {
|
|
|
|
if (!Objects.equals(NumberUtils.parseLong(stockOut.getCreator()), loginUserId)) {
|
|
|
|
List<MoldBrandDO> moldList = moldBrandService.validMoldList(
|
|
|
|
throw exception(STOCK_OUT_SUBMIT_FAIL_USER);
|
|
|
|
convertSet(list, ErpStockOutSaveReqVO.Item::getMoldSetId));
|
|
|
|
|
|
|
|
Map<Long, MoldBrandDO> moldMap = convertMap(moldList, MoldBrandDO::getId);
|
|
|
|
|
|
|
|
return convertList(list, o -> {
|
|
|
|
|
|
|
|
MoldBrandDO moldBrand = moldMap.get(o.getMoldSetId());
|
|
|
|
|
|
|
|
return ErpStockOutItemDO.builder()
|
|
|
|
|
|
|
|
.id(null)
|
|
|
|
|
|
|
|
.moldSetId(moldBrand.getId())
|
|
|
|
|
|
|
|
.moldSetName(moldBrand.getName())
|
|
|
|
|
|
|
|
.warehouseId(o.getWarehouseId())
|
|
|
|
|
|
|
|
.productId(moldBrand.getId())
|
|
|
|
|
|
|
|
.productUnitId(null)
|
|
|
|
|
|
|
|
.productPrice(o.getProductPrice())
|
|
|
|
|
|
|
|
.count(o.getCount())
|
|
|
|
|
|
|
|
.totalPrice(MoneyUtils.priceMultiply(o.getProductPrice(), o.getCount()))
|
|
|
|
|
|
|
|
.remark(o.getRemark())
|
|
|
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
List<ErpProductDO> productList = productService.validProductList(
|
|
|
|
|
|
|
|
convertSet(list, ErpStockOutSaveReqVO.Item::getProductId));
|
|
|
|
|
|
|
|
Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId);
|
|
|
|
|
|
|
|
return convertList(list, o -> BeanUtils.toBean(o, ErpStockOutItemDO.class, item -> item
|
|
|
|
|
|
|
|
.setProductUnitId(productMap.get(item.getProductId()).getUnitId())
|
|
|
|
|
|
|
|
.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount()))));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!ErpAuditStatus.DRAFT.getStatus().equals(stockOut.getStatus())
|
|
|
|
|
|
|
|
&& !ErpAuditStatus.UN_APPROVE.getStatus().equals(stockOut.getStatus())) {
|
|
|
|
|
|
|
|
throw exception(STOCK_OUT_SUBMIT_FAIL_STATUS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Long auditUserId = submitReqVO.getAuditUserId() != null ? submitReqVO.getAuditUserId() : stockOut.getAuditUserId();
|
|
|
|
|
|
|
|
if (auditUserId == null) {
|
|
|
|
|
|
|
|
throw exception(STOCK_OUT_SUBMIT_FAIL_AUDIT_USER_EMPTY);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
adminUserApi.validateUser(auditUserId);
|
|
|
|
|
|
|
|
Integer fromStatus = stockOut.getStatus();
|
|
|
|
|
|
|
|
ErpStockOutDO updateObj = new ErpStockOutDO()
|
|
|
|
|
|
|
|
.setAuditUserId(auditUserId)
|
|
|
|
|
|
|
|
.setNeedAudit(true)
|
|
|
|
|
|
|
|
.setStatus(ErpAuditStatus.PROCESS.getStatus());
|
|
|
|
|
|
|
|
int updateCount = stockOutMapper.updateByIdAndStatus(stockOut.getId(), fromStatus, updateObj);
|
|
|
|
|
|
|
|
if (updateCount == 0) {
|
|
|
|
|
|
|
|
throw exception(STOCK_OUT_SUBMIT_FAIL_STATUS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
createApproveRecord(stockOut.getId(), ErpStockOutApproveActionEnum.SUBMIT, fromStatus,
|
|
|
|
|
|
|
|
ErpAuditStatus.PROCESS.getStatus(), auditUserId, submitReqVO.getRemark());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void updateStockOutItemList(Long id, List<ErpStockOutItemDO> newList) {
|
|
|
|
@Override
|
|
|
|
boolean moldStockOut = CollUtil.isNotEmpty(newList)
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
&& newList.stream().anyMatch(item -> item.getMoldSetId() != null);
|
|
|
|
public void auditStockOut(ErpStockOutAuditReqVO auditReqVO) {
|
|
|
|
if (moldStockOut) {
|
|
|
|
ErpStockOutDO stockOut = validateStockOutExists(auditReqVO.getId());
|
|
|
|
stockOutItemMapper.deleteByOutId(id);
|
|
|
|
if (!ErpAuditStatus.PROCESS.getStatus().equals(stockOut.getStatus())) {
|
|
|
|
newList.forEach(o -> {
|
|
|
|
throw exception(STOCK_OUT_AUDIT_FAIL_STATUS);
|
|
|
|
o.setId(null);
|
|
|
|
|
|
|
|
o.setOutId(id);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
stockOutItemMapper.insertBatch(newList);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
|
|
|
List<ErpStockOutItemDO> oldList = stockOutItemMapper.selectListByOutId(id);
|
|
|
|
if (!Objects.equals(stockOut.getAuditUserId(), loginUserId)) {
|
|
|
|
List<List<ErpStockOutItemDO>> diffList = diffList(oldList, newList,
|
|
|
|
throw exception(STOCK_OUT_AUDIT_FAIL_USER);
|
|
|
|
(oldVal, newVal) -> oldVal.getId().equals(newVal.getId()));
|
|
|
|
|
|
|
|
if (CollUtil.isNotEmpty(diffList.get(0))) {
|
|
|
|
|
|
|
|
diffList.get(0).forEach(o -> o.setOutId(id));
|
|
|
|
|
|
|
|
stockOutItemMapper.insertBatch(diffList.get(0));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (CollUtil.isNotEmpty(diffList.get(1))) {
|
|
|
|
if (!ErpAuditStatus.APPROVE.getStatus().equals(auditReqVO.getStatus())
|
|
|
|
stockOutItemMapper.updateBatch(diffList.get(1));
|
|
|
|
&& !ErpAuditStatus.UN_APPROVE.getStatus().equals(auditReqVO.getStatus())) {
|
|
|
|
|
|
|
|
throw exception(STOCK_OUT_AUDIT_FAIL_RESULT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (CollUtil.isNotEmpty(diffList.get(2))) {
|
|
|
|
|
|
|
|
stockOutItemMapper.deleteBatchIds(convertList(diffList.get(2), ErpStockOutItemDO::getId));
|
|
|
|
Integer fromStatus = stockOut.getStatus();
|
|
|
|
|
|
|
|
int updateCount = stockOutMapper.updateByIdAndStatus(stockOut.getId(), fromStatus,
|
|
|
|
|
|
|
|
new ErpStockOutDO().setStatus(auditReqVO.getStatus()));
|
|
|
|
|
|
|
|
if (updateCount == 0) {
|
|
|
|
|
|
|
|
throw exception(STOCK_OUT_AUDIT_FAIL_STATUS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<ErpStockOutItemDO> stockOutItems = stockOutItemMapper.selectListByOutId(stockOut.getId());
|
|
|
|
|
|
|
|
if (ErpAuditStatus.APPROVE.getStatus().equals(auditReqVO.getStatus())) {
|
|
|
|
|
|
|
|
applyStockOutEffect(stockOut, stockOutItems, null);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Long targetUserId = NumberUtils.parseLong(stockOut.getCreator());
|
|
|
|
|
|
|
|
createApproveRecord(stockOut.getId(), ErpAuditStatus.APPROVE.getStatus().equals(auditReqVO.getStatus())
|
|
|
|
|
|
|
|
? ErpStockOutApproveActionEnum.APPROVE : ErpStockOutApproveActionEnum.REJECT,
|
|
|
|
|
|
|
|
fromStatus, auditReqVO.getStatus(), targetUserId, auditReqVO.getRemark());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
public void deleteStockOut(List<Long> ids) {
|
|
|
|
public void deleteStockOut(List<Long> ids) {
|
|
|
|
// 1. 校验不处于已审批
|
|
|
|
|
|
|
|
List<ErpStockOutDO> stockOuts = stockOutMapper.selectBatchIds(ids);
|
|
|
|
List<ErpStockOutDO> stockOuts = stockOutMapper.selectBatchIds(ids);
|
|
|
|
if (CollUtil.isEmpty(stockOuts)) {
|
|
|
|
if (CollUtil.isEmpty(stockOuts)) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
@ -257,25 +251,17 @@ public class ErpStockOutServiceImpl implements ErpStockOutService {
|
|
|
|
if (ErpAuditStatus.APPROVE.getStatus().equals(stockOut.getStatus())) {
|
|
|
|
if (ErpAuditStatus.APPROVE.getStatus().equals(stockOut.getStatus())) {
|
|
|
|
throw exception(STOCK_OUT_DELETE_FAIL_APPROVE, stockOut.getNo());
|
|
|
|
throw exception(STOCK_OUT_DELETE_FAIL_APPROVE, stockOut.getNo());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ErpAuditStatus.PROCESS.getStatus().equals(stockOut.getStatus())) {
|
|
|
|
|
|
|
|
throw exception(STOCK_OUT_DELETE_FAIL_PROCESS, stockOut.getNo());
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 遍历删除,并记录操作日志
|
|
|
|
|
|
|
|
stockOuts.forEach(stockOut -> {
|
|
|
|
stockOuts.forEach(stockOut -> {
|
|
|
|
// 2.1 删除出库单
|
|
|
|
|
|
|
|
stockOutMapper.deleteById(stockOut.getId());
|
|
|
|
stockOutMapper.deleteById(stockOut.getId());
|
|
|
|
// 2.2 删除出库单项
|
|
|
|
|
|
|
|
stockOutItemMapper.deleteByOutId(stockOut.getId());
|
|
|
|
stockOutItemMapper.deleteByOutId(stockOut.getId());
|
|
|
|
|
|
|
|
stockOutApproveRecordMapper.deleteByStockOutId(stockOut.getId());
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private ErpStockOutDO validateStockOutExists(Long id) {
|
|
|
|
|
|
|
|
ErpStockOutDO stockOut = stockOutMapper.selectById(id);
|
|
|
|
|
|
|
|
if (stockOut == null) {
|
|
|
|
|
|
|
|
throw exception(STOCK_OUT_NOT_EXISTS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return stockOut;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public ErpStockOutDO getStockOut(Long id) {
|
|
|
|
public ErpStockOutDO getStockOut(Long id) {
|
|
|
|
return stockOutMapper.selectById(id);
|
|
|
|
return stockOutMapper.selectById(id);
|
|
|
|
@ -286,8 +272,6 @@ public class ErpStockOutServiceImpl implements ErpStockOutService {
|
|
|
|
return stockOutMapper.selectPage(pageReqVO);
|
|
|
|
return stockOutMapper.selectPage(pageReqVO);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== 出库项 ====================
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public List<ErpStockOutItemDO> getStockOutItemListByOutId(Long outId) {
|
|
|
|
public List<ErpStockOutItemDO> getStockOutItemListByOutId(Long outId) {
|
|
|
|
return stockOutItemMapper.selectListByOutId(outId);
|
|
|
|
return stockOutItemMapper.selectListByOutId(outId);
|
|
|
|
@ -300,9 +284,14 @@ public class ErpStockOutServiceImpl implements ErpStockOutService {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return stockOutItemMapper.selectListByOutIds(outIds);
|
|
|
|
return stockOutItemMapper.selectListByOutIds(outIds);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public List<ErpStockOutApproveRecordDO> getStockOutApproveRecordList(Long stockOutId) {
|
|
|
|
|
|
|
|
return stockOutApproveRecordMapper.selectListByStockOutId(stockOutId);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public
|
|
|
|
public List<ErpStockOutDO> selectByOutType(List<String> outTypes) {
|
|
|
|
List<ErpStockOutDO> selectByOutType(List<String> outTypes){
|
|
|
|
|
|
|
|
return stockOutMapper.selectByOutType(outTypes);
|
|
|
|
return stockOutMapper.selectByOutType(outTypes);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -313,5 +302,125 @@ public class ErpStockOutServiceImpl implements ErpStockOutService {
|
|
|
|
stockOutMapper.updateById(stockOut);
|
|
|
|
stockOutMapper.updateById(stockOut);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private ErpStockOutDO validateStockOutExists(Long id) {
|
|
|
|
|
|
|
|
ErpStockOutDO stockOut = stockOutMapper.selectById(id);
|
|
|
|
|
|
|
|
if (stockOut == null) {
|
|
|
|
|
|
|
|
throw exception(STOCK_OUT_NOT_EXISTS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return stockOut;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void applyStockOutEffect(ErpStockOutDO stockOut, List<ErpStockOutItemDO> stockOutItems, Integer bizType) {
|
|
|
|
|
|
|
|
operateStockOutEffect(stockOut, stockOutItems, true, bizType);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void cancelStockOutEffect(ErpStockOutDO stockOut, List<ErpStockOutItemDO> stockOutItems, Integer bizType) {
|
|
|
|
|
|
|
|
operateStockOutEffect(stockOut, stockOutItems, false, bizType);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void operateStockOutEffect(ErpStockOutDO stockOut, List<ErpStockOutItemDO> stockOutItems,
|
|
|
|
|
|
|
|
boolean approve, Integer bizType) {
|
|
|
|
|
|
|
|
stockOutItems.forEach(stockOutItem -> {
|
|
|
|
|
|
|
|
BigDecimal count = approve ? stockOutItem.getCount().negate() : stockOutItem.getCount();
|
|
|
|
|
|
|
|
if (Objects.equals(stockOut.getOutType(), "模具出库")) {
|
|
|
|
|
|
|
|
MoldBrandDO moldDO = moldBrandService.getMoldBrand(stockOutItem.getMoldSetId());
|
|
|
|
|
|
|
|
Integer recordBizType = bizType != null ? bizType
|
|
|
|
|
|
|
|
: (approve ? ErpStockRecordBizTypeEnum.OTHER_OUT.getType()
|
|
|
|
|
|
|
|
: ErpStockRecordBizTypeEnum.OTHER_OUT_CANCEL.getType());
|
|
|
|
|
|
|
|
stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO(
|
|
|
|
|
|
|
|
stockOutItem.getProductId(), moldDO.getId(), stockOutItem.getWarehouseId(), count,
|
|
|
|
|
|
|
|
recordBizType, stockOutItem.getOutId(), stockOutItem.getId(), stockOut.getNo(), stockOut.getOutTime()));
|
|
|
|
|
|
|
|
if (approve && itemNeedUpdateMoldStatus(moldDO)) {
|
|
|
|
|
|
|
|
moldDO.setStatus(3);
|
|
|
|
|
|
|
|
moldBrandService.updateMoldBrand(BeanUtils.toBean(moldDO, MoldBrandSaveReqVO.class));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
ErpProductRespVO product = productService.getProduct(stockOutItem.getProductId());
|
|
|
|
|
|
|
|
Integer recordBizType = bizType != null ? bizType
|
|
|
|
|
|
|
|
: (approve ? ErpStockRecordBizTypeEnum.getTypeByName(stockOut.getOutType())
|
|
|
|
|
|
|
|
: ErpStockRecordBizTypeEnum.getTypeByName(stockOut.getOutType(), 10));
|
|
|
|
|
|
|
|
stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO(
|
|
|
|
|
|
|
|
stockOutItem.getProductId(), product.getCategoryId(), stockOutItem.getWarehouseId(), count,
|
|
|
|
|
|
|
|
recordBizType, stockOutItem.getOutId(), stockOutItem.getId(), stockOut.getNo(), stockOut.getOutTime()));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private boolean itemNeedUpdateMoldStatus(MoldBrandDO moldDO) {
|
|
|
|
|
|
|
|
if (Objects.equals(moldDO.getStatus(), 3)) {
|
|
|
|
|
|
|
|
throw exception(STOCK_ALERADY_OUT, moldDO.getCode() + "-" + moldDO.getName());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private boolean needAudit() {
|
|
|
|
|
|
|
|
return !AUDIT_CONFIG_DISABLE_VALUE.equals(configApi.getConfigValueByCategoryAndKey(AUDIT_CONFIG_CATEGORY, AUDIT_CONFIG_KEY));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void createApproveRecord(Long stockOutId, ErpStockOutApproveActionEnum action, Integer fromStatus,
|
|
|
|
|
|
|
|
Integer toStatus, Long targetUserId, String remark) {
|
|
|
|
|
|
|
|
stockOutApproveRecordMapper.insert(ErpStockOutApproveRecordDO.builder()
|
|
|
|
|
|
|
|
.stockOutId(stockOutId)
|
|
|
|
|
|
|
|
.actionType(action.getActionType())
|
|
|
|
|
|
|
|
.fromStatus(fromStatus)
|
|
|
|
|
|
|
|
.toStatus(toStatus)
|
|
|
|
|
|
|
|
.targetUserId(targetUserId)
|
|
|
|
|
|
|
|
.remark(remark)
|
|
|
|
|
|
|
|
.build());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private List<ErpStockOutItemDO> validateStockOutItems(List<ErpStockOutSaveReqVO.Item> list, String outType) {
|
|
|
|
|
|
|
|
if (Objects.equals(outType, "模具出库")) {
|
|
|
|
|
|
|
|
List<MoldBrandDO> moldList = moldBrandService.validMoldList(convertSet(list, ErpStockOutSaveReqVO.Item::getMoldSetId));
|
|
|
|
|
|
|
|
Map<Long, MoldBrandDO> moldMap = convertMap(moldList, MoldBrandDO::getId);
|
|
|
|
|
|
|
|
return convertList(list, item -> {
|
|
|
|
|
|
|
|
MoldBrandDO moldBrand = moldMap.get(item.getMoldSetId());
|
|
|
|
|
|
|
|
return ErpStockOutItemDO.builder()
|
|
|
|
|
|
|
|
.id(item.getId())
|
|
|
|
|
|
|
|
.moldSetId(moldBrand.getId())
|
|
|
|
|
|
|
|
.moldSetName(moldBrand.getName())
|
|
|
|
|
|
|
|
.warehouseId(item.getWarehouseId())
|
|
|
|
|
|
|
|
.productId(moldBrand.getId())
|
|
|
|
|
|
|
|
.productUnitId(null)
|
|
|
|
|
|
|
|
.productPrice(item.getProductPrice())
|
|
|
|
|
|
|
|
.count(item.getCount())
|
|
|
|
|
|
|
|
.totalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount()))
|
|
|
|
|
|
|
|
.remark(item.getRemark())
|
|
|
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
List<ErpProductDO> productList = productService.validProductList(convertSet(list, ErpStockOutSaveReqVO.Item::getProductId));
|
|
|
|
|
|
|
|
Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId);
|
|
|
|
|
|
|
|
return convertList(list, item -> BeanUtils.toBean(item, ErpStockOutItemDO.class, target -> target
|
|
|
|
|
|
|
|
.setProductUnitId(productMap.get(target.getProductId()).getUnitId())
|
|
|
|
|
|
|
|
.setTotalPrice(MoneyUtils.priceMultiply(target.getProductPrice(), target.getCount()))));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void updateStockOutItemList(Long id, List<ErpStockOutItemDO> newList) {
|
|
|
|
|
|
|
|
boolean moldStockOut = CollUtil.isNotEmpty(newList)
|
|
|
|
|
|
|
|
&& newList.stream().anyMatch(item -> item.getMoldSetId() != null);
|
|
|
|
|
|
|
|
if (moldStockOut) {
|
|
|
|
|
|
|
|
stockOutItemMapper.deleteByOutId(id);
|
|
|
|
|
|
|
|
newList.forEach(item -> {
|
|
|
|
|
|
|
|
item.setId(null);
|
|
|
|
|
|
|
|
item.setOutId(id);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
stockOutItemMapper.insertBatch(newList);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
List<ErpStockOutItemDO> oldList = stockOutItemMapper.selectListByOutId(id);
|
|
|
|
|
|
|
|
List<List<ErpStockOutItemDO>> diffList = diffList(oldList, newList,
|
|
|
|
|
|
|
|
(oldVal, newVal) -> oldVal.getId().equals(newVal.getId()));
|
|
|
|
|
|
|
|
if (CollUtil.isNotEmpty(diffList.get(0))) {
|
|
|
|
|
|
|
|
diffList.get(0).forEach(item -> item.setOutId(id));
|
|
|
|
|
|
|
|
stockOutItemMapper.insertBatch(diffList.get(0));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (CollUtil.isNotEmpty(diffList.get(1))) {
|
|
|
|
|
|
|
|
stockOutItemMapper.updateBatch(diffList.get(1));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (CollUtil.isNotEmpty(diffList.get(2))) {
|
|
|
|
|
|
|
|
stockOutItemMapper.deleteBatchIds(convertList(diffList.get(2), ErpStockOutItemDO::getId));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|