forked from I3-YF/i3plus-mes-pcn-yfai
保存裁片加工记录
parent
59fc125885
commit
ae725102b7
@ -0,0 +1,323 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.*;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
|
||||
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService;
|
||||
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.IStepService;
|
||||
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
|
||||
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
|
||||
import cn.estsh.i3plus.platform.common.tool.TimeTool;
|
||||
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.*;
|
||||
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
|
||||
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
||||
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
|
||||
import cn.estsh.i3plus.pojo.mes.model.StepResult;
|
||||
import cn.estsh.i3plus.pojo.mes.repository.MesProductionAssemblyRepository;
|
||||
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutRepository;
|
||||
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
|
||||
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Description : 保存加工结果工步
|
||||
* @Author : wangjie
|
||||
**/
|
||||
@Slf4j
|
||||
@Service("mesWorkOrderCutSaveStepService")
|
||||
public class MesWorkOrderCutSaveStepService extends BaseStepService {
|
||||
|
||||
@Autowired
|
||||
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesProductionCustomContextStepService productionCustomContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesWorkOrderCutService workOrderCutService;
|
||||
|
||||
@Autowired
|
||||
private MesWorkOrderCutRepository workOrderCutRepository;
|
||||
|
||||
@Autowired
|
||||
private IFsmCommonService fsmCommonService;
|
||||
|
||||
@Autowired
|
||||
private MesFirstMouldNoReadStepService firstMouldNoReadStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesProduceSnExtService produceSnExtService;
|
||||
|
||||
@Autowired
|
||||
private ISyncFuncService syncFuncService;
|
||||
|
||||
@Autowired
|
||||
private IFsmRouteDataService fsmRouteDataService;
|
||||
|
||||
@Autowired
|
||||
private MesProductionAssemblyRepository productionAssemblyRepository;
|
||||
|
||||
@Override
|
||||
public StepResult execute(StationRequestBean reqBean) {
|
||||
|
||||
StationResultBean resultBean = new StationResultBean();
|
||||
|
||||
//获取上下文信息
|
||||
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
|
||||
|
||||
//配置错误 抛出异常
|
||||
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||
|
||||
//存储生产过程上下文对象
|
||||
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
|
||||
|
||||
//获取上下文生产扫/读信息:加工单
|
||||
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
|
||||
|
||||
String cutWorkOrderNo = equipVariableCollectContextList.get(0).getEquipVariableValue();
|
||||
|
||||
//从上下文中取出工位当前要使用的设备
|
||||
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
|
||||
|
||||
// 看是否修改裁片工单状态
|
||||
//获取工位参数
|
||||
Map<String, String> wcpcMap = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean);
|
||||
|
||||
//获取上下文进料零件条码信息集合
|
||||
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
|
||||
|
||||
//获取上下文产成零件条码信息集合
|
||||
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
|
||||
|
||||
//获取上下文产出零件数据信息集合
|
||||
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
|
||||
|
||||
//获取上下文产品加工规则数据信息集合
|
||||
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
|
||||
|
||||
if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在加工规则信息,请重置工序解决!");
|
||||
|
||||
// 根据产出零件号分组加工规则
|
||||
Map<String, MesProdRuleContext> prodRuleContextMapByOutPartNo = prodRuleContextList.stream().collect(Collectors.toMap(MesProdRuleContext::getOutPartNo, Function.identity(), (x, y) -> y));
|
||||
|
||||
// 获取产成零件信息
|
||||
Map<String, MesPart> partDataContext = productionDispatchContextStepService.getPartDataContext(reqBean);
|
||||
|
||||
// 无进料条码则生成条码
|
||||
if (CollectionUtils.isEmpty(productionPsInContextList)) {
|
||||
|
||||
productionPsOutContextList = new ArrayList<>();
|
||||
|
||||
//获取生产线的当前班组班次信息
|
||||
MesProdShiftContext prodShiftContext = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
|
||||
|
||||
if (null == prodShiftContext) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在生产开班记录,请重新开班!");
|
||||
|
||||
//从上下文中取出工位对象
|
||||
MesWorkCell workCell = productionProcessContext.getWorkCell();
|
||||
|
||||
for (MesProductionPartContext mesProductionPartContext : productionPartContextList) {
|
||||
|
||||
MesPart part = partDataContext.get(mesProductionPartContext.getPartNo());
|
||||
|
||||
MesProdRuleContext mesProdRuleContext = prodRuleContextMapByOutPartNo.get(part.getPartNo());
|
||||
|
||||
MesProduceSn produceSn = new MesProduceSn();
|
||||
ConvertBean.serviceModelInitialize(produceSn, reqBean.getUserInfo());
|
||||
produceSn.setOrganizeCode(reqBean.getOrganizeCode());
|
||||
produceSn.setProductSn(cutWorkOrderNo);
|
||||
//produceSn.set
|
||||
produceSn.setCustSn(produceSn.getCustSn());
|
||||
produceSn.setSerialNumber(doGenerateSerialNo(reqBean, resultBean, MesPcnExtConstWords.DEFAULT_SERIAL_NUMBER_RULE, part));
|
||||
produceSn.setQty(mesProductionPartContext.getQty());
|
||||
|
||||
produceSn.setWorkOrderNo(mesProductionPartContext.getWorkOrderNo());
|
||||
produceSn.setCustCode(mesProductionPartContext.getCustCode());
|
||||
produceSn.setCustPartNo(mesProductionPartContext.getCustPartNo());
|
||||
|
||||
produceSn.setAreaCode(workCell.getAreaCode());
|
||||
produceSn.setWorkCenterCode(workCell.getWorkCenterCode());
|
||||
produceSn.setWorkCellCode(workCell.getWorkCellCode());
|
||||
|
||||
produceSn.setPartNo(mesProductionPartContext.getPartNo());
|
||||
produceSn.setPartName(mesProductionPartContext.getPartName());
|
||||
produceSn.setProcessLabelTemplate(part.getProcessLabelTemplate());
|
||||
produceSn.setProdLabelTemplate(part.getProductLabelTemplate());
|
||||
produceSn.setCustLabelTemplate(part.getCustLabelTemplate());
|
||||
|
||||
produceSn.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue());
|
||||
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue());
|
||||
produceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
|
||||
|
||||
produceSn.setShiftCode(prodShiftContext.getShiftCode());
|
||||
produceSn.setShiftGroup(prodShiftContext.getShiftGroup());
|
||||
|
||||
produceSn.setPrintCount(MesPcnExtConstWords.ZERO);
|
||||
produceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
|
||||
|
||||
if (StringUtils.isEmpty(produceSn.getInWorkCenterTime())) produceSn.setInWorkCenterTime(produceSn.getModifyDatetime());
|
||||
produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10));
|
||||
|
||||
produceSn.setFid(UUID.randomUUID().toString());
|
||||
produceSn = produceSnExtService.insert(produceSn);
|
||||
|
||||
MesProductionPsOutContext productionPsOutContext = new MesProductionPsOutContext().copy(produceSn, mesProdRuleContext.getForeignKey());
|
||||
|
||||
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- MesProduceSn:{} --- MesProductionPsOutContext:{}",
|
||||
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
|
||||
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(produceSn), JSONObject.toJSONString(productionPsOutContext));
|
||||
|
||||
productionPsOutContextList.add(productionPsOutContext);
|
||||
|
||||
saveProductionAssembly(reqBean, productionProcessContext, cellEquipContext, mesProdRuleContext, productionPsOutContext);
|
||||
|
||||
}
|
||||
|
||||
//保存上下文产出条码数据信息集合
|
||||
productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList);
|
||||
|
||||
} else {
|
||||
|
||||
if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在加工规则信息,请重置工序解决!");
|
||||
|
||||
//保存零件条码信息工步
|
||||
((IStepService) SpringContextsUtil.getBean("mesProductSnSaveStepService")).executeInState(reqBean);
|
||||
for (MesProductionPartContext mesProductionPartContext : productionPartContextList) {
|
||||
|
||||
Map<String, MesProductionPsOutContext> productionPsOutContextMap = productionPsOutContextList.stream().collect(Collectors.toMap(MesProductionPsOutContext::getPartNo, Function.identity(), (x, y) -> y));
|
||||
|
||||
MesPart part = partDataContext.get(mesProductionPartContext.getPartNo());
|
||||
|
||||
if (part == null)
|
||||
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("产出零件号[%s]不存在,请重置工序解决!", part.getPartNo()));
|
||||
|
||||
MesProductionPsOutContext productionPsOutContext = productionPsOutContextMap.get(part.getPartNo());
|
||||
|
||||
if (productionPsOutContext == null)
|
||||
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("产出零件号[%s]不存在,请重置工序解决!", part.getPartNo()));
|
||||
|
||||
MesProdRuleContext mesProdRuleContext = prodRuleContextMapByOutPartNo.get(part.getPartNo());
|
||||
|
||||
saveProductionAssembly(reqBean, productionProcessContext, cellEquipContext, mesProdRuleContext, productionPsOutContext);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//生成加工记录工步
|
||||
((IStepService) SpringContextsUtil.getBean("mesProductionRecordGenerateStepService")).executeInState(reqBean);
|
||||
|
||||
// 是否修改工单状态为完成
|
||||
String cutOrderOrderIsComplete = wcpcMap.containsKey(MesPcnExtConstWords.CUT_ORDER_ORDER_IS_COMPLETE) ? wcpcMap.get(MesPcnExtConstWords.CUT_ORDER_ORDER_IS_COMPLETE) : null;
|
||||
|
||||
if (!StringUtils.isEmpty(cutOrderOrderIsComplete)) {
|
||||
|
||||
updateWorkOrderCutStatus(reqBean, cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.COMPLETE.getValue());
|
||||
|
||||
} else {
|
||||
|
||||
updateWorkOrderCutStatus(reqBean, cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.PROCESS.getValue());
|
||||
|
||||
}
|
||||
|
||||
//保存装配记录工步
|
||||
//((IStepService) SpringContextsUtil.getBean("mesAssemblySaveStepService")).executeInState(reqBean);
|
||||
|
||||
//保存工单信息工步
|
||||
((IStepService) SpringContextsUtil.getBean("mesWorkOrderSaveStepService")).executeInState(reqBean);
|
||||
|
||||
return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存加工结果成功!");
|
||||
|
||||
}
|
||||
|
||||
private void saveProductionAssembly(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext,
|
||||
MesCellEquipContext cellEquipContext, MesProdRuleContext mesProdRuleContext,
|
||||
MesProductionPsOutContext productionPsOutContext) {
|
||||
|
||||
MesProductionAssembly productionAssembly = new MesProductionAssembly();
|
||||
|
||||
productionAssembly.setAssemblySn("");
|
||||
productionAssembly.setDataSource(MesExtEnumUtil.PRODUCTION_ASSEMBLY_DATA_SOURCE.NOSORT.getValue());
|
||||
productionAssembly.setIsOrigSn(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
|
||||
productionAssembly.setIsSkip(CommonEnumUtil.FALSE);
|
||||
|
||||
productionAssembly.setAreaCode(reqBean.getWorkCenterCode());
|
||||
productionAssembly.setWorkCenterCode(reqBean.getWorkCenterCode());
|
||||
productionAssembly.setWorkCellCode(reqBean.getWorkCellCode());
|
||||
productionAssembly.setProcessCode(reqBean.getProcessCode());
|
||||
|
||||
productionAssembly.setProcessName(productionProcessContext.getProcessName());
|
||||
productionAssembly.setCraftCode(productionProcessContext.getCraftCode());
|
||||
productionAssembly.setCraftName(productionProcessContext.getCraftName());
|
||||
|
||||
productionAssembly.setEquipmentCode(cellEquipContext.getEquipmentCode());
|
||||
|
||||
productionAssembly.setProductionRecordId(mesProdRuleContext.getProductionRecordId());
|
||||
productionAssembly.setMouldNo(mesProdRuleContext.getMouldNo());
|
||||
|
||||
if (null != productionPsOutContext) {
|
||||
productionAssembly.setPartNo(productionPsOutContext.getPartNo());
|
||||
productionAssembly.setPartName(productionPsOutContext.getPartName());
|
||||
productionAssembly.setSerialNumber(productionPsOutContext.getSerialNumber());
|
||||
productionAssembly.setProductSn(productionPsOutContext.getProductSn());
|
||||
productionAssembly.setCustSn(productionPsOutContext.getCustSn());
|
||||
}
|
||||
|
||||
MesScanMonitorContext scanMonitorContext = productionProcessContextStepService.dispatchScanMonitorContext(reqBean, true);
|
||||
if (null != scanMonitorContext) productionAssembly.setMouldRecordId(scanMonitorContext.getMouldRecordId());
|
||||
|
||||
productionAssembly.setOrganizeCode(reqBean.getOrganizeCode());
|
||||
ConvertBean.serviceModelInitialize(productionAssembly, reqBean.getUserInfo());
|
||||
|
||||
productionAssembly.setFid(UUID.randomUUID().toString());
|
||||
|
||||
productionAssemblyRepository.insert(productionAssembly);
|
||||
}
|
||||
|
||||
private void updateWorkOrderCutStatus(StationRequestBean reqBean, String cutWorkOrderNo, Integer status) {
|
||||
DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
|
||||
DdlPreparedPack.getStringEqualPack(cutWorkOrderNo, MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean);
|
||||
workOrderCutRepository.updateByProperties(new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.WORK_ORDER_STATUS},
|
||||
new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), status},
|
||||
packBean);
|
||||
}
|
||||
|
||||
private String doGenerateSerialNo(StationRequestBean reqBean, StationResultBean resultBean, String ruleCode, MesPart part) {
|
||||
try {
|
||||
return syncFuncService.syncSerialNo(
|
||||
new GenSerialNoModel(ruleCode).prodLocation(reqBean.getWorkCenterCode()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(reqBean.getOrganizeCode()),
|
||||
reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString();
|
||||
} catch (ImppBusiException e) {
|
||||
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail());
|
||||
} catch (Exception e) {
|
||||
String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成零件条码%s", part.getPartNo(), ruleCode, fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode()));
|
||||
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.ERROR.getValue()), webMsg, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
|
||||
this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, true);
|
||||
foundExThrowNoShowMsg();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
|
||||
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @Description :裁片工单明细
|
||||
* @Reference :
|
||||
* @Author : jack.jia
|
||||
* @CreateDate : 2019-04-02
|
||||
* @Modify:
|
||||
**/
|
||||
@Data
|
||||
@Api("裁片工单明细MODEL")
|
||||
public class MesWorkOrderCutDetailModel {
|
||||
|
||||
@ApiParam("裁片工单号")
|
||||
private String cutWorkOrderNo;
|
||||
|
||||
@ApiParam("工单号")
|
||||
private String workOrderNo;
|
||||
|
||||
@ApiParam("物料号")
|
||||
private String partNo;
|
||||
|
||||
@ApiParam("物料名称")
|
||||
private String partName;
|
||||
|
||||
@ApiParam("产成数量")
|
||||
private Double qty;
|
||||
|
||||
@ApiParam("标包数量")
|
||||
private Double packageQty;
|
||||
|
||||
@ApiParam("包装条码规则")
|
||||
private String packageSnRule;
|
||||
}
|
Loading…
Reference in New Issue