|
|
|
@ -191,6 +191,9 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
private MesPullingOrderInfoRepository mesPullingOrderInfoRao;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPullingOrderPartInfoRepository pullingOrderPartInfoRao;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPartPullRepository partPullRao;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
@ -202,6 +205,8 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesBomRepository bomRao;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public MesWorkOrder insert(MesWorkOrder bean) {
|
|
|
|
|
// 数据校验
|
|
|
|
@ -676,6 +681,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
seqList = syncFuncService.syncSerialNo(orderSeqSerialNoModel.organizeCode(next.getOrganizeCode()), next.getCreateUser(), next.getOrganizeCode(), mesWorkOrderList.size()).getResultList();
|
|
|
|
|
}
|
|
|
|
|
List<MesWorkOrderLog> mesWorkOrderLogList = new ArrayList<>();
|
|
|
|
|
List<MesWorkOrder> workOrderListForKitting = new ArrayList<>();
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (MesWorkOrder item : mesWorkOrderList) {
|
|
|
|
|
//获取相同类型 相同标识 生产序号最大值的
|
|
|
|
@ -698,6 +704,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
ConvertBean.serviceModelInitialize(copyMesWorkOrder, item.getCreateUser());
|
|
|
|
|
index++;
|
|
|
|
|
baseRDao.insert(copyMesWorkOrder);
|
|
|
|
|
workOrderListForKitting.add(copyMesWorkOrder);
|
|
|
|
|
//保存记录
|
|
|
|
|
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
|
|
|
|
|
BeanUtils.copyProperties(item, workOrderLog,MesExtConstWords.ID,MesExtConstWords.SYSTEM_SYNC_STATUS);
|
|
|
|
@ -729,6 +736,8 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
if (!CollectionUtils.isEmpty(mesWorkOrderLogList)) {
|
|
|
|
|
workOrderLogService.insertBatch(mesWorkOrderLogList);
|
|
|
|
|
}
|
|
|
|
|
//创建kitting
|
|
|
|
|
doCreateKitting(workOrderListForKitting, next.organizeCode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void doCreateKitting(List<MesWorkOrder> mesWorkOrderList,String organizeCode) {
|
|
|
|
@ -799,16 +808,19 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
collect.forEach(item -> item.setItemQty(item.getItemQty() * mesWorkOrder.getQty()));
|
|
|
|
|
list.addAll(collect);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 计算所有拉动单的数量,生成拉动单
|
|
|
|
|
|
|
|
|
|
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("xxx"); //拉动单号 + 8位年月日 + 5位流水号
|
|
|
|
|
pullingOrder.setPullingOrderNo(serialNo); //拉动单号 + 8位年月日 + 5位流水号
|
|
|
|
|
pullingOrder.setPullOrderType(mesPartPull.getPullOrderType());
|
|
|
|
|
pullingOrder.setPullGroupFid(mesPartPull.getId());
|
|
|
|
|
pullingOrder.setWorkOrderNo(workOrderStr);
|
|
|
|
@ -823,7 +835,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
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()) {
|
|
|
|
@ -849,6 +861,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
detail.setCarSeries(pullDetailMap.get(itemPartNo) == null ? "" : pullDetailMap.get(itemPartNo).getCarSeries());
|
|
|
|
|
detail.setOrderFlag(pullingOrder.getOrderFlag());
|
|
|
|
|
ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName());
|
|
|
|
|
pullingOrderPartInfoRao.insert(detail);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
@ -861,9 +874,9 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
if (CollectionUtils.isEmpty(mesPartPullDetailList)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//bom中对应的partNo列表
|
|
|
|
|
//拉动组详情中的零件号
|
|
|
|
|
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 = Integer.parseInt(mesPartPull.getPackRoundQty());
|
|
|
|
|
String partNo = workOrderListNew.get(0).getPartNo();
|
|
|
|
@ -871,40 +884,101 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
List<MesBom> bomList = getPlatBom(null, partNo, TimeTool.getNowTime(true), organizeCode);
|
|
|
|
|
//需要生成拉动单的零件
|
|
|
|
|
List<MesBom> bomPullList = bomList.stream().filter(item -> partNoList.contains(item.getItemPartNo())).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 满足一个拉动组就生成一个拉动单
|
|
|
|
|
* 分类
|
|
|
|
|
* 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);
|
|
|
|
|
for (MesWorkOrder mesWorkOrder : workOrderListNew) {
|
|
|
|
|
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
|
|
|
|
|
//够一个拉动单以上的数据,还有余数给
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
DoubleSummaryStatistics summaryStatistics = bomPullList.stream().collect(Collectors.summarizingDouble(MesBom::getItemQty));
|
|
|
|
|
double max = summaryStatistics.getMax();
|
|
|
|
|
int multiple = Integer.parseInt(String.valueOf(Math.ceil(max / packRoundQty))); //生成的拉动的数量
|
|
|
|
|
for (int i = 1; i <= multiple; i++) {
|
|
|
|
|
insertPullOrderInfo( mesWorkOrder, bomPullList, mesPartPull, mesPartPullDetailList, organizeCode, i, packRoundQty);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// /**
|
|
|
|
|
// * 满足一个拉动组就生成一个拉动单
|
|
|
|
|
// * 分类
|
|
|
|
|
// * 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){
|
|
|
|
|
// 计算所有拉动单的数量,生成拉动单
|
|
|
|
|
Map<String, MesPartPullDetail> pullDetailMap = mesPartPullDetailList.stream().collect(Collectors.toMap(MesPartPullDetail::getPullPartNo, Function.identity()));
|
|
|
|
|
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);
|
|
|
|
|
for (MesBom mesBom : bomPullList) {
|
|
|
|
|
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());
|
|
|
|
|
detail.setPartNo(mesBom.getItemPartNo());
|
|
|
|
|
detail.setPartName(mesBom.getItemPartName());
|
|
|
|
|
double remainingQty = mesBom.getItemQty() - i * roundPackQty;
|
|
|
|
|
detail.setPullQty(remainingQty > 0 ? roundPackQty : (mesBom.getItemQty() - (i-1) * roundPackQty));
|
|
|
|
|
detail.setCustOrderNo(pullingOrder.getCustOrderNo());
|
|
|
|
|
detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq());
|
|
|
|
|
detail.setWaterSeq(pullingOrder.getProductSeq());
|
|
|
|
|
detail.setWorkCellCode(mesWorkOrder.getWorkCenterCode());
|
|
|
|
|
detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1,未送料为0
|
|
|
|
|
detail.setCustPartNo(pullingOrder.getCustPartNo());
|
|
|
|
|
detail.setCarSeries(pullDetailMap.get(mesBom.getItemPartNo()) == null ? "" : pullDetailMap.get(mesBom.getItemPartNo()).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) {
|
|
|
|
|