forked from I3-YF/i3plus-mes-yfai
裁片功能主数据表
parent
b69151daa1
commit
92b6b1be41
@ -0,0 +1,12 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.api.base;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesCutScheme;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description:
|
||||||
|
* @CreateDate 2024/04/16
|
||||||
|
* @Author mingliang.li
|
||||||
|
*/
|
||||||
|
public interface IMesCutSchemeService extends IBaseMesService<MesCutScheme> {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.apiservice.controller.base;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesCutScheme;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 裁片工单
|
||||||
|
*/
|
||||||
|
@Api("裁片工单信息")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping(MesCommonConstant.MES_YANFEN + "/mesCutScheme")
|
||||||
|
public class MesCutSchemeController extends BaseMesController<MesCutScheme>{
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.apiservice.controller.base;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderCutService;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant;
|
||||||
|
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCut;
|
||||||
|
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.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 裁片工单
|
||||||
|
*/
|
||||||
|
@Api("裁片工单信息")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping(MesCommonConstant.MES_YANFEN + "/mesWorkOrderCut")
|
||||||
|
public class MesWorkOrderCutController extends BaseMesController<MesWorkOrderCut>{
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesWorkOrderCutService workOrderCutService;
|
||||||
|
|
||||||
|
@PostMapping(value = "/generate")
|
||||||
|
@ApiOperation(value = "裁片工单生成", notes = "裁片工单生成")
|
||||||
|
public ResultBean doGenerateCutWorkOrder(List<Long> workOrderIds, String cutCode, String remark) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
ValidatorBean.checkNotNull(workOrderIds, "工单不存在");
|
||||||
|
ValidatorBean.checkNotNull(cutCode, "裁片方案不存在");
|
||||||
|
|
||||||
|
workOrderCutService.doGenerateCutWorkOrder(workOrderIds, cutCode, remark, AuthUtil.getOrganize().getOrganizeCode(), AuthUtil.getSessionUser().getUserName());
|
||||||
|
return ResultBean.success("生成成功")
|
||||||
|
.setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
|
||||||
|
} catch (ImppBusiException busExcep) {
|
||||||
|
return ResultBean.fail(busExcep);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping(value = "/release")
|
||||||
|
@ApiOperation(value = "裁片工单发布", notes = "裁片工单发布")
|
||||||
|
public ResultBean doReleaseCutWorkOrder(String cutWorkOrderNo) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
ValidatorBean.checkNotNull(cutWorkOrderNo, "裁片工单不存在");
|
||||||
|
|
||||||
|
workOrderCutService.doReleaseCutWorkOrder(cutWorkOrderNo, AuthUtil.getOrganize().getOrganizeCode(), AuthUtil.getSessionUser().getUserName());
|
||||||
|
return ResultBean.success("发布成功")
|
||||||
|
.setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
|
||||||
|
} catch (ImppBusiException busExcep) {
|
||||||
|
return ResultBean.fail(busExcep);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,216 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderCutService;
|
||||||
|
import cn.estsh.i3plus.ext.mes.apiservice.utils.MesException;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
|
||||||
|
import cn.estsh.i3plus.mes.api.iservice.busi.ISyncFuncService;
|
||||||
|
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.enumutil.CommonEnumUtil;
|
||||||
|
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.*;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.repository.*;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||||
|
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.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Slf4j
|
||||||
|
public class MesWorkOrderCutService extends BaseMesService<MesWorkOrderCut> implements IMesWorkOrderCutService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ISyncFuncService syncFuncService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MesWorkOrderCutRepository workOrderCutRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MesWorkOrderRepository workOrderRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MesCutSchemeFgRepository cutSchemeFgRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MesCutSchemeRepository cutSchemeRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MesCutSchemeMaterialRepository cutSchemeMaterialRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MesWorkOrderCutMaterialRepository workOrderCutMaterialRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MesWorkOrderCutDetailRepository workOrderCutDetailRepository;
|
||||||
|
|
||||||
|
protected void setPackQueryBean(MesWorkOrderCut bean, DdlPackBean packBean) {
|
||||||
|
DdlPreparedPack.getStringLikerPack(bean.getCutWorkOrderNo(), MesExtConstWords.CUT_WORK_ORDER_NO, packBean);
|
||||||
|
DdlPreparedPack.getStringLikerPack(bean.getCutCode(), MesExtConstWords.CUT_CODE, packBean);
|
||||||
|
if (!StringUtils.isEmpty(bean.getCreateDateTimeStart()) || !StringUtils.isEmpty(bean.getCreateDateTimeEnd())) {
|
||||||
|
DdlPreparedPack.timeBuilder(
|
||||||
|
bean.getCreateDateTimeStart(),
|
||||||
|
bean.getCreateDateTimeEnd(),
|
||||||
|
MesExtConstWords.CREATE_DATE_TIME, packBean, true);
|
||||||
|
}
|
||||||
|
DdlPreparedPack.getNumEqualPack(bean.getWorkOrderStatus(), MesExtConstWords.WORK_ORDER_STATUS, packBean);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doGenerateCutWorkOrder(List<Long> workOrderIds, String cutCode, String remark, String organizeCode, String userName) {
|
||||||
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
||||||
|
DdlPreparedPack.getInPackList(workOrderIds, MesExtConstWords.ID, packBean);
|
||||||
|
List<MesWorkOrder> workOrderList = workOrderRepository.findByHqlWhere(packBean);
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(workOrderList)) {
|
||||||
|
MesException.throwMesBusiException("工单信息不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Long workOrderId : workOrderIds) {
|
||||||
|
if (!workOrderList.contains(workOrderId)) {
|
||||||
|
MesException.throwMesBusiException("工单信息ID【%s】不存在", workOrderId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (MesWorkOrder mesWorkOrder : workOrderList) {
|
||||||
|
if (mesWorkOrder.getWorkOrderStatus() != MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()) {
|
||||||
|
MesException.throwMesBusiException("工单状态不为【%s】", MesExtEnumUtil.ORDER_STATUS.valueOfDescription(mesWorkOrder.getWorkOrderStatus()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, List<MesWorkOrder>> workOrderListMapByPartNo = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getPartNo));
|
||||||
|
|
||||||
|
List<MesCutSchemeMaterial> cutSchemeMaterialList = getCutSchemeMaterialList(cutCode, organizeCode);
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(cutSchemeMaterialList)) MesException.throwMesBusiException("裁片方案【%s】缺少原材料配置", cutCode);
|
||||||
|
|
||||||
|
List<MesCutSchemeFg> cutSchemeFgList = getCutSchemeFgList(cutCode, organizeCode);
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(cutSchemeFgList)) MesException.throwMesBusiException("裁片方案【%s】缺少裁片方案成品配置", cutCode);
|
||||||
|
|
||||||
|
List<String> partNoList = workOrderList.stream().map(MesWorkOrder::getPartNo).distinct().collect(Collectors.toList());
|
||||||
|
List<String> fgPartNoList = cutSchemeFgList.stream().map(MesCutSchemeFg::getPartNo).distinct().collect(Collectors.toList());
|
||||||
|
|
||||||
|
partNoList.removeAll(fgPartNoList);
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(partNoList)) MesException.throwMesBusiException("物料【%s】未在裁片方案成品中维护", partNoList);
|
||||||
|
|
||||||
|
Map<String, Double> workOrderUnCompleteMap = new HashMap<>();
|
||||||
|
List<MesWorkOrderCutDetail> workOrderCutDetailtList = new ArrayList<>();
|
||||||
|
for (MesCutSchemeFg cutSchemeFg : cutSchemeFgList) {
|
||||||
|
|
||||||
|
List<MesWorkOrder> workOrders = workOrderListMapByPartNo.get(cutSchemeFg.getPartNo());
|
||||||
|
|
||||||
|
if (workOrders.size() > 1) {
|
||||||
|
MesException.throwMesBusiException("零件号【%s】存在多个工单", cutSchemeFg.getPartNo());
|
||||||
|
}
|
||||||
|
|
||||||
|
MesWorkOrder workOrder = workOrders.get(0);
|
||||||
|
|
||||||
|
if (cutSchemeFg.getQty().compareTo(workOrder.getUnCompleteQty()) < 0) {
|
||||||
|
MesException.throwMesBusiException("零件号【%s】工单未完成数量不满足产成总数", cutSchemeFg.getPartNo());
|
||||||
|
}
|
||||||
|
|
||||||
|
Double unCompleteQty = workOrder.getUnCompleteQty();
|
||||||
|
|
||||||
|
workOrderUnCompleteMap.put(workOrder.getWorkOrderNo(), unCompleteQty - cutSchemeFg.getQty());
|
||||||
|
|
||||||
|
MesWorkOrderCutDetail detail = new MesWorkOrderCutDetail();
|
||||||
|
ConvertBean.serviceModelInitialize(detail, userName);
|
||||||
|
detail.setOrganizeCode(organizeCode);
|
||||||
|
detail.setPartNo(workOrder.getPartNo());
|
||||||
|
detail.setPartName(workOrder.getPartName());
|
||||||
|
detail.setWorkOrderNo(workOrder.getWorkOrderNo());
|
||||||
|
detail.setRemark(cutSchemeFg.getRemark());
|
||||||
|
detail.setQty(cutSchemeFg.getQty());
|
||||||
|
workOrderCutDetailtList.add(detail);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
MesCutScheme cutScheme = getCutScheme(cutCode, organizeCode);
|
||||||
|
|
||||||
|
MesWorkOrderCut workOrderCut = new MesWorkOrderCut();
|
||||||
|
ConvertBean.serviceModelInitialize(workOrderCut, userName);
|
||||||
|
workOrderCut.setCutCode(cutScheme.getCutCode());
|
||||||
|
workOrderCut.setCutName(cutScheme.getCutName());
|
||||||
|
workOrderCut.setWorkOrderStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == cutScheme.getIsAutoRelease() ? MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue() : MesExtEnumUtil.CUT_ORDER_STATUS.CREATE.getValue());
|
||||||
|
workOrderCut.setRemark(remark);
|
||||||
|
workOrderCut.setCutWorkOrderNo(doGererateSerialNo(cutScheme.getCutCode(), organizeCode, userName));
|
||||||
|
workOrderCut.setOrganizeCode(organizeCode);
|
||||||
|
|
||||||
|
List<MesWorkOrderCutMaterial> workOrderCutMaterialList = new ArrayList<>();
|
||||||
|
for (MesCutSchemeMaterial cutSchemeMaterial : cutSchemeMaterialList) {
|
||||||
|
MesWorkOrderCutMaterial workOrderCutMaterial = new MesWorkOrderCutMaterial();
|
||||||
|
BeanUtils.copyProperties(cutSchemeMaterial, workOrderCutMaterial, MesExtConstWords.ID);
|
||||||
|
ConvertBean.serviceModelInitialize(workOrderCut, userName);
|
||||||
|
workOrderCutMaterial.setOrganizeCode(organizeCode);
|
||||||
|
workOrderCutMaterial.setCutWorkOrderNo(workOrderCut.getCutWorkOrderNo());
|
||||||
|
workOrderCutMaterial.setSystemSyncStatus(CommonEnumUtil.FALSE);
|
||||||
|
workOrderCutMaterialList.add(workOrderCutMaterial);
|
||||||
|
}
|
||||||
|
|
||||||
|
workOrderCutMaterialRepository.saveAll(workOrderCutMaterialList);
|
||||||
|
workOrderCutDetailRepository.saveAll(workOrderCutDetailtList);
|
||||||
|
workOrderCutRepository.save(workOrderCut);
|
||||||
|
|
||||||
|
for (MesWorkOrder mesWorkOrder : workOrderList) {
|
||||||
|
mesWorkOrder.setUnCompleteQty(workOrderUnCompleteMap.get(mesWorkOrder.getWorkOrderNo()));
|
||||||
|
}
|
||||||
|
|
||||||
|
workOrderRepository.saveAll(workOrderList);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doReleaseCutWorkOrder(String cutWorkOrderNo, String organizeCode, String userName) {
|
||||||
|
|
||||||
|
if (StringUtils.isEmpty(cutWorkOrderNo)) MesException.throwMesBusiException("裁片工单为空");
|
||||||
|
|
||||||
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
||||||
|
DdlPreparedPack.getStringEqualPack(cutWorkOrderNo, MesExtConstWords.CUT_WORK_ORDER_NO, packBean);
|
||||||
|
MesWorkOrderCut workOrderCutDb = workOrderCutRepository.getByProperty(packBean);
|
||||||
|
|
||||||
|
if (workOrderCutDb == null) MesException.throwMesBusiException("裁片工单不存在", cutWorkOrderNo);
|
||||||
|
|
||||||
|
if (workOrderCutDb.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.CREATE.getValue()) MesException.throwMesBusiException("裁片工单【%】状态不为【%s】,当前状态为【%s】", cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue(), MesExtEnumUtil.CUT_ORDER_STATUS.valueOfDescription(workOrderCutDb.getWorkOrderStatus()));
|
||||||
|
|
||||||
|
workOrderCutDb.setWorkOrderStatus(MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue());
|
||||||
|
|
||||||
|
ConvertBean.serviceModelUpdate(workOrderCutDb, userName);
|
||||||
|
|
||||||
|
workOrderCutRepository.save(workOrderCutDb);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String doGererateSerialNo(String cutCode, String organizeCode, String userName) {
|
||||||
|
return syncFuncService.syncSerialNo(
|
||||||
|
new GenSerialNoModel(MesExtConstWords.CUT_WORK_ORDER_NO_FUL).dynamicRule(cutCode).year(TimeTool.pareDateToString(MesExtConstWords.DATE_FORMAT_YY, new Date())).organizeCode(organizeCode),
|
||||||
|
userName, organizeCode, 1).getResultList().get(0).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private MesCutScheme getCutScheme(String cutCode, String organizeCode) {
|
||||||
|
|
||||||
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
||||||
|
DdlPreparedPack.getStringEqualPack(cutCode, MesExtConstWords.CUT_CODE, packBean);
|
||||||
|
return cutSchemeRepository.getByProperty(packBean);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<MesCutSchemeFg> getCutSchemeFgList(String cutCode, String organizeCode) {
|
||||||
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
||||||
|
DdlPreparedPack.getStringEqualPack(cutCode, MesExtConstWords.CUT_CODE, packBean);
|
||||||
|
return cutSchemeFgRepository.findByHqlWhere(packBean);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<MesCutSchemeMaterial> getCutSchemeMaterialList(String cutCode, String organizeCode) {
|
||||||
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
||||||
|
DdlPreparedPack.getStringEqualPack(cutCode, MesExtConstWords.CUT_CODE, packBean);
|
||||||
|
return cutSchemeMaterialRepository.findByHqlWhere(packBean);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue