JX pcn 条码上线
parent
896eaa63b6
commit
91a5461523
@ -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);
|
||||
|
||||
}
|
@ -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,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);
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
Loading…
Reference in New Issue