生产工单开发

tags/yfai-mes-ext-v1.0
jun 1 year ago
parent 61a3944368
commit c326833687

@ -1,6 +1,5 @@
package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesBom;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
/**
@ -10,5 +9,7 @@ import cn.estsh.i3plus.pojo.mes.bean.MesPart;
*/
public interface IMesPartService extends IBaseMesService<MesPart> {
MesPart getPartByPartNo(String partNo, String organizeCode);
}

@ -0,0 +1,15 @@
package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderToSap;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/5/8 16:48
* @Modify:
**/
public interface IMesWorkOrderToSapService extends IBaseMesService<MesWorkOrderToSap> {
MesWorkOrderToSap insert(MesWorkOrder mesWorkOrder);
}

@ -1,17 +1,58 @@
package cn.estsh.i3plus.ext.mes.apiservice.controller.base;
import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.excel.MesExcelTool;
import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.pojo.mes.bean.MesLoadingVehiclesOrderDetail;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
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.RedisCacheTool;
import cn.estsh.impp.framework.boot.util.ResultBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@Api(description = "工单主页面")
@RestController
@RequestMapping(MesCommonConstant.MES_YANFEN + "/mesWorkOrder")
public class MesWorkOrderController extends BaseMesController<MesWorkOrder> {
@PostMapping(value = "/import-mes-work-order")
@ApiOperation(value = "导入数据")
public ResultBean importMesWorkOrderExcel(@RequestParam("file") MultipartFile file, Integer type) {
try {
MesExcelTool excelTool = new MesExcelTool(entityManager, RedisCacheTool.getImppRedis());
List<MesWorkOrder> beanList = excelTool.importData(file.getOriginalFilename(), file.getInputStream(), MesWorkOrder.class);
// 校验导入数据
validateImport(beanList);
String userName = AuthUtil.getSessionUser().getUserName();
String organizeCode = AuthUtil.getOrganize().getOrganizeCode();
// 导入数据初始化
for (MesWorkOrder bean : beanList) {
bean.setWorkOrderType(type);
ConvertBean.serviceModelInitialize(bean, userName);
bean.setOrganizeCode(organizeCode);
}
baseService.insertBatch(beanList);
// 导入后
afterImport(beanList);
return ResultBean.success("导入成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
} catch (ImppBusiException e) {
return ResultBean.fail(e);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -39,7 +39,7 @@ public class SapProductPlanDaoImpl implements ISapProductPlanDao {
StringBuilder hql = new StringBuilder();
hql.append(" from sap_product_plan sap left join mes_work_order mes on sap.plnum = mes.plan_order_no and sap.plmat = mes.part_no " +
"where sap.is_deleted=:isDeleted and sap.is_valid=:isValid and sap.organize_code=:organizeCode " +
" and mes.is_deleted=:isDeleted and mes.is_valid=:isValid and mes.organize_code=:organizeCode");
" and ((mes.is_deleted=:isDeleted and mes.is_valid=:isValid and mes.organize_code=:organizeCode) or mes.id is null)");
//拼接查询条件
packWhere(sapProductPlan, hql);
StringBuffer unionDataHql = new StringBuffer("select sap.plnum,mes.part_no,mes.qty," +

@ -1,10 +1,10 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.apiservice.unit.exception.MesException;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesPartPtr;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -17,4 +17,15 @@ public class MesPartService extends BaseMesService<MesPart> implements IMesPartS
DdlPreparedPack.getStringLikeEqualPack(bean.getPartName(), "partName", packBean);
}
@Override
public MesPart getPartByPartNo(String partNo, String organizeCode) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean);
MesPart mesPart = baseRDao.getByProperty(ddlPackBean);
if (null == mesPart) {
MesException.throwMesBusiException("物料【%s】信息不存在", partNo);
}
return mesPart;
}
}

@ -1,6 +1,9 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderService;
import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderToSapService;
import cn.estsh.i3plus.ext.mes.apiservice.unit.exception.MesException;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtEnumUtil;
import cn.estsh.i3plus.mes.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
@ -8,9 +11,13 @@ import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
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.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderLog;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderToSap;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderToSapRepository;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
@ -21,6 +28,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Service
@Slf4j
@ -29,6 +37,10 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
private MesWorkOrderLogService workOrderLogService;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private IMesWorkOrderToSapService iMesWorkOrderToSapService;
@Autowired
private IMesPartService iMesPartService;
@Override
public MesWorkOrder insert(MesWorkOrder bean) {
@ -46,35 +58,32 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
GenSerialNoModel genSerialNoModel = new GenSerialNoModel();
//若工单类型为排序 则根据排序插入工单数量插入多行 工单数量为1
if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) {
Integer produceSeq = 0;
if (result.getProduceSeq() != null) {
if (null != result && result.getProduceSeq() != null) {
produceSeq = result.getProduceSeq();
}
List<MesWorkOrder> sortWorkOrderList = new ArrayList<>();
List<MesWorkOrderLog> orderLogList = new ArrayList<>();
for (int i = 0; i < bean.getSortInsertOrderQty(); i++) {
//生成工单号
genSerialNoModel = new GenSerialNoModel("ORDER_NO_JIS_SORT");
genSerialNoModel.setPartNo(bean.getPartNo());
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, AuthUtil.getSessionUser().getUserName(), bean.getOrganizeCode(), 1).getResultList();
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, bean.getCreateUser(), bean.getOrganizeCode(), 1).getResultList();
MesWorkOrder copyMesWorkOrder = new MesWorkOrder();
BeanUtils.copyProperties(bean, copyMesWorkOrder);
copyMesWorkOrder.setProduceSeq(produceSeq + i + 1);
copyMesWorkOrder.setProduceSeq(produceSeq + 1);
copyMesWorkOrder.setQty(1D);
copyMesWorkOrder.setOrderNo(resultList.get(0));
ConvertBean.serviceModelInitialize(copyMesWorkOrder, AuthUtil.getSessionUser().getUserName());
sortWorkOrderList.add(copyMesWorkOrder);
ConvertBean.serviceModelInitialize(copyMesWorkOrder, bean.getCreateUser());
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
BeanUtils.copyProperties(copyMesWorkOrder, workOrderLog, "id");
orderLogList.add(workOrderLog);
}
insertBatch(sortWorkOrderList);
baseRDao.insert(copyMesWorkOrder);
workOrderLogService.insertBatch(orderLogList);
//写入接口表
iMesWorkOrderToSapService.insert(bean);
return bean;
} else if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) {
//生成工单号
@ -83,50 +92,81 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
//生成工单号
genSerialNoModel = new GenSerialNoModel("ORDER_NO_BTO");
Integer produceSeq = 0;
if (result.getProduceSeq() != null) {
if (null != result && result.getProduceSeq() != null) {
produceSeq = result.getProduceSeq();
}
bean.setProduceSeq(produceSeq + 1);
GenSerialNoModel orderSeqSerialNoModel = new GenSerialNoModel("ORDER_NO_BTO_SEQ");
orderSeqSerialNoModel.setPartNo(bean.getPartNo());
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, AuthUtil.getSessionUser().getUserName(), bean.getOrganizeCode(), 1).getResultList();
List<String> resultList = syncFuncService.syncSerialNo(orderSeqSerialNoModel, bean.getCreateUser(), bean.getOrganizeCode(), 1).getResultList();
bean.setOrderSeq(Integer.parseInt(resultList.get(0)));
}
genSerialNoModel.setPartNo(bean.getPartNo());
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, AuthUtil.getSessionUser().getUserName(), bean.getOrganizeCode(), 1).getResultList();
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, bean.getCreateUser(), bean.getOrganizeCode(), 1).getResultList();
bean.setOrderNo(resultList.get(0));
bean.setQty(bean.getSortInsertOrderQty().doubleValue());
bean.setQty(bean.getQty());
ConvertBean.serviceModelInitialize(bean, AuthUtil.getSessionUser().getUserName());
ConvertBean.serviceModelInitialize(bean, bean.getCreateUser());
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
BeanUtils.copyProperties(bean, workOrderLog, "id");
workOrderLogService.insert(workOrderLog);
bean = baseRDao.insert(bean);
//写入接口表
iMesWorkOrderToSapService.insert(bean);
return bean;
}
@Override
public MesWorkOrder update(MesWorkOrder bean) {
//插入前构造数据
onInsertBean(bean);
//回传sap
boolean sendToSap = false;
MesWorkOrder result = baseRDao.getById(bean.getId());
//若工单类型为排序 则根据排序插入工单数量插入多行 工单数量为1
if (result.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) {
throw ImppExceptionBuilder.newInstance()
.setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode())
.setErrorDetail(String.format("工单类型为【%s】 不需要修改数量", MesExtEnumUtil.ORDER_TYPE.SORT.getValue()))
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.build();
if(!Objects.equals(bean.getQty(), result.getQty())){
MesException.throwMesBusiException(String.format("工单类型为【%s】 不需要修改数量",
MesExtEnumUtil.ORDER_TYPE.SORT.getDescription()));
}
}else{
//工单数量只能比原来的大
if(bean.getQty() < result.getQty()){
MesException.throwMesBusiException(String.format("工单数量不能小于工单源数量【%s】",
result.getQty()));
}
//修改状态或者指令下发需要传给SAP
if(!Objects.equals(bean.getQty(), result.getQty())){
sendToSap = true;
}
}
if(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue() == bean.getWorkOrderStatus()){
sendToSap = true;
}
//在加工的工单不能修改物料信息
if(result.getWorkOrderStatus() >= MesExtEnumUtil.ORDER_STATUS.process.getValue()){
if(!Objects.equals(bean.getPartNo(), result.getPartNo())){
MesException.throwMesBusiException(String.format("工单状态为【%s】不允许修改物料",
MesExtEnumUtil.ORDER_TYPE.valueOfDescription(result.getWorkOrderStatus())));
}
}
result.setQty(bean.getSortInsertOrderQty().doubleValue());
result.setQty(bean.getQty());
result.setWorkOrderStatus(bean.getWorkOrderStatus());
ConvertBean.serviceModelInitialize(bean, AuthUtil.getSessionUser().getUserName());
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
BeanUtils.copyProperties(result, workOrderLog, "id");
workOrderLogService.insert(workOrderLog);
//关闭工单
if(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue() == bean.getWorkOrderStatus()){
bean.setQty(0d);
sendToSap = true;
}
//发送给SAP
if(sendToSap){
iMesWorkOrderToSapService.insert(bean);
}
baseRDao.update(result);
return bean;
@ -134,6 +174,19 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
protected void setPackQueryBean(MesWorkOrder bean, DdlPackBean packBean) {
DdlPreparedPack.getStringLikerPack(bean.getOrderNo(),"orderNo",packBean);
DdlPreparedPack.getStringLikerPack(bean.getPartNameRdd(),"partNameRdd",packBean);
DdlPreparedPack.getStringEqualPack(bean.getPartNo(),"partNo",packBean);
DdlPreparedPack.getStringEqualPack(bean.getCustPartNo(),"custPartNo",packBean);
DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(),"workCenterCode",packBean);
DdlPreparedPack.getNumEqualPack(bean.getWorkOrderStatus(),"workOrderStatus",packBean);
DdlPreparedPack.getNumEqualPack(bean.getWorkOrderType(),"workOrderType",packBean);
DdlPreparedPack.getStringBiggerPack(bean.getCreateDateTimeStart(),"createDatetime",packBean);
DdlPreparedPack.getStringSmallerPack(bean.getCreateDateTimeEnd(),"createDatetime",packBean);
DdlPreparedPack.getStringBiggerPack(bean.getStartTimeStart(),"planStartTime",packBean);
DdlPreparedPack.getStringSmallerPack(bean.getStartTimeEnd(),"planStartTime",packBean);
DdlPreparedPack.getStringBiggerPack(bean.getEndTimeStart(),"planEndTime",packBean);
DdlPreparedPack.getStringSmallerPack(bean.getEndTimeEnd(),"planEndTime",packBean);
}
protected void onInsertBean(MesWorkOrder item) {
@ -142,7 +195,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
ValidatorBean.checkNotNull(item.getWorkOrderType(), "工单类型不能为空");
ValidatorBean.checkNotNull(item.getWorkCenterCode(), "产线不能为空");
ValidatorBean.checkNotNull(item.getShiftCode(), "班次不能为空");
//ValidatorBean.checkNotNull(item.getShiftCode(), "班次不能为空");
//校验标识
//若工单类型为排序
@ -177,6 +230,12 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
.build();
}
}
//物料名称不存在,从物料信息中获取
if(StringUtil.isEmpty(item.getPartNameRdd())){
MesPart mesPart = iMesPartService.getPartByPartNo(item.getPartNo(), item.getOrganizeCode());
item.setPartNameRdd(mesPart.getPartName());
}
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
}
protected void onUpdateBean(MesWorkOrder item) {

@ -0,0 +1,22 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderToSapService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderLog;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderToSap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class MesWorkOrderToSapServiceImpl extends BaseMesService<MesWorkOrderToSap> implements IMesWorkOrderToSapService {
@Override
public MesWorkOrderToSap insert(MesWorkOrder mesWorkOrder) {
MesWorkOrderToSap mesWorkOrderToSap = new MesWorkOrderToSap(mesWorkOrder.getOrganizeCode(),
mesWorkOrder.getOrganizeCode(), mesWorkOrder.getPartNo(), "", mesWorkOrder.getQty(), mesWorkOrder.getPlanEndTime());
ConvertBean.serviceModelUpdate(mesWorkOrderToSap,mesWorkOrder.getModifyUser());
return baseRDao.insert(mesWorkOrderToSap);
}
}

@ -0,0 +1,71 @@
package cn.estsh.i3plus.ext.mes.apiservice.unit.exception;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/5/8 17:16
* @Modify:
**/
public class MesException {
/**
*
* @param errorDetail
* @param errorSolution
* @throws ImppBusiException
*/
public static void throwFlowException(String errorDetail, String errorSolution)
throws ImppBusiException {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode())
.setErrorDetail(errorDetail)
.setErrorSolution(errorSolution)
.build();
}
/**
*
* @param errorDetail
* @throws ImppBusiException
*/
public static void throwFlowException(String errorDetail)
throws ImppBusiException {
throwFlowException(errorDetail, "");
}
/**
* WMS
* @param errorCode
* @param errorDetail
* @param errorSoluction
*/
public static void throwBusiException(String errorCode,String errorDetail,String errorSoluction,Object...args){
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(errorCode)
.setErrorDetail(errorDetail,args)
.setErrorSolution(errorSoluction)
.build();
}
/**
*
*
* @param
*/
public static void throwMesBusiException(String errorDetailString, Object... args) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode())
.setErrorDetail(errorDetailString,args)
.build();
}
}
Loading…
Cancel
Save