生产报工从线边库扣减物料时自动从多条库存记录中扣减。

This commit is contained in:
DESKTOP-J7ED0MB\yinjinlu 2022-11-08 20:51:54 +08:00
parent 8cf7f84ccf
commit bfbc1c5f89
6 changed files with 94 additions and 11 deletions

View File

@ -228,6 +228,7 @@ public class ProFeedbackController extends BaseController
* @param record
*/
private void executeItemConsume(WmItemConsume record){
//需要在此处进行分批次领料的线边库扣减
List<ItemConsumeTxBean> beans = wmItemConsumeService.getTxBeans(record.getRecordId());
storageCoreService.processItemConsume(beans);
record.setStatus(UserConstants.ORDER_STATUS_FINISHED);

View File

@ -64,6 +64,7 @@ public interface IWmItemConsumeService
/**
* 根据生产报工单生成物料消耗记录
* 这里需要处理同一个工单分多次领料的问题每次领料可能是不同的批次
* @param feedback
* @return
*/

View File

@ -1,5 +1,6 @@
package com.ktg.mes.wm.service.impl;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@ -11,8 +12,10 @@ import com.ktg.mes.md.mapper.MdWorkstationMapper;
import com.ktg.mes.pro.domain.*;
import com.ktg.mes.pro.mapper.*;
import com.ktg.mes.wm.domain.WmItemConsumeLine;
import com.ktg.mes.wm.domain.WmMaterialStock;
import com.ktg.mes.wm.domain.tx.ItemConsumeTxBean;
import com.ktg.mes.wm.mapper.WmItemConsumeLineMapper;
import com.ktg.mes.wm.mapper.WmMaterialStockMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ktg.mes.wm.mapper.WmItemConsumeMapper;
@ -52,6 +55,9 @@ public class WmItemConsumeServiceImpl implements IWmItemConsumeService
@Autowired
private ProRouteProductBomMapper proRouteProductBomMapper;
@Autowired
private WmMaterialStockMapper wmMaterialStockMapper;
/**
* 查询物料消耗记录
*
@ -166,16 +172,85 @@ public class WmItemConsumeServiceImpl implements IWmItemConsumeService
if(CollectionUtil.isNotEmpty(boms)){
for (ProRouteProductBom bom: boms
) {
WmItemConsumeLine line = new WmItemConsumeLine();
line.setRecordId(itemConsume.getRecordId());
line.setItemId(bom.getItemId());
line.setItemCode(bom.getItemCode());
line.setItemName(bom.getItemName());
line.setSpecification(bom.getSpecification());
line.setUnitOfMeasure(bom.getUnitOfMeasure());
line.setQuantityConsume(bom.getQuantity().multiply(feedback.getQuantityFeedback()));
line.setBatchCode(workorder.getBatchCode());
wmItemConsumeLineMapper.insertWmItemConsumeLine(line);
//这里根据需要消耗的原材料/半成品信息 匹配出对应的线边库库存记录
BigDecimal quantityToConsume = bom.getQuantity().multiply(feedback.getQuantityFeedback()); //总的消耗量
//从线边库中根据生产工单物料按照先进先出的原则查询库存现有量
WmMaterialStock p = new WmMaterialStock();
p.setWorkorderCode(feedback.getWorkorderCode()); //当前工单
p.setItemId(bom.getItemId()); //指定物料
p.setWarehouseCode(UserConstants.VIRTUAL_WH); //线边库
List<WmMaterialStock> ms = wmMaterialStockMapper.selectWmMaterialStockList(p);
if(CollectionUtil.isNotEmpty(ms)){
WmMaterialStock theStock = null;
for(int i=0;i<ms.size();i++){
theStock = ms.get(i);
if(theStock.getQuantityOnhand().compareTo(quantityToConsume)>=0){
//当前库存记录的库存量大于等于本次需要消耗的库存量, 则直接使用当前记录
WmItemConsumeLine line = new WmItemConsumeLine();
line.setMaterialStockId(theStock.getMaterialStockId());
line.setRecordId(itemConsume.getRecordId());
line.setItemId(bom.getItemId());
line.setItemCode(bom.getItemCode());
line.setItemName(bom.getItemName());
line.setSpecification(bom.getSpecification());
line.setUnitOfMeasure(bom.getUnitOfMeasure());
line.setQuantityConsume(quantityToConsume);
line.setBatchCode(workorder.getBatchCode());
wmItemConsumeLineMapper.insertWmItemConsumeLine(line);
quantityToConsume= BigDecimal.ZERO;
}else if(theStock.getQuantityOnhand().compareTo(BigDecimal.ZERO)==1){
//当前记录的库存量大于0 并且小于需要扣减的量只从当前库存记录上扣减在库量并更新剩余需要扣减的量
WmItemConsumeLine line = new WmItemConsumeLine();
line.setMaterialStockId(theStock.getMaterialStockId());
line.setRecordId(itemConsume.getRecordId());
line.setItemId(bom.getItemId());
line.setItemCode(bom.getItemCode());
line.setItemName(bom.getItemName());
line.setSpecification(bom.getSpecification());
line.setUnitOfMeasure(bom.getUnitOfMeasure());
line.setQuantityConsume(theStock.getQuantityOnhand());
line.setBatchCode(workorder.getBatchCode());
wmItemConsumeLineMapper.insertWmItemConsumeLine(line);
quantityToConsume = quantityToConsume.subtract(theStock.getQuantityOnhand());
} else {
//查出的库存量为负不做处理
}
if(quantityToConsume.compareTo(BigDecimal.ZERO)==0){
//量已经扣减完则退出
break;
}
}
//循环完成后还有剩余未扣除的数量直接在库中新增一条为负的记录后期手工核销
if(quantityToConsume.compareTo(BigDecimal.ZERO)==1){
WmItemConsumeLine line = new WmItemConsumeLine();
line.setRecordId(itemConsume.getRecordId());
line.setItemId(bom.getItemId());
line.setItemCode(bom.getItemCode());
line.setItemName(bom.getItemName());
line.setSpecification(bom.getSpecification());
line.setUnitOfMeasure(bom.getUnitOfMeasure());
line.setQuantityConsume(quantityToConsume);
line.setBatchCode(workorder.getBatchCode());
wmItemConsumeLineMapper.insertWmItemConsumeLine(line);
}
}else {
//没有查到领出到线边库的物料直接在库中新增一条为负的记录(后期可能需要手工核销)
WmItemConsumeLine line = new WmItemConsumeLine();
line.setRecordId(itemConsume.getRecordId());
line.setItemId(bom.getItemId());
line.setItemCode(bom.getItemCode());
line.setItemName(bom.getItemName());
line.setSpecification(bom.getSpecification());
line.setUnitOfMeasure(bom.getUnitOfMeasure());
line.setQuantityConsume(bom.getQuantity().multiply(feedback.getQuantityFeedback()));
line.setBatchCode(workorder.getBatchCode());
wmItemConsumeLineMapper.insertWmItemConsumeLine(line);
}
}
}else {
return null; //如果本道工序没有配置BOM物料则直接返回空

View File

@ -124,6 +124,11 @@ public class WmProductProduceServiceImpl implements IWmProductProduceService
return wmProductProduceMapper.deleteWmProductProduceByRecordId(recordId);
}
/**
* 根据报工单生成
* @param feedback
* @return
*/
@Override
public WmProductProduce generateProductProduce(ProFeedback feedback) {
ProWorkorder workorder = proWorkorderMapper.selectProWorkorderByWorkorderId(feedback.getWorkorderId());

View File

@ -90,7 +90,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="getTxBeans" parameterType="Long" resultMap="ItemConsumeTxBeanResult">
SELECT irl.`item_id`,irl.`item_code`,irl.`item_name`,irl.`specification`,irl.`unit_of_measure`,irl.`batch_code`,
SELECT irl.material_stock_id, irl.`item_id`,irl.`item_code`,irl.`item_name`,irl.`specification`,irl.`unit_of_measure`,irl.`batch_code`,
irl.`warehouse_id`,irl.`warehouse_code`,irl.`warehouse_name`,irl.`location_id`,irl.`location_code`,irl.`location_name`,irl.`area_id`,irl.`area_code`,irl.`area_name`,
'ITEM_CONSUME' AS source_doc_type,ir.`record_id` AS source_doc_id,"" AS source_doc_code,irl.`line_id` AS source_doc_line_id,
irl.`quantity_consume` AS transaction_quantity,ir.workorder_id,ir.workorder_code,

View File

@ -78,6 +78,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="attr3 != null "> and attr3 = #{attr3}</if>
<if test="attr4 != null "> and attr4 = #{attr4}</if>
and quantity_onhand != 0
order by create_time asc
</where>
</select>