上线工位

dev
yxw 2 years ago
parent ff6c9bab32
commit b2ee33414b

@ -0,0 +1,32 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base.jx;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @Author: xinwang.yi
* @CreateDate: 2023/10/13 13:06
* @Description:
**/
public interface IMesManageCodeService {
/**
*
* @param organizeCode
* @param manageCode
* @return
*/
@ApiOperation(value = "根据管理编码获取管理码信息", notes = "根据管理编码获取管理码信息")
MesManageCode getManageCode(String organizeCode, String manageCode);
/**
*
* @param organizeCode
* @param manageCodeList
* @return
*/
@ApiOperation(value = "根据管理编码集合获取管理码信息集合", notes = "根据管理编码集合获取管理码信息集合")
List<MesManageCode> getManageCodeListByManageCodeList(String organizeCode, List<String> manageCodeList);
}

@ -130,6 +130,25 @@ public interface IProduceSnExtService {
MesProduceSnExt getProduceSnExtBySn(String organizeCode, String serialNumber);
/**
*
* @param organizeCode
* @param productSn
* @return
*/
@ApiOperation(value = "根据产品条码获取条码信息", notes = "根据产品条码获取条码信息")
MesProduceSnExt getProduceSnExtByProductSn(String organizeCode, String productSn);
/**
*
* @param organizeCode
* @param serialNumber
* @param workOrderNo
* @return
*/
@ApiOperation(value = "根据产品条码获取条码信息", notes = "根据产品条码获取条码信息")
MesProduceSnExt getProduceSnExtBySnAndOrderNo(String organizeCode, String serialNumber, String workOrderNo);
/**
* 线
*
* @param produceSnExt
@ -249,4 +268,13 @@ public interface IProduceSnExtService {
*/
@ApiOperation(value = "根据产品条码获取无效状态的条码信息", notes = "根据产品条码获取条码信息")
MesProduceSnExt getInvalidProduceSnExtBySn(String organizeCode, String serialNumber);
/**
*
* @param produceSnExt
* @return
*/
@ApiOperation(value = "新增条码信息", notes = "新增条码信息")
MesProduceSnExt insertProduceSnExt(MesProduceSnExt produceSnExt);
}

@ -66,4 +66,16 @@ public interface IProduceSnTravelExtService {
@ApiOperation(value = "根据最终工单号,生产线,工位查询条码履历集合", notes = "根据工单号,生产线,工位查询条码履历集合")
List<MesProduceSnTravelExt> getProduceSnTravelExtListByLastOrderNo(String organizeCode, String workCenterCode, String workCellCode, String workOrderNo);
/**
* ,线,
* @param organizeCode
* @param workCenterCode 线
* @param workCellCode
* @param workOrderNo
* @param serialNumber
* @return
*/
@ApiOperation(value = "根据工单号,生产线,工位,条码查询条码履历集合", notes = "根据工单号,生产线,工位,条码查询条码履历集合")
MesProduceSnTravelExt getProduceSnTravelExtByOrderNoAndWoAndSn(String organizeCode, String workCenterCode, String workCellCode, String workOrderNo, String serialNumber);
}

@ -168,13 +168,6 @@ public class ShiftProdCenterRecordService implements IShiftProdCenterRecordServi
.build();
}
workCenterDb.setShiftCode(null);
workCenterDb.setWorkTime(null);
workCenterDb.setWorkerQty(null);
ConvertBean.serviceModelUpdate(workCenterDb, centerRecordModel.getModifyUser());
new ConvertBeanExt(workCenterDb).convertBean(workCenterDb);
workCenterExtRepository.save(workCenterDb);
MesShiftProdCenterRecord shiftProdCenterRecordDb = shiftProdCenterRecordRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID,
MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.SHIFT_CODE, MesPcnExtConstWords.WORK_TIME, MesPcnExtConstWords.PROD_TYPE},
@ -189,6 +182,13 @@ public class ShiftProdCenterRecordService implements IShiftProdCenterRecordServi
.build();
}
workCenterDb.setShiftCode(null);
workCenterDb.setWorkTime(null);
workCenterDb.setWorkerQty(null);
ConvertBean.serviceModelUpdate(workCenterDb, centerRecordModel.getModifyUser());
new ConvertBeanExt(workCenterDb).convertBean(workCenterDb);
workCenterExtRepository.save(workCenterDb);
shiftProdCenterRecordDb.setEndTime(centerRecordModel.getEndTime());
shiftProdCenterRecordDb.setPartCutCount(centerRecordModel.getPartCutCount());
shiftProdCenterRecordDb.setOvertimeNum(centerRecordModel.getOvertimeNum());
@ -282,7 +282,7 @@ public class ShiftProdCenterRecordService implements IShiftProdCenterRecordServi
}
startOrEndShiftRecord.setWorkCenterCode(centerRecordModel.getWorkCenterCode());
startOrEndShiftRecord.setStartTime(TimeTool.getNowTime(true));
startOrEndShiftRecord.setStartTime(centerRecordModel.getStartTime());
startOrEndShiftRecord.setShiftCode(shiftDb.getShiftCode());
startOrEndShiftRecord.setShiftName(shiftDb.getShiftName());
startOrEndShiftRecord.setWorkTime(workTime);

@ -0,0 +1,42 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.jx.IMesManageCodeService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesManageCodeRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* @PROJECT_NAME: i3plus-mes-panasonic-jx
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2023-10-13 13:46
*/
@Service
public class MesManageCodeService implements IMesManageCodeService {
@Autowired
private MesManageCodeRepository manageCodeRepository;
@Override
public MesManageCode getManageCode(String organizeCode, String manageCode) {
return manageCodeRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.MANAGE_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), manageCode});
}
@Override
public List<MesManageCode> getManageCodeListByManageCodeList(String organizeCode, List<String> manageCodeList) {
if (CollectionUtils.isEmpty(manageCodeList)) return null;
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(manageCodeList, MesPcnExtConstWords.MANAGE_CODE, ddlPackBean);
return manageCodeRepository.findByHqlWhere(ddlPackBean);
}
}

@ -72,13 +72,13 @@ public class FristItemOrderService implements IWorkOrderStartService {
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.WORK_CENTER_CODE},
new Object[]{workOrderExt.getOrganizeCode(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), workOrderExt.getWorkCenterCode()});
if (null == workCenterExt) {
msg = String.format("工单首检生成单据:工单[%s]生产线[%s]无效", workOrderExt.getOrderNo(), workOrderExt.getWorkCenterCode());
msg = String.format("Q管理生成单据:工单[%s]生产线[%s]无效", workOrderExt.getOrderNo(), workOrderExt.getWorkCenterCode());
log.info(msg);
checkErrorLogService.insertCheckErrorLog(checkErrorLog, msg, userInfo);
return;
}
if (StringUtils.isEmpty(workCenterExt.getShiftCode()) || StringUtils.isEmpty(workCenterExt.getWorkTime())) {
msg = String.format("工单首检生成单据:工单[%s]生产线[%s]未启动班次", workOrderExt.getOrderNo(), workOrderExt.getWorkCenterCode());
msg = String.format("Q管理生成单据:工单[%s]生产线[%s]未启动班次", workOrderExt.getOrderNo(), workOrderExt.getWorkCenterCode());
log.info(msg);
checkErrorLogService.insertCheckErrorLog(checkErrorLog, msg, userInfo);
return;
@ -95,7 +95,7 @@ public class FristItemOrderService implements IWorkOrderStartService {
orderRuleOp = CollectionUtils.isEmpty(orderRuleList) ? null : orderRuleList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getShiftCode()))).findFirst();
}
if (null == orderRuleOp || !orderRuleOp.isPresent()) {
msg = String.format("工单首检生成单据:工单[%s]未配置生产线代码[%s][工单创建][工单首检]班次为[%s]或班次为空的单据规则信息,请检查", workOrderExt.getOrderNo(), workOrderExt.getWorkCenterCode(), workCenterExt.getShiftCode());
msg = String.format("Q管理生成单据:工单[%s]未配置生产线代码[%s][工单创建][Q管理]班次为[%s]或班次为空的单据规则信息,请检查", workOrderExt.getOrderNo(), workOrderExt.getWorkCenterCode(), workCenterExt.getShiftCode());
log.info(msg);
checkErrorLogService.insertCheckErrorLog(checkErrorLog, msg, userInfo);
return;
@ -107,7 +107,7 @@ public class FristItemOrderService implements IWorkOrderStartService {
Map<String, List<MesProcessCell>> processCodeMap = CollectionUtils.isEmpty(processCellList) ? null :
processCellList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getProcessCode()))).collect(Collectors.groupingBy(MesProcessCell::getProcessCode));
if (CollectionUtils.isEmpty(processCodeMap)) {
msg = String.format("工单首检生成单据:工单[%s]生产线代码[%s]未维护工序工位信息", workOrderExt.getOrderNo(), workOrderExt.getWorkCenterCode());
msg = String.format("Q管理生成单据:工单[%s]生产线代码[%s]未维护工序工位信息", workOrderExt.getOrderNo(), workOrderExt.getWorkCenterCode());
log.info(msg);
checkErrorLogService.insertCheckErrorLog(checkErrorLog, msg, userInfo);
return;
@ -122,7 +122,7 @@ public class FristItemOrderService implements IWorkOrderStartService {
DdlPreparedPack.getStringEqualPack(workOrderExt.getOrderNo(), MesPcnExtConstWords.WORK_ORDER_NO, packBean);
List<MesOrderJob> orderJobList = orderJobRepository.findByHqlWhere(packBean);
if (!CollectionUtils.isEmpty(orderJobList)) {
msg = String.format("工单首检生成单据:工单[%s]已经生成过首检单", workOrderExt.getOrderNo());
msg = String.format("Q管理生成单据:工单[%s]已经生成过首检单", workOrderExt.getOrderNo());
log.info(msg);
checkErrorLogService.insertCheckErrorLog(checkErrorLog, msg, userInfo);
return;
@ -133,7 +133,7 @@ public class FristItemOrderService implements IWorkOrderStartService {
DdlPreparedPack.getInPackList(processCodeList, MesPcnExtConstWords.PROCESS_CODE, packBean1);
List<MesProcessFirstItem> processFirstItemList = mesProcessFirstItemRDao.findByHqlWhere(packBean1);
if (CollectionUtils.isEmpty(processFirstItemList)) {
msg = String.format("工单首检生成单据:工单[%s]物料编码[%s]与工序代码%s未配置工单首检项目信息,请检查", workOrderExt.getOrderNo(), workOrderExt.getPartNo(), processCodeList.toString());
msg = String.format("Q管理生成单据:工单[%s]物料编码[%s]与工序代码%s未配置Q管理项目信息,请检查", workOrderExt.getOrderNo(), workOrderExt.getPartNo(), processCodeList.toString());
log.info(msg);
checkErrorLogService.insertCheckErrorLog(checkErrorLog, msg, userInfo);
return;
@ -155,7 +155,7 @@ public class FristItemOrderService implements IWorkOrderStartService {
List<String> orderNoList = getOrderNoByRuleCode(1,
MesPcnExtConstWords.ORDER_NO_RULE, new GenSerialNoModel(), userInfo, workOrderExt.getOrganizeCode());
if (CollectionUtils.isEmpty(orderNoList)) {
String msg = String.format("工单首检生成单据:工单[%s]单据编号未生成成功", workOrderExt.getOrderNo());
String msg = String.format("Q管理生成单据:工单[%s]单据编号未生成成功", workOrderExt.getOrderNo());
log.info(msg);
checkErrorLogService.insertCheckErrorLog(checkErrorLog, msg, userInfo);
return null;

@ -617,6 +617,26 @@ public class ProduceSnExtService implements IProduceSnExtService {
}
@Override
public MesProduceSnExt getProduceSnExtByProductSn(String organizeCode, String productSn) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn)) {
return null;
}
return produceSnExtRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PRODUCT_SN},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn});
}
@Override
public MesProduceSnExt getProduceSnExtBySnAndOrderNo(String organizeCode, String serialNumber, String workOrderNo) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(serialNumber) || StringUtils.isEmpty(workOrderNo)) {
return null;
}
return produceSnExtRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.SERIAL_NUMBER, MesPcnExtConstWords.WORK_ORDER_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), serialNumber, workOrderNo});
}
@Override
public void packSnExtProcess(MesProduceSnExt produceSnExt, String organizeCode, String workCenterCode, String workCellCode) {
if (null != produceSnExt && !StringUtils.isEmpty(organizeCode) && !StringUtils.isEmpty(workCenterCode) && !StringUtils.isEmpty(workCellCode)) {
MesRouteProcessCell processCell = routeProcessCellRepository.getByProperty(
@ -1287,6 +1307,11 @@ public class ProduceSnExtService implements IProduceSnExtService {
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.INVAILD.getValue(), serialNumber});
}
@Override
public MesProduceSnExt insertProduceSnExt(MesProduceSnExt produceSnExt) {
return produceSnExtRepository.save(produceSnExt);
}
public List<MesPackageExt> getPackageListByOrderNo(String organizeCode, String workOrderNo) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workOrderNo)) {
return null;

@ -97,4 +97,16 @@ public class ProduceSnTravelExtService implements IProduceSnTravelExtService {
workCenterCode, workCellCode, workOrderNo});
}
@Override
public MesProduceSnTravelExt getProduceSnTravelExtByOrderNoAndWoAndSn(String organizeCode, String workCenterCode, String workCellCode, String workOrderNo, String serialNumber) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode) || StringUtils.isEmpty(workOrderNo) || StringUtils.isEmpty(serialNumber)) {
return null;
}
return produceSnTravelExtRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID,
MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CELL_CODE, MesPcnExtConstWords.LAST_WORK_ORDER_NO, MesPcnExtConstWords.SERIAL_NUMBER},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(),
workCenterCode, workCellCode, workOrderNo, serialNumber});
}
}

@ -10,7 +10,6 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.platform.common.util.MesConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
@ -24,7 +23,6 @@ import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

@ -238,20 +238,20 @@ public class TorqueManageCheckService implements IWorkOrderStartService {
return true;
}
DdlPackBean packBean = DdlPackBean.getDdlPackBean(workOrderExt.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(MesPcnExtEnumUtil.MES_OR_ORDER_TYPE.PART_CHECK.getValue(), MesPcnExtConstWords.ORDER_TYPE, packBean);
DdlPreparedPack.getStringEqualPack(workOrderExt.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getStringEqualPack(workCenterExt.getShiftCode(), MesPcnExtConstWords.SHIFT_CODE, packBean);
DdlPreparedPack.getStringEqualPack(workCenterExt.getWorkTime(), MesPcnExtConstWords.WORK_TIME, packBean);
DdlPreparedPack.getStringEqualPack(workOrderExt.getOrderNo(), MesPcnExtConstWords.WORK_ORDER_NO, packBean);
List<MesOrderJob> orderJobList = orderJobRepository.findByHqlWhere(packBean);
if (!CollectionUtils.isEmpty(orderJobList)) {
msg = String.format("扭矩管理点检生成单据:工单[%s]已经生成过扭矩管理点检单", workOrderExt.getOrderNo());
log.info(msg);
checkErrorLogService.insertCheckErrorLog(checkErrorLog, msg, userInfo);
return true;
}
//DdlPackBean packBean = DdlPackBean.getDdlPackBean(workOrderExt.getOrganizeCode());
//DdlPreparedPack.getNumEqualPack(MesPcnExtEnumUtil.MES_OR_ORDER_TYPE.TORQUE_MANAGE.getValue(), MesPcnExtConstWords.ORDER_TYPE, packBean);
//DdlPreparedPack.getStringEqualPack(workOrderExt.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
//DdlPreparedPack.getStringEqualPack(workCenterExt.getShiftCode(), MesPcnExtConstWords.SHIFT_CODE, packBean);
//DdlPreparedPack.getStringEqualPack(workCenterExt.getWorkTime(), MesPcnExtConstWords.WORK_TIME, packBean);
//DdlPreparedPack.getStringEqualPack(workOrderExt.getOrderNo(), MesPcnExtConstWords.WORK_ORDER_NO, packBean);
//List<MesOrderJob> orderJobList = orderJobRepository.findByHqlWhere(packBean);
//
//if (!CollectionUtils.isEmpty(orderJobList)) {
// msg = String.format("扭矩管理点检生成单据:工单[%s]已经生成过扭矩管理点检单", workOrderExt.getOrderNo());
// log.info(msg);
// checkErrorLogService.insertCheckErrorLog(checkErrorLog, msg, userInfo);
// return true;
//}
return false;
}

@ -0,0 +1,429 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IShiftExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IShiftProdCenterRecordService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IWorkCenterExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnTravelExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.dao.IPackageExtDao;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManulExecuteOutTravel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnTravelExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkCenterExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesManulExecuteOutTravelRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseModuleService;
import cn.estsh.i3plus.mes.pcn.util.LocaleUtil;
import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.platform.plugin.opc.iservice.IOpcUAService;
import cn.estsh.i3plus.platform.plugin.opc.service.OpcUAService;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.hardswitch.bean.OpcUAParam;
import cn.estsh.i3plus.pojo.mes.bean.MesPlc;
import cn.estsh.i3plus.pojo.mes.bean.MesShift;
import cn.estsh.i3plus.pojo.mes.bean.MesStateMachineStatus;
import cn.estsh.i3plus.pojo.mes.model.AttrBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.repository.MesPlcRepository;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ImppRedis;
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 javax.annotation.Resource;
import java.text.MessageFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description : ()
* @Reference :
* @Author :wangjie
* @CreateDate : 2020-06-26 11:18
* @Modify:
**/
@Slf4j
@Service("sxNoumenonSnPopUpOnlineModuleService")
public class SxNoumenonSnPopUpOnlineModuleService extends BaseModuleService {
@Autowired
private IWorkCenterExtService workCenterExtService;
@Autowired
private IShiftExtService shiftExtService;
@Autowired
private IShiftProdCenterRecordService shiftProdCenterRecordService;
@Autowired
private IShippingDispatchService shippingDispatchService;
@Autowired
private IFsmCommonService fsmCommonService;
@Autowired
private MesPlcRepository plcRepository;
@Autowired
private MesManulExecuteOutTravelRepository manulExecuteOutRepository;
@Resource(name = MesPcnExtConstWords.REDIS_RES_PCN)
private ImppRedis redisMesPcn;
private static final String LAST_SELECT_ORDER = "LAST_SELECT_ORDER";
private static final String NOUMENON_SN_ONLINE_DATA = "NOUMENON_SN_ONLINE_DATA";
@Override
public void init(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
String err;
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue());
resultBean.setCustomPageName(MesPcnExtConstWords.NOUMENON_SN_POP_UP_ONLINE);
//resultBean.setCustomPageName(MesPcnExtConstWords.NOUMENON_PACKAGE_MODULE);
//resultBean.setDataAttrList(packDataAttrList(reqBean));
resultBean.setSpecialDisplayData(getStepColIndent(reqBean));
MesWorkCenterExt workCenterExt = workCenterExtService.getWorkCenterExtByWorkCenterCode(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
if (null == workCenterExt || (StringUtils.isEmpty(workCenterExt.getShiftCode()) || StringUtils.isEmpty(workCenterExt.getWorkTime()))) {
this.sendMessage(reqBean, resultBean);
err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "生产线[%s]未启动班次"), reqBean.getWorkCenterCode());
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("生产线[%s]未启动班次", reqBean.getWorkCenterCode())
.build();
}
MesShift shiftDb = shiftExtService.getShiftByShiftCodeAndCenterCode(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), workCenterExt.getShiftCode());
if (null == shiftDb) {
this.sendMessage(reqBean, resultBean);
err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "生产线[%s]未关联班次代码[%s]"), reqBean.getWorkCenterCode(), workCenterExt.getShiftCode());
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode())
.setErrorDetail("生产线[%s]未关联班次代码[%s]", reqBean.getWorkCenterCode(), workCenterExt.getShiftCode())
.build();
}
String workTime = shiftProdCenterRecordService.getWorkTime(shiftDb.getStartTime(), shiftDb.getEndTime());
if (StringUtils.isEmpty(workTime) || !workTime.equals(workCenterExt.getWorkTime())) {
this.sendMessage(reqBean, resultBean);
err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "生产线[%s]需要重新启动班次"), reqBean.getWorkCenterCode());
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode())
.setErrorDetail("生产线[%s]需要重新启动班次", reqBean.getWorkCenterCode())
.build();
}
//if (StringUtils.isEmpty(reqBean.getWorkOrderNo())) {
// this.sendMessage(reqBean, resultBean);
// err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "请选择工单");
// this.sendMessage(reqBean, null, err, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
// throw ImppExceptionBuilder.newInstance()
// .setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
// .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode())
// .setErrorDetail("请选择工单")
// .build();
//}
//
//List<MesProduceSnTravelExt> produceSnTravelExtList = produceSnTravelExtService.getProduceSnTravelExtListByOrderNo(
// reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getWorkOrderNo());
//
//int snCount = CollectionUtils.isEmpty(produceSnTravelExtList) ? 0 : produceSnTravelExtList.size();
//
//MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), reqBean.getWorkOrderNo());
//if (null == workOrderExt || MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() != workOrderExt.getWorkOrderStatus() ||
// MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() == workOrderExt.getWorkOrderType()) {
// this.sendMessage(reqBean, resultBean);
// throw ImppExceptionBuilder.newInstance()
// .setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
// .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode())
// .setErrorDetail("工单[%s]不能在此工位操作", reqBean.getWorkOrderNo())
// .build();
//
//} else if (snCount >= workOrderExt.getQty().intValue()) {
// this.sendMessage(reqBean, resultBean);
// throw ImppExceptionBuilder.newInstance()
// .setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
// .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode())
// .setErrorDetail("工单[%s]已达绑定数量,不能在此工位操作", reqBean.getWorkOrderNo())
// .build();
//}
Map<String, String> wcpcMap = fsmCommonService.getCachedWorkCellParam(reqBean);
reqBean.setWorkOrderNo(wcpcMap.get("WORK_ORDER_NO"));
doHandleSelectWorkOrderNo(reqBean, 2, wcpcMap.get("WORK_ORDER_NO"));
//resultBean.setResultMap(packResultMap(workOrderExt, produceSnTravelExtList));
this.sendMessage(reqBean, resultBean);
}
private Map<String, Object> packResultMap(MesWorkOrderExt workOrderExt, List<MesProduceSnTravelExt> produceSnTravelExtList) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put(MesPcnExtConstWords.WORK_ORDER_NO, workOrderExt.getOrderNo());
resultMap.put(MesPcnExtConstWords.WORK_ORDER_TYPE_NAME, MesPcnExtEnumUtil.WORK_ORDER_TYPE.valueOfDescription(workOrderExt.getWorkOrderType()));
resultMap.put(MesPcnExtConstWords.PART_NO, workOrderExt.getPartNo());
resultMap.put(MesPcnExtConstWords.PART_NAME, workOrderExt.getPartNameRdd());
resultMap.put(MesPcnExtConstWords.QTY, workOrderExt.getQty());
resultMap.put(MesPcnExtConstWords.COMPLETE_QTY, CollectionUtils.isEmpty(produceSnTravelExtList) ? 0 : produceSnTravelExtList.size());
return resultMap;
}
private List<AttrBean> packDataAttrList(StationRequestBean reqBean) {
List<AttrBean> attrBeanList = new ArrayList<>();
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.SERIAL_NUMBER, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "产品条码"));
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PACKAGENO, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "包装条码"));
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.CREATE_DATE_TIME, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "扫描时间"));
return attrBeanList;
}
private String getLastSelectOrderKey(StationRequestBean reqBean) {
return getCacheKey(reqBean, LAST_SELECT_ORDER);
}
@Override
public boolean execute(StationRequestBean reqBean) {
return true;
}
@Override
public boolean execStateModule(StationRequestBean reqBean, List<MesStateMachineStatus> states, Map<String, String> wcpcMap) {
log.info(" sxNoumenonSnPopUpOnlineModuleService --- wcpcMap:{}", wcpcMap);
init(reqBean);
return true;
}
public synchronized Object doHandleManageCode(StationRequestBean reqBean, Integer flag, String value) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getCacheKey(reqBean, MesPcnExtConstWords.CUR_MANAGE_CODE), MesPcnExtConstWords.CUR_MANAGE_CODE);
case 2:
return redisMesPcn.putHash(getCacheKey(reqBean, MesPcnExtConstWords.CUR_MANAGE_CODE), MesPcnExtConstWords.CUR_MANAGE_CODE, value, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
redisMesPcn.deleteHash(getCacheKey(reqBean, MesPcnExtConstWords.CUR_MANAGE_CODE), MesPcnExtConstWords.CUR_MANAGE_CODE);
return true;
default:
return null;
}
}
private String getDataKey(StationRequestBean reqBean) {
return new StringJoiner(MesPcnExtConstWords.COLON)
.add(reqBean.getOrganizeCode()).add(NOUMENON_SN_ONLINE_DATA).add(reqBean.getWorkCenterCode()).toString();
}
public Object doReadOpcParamValue(MesPlc plc) {
IOpcUAService opcService = new OpcUAService();
String tagAddress = MessageFormat.format("{0}.{1}.{2}", plc.getChannel(), plc.getDevice(), plc.getTagAddress());
OpcUAParam opcParam = new OpcUAParam();
opcParam.setServerUrl(plc.getOpcUrl());
opcParam.setTagAddress(tagAddress);
opcParam.setNamespaceIndex(plc.getNameSpaceIndex());
opcParam.setTagValueType(plc.getDataType());
Object result = opcService.getOpcParamValue(opcParam);
opcService.disConnection();
return result;
}
public Boolean doWriteOpcParamValue(MesPlc plc, String value) {
IOpcUAService opcService = new OpcUAService();
String tagAddress = MessageFormat.format("{0}.{1}.{2}", plc.getChannel(), plc.getDevice(), plc.getTagAddress());
OpcUAParam opcParam = new OpcUAParam();
opcParam.setServerUrl(plc.getOpcUrl());
opcParam.setTagAddress(tagAddress);
opcParam.setNamespaceIndex(plc.getNameSpaceIndex());
opcParam.setTagValueType(plc.getDataType());
opcParam.setTagValue(value);
Boolean result = opcService.editOpcParamValue(opcParam);
opcService.disConnection();
return result;
}
public Boolean doReadOpcParamValueIsEquDefaultVal(MesPlc plc, String defaultVal, Boolean isEqu) {
Object plcValue = doReadOpcParamValue(plc);
if (StringUtils.isEmpty(plcValue)) {
return false;
}
if (isEqu) {
if (plcValue.toString().equals(defaultVal)) {
return true;
} else {
return false;
}
} else {
if (plcValue.toString().equals(defaultVal)) {
return false;
} else {
return true;
}
}
}
public void putLastSelectOrder(StationRequestBean reqBean) {
redisMesPcn.putObject(getLastSelectOrderKey(reqBean), reqBean.getWorkOrderNo(), MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
}
@Override
public boolean doFunction(StationRequestBean reqBean) {
Boolean result = false;
Map<String, Object> dataMap = reqBean.getDataMap();
String command = (String) dataMap.get(MesPcnExtConstWords.COMMAND);
Object value = dataMap.get(MesPcnExtConstWords.VALUE);
if (StringUtils.isEmpty(command)) {
this.sendMessage(reqBean, null, "后端未获取到业务功能指令", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
switch (command) {
case MesPcnExtConstWords.CMD_WORK_ORDER :
if (StringUtils.isEmpty(value)) {
this.sendMessage(reqBean, null, "请选择启动状态的工单", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
String selectWorkOrderNo = (String) doHandleSelectWorkOrderNo(reqBean, 1, null);
if (!StringUtils.isEmpty(selectWorkOrderNo) && selectWorkOrderNo.equals(value)) return result;
if (StringUtils.isEmpty(selectWorkOrderNo)) {
if ((Boolean) doHandleSelectWorkOrderNo(reqBean, 2, value.toString())) {
result = true;
}
else {
this.sendMessage(reqBean, null, String.format("切换的生产工单[%s]缓存失败,请重试", value), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
}
break;
case MesPcnExtConstWords.EXECUTE_OUT:
if (StringUtils.isEmpty(value)) {
this.sendMessage(reqBean, null, "入参缺少强制放行的工步代码", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
Map<String, String> wcpcMap = fsmCommonService.getCachedWorkCellParam(reqBean);
String plcCode = wcpcMap.get("PLC_CODE");
String executeOutPwd = wcpcMap.get("EXECUTE_OUT_PWD");
if (StringUtils.isEmpty(executeOutPwd)) {
this.sendMessage(reqBean, null, "当前工位未维护强制放行密码", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
if (StringUtils.isEmpty(plcCode)) {
this.sendMessage(reqBean, null, "当前工位未维护PLC代码", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
List<String> executeOutPwdList = Arrays.stream(executeOutPwd.split(MesPcnExtConstWords.COMMA)).collect(Collectors.toList());
if (!executeOutPwdList.contains(value)) {
this.sendMessage(reqBean, null, "强制密码错误", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
MesPlc plc = getPlc(reqBean.getOrganizeCode(), plcCode);
if (plc == null) {
this.sendMessage(reqBean, null, String.format("PLC代码[%s]不存在", plcCode), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
Boolean writeResult = doWriteOpcParamValue(plc, "1");
// 手动强制执行履行
MesManulExecuteOutTravel manulExecuteOutTravel = new MesManulExecuteOutTravel();
manulExecuteOutTravel.setPartNo(reqBean.getPartNo());
manulExecuteOutTravel.setPartNameRdd(reqBean.getPartName());
manulExecuteOutTravel.setProcessCode(reqBean.getProcessCode());
manulExecuteOutTravel.setSerialNumber(reqBean.getSerialNumber());
manulExecuteOutTravel.setWorkCellCode(reqBean.getWorkCellCode());
manulExecuteOutTravel.setWorkCenterCode(reqBean.getWorkCenterCode());
manulExecuteOutTravel.setWorkOrderNo(reqBean.getWorkOrderNo());
ConvertBean.serviceModelInitialize(manulExecuteOutTravel, reqBean.getUserInfo());
manulExecuteOutRepository.save(manulExecuteOutTravel);
log.info("SxNoumenonSnPopUpOnlineModuleService --- 放行结果:{} ", writeResult);
result = true;
break;
default:
break;
}
if (!result) this.sendMessage(reqBean, null, "操作太频繁", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
else {
//跳过工序
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
reqBean.setForceJumpProcess(true);
shippingDispatchService.doSendScanQueueNextExec(reqBean);
}
return result;
}
public MesPlc getPlc(String organizeCode, String plcCode) {
return plcRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.PLC_CODE},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), plcCode});
}
public synchronized Object doHandleSelectWorkOrderNo(StationRequestBean reqBean, Integer flag, String selectWorkOrderNo) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER);
case 2:
return redisMesPcn.putHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER, selectWorkOrderNo, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
redisMesPcn.deleteHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER);
return true;
default:
return null;
}
}
public synchronized Object doHandleCurExecWorkOrder(StationRequestBean reqBean, Integer flag, String curExecWorkOrder) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER);
case 2:
return redisMesPcn.putHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER, curExecWorkOrder, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
redisMesPcn.deleteHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER);
return true;
default:
return null;
}
}
public synchronized Object doHandleSelectWorkOrderType(StationRequestBean reqBean, Integer flag, String selectWorkOrderType) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER_TYPE);
case 2:
return redisMesPcn.putHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER_TYPE, selectWorkOrderType, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
redisMesPcn.deleteHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER_TYPE);
return true;
default:
return null;
}
}
}

@ -0,0 +1,423 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IShiftExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IShiftProdCenterRecordService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IWorkCenterExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManulExecuteOutTravel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnTravelExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkCenterExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesManulExecuteOutTravelRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseModuleService;
import cn.estsh.i3plus.mes.pcn.util.LocaleUtil;
import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.platform.plugin.opc.iservice.IOpcUAService;
import cn.estsh.i3plus.platform.plugin.opc.service.OpcUAService;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.hardswitch.bean.OpcUAParam;
import cn.estsh.i3plus.pojo.mes.bean.MesPlc;
import cn.estsh.i3plus.pojo.mes.bean.MesShift;
import cn.estsh.i3plus.pojo.mes.bean.MesStateMachineStatus;
import cn.estsh.i3plus.pojo.mes.model.AttrBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.repository.MesPlcRepository;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ImppRedis;
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 javax.annotation.Resource;
import java.text.MessageFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description : ()
* @Reference :
* @Author :wangjie
* @CreateDate : 2020-06-26 11:18
* @Modify:
**/
@Slf4j
@Service("sxNoumenonSnlineOffModuleService")
public class SxNoumenonSnlineOffModuleService extends BaseModuleService {
@Autowired
private IWorkCenterExtService workCenterExtService;
@Autowired
private IShiftExtService shiftExtService;
@Autowired
private IShiftProdCenterRecordService shiftProdCenterRecordService;
@Autowired
private IShippingDispatchService shippingDispatchService;
@Autowired
private IFsmCommonService fsmCommonService;
@Autowired
private MesPlcRepository plcRepository;
@Autowired
private MesManulExecuteOutTravelRepository manulExecuteOutRepository;
@Resource(name = MesPcnExtConstWords.REDIS_RES_PCN)
private ImppRedis redisMesPcn;
private static final String LAST_SELECT_ORDER = "LAST_SELECT_ORDER";
@Override
public void init(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
String err;
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue());
resultBean.setCustomPageName(MesPcnExtConstWords.NOUMENON_SN_LINE_OFF);
//resultBean.setCustomPageName(MesPcnExtConstWords.NOUMENON_PACKAGE_MODULE);
//resultBean.setDataAttrList(packDataAttrList(reqBean));
resultBean.setSpecialDisplayData(getStepColIndent(reqBean));
MesWorkCenterExt workCenterExt = workCenterExtService.getWorkCenterExtByWorkCenterCode(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
if (null == workCenterExt || (StringUtils.isEmpty(workCenterExt.getShiftCode()) || StringUtils.isEmpty(workCenterExt.getWorkTime()))) {
this.sendMessage(reqBean, resultBean);
err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "生产线[%s]未启动班次"), reqBean.getWorkCenterCode());
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("生产线[%s]未启动班次", reqBean.getWorkCenterCode())
.build();
}
MesShift shiftDb = shiftExtService.getShiftByShiftCodeAndCenterCode(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), workCenterExt.getShiftCode());
if (null == shiftDb) {
this.sendMessage(reqBean, resultBean);
err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "生产线[%s]未关联班次代码[%s]"), reqBean.getWorkCenterCode(), workCenterExt.getShiftCode());
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode())
.setErrorDetail("生产线[%s]未关联班次代码[%s]", reqBean.getWorkCenterCode(), workCenterExt.getShiftCode())
.build();
}
String workTime = shiftProdCenterRecordService.getWorkTime(shiftDb.getStartTime(), shiftDb.getEndTime());
if (StringUtils.isEmpty(workTime) || !workTime.equals(workCenterExt.getWorkTime())) {
this.sendMessage(reqBean, resultBean);
err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "生产线[%s]需要重新启动班次"), reqBean.getWorkCenterCode());
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode())
.setErrorDetail("生产线[%s]需要重新启动班次", reqBean.getWorkCenterCode())
.build();
}
//if (StringUtils.isEmpty(reqBean.getWorkOrderNo())) {
// this.sendMessage(reqBean, resultBean);
// err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "请选择工单");
// this.sendMessage(reqBean, null, err, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
// throw ImppExceptionBuilder.newInstance()
// .setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
// .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode())
// .setErrorDetail("请选择工单")
// .build();
//}
//
//List<MesProduceSnTravelExt> produceSnTravelExtList = produceSnTravelExtService.getProduceSnTravelExtListByOrderNo(
// reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getWorkOrderNo());
//
//int snCount = CollectionUtils.isEmpty(produceSnTravelExtList) ? 0 : produceSnTravelExtList.size();
//
//MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), reqBean.getWorkOrderNo());
//if (null == workOrderExt || MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() != workOrderExt.getWorkOrderStatus() ||
// MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() == workOrderExt.getWorkOrderType()) {
// this.sendMessage(reqBean, resultBean);
// throw ImppExceptionBuilder.newInstance()
// .setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
// .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode())
// .setErrorDetail("工单[%s]不能在此工位操作", reqBean.getWorkOrderNo())
// .build();
//
//} else if (snCount >= workOrderExt.getQty().intValue()) {
// this.sendMessage(reqBean, resultBean);
// throw ImppExceptionBuilder.newInstance()
// .setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
// .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode())
// .setErrorDetail("工单[%s]已达绑定数量,不能在此工位操作", reqBean.getWorkOrderNo())
// .build();
//}
Map<String, String> wcpcMap = fsmCommonService.getCachedWorkCellParam(reqBean);
reqBean.setWorkOrderNo(wcpcMap.get("WORK_ORDER_NO"));
doHandleSelectWorkOrderNo(reqBean, 2, wcpcMap.get("WORK_ORDER_NO"));
//resultBean.setResultMap(packResultMap(workOrderExt, produceSnTravelExtList));
this.sendMessage(reqBean, resultBean);
}
private Map<String, Object> packResultMap(MesWorkOrderExt workOrderExt, List<MesProduceSnTravelExt> produceSnTravelExtList) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put(MesPcnExtConstWords.WORK_ORDER_NO, workOrderExt.getOrderNo());
resultMap.put(MesPcnExtConstWords.WORK_ORDER_TYPE_NAME, MesPcnExtEnumUtil.WORK_ORDER_TYPE.valueOfDescription(workOrderExt.getWorkOrderType()));
resultMap.put(MesPcnExtConstWords.PART_NO, workOrderExt.getPartNo());
resultMap.put(MesPcnExtConstWords.PART_NAME, workOrderExt.getPartNameRdd());
resultMap.put(MesPcnExtConstWords.QTY, workOrderExt.getQty());
resultMap.put(MesPcnExtConstWords.COMPLETE_QTY, CollectionUtils.isEmpty(produceSnTravelExtList) ? 0 : produceSnTravelExtList.size());
return resultMap;
}
private List<AttrBean> packDataAttrList(StationRequestBean reqBean) {
List<AttrBean> attrBeanList = new ArrayList<>();
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.SERIAL_NUMBER, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "产品条码"));
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PACKAGENO, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "包装条码"));
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.CREATE_DATE_TIME, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "扫描时间"));
return attrBeanList;
}
private String getLastSelectOrderKey(StationRequestBean reqBean) {
return getCacheKey(reqBean, LAST_SELECT_ORDER);
}
@Override
public boolean execute(StationRequestBean reqBean) {
return true;
}
@Override
public boolean execStateModule(StationRequestBean reqBean, List<MesStateMachineStatus> states, Map<String, String> wcpcMap) {
log.info(" sxNoumenonSnlineOffModuleService --- wcpcMap:{}", wcpcMap);
init(reqBean);
return true;
}
public synchronized Object doHandleManageCode(StationRequestBean reqBean, Integer flag, String value) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getCacheKey(reqBean, MesPcnExtConstWords.CUR_MANAGE_CODE), MesPcnExtConstWords.CUR_MANAGE_CODE);
case 2:
return redisMesPcn.putHash(getCacheKey(reqBean, MesPcnExtConstWords.CUR_MANAGE_CODE), MesPcnExtConstWords.CUR_MANAGE_CODE, value, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
redisMesPcn.deleteHash(getCacheKey(reqBean, MesPcnExtConstWords.CUR_MANAGE_CODE), MesPcnExtConstWords.CUR_MANAGE_CODE);
return true;
default:
return null;
}
}
private String getDataKey(StationRequestBean reqBean) {
return new StringJoiner(MesPcnExtConstWords.COLON)
.add(reqBean.getOrganizeCode()).add(MesPcnExtConstWords.NOUMENON_SN_LINE_OFF).add(reqBean.getWorkCenterCode()).toString();
}
public Object doReadOpcParamValue(MesPlc plc) {
IOpcUAService opcService = new OpcUAService();
String tagAddress = MessageFormat.format("{0}.{1}.{2}", plc.getChannel(), plc.getDevice(), plc.getTagAddress());
OpcUAParam opcParam = new OpcUAParam();
opcParam.setServerUrl(plc.getOpcUrl());
opcParam.setTagAddress(tagAddress);
opcParam.setNamespaceIndex(plc.getNameSpaceIndex());
opcParam.setTagValueType(plc.getDataType());
Object result = opcService.getOpcParamValue(opcParam);
opcService.disConnection();
return result;
}
public Boolean doWriteOpcParamValue(MesPlc plc, String value) {
IOpcUAService opcService = new OpcUAService();
String tagAddress = MessageFormat.format("{0}.{1}.{2}", plc.getChannel(), plc.getDevice(), plc.getTagAddress());
OpcUAParam opcParam = new OpcUAParam();
opcParam.setServerUrl(plc.getOpcUrl());
opcParam.setTagAddress(tagAddress);
opcParam.setNamespaceIndex(plc.getNameSpaceIndex());
opcParam.setTagValueType(plc.getDataType());
opcParam.setTagValue(value);
Boolean result = opcService.editOpcParamValue(opcParam);
opcService.disConnection();
return result;
}
public Boolean doReadOpcParamValueIsEquDefaultVal(MesPlc plc, String defaultVal, Boolean isEqu) {
Object plcValue = doReadOpcParamValue(plc);
if (StringUtils.isEmpty(plcValue)) {
return false;
}
if (isEqu) {
if (plcValue.toString().equals(defaultVal)) {
return true;
} else {
return false;
}
} else {
if (plcValue.toString().equals(defaultVal)) {
return false;
} else {
return true;
}
}
}
public void putLastSelectOrder(StationRequestBean reqBean) {
redisMesPcn.putObject(getLastSelectOrderKey(reqBean), reqBean.getWorkOrderNo(), MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
}
@Override
public boolean doFunction(StationRequestBean reqBean) {
Boolean result = false;
Map<String, Object> dataMap = reqBean.getDataMap();
String command = (String) dataMap.get(MesPcnExtConstWords.COMMAND);
Object value = dataMap.get(MesPcnExtConstWords.VALUE);
if (StringUtils.isEmpty(command)) {
this.sendMessage(reqBean, null, "后端未获取到业务功能指令", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
switch (command) {
case MesPcnExtConstWords.CMD_WORK_ORDER :
if (StringUtils.isEmpty(value)) {
this.sendMessage(reqBean, null, "请选择启动状态的工单", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
String selectWorkOrderNo = (String) doHandleSelectWorkOrderNo(reqBean, 1, null);
if (!StringUtils.isEmpty(selectWorkOrderNo) && selectWorkOrderNo.equals(value)) return result;
if (StringUtils.isEmpty(selectWorkOrderNo)) {
if ((Boolean) doHandleSelectWorkOrderNo(reqBean, 2, value.toString())) {
result = true;
}
else {
this.sendMessage(reqBean, null, String.format("切换的生产工单[%s]缓存失败,请重试", value), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
}
break;
case MesPcnExtConstWords.EXECUTE_OUT:
if (StringUtils.isEmpty(value)) {
this.sendMessage(reqBean, null, "入参缺少强制放行的工步代码", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
Map<String, String> wcpcMap = fsmCommonService.getCachedWorkCellParam(reqBean);
String plcCode = wcpcMap.get("PLC_CODE");
String executeOutPwd = wcpcMap.get("EXECUTE_OUT_PWD");
if (StringUtils.isEmpty(executeOutPwd)) {
this.sendMessage(reqBean, null, "当前工位未维护强制放行密码", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
if (StringUtils.isEmpty(plcCode)) {
this.sendMessage(reqBean, null, "当前工位未维护PLC代码", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
List<String> executeOutPwdList = Arrays.stream(executeOutPwd.split(MesPcnExtConstWords.COMMA)).collect(Collectors.toList());
if (!executeOutPwdList.contains(value)) {
this.sendMessage(reqBean, null, "强制密码错误", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
MesPlc plc = getPlc(reqBean.getOrganizeCode(), plcCode);
if (plc == null) {
this.sendMessage(reqBean, null, String.format("PLC代码[%s]不存在", plcCode), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
Boolean writeResult = doWriteOpcParamValue(plc, "1");
// 手动强制执行履行
MesManulExecuteOutTravel manulExecuteOutTravel = new MesManulExecuteOutTravel();
manulExecuteOutTravel.setPartNo(reqBean.getPartNo());
manulExecuteOutTravel.setPartNameRdd(reqBean.getPartName());
manulExecuteOutTravel.setProcessCode(reqBean.getProcessCode());
manulExecuteOutTravel.setSerialNumber(reqBean.getSerialNumber());
manulExecuteOutTravel.setWorkCellCode(reqBean.getWorkCellCode());
manulExecuteOutTravel.setWorkCenterCode(reqBean.getWorkCenterCode());
manulExecuteOutTravel.setWorkOrderNo(reqBean.getWorkOrderNo());
ConvertBean.serviceModelInitialize(manulExecuteOutTravel, reqBean.getUserInfo());
manulExecuteOutRepository.save(manulExecuteOutTravel);
log.info("SxNoumenonSnPopUpOnlineModuleService --- 放行结果:{} ", writeResult);
result = true;
break;
default:
break;
}
if (!result) this.sendMessage(reqBean, null, "操作太频繁", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
else {
//跳过工序
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
reqBean.setForceJumpProcess(true);
shippingDispatchService.doSendScanQueueNextExec(reqBean);
}
return result;
}
public MesPlc getPlc(String organizeCode, String plcCode) {
return plcRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.PLC_CODE},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), plcCode});
}
public synchronized Object doHandleSelectWorkOrderNo(StationRequestBean reqBean, Integer flag, String selectWorkOrderNo) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER);
case 2:
return redisMesPcn.putHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER, selectWorkOrderNo, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
redisMesPcn.deleteHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER);
return true;
default:
return null;
}
}
public synchronized Object doHandleCurExecWorkOrder(StationRequestBean reqBean, Integer flag, String curExecWorkOrder) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER);
case 2:
return redisMesPcn.putHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER, curExecWorkOrder, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
redisMesPcn.deleteHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER);
return true;
default:
return null;
}
}
public synchronized Object doHandleSelectWorkOrderType(StationRequestBean reqBean, Integer flag, String selectWorkOrderType) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER_TYPE);
case 2:
return redisMesPcn.putHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER_TYPE, selectWorkOrderType, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
redisMesPcn.deleteHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER_TYPE);
return true;
default:
return null;
}
}
}

@ -0,0 +1,111 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.SxNoumenonSnPopUpOnlineModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.LocaleUtil;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
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.impp.framework.boot.util.ImppRedis;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2020-05-27
* @Modify:
**/
@Slf4j
@Service("sxNoumenonSnCheckReselectOrderStepService")
public class SxNoumenonSnCheckReselectOrderStepService extends BaseStepService {
@Autowired
private SxNoumenonSnPopUpOnlineModuleService snPopUpOnlineModuleService;
@Autowired
private IShippingDispatchService shippingDispatchService;
@Autowired
private IProduceSnExtService produceSnExtService;
@Resource(name = MesPcnExtConstWords.REDIS_RES_PCN)
private ImppRedis redisMesPcn;
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("SxNoumenonSnCheckReselectOrderStepService[execute] 参数:{}", reqBean);
StationResultBean resultBean = new StationResultBean();
String err;
if (StringUtils.isEmpty(reqBean.getSerialNumber())) {
err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "入参缺少条码信息 SerialNumber");
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
foundExThrowNoShowMsg();
}
if (StringUtils.isEmpty(reqBean.getWorkOrderNo())) {
err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "入参缺少工单信息 WorkOrderNo");
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
foundExThrowNoShowMsg();
}
if (StringUtils.isEmpty(reqBean.getDataMap().get(MesPcnExtConstWords.WORK_ORDER_NO))) {
err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "入参[DataMap]缺少工单信息 WorkOrderNo");
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
foundExThrowNoShowMsg();
}
if (!reqBean.getWorkOrderNo().equals(reqBean.getDataMap().get(MesPcnExtConstWords.WORK_ORDER_NO))) {
err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "当前执行工单已变更为[%s]"), reqBean.getWorkOrderNo());
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
snPopUpOnlineModuleService.putLastSelectOrder(reqBean);
String bindKeyPartCacheKey = getCacheKey(reqBean, MesPcnExtConstWords.BIND_KEY_PART);
redisMesPcn.deleteKey(bindKeyPartCacheKey);
String repairBindKeyPartCacheKey = getCacheKey(reqBean, MesPcnExtConstWords.REPAIR_BIND_KEY_PART);
redisMesPcn.deleteKey(repairBindKeyPartCacheKey);
//跳过整个工序
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnExtConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
reqBean.setForceJumpProcess(true);
shippingDispatchService.doSendScanQueueNextExec(reqBean);
foundExThrowNoShowMsg();
}
MesProduceSnExt produceSnExtDb = produceSnExtService.getProduceSnExtBySnAndOrderNo(reqBean.getOrganizeCode(), reqBean.getSerialNumber(), reqBean.getWorkOrderNo());
if(produceSnExtDb == null){
err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "当前条码[%s]已不关联当前工单[%s]"), reqBean.getSerialNumber(), reqBean.getWorkOrderNo());
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
String bindKeyPartCacheKey = getCacheKey(reqBean, MesPcnExtConstWords.BIND_KEY_PART);
redisMesPcn.deleteKey(bindKeyPartCacheKey);
//跳过整个工序
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnExtConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
reqBean.setForceJumpProcess(true);
shippingDispatchService.doSendScanQueueNextExec(reqBean);
foundExThrowNoShowMsg();
}
return StepResult.getSuccessComplete();
}
}

@ -0,0 +1,112 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.LocaleUtil;
import cn.estsh.i3plus.mes.pcn.websocket.StationWebSocket;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.ButtonBean;
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.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.util.ImppRedis;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @Description : -
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("sxNoumenonSnLineOffQCheckStepService")
public class SxNoumenonSnLineOffQCheckStepService extends BaseStepService {
@Resource(name = MesPcnExtConstWords.REDIS_RES_PCN)
private ImppRedis redisMesPcn;
// 返回前端按钮 确认按钮弹框
private static final String PASS_BUTTON_CODE = "PASS";
private static final String PASS_BUTTON_NAME = "通过";
private static final String NOT_PASS_BUTTON_CODE = "NON_PASS";
private static final String NOT_PASS_BUTTON_NAME = "不通过";
@Override
public StepResult init(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue());
this.sendMessage(reqBean, resultBean);
return super.init(reqBean);
}
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("SxNoumenonSnLineOffQCheckStepService[execute] 参数:{}", reqBean);
StepResult stepResult = StepResult.getNonComplete();
if (!StringUtils.isEmpty(reqBean.getButtonCode())) {
if (reqBean.getButtonCode().equals(PASS_BUTTON_CODE)) {
// 将model中的buttonCode password移除
removeStepContent(reqBean);
stepResult = StepResult.getSuccessComplete();
return stepResult;
} else {
// 点击不通过,结束工步。直接进入放行信号
removeStepContent(reqBean);
stepResult = StepResult.getSuccessComplete();
stepResult.setNextTriggerEvent("NON_PASS");
return stepResult;
}
}
sendButton(reqBean);
// 发送按钮组件,工步未完成
return stepResult;
}
private void sendButton(StationRequestBean reqBean) {
List<ButtonBean> buttonBeanList = new ArrayList<>();
buttonBeanList.add(ButtonBean.builder().buttonCode(PASS_BUTTON_CODE).buttonName(PASS_BUTTON_NAME).buttonDesc("通过按钮事件").build());
buttonBeanList.add(ButtonBean.builder().buttonCode(NOT_PASS_BUTTON_CODE).buttonName(NOT_PASS_BUTTON_NAME).buttonDesc("不通过按钮事件").build());
StationResultBean resultBean = new StationResultBean();
resultBean.setResultList(buttonBeanList);
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.BUTTON.getValue());
resultBean.setMessage(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "请进行外观检查,并录入外观检结果"));
this.sendMessage(reqBean, resultBean);
}
private void removeStepContent(StationRequestBean reqBean) {
reqBean.setButtonCode(null);
StationResultBean resultBean = new StationResultBean();
resultBean.setResultList(null);
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.BUTTON.getValue());
this.sendMessage(reqBean, resultBean);
}
}

@ -0,0 +1,173 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.jx.IMesManageCodeService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnRepairService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnTravelExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.SxNoumenonSnPopUpOnlineModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.LocaleUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @Description : -
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("sxNoumenonSnOnlineCheckSnStepService")
public class SxNoumenonSnOnlineCheckSnStepService extends BaseStepService {
@Autowired
private IProduceSnExtService produceSnExtService;
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Autowired
private IProduceSnRepairService produceSnRepairService;
@Autowired
private IMesManageCodeService manageCodeService;
@Autowired
private IProduceSnTravelExtService produceSnTravelExtService;
@Autowired
private SxNoumenonSnPopUpOnlineModuleService popUpOnlineModuleService;
@Override
public StepResult guide(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
String guide = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "请扫描管理码/产品条码");
this.sendMessage(reqBean, resultBean, guide, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
return super.guide(reqBean);
}
@Override
public StepResult init(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue());
this.sendMessage(reqBean, resultBean);
return super.init(reqBean);
}
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("SxNoumenonSnOnlineCheckSnStepService[execute] 参数:{}", reqBean);
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
String err;
if (StringUtils.isEmpty(reqBean.getOrganizeCode())) {
err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "入参缺少工厂代码");
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return StepResult.getNonComplete(err);
}
if (StringUtils.isEmpty(reqBean.getWorkOrderNo())) {
err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "入参缺少工单号");
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return StepResult.getNonComplete(err);
}
if (StringUtils.isEmpty(reqBean.getScanInfo())) {
err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "入参缺少管理码/产品条码");
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return StepResult.getNonComplete(err);
}
MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), reqBean.getWorkOrderNo());
if (null == workOrderExt) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("工单[%s]无效,不能操作", reqBean.getWorkOrderNo()));
if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() != workOrderExt.getWorkOrderStatus()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult,
String.format("工单[%s]状态为[%s],不能操作", reqBean.getWorkOrderNo(), MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus())));
// 扫描内容 为 管理码
String scanInfo = reqBean.getScanInfo();
boolean isNeedCreateSn = false;
//MesProduceSnExt produceSnExtDb = produceSnExtService.getProduceSnExtBySn(reqBean.getOrganizeCode(), scanInfo);
//if (produceSnExtDb != null) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult,
// String.format("管理码已被工单[%s]占用,操作失败", produceSnExtDb.getWorkOrderNo()));
if (workOrderExt.getWorkOrderType() == MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue()) {
MesProduceSnRepair produceSnRepairBySn = produceSnRepairService.getProduceSnRepairBySn(reqBean.getOrganizeCode(), scanInfo);
if (null == produceSnRepairBySn) {
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult,
String.format("返工条码[%s]不存在,操作失败", reqBean.getScanInfo(), produceSnRepairBySn.getWorkOrderNo(), reqBean.getWorkOrderNo()));
} else if(produceSnRepairBySn.getWorkOrderNo().equals(reqBean.getWorkOrderNo())) {
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult,
String.format("返工条码[%s]已绑定工单[%s]与当前工单[%s]不一致,操作失败", reqBean.getScanInfo(), produceSnRepairBySn.getWorkOrderNo(), reqBean.getWorkOrderNo()));
}
} else {
MesProduceSnExt produceSnExt = produceSnExtService.getProduceSnExtBySn(reqBean.getOrganizeCode(), scanInfo);
if (produceSnExt == null) {
isNeedCreateSn = true;
MesManageCode manageCode = manageCodeService.getManageCode(reqBean.getOrganizeCode(), scanInfo);
if (manageCode == null) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult,
String.format("管理码[%s]无效,操作失败", reqBean.getScanInfo()));
if (!manageCode.getWorkCenterCode().equals(reqBean.getWorkCenterCode())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult,
String.format("当前管理码[%s]所属产线[%s]与当前产线[%s]不一致,操作失败", reqBean.getScanInfo(), manageCode.getWorkCenterCode(), reqBean.getWorkCenterCode()));
} else if (!produceSnExt.getLastWorkOrderNo().equals(reqBean.getWorkOrderNo())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult,
String.format("条码[%s]已绑定工单[%s],与当前工单[%s]不一致,操作失败", reqBean.getScanInfo(), produceSnExt.getWorkOrderNo(), reqBean.getWorkOrderNo()));
}
MesProduceSnTravelExt produceSnTravelExtDb = produceSnTravelExtService.getProduceSnTravelExtByOrderNoAndWoAndSn(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getWorkOrderNo(), reqBean.getScanInfo());
if (produceSnTravelExtDb != null) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult,
String.format("管理码[%s]已经过此工位,请更改管理码再进行操作", reqBean.getScanInfo()));
reqBean.getDataMap().put(MesPcnExtConstWords.WORK_ORDER_NO, reqBean.getWorkOrderNo());
reqBean.getDataMap().put(MesPcnExtConstWords.MANAGE_CODE, reqBean.getScanInfo());
reqBean.setSerialNumber(reqBean.getScanInfo());
reqBean.setPartNo(workOrderExt.getPartNo());
reqBean.setPartName(workOrderExt.getPartNameRdd());
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() == workOrderExt.getWorkOrderType()) {
stepResult.setNextTriggerEvent(MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.name());
} else if (isNeedCreateSn){
stepResult.setNextTriggerEvent("CREATE_SN");
} else {
stepResult.setNextTriggerEvent(MesPcnExtEnumUtil.WORK_ORDER_TYPE.STANDARD_ORDER.name());
}
popUpOnlineModuleService.doHandleManageCode(reqBean, 2, reqBean.getScanInfo());
return stepResult;
}
}

@ -0,0 +1,72 @@
//package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
//
//import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesWorkOrderExtRepository;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.util.ConvertBeanExt;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
//import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
//import cn.estsh.i3plus.mes.pcn.util.LocaleUtil;
//import cn.estsh.i3plus.platform.common.convert.ConvertBean;
//import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
//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 lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.util.StringUtils;
//
///**
// * @Description : 工步业务-累加条码绑定数量工步
// * @Reference :
// * @Author : xinwang.yi
// * @CreateDate : 2023-10-16
// * @Modify:
// **/
//@Slf4j
//@Service("sxNoumenonSnOnlineCompleteStepService")
//public class SxNoumenonSnOnlineCompleteStepService extends BaseStepService {
//
// @Autowired
// private ISxWorkOrderExtService workOrderExtService;
//
// @Autowired
// private MesWorkOrderExtRepository workOrderExtRepository;
//
// @Override
// public StepResult execute(StationRequestBean reqBean) {
// log.info("sxNoumenonSnOnlineCompleteStepService[execute] 参数:{}", reqBean);
//
// StationResultBean resultBean = new StationResultBean();
// String err;
//
// if (StringUtils.isEmpty(reqBean.getOrganizeCode())) {
// err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "入参缺少工厂代码");
// this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// foundExThrowNoShowMsg();
// }
//
// if (StringUtils.isEmpty(reqBean.getWorkOrderNo())) {
// err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "入参缺少生产工单号");
// this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// foundExThrowNoShowMsg();
// }
//
// MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), reqBean.getWorkOrderNo());
// if (null == workOrderExt) {
// err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "生产工单号[%s]无效"), reqBean.getWorkOrderNo());
// this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// foundExThrowNoShowMsg();
// }
//
//
// ConvertBean.serviceModelUpdate(workOrderExt, reqBean.getUserInfo());
// workOrderExt.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
// new ConvertBeanExt(workOrderExt).convertBean(workOrderExt);
// workOrderExtRepository.save(workOrderExt);
//
// return StepResult.getSuccessComplete();
// }
//
//}

@ -0,0 +1,145 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IProdPackExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnTravelExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesPartExtRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnExtRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.ConvertBeanExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.LocaleUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @Description : -
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("sxNoumenonSnOnlineCreateSnStepService")
public class SxNoumenonSnOnlineCreateSnStepService extends BaseStepService {
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Autowired
private MesPartExtRepository partExtRepository;
@Autowired
private IProdPackExtService prodPackExtService;
@Autowired
private IProduceSnExtService produceSnExtService;
@Autowired
private IProduceSnTravelExtService produceSnTravelExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("SxNoumenonSnOnlineCreateSnStepService[execute] 参数:{}", reqBean);
StationResultBean resultBean = new StationResultBean();
String err;
if (StringUtils.isEmpty(reqBean.getOrganizeCode())) {
err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "入参缺少工厂代码");
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return StepResult.getNonComplete(err);
}
if (StringUtils.isEmpty(reqBean.getWorkOrderNo())) {
err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "入参缺少工单号");
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return StepResult.getNonComplete(err);
}
if (StringUtils.isEmpty(reqBean.getScanInfo())) {
err = LocaleUtil.transferLanguage(reqBean.getUserInfo(), "入参缺少管理码");
this.sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return StepResult.getNonComplete(err);
}
// 扫描内容 为 管理码
//String scanInfo = reqBean.getScanInfo();
MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), reqBean.getWorkOrderNo());
if (null == workOrderExt) {
err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "工单[%s]无效,不能操作"), reqBean.getWorkOrderNo());
sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return StepResult.getNonComplete(err);
}
//if (MathOperation.compareTo(workOrderExt.getBoundQty(), workOrderExt.getQty()) >= 0) {
// err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "工单[%s]已达到绑定数量,不能操作"), reqBean.getWorkOrderNo());
// sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return StepResult.getNonComplete(err);
//}
if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() != workOrderExt.getWorkOrderStatus()) {
err = String.format(LocaleUtil.transferLanguage(reqBean.getUserInfo(), "工单[%s]状态为[%s],不能操作"),
reqBean.getWorkOrderNo(), MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus()));
sendMessage(reqBean, resultBean, err, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return StepResult.getNonComplete(err);
}
//MesPartExt partExt = partExtRepository.getByProperty(
// new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PART_NO},
// new Object[]{reqBean.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), reqBean.getPartNo()});
//MesProdPackExt prodPackDb = prodPackExtService.getProdPackExt(reqBean.getOrganizeCode(), partExt.getPartNo(), partExt.getPptCode());
MesProduceSnExt produceSnExt = new MesProduceSnExt();
produceSnExt.setSerialNumber(reqBean.getSerialNumber());
produceSnExt.setWorkOrderNo(reqBean.getWorkOrderNo());
produceSnExt.setLastWorkOrderNo(reqBean.getWorkOrderNo());
produceSnExt.setPartNo(reqBean.getPartNo());
produceSnExt.setPartNameRdd(reqBean.getPartName());
//produceSnExt.setProcessLabelTemplate(partExt.getProcessLabelTemplate());
//produceSnExt.setQualityAssureTemplate(partExt.getQualityAssureTemplate());
//produceSnExt.setBigProcessLabelTemplate(partExt.getBigProcessLabelTemplate());
//produceSnExt.setProcessLabelTemplate(prodPackDb == null ? "" : prodPackDb.getProcessLabelTemplate());
//produceSnExt.setQualityAssureTemplate(prodPackDb == null ? "" : prodPackDb.getQualityAssureTemplate());
//produceSnExt.setBigProcessLabelTemplate(prodPackDb == null ? "" : prodPackDb.getBigProcessLabelTemplate());
produceSnExt.setCustCode(workOrderExt.getCustCode());
produceSnExt.setPrintStatus(MesPcnExtEnumUtil.PRODUCE_SN_PRINT_STATUS.UNPRINT.getValue());
produceSnExt.setPrintCount(0);
produceSnExt.setSnStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue());
produceSnExt.setQcStatus(MesPcnExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue());
produceSnExt.setSnType(MesPcnExtEnumUtil.ENCODE_CODE_TYPE.STANDARD_SERIAL_SN.getValue());
produceSnExt.setQty(1d);
produceSnExt.setWorkCenterCode(workOrderExt.getWorkCenterCode());
produceSnExt.setOrganizeCode(workOrderExt.getOrganizeCode());
ConvertBean.serviceModelInitialize(produceSnExt, reqBean.getUserInfo());
produceSnExt.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(produceSnExt).convertBean(produceSnExt);
//produceSnExtRepository.insert(produceSnExt);
produceSnExtService.insertProduceSnExt(produceSnExt);
// 当前执行管理码
//String curManageCode = getCacheKey(reqBean, MesPcnExtConstWords.CUR_MANAGE_CODE);
return StepResult.getSuccessComplete();
}
}

@ -0,0 +1,85 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.SxPutPalletModuleService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.SxNoumenonSnPopUpOnlineModuleService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.SxPutPalletInitProdTypeStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.SxPutPalletModuleModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.SxPutPalletPlcDataModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.IStepCommonMethodService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.LocaleUtil;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPlc;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
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 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.List;
import java.util.Map;
/**
* @Description : -线PLC
* @Reference :
* @Author : xinwang.yi
* @CreateDate : 2023-10-16
* @Modify:
**/
@Slf4j
@Service("sxPlcOutStepService")
public class SxPlcOutStepService extends BaseStepService {
@Autowired
private IStepCommonMethodService stepCommonMethodService;
@Autowired
private IFsmCommonService fsmCommonService;
@Autowired
private SxNoumenonSnPopUpOnlineModuleService snPopUpOnlineModuleService;
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("SxPlcOutStepService[execute] 参数:{}", reqBean);
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
Map<String, MesProdRouteOptParam> codeValueMap = stepCommonMethodService.getStepCfgInfo(reqBean);
log.info("SxPlcOutStepService --- 产线[{}]工位[{}]:工步参数 [{}]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), codeValueMap);
String plcCode = (!CollectionUtils.isEmpty(codeValueMap) && codeValueMap.containsKey(MesPcnExtConstWords.DATA_COLLECT_PLC_SN)) ?
codeValueMap.get("PCN_OUT_CODE").getParamValue() : null;
String plcOutData = (!CollectionUtils.isEmpty(codeValueMap) && codeValueMap.containsKey(MesPcnExtConstWords.DATA_COLLECT_PLC_SN)) ?
codeValueMap.get("PLC_OUT_DATA").getParamValue() : null;
//Map<String, String> wcpcMap = fsmCommonService.getCachedWorkCellParam(reqBean);
if (StringUtils.isEmpty(plcCode)) {
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "当前工位未维护PLC代码");
}
MesPlc plc = snPopUpOnlineModuleService.getPlc(reqBean.getOrganizeCode(), plcCode);
if (plc == null) {
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("PLC代码[%s]不存在", plcCode));
}
Boolean writeResult = snPopUpOnlineModuleService.doWriteOpcParamValue(plc, plcOutData);
log.info("SxPlcOutStepService --- 放行结果:{} ", writeResult);
return stepResult;
}
}

@ -118,6 +118,10 @@ public class MesFirstOrderDetail extends BaseBean implements Serializable {
@ApiParam("结果值")
private String resultValue;
@Column(name="PART_NO")
@ApiParam("零件编号")
private String partNo;
@Column(name = "MANAGE_TYPE")
@ApiParam("管理类型10-比值类型20-结果类型")
@AnnoOutputColumn(refClass = MesPcnExtEnumUtil.Q_MANAGE_MANAGE_TYPE.class, refForeignKey = "value", value = "description")

@ -0,0 +1,56 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.bean;
import cn.estsh.i3plus.pojo.base.bean.BaseBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.Table;
import java.io.Serializable;
/**
* @Description:
* @Author: xiangming.liao
* @Date: 2021/01/14 20:03
* @Modify:
*/
@Data
@Entity
@DynamicInsert
@DynamicUpdate
@EqualsAndHashCode(callSuper = true)
@Table(name = "MES_MANAGE_CODE", indexes = {
@Index(columnList = "MANAGE_CODE"),
@Index(columnList = "WORK_CENTER_CODE"),
@Index(columnList = "MANAGE_CODE,WORK_CENTER_CODE"),
})
@Api("MES_管理码主表")
public class MesManageCode extends BaseBean implements Serializable {
private static final long serialVersionUID = 7851017539760486447L;
@Column(name = "MANAGE_CODE")
@ApiParam(value = "管理编码")
private String manageCode;
@Column(name = "WORK_CENTER_CODE")
@ApiParam("产线代码")
private String workCenterCode;
@Column(name = "WORK_CENTER_NAME")
@ApiParam("产线名称")
private String workCenterName;
//@Column(name = "USE_STATUS")
//@ApiParam("使用状态")
//@ColumnDefault("10")
//@AnnoOutputColumn(refClass = MesPcnExtEnumUtil.MANAGE_USE_STATUS.class, refForeignKey = "value", value = "description")
//private Integer useStatus;
}

@ -0,0 +1,76 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.bean;
import cn.estsh.i3plus.pojo.base.bean.BaseBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.Table;
import java.io.Serializable;
/**
* @Description:
* @Author: xinwang.yi
* @Date: 2023/10/19 11:56
* @Modify:
*/
@Data
@Entity
@DynamicInsert
@DynamicUpdate
@EqualsAndHashCode(callSuper = true)
@Table(name = "MES_MANUL_EXECUTE_OUT_TRAVEL", indexes = {
@Index(columnList = "WORK_ORDER_NO,WORK_CELL_CODE"),
@Index(columnList = "SERIAL_NUMBER")
})
@Api("MES_手动强制放行履历表")
public class MesManulExecuteOutTravel extends BaseBean implements Serializable {
private static final long serialVersionUID = -2989268758068809547L;
@Column(name = "WORK_CENTER_CODE")
@ApiParam(value = "产线代码")
private String workCenterCode;
//@Column(name = "SHIFT_CODE")
//@ApiParam("班次代码")
//private String shiftCode;
//
//@Column(name = "WORK_TIME")
//@ApiParam("作业时间")
//private String workTime;
@Column(name = "WORK_ORDER_NO")
@ApiParam(value = "生产工单号")
public String workOrderNo;
@Column(name = "PART_NO")
@ApiParam("物料号")
private String partNo;
@Column(name = "PART_NAME_RDD")
@ApiParam("物料名称")
private String partNameRdd;
@Column(name = "WORK_CELL_CODE")
@ApiParam(value = "工位代码")
public String workCellCode;
@Column(name = "PROCESS_CODE")
@ApiParam("工序代码")
private String processCode;
//@Column(name = "PROCESS_NAME_RDD")
//@ApiParam("工序名称")
//private String processNameRdd;
@Column(name = "SERIAL_NUMBER")
@ApiParam("过程条码")
private String serialNumber;
}

@ -124,7 +124,6 @@ public class MesQManageTaskDetail extends BaseBean implements Serializable {
@Column(name = "CHECK_TYPE")
@AnnoOutputColumn(refClass = MesPcnExtEnumUtil.MES_Q_MANAGER_CHECK_TYPE.class, refForeignKey = "value", value = "description")
@ColumnDefault("order_check")
@ApiParam("点检类型")
private String checkType;

@ -0,0 +1,15 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.repository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode;
import cn.estsh.i3plus.pojo.base.jpa.dao.BaseRepository;
import org.springframework.stereotype.Repository;
/**
* @author xinwang.yi
* @version 1.0
* @date 2023/10/12 9:17
**/
@Repository
public interface MesManageCodeRepository extends BaseRepository<MesManageCode, Long> {
}

@ -0,0 +1,15 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.repository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManulExecuteOutTravel;
import cn.estsh.i3plus.pojo.base.jpa.dao.BaseRepository;
import org.springframework.stereotype.Repository;
/**
* @author xinwang.yi
* @version 1.0
* @date 2023/10/19 9:17
**/
@Repository
public interface MesManulExecuteOutTravelRepository extends BaseRepository<MesManulExecuteOutTravel, Long> {
}

@ -666,6 +666,7 @@ public class MesPcnExtConstWords {
public static final String BIND_QTY = "bindQty";
public static final String CUR_WORK_ORDER = "CUR_WORK_ORDER";
public static final String CMD_WORK_ORDER = "CMD_WORK_ORDER";
public static final String CMD_WORK_ORDER_TYPE = "CMD_WORK_ORDER_TYPE";
public static final String CUR_PROD_TYPE = "CUR_PROD_TYPE";
public static final String CMD_PROD_TYPE = "CMD_PROD_TYPE";
public static final String SN_MODEL_LIST = "SN_MODEL_LIST";
@ -854,4 +855,21 @@ public class MesPcnExtConstWords {
//本体条码上线
public static final String NOUMENON_SN_POP_UP_ONLINE = "NOUMENON_SN_POP_UP_ONLINE";
//本体条码下线
public static final String NOUMENON_SN_LINE_OFF = "NOUMENON_SN_LINE_OFF";
//当前管理码
public static final String CUR_MANAGE_CODE = "CUR_MANAGE_CODE";
//管理码
public static final String MANAGE_CODE = "manageCode";
public static final String PLC_SN_ONLINE_OUT_HAND_SHAKE_SIGNAL = "PLC_SN_ONLINE_OUT_HAND_SHAKE_SIGNAL";
public static final String PCN_SN_ONLINE_OUT_HAND_SHAKE_SIGNAL = "PCN_SN_ONLINE_OUT_HAND_SHAKE_SIGNAL";
public static final String PCN_SN_ONLINE_OUT_DATA = "PCN_SN_ONLINE_OUT_DATA";
public static final String CUR_EXEC_WORK_ORDER = "CUR_EXEC_WORK_ORDER";
//强制放行
public static final String EXECUTE_OUT = "EXECUTE_OUT";
}

@ -2252,13 +2252,15 @@ public class MesPcnExtEnumUtil {
}
/**
* mes
* 线
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum LINE_TYPE {
ONTOLOGY_LINE(10, "本体线"),
COMPONENT_LINE(20, "组件线");
COMPONENT_LINE(20, "组件线"),
FOUNTAIN(30, "源泉"),
PARTS(40, "零部件");
private int value;
private String description;
@ -3336,6 +3338,16 @@ public class MesPcnExtEnumUtil {
}
return tmp;
}
public static Integer descriptionOfValue(String description) {
Integer tmp = null;
for (int i = 0; i < values().length; i++) {
if (values()[i].description.equals(description)) {
tmp = values()[i].value;
}
}
return tmp;
}
}
/**
@ -3344,18 +3356,18 @@ public class MesPcnExtEnumUtil {
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MANAGE_USE_STATUS {
LEISURE("10", "空闲"),
OCCUPY("20", "占用");
LEISURE(10, "空闲"),
OCCUPY(20, "占用");
private String value;
private int value;
private String description;
MANAGE_USE_STATUS(String value, String description) {
MANAGE_USE_STATUS(int value, String description) {
this.value = value;
this.description = description;
}
public String getValue() {
public int getValue() {
return value;
}
@ -3363,18 +3375,18 @@ public class MesPcnExtEnumUtil {
return description;
}
public static String valueOfDescription(String val) {
public static String valueOfDescription(int val) {
String tmp = null;
for (int i = 0; i < values().length; i++) {
if (values()[i].value.equals(val)) {
if (values()[i].value == val) {
tmp = values()[i].description;
}
}
return tmp;
}
public static String descriptionOfValue(String description) {
String tmp = null;
public static Integer descriptionOfValue(String description) {
Integer tmp = null;
for (int i = 0; i < values().length; i++) {
if (values()[i].description.equals(description)) {
tmp = values()[i].value;

Loading…
Cancel
Save