裁片原材料防错

tags/yfai-pcn-ext-v2.3
yxw 8 months ago
parent 6537f792ef
commit a8db4e761c

@ -0,0 +1,31 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutRawErrorProofingModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutUpdateRawLengthModel;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCutMaterial;
import io.swagger.annotations.ApiOperation;
/**
* @Description :
* @Reference :
* @Author :
* @CreateDate : 2024-04-26 15:37
* @Modify:
**/
public interface IMesCutRawErrorProofingService {
@ApiOperation(value = "扫描裁片工单或条码(第一次扫工单,第二次扫条码)")
MesCutRawErrorProofingModel doScanSn(MesCutRawErrorProofingModel model);
@ApiOperation(value = "展示原材料信息")
ListPager<MesWorkOrderCutMaterial> queryWorkOrderMaterialByPager(String cutWorkOrderNo, String organizeCode, Pager pager);
@ApiOperation(value = "查询条码长度")
MesCutUpdateRawLengthModel queryLengthBySn(MesCutRawErrorProofingModel model);
@ApiOperation(value = "修改条码长度")
void doUpdateLengthByScanSn(MesCutUpdateRawLengthModel model);
}

@ -0,0 +1,82 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesCutRawErrorProofingService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutRawErrorProofingModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutUpdateRawLengthModel;
import cn.estsh.i3plus.pojo.base.common.Pager;
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 io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description:
* @Author: gsz
* @Date: 2024/5/25 18:16
* @Modify:
*/
@RestController
@RequestMapping(MesCommonConstant.MES_YANFEN + "/cut-raw-error-proofing")
public class MesCutRawErrorProofingController {
@Autowired
private IMesCutRawErrorProofingService cutRawErrorProofingService;
@PostMapping("/scan-sn")
@ApiOperation(value = "扫描裁片工单/原材料条码")
public ResultBean doScanSn(MesCutRawErrorProofingModel model) {
try {
return ResultBean.success("扫描成功").setResultObject(cutRawErrorProofingService.doScanSn(model));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@GetMapping("/query-work-order-cut-material-by-pager")
@ApiOperation(value = "展示原材料信息")
public ResultBean queryWorkOrderMaterialByPager(String cutWorkOrderNo, String organizeCode, Pager pager) {
try {
return ResultBean.success("查询成功")
.setListPager(cutRawErrorProofingService.queryWorkOrderMaterialByPager(cutWorkOrderNo, organizeCode, pager));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@GetMapping("/query-length-by-sn")
@ApiOperation(value = "查询条码长度")
public ResultBean queryLengthByScanSn(MesCutRawErrorProofingModel model) {
try {
return ResultBean.success("查询成功").setResultObject(cutRawErrorProofingService.queryLengthBySn(model));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PostMapping("/update-raw-length")
@ApiOperation(value = "修改原材料条码长度")
public ResultBean doUpdateLengthByScanSn(MesCutUpdateRawLengthModel model) {
try {
cutRawErrorProofingService.doUpdateLengthByScanSn(model);
return ResultBean.success("保存成功");
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -0,0 +1,201 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesCutRawErrorProofingService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutRawErrorProofingModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesCutUpdateRawLengthModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.common.PagerHelper;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesMaterialSn;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCut;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCutMaterial;
import cn.estsh.i3plus.pojo.mes.repository.MesMaterialSnRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutMaterialRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
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.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @PROJECT_NAME: i3plus-mes-yfai
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2024-09-04 9:54
*/
@Service
public class MesCutRawErrorProofingService implements IMesCutRawErrorProofingService {
public static final int CUR_SCAN_TYPE_BY_ORDER_SN = 1;
public static final int CUR_SCAN_TYPE_BY_RAW_SN = 2;
@Autowired
private MesWorkOrderCutRepository workOrderCutRepository;
@Autowired
private MesWorkOrderCutMaterialRepository workOrderCutMaterialRepository;
@Autowired
private MesMaterialSnRepository materialSnRepository;
@Override
public MesCutRawErrorProofingModel doScanSn(MesCutRawErrorProofingModel model) {
MesCutRawErrorProofingModel result = new MesCutRawErrorProofingModel();
result.setCutWorkOrderNo(model.getCutWorkOrderNo());
// 为 1 则为裁片工单码
if (model.getCurScanType() == null || model.getCurScanType() == CUR_SCAN_TYPE_BY_ORDER_SN) {
MesWorkOrderCut workOrderCutDb = getMesWorkOrderCut(model);
if (workOrderCutDb == null) MesPcnException.throwMesBusiException("裁片工单【%s】不存在", model.getSn());
if (workOrderCutDb.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue()) MesPcnException.throwMesBusiException("裁片工单【%s】状态不为【%s】", model.getSn(), MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue());
result.setCurScanType(CUR_SCAN_TYPE_BY_RAW_SN);
result.setCutWorkOrderNo(workOrderCutDb.getCutWorkOrderNo());
result.setIsRedirect(CommonEnumUtil.FALSE);
} else {
// 校验条码有效性
String[] valueArray = model.getSn().split("\\|");
int valueLength = valueArray.length;
if (valueLength < 5) MesPcnException.throwMesBusiException("条码【%s】长度少于5", model.getSn());
if (valueLength > 9) MesPcnException.throwMesBusiException("条码【%s】长度超出9", model.getSn());
List<MesWorkOrderCutMaterial> workOrderCutMaterialList = getWorkOrderCutMaterialList(model);
Map<String, MesWorkOrderCutMaterial> workOrderCutMaterialMap = workOrderCutMaterialList.stream()
.collect(Collectors.toMap(MesWorkOrderCutMaterial::getPartNo, Function.identity(), (x, y) -> y));
// 物料编码
String partNo = valueArray[3];
// 原材料长度
String lengthStr = valueArray[4];
Double length;
if (!workOrderCutMaterialMap.containsKey(partNo)) MesPcnException.throwMesBusiException("扫描条码【%s】物料【%s】不在裁片方案原材料中", model.getSn(), partNo);
// 为 2 则为条码
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getSn(), MesPcnExtConstWords.SN, packBean);
MesMaterialSn materialSnDb = materialSnRepository.getByProperty(packBean);
MesWorkOrderCutMaterial workOrderCutMaterial = workOrderCutMaterialMap.get(partNo);
if (materialSnDb != null) {
if (materialSnDb.getSurplusLength() == 0) MesPcnException.throwMesBusiException("条码【%s】已无剩余长度", model.getSn());
length = materialSnDb.getSurplusLength();
ConvertBean.serviceModelUpdate(materialSnDb, model.getUserName());
} else {
length = Double.parseDouble(lengthStr);
materialSnDb = new MesMaterialSn();
ConvertBean.serviceModelInitialize(materialSnDb, model.getUserName());
materialSnDb.setOrganizeCode(model.getOrganizeCode());
materialSnDb.setSn(model.getSn());
materialSnDb.setPartNo(partNo);
materialSnDb.setLength(length);
materialSnDb.setSurplusLength(length);
}
// 已扫描长度
Double useLength = workOrderCutMaterial.getScanLength();
if (useLength.compareTo(length) > 0) {
materialSnDb.setSurplusLength(0.0);
workOrderCutMaterial.setScanLength(workOrderCutMaterial.getScanLength() + length);
result.setIsRedirect(CommonEnumUtil.FALSE);
result.setShowInfo("长度不足,请继续扫描条码");
} else {
materialSnDb.setSurplusLength(length - useLength);
// 已满足扫描总长度 修改工单状态为已校验原材料
DdlPackBean packBean1 = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getCutWorkOrderNo(), MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean);
MesWorkOrderCut workOrderCut = workOrderCutRepository.getByProperty(packBean1);
workOrderCut.setWorkOrderStatus(MesExtEnumUtil.CUT_ORDER_STATUS.CHECKED_RAW.getValue());
ConvertBean.serviceModelUpdate(workOrderCut, model.getUserName());
workOrderCutRepository.save(workOrderCut);
workOrderCutMaterial.setScanLength(workOrderCutMaterial.getMaterialDosage());
result.setIsRedirect(CommonEnumUtil.VALID);
}
ConvertBean.serviceModelUpdate(workOrderCutMaterial, model.getUserName());
workOrderCutMaterialRepository.save(workOrderCutMaterial);
ConvertBean.serviceModelUpdate(materialSnDb, model.getUserName());
materialSnRepository.save(materialSnDb);
}
return result;
}
@Override
public ListPager<MesWorkOrderCutMaterial> queryWorkOrderMaterialByPager(String cutWorkOrderNo, String organizeCode, Pager pager) {
if (StringUtils.isEmpty(cutWorkOrderNo)) return new ListPager<>(new ArrayList<>(), pager);
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(cutWorkOrderNo, MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean);
pager = PagerHelper.getPager(pager, workOrderCutMaterialRepository.findByHqlWhereCount(packBean));
return new ListPager(workOrderCutMaterialRepository.findByHqlPage(packBean, pager), pager);
}
@Override
public MesCutUpdateRawLengthModel queryLengthBySn(MesCutRawErrorProofingModel model) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getSn(), MesPcnExtConstWords.SN, packBean);
MesMaterialSn materialSnDb = materialSnRepository.getByProperty(packBean);
MesCutUpdateRawLengthModel result = new MesCutUpdateRawLengthModel();
BeanUtils.copyProperties(materialSnDb, result);
return result;
}
@Override
public void doUpdateLengthByScanSn(MesCutUpdateRawLengthModel model) {
if (StringUtils.isEmpty(model.getSn())) return;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getSn(), MesPcnExtConstWords.SN, packBean);
MesMaterialSn materialSnDb = materialSnRepository.getByProperty(packBean);
if (materialSnDb == null) MesPcnException.throwMesBusiException("条码【%s】不存在", model.getSn());
if (materialSnDb.getSurplusLength() < model.getSubLength()) MesPcnException.throwMesBusiException("条码【%s】减去长度【%s】大于剩余长度", materialSnDb.getSurplusLength(), model.getSubLength());
materialSnDb.setSurplusLength(materialSnDb.getSurplusLength() - model.getSubLength());
ConvertBean.serviceModelUpdate(materialSnDb, model.getUserName());
materialSnRepository.save(materialSnDb);
}
private List<MesWorkOrderCutMaterial> getWorkOrderCutMaterialList(MesCutRawErrorProofingModel model) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getCutWorkOrderNo(), MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean);
return workOrderCutMaterialRepository.findByHqlWhere(packBean);
}
private MesWorkOrderCut getMesWorkOrderCut(MesCutRawErrorProofingModel model) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getSn(), MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean);
return workOrderCutRepository.getByProperty(packBean);
}
}

@ -0,0 +1,30 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import io.swagger.annotations.ApiParam;
import lombok.Data;
@Data
public class MesCutRawErrorProofingModel {
@ApiParam("裁片工单号")
private String cutWorkOrderNo;
@ApiParam("当前扫描类型1-工单2-条码")
private Integer curScanType;
@ApiParam("当前扫描条码")
private String sn;
@ApiParam("是否跳转页面")
private Integer isRedirect;
@ApiParam("工厂代码")
private String organizeCode;
@ApiParam("操作人")
private String userName;
@ApiParam("提示信息")
private String showInfo;
}

@ -0,0 +1,32 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import io.swagger.annotations.ApiParam;
import lombok.Data;
@Data
public class MesCutUpdateRawLengthModel {
@ApiParam("裁片工单号")
private String cutWorkOrderNo;
@ApiParam("条码")
private String sn;
@ApiParam("物料号")
private String partNo;
@ApiParam("剩余长度")
private Double surplusLength;
@ApiParam("减去长度")
private Double subLength;
@ApiParam("修改原因")
private String modifyReason;
@ApiParam("操作人")
private String userName;
@ApiParam("工厂代码")
private String organizeCode;
}
Loading…
Cancel
Save