forked from I3-YF/i3plus-mes-pcn-yfai
裁片原材料防错
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,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…
Reference in New Issue