加料防错功能开发

tags/yfai-pcn-ext-v1.0
jun 1 year ago
parent a16c50d568
commit 6cb853902e

@ -0,0 +1,58 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesRawPartChargingService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesRawPartChargingModel;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/30 14:38
* @Modify:
**/
@RestController
@RequestMapping(MesCommonConstant.MES_YANFEN + "/mesRawPartCharging")
public class MesRawPartChargingController {
@Autowired
private IMesRawPartChargingService mesRawPartChargingService;
@GetMapping("/findMesRawPackagePart")
@ApiOperation(value = "原材料容器零件关系")
public ResultBean findMesRawPackagePart(MesRawPartChargingModel mesRawPartChargingModel) {
try {
ValidatorBean.checkNotNull(mesRawPartChargingModel.getPackageSn(),"料筒条码不能为空");
mesRawPartChargingModel.setUserName(AuthUtil.getSessionUser().getUserName());
mesRawPartChargingModel.setOrganizeCode(AuthUtil.getOrganizeCode());
return ResultBean.success("执行成功").setResultObject(mesRawPartChargingService.findMesRawPackagePart(mesRawPartChargingModel));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PostMapping("/doAction")
@ApiOperation(value = "操作")
public ResultBean doAction(@RequestBody MesRawPartChargingModel mesRawPartChargingModel) {
try {
ValidatorBean.checkNotNull(mesRawPartChargingModel.getType(), "操作类型不能为空");
mesRawPartChargingModel.setUserName(AuthUtil.getSessionUser().getUserName());
mesRawPartChargingModel.setOrganizeCode(AuthUtil.getOrganizeCode());
return ResultBean.success("执行成功").setResultObject(mesRawPartChargingService.doAction(mesRawPartChargingModel));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -0,0 +1,264 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesRawPartChargingService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesRawPackageModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesRawPartChargingModel;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
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.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/30 12:20
* @Modify:
**/
@Service
@Slf4j
public class MesRawPartChargingServiceImpl implements IMesRawPartChargingService {
@Autowired
private MesRawPackageRepository mesRawPackageRepository;
@Autowired
private MesRawPackageDetailRepository mesRawPackageDetailRepository;
@Autowired
private MesRawPackagePartRepository mesRawPackagePartRepository;
@Autowired
private MesRawPartChargingRepository mesRawPartChargingRepository;
@Autowired
private MesRawPartChargingLogRepository mesRawPartChargingLogRepository;
@Autowired
private MesPartSapRepository mesPartSapRDao;
@Autowired
private MesProduceSnRepository mesProduceSnRDao;
@Override
public MesRawPartChargingModel findMesRawPackagePart(MesRawPartChargingModel mesRawPartChargingModel) {
MesRawPackageModel mesRawPackageDetailModel = new MesRawPackageModel();
//原材料容器明细
MesRawPackageDetail packageDetail = getMesRawPackageDetail(mesRawPartChargingModel);
//原材料容器
mesRawPackageDetailModel.setMesRawPackage(getRawPackage(mesRawPartChargingModel, packageDetail));
mesRawPackageDetailModel.setMesRawPackageDetail(packageDetail);
//原材料容器零件关系表
mesRawPackageDetailModel.setMesRawPackagePartList(getMesRawPackagePartList(mesRawPartChargingModel, packageDetail));
mesRawPartChargingModel.setMesRawPackageModel(mesRawPackageDetailModel);
return mesRawPartChargingModel;
}
@Override
public MesRawPartChargingModel doAction(MesRawPartChargingModel mesRawPartChargingModel) {
//10扫描原料条码 20提交 30初始化料筒
switch (mesRawPartChargingModel.getType()) {
case 10:
doScanSn(mesRawPartChargingModel);
break;
case 20:
doSubmit(mesRawPartChargingModel);
break;
case 30:
doMesRawPartChargingInit(mesRawPartChargingModel);
break;
default:
MesPcnException.throwMesBusiException("扫描类型【%s】不存在", mesRawPartChargingModel.getType());
break;
}
return mesRawPartChargingModel;
}
public void doScanSn(MesRawPartChargingModel mesRawPartChargingModel) {
//属性校验
checkNotNull(mesRawPartChargingModel);
ValidatorBean.checkNotNull(mesRawPartChargingModel.getMesRawPackagePart(), "原材料容器零件关系不能为空");
ValidatorBean.checkNotNull(mesRawPartChargingModel.getSn(), "原料条码不能为空");
//校验是否已扫描
List<MesRawPartCharging> mesRawPartCharging = findMesRawPartCharging(mesRawPartChargingModel);
if (!CollectionUtils.isEmpty(mesRawPartCharging)) {
MesPcnException.throwMesBusiException("料筒条码【%s】与原料条码【%s】已绑定", mesRawPartChargingModel.getPackageSn(), mesRawPartCharging.iterator().next().getSn());
}
if (Objects.isNull(MesExtEnumUtil.RAW_SCAN_TYPE.valueOfDescription(mesRawPartChargingModel.getMesRawPackagePart().getScanType()))) {
MesPcnException.throwMesBusiException("料筒条码【%s】物料【%s】扫描类型信息不存在", mesRawPartChargingModel.getPackageSn(), mesRawPartChargingModel.getMesRawPackagePart().getPartNo());
}
//自制件
if (MesExtEnumUtil.RAW_SCAN_TYPE.HOMEMADE_SN.getValue() == mesRawPartChargingModel.getMesRawPackagePart().getScanType()) {
checkHomeMadeSn(mesRawPartChargingModel);
//非自制件
} else {
checkHomeRuleSn(mesRawPartChargingModel);
}
}
public void doSubmit(MesRawPartChargingModel mesRawPartChargingModel) {
//属性校验
checkNotNull(mesRawPartChargingModel);
ValidatorBean.checkNotNull(mesRawPartChargingModel.getMesRawPackagePart(), "原材料容器零件关系不能为空");
ValidatorBean.checkNotNull(mesRawPartChargingModel.getSn(), "原料条码不能为空");
ValidatorBean.checkNotNull(mesRawPartChargingModel.getLotNo(), "批次号不能为空");
//保存生产控制加料
MesRawPartCharging charging = insertRawPartCharging(mesRawPartChargingModel);
//保存日志
saveLog(mesRawPartChargingModel, charging.getId(), MesExtEnumUtil.CHARGING_LOG_STATUS.FEEDING);
}
public void doMesRawPartChargingInit(MesRawPartChargingModel mesRawPartChargingModel) {
//属性校验
checkNotNull(mesRawPartChargingModel);
List<MesRawPartCharging> mesRawPartChargingList = findMesRawPartCharging(mesRawPartChargingModel);
if(CollectionUtils.isEmpty(mesRawPartChargingList)){
MesPcnException.throwMesBusiException("料筒条码【%s】未绑定无需初始化", mesRawPartChargingModel.getPackageSn());
}
//删除绑定信息
mesRawPartChargingRepository.deleteWeaklyByIds((Long[]) mesRawPartChargingList.stream().map(MesRawPartCharging::getId).toArray(), mesRawPartChargingModel.getUserName());
//保存日志
for (MesRawPartCharging mesRawPartCharging : mesRawPartChargingList) {
saveLog(mesRawPartChargingModel, mesRawPartCharging.getId(), MesExtEnumUtil.CHARGING_LOG_STATUS.CLEAR);
}
}
private List<MesRawPackagePart> getMesRawPackagePartList(MesRawPartChargingModel mesRawPartChargingModel, MesRawPackageDetail packageDetail) {
DdlPackBean packBean;
packBean = DdlPackBean.getDdlPackBean(mesRawPartChargingModel.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(packageDetail.getId(), "packageDetailId", packBean);
List<MesRawPackagePart> packagePartList = mesRawPackagePartRepository.findByHqlWhere(packBean);
if (CollectionUtils.isEmpty(packagePartList)) {
MesPcnException.throwMesBusiException("料筒条码【%s】原材料容器零件关系未维护", mesRawPartChargingModel.getPackageSn());
}
//查询物料名称
Map<String, MesPartSap> partSapMap = getMesPartSapMap(mesRawPartChargingModel, packagePartList);
for (MesRawPackagePart mesRawPackagePart : packagePartList) {
if (!Objects.isNull(partSapMap) && partSapMap.containsKey(mesRawPackagePart.getPartNo())) {
mesRawPackagePart.setPartName(partSapMap.get(mesRawPackagePart.getPartNo()).getPartName());
}
}
return packagePartList;
}
private Map<String, MesPartSap> getMesPartSapMap(MesRawPartChargingModel mesRawPartChargingModel, List<MesRawPackagePart> packagePartList) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesRawPartChargingModel.getOrganizeCode());
DdlPreparedPack.getInPackList(packagePartList.stream().map(MesRawPackagePart::getPartNo).collect(Collectors.toList()), "partNo", packBean);
List<MesPartSap> partSapList = mesPartSapRDao.findByHqlWhere(packBean);
Map<String, MesPartSap> partSapMap = null;
if (!CollectionUtils.isEmpty(partSapList)) {
partSapMap = partSapList.stream().collect(Collectors.toMap(MesPartSap::getPartNo, t -> t));
}
return partSapMap;
}
private MesRawPackage getRawPackage(MesRawPartChargingModel mesRawPartChargingModel, MesRawPackageDetail packageDetail) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesRawPartChargingModel.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(packageDetail.getPid(), "id", packBean);
MesRawPackage mesRawPackage = mesRawPackageRepository.getByProperty(packBean);
if (Objects.isNull(mesRawPackage)) {
MesPcnException.throwMesBusiException("料筒条码【%s】信息不存在", mesRawPartChargingModel.getPackageSn());
}
return mesRawPackage;
}
private MesRawPackageDetail getMesRawPackageDetail(MesRawPartChargingModel mesRawPartChargingModel) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesRawPartChargingModel.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesRawPartChargingModel.getPackageSn(), "packageSn", packBean);
MesRawPackageDetail packageDetail = mesRawPackageDetailRepository.getByProperty(packBean);
if (Objects.isNull(packageDetail)) {
MesPcnException.throwMesBusiException("料筒条码【%s】信息不存在", mesRawPartChargingModel.getPackageSn());
}
return packageDetail;
}
private List<MesRawPartCharging> findMesRawPartCharging(MesRawPartChargingModel mesRawPartChargingModel) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesRawPartChargingModel.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(mesRawPartChargingModel.getMesRawPackageModel().getMesRawPackageDetail().getId(), "packageDetailId", packBean);
return mesRawPartChargingRepository.findByHqlWhere(packBean);
}
private void checkHomeMadeSn(MesRawPartChargingModel mesRawPartChargingModel) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesRawPartChargingModel.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesRawPartChargingModel.getSn(), "productSn", packBean);
MesProduceSn produceSn = mesProduceSnRDao.getByProperty(packBean);
if (Objects.isNull(produceSn)) {
MesPcnException.throwMesBusiException("自制件条码【%s】信息不存在", mesRawPartChargingModel.getSn());
}
if (!mesRawPartChargingModel.getMesRawPackagePart().getPartNo().equals(produceSn.getPartNo())) {
MesPcnException.throwMesBusiException("自制件条码【%s】物料【%s】与选择物料【%s】物料号不匹配", mesRawPartChargingModel.getSn(), produceSn.getPartNo(), mesRawPartChargingModel.getMesRawPackagePart().getPartNo());
}
mesRawPartChargingModel.setMesProduceSn(produceSn);
}
private void checkHomeRuleSn(MesRawPartChargingModel mesRawPartChargingModel) {
if (StringUtils.isEmpty(mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule())) {
MesPcnException.throwMesBusiException("非自制件,条码规则未维护", mesRawPartChargingModel.getMesRawPackagePart().getPartNo());
}
if (!mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule().contains("*") && !mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule().equals(mesRawPartChargingModel.getSn())) {
MesPcnException.throwMesBusiException("原料条码【%s】校验条码规则【%s】失败", mesRawPartChargingModel.getSn(), mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule());
} else if (mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule().startsWith("*") && mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule().endsWith("*") && !mesRawPartChargingModel.getSn().contains(mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule().replace("*", ""))) {
MesPcnException.throwMesBusiException("原料条码【%s】校验条码规则【%s】失败", mesRawPartChargingModel.getSn(), mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule());
} else if (mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule().startsWith("*") && !mesRawPartChargingModel.getSn().endsWith(mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule().replace("*", ""))) {
MesPcnException.throwMesBusiException("原料条码【%s】校验条码规则【%s】失败", mesRawPartChargingModel.getSn(), mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule());
} else if (mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule().endsWith("*") && !mesRawPartChargingModel.getSn().startsWith(mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule().replace("*", ""))) {
MesPcnException.throwMesBusiException("原料条码【%s】校验条码规则【%s】失败", mesRawPartChargingModel.getSn(), mesRawPartChargingModel.getMesRawPackagePart().getBarcodeRule());
}
}
private MesRawPartCharging insertRawPartCharging(MesRawPartChargingModel mesRawPartChargingModel) {
MesRawPartCharging mesRawPartCharging = new MesRawPartCharging();
mesRawPartCharging.setOrganizeCode(mesRawPartChargingModel.getOrganizeCode());
mesRawPartCharging.setPackageDetailId(mesRawPartChargingModel.getMesRawPackageModel().getMesRawPackageDetail().getId());
mesRawPartCharging.setParentPackageDetailId(mesRawPartChargingModel.getMesRawPackageModel().getMesRawPackageDetail().getId());
mesRawPartCharging.setPackagePartId(mesRawPartChargingModel.getMesRawPackagePart().getId());
mesRawPartCharging.setEquipmentCode(mesRawPartChargingModel.getMesRawPackageModel().getMesRawPackageDetail().getEquipCode());
mesRawPartCharging.setPartNo(mesRawPartChargingModel.getMesRawPackagePart().getPartNo());
mesRawPartCharging.setSn(mesRawPartChargingModel.getSn());
mesRawPartCharging.setUnit(mesRawPartChargingModel.getMesRawPackagePart().getUnit());
if (!Objects.isNull(mesRawPartChargingModel.getMesProduceSn())) {
mesRawPartCharging.setQty(mesRawPartChargingModel.getMesProduceSn().getQty());
} else {
mesRawPartCharging.setQty(mesRawPartChargingModel.getMesRawPackagePart().getQty());
}
mesRawPartCharging.setLoadPartTime(TimeTool.getNowTime(true));
mesRawPartCharging.setLotNo(mesRawPartChargingModel.getLotNo());
mesRawPartCharging.setParentPackageSn(mesRawPartChargingModel.getPackageSn());
mesRawPartCharging.setPackageId(mesRawPartChargingModel.getMesRawPackageModel().getMesRawPackage().getId());
ConvertBean.serviceModelInitialize(mesRawPartCharging, mesRawPartChargingModel.getUserName());
return mesRawPartChargingRepository.insert(mesRawPartCharging);
}
private void saveLog(MesRawPartChargingModel mesRawPartChargingModel, Long id, MesExtEnumUtil.CHARGING_LOG_STATUS status) {
MesRawPartChargingLog mesRawPartChargingLog = new MesRawPartChargingLog();
BeanUtils.copyProperties(mesRawPartChargingModel, mesRawPartChargingLog);
mesRawPartChargingLog.setCharingId(id);
mesRawPartChargingLog.setPackageSn(mesRawPartChargingModel.getPackageSn());
mesRawPartChargingLog.setPackageName(mesRawPartChargingModel.getMesRawPackageModel().getMesRawPackage().getName());
mesRawPartChargingLog.setStatus(status.getValue());
mesRawPartChargingLogRepository.insert(mesRawPartChargingLog);
}
private void checkNotNull(MesRawPartChargingModel mesRawPartChargingModel) {
ValidatorBean.checkNotNull(mesRawPartChargingModel.getPackageSn(), "料筒条码不能为空");
ValidatorBean.checkNotNull(mesRawPartChargingModel.getMesRawPackageModel(), "原材料容器不能为空");
}
}

@ -0,0 +1,29 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import cn.estsh.i3plus.pojo.mes.bean.MesRawPackage;
import cn.estsh.i3plus.pojo.mes.bean.MesRawPackageDetail;
import cn.estsh.i3plus.pojo.mes.bean.MesRawPackagePart;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.util.List;
/**
* @Description : Model
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/30 11:40
* @Modify:
**/
@Data
public class MesRawPackageModel {
@ApiParam("原材料容器")
private MesRawPackage mesRawPackage;
@ApiParam("原材料容器明细")
private MesRawPackageDetail mesRawPackageDetail;
@ApiParam("原材料容器零件关系表")
private List<MesRawPackagePart> mesRawPackagePartList;
}

@ -0,0 +1,44 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesRawPackagePart;
import io.swagger.annotations.ApiParam;
import lombok.Data;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/30 11:40
* @Modify:
**/
@Data
public class MesRawPartChargingModel {
@ApiParam("操作人")
private String userName;
@ApiParam("工厂代码")
private String organizeCode;
@ApiParam("料筒条码")
private String packageSn;
@ApiParam("原料条码")
private String sn;
@ApiParam("批次号")
private String lotNo;
@ApiParam("操作类型")
private Integer type;
@ApiParam("原材料容器")
private MesRawPackageModel mesRawPackageModel;
@ApiParam("原材料容器零件关系")
private MesRawPackagePart mesRawPackagePart;
@ApiParam("产品条码")
private MesProduceSn mesProduceSn;
}
Loading…
Cancel
Save