生产报工从线边库扣减物料时自动从多条库存记录中扣减。
This commit is contained in:
parent
8cf7f84ccf
commit
bfbc1c5f89
@ -228,6 +228,7 @@ public class ProFeedbackController extends BaseController
|
|||||||
* @param record
|
* @param record
|
||||||
*/
|
*/
|
||||||
private void executeItemConsume(WmItemConsume record){
|
private void executeItemConsume(WmItemConsume record){
|
||||||
|
//需要在此处进行分批次领料的线边库扣减
|
||||||
List<ItemConsumeTxBean> beans = wmItemConsumeService.getTxBeans(record.getRecordId());
|
List<ItemConsumeTxBean> beans = wmItemConsumeService.getTxBeans(record.getRecordId());
|
||||||
storageCoreService.processItemConsume(beans);
|
storageCoreService.processItemConsume(beans);
|
||||||
record.setStatus(UserConstants.ORDER_STATUS_FINISHED);
|
record.setStatus(UserConstants.ORDER_STATUS_FINISHED);
|
||||||
|
|||||||
@ -64,6 +64,7 @@ public interface IWmItemConsumeService
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据生产报工单生成物料消耗记录
|
* 根据生产报工单生成物料消耗记录
|
||||||
|
* 这里需要处理同一个工单分多次领料的问题(每次领料可能是不同的批次)
|
||||||
* @param feedback
|
* @param feedback
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package com.ktg.mes.wm.service.impl;
|
package com.ktg.mes.wm.service.impl;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
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.domain.*;
|
||||||
import com.ktg.mes.pro.mapper.*;
|
import com.ktg.mes.pro.mapper.*;
|
||||||
import com.ktg.mes.wm.domain.WmItemConsumeLine;
|
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.domain.tx.ItemConsumeTxBean;
|
||||||
import com.ktg.mes.wm.mapper.WmItemConsumeLineMapper;
|
import com.ktg.mes.wm.mapper.WmItemConsumeLineMapper;
|
||||||
|
import com.ktg.mes.wm.mapper.WmMaterialStockMapper;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import com.ktg.mes.wm.mapper.WmItemConsumeMapper;
|
import com.ktg.mes.wm.mapper.WmItemConsumeMapper;
|
||||||
@ -52,6 +55,9 @@ public class WmItemConsumeServiceImpl implements IWmItemConsumeService
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ProRouteProductBomMapper proRouteProductBomMapper;
|
private ProRouteProductBomMapper proRouteProductBomMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private WmMaterialStockMapper wmMaterialStockMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询物料消耗记录
|
* 查询物料消耗记录
|
||||||
*
|
*
|
||||||
@ -166,16 +172,85 @@ public class WmItemConsumeServiceImpl implements IWmItemConsumeService
|
|||||||
if(CollectionUtil.isNotEmpty(boms)){
|
if(CollectionUtil.isNotEmpty(boms)){
|
||||||
for (ProRouteProductBom bom: boms
|
for (ProRouteProductBom bom: boms
|
||||||
) {
|
) {
|
||||||
WmItemConsumeLine line = new WmItemConsumeLine();
|
//这里根据需要消耗的原材料/半成品信息 匹配出对应的线边库库存记录。
|
||||||
line.setRecordId(itemConsume.getRecordId());
|
BigDecimal quantityToConsume = bom.getQuantity().multiply(feedback.getQuantityFeedback()); //总的消耗量
|
||||||
line.setItemId(bom.getItemId());
|
|
||||||
line.setItemCode(bom.getItemCode());
|
//从线边库中,根据生产工单、物料按照先进先出的原则查询库存现有量
|
||||||
line.setItemName(bom.getItemName());
|
WmMaterialStock p = new WmMaterialStock();
|
||||||
line.setSpecification(bom.getSpecification());
|
p.setWorkorderCode(feedback.getWorkorderCode()); //当前工单
|
||||||
line.setUnitOfMeasure(bom.getUnitOfMeasure());
|
p.setItemId(bom.getItemId()); //指定物料
|
||||||
line.setQuantityConsume(bom.getQuantity().multiply(feedback.getQuantityFeedback()));
|
p.setWarehouseCode(UserConstants.VIRTUAL_WH); //线边库
|
||||||
line.setBatchCode(workorder.getBatchCode());
|
List<WmMaterialStock> ms = wmMaterialStockMapper.selectWmMaterialStockList(p);
|
||||||
wmItemConsumeLineMapper.insertWmItemConsumeLine(line);
|
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 {
|
}else {
|
||||||
return null; //如果本道工序没有配置BOM物料,则直接返回空
|
return null; //如果本道工序没有配置BOM物料,则直接返回空
|
||||||
|
|||||||
@ -124,6 +124,11 @@ public class WmProductProduceServiceImpl implements IWmProductProduceService
|
|||||||
return wmProductProduceMapper.deleteWmProductProduceByRecordId(recordId);
|
return wmProductProduceMapper.deleteWmProductProduceByRecordId(recordId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据报工单生成
|
||||||
|
* @param feedback
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public WmProductProduce generateProductProduce(ProFeedback feedback) {
|
public WmProductProduce generateProductProduce(ProFeedback feedback) {
|
||||||
ProWorkorder workorder = proWorkorderMapper.selectProWorkorderByWorkorderId(feedback.getWorkorderId());
|
ProWorkorder workorder = proWorkorderMapper.selectProWorkorderByWorkorderId(feedback.getWorkorderId());
|
||||||
|
|||||||
@ -90,7 +90,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="getTxBeans" parameterType="Long" resultMap="ItemConsumeTxBeanResult">
|
<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`,
|
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,
|
'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,
|
irl.`quantity_consume` AS transaction_quantity,ir.workorder_id,ir.workorder_code,
|
||||||
|
|||||||
@ -78,6 +78,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<if test="attr3 != null "> and attr3 = #{attr3}</if>
|
<if test="attr3 != null "> and attr3 = #{attr3}</if>
|
||||||
<if test="attr4 != null "> and attr4 = #{attr4}</if>
|
<if test="attr4 != null "> and attr4 = #{attr4}</if>
|
||||||
and quantity_onhand != 0
|
and quantity_onhand != 0
|
||||||
|
order by create_time asc
|
||||||
</where>
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user