diff --git a/ruoyi-admin/src/main/java/com/ruoyi/aftersales/mapper/AftersalesOutOrderDetailMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/aftersales/mapper/AftersalesOutOrderDetailMapper.java index 70bff156..d6b9f878 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/aftersales/mapper/AftersalesOutOrderDetailMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/aftersales/mapper/AftersalesOutOrderDetailMapper.java @@ -85,4 +85,9 @@ public interface AftersalesOutOrderDetailMapper * 根据出库单号查询详情集合 * */ List selectDetailListByOutOrderCode(String outOrderCode); + + /** + * 根据出库单号和物料号更新出库单详情 + * */ + int updateAftersalesOutOrderDetailByCodeAndNo(AftersalesOutOrderDetail aftersalesOutOrderDetail); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseOutOrderServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseOutOrderServiceImpl.java index e6f5050f..2e98a528 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseOutOrderServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseOutOrderServiceImpl.java @@ -112,6 +112,7 @@ public class WarehouseOutOrderServiceImpl implements IWarehouseOutOrderService @Autowired private AfterSalesShippingDeviceMapper shippingDeviceMapper; + /** * 查询仓库出库单 * @@ -338,63 +339,117 @@ public class WarehouseOutOrderServiceImpl implements IWarehouseOutOrderService @Override public int updateSalesOutWarehouse(WarehouseOutOrder warehouseOutOrder) { + + String loginName = ShiroUtils.getLoginName(); warehouseOutOrder.setUpdateBy(loginName); warehouseOutOrder.setUpdateTime(DateUtils.getNowDate()); - //设置为已出库 - warehouseOutOrder.setWarehouseOutStatus("7"); + warehouseOutOrder.setOutOrderTime(DateUtils.getNowDate());//出库时间 + //设置为全部出库 + warehouseOutOrder.setWarehouseOutStatus("6"); + + WarehouseOutOrder tempOutOrder = warehouseOutOrderMapper.selectWarehouseOutOrderByCode(warehouseOutOrder.getOutOrderCode()); + + String relatedOrderCode = tempOutOrder.getRelatedOrderCode(); + + // 处理 relatedOrderCode 为空或空白的情况 + List relatedOrderCodes = new ArrayList<>(); + if (StringUtils.isNotBlank(relatedOrderCode)) { + String[] splitRelatedOrderCode = relatedOrderCode.split(","); + relatedOrderCodes = Arrays.asList(splitRelatedOrderCode); + } + List oldSalesOrderChildList = salesOrderChildMapper.selectBatchOrderChildListBySalesOrderCode(relatedOrderCodes); + + // 将旧数据按物料编号分组 + Map> oldDataGroupedByMaterialCode = oldSalesOrderChildList.stream() + .collect(Collectors.groupingBy(SysSalesOrderChild::getMaterialCode)); + + // 当前时间 + Date now = new Date(); + List warehouseOutOrderDetailList = warehouseOutOrder.getWarehouseOutOrderDetailList(); + + //判断是否存在实际出库数为零的 + boolean anyMatchActualOutOrderSum = warehouseOutOrderDetailList.stream().anyMatch(detail -> detail.getActualOutOrderSum() == null); + if (anyMatchActualOutOrderSum){ + throw new BusinessException("实际出库数不能为空"); + } + if (StringUtils.isEmpty(warehouseOutOrderDetailList)){ log.warn("保存销售单-出库,物料列表信息为空:{}",warehouseOutOrder); } for (WarehouseOutOrderDetail warehouseOutOrderDetail : warehouseOutOrderDetailList) { - SysSalesOrderChild sysSalesOrderChild = new SysSalesOrderChild(); - sysSalesOrderChild.setQuoteId(warehouseOutOrder.getSalesOrderCode()); - sysSalesOrderChild.setMaterialCode(warehouseOutOrderDetail.getMaterialNo()); - sysSalesOrderChild.setOutBoundQuantity(warehouseOutOrderDetail.getActualOutOrderSum()); - sysSalesOrderChild.setUpdateBy(loginName); - sysSalesOrderChild.setUpdateTime(new Date()); - int updateSalesOrderChildResult = salesOrderChildMapper.updateSysSalesOrderChildByCodeAndQuoteId(sysSalesOrderChild); - if (updateSalesOrderChildResult <= 0){ - throw new BusinessException("更新销售订单子表数据失败"); - } - SysSalesShippingInformDetail sysSalesShippingInformDetail = new SysSalesShippingInformDetail(); - sysSalesShippingInformDetail.setHasOutOrderNum(warehouseOutOrderDetail.getActualOutOrderSum()); - sysSalesShippingInformDetail.setUpdateBy(loginName); - sysSalesShippingInformDetail.setUpdateTime(new Date()); - sysSalesShippingInformDetail.setOutOrderCode(warehouseOutOrder.getOutOrderCode()); - sysSalesShippingInformDetail.setMaterialNo(warehouseOutOrderDetail.getMaterialNo()); - int updateShippingInformDetailResult = shippingInformDetailMapper.updateSysSalesShippingInformDetailByCodeAndNo(sysSalesShippingInformDetail); - if (updateShippingInformDetailResult <= 0){ - throw new BusinessException("更新销售出库详情数据失败"); + // 执行现有的逻辑 + Integer prepareOutOrderSum = warehouseOutOrderDetail.getPrepareOutOrderSum(); + Integer actualOutOrderSum = warehouseOutOrderDetail.getActualOutOrderSum(); + if (!Objects.equals(prepareOutOrderSum, actualOutOrderSum)) { + throw new BusinessException("实际出库数必须等于准备出库数"); } - warehouseOutOrderDetail.setUpdateBy(loginName); - warehouseOutOrderDetail.setUpdateTime(new Date()); - warehouseOutOrderDetail.setRemark(warehouseOutOrder.getRemark()); - warehouseOutOrderDetail.setDeliveryDate(warehouseOutOrder.getDeliveryDate()); - int updateWarehouseOutOrderDetailResult = outOrderDetailMapper.updateWarehouseOutOrderDetail(warehouseOutOrderDetail); - if (updateWarehouseOutOrderDetailResult <= 0){ - throw new BusinessException("更新出库单详情数据失败"); - }else { -// 更新库存查询记录,新增库存历史 - String materialNo = warehouseOutOrderDetail.getMaterialNo(); - WarehouseInventoryInquiry inventoryInquiry = inventoryInquiryMapper.selectWarehouseInventoryInquiryByMaterialNo(materialNo); - if(inventoryInquiry == null){ - throw new BusinessException("更新库存查询数据失败!该物料不存在库存查询数据"); - }else{ - int inquiryUpdateResult = updateWarehouseInventoryInquiry(warehouseOutOrderDetail,inventoryInquiry); - if (inquiryUpdateResult <= 0){ - throw new BusinessException("更新库存查询数据失败"); - } - WarehouseInventoryInquiryDetail inquiryDetail = createWarehouseInventoryInquiryDetail(warehouseOutOrderDetail); - inquiryDetail.setInventoryHistoricalType("8");//销售出库 - int insertInquiryResult = inventoryInquiryDetailMapper.insertWarehouseInventoryInquiryDetail(inquiryDetail); - if (insertInquiryResult <= 0){ - throw new BusinessException("新增库存历史数据失败"); + String salesOrderCode = warehouseOutOrder.getSalesOrderCode(); + if (StringUtils.isNotEmpty(salesOrderCode)) { + SysSalesOrderChild sysSalesOrderChild = new SysSalesOrderChild(); + sysSalesOrderChild.setQuoteId(salesOrderCode); + sysSalesOrderChild.setMaterialCode(warehouseOutOrderDetail.getMaterialNo()); + sysSalesOrderChild.setOutBoundQuantity(warehouseOutOrderDetail.getActualOutOrderSum()); + sysSalesOrderChild.setUpdateBy(loginName); + sysSalesOrderChild.setUpdateTime(new Date()); + int updateSalesOrderChildResult = salesOrderChildMapper.updateSysSalesOrderChildByCodeAndQuoteId(sysSalesOrderChild); + if (updateSalesOrderChildResult <= 0) { + throw new BusinessException("更新销售订单子表数据失败"); + } + } else { + String materialCode = warehouseOutOrderDetail.getMaterialNo(); + // 获取旧数据中相同物料编号的数据 + List oldChildren = oldDataGroupedByMaterialCode.get(materialCode); + + if (oldChildren != null && !oldChildren.isEmpty()) { + // 按照 deliveryTime 接近当前时间排序 + oldChildren.sort(Comparator.comparing(oldChild -> Math.abs(now.getTime() - oldChild.getDeliveryTime().getTime()))); + + for (SysSalesOrderChild oldChild : oldChildren) { + Integer outBoundQuantity = oldChild.getOutBoundQuantity(); + if (outBoundQuantity == null) { + outBoundQuantity = 0; // 确保 outBoundQuantity 不为 null + } + + // 计算新的已出库数 + outBoundQuantity += actualOutOrderSum; + oldChild.setOutBoundQuantity(outBoundQuantity); + oldChild.setUpdateTime(new Date()); + oldChild.setUpdateBy(loginName); + oldChild.setQuoteId(oldChild.getQuoteId()); + + // 更新数据库 + int updateSysSalesOrderChildResult = salesOrderChildMapper.updateSysSalesOrderChild(oldChild); + if (updateSysSalesOrderChildResult <= 0) { + throw new BusinessException("更新销售订单子表数据失败"); + } + + // 更新完成后,跳出循环 + break; } } } + // 无论 salesOrderCode 是否为空,都更新销售出库单数据、售后出库单数据和出库单数据 + this.updateSalesAndAfterSalesData(warehouseOutOrderDetail, warehouseOutOrder, loginName); +//// 更新库存查询记录,新增库存历史 +// String materialNo = warehouseOutOrderDetail.getMaterialNo(); +// WarehouseInventoryInquiry inventoryInquiry = inventoryInquiryMapper.selectWarehouseInventoryInquiryByMaterialNo(materialNo); +// if(inventoryInquiry == null){ +// throw new BusinessException("更新库存查询数据失败!该物料不存在库存查询数据"); +// }else{ +// int inquiryUpdateResult = updateWarehouseInventoryInquiry(warehouseOutOrderDetail,inventoryInquiry); +// if (inquiryUpdateResult <= 0){ +// throw new BusinessException("更新库存查询数据失败"); +// } +// WarehouseInventoryInquiryDetail inquiryDetail = createWarehouseInventoryInquiryDetail(warehouseOutOrderDetail); +// inquiryDetail.setInventoryHistoricalType("8");//销售出库 +// int insertInquiryResult = inventoryInquiryDetailMapper.insertWarehouseInventoryInquiryDetail(inquiryDetail); +// if (insertInquiryResult <= 0){ +// throw new BusinessException("新增库存历史数据失败"); +// } +// } } //更新销售出货通知列表 SysSalesShippingInform sysSalesShippingInform = new SysSalesShippingInform(); @@ -409,6 +464,20 @@ public class WarehouseOutOrderServiceImpl implements IWarehouseOutOrderService throw new BusinessException("更新销售出库单数据失败"); } + + //更新售后维护设备出库单 + + AftersalesOutOrder aftersalesOutOrder = new AftersalesOutOrder(); + aftersalesOutOrder.setOutOrderCode(warehouseOutOrder.getOutOrderCode()); + aftersalesOutOrder.setWarehouseOutStatus("6");//全部出库 + aftersalesOutOrder.setUpdateBy(loginName); + aftersalesOutOrder.setUpdateTime(new Date()); + aftersalesOutOrder.setOutOrderTime(new Date()); + int updateAftersalesOutOrderResult = aftersalesOutOrderMapper.updateAftersalesOutOrderByOutOrderCode(aftersalesOutOrder); + if (updateAftersalesOutOrderResult <= 0){ + throw new BusinessException("更新售后维护设备出库单数据失败"); + } + int updateWarehouseOutOrderResult = warehouseOutOrderMapper.updateWarehouseOutOrder(warehouseOutOrder); if (updateWarehouseOutOrderResult <= 0){ @@ -418,6 +487,46 @@ public class WarehouseOutOrderServiceImpl implements IWarehouseOutOrderService return updateWarehouseOutOrderResult; } + // 无论 salesOrderCode 是否为空,都更新销售出库单数据、售后出库单数据和出库单数据 + private void updateSalesAndAfterSalesData(WarehouseOutOrderDetail warehouseOutOrderDetail, WarehouseOutOrder warehouseOutOrder, String loginName) { + Integer actualOutOrderSum = warehouseOutOrderDetail.getActualOutOrderSum(); + + // 更新销售出库详情数据 + SysSalesShippingInformDetail sysSalesShippingInformDetail = new SysSalesShippingInformDetail(); + sysSalesShippingInformDetail.setHasOutOrderNum(actualOutOrderSum); + sysSalesShippingInformDetail.setUpdateBy(loginName); + sysSalesShippingInformDetail.setUpdateTime(new Date()); + sysSalesShippingInformDetail.setOutOrderCode(warehouseOutOrder.getOutOrderCode()); + sysSalesShippingInformDetail.setMaterialNo(warehouseOutOrderDetail.getMaterialNo()); + int updateShippingInformDetailResult = shippingInformDetailMapper.updateSysSalesShippingInformDetailByCodeAndNo(sysSalesShippingInformDetail); + if (updateShippingInformDetailResult <= 0) { + throw new BusinessException("更新销售出库详情数据失败"); + } + + // 更新售后出库详情数据 + AftersalesOutOrderDetail aftersalesOutOrderDetail = new AftersalesOutOrderDetail(); + aftersalesOutOrderDetail.setHasOutOrderSum(actualOutOrderSum); + aftersalesOutOrderDetail.setUpdateBy(loginName); + aftersalesOutOrderDetail.setUpdateTime(new Date()); + aftersalesOutOrderDetail.setOutOrderCode(warehouseOutOrder.getOutOrderCode()); + aftersalesOutOrderDetail.setMaterialNo(warehouseOutOrderDetail.getMaterialNo()); + int updateAftersalesOutOrderDetailResult = aftersalesOutOrderDetailMapper.updateAftersalesOutOrderDetailByCodeAndNo(aftersalesOutOrderDetail); + if (updateAftersalesOutOrderDetailResult <= 0) { + throw new BusinessException("更新售后出库详情数据失败"); + } + + // 更新出库单详情数据 + warehouseOutOrderDetail.setUpdateBy(loginName); + warehouseOutOrderDetail.setUpdateTime(new Date()); + warehouseOutOrderDetail.setRemark(warehouseOutOrder.getRemark()); + warehouseOutOrderDetail.setHasOutOrderSum(actualOutOrderSum); + int updateWarehouseOutOrderDetailResult = outOrderDetailMapper.updateWarehouseOutOrderDetail(warehouseOutOrderDetail); + if (updateWarehouseOutOrderDetailResult <= 0) { + throw new BusinessException("更新出库单详情数据失败"); + } + } + + /** * 销售单-出库 物料信息关联设备子表信息 diff --git a/ruoyi-admin/src/main/resources/mapper/aftersales/AftersalesOutOrderDetailMapper.xml b/ruoyi-admin/src/main/resources/mapper/aftersales/AftersalesOutOrderDetailMapper.xml index 07e86a25..f7a95fb8 100644 --- a/ruoyi-admin/src/main/resources/mapper/aftersales/AftersalesOutOrderDetailMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/aftersales/AftersalesOutOrderDetailMapper.xml @@ -349,6 +349,65 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where out_order_detail_id = #{outOrderDetailId} + + + update aftersales_out_order_detail + + out_order_code = #{outOrderCode}, + make_no = #{makeNo}, + warehouse_out_status = #{warehouseOutStatus}, + related_order_code = #{relatedOrderCode}, + sales_order_code = #{salesOrderCode}, + warehouse_order_type = #{warehouseOrderType}, + out_make_code = #{outMakeCode}, + requisitioning_code = #{requisitioningCode}, + warehouse_out_type = #{warehouseOutType}, + business_name = #{businessName}, + aftersales_name = #{aftersalesName}, + warehouse_name = #{warehouseName}, + shipping_device_id = #{shippingDeviceId}, + material_no = #{materialNo}, + material_name = #{materialName}, + material_type = #{materialType}, + material_photoUrl = #{materialPhotourl}, + material_brand = #{materialBrand}, + material_unit = #{materialUnit}, + material_describe = #{materialDescribe}, + material_process_method = #{materialProcessMethod}, + material_model = #{materialModel}, + material_specification = #{materialSpecification}, + material_sum = #{materialSum}, + enterprise_sum = #{enterpriseSum}, + make_num = #{makeNum}, + out_order_sum = #{outOrderSum}, + has_out_order_sum = #{hasOutOrderSum}, + apply_out_order_sum = #{applyOutOrderSum}, + prepare_out_order_sum = #{prepareOutOrderSum}, + actual_out_order_sum = #{actualOutOrderSum}, + out_order_name = #{outOrderName}, + out_order_time = #{outOrderTime}, + supplier_code = #{supplierCode}, + supplier_name = #{supplierName}, + customer_id = #{customerId}, + customer_name = #{customerName}, + plan_delivery_time = #{planDeliveryTime}, + delivery_date = #{deliveryDate}, + delivery_condition = #{deliveryCondition}, + apply_name = #{applyName}, + delivery_address = #{deliveryAddress}, + delivery_name = #{deliveryName}, + delivery_number = #{deliveryNumber}, + remark = #{remark}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where out_order_code = #{outOrderCode} + and material_no = #{materialNo} + + + delete from aftersales_out_order_detail where out_order_detail_id = #{outOrderDetailId} diff --git a/ruoyi-admin/src/main/resources/templates/warehouse/warehouseOutOrder/salesOutWarehouse.html b/ruoyi-admin/src/main/resources/templates/warehouse/warehouseOutOrder/salesOutWarehouse.html index 8244846c..5ae2185c 100644 --- a/ruoyi-admin/src/main/resources/templates/warehouse/warehouseOutOrder/salesOutWarehouse.html +++ b/ruoyi-admin/src/main/resources/templates/warehouse/warehouseOutOrder/salesOutWarehouse.html @@ -243,7 +243,41 @@ { title: '实际出库数', field: 'actualOutOrderSum', - editable:true + editable: { + validate: function(value) { + if ($.trim(value) === '') { + return '实际出库数不能为空'; + } + if (isNaN(value)) { + return '请输入有效的数字'; + } + if (value <= 0) { + return '实际出库数必须大于0'; + } + //不能为小数 + if (value % 1 !== 0) { + return '实际出库数不能为小数'; + } + }, + }, + formatter: function (value, row) { + // 检查 row 是否存在 + if (!row) { + return ""; + } + + // 检查 actualOutOrderSum 是否存在 + if (row.actualOutOrderSum === undefined || row.actualOutOrderSum === null) { + return ""; + } + + // 根据 actualOutOrderSum 的值决定返回值 + if (row.actualOutOrderSum) { + return row.actualOutOrderSum; + } else { + return value; + } + } } ] }; diff --git a/ruoyi-admin/src/main/resources/templates/warehouse/warehouseOutOrder/warehouseOutOrder.html b/ruoyi-admin/src/main/resources/templates/warehouse/warehouseOutOrder/warehouseOutOrder.html index 235abe26..cefaf04b 100644 --- a/ruoyi-admin/src/main/resources/templates/warehouse/warehouseOutOrder/warehouseOutOrder.html +++ b/ruoyi-admin/src/main/resources/templates/warehouse/warehouseOutOrder/warehouseOutOrder.html @@ -151,7 +151,7 @@ { title: '物料合计', field: 'materialSum', - formatter: function(value) { + footerFormatter: function(value) { var sum = 0; for (var i in value) { sum += parseFloat(value[i].materialSum) || 0; @@ -162,7 +162,7 @@ { title: '数量合计', field: 'enterpriseSum', - formatter: function(value) { + footerFormatter: function(value) { var sum = 0; for (var i in value) { sum += parseFloat(value[i].enterpriseSum) || 0;