@ -16,6 +16,7 @@ import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.platform.common.tool.TimeTool ;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean ;
import cn.estsh.i3plus.pojo.base.bean.ListPager ;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker ;
import cn.estsh.i3plus.pojo.base.common.Pager ;
import cn.estsh.i3plus.pojo.base.common.PagerHelper ;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil ;
@ -46,7 +47,6 @@ import java.text.SimpleDateFormat;
import java.util.* ;
import java.util.function.Function ;
import java.util.stream.Collectors ;
import java.util.stream.Stream ;
@Service
@Slf4j
@ -145,6 +145,9 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
@Autowired
private IMesPrintedSnLogRepository printedSnLogRepository ;
@Autowired
private SnowflakeIdMaker snowflakeIdMaker ;
@Override
public MesWorkOrder insert ( MesWorkOrder bean ) {
//校验产线与工位的关系
@ -912,7 +915,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
//查询产线信息
MesWorkCenter mesWorkCenter = getMesWorkCenter ( mesWorkOrderDb . getOrganizeCode ( ) , mesWorkOrderDb . getWorkCenterCode ( ) ) ;
//获取生产版本
MesProductVersion mesProductVersion = getMesProductVersion ( mesWorkOrderDb );
MesProductVersion mesProductVersion = getMesProductVersion ( mesWorkOrderDb .getPartNo ( ) , mesWorkOrderDb . getOrganizeCode ( ) , mesWorkOrderDb . getProductVersion ( ) );
//物料+生产版本获取bom信息
List < MesBom > mesBoms = mesBomService . findBomList ( mesPart . getOrganizeCode ( ) , mesPart , mesProductVersion . getAlternativePartList ( ) ) ;
//报工类型
@ -1012,7 +1015,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
}
}
//获取生产版本
MesProductVersion mesProductVersion = getMesProductVersion ( mesWorkOrder );
MesProductVersion mesProductVersion = getMesProductVersion ( mesWorkOrder .getPartNo ( ) , mesWorkOrder . getOrganizeCode ( ) , mesWorkOrder . getProductVersion ( ) );
//物料+生产版本获取bom信息
List < MesBom > mesBoms = mesBomService . findBomList ( mesPart . getOrganizeCode ( ) , mesPart , mesProductVersion . getAlternativePartList ( ) ) ;
//生成条码
@ -1022,6 +1025,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
List < MesMove > mesMoveList = new ArrayList < > ( ) ;
boolean isReport = false ;
boolean isMove = false ;
String nowTime = TimeTool . getNowTime ( true ) ;
//排序工单
if ( MesExtEnumUtil . ORDER_TYPE . SORT . getValue ( ) = = mesWorkOrder . getWorkOrderType ( ) ) {
//报工类型
@ -1038,7 +1042,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
isReport = true ;
isMove = true ;
} else if ( MesExtEnumUtil . MES_REPORT_TYPE . CUSTOMER_SUPPLY_MOVE . getValue ( ) = = mesProdRuleSortCfg . getReportType ( ) ) {
customerSupplyMove ( mesWorkOrderNew , mesProductVersion , mesBoms , sn , mesProductOffLineList , mesMoveList );
customerSupplyMove ( mesWorkOrderNew , mesProductVersion , mesBoms , sn , mesProductOffLineList , mesMoveList ,nowTime , true );
} else {
log . info ( "工单{}排序加工规则报工类型未维护" , mesWorkOrder . getWorkOrderNo ( ) ) ;
return ;
@ -1049,7 +1053,6 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
MesPartSap mesPartSap = mesPartSapService . getMesPartSapByPartNo ( mesWorkOrder . getPartNo ( ) , mesWorkOrder . getOrganizeCode ( ) ) ;
//成品汇报
if ( isReport ) {
String nowTime = TimeTool . getNowTime ( true ) ;
for ( MesBom mesBom : mesBoms ) {
mesProductOffLineList . add ( creatMesProductOffLine ( mesWorkOrderNew , mesProductVersion , sn , mesBom , false , nowTime , mesBoms . size ( ) ) ) ;
}
@ -1064,11 +1067,11 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
} else if ( MesExtEnumUtil . ORDER_TYPE . UN_SORT . getValue ( ) = = mesWorkOrder . getWorkOrderType ( ) ) {
MesProdRuleNosortCfg mesProdRuleNoSortCfg = mesProdRuleNosortCfgService . findMesProdRuleNosortCfgByWorkCenterCode ( mesWorkOrder . getWorkCenterCode ( ) , mesWorkOrder . getPartNo ( ) , mesWorkOrder . getOrganizeCode ( ) ) ;
if ( MesExtEnumUtil . NOSORT_REPORT_TYPE . REPORT . getValue ( ) = = mesProdRuleNoSortCfg . getReportType ( ) ) {
String nowTime = TimeTool . getNowTime ( true ) ;
for ( MesBom mesBom : mesBoms ) {
mesProductOffLineList . add ( creatMesProductOffLine ( mesWorkOrderNew , mesProductVersion , sn , mesBom , false , nowTime , mesBoms . size ( ) ) ) ;
}
} else if ( MesExtEnumUtil . NOSORT_REPORT_TYPE . CUSTOMER_SUPPLY_MOVE . getValue ( ) = = mesProdRuleNoSortCfg . getReportType ( ) ) {
customerSupplyMove ( mesWorkOrderNew , mesProductVersion , mesBoms , sn , mesProductOffLineList , mesMoveList , nowTime , false ) ;
}
} else {
log . info ( "工单{}排序规则不属于排序工单和非排序工单" , mesWorkOrder . getWorkOrderNo ( ) ) ;
@ -1346,7 +1349,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
if ( CollectionUtils . isEmpty ( oldProductOffLineList ) ) {
MesException . throwMesBusiException ( "条码【%s】未查询到报工数据" , model . getSn ( ) ) ;
}
oldProductOffLineList = mesProductOffLineService . findMesProductOffLineByRecordId ( oldProductOffLineList . iterator ( ) . next ( ) . getProductionRecordId ( ) , model . getOrganizeCode ( ) ) ;
//oldProductOffLineList = mesProductOffLineService.findMesProductOffLineByRecordId(oldProductOffLineList.iterator().next().getProductionRecordId(), model.getOrganizeCode());
oldProductOffLineList . forEach ( item - > {
item . setReportType ( MesExtEnumUtil . REPORT_TYPE . CBR . getValue ( ) ) ;
item . setOrderNo ( model . getShipOrderNo ( ) ) ;
@ -1430,10 +1433,11 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
return mesProductVersion ;
}
private void customerSupplyMove ( MesWorkOrder mesWorkOrder , MesProductVersion mesProductVersion , List < MesBom > mesBoms , String sn , List < MesProductOffLine > mesProductOffLineList , List < MesMove > mesMoveList ) {
private void customerSupplyMove ( MesWorkOrder mesWorkOrder , MesProductVersion mesProductVersion , List < MesBom > mesBoms , String sn , List < MesProductOffLine > mesProductOffLineList , List < MesMove > mesMoveList ,String nowTime , boolean isSort ) {
boolean isItemMove ;
boolean isItemReport ;
MesMoveRule moveRule ;
MesPart itemPart ;
//查询零件生产组的移库规则
List < MesMoveRule > moveRules = mesMoveRuleService . findMesMoveRuleByPartProdGroupCode ( mesWorkOrder . getPartProdGroupCode ( ) , mesWorkOrder . getOrganizeCode ( ) ) ;
Map < String , List < MesMoveRule > > mesMoveRuleMap = moveRules . stream ( ) . filter ( t - > Objects . nonNull ( t . getSrcType ( ) ) ) . collect ( Collectors . groupingBy ( MesMoveRule : : getSrcType ) ) ;
@ -1446,8 +1450,9 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
isItemReport = false ;
isItemMove = false ;
moveRule = null ;
itemPart = null ;
if ( itemPartMap . containsKey ( mesBom . getItemPartNo ( ) ) ) {
MesPart itemPart = itemPartMap . get ( mesBom . getItemPartNo ( ) ) . iterator ( ) . next ( ) ;
itemPart = itemPartMap . get ( mesBom . getItemPartNo ( ) ) . iterator ( ) . next ( ) ;
if ( ! StringUtil . isEmpty ( itemPart . getEsd ( ) ) & & mesMoveRuleMap . containsKey ( itemPart . getEsd ( ) ) ) {
moveRule = mesMoveRuleMap . get ( itemPart . getEsd ( ) ) . iterator ( ) . next ( ) ;
if ( MesExtEnumUtil . MOVE_TYPE_REPORT_TYPE . REPORT_MOVE . getValue ( ) = = moveRule . getReportType ( ) ) {
@ -1461,9 +1466,24 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
}
}
//汇报
if ( isItemReport ) {
String nowTime = TimeTool . getNowTime ( true ) ;
if ( isItemReport & & isSort ) {
mesProductOffLineList . add ( creatMesProductOffLine ( mesWorkOrder , mesProductVersion , sn , mesBom , true , nowTime , mesBoms . size ( ) ) ) ;
} else if ( isItemReport ) {
String reportSn = String . valueOf ( snowflakeIdMaker . nextId ( ) ) ;
MesProductVersion itemVersion = getMesProductVersion ( mesBom . getItemPartNo ( ) , mesWorkOrder . getOrganizeCode ( ) , mesProductVersion . getProductVersion ( ) ) ;
List < MesBom > bomList = null ;
try {
bomList = findBomList ( mesWorkOrder . getOrganizeCode ( ) , itemPart , itemVersion . getAlternativePartList ( ) ) ;
} catch ( Exception e ) {
}
//bom下的子节汇报
if ( ! CollectionUtils . isEmpty ( bomList ) ) {
for ( MesBom bom : bomList ) {
mesProductOffLineList . add ( getMesProductOffLine ( mesWorkOrder , itemVersion , reportSn , bom , mesBom . getItemQty ( ) , true , nowTime ) ) ;
}
} else {
mesProductOffLineList . add ( getMesProductOffLine ( mesWorkOrder , itemVersion , reportSn , mesBom , mesBom . getQty ( ) , true , nowTime ) ) ;
}
}
//移库
if ( isItemMove ) {
@ -1476,18 +1496,23 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
mesMoveList . add ( move ) ;
}
}
//bom下的子节汇报, 总成也需要汇报
if ( ! isSort & & ! CollectionUtils . isEmpty ( mesProductOffLineList ) ) {
for ( MesBom mesBom : mesBoms ) {
mesProductOffLineList . add ( getMesProductOffLine ( mesWorkOrder , mesProductVersion , sn , mesBom , mesBom . getQty ( ) , false , nowTime ) ) ;
}
}
}
private Map < String , List < MesPartSap > > getPartSapMap ( MesWorkOrder mesWorkOrder , List < String > itemPartNoList ) {
List < MesPartSap > mesPartSapList = mesPartSapService . findMesPartSapByPartNoList ( itemPartNoList , mesWorkOrder . getOrganizeCode ( ) ) ;
Map < String , List < MesPartSap > > mesPartSapMap = mesPartSapList . stream ( ) . filter ( t - > Objects . nonNull ( t . getPartNo ( ) ) ) . collect ( Collectors . groupingBy ( MesPartSap : : getPartNo ) ) ;
return mesPartSapMap ;
return mesPartSapList . stream ( ) . filter ( t - > Objects . nonNull ( t . getPartNo ( ) ) ) . collect ( Collectors . groupingBy ( MesPartSap : : getPartNo ) ) ;
}
private Map < String , List < MesPart > > getItemPartMap ( MesWorkOrder mesWorkOrder , List < String > itemPartNoList ) {
List < MesPart > itemPartList = iMesPartService . findMesPartByPartNoList ( itemPartNoList , mesWorkOrder . getOrganizeCode ( ) ) ;
Map < String , List < MesPart > > itemPartMap = itemPartList . stream ( ) . filter ( t - > Objects . nonNull ( t . getPartNo ( ) ) ) . collect ( Collectors . groupingBy ( MesPart : : getPartNo ) ) ;
return itemPartMap ;
return itemPartList . stream ( ) . filter ( t - > Objects . nonNull ( t . getPartNo ( ) ) ) . collect ( Collectors . groupingBy ( MesPart : : getPartNo ) ) ;
}
private MesProdRuleSortCfg getMesProdRuleSortCfg ( MesWorkOrder mesWorkOrder ) {
@ -1507,23 +1532,57 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
}
private MesProductVersion getMesProductVersion ( MesWorkOrder mesWorkOrder ) {
DdlPackBean ddlPackBean = DdlPackBean . getDdlPackBean ( mesWorkOrder . getOrganizeCode ( ) ) ;
DdlPreparedPack . getStringEqualPack ( mesWorkOrder . getPartNo ( ) , "partNo" , ddlPackBean ) ;
//DdlPreparedPack.getStringEqualPack(mesWorkOrder.getErpWorkCenter(), "workCenterCode", ddlPackBean);
DdlPreparedPack . getStringEqualPack ( mesWorkOrder . getProductVersion ( ) , "productVersion" , ddlPackBean ) ;
private MesProductVersion getMesProductVersion ( String partNo , String organizeCode , String productVersion ) {
DdlPackBean ddlPackBean = DdlPackBean . getDdlPackBean ( organizeCode ) ;
DdlPreparedPack . getStringEqualPack ( partNo , "partNo" , ddlPackBean ) ;
DdlPreparedPack . getStringEqualPack ( productVersion , "productVersion" , ddlPackBean ) ;
MesProductVersion mesProductVersion = mesProductVersionRDao . getByProperty ( ddlPackBean ) ;
if ( null = = mesProductVersion ) {
MesException . throwMesBusiException ( "物料【%s】生产版本【%s】信息不存在" , mesWorkOrder. getPartNo ( ) , mesWorkOrder . getProductVersion ( ) ) ;
MesException . throwMesBusiException ( "物料【%s】生产版本【%s】信息不存在" , partNo, productVersion ) ;
}
return mesProductVersion ;
}
private MesProductOffLine getMesProductOffLine ( MesWorkOrder mesWorkOrder , MesProductVersion mesProductVersion ,
String sn , MesBom mesBom , Double itemQty , boolean isItemReport , String nowTime ) {
MesProductOffLine newMesProductOffLine = new MesProductOffLine ( ) ;
BeanUtils . copyProperties ( mesBom , newMesProductOffLine , "id" , "systemSyncStatus" ) ;
newMesProductOffLine . setReportPartNo ( mesBom . getPartNo ( ) ) ;
newMesProductOffLine . setReportPartNameRdd ( mesBom . getPartName ( ) ) ;
newMesProductOffLine . setAlort ( mesProductVersion . getReceiveInventoryPoint ( ) ) ;
newMesProductOffLine . setStgeLoc ( mesProductVersion . getShipInventoryPoint ( ) ) ;
newMesProductOffLine . setQty ( MathOperation . mul ( mesWorkOrder . getNum ( ) , itemQty ) ) ;
newMesProductOffLine . setItemQty ( MathOperation . mul ( newMesProductOffLine . getQty ( ) , mesBom . getItemQty ( ) ) ) ;
if ( isItemReport & & mesBom . getPartNo ( ) . equals ( mesWorkOrder . getPartNo ( ) ) ) {
newMesProductOffLine . setReportPartNo ( mesBom . getItemPartNo ( ) ) ;
newMesProductOffLine . setReportPartNameRdd ( mesBom . getItemPartName ( ) ) ;
newMesProductOffLine . setItemPartNo ( "" ) ;
newMesProductOffLine . setItemPartName ( "" ) ;
newMesProductOffLine . setItemUnit ( "" ) ;
newMesProductOffLine . setItemQty ( 0d ) ;
}
newMesProductOffLine . setReportSn ( sn ) ;
newMesProductOffLine . setSerialNumber ( sn ) ;
newMesProductOffLine . setBomVersion ( mesWorkOrder . getProductVersion ( ) ) ;
newMesProductOffLine . setUnit ( mesBom . getUnit ( ) ) ;
newMesProductOffLine . setBomCode ( mesBom . getBomCode ( ) ) ;
newMesProductOffLine . setWorkOrderNo ( mesWorkOrder . getWorkOrderNo ( ) ) ;
newMesProductOffLine . setWorkOrderType ( mesWorkOrder . getWorkOrderType ( ) ) ;
newMesProductOffLine . setWorkCenterCode ( mesWorkOrder . getWorkCenterCode ( ) ) ;
newMesProductOffLine . setWorkCellCode ( mesWorkOrder . getWorkCellCode ( ) ) ;
newMesProductOffLine . setReportType ( mesWorkOrder . getReportType ( ) ) ;
newMesProductOffLine . setSapWorkCenter ( mesProductVersion . getWorkCenterCode ( ) ) ;
newMesProductOffLine . setOrganizeCode ( mesWorkOrder . getOrganizeCode ( ) ) ;
newMesProductOffLine . setDescription ( nowTime ) ;
newMesProductOffLine . setProductionRecordId ( mesWorkOrder . getId ( ) . toString ( ) ) ;
ConvertBean . serviceModelInitialize ( newMesProductOffLine , mesWorkOrder . getModifyUser ( ) ) ;
return newMesProductOffLine ;
}
private MesProductOffLine creatMesProductOffLine ( MesWorkOrder mesWorkOrder , MesProductVersion mesProductVersion ,
String sn , MesBom mesBom , boolean isItemReport , String nowTime , Integer bomTotalSize ) {
MesProductOffLine newMesProductOffLine ;
newMesProductOffLine = new MesProductOffLine ( ) ;
MesProductOffLine newMesProductOffLine = new MesProductOffLine ( ) ;
if ( ! isItemReport ) {
newMesProductOffLine . setReportPartNo ( mesWorkOrder . getPartNo ( ) ) ;
newMesProductOffLine . setReportPartNameRdd ( mesWorkOrder . getPartName ( ) ) ;
@ -1747,7 +1806,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
MesException . throwMesBusiException ( "产线【%s】不存在" , mesWorkOrderDb . getWorkCenterCode ( ) ) ;
}
//获取生产版本
MesProductVersion mesProductVersion = getMesProductVersion ( mesWorkOrderDb );
MesProductVersion mesProductVersion = getMesProductVersion ( mesWorkOrderDb .getPartNo ( ) , mesWorkOrderDb . getOrganizeCode ( ) , mesWorkOrderDb . getProductVersion ( ) );
//物料+生产版本获取bom信息
List < MesBom > mesBoms = findBomList ( mesPart . getOrganizeCode ( ) , mesPart , mesProductVersion . getAlternativePartList ( ) ) ;