Browse Source

[feat]仓库管理

修改仓库销售出库前端页面:实际出库数加上不能为空、为小数、必须大于0的校验、没用值默认为empty
出库单前端列表页面新增 底部展示物料的总合计和数量的总合计
修改销售-出库后端方法,实现:同时更新销售出库单、售后维护出库单、仓库出库单的出库状态;同时更新出库单详情表、售后维护设备出库单详情表、仓库出库单详情表的实际出库数和已出库数;更新销售订单子表的已出库数,并且实现:通过判断销售订单的有无,走不同的方法。并且根据销售订单详情物料的交付时间与当前时间进行对比,越靠近当前时间的数据先更新已出库数
售后维护设备出库单详情新增 根据出库单号和物料号更新出库单详情后端方法
dev
liuxiaoxu 3 months ago
parent
commit
46f8697ba9
  1. 5
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/mapper/AftersalesOutOrderDetailMapper.java
  2. 197
      ruoyi-admin/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseOutOrderServiceImpl.java
  3. 59
      ruoyi-admin/src/main/resources/mapper/aftersales/AftersalesOutOrderDetailMapper.xml
  4. 36
      ruoyi-admin/src/main/resources/templates/warehouse/warehouseOutOrder/salesOutWarehouse.html
  5. 4
      ruoyi-admin/src/main/resources/templates/warehouse/warehouseOutOrder/warehouseOutOrder.html

5
ruoyi-admin/src/main/java/com/ruoyi/aftersales/mapper/AftersalesOutOrderDetailMapper.java

@ -85,4 +85,9 @@ public interface AftersalesOutOrderDetailMapper
* 根据出库单号查询详情集合
* */
List<AftersalesOutOrderDetail> selectDetailListByOutOrderCode(String outOrderCode);
/**
* 根据出库单号和物料号更新出库单详情
* */
int updateAftersalesOutOrderDetailByCodeAndNo(AftersalesOutOrderDetail aftersalesOutOrderDetail);
}

197
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<String> relatedOrderCodes = new ArrayList<>();
if (StringUtils.isNotBlank(relatedOrderCode)) {
String[] splitRelatedOrderCode = relatedOrderCode.split(",");
relatedOrderCodes = Arrays.asList(splitRelatedOrderCode);
}
List<SysSalesOrderChild> oldSalesOrderChildList = salesOrderChildMapper.selectBatchOrderChildListBySalesOrderCode(relatedOrderCodes);
// 将旧数据按物料编号分组
Map<String, List<SysSalesOrderChild>> oldDataGroupedByMaterialCode = oldSalesOrderChildList.stream()
.collect(Collectors.groupingBy(SysSalesOrderChild::getMaterialCode));
// 当前时间
Date now = new Date();
List<WarehouseOutOrderDetail> 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<SysSalesOrderChild> 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("更新出库单详情数据失败");
}
}
/**
* 销售单-出库 物料信息关联设备子表信息

59
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>
<update id="updateAftersalesOutOrderDetailByCodeAndNo" parameterType="AftersalesOutOrderDetail">
update aftersales_out_order_detail
<trim prefix="SET" suffixOverrides=",">
<if test="outOrderCode != null">out_order_code = #{outOrderCode},</if>
<if test="makeNo != null">make_no = #{makeNo},</if>
<if test="warehouseOutStatus != null">warehouse_out_status = #{warehouseOutStatus},</if>
<if test="relatedOrderCode != null">related_order_code = #{relatedOrderCode},</if>
<if test="salesOrderCode != null">sales_order_code = #{salesOrderCode},</if>
<if test="warehouseOrderType != null">warehouse_order_type = #{warehouseOrderType},</if>
<if test="outMakeCode != null">out_make_code = #{outMakeCode},</if>
<if test="requisitioningCode != null">requisitioning_code = #{requisitioningCode},</if>
<if test="warehouseOutType != null">warehouse_out_type = #{warehouseOutType},</if>
<if test="businessName != null">business_name = #{businessName},</if>
<if test="aftersalesName != null">aftersales_name = #{aftersalesName},</if>
<if test="warehouseName != null">warehouse_name = #{warehouseName},</if>
<if test="shippingDeviceId != null">shipping_device_id = #{shippingDeviceId},</if>
<if test="materialNo != null">material_no = #{materialNo},</if>
<if test="materialName != null">material_name = #{materialName},</if>
<if test="materialType != null">material_type = #{materialType},</if>
<if test="materialPhotourl != null">material_photoUrl = #{materialPhotourl},</if>
<if test="materialBrand != null">material_brand = #{materialBrand},</if>
<if test="materialUnit != null">material_unit = #{materialUnit},</if>
<if test="materialDescribe != null">material_describe = #{materialDescribe},</if>
<if test="materialProcessMethod != null">material_process_method = #{materialProcessMethod},</if>
<if test="materialModel != null">material_model = #{materialModel},</if>
<if test="materialSpecification != null">material_specification = #{materialSpecification},</if>
<if test="materialSum != null">material_sum = #{materialSum},</if>
<if test="enterpriseSum != null">enterprise_sum = #{enterpriseSum},</if>
<if test="makeNum != null">make_num = #{makeNum},</if>
<if test="outOrderSum != null">out_order_sum = #{outOrderSum},</if>
<if test="hasOutOrderSum != null">has_out_order_sum = #{hasOutOrderSum},</if>
<if test="applyOutOrderSum != null">apply_out_order_sum = #{applyOutOrderSum},</if>
<if test="prepareOutOrderSum != null">prepare_out_order_sum = #{prepareOutOrderSum},</if>
<if test="actualOutOrderSum != null">actual_out_order_sum = #{actualOutOrderSum},</if>
<if test="outOrderName != null">out_order_name = #{outOrderName},</if>
<if test="outOrderTime != null">out_order_time = #{outOrderTime},</if>
<if test="supplierCode != null">supplier_code = #{supplierCode},</if>
<if test="supplierName != null">supplier_name = #{supplierName},</if>
<if test="customerId != null">customer_id = #{customerId},</if>
<if test="customerName != null">customer_name = #{customerName},</if>
<if test="planDeliveryTime != null">plan_delivery_time = #{planDeliveryTime},</if>
<if test="deliveryDate != null">delivery_date = #{deliveryDate},</if>
<if test="deliveryCondition != null">delivery_condition = #{deliveryCondition},</if>
<if test="applyName != null">apply_name = #{applyName},</if>
<if test="deliveryAddress != null">delivery_address = #{deliveryAddress},</if>
<if test="deliveryName != null">delivery_name = #{deliveryName},</if>
<if test="deliveryNumber != null">delivery_number = #{deliveryNumber},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
</trim>
where out_order_code = #{outOrderCode}
and material_no = #{materialNo}
</update>
<delete id="deleteAftersalesOutOrderDetailById" parameterType="Long">
delete from aftersales_out_order_detail where out_order_detail_id = #{outOrderDetailId}
</delete>

36
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;
}
}
}
]
};

4
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;

Loading…
Cancel
Save