|
|
@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepSer
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.MesPartDataMapSaveStepService;
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.MesPartDataMapSaveStepService;
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.MesWorkOrderCheckCompleteQtyStepService;
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.MesWorkOrderCheckCompleteQtyStepService;
|
|
|
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.DeepCloneUtil;
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
|
|
|
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService;
|
|
|
|
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService;
|
|
|
@ -13,6 +14,7 @@ import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
|
|
|
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
|
|
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
|
|
|
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
|
|
|
|
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
|
|
|
|
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
|
|
|
|
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
|
|
|
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
|
|
|
@ -28,12 +30,15 @@ import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
|
|
|
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
|
|
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
|
|
|
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
|
|
|
|
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
|
|
|
import com.google.common.collect.MapDifference;
|
|
|
|
|
|
|
|
import com.google.common.collect.Maps;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import javax.persistence.EntityManager;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Map;
|
|
|
@ -78,6 +83,12 @@ public class MesProductSnGenerateStepService extends BaseStepService {
|
|
|
|
@Autowired
|
|
|
|
@Autowired
|
|
|
|
private MesWorkOrderCheckCompleteQtyStepService workOrderCheckCompleteQtyStepService;
|
|
|
|
private MesWorkOrderCheckCompleteQtyStepService workOrderCheckCompleteQtyStepService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
|
|
private SnowflakeIdMaker snowflakeIdMaker;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
|
|
private EntityManager entityManager;
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public StepResult execute(StationRequestBean reqBean) {
|
|
|
|
public StepResult execute(StationRequestBean reqBean) {
|
|
|
|
|
|
|
|
|
|
|
@ -162,77 +173,101 @@ public class MesProductSnGenerateStepService extends BaseStepService {
|
|
|
|
//验证是否计数
|
|
|
|
//验证是否计数
|
|
|
|
Boolean isCalcCompleteQty = workOrderCheckCompleteQtyStepService.isCalcCompleteQty(isSamePart, productionPsInContext, productionPartContext);
|
|
|
|
Boolean isCalcCompleteQty = workOrderCheckCompleteQtyStepService.isCalcCompleteQty(isSamePart, productionPsInContext, productionPartContext);
|
|
|
|
|
|
|
|
|
|
|
|
MesProduceSn produceSn;
|
|
|
|
MesProduceSn produceSn = null;
|
|
|
|
|
|
|
|
MesProduceSn produceSnClone = null;
|
|
|
|
//进出一致, 不累计工单完成数量 在显示装配件工步中已经验证了 进出一致 进出存在工单则必须一致
|
|
|
|
//进出一致, 不累计工单完成数量 在显示装配件工步中已经验证了 进出一致 进出存在工单则必须一致
|
|
|
|
if (isSamePart) produceSn = produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), productionPsInContext.getId());
|
|
|
|
if (isSamePart) produceSn = produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), productionPsInContext.getId());
|
|
|
|
//未知条码
|
|
|
|
//未知条码
|
|
|
|
else if (null != productionPsInContext && !StringUtils.isEmpty(productionPsInContext.getRelateId())) produceSn = produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), productionPsInContext.getRelateId());
|
|
|
|
else if (null != productionPsInContext && !StringUtils.isEmpty(productionPsInContext.getRelateId())) produceSn = produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), productionPsInContext.getRelateId());
|
|
|
|
//生成新条码
|
|
|
|
//生成新条码
|
|
|
|
else produceSn = new MesProduceSn();
|
|
|
|
else produceSnClone = new MesProduceSn();
|
|
|
|
|
|
|
|
if (null != produceSn) {
|
|
|
|
|
|
|
|
produceSnClone = DeepCloneUtil.deepCloneObject(produceSn);
|
|
|
|
|
|
|
|
if (null == produceSnClone) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "修改条码未知状态时[克隆条码]出现异常!");
|
|
|
|
|
|
|
|
entityManager.detach(produceSnClone);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isEmpty(produceSn.getProductSn())) {
|
|
|
|
if (StringUtils.isEmpty(produceSnClone.getProductSn())) {
|
|
|
|
if (null != productionPsInContext && !StringUtils.isEmpty(productionPsInContext.getProductSn())) produceSn.setProductSn(productionPsInContext.getProductSn());
|
|
|
|
if (null != productionPsInContext && !StringUtils.isEmpty(productionPsInContext.getProductSn())) produceSnClone.setProductSn(productionPsInContext.getProductSn());
|
|
|
|
else produceSn.setProductSn(doGererateSerialNo(reqBean, resultBean,
|
|
|
|
else produceSnClone.setProductSn(doGererateSerialNo(reqBean, resultBean,
|
|
|
|
generateGenSerialNoModel(reqBean, resultBean, getProduceSnNumberRule(reqBean, resultBean, part), part).shiftCode(prodShiftContext.getShiftCode()).foreignKey(prodRuleContext.getForeignKey())));
|
|
|
|
generateGenSerialNoModel(reqBean, resultBean, getProduceSnNumberRule(reqBean, resultBean, part), part).shiftCode(prodShiftContext.getShiftCode()).foreignKey(prodRuleContext.getForeignKey())));
|
|
|
|
produceSn.setCustSn(produceSn.getProductSn());
|
|
|
|
produceSnClone.setCustSn(produceSnClone.getProductSn());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isEmpty(produceSn.getSerialNumber())) {
|
|
|
|
if (StringUtils.isEmpty(produceSnClone.getSerialNumber())) {
|
|
|
|
produceSn.setSerialNumber(doGererateSerialNo(reqBean, resultBean, generateGenSerialNoModel(reqBean, resultBean, MesPcnExtConstWords.DEFAULT_SERIAL_NUMBER_RULE, part)));
|
|
|
|
produceSnClone.setSerialNumber(snowflakeIdMaker.nextId() + MesPcnExtConstWords.EMPTY);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
produceSn.setQty(new Double(1));
|
|
|
|
produceSnClone.setQty(new Double(1));
|
|
|
|
|
|
|
|
|
|
|
|
if (!StringUtils.isEmpty(prodRuleContext.getWorkOrderNo())) produceSn.setWorkOrderNo(prodRuleContext.getWorkOrderNo());
|
|
|
|
if (!StringUtils.isEmpty(prodRuleContext.getWorkOrderNo())) produceSnClone.setWorkOrderNo(prodRuleContext.getWorkOrderNo());
|
|
|
|
|
|
|
|
|
|
|
|
if (null != productionPartContext && !StringUtils.isEmpty(productionPartContext.getWorkOrderNo())) {
|
|
|
|
if (null != productionPartContext && !StringUtils.isEmpty(productionPartContext.getWorkOrderNo())) {
|
|
|
|
produceSn.setCustCode(productionPartContext.getCustCode());
|
|
|
|
produceSnClone.setCustCode(productionPartContext.getCustCode());
|
|
|
|
produceSn.setCustPartNo(productionPartContext.getCustPartNo());
|
|
|
|
produceSnClone.setCustPartNo(productionPartContext.getCustPartNo());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
produceSn.setAreaCode(reqBean.getAreaCode());
|
|
|
|
produceSnClone.setAreaCode(reqBean.getAreaCode());
|
|
|
|
produceSn.setWorkCenterCode(reqBean.getWorkCenterCode());
|
|
|
|
produceSnClone.setWorkCenterCode(reqBean.getWorkCenterCode());
|
|
|
|
produceSn.setWorkCellCode(reqBean.getWorkCellCode());
|
|
|
|
produceSnClone.setWorkCellCode(reqBean.getWorkCellCode());
|
|
|
|
|
|
|
|
|
|
|
|
produceSn.setPartNo(part.getPartNo());
|
|
|
|
produceSnClone.setPartNo(part.getPartNo());
|
|
|
|
produceSn.setPartName(part.getPartName());
|
|
|
|
produceSnClone.setPartName(part.getPartName());
|
|
|
|
produceSn.setProcessLabelTemplate(part.getProcessLabelTemplate());
|
|
|
|
produceSnClone.setProcessLabelTemplate(part.getProcessLabelTemplate());
|
|
|
|
produceSn.setProdLabelTemplate(part.getProductLabelTemplate());
|
|
|
|
produceSnClone.setProdLabelTemplate(part.getProductLabelTemplate());
|
|
|
|
produceSn.setCustLabelTemplate(part.getCustLabelTemplate());
|
|
|
|
produceSnClone.setCustLabelTemplate(part.getCustLabelTemplate());
|
|
|
|
|
|
|
|
|
|
|
|
produceSn.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue());
|
|
|
|
produceSnClone.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue());
|
|
|
|
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue());
|
|
|
|
produceSnClone.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue());
|
|
|
|
produceSn.setQcStatus(!StringUtils.isEmpty(productResult) ? Integer.valueOf(productResult) : MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
|
|
|
|
produceSnClone.setQcStatus(!StringUtils.isEmpty(productResult) ? Integer.valueOf(productResult) : MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
|
|
|
|
|
|
|
|
|
|
|
|
produceSn.setShiftCode(prodShiftContext.getShiftCode());
|
|
|
|
produceSnClone.setShiftCode(prodShiftContext.getShiftCode());
|
|
|
|
produceSn.setShiftGroup(prodShiftContext.getShiftGroup());
|
|
|
|
produceSnClone.setShiftGroup(prodShiftContext.getShiftGroup());
|
|
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isEmpty(produceSn.getPrintCount())) produceSn.setPrintCount(MesPcnExtConstWords.ZERO);
|
|
|
|
if (StringUtils.isEmpty(produceSnClone.getPrintCount())) produceSnClone.setPrintCount(MesPcnExtConstWords.ZERO);
|
|
|
|
if (StringUtils.isEmpty(produceSn.getPrintStatus())) produceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
|
|
|
|
if (StringUtils.isEmpty(produceSnClone.getPrintStatus())) produceSnClone.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
|
|
|
|
|
|
|
|
|
|
|
|
produceSn.setOrganizeCode(reqBean.getOrganizeCode());
|
|
|
|
produceSnClone.setOrganizeCode(reqBean.getOrganizeCode());
|
|
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isEmpty(produceSn.getId())) ConvertBean.serviceModelInitialize(produceSn, reqBean.getUserInfo());
|
|
|
|
if (StringUtils.isEmpty(produceSnClone.getId())) ConvertBean.serviceModelInitialize(produceSnClone, reqBean.getUserInfo());
|
|
|
|
else ConvertBean.serviceModelUpdate(produceSn, reqBean.getUserInfo());
|
|
|
|
else ConvertBean.serviceModelUpdate(produceSnClone, reqBean.getUserInfo());
|
|
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isEmpty(produceSn.getInWorkCenterTime())) produceSn.setInWorkCenterTime(produceSn.getModifyDatetime());
|
|
|
|
if (StringUtils.isEmpty(produceSnClone.getInWorkCenterTime())) produceSnClone.setInWorkCenterTime(produceSnClone.getModifyDatetime());
|
|
|
|
produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10));
|
|
|
|
produceSnClone.setLotNo(produceSnClone.getModifyDatetime().substring(0, 10));
|
|
|
|
|
|
|
|
|
|
|
|
//未知不同步
|
|
|
|
//未知不同步
|
|
|
|
produceSn.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
|
|
|
|
produceSnClone.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
|
|
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isEmpty(produceSn.getId())) {
|
|
|
|
if (StringUtils.isEmpty(produceSnClone.getId())) {
|
|
|
|
produceSn.setFid(UUID.randomUUID().toString());
|
|
|
|
produceSnClone.setFid(UUID.randomUUID().toString());
|
|
|
|
produceSn = produceSnExtService.insert(produceSn);
|
|
|
|
produceSnClone = produceSnExtService.insert(produceSnClone);
|
|
|
|
} else produceSnExtService.updateNoSync(produceSn);
|
|
|
|
} else {
|
|
|
|
|
|
|
|
Map<String, Object> beforeMap = JSONObject.parseObject(JSONObject.toJSONString(produceSn), Map.class) ;
|
|
|
|
|
|
|
|
Map<String, Object> afterMap = JSONObject.parseObject(JSONObject.toJSONString(produceSnClone), Map.class) ;
|
|
|
|
|
|
|
|
Map<String, MapDifference.ValueDifference<Object>> mapDiff = Maps.difference(beforeMap, afterMap).entriesDiffering();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String[] propertyName = new String[mapDiff.size()];
|
|
|
|
|
|
|
|
Object[] propertyValue = new Object[mapDiff.size()];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Integer index = 0;
|
|
|
|
|
|
|
|
for (Map.Entry<String, MapDifference.ValueDifference<Object>> entry : mapDiff.entrySet()) {
|
|
|
|
|
|
|
|
if (null == entry) continue;
|
|
|
|
|
|
|
|
propertyName[index] = entry.getKey();
|
|
|
|
|
|
|
|
propertyValue[index] = entry.getValue().rightValue();
|
|
|
|
|
|
|
|
index ++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
produceSnRepository.updateByPropertiesNoSync(new String[]{MesPcnExtConstWords.ID, MesPcnExtConstWords.ORGANIZE_CODE}, new Object[]{produceSn.getId(), reqBean.getOrganizeCode()}, propertyName, propertyValue);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//isCalcCompleteQty=true的情况下【工位是否不累计工单完成数noCalcOrderQty=true最终不会实际累加到工单上】【noCalcOrderQty=false代表生产线维度的统计,才会实际累加到工单上】
|
|
|
|
//isCalcCompleteQty=true的情况下【工位是否不累计工单完成数noCalcOrderQty=true最终不会实际累加到工单上】【noCalcOrderQty=false代表生产线维度的统计,才会实际累加到工单上】
|
|
|
|
MesProductionPsOutContext productionPsOutContext = new MesProductionPsOutContext()
|
|
|
|
MesProductionPsOutContext productionPsOutContext = new MesProductionPsOutContext()
|
|
|
|
.copy(produceSn, prodRuleContext.getForeignKey()).isCalcCompleteQty(isCalcCompleteQty, isSamePart, workCell.getNoCalcOrderQty());
|
|
|
|
.copy(produceSnClone, prodRuleContext.getForeignKey()).isCalcCompleteQty(isCalcCompleteQty, isSamePart, workCell.getNoCalcOrderQty());
|
|
|
|
|
|
|
|
|
|
|
|
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- MesProduceSn:{} --- MesProductionPsOutContext:{}",
|
|
|
|
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- MesProduceSn:{} --- MesProductionPsOutContext:{}",
|
|
|
|
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
|
|
|
|
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
|
|
|
|
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(produceSn), JSONObject.toJSONString(productionPsOutContext));
|
|
|
|
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(produceSnClone), JSONObject.toJSONString(productionPsOutContext));
|
|
|
|
|
|
|
|
|
|
|
|
return productionPsOutContext;
|
|
|
|
return productionPsOutContext;
|
|
|
|
|
|
|
|
|
|
|
|