package com.huaheng.api.general.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.huaheng.api.general.controller.ReceiptApi; import com.huaheng.api.general.domain.ReceiptDomain; import com.huaheng.common.exception.service.ServiceException; import com.huaheng.common.utils.StringUtils; import com.huaheng.framework.web.domain.AjaxResult; import com.huaheng.pc.config.FilterConfigDetail.domain.FilterConfigDetail; import com.huaheng.pc.config.FilterConfigDetail.service.FilterConfigDetailService; import com.huaheng.pc.config.company.domain.Company; import com.huaheng.pc.config.company.service.CompanyService; import com.huaheng.pc.config.material.domain.Material; import com.huaheng.pc.config.material.service.MaterialService; import com.huaheng.pc.config.receiptType.domain.ReceiptType; import com.huaheng.pc.config.receiptType.service.ReceiptTypeService; import com.huaheng.pc.config.statusFlow.domain.StatusFlowHeader; import com.huaheng.pc.config.statusFlow.service.StatusFlowHeaderService; import com.huaheng.pc.config.supplier.domain.Supplier; import com.huaheng.pc.config.supplier.service.SupplierService; import com.huaheng.pc.config.warehouse.domain.Warehouse; import com.huaheng.pc.config.warehouse.service.WarehouseService; import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail; import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService; import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader; import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.List; @Component @Transactional public class ReceiptApiService { @Resource private ReceiptHeaderService receiptHeaderService; @Resource private ReceiptDetailService receiptDetailService; @Resource private ReceiptTypeService receiptTypeService; @Resource private WarehouseService warehouseService; @Resource private CompanyService companyService; @Resource private MaterialService materialService; @Resource private SupplierService supplierService; @Resource private FilterConfigDetailService filterConfigDetailService; @Resource private StatusFlowHeaderService statusFlowHeaderService; /** * 入库单下发 * @param receipt 入库单 * @return 是否下发成功 */ @Transactional(rollbackFor = Exception.class) public AjaxResult receipt(ReceiptDomain receipt){ /* 0.step 获取入库头表,获取入库明细*/ ReceiptHeader receiptHeader = receipt.getReceiptHeader(); List<ReceiptDetail> receiptDetails = receipt.getReceiptDetails(); /* 1.step 校验入库单是否为空*/ if (receiptHeader == null || receiptDetails.isEmpty()){ throw new ServiceException("入库主单或入库子单为空"); } /* 2.step 检查入库头表合法性*/ AjaxResult checkReceiptHeaderResult = checkReceiptHeader(receiptHeader); if (checkReceiptHeaderResult.hasErr() ){ return AjaxResult.error(checkReceiptHeaderResult.getMsg()); } /* 3.step 检查入库明细合法性*/ AjaxResult checkReceiptDetailResult = checkReceiptDetail(receiptDetails); if (checkReceiptDetailResult.hasErr() ){ return AjaxResult.error(checkReceiptDetailResult.getMsg()); } /* 4.step 计算入库明细总行数、总数量*/ BigDecimal totalQty = new BigDecimal(0); for (ReceiptDetail receiptDetail: receiptDetails) { totalQty.add(receiptDetail.getTotalQty()); } receiptHeader.setTotalLines(receiptDetails.size()); receiptHeader.setTotalQty(totalQty); /* 5.step 保存的入库头表*/ if (!receiptHeaderService.save(receiptHeader)){ throw new ServiceException("保存入库头表失败"); } /* 6.step 保存入库明细*/ LambdaQueryWrapper<ReceiptHeader> lambda = Wrappers.lambdaQuery(); lambda.eq(ReceiptHeader::getWarehouseCode, receiptHeader.getWarehouseCode()) .eq(ReceiptHeader::getCode, receiptHeader.getCode()); receiptHeader = receiptHeaderService.getOne(lambda); for (ReceiptDetail receiptDetail : receiptDetails) { receiptDetail.setReceiptId(receiptHeader.getId()); receiptDetail.setReceiptCode(receiptHeader.getCode()); receiptDetail.setWarehouseCode(receiptHeader.getWarehouseCode()); receiptDetail.setCompanyCode(receiptHeader.getWarehouseCode()); Material material = materialService.findAllByCode(receiptDetail.getMaterialCode()); receiptDetail.setMaterialName(material.getName()); receiptDetail.setMaterialSpec(material.getSpec()); receiptDetail.setMaterialUnit(material.getUnit()); if (!receiptDetailService.save(receiptDetail)){ throw new ServiceException("保存入库明细失败"); } } return AjaxResult.success("成功"); } /** * 检查入库头表合法性 * @param receiptHeader 入库头表 * @return 检查结果 */ private AjaxResult checkReceiptHeader(ReceiptHeader receiptHeader){ /* 0.step 必填项是否为空*/ if (StringUtils.isEmpty(receiptHeader.getCode()) || StringUtils.isEmpty(receiptHeader.getCompanyCode()) || StringUtils.isEmpty(receiptHeader.getWarehouseCode()) || StringUtils.isEmpty(receiptHeader.getReceiptType())){ return AjaxResult.error("入库主单字段有误"); } /* 1.step 查询该单据编码是否已存在*/ LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambda = Wrappers.lambdaQuery(receiptHeader); if (receiptHeaderService.getOne(receiptHeaderLambda) != null){ return AjaxResult.error("该单据已存在:"+receiptHeader.getCode()); } /* 2.step 判断入库类型是否匹配*/ LambdaQueryWrapper<ReceiptType> receiptTypeLambda = Wrappers.lambdaQuery(); receiptTypeLambda.eq(ReceiptType::getCode, receiptHeader.getReceiptType()); if (receiptTypeService.getOne(receiptTypeLambda) == null){ return AjaxResult.error("没有对应的入库单类型"); } /* 3.step 判断仓库是否存在*/ LambdaQueryWrapper<Warehouse> warehouseLambda = Wrappers.lambdaQuery(); warehouseLambda.eq(Warehouse::getCode, receiptHeader.getWarehouseCode()); if (warehouseService.getOne(warehouseLambda) == null){ return AjaxResult.error("该仓库不存在"); } /* 4.step 判断货主是否存在*/ LambdaQueryWrapper<Company> companyLambda = Wrappers.lambdaQuery(); companyLambda.eq(Company::getCode, receiptHeader.getCompanyCode()); if (companyService.getOne(companyLambda) == null){ return AjaxResult.error("该货主不存在"); } return AjaxResult.success(""); } /** * 检查入库明细合法性 * @param receiptDetails 入库明细 * @return 检查结果 */ private AjaxResult checkReceiptDetail(List<ReceiptDetail> receiptDetails){ for (ReceiptDetail receiptDetail: receiptDetails) { /* 0.step 判断必填字段是否为空且总数量不能为0*/ if (receiptDetail.getMaterialCode() == null || new BigDecimal(0).compareTo(receiptDetail.getTotalQty() != null ? receiptDetail.getTotalQty() : new BigDecimal(0)) == 0 ){ return AjaxResult.error("入库明细字段有误"); } /* 1.step 判断供应商是否存在*/ if (receiptDetail.getSupplierCode() != null){ LambdaQueryWrapper<Supplier> supplierLambda = Wrappers.lambdaQuery(); supplierLambda.eq(Supplier::getCode, receiptDetail.getSupplierCode()); if (supplierService.getOne(supplierLambda) == null) { return AjaxResult.error("供应商不存在"); } } /* 2.step 判断定位规则是否存在*/ if (receiptDetail.getLocatingRule() != null){ LambdaQueryWrapper<FilterConfigDetail> filterConfigDetailLambda = Wrappers.lambdaQuery(); filterConfigDetailLambda.eq(FilterConfigDetail::getCode, receiptDetail.getLocatingRule()) .eq(FilterConfigDetail::getModuleType, "receipt") .eq(FilterConfigDetail::getRecordType, "locationRule"); FilterConfigDetail filterConfigDetail = filterConfigDetailService.getOne(filterConfigDetailLambda); if (filterConfigDetail == null){ return AjaxResult.error(receiptDetail.getLocatingRule()+"定位规则不存在"); } } /* 3.step 判断流程编码是否存在*/ if (receiptDetail.getStatusFlowCode() != null){ LambdaQueryWrapper<StatusFlowHeader> statusFlowHeaderLambda = Wrappers.lambdaQuery(); statusFlowHeaderLambda.eq(StatusFlowHeader::getCode, receiptDetail.getStatusFlowCode()) .eq(StatusFlowHeader::getModuleType, "receipt") .eq(StatusFlowHeader::getRecordType, "receivingFlow"); StatusFlowHeader statusFlowHeader = statusFlowHeaderService.getOne(statusFlowHeaderLambda); if (statusFlowHeader == null){ return AjaxResult.error(receiptDetail.getLocatingRule()+"该流程不存在"); } } } return AjaxResult.success(""); } }