@ -39,6 +39,7 @@ import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j ;
import lombok.extern.slf4j.Slf4j ;
import org.apache.commons.collections.map.CaseInsensitiveMap ;
import org.apache.commons.collections.map.CaseInsensitiveMap ;
import org.apache.commons.collections.map.HashedMap ;
import org.apache.commons.collections.map.HashedMap ;
import org.python.antlr.ast.While ;
import org.springframework.beans.BeanUtils ;
import org.springframework.beans.BeanUtils ;
import org.springframework.beans.BeansException ;
import org.springframework.beans.BeansException ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.beans.factory.annotation.Autowired ;
@ -48,6 +49,7 @@ import org.springframework.util.StringUtils;
import javax.persistence.EntityManager ;
import javax.persistence.EntityManager ;
import javax.persistence.Query ;
import javax.persistence.Query ;
import java.text.ParseException ;
import java.text.SimpleDateFormat ;
import java.text.SimpleDateFormat ;
import java.time.LocalTime ;
import java.time.LocalTime ;
import java.util.* ;
import java.util.* ;
@ -186,6 +188,26 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
@Autowired
@Autowired
private MesPartProdGroupRepository mesPartProdGroupRao ;
private MesPartProdGroupRepository mesPartProdGroupRao ;
@Autowired
private MesPullingOrderInfoRepository mesPullingOrderInfoRao ;
@Autowired
private MesPullingOrderPartInfoRepository pullingOrderPartInfoRao ;
@Autowired
private MesPartPullRepository partPullRao ;
@Autowired
private MesWorkCenterRepository workCenterRao ;
@Autowired
private MesPartPullDetailRepository partPullDetailRao ;
@Autowired
private MesBomRepository bomRao ;
@Override
@Override
public MesWorkOrder insert ( MesWorkOrder bean ) {
public MesWorkOrder insert ( MesWorkOrder bean ) {
// 数据校验
// 数据校验
@ -220,6 +242,10 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
//非排序
//非排序
} else if ( bean . getWorkOrderType ( ) = = MesExtEnumUtil . ORDER_TYPE . UN_SORT . getValue ( ) ) {
} else if ( bean . getWorkOrderType ( ) = = MesExtEnumUtil . ORDER_TYPE . UN_SORT . getValue ( ) ) {
insertUnSortWorkOrder ( bean , mesWorkCenter ) ;
insertUnSortWorkOrder ( bean , mesWorkCenter ) ;
//创建kitting
List < MesWorkOrder > kittingList = new ArrayList < > ( ) ;
kittingList . add ( bean ) ;
doCreateKitting ( kittingList , bean . getOrganizeCode ( ) ) ;
//bto
//bto
} else {
} else {
insertBtoWorkOrder ( bean ) ;
insertBtoWorkOrder ( bean ) ;
@ -269,15 +295,53 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
closeMesPrintQueue ( bean . getWorkOrderNo ( ) , bean . getOrganizeCode ( ) , AuthUtilExt . getUserName ( ) ) ;
closeMesPrintQueue ( bean . getWorkOrderNo ( ) , bean . getOrganizeCode ( ) , AuthUtilExt . getUserName ( ) ) ;
}
}
result . setWorkOrderStatus ( bean . getWorkOrderStatus ( ) ) ;
result . setWorkOrderStatus ( bean . getWorkOrderStatus ( ) ) ;
//非排序关闭订单 需要关闭kitting
doCloseKittingOrder ( bean , bean . getModifyUser ( ) ) ;
List < MesWorkOrder > list = new ArrayList < > ( ) ;
list . add ( bean ) ;
doCreateKitting ( list , bean . getOrganizeCode ( ) ) ;
}
}
updateMesWorkOrder ( result , MesExtEnumUtil . WORK_ORDER_LOG_TYPE . UPDATE , 0 ) ;
updateMesWorkOrder ( result , MesExtEnumUtil . WORK_ORDER_LOG_TYPE . UPDATE , 0 ) ;
if ( isSavePrintQueue ) insertPrintQueue ( result ) ;
if ( isSavePrintQueue ) {
insertPrintQueue ( result ) ;
//发布时 校验是否需要生成拉动单
List < MesWorkOrder > list = new ArrayList < > ( ) ;
list . add ( result ) ;
doCreateKitting ( list , result . getOrganizeCode ( ) ) ;
}
return result ;
return result ;
}
}
public void doCloseKittingOrder ( MesWorkOrder mesWorkOrder , String userName ) {
String organizeCode = mesWorkOrder . getOrganizeCode ( ) ;
DdlPackBean pullOrderPackBean = DdlPackBean . getDdlPackBean ( organizeCode ) ;
DdlPreparedPack . getStringEqualPack ( mesWorkOrder . getWorkOrderNo ( ) , "workOrderNo" , pullOrderPackBean ) ;
List < MesPullingOrderInfo > pullingOrderInfoList = pullingOrderInfoRepository . findByHqlWhere ( pullOrderPackBean ) ;
if ( pullingOrderInfoList ! = null & & ! pullingOrderInfoList . isEmpty ( ) ) {
List < MesPullingOrderInfo > infoList = pullingOrderInfoList . stream ( ) . filter ( item - > item . getPullOrderStatus ( ) ! = MesExtEnumUtil . PULL_ORDER_STATUS . PULL_ORDER_STATUS_50 . getValue ( ) ) . collect ( Collectors . toList ( ) ) ;
if ( ! infoList . isEmpty ( ) ) {
MesPullingOrderInfo info = infoList . get ( 0 ) ;
String pullCode = info . getPullCode ( ) ;
//查询出拉动组,判断是否需要关闭拉动单
DdlPackBean ddlPackBean = DdlPackBean . getDdlPackBean ( organizeCode ) ;
DdlPreparedPack . getStringEqualPack ( pullCode , "pullCode" , ddlPackBean ) ;
List < MesPartPull > mesPartPullList = partPullRao . findByHqlWhere ( ddlPackBean ) ;
if ( mesPartPullList ! = null & & ! mesPartPullList . isEmpty ( ) ) {
MesPartPull mesPartPull = mesPartPullList . get ( 0 ) ;
String pullOrderCloseState = mesPartPull . getPullOrderCloseState ( ) ;
if ( ! StringUtils . isEmpty ( pullOrderCloseState ) ) {
List < String > closeState = Arrays . asList ( pullOrderCloseState . split ( "," ) ) ;
if ( closeState . contains ( mesWorkOrder . getWorkOrderStatus ( ) . toString ( ) ) ) {
mesPullingOrderInfoRao . updateByProperties ( new String [ ] { "workOrderNo" } , new Object [ ] { mesWorkOrder . getWorkOrderNo ( ) } , new String [ ] { "pullOrderStatus" , "modifyUser" } , new Object [ ] { MesExtEnumUtil . PULL_ORDER_STATUS . PULL_ORDER_STATUS_50 . getValue ( ) , userName } ) ;
}
}
}
}
}
}
@Override
@Override
protected void setPackQueryBean ( MesWorkOrder bean , DdlPackBean packBean ) {
protected void setPackQueryBean ( MesWorkOrder bean , DdlPackBean packBean ) {
DdlPreparedPack . getStringLikerPack ( bean . getWorkOrderNo ( ) , MesExtConstWords . WORK_ORDER_NO , packBean ) ;
DdlPreparedPack . getStringLikerPack ( bean . getWorkOrderNo ( ) , MesExtConstWords . WORK_ORDER_NO , packBean ) ;
@ -665,6 +729,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
seqList = syncFuncService . syncSerialNo ( orderSeqSerialNoModel . organizeCode ( next . getOrganizeCode ( ) ) , next . getCreateUser ( ) , next . getOrganizeCode ( ) , mesWorkOrderList . size ( ) ) . getResultList ( ) ;
seqList = syncFuncService . syncSerialNo ( orderSeqSerialNoModel . organizeCode ( next . getOrganizeCode ( ) ) , next . getCreateUser ( ) , next . getOrganizeCode ( ) , mesWorkOrderList . size ( ) ) . getResultList ( ) ;
}
}
List < MesWorkOrderLog > mesWorkOrderLogList = new ArrayList < > ( ) ;
List < MesWorkOrderLog > mesWorkOrderLogList = new ArrayList < > ( ) ;
List < MesWorkOrder > workOrderListForKitting = new ArrayList < > ( ) ;
int index = 0 ;
int index = 0 ;
for ( MesWorkOrder item : mesWorkOrderList ) {
for ( MesWorkOrder item : mesWorkOrderList ) {
//获取相同类型 相同标识 生产序号最大值的
//获取相同类型 相同标识 生产序号最大值的
@ -687,6 +752,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
ConvertBean . serviceModelInitialize ( copyMesWorkOrder , item . getCreateUser ( ) ) ;
ConvertBean . serviceModelInitialize ( copyMesWorkOrder , item . getCreateUser ( ) ) ;
index + + ;
index + + ;
baseRDao . insert ( copyMesWorkOrder ) ;
baseRDao . insert ( copyMesWorkOrder ) ;
//保存记录
//保存记录
MesWorkOrderLog workOrderLog = new MesWorkOrderLog ( ) ;
MesWorkOrderLog workOrderLog = new MesWorkOrderLog ( ) ;
BeanUtils . copyProperties ( item , workOrderLog , MesExtConstWords . ID , MesExtConstWords . SYSTEM_SYNC_STATUS ) ;
BeanUtils . copyProperties ( item , workOrderLog , MesExtConstWords . ID , MesExtConstWords . SYSTEM_SYNC_STATUS ) ;
@ -713,6 +779,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
item . setSystemSyncStatus ( CommonEnumUtil . TRUE_OR_FALSE . FALSE . getValue ( ) ) ;
item . setSystemSyncStatus ( CommonEnumUtil . TRUE_OR_FALSE . FALSE . getValue ( ) ) ;
ConvertBean . serviceModelInitialize ( item , item . getCreateUser ( ) ) ;
ConvertBean . serviceModelInitialize ( item , item . getCreateUser ( ) ) ;
baseRDao . insert ( item ) ;
baseRDao . insert ( item ) ;
workOrderListForKitting . add ( item ) ;
index + + ;
index + + ;
//保存记录
//保存记录
MesWorkOrderLog workOrderLog = new MesWorkOrderLog ( ) ;
MesWorkOrderLog workOrderLog = new MesWorkOrderLog ( ) ;
@ -723,6 +790,328 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
if ( ! CollectionUtils . isEmpty ( mesWorkOrderLogList ) ) {
if ( ! CollectionUtils . isEmpty ( mesWorkOrderLogList ) ) {
workOrderLogService . insertBatch ( mesWorkOrderLogList ) ;
workOrderLogService . insertBatch ( mesWorkOrderLogList ) ;
}
}
//创建kitting
doCreateKitting ( workOrderListForKitting , next . organizeCode ) ;
}
private void doCreateKitting ( List < MesWorkOrder > mesWorkOrderList , String organizeCode ) {
mesWorkOrderList = mesWorkOrderList . stream ( ) . filter ( item - > item . getPullingStatus ( ) ! = MesExtEnumUtil . WORK_ORDER_PULLING_STATUS . SUBMIT . getValue ( ) ) . collect ( Collectors . toList ( ) ) ;
if ( mesWorkOrderList . isEmpty ( ) ) {
return ;
}
//1.拉动组获取 -- 根据拉动组类型获取kitting,需要判断是否生成是否生成拉动单开关
DdlPackBean partPullPackBean = DdlPackBean . getDdlPackBean ( organizeCode ) ;
DdlPreparedPack . getNumEqualPack ( MesExtEnumUtil . PART_PULL_ORDER_TYPE . KITTING_PULL . getValue ( ) , "pullOrderType" , partPullPackBean ) ;
DdlPreparedPack . getNumEqualPack ( CommonEnumUtil . TRUE_OR_FALSE . TRUE . getValue ( ) , "isAutoCreatePullOrder" , partPullPackBean ) ;
List < MesPartPull > mesPartPullList = partPullRao . findByHqlWhere ( partPullPackBean ) ;
//2.工单 过滤出未生成拉动单的工单pullingStatus,按照拉动组产线分组,每组按照工单序号排序
Map < String , List < MesWorkOrder > > workOrderMap = mesWorkOrderList . stream ( ) . filter ( item - > item . getPullingStatus ( ) = = MesExtEnumUtil . WORK_ORDER_PULLING_STATUS . NOTCREATE . getValue ( ) ) . collect ( Collectors . groupingBy ( MesWorkOrder : : getWorkCenterCode ) ) ;
//3.查询2中所有的产线信息 ,判断生成拉动单的工单状态 generateStatus 与工单状态对比 是否生成拉动单 MesExtEnumUtil.GENERATE_STATUS需要和工单类型一致才生成拉动单
List < String > workOrderCenterList = new ArrayList < > ( workOrderMap . keySet ( ) ) ;
DdlPackBean workCenterPackBean = DdlPackBean . getDdlPackBean ( organizeCode ) ;
DdlPreparedPack . getInPackList ( workOrderCenterList , "workCenterCode" , workCenterPackBean ) ;
List < MesWorkCenter > workCenterList = workCenterRao . findByHqlWhere ( workCenterPackBean ) ;
Map < String , List < MesWorkCenter > > workCenterMap = workCenterList . stream ( ) . collect ( Collectors . groupingBy ( MesWorkCenter : : getWorkCenterCode ) ) ;
//4.遍历拉动组
for ( MesPartPull mesPartPull : mesPartPullList ) {
String workCenterCode = mesPartPull . getWorkCenterCode ( ) ;
//按数量圆整
if ( mesPartPull . getRoundMethod ( ) = = MesExtEnumUtil . PART_PULL_ROUND_METHOD . ROUND_BY_QUANTITY . getValue ( ) ) {
List < MesWorkOrder > workOrderList = workOrderMap . get ( workCenterCode ) ;
//遍历工单, 打散成bom 生成拉动单
List < MesWorkCenter > mesWorkCenters = workCenterMap . get ( workCenterCode ) ;
if ( CollectionUtils . isEmpty ( workOrderList ) | | CollectionUtils . isEmpty ( mesWorkCenters ) ) {
continue ;
}
//判断当前产线是否需要生成拉动单
MesWorkCenter mesWorkCenter = mesWorkCenters . get ( 0 ) ;
Integer generateStatus = mesWorkCenter . getGenerateStatus ( ) ;
if ( generateStatus = = null ) {
generateStatus = MesExtEnumUtil . GENERATE_STATUS . GENERATE_STATUS_20 . getValue ( ) ;
}
Map < String , List < MesWorkOrder > > orderMap = workOrderList . stream ( ) . collect ( Collectors . groupingBy ( MesWorkOrder : : getPartNo ) ) ;
for ( String producePartNoAndTime : orderMap . keySet ( ) ) {
List < MesWorkOrder > workOrderListNew = orderMap . get ( producePartNoAndTime ) ;
Integer finalGenerateStatus = generateStatus ;
//过滤掉不生成拉动单的工单
workOrderListNew = workOrderListNew . stream ( ) . filter ( item - > item . getWorkOrderStatus ( ) . equals ( finalGenerateStatus ) ) . collect ( Collectors . toList ( ) ) ;
if ( ! workOrderListNew . isEmpty ( ) ) {
doCreateKittingOrder ( workOrderListNew , mesPartPull , mesWorkCenter ) ;
}
}
//按成套圆整
} else if ( mesPartPull . getRoundMethod ( ) = = MesExtEnumUtil . PART_PULL_ROUND_METHOD . ROUND_DOOR_PANELS_NUMBER . getValue ( ) ) {
//按成套圆整 会是同一个拉动组 生成拉动单
List < MesWorkOrder > workOrderList1 = workOrderMap . get ( workCenterCode ) ;
if ( CollectionUtils . isEmpty ( workOrderList1 ) ) {
continue ;
}
Map < Long , List < MesWorkOrder > > groupCodeMap = workOrderList1 . stream ( ) . collect ( Collectors . groupingBy ( MesWorkOrder : : getGroupCode ) ) ;
for ( Long l : groupCodeMap . keySet ( ) ) {
List < MesWorkOrder > workOrderList = groupCodeMap . get ( l ) ;
List < MesWorkCenter > mesWorkCenters = workCenterMap . get ( workCenterCode ) ;
if ( CollectionUtils . isEmpty ( workOrderList ) | | CollectionUtils . isEmpty ( mesWorkCenters ) ) {
continue ;
}
doCreateGroupKittingOrder ( workOrderList , mesPartPull , mesWorkCenters . get ( 0 ) ) ;
}
}
}
}
//按成套圆整
private void doCreateGroupKittingOrder ( List < MesWorkOrder > workOrderListNew , MesPartPull mesPartPull , MesWorkCenter mesWorkCenter ) {
String organizeCode = mesPartPull . getOrganizeCode ( ) ;
List < MesBom > list = new ArrayList < > ( ) ;
//1.查询拉动组详情
DdlPackBean pullPartDetailPackBean = DdlPackBean . getDdlPackBean ( organizeCode ) ;
DdlPreparedPack . getStringEqualPack ( mesPartPull . getPullCode ( ) , "pullCode" , pullPartDetailPackBean ) ;
List < MesPartPullDetail > mesPartPullDetailList = partPullDetailRao . findByHqlWhere ( pullPartDetailPackBean ) ;
if ( CollectionUtils . isEmpty ( mesPartPullDetailList ) ) {
return ;
}
// 打散所有的工单的bom
List < String > pullPartNoList = mesPartPullDetailList . stream ( ) . map ( MesPartPullDetail : : getPullPartNo ) . collect ( Collectors . toList ( ) ) ;
Map < String , MesPartPullDetail > pullDetailMap = mesPartPullDetailList . stream ( ) . collect ( Collectors . toMap ( MesPartPullDetail : : getPullPartNo , Function . identity ( ) ) ) ;
for ( MesWorkOrder mesWorkOrder : workOrderListNew ) {
List < MesBom > bomList = getPlatBom ( null , mesWorkOrder . getPartNo ( ) , TimeTool . getNowTime ( true ) , organizeCode ) ;
List < MesBom > collect = bomList . stream ( ) . filter ( item - > pullPartNoList . contains ( item . getItemPartNo ( ) ) ) . collect ( Collectors . toList ( ) ) ;
mesBomRDao . detachList ( collect ) ;
collect . forEach ( item - > item . setItemQty ( item . getItemQty ( ) * mesWorkOrder . getQty ( ) ) ) ;
list . addAll ( collect ) ;
}
if ( list . isEmpty ( ) ) {
return ;
}
// 计算所有拉动单的数量,生成拉动单
String kittingOrderNoRuleCode = mesConfigService . getCfgValue ( organizeCode , "KITTING_ORDER_NO_RULE_CODE" ) ;
GenSerialNoModel genSerialNoModel = new GenSerialNoModel ( kittingOrderNoRuleCode ) ;
genSerialNoModel . setDynamicRule ( mesPartPull . getPullCode ( ) ) ;
List < String > resultList = syncFuncService . syncSerialNo ( genSerialNoModel . organizeCode ( organizeCode ) , AuthUtil . getSessionUser ( ) . getUserName ( ) , organizeCode , 1 ) . getResultList ( ) ;
String serialNo = resultList . get ( 0 ) ;
String workOrderStr = workOrderListNew . stream ( ) . map ( MesWorkOrder : : getWorkOrderNo ) . collect ( Collectors . joining ( "/r/n" ) ) ;
String workOrderPartNoStr = workOrderListNew . stream ( ) . map ( MesWorkOrder : : getPartNo ) . collect ( Collectors . joining ( "/r/n" ) ) ;
String workOrderPartNameStr = workOrderListNew . stream ( ) . map ( MesWorkOrder : : getPartName ) . collect ( Collectors . joining ( "/r/n" ) ) ;
String custPartNo = workOrderListNew . stream ( ) . map ( MesWorkOrder : : getCustPartNo ) . collect ( Collectors . joining ( "/r/n" ) ) ;
MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo ( ) ;
pullingOrder . setOrganizeCode ( organizeCode ) ;
pullingOrder . setPullingOrderNo ( serialNo ) ; //拉动单号 + 8位年月日 + 5位流水号
pullingOrder . setPullOrderType ( mesPartPull . getPullOrderType ( ) ) ;
pullingOrder . setPullGroupFid ( mesPartPull . getId ( ) ) ;
pullingOrder . setWorkOrderNo ( workOrderStr ) ;
pullingOrder . setIsPrint ( CommonEnumUtil . TRUE_OR_FALSE . FALSE . getValue ( ) ) ;
pullingOrder . setPrintStatus ( MesExtEnumUtil . PRINT_STATUS . UNPRINT . getValue ( ) ) ;
pullingOrder . setPullOrderStatus ( MesExtEnumUtil . PULL_ORDER_STATUS . PULL_ORDER_STATUS_10 . getValue ( ) ) ;
pullingOrder . setWorkCenterCode ( mesPartPull . getWorkCenterCode ( ) ) ;
pullingOrder . setPullCode ( mesPartPull . getPullCode ( ) ) ;
pullingOrder . setPartNo ( workOrderPartNoStr ) ;
pullingOrder . setPartName ( workOrderPartNameStr ) ;
pullingOrder . setCustPartNo ( custPartNo ) ;
pullingOrder . setCarModelCode ( workOrderListNew . get ( 0 ) . getCarModelCode ( ) ) ;
pullingOrder . setOrderFlag ( workOrderListNew . get ( 0 ) . getOrderFlag ( ) ) ;
ConvertBean . serviceModelInitialize ( pullingOrder , AuthUtil . getSessionUser ( ) . getUserName ( ) ) ;
mesPullingOrderInfoRao . insert ( pullingOrder ) ;
// 需要合并同类项
Map < String , List < MesBom > > itemBomMap = list . stream ( ) . collect ( Collectors . groupingBy ( MesBom : : getItemPartNo ) ) ;
for ( String itemPartNo : itemBomMap . keySet ( ) ) {
List < MesBom > mesBoms = itemBomMap . get ( itemPartNo ) ;
double sum = mesBoms . stream ( ) . collect ( Collectors . summarizingDouble ( MesBom : : getItemQty ) ) . getSum ( ) ;
MesPullingOrderPartInfo detail = new MesPullingOrderPartInfo ( ) ;
detail . setOrganizeCode ( organizeCode ) ;
detail . setPullCode ( pullingOrder . getPullCode ( ) ) ;
detail . setPullingOrderNo ( pullingOrder . getPullingOrderNo ( ) ) ;
detail . setWorkOrderNo ( pullingOrder . getWorkOrderNo ( ) ) ;
detail . setWorkOrderSeq ( pullingOrder . getWorkOrderSeq ( ) ) ;
detail . setCustOrderNo ( pullingOrder . getCustOrderNo ( ) ) ;
MesBom mesBom = mesBoms . get ( 0 ) ;
detail . setPartNo ( mesBom . getItemPartNo ( ) ) ;
detail . setPartName ( mesBom . getItemPartName ( ) ) ;
detail . setPullQty ( sum ) ;
detail . setCustOrderNo ( pullingOrder . getCustOrderNo ( ) ) ;
detail . setWorkOrderSeq ( pullingOrder . getWorkOrderSeq ( ) ) ;
detail . setWaterSeq ( pullingOrder . getProductSeq ( ) ) ;
detail . setWorkCellCode ( mesWorkCenter . getWorkCenterCode ( ) ) ;
detail . setStatus ( MesExtEnumUtil . PULL_ORDER_PART_STATUS . UN_SENTED . getValue ( ) ) ; ///明细已送料为1, 未送料为0
detail . setCustPartNo ( pullingOrder . getCustPartNo ( ) ) ;
detail . setCarSeries ( pullDetailMap . get ( itemPartNo ) = = null ? "" : pullDetailMap . get ( itemPartNo ) . getCarSeries ( ) ) ;
detail . setOrderFlag ( pullingOrder . getOrderFlag ( ) ) ;
ConvertBean . serviceModelInitialize ( detail , AuthUtil . getSessionUser ( ) . getUserName ( ) ) ;
pullingOrderPartInfoRao . insert ( detail ) ;
}
}
public void doCreateKittingOrder ( List < MesWorkOrder > workOrderListNew , MesPartPull mesPartPull , MesWorkCenter mesWorkCenter ) {
String organizeCode = mesWorkCenter . getOrganizeCode ( ) ;
//1.查询拉动组详情
DdlPackBean pullPartDetailPackBean = DdlPackBean . getDdlPackBean ( organizeCode ) ;
DdlPreparedPack . getStringEqualPack ( mesPartPull . getPullCode ( ) , "pullCode" , pullPartDetailPackBean ) ;
List < MesPartPullDetail > mesPartPullDetailList = partPullDetailRao . findByHqlWhere ( pullPartDetailPackBean ) ;
if ( CollectionUtils . isEmpty ( mesPartPullDetailList ) ) {
return ;
}
//拉动组详情中的零件号
List < String > partNoList = mesPartPullDetailList . stream ( ) . map ( MesPartPullDetail : : getPartNo ) . collect ( Collectors . toList ( ) ) ;
//深汕按照数量圆整
if ( mesPartPull . getRoundMethod ( ) = = MesExtEnumUtil . PART_PULL_ROUND_METHOD . ROUND_BY_QUANTITY . getValue ( ) ) {
int packRoundQty = ( int ) Double . parseDouble ( mesPartPull . getPackRoundQty ( ) ) ;
String partNo = workOrderListNew . get ( 0 ) . getPartNo ( ) ;
//打散bom
List < MesBom > bomList = getPlatBom ( null , partNo , TimeTool . getNowTime ( true ) , organizeCode ) ;
//需要生成拉动单的零件
List < MesBom > bomPullList = bomList . stream ( ) . filter ( item - > partNoList . contains ( item . getItemPartNo ( ) ) ) . collect ( Collectors . toList ( ) ) ;
mesBomRDao . detachList ( bomPullList ) ;
for ( MesWorkOrder mesWorkOrder : workOrderListNew ) {
Double qty = mesWorkOrder . getQty ( ) ;
bomPullList . forEach ( item - > item . setItemQty ( item . getItemQty ( ) * qty ) ) ;
DoubleSummaryStatistics summaryStatistics = bomPullList . stream ( ) . collect ( Collectors . summarizingDouble ( MesBom : : getItemQty ) ) ;
double max = summaryStatistics . getMax ( ) ;
int multiple = ( int ) Math . ceil ( max / packRoundQty ) ; //生成的拉动的数量
for ( int i = 1 ; i < = multiple ; i + + ) {
insertPullOrderInfo ( mesWorkOrder , bomPullList , mesPartPull , mesPartPullDetailList , organizeCode , i , packRoundQty ) ;
}
workOrderRepository . updateByProperties ( "workOrderNo" , mesWorkOrder . getWorkOrderNo ( ) , "pullingStatus" , MesExtEnumUtil . WORK_ORDER_PULLING_STATUS . SUBMIT . getValue ( ) ) ;
}
// /**
// * 满足一个拉动组就生成一个拉动单
// * 分类
// * 1.当前bom 子零件数量 * 工单需求数量 > packRoundQty multiple是多少, 是否有余数 取模
// * 2.当前bom 子零件数量 * 工单需求数量 = packRoundQty 直接整除, 看看是否大于1 , 大于1需要拆分多个拉动单
// * 3.当前bom 子零件数量 * 工单需求数量 < packRoundQty 需要增加一个工单来补充当前的数量,补不齐继续补充
// */
// Map<String,Double> partNoRemainder = new HashMap<>();
// for (int i = 0; i < workOrderListNew.size(); i++) {
// MesWorkOrder mesWorkOrder = workOrderListNew.get(0);
// Double qty = mesWorkOrder.getQty();
// bomPullList.forEach(item -> item.setItemQty(item.getItemQty() * qty));
// for (int j = 0; j < bomPullList.size(); j++) {
// double m = bomPullList.get(j).getItemQty() % packRoundQty;
// double n = bomPullList.get(j).getItemQty() / packRoundQty;
// if (m == 0 && n != 0){
// //子零件数量 * 工单需求数量 = packRoundQty
// //证明当前零件需要拉动的数量是圆整数量的倍数,需要拆分多个拉动单,或者一个拉动单就满足了
//
// }else if (m != 0 && n == 0) {
// //子零件数量 * 工单需求数量 < packRoundQty
// //证明需要凑下一个工单的当前零件
// } else if (m !=0 && n > 0) {
// //子零件数量 * 工单需求数量 > packRoundQty
// //够一个拉动单以上的数据,还有余数给
//
// }
// }
// }
}
}
private void insertPullOrderInfo ( MesWorkOrder mesWorkOrder , List < MesBom > bomPullList , MesPartPull mesPartPull , List < MesPartPullDetail > mesPartPullDetailList , String organizeCode , int i , int roundPackQty ) {
//校验当前工单是否已经生成过拉动单,如果已经生成过则不在生成
// DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
// DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"workOrderNo", ddlPackBean);
// int count = mesPullingOrderInfoRao.findByHqlWhereCount(ddlPackBean);
// if (count >0){
// return;
// }
// 计算所有拉动单的数量,生成拉动单
Map < String , List < MesPartPullDetail > > pullDetailMap = mesPartPullDetailList . stream ( ) . filter ( item - > ! StringUtils . isEmpty ( item . getPullPartNo ( ) ) ) . collect ( Collectors . groupingBy ( MesPartPullDetail : : getPullPartNo ) ) ;
List < String > pullDetailPartList = mesPartPullDetailList . stream ( ) . map ( MesPartPullDetail : : getPullPartNo ) . collect ( Collectors . toList ( ) ) ;
String kittingOrderNoRuleCode = mesConfigService . getCfgValue ( organizeCode , "KITTING_ORDER_NO_RULE_CODE" ) ;
GenSerialNoModel genSerialNoModel = new GenSerialNoModel ( kittingOrderNoRuleCode ) ;
genSerialNoModel . setDynamicRule ( mesPartPull . getPullCode ( ) ) ;
List < String > resultList = syncFuncService . syncSerialNo ( genSerialNoModel . organizeCode ( organizeCode ) , AuthUtil . getSessionUser ( ) . getUserName ( ) , organizeCode , 1 ) . getResultList ( ) ;
String serialNo = resultList . get ( 0 ) ;
MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo ( ) ;
pullingOrder . setOrganizeCode ( organizeCode ) ;
pullingOrder . setPullingOrderNo ( serialNo ) ; //拉动单号 + 8位年月日 + 5位流水号
pullingOrder . setPullOrderType ( mesPartPull . getPullOrderType ( ) ) ;
pullingOrder . setPullGroupFid ( mesPartPull . getId ( ) ) ;
pullingOrder . setWorkOrderNo ( mesWorkOrder . getWorkOrderNo ( ) ) ;
pullingOrder . setIsPrint ( CommonEnumUtil . TRUE_OR_FALSE . FALSE . getValue ( ) ) ;
pullingOrder . setPrintStatus ( MesExtEnumUtil . PRINT_STATUS . UNPRINT . getValue ( ) ) ;
pullingOrder . setPullOrderStatus ( MesExtEnumUtil . PULL_ORDER_STATUS . PULL_ORDER_STATUS_10 . getValue ( ) ) ;
pullingOrder . setWorkCenterCode ( mesPartPull . getWorkCenterCode ( ) ) ;
pullingOrder . setPullCode ( mesPartPull . getPullCode ( ) ) ;
pullingOrder . setPartNo ( mesWorkOrder . getPartNo ( ) ) ;
pullingOrder . setPartName ( mesWorkOrder . getPartName ( ) ) ;
pullingOrder . setCustPartNo ( mesWorkOrder . getCustPartNo ( ) ) ;
pullingOrder . setCarModelCode ( mesWorkOrder . getCarModelCode ( ) ) ;
pullingOrder . setOrderFlag ( mesWorkOrder . getOrderFlag ( ) ) ;
ConvertBean . serviceModelInitialize ( pullingOrder , AuthUtil . getSessionUser ( ) . getUserName ( ) ) ;
mesPullingOrderInfoRao . insert ( pullingOrder ) ;
List < MesBom > filterBomList = bomPullList . stream ( ) . filter ( item - > pullDetailPartList . contains ( item . getItemPartNo ( ) ) ) . collect ( Collectors . toList ( ) ) ;
for ( MesBom mesBom : filterBomList ) {
MesPullingOrderPartInfo detail = new MesPullingOrderPartInfo ( ) ;
List < MesPartPullDetail > mesPartPullDetailList1 = pullDetailMap . get ( mesBom . getItemPartNo ( ) ) ;
for ( MesPartPullDetail mesPartPullDetail : mesPartPullDetailList1 ) {
detail . setOrganizeCode ( organizeCode ) ;
detail . setPullCode ( pullingOrder . getPullCode ( ) ) ;
detail . setPullingOrderNo ( pullingOrder . getPullingOrderNo ( ) ) ;
detail . setWorkOrderNo ( pullingOrder . getWorkOrderNo ( ) ) ;
detail . setWorkOrderSeq ( pullingOrder . getWorkOrderSeq ( ) ) ;
detail . setCustOrderNo ( pullingOrder . getCustOrderNo ( ) ) ;
detail . setPartNo ( mesBom . getItemPartNo ( ) ) ;
detail . setPartName ( mesBom . getItemPartName ( ) ) ;
double remainingQty = mesBom . getItemQty ( ) - i * roundPackQty ;
if ( remainingQty < - roundPackQty ) {
continue ;
}
detail . setPullQty ( remainingQty > 0 ? roundPackQty : ( mesBom . getItemQty ( ) - ( i - 1 ) * roundPackQty ) ) ;
detail . setCustOrderNo ( pullingOrder . getCustOrderNo ( ) ) ;
detail . setWorkOrderSeq ( pullingOrder . getWorkOrderSeq ( ) ) ;
detail . setWaterSeq ( pullingOrder . getProductSeq ( ) ) ;
detail . setWorkCellCode ( mesPartPullDetail . getWorkCellCode ( ) ) ;
// detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1, 未送料为0
detail . setCustPartNo ( pullingOrder . getCustPartNo ( ) ) ;
detail . setCarSeries ( mesPartPullDetail . getCarSeries ( ) = = null ? "" : mesPartPullDetail . getCarSeries ( ) ) ;
detail . setOrderFlag ( pullingOrder . getOrderFlag ( ) ) ;
ConvertBean . serviceModelInitialize ( detail , AuthUtil . getSessionUser ( ) . getUserName ( ) ) ;
pullingOrderPartInfoRao . insert ( detail ) ;
}
}
}
private List < MesBom > getPlatBom ( MesBom mesBom , String partNo , String effectiveTime , String organizeCode ) {
//MES汇报查询BOM是否携带结束查询条件
MesConfig config = mesConfigService . getCfgValueByCode ( organizeCode , MesExtConstWords . MES_REPORT_FIND_BOM_WITH_EFFENDTIME ) ;
Boolean isWithEffEndTime = ( null ! = config & & ! org . springframework . util . StringUtils . isEmpty ( config . getCfgValue ( ) ) & & config . getCfgValue ( ) . equals ( CommonEnumUtil . TRUE_OR_FALSE . TRUE . getValueStr ( ) ) ) ? true : false ;
if ( mesBom = = null ) {
//首先根据虚结构的零件号查询出最新的一条bom信息作为bomCode
DdlPackBean bomCodePackBean = DdlPackBean . getDdlPackBean ( organizeCode ) ;
DdlPreparedPack . getStringEqualPack ( partNo , MesExtConstWords . PART_NO , bomCodePackBean ) ;
DdlPreparedPack . getStringSmallerPack ( effectiveTime , MesExtConstWords . EFF_START_TIME , bomCodePackBean ) ;
if ( isWithEffEndTime ) DdlPreparedPack . getStringBiggerPack ( effectiveTime , MesExtConstWords . EFF_END_TIME , bomCodePackBean ) ;
DdlPreparedPack . getOrderBy ( MesExtConstWords . EFF_START_TIME , CommonEnumUtil . ASC_OR_DESC . DESC . getValue ( ) , bomCodePackBean ) ;
List < MesBom > bomList = bomRao . findByHqlTopWhere ( bomCodePackBean , 1 ) ;
if ( bomList = = null | | bomList . isEmpty ( ) ) {
return new ArrayList < > ( ) ;
}
mesBom = bomList . get ( 0 ) ;
}
List < MesBom > bomResultList = new ArrayList < > ( ) ;
DdlPackBean bomPackBean = DdlPackBean . getDdlPackBean ( organizeCode ) ;
DdlPreparedPack . getStringEqualPack ( mesBom . getBomCode ( ) , "bomCode" , bomPackBean ) ;
DdlPreparedPack . getStringEqualPack ( partNo , MesExtConstWords . PART_NO , bomPackBean ) ;
DdlPreparedPack . getStringEqualPack ( mesBom . getEffStartTime ( ) , MesExtConstWords . EFF_START_TIME , bomPackBean ) ;
List < MesBom > bomList = bomRao . findByHqlWhere ( bomPackBean ) ;
for ( MesBom bom : bomList ) {
if ( bom . getPartType ( ) ! = null & & bom . getPartType ( ) . equalsIgnoreCase ( "X" ) ) {
bomResultList . addAll ( getPlatBom ( null , bom . getItemPartNo ( ) , effectiveTime , organizeCode ) ) ;
} else {
bom . setBomCode ( bom . getBomCode ( ) . toLowerCase ( ) ) ;
bomResultList . add ( bom ) ;
}
}
return bomResultList ;
}
}
private void checkData ( List < MesWorkOrder > mesWorkOrderList , String organizeCode ) {
private void checkData ( List < MesWorkOrder > mesWorkOrderList , String organizeCode ) {
@ -970,6 +1359,8 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
@Override
@Override
public void doProductReport ( MesWorkOrder mesWorkOrder ) {
public void doProductReport ( MesWorkOrder mesWorkOrder ) {
//初始的工单状态
Integer workOrderStatusInit = mesWorkOrder . getWorkOrderStatus ( ) ;
MesWorkOrder mesWorkOrderDb = getMesWorkOrder ( mesWorkOrder . getWorkOrderNo ( ) , mesWorkOrder . getOrganizeCode ( ) ) ;
MesWorkOrder mesWorkOrderDb = getMesWorkOrder ( mesWorkOrder . getWorkOrderNo ( ) , mesWorkOrder . getOrganizeCode ( ) ) ;
mesWorkOrderDb . setDescription ( mesWorkOrder . getDescription ( ) ) ;
mesWorkOrderDb . setDescription ( mesWorkOrder . getDescription ( ) ) ;
//查询物料信息
//查询物料信息
@ -1033,6 +1424,14 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
mesWorkOrderDb . setRemark ( mesWorkOrder . getRemark ( ) ) ;
mesWorkOrderDb . setRemark ( mesWorkOrder . getRemark ( ) ) ;
//更新工单
//更新工单
updateMesWorkOrder ( mesWorkOrderDb , ( MesExtEnumUtil . REPORT_TYPE . REPORT . getValue ( ) = = mesWorkOrder . getReportType ( ) ) ? MesExtEnumUtil . WORK_ORDER_LOG_TYPE . REPORT : MesExtEnumUtil . WORK_ORDER_LOG_TYPE . REPORT_ADJUST , mesWorkOrder . getNum ( ) ) ;
updateMesWorkOrder ( mesWorkOrderDb , ( MesExtEnumUtil . REPORT_TYPE . REPORT . getValue ( ) = = mesWorkOrder . getReportType ( ) ) ? MesExtEnumUtil . WORK_ORDER_LOG_TYPE . REPORT : MesExtEnumUtil . WORK_ORDER_LOG_TYPE . REPORT_ADJUST , mesWorkOrder . getNum ( ) ) ;
//2025/2/19 状态改变了需要校验是否生成拉动单,是否关闭拉动单
if ( ! Objects . equals ( mesWorkOrderDb . getWorkOrderStatus ( ) , workOrderStatusInit ) ) {
doCloseKittingOrder ( mesWorkOrderDb , mesWorkOrderDb . getModifyUser ( ) ) ;
List < MesWorkOrder > list = new ArrayList < > ( ) ;
list . add ( mesWorkOrderDb ) ;
doCreateKitting ( list , mesWorkOrderDb . getOrganizeCode ( ) ) ;
}
//试制单不报工
//试制单不报工
if ( Objects . isNull ( mesWorkOrderDb . getOrderFlag ( ) ) | | ! MesExtEnumUtil . ORDER_TYPE_IDENTIFICATION . P . getValue ( ) . equals ( mesWorkOrderDb . getOrderFlag ( ) ) ) {
if ( Objects . isNull ( mesWorkOrderDb . getOrderFlag ( ) ) | | ! MesExtEnumUtil . ORDER_TYPE_IDENTIFICATION . P . getValue ( ) . equals ( mesWorkOrderDb . getOrderFlag ( ) ) ) {
String sn = getStringList ( mesWorkOrder . getOrganizeCode ( ) , AuthUtilExt . getUserName ( ) ) ;
String sn = getStringList ( mesWorkOrder . getOrganizeCode ( ) , AuthUtilExt . getUserName ( ) ) ;
@ -1248,6 +1647,17 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
//关闭工单
//关闭工单
baseRDao . updateByProperties ( new String [ ] { MesExtConstWords . MODIFY_USER , MesExtConstWords . MODIFY_DATE_TIME , MesExtConstWords . WORK_ORDER_STATUS , MesExtConstWords . SYSTEM_SYNC_STATUS } ,
baseRDao . updateByProperties ( new String [ ] { MesExtConstWords . MODIFY_USER , MesExtConstWords . MODIFY_DATE_TIME , MesExtConstWords . WORK_ORDER_STATUS , MesExtConstWords . SYSTEM_SYNC_STATUS } ,
new Object [ ] { userName , TimeTool . getNowTime ( true ) , MesExtEnumUtil . ORDER_STATUS . CLOSE . getValue ( ) , CommonEnumUtil . TRUE_OR_FALSE . FALSE . getValue ( ) } , ddlPackBean ) ;
new Object [ ] { userName , TimeTool . getNowTime ( true ) , MesExtEnumUtil . ORDER_STATUS . CLOSE . getValue ( ) , CommonEnumUtil . TRUE_OR_FALSE . FALSE . getValue ( ) } , ddlPackBean ) ;
//关闭工单后校验是否生成拉动单,是否关闭拉动单
List < MesWorkOrder > mesWorkOrderListNew = new ArrayList < > ( ) ;
for ( MesWorkOrder mesWorkOrder : mesWorkOrderList ) {
MesWorkOrder mesWorkOrderNew = new MesWorkOrder ( ) ;
BeanUtils . copyProperties ( mesWorkOrder , mesWorkOrderNew ) ;
mesWorkOrderNew . setWorkOrderStatus ( MesExtEnumUtil . ORDER_STATUS . CLOSE . getValue ( ) ) ;
mesWorkOrderListNew . add ( mesWorkOrderNew ) ;
doCloseKittingOrder ( mesWorkOrderNew , userName ) ;
}
doCreateKitting ( mesWorkOrderListNew , organizeCode ) ;
}
}