Merge remote-tracking branch 'origin/dev' into dev

tags/yfai-pcn-ext-v1.0
administrator 11 months ago
commit 349a2a0cf7

@ -4,6 +4,7 @@ import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesPackage;
import cn.estsh.i3plus.pojo.mes.bean.MesPackageDetail;
import cn.estsh.impp.framework.boot.util.ResultBean;
import io.swagger.annotations.ApiOperation;
import java.util.List;
@ -25,10 +26,10 @@ public interface IMesBoxingErrorProofingService {
MesPackage doScan(MesPackageDetail mesPackageDetail);
@ApiOperation(value = "保存包装明细")
void saveMesPackageDetails(List<MesPackageDetail> mesPackage, String userName);
MesPackage saveMesPackageDetails(List<MesPackageDetail> mesPackage, String userName);
@ApiOperation(value = "更新包装表")
void updateMesPackage(MesPackage mesPackage);
ResultBean updateMesPackage(MesPackage mesPackage);
@ApiOperation(value = "更新包装明细")
void updateMesPackageDetails(MesPackageDetail mesPackage);

@ -17,6 +17,15 @@ import java.util.Map;
*/
public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "验证上下文工位加工锁是否存在")
Boolean checkProductionLockIsExistContext(StationRequestBean reqBean);
@ApiOperation(value = "保存上下文加工锁")
Boolean saveProductionLockContext(StationRequestBean reqBean, String value);
@ApiOperation(value = "删除上下文加工锁")
void deleteProductionLockContext(StationRequestBean reqBean);
@ApiOperation(value = "发送设备质量信息")
void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext);

@ -76,8 +76,8 @@ public class MesBoxingErrorProofingController {
ValidatorBean.checkNotNull(mesPackageDetail.getPackageNo(), "箱条码不能为空");
});
String userName = AuthUtil.getSessionUser().getUserName();
mesBoxingErrorProofingService.saveMesPackageDetails(mesPackageDetailList, userName);
return ResultBean.success("保存成功");
MesPackage mesPackage = mesBoxingErrorProofingService.saveMesPackageDetails(mesPackageDetailList, userName);
return ResultBean.success("保存成功").setResultObject(mesPackage);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
@ -96,8 +96,7 @@ public class MesBoxingErrorProofingController {
mesPackage.setOrganizeCode(AuthUtil.getOrganizeCode());
ConvertBean.serviceModelUpdate(mesPackage, AuthUtil.getSessionUser().getUserName());
mesBoxingErrorProofingService.updateMesPackage(mesPackage);
return ResultBean.success("保存成功");
return mesBoxingErrorProofingService.updateMesPackage(mesPackage);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {

@ -17,6 +17,7 @@ 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.repository.*;
import cn.estsh.impp.framework.boot.util.ResultBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -104,28 +105,12 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
}
//校验包装条码信息
MesPackage mesPackage = getMesPackageAndCheck(mesPackageDetail.getPackageNo(), mesPackageDetail.getOrganizeCode());
//校验是否重复扫描
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPackageDetail.getPackageNo(), "packageNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesPackageDetail.getSerialNumber(), "serialNumber", ddlPackBean);
if (mesPackageDetailRDao.isExitByHql(ddlPackBean)) {
MesPcnException.throwMesBusiException("零件条码【%s】已存在该箱不允许重复扫描", mesPackageDetail.getSerialNumber());
}
//校验是否已关闭
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesPackage.getIsSealed()) {
MesPcnException.throwMesBusiException("箱条码已封箱,不允许扫描零件条码");
}
//获取包装定义明细
ddlPackBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPackage.getPackageSn(), "packCode", ddlPackBean);
List<MesPackingDefineDetails> defineDetails = mesPackingDefineDetailsRDao.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(defineDetails)) {
MesPcnException.throwMesBusiException("箱类别代号【%s】包装定义明细未维护", mesPackage.getPackageSn());
}
//校验是否包含
String partNo = getPartNo(mesPackageDetail, mesPackage, defineDetails);
//物料信息
MesPart mesPart = getPart(mesPackageDetail.getOrganizeCode(), partNo);
//校验条码规则
MesPart mesPart = getMesPart(mesPackageDetail, mesPackage);
//包装规格明细
MesPackageDetail saveMesPackageDetail = getPackageDetail(mesPackageDetail, mesPart);
if (mesPackageDetail.getIsMemoryBoolean()) {
@ -139,23 +124,30 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
}
}
@Override
public void saveMesPackageDetails(List<MesPackageDetail> mesPackageDetailList, String userName) {
public MesPackage saveMesPackageDetails(List<MesPackageDetail> mesPackageDetailList, String userName) {
MesPackageDetail packageDetail = mesPackageDetailList.iterator().next();
int qty = mesPackageDetailList.size();
//校验包装条码信息
MesPackage mesPackage = getMesPackageAndCheck(packageDetail.getPackageNo(), packageDetail.getOrganizeCode());
//校验是否已关闭
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesPackage.getIsSealed()) {
MesPcnException.throwMesBusiException("箱条码已封箱,不允许扫描零件条码");
}
//去掉重复零件条码
checkSerialNumber(mesPackageDetailList, packageDetail, userName);
List<MesPackageDetail> saveMesPackageDetailList = new ArrayList<>();
checkSerialNumber(saveMesPackageDetailList,mesPackageDetailList, packageDetail, userName);
//保存包装明细
mesPackageDetailRDao.saveAll(mesPackageDetailList);
//更新包装表
updateMesPackage(mesPackage, userName, qty, false);
if(!CollectionUtils.isEmpty(saveMesPackageDetailList)){
mesPackageDetailRDao.saveAll(saveMesPackageDetailList);
int qty = saveMesPackageDetailList.size();
//更新包装表
updateMesPackage(mesPackage, userName, qty, false);
}
return mesPackage;
}
@Override
public void updateMesPackage(MesPackage mesPackage) {
public ResultBean updateMesPackage(MesPackage mesPackage) {
String userName = mesPackage.getModifyUser();
if (Objects.isNull(CommonEnumUtil.TRUE_OR_FALSE.valueOfDescription(mesPackage.getIsSealed()))) {
MesPcnException.throwMesBusiException("是否封箱不能为空");
@ -164,16 +156,24 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
MesPackage mesPackageDb = getMesPackageAndCheck(mesPackage.getPackageNo(), mesPackage.getOrganizeCode());
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesPackage.getIsSealed()) {
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesPackageDb.getIsSealed()) {
MesPcnException.throwMesBusiException("包装条码【%s】状态为已关箱请勿重复操作", mesPackage.getPackageNo());
MesPcnException.throwMesBusiException("箱条码【%s】状态为已关箱请勿重复操作", mesPackage.getPackageNo());
}
//校验是否存在包装明细
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesPackage.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPackage.getPackageNo(), "packageNo", ddlPackBean);
if (!mesPackageDetailRDao.isExitByHql(ddlPackBean)) {
MesPcnException.throwMesBusiException("箱条码【%s】下不存在零件条码不允许关箱", mesPackage.getPackageNo());
}
//关箱
updateMesPackage(mesPackageDb, mesPackage.getModifyUser(), 0d, true);
} else if (CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == mesPackage.getIsSealed()) {
return ResultBean.success("关箱成功");
} else {
if (CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == mesPackageDb.getIsSealed()) {
MesPcnException.throwMesBusiException("包装条码【%s】状态不为已关箱不需要拆箱", mesPackage.getPackageNo());
MesPcnException.throwMesBusiException("条码【%s】状态不为已关箱不需要拆箱", mesPackage.getPackageNo());
}
//拆箱
unboxing(mesPackage, userName, mesPackageDb);
return ResultBean.success("拆箱成功");
}
}
@ -182,11 +182,13 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
//查询包装条码信息
MesPackage mesPackageDb = getMesPackageAndCheck(mesPackageDetail.getPackageNo(), mesPackageDetail.getOrganizeCode());
if (CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == mesPackageDb.getIsSealed()) {
MesPcnException.throwMesBusiException("包装条码【%s】不为已关箱状态不允许操作替换条码", mesPackageDetail.getPackageNo());
MesPcnException.throwMesBusiException("条码【%s】不为已关箱状态不允许操作替换条码", mesPackageDetail.getPackageNo());
}
//校验是否重复扫描
List<MesPackageDetail> mesPackageDetails = getMesPackageDetailList(mesPackageDetail);
//校验条码是否符合规则
MesPart mesPart = getMesPart(mesPackageDetail, mesPackageDb);
boolean exist = false;
for (MesPackageDetail packageDetail : mesPackageDetails) {
//替换条码是否已经存在
if (packageDetail.getSerialNumber().equals(mesPackageDetail.getSerialNumber())) {
@ -196,9 +198,15 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
if (packageDetail.getSerialNumber().equals(mesPackageDetail.getOldSerialNumber())) {
packageDetail.setSerialNumber(mesPackageDetail.getSerialNumber());
packageDetail.setOldSerialNumber(mesPackageDetail.getOldSerialNumber());
packageDetail.setPartNo(mesPart.getPartNo());
packageDetail.setPartName(mesPart.getPartName());
ConvertBean.serviceModelUpdate(packageDetail, mesPackageDetail.getModifyUser());
exist = true;
}
}
if(!exist){
MesPcnException.throwMesBusiException("原零件条码【%s】不存在", mesPackageDetail.getOldSerialNumber());
}
mesPackageDetailRDao.saveAll(mesPackageDetails);
}
@ -222,6 +230,37 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
}
}
private MesPart getMesPart(MesPackageDetail mesPackageDetail, MesPackage mesPackage) {
//校验是否重复扫描
checkSerialNumber(mesPackageDetail);
//获取包装定义明细
List<MesPackingDefineDetails> defineDetails = getMesPackingDefineDetails(mesPackageDetail.getOrganizeCode(), mesPackage.getPackageSn());
//校验是否包含
String partNo = getPartNo(mesPackageDetail, mesPackage, defineDetails);
//物料信息
return getPart(mesPackageDetail.getOrganizeCode(), partNo);
}
private void checkSerialNumber(MesPackageDetail mesPackageDetail) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPackageDetail.getPackageNo(), "packageNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesPackageDetail.getSerialNumber(), "serialNumber", ddlPackBean);
if (mesPackageDetailRDao.isExitByHql(ddlPackBean)) {
MesPcnException.throwMesBusiException("零件条码【%s】已存在该箱不允许重复扫描", mesPackageDetail.getSerialNumber());
}
}
private List<MesPackingDefineDetails> getMesPackingDefineDetails(String organizeCode, String packCode) {
DdlPackBean ddlPackBean;
ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(packCode, "packCode", ddlPackBean);
List<MesPackingDefineDetails> defineDetails = mesPackingDefineDetailsRDao.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(defineDetails)) {
MesPcnException.throwMesBusiException("箱类别代号【%s】包装定义明细未维护", packCode);
}
return defineDetails;
}
private void unboxing(MesPackage mesPackage, String userName, MesPackage mesPackageDb) {
//更新包装表
mesPackageDb.setQty(0d);
@ -241,21 +280,24 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
private MesPackage getMesPackageAndCheck(String packageNo, String organizeCode) {
MesPackage mesPackageDb = getMesPackage(organizeCode, packageNo);
if (Objects.isNull(mesPackageDb)) {
MesPcnException.throwMesBusiException("包装条码【%s】信息不存在", packageNo);
MesPcnException.throwMesBusiException("条码【%s】信息不存在", packageNo);
}
return mesPackageDb;
}
private void checkSerialNumber(List<MesPackageDetail> mesPackageDetailList, MesPackageDetail packageDetail, String userName) {
private void checkSerialNumber(List<MesPackageDetail> saveMesPackageDetailList,List<MesPackageDetail> mesPackageDetailList, MesPackageDetail packageDetail, String userName) {
List<MesPackageDetail> mesPackageDetails = getMesPackageDetailList(packageDetail.getOrganizeCode(), packageDetail.getPackageNo());
if (!CollectionUtils.isEmpty(mesPackageDetails)) {
List<String> serialNumberList = mesPackageDetails.stream().map(MesPackageDetail::getSerialNumber).collect(Collectors.toList());
for (MesPackageDetail mesPackageDetail : mesPackageDetailList) {
if (serialNumberList.contains(mesPackageDetail.getSerialNumber())) {
mesPackageDetailList.remove(mesPackageDetail);
}
ConvertBean.serviceModelInitialize(mesPackageDetail, userName);
if (!serialNumberList.contains(mesPackageDetail.getSerialNumber())) {
//校验零件规则
saveMesPackageDetailList.add(mesPackageDetail);
}
}
}else{
saveMesPackageDetailList.addAll(mesPackageDetailList);
}
}
@ -319,7 +361,7 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
}
}
if (Objects.isNull(partNo)) {
MesPcnException.throwMesBusiException("零件条码【%s】未匹配到符合条码规则的数据", mesPackage.getSerialNumber());
MesPcnException.throwMesBusiException("零件条码【%s】未匹配到符合条码规则的数据", mesPackageDetail.getSerialNumber());
}
return partNo;
}

@ -2,12 +2,13 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station;
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.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseModuleService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
@ -23,6 +24,7 @@ import cn.estsh.i3plus.pojo.mes.repository.MesFileRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.i3plus.pojo.mes.util.PojoAttrUtil;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Objects;
import lombok.extern.slf4j.Slf4j;
@ -35,7 +37,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import java.util.stream.Collectors;
/**
* @Description :
@ -84,8 +85,12 @@ public class MesProductionNoSortModuleService extends BaseModuleService {
StationResultBean shiftCountBean = getStationResultBean(reqBean, productionStatisticsContext,mesWorkCell);
this.sendMessage(reqBean, shiftCountBean);
//验证工位是否锁定
reqBean.getDataMap().put(MesPcnConstWords.WS_CMD_INIT_MODULE, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr());
((IStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).execute(reqBean);
//设备BYPASS监控
((IStepService) SpringContextsUtil.getBean("mesEquipByPassReadStepService")).execute(reqBean);
}

@ -0,0 +1,47 @@
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.apiservice.serviceimpl.step.MesCountDownShowStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
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 cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @Description :
**/
@Service
public class MesFunctionProductionLockService extends BaseSwsService implements IFsmModuleFunctionService {
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Override
public boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
//保存上下文加工锁
productionDispatchContextStepService.saveProductionLockContext(reqBean, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr());
if (StringUtils.isEmpty(buttonDynamicModel.getParamCode()) || !buttonDynamicModel.getParamCode().equals(MesPcnExtConstWords.ATUO_PRODUCTION_LOCK)) {
((MesCountDownShowStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).checkCellProductionLockIsExist(reqBean, resultBean, false, true);
}
this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s成功!",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return true;
}
}

@ -0,0 +1,39 @@
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.apiservice.serviceimpl.step.MesCountDownShowStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService;
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 cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Description :
**/
@Service
public class MesFunctionProductionUnlockService extends BaseSwsService implements IFsmModuleFunctionService {
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Override
public boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
//删除上下文加工锁
productionDispatchContextStepService.deleteProductionLockContext(reqBean);
((MesCountDownShowStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).checkCellProductionLockIsExist(reqBean, resultBean, false, false);
this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s成功!",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
return true;
}
}

@ -216,6 +216,9 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
MesProdRuleNosortCfg filter = null;
Optional<MesProductionPsInContext> optional = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()))).findFirst();
if (null == optional || !optional.isPresent()) break;
for (MesProductionPsInContext productionPsInContext : productionPsInContextList) {
//foreignKey有值代表已经匹配过产品加工规则

@ -7,24 +7,22 @@ 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.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
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.model.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
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.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @Description :
@ -50,9 +48,6 @@ public class MesCountDownShowStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getProductionProcessContext(reqBean);
@ -68,14 +63,46 @@ public class MesCountDownShowStepService extends BaseStepService {
//不用显示倒计时, 客户端默认显示绿色无数字
if (StringUtils.isEmpty(workCell.getIsShowTime()) || CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == workCell.getIsShowTime()) return stepResult;
//工位开启时间锁, 验证当前是否存在加工锁定状态
Boolean isOpenTimeLock = (!StringUtils.isEmpty(workCell.getIsOpenTimeLock()) && CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == workCell.getIsOpenTimeLock()) ? true : false;
if (isOpenTimeLock) checkCellProductionLockIsExist(reqBean, resultBean, true, true);
String isInit = (String) reqBean.getDataMap().get(MesPcnConstWords.WS_CMD_INIT_MODULE);
reqBean.getDataMap().remove(MesPcnConstWords.WS_CMD_INIT_MODULE);
// if (!StringUtils.isEmpty(isInit)) return stepResult;
//解析工位参数
String countDownTime = doCalcCountDownCfg(reqBean);
String countDownTime = doCalcCountDownCfg(reqBean, isOpenTimeLock);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("[%sS]倒计时启动!", countDownTime));
}
private String doCalcCountDownCfg(StationRequestBean reqBean) {
//验证当前是否存在加工锁定状态
public void checkCellProductionLockIsExist(StationRequestBean reqBean, StationResultBean resultBean, Boolean isNeedCheck, Boolean isLock) {
if (isNeedCheck && !productionDispatchContextStepService.checkProductionLockIsExistContext(reqBean)) return;
List<StationKvBean> resultList = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(MesExtEnumUtil.COLOR.RED.getValue(), "已经超时", MesPcnExtConstWords.ZERO_STR));
StationResultBean stationResultBean = new StationResultBean()
.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.TIME_MODULE_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue())
.resultList(resultList).resultObj(isLock ? CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() : CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
stationResultBean.setResultMap(functionPoductionUnlock());
this.sendMessage(reqBean, stationResultBean);
if (isNeedCheck) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]已被锁定!请扫描解除锁定验证码!"));
}
private Map<String, Object> functionPoductionUnlock() {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put(MesPcnExtConstWords.FUNCTION_PRODUCTION_UNLOCK, JSONObject.toJSONString(new ButtonDynamicModel(MesPcnExtConstWords.FUNCTION_PRODUCTION_UNLOCK, "解除锁定", MesPcnExtConstWords.IS_CHECK_WCPC_PWD, MesPcnExtConstWords.FUNCTION_PRODUCTION_UNLOCK)));
resultMap.put(MesPcnExtConstWords.FUNCTION_PRODUCTION_LOCK, JSONObject.toJSONString(new ButtonDynamicModel(MesPcnExtConstWords.FUNCTION_PRODUCTION_LOCK, "锁定", MesPcnExtConstWords.ATUO_PRODUCTION_LOCK)));
return resultMap;
}
private String doCalcCountDownCfg(StationRequestBean reqBean, Boolean isOpenTimeLock) {
//获取工位参数
Map<String, String> wcpcMap = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean);
@ -88,8 +115,13 @@ public class MesCountDownShowStepService extends BaseStepService {
List<StationKvBean> resultList = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(MesExtEnumUtil.COLOR.GREEN.getValue(), "倒计时时长", countDownCfgArr[0]),
new StationKvBean(MesExtEnumUtil.COLOR.YELLOW.getValue(), "即将超时", countDownCfgArr[1]), new StationKvBean(MesExtEnumUtil.COLOR.RED.getValue(), "已经超时", MesPcnExtConstWords.ZERO_STR));
StationResultBean stationResultBean = new StationResultBean()
.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.TIME_MODULE_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue())
.resultList(resultList).resultObj(isOpenTimeLock ? CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() : CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
stationResultBean.setResultMap(functionPoductionUnlock());
//发送倒计时信号给客户端
this.sendMessage(reqBean, new StationResultBean().busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.TIME_MODULE_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue()).resultList(resultList));
this.sendMessage(reqBean, stationResultBean);
return countDownCfgArr[0];

@ -0,0 +1,100 @@
//package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
//
//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.api.busi.IMesWorkOrderExtService;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
//import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
//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.util.MesExtEnumUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.util.CollectionUtils;
//
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * @Description : 加工单验证工步【排序】
// * @Author : wangjie
// **/
//@Slf4j
//@Service("mesWorkOrderCheckSortStepService")
//public class MesWorkOrderCheckSortStepService extends BaseStepService {
//
// @Autowired
// private IMesProductionProcessContextStepService productionProcessContextStepService;
//
// @Autowired
// private IMesProductionDispatchContextStepService productionDispatchContextStepService;
//
// @Autowired
// private IMesWorkOrderExtService workOrderExtService;
//
// @Override
// public StepResult execute(StationRequestBean reqBean) {
//
// StationResultBean resultBean = new StationResultBean();
//
// StepResult stepResult = StepResult.getSuccessComplete();
//
// //获取上下文信息
// MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//
// //配置错误 抛出异常
// if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//
// //存储生产过程上下文对象
// productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//
// //获取上下文生产扫/读信息:加工单
// List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
//
// if (CollectionUtils.isEmpty(equipVariableCollectContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "上下文中缺失待验证的加工单信息!");
//
// //获取上下文产出零件信息
// List<MesProductionPartContext> cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//
// //清除本次已获取得到的加工单信息
// productionDispatchContextStepService.deleteScanWorkOrderNoContext(reqBean);
//
// //非扫描场景 清除历史产出零件信息
// if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionDispatchContextStepService.deleteProductionPartContext(reqBean);
//
// //验证工单的有效性
// List<MesProductionPartContext> productionPartContextList = new ArrayList<>();
// if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, equipVariableCollectContextList, productionPartContextList).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
//
// //扫描场景下合并历史产出零件信息
// if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionPartContextList.addAll(cachedProductionPartContextList);
//
// //保存上下文产出零件信息
// productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList);
//
// //更新展示组件MODULE_CONTENT内容
// doCacheMoudleContext(reqBean, productionPartContextList);
//
// if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的加工单%s验证工单状态成功!", stepResult.getObj().toString()));
//
//
//
//
//
//
//
//
//
//
// return stepResult;
//
// }
//
//
//
//
//}

@ -17,6 +17,7 @@ import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.google.common.base.Objects;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@ -39,6 +40,25 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
private String getContextKey(String organizeCode, String busiCode) { return new StringJoiner(":").add(organizeCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(busiCode).toString(); }
//验证上下文工位加工锁是否存在
@Override
public Boolean checkProductionLockIsExistContext(StationRequestBean reqBean) {
String value = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_LOCK_CONTEXT);
return !StringUtils.isEmpty(value) ? true : false;
}
//保存上下文加工锁
@Override
public Boolean saveProductionLockContext(StationRequestBean reqBean, String value) {
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_LOCK_CONTEXT, value);
}
//删除上下文加工锁
@Override
public void deleteProductionLockContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_LOCK_CONTEXT);
}
//发送设备质量信息
@Override
public void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext) {

@ -156,6 +156,8 @@ public class MesPcnExtConstWords {
public static final String COUNT_DOWN_CFG = "COUNT_DOWN_CFG";
// 工位倒计时配置默认值
public static final String COUNT_DOWN_CFG_DEFAULT = "60,5";
// 工位参数按钮事件参数: 是否验证密码
public static final String ATUO_PRODUCTION_LOCK = "ATUO_PRODUCTION_LOCK";
// 工位/工步 参数按钮事件
@ -177,7 +179,10 @@ public class MesPcnExtConstWords {
public static final String FUNCTION_CHOOSE_CAVITY_ORDER = "FUNCTION_CHOOSE_CAVITY_ORDER";
// 工位参数按钮事件: 切换工位
public static final String FUNCTION_SWITCH_CELL = "FUNCTION_SWITCH_CELL";
// 工位参数按钮事件: 锁定
public static final String FUNCTION_PRODUCTION_LOCK = "FUNCTION_PRODUCTION_LOCK";
// 工位参数按钮事件: 解除锁定
public static final String FUNCTION_PRODUCTION_UNLOCK = "FUNCTION_PRODUCTION_UNLOCK";
// 0
@ -212,6 +217,8 @@ public class MesPcnExtConstWords {
// 生产过程控制上下文目录名
public static final String PRODUCTION_PROCESS_CONTEXT = "PRODUCTION_PROCESS_CONTEXT";
// 生产过程控制工位加工锁
public static final String PRODUCTION_LOCK_CONTEXT = "PRODUCTION_LOCK_CONTEXT";
// 上下文: 班次班组信息
public static final String PROD_SHIFT_DATA_CONTEXT = "PROD_SHIFT_DATA_CONTEXT";
// 上下文: 基础数据

Loading…
Cancel
Save