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