修复产线班次固定作业内容信息时间重复校验逻辑有误

tags/yfai-mes-ext-v1.0
yxw 1 year ago
parent d59e25ada9
commit 34b5108144

@ -67,4 +67,13 @@ public interface INumberRuleExtService {
*/
@ApiOperation(value = "按条件查询条码生产规则数据", notes = "按条件查询条码生产规则数据")
MesNumberRuleExt getNumberRule(MesNumberRuleExt numberRuleExt);
/**
*
* @param organizeCode
* @param ruleCode
* @return
*/
@ApiOperation(value = "根据规则代码获取规则编码信息", notes = "根据规则代码获取规则编码信息")
MesNumberRuleExt getNumberRuleExtByRuleCode(String organizeCode, String ruleCode);
}

@ -0,0 +1,22 @@
package cn.estsh.i3plus.ext.mes.api.busi;
import io.swagger.annotations.ApiOperation;
import java.util.Map;
/**
* @Author: wangjie
* @CreateDate: 2021/01/19 15:06
* @Description:
**/
public interface ISxNumberRuleCheckAttributeService {
/**
*
* @param map
* @return
*/
@ApiOperation(value = "根据编码规则校验编码是否有效", notes = "根据编码规则校验编码是否有效")
Map<String, Object> doCheckNumberRule(Map<String, Object> map);
}

@ -0,0 +1,9 @@
package cn.estsh.i3plus.ext.mes.api.busi.jx;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesProduceSnExt;
public interface IJxProduceSnService {
MesProduceSnExt getProduceSn(String organizeCode, String productSn);
}

@ -58,6 +58,7 @@ public class WorkOrderExtController extends MesBaseController {
.notNull("workCenterCode",workOrderDto.getWorkCenterCode())
.notNull("startTime",workOrderDto.getStartTime())
.notNull("endTime",workOrderDto.getEndTime());
workOrderDto.setUserInfo(AuthUtil.getSessionUser().getUserName());
workOrderExtService.insertManualGenerate(workOrderDto);
return ResultBean.success();
} catch (ImppBusiException busExcep) {

@ -0,0 +1,30 @@
package cn.estsh.i3plus.ext.mes.apiservice.dao.jx;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pojo.model.jx.OqcLastCheckModel;
import cn.estsh.i3plus.pojo.base.common.Pager;
import java.util.List;
/**
* @Author: wangjie
* @CreateDate: 2019/11/21 11:28
* @Description:
**/
public interface IJxProduceSnDao {
/**
*
* @param model
* @return
*/
int queryProduceSnByPagerCount(OqcLastCheckModel model);
/**
*
* @param model
* @param pager
* @return SOP
*/
List<MesProduceSnExt> queryProduceSnByPager(OqcLastCheckModel model, Pager pager);
}

@ -197,4 +197,14 @@ public class NumberRuleExtService implements INumberRuleExtService {
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.RULE_CODE },
new Object[]{numberRuleExt.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), numberRuleExt.getRuleCode()});
}
@Override
public MesNumberRuleExt getNumberRuleExtByRuleCode(String organizeCode, String ruleCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(ruleCode)) {
return null;
}
return numberRuleExtRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.RULE_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), ruleCode});
}
}

@ -175,6 +175,8 @@ public class ShiftProdCenterService implements IShiftProdCenterService {
if (!CollectionUtils.isEmpty(shiftProdList)) {
prodCodeList = (shiftProdList.stream().filter(o -> null != o)
.map(MesShiftProd::getProdCode).collect(Collectors.toList())).stream().distinct().collect(Collectors.toList());
} else {
prodCodeList = new ArrayList<>();
}
List<String> finalProdCodeList = prodCodeList;
shiftProdCenterList = shiftProdCenterList.stream()

@ -1,8 +1,14 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.INumberRuleExtService;
import cn.estsh.i3plus.ext.mes.api.base.IWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.api.busi.IProductEncodeCfgExtService;
import cn.estsh.i3plus.ext.mes.api.busi.ISxNumberRuleCheckAttributeService;
import cn.estsh.i3plus.ext.mes.api.busi.IWorkOrderLogExtService;
import cn.estsh.i3plus.ext.mes.api.busi.IWorkOrderStartService;
import cn.estsh.i3plus.ext.mes.api.busi.bu3.ISxPartExtService;
import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxPackageExtService;
import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxProduceSnService;
import cn.estsh.i3plus.ext.mes.icloud.sdk.IWmsErpHouseCheckCloud;
import cn.estsh.i3plus.ext.mes.pojo.bean.*;
import cn.estsh.i3plus.ext.mes.pojo.model.*;
@ -105,9 +111,43 @@ public class WorkOrderExtService implements IWorkOrderExtService {
@Resource(name = MesExtConstWords.REDIS_MES)
private ImppRedis redisMes;
@Autowired
private MesProdBindRecordRepository prodBindRecordRepository;
@Autowired
private ISxNumberRuleCheckAttributeService numberRuleCheckAttributeService;
@Autowired
private ISxPartExtService partExtService;
@Autowired
private INumberRuleExtService numberRuleExtService;
@Autowired
private IProductEncodeCfgExtService productEncodeCfgExtService;
@Autowired
private IJxProduceSnService produceSnService;
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Autowired
private MesProduceSnRepairRepository produceSnRepairRepository;
@Autowired
private IJxPackageExtService packageExtService;
@Autowired
private MesPackageExtRepository packageExtRepository;
@Autowired
private MesReworkOrderBindSnTravelRepository reworkOrderBindSnTravelRepository;
@Autowired
private MesSubassemblyRemadeRecordRepository subassemblyRemadeRecordRepository;
/**
*
*
@ -117,20 +157,562 @@ public class WorkOrderExtService implements IWorkOrderExtService {
@Transactional(rollbackFor = Exception.class)
public void insertManualGenerate(GenerateWorkOrderDto workOrderDto) {
MesWorkOrderExt mesWorkOrderExt = new MesWorkOrderExt();
Double qty = workOrderDto.getQty();
Double planQty = workOrderDto.getPlanQty();
if(planQty > qty){
throw new BaseImppException("计划返工数量不能大于计划生产数量");
}
checkReworkQty(workOrderDto);
Object data = checkReworkOrderBindSn(workOrderDto);
BeanUtils.copyProperties(workOrderDto,mesWorkOrderExt);
String userName = AuthUtil.getSessionUser().getUserName();
String organizeCode = AuthUtil.getOrganize().getOrganizeCode();
mesWorkOrderExt.setOrderNo(getOrderNo(userName,organizeCode));
mesWorkOrderExt.setWorkOrderSource(MesExtEnumUtil.WORK_ORDER_SOURCE.MANUALLY_GENERATE.getValue());
insertNewWorkOrder(mesWorkOrderExt);
doBindSn(workOrderDto, insertNewWorkOrder(mesWorkOrderExt), data);
}
private void doBindSn(GenerateWorkOrderDto workOrderDto, MesWorkOrderExt mesWorkOrderExt, Object data) {
if (data == null) return;
workOrderDto.setOrderNo(mesWorkOrderExt.getOrderNo());
// 10 为成品
if (workOrderDto.getPartExt().getCategoryCode3().equals("10")) doBindProductSn(mesWorkOrderExt, data);
// 其余都为组件
else doBindPackage(workOrderDto, workOrderDto.getPartExt());
}
private void doBindPackage(GenerateWorkOrderDto workOrderDto, Object data) {
List<MesPackageExt> packageExtList = (List<MesPackageExt>) data;
if (CollectionUtils.isEmpty(packageExtList)) return;
List<MesSubassemblyRemadeRecord> subassemblyRemadeRecordList = new ArrayList<>();
for (MesPackageExt packageExt : packageExtList) {
MesSubassemblyRemadeRecord record = new MesSubassemblyRemadeRecord();
record.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
record.setPackageNo(packageExt.getPackageNo());
record.setLotNo(packageExt.getLotNo());
record.setQty(0.0);
record.setInitWorkOrderNo(packageExt.getLastWorkOrderNo());
record.setInitWorkCenterCode(packageExt.getWorkCenterCode());
record.setInitQty(packageExt.getQty());
record.setWorkOrderNo(workOrderDto.getOrderNo());
record.setWorkCenterCode(workOrderDto.getWorkCenterCode());
record.setPartNo(workOrderDto.getPartNo());
record.setPartNameRdd(workOrderDto.getPartNameRdd());
record.setOrganizeCode(workOrderDto.getOrganizeCode());
ConvertBean.serviceModelInitialize(record, workOrderDto.getUserInfo());
subassemblyRemadeRecordList.add(record);
}
if (!CollectionUtils.isEmpty(subassemblyRemadeRecordList)) subassemblyRemadeRecordRepository.saveAll(subassemblyRemadeRecordList);
}
private double getBoundSnQty(GenerateWorkOrderDto workOrderDto) {
List<MesSubassemblyRemadeRecord> subassemblyRemadeRecordList = subassemblyRemadeRecordRepository.findByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.WORK_ORDER_NO},
new Object[]{workOrderDto.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workOrderDto.getOrderNo()});
if (!CollectionUtils.isEmpty(subassemblyRemadeRecordList)) {
workOrderDto.setPackSnList(subassemblyRemadeRecordList.stream().map(MesSubassemblyRemadeRecord::getPackageNo).collect(Collectors.toList()));
}
return CollectionUtils.isEmpty(subassemblyRemadeRecordList) ? 0 : subassemblyRemadeRecordList.stream().mapToDouble(MesSubassemblyRemadeRecord::getInitQty).sum();
}
private void doBindProductSn(MesWorkOrderExt mesWorkOrderExt, Object data) {
List<MesProduceSnExt> produceSnExtList = (List<MesProduceSnExt>) data;
if (CollectionUtils.isEmpty(produceSnExtList)) return;
List<MesProduceSnRepair> produceSnRepairList = new ArrayList<>();
List<MesReworkOrderBindSnTravel> reworkOrderBindSnTravelList = new ArrayList<>();
List<MesPackageExt> packageExtList = new ArrayList<>();
for (MesProduceSnExt produceSnExt : produceSnExtList) {
ConvertBean.serviceModelUpdate(produceSnExt, mesWorkOrderExt.getModifyUser());
new ConvertBeanExt(produceSnExt).convertBean(produceSnExt);
produceSnExt.setLastWorkOrderNo(mesWorkOrderExt.getOrderNo());
produceSnExt.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.REPAIR.getValue());
produceSnExt.setRouteCode(null);
produceSnExt.setProcessCode(null);
produceSnExt.setWorkCellCode(null);
produceSnExt.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(produceSnExt).convertBean(produceSnExt);
MesProduceSnRepair produceSnRepair = new MesProduceSnRepair();
produceSnRepair.setSerialNumber(produceSnExt.getSerialNumber());
produceSnRepair.setProductSn(produceSnExt.getProductSn());
produceSnRepair.setPartNo(produceSnExt.getPartNo());
produceSnRepair.setPartNameRdd(produceSnExt.getPartNameRdd());
produceSnRepair.setWorkCenterCode(mesWorkOrderExt.getWorkCenterCode());
produceSnRepair.setWorkOrderNo(mesWorkOrderExt.getOrderNo());
produceSnRepair.setInitWorkOrderNo(produceSnExt.getLastWorkOrderNo());
produceSnRepair.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.REWORK_SN.getValue());
produceSnRepair.setOrganizeCode(mesWorkOrderExt.getOrganizeCode());
ConvertBean.serviceModelInitialize(produceSnRepair, mesWorkOrderExt.getModifyUser());
produceSnRepair.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
produceSnRepairList.add(produceSnRepair);
MesReworkOrderBindSnTravel reworkOrderBindSnTravel = new MesReworkOrderBindSnTravel();
BeanUtils.copyProperties(produceSnRepair, reworkOrderBindSnTravel);
reworkOrderBindSnTravel.setBindStatus(MesExtEnumUtil.BIND_STATUS.BINGDING.getValue());
reworkOrderBindSnTravelList.add(reworkOrderBindSnTravel);
MesPackageDetail packageDetail = packageExtService.getPackageDetailByProductSn(mesWorkOrderExt.getOrganizeCode(), produceSnExt.getProductSn());
if (null != packageDetail) {
MesPackageExt packageExt = packageExtService.getPackageByPackNo(mesWorkOrderExt.getOrganizeCode(), packageDetail.getPackageNo());
if (null != packageExt) {
packageExt.setLastWorkOrderNo(mesWorkOrderExt.getOrderNo());
ConvertBean.serviceModelUpdate(packageExt, mesWorkOrderExt.getModifyUser());
packageExt.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(packageExt).convertBean(packageExt);
packageExtList.add(packageExt);
}
}
}
produceSnExtRepository.saveAll(produceSnExtList);
if (!CollectionUtils.isEmpty(packageExtList)) packageExtRepository.saveAll(packageExtList);
if (!CollectionUtils.isEmpty(produceSnRepairList)) produceSnRepairRepository.saveAll(produceSnRepairList);
if (!CollectionUtils.isEmpty(reworkOrderBindSnTravelList)) reworkOrderBindSnTravelRepository.saveAll(reworkOrderBindSnTravelList);
}
private Object checkReworkOrderBindSn(GenerateWorkOrderDto workOrderDto) {
if (workOrderDto.getWorkOrderType() != MesExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() || StringUtils.isEmpty(workOrderDto.getProductSnStart()) || StringUtils.isEmpty(workOrderDto.getProductSnEnd())) return null;
MesPartExt partExtDb = getMesPartExt(workOrderDto);
workOrderDto.setPartExt(partExtDb);
// 10 为成品
if (partExtDb.getCategoryCode3().equals("10")) return getMesProduceSnExtList(workOrderDto, partExtDb);
// 其余都是组件
else return getMesPackageExtList(workOrderDto, partExtDb);
}
private void insertNewWorkOrder(MesWorkOrderExt mesWorkOrderExt) {
private MesPartExt getMesPartExt(GenerateWorkOrderDto workOrderDto) {
MesPartExt partExtDb = partExtService.getPartExtByPartNo(workOrderDto.getOrganizeCode(), workOrderDto.getPartNo());
if (partExtDb == null) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("物料编码[%s]不存在", workOrderDto.getPartNo())
.build();
}
if (StringUtils.isEmpty(partExtDb.getCategoryCode3())) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("物料编码[%s]未维护物料分类3,无法确定为成品或是组件", workOrderDto.getPartNo())
.build();
}
return partExtDb;
}
private List<MesPackageExt> getMesPackageExtList(GenerateWorkOrderDto workOrderDto, MesPartExt partExtDb) {
String ruleCode;
try {
ruleCode = productEncodeCfgExtService.getRuleCodeByMatchType(
workOrderDto.getOrganizeCode(), MesExtEnumUtil.ENCODE_CODE_TYPE.PACK_SN.getValue(), partExtDb, workOrderDto.getWorkCenterCode());
} catch (Exception e) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("物料编码[%s]:[%s]!", workOrderDto.getPartNo(), e.getMessage())
.build();
}
MesNumberRuleExt numberRuleExt = getMesNumberRuleExt(workOrderDto, ruleCode);
checkPackageSnValid( workOrderDto, workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd());
checkProduceNumberRuleIsValid(partExtDb, ruleCode, numberRuleExt, workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(workOrderDto.getOrganizeCode());
DdlPreparedPack.getStringBiggerPack(workOrderDto.getProductSnStart(), MesExtConstWords.PACKAGENO, packBean);
DdlPreparedPack.getStringSmallerPack(workOrderDto.getProductSnEnd(), MesExtConstWords.PACKAGENO, packBean);
int snCount = packageExtRepository.findByHqlWhereCount(packBean);
checkSnCount(workOrderDto, snCount);
List<MesPackageExt> packageExtDbList = packageExtRepository.findByHqlWhere(packBean);
Double totalQty = packageExtDbList.stream().mapToDouble(MesPackageExt::getQty).sum();
//List<String> packageNoList = packageExtDbList.stream().map(MesPackageExt::getPackageNo).collect(Collectors.toList());
if (totalQty.compareTo(workOrderDto.getQty()) > 0) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("起始包装条码[%s]和截至包装条码[%s]包装数量总和[%s]大于工单[%s]计划数量[%s],请扣减一定数量的包装再进行绑定", workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd(), totalQty.toString(), workOrderDto.getOrderNo(), workOrderDto.getQty())
.build();
}
//double boundSnQty = getBoundSnQty(workOrderDto);
//List<String> packSnList = workOrderDto.getPackSnList();
//if (!CollectionUtils.isEmpty(packSnList) && !CollectionUtils.isEmpty(packageNoList)) {
//
// for (String packageNo : packSnList) {
// if (packageNoList.contains(packageNo)) {
// throw ImppExceptionBuilder.newInstance()
// .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
// .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
// .setErrorDetail("包装条码[%s]已绑定至工单[%s],无需再次绑定", packageNo, workOrderDto.getOrderNo())
// .build();
//
// }
// }
//}
//编码规则
String[] serialNoArray = numberRuleExt.getNumberRule().split("}\\{");
//规则属性长度拼接
String[] ruleLengthSpiltArray = numberRuleExt.getRuleLengthSpilt().split(",");
String serialNoStr = "serialno";
int serialNoIndex = -1;
for (int index = 0; index < serialNoArray.length; index++) {
if(serialNoArray[index].contains(serialNoStr)) serialNoIndex = index;
}
int ruleLengthTotal = 0;
if(serialNoIndex != -1){
for (int index = 0; index < serialNoIndex; index++) {
ruleLengthTotal += Integer.parseInt(ruleLengthSpiltArray[index]);
}
}
int finalRuleLengthTotal = ruleLengthTotal;
int finalSerialNoIndex = serialNoIndex;
packageExtDbList = packageExtDbList.stream().sorted(Comparator.comparing(MesPackageExt::getPackageNo)).collect(Collectors.toList());
Integer lastSerialNo = null;
String lastProductSn = null;
for (MesPackageExt packageExt : packageExtDbList) {
int curSerialNo = Integer.parseInt(packageExt.getSerialNumber().substring(finalRuleLengthTotal, finalRuleLengthTotal + Integer.parseInt(ruleLengthSpiltArray[finalSerialNoIndex])));
if (lastSerialNo == null) {
lastSerialNo = curSerialNo;
lastProductSn = packageExt.getPackageNo();
continue;
}
if (curSerialNo - lastSerialNo !=1 ) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("上一个包装条码[%s]与包装条码[%s]流水号存在跳号", lastProductSn, packageExt.getPackageNo())
.build();
}
lastProductSn = packageExt.getPackageNo();
lastSerialNo = curSerialNo;
}
return packageExtDbList;
}
private MesNumberRuleExt getMesNumberRuleExt(GenerateWorkOrderDto workOrderDto, String ruleCode) {
MesNumberRuleExt numberRuleExt = numberRuleExtService.getNumberRuleExtByRuleCode(workOrderDto.getOrganizeCode(), ruleCode);
if (numberRuleExt == null) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("物料编码[%s]未配置生产编码规则", workOrderDto.getPartNo())
.build();
}
return numberRuleExt;
}
private void checkSnCount(GenerateWorkOrderDto workOrderDto, int snCount) {
if (snCount > workOrderDto.getQty()) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("起始条码[%s]与截至条码[%s]之间存在的条码数量大于当前工单计划数量", workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd())
.build();
}
if (snCount == 0) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("未查询到起始条码[%s]与截至条码[%s]区间条码", workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd())
.build();
}
}
private List<MesProduceSnExt> getMesProduceSnExtList(GenerateWorkOrderDto workOrderDto, MesPartExt partExtDb) {
String ruleCode;
try {
ruleCode = productEncodeCfgExtService.getRuleCodeByMatchType(
workOrderDto.getOrganizeCode(), MesExtEnumUtil.ENCODE_CODE_TYPE.STANDARD_SERIAL_SN.getValue(), partExtDb, workOrderDto.getWorkCenterCode());
} catch (Exception e) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("物料编码[%s]:[%s]!", workOrderDto.getPartNo(), e.getMessage())
.build();
}
MesNumberRuleExt numberRuleExt = getMesNumberRuleExt(workOrderDto, ruleCode);
checkProductSnValid(workOrderDto.getOrganizeCode(), workOrderDto.getPartNo(), workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd());
checkProduceNumberRuleIsValid(partExtDb, ruleCode, numberRuleExt, workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(workOrderDto.getOrganizeCode());
DdlPreparedPack.getStringBiggerPack(workOrderDto.getProductSnStart(), MesExtConstWords.PRODUCT_SN, packBean);
DdlPreparedPack.getStringSmallerPack(workOrderDto.getProductSnEnd(), MesExtConstWords.PRODUCT_SN, packBean);
DdlPreparedPack.getStringSmallerPack(workOrderDto.getProductSnEnd(), MesExtConstWords.PRODUCT_SN, packBean);
int snCount = produceSnExtRepository.findByHqlWhereCount(packBean);
if (snCount == 0) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("未查询到起始条码[%s]与截至条码[%s]区间条码", workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd())
.build();
}
if (snCount > workOrderDto.getQty()) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("起始条码[%s]与截至条码[%s]之间存在的条码数量大于当前工单计划数量", workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd())
.build();
}
List<MesProduceSnExt> produceSnExtDbList = produceSnExtRepository.findByHqlWhere(packBean);
checkSn(workOrderDto, produceSnExtDbList);
//编码规则
String[] serialNoArray = numberRuleExt.getNumberRule().split("}\\{");
//规则属性长度拼接
String[] ruleLengthSpiltArray = numberRuleExt.getRuleLengthSpilt().split(",");
String serialNoStr = "serialno";
int serialNoIndex = -1;
for (int index = 0; index < serialNoArray.length; index++) {
if(serialNoArray[index].contains(serialNoStr)) serialNoIndex = index;
}
int ruleLengthTotal = 0;
if(serialNoIndex != -1){
for (int index = 0; index < serialNoIndex; index++) {
ruleLengthTotal += Integer.parseInt(ruleLengthSpiltArray[index]);
}
}
int finalRuleLengthTotal = ruleLengthTotal;
int finalSerialNoIndex = serialNoIndex;
produceSnExtDbList = produceSnExtDbList.stream().sorted(Comparator.comparing(MesProduceSnExt::getProductSn)).collect(Collectors.toList());
Integer lastSerialNo = null;
String lastProductSn = null;
for (MesProduceSnExt produceSnExt : produceSnExtDbList) {
int curSerialNo = Integer.parseInt(produceSnExt.getSerialNumber().substring(finalRuleLengthTotal, finalRuleLengthTotal + Integer.parseInt(ruleLengthSpiltArray[finalSerialNoIndex])));
if (lastSerialNo == null) {
lastSerialNo = curSerialNo;
lastProductSn = produceSnExt.getProductSn();
continue;
}
if (curSerialNo - lastSerialNo !=1 ) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("上一个产品条码[%s]与产品条码[%s]流水号存在跳号", lastProductSn, produceSnExt.getProductSn())
.build();
}
lastProductSn = produceSnExt.getProductSn();
lastSerialNo = curSerialNo;
}
return produceSnExtDbList;
}
private void checkSn(GenerateWorkOrderDto workOrderDto, List<MesProduceSnExt> produceSnExtDbList) {
for (MesProduceSnExt produceSnExt : produceSnExtDbList) {
if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() != produceSnExt.getSnStatus()) {
if (MesExtEnumUtil.PRODUCE_SN_STATUS.REPAIR.getValue() == produceSnExt.getSnStatus()) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("条码[" + produceSnExt.getProductSn() + "]状态为返工,已绑定返工工单[" + produceSnExt.getLastWorkOrderNo() + "]")
.build();
} else {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("条码[" + produceSnExt.getProductSn() + "]状态为[" + MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSnExt.getSnStatus()) + "]")
.build();
}
}
if (MesExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue() != produceSnExt.getQcStatus()) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("条码[" + produceSnExt.getProductSn() + "]质量状态为[" + MesExtEnumUtil.PRODUCE_SN_QC_STATUS.valueOfDescription(produceSnExt.getQcStatus()) + "]")
.build();
}
if (MesExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == produceSnExt.getOperateType()) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("条码[" + produceSnExt.getProductSn() + "]操作类型为[" + MesExtEnumUtil.PRODUCE_SN_QC_STATUS.valueOfDescription(produceSnExt.getQcStatus()) + "]")
.build();
}
MesProduceSnRepair produceSnRepairBySn = getProduceSnRepairBySn(workOrderDto.getOrganizeCode(), produceSnExt.getProductSn());
if (produceSnRepairBySn != null) {
if (StringUtils.isEmpty(produceSnRepairBySn.getOutWorkCenterTime())) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode())
.setErrorDetail("条码[" + produceSnExt.getProductSn() + "]已经绑定过其他的返工工单[" + produceSnRepairBySn.getWorkOrderNo() + "]且未下线")
.build();
}
}
}
}
private MesProduceSnRepair getProduceSnRepairBySn(String organizeCode, String productSn) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn)) {
return null;
}
List<MesProduceSnRepair> produceSnRepairList = produceSnRepairRepository.findByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PRODUCT_SN},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn},
" order by createDatetime desc ");
return !CollectionUtils.isEmpty(produceSnRepairList) ? produceSnRepairList.get(0) : null;
}
private void checkProduceNumberRuleIsValid(MesPartExt partExtDb, String ruleCode, MesNumberRuleExt numberRuleExt, String... productSnArr) {
for (String productSn : productSnArr) {
Map<String, Object> map = new HashMap<>();
map.put(MesExtConstWords.SERIAL_NUMBER, productSn);
map.put(MesExtConstWords.NUMBER_RULE_EXT, numberRuleExt);
map.put(MesExtConstWords.PART_EXT, partExtDb);
Map<String,Object> resultMap = numberRuleCheckAttributeService.doCheckNumberRule(map);
if ((Boolean)resultMap.get(MesExtConstWords.RESULT) == false) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("条码[%s]关联物料[%s]配置的编码规则代码[%s]无效", productSn, partExtDb.getPartNo(), ruleCode)
.build();
}
}
}
private void checkPackageSnValid(GenerateWorkOrderDto workOrderDto, String... packageNoArr) {
for (String packageNo : packageNoArr) {
MesPackageExt packageExt = packageExtRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PACKAGENO},
new Object[]{workOrderDto.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), packageNo});
if (packageExt == null) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("包装条码[%s]无效", packageNo)
.build();
}
if (MesEnumUtil.PACKAGE_IS_SEALED.UNSEALED.getValue() == packageExt.getIsSealed()) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("包装条码[%s]未封箱", packageNo)
.build();
}
if (!workOrderDto.getPartNo().equals(packageExt.getPartNo())) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("包装条码[%s]关联物料编码[%s]与当前工单关联物料编码[%s]不一致", packageNo, packageExt.getPartNo(), workOrderDto.getPartNo())
.build();
}
}
}
private void checkProductSnValid(String organizeCode, String partNo, String... produceSnArr) {
for (String produceSn : produceSnArr) {
MesProduceSnExt produceSnDb = produceSnService.getProduceSn(organizeCode, produceSn);
if (produceSnDb == null) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("产品条码[%s]无效", produceSn)
.build();
}
if (StringUtils.isEmpty(produceSnDb.getOutWorkCenterTime())) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("产品条码[%s]未下线", produceSn)
.build();
}
if (!partNo.equals(produceSnDb.getPartNo())) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("产品条码[%s]关联物料编码[%s]与当前工单关联物料编码[%s]不一致", produceSn, produceSnDb.getPartNo(), partNo)
.build();
}
}
}
private void checkReworkQty(GenerateWorkOrderDto workOrderDto) {
if(workOrderDto.getPlanQty() > workOrderDto.getQty()) throw new BaseImppException("计划返工数量不能大于计划生产数量");
}
private MesWorkOrderExt insertNewWorkOrder(MesWorkOrderExt mesWorkOrderExt) {
String organizeCode = AuthUtil.getOrganize().getOrganizeCode();
Integer workOrderType = mesWorkOrderExt.getWorkOrderType();
//如果是返工工单 设置是否生成条码为不生成
@ -155,7 +737,12 @@ public class WorkOrderExtService implements IWorkOrderExtService {
}
boolean havePart = isHavePart(mesWorkOrderExt.getPartNo(), organizeCode);
if (!havePart) {
throw new BaseImppException("物料号不存在");
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("物料号[%s]不存在",
mesWorkOrderExt.getPartNo())
.build();
}
mesWorkOrderExt.setWorkOrderStatus(MesExtEnumUtil.WORK_ORDER_STATUS.CREATE.getValue());
@ -168,6 +755,8 @@ public class WorkOrderExtService implements IWorkOrderExtService {
new ConvertBeanExt(mesWorkOrderExt).convertBean(mesWorkOrderExt);
MesWorkOrderExt workOrderExt = workOrderExtRepository.insert(mesWorkOrderExt);
insertMesWorkOrderLog(workOrderExt);
return workOrderExt;
}

@ -127,10 +127,13 @@ public class ProductEncodeCfgExtService implements IProductEncodeCfgExtService {
model.setOrganizeCode(organizeCode);
model.setCodeType(codeType);
switch (MesExtEnumUtil.ENCODE_CODE_TYPE.getByValue(codeType)) {
case SERIAL_SN:
model.setMatchType(partDb.getProcessMatchType());
break;
case STANDARD_SERIAL_SN :
case REWORK_SERIAL_SN :
case ATTEMPT_SERIAL_SN :
model.setMatchType(partDb.getProcessMatchType());
model.setMatchType(partDb.getProductMatchType());
break;
case PACK_SN :
model.setMatchType(partDb.getPackageMatchType());

@ -0,0 +1,344 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.api.busi.ISxNumberRuleCheckAttributeService;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesNumberRuleExt;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesPartExt;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
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;
/**
* @Author: wangjie
* @CreateDate: 2019/8/23 1:16 PM
* @Description:
**/
@Service
public class SxNumberRuleCheckAttributeService implements ISxNumberRuleCheckAttributeService {
@Override
public Map<String, Object> doCheckNumberRule(Map<String, Object> map) {
MesNumberRuleExt numberRuleDb = (MesNumberRuleExt) map.get(MesExtConstWords.NUMBER_RULE_EXT);
try {
return doCheck(map, numberRuleDb);
} catch (Exception e) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put(MesExtConstWords.RESULT, false);
return resultMap;
}
}
private Map<String, Object> doCheck(Map<String, Object> map, MesNumberRuleExt numberRuleDb) throws Exception {
Method method = this.getClass().getDeclaredMethod(numberRuleDb.getMethodName(), Map.class, MesNumberRuleExt.class);
method.setAccessible(true);
return (Map<String, Object>) method.invoke(this, map, numberRuleDb);
}
private List<String> getSerialNumberList(String serialNumber, List<String> ruleLengthListStr, List<Integer> ruleLengthList) {
List<String> serialNumberList = new ArrayList<>();
Integer begin = 0;
Integer end;
if (!CollectionUtils.isEmpty(ruleLengthList)) {
for (Integer length : ruleLengthList) {
end = begin + length;
serialNumberList.add(serialNumber.substring(begin, end));
begin = end;
}
} else {
for (String length : ruleLengthListStr) {
if (length.equals(MesExtConstWords.J)) {
String serialFormJStart = serialNumber.substring(begin);
Integer indexOneSpace = serialFormJStart.indexOf(MesExtConstWords.ONE_SPACE);
if (indexOneSpace == -1) {
throw new ImppBusiException();
}
end = begin + indexOneSpace;
serialNumberList.add(serialFormJStart.substring(0, indexOneSpace));
ruleLengthList.add(indexOneSpace);
begin = end;
} else {
end = begin + Integer.valueOf(length);
if (serialNumber.length() < end) {
throw new ImppBusiException();
}
serialNumberList.add(serialNumber.substring(begin, end));
ruleLengthList.add(Integer.valueOf(length));
begin = end;
}
}
}
return serialNumberList;
}
private Map<String, Object> commonCheck(Map<String, Object> map, MesNumberRuleExt numberRuleDb, List<String> dynamicRuleList) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put(MesExtConstWords.RESULT, false);
String serialNumber = (String) map.get(MesExtConstWords.SERIAL_NUMBER);
MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT);
List<String> numberRuleList = Arrays.asList(
numberRuleDb.getNumberRule().replace(MesExtConstWords.LEFT_BRACE, MesExtConstWords.EMPTY).split(MesExtConstWords.RIGHT_BRACE));
numberRuleList = numberRuleList.stream().map(o -> o.toUpperCase()).collect(Collectors.toList());
String ruleLengthSpilt = numberRuleDb.getRuleLengthSpilt();
if (ruleLengthSpilt.contains(MesExtConstWords.P)) {
ruleLengthSpilt = ruleLengthSpilt.replaceAll(MesExtConstWords.P, String.valueOf(partExt.getPartNo().length()));
}
if (ruleLengthSpilt.contains(MesExtConstWords.L)) {
ruleLengthSpilt = ruleLengthSpilt.replaceAll(MesExtConstWords.L, StringUtils.isEmpty(partExt.getPartLotNoLength()) ? "0" : String.valueOf(partExt.getPartLotNoLength()));
}
List<String> ruleLengthListStr = Arrays.asList(ruleLengthSpilt.split(MesExtConstWords.COMMA));
List<Integer> ruleLengthList = new ArrayList<>();
List<String> spiltRuleList = StringUtils.isEmpty(numberRuleDb.getSpiltRule()) ? null :
new ArrayList<>(Arrays.asList(numberRuleDb.getSpiltRule().split(MesExtConstWords.COMMA)));
if (!ruleLengthSpilt.contains(MesExtConstWords.J)) {
ruleLengthList = ruleLengthListStr.stream().map(Integer::valueOf).collect(Collectors.toList());
Integer length = ruleLengthList.stream().reduce(Integer::sum).orElse(0);
if (Integer.valueOf(serialNumber.length()).compareTo(length) != 0) {
return resultMap;
}
}
try {
List<String> serialNumberList = getSerialNumberList(serialNumber, ruleLengthListStr, ruleLengthList);
if (ruleLengthSpilt.contains(MesExtConstWords.J)) {
Integer length = ruleLengthList.stream().reduce(Integer::sum).orElse(0);
if (Integer.valueOf(serialNumber.length()).compareTo(length) != 0) {
return resultMap;
}
}
int snIndex = 0;
for (String s : numberRuleList) {
switch (s) {
case MesExtConstWords.PREFIX_BIG:
if (!serialNumberList.get(0).equals(numberRuleDb.getPrefix()) ||
Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
throw new ImppBusiException();
}
snIndex += ruleLengthList.get(0);
serialNumberList.remove(0);
ruleLengthList.remove(0);
break;
case MesExtConstWords.PARTNO:
if (null == partExt || !serialNumberList.get(0).equals(partExt.getPartNo()) ||
Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
throw new ImppBusiException();
}
snIndex += ruleLengthList.get(0);
serialNumberList.remove(0);
ruleLengthList.remove(0);
break;
case MesExtConstWords.YEAR:
case MesExtConstWords.MONTH_UPPER_CASE:
case MesExtConstWords.DAY_UPPER_CASE:
case MesExtConstWords.HOUR:
case MesExtConstWords.MINUTE:
case MesExtConstWords.SECOND:
//---兼容EP----
case MesExtConstWords.J://日文
case MesExtConstWords.SUPPLIERRULE:
if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
throw new ImppBusiException();
}
snIndex += ruleLengthList.get(0);
serialNumberList.remove(0);
ruleLengthList.remove(0);
break;
case MesExtConstWords.L: //变更号
if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
throw new ImppBusiException();
}
snIndex += ruleLengthList.get(0);
resultMap.put(MesExtConstWords.L, serialNumberList.get(0));
serialNumberList.remove(0);
ruleLengthList.remove(0);
break;
case MesExtConstWords.N: //数量
if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
throw new ImppBusiException();
}
snIndex += ruleLengthList.get(0);
resultMap.put(MesExtConstWords.N, serialNumberList.get(0));
serialNumberList.remove(0);
ruleLengthList.remove(0);
break;
case MesExtConstWords.SERIALNO:
if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
throw new ImppBusiException();
}
resultMap.put(MesExtConstWords.SEQNO, serialNumberList.get(0));
StringBuffer snWithoutSeqNoBuffer = new StringBuffer(serialNumber);
if(resultMap.containsKey(MesExtConstWords.SN_WITHOUT_SEQNO)){
String snWithoutSeqNo = String.valueOf(resultMap.get(MesExtConstWords.SN_WITHOUT_SEQNO));
snWithoutSeqNoBuffer = new StringBuffer(snWithoutSeqNo);
}
resultMap.put(MesExtConstWords.SN_WITHOUT_SEQNO, snWithoutSeqNoBuffer.replace(snIndex, snIndex + ruleLengthList.get(0), MesExtConstWords.SEQNO));
snIndex += ruleLengthList.get(0);
serialNumberList.remove(0);
ruleLengthList.remove(0);
break;
case MesExtConstWords.SERIALNO2:
if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
throw new ImppBusiException();
}
snIndex += ruleLengthList.get(0);
resultMap.put(MesExtConstWords.SEQNO2, serialNumberList.get(0));
if(resultMap.containsKey(MesExtConstWords.SN_WITHOUT_SEQNO)){
String snWithoutSeqNo = String.valueOf(resultMap.get(MesExtConstWords.SN_WITHOUT_SEQNO));
resultMap.put(MesExtConstWords.SN_WITHOUT_SEQNO, snWithoutSeqNo.replaceFirst(serialNumberList.get(0), MesExtConstWords.SEQNO2));
}else{
resultMap.put(MesExtConstWords.SN_WITHOUT_SEQNO, serialNumber.replaceFirst(serialNumberList.get(0), MesExtConstWords.SEQNO2));
}
serialNumberList.remove(0);
ruleLengthList.remove(0);
break;
//---兼容EP----
case MesExtConstWords.SPILTRULE:
//配置空格使用"/u0020"
if (CollectionUtils.isEmpty(spiltRuleList) || !serialNumberList.get(0).equals(spiltRuleList.get(0)) ||
Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
throw new ImppBusiException();
}
snIndex += ruleLengthList.get(0);
serialNumberList.remove(0);
ruleLengthList.remove(0);
spiltRuleList.remove(0);
break;
case MesExtConstWords.DYNAMICRULE:
if (CollectionUtils.isEmpty(dynamicRuleList) || !serialNumberList.get(0).equals(dynamicRuleList.get(0)) ||
Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
throw new ImppBusiException();
}
snIndex += ruleLengthList.get(0);
serialNumberList.remove(0);
ruleLengthList.remove(0);
dynamicRuleList.remove(0);
break;
default:
throw new ImppBusiException();
}
}
} catch (ImppBusiException e) {
return resultMap;
}
resultMap.put(MesExtConstWords.RESULT, true);
return resultMap;
}
/**
* ,
*
*/
private Map<String, Object> method1(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT);
List<String> dynamicRuleList = new ArrayList<>();
dynamicRuleList.add(partExt.getIdentifyCode());
dynamicRuleList.add(partExt.getSnLastCode());
return commonCheck(map, numberRuleDb, dynamicRuleList);
}
/**
*
* 使
* :
* :10使O,11使N,12使D
*
*/
private Map<String, Object> method2(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT);
List<String> dynamicRuleList = new ArrayList<>();
dynamicRuleList.add(partExt.getColorCode());
return commonCheck(map, numberRuleDb, dynamicRuleList);
}
/**
*
* 使
* :
*
*/
private Map<String, Object> method3(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT);
List<String> dynamicRuleList = new ArrayList<>();
dynamicRuleList.add(partExt.getIdentifyCode());
return commonCheck(map, numberRuleDb, dynamicRuleList);
}
/**
*
* 使
*
*/
private Map<String, Object> method4(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
return method3(map, numberRuleDb);
}
/**
*
* 使
* :
* :10使O,11使N,12使D
*
*/
private Map<String, Object> method5(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
return method2(map, numberRuleDb);
}
/**
*
* 使
* :
* :10使O,11使N,12使D
*
*/
private Map<String, Object> method6(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
return method3(map, numberRuleDb);
}
/**
*
*/
private Map<String, Object> epmethod1(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
return commonCheck(map, numberRuleDb, null);
}
/**
*
*/
private Map<String, Object> jxmethod1(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
return commonCheck(map, numberRuleDb, null);
}
}

@ -16,6 +16,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Map;
@ -36,6 +37,9 @@ public class SxPartExtService implements ISxPartExtService {
@Override
public MesPartExt getPartExtByPartNo(String organizeCode, String partNo) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(partNo)) return null;
return partExtRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PART_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), partNo});

@ -0,0 +1,34 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxProduceSnService;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pojo.repository.MesProduceSnExtRepository;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.i3plus.platform.common.util.MesConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @PROJECT_NAME: i3plus-mes-panasonic-jx
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2023-11-29 11:39
*/
@Service
public class JxProduceSnService implements IJxProduceSnService {
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Override
public MesProduceSnExt getProduceSn(String organizeCode, String productSn) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn)) return null;
return produceSnExtRepository.getByProperty(
new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID, MesExtConstWords.PRODUCT_SN},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn});
}
}

@ -242,7 +242,7 @@ public class SxReworkOrderBindSnExcelService implements IExcelImportExtService {
} else if (StringUtils.isEmpty(produceSnRepairBySn.getOutWorkCenterTime())) {
errorNum ++;
cellNum += "B;";
errorInfo += "条码["+ produceSnExt.getProductSn() +"]已经绑定过其他的返工工单["+ workOrderNo +"]且未下线;";
errorInfo += "条码["+ produceSnExt.getProductSn() +"]已经绑定过其他的返工工单["+ produceSnExt.getLastWorkOrderNo() +"]且未下线;";
}
}
}
@ -256,6 +256,7 @@ public class SxReworkOrderBindSnExcelService implements IExcelImportExtService {
MesPackageExt packageExt = packageExtService.getPackageByPackNo(organizeCode, packageDetail.getPackageNo());
if (null != packageExt) {
packageNo = packageExt.getPackageNo();
packageExtDbList.add(packageExt);
}
}
}

@ -176,8 +176,12 @@ public class SxReworkOrderBindZjSnExcelService implements IExcelImportExtService
partMap.put(workOrderExt.getPartNo(), partExt);
// 组件
if (!StringUtils.isEmpty(partExt.getCategoryCode3()) && partExt.getCategoryCode3().equals("10")) {
if (StringUtils.isEmpty(partExt.getCategoryCode3())) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据工单[" + workOrderNo + "]关联物料["+ workOrderExt.getPartNo() +"]未维护物料分类3,无法确定为成品或是组件;";
} else if (partExt.getCategoryCode3().equals("10")) {
// 10 则为成品
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据工单[" + workOrderNo + "]关联物料["+ workOrderExt.getPartNo() +"]不为组件;";

@ -26,6 +26,7 @@ import java.io.Serializable;
@Table(name = "MES_PRODUCE_SN_REPAIR", indexes = {
@Index(columnList = "WORK_ORDER_NO"),
@Index(columnList = "SERIAL_NUMBER"),
@Index(columnList = "PRODUCT_SN"),
@Index(columnList = "SERIAL_NUMBER,WORK_ORDER_NO"),
@Index(columnList = "WORK_ORDER_NO, WORK_TIME, SHIFT_CODE")
})

@ -1,9 +1,12 @@
package cn.estsh.i3plus.ext.mes.pojo.model;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesPartExt;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.util.List;
/**
* @author yumingxing
* @version 1.0
@ -58,4 +61,22 @@ public class GenerateWorkOrderDto {
@ApiParam("Erp库存地")
private String erpWarehouse;
@ApiParam("产品条码起始")
private String productSnStart;
@ApiParam("产品条码截至")
private String productSnEnd;
@ApiParam("工厂代码")
private String organizeCode;
@ApiParam("操作人")
private String userInfo;
@ApiParam
private MesPartExt partExt;
@ApiParam
private List<String> packSnList;
}

@ -904,4 +904,47 @@ public class MesExtConstWords {
//节拍限制值配置
public static final String SX_WORK_CELL_TAKT_LIMIT_CFG = "SX_WORK_CELL_TAKT_LIMIT_CFG";
public static final String NUMBER_RULE_EXT = "NUMBER_RULE_EXT";
//前缀
public static final String PREFIX_BIG = "PREFIX";
//物料号
public static final String PARTNO = "PARTNO";
//年
public static final String YEAR = "YEAR";
//月
public static final String MONTH_UPPER_CASE = "MONTH";
//日
public static final String DAY_UPPER_CASE = "DAY";
//时
public static final String HOUR = "HOUR";
//分
public static final String MINUTE = "MINUTE";
//秒
public static final String SECOND = "SECOND";
//日文
public static final String J = "J";
//物料号长度代号P
public static final String P = "P";
//变更号长度代号L
public static final String L = "L";
//数量代号
public static final String N = "N";
//供应商码
public static final String SUPPLIERRULE = "SUPPLIERRULE";
//流水号
public static final String SERIALNO = "SERIALNO";
public static final String SERIALNO2 = "SERIALNO2";
public static final String SEQNO = "SEQNO";
public static final String SEQNO2 = "SEQNO2";
//不携带流水号
public static final String SN_WITHOUT_SEQNO = "SN_WITHOUT_SEQNO";
//固定拼接字符
public static final String SPILTRULE = "SPILTRULE";
//动态拼接字符
public static final String DYNAMICRULE = "DYNAMICRULE";
//PART
public static final String PART_EXT = "PART_EXT";
public static final String LEFT_BRACE = "{";
public static final String RIGHT_BRACE = "}";
}

Loading…
Cancel
Save