JX pcn 条码上线

dev
王杰 2 years ago
parent 896eaa63b6
commit 91a5461523

@ -0,0 +1,49 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProdBindRecordExt;
import cn.estsh.i3plus.pojo.mes.bean.MesProdBindRecord;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import io.swagger.annotations.ApiOperation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:22
* @Description:
**/
public interface IJxProdBindRecordExtService {
/**
* ()
*
* @param prodBindRecordExt
*/
@ApiOperation(value = "插入产品绑定记录拓展表(新事务,不回滚)", notes = "插入产品绑定记录拓展表(新事务,不回滚)")
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {ImppBusiException.class, Exception.class})
void insertProdBindRecordExtNoRollback(MesProdBindRecordExt prodBindRecordExt);
/**
* ,
* @param organizeCode
* @param workOrderNo
* @param workCellCode
* @param productSn
* @param thirdPartyPid ID
* @return
*/
@ApiOperation(value = "根据生产工单号,工位代码查询产品绑定记录信息", notes = "根据生产工单号,工位代码查询产品绑定记录信息")
List<MesProdBindRecordExt> getProdBindRecordExtListByPsOrMc(String organizeCode, String workOrderNo, String workCellCode, String productSn, String thirdPartyPid);
/**
*
* @param organizeCode
* @param kpSn
* @return
*/
@ApiOperation(value = "根据部品条码查询产品绑定记录信息", notes = "根据部品条码查询产品绑定记录信息")
List<MesProdBindRecord> getProdBindRecordListByKpSn(String organizeCode, String kpSn);
}

@ -0,0 +1,58 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import io.swagger.annotations.ApiOperation;
public interface IJxProdBusiStrategyService {
/**
* 线
* @param params
* @return
*/
@ApiOperation(value = "上线验证", notes = "上线验证")
StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params);
/**
*
* @param params
* @return
*/
@ApiOperation(value = "从管理码开始查询业务数据", notes = "从管理码开始查询业务数据")
default JxProdBusiStrategyParamsBuilder queryBusiData4Mc(JxProdBusiStrategyParamsBuilder params) { return params; }
/**
*
* @param params
* @return
*/
@ApiOperation(value = "从产品条码开始查询业务数据", notes = "从产品条码开始查询业务数据")
default JxProdBusiStrategyParamsBuilder queryBusiData4Ps(JxProdBusiStrategyParamsBuilder params) { return params; }
/**
*
* @param params
* @return
*/
@ApiOperation(value = "查询产品条码业务数据", notes = "查询产品条码业务数据")
default JxProdBusiStrategyParamsBuilder queryProduceSnInfo(JxProdBusiStrategyParamsBuilder params) { return params; }
/**
*
* @param params
* @return
*/
@ApiOperation(value = "查询管理码业务数据", notes = "查询管理码业务数据")
default JxProdBusiStrategyParamsBuilder queryManageCodeInfo(JxProdBusiStrategyParamsBuilder params) { return params; }
/**
*
* @param params
* @return
*/
@ApiOperation(value = "获取生产工单已绑数据", notes = "获取生产工单已绑数据")
default Integer queryOrderBindedQty(JxProdBusiStrategyParamsBuilder params) { return MesPcnExtConstWords.ZERO; }
}

@ -0,0 +1,32 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import io.swagger.annotations.ApiOperation;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:22
* @Description:
**/
public interface IJxProduceSnExtService {
/**
*
* @param organizeCode
* @param serialNumber
* @param productSn
* @return
*/
@ApiOperation(value = "根据过程条码或者产品条码查询产品条码信息", notes = "根据过程条码或者产品条码查询产品条码信息")
MesProduceSnExt getProduceSnExtDb(String organizeCode, String serialNumber, String productSn);
/**
* 线
* @param reqBean
* @param produceSnExt
*/
@ApiOperation(value = "设置条码产线 工位 工序 下一道工序", notes = "设置条码产线 工位 工序 下一道工序")
void doPackSnExtProcess(StationRequestBean reqBean, MesProduceSnExt produceSnExt);
}

@ -0,0 +1,43 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:22
* @Description:
**/
public interface IJxProduceSnMcRecordService {
/**
*
* @param organizeCode
* @param manageCode
* @return
*/
@ApiOperation(value = "根据管理码查询管理码信息", notes = "根据管理码查询管理码信息")
MesManageCode getManageCodeDb(String organizeCode, String manageCode);
/**
*
* @param organizeCode
* @param workOrderNo
* @return
*/
@ApiOperation(value = "根据生产工单查询产品管理码与工单条码关系信息", notes = "根据生产工单查询产品管理码与工单条码关系信息")
List<MesProduceSnMcRecord> getProduceSnMcRecordDbList(String organizeCode, String workOrderNo);
/**
*
* @param organizeCode
* @param manageCode
* @return
*/
@ApiOperation(value = "根据管理码查询管理码与工单条码关系信息", notes = "根据管理码查询管理码与工单条码关系信息")
MesProduceSnMcRecord getProduceSnMcRecordDb(String organizeCode, String manageCode);
}

@ -104,10 +104,9 @@ public class QualityDecisionService implements IQualityDecisionService {
MesProduceSnMcRecord produceSnMcRecordDb = produceSnMcRecordRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.MANAGE_CODE, MesPcnExtConstWords.SN_STATUS},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), serialNumber, MesPcnExtEnumUtil.MC_RECORD_SN_STATUS.CREATE.getValue()});
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), serialNumber, MesPcnExtEnumUtil.MC_RECORD_SN_STATUS.LINE_ON.getValue()});
MesProduceSnExt produceSnExt = null;
if(produceSnMcRecordDb != null){
produceSnExt = produceSnExtService.getProduceSnExtBySn(organizeCode, produceSnMcRecordDb.getSerialNumber());

@ -35,6 +35,7 @@ public class ProductEncodeCfgExtService implements IProductEncodeCfgExtService {
model.setOrganizeCode(organizeCode);
model.setCodeType(codeType);
switch (MesPcnExtEnumUtil.ENCODE_CODE_TYPE.getByValue(codeType)) {
case SERIAL_SN :
case STANDARD_SERIAL_SN :
case REWORK_SERIAL_SN :
case ATTEMPT_SERIAL_SN :

@ -238,4 +238,25 @@ public class SxNumberRulePackAttributeService implements ISxNumberRulePackAttrib
return serialNoModel;
}
/**
* 线
*
*/
private GenSerialNoModel jxMethodDynamicCenterAndOrder(Map<String, Object> map, GenSerialNoModel serialNoModel){
String workOrderNo = (String) map.get(MesPcnExtConstWords.WORK_ORDER_NO);
String workCenterCode = (String) map.get(MesPcnExtConstWords.WORK_CENTER_CODE);
serialNoModel.setDynamicRule(new StringJoiner(MesPcnExtConstWords.COMMA).add(workCenterCode).add(workOrderNo).toString());
return serialNoModel;
}
/**
*
*
*/
private GenSerialNoModel jxMethodDynamicOrder(Map<String, Object> map, GenSerialNoModel serialNoModel){
String workOrderNo = (String) map.get(MesPcnExtConstWords.WORK_ORDER_NO);
serialNoModel.setDynamicRule(workOrderNo);
return serialNoModel;
}
}

@ -0,0 +1,64 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBindRecordExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProdBindRecordExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProdBindRecordExtRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
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 cn.estsh.i3plus.pojo.mes.bean.MesProdBindRecord;
import cn.estsh.i3plus.pojo.mes.repository.MesProdBindRecordRepository;
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.stream.Collectors;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:41
* @Description:
**/
@Slf4j
@Service
public class JxProdBindRecordExtService implements IJxProdBindRecordExtService {
@Autowired
private MesProdBindRecordExtRepository prodBindRecordExtRepository;
@Autowired
private MesProdBindRecordRepository prodBindRecordRepository;
@Override
public void insertProdBindRecordExtNoRollback(MesProdBindRecordExt prodBindRecordExt) {
prodBindRecordExtRepository.insert(prodBindRecordExt);
}
@Override
public List<MesProdBindRecordExt> getProdBindRecordExtListByPsOrMc(String organizeCode, String workOrderNo, String workCellCode, String productSn, String thirdPartyPid) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workOrderNo) || StringUtils.isEmpty(workCellCode)) return null;
if (StringUtils.isEmpty(productSn) && StringUtils.isEmpty(thirdPartyPid)) return null;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workOrderNo, MesPcnExtConstWords.WORK_ORDER_NO, packBean);
DdlPreparedPack.getStringEqualPack(workCellCode, MesPcnExtConstWords.WORK_CELL_CODE, packBean);
DdlPreparedPack.getStringEqualPack(productSn, MesPcnExtConstWords.PRODUCT_SN, packBean);
DdlPreparedPack.getStringEqualPack(thirdPartyPid, MesPcnExtConstWords.THIRD_PARTY_PID, packBean);
List<MesProdBindRecordExt> prodBindRecordExtList = prodBindRecordExtRepository.findByHqlWhere(packBean);
prodBindRecordExtList = CollectionUtils.isEmpty(prodBindRecordExtList) ? null :
prodBindRecordExtList.stream().filter(o -> (null != o && MesPcnExtEnumUtil.MES_ACTION_TYPE.BIND.getValue() == o.getActionType())).collect(Collectors.toList());
return prodBindRecordExtList;
}
@Override
public List<MesProdBindRecord> getProdBindRecordListByKpSn(String organizeCode, String kpSn) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(kpSn)) return null;
return prodBindRecordRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.KP_SN},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), kpSn});
}
}

@ -0,0 +1,70 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:41
* @Description:
**/
@Slf4j
@Service
public class JxProdBusiStrategyAttemptService implements IJxProdBusiStrategyService {
@Override
public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) {
((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params);
StepResult stepResult = StepResult.getNonComplete();
if (null == params.getManageCodeDb() && null == params.getProduceSnExtDb()) return stepResult.msg(String.format("%s[%s]未匹配到有效的管理编码或产品条码信息,验证失败!", params.getScanName(), params.getScanInfo()));
if (null != params.getProduceSnExtDb()) return checkLineOn4Ps(params, stepResult);
return checkLineOn4Mc(params, stepResult);
}
private StepResult checkLineOn4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= params.getProduceSnExtDb().getSnStatus())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus())));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
return stepResult.isCompleted(true).msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo()));
}
private StepResult checkLineOn4Mc(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
if (null != params.getProduceSnMcRecordDb()) {
if (!params.getProduceSnMcRecordDb().getWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]已绑定其他生产工单[%s],验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnMcRecordDb().getWorkOrderNo()));
if (MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() == params.getProduceSnMcRecordDb().getLineOnStatus())
return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息当前状态[已上线],验证失败!", params.getScanName(), params.getScanInfo()));
else
return stepResult.isCompleted(true).msg(String.format("%s[%s]此前上线未完成,验证成功!", params.getScanName(), params.getScanInfo()));
} else {
Integer count = ((IJxProdBusiStrategyService) params.getStrategyService()).queryOrderBindedQty(params);
if (count >= params.getOrderModel().getQty())
return stepResult.msg(String.format("生产工单[%s]计划数量[%s]上线数量已达标,请切换生产工单!", params.getOrderModel().getOrderNo(), params.getOrderModel().getQty()));
return stepResult.isCompleted(true).msg(String.format("%s[%s]验证成功!", params.getScanName(), params.getScanInfo()));
}
}
}

@ -0,0 +1,104 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnMcRecordService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
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;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:41
* @Description:
**/
@Slf4j
@Service
public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyService {
@Autowired
private IJxProduceSnMcRecordService produceSnMcRecordService;
@Autowired
private IJxProduceSnExtService produceSnExtService;
@Override
public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) {
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() != params.getOrderModel().getWorkOrderType()) queryBusiData4Mc(params.manageCode(params.getScanInfo()));
else queryProduceSnInfo(params.productSn(params.getScanInfo())).scanName();
return StepResult.getSuccessComplete();
}
@Override
public JxProdBusiStrategyParamsBuilder queryBusiData4Mc(JxProdBusiStrategyParamsBuilder params) {
queryManageCodeInfo(params.manageCode(params.getScanInfo()));
if (null == params.getManageCodeDb()) params.productSn(params.getScanInfo());
queryProduceSnInfo(params);
return params.scanName();
}
@Override
public JxProdBusiStrategyParamsBuilder queryBusiData4Ps(JxProdBusiStrategyParamsBuilder params) {
queryProduceSnInfo(params.productSn(params.getScanInfo()));
if (null == params.getProduceSnExtDb()) params.manageCode(params.getScanInfo());
queryManageCodeInfo(params);
return params.scanName();
}
@Override
public JxProdBusiStrategyParamsBuilder queryManageCodeInfo(JxProdBusiStrategyParamsBuilder params) {
if (StringUtils.isEmpty(params.getManageCode())) return params;
MesManageCode manageCodeDb = produceSnMcRecordService.getManageCodeDb(params.getOrganizeCode(), params.getManageCode());
if (null == manageCodeDb) return params.manageCode();
MesProduceSnMcRecord produceSnMcRecordDb = produceSnMcRecordService.getProduceSnMcRecordDb(params.getOrganizeCode(), params.getManageCode());
if (null != produceSnMcRecordDb) params.produceSnMcRecordDb(produceSnMcRecordDb).sn(produceSnMcRecordDb.getSerialNumber(), produceSnMcRecordDb.getProductSn());
return params.manageCodeDb(manageCodeDb);
}
@Override
public JxProdBusiStrategyParamsBuilder queryProduceSnInfo(JxProdBusiStrategyParamsBuilder params) {
if (StringUtils.isEmpty(params.getSerialNumber()) && StringUtils.isEmpty(params.getProductSn())) return params;
MesProduceSnExt produceSnExtDb = produceSnExtService.getProduceSnExtDb(params.getOrganizeCode(), params.getSerialNumber(), params.getProductSn());
if (null == produceSnExtDb) return params.sn();
return params.produceSnExtDb(produceSnExtDb).sn(produceSnExtDb.getSerialNumber(), produceSnExtDb.getProductSn()).manageCode(produceSnExtDb.getTrayNo());
}
@Override
public Integer queryOrderBindedQty(JxProdBusiStrategyParamsBuilder params) {
List<MesProduceSnMcRecord> produceSnMcRecordList = produceSnMcRecordService.getProduceSnMcRecordDbList(params.getOrganizeCode(), params.getOrderModel().getOrderNo());
return CollectionUtils.isEmpty(produceSnMcRecordList) ? MesPcnExtConstWords.ZERO : produceSnMcRecordList.size();
}
}

@ -0,0 +1,47 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:41
* @Description:
**/
@Slf4j
@Service
public class JxProdBusiStrategyRepairService implements IJxProdBusiStrategyService {
@Override
public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) {
((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params);
StepResult stepResult = StepResult.getNonComplete();
if (null == params.getProduceSnExtDb()) return stepResult.msg(String.format("%s[%s]未匹配到有效的产品条码信息,验证失败!", params.getScanName(), params.getScanInfo()));
return checkLineOn4Ps(params, stepResult);
}
private StepResult checkLineOn4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= params.getProduceSnExtDb().getSnStatus())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus())));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
return stepResult.isCompleted(true).msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo()));
}
}

@ -0,0 +1,74 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:41
* @Description:
**/
@Slf4j
@Service
public class JxProdBusiStrategyStandardService implements IJxProdBusiStrategyService {
@Override
public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) {
((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params);
StepResult stepResult = StepResult.getNonComplete();
if (null == params.getManageCodeDb() && null == params.getProduceSnExtDb()) return stepResult.msg(String.format("%s[%s]未匹配到有效的管理编码或产品条码信息,验证失败!", params.getScanName(), params.getScanInfo()));
if (null != params.getProduceSnExtDb()) return checkLineOn4Ps(params, stepResult);
return checkLineOn4Mc(params, stepResult);
}
private StepResult checkLineOn4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= params.getProduceSnExtDb().getSnStatus())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus())));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
if (null != params.getProduceSnMcRecordDb() && MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.FALSE.getValue() == params.getProduceSnMcRecordDb().getQcStatus())
return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
if (null != params.getProduceSnMcRecordDb() && !params.getProduceSnMcRecordDb().getWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnMcRecordDb().getWorkOrderNo(), params.getOrderModel().getOrderNo()));
return stepResult.isCompleted(true).msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo()));
}
private StepResult checkLineOn4Mc(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
if (null != params.getProduceSnMcRecordDb() && !params.getProduceSnMcRecordDb().getWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]已绑定其他生产工单[%s],验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnMcRecordDb().getWorkOrderNo()));
if (null != params.getProduceSnMcRecordDb())
return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息存在,但未找到对应的产品条码信息,验证失败!", params.getScanName(), params.getScanInfo()));
Integer count = ((IJxProdBusiStrategyService) params.getStrategyService()).queryOrderBindedQty(params);
if (count >= params.getOrderModel().getQty())
return stepResult.msg(String.format("生产工单[%s]计划数量[%s]管理编码绑定数量已达标,请切换生产工单!", params.getOrderModel().getOrderNo(), params.getOrderModel().getQty()));
return stepResult.isCompleted(true).msg(String.format("%s[%s]验证成功!", params.getScanName(), params.getScanInfo()));
}
}

@ -0,0 +1,68 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnExtRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesRouteProcess;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
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.Optional;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:41
* @Description:
**/
@Slf4j
@Service
public class JxProduceSnExtService implements IJxProduceSnExtService {
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Autowired
private IFsmRouteDataService fsmRouteDataService;
@Override
public MesProduceSnExt getProduceSnExtDb(String organizeCode, String serialNumber, String productSn) {
if (StringUtils.isEmpty(organizeCode) || (StringUtils.isEmpty(serialNumber) && StringUtils.isEmpty(productSn))) return null;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(serialNumber, MesPcnExtConstWords.SERIAL_NUMBER, packBean);
DdlPreparedPack.getStringEqualPack(productSn, MesPcnExtConstWords.PRODUCT_SN, packBean);
return produceSnExtRepository.getByProperty(packBean);
}
@Override
public void doPackSnExtProcess(StationRequestBean reqBean, MesProduceSnExt produceSnExt) {
if (null == reqBean || null == produceSnExt) return;
List<MesRouteProcess> routeProcessList = fsmRouteDataService.getCachedFsmRouteProcessData(reqBean);
if (CollectionUtils.isEmpty(routeProcessList)) return;
produceSnExt.setRouteCode(reqBean.getRouteCode());
produceSnExt.setProcessCode(reqBean.getProcessCode());
produceSnExt.setNextProcessCode(getNextProcessCode(reqBean.getProcessCode(), routeProcessList));
if (produceSnExt.getWorkCenterCode().equals(reqBean.getWorkCenterCode())) produceSnExt.setWorkCellCode(reqBean.getWorkCellCode());
}
private String getNextProcessCode(String processCode, List<MesRouteProcess> routeProcessList) {
Optional<MesRouteProcess> routeProcessOp = routeProcessList.stream().filter(o -> (null != o && o.getProcessCode().equals(processCode))).findFirst();
if (null == routeProcessOp || !routeProcessOp.isPresent()) return null;
return routeProcessOp.get().getNextProcess();
}
}

@ -0,0 +1,57 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnMcRecordService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesManageCodeRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnMcRecordRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
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.List;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:41
* @Description:
**/
@Slf4j
@Service
public class JxProduceSnMcRecordService implements IJxProduceSnMcRecordService {
@Autowired
private MesManageCodeRepository manageCodeRepository;
@Autowired
private MesProduceSnMcRecordRepository produceSnMcRecordRepository;
@Override
public MesManageCode getManageCodeDb(String organizeCode, String manageCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(manageCode)) return null;
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.IS_VAILD.VAILD.getValue(), manageCode});
}
@Override
public List<MesProduceSnMcRecord> getProduceSnMcRecordDbList(String organizeCode, String workOrderNo) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workOrderNo)) return null;
return produceSnMcRecordRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_ORDER_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workOrderNo});
}
@Override
public MesProduceSnMcRecord getProduceSnMcRecordDb(String organizeCode, String manageCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(manageCode)) return null;
return produceSnMcRecordRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.MANAGE_CODE, MesPcnExtConstWords.SN_STATUS},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), manageCode, MesPcnExtEnumUtil.MC_RECORD_SN_STATUS.LINE_ON.getValue()});
}
}

@ -0,0 +1,303 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx;
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.jx.IJxProduceSnMcRecordService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxSnLineOnModel;
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.api.iservice.busi.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseModuleService;
import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
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.impp.framework.boot.util.ImppRedis;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
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.util.*;
import java.util.stream.Collectors;
/**
* @Description : 线
* @Reference :
* @Author :wangjie
* @CreateDate : 2020-06-26 11:18
* @Modify:
**/
@Slf4j
@Service("jxSnLineOnModuleService")
public class JxSnLineOnModuleService extends BaseModuleService {
@Autowired
private IJxProduceSnMcRecordService produceSnMcRecordService;
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Autowired
private IProduceSnExtService produceSnExtService;
@Autowired
private IShippingDispatchService shippingDispatchService;
@Resource(name = MesPcnExtConstWords.REDIS_RES_PCN)
private ImppRedis redisMesPcn;
@Override
public void init(StationRequestBean reqBean) {
MesWorkOrderExt workOrderExt = getCurExecWorkOrder(reqBean);
doLoadData(reqBean, workOrderExt);
}
@Override
public boolean execStateModule(StationRequestBean reqBean, List<MesStateMachineStatus> states, Map<String, String> wcpcMap) {
String curExecWorkOrder = (String) doHandleCurExecWorkOrder(reqBean, 1, null);
if (StringUtils.isEmpty(curExecWorkOrder)) return true;
MesWorkOrderExt workOrderExtDb = getCachedWorkOrder(reqBean, curExecWorkOrder);
if (null == workOrderExtDb) return true;
doLoadData(reqBean, workOrderExtDb);
return true;
}
private MesWorkOrderExt getCurExecWorkOrder(StationRequestBean reqBean) {
String curExecWorkOrder = (String) doHandleCurExecWorkOrder(reqBean, 1, null);
MesWorkOrderExt workOrderExtDb = StringUtils.isEmpty(curExecWorkOrder) ? null : getCachedWorkOrder(reqBean, curExecWorkOrder);
return workOrderExtDb;
}
private String getDataKey(StationRequestBean reqBean) {
return new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode())
.add(MesPcnExtConstWords.JX_SN_LINE_ON_DATA).add(reqBean.getWorkCenterCode()).add(reqBean.getWorkCellCode()).toString();
}
private MesWorkOrderExt getCachedWorkOrder(StationRequestBean reqBean, String curExecWorkOrder) {
return workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrder);
}
private List<AttrBean> packDataAttrList() {
List<AttrBean> attrBeanList = new ArrayList<>();
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.INDEX, "序号");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.MANAGE_CODE, "(源)管理码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.BIND_STATUS, "关键件绑定情况");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.SERIAL_NUMBER, "过程条码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PRODUCT_SN, "产品条码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.CREATE_DATE_TIME, "操作时间");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.CREATE_USER, "操作人");
return attrBeanList;
}
private void doLoadData(StationRequestBean reqBean, MesWorkOrderExt workOrderExt) {
StationResultBean resultBean = new StationResultBean();
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue());
resultBean.setCustomPageName(MesPcnExtConstWords.JX_SN_LINE_ON_MODULE);
resultBean.setDataAttrList(packDataAttrList());
resultBean.setSpecialDisplayData(getStepColIndent(reqBean));
if (null != workOrderExt) {
List<MesProduceSnExt> produceSnList = null;
List<MesProduceSnMcRecord> produceSnMcRecordList = null;
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.STANDARD_ORDER.getValue() == workOrderExt.getWorkOrderType())
produceSnList = produceSnExtService.getProduceSnExtListByOrderNo(reqBean.getOrganizeCode(), workOrderExt.getOrderNo());
else if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() == workOrderExt.getWorkOrderType())
produceSnList = produceSnExtService.getProduceSnExtListByLastOrderNo(reqBean.getOrganizeCode(), workOrderExt.getOrderNo());
else
produceSnMcRecordList = produceSnMcRecordService.getProduceSnMcRecordDbList(reqBean.getOrganizeCode(), workOrderExt.getOrderNo());
resultBean.setResultMap(packResultMap(workOrderExt, getCompleteQtyByType(workOrderExt.getWorkOrderType(), produceSnList, produceSnMcRecordList)));
resultBean.setResultList(packResultListByType(workOrderExt.getWorkOrderType(), produceSnList, produceSnMcRecordList));
}
this.sendMessage(reqBean, resultBean);
}
private Integer getCompleteQtyByType(Integer workOrderType, List<MesProduceSnExt> produceSnList, List<MesProduceSnMcRecord> produceSnMcRecordList) {
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.ATTEMPT_ORDER.getValue() != workOrderType) return CollectionUtils.isEmpty(produceSnList) ? MesPcnExtConstWords.ZERO : produceSnList.size();
else return CollectionUtils.isEmpty(produceSnMcRecordList) ? MesPcnExtConstWords.ZERO : produceSnMcRecordList.size();
}
private List<JxSnLineOnModel> packResultListByType(Integer workOrderType, List<MesProduceSnExt> produceSnList, List<MesProduceSnMcRecord> produceSnMcRecordList) {
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.ATTEMPT_ORDER.getValue() != workOrderType) return packResultListByType1(produceSnList);
else return packResultListByType2(produceSnMcRecordList);
}
private List<JxSnLineOnModel> packResultListByType1(List<MesProduceSnExt> produceSnList) {
List<JxSnLineOnModel> resultList = null;
if (CollectionUtils.isEmpty(produceSnList)) return resultList;
produceSnList = produceSnList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProduceSn::getModifyDatetime).reversed()).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(produceSnList) && produceSnList.size() > 50) produceSnList = produceSnList.subList(0, 50);
Integer index = 1;
for (MesProduceSnExt produceSnExt : produceSnList) {
if (null == produceSnExt) continue;
JxSnLineOnModel result = new JxSnLineOnModel();
BeanUtils.copyProperties(produceSnExt, result);
result.setManageCode(produceSnExt.getTrayNo());
result.setBindStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExt.getSnStatus() ? "已完成" : "未完成");
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExt.getSnStatus()) result.setColor(MesPcnExtConstWords.GREEN);
result.setIndex(index);
index ++;
if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>();
resultList.add(result);
}
return resultList;
}
private List<JxSnLineOnModel> packResultListByType2(List<MesProduceSnMcRecord> produceSnMcRecordList) {
List<JxSnLineOnModel> resultList = null;
if (CollectionUtils.isEmpty(produceSnMcRecordList)) return resultList;
produceSnMcRecordList = produceSnMcRecordList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProduceSnMcRecord::getModifyDatetime).reversed()).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(produceSnMcRecordList) && produceSnMcRecordList.size() > 50) produceSnMcRecordList = produceSnMcRecordList.subList(0, 50);
Integer index = 1;
for (MesProduceSnMcRecord produceSnMcRecord : produceSnMcRecordList) {
if (null == produceSnMcRecordList) continue;
JxSnLineOnModel result = new JxSnLineOnModel();
BeanUtils.copyProperties(produceSnMcRecord, result);
result.setBindStatus(MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() <= produceSnMcRecord.getLineOnStatus() ? "已完成" : "未完成");
if (MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() <= produceSnMcRecord.getLineOnStatus()) result.setColor(MesPcnExtConstWords.GREEN);
result.setIndex(index);
index ++;
if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>();
resultList.add(result);
}
return resultList;
}
private Map<String, Object> packResultMap(MesWorkOrderExt workOrderExt, Integer completeQty) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put(MesPcnExtConstWords.CUR_WORK_ORDER_NO, workOrderExt.getOrderNo());
resultMap.put(MesPcnExtConstWords.PART_NO, workOrderExt.getPartNo());
resultMap.put(MesPcnExtConstWords.PART_NAME_RDD, workOrderExt.getPartNameRdd());
resultMap.put(MesPcnExtConstWords.WORK_ORDER_TYPE, workOrderExt.getWorkOrderType());
resultMap.put(MesPcnExtConstWords.WORK_ORDER_TYPE_NAME, MesPcnExtEnumUtil.WORK_ORDER_TYPE.valueOfDescription(workOrderExt.getWorkOrderType()));
resultMap.put(MesPcnExtConstWords.WORK_ORDER_STATUS, workOrderExt.getWorkOrderStatus());
resultMap.put(MesPcnExtConstWords.WORK_ORDER_STATUS_NAME, MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus()));
resultMap.put(MesPcnExtConstWords.QTY, workOrderExt.getQty().intValue());
resultMap.put(MesPcnExtConstWords.COMPLETE_QTY, completeQty);
return resultMap;
}
@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.CMD_FORCE_CENTER_PASS :
if (StringUtils.isEmpty(value)) {
this.sendMessage(reqBean, null, "入参缺少产线强制放行的工步代码", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
reqBean.setForceSpecStepCode(value.toString());
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);
if (StringUtils.isEmpty(reqBean.getForceSpecStepCode())) reqBean.setForceJumpProcess(true);
shippingDispatchService.doSendScanQueueNextExec(reqBean);
}
return result;
}
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 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 Object doHandleBindKeyPartData(StationRequestBean reqBean, Integer flag, String item, String data) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getDataKey(reqBean), item);
case 2:
return redisMesPcn.putHash(getDataKey(reqBean), item, data, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
String[] itemArr = item.split(MesPcnExtConstWords.COMMA);
for (String s : itemArr) {
redisMesPcn.deleteHash(getDataKey(reqBean), s);
}
return true;
default:
return null;
}
}
}

@ -0,0 +1,510 @@
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.busi.IWorkOrderProcessBomService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBindRecordExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProcessBom;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProdBindRecordExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderProcessBom;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.ProcessBomModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProcessBomRepository;
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.actor.shipping.dispatch.IFsmCommonService;
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.mes.pcn.util.PojoAttrUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
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;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesKpsnRule;
import cn.estsh.i3plus.pojo.mes.bean.MesProdBindRecord;
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.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesKpsnRuleRepository;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-04-18
* @Modify:
**/
@Slf4j
@Service("jxBindKeyPartStepService")
public class JxBindKeyPartStepService extends BaseStepService {
@Autowired
private JxSnLineOnModuleService snLineOnModuleService;
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Autowired
private IWorkOrderProcessBomService workOrderProcessBomService;
@Autowired
private MesKpsnRuleRepository kpsnRuleRepository;
@Autowired
private IJxProdBindRecordExtService prodBindRecordExtService;
@Autowired
private MesProcessBomRepository processBomRepository;
@Autowired
private IShippingDispatchService shippingDispatchService;
@Autowired
private IFsmCommonService fsmCommonService;
private static final String METHOD = "doHandleBindKeyPartData";
private static final String VALIDATION_CODE = "VALIDATION_CODE";
private static final String SHOW_KPSN_RULE = "SHOW_KPSN_RULE";
private static final String RELOAD_KEY_PART_CODE = "RELOAD_KEY_PART_CODE";
@Override
public StepResult init(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP INIT --- JxBindKeyPartStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StationResultBean resultBean = new StationResultBean();
if (StringUtils.isEmpty(reqBean.getTray()) && StringUtils.isEmpty(reqBean.getProductSn())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, "入参缺少管理编码或产品条码!");
Object moduleService = getModuleService(reqBean);
Method method = getModuleServiceMethod(reqBean, resultBean, moduleService);
StepResult stepResult = StepResult.getSuccessComplete();
if (!StringUtils.isEmpty(doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 1, MesPcnExtConstWords.BIND_KEY_PART, null))) return stepResult;
String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean);
WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo);
List<ProcessBomModel> pbList = getProcessBomList(reqBean, orderModel);
if (CollectionUtils.isEmpty(pbList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "没有需要绑定的清单,请维护!");
if (checkIsShowKpsnRule(reqBean)) restorePbList(reqBean, pbList);
checkAndPackPbListIsExistBindedData(reqBean, orderModel, pbList);
doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 2, MesPcnExtConstWords.BIND_KEY_PART, JSONObject.toJSONString(pbList));
this.refresh(reqBean, pbList);
log.info("工厂{}生产线{}工位{}: --- STEP INIT --- JxBindKeyPartStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return StepResult.getSuccessComplete();
}
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxBindKeyPartStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StationResultBean resultBean = new StationResultBean();
if (StringUtils.isEmpty(reqBean.getTray()) && StringUtils.isEmpty(reqBean.getProductSn())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, "入参缺少管理编码或产品条码!");
Object moduleService = getModuleService(reqBean);
Method method = getModuleServiceMethod(reqBean, resultBean, moduleService);
String appendItem = new StringJoiner(MesPcnExtConstWords.COMMA).add(MesPcnExtConstWords.BIND_KEY_PART).add(MesPcnExtConstWords.EXEC_BIND_KEY).toString();
if (checkReloadKeyPartData(reqBean, resultBean, moduleService, method, appendItem)) execSendMsgAndThrowEx(reqBean, resultBean, "重载关键件成功!");
StepResult stepResult = StepResult.getSuccessComplete();
String suffix = StringUtils.isEmpty(reqBean.getProductSn()) ? String.format("管理编码[%s]", getManageCode(reqBean.getTray(), 1)) : String.format("产品条码[%s]", reqBean.getProductSn());
if (checkIsJumpState(reqBean, resultBean, moduleService, method, appendItem, false))
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("%s已跳过关键件绑定业务", suffix));
Object data = doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 1, MesPcnExtConstWords.BIND_KEY_PART, null);
if (null == data) data = execInit(reqBean, resultBean, moduleService, method);
if (null == data) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, checkIsJumpState(reqBean, resultBean, moduleService, method, appendItem, true), "没有需要绑定的清单,请维护!");
List<ProcessBomModel> pbList = this.refresh(reqBean, JSONObject.parseArray((String) data, ProcessBomModel.class));
List<MesKpsnRule> kpsnRuleList = getKpsnRuleList(reqBean, pbList);
String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean);
WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo);
checkKpsnRule4PbList(reqBean, resultBean, kpsnRuleList, pbList, orderModel);
if (checkPbListIsComplete(reqBean, resultBean, moduleService, method, appendItem, pbList, false))
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("%s:关键件已绑定完毕!", suffix));
List<MesKpsnRule> okList = matchKpsnRule4ScanInfo(reqBean, resultBean, moduleService, method, kpsnRuleList, suffix);
ProcessBomModel processBomModel = getMatchPbData(reqBean, resultBean, pbList, okList, suffix);
checkKeyPartIsRepeatBind(reqBean, resultBean, processBomModel, suffix);
insertMesProdBindRecordExt(reqBean, orderModel, processBomModel, okList);
overrideMatchPbData(processBomModel);
this.refresh(reqBean, pbList);
if (!checkPbListIsComplete(reqBean, resultBean, moduleService, method, appendItem, pbList, true))
execSendMsgAndThrowEx(reqBean, resultBean, String.format("关键件条码[%s]绑定%s成功,请继续扫描关键件!", reqBean.getScanInfo(), suffix));
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxBindKeyPartStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("关键件条码[%s]绑定%s成功,关键件绑定完毕!", reqBean.getScanInfo(), suffix));
}
private List<ProcessBomModel> getProcessBomList(StationRequestBean reqBean, WorkOrderExtModel orderModel) {
List<MesProcessBom> processBomList = getProcessBomListByProcessCodeAndPartNo(reqBean.getOrganizeCode(), reqBean.getProcessCode(), orderModel.getPartNo());
if (CollectionUtils.isEmpty(processBomList)) return null;
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() != orderModel.getWorkOrderType()) return getProcessBomList(processBomList);
return getProcessBomList(reqBean, orderModel, processBomList);
}
private List<ProcessBomModel> getProcessBomList(List<MesProcessBom> processBomList) {
List<ProcessBomModel> pbList = null;
for (MesProcessBom processBom : processBomList) {
if (null == processBom) continue;
ProcessBomModel pb = new ProcessBomModel();
BeanUtils.copyProperties(processBom, pb);
if (CollectionUtils.isEmpty(pbList)) pbList = new ArrayList<>();
pbList.add(pb);
}
return pbList;
}
private List<ProcessBomModel> getProcessBomList(StationRequestBean reqBean, WorkOrderExtModel orderModel, List<MesProcessBom> processBomList) {
List<MesWorkOrderProcessBom> workOrderProcessBomList = workOrderProcessBomService.getWorkOrderProcessBomList(reqBean.getOrganizeCode(), orderModel.getOrderNo(), reqBean.getProcessCode(), orderModel.getPartNo());
if (CollectionUtils.isEmpty(workOrderProcessBomList)) return null;
Map<String, List<MesProcessBom>> bindKeyPartNoMap = processBomList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProcessBom::getItemPartNo));
List<ProcessBomModel> pbList = null;
for (MesWorkOrderProcessBom workOrderProcessBom : workOrderProcessBomList) {
if (null == workOrderProcessBom) continue;
List<MesProcessBom> itemList = bindKeyPartNoMap.get(workOrderProcessBom.getItemPartNo());
if (CollectionUtils.isEmpty(itemList)) continue;
ProcessBomModel pb = new ProcessBomModel();
BeanUtils.copyProperties(itemList.get(0), pb);
pb.setQty(workOrderProcessBom.getQty());
if (CollectionUtils.isEmpty(pbList)) pbList = new ArrayList<>();
pbList.add(pb);
}
return pbList;
}
private List<MesProcessBom> getProcessBomListByProcessCodeAndPartNo(String organizeCode, String processCode, String partNo) {
return processBomRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID,
MesPcnExtConstWords.IS_BIND_KEY, MesPcnExtConstWords.PROCESS_CODE, MesPcnExtConstWords.PART_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(),
CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), processCode, partNo});
}
private Boolean checkIsShowKpsnRule(StationRequestBean reqBean) {
if (!CollectionUtils.isEmpty(reqBean.getWcpcMap()) && reqBean.getWcpcMap().containsKey(SHOW_KPSN_RULE)) return true;
return false;
}
private void restorePbList(StationRequestBean reqBean, List<ProcessBomModel> pbList) {
List<MesKpsnRule> kpsnRuleList = getKpsnRuleList(reqBean, pbList);
Map<String, List<MesKpsnRule>> kpsnRuleMap = getKpsnRuleMap(kpsnRuleList);
if (CollectionUtils.isEmpty(kpsnRuleMap)) return;
for (ProcessBomModel pb : pbList) {
List<MesKpsnRule> itemList = kpsnRuleMap.get(pb.getItemPartNo());
if (CollectionUtils.isEmpty(itemList)) continue;
pb.setLength(itemList.get(0).getLength());
pb.setCheckContent(StringUtils.isEmpty(itemList.get(0).getFix1()) ? itemList.get(0).getFix2() : itemList.get(0).getFix1());
}
}
private List<MesKpsnRule> getKpsnRuleList(StationRequestBean reqBean, List<ProcessBomModel> pbList) {
List<String> itemPartNoList = new ArrayList<>();
pbList.forEach(p -> itemPartNoList.add(p.getItemPartNo()));
DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getInPackList(itemPartNoList, MesPcnExtConstWords.PART_NO, packBean);
return kpsnRuleRepository.findByHqlWhere(packBean);
}
private Map<String, List<MesKpsnRule>> getKpsnRuleMap(List<MesKpsnRule> kpsnRuleList) {
return CollectionUtils.isEmpty(kpsnRuleList) ? null :
kpsnRuleList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartNo()))).collect(Collectors.groupingBy(MesKpsnRule::getPartNo));
}
private void checkAndPackPbListIsExistBindedData(StationRequestBean reqBean, WorkOrderExtModel orderModel, List<ProcessBomModel> pbList) {
List<MesProdBindRecordExt> prodBindRecordList = prodBindRecordExtService.getProdBindRecordExtListByPsOrMc(reqBean.getOrganizeCode(), orderModel.getOrderNo(), reqBean.getWorkCellCode(), reqBean.getProductSn(), getThirdPartyPid(reqBean.getTray()));
Map<String, List<MesProdBindRecord>> bindedMap = CollectionUtils.isEmpty(prodBindRecordList) ? null :
prodBindRecordList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getItemPartNo()))).collect(Collectors.groupingBy(MesProdBindRecord::getItemPartNo));
for (ProcessBomModel pb : pbList) {
if (null == pb) continue;
if (!CollectionUtils.isEmpty(bindedMap)) {
if (!bindedMap.containsKey(pb.getItemPartNo())) continue;
pb.setBoundQty(new Double(bindedMap.get(pb.getItemPartNo()).size()));
if (MathOperation.compareTo(pb.getBoundQty(), pb.getQty()) >= 0) {
pb.setIsBind(true);
pb.setIsBindName("是");
pb.setColor(MesPcnExtConstWords.GREEN);
}
}
}
}
private String getThirdPartyPid(String manageCode) {
if (StringUtils.isEmpty(manageCode) || !manageCode.contains(MesPcnExtConstWords.AND)) return null;
return getManageCode(manageCode, 2);
}
private String getManageCode(String manageCode, Integer length) {
if (StringUtils.isEmpty(manageCode)) return null;
String[] manageCodeArr = manageCode.split(MesPcnExtConstWords.AND);
if (manageCodeArr.length >= length) return manageCodeArr[length - 1];
else return null;
}
private List<ProcessBomModel> refresh(StationRequestBean reqBean, List<ProcessBomModel> pbList) {
List<AttrBean> attrBeanList = new ArrayList<>();
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ITEM_PART_NO, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "原材料物料号"));
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ITEM_PART_NAME, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "原材料物料名称"));
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.QTY, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "需求数量"));
if (checkIsShowKpsnRule(reqBean)) PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.CHECK_CONTENT, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "校验字符"));
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.BOUND_QTY, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "已绑数量"));
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.IS_BIND_NAME, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "是否绑定"));
StationResultBean resultBean = new StationResultBean();
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLE.getValue());
resultBean.setResultList(pbList);
resultBean.setDataAttrList(attrBeanList);
this.sendMessage(reqBean, resultBean);
return pbList;
}
private Boolean checkReloadKeyPartData(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method, String appendItem) {
if (!StringUtils.isEmpty(reqBean.getScanInfo()) && !CollectionUtils.isEmpty(reqBean.getWcpcMap()) && reqBean.getWcpcMap().containsKey(RELOAD_KEY_PART_CODE) &&
!StringUtils.isEmpty(reqBean.getWcpcMap().get(RELOAD_KEY_PART_CODE)) && reqBean.getWcpcMap().get(RELOAD_KEY_PART_CODE).equals(reqBean.getScanInfo())) {
doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 3, appendItem, null);
this.sendMessage(reqBean, resultBean, "关键件重载码验证成功!即将重载关键件...", MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
StationRequestBean chReq = new StationRequestBean();
chReq.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
chReq.setInterfaceType(MesPcnConstWords.SHIPPING);
chReq.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
chReq.setUserInfo(reqBean.getUserInfo());
chReq.setOrganizeCode(reqBean.getOrganizeCode());
chReq.setWorkCellCode(reqBean.getWorkCellCode());
chReq.setWorkCenterCode(reqBean.getWorkCenterCode());
chReq.setTriggerAutoFsm(true);
shippingDispatchService.doSendScanQueueNextExec(chReq);
return true;
}
return false;
}
private Boolean checkIsJumpState(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method, String appendItem, Boolean flag) {
if (flag || (!StringUtils.isEmpty(reqBean.getScanInfo()) && !CollectionUtils.isEmpty(reqBean.getWcpcMap()) && reqBean.getWcpcMap().containsKey(VALIDATION_CODE) &&
!StringUtils.isEmpty(reqBean.getWcpcMap().get(VALIDATION_CODE)) && reqBean.getWcpcMap().get(VALIDATION_CODE).equals(reqBean.getScanInfo()))) {
doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 3, appendItem, null);
return true;
}
return false;
}
private Object execInit(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method) {
this.init(reqBean);
return doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 1, MesPcnExtConstWords.BIND_KEY_PART, null);
}
private void checkKpsnRule4PbList(StationRequestBean reqBean, StationResultBean resultBean, List<MesKpsnRule> kpsnRuleList, List<ProcessBomModel> pbList, WorkOrderExtModel orderModel) {
Map<String, List<MesKpsnRule>> kpsnRuleMap = getKpsnRuleMap(kpsnRuleList);
if (CollectionUtils.isEmpty(kpsnRuleMap)) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产工单[%s]对应的物料编码[%s]所需绑定的关键件物料均未配置关键件条码校验规则", orderModel.getOrderNo(), orderModel.getPartNo()));
for (ProcessBomModel pb : pbList) {
if (CollectionUtils.isEmpty(kpsnRuleMap.get(pb.getItemPartNo())))
execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产工单[%s]对应的物料编码[%s]所需绑定的关键件物料[%s]未配置关键件条码校验规则", orderModel.getOrderNo(), orderModel.getPartNo(), pb.getItemPartNo()));
}
}
private Boolean checkPbListIsComplete(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method, String appendItem, List<ProcessBomModel> pbList, Boolean isCacheFlag) {
Optional<ProcessBomModel> unBindOpt = pbList.stream().filter(o -> (null != o && !o.getIsBindVal())).findFirst();
if (null != unBindOpt && unBindOpt.isPresent()) {
if (isCacheFlag) doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 2, MesPcnExtConstWords.BIND_KEY_PART, JSONObject.toJSONString(pbList));
return false;
} else {
doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 3, appendItem, null);
return true;
}
}
private List<MesKpsnRule> matchKpsnRule4ScanInfo(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method, List<MesKpsnRule> kpsnRuleList, String suffix) {
List<MesKpsnRule> okList = null;
if (!StringUtils.isEmpty(reqBean.getScanInfo())) {
for (MesKpsnRule item : kpsnRuleList) {
if (reqBean.getScanInfo().length() != item.getLengthVal()) continue;
if (!checkIsNotEmpty(item.getFrom1Val(), item.getTo1Val(), item.getFix1())) continue;
if (!reqBean.getScanInfo().substring(item.getFrom1Val() - 1, item.getTo1Val()).equals(item.getFix1())) continue;
if (checkIsNotEmpty(item.getFrom2Val(), item.getTo2Val(), item.getFix2()) && !reqBean.getScanInfo().substring(item.getFrom2Val() - 1, item.getTo2Val()).equals(item.getFix2())) continue;
if (CollectionUtils.isEmpty(okList)) okList = new ArrayList<>();
okList.add(item);
}
}
if (CollectionUtils.isEmpty(okList)) {
if (StringUtils.isEmpty(doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 1, MesPcnExtConstWords.EXEC_BIND_KEY, null))) {
doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 2, MesPcnExtConstWords.EXEC_BIND_KEY, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr());
execSendGuideAndThrowEx(reqBean, resultBean, String.format("请扫描关键件!当前生产对象:%s", suffix));
} else {
if (!StringUtils.isEmpty(reqBean.getScanInfo()))
this.sendMessage(reqBean, resultBean, String.format("关键件条码[%s]没有匹配到规则,请检查扫描是否正确!", reqBean.getScanInfo()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
execSendGuideAndThrowEx(reqBean, resultBean, String.format("请继续扫描关键件!当前生产对象:%s", suffix));
}
}
return okList;
}
private Boolean checkIsNotEmpty(int from, int to, String fix) {
if (StringUtils.isEmpty(from) || StringUtils.isEmpty(to) || StringUtils.isEmpty(fix)) return false;
return true;
}
private ProcessBomModel getMatchPbData(StationRequestBean reqBean, StationResultBean resultBean, List<ProcessBomModel> pbList, List<MesKpsnRule> okList, String suffix) {
List<String> okPartNoList = okList.stream().filter(o -> null != o).map(MesKpsnRule::getPartNo).collect(Collectors.toList());
Optional<ProcessBomModel> pb = pbList.stream().filter(o -> (null != o && okPartNoList.contains(o.getItemPartNo()) && (StringUtils.isEmpty(o.getIsBind()) || !o.getIsBind()))).findFirst();
if (null == pb || !pb.isPresent()) {
this.sendMessage(reqBean, resultBean, String.format("与关键件条码[%s]匹配的关键件的绑定数量已达标,操作失败!", reqBean.getScanInfo()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
execSendGuideAndThrowEx(reqBean, resultBean, String.format("请继续扫描关键件!当前生产对象:%s", suffix));
}
return pb.get();
}
private void checkKeyPartIsRepeatBind(StationRequestBean reqBean, StationResultBean resultBean, ProcessBomModel processBomModel, String suffix) {
if (processBomModel.getIsRepeatVal() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) return;
List<MesProdBindRecord> prodBindRecordDbList = prodBindRecordExtService.getProdBindRecordListByKpSn(reqBean.getOrganizeCode(), reqBean.getScanInfo());
Optional<MesProdBindRecord> prodBindRecordOp = CollectionUtils.isEmpty(prodBindRecordDbList) ? null :
prodBindRecordDbList.stream().filter(o -> (null != o && MesPcnExtEnumUtil.MES_ACTION_TYPE.BIND.getValue() == o.getActionType())).findFirst();
if (null == prodBindRecordOp || !prodBindRecordOp.isPresent()) return;
this.sendMessage(reqBean, resultBean, String.format("关键件条码[%s]已被绑定过其他产品,操作失败!", reqBean.getScanInfo()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
execSendGuideAndThrowEx(reqBean, resultBean, String.format("请继续扫描关键件!当前生产对象:%s", suffix));
}
private void insertMesProdBindRecordExt(StationRequestBean reqBean, WorkOrderExtModel orderModel, ProcessBomModel processBomModel, List<MesKpsnRule> okList) {
MesKpsnRule matchKpsnRule = okList.stream().filter(o -> (null != o && o.getPartNo().equals(processBomModel.getItemPartNo()))).collect(Collectors.toList()).get(0);
MesProdBindRecordExt pbr = new MesProdBindRecordExt();
pbr.setWorkOrderNo(orderModel.getOrderNo());
pbr.setSerialNumber(reqBean.getSerialNumber());
pbr.setPartNo(orderModel.getPartNo());
pbr.setWorkCenterCode(reqBean.getWorkCenterCode());
pbr.setWorkCellCode(reqBean.getWorkCellCode());
pbr.setItemPartNo(processBomModel.getItemPartNo());
pbr.setItemPartName(processBomModel.getItemPartName());
pbr.setKpSn(reqBean.getScanInfo());
pbr.setKpQty(new Double(1));
pbr.setIsBindKey(processBomModel.getIsBindKey());
pbr.setActionType(MesPcnEnumUtil.MES_ACTION_TYPE.BIND.getValue());
pbr.setOrganizeCode(reqBean.getOrganizeCode());
pbr.setSupplierCode(matchKpsnRule.getSupplierCode());
pbr.setProcessCode(processBomModel.getProcessCode());
pbr.setProcessName(processBomModel.getProcessName());
pbr.setPartNameRdd(orderModel.getPartNameRdd());
pbr.setProductSn(reqBean.getProductSn());
pbr.setManageCode(getManageCode(reqBean.getTray(), 1));
pbr.setThirdPartyPid(getThirdPartyPid(reqBean.getTray()));
ConvertBean.serviceModelInitialize(pbr, reqBean.getUserInfo());
pbr.setLotNo(pbr.getCreateDatetime());
new ConvertBeanExt(pbr).convertBean(pbr);
prodBindRecordExtService.insertProdBindRecordExtNoRollback(pbr);
}
private void overrideMatchPbData(ProcessBomModel processBomModel) {
processBomModel.setBoundQty(StringUtils.isEmpty(processBomModel.getBoundQtyVal()) ? new Double(1) : MathOperation.add(processBomModel.getBoundQtyVal(), new Double(1)));
if (MathOperation.compareTo(processBomModel.getBoundQty(), processBomModel.getQty()) >= 0) {
processBomModel.setIsBind(true);
processBomModel.setIsBindName("是");
processBomModel.setColor(MesPcnExtConstWords.GREEN);
}
}
private Object getModuleService(StationRequestBean reqBean) {
fsmCommonService.checkWcpcMapForDoScan(reqBean);
return SpringContextsUtil.getBean(reqBean.getWcpcMap().get(MesPcnConstWords.MODULE_OBJECT));
}
private Method getModuleServiceMethod(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService) {
Method method = null;
try {
method = moduleService.getClass().getMethod(METHOD, reqBean.getClass(), Integer.class, String.class, String.class);
} catch (Exception e) {
}
if (null == method) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("展示组件缺失[%s]方法", METHOD));
return method;
}
private Object doHandleBindKeyPartData(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method, Integer flag, String item, String data) {
Object obj = null;
try {
obj = method.invoke(moduleService, reqBean, flag, item, data);
} catch (Exception e) {
execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("参数ITEM[%s]FLAG[%s]调用展示组件[%s]方法执行异常:[%s]", item, flag, METHOD, e.getMessage()));
}
return obj;
}
private String getCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean) {
String curExecWorkOrderNo = (String) snLineOnModuleService.doHandleCurExecWorkOrder(reqBean, 1, null);
if (StringUtils.isEmpty(curExecWorkOrderNo)) execExpSendMsgAndThrowEx(reqBean, resultBean, "此前操作的工单号已丢失,请选择启动状态的生产工单!");
return curExecWorkOrderNo;
}
private WorkOrderExtModel getWorkOrderExtModel(StationRequestBean reqBean, StationResultBean resultBean, String curExecWorkOrderNo) {
WorkOrderExtModel orderModel = !reqBean.getDataMap().containsKey(MesPcnExtConstWords.WORK_ORDER) ? null :
JSONObject.parseObject(JSONObject.toJSONString(reqBean.getDataMap().get(MesPcnExtConstWords.WORK_ORDER)), WorkOrderExtModel.class);
if (null == orderModel) {
MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo);
if (null != workOrderExt) {
orderModel = new WorkOrderExtModel();
BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID);
}
}
if (null == orderModel) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("此前操作的工单号[%s]对应的信息不存在!", curExecWorkOrderNo));
return orderModel;
}
}

@ -0,0 +1,52 @@
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.mes.pcn.serviceimpl.base.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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.StringJoiner;
/**
* @Description : PLC
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxCenterPlcPassStepService")
public class JxCenterPlcPassStepService extends BaseStepService {
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxCenterPlcPassStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StationResultBean resultBean = new StationResultBean();
String forceCmdKey = new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.FORCE).add(reqBean.getStepCode()).toString();
Boolean forceCmd = reqBean.getDataMap().containsKey(forceCmdKey);
if (forceCmd) reqBean.getDataMap().remove(forceCmdKey);
//通知PLC放行逻辑暂无
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxCenterPlcPassStepService --- SUCCESS ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
if (!forceCmd) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean,
String.format("%s产线放行成功!", StringUtils.isEmpty(reqBean.getProductSn()) ? String.format("管理编码[%s]", getManageCode(reqBean.getTray(), 1)) : String.format("产品条码[%s]", reqBean.getProductSn())));
else return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, "产线强制放行成功!");
}
private String getManageCode(String manageCode, Integer length) {
if (StringUtils.isEmpty(manageCode)) return null;
String[] manageCodeArr = manageCode.split(MesPcnExtConstWords.AND);
if (manageCodeArr.length >= length) return manageCodeArr[length - 1];
else return null;
}
}

@ -0,0 +1,206 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IPartExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProductEncodeCfgExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxNumberRulePackAttributeService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesPartExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnExtRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnMcRecordRepository;
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.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.bean.BaseResultBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;
/**
* @Description : 线
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxSnLineOnBindMcStepService")
public class JxSnLineOnBindMcStepService extends BaseStepService {
@Autowired
private JxSnLineOnModuleService snLineOnModuleService;
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Autowired
private IProductEncodeCfgExtService productEncodeCfgExtService;
@Autowired
private IPartExtService partExtService;
@Autowired
private ISxNumberRulePackAttributeService numberRulePackAttributeService;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private MesProduceSnMcRecordRepository produceSnMcRecordRepository;
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Override
public StepResult guide(StationRequestBean reqBean) {
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean(), "请扫描管理编码或产品条码!");
}
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnBindMcStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StationResultBean resultBean = new StationResultBean();
if (StringUtils.isEmpty(reqBean.getTray())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, "入参缺少管理编码!");
String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean);
WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo);
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() == orderModel.getWorkOrderType()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, "返工工单已跳过管理编码绑定!");
MesPartExt partDb = partExtService.getPartExt(reqBean.getOrganizeCode(), orderModel.getPartNo());
if (null == partDb) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]关联的物料编码[%s]信息不存在!", orderModel.getOrderNo(), orderModel.getPartNo()));
String serialNumber = null;
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.STANDARD_ORDER.getValue() == orderModel.getWorkOrderType()) serialNumber = execSerialNumber(reqBean, resultBean, orderModel, partDb);
MesProduceSnMcRecord produceSnMcRecord = insertMcAndSn(reqBean, orderModel, serialNumber);
reqBean.setSerialNumber(serialNumber);
reqBean.setTray(new StringJoiner(MesPcnExtConstWords.AND).add(produceSnMcRecord.getManageCode()).add(produceSnMcRecord.getId().toString()).toString());
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnBindMcStepService --- SUCCESS --- MesProduceSnMcRecord:{} ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), JSONObject.toJSONString(produceSnMcRecord));
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, String.format("管理编码[%s]%s绑定生产工单[%s]成功!",
reqBean.getTray(), !StringUtils.isEmpty(serialNumber) ? String.format("关联过程条码[%s]", serialNumber) : MesPcnExtConstWords.EMPTY, orderModel.getOrderNo()));
}
private String getCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean) {
String curExecWorkOrderNo = (String) snLineOnModuleService.doHandleCurExecWorkOrder(reqBean, 1, null);
if (StringUtils.isEmpty(curExecWorkOrderNo)) execExpSendMsgAndThrowEx(reqBean, resultBean, "此前操作的工单号已丢失,请选择启动状态的生产工单!");
return curExecWorkOrderNo;
}
private WorkOrderExtModel getWorkOrderExtModel(StationRequestBean reqBean, StationResultBean resultBean, String curExecWorkOrderNo) {
WorkOrderExtModel orderModel = !reqBean.getDataMap().containsKey(MesPcnExtConstWords.WORK_ORDER) ? null :
JSONObject.parseObject(JSONObject.toJSONString(reqBean.getDataMap().get(MesPcnExtConstWords.WORK_ORDER)), WorkOrderExtModel.class);
if (null == orderModel) {
MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo);
if (null != workOrderExt) {
orderModel = new WorkOrderExtModel();
BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID);
}
}
if (null == orderModel) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("此前操作的工单号[%s]对应的信息不存在!", curExecWorkOrderNo));
return orderModel;
}
private String execSerialNumber(StationRequestBean reqBean, StationResultBean resultBean, WorkOrderExtModel orderModel, MesPartExt partDb) {
String ruleCode = null;
try {
ruleCode = productEncodeCfgExtService.getRuleCodeByMatchType(reqBean.getOrganizeCode(), MesPcnExtEnumUtil.ENCODE_CODE_TYPE.SERIAL_SN.getValue(), partDb, orderModel.getWorkCenterCode());
} catch (Exception e) {
execExpSendMsgAndThrowEx(reqBean, resultBean, e.getMessage());
}
if (StringUtils.isEmpty(ruleCode)) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]关联的物料编码[%s]未配置有效的过程编码匹配规则!", orderModel.getOrderNo(), orderModel.getPartNo()));
Map<String, Object> map = new HashMap<>();
map.put(MesPcnExtConstWords.ORGANIZE_CODE, reqBean.getOrganizeCode());
map.put(MesPcnExtConstWords.RULE_CODE, ruleCode);
map.put(MesPcnExtConstWords.PART_EXT, partDb);
map.put(MesPcnExtConstWords.WORK_ORDER_NO, orderModel.getOrderNo());
map.put(MesPcnExtConstWords.WORK_CENTER_CODE, orderModel.getWorkCenterCode());
GenSerialNoModel genSerialNoModel = numberRulePackAttributeService.doPackGenSerialNoModel(map);
BaseResultBean<String> baseResultBean = syncFuncService.syncSerialNo(genSerialNoModel, reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1);
if (null == baseResultBean || (!baseResultBean.isSuccess() || CollectionUtils.isEmpty(baseResultBean.getResultList())))
execExpSendMsgAndThrowEx(reqBean, resultBean, String.format(
"工单号[%s]关联的物料编码[%s]配置的过程编码匹配规则编码[%s]生成过程条码失败:%s!", orderModel.getOrderNo(), orderModel.getPartNo(), ruleCode, null != baseResultBean ? baseResultBean.getErrorMsg() : null));
return baseResultBean.getResultList().get(0);
}
private MesProduceSnMcRecord insertMcAndSn(StationRequestBean reqBean, WorkOrderExtModel orderModel, String serialNumber) {
MesProduceSnMcRecord produceSnMcRecord = insertProduceSnMcRecord(reqBean, orderModel, serialNumber);
if (!StringUtils.isEmpty(serialNumber)) insertProduceSnExt(reqBean, orderModel, serialNumber);
return produceSnMcRecord;
}
private MesProduceSnMcRecord insertProduceSnMcRecord(StationRequestBean reqBean, WorkOrderExtModel orderModel, String serialNumber) {
MesProduceSnMcRecord produceSnMcRecord = new MesProduceSnMcRecord();
produceSnMcRecord.setManageCode(reqBean.getTray());
produceSnMcRecord.setSerialNumber(serialNumber);
produceSnMcRecord.setPartNo(orderModel.getPartNo());
produceSnMcRecord.setPartNameRdd(orderModel.getPartNameRdd());
produceSnMcRecord.setWorkCenterCode(orderModel.getWorkCenterCode());
produceSnMcRecord.setWorkOrderNo(orderModel.getOrderNo());
produceSnMcRecord.setSnStatus(MesPcnExtEnumUtil.MC_RECORD_SN_STATUS.LINE_ON.getValue());
produceSnMcRecord.setLineOnStatus(MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.FALSE.getValue());
produceSnMcRecord.setQcStatus(MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.TRUE.getValue());
produceSnMcRecord.setOrganizeCode(reqBean.getOrganizeCode());
produceSnMcRecord.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
ConvertBean.serviceModelInitialize(produceSnMcRecord, reqBean.getUserInfo());
return produceSnMcRecordRepository.insert(produceSnMcRecord);
}
private void insertProduceSnExt(StationRequestBean reqBean, WorkOrderExtModel orderModel, String serialNumber) {
MesProduceSnExt produceSnExt = new MesProduceSnExt();
produceSnExt.setSerialNumber(serialNumber);
produceSnExt.setWorkOrderNo(orderModel.getOrderNo());
produceSnExt.setLastWorkOrderNo(orderModel.getOrderNo());
produceSnExt.setPartNo(orderModel.getPartNo());
produceSnExt.setPartNameRdd(orderModel.getPartNameRdd());
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.PRODUCE_SN_TYPE.STANDARD_SN.getValue());
produceSnExt.setQty(1d);
produceSnExt.setWorkCenterCode(orderModel.getWorkCenterCode());
produceSnExt.setTrayNo(reqBean.getTray());
produceSnExt.setOperateType(MesPcnExtEnumUtil.SN_OPERATE_TYPE.QUALIFIED.getValue());
produceSnExt.setIfCompensate(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
produceSnExt.setOrganizeCode(orderModel.getOrganizeCode());
ConvertBean.serviceModelInitialize(produceSnExt, reqBean.getUserInfo());
produceSnExt.setInWorkCenterTime(produceSnExt.getCreateDatetime());
produceSnExt.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(produceSnExt).convertBean(produceSnExt);
produceSnExtRepository.insert(produceSnExt);
}
}

@ -0,0 +1,128 @@
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.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
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.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.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.StringJoiner;
/**
* @Description : 线
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxSnLineOnCheckMcOrPsStepService")
public class JxSnLineOnCheckMcOrPsStepService extends BaseStepService {
@Autowired
private JxSnLineOnModuleService snLineOnModuleService;
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Override
public StepResult guide(StationRequestBean reqBean) {
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean(), "请扫描管理编码或产品条码!");
}
@Override
public StepResult init(StationRequestBean reqBean) {
reqBean.setSerialNumber(null);
reqBean.setProductSn(null);
reqBean.setTray(null);
snLineOnModuleService.doHandleBindKeyPartData(reqBean, 3, new StringJoiner(MesPcnExtConstWords.COMMA).add(MesPcnExtConstWords.BIND_KEY_PART).add(MesPcnExtConstWords.EXEC_BIND_KEY).toString(), null);
return StepResult.getSuccessComplete();
}
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCheckMcOrPsStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StepResult stepResult = StepResult.getSuccessComplete();
StationResultBean resultBean = new StationResultBean();
if (StringUtils.isEmpty(reqBean.getScanInfo())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "入参缺少管理编码或产品条码!");
String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean);
WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo);
if (!checkScanInfoIsValid(reqBean, resultBean, stepResult, orderModel).isCompleted()) return stepResult;
this.sendMessage(reqBean, resultBean, stepResult.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCheckMcOrPsStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return stepResult;
}
private String getCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean) {
String curExecWorkOrderNo = (String) snLineOnModuleService.doHandleCurExecWorkOrder(reqBean, 1, null);
if (StringUtils.isEmpty(curExecWorkOrderNo)) execExpSendMsgAndThrowEx(reqBean, resultBean, "此前操作的工单号已丢失,请选择启动状态的生产工单!");
return curExecWorkOrderNo;
}
private WorkOrderExtModel getWorkOrderExtModel(StationRequestBean reqBean, StationResultBean resultBean, String curExecWorkOrderNo) {
WorkOrderExtModel orderModel = !reqBean.getDataMap().containsKey(MesPcnExtConstWords.WORK_ORDER) ? null :
JSONObject.parseObject(JSONObject.toJSONString(reqBean.getDataMap().get(MesPcnExtConstWords.WORK_ORDER)), WorkOrderExtModel.class);
if (null == orderModel) {
MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo);
if (null != workOrderExt) {
orderModel = new WorkOrderExtModel();
BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID);
}
}
if (null == orderModel) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("此前操作的工单号[%s]对应的信息不存在!", curExecWorkOrderNo));
return orderModel;
}
private StepResult checkScanInfoIsValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, WorkOrderExtModel orderModel) {
JxProdBusiStrategyParamsBuilder params = new JxProdBusiStrategyParamsBuilder.builder()
.organizeCode(reqBean.getOrganizeCode())
.scanInfo(reqBean.getScanInfo())
.location(reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())
.orderModel(orderModel)
.strategyService(SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.COMMON.getClazz()))
.build();
StepResult result = ((IJxProdBusiStrategyService) SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.valueOfClazz(orderModel.getWorkOrderType()))).checkLineOn(params);
if (!result.isCompleted()) this.sendMessage(reqBean, resultBean, result.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
else reqBean.setTray(params.getManageCode());
stepResult.setCompleted(result.isCompleted());
if (result.isCompleted() && (null != params.getProduceSnMcRecordDb() || null != params.getProduceSnExtDb())) {
reqBean.setSerialNumber(params.getSerialNumber());
reqBean.setProductSn(params.getProductSn());
if (null != params.getProduceSnMcRecordDb()) reqBean.setTray(new StringJoiner(MesPcnExtConstWords.AND).add(params.getProduceSnMcRecordDb().getManageCode()).add(params.getProduceSnMcRecordDb().getId().toString()).toString());
stepResult.nextTriggerEvent(MesPcnExtConstWords.BIND_KEY_PART).isCompleted(false);
}
return stepResult;
}
}

@ -0,0 +1,115 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnTravelExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnExtRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnMcRecordRepository;
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.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 : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxSnLineOnCompleteStepService")
public class JxSnLineOnCompleteStepService extends BaseStepService {
@Autowired
private JxSnLineOnModuleService snLineOnModuleService;
@Autowired
private IJxProduceSnExtService produceSnExtService;
@Autowired
private MesProduceSnMcRecordRepository produceSnMcRecordRepository;
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Autowired
private IProduceSnTravelExtService produceSnTravelExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCompleteStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StationResultBean resultBean = new StationResultBean();
if (StringUtils.isEmpty(reqBean.getTray()) && StringUtils.isEmpty(reqBean.getProductSn())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, "入参缺少管理编码或产品条码!");
String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean);
MesProduceSnExt produceSnExtDb = saveProduceSn(reqBean, resultBean);
saveProduceSnMcRecord(reqBean, resultBean);
insertProduceSnTravel(produceSnExtDb);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCompleteStepService --- SUCCESS ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, StepResult.getSuccessComplete(), true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT,
String.format("管理编码[%s]过程条码[%s]产品条码[%s]关联生产工单[%s]上线完成!", reqBean.getTray(), reqBean.getSerialNumber(), reqBean.getProductSn(), curExecWorkOrderNo));
}
private String getCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean) {
String curExecWorkOrderNo = (String) snLineOnModuleService.doHandleCurExecWorkOrder(reqBean, 1, null);
if (StringUtils.isEmpty(curExecWorkOrderNo)) execExpSendMsgAndThrowEx(reqBean, resultBean, "此前操作的工单号已丢失,请选择启动状态的生产工单!");
return curExecWorkOrderNo;
}
private MesProduceSnExt saveProduceSn(StationRequestBean reqBean, StationResultBean resultBean) {
if (StringUtils.isEmpty(reqBean.getSerialNumber()) && StringUtils.isEmpty(reqBean.getProductSn())) return null;
MesProduceSnExt produceSnExtDb = produceSnExtService.getProduceSnExtDb(reqBean.getOrganizeCode(), reqBean.getSerialNumber(), reqBean.getProductSn());
if (null == produceSnExtDb) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("过程条码[%s]产品条码[%s]对应的信息不存在!", reqBean.getSerialNumber(), reqBean.getProductSn()));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == produceSnExtDb.getOperateType()) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("过程条码[%s]产品条码[%s]对应的信息当前业务状态[返修]!", reqBean.getSerialNumber(), reqBean.getProductSn()));
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExtDb.getSnStatus()) return produceSnExtDb;
produceSnExtDb.setSnStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue());
produceSnExtService.doPackSnExtProcess(reqBean, produceSnExtDb);
ConvertBean.serviceModelUpdate(produceSnExtDb, reqBean.getUserInfo());
produceSnExtDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(produceSnExtDb).convertBean(produceSnExtDb);
return produceSnExtRepository.save(produceSnExtDb);
}
private void saveProduceSnMcRecord(StationRequestBean reqBean, StationResultBean resultBean) {
if (StringUtils.isEmpty(reqBean.getTray()) || !reqBean.getTray().contains(MesPcnExtConstWords.AND)) return;
String[] manageCodeArr = reqBean.getTray().split(MesPcnExtConstWords.AND);
MesProduceSnMcRecord produceSnMcRecordDb = produceSnMcRecordRepository.getById(Long.parseLong(manageCodeArr[1]));
if (null == produceSnMcRecordDb) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("管理编码[%s]ID[%s]对应的管理编码与工单条码关系信息不存在!", manageCodeArr[0], manageCodeArr[1]));
if (MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.FALSE.getValue() == produceSnMcRecordDb.getQcStatus()) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("管理编码[%s]ID[%s]对应的管理编码与工单条码关系信息当前业务状态[返修]!", manageCodeArr[0], manageCodeArr[1]));
if (MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() == produceSnMcRecordDb.getLineOnStatus()) return;
produceSnMcRecordDb.setLineOnStatus(MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue());
ConvertBean.serviceModelUpdate(produceSnMcRecordDb, reqBean.getUserInfo());
produceSnMcRecordDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
produceSnMcRecordRepository.save(produceSnMcRecordDb);
}
private void insertProduceSnTravel(MesProduceSnExt produceSnExtDb) {
if (null == produceSnExtDb) return;
produceSnTravelExtService.insertProduceSnTravelExt(produceSnExtDb);
}
}

@ -0,0 +1,107 @@
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.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
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.platform.common.tool.MathOperation;
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.BeanUtils;
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("jxSnLineOnInitOrderStepService")
public class JxSnLineOnInitOrderStepService extends BaseStepService {
@Autowired
private JxSnLineOnModuleService snLineOnModuleService;
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnInitOrderStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StepResult stepResult = StepResult.getSuccessComplete();
StationResultBean resultBean = new StationResultBean();
String selectWorkOrderNo = (String) snLineOnModuleService.doHandleSelectWorkOrderNo(reqBean, 1, null);
String curExecWorkOrderNo = (String) snLineOnModuleService.doHandleCurExecWorkOrder(reqBean, 1, null);
if (!StringUtils.isEmpty(selectWorkOrderNo)) snLineOnModuleService.doHandleSelectWorkOrderNo(reqBean, 3, null);
if (!StringUtils.isEmpty(selectWorkOrderNo) && !StringUtils.isEmpty(curExecWorkOrderNo)) {
if (selectWorkOrderNo.equals(curExecWorkOrderNo)) selectWorkOrderNo = null;
else curExecWorkOrderNo = null;
}
MesWorkOrderExt workOrderExt = null;
if (!StringUtils.isEmpty(selectWorkOrderNo)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), selectWorkOrderNo);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("选择的工单号[%s]", selectWorkOrderNo), true);
doCacheCurExecWorkOrderNo(reqBean, resultBean, stepResult, selectWorkOrderNo);
}
if (!StringUtils.isEmpty(curExecWorkOrderNo)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("此前操作的工单号[%s]", curExecWorkOrderNo), false);
}
if (null == workOrderExt || !stepResult.isCompleted()) execSendGuideAndThrowEx(reqBean, resultBean, "请选择启动状态的生产工单!");
cacheOrderModel(reqBean, workOrderExt);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnInitOrderStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return stepResult;
}
private void doCacheCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, String selectWorkOrderNo) {
Boolean flag = (Boolean) snLineOnModuleService.doHandleCurExecWorkOrder(reqBean, 2, selectWorkOrderNo);
if (!flag) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("选择的工单号[%s]初始化失败!", selectWorkOrderNo));
else {
snLineOnModuleService.execStateModule(reqBean, null, null);
if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean, String.format("选择的工单号[%s]初始化成功!", selectWorkOrderNo), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
}
}
private void checkWorkOrderExtIsValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkOrderExt workOrderExt, String suffix, Boolean flag) {
if (null == workOrderExt) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s对应的工单信息不存在!", suffix));
if (stepResult.isCompleted() && MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() != workOrderExt.getWorkOrderStatus())
execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s状态[%s],不支持在此工位操作!", suffix, MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus())));
if (stepResult.isCompleted() && MathOperation.compareTo(workOrderExt.getQty(), new Double(0)) <= 0)
execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s计划数量为[0],不支持在此工位操作!", suffix));
if (!stepResult.isCompleted()) return;
}
private void cacheOrderModel(StationRequestBean reqBean, MesWorkOrderExt workOrderExt) {
WorkOrderExtModel orderModel = new WorkOrderExtModel();
BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID);
reqBean.getDataMap().put(MesPcnExtConstWords.WORK_ORDER, orderModel);
}
}

@ -26,7 +26,9 @@ import java.io.Serializable;
@Table(name = "MES_PROD_BIND_RECORD_EXT",indexes = {
@Index(columnList = "ORGANIZE_CODE_EXT"),
@Index(columnList = "CREATE_DATE_TIME_EXT"),
@Index(columnList = "MODIFY_DATE_TIME_EXT")
@Index(columnList = "MODIFY_DATE_TIME_EXT"),
@Index(columnList = "PRODUCT_SN"),
@Index(columnList = "THIRD_PARTY_PID")
})
@PrimaryKeyJoinColumn(name = "PID")
@Api("产品绑定记录表拓展")
@ -73,4 +75,21 @@ public class MesProdBindRecordExt extends MesProdBindRecord implements Serializa
@Column(name="MODIFY_DATE_TIME_EXT")
@ApiParam(value = "修改日期")
public String modifyDatetimeExt;
@Column(name = "PRODUCT_SN")
@ApiParam("产品条码")
private String productSn;
@Column(name = "PART_NAME_RDD")
@ApiParam("物料名称")
private String partNameRdd;
@Column(name = "MANAGE_CODE")
@ApiParam(value = "管理编码")
private String manageCode;
@Column(name = "THIRD_PARTY_PID")
@ApiParam("关联ID")
private String thirdPartyPid;
}

@ -29,7 +29,7 @@ import java.io.Serializable;
@Index(columnList = "SYSTEM_SYNC_STATUS"),
@Index(columnList = "MANAGE_CODE"),
@Index(columnList = "MANAGE_CODE, SN_STATUS"),
@Index(columnList = "SERIAL_NUMBER, WORK_ORDER_NO")
@Index(columnList = "WORK_ORDER_NO")
})
@Api("管理码与工单条码关系表")
public class MesProduceSnMcRecord extends BaseBean implements Serializable {
@ -76,7 +76,12 @@ public class MesProduceSnMcRecord extends BaseBean implements Serializable {
@Column(name = "QC_STATUS")
@ApiParam("质量状态")
@AnnoOutputColumn(refClass = MesPcnExtEnumUtil.MC_RECORD_SN_QC_STATUS.class, refForeignKey = "value", value = "description")
@AnnoOutputColumn(refClass = MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.class, refForeignKey = "value", value = "description")
private Integer qcStatus;
@Column(name = "LINE_ON_STATUS")
@ApiParam("上线状态")
@AnnoOutputColumn(refClass = MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.class, refForeignKey = "value", value = "description")
private Integer lineOnStatus;
}

@ -0,0 +1,176 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkCenterExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import lombok.Data;
import org.springframework.util.StringUtils;
import java.io.Serializable;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:41
* @Description:
**/
@Data
public class JxProdBusiStrategyParamsBuilder implements Serializable {
private static final long serialVersionUID = 2545853707952640078L;
private String organizeCode;
private String scanInfo;
private String scanName;
private String manageCode;
private String serialNumber;
private String productSn;
private String userInfo;
private String workCenterCode;
private String workCellCode;
private MesManageCode manageCodeDb;
private MesProduceSnMcRecord produceSnMcRecordDb;
private MesWorkCenterExt workCenterExtDb;
private WorkOrderExtModel orderModel;
private MesProduceSnExt produceSnExtDb;
private MesPart partDb;
private Object strategyService;
public static class builder {
JxProdBusiStrategyParamsBuilder params = new JxProdBusiStrategyParamsBuilder();
public builder organizeCode(String organizeCode) {
params.organizeCode = organizeCode;
return this;
}
public builder scanInfo(String scanInfo) {
params.scanInfo = scanInfo;
return this;
}
public builder manageCode(String manageCode) {
params.manageCode = manageCode;
return this;
}
public builder serialNumber(String serialNumber) {
params.serialNumber = serialNumber;
return this;
}
public builder productSn(String productSn) {
params.productSn = productSn;
return this;
}
public builder userInfo(String userInfo) {
params.userInfo = userInfo;
return this;
}
public builder location(String workCenterCode, String workCellCode) {
params.workCenterCode = workCenterCode;
params.workCellCode = workCellCode;
return this;
}
public builder orderModel(WorkOrderExtModel orderModel) {
params.orderModel = orderModel;
return this;
}
public builder workCenterExtDb(MesWorkCenterExt workCenterExtDb) {
params.workCenterExtDb = workCenterExtDb;
return this;
}
public builder partDb(MesPart partDb) {
params.partDb = partDb;
return this;
}
public builder strategyService(Object strategyService) {
params.strategyService = strategyService;
return this;
}
public JxProdBusiStrategyParamsBuilder build() {
return params;
}
}
public JxProdBusiStrategyParamsBuilder manageCodeDb(MesManageCode manageCodeDb) {
this.manageCodeDb = manageCodeDb;
return this;
}
public JxProdBusiStrategyParamsBuilder produceSnMcRecordDb(MesProduceSnMcRecord produceSnMcRecordDb) {
this.produceSnMcRecordDb = produceSnMcRecordDb;
return this;
}
public JxProdBusiStrategyParamsBuilder produceSnExtDb(MesProduceSnExt produceSnExtDb) {
this.produceSnExtDb = produceSnExtDb;
return this;
}
public JxProdBusiStrategyParamsBuilder manageCode() {
this.manageCode = null;
return this;
}
public JxProdBusiStrategyParamsBuilder manageCode(String manageCode) {
if (!StringUtils.isEmpty(manageCode)) this.manageCode = manageCode;
return this;
}
public JxProdBusiStrategyParamsBuilder sn() {
this.serialNumber = null;
this.productSn = null;
return this;
}
public JxProdBusiStrategyParamsBuilder sn(String serialNumber, String productSn) {
if (!StringUtils.isEmpty(serialNumber)) this.serialNumber = serialNumber;
if (!StringUtils.isEmpty(productSn)) this.productSn = productSn;
return this;
}
public JxProdBusiStrategyParamsBuilder serialNumber(String serialNumber) {
if (!StringUtils.isEmpty(serialNumber)) this.serialNumber = serialNumber;
return this;
}
public JxProdBusiStrategyParamsBuilder productSn(String productSn) {
if (!StringUtils.isEmpty(productSn)) this.productSn = productSn;
return this;
}
public JxProdBusiStrategyParamsBuilder scanName() {
if (!StringUtils.isEmpty(manageCode) && this.scanInfo.equals(manageCode)) this.scanName = "管理编码";
else if (!StringUtils.isEmpty(productSn) && this.scanInfo.equals(productSn)) this.scanName = "产品条码";
else this.scanName = "扫描信息";
return this;
}
}

@ -0,0 +1,20 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
/**
* @author wangjie
* @version 1.0
* @date 2021/1/15 15:32
**/
@Data
@ApiModel("嘉兴松下条码 MODEL")
public class JxProduceSnExtModel extends MesProduceSnExt implements Serializable {
private static final long serialVersionUID = -4159841236145582296L;
}

@ -0,0 +1,44 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.io.Serializable;
/**
* @author wangjie
* @version 1.0
* @date 2021/1/15 15:32
**/
@Data
@ApiModel("嘉兴松下条码上线 MODEL")
public class JxSnLineOnModel implements Serializable {
private static final long serialVersionUID = 8683799945479864228L;
@ApiParam("序号")
private Integer index;
@ApiParam("创建时间")
private String createDatetime;
@ApiParam("创建人")
private String createUser;
@ApiParam("管理码")
private String manageCode;
@ApiParam("过程条码")
private String serialNumber;
@ApiParam("产品条码")
private String productSn;
@ApiParam("关键件绑定情况")
private String bindStatus;
@ApiParam("颜色")
private String color;
}

@ -79,6 +79,8 @@ public class MesPcnExtConstWords {
public static final String PRINT_STATUS_NAME = "printStatusName";
// 条码类型
public static final String SN_TYPE = "snType";
// 条码类型
public static final String SN_TYPE_NAME = "snTypeName";
// 下线时间
public static final String OUT_WC_TIME = "outWorkCenterTime";
// 状态
@ -91,6 +93,8 @@ public class MesPcnExtConstWords {
public static final String LAST_WORK_ORDER_NO = "lastWorkOrderNo";
// 工单状态
public static final String WORK_ORDER_STATUS = "workOrderStatus";
// 工单状态
public static final String WORK_ORDER_STATUS_NAME = "workOrderStatusName";
// 工单类型
public static final String WORK_ORDER_TYPE = "workOrderType";
// 工单类型
@ -490,6 +494,7 @@ public class MesPcnExtConstWords {
//绑定关键件
public static final String BIND_KEY_PART_MODULE = "BIND_KEY_PART_MODULE";
public static final String BIND_KEY_PART = "BIND_KEY_PART";
public static final String EXEC_BIND_KEY = "EXEC_BIND_KEY";
public static final String IS_BIND_KEY = "isBindKey";
public static final String CHECK_CONTENT = "checkContent";
public static final String BOUND_QTY = "boundQty";
@ -875,4 +880,13 @@ public class MesPcnExtConstWords {
//是否解冻
public static final String IS_UNFREEZE = "isUnfreeze";
public static final String JX_SN_LINE_ON_MODULE = "JX_SN_LINE_ON_MODULE";
public static final String JX_SN_LINE_ON_DATA = "JX_SN_LINE_ON_DATA";
public static final String CMD_FORCE_CENTER_PASS = "CMD_FORCE_CENTER_PASS";
public static final String FORCE = "FORCE";
public static final Integer ZERO = 0;
public static final String THIRD_PARTY_PID = "thirdPartyPid";
}

@ -1170,6 +1170,7 @@ public class MesPcnExtEnumUtil {
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum ENCODE_CODE_TYPE {
SERIAL_SN(5, "过程条码"),
STANDARD_SERIAL_SN(10, "正常产品条码"),
ATTEMPT_SERIAL_SN(20, "试制产品条码"),
REWORK_SERIAL_SN(30, "再生产品条码"),
@ -3359,8 +3360,8 @@ public class MesPcnExtEnumUtil {
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MC_RECORD_SN_STATUS {
CREATE(10, "上线"),
OFFLINE(20, "下线");
LINE_ON(10, "管理码上线"),
LINE_OFF(20, "管理码下线");
private int value;
private String description;
@ -3409,17 +3410,71 @@ public class MesPcnExtEnumUtil {
}
/**
* 线
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MC_RECORD_LINE_ON_STATUS {
TRUE(10, "已上线"),
FALSE(20, "半上线");
private int value;
private String description;
MC_RECORD_LINE_ON_STATUS(int value, String description) {
this.value = value;
this.description = description;
}
public int getValue() {
return value;
}
public String getDescription() {
return description;
}
public static String valueOfDescription(int val) {
String tmp = null;
for (int i = 0; i < values().length; i++) {
if (values()[i].value == val) {
tmp = values()[i].description;
}
}
return tmp;
}
public static String valueOf(int val) {
String tmp = null;
for (int i = 0; i < values().length; i++) {
if (values()[i].value == val) {
tmp = values()[i].description;
}
}
return tmp;
}
public static MC_RECORD_LINE_ON_STATUS getByValue(int value) {
for (MC_RECORD_LINE_ON_STATUS produceSnStatus : values()) {
if (produceSnStatus.getValue() == value) {
return produceSnStatus;
}
}
return null;
}
}
/**
*
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MC_RECORD_SN_QC_STATUS {
public enum MC_RECORD_QC_STATUS {
TRUE(10, "合格"),
FALSE(20, "不合格");
FALSE(20, "返修");
private int value;
private String description;
MC_RECORD_SN_QC_STATUS(int value, String description) {
MC_RECORD_QC_STATUS(int value, String description) {
this.value = value;
this.description = description;
}
@ -3452,8 +3507,8 @@ public class MesPcnExtEnumUtil {
return tmp;
}
public static MC_RECORD_SN_QC_STATUS getByValue(int value) {
for (MC_RECORD_SN_QC_STATUS produceSnStatus : values()) {
public static MC_RECORD_QC_STATUS getByValue(int value) {
for (MC_RECORD_QC_STATUS produceSnStatus : values()) {
if (produceSnStatus.getValue() == value) {
return produceSnStatus;
}
@ -3562,4 +3617,58 @@ public class MesPcnExtEnumUtil {
}
}
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum JX_PROD_BUSI_STRATEGY {
COMMON(0, "通用处理", "jxProdBusiStrategyCommonService"),
STANDARD_ORDER(10, "正常工单", "jxProdBusiStrategyStandardService"),
ATTEMPT_ORDER(20, "试制工单", "jxProdBusiStrategyAttemptService"),
REWORK_ORDER(30, "返工工单", "jxProdBusiStrategyRepairService");
private int value;
private String description;
private String clazz;
JX_PROD_BUSI_STRATEGY(int value, String description, String clazz) {
this.value = value;
this.description = description;
this.clazz = clazz;
}
public int getValue() {
return this.value;
}
public String getDescription() {
return this.description;
}
public String getClazz() {
return this.clazz;
}
public static JX_PROD_BUSI_STRATEGY getByValue(int value) {
for (JX_PROD_BUSI_STRATEGY strategy : values()) {
if (strategy.getValue() == value) {
return strategy;
}
}
return null;
}
public static String valueOfClazz(int val) {
String tmp = null;
for (int i = 0; i < values().length; ++i) {
if (values()[i].value == val) {
tmp = values()[i].clazz;
}
}
return tmp;
}
}
}

Loading…
Cancel
Save