裁片功能主数据表

tags/yfai-mes-ext-v2.3
yxw 8 months ago
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,105 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesCutSchemeService;
import cn.estsh.i3plus.ext.mes.apiservice.utils.BeanMapUtilsExt;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
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.MesWorkCenterRepository;
import lombok.extern.slf4j.Slf4j;
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.stream.Collectors;
@Service
@Slf4j
public class MesCutSchemeService extends BaseMesService<MesCutScheme> implements IMesCutSchemeService {
@Autowired
private MesWorkCenterRepository workCenterRepository;
protected void setPackQueryBean(MesCutScheme bean, DdlPackBean packBean) {
DdlPreparedPack.getStringLikerPack(bean.getWorkCenterCode(), MesExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getStringLikerPack(bean.getCutCode(), MesExtConstWords.CUT_CODE, packBean);
DdlPreparedPack.getNumEqualPack(bean.getCutName(), MesExtConstWords.CUT_NAME, packBean);
}
@Override
public void setBeanModel(List<MesCutScheme> list) {
if(CollectionUtils.isEmpty(list)){
return;
}
List<String> workCenterCodeList = list.stream().map(MesCutScheme::getWorkCenterCode).filter(t -> !StringUtils.isEmpty(t)).distinct().collect(Collectors.toList());
Map<String, MesWorkCenter> beanMap = CollectionUtils.isEmpty(workCenterCodeList) ? null : BeanMapUtilsExt.getBeanMap(workCenterRepository, MesExtConstWords.WORK_CENTER_CODE, list.iterator().next().getOrganizeCode(), workCenterCodeList);
if(!CollectionUtils.isEmpty(beanMap)){
list.forEach(t->{
if (beanMap.containsKey(t.getWorkCenterCode())) {
t.setWorkCenterName(beanMap.get(t.getWorkCenterCode()).getWorkCenterName());
}
});
}
}
protected void onInsertBean(MesCutScheme item) {
// 数据校验
//ValidatorBean.checkNotNull(item.getDefectTypeCode(), "缺陷类型代码不能为空");
//ValidatorBean.checkNotNull(item.getDefectTypeName(), "缺陷类型名称不能为空");
//
//DdlPackBean packBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
//DdlPreparedPack.getStringEqualPack(item.getDefectTypeCode(), "defectTypeCode", packBean);
//boolean flg = baseRDao.isExitByHql(packBean);
//if (flg) {
// throw ImppExceptionBuilder.newInstance()
// .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
// .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
// .setErrorDetail("【%s】缺陷类型代码已经存在请检查数据", item.getDefectTypeCode())
// .build();
//}
}
protected void onUpdateBean(MesCutScheme item) {
// 数据校验
//ValidatorBean.checkNotNull(item.getDefectTypeCode(), "缺陷类型代码不能为空");
//ValidatorBean.checkNotNull(item.getDefectTypeName(), "缺陷类型名称不能为空");
//
//DdlPackBean packBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
//DdlPreparedPack.getStringEqualPack(item.getDefectTypeCode(), "defectTypeCode", packBean);
//DdlPreparedPack.getNumNOEqualPack(item.getId(), "id", packBean);
//boolean flg = baseRDao.isExitByHql(packBean);
//if (flg) {
// throw ImppExceptionBuilder.newInstance()
// .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
// .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
// .setErrorDetail("【%s】缺陷类型代码已经存在请检查数据", item.getDefectTypeCode())
// .build();
//}
}
@Override
public void validateImport(List<MesCutScheme> beanList) {
//for (MesCutScheme item : beanList) {
// // 数据校验
// ValidatorBean.checkNotNull(item.getDefectTypeCode(), "缺陷类型代码不能为空");
// ValidatorBean.checkNotNull(item.getDefectTypeName(), "缺陷类型名称不能为空");
//
// DdlPackBean packBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
// DdlPreparedPack.getStringEqualPack(item.getDefectTypeCode(), "defectTypeCode", packBean);
// boolean flg = baseRDao.isExitByHql(packBean);
// if (flg) {
// throw ImppExceptionBuilder.newInstance()
// .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
// .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
// .setErrorDetail("【%s】缺陷类型代码已经存在请检查数据", item.getDefectTypeCode())
// .build();
// }
//}
}
}

@ -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);
}
}

@ -209,6 +209,8 @@ public class MesExtConstWords {
//日期类型
public static final String DATE_FORMAT_YM = "yyyy-MM";
//日期类型
public static final String DATE_FORMAT_YY = "yy";
//日期类型
public static final String DATE_DD_01 = "-01";
//日期类型
public static final String DATE_DD_31 = "-31";
@ -242,4 +244,13 @@ public class MesExtConstWords {
//JOB停机类型代码
public static final String MES_DOWNTIME_RECORD_JOB_TYPE = "MES_DOWNTIME_RECORD_JOB_TYPE";
// 裁片工单号
public static final String CUT_WORK_ORDER_NO = "cutWorkOrderNo";
// 裁片代码
public static final String CUT_CODE = "cutCode";
// 裁片名称
public static final String CUT_NAME = "cutName";
// 裁片工单号
public static final String CUT_WORK_ORDER_NO_FUL = "CUT_WORK_ORDER_NO";
}

Loading…
Cancel
Save