mes-uat-changshu0609-temp-wj-250616-xisu
王杰 4 weeks ago
parent 6184690b17
commit 5a385d72d0

@ -259,12 +259,6 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "保存上下文推单队列信息")
Boolean dispatchSortQueuePushContext(StationRequestBean reqBean, List<MesQueueOrderPush> queueOrderPushList);
@ApiOperation(value = "获取弹框输入的工单数量")
Double getOrderQtyDialogContext(StationRequestBean reqBean);
@ApiOperation(value = "保存弹框输入的工单数量")
void dispatchOrderQtyDialogContext(StationRequestBean reqBean, String orderQty);
@ApiOperation(value = "获取站点用于缺料时进行上料绑定")
List<MesStation> getMatchStationContext(StationRequestBean reqBean);

@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.MesWorkOrderCheckCompleteQtyStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
@ -71,8 +72,9 @@ public class MesFunctionDialogInputOrderQtyService extends BaseSwsService implem
if (!stepResult.isCompleted()) reqBean.setTriggerAutoFsm(true);
else {
//保存弹框输入的工单数量
productionDispatchContextStepService.dispatchOrderQtyDialogContext(reqBean, buttonDynamicModel.getFunctionValue());
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
prodRuleContextList.stream().forEach(o -> o.eachCavityQty(buttonDynamicModel.getFunctionValue()));
reqBean.setButtonCode(buttonDynamicModel.getButtonCode());
reqBean.setStepDialogStatus(true);

@ -0,0 +1,45 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.MesWorkOrderCheckCompleteQtyStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Description :
**/
@Service
public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService implements IFsmModuleFunctionService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private MesWorkOrderCheckCompleteQtyStepService workOrderCheckCompleteQtyStepService;
@Autowired
private IShippingDispatchService shippingDispatchService;
@Override
public Boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()),
String.format("生产线[%s]工位[%s]原料调配弹框提交成功,请等待验证!提交信息[%s]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getFunctionValue()),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
return true;
}
}

@ -53,10 +53,16 @@ public class MesCustomDialogStepService extends BaseStepService {
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "弹框会话关闭!");
}
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
String customPageName = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.CUSTOM_PAGE_NAME)) ? stepParamMap.get().get(MesPcnExtConstWords.CUSTOM_PAGE_NAME).getParamValue() : null;
String customPageName;
if (reqBean.getDataMap().containsKey(MesPcnExtConstWords.CUSTOM_PAGE_NAME)) {
//适配其他工步调用弹框工步 例如: 原料调配弹框输入重量 [CUSTOM_PAGE_NAME = FUNCTION_DIALOG_INPUT_RAW_MIX_WEIGHT]
customPageName = (String) reqBean.getDataMap().get(MesPcnExtConstWords.CUSTOM_PAGE_NAME);
reqBean.getDataMap().remove(MesPcnExtConstWords.CUSTOM_PAGE_NAME);
} else {
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
customPageName = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.CUSTOM_PAGE_NAME)) ? stepParamMap.get().get(MesPcnExtConstWords.CUSTOM_PAGE_NAME).getParamValue() : null;
}
if (StringUtils.isEmpty(customPageName)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("弹框会话工步未配置工步参数[%s]!", MesPcnExtConstWords.CUSTOM_PAGE_NAME));

@ -14,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.util.StringUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
@ -198,7 +199,10 @@ public class MesProductSnGenerateStepService extends BaseStepService {
produceSnClone.setSerialNumber(snowflakeIdMaker.nextId() + MesPcnExtConstWords.EMPTY);
}
produceSnClone.setQty(new Double(1));
//适配弹框输入的工单数量【每腔数量】
if (StringUtils.isEmpty(produceSnClone.getQty()) || MathOperation.compareTo(produceSnClone.getQty(), new Double(0)) == 0) {
produceSnClone.setQty(prodRuleContext.getEachCavityQty());
}
if (!StringUtils.isEmpty(prodRuleContext.getWorkOrderNo())) produceSnClone.setWorkOrderNo(prodRuleContext.getWorkOrderNo());

@ -103,9 +103,6 @@ public class MesStationDeductionAssemblyStepService extends BaseStepService {
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//获取弹框输入的工单数量, 未弹框默认 数量=1
Double orderQtyDialogContext = productionDispatchContextStepService.getOrderQtyDialogContext(reqBean);
List<ReentrantLock> acquiredLocks = new ArrayList<>();
try {
if (!tryLock(acquiredLocks, stationNameList)) {
@ -117,7 +114,7 @@ public class MesStationDeductionAssemblyStepService extends BaseStepService {
Map<String, MesContainerPackageDetailContext> remainQtyMap2Cache = new HashMap<>();
//执行容器装配件的缓存扣减
dispatchStationDeductionAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContextList, orderQtyDialogContext, remainQtyMap2Cache);
dispatchStationDeductionAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContextList, remainQtyMap2Cache);
if (!stepResult.isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_FEEDING), stepResult.getMsg());
@ -127,6 +124,8 @@ public class MesStationDeductionAssemblyStepService extends BaseStepService {
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "站点扣减装配件扣减异常,即将重试!");
} finally {
unLockAll(acquiredLocks);
}
@ -137,11 +136,11 @@ public class MesStationDeductionAssemblyStepService extends BaseStepService {
//执行容器装配件的缓存扣减
private void dispatchStationDeductionAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter,
List<MesProdRuleContext> prodRuleContextList, Double orderQtyDialogContext, Map<String, MesContainerPackageDetailContext> remainQtyMap2Cache) {
List<MesProdRuleContext> prodRuleContextList, Map<String, MesContainerPackageDetailContext> remainQtyMap2Cache) {
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchContainer())) continue;
List<MesProductionAssemblyContext> productionAssemblyContextList = dispatchStationDeductionAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContext, orderQtyDialogContext, remainQtyMap2Cache);
List<MesProductionAssemblyContext> productionAssemblyContextList = dispatchStationDeductionAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContext, remainQtyMap2Cache);
if (!stepResult.isCompleted()) break;
prodRuleContext.assemblyDataJson(productionAssemblyContextList);
}
@ -150,14 +149,14 @@ public class MesStationDeductionAssemblyStepService extends BaseStepService {
//执行容器装配件的缓存扣减
private List<MesProductionAssemblyContext> dispatchStationDeductionAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter,
MesProdRuleContext prodRuleContext, Double orderQtyDialogContext, Map<String, MesContainerPackageDetailContext> remainQtyMap2Cache) {
MesProdRuleContext prodRuleContext, Map<String, MesContainerPackageDetailContext> remainQtyMap2Cache) {
List<MesProductionAssemblyContext> productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter);
for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) {
if (null == productionAssemblyContext || productionAssemblyContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_80.getValue()) != 0) continue;
//未匹配的工序用量
Double unMatchQty = MathOperation.mul(productionAssemblyContext.getQty(), orderQtyDialogContext);
Double unMatchQty = MathOperation.mul(productionAssemblyContext.getQty(), prodRuleContext.getEachCavityQty());
//扣料原料条码信息
List<MesContainerPackageDetailContext> deductionContextList = null;
//用于给装配件清单赋值

@ -93,16 +93,13 @@ public class MesStationMatchAssemblyStepService extends BaseStepService {
//将可扣减的条码进行原子性缓存, 并获取最新的实际库存
productionCustomContextStepService.dispatchContainerPackageDetailAtomicity(reqBean.getOrganizeCode(), containerPackageDetailContextList);
//获取弹框输入的工单数量, 未弹框默认 数量=1
Double orderQtyDialogContext = productionDispatchContextStepService.getOrderQtyDialogContext(reqBean);
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//站点信息用于后面扣料业务中进行LOCK
Map<String, MesStation> stationMap2Lock = new HashMap<>();
//匹配装配件的工序用量
dispatchStationMatchAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContextList, containerPackageDetailContextList, orderQtyDialogContext, stationMap2Lock);
dispatchStationMatchAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContextList, containerPackageDetailContextList, stationMap2Lock);
if (!stepResult.isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_FEEDING), stepResult.getMsg());
@ -123,10 +120,10 @@ public class MesStationMatchAssemblyStepService extends BaseStepService {
//匹配装配件的工序用量【遍历加工规则】
private void dispatchStationMatchAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter,
List<MesProdRuleContext> prodRuleContextList, List<MesContainerPackageDetailContext> containerPackageDetailContextList,
Double orderQtyDialogContext, Map<String, MesStation> stationMap2Lock) {
Map<String, MesStation> stationMap2Lock) {
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchContainer())) continue;
List<MesProductionAssemblyContext> productionAssemblyContextList = dispatchStationMatchAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContext, containerPackageDetailContextList, orderQtyDialogContext, stationMap2Lock);
List<MesProductionAssemblyContext> productionAssemblyContextList = dispatchStationMatchAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContext, containerPackageDetailContextList, stationMap2Lock);
if (!stepResult.isCompleted()) break;
prodRuleContext.assemblyDataJson(productionAssemblyContextList);
}
@ -135,7 +132,7 @@ public class MesStationMatchAssemblyStepService extends BaseStepService {
//匹配装配件的工序用量【遍历装配件】
private List<MesProductionAssemblyContext> dispatchStationMatchAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter,
MesProdRuleContext prodRuleContext, List<MesContainerPackageDetailContext> containerPackageDetailContextList,
Double orderQtyDialogContext, Map<String, MesStation> stationMap2Lock) {
Map<String, MesStation> stationMap2Lock) {
List<MesProductionAssemblyContext> productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter);
for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) {
if (null == productionAssemblyContext || productionAssemblyContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_80.getValue()) != 0) continue;
@ -144,7 +141,7 @@ public class MesStationMatchAssemblyStepService extends BaseStepService {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("当前产成对应的[%s]类型的装配件信息维护零件号或工序用量!", MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_80.getDescription()));
//未匹配的工序用量
Double unMatchQty = MathOperation.mul(productionAssemblyContext.getQty(), orderQtyDialogContext);
Double unMatchQty = MathOperation.mul(productionAssemblyContext.getQty(), prodRuleContext.getEachCavityQty());
//支持被扣减的原料条码
List<MesContainerPackageDetailContext> containerSnDataList = null;
//用于给装配件清单赋值

@ -589,19 +589,6 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CONTEXT, JSONObject.toJSONString(queueOrderPushList));
}
//获取弹框输入的工单数量
@Override
public Double getOrderQtyDialogContext(StationRequestBean reqBean) {
String orderQty = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.ORDER_QTY_DIALOG_CONTEXT);
return StringUtils.isEmpty(orderQty) ? new Double(1) : new Double(orderQty);
}
//获取弹框输入的工单数量
@Override
public void dispatchOrderQtyDialogContext(StationRequestBean reqBean, String orderQty) {
dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.ORDER_QTY_DIALOG_CONTEXT, orderQty);
}
//获取站点用于缺料时进行上料绑定
@Override
public List<MesStation> getMatchStationContext(StationRequestBean reqBean) {

@ -122,6 +122,13 @@ public class MesProdRuleContext implements Serializable {
@ApiParam(name = "是否存在装配件容器匹配")
private String isMatchContainer;
@ApiParam(name = "是否存在装配件原料调配")
private String isMatchRawMix;
//用于弹框输入工单数量
@ApiParam(name = "每腔数量")
private Double eachCavityQty = new Double(1);
public MesProdRuleContext() {}
public MesProdRuleContext(String organizeCode) {
@ -230,10 +237,22 @@ public class MesProdRuleContext implements Serializable {
return this;
}
public MesProdRuleContext eachCavityQty(String eachCavityQty) {
if (StringUtils.isEmpty(eachCavityQty)) return this;
return eachCavityQty(new Double(eachCavityQty));
}
public MesProdRuleContext eachCavityQty(Double eachCavityQty) {
if (StringUtils.isEmpty(eachCavityQty) || eachCavityQty.compareTo(new Double(0)) == 0) return this;
this.eachCavityQty = eachCavityQty;
return this;
}
public MesProdRuleContext assemblyDataJson(List<? extends MesProductionAssemblyContext> productionAssemblyContextList) {
if (CollectionUtils.isEmpty(productionAssemblyContextList)) return this;
this.assemblyDataJson = JSONObject.toJSONString(productionAssemblyContextList);
isMatchContainer(productionAssemblyContextList);
isMatchRawMix(productionAssemblyContextList);
return this;
}
@ -246,6 +265,15 @@ public class MesProdRuleContext implements Serializable {
return this;
}
//标记装配件是否需要进行原料调配
public MesProdRuleContext isMatchRawMix(List<? extends MesProductionAssemblyContext> productionAssemblyContextList) {
if (CollectionUtils.isEmpty(productionAssemblyContextList)) return this;
Optional<MesProductionAssemblyContext> optional = (Optional<MesProductionAssemblyContext>) productionAssemblyContextList.stream()
.filter(o -> (null != o && !StringUtils.isEmpty(o.getMatchType()) && o.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_90.getValue()) == 0)).findFirst();
if (null != optional && optional.isPresent()) this.isMatchRawMix = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr();
return this;
}
//根据生产线类型返回装配件数据集合
public List<? extends MesProductionAssemblyContext> getProductionAssemblyContextList(MesWorkCenter workCenter) {
if (StringUtils.isEmpty(this.assemblyDataJson)) return null;

@ -742,8 +742,6 @@ public class MesPcnExtConstWords {
public static final String PROD_TEMP_DATA_CONTEXT = "PROD_TEMP_DATA_CONTEXT";
// 上下文: 发运队列
public static final String SHIPPING_QUEUE_CONTEXT = "SHIPPING_QUEUE_CONTEXT";
// 上下文: 获取弹框输入的工单数量
public static final String ORDER_QTY_DIALOG_CONTEXT = "ORDER_QTY_DIALOG_CONTEXT";
// 用于缺料时进行上料绑定的站点
public static final String MATCH_STATION_CONTEXT = "MATCH_STATION_CONTEXT";
// 用于扣料业务中进行LOCK

Loading…
Cancel
Save