| | |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.fasterxml.jackson.databind.node.ObjectNode; |
| | | import com.ruoyi.account.service.AccountIncomeService; |
| | | import com.ruoyi.aftersalesservice.dto.AfterSalesProductDto; |
| | | import com.ruoyi.aftersalesservice.dto.AfterSalesServiceNewDto; |
| | | import com.ruoyi.aftersalesservice.service.AfterSalesServiceService; |
| | | import com.ruoyi.approve.pojo.ApproveProcess; |
| | | import com.ruoyi.approve.service.IApproveProcessService; |
| | | import com.ruoyi.approve.vo.ApproveProcessVO; |
| | |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.exception.base.BaseException; |
| | | import com.ruoyi.common.utils.*; |
| | | import com.ruoyi.common.utils.excel.ExcelUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.other.mapper.TempFileMapper; |
| | |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.data.redis.core.script.DefaultRedisScript; |
| | | import org.springframework.security.core.Authentication; |
| | | import org.springframework.security.core.context.SecurityContext; |
| | | import org.springframework.security.core.context.SecurityContextHolder; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.transaction.support.TransactionTemplate; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | |
| | | import java.time.ZoneId; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.function.Function; |
| | | import java.util.stream.Collectors; |
| | |
| | | @Autowired |
| | | private SysUserMapper sysUserMapper; |
| | | |
| | | @Autowired |
| | | @Lazy |
| | | private AfterSalesServiceService afterSalesServiceService; |
| | | |
| | | private final ICustomerRegionsService customerRegionsService; |
| | | @Autowired |
| | | private TransactionTemplate transactionTemplate; |
| | | |
| | | @Override |
| | | public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) { |
| | |
| | | if (!bindList.isEmpty()) { |
| | | List<Integer> processIds = bindList.stream().map(SalesLedgerProductProcessBind::getSalesLedgerProductProcessId).collect(Collectors.toList()); |
| | | Map<Integer, Integer> processQuantityMap = bindList.stream().collect(Collectors.toMap(SalesLedgerProductProcessBind::getSalesLedgerProductProcessId, SalesLedgerProductProcessBind::getQuantity, (a, b) -> a)); |
| | | Map<Integer, BigDecimal> processAmountMap = bindList.stream().collect(Collectors.toMap(SalesLedgerProductProcessBind::getSalesLedgerProductProcessId, SalesLedgerProductProcessBind::getAmount, (a, b) -> a)); |
| | | List<SalesLedgerProductProcess> processList = salesLedgerProductProcessService.listByIds(processIds); |
| | | processList.forEach(p -> p.setQuantity(processQuantityMap.get(p.getId()))); |
| | | processList.forEach(p -> { |
| | | p.setQuantity(processQuantityMap.get(p.getId())); |
| | | if (processAmountMap.get(p.getId()) != null) p.setUnitPrice(processAmountMap.get(p.getId())); |
| | | }); |
| | | product.setSalesProductProcessList(processList); |
| | | } |
| | | ProductModel productModel = productModelMap.get(product.getProductModelId()); |
| | |
| | | SalesLedgerProductProcess p = new SalesLedgerProductProcess(); |
| | | p.setId(process.getId()); |
| | | p.setQuantity(processQty.intValue()); |
| | | p.setUnitPrice(process.getUnitPrice()); |
| | | processList.add(p); |
| | | extraProcessAmountPerPiece = extraProcessAmountPerPiece.add(defaultDecimal(process.getUnitPrice()).multiply(processQty)); |
| | | } |
| | |
| | | record.setSalesLedgerProcessRouteId(route.getId()); |
| | | Integer isCompleted = inputRecord != null && inputRecord.getIsCompleted() != null ? inputRecord.getIsCompleted() : 0; |
| | | record.setIsCompleted(isCompleted); |
| | | record.setCompletedTime(Objects.equals(isCompleted, 1) ? LocalDateTime.now() : null); |
| | | if (Objects.equals(isCompleted, 1)) { |
| | | record.setCompletedTime(inputRecord != null && inputRecord.getCompletedTime() != null ? inputRecord.getCompletedTime() : LocalDateTime.now()); |
| | | } else { |
| | | record.setCompletedTime(null); |
| | | } |
| | | routeRecordList.add(record); |
| | | } |
| | | salesLedgerProcessRouteRecordService.saveBatch(routeRecordList); |
| | |
| | | @Transactional(readOnly = true) |
| | | public String generateSalesContractNo() { |
| | | LocalDate currentDate = LocalDate.now(); |
| | | String datePart = currentDate.format(DateTimeFormatter.BASIC_ISO_DATE); |
| | | String datePart = currentDate.format(DateTimeFormatter.ofPattern("yyMMdd")); |
| | | String lockKey = LOCK_PREFIX + datePart; |
| | | String lockValue = Thread.currentThread().getId() + "-" + System.nanoTime(); // 唯一标识锁持有者 |
| | | |
| | |
| | | if (products == null || products.isEmpty()) { |
| | | throw new ServiceException("入库失败,入库产品不能为空"); |
| | | } |
| | | |
| | | long pendingInspectCount = qualityInspectMapper.selectCount(Wrappers.<com.ruoyi.quality.pojo.QualityInspect>lambdaQuery() |
| | | .eq(com.ruoyi.quality.pojo.QualityInspect::getSalesLedgerId, ledger.getId()) |
| | | .in(com.ruoyi.quality.pojo.QualityInspect::getSalesLedgerProductId, products) |
| | | .eq(com.ruoyi.quality.pojo.QualityInspect::getInspectState, 0)); |
| | | if (pendingInspectCount > 0) { |
| | | throw new ServiceException("入库失败,选中的产品中存在待处理的成品检验单,请先完成质检"); |
| | | } |
| | | |
| | | // 查询销售订单的产品 |
| | | List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery().in(SalesLedgerProduct::getId, products)); |
| | | if (salesLedgerProducts == null || salesLedgerProducts.isEmpty()) { |
| | |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | ApproveProcessVO approveProcessVO = new ApproveProcessVO(); |
| | | approveProcessVO.setApproveType(ApproveTypeEnum.STOCK_IN.getCode()); |
| | | approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); |
| | | approveProcessVO.setApproveDeptId(208L); |
| | | approveProcessVO.setApproveReason("入库审批:" + ledger.getSalesContractNo()); |
| | | approveProcessVO.setApproveRemark("salesStock:" + ledger.getId() + ":" + productIds); |
| | | approveProcessVO.setApproveUserIds(approveUserIds); |
| | |
| | | if (inboundQty.compareTo(BigDecimal.ZERO) <= 0) { |
| | | continue; |
| | | } |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setRecordId(product.getId()); |
| | | stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.SALE_STOCK_IN.getCode()); |
| | | stockInventoryDto.setQualitity(inboundQty); |
| | | stockInventoryDto.setProductModelId(product.getProductModelId()); |
| | | stockInventoryDto.setSalesLedgerId(ledger.getId()); |
| | | stockInventoryDto.setSalesLedgerProductId(product.getId()); |
| | | stockInventoryService.addstockInventory(stockInventoryDto); |
| | | |
| | | BigDecimal newStocked = oldStocked.add(inboundQty); |
| | | int lineStockStatus; |
| | | if (newStocked.compareTo(BigDecimal.ZERO) <= 0) { |
| | | lineStockStatus = 0; |
| | | } else if (orderQty.compareTo(BigDecimal.ZERO) > 0 && newStocked.compareTo(orderQty) < 0) { |
| | | lineStockStatus = 1; |
| | | } else { |
| | | lineStockStatus = 2; |
| | | // 新增一条成品的质检信息 |
| | | com.ruoyi.quality.pojo.QualityInspect qualityInspect = new com.ruoyi.quality.pojo.QualityInspect(); |
| | | qualityInspect.setInspectType(2); // 2: 出厂检验 (成品检验) |
| | | qualityInspect.setCustomer(ledger.getCustomerName()); |
| | | qualityInspect.setSalesLedgerId(ledger.getId()); |
| | | qualityInspect.setSalesLedgerProductId(product.getId()); |
| | | qualityInspect.setProductId(product.getProductId()); |
| | | qualityInspect.setProductName(product.getProductCategory()); |
| | | qualityInspect.setModel(product.getSpecificationModel()); |
| | | qualityInspect.setProductModelId(product.getProductModelId()); |
| | | qualityInspect.setUnit(product.getUnit()); |
| | | qualityInspect.setQuantity(inboundQty); |
| | | qualityInspect.setQualifiedQuantity(inboundQty); |
| | | qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO); |
| | | qualityInspect.setPassRate(BigDecimal.valueOf(100).setScale(2, java.math.RoundingMode.HALF_UP)); |
| | | qualityInspect.setInspectState(0); |
| | | qualityInspectMapper.insert(qualityInspect); |
| | | |
| | | // 查询检测标准并添加质检参数 |
| | | List<com.ruoyi.quality.pojo.QualityTestStandard> qualityTestStandardList = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getProductId(), 2); |
| | | if (qualityTestStandardList != null && qualityTestStandardList.size() > 0) { |
| | | qualityInspect.setTestStandardId(qualityTestStandardList.get(0).getId()); |
| | | qualityInspectMapper.updateById(qualityInspect); |
| | | List<com.ruoyi.quality.pojo.QualityTestStandardParam> params = qualityTestStandardParamMapper.selectList(com.baomidou.mybatisplus.core.toolkit.Wrappers.<com.ruoyi.quality.pojo.QualityTestStandardParam>lambdaQuery() |
| | | .eq(com.ruoyi.quality.pojo.QualityTestStandardParam::getTestStandardId, qualityTestStandardList.get(0).getId())); |
| | | for (com.ruoyi.quality.pojo.QualityTestStandardParam p : params) { |
| | | com.ruoyi.quality.pojo.QualityInspectParam param = new com.ruoyi.quality.pojo.QualityInspectParam(); |
| | | org.springframework.beans.BeanUtils.copyProperties(p, param); |
| | | param.setId(null); |
| | | param.setInspectId(qualityInspect.getId()); |
| | | qualityInspectParamMapper.insert(param); |
| | | } |
| | | } |
| | | product.setStockedQuantity(newStocked); |
| | | product.setProductStockStatus(lineStockStatus); |
| | | product.fillRemainingQuantity(); |
| | | salesLedgerProductMapper.updateById(product); |
| | | } |
| | | // 按销售订单产品入库情况更新主单入库状态:1-部分入库,2-已入库 |
| | | List<SalesLedgerProduct> ledgerAllProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery().eq(SalesLedgerProduct::getSalesLedgerId, ledger.getId())); |
| | | boolean hasStocked = CollectionUtils.isNotEmpty(ledgerAllProducts) && ledgerAllProducts.stream().anyMatch(item -> { |
| | | BigDecimal sq = item.getStockedQuantity(); |
| | | return sq != null && sq.compareTo(BigDecimal.ZERO) > 0; |
| | | }); |
| | | boolean allStocked = CollectionUtils.isNotEmpty(ledgerAllProducts) && ledgerAllProducts.stream().allMatch(item -> { |
| | | BigDecimal orderQty = item.getQuantity() == null ? BigDecimal.ZERO : item.getQuantity(); |
| | | BigDecimal stockedQty = item.getStockedQuantity() == null ? BigDecimal.ZERO : item.getStockedQuantity(); |
| | | return orderQty.compareTo(BigDecimal.ZERO) <= 0 || stockedQty.compareTo(orderQty) >= 0; |
| | | }); |
| | | ledger.setStockStatus(allStocked ? 2 : (hasStocked ? 1 : 0)); |
| | | // 更新主单状态为质检中(4) |
| | | ledger.setStockStatus(4); |
| | | baseMapper.updateById(ledger); |
| | | } |
| | | |
| | |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | ApproveProcessVO approveProcessVO = new ApproveProcessVO(); |
| | | approveProcessVO.setApproveType(ApproveTypeEnum.STOCK_IN.getCode()); |
| | | approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); |
| | | approveProcessVO.setApproveDeptId(208L); |
| | | approveProcessVO.setApproveReason(reason); |
| | | approveProcessVO.setApproveRemark(remark); |
| | | approveProcessVO.setApproveUserIds(approveUserIds); |
| | |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | ApproveProcessVO approveProcessVO = new ApproveProcessVO(); |
| | | approveProcessVO.setApproveType(ApproveTypeEnum.STOCK_IN.getCode()); |
| | | approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); |
| | | approveProcessVO.setApproveDeptId(208L); |
| | | approveProcessVO.setApproveReason(reason); |
| | | approveProcessVO.setApproveRemark(remark); |
| | | approveProcessVO.setApproveUserIds(approveUserIds); |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void shippingImport(MultipartFile file) { |
| | | if (file == null || file.isEmpty()) { |
| | | throw new ServiceException("导入失败,导入文件数据不能为空"); |
| | |
| | | } |
| | | Map<String, List<SalesShippingImportDto>> groupedByOrderNo = list.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(SalesShippingImportDto::getOrderNo, LinkedHashMap::new, Collectors.toList())); |
| | | |
| | | for (Map.Entry<String, List<SalesShippingImportDto>> entry : groupedByOrderNo.entrySet()) { |
| | | String orderNo = entry.getKey(); |
| | | if (!StringUtils.hasText(orderNo)) { |
| | | throw new ServiceException("导入失败,存在订单编号为空的数据"); |
| | | } |
| | | List<SalesShippingImportDto> rowList = entry.getValue(); |
| | | if (CollectionUtils.isEmpty(rowList)) { |
| | | continue; |
| | | } |
| | | if (StringUtils.hasText(rowList.get(0).getCustomerName()) && rowList.get(0).getCustomerName().startsWith("补片")) { |
| | | continue; |
| | | } |
| | | SalesLedger ledger = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>().eq(SalesLedger::getSalesContractNo, orderNo).last("LIMIT 1")); |
| | | if (ledger == null) { |
| | | // final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); |
| | | // List<String> errorMessages = Collections.synchronizedList(new ArrayList<>()); |
| | | groupedByOrderNo.forEach((orderNo, rowList) -> { |
| | | // SecurityContext originalContext = SecurityContextHolder.getContext(); |
| | | // SecurityContext ctx = SecurityContextHolder.createEmptyContext(); |
| | | // ctx.setAuthentication(authentication); |
| | | // SecurityContextHolder.setContext(ctx); |
| | | try { |
| | | if (!StringUtils.hasText(orderNo)) { |
| | | throw new ServiceException("导入失败,存在订单编号为空的数据"); |
| | | } |
| | | if (CollectionUtils.isEmpty(rowList)) { |
| | | return; |
| | | } |
| | | rowList.sort(Comparator.comparing(r -> buildCategoryProductName(r) + "||" + buildSpecificationModel(r))); |
| | | SalesLedger ledger = salesLedgerMapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<SalesLedger>().eq(SalesLedger::getSalesContractNo, orderNo).last("LIMIT 1")); |
| | | if (ledger == null) { |
| | | // throw new ServiceException("导入失败,订单编号[" + orderNo + "]不存在,无法补录已发货数据"); |
| | | continue; |
| | | } |
| | | List<SalesLedgerProduct> dbProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>().eq(SalesLedgerProduct::getSalesLedgerId, ledger.getId()).eq(SalesLedgerProduct::getType, SaleEnum.SALE.getCode())); |
| | | if (CollectionUtils.isEmpty(dbProducts)) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]没有销售产品,无法补录发货"); |
| | | } |
| | | Map<String, List<SalesLedgerProduct>> productByCategory = dbProducts.stream().collect(Collectors.groupingBy(p -> StringUtils.hasText(p.getProductCategory()) ? p.getProductCategory().trim() : "")); |
| | | Set<String> importedRowKeys = new HashSet<>(); |
| | | |
| | | for (SalesShippingImportDto row : rowList) { |
| | | BigDecimal shipQty = defaultDecimal(row.getQuantity()); |
| | | if (shipQty.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]存在数量小于等于0的数据"); |
| | | return; |
| | | } |
| | | String rowKey = buildShippingRowKey(ledger.getId(), row); |
| | | if (!importedRowKeys.add(rowKey)) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]存在重复发货明细行"); |
| | | } |
| | | Map<SalesLedgerProduct, BigDecimal> allocations = allocateShippingProductLines(orderNo, row, productByCategory, dbProducts); |
| | | for (Map.Entry<SalesLedgerProduct, BigDecimal> alloc : allocations.entrySet()) { |
| | | SalesLedgerProduct dbProduct = alloc.getKey(); |
| | | BigDecimal allocQty = alloc.getValue(); |
| | | if (dbProduct.getProductModelId() == null) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]产品规格未维护,无法补录出库"); |
| | | |
| | | boolean skipInboundAndShipping = false; |
| | | if (org.springframework.util.StringUtils.hasText(ledger.getCustomerName()) && ledger.getCustomerName().startsWith("补片")) { |
| | | if (ledger.getEntryDate() != null) { |
| | | java.time.LocalDate entryDate = com.ruoyi.common.utils.DateUtils.toLocalDate(ledger.getEntryDate()); |
| | | if (entryDate.plusDays(7).isAfter(java.time.LocalDate.now())) { |
| | | skipInboundAndShipping = true; |
| | | } |
| | | } |
| | | // 历史已发货补录:直接写入入库+出库记录 |
| | | stockUtils.addStock( |
| | | ledger.getId(), |
| | | dbProduct.getId(), |
| | | dbProduct.getProductModelId(), |
| | | allocQty, |
| | | StockInQualifiedRecordTypeEnum.SALE_STOCK_IN.getCode(), |
| | | dbProduct.getId() |
| | | ); |
| | | stockUtils.substractStock( |
| | | ledger.getId(), |
| | | dbProduct.getId(), |
| | | dbProduct.getProductModelId(), |
| | | allocQty, |
| | | StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), |
| | | dbProduct.getId() |
| | | ); |
| | | BigDecimal oldShipped = defaultDecimal(dbProduct.getShippedQuantity()); |
| | | BigDecimal newShipped = oldShipped.add(allocQty); |
| | | dbProduct.setStockedQuantity(defaultDecimal(dbProduct.getQuantity())); |
| | | dbProduct.setShippedQuantity(newShipped); |
| | | dbProduct.setApproveStatus(3); |
| | | updateProductStockStatus(dbProduct); |
| | | dbProduct.fillRemainingQuantity(); |
| | | updateProductShipStatus(dbProduct); |
| | | salesLedgerProductMapper.updateById(dbProduct); |
| | | } |
| | | if (skipInboundAndShipping) { |
| | | return; |
| | | } |
| | | List<SalesLedgerProduct> dbProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>().eq(SalesLedgerProduct::getSalesLedgerId, ledger.getId()).eq(SalesLedgerProduct::getType, SaleEnum.SALE.getCode())); |
| | | if (CollectionUtils.isEmpty(dbProducts)) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]没有销售产品,无法补录发货"); |
| | | } |
| | | dbProducts.sort(Comparator.comparing(SalesLedgerProduct::getProductModelId, Comparator.nullsLast(Comparator.naturalOrder()))); |
| | | Map<String, List<SalesLedgerProduct>> productByCategory = dbProducts.stream().collect(Collectors.groupingBy(p -> StringUtils.hasText(p.getProductCategory()) ? p.getProductCategory().trim() : "")); |
| | | Set<String> importedRowKeys = new HashSet<>(); |
| | | |
| | | ShippingInfo shippingInfo = new ShippingInfo(); |
| | | shippingInfo.setSalesLedgerId(ledger.getId()); |
| | | shippingInfo.setSalesLedgerProductId(dbProduct.getId()); |
| | | shippingInfo.setStatus("已发货"); |
| | | shippingInfo.setShippingNo(row.getShippingNo()); |
| | | shippingInfo.setType("货车"); |
| | | shippingInfo.setShippingCarNumber("无"); |
| | | shippingInfo.setShippingDate(row.getReportDate()); |
| | | long existedShippingCount = shippingInfoMapper.selectCount(new LambdaQueryWrapper<ShippingInfo>() |
| | | .eq(ShippingInfo::getSalesLedgerId, ledger.getId()) |
| | | .eq(ShippingInfo::getSalesLedgerProductId, dbProduct.getId()) |
| | | .eq(StringUtils.hasText(row.getShippingNo()), ShippingInfo::getShippingNo, row.getShippingNo()) |
| | | .eq(row.getReportDate() != null, ShippingInfo::getShippingDate, row.getReportDate())); |
| | | if (existedShippingCount > 0) { |
| | | // continue; |
| | | List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>() |
| | | for (SalesShippingImportDto row : rowList) { |
| | | BigDecimal shipQty = defaultDecimal(row.getQuantity()); |
| | | if (shipQty.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]存在数量小于等于0的数据"); |
| | | } |
| | | String rowKey = buildShippingRowKey(ledger.getId(), row); |
| | | if (!importedRowKeys.add(rowKey)) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]存在重复发货明细行"); |
| | | } |
| | | Map<SalesLedgerProduct, BigDecimal> allocations = allocateShippingProductLines(orderNo, row, productByCategory, dbProducts); |
| | | for (Map.Entry<SalesLedgerProduct, BigDecimal> alloc : allocations.entrySet()) { |
| | | SalesLedgerProduct dbProduct = alloc.getKey(); |
| | | BigDecimal allocQty = alloc.getValue(); |
| | | if (dbProduct.getProductModelId() == null) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]产品规格未维护,无法补录出库"); |
| | | } |
| | | Long inspectId = createShippingQualityInspect(ledger, dbProduct, row, allocQty); |
| | | // 历史已发货补录:直接写入入库+出库记录 |
| | | stockUtils.addStock( |
| | | ledger.getId(), |
| | | dbProduct.getId(), |
| | | dbProduct.getProductModelId(), |
| | | allocQty, |
| | | StockInQualifiedRecordTypeEnum.SALE_QC_OK_IN.getCode(), |
| | | inspectId != null ? inspectId : dbProduct.getId() |
| | | ); |
| | | stockUtils.substractStock( |
| | | ledger.getId(), |
| | | dbProduct.getId(), |
| | | dbProduct.getProductModelId(), |
| | | allocQty, |
| | | StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), |
| | | dbProduct.getId() |
| | | ); |
| | | |
| | | StockInRecord inRecord = stockInRecordMapper.selectOne(new LambdaQueryWrapper<StockInRecord>() |
| | | .eq(StockInRecord::getSalesLedgerProductId, dbProduct.getId()) |
| | | .orderByDesc(StockInRecord::getId).last("LIMIT 1")); |
| | | if (inRecord != null) { |
| | | String batch = "RK"; |
| | | if (row.getReportDate() != null) { |
| | | String dateStr = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(row.getReportDate()); |
| | | batch += dateStr + "-" + row.getReportDate().getTime(); |
| | | } else { |
| | | batch += System.currentTimeMillis() + "-" + inRecord.getId(); |
| | | } |
| | | inRecord.setInboundBatches(batch); |
| | | if (row.getReportDate() != null) { |
| | | LocalDateTime reportDateTime = LocalDateTime.ofInstant(row.getReportDate().toInstant(), ZoneId.systemDefault()); |
| | | inRecord.setCreateTime(reportDateTime); |
| | | inRecord.setUpdateTime(reportDateTime); |
| | | } |
| | | stockInRecordMapper.updateById(inRecord); |
| | | } |
| | | |
| | | StockOutRecord outRecord = stockOutRecordMapper.selectOne(new LambdaQueryWrapper<StockOutRecord>() |
| | | .eq(StockOutRecord::getSalesLedgerProductId, dbProduct.getId()) |
| | | .orderByDesc(StockOutRecord::getId).last("LIMIT 1")); |
| | | if (outRecord != null) { |
| | | String batch = "CK"; |
| | | if (row.getReportDate() != null) { |
| | | String dateStr = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(row.getReportDate()); |
| | | batch += dateStr + "-" + row.getReportDate().getTime(); |
| | | } else { |
| | | batch += System.currentTimeMillis() + "-" + outRecord.getId(); |
| | | } |
| | | outRecord.setOutboundBatches(batch); |
| | | if (row.getReportDate() != null) { |
| | | LocalDateTime reportDateTime = LocalDateTime.ofInstant(row.getReportDate().toInstant(), ZoneId.systemDefault()); |
| | | outRecord.setCreateTime(reportDateTime); |
| | | outRecord.setUpdateTime(reportDateTime); |
| | | } |
| | | stockOutRecordMapper.updateById(outRecord); |
| | | } |
| | | |
| | | BigDecimal oldShipped = defaultDecimal(dbProduct.getShippedQuantity()); |
| | | BigDecimal newShipped = oldShipped.add(allocQty); |
| | | dbProduct.setStockedQuantity(defaultDecimal(dbProduct.getQuantity())); |
| | | dbProduct.setShippedQuantity(newShipped); |
| | | dbProduct.setApproveStatus(3); |
| | | updateProductStockStatus(dbProduct); |
| | | dbProduct.fillRemainingQuantity(); |
| | | updateProductShipStatus(dbProduct); |
| | | salesLedgerProductMapper.updateById(dbProduct); |
| | | |
| | | ShippingInfo shippingInfo = new ShippingInfo(); |
| | | shippingInfo.setSalesLedgerId(ledger.getId()); |
| | | shippingInfo.setSalesLedgerProductId(dbProduct.getId()); |
| | | shippingInfo.setStatus("已发货"); |
| | | shippingInfo.setShippingNo(row.getShippingNo()); |
| | | shippingInfo.setType("货车"); |
| | | shippingInfo.setShippingCarNumber("无"); |
| | | shippingInfo.setShippingDate(row.getReportDate()); |
| | | long existedShippingCount = shippingInfoMapper.selectCount(new LambdaQueryWrapper<ShippingInfo>() |
| | | .eq(ShippingInfo::getSalesLedgerId, ledger.getId()) |
| | | .eq(ShippingInfo::getSalesLedgerProductId, dbProduct.getId()) |
| | | .eq(StringUtils.hasText(row.getShippingNo()), ShippingInfo::getShippingNo, row.getShippingNo()) |
| | | .eq(row.getReportDate() != null, ShippingInfo::getShippingDate, row.getReportDate())); |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]存在重复发货记录,请勿重复导入"); |
| | | if (existedShippingCount > 0) { |
| | | // continue; |
| | | List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>() |
| | | .eq(ShippingInfo::getSalesLedgerId, ledger.getId()) |
| | | .eq(ShippingInfo::getSalesLedgerProductId, dbProduct.getId()) |
| | | .eq(StringUtils.hasText(row.getShippingNo()), ShippingInfo::getShippingNo, row.getShippingNo()) |
| | | .eq(row.getReportDate() != null, ShippingInfo::getShippingDate, row.getReportDate())); |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]存在重复发货记录,请勿重复导入"); |
| | | } |
| | | shippingInfoMapper.insert(shippingInfo); |
| | | // createShippingQualityInspect moved up |
| | | } |
| | | shippingInfoMapper.insert(shippingInfo); |
| | | createShippingQualityInspect(ledger, dbProduct, row, allocQty); |
| | | } |
| | | } |
| | | |
| | | List<SalesLedgerProduct> latestProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>().eq(SalesLedgerProduct::getSalesLedgerId, ledger.getId()).eq(SalesLedgerProduct::getType, SaleEnum.SALE.getCode())); |
| | | boolean allShipped = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().allMatch(p -> { |
| | | BigDecimal qty = defaultDecimal(p.getQuantity()); |
| | | BigDecimal shipped = defaultDecimal(p.getShippedQuantity()); |
| | | return shipped.compareTo(qty) >= 0; |
| | | }); |
| | | boolean anyInbound = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().anyMatch(p -> defaultDecimal(p.getStockedQuantity()).compareTo(BigDecimal.ZERO) > 0); |
| | | boolean allInbound = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().allMatch(p -> { |
| | | BigDecimal qty = defaultDecimal(p.getQuantity()); |
| | | BigDecimal stocked = defaultDecimal(p.getStockedQuantity()); |
| | | return qty.compareTo(BigDecimal.ZERO) <= 0 || stocked.compareTo(qty) >= 0; |
| | | }); |
| | | if (allShipped && rowList.get(0).getReportDate() != null) { |
| | | ledger.setDeliveryDate(DateUtils.toLocalDate(rowList.get(0).getReportDate())); |
| | | } |
| | | ledger.setStockStatus(allInbound ? 2 : (anyInbound ? 1 : 0)); |
| | | ledger.setDeliveryStatus(allShipped ? 5 : 1); |
| | | List<SalesLedgerProduct> latestProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>().eq(SalesLedgerProduct::getSalesLedgerId, ledger.getId()).eq(SalesLedgerProduct::getType, SaleEnum.SALE.getCode())); |
| | | boolean allShipped = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().allMatch(p -> { |
| | | BigDecimal qty = defaultDecimal(p.getQuantity()); |
| | | BigDecimal shipped = defaultDecimal(p.getShippedQuantity()); |
| | | return shipped.compareTo(qty) >= 0; |
| | | }); |
| | | boolean anyInbound = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().anyMatch(p -> defaultDecimal(p.getStockedQuantity()).compareTo(BigDecimal.ZERO) > 0); |
| | | boolean allInbound = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().allMatch(p -> { |
| | | BigDecimal qty = defaultDecimal(p.getQuantity()); |
| | | BigDecimal stocked = defaultDecimal(p.getStockedQuantity()); |
| | | return qty.compareTo(BigDecimal.ZERO) <= 0 || stocked.compareTo(qty) >= 0; |
| | | }); |
| | | if (allShipped && rowList.get(0).getReportDate() != null) { |
| | | ledger.setDeliveryDate(DateUtils.toLocalDate(rowList.get(0).getReportDate())); |
| | | } |
| | | ledger.setStockStatus(allInbound ? 2 : (anyInbound ? 1 : 0)); |
| | | ledger.setDeliveryStatus(allShipped ? 5 : 1); |
| | | // ledger.setReviewStatus(1); |
| | | ledger.setOrderStatus(1); |
| | | salesLedgerMapper.updateById(ledger); |
| | | } |
| | | |
| | | Long entryUserId = StringUtils.hasText(ledger.getEntryPerson()) ? Long.parseLong(ledger.getEntryPerson()) : 1L; |
| | | Long entryDeptId = 1L; |
| | | if (StringUtils.hasText(ledger.getEntryPerson())) { |
| | | try { |
| | | SysUser entryUser = sysUserMapper.selectById(ledger.getEntryPerson()); |
| | | if (entryUser != null && entryUser.getDeptId() != null) { |
| | | entryDeptId = entryUser.getDeptId(); |
| | | } |
| | | } catch (Exception ignored) { |
| | | } |
| | | } |
| | | String reportDateStr = rowList.get(0).getReportDate() != null ? new java.text.SimpleDateFormat("yyyy-MM-dd").format(rowList.get(0).getReportDate()) : java.time.LocalDate.now().toString(); |
| | | |
| | | try { |
| | | String productIds = latestProducts.stream().map(p -> String.valueOf(p.getId())).collect(Collectors.joining(",")); |
| | | String inboundApproveUserIds = resolveApproveUserIds(null, ledger.getId(), INBOUND_BIZ_TYPE_WEB); |
| | | if (StringUtils.isEmpty(inboundApproveUserIds)) { |
| | | inboundApproveUserIds = "1"; |
| | | } |
| | | |
| | | ApproveProcessVO stockInVo = new ApproveProcessVO(); |
| | | stockInVo.setApproveType(ApproveTypeEnum.STOCK_IN.getCode()); |
| | | stockInVo.setApproveDeptId(208L); |
| | | stockInVo.setApproveReason("入库审批:" + ledger.getSalesContractNo()); |
| | | stockInVo.setApproveRemark("salesStock:" + ledger.getId() + ":" + productIds); |
| | | stockInVo.setApproveUserIds(inboundApproveUserIds); |
| | | stockInVo.setApproveUser(entryUserId); |
| | | stockInVo.setApproveTime(reportDateStr); |
| | | approveProcessService.addApprove(stockInVo); |
| | | |
| | | ApproveProcess savedStockIn = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>() |
| | | .eq(ApproveProcess::getApproveReason, stockInVo.getApproveReason()) |
| | | .eq(ApproveProcess::getApproveType, stockInVo.getApproveType()) |
| | | .orderByDesc(ApproveProcess::getId).last("LIMIT 1")); |
| | | if (savedStockIn != null) { |
| | | savedStockIn.setApproveStatus(2); |
| | | savedStockIn.setApproveOverTime(rowList.get(0).getReportDate()); |
| | | approveProcessService.updateById(savedStockIn); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("自动生成入库审批申请失败", e); |
| | | throw new ServiceException("生成入库申请审批失败:{}" + e.getMessage()); |
| | | } |
| | | |
| | | try { |
| | | ApproveProcessVO deliveryVo = new ApproveProcessVO(); |
| | | deliveryVo.setApproveType(ApproveTypeEnum.DELIVERY.getCode()); |
| | | deliveryVo.setApproveDeptId(208L); |
| | | deliveryVo.setApproveReason("发货审批:" + ledger.getSalesContractNo()); |
| | | deliveryVo.setApproveUserIds("1"); |
| | | deliveryVo.setApproveUser(entryUserId); |
| | | deliveryVo.setApproveTime(reportDateStr); |
| | | approveProcessService.addApprove(deliveryVo); |
| | | |
| | | ApproveProcess savedDelivery = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>() |
| | | .eq(ApproveProcess::getApproveReason, deliveryVo.getApproveReason()) |
| | | .eq(ApproveProcess::getApproveType, deliveryVo.getApproveType()) |
| | | .orderByDesc(ApproveProcess::getId).last("LIMIT 1")); |
| | | if (savedDelivery != null) { |
| | | savedDelivery.setApproveStatus(2); |
| | | savedDelivery.setApproveOverTime(rowList.get(0).getReportDate()); |
| | | approveProcessService.updateById(savedDelivery); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("自动生成发货审批申请失败", e); |
| | | throw new ServiceException("生成发货申请审批失败:{}" + e.getMessage()); |
| | | } |
| | | |
| | | salesLedgerMapper.updateById(ledger); |
| | | } catch (Exception e) { |
| | | log.error("订单 {} 已发货记录导入失败", orderNo, e); |
| | | // errorMessages.add("订单 [" + orderNo + "] 导入失败: " + e.getMessage()); |
| | | } |
| | | // SecurityContextHolder.setContext(originalContext); |
| | | }); |
| | | // if (!errorMessages.isEmpty()) { |
| | | // throw new ServiceException("部分数据导入失败:\n" + String.join("\n", errorMessages)); |
| | | // } |
| | | } |
| | | |
| | | @Override |
| | |
| | | throw new ServiceException("导入失败,文件数据为空"); |
| | | } |
| | | List<SysUser> allUsers = sysUserMapper.selectList(null); |
| | | Map<String, SysUser> userByNickNameMap = allUsers.stream().filter(Objects::nonNull).filter(u -> StringUtils.hasText(u.getNickName())).collect(Collectors.toMap(SysUser::getNickName, Function.identity(), (a, b) -> a)); |
| | | Map<String, SysUser> userByUserNameMap = allUsers.stream().filter(Objects::nonNull).filter(u -> StringUtils.hasText(u.getUserName())).collect(Collectors.toMap(SysUser::getUserName, Function.identity(), (a, b) -> a)); |
| | | Map<String, SysUser> userByNickNameMap = new ConcurrentHashMap<>(allUsers.stream().filter(Objects::nonNull).filter(u -> StringUtils.hasText(u.getNickName())).collect(Collectors.toMap(SysUser::getNickName, Function.identity(), (a, b) -> a))); |
| | | Map<String, SysUser> userByUserNameMap = new ConcurrentHashMap<>(allUsers.stream().filter(Objects::nonNull).filter(u -> StringUtils.hasText(u.getUserName())).collect(Collectors.toMap(SysUser::getUserName, Function.identity(), (a, b) -> a))); |
| | | |
| | | Map<String, Customer> customerNameMap = customerMapper.selectList(null).stream().filter(Objects::nonNull).filter(c -> StringUtils.hasText(c.getCustomerName())).collect(Collectors.toMap(Customer::getCustomerName, Function.identity(), (a, b) -> a)); |
| | | Map<String, Customer> customerNameMap = new ConcurrentHashMap<>(customerMapper.selectList(null).stream().filter(Objects::nonNull).filter(c -> StringUtils.hasText(c.getCustomerName())).collect(Collectors.toMap(Customer::getCustomerName, Function.identity(), (a, b) -> a))); |
| | | List<CustomerRegions> allRegions = customerRegionsService.list(); |
| | | CustomerRegions hebiRegion = allRegions.stream().filter(Objects::nonNull).filter(r -> "鹤壁".equals(r.getRegionsName())).findFirst().orElseGet(() -> { |
| | | CustomerRegions region = new CustomerRegions(); |
| | |
| | | customerRegionsService.save(region); |
| | | return region; |
| | | }); |
| | | Map<String, Product> productNameMap = productMapper.selectList(null).stream().filter(Objects::nonNull).filter(p -> StringUtils.hasText(p.getProductName())).collect(Collectors.toMap(Product::getProductName, Function.identity(), (a, b) -> a)); |
| | | Map<String, Product> productNameMap = new ConcurrentHashMap<>(productMapper.selectList(null).stream().filter(Objects::nonNull).filter(p -> StringUtils.hasText(p.getProductName())).collect(Collectors.toMap(Product::getProductName, Function.identity(), (a, b) -> a))); |
| | | Product finishedGoodsParent = productNameMap.get("成品"); |
| | | if (finishedGoodsParent == null || finishedGoodsParent.getId() == null) { |
| | | finishedGoodsParent = new Product(); |
| | |
| | | productMapper.insert(finishedGoodsParent); |
| | | productNameMap.put("成品", finishedGoodsParent); |
| | | } |
| | | Map<String, ProductModel> productModelKeyMap = productModelMapper.selectList(null).stream().filter(Objects::nonNull).filter(m -> m.getProductId() != null && StringUtils.hasText(m.getModel())).collect(Collectors.toMap(m -> buildProductModelKey(m.getProductId(), m.getModel()), Function.identity(), (a, b) -> a)); |
| | | Map<String, ProductModel> productModelKeyMap = new ConcurrentHashMap<>(productModelMapper.selectList(null).stream().filter(Objects::nonNull).filter(m -> m.getProductId() != null && StringUtils.hasText(m.getModel())).collect(Collectors.toMap(m -> buildProductModelKey(m.getProductId(), m.getModel()), Function.identity(), (a, b) -> a))); |
| | | |
| | | List<String> extraProcessNames = Arrays.asList("打孔", "挖缺", "安全角", "磨边", "精磨边", "运费", "加急费"); |
| | | Map<String, SalesLedgerProductProcess> processMap = salesLedgerProductProcessService.list(new LambdaQueryWrapper<SalesLedgerProductProcess>().in(SalesLedgerProductProcess::getProcessName, extraProcessNames)).stream().filter(Objects::nonNull).filter(p -> StringUtils.hasText(p.getProcessName())).collect(Collectors.toMap(SalesLedgerProductProcess::getProcessName, Function.identity(), (a, b) -> a)); |
| | | Map<String, SalesLedgerProductProcess> processMap = new ConcurrentHashMap<>(salesLedgerProductProcessService.list(new LambdaQueryWrapper<SalesLedgerProductProcess>().in(SalesLedgerProductProcess::getProcessName, extraProcessNames)).stream().filter(Objects::nonNull).filter(p -> StringUtils.hasText(p.getProcessName())).collect(Collectors.toMap(SalesLedgerProductProcess::getProcessName, Function.identity(), (a, b) -> a))); |
| | | List<ProcessRoute> processRoutes = processRouteMapper.selectList(new LambdaQueryWrapper<ProcessRoute>().eq(ProcessRoute::getProductModelId, 0L)); |
| | | Map<String, ProcessRoute> routeNameMap = processRoutes.stream().filter(Objects::nonNull).filter(r -> StringUtils.hasText(r.getProcessRouteName())).collect(Collectors.toMap(r -> normalizeRouteFlowKey(r.getProcessRouteName()), Function.identity(), this::chooseBetterRoute)); |
| | | Map<Long, List<ProcessRouteItem>> routeItemMap = Collections.emptyMap(); |
| | | Map<String, ProcessRoute> routeNameMap = new ConcurrentHashMap<>(processRoutes.stream().filter(Objects::nonNull).filter(r -> StringUtils.hasText(r.getProcessRouteName())).collect(Collectors.toMap(r -> normalizeRouteFlowKey(r.getProcessRouteName()), Function.identity(), this::chooseBetterRoute))); |
| | | Map<Long, List<ProcessRouteItem>> routeItemMap = new ConcurrentHashMap<>(); |
| | | List<Long> routeIds = processRoutes.stream().map(ProcessRoute::getId).filter(Objects::nonNull).collect(Collectors.toList()); |
| | | if (CollectionUtils.isNotEmpty(routeIds)) { |
| | | routeItemMap = processRouteItemMapper.selectList(new LambdaQueryWrapper<ProcessRouteItem>().in(ProcessRouteItem::getRouteId, routeIds).orderByAsc(ProcessRouteItem::getDragSort).orderByAsc(ProcessRouteItem::getId)).stream().filter(Objects::nonNull).collect(Collectors.groupingBy(ProcessRouteItem::getRouteId)); |
| | | routeItemMap.putAll(processRouteItemMapper.selectList(new LambdaQueryWrapper<ProcessRouteItem>().in(ProcessRouteItem::getRouteId, routeIds).orderByAsc(ProcessRouteItem::getDragSort).orderByAsc(ProcessRouteItem::getId)).stream().filter(Objects::nonNull).collect(Collectors.groupingBy(ProcessRouteItem::getRouteId))); |
| | | } |
| | | |
| | | final Map<Long, List<ProcessRouteItem>> finalRouteItemMap = routeItemMap; |
| | | final Product finalFinishedGoodsParent = finishedGoodsParent; |
| | | |
| | | Map<String, List<SalesNotShippingImportDto>> groupedByOrderNo = list.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(SalesNotShippingImportDto::getOrderNo, LinkedHashMap::new, Collectors.toList())); |
| | | |
| | | for (Map.Entry<String, List<SalesNotShippingImportDto>> entry : groupedByOrderNo.entrySet()) { |
| | | String orderNo = entry.getKey(); |
| | | if (!StringUtils.hasText(orderNo)) { |
| | | throw new ServiceException("导入失败,存在订单编号为空的数据"); |
| | | } |
| | | List<SalesNotShippingImportDto> rowList = entry.getValue(); |
| | | if (CollectionUtils.isEmpty(rowList)) { |
| | | continue; |
| | | } |
| | | SalesNotShippingImportDto first = rowList.get(0); |
| | | SalesLedger exists = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>().eq(SalesLedger::getSalesContractNo, orderNo).last("LIMIT 1")); |
| | | if (exists != null) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]已存在"); |
| | | } |
| | | |
| | | SalesLedger ledger = new SalesLedger(); |
| | | SysUser creatorUser = resolveImportUser(first.getCreator(), userByNickNameMap, userByUserNameMap, "制单员", orderNo); |
| | | ledger.setSalesContractNo(orderNo); |
| | | ledger.setCustomerContractNo(first.getContractNo()); |
| | | ledger.setProjectName(first.getProjectName()); |
| | | ledger.setSalesman(first.getSalesman()); |
| | | Customer customer = getOrCreateImportCustomer(first.getCustomerName(), customerNameMap, hebiRegion.getId()); |
| | | ledger.setCustomerName(customer.getCustomerName()); |
| | | ledger.setRemarks(first.getRemark()); |
| | | ledger.setEntryPerson(String.valueOf(creatorUser.getUserId())); |
| | | ledger.setEntryDate(first.getReportDate()); |
| | | if (first.getReportDate() != null) { |
| | | ledger.setExecutionDate(DateUtils.toLocalDate(first.getReportDate())); |
| | | } |
| | | ledger.setDeliveryDate(first.getDeliveryDeadline() == null ? (first.getReportDate() == null ? LocalDate.now().plusDays(7) : DateUtils.toLocalDate(first.getReportDate()).plusDays(7)) : DateUtils.toLocalDate(first.getDeliveryDeadline())); |
| | | ledger.setDeliveryStatus(1); |
| | | ledger.setStockStatus(0); |
| | | ledger.setReviewStatus(0); |
| | | |
| | | ledger.setCustomerId(customer.getId()); |
| | | ledger.setCustomerContractNo(StringUtils.hasText(ledger.getCustomerContractNo()) ? ledger.getCustomerContractNo() : customer.getTaxpayerIdentificationNumber()); |
| | | |
| | | ledger.setContractAmount(BigDecimal.ZERO); |
| | | salesLedgerMapper.insert(ledger); |
| | | bindImportProcessRoute(ledger.getId(), rowList, routeNameMap, routeItemMap); |
| | | int reviewCount = 0; |
| | | |
| | | BigDecimal contractAmount = BigDecimal.ZERO; |
| | | for (SalesNotShippingImportDto row : rowList) { |
| | | SalesLedgerProduct product = new SalesLedgerProduct(); |
| | | product.setSalesLedgerId(ledger.getId()); |
| | | product.setType(SaleEnum.SALE.getCode()); |
| | | String specificationModel = buildSpecificationModel(row); |
| | | Product importProduct = resolveOrCreateImportProduct(row, productNameMap, finishedGoodsParent, orderNo); |
| | | ProductModel importProductModel = resolveOrCreateImportProductModel(importProduct, specificationModel, row.getGlassThickness(), productModelKeyMap); |
| | | product.setProductCategory(row.getProductSubCategory()); |
| | | product.setSpecificationModel(specificationModel); |
| | | product.setProductId(importProduct.getId()); |
| | | product.setProductModelId(importProductModel.getId()); |
| | | product.setFloorCode(row.getFloorNo()); |
| | | product.setWidth(defaultDecimal(row.getWidth())); |
| | | product.setHeight(defaultDecimal(row.getHeight())); |
| | | product.setQuantity(defaultDecimal(row.getQuantity())); |
| | | product.setActualPieceArea(defaultDecimal(row.getActualSingleArea())); |
| | | product.setActualTotalArea(defaultDecimal(row.getActualTotalArea())); |
| | | product.setSettlePieceArea(defaultDecimal(row.getSettlementSingleArea())); |
| | | product.setSettleTotalArea(defaultDecimal(row.getSettlementTotalArea())); |
| | | product.setTaxInclusiveUnitPrice(defaultDecimal(row.getUnitPrice())); |
| | | product.setPerimeter(defaultDecimal(row.getPerimeter())); |
| | | product.setHeavyBox(defaultDecimal(row.getHeavyBox())); |
| | | product.setProcessRequirement(row.getProcessRequirement()); |
| | | product.setRemark(StringUtils.hasText(row.getAuditRemark()) ? row.getAuditRemark() : row.getRemark()); |
| | | product.setApproveStatus(0); |
| | | product.setProductStockStatus(0); |
| | | product.setRegister(creatorUser.getNickName()); |
| | | product.setRegisterDate(row.getReportDate() == null ? LocalDateTime.now() : LocalDateTime.ofInstant(row.getReportDate().toInstant(), ZoneId.systemDefault())); |
| | | |
| | | BigDecimal qty = defaultDecimal(product.getQuantity()); |
| | | if (qty.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]存在数量小于等于0的数据"); |
| | | // final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); |
| | | // List<String> errorMessages = Collections.synchronizedList(new ArrayList<>()); |
| | | groupedByOrderNo.forEach((orderNo, rowList) -> { |
| | | // SecurityContext originalContext = SecurityContextHolder.getContext(); |
| | | // SecurityContext ctx = SecurityContextHolder.createEmptyContext(); |
| | | // ctx.setAuthentication(authentication); |
| | | // SecurityContextHolder.setContext(ctx); |
| | | try { |
| | | if (!StringUtils.hasText(orderNo)) { |
| | | throw new ServiceException("导入失败,存在订单编号为空的数据"); |
| | | } |
| | | |
| | | BigDecimal lineAmount = defaultDecimal(row.getGlassAmount()).add(defaultDecimal(row.getOtherProcessFee())); |
| | | if (lineAmount.compareTo(BigDecimal.ZERO) <= 0 && product.getTaxInclusiveUnitPrice().compareTo(BigDecimal.ZERO) > 0 && product.getSettleTotalArea().compareTo(BigDecimal.ZERO) > 0) { |
| | | lineAmount = product.getTaxInclusiveUnitPrice().multiply(product.getSettleTotalArea()).setScale(2, RoundingMode.HALF_UP); |
| | | if (CollectionUtils.isEmpty(rowList)) { |
| | | return; |
| | | } |
| | | product.setTaxRate(BigDecimal.ZERO); |
| | | product.setTaxInclusiveTotalPrice(lineAmount); |
| | | product.setTaxExclusiveTotalPrice(lineAmount); |
| | | product.setNoInvoiceNum(qty); |
| | | product.setNoInvoiceAmount(lineAmount); |
| | | product.setPendingInvoiceTotal(lineAmount); |
| | | product.fillRemainingQuantity(); |
| | | salesLedgerProductMapper.insert(product); |
| | | if (StringUtils.isNotEmpty(row.getAuditor())) { |
| | | reviewCount++; |
| | | } |
| | | |
| | | List<SalesLedgerProductProcess> bindProcessList = buildImportProcessBinds(row, processMap); |
| | | if (CollectionUtils.isNotEmpty(bindProcessList)) { |
| | | salesLedgerProductProcessBindService.updateProductProcessBind(bindProcessList, product.getId()); |
| | | } |
| | | |
| | | salesLedgerProductServiceImpl.addProductionData(product); |
| | | contractAmount = contractAmount.add(lineAmount); |
| | | |
| | | if (customer.getCustomerName() != null && customer.getCustomerName().startsWith("补片")) { |
| | | stockUtils.addStock( |
| | | ledger.getId(), |
| | | product.getId(), |
| | | product.getProductModelId(), |
| | | qty, |
| | | StockInQualifiedRecordTypeEnum.SALE_STOCK_IN.getCode(), |
| | | product.getId() |
| | | ); |
| | | stockUtils.substractStock( |
| | | ledger.getId(), |
| | | product.getId(), |
| | | product.getProductModelId(), |
| | | qty, |
| | | StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), |
| | | product.getId() |
| | | ); |
| | | |
| | | StockInRecord inRecord = stockInRecordMapper.selectOne(new LambdaQueryWrapper<StockInRecord>() |
| | | .eq(StockInRecord::getSalesLedgerProductId, product.getId()) |
| | | .orderByDesc(StockInRecord::getId).last("LIMIT 1")); |
| | | if (inRecord != null) { |
| | | String batch = "RK"; |
| | | if (row.getReportDate() != null) { |
| | | String dateStr = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(row.getReportDate()); |
| | | batch += dateStr + "-" + row.getReportDate().getTime(); |
| | | } else { |
| | | batch += System.currentTimeMillis() + "-" + inRecord.getId(); |
| | | } |
| | | inRecord.setInboundBatches(batch); |
| | | if (row.getReportDate() != null) { |
| | | LocalDateTime reportDateTime = LocalDateTime.ofInstant(row.getReportDate().toInstant(), ZoneId.systemDefault()); |
| | | inRecord.setCreateTime(reportDateTime); |
| | | inRecord.setUpdateTime(reportDateTime); |
| | | } |
| | | stockInRecordMapper.updateById(inRecord); |
| | | rowList.sort(Comparator.comparing(r -> buildCategoryProductName(r) + "||" + buildSpecificationModel(r))); |
| | | SalesNotShippingImportDto first = rowList.get(0); |
| | | SalesLedger exists = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>().eq(SalesLedger::getSalesContractNo, orderNo).last("LIMIT 1")); |
| | | if (exists != null) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]已存在"); |
| | | } |
| | | |
| | | StockOutRecord outRecord = stockOutRecordMapper.selectOne(new LambdaQueryWrapper<StockOutRecord>() |
| | | .eq(StockOutRecord::getSalesLedgerProductId, product.getId()) |
| | | .orderByDesc(StockOutRecord::getId).last("LIMIT 1")); |
| | | if (outRecord != null) { |
| | | String batch = "CK"; |
| | | if (row.getReportDate() != null) { |
| | | String dateStr = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(row.getReportDate()); |
| | | batch += dateStr + "-" + row.getReportDate().getTime(); |
| | | } else { |
| | | batch += System.currentTimeMillis() + "-" + outRecord.getId(); |
| | | SalesLedger ledger = new SalesLedger(); |
| | | SysUser creatorUser = resolveImportUser(first.getCreator(), userByNickNameMap, userByUserNameMap, "制单员", orderNo); |
| | | ledger.setSalesContractNo(orderNo); |
| | | ledger.setCustomerContractNo(first.getContractNo()); |
| | | ledger.setProjectName(first.getProjectName()); |
| | | ledger.setSalesman(first.getSalesman()); |
| | | Customer customer = getOrCreateImportCustomer(first.getCustomerName(), customerNameMap, hebiRegion.getId()); |
| | | ledger.setCustomerName(customer.getCustomerName()); |
| | | ledger.setRemarks(first.getRemark()); |
| | | ledger.setEntryPerson(String.valueOf(creatorUser.getUserId())); |
| | | ledger.setEntryDate(first.getReportDate()); |
| | | if (first.getReportDate() != null) { |
| | | ledger.setExecutionDate(DateUtils.toLocalDate(first.getReportDate())); |
| | | } |
| | | ledger.setDeliveryDate(first.getDeliveryDeadline() == null ? (first.getReportDate() == null ? LocalDate.now().plusDays(7) : DateUtils.toLocalDate(first.getReportDate()).plusDays(7)) : DateUtils.toLocalDate(first.getDeliveryDeadline())); |
| | | ledger.setDeliveryStatus(1); |
| | | ledger.setStockStatus(0); |
| | | ledger.setReviewStatus(0); |
| | | |
| | | ledger.setCustomerId(customer.getId()); |
| | | ledger.setCustomerContractNo(StringUtils.hasText(ledger.getCustomerContractNo()) ? ledger.getCustomerContractNo() : customer.getTaxpayerIdentificationNumber()); |
| | | |
| | | ledger.setContractAmount(BigDecimal.ZERO); |
| | | salesLedgerMapper.insert(ledger); |
| | | |
| | | int randomCycleDays = 6 + new java.util.Random().nextInt(3); // 6, 7, 8 |
| | | Date reportDate = rowList.get(0).getReportDate(); |
| | | bindImportProcessRoute(ledger.getId(), rowList, routeNameMap, finalRouteItemMap, reportDate, randomCycleDays); |
| | | int reviewCount = 0; |
| | | |
| | | BigDecimal contractAmount = BigDecimal.ZERO; |
| | | for (SalesNotShippingImportDto row : rowList) { |
| | | SalesLedgerProduct product = new SalesLedgerProduct(); |
| | | product.setSalesLedgerId(ledger.getId()); |
| | | product.setType(SaleEnum.SALE.getCode()); |
| | | String specificationModel = buildSpecificationModel(row); |
| | | Product importProduct = resolveOrCreateImportProduct(row, productNameMap, finalFinishedGoodsParent, orderNo); |
| | | ProductModel importProductModel = resolveOrCreateImportProductModel(importProduct, specificationModel, row.getGlassThickness(), productModelKeyMap); |
| | | product.setProductCategory(row.getProductSubCategory()); |
| | | product.setSpecificationModel(specificationModel); |
| | | product.setProductId(importProduct.getId()); |
| | | product.setProductModelId(importProductModel.getId()); |
| | | product.setFloorCode(row.getFloorNo()); |
| | | product.setWidth(defaultDecimal(row.getWidth())); |
| | | product.setHeight(defaultDecimal(row.getHeight())); |
| | | product.setQuantity(defaultDecimal(row.getQuantity())); |
| | | product.setActualPieceArea(defaultDecimal(row.getActualSingleArea())); |
| | | product.setActualTotalArea(defaultDecimal(row.getActualTotalArea())); |
| | | product.setSettlePieceArea(defaultDecimal(row.getSettlementSingleArea())); |
| | | product.setSettleTotalArea(defaultDecimal(row.getSettlementTotalArea())); |
| | | product.setTaxInclusiveUnitPrice(defaultDecimal(row.getUnitPrice())); |
| | | product.setPerimeter(defaultDecimal(row.getPerimeter())); |
| | | product.setHeavyBox(defaultDecimal(row.getHeavyBox())); |
| | | product.setProcessRequirement(row.getProcessRequirement()); |
| | | product.setRemark(StringUtils.hasText(row.getAuditRemark()) ? row.getAuditRemark() : row.getRemark()); |
| | | product.setApproveStatus(0); |
| | | product.setProductStockStatus(0); |
| | | product.setRegister(creatorUser.getNickName()); |
| | | product.setRegisterDate(row.getReportDate() == null ? LocalDateTime.now() : LocalDateTime.ofInstant(row.getReportDate().toInstant(), ZoneId.systemDefault())); |
| | | |
| | | BigDecimal qty = defaultDecimal(product.getQuantity()); |
| | | if (qty.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]存在数量小于等于0的数据"); |
| | | } |
| | | outRecord.setOutboundBatches(batch); |
| | | if (row.getReportDate() != null) { |
| | | LocalDateTime reportDateTime = LocalDateTime.ofInstant(row.getReportDate().toInstant(), ZoneId.systemDefault()); |
| | | outRecord.setCreateTime(reportDateTime); |
| | | outRecord.setUpdateTime(reportDateTime); |
| | | |
| | | BigDecimal lineAmount = defaultDecimal(row.getGlassAmount()).add(defaultDecimal(row.getOtherProcessFee())); |
| | | if (lineAmount.compareTo(BigDecimal.ZERO) <= 0 && product.getTaxInclusiveUnitPrice().compareTo(BigDecimal.ZERO) > 0 && product.getSettleTotalArea().compareTo(BigDecimal.ZERO) > 0) { |
| | | lineAmount = product.getTaxInclusiveUnitPrice().multiply(product.getSettleTotalArea()).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | stockOutRecordMapper.updateById(outRecord); |
| | | product.setTaxRate(BigDecimal.ZERO); |
| | | product.setTaxInclusiveTotalPrice(lineAmount); |
| | | product.setTaxExclusiveTotalPrice(lineAmount); |
| | | product.setNoInvoiceNum(qty); |
| | | product.setNoInvoiceAmount(lineAmount); |
| | | product.setPendingInvoiceTotal(lineAmount); |
| | | product.fillRemainingQuantity(); |
| | | salesLedgerProductMapper.insert(product); |
| | | if (StringUtils.isNotEmpty(row.getAuditor())) { |
| | | reviewCount++; |
| | | } |
| | | |
| | | List<SalesLedgerProductProcess> bindProcessList = buildImportProcessBinds(row, processMap); |
| | | if (CollectionUtils.isNotEmpty(bindProcessList)) { |
| | | salesLedgerProductProcessBindService.updateProductProcessBind(bindProcessList, product.getId()); |
| | | } |
| | | |
| | | // 本项目无生产模块,无需向 ProductOrder 表中新增数据 |
| | | // salesLedgerProductServiceImpl.addProductionData(product); |
| | | contractAmount = contractAmount.add(lineAmount); |
| | | |
| | | boolean skipInboundAndShipping = false; |
| | | if (customer.getCustomerName() != null && customer.getCustomerName().startsWith("补片")) { |
| | | if (ledger.getEntryDate() != null) { |
| | | java.time.LocalDate entryDate = com.ruoyi.common.utils.DateUtils.toLocalDate(ledger.getEntryDate()); |
| | | if (entryDate.plusDays(7).isAfter(java.time.LocalDate.now())) { |
| | | skipInboundAndShipping = true; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (customer.getCustomerName() != null && customer.getCustomerName().startsWith("补片") && !skipInboundAndShipping) { |
| | | Long inspectId = createNotShippingQualityInspect(ledger, product, row, qty); |
| | | stockUtils.addStock( |
| | | ledger.getId(), |
| | | product.getId(), |
| | | product.getProductModelId(), |
| | | qty, |
| | | StockInQualifiedRecordTypeEnum.SALE_QC_OK_IN.getCode(), |
| | | inspectId != null ? inspectId : product.getId() |
| | | ); |
| | | stockUtils.substractStock( |
| | | ledger.getId(), |
| | | product.getId(), |
| | | product.getProductModelId(), |
| | | qty, |
| | | StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), |
| | | product.getId() |
| | | ); |
| | | |
| | | StockInRecord inRecord = stockInRecordMapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<StockInRecord>() |
| | | .eq(StockInRecord::getSalesLedgerProductId, product.getId()) |
| | | .orderByDesc(StockInRecord::getId).last("LIMIT 1")); |
| | | if (inRecord != null) { |
| | | String batch = "RK"; |
| | | if (row.getReportDate() != null) { |
| | | String dateStr = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(row.getReportDate()); |
| | | batch += dateStr + "-" + row.getReportDate().getTime(); |
| | | } else { |
| | | batch += System.currentTimeMillis() + "-" + inRecord.getId(); |
| | | } |
| | | inRecord.setInboundBatches(batch); |
| | | if (row.getReportDate() != null) { |
| | | java.time.LocalDateTime reportDateTime = java.time.LocalDateTime.ofInstant(row.getReportDate().toInstant(), java.time.ZoneId.systemDefault()); |
| | | inRecord.setCreateTime(reportDateTime); |
| | | inRecord.setUpdateTime(reportDateTime); |
| | | } |
| | | stockInRecordMapper.updateById(inRecord); |
| | | } |
| | | |
| | | StockOutRecord outRecord = stockOutRecordMapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<StockOutRecord>() |
| | | .eq(StockOutRecord::getSalesLedgerProductId, product.getId()) |
| | | .orderByDesc(StockOutRecord::getId).last("LIMIT 1")); |
| | | if (outRecord != null) { |
| | | String batch = "CK"; |
| | | if (row.getReportDate() != null) { |
| | | String dateStr = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(row.getReportDate()); |
| | | batch += dateStr + "-" + row.getReportDate().getTime(); |
| | | } else { |
| | | batch += System.currentTimeMillis() + "-" + outRecord.getId(); |
| | | } |
| | | outRecord.setOutboundBatches(batch); |
| | | if (row.getReportDate() != null) { |
| | | LocalDateTime reportDateTime = LocalDateTime.ofInstant(row.getReportDate().toInstant(), ZoneId.systemDefault()); |
| | | outRecord.setCreateTime(reportDateTime); |
| | | outRecord.setUpdateTime(reportDateTime); |
| | | } |
| | | stockOutRecordMapper.updateById(outRecord); |
| | | } |
| | | |
| | | product.setStockedQuantity(qty); |
| | | product.setShippedQuantity(qty); |
| | | product.setApproveStatus(3); |
| | | updateProductStockStatus(product); |
| | | product.fillRemainingQuantity(); |
| | | updateProductShipStatus(product); |
| | | salesLedgerProductMapper.updateById(product); |
| | | |
| | | ShippingInfo shippingInfo = new ShippingInfo(); |
| | | shippingInfo.setSalesLedgerId(ledger.getId()); |
| | | shippingInfo.setSalesLedgerProductId(product.getId()); |
| | | shippingInfo.setStatus("已发货"); |
| | | if (row.getReportDate() != null) { |
| | | String dateStr = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(row.getReportDate()); |
| | | shippingInfo.setShippingNo("CK" + dateStr + "-" + row.getReportDate().getTime()); |
| | | } else { |
| | | shippingInfo.setShippingNo("CK" + System.currentTimeMillis()); |
| | | } |
| | | shippingInfo.setType("货车"); |
| | | shippingInfo.setShippingCarNumber("无"); |
| | | shippingInfo.setShippingDate(row.getReportDate()); |
| | | shippingInfoMapper.insert(shippingInfo); |
| | | // createNotShippingQualityInspect moved up |
| | | } |
| | | } |
| | | |
| | | product.setStockedQuantity(qty); |
| | | product.setShippedQuantity(qty); |
| | | product.setApproveStatus(3); |
| | | updateProductStockStatus(product); |
| | | product.fillRemainingQuantity(); |
| | | updateProductShipStatus(product); |
| | | salesLedgerProductMapper.updateById(product); |
| | | |
| | | ShippingInfo shippingInfo = new ShippingInfo(); |
| | | shippingInfo.setSalesLedgerId(ledger.getId()); |
| | | shippingInfo.setSalesLedgerProductId(product.getId()); |
| | | shippingInfo.setStatus("已发货"); |
| | | if (row.getReportDate() != null) { |
| | | String dateStr = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(row.getReportDate()); |
| | | shippingInfo.setShippingNo("CK" + dateStr + "-" + row.getReportDate().getTime()); |
| | | } else { |
| | | shippingInfo.setShippingNo("CK" + System.currentTimeMillis()); |
| | | ledger.setContractAmount(contractAmount); |
| | | if (reviewCount == rowList.size()) { |
| | | ledger.setReviewStatus(1); |
| | | } |
| | | shippingInfo.setType("货车"); |
| | | shippingInfo.setShippingCarNumber("无"); |
| | | shippingInfo.setShippingDate(row.getReportDate()); |
| | | shippingInfoMapper.insert(shippingInfo); |
| | | |
| | | if (customer.getCustomerName() != null && customer.getCustomerName().startsWith("补片")) { |
| | | List<SalesLedgerProduct> latestProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>().eq(SalesLedgerProduct::getSalesLedgerId, ledger.getId()).eq(SalesLedgerProduct::getType, SaleEnum.SALE.getCode())); |
| | | boolean allShipped = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().allMatch(p -> { |
| | | BigDecimal pQty = defaultDecimal(p.getQuantity()); |
| | | BigDecimal shipped = defaultDecimal(p.getShippedQuantity()); |
| | | return shipped.compareTo(pQty) >= 0; |
| | | }); |
| | | boolean anyInbound = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().anyMatch(p -> defaultDecimal(p.getStockedQuantity()).compareTo(BigDecimal.ZERO) > 0); |
| | | boolean allInbound = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().allMatch(p -> { |
| | | BigDecimal pQty = defaultDecimal(p.getQuantity()); |
| | | BigDecimal stocked = defaultDecimal(p.getStockedQuantity()); |
| | | return pQty.compareTo(BigDecimal.ZERO) <= 0 || stocked.compareTo(pQty) >= 0; |
| | | }); |
| | | if (allShipped && rowList.get(0).getReportDate() != null) { |
| | | ledger.setDeliveryDate(DateUtils.toLocalDate(rowList.get(0).getReportDate())); |
| | | } |
| | | ledger.setStockStatus(allInbound ? 2 : (anyInbound ? 1 : 0)); |
| | | ledger.setDeliveryStatus(allShipped ? 5 : 1); |
| | | |
| | | Long entryUserId = StringUtils.hasText(ledger.getEntryPerson()) ? Long.parseLong(ledger.getEntryPerson()) : 1L; |
| | | Long entryDeptId = 1L; |
| | | if (StringUtils.hasText(ledger.getEntryPerson())) { |
| | | try { |
| | | SysUser entryUser = sysUserMapper.selectById(ledger.getEntryPerson()); |
| | | if (entryUser != null && entryUser.getDeptId() != null) { |
| | | entryDeptId = entryUser.getDeptId(); |
| | | } |
| | | } catch (Exception ignored) { |
| | | } |
| | | } |
| | | String reportDateStr = rowList.get(0).getReportDate() != null ? new java.text.SimpleDateFormat("yyyy-MM-dd").format(rowList.get(0).getReportDate()) : LocalDate.now().toString(); |
| | | |
| | | try { |
| | | String productIds = latestProducts.stream().map(p -> String.valueOf(p.getId())).collect(Collectors.joining(",")); |
| | | String inboundApproveUserIds = resolveApproveUserIds(null, ledger.getId(), INBOUND_BIZ_TYPE_WEB); |
| | | if (StringUtils.isEmpty(inboundApproveUserIds)) { |
| | | inboundApproveUserIds = "1"; |
| | | } |
| | | |
| | | ApproveProcessVO stockInVo = new ApproveProcessVO(); |
| | | stockInVo.setApproveType(ApproveTypeEnum.STOCK_IN.getCode()); |
| | | stockInVo.setApproveDeptId(208L); |
| | | stockInVo.setApproveReason("入库审批:" + ledger.getSalesContractNo()); |
| | | stockInVo.setApproveRemark("salesStock:" + ledger.getId() + ":" + productIds); |
| | | stockInVo.setApproveUserIds(inboundApproveUserIds); |
| | | stockInVo.setApproveUser(entryUserId); |
| | | stockInVo.setApproveTime(reportDateStr); |
| | | approveProcessService.addApprove(stockInVo); |
| | | |
| | | ApproveProcess savedStockIn = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>() |
| | | .eq(ApproveProcess::getApproveReason, stockInVo.getApproveReason()) |
| | | .eq(ApproveProcess::getApproveType, stockInVo.getApproveType()) |
| | | .orderByDesc(ApproveProcess::getId).last("LIMIT 1")); |
| | | if (savedStockIn != null) { |
| | | savedStockIn.setApproveStatus(2); |
| | | savedStockIn.setApproveOverTime(rowList.get(0).getReportDate()); |
| | | approveProcessService.updateById(savedStockIn); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("自动生成入库审批申请失败", e); |
| | | } |
| | | |
| | | try { |
| | | ApproveProcessVO deliveryVo = new ApproveProcessVO(); |
| | | deliveryVo.setApproveType(ApproveTypeEnum.DELIVERY.getCode()); |
| | | deliveryVo.setApproveDeptId(208L); |
| | | deliveryVo.setApproveReason("发货审批:" + ledger.getSalesContractNo()); |
| | | deliveryVo.setApproveUserIds("1"); |
| | | deliveryVo.setApproveUser(entryUserId); |
| | | deliveryVo.setApproveTime(reportDateStr); |
| | | approveProcessService.addApprove(deliveryVo); |
| | | |
| | | ApproveProcess savedDelivery = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>() |
| | | .eq(ApproveProcess::getApproveReason, deliveryVo.getApproveReason()) |
| | | .eq(ApproveProcess::getApproveType, deliveryVo.getApproveType()) |
| | | .orderByDesc(ApproveProcess::getId).last("LIMIT 1")); |
| | | if (savedDelivery != null) { |
| | | savedDelivery.setApproveStatus(2); |
| | | savedDelivery.setApproveOverTime(rowList.get(0).getReportDate()); |
| | | approveProcessService.updateById(savedDelivery); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("自动生成发货审批申请失败", e); |
| | | } |
| | | |
| | | try { |
| | | AfterSalesServiceNewDto afterSalesDto = new AfterSalesServiceNewDto(); |
| | | afterSalesDto.setSalesLedgerId(ledger.getId()); |
| | | afterSalesDto.setCustomerName(customer.getCustomerName()); |
| | | afterSalesDto.setCheckUserId(creatorUser.getUserId()); |
| | | afterSalesDto.setProDesc("出现刮痕"); |
| | | |
| | | List<AfterSalesProductDto> afterSalesProducts = new ArrayList<>(); |
| | | List<Long> productModelIdList = new ArrayList<>(); |
| | | for (SalesLedgerProduct p : latestProducts) { |
| | | AfterSalesProductDto productDto = new AfterSalesProductDto(); |
| | | productDto.setId(p.getId()); |
| | | productDto.setAfterSalesQuantity(defaultDecimal(p.getQuantity())); |
| | | afterSalesProducts.add(productDto); |
| | | if (p.getProductModelId() != null) { |
| | | productModelIdList.add(p.getProductModelId()); |
| | | } |
| | | } |
| | | afterSalesDto.setAfterSalesProductList(afterSalesProducts); |
| | | afterSalesDto.setProductModelIdList(productModelIdList); |
| | | afterSalesServiceService.addAfterSalesServiceDto(afterSalesDto); |
| | | } catch (Exception e) { |
| | | log.error("自动生成售后记录及通知失败", e); |
| | | } |
| | | } |
| | | |
| | | salesLedgerMapper.updateById(ledger); |
| | | } catch (Exception e) { |
| | | log.error("订单 {} 未发货记录导入失败", orderNo, e); |
| | | // errorMessages.add("订单 [" + orderNo + "] 导入失败: " + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | ledger.setContractAmount(contractAmount); |
| | | if (reviewCount == rowList.size()) { |
| | | ledger.setReviewStatus(1); |
| | | } |
| | | |
| | | if (customer.getCustomerName() != null && customer.getCustomerName().startsWith("补片")) { |
| | | List<SalesLedgerProduct> latestProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>().eq(SalesLedgerProduct::getSalesLedgerId, ledger.getId()).eq(SalesLedgerProduct::getType, SaleEnum.SALE.getCode())); |
| | | boolean allShipped = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().allMatch(p -> { |
| | | BigDecimal pQty = defaultDecimal(p.getQuantity()); |
| | | BigDecimal shipped = defaultDecimal(p.getShippedQuantity()); |
| | | return shipped.compareTo(pQty) >= 0; |
| | | }); |
| | | boolean anyInbound = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().anyMatch(p -> defaultDecimal(p.getStockedQuantity()).compareTo(BigDecimal.ZERO) > 0); |
| | | boolean allInbound = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().allMatch(p -> { |
| | | BigDecimal pQty = defaultDecimal(p.getQuantity()); |
| | | BigDecimal stocked = defaultDecimal(p.getStockedQuantity()); |
| | | return pQty.compareTo(BigDecimal.ZERO) <= 0 || stocked.compareTo(pQty) >= 0; |
| | | }); |
| | | if (allShipped && rowList.get(0).getReportDate() != null) { |
| | | ledger.setDeliveryDate(DateUtils.toLocalDate(rowList.get(0).getReportDate())); |
| | | } |
| | | ledger.setStockStatus(allInbound ? 2 : (anyInbound ? 1 : 0)); |
| | | ledger.setDeliveryStatus(allShipped ? 5 : 1); |
| | | ledger.setOrderStatus(1); |
| | | } |
| | | |
| | | salesLedgerMapper.updateById(ledger); |
| | | } |
| | | // SecurityContextHolder.setContext(originalContext); |
| | | }); |
| | | // if (!errorMessages.isEmpty()) { |
| | | // throw new ServiceException("部分数据导入失败:\n" + String.join("\n", errorMessages)); |
| | | // } |
| | | } |
| | | |
| | | private List<SalesLedgerProductProcess> buildImportProcessBinds(SalesNotShippingImportDto row, Map<String, SalesLedgerProductProcess> processMap) { |
| | |
| | | SalesLedgerProductProcess bind = new SalesLedgerProductProcess(); |
| | | bind.setId(process.getId()); |
| | | bind.setQuantity(entry.getValue()); |
| | | bind.setUnitPrice(process.getUnitPrice()); |
| | | result.add(bind); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | private void bindImportProcessRoute(Long salesLedgerId, List<SalesNotShippingImportDto> rowList, Map<String, ProcessRoute> routeNameMap, Map<Long, List<ProcessRouteItem>> routeItemMap) { |
| | | private void bindImportProcessRoute(Long salesLedgerId, List<SalesNotShippingImportDto> rowList, Map<String, ProcessRoute> routeNameMap, Map<Long, List<ProcessRouteItem>> routeItemMap, Date reportDate, int randomCycleDays) { |
| | | String flowKey = rowList.stream().map(SalesNotShippingImportDto::getProcessFlow).filter(StringUtils::hasText).map(this::normalizeRouteFlowKey).filter(StringUtils::hasText).findFirst().orElse(""); |
| | | if (!StringUtils.hasText(flowKey)) { |
| | | throw new ServiceException("导入失败,订单工艺流程不能为空"); |
| | |
| | | bindList.add(bind); |
| | | } |
| | | salesLedgerProcessRouteService.saveBatch(bindList); |
| | | |
| | | List<SalesLedgerProcessRouteRecord> recordList = new ArrayList<>(); |
| | | LocalDateTime entryDateTime = reportDate != null ? LocalDateTime.ofInstant(reportDate.toInstant(), ZoneId.systemDefault()) : LocalDateTime.now(); |
| | | int totalItems = routeItems.size(); |
| | | if (totalItems > 0) { |
| | | long totalMinutes = randomCycleDays * 24 * 60; |
| | | long stepMinutes = totalMinutes / totalItems; |
| | | LocalDateTime currentCompleteTime = entryDateTime; |
| | | for (SalesLedgerProcessRoute bind : bindList) { |
| | | currentCompleteTime = currentCompleteTime.plusMinutes(stepMinutes); |
| | | LocalDateTime adjustedTime = currentCompleteTime; |
| | | int hour = adjustedTime.getHour(); |
| | | if (hour < 10) { |
| | | adjustedTime = adjustedTime.withHour(10).withMinute(10); |
| | | } else if (hour >= 12 && hour < 14) { |
| | | adjustedTime = adjustedTime.withHour(14).withMinute(10); |
| | | } else if (hour > 18 || (hour == 18 && adjustedTime.getMinute() > 30)) { |
| | | adjustedTime = adjustedTime.plusDays(1).withHour(10).withMinute(10); |
| | | } |
| | | if (!recordList.isEmpty()) { |
| | | LocalDateTime prevTime = recordList.get(recordList.size() - 1).getCompletedTime(); |
| | | if (!adjustedTime.isAfter(prevTime)) { |
| | | adjustedTime = prevTime.plusMinutes(15); |
| | | int newHour = adjustedTime.getHour(); |
| | | if (newHour == 12 || newHour == 13) { |
| | | adjustedTime = adjustedTime.withHour(14).withMinute(0); |
| | | } else if (newHour > 18 || (newHour == 18 && adjustedTime.getMinute() > 30)) { |
| | | adjustedTime = adjustedTime.plusDays(1).withHour(10).withMinute(0); |
| | | } |
| | | } |
| | | } |
| | | currentCompleteTime = adjustedTime; |
| | | SalesLedgerProcessRouteRecord record = new SalesLedgerProcessRouteRecord(); |
| | | record.setSalesLedgerId(salesLedgerId); |
| | | record.setSalesLedgerProcessRouteId(bind.getId()); |
| | | record.setIsCompleted(1); |
| | | record.setCompletedTime(currentCompleteTime); |
| | | record.setCreateTime(currentCompleteTime); |
| | | recordList.add(record); |
| | | } |
| | | salesLedgerProcessRouteRecordService.saveBatch(recordList); |
| | | } |
| | | } |
| | | |
| | | private ProcessRoute createImportProcessRoute(String flowKey, Map<String, ProcessRoute> routeNameMap, Map<Long, List<ProcessRouteItem>> routeItemMap) { |
| | |
| | | if (CollectionUtils.isEmpty(processNames)) { |
| | | throw new ServiceException("导入失败,工艺路线[" + flowKey + "]解析失败"); |
| | | } |
| | | synchronized (("ROUTE_" + flowKey).intern()) { |
| | | ProcessRoute exists = routeNameMap.get(flowKey); |
| | | if (exists != null && exists.getId() != null) { |
| | | return exists; |
| | | } |
| | | ProcessRoute route = new ProcessRoute(); |
| | | route.setProductModelId(0L); |
| | | route.setProcessRouteName(flowKey); |
| | |
| | | routeNameMap.put(flowKey, route); |
| | | routeItemMap.put(route.getId(), routeItems); |
| | | return route; |
| | | } |
| | | } |
| | | |
| | | private void mergeProcessQuantity(Map<String, Integer> processQuantityMap, String processName, Integer quantity) { |
| | |
| | | if (exists != null && exists.getId() != null) { |
| | | return exists; |
| | | } |
| | | synchronized (("CUSTOMER_" + key).intern()) { |
| | | exists = customerNameMap.get(key); |
| | | if (exists != null && exists.getId() != null) { |
| | | return exists; |
| | | } |
| | | Customer customer = new Customer(); |
| | | customer.setCustomerName(key); |
| | | customer.setRegionsId(hebiRegionId); |
| | | customerMapper.insert(customer); |
| | | customerNameMap.put(key, customer); |
| | | return customer; |
| | | } |
| | | } |
| | | |
| | | private Product resolveOrCreateImportProduct(SalesNotShippingImportDto row, Map<String, Product> productNameMap, Product finishedGoodsParent, String orderNo) { |
| | |
| | | if (!StringUtils.hasText(newProductName)) { |
| | | throw new ServiceException("导入失败,订单编号[" + orderNo + "]产品名称和产品分类均为空"); |
| | | } |
| | | synchronized (("PRODUCT_" + newProductName).intern()) { |
| | | Product product = productNameMap.get(newProductName); |
| | | if (product != null && product.getId() != null) { |
| | | return product; |
| | | } |
| | | Product created = new Product(); |
| | | created.setParentId(finishedGoodsParent == null ? null : finishedGoodsParent.getId()); |
| | | created.setProductName(newProductName); |
| | | productMapper.insert(created); |
| | | productNameMap.put(newProductName, created); |
| | | return created; |
| | | } |
| | | } |
| | | |
| | | private ProductModel resolveOrCreateImportProductModel(Product product, String modelName, BigDecimal thickness, Map<String, ProductModel> productModelKeyMap) { |
| | |
| | | if (exists != null && exists.getId() != null) { |
| | | return exists; |
| | | } |
| | | synchronized (("MODEL_" + key).intern()) { |
| | | exists = productModelKeyMap.get(key); |
| | | if (exists != null && exists.getId() != null) { |
| | | return exists; |
| | | } |
| | | ProductModel created = new ProductModel(); |
| | | created.setProductId(product.getId()); |
| | | created.setModel(modelName.trim()); |
| | |
| | | productModelMapper.insert(created); |
| | | productModelKeyMap.put(key, created); |
| | | return created; |
| | | } |
| | | } |
| | | |
| | | private String buildSpecificationModel(SalesNotShippingImportDto row) { |
| | | if (StringUtils.hasText(row.getProductName())) { |
| | | return row.getProductName().trim(); |
| | | } |
| | | if (StringUtils.hasText(row.getProductSubCategory())) { |
| | | return row.getProductSubCategory().trim(); |
| | | } |
| | | if (StringUtils.hasText(row.getProductCategory())) { |
| | | return row.getProductCategory().trim(); |
| | | } |
| | | return ""; |
| | | } |
| | | |
| | | private String buildSpecificationModel(SalesShippingImportDto row) { |
| | | if (StringUtils.hasText(row.getProductName())) { |
| | | return row.getProductName().trim(); |
| | | } |
| | |
| | | return ledgerId + "|" + subCategory + "|" + shippingNo + "|" + dateStr + "|" + defaultDecimal(row.getQuantity()) + "|" + sequence; |
| | | } |
| | | |
| | | private void createShippingQualityInspect(SalesLedger ledger, SalesLedgerProduct dbProduct, SalesShippingImportDto row, BigDecimal inspectQty) { |
| | | private Long createShippingQualityInspect(SalesLedger ledger, SalesLedgerProduct dbProduct, SalesShippingImportDto row, BigDecimal inspectQty) { |
| | | if (ledger == null || dbProduct == null || inspectQty == null || inspectQty.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return; |
| | | return null; |
| | | } |
| | | Date checkDate = row.getReportDate() != null ? row.getReportDate() : new Date(); |
| | | QualityInspect qualityInspect = new QualityInspect(); |
| | | qualityInspect.setInspectType(2); |
| | | qualityInspect.setPurchaseLedgerId(dbProduct.getId()); |
| | | qualityInspect.setCheckTime(checkDate); |
| | | qualityInspect.setCustomer(StringUtils.hasText(ledger.getCustomerName()) ? ledger.getCustomerName() : row.getCustomerName()); |
| | | qualityInspect.setCheckName(StringUtils.hasText(row.getCreator()) ? row.getCreator().trim() : null); |
| | |
| | | |
| | | QualityTestStandard selectedStandard = null; |
| | | if (dbProduct.getProductId() != null) { |
| | | List<QualityTestStandard> standards = qualityTestStandardMapper.getQualityTestStandardByProductId(dbProduct.getProductId(), 2, null); |
| | | List<QualityTestStandard> standards = qualityTestStandardMapper.getQualityTestStandardByProductId(dbProduct.getProductId(), 2); |
| | | if (CollectionUtils.isNotEmpty(standards)) { |
| | | selectedStandard = standards.get(0); |
| | | qualityInspect.setTestStandardId(selectedStandard.getId()); |
| | |
| | | } |
| | | qualityInspectMapper.insert(qualityInspect); |
| | | |
| | | if (row.getReportDate() != null) { |
| | | LocalDateTime reportDateTime = LocalDateTime.ofInstant(row.getReportDate().toInstant(), ZoneId.systemDefault()); |
| | | qualityInspect.setCreateTime(reportDateTime); |
| | | qualityInspect.setUpdateTime(reportDateTime); |
| | | qualityInspectMapper.updateById(qualityInspect); |
| | | } |
| | | |
| | | if (selectedStandard == null || selectedStandard.getId() == null) { |
| | | return; |
| | | return qualityInspect.getId(); |
| | | } |
| | | List<QualityTestStandardParam> standardParams = qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId, selectedStandard.getId())); |
| | | if (CollectionUtils.isEmpty(standardParams)) { |
| | | return; |
| | | return qualityInspect.getId(); |
| | | } |
| | | List<QualityInspectParam> inspectParams = standardParams.stream().map(item -> { |
| | | QualityInspectParam param = new QualityInspectParam(); |
| | |
| | | return param; |
| | | }).collect(Collectors.toList()); |
| | | inspectParams.forEach(qualityInspectParamMapper::insert); |
| | | return qualityInspect.getId(); |
| | | } |
| | | |
| | | private Long createNotShippingQualityInspect(SalesLedger ledger, SalesLedgerProduct dbProduct, SalesNotShippingImportDto row, BigDecimal inspectQty) { |
| | | if (ledger == null || dbProduct == null || inspectQty == null || inspectQty.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return null; |
| | | } |
| | | Date checkDate = row.getReportDate() != null ? row.getReportDate() : new Date(); |
| | | QualityInspect qualityInspect = new QualityInspect(); |
| | | qualityInspect.setInspectType(2); |
| | | qualityInspect.setPurchaseLedgerId(dbProduct.getId()); |
| | | qualityInspect.setCheckTime(checkDate); |
| | | qualityInspect.setCustomer(StringUtils.hasText(ledger.getCustomerName()) ? ledger.getCustomerName() : row.getCustomerName()); |
| | | qualityInspect.setCheckName(StringUtils.hasText(row.getCreator()) ? row.getCreator().trim() : null); |
| | | qualityInspect.setProductId(dbProduct.getProductId()); |
| | | qualityInspect.setProductName(dbProduct.getProductCategory()); |
| | | qualityInspect.setModel(dbProduct.getSpecificationModel()); |
| | | qualityInspect.setUnit(resolveInspectUnit(dbProduct)); |
| | | qualityInspect.setQuantity(inspectQty); |
| | | qualityInspect.setQualifiedQuantity(inspectQty); |
| | | qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO); |
| | | qualityInspect.setPassRate(BigDecimal.valueOf(100)); |
| | | qualityInspect.setCheckResult("合格"); |
| | | qualityInspect.setInspectState(1); |
| | | qualityInspect.setApprovalStatus(1); |
| | | qualityInspect.setProductModelId(dbProduct.getProductModelId()); |
| | | |
| | | QualityTestStandard selectedStandard = null; |
| | | if (dbProduct.getProductId() != null) { |
| | | List<QualityTestStandard> standards = qualityTestStandardMapper.getQualityTestStandardByProductId(dbProduct.getProductId(), 2); |
| | | if (CollectionUtils.isNotEmpty(standards)) { |
| | | selectedStandard = standards.get(0); |
| | | qualityInspect.setTestStandardId(selectedStandard.getId()); |
| | | } |
| | | } |
| | | qualityInspectMapper.insert(qualityInspect); |
| | | |
| | | if (row.getReportDate() != null) { |
| | | LocalDateTime reportDateTime = LocalDateTime.ofInstant(row.getReportDate().toInstant(), ZoneId.systemDefault()); |
| | | qualityInspect.setCreateTime(reportDateTime); |
| | | qualityInspect.setUpdateTime(reportDateTime); |
| | | qualityInspectMapper.updateById(qualityInspect); |
| | | } |
| | | |
| | | if (selectedStandard == null || selectedStandard.getId() == null) { |
| | | return qualityInspect.getId(); |
| | | } |
| | | List<QualityTestStandardParam> standardParams = qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId, selectedStandard.getId())); |
| | | if (CollectionUtils.isEmpty(standardParams)) { |
| | | return qualityInspect.getId(); |
| | | } |
| | | List<QualityInspectParam> inspectParams = standardParams.stream().map(item -> { |
| | | QualityInspectParam param = new QualityInspectParam(); |
| | | param.setInspectId(qualityInspect.getId()); |
| | | param.setParameterItem(item.getParameterItem()); |
| | | param.setUnit(item.getUnit()); |
| | | param.setStandardValue(item.getStandardValue()); |
| | | param.setControlValue(item.getControlValue()); |
| | | param.setTestValue("无瑕疵"); |
| | | return param; |
| | | }).collect(Collectors.toList()); |
| | | inspectParams.forEach(qualityInspectParamMapper::insert); |
| | | return qualityInspect.getId(); |
| | | } |
| | | |
| | | private String resolveInspectUnit(SalesLedgerProduct dbProduct) { |
| | |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | ApproveProcessVO approveProcessVO = new ApproveProcessVO(); |
| | | approveProcessVO.setApproveType(7); |
| | | approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); |
| | | approveProcessVO.setApproveDeptId(208L); |
| | | approveProcessVO.setApproveReason("发货审批:" + salesLedger.getSalesContractNo()); |
| | | approveProcessVO.setApproveRemark(remarkJson); |
| | | approveProcessVO.setApproveUserIds(dto.getApproveUserIds().trim()); |
| | |
| | | // 5. 取消审批流程 |
| | | cancelApproveProcesses(id, originalLedger.getSalesContractNo()); |
| | | |
| | | // 6. 重新生成:创建新台账副本 |
| | | // 6. 重新生成:此处不直接在后端入库,而是返回原单据ID给前端 |
| | | // 前端拿到ID后会获取原单据详情并跳转到新增页面(带入预填数据),由用户在页面上编辑后统一新增,以避免数据重复生成 |
| | | if (dto.getCounterReviewType() == 2) { |
| | | SalesLedger newLedger = new SalesLedger(); |
| | | BeanUtils.copyProperties(originalLedger, newLedger); |
| | | newLedger.setId(null); |
| | | newLedger.setSalesContractNo(generateSalesContractNo()); |
| | | newLedger.setDeliveryStatus(1); |
| | | newLedger.setStockStatus(0); |
| | | newLedger.setReviewStatus(0); |
| | | newLedger.setCounterReviewTime(null); |
| | | newLedger.setCounterReviewPerson(null); |
| | | newLedger.setCounterReviewPersonId(null); |
| | | newLedger.setCounterReviewType(null); |
| | | newLedger.setCounterReviewDesc(null); |
| | | salesLedgerMapper.insert(newLedger); |
| | | |
| | | // 复制产品到新台账 |
| | | List<SalesLedgerProduct> originalProducts = salesLedgerProductMapper.selectList( |
| | | Wrappers.<SalesLedgerProduct>lambdaQuery() |
| | | .eq(SalesLedgerProduct::getSalesLedgerId, id) |
| | | ); |
| | | for (SalesLedgerProduct originalProduct : originalProducts) { |
| | | SalesLedgerProduct newProduct = new SalesLedgerProduct(); |
| | | BeanUtils.copyProperties(originalProduct, newProduct); |
| | | newProduct.setId(null); |
| | | newProduct.setSalesLedgerId(newLedger.getId()); |
| | | newProduct.setStockedQuantity(BigDecimal.ZERO); |
| | | newProduct.setShippedQuantity(BigDecimal.ZERO); |
| | | newProduct.setUnqualifiedStockedQuantity(BigDecimal.ZERO); |
| | | newProduct.setUnqualifiedShippedQuantity(BigDecimal.ZERO); |
| | | newProduct.setReturnQuality(BigDecimal.ZERO); |
| | | newProduct.setAvailableQuality(newProduct.getQuantity().subtract(newProduct.getReturnQuality())); |
| | | newProduct.setProductStockStatus(0); |
| | | newProduct.fillRemainingQuantity(); |
| | | salesLedgerProductMapper.insert(newProduct); |
| | | } |
| | | newLedgerIds.add(newLedger.getId()); |
| | | newLedgerIds.add(id); |
| | | } |
| | | } |
| | | return newLedgerIds; |
| | |
| | | ); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void markOrderCompleted(List<Long> ids) { |
| | | if (CollectionUtils.isEmpty(ids)) { |
| | | throw new ServiceException("请选择要标记完成的订单"); |
| | | } |
| | | for (Long id : ids) { |
| | | SalesLedger ledger = salesLedgerMapper.selectById(id); |
| | | if (ledger == null) { |
| | | throw new ServiceException("订单不存在,无法标记完成"); |
| | | } |
| | | if (ledger.getReviewStatus() == null || ledger.getReviewStatus() != 1) { |
| | | throw new ServiceException("订单" + ledger.getSalesContractNo() + "不是已审核状态,无法标记完成"); |
| | | } |
| | | if (ledger.getOrderStatus() != null && ledger.getOrderStatus() == 1) { |
| | | throw new ServiceException("订单" + ledger.getSalesContractNo() + "已完成,无需重复标记"); |
| | | } |
| | | } |
| | | salesLedgerMapper.update(null, |
| | | Wrappers.<SalesLedger>lambdaUpdate() |
| | | .in(SalesLedger::getId, ids) |
| | | .set(SalesLedger::getOrderStatus, 1) |
| | | ); |
| | | } |
| | | |
| | | @Override |
| | | public void incrementPrintCount(Long id, String printType) { |
| | |
| | | if (salesLedgerDto.getReviewStatus() != null) { |
| | | queryWrapper.eq(SalesLedger::getReviewStatus, salesLedgerDto.getReviewStatus()); |
| | | } |
| | | if (salesLedgerDto.getOrderStatus() != null) { |
| | | queryWrapper.eq(SalesLedger::getOrderStatus, salesLedgerDto.getOrderStatus()); |
| | | } |
| | | |
| | | if (salesLedgerDto.getReviewStatusList() != null && !salesLedgerDto.getReviewStatusList().isEmpty()) { |
| | | queryWrapper.and(w -> w.in(SalesLedger::getReviewStatus, salesLedgerDto.getReviewStatusList()) |
| | | .or().isNull(SalesLedger::getReviewStatus)); |
| | |
| | | ledgerDto.setDeliveryStatusText(getDeliveryStatusText(ledger.getDeliveryStatus())); |
| | | ledgerDto.setStockStatusText(getStockStatusText(ledger.getStockStatus())); |
| | | ledgerDto.setReviewStatusText(getReviewStatusText(ledger.getReviewStatus())); |
| | | ledgerDto.setOrderStatusText(getOrderStatusText(ledger.getOrderStatus())); |
| | | |
| | | ledgerExportList.add(ledgerDto); |
| | | |
| | | // 查询该台账的产品列表 |
| | |
| | | sheetMap.put("工艺路线", sheetData); |
| | | } |
| | | |
| | | com.ruoyi.common.utils.excel.ExcelUtils.exportManySheet(response, "销售台账工艺路线导出", sheetMap); |
| | | ExcelUtils.exportManySheet(response, "销售台账工艺路线导出", sheetMap); |
| | | } catch (Exception e) { |
| | | log.error("导出售后台账工艺路线失败", e); |
| | | throw new ServiceException("导出售后台账工艺路线失败:" + e.getMessage()); |
| | |
| | | |
| | | private List<Object> buildProcessRouteRow(SalesLedger salesLedger, SalesLedgerProduct product, SalesLedgerProcessRouteRecord route) { |
| | | List<Object> row = new ArrayList<>(); |
| | | row.add(salesLedger.getEntryDate() == null ? "" : DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, salesLedger.getEntryDate())); |
| | | row.add(route.getCompletedTime() == null ? "" : route.getCompletedTime().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd"))); |
| | | row.add(salesLedger.getSalesContractNo()); |
| | | row.add(salesLedger.getCustomerName()); |
| | | row.add(product == null ? "" : product.getSpecificationModel()); |
| | |
| | | } |
| | | } |
| | | |
| | | private String getOrderStatusText(Integer status) { |
| | | if (status == null || status == 0) return "进行中"; |
| | | switch (status) { |
| | | case 0: |
| | | return "进行中"; |
| | | case 1: |
| | | return "已完成"; |
| | | default: |
| | | return "进行中"; |
| | | } |
| | | } |
| | | } |
| | | |