|
|
|
@ -1,8 +1,14 @@
|
|
|
|
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
|
|
|
|
|
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesShiftService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
|
|
|
|
|
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
|
|
|
|
|
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.common.Pager;
|
|
|
|
@ -11,16 +17,25 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.util.StringUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.*;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.repository.*;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.repository.shipping.MesWorkOrderToWmsRepository;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
|
|
|
|
import cn.estsh.impp.framework.boot.auth.AuthUtil;
|
|
|
|
|
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
|
|
|
|
|
import cn.hutool.core.date.DatePattern;
|
|
|
|
|
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.slf4j.Logger;
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
|
|
import java.text.ParseException;
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
import java.util.stream.Stream;
|
|
|
|
@ -37,6 +52,7 @@ import java.util.stream.Stream;
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class MesWorkOrderService implements IMesWorkOrderService {
|
|
|
|
|
|
|
|
|
|
public static final Logger LOGGER = LoggerFactory.getLogger(MesWorkOrderService.class);
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesWorkOrderRepository workOrderRepository;
|
|
|
|
|
@Autowired
|
|
|
|
@ -57,6 +73,24 @@ public class MesWorkOrderService implements IMesWorkOrderService {
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesProduceSnRepository mesProduceSnRao;
|
|
|
|
|
@Autowired
|
|
|
|
|
private ISyncFuncService syncFuncService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesWorkOrderLogRepository mesWorkOrderLogRepository;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesWorkOrderToWmsRepository mesWorkOrderToWmsRDao;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesShiftRepository mesShiftRepository;
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesConfigService configService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesPartService iMesPartService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesShiftService mesShiftService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public MesWorkOrder queryMesWorkOrder(MesWorkOrder workOrder) {
|
|
|
|
@ -218,10 +252,468 @@ public class MesWorkOrderService implements IMesWorkOrderService {
|
|
|
|
|
mesProductOffLineRDao.saveAll(mesProductOffLineList);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public void doPcnJobProductReport(List<MesProduceSn> mesProduceSns,List<MesShift> mesShiftList,String organizeCode, String userName ,MesWorkOrder mesWorkOrderDb) {
|
|
|
|
|
|
|
|
|
|
//查询物料信息
|
|
|
|
|
DdlPackBean ddlPackBeanPart = DdlPackBean.getDdlPackBean(mesWorkOrderDb.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesWorkOrderDb.getPartNo(), "partNo", ddlPackBeanPart);
|
|
|
|
|
MesPart mesPart = mesPartRDao.getByProperty(ddlPackBeanPart);
|
|
|
|
|
if (null == mesPart) {
|
|
|
|
|
MesPcnException.throwMesBusiException("物料【%s】信息不存在", mesWorkOrderDb.getPartNo());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//查询产线信息
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrderDb.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesWorkOrderDb.getWorkCenterCode(), "workCenterCode", ddlPackBean);
|
|
|
|
|
MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if (Objects.isNull(mesWorkCenter)) {
|
|
|
|
|
MesPcnException.throwMesBusiException("产线【%s】不存在", mesWorkOrderDb.getWorkCenterCode());
|
|
|
|
|
}
|
|
|
|
|
//获取生产版本
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb);
|
|
|
|
|
//物料+生产版本获取bom信息
|
|
|
|
|
List<MesBom> mesBoms = findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
|
|
|
|
|
//报工类型
|
|
|
|
|
if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrderDb.getReportType()) {
|
|
|
|
|
mesWorkOrderDb.setReportedQty(MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getReportedQty()));
|
|
|
|
|
//更新工单状态
|
|
|
|
|
double unCompleteQty = MathOperation.sub(mesWorkOrderDb.getQty(), mesWorkOrderDb.getReportedQty());
|
|
|
|
|
mesWorkOrderDb.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0);
|
|
|
|
|
if (mesWorkOrderDb.getReportedQty() > mesWorkOrderDb.getQty()) {
|
|
|
|
|
MesPcnException.throwMesBusiException("工单报工数量【%s】大于工单数量【%s】,不允许报工",
|
|
|
|
|
mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty());
|
|
|
|
|
} else if (Objects.equals(mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty())) {
|
|
|
|
|
mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
|
|
|
|
|
} else {
|
|
|
|
|
mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue());
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
//报工调整数量加-
|
|
|
|
|
mesWorkOrderDb.setAdjustQty((MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getAdjustQty())));
|
|
|
|
|
//冲销数量大于工单完成数量报错
|
|
|
|
|
if (mesWorkOrderDb.getAdjustQty() > mesWorkOrderDb.getReportedQty()) {
|
|
|
|
|
MesPcnException.throwMesBusiException("冲销数量【%s】大于工单完成数量【%s】,不允许冲销",
|
|
|
|
|
mesWorkOrderDb.getAdjustQty(), mesWorkOrderDb.getReportedQty());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
LOGGER.info("产线:{} 零件:{}更新工单", mesWorkOrderDb.getWorkCenterCode(), mesWorkOrderDb.getPartNo());
|
|
|
|
|
//更新工单
|
|
|
|
|
updateMesWorkOrder(mesWorkOrderDb, userName );
|
|
|
|
|
|
|
|
|
|
//生成条码 todo 有条码 不生成
|
|
|
|
|
|
|
|
|
|
//保存数据
|
|
|
|
|
// List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
|
|
|
|
|
// for (MesBom mesBom : mesBoms) {
|
|
|
|
|
// mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false));
|
|
|
|
|
// }
|
|
|
|
|
// mesProductOffLineService.insertBatch(mesProductOffLineList);
|
|
|
|
|
|
|
|
|
|
LOGGER.info("产线:{} 零件:{}更新工单mesProduceSns:{}", mesWorkOrderDb.getWorkCenterCode(), mesWorkOrderDb.getPartNo(),mesProduceSns.size());
|
|
|
|
|
//保存数据
|
|
|
|
|
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
|
|
|
|
|
MesProductOffLine newMesProductOffLine;
|
|
|
|
|
for (MesProduceSn produceSn : mesProduceSns) {
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
newMesProductOffLine = new MesProductOffLine();
|
|
|
|
|
newMesProductOffLine.setReportPartNo(mesWorkOrderDb.getPartNo());
|
|
|
|
|
newMesProductOffLine.setReportPartNameRdd(mesWorkOrderDb.getPartName());
|
|
|
|
|
newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo());
|
|
|
|
|
newMesProductOffLine.setItemPartName(mesBom.getItemPartName());
|
|
|
|
|
newMesProductOffLine.setItemQty(mesBom.getItemQty());
|
|
|
|
|
newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint());
|
|
|
|
|
newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint());
|
|
|
|
|
newMesProductOffLine.setQty(1d);
|
|
|
|
|
newMesProductOffLine.setReportSn(produceSn.getProductSn());
|
|
|
|
|
newMesProductOffLine.setBomVersion(mesWorkOrderDb.getProductVersion());
|
|
|
|
|
newMesProductOffLine.setSerialNumber(produceSn.getProductSn());
|
|
|
|
|
newMesProductOffLine.setUnit(mesBom.getUnit());
|
|
|
|
|
newMesProductOffLine.setItemUnit(mesBom.getItemUnit());
|
|
|
|
|
newMesProductOffLine.setWorkOrderNo(mesWorkOrderDb.getWorkOrderNo());
|
|
|
|
|
newMesProductOffLine.setWorkCenterCode(mesWorkOrderDb.getWorkCenterCode());
|
|
|
|
|
newMesProductOffLine.setWorkCellCode(mesWorkOrderDb.getWorkCellCode());
|
|
|
|
|
newMesProductOffLine.setReportType(mesWorkOrderDb.getReportType());
|
|
|
|
|
newMesProductOffLine.setSapWorkCenter(mesWorkOrderDb.getErpWorkCenter());
|
|
|
|
|
newMesProductOffLine.setOrganizeCode(organizeCode);
|
|
|
|
|
|
|
|
|
|
ConvertBean.serviceModelInitialize(newMesProductOffLine, userName);
|
|
|
|
|
mesProductOffLineList.add(newMesProductOffLine);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
mesProductOffLineRDao.saveAll(mesProductOffLineList);
|
|
|
|
|
}
|
|
|
|
|
private void updateMesWorkOrder(MesWorkOrder mesWorkOrder, String userName ) {
|
|
|
|
|
//修改工单,需要重新同步
|
|
|
|
|
mesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
|
|
|
|
|
ConvertBean.serviceModelUpdate(mesWorkOrder, userName);
|
|
|
|
|
workOrderRepository.update(mesWorkOrder);
|
|
|
|
|
//保存记录
|
|
|
|
|
saveMesWorkOrderLog(mesWorkOrder);
|
|
|
|
|
}
|
|
|
|
|
public void saveMesWorkOrderLog(MesWorkOrder mesWorkOrder) {
|
|
|
|
|
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
|
|
|
|
|
BeanUtils.copyProperties(mesWorkOrder, workOrderLog, "id");
|
|
|
|
|
mesWorkOrderLogRepository.insert(workOrderLog);
|
|
|
|
|
}
|
|
|
|
|
public List<MesBom> findBomList(String organizeCode, MesPart mesPart, String bomVersion) {
|
|
|
|
|
List<MesBom> bomData = new ArrayList<>();
|
|
|
|
|
// 递归展开 BOM
|
|
|
|
|
expendBomChild(organizeCode, mesPart.getPartNo(), bomVersion, bomData);
|
|
|
|
|
|
|
|
|
|
if (bomData.size() == 0) {
|
|
|
|
|
MesPcnException.throwMesBusiException("零件号 %s 没找找到 ERP 同步的原始 BOM 数据,请检查接口是否正常!", mesPart.getPartNo());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Iterator<MesBom> iterator = bomData.iterator();
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
|
MesBom item = iterator.next();
|
|
|
|
|
// 删除虚零件
|
|
|
|
|
if (Objects.equals("X", item.getPartType())) {
|
|
|
|
|
iterator.remove();
|
|
|
|
|
} else {
|
|
|
|
|
item.setPartNo(mesPart.getPartNo());
|
|
|
|
|
item.setPartName(mesPart.getPartName());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Map<String, MesBom> summaryBomMap = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
for (MesBom item : bomData) {
|
|
|
|
|
String key = String.format("%s:%s", item.getPartNo().toUpperCase().trim(),
|
|
|
|
|
item.getItemPartNo().toUpperCase().trim());
|
|
|
|
|
if (!summaryBomMap.containsKey(key)) {
|
|
|
|
|
summaryBomMap.put(key, item);
|
|
|
|
|
} else {
|
|
|
|
|
MesBom tempItem = summaryBomMap.get(key);
|
|
|
|
|
// 子零件重复的累加数量
|
|
|
|
|
tempItem.setItemQty(MathOperation.add(tempItem.getItemQty(), item.getItemQty()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 返回汇总数据
|
|
|
|
|
return new ArrayList<>(summaryBomMap.values());
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 递归展开 BOM
|
|
|
|
|
*
|
|
|
|
|
* @param organizeCode 工厂代码
|
|
|
|
|
* @param partNo 父零件号
|
|
|
|
|
* @param bomData 存放 BOM 数据的集合
|
|
|
|
|
*/
|
|
|
|
|
private void expendBomChild(String organizeCode, String partNo, String bomVersion, List<MesBom> bomData) {
|
|
|
|
|
List<MesBom> bomDetails = findMesBomByPartNoAndBomVersion(partNo, organizeCode, bomVersion);
|
|
|
|
|
|
|
|
|
|
for (MesBom item : bomDetails) {
|
|
|
|
|
MesBom newItem = new MesBom();
|
|
|
|
|
BeanUtils.copyProperties(item, newItem);
|
|
|
|
|
// 处理父零件用量不为 1 的情况
|
|
|
|
|
if (newItem.getQty() != 1.0 && newItem.getQty() > 0.0) {
|
|
|
|
|
Double rateQty = MathOperation.div(newItem.getItemQty(), newItem.getQty(), 8);
|
|
|
|
|
newItem.setQty(1.0);
|
|
|
|
|
newItem.setItemQty(rateQty);
|
|
|
|
|
}
|
|
|
|
|
// 加入到 BOM 清单中
|
|
|
|
|
bomData.add(newItem);
|
|
|
|
|
// 如果有子阶,继续递归
|
|
|
|
|
if (Objects.equals("X", item.getPartType())) {
|
|
|
|
|
expendBomChild(organizeCode, newItem.getItemPartNo(), null, bomData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public List<MesBom> findMesBomByPartNoAndBomVersion(String partNo, String organizeCode, String bomVersion) {
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(bomVersion, "bomVersion", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringSmallerPack(TimeTool.getNowTime(true), "effStartTime", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getOrderBy("effStartTime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean);
|
|
|
|
|
List<MesBom> mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean);
|
|
|
|
|
if (org.springframework.util.CollectionUtils.isEmpty(mesBoms)) {
|
|
|
|
|
MesPcnException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在", partNo, bomVersion);
|
|
|
|
|
}
|
|
|
|
|
MesBom next = mesBoms.iterator().next();
|
|
|
|
|
//如果存在多个bomCode取最新的一个
|
|
|
|
|
return mesBoms.stream().collect(Collectors.groupingBy(MesBom::getBomCode)).get(next.getBomCode());
|
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
|
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if (null == mesProductVersion) {
|
|
|
|
|
MesPcnException.throwMesBusiException("物料【%s】生产版本信息不存在", mesWorkOrder.getPartNo());
|
|
|
|
|
}
|
|
|
|
|
return mesProductVersion;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateProductionRecord(String organizeCode, String userName, String sn) {
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(sn, "productSn", ddlPackBean);
|
|
|
|
|
productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus"},
|
|
|
|
|
new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue()},ddlPackBean);
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public void doProductReportByRecord(MesProductionRecord productionRecord, String organizeCode, String userName) {
|
|
|
|
|
//新增初始化 todo
|
|
|
|
|
// 根据
|
|
|
|
|
//根据物料获取已发布的工单
|
|
|
|
|
MesWorkOrder oldMesWorkOrder = getMesWorkOrder(productionRecord, organizeCode);
|
|
|
|
|
if (oldMesWorkOrder == null) {
|
|
|
|
|
updateProductionRecord(organizeCode, userName, productionRecord.getProductSn());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
report(productionRecord, organizeCode, userName, oldMesWorkOrder);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public void doProductHasOrderReportByRecord(MesProductionRecord productionRecord, String organizeCode, String userName) {
|
|
|
|
|
//新增初始化 todo
|
|
|
|
|
// 根据
|
|
|
|
|
//根据物料获取已发布的工单
|
|
|
|
|
List<MesWorkOrder> oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null);
|
|
|
|
|
if (CollectionUtils.isEmpty(oldMesWorkOrders)) {
|
|
|
|
|
updateProductionRecord(organizeCode, userName, productionRecord.getProductSn());
|
|
|
|
|
}
|
|
|
|
|
report(productionRecord, organizeCode, userName, oldMesWorkOrders.get(0));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
private void report(MesProductionRecord productionRecord, String organizeCode, String userName, MesWorkOrder oldMesWorkOrder) {
|
|
|
|
|
DdlPackBean ddlPackBean;
|
|
|
|
|
//查询工作中心
|
|
|
|
|
ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(oldMesWorkOrder.getWorkCenterCode(), "workCenterCode", ddlPackBean);
|
|
|
|
|
MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if (Objects.isNull(mesWorkCenter)) {
|
|
|
|
|
throw new ImppBusiException(String.format("产线【%s】不存在", oldMesWorkOrder.getWorkCenterCode()));
|
|
|
|
|
}
|
|
|
|
|
//获取生产版本
|
|
|
|
|
ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesWorkCenter.getErpWorkCenter(), "workCenterCode", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(oldMesWorkOrder.getProductVersion(), "productVersion", ddlPackBean);
|
|
|
|
|
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if (null == mesProductVersion) {
|
|
|
|
|
throw new ImppBusiException(String.format("物料【%s】生产版本信息不存在", productionRecord.getPartNo()));
|
|
|
|
|
}
|
|
|
|
|
//物料+生产版本获取bom信息
|
|
|
|
|
ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesProductVersion.getAlternativePartList(), "bomVersion", ddlPackBean);
|
|
|
|
|
List<MesBom> mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean);
|
|
|
|
|
if (CollectionUtils.isEmpty(mesBoms)) {
|
|
|
|
|
throw new ImppBusiException(String.format("物料【%s】生产版本【%s】对应bom信息不存在",
|
|
|
|
|
productionRecord.getPartNo(), mesProductVersion.getProductVersion()));
|
|
|
|
|
}
|
|
|
|
|
oldMesWorkOrder.setNum(oldMesWorkOrder.getNum() == null ? 1 : oldMesWorkOrder.getNum() + 1);
|
|
|
|
|
oldMesWorkOrder.setReportedQty(MathOperation.add(oldMesWorkOrder.getNum(), oldMesWorkOrder.getReportedQty()));
|
|
|
|
|
//更新SAP计划完成数量
|
|
|
|
|
saveMesProductPlan(oldMesWorkOrder, false, true);
|
|
|
|
|
|
|
|
|
|
//更新工单状态
|
|
|
|
|
double unCompleteQty = MathOperation.sub(oldMesWorkOrder.getQty(), oldMesWorkOrder.getReportedQty());
|
|
|
|
|
oldMesWorkOrder.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0);
|
|
|
|
|
if (oldMesWorkOrder.getReportedQty() > oldMesWorkOrder.getQty()) {
|
|
|
|
|
throw new ImppBusiException(String.format("工单报工数量【%s】大于工单数量【%s】,不允许报工",
|
|
|
|
|
oldMesWorkOrder.getReportedQty(), oldMesWorkOrder.getQty()));
|
|
|
|
|
} else if (Objects.equals(oldMesWorkOrder.getReportedQty(), oldMesWorkOrder.getQty())) {
|
|
|
|
|
oldMesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
|
|
|
|
|
} else {
|
|
|
|
|
oldMesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue());
|
|
|
|
|
}
|
|
|
|
|
ConvertBean.serviceModelUpdate(oldMesWorkOrder, userName);
|
|
|
|
|
workOrderRepository.saveAndFlush(oldMesWorkOrder);
|
|
|
|
|
//保存数据
|
|
|
|
|
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
|
|
|
|
|
MesProductOffLine newMesProductOffLine;
|
|
|
|
|
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
newMesProductOffLine = new MesProductOffLine();
|
|
|
|
|
newMesProductOffLine.setReportPartNo(oldMesWorkOrder.getPartNo());
|
|
|
|
|
newMesProductOffLine.setReportPartNameRdd(oldMesWorkOrder.getPartName());
|
|
|
|
|
newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo());
|
|
|
|
|
newMesProductOffLine.setItemPartName(mesBom.getItemPartName());
|
|
|
|
|
newMesProductOffLine.setItemQty(mesBom.getItemQty());
|
|
|
|
|
newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint());
|
|
|
|
|
newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint());
|
|
|
|
|
newMesProductOffLine.setQty(1d);
|
|
|
|
|
newMesProductOffLine.setReportSn(productionRecord.getProductSn());
|
|
|
|
|
newMesProductOffLine.setBomVersion(oldMesWorkOrder.getProductVersion());
|
|
|
|
|
newMesProductOffLine.setSerialNumber(productionRecord.getProductSn());
|
|
|
|
|
newMesProductOffLine.setUnit(mesBom.getUnit());
|
|
|
|
|
newMesProductOffLine.setItemUnit(mesBom.getItemUnit());
|
|
|
|
|
newMesProductOffLine.setWorkOrderNo(oldMesWorkOrder.getWorkOrderNo());
|
|
|
|
|
newMesProductOffLine.setWorkCenterCode(oldMesWorkOrder.getWorkCenterCode());
|
|
|
|
|
newMesProductOffLine.setWorkCellCode(oldMesWorkOrder.getWorkCellCode());
|
|
|
|
|
newMesProductOffLine.setReportType(oldMesWorkOrder.getReportType());
|
|
|
|
|
newMesProductOffLine.setSapWorkCenter(oldMesWorkOrder.getErpWorkCenter());
|
|
|
|
|
newMesProductOffLine.setOrganizeCode(oldMesWorkOrder.getOrganizeCode());
|
|
|
|
|
|
|
|
|
|
ConvertBean.serviceModelInitialize(newMesProductOffLine, userName);
|
|
|
|
|
mesProductOffLineList.add(newMesProductOffLine);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mesProductOffLineRDao.saveAll(mesProductOffLineList);
|
|
|
|
|
// 同步工单信息给加工记录、条码信息
|
|
|
|
|
DdlPackBean snDdlPackBean = DdlPackBean.getDdlPackBean();
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(productionRecord.getProductSn(), "productSn", snDdlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(organizeCode, "organizeCode", snDdlPackBean);
|
|
|
|
|
|
|
|
|
|
mesProduceSnRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","workOrderNo"},
|
|
|
|
|
new Object[]{userName, TimeTool.getNowTime(true), oldMesWorkOrder.getWorkOrderNo()},snDdlPackBean);
|
|
|
|
|
|
|
|
|
|
productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","workOrderNo", "reportStatus"},
|
|
|
|
|
new Object[]{userName, TimeTool.getNowTime(true), oldMesWorkOrder.getWorkOrderNo(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue()},snDdlPackBean);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取对应的工单
|
|
|
|
|
* @param productionRecord
|
|
|
|
|
* @param organizeCode
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
private MesWorkOrder getMesWorkOrder(MesProductionRecord productionRecord, String organizeCode) {
|
|
|
|
|
MesWorkOrder mesWorkOrder = new MesWorkOrder();
|
|
|
|
|
/**
|
|
|
|
|
* 根据产线物料获取所有工单
|
|
|
|
|
*/
|
|
|
|
|
List<MesWorkOrder> oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null);
|
|
|
|
|
// 获取当前班次
|
|
|
|
|
String shiftCode = productionRecord.getShiftCode();
|
|
|
|
|
String workCenterCode = productionRecord.getWorkCenterCode();
|
|
|
|
|
|
|
|
|
|
List<MesShift> shiftList = mesShiftService.queryMesShift(organizeCode, workCenterCode);
|
|
|
|
|
// 如果当前班次是早班
|
|
|
|
|
if (CollectionUtils.isEmpty(shiftList)) {
|
|
|
|
|
MesPcnException.throwFlowException(String.format("班次信息未维护,产线=%s"), workCenterCode);
|
|
|
|
|
}
|
|
|
|
|
List<MesShift> shifts = shiftList.stream().filter(mesShift -> Objects.equals(mesShift.getWorkCenterCode(), workCenterCode)).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
MesShift currentShift = shifts.stream().filter(mesShift -> Objects.equals(mesShift.getShiftCode(), shiftCode)).findFirst().orElse(null);
|
|
|
|
|
|
|
|
|
|
String beginTime =productionRecord.getLotNo() + " " + currentShift.getStartTime();
|
|
|
|
|
Date beginDate = transfer(beginTime);
|
|
|
|
|
|
|
|
|
|
/*MesWorkOrder found = null;
|
|
|
|
|
for (MesWorkOrder oldMesWorkOrder : oldMesWorkOrders) {
|
|
|
|
|
if (beginDate.getTime() >= transfer(oldMesWorkOrder.getPlanStartTime()).getTime() && beginDate.getTime() < transfer(oldMesWorkOrder.getPlanEndTime()).getTime()) {
|
|
|
|
|
found = oldMesWorkOrder;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> beginDate.getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && beginDate.getTime() <= transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null);
|
|
|
|
|
|
|
|
|
|
String date = productionRecord.getLotNo();
|
|
|
|
|
// 如果找不到需要找 当天的其它班次
|
|
|
|
|
if (mesWorkOrder == null) {
|
|
|
|
|
// 如果开始时间大于结束时间,说明跨天了,跨天说明是晚班,需要找, 如果是晚班, 则找早中班的工单
|
|
|
|
|
if (currentShift.getStartTime().compareTo(currentShift.getEndTime()) > 0) {
|
|
|
|
|
// 如果比0点大,需要找日期前一天的班次的工单号,如果是0点前,date =lotNO 如果是0点后,则找lot的前一天
|
|
|
|
|
int hours = transfer(productionRecord.getCompleteDateTime()).getHours();
|
|
|
|
|
if (hours < 12) {
|
|
|
|
|
date = getDate(productionRecord.getLotNo(), 1);
|
|
|
|
|
} else {
|
|
|
|
|
date = getDate(productionRecord.getLotNo(), 0);
|
|
|
|
|
}
|
|
|
|
|
String endTime = date + " " +currentShift.getStartTime();
|
|
|
|
|
String startTime = date + " " +currentShift.getEndTime();
|
|
|
|
|
|
|
|
|
|
mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> transfer(startTime).getTime() > transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() < transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null);
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
// 早班或者中班 则找当天非当前班次的最早单号
|
|
|
|
|
String startTime = date + " " +currentShift.getEndTime();
|
|
|
|
|
String endTime = getDate(date, 2) + " " +currentShift.getStartTime();
|
|
|
|
|
for (MesWorkOrder workOrder : oldMesWorkOrders) {
|
|
|
|
|
if (transfer(startTime).getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() <= transfer(workOrder.getPlanEndTime()).getTime()) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> transfer(startTime).getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() <= transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null);
|
|
|
|
|
}
|
|
|
|
|
if (mesWorkOrder == null) {
|
|
|
|
|
// todo 需要记录并且第二天要用job跑
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return mesWorkOrder;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<MesWorkOrder> getMesWorkOrders(MesProductionRecord productionRecord, String organizeCode, String workOrderNo) {
|
|
|
|
|
List<Integer> list = Stream.of(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(), MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()).collect(Collectors.toList());
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(productionRecord.getWorkCenterCode(), "workCenterCode", ddlPackBean);
|
|
|
|
|
if (!StringUtils.isEmpty(workOrderNo)) {
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(workOrderNo, "workOrderNo", ddlPackBean);
|
|
|
|
|
}
|
|
|
|
|
DdlPreparedPack.getInPackList(list, "workOrderStatus", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean);
|
|
|
|
|
// 新增班次逻辑
|
|
|
|
|
//DdlPreparedPack.
|
|
|
|
|
List<MesWorkOrder> oldMesWorkOrders = workOrderRepository.findByHqlWhere(ddlPackBean);
|
|
|
|
|
if(CollectionUtils.isEmpty(oldMesWorkOrders)){
|
|
|
|
|
throw new ImppBusiException(String.format("物料【%s】状态已发布的工单信息不存在", productionRecord.getPartNo()));
|
|
|
|
|
}
|
|
|
|
|
return oldMesWorkOrders;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* flag = 1 减少 1天, = 2 加一天
|
|
|
|
|
* @param lotNo
|
|
|
|
|
* @param flag
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public String getDate(String lotNo, int flag) {
|
|
|
|
|
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
Date d = null;
|
|
|
|
|
try {
|
|
|
|
|
d = df.parse(lotNo);
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
Calendar cal=Calendar.getInstance();
|
|
|
|
|
cal.setTime(d);
|
|
|
|
|
if (flag == 1) {
|
|
|
|
|
cal.add(Calendar.DATE, -1); //减1天
|
|
|
|
|
} else if (flag == 2) {
|
|
|
|
|
cal.add(Calendar.DATE, 1); //加1天
|
|
|
|
|
}
|
|
|
|
|
return df.format(cal.getTime()).substring(0, 10);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesProductVersion getMesProductVersion(MesWorkOrder item, MesWorkCenter mesWorkCenter) {
|
|
|
|
|
DdlPackBean ddlPackBean;
|
|
|
|
|
ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(item.getPartNo(), "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesWorkCenter.getErpWorkCenter(), "workCenterCode", ddlPackBean);
|
|
|
|
|
ddlPackBean.setOrderByStr(" order by createDatetime desc ");
|
|
|
|
|
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if (Objects.isNull(mesProductVersion)) {
|
|
|
|
|
MesPcnException.throwMesBusiException("物料【%s】工作中心【%s】对应的生产版本信息不存在", item.getPartNo(),
|
|
|
|
|
mesWorkCenter.getErpWorkCenter());
|
|
|
|
|
}
|
|
|
|
|
return mesProductVersion;
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public List<MesProduceSn> getUnReportMesProduceSn(String organizeCode) {
|
|
|
|
|
List<MesProduceSn> mesProduceSnList = new ArrayList<>();
|
|
|
|
|
public List<MesProductionRecord> getUnReportMesProduceSn(String organizeCode) {
|
|
|
|
|
//1.获取生产加工记录production_record表中,report_status为待汇报状态的工单
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
List<Integer> statusList = Stream.of(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue()).collect(Collectors.toList());
|
|
|
|
|
DdlPreparedPack.getInPackList( statusList,"reportStatus",ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getIsNull("workOrderNo",ddlPackBean);
|
|
|
|
|
//DdlPreparedPack.getStringEqualPack("B19CK01A", "workCenterCode",ddlPackBean);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean);
|
|
|
|
|
List<MesProductionRecord> mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 1);
|
|
|
|
|
|
|
|
|
|
return mesProductionRecordList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<MesProductionRecord> getUnReportHasOrderMesProduceSn(String organizeCode) {
|
|
|
|
|
//1.获取生产加工记录production_record表中,report_status为待汇报状态的工单
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
List<Integer> statusList = Stream.of(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue()).collect(Collectors.toList());
|
|
|
|
@ -229,15 +721,31 @@ public class MesWorkOrderService implements IMesWorkOrderService {
|
|
|
|
|
DdlPreparedPack.getIsNotNull("workOrderNo",ddlPackBean);
|
|
|
|
|
|
|
|
|
|
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean);
|
|
|
|
|
List<MesProductionRecord> mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 5);
|
|
|
|
|
if (mesProductionRecordList.isEmpty()){
|
|
|
|
|
return mesProduceSnList;
|
|
|
|
|
}
|
|
|
|
|
//2.根据工单查询工单下的mesProduceSn
|
|
|
|
|
List<String> workOrderNoList = mesProductionRecordList.stream().map(MesProductionRecord::getWorkOrderNo).collect(Collectors.toList());
|
|
|
|
|
//工单号
|
|
|
|
|
List<MesProductionRecord> mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 1);
|
|
|
|
|
|
|
|
|
|
return mesProductionRecordList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<MesProductionRecord> getPreDayReportMesProductionRecord(String organizeCode,List<MesShift> mesShiftList, String workCenterCode ) {
|
|
|
|
|
|
|
|
|
|
//1.获取生产加工记录production_record表中,report_status为待汇报状态的工单
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(workCenterCode,"workCenterCode",ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue(),"reportStatus",ddlPackBean);
|
|
|
|
|
//获取前一天的早班到当天早班的区间的所有加工记录,统计个数
|
|
|
|
|
DdlPreparedPack.timeBuilder(TimeTool.getToday()+" 08:00:00",
|
|
|
|
|
new SimpleDateFormat("yyyy-MM-dd").format(TimeTool.getDateBefore(new Date(),1))+" 08:00:00",
|
|
|
|
|
"completeDateTime", ddlPackBean, false);
|
|
|
|
|
|
|
|
|
|
return productionRecordRao.findByHqlWhere(ddlPackBean);
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public List<MesProduceSn> getPreDayReportMesProduceSn(String organizeCode,List<MesProductionRecord> mesProductionRecordList ) {
|
|
|
|
|
DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getInPackList(workOrderNoList,"workOrderNo",snPackBean);
|
|
|
|
|
DdlPreparedPack.getInPackList(mesProductionRecordList.stream().map(MesProductionRecord::getProductSn).collect(Collectors.toList()),
|
|
|
|
|
"productSn",snPackBean);
|
|
|
|
|
return mesProduceSnRao.findByHqlWhere(snPackBean);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -305,4 +813,134 @@ public class MesWorkOrderService implements IMesWorkOrderService {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<MesWorkOrder> insertMesWorkOrder(List<MesProduceSn> mesProduceSns,List<MesShift> mesShiftList, String organizeCode, String userName) {
|
|
|
|
|
List<MesWorkOrder> mesWorkOrderList=new ArrayList<>();
|
|
|
|
|
Map<String, List<MesProduceSn>> snListMap = mesProduceSns.stream().collect(Collectors.groupingBy(sn -> sn.getWorkCenterCode() +"="+ sn.getPartNo()));
|
|
|
|
|
for (Map.Entry<String, List<MesProduceSn>> stringListEntry : snListMap.entrySet()) {
|
|
|
|
|
List<MesProduceSn> value = stringListEntry.getValue();
|
|
|
|
|
MesProduceSn mesProduceSn = value.get(0);
|
|
|
|
|
String[] split = stringListEntry.getKey().split("=");
|
|
|
|
|
String workCenterCode = split[0];
|
|
|
|
|
String partNo = split[1];
|
|
|
|
|
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean);
|
|
|
|
|
MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if (Objects.isNull(mesWorkCenter)) {
|
|
|
|
|
MesPcnException.throwMesBusiException("产线【%s】不存在",workCenterCode);
|
|
|
|
|
}
|
|
|
|
|
MesWorkOrder item=new MesWorkOrder();
|
|
|
|
|
item.setOrganizeCode(organizeCode);
|
|
|
|
|
item.setWorkCenterCode(workCenterCode);
|
|
|
|
|
item.setPartNo(partNo);
|
|
|
|
|
item.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue());
|
|
|
|
|
item.setOrderFlag(MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue());
|
|
|
|
|
List<MesShift> collect = mesShiftList.stream().filter(s -> s.getShiftCode().equalsIgnoreCase("1")).collect(Collectors.toList());
|
|
|
|
|
MesShift mesShift= collect.get(0);
|
|
|
|
|
item.setShiftCode(mesShift.getShiftCode());
|
|
|
|
|
item.setShiftCode(mesShift.getShiftName());
|
|
|
|
|
String today = TimeTool.getToday();
|
|
|
|
|
item.setPlanStartTime(today+" "+mesShift.getStartTime()+":00");
|
|
|
|
|
item.setPlanEndTime(today+" "+mesShift.getEndTime()+":00");
|
|
|
|
|
|
|
|
|
|
//生成工单号
|
|
|
|
|
List<String> orderList=new ArrayList<>();
|
|
|
|
|
GenSerialNoModel genSerialNoModel = new GenSerialNoModel("MES_WORK_CENTER_ORDER_NO");
|
|
|
|
|
genSerialNoModel.setPartNo(workCenterCode);
|
|
|
|
|
orderList = syncFuncService.syncSerialNo(genSerialNoModel,userName, organizeCode, 1).getResultList();
|
|
|
|
|
|
|
|
|
|
String orderNo = orderList.get(0);
|
|
|
|
|
DdlPackBean orderPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(orderNo, "workOrderNo", orderPackBean);
|
|
|
|
|
if (mesWorkCenterRDao.isExitByHql(orderPackBean)) {
|
|
|
|
|
MesPcnException.throwMesBusiException("单号流水码生成重复");
|
|
|
|
|
}
|
|
|
|
|
item.setWorkOrderNo(orderNo);
|
|
|
|
|
//校验标识
|
|
|
|
|
//若工单类型为排序
|
|
|
|
|
List<MesWorkOrderToWms> saveMesWorkOrderToWms = new ArrayList<>();
|
|
|
|
|
if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) {
|
|
|
|
|
//校验产线类型和工单类型是否匹配
|
|
|
|
|
if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue())) {
|
|
|
|
|
MesPcnException.throwMesBusiException("产线【%s】类型为【%s】,请选择非排序产线", mesWorkCenter.getWorkCenterCode(),
|
|
|
|
|
MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//校验物料生产版本是否存在
|
|
|
|
|
MesProductVersion mesProductVersion = checkMesProductVersion(item);
|
|
|
|
|
item.setProductVersion(mesProductVersion.getProductVersion());
|
|
|
|
|
//获取bom信息
|
|
|
|
|
List<MesBom> bomList = findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList());
|
|
|
|
|
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
//发送工单信息给WMS
|
|
|
|
|
saveMesWorkOrderToWms.addAll(saveMesWorkOrderToWms(item, bomList));
|
|
|
|
|
}
|
|
|
|
|
//物料名称不存在,从物料信息中获取
|
|
|
|
|
|
|
|
|
|
item.setPartName(mesProduceSn.getPartName());
|
|
|
|
|
//生产时间新增取当天
|
|
|
|
|
item.setProduceTime(TimeTool.getToday());
|
|
|
|
|
item.setUnCompleteQty(0d);
|
|
|
|
|
|
|
|
|
|
// if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()){
|
|
|
|
|
// //生产工单-非排序手工插单,关闭该零件当天之前日期非排序工单
|
|
|
|
|
// List<String> partNoList = Collections.singletonList(item.getPartNo());
|
|
|
|
|
// deleteUnSortOrder(orderNo,partNoList);
|
|
|
|
|
// }
|
|
|
|
|
item.setQty(value.stream().mapToDouble(MesProduceSn::getQty).sum());
|
|
|
|
|
item.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
|
|
|
|
|
ConvertBean.serviceModelInitialize(item, userName);
|
|
|
|
|
MesWorkOrder mesWorkOrder = workOrderRepository.insert(item);
|
|
|
|
|
//保存发送WMS数据
|
|
|
|
|
if (CollectionUtils.isNotEmpty(saveMesWorkOrderToWms)) {
|
|
|
|
|
mesWorkOrderToWmsRDao.saveAll(saveMesWorkOrderToWms);
|
|
|
|
|
}
|
|
|
|
|
saveMesWorkOrderLog(mesWorkOrder);
|
|
|
|
|
mesWorkOrderList.add(mesWorkOrder);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return mesWorkOrderList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void deleteUnSortOrder(String organizeCode, List<String> partNoList) {
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getInPackList(partNoList, "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue(), "workOrderType", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringSmallerNotEqualPack(TimeTool.getToday(), "planStartTime", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getNumberSmallerPack(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue(), "workOrderStatus", ddlPackBean);
|
|
|
|
|
workOrderRepository.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "workOrderStatus"},
|
|
|
|
|
new Object[]{"CLOSE_JOB", TimeTool.getNowTime(true), MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()}, ddlPackBean);
|
|
|
|
|
}
|
|
|
|
|
public List<MesWorkOrderToWms> saveMesWorkOrderToWms(MesWorkOrder mesWorkOrder, List<MesBom> mesBomList) {
|
|
|
|
|
List<MesWorkOrderToWms> mesWorkOrderToWmsList = new ArrayList<>();
|
|
|
|
|
MesWorkOrderToWms mesWorkOrderToWms = null;
|
|
|
|
|
for (MesBom mesBom : mesBomList) {
|
|
|
|
|
mesWorkOrderToWms = new MesWorkOrderToWms();
|
|
|
|
|
BeanUtils.copyProperties(mesWorkOrder, mesWorkOrderToWms, "id");
|
|
|
|
|
mesWorkOrderToWms.setUnit(mesBom.getUnit());
|
|
|
|
|
mesWorkOrderToWms.setItemPartNo(mesBom.getItemPartNo());
|
|
|
|
|
mesWorkOrderToWms.setItemPartName(mesBom.getItemPartName());
|
|
|
|
|
mesWorkOrderToWms.setItemUnit(mesBom.getItemUnit());
|
|
|
|
|
mesWorkOrderToWms.setItemQty(MathOperation.mul(mesWorkOrder.getQty(), mesBom.getItemQty()));
|
|
|
|
|
ConvertBean.serviceModelInitialize(mesWorkOrderToWms, mesWorkOrderToWms.getCreateUser());
|
|
|
|
|
mesWorkOrderToWmsList.add(mesWorkOrderToWms);
|
|
|
|
|
}
|
|
|
|
|
return mesWorkOrderToWmsList;
|
|
|
|
|
}
|
|
|
|
|
private MesProductVersion checkMesProductVersion(MesWorkOrder item) {
|
|
|
|
|
DdlPackBean ddlPackBean;
|
|
|
|
|
ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(item.getPartNo(), "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(item.getErpWorkCenter(), "workCenterCode", ddlPackBean);
|
|
|
|
|
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if (Objects.isNull(mesProductVersion)) {
|
|
|
|
|
MesPcnException.throwMesBusiException("物料【%s】产线【%s】生产版本【%s】信息不存在", item.getPartNo(), item.getWorkCenterCode(), item.getProductVersion());
|
|
|
|
|
}
|
|
|
|
|
return mesProductVersion;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Date transfer(String dateStr){
|
|
|
|
|
return DateUtil.parse(dateStr, (DateParser) DatePattern.NORM_DATETIME_FORMAT);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|