@ -4,8 +4,10 @@ import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdOrgExtService ;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesShiftService ;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.* ;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.dao.IMesProductionRecordDao ;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException ;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant ;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderSortReportModel ;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords ;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService ;
import cn.estsh.i3plus.platform.common.convert.ConvertBean ;
@ -30,6 +32,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.format.DateParser ;
import lombok.extern.slf4j.Slf4j ;
import org.apache.commons.collections.CollectionUtils ;
import org.apache.commons.lang3.exception.ExceptionUtils ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
import org.springframework.beans.BeanUtils ;
@ -117,6 +120,18 @@ public class MesWorkOrderService implements IMesWorkOrderService {
@Autowired
private IMesProductVersionService mesProductVersionService ;
@Autowired
private IMesProductionRecordDao mesProductionRecordDao ;
@Autowired
private IMesMoveRuleService mesMoveRuleService ;
@Autowired
private MesWorkOrderPartRepository mesWorkOrderPartRepository ;
@Autowired
private MesMoveRepository mesMoveRepository ;
@Override
public MesWorkOrder queryMesWorkOrder ( MesWorkOrder workOrder ) {
@ -1075,6 +1090,75 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
}
@Override
public void doMesWorkOrderSortReport ( String organizeCode , Integer pageSize , String userName ) {
//数据初始化
MesWorkOrderSortReportModel model = initMesWorkOrderSortReportModel ( organizeCode , pageSize , userName ) ;
if ( CollectionUtils . isEmpty ( model . getMesProductionRecordList ( ) ) ) {
log . info ( "不存在未处理的加工记录信息" ) ;
return ;
}
//排序汇报
List < MesProductOffLine > mesProductOffLineList = new ArrayList < > ( ) ;
List < MesMove > mesMoveList = new ArrayList < > ( ) ;
boolean isReport = false ;
boolean isMove = false ;
for ( String orderNo : model . getMesProductionRecordMap ( ) . keySet ( ) ) {
try {
//加工记录
MesProductionRecord record = model . getMesProductionRecordMap ( ) . get ( orderNo ) . iterator ( ) . next ( ) ;
//工单信息
MesWorkOrder workOrder = getMesWorkOrder ( model . getMesWorkOrderMap ( ) , record . getWorkOrderNo ( ) ) ;
//生产版本
MesProductVersion mesProductVersion = getMesProductVersion ( model . getMesProductVersionMap ( ) , record . getReportPartNo ( ) , workOrder . getProductVersion ( ) ) ;
isReport = false ;
isMove = false ;
if ( MesExtEnumUtil . MES_REPORT_TYPE . REPORT . getValue ( ) = = record . getReportType ( ) ) {
isReport = true ;
} else if ( MesExtEnumUtil . MES_REPORT_TYPE . MOVE . getValue ( ) = = record . getReportType ( ) ) {
isMove = true ;
} else if ( MesExtEnumUtil . MES_REPORT_TYPE . REPORT_MOVE . getValue ( ) = = record . getReportType ( ) ) {
isReport = true ;
isMove = true ;
} else if ( MesExtEnumUtil . MES_REPORT_TYPE . CUSTOMER_SUPPLY_MOVE . getValue ( ) = = record . getReportType ( ) ) {
customerSupplyMove ( model , workOrder , record , mesProductVersion , findMesWorkOrderPartList ( model . getMesWorkOrderPartMap ( ) , record . getWorkOrderNo ( ) ) , mesProductOffLineList , mesMoveList ) ;
} else {
MesPcnException . throwMesBusiException ( "工单:%s汇报类型报工类型未维护" , record . getWorkOrderNo ( ) ) ;
}
//非客供品移库类型
if ( MesExtEnumUtil . MES_REPORT_TYPE . CUSTOMER_SUPPLY_MOVE . getValue ( ) ! = record . getReportType ( ) ) {
//成品汇报
if ( isReport ) {
for ( MesWorkOrderPart mesWorkOrderPart : findMesWorkOrderPartList ( model . getMesWorkOrderPartMap ( ) , record . getWorkOrderNo ( ) ) ) {
mesProductOffLineList . add ( getMesProductOffLine ( model , record , workOrder , mesProductVersion , mesWorkOrderPart , false ) ) ;
}
}
//todo 来源目标获取成品移库
if ( isMove ) {
mesMoveList . add ( createMove ( getMesPartSap ( model . getMesPartSapMap ( ) , record . getReportPartNo ( ) ) , record , "SrcErpLocation" , "destErpLocation" , workOrder . getErpWorkCenter ( ) , 1d , MesExtEnumUtil . MOVE_TYPE . FINISH_PRODUCTS_MOVE . getValue ( ) , userName ) ) ;
}
}
//保存报工记录 试制单不报工
if ( CollectionUtils . isNotEmpty ( mesProductOffLineList ) ) {
mesProductOffLineRDao . saveAll ( mesProductOffLineList ) ;
}
//保存移库记录
if ( CollectionUtils . isNotEmpty ( mesMoveList ) ) {
mesMoveRepository . saveAll ( mesMoveList ) ;
}
//更新加工记录
productionRecordService . updateProductionRecord ( model . getMesProductionRecordMap ( ) . get ( orderNo ) , userName , MesExtEnumUtil . REPORT_STATUS . REPORT_STATUS_20 . getValue ( ) , "" ) ;
} catch ( Exception e ) {
String msg = e . getMessage ( ) ;
if ( e instanceof ImppBusiException ) {
msg = ( ( ImppBusiException ) e ) . getErrorMsg ( ) ;
}
log . error ( "工单:{}报工失败{}" , orderNo , ExceptionUtils . getStackTrace ( e ) ) ;
productionRecordService . updateProductionRecord ( model . getMesProductionRecordMap ( ) . get ( orderNo ) , userName , MesExtEnumUtil . REPORT_STATUS . REPORT_STATUS_40 . getValue ( ) , msg ) ;
}
}
}
private MesProductVersion getProductVersion ( MesWorkOrder mesWorkOrderDb ) {
MesProductVersion mesProductVersion = mesProductVersionService . getMesProductVersion ( mesWorkOrderDb . getOrganizeCode ( ) , mesWorkOrderDb . getPartNo ( ) , mesWorkOrderDb . getProductVersion ( ) ) ;
if ( null = = mesProductVersion ) {
@ -1373,5 +1457,155 @@ public class MesWorkOrderService implements IMesWorkOrderService {
productionRecordRao . insert ( productionRecord ) ;
}
public MesWorkOrderSortReportModel initMesWorkOrderSortReportModel ( String organizeCode , Integer pageSize , String userName ) {
MesWorkOrderSortReportModel model = new MesWorkOrderSortReportModel ( organizeCode , userName , mesProductionRecordDao . findMesProductionRecordNoReport ( organizeCode , MesExtEnumUtil . WORK_CENTER_TYPE . SORT . getValue ( ) , pageSize ) ) ;
model . setMesWorkOrderList ( workOrderExtService . getWorkOrderList ( organizeCode , model . getWorkOrderList ( ) ) ) ;
model . setMesMoveRuleList ( mesMoveRuleService . findMesMoveRuleByPartProdGroupCode ( model . getPartProdGroupCodeList ( ) , organizeCode ) ) ;
model . setMesWorkOrderPartList ( findMesWorkOrderPartByOrderNo ( organizeCode , model . getWorkOrderList ( ) ) ) ;
model . setMesPartList ( iMesPartService . findMesPartByPartNo ( model . getPartNoAllList ( ) , organizeCode ) ) ;
model . setMesPartSapList ( iMesPartService . findMesPartSapByPartNo ( model . getPartNoAllList ( ) , organizeCode ) ) ;
model . setMesProductVersionList ( mesProductVersionService . findMesProductVersionByPartNo ( organizeCode , model . getPartNoList ( ) ) ) ;
return model ;
}
private void customerSupplyMove ( MesWorkOrderSortReportModel model , MesWorkOrder workOrder , MesProductionRecord record , MesProductVersion mesProductVersion , List < MesWorkOrderPart > mesWorkOrderPartList , List < MesProductOffLine > mesProductOffLineList , List < MesMove > mesMoveList ) {
boolean isItemMove ;
boolean isItemReport ;
MesMoveRule moveRule ;
//移库规则
Map < String , List < MesMoveRule > > mesMoveRuleMap = findMesMoveRuleList ( model . getMesMoveRuleMap ( ) , workOrder . getPartProdGroupCode ( ) ) . stream ( ) . filter ( t - > Objects . nonNull ( t . getSrcType ( ) ) ) . collect ( Collectors . groupingBy ( MesMoveRule : : getSrcType ) ) ;
for ( MesWorkOrderPart orderPart : mesWorkOrderPartList ) {
isItemReport = false ;
isItemMove = false ;
MesPart itemPart = getMesPart ( model . getMesPartMap ( ) , orderPart . getPartNo ( ) ) ;
if ( StringUtil . isEmpty ( itemPart . getEsd ( ) ) | | ! mesMoveRuleMap . containsKey ( itemPart . getEsd ( ) ) ) {
MesPcnException . throwMesBusiException ( "客供品移库零件【%s】维护的ESD属性未匹配到零件生产组【%s】中的移库规则" , orderPart . getPartNo ( ) , workOrder . getPartProdGroupCode ( ) ) ;
}
moveRule = mesMoveRuleMap . get ( itemPart . getEsd ( ) ) . iterator ( ) . next ( ) ;
if ( MesExtEnumUtil . MOVE_TYPE_REPORT_TYPE . REPORT_MOVE . getValue ( ) = = moveRule . getReportType ( ) ) {
isItemMove = true ;
isItemReport = true ;
} else if ( MesExtEnumUtil . MOVE_TYPE_REPORT_TYPE . REPORT . getValue ( ) = = moveRule . getReportType ( ) ) {
isItemReport = true ;
} else if ( MesExtEnumUtil . MOVE_TYPE_REPORT_TYPE . MOVE . getValue ( ) = = moveRule . getReportType ( ) ) {
isItemMove = true ;
} else {
MesPcnException . throwMesBusiException ( "客供品移库零件【%s】在零件生产组【%s】的移库规则中, 汇报类型未维护" , orderPart . getPartNo ( ) , workOrder . getPartProdGroupCode ( ) ) ;
}
//汇报
if ( isItemReport ) {
mesProductOffLineList . add ( getMesProductOffLine ( model , record , workOrder , mesProductVersion , orderPart , true ) ) ;
}
//移库
if ( isItemMove ) {
mesMoveList . add ( createMove ( getMesPartSap ( model . getMesPartSapMap ( ) , orderPart . getPartNo ( ) ) , record , moveRule . getErpSrcLocateNo ( ) , moveRule . getErpDestLocateNo ( ) , workOrder . getErpWorkCenter ( ) , orderPart . getItemQty ( ) , MesExtEnumUtil . MOVE_TYPE . RAW_MATERIAL_MOVE . getValue ( ) , model . getUserName ( ) ) ) ;
}
}
}
private MesWorkOrder getMesWorkOrder ( Map < String , List < MesWorkOrder > > workOrderMap , String workOrderNo ) {
MesWorkOrder workOrder = Objects . isNull ( workOrderMap ) | | StringUtils . isEmpty ( workOrderNo ) | | ! workOrderMap . containsKey ( workOrderNo ) ? null : workOrderMap . get ( workOrderNo ) . iterator ( ) . next ( ) ;
if ( Objects . isNull ( workOrder ) ) {
MesPcnException . throwMesBusiException ( "工单:【%s】信息不存在" , workOrderNo ) ;
}
return workOrder ;
}
private List < MesMoveRule > findMesMoveRuleList ( Map < String , List < MesMoveRule > > mesMoveRuleMap , String code ) {
List < MesMoveRule > moveRuleList = Objects . isNull ( mesMoveRuleMap ) | | StringUtils . isEmpty ( code ) | | ! mesMoveRuleMap . containsKey ( code ) ? null : mesMoveRuleMap . get ( code ) ;
if ( CollectionUtils . isEmpty ( moveRuleList ) ) {
MesPcnException . throwMesBusiException ( "零件生产组:【%s】移库规则信息不存在" , code ) ;
}
return moveRuleList ;
}
private List < MesWorkOrderPart > findMesWorkOrderPartList ( Map < String , List < MesWorkOrderPart > > workOrderPartMap , String workOrderNo ) {
List < MesWorkOrderPart > workOrderPartList = Objects . isNull ( workOrderPartMap ) | | StringUtils . isEmpty ( workOrderNo ) | | ! workOrderPartMap . containsKey ( workOrderNo ) ? null : workOrderPartMap . get ( workOrderNo ) ;
if ( CollectionUtils . isEmpty ( workOrderPartList ) ) {
MesPcnException . throwMesBusiException ( "工单:【%s】零件信息表数据不存在" , workOrderNo ) ;
}
return workOrderPartList ;
}
private MesPartSap getMesPartSap ( Map < String , List < MesPartSap > > partSapMap , String partNo ) {
MesPartSap partSap = Objects . isNull ( partSapMap ) | | StringUtils . isEmpty ( partNo ) | | ! partSapMap . containsKey ( partNo ) ? null : partSapMap . get ( partNo ) . iterator ( ) . next ( ) ;
if ( Objects . isNull ( partSap ) ) {
MesPcnException . throwMesBusiException ( "零件号:【%s】信息不存在" , partNo ) ;
}
return partSap ;
}
private MesPart getMesPart ( Map < String , List < MesPart > > partMap , String partNo ) {
MesPart partSap = Objects . isNull ( partMap ) | | StringUtils . isEmpty ( partNo ) | | ! partMap . containsKey ( partNo ) ? null : partMap . get ( partNo ) . iterator ( ) . next ( ) ;
if ( Objects . isNull ( partSap ) ) {
MesPcnException . throwMesBusiException ( "零件号:【%s】信息不存在" , partNo ) ;
}
return partSap ;
}
private MesProductVersion getMesProductVersion ( Map < String , List < MesProductVersion > > productVersionMap , String reportPartNo , String productVersion ) {
Optional < MesProductVersion > optional = Objects . isNull ( productVersionMap ) | | ! productVersionMap . containsKey ( reportPartNo ) ? Optional . empty ( ) : productVersionMap . get ( reportPartNo ) . stream ( ) . filter ( t - > t . getProductVersion ( ) . equals ( productVersion ) ) . findFirst ( ) ;
if ( ! optional . isPresent ( ) ) {
MesPcnException . throwMesBusiException ( "零件:【%s】生产版本:【%s】信息存在" , reportPartNo , productVersion ) ;
}
return optional . get ( ) ;
}
@Override
public List < MesWorkOrderPart > findMesWorkOrderPartByOrderNo ( String organizeCode , List < String > workOrderNoList ) {
if ( StringUtils . isEmpty ( organizeCode ) | | CollectionUtils . isEmpty ( workOrderNoList ) ) return null ;
DdlPackBean packBean = DdlPackBean . getDdlPackBean ( organizeCode ) ;
if ( workOrderNoList . size ( ) = = MesPcnExtConstWords . ONE )
DdlPreparedPack . getStringEqualPack ( workOrderNoList . iterator ( ) . next ( ) , "workOrderNo" , packBean ) ;
DdlPreparedPack . getInPackList ( workOrderNoList , "workOrderNo" , packBean ) ;
return mesWorkOrderPartRepository . findByHqlWhere ( packBean ) ;
}
private MesProductOffLine getMesProductOffLine ( MesWorkOrderSortReportModel model , MesProductionRecord record , MesWorkOrder workOrder , MesProductVersion mesProductVersion , MesWorkOrderPart mesWorkOrderPart , boolean isItemReport ) {
MesProductOffLine newMesProductOffLine = new MesProductOffLine ( ) ;
if ( ! isItemReport ) {
newMesProductOffLine . setReportPartNo ( record . getPartNo ( ) ) ;
newMesProductOffLine . setReportPartNameRdd ( record . getPartName ( ) ) ;
}
newMesProductOffLine . setItemPartNo ( mesWorkOrderPart . getPartNo ( ) ) ;
newMesProductOffLine . setItemPartName ( mesWorkOrderPart . getPartName ( ) ) ;
newMesProductOffLine . setItemQty ( mesWorkOrderPart . getItemQty ( ) ) ;
newMesProductOffLine . setAlort ( mesProductVersion . getReceiveInventoryPoint ( ) ) ;
newMesProductOffLine . setStgeLoc ( mesProductVersion . getShipInventoryPoint ( ) ) ;
newMesProductOffLine . setQty ( 1d ) ;
newMesProductOffLine . setReportSn ( record . getProductSn ( ) ) ;
newMesProductOffLine . setBomVersion ( workOrder . getProductVersion ( ) ) ;
newMesProductOffLine . setSerialNumber ( record . getSerialNumber ( ) ) ;
newMesProductOffLine . setItemUnit ( mesWorkOrderPart . getItemUnit ( ) ) ;
newMesProductOffLine . setWorkOrderNo ( workOrder . getWorkOrderNo ( ) ) ;
newMesProductOffLine . setWorkOrderType ( workOrder . getWorkOrderType ( ) ) ;
newMesProductOffLine . setWorkCenterCode ( record . getWorkCenterCode ( ) ) ;
newMesProductOffLine . setWorkCellCode ( record . getWorkCellCode ( ) ) ;
newMesProductOffLine . setReportType ( record . getReportType ( ) ) ;
newMesProductOffLine . setSapWorkCenter ( mesProductVersion . getWorkCenterCode ( ) ) ;
newMesProductOffLine . setOrganizeCode ( model . getOrganizeCode ( ) ) ;
newMesProductOffLine . setDescription ( record . getCompleteDateTime ( ) ) ;
ConvertBean . serviceModelInitialize ( newMesProductOffLine , model . getUserName ( ) ) ;
return newMesProductOffLine ;
}
private MesMove createMove ( MesPartSap mesPart , MesProductionRecord record , String source , String target , String erpWorkCenterCode , Double qty , Integer moveType , String userName ) {
MesMove move = new MesMove ( ) ;
move . setMeins ( record . getReportPartNo ( ) ) ;
if ( ! Objects . isNull ( mesPart ) ) {
move . setMeins ( mesPart . getUnit ( ) ) ;
}
move . setOrganizeCode ( record . getOrganizeCode ( ) ) ;
move . setFactoryCode ( record . getOrganizeCode ( ) ) ;
move . setLgort ( source ) ;
move . setUmlgo ( target ) ;
move . setMenge ( qty ) ;
move . setPostDate ( TimeTool . getToday ( ) ) ;
move . setProductSn ( record . getProductSn ( ) ) ;
move . setMoveType ( moveType ) ;
move . setPostTime ( TimeTool . getTimeShortWithColon ( ) ) ;
move . setWorkCenter ( erpWorkCenterCode ) ;
ConvertBean . serviceModelInitialize ( move , userName ) ;
return move ;
}
}