武汉报工功能开发

tags/yfai-mes-ext-v1.0
jun 11 months ago
parent 2685dd0e84
commit b354c07e5b

@ -0,0 +1,17 @@
package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesMoveRule;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/5 9:06
* @Modify:
**/
public interface IMesMoveRuleService extends IBaseMesService<MesMoveRule> {
List<MesMoveRule> findMesMoveRuleByPartProdGroupCode(String partProdGroupCode,String organizeCode);
}

@ -2,6 +2,8 @@ package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesPartSap;
import java.util.List;
/**
* @Description:
* @CreateDate 2024/04/16
@ -10,4 +12,6 @@ import cn.estsh.i3plus.pojo.mes.bean.MesPartSap;
public interface IMesPartSapService extends IBaseMesService<MesPartSap> {
MesPartSap getMesPartSapByPartNo(String partNo, String organizeCode);
List<MesPartSap> findMesPartSapByPartNoList(List<String> partNoList, String organizeCode);
}

@ -2,6 +2,8 @@ package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import java.util.List;
/**
* @Description:
* @CreateDate 2024/04/16
@ -11,5 +13,5 @@ public interface IMesPartService extends IBaseMesService<MesPart> {
MesPart getPartByPartNo(String partNo, String organizeCode);
List<MesPart> findMesPartByPartNoList(List<String> partNoList, String organizeCode);
}

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

@ -13,6 +13,8 @@ public interface IMesWorkOrderService extends IBaseMesService<MesWorkOrder> {
void doProductReport(MesWorkOrder mesWorkOrder);
void doProductReportExt(MesWorkOrder mesWorkOrder);
List<MesWorkOrder> sumMesWorkOrderQtyToSap(String organizeCode);
List<MesWorkOrder> queryMesWorkOrderProcessToSap(String organizeCode);

@ -0,0 +1,18 @@
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.MesMoveRule;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/5 9:06
* @Modify:
**/
@RestController
@RequestMapping(MesCommonConstant.MES_YANFEN + "/mesMoveRule")
public class MesMoveRuleController extends BaseMesController<MesMoveRule>{
}

@ -2,16 +2,19 @@ package cn.estsh.i3plus.ext.mes.apiservice.controller.base;
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.config.AuthUtilExt;
import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.excel.MesExcelTool;
import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant;
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.i3plus.pojo.mes.util.MesExtEnumUtil;
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 cn.estsh.impp.framework.boot.util.ValidatorBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@ -43,6 +46,10 @@ public class MesWorkOrderController extends BaseMesController<MesWorkOrder> {
validateImport(beanList);
String userName = AuthUtil.getSessionUser().getUserName();
String organizeCode = AuthUtil.getOrganize().getOrganizeCode();
//非排序工单导入前删除
if (MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue() == type) {
}
// 导入数据初始化
for (MesWorkOrder bean : beanList) {
bean.setWorkOrderType(type);
@ -78,6 +85,26 @@ public class MesWorkOrderController extends BaseMesController<MesWorkOrder> {
}
}
@PostMapping(value = "/doProductReportExt")
@ApiOperation(value = "生产报工(武汉)")
public ResultBean doProductReportExt(@RequestBody MesWorkOrder mesWorkOrder) {
try {
ValidatorBean.checkNotNull(mesWorkOrder.getId(),"工单id不能为空");
ValidatorBean.checkNotNull(mesWorkOrder.getNum(),"报工数量不能为空");
ValidatorBean.checkNotZero(mesWorkOrder.getNum(),"报工数量不能为0");
mesWorkOrder.setOrganizeCode(AuthUtilExt.getOrganizeCode());
ConvertBean.serviceModelUpdate(mesWorkOrder, AuthUtilExt.getUserName());
//新增初始化
mesWorkOrderService.doProductReportExt(mesWorkOrder);
return ResultBean.success("操作成功")
.setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
} catch (ImppBusiException e) {
return ResultBean.fail(e).build();
} catch (Exception e) {
return ResultBean.fail(e);
}
}
@GetMapping(value = "/sendToSap")
@ApiOperation(value = "发送给sap")

@ -0,0 +1,12 @@
package cn.estsh.i3plus.ext.mes.apiservice.dao;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
import java.util.List;
public interface IMesProdRuleNosortCfgDao {
List<MesProdRuleNosortCfg> findMesProdRuleNosortCfgByWorkCenterCode(String workCenterCode, String partNo, String organizeCode);
}

@ -0,0 +1,38 @@
package cn.estsh.i3plus.ext.mes.apiservice.daoimpl;
import cn.estsh.i3plus.ext.mes.apiservice.dao.IMesProdRuleNosortCfgDao;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
@Service
@Slf4j
public class MesProdRuleNosortCfgDaoImpl implements IMesProdRuleNosortCfgDao {
@Autowired
private EntityManager entityManager;
@Override
public List<MesProdRuleNosortCfg> findMesProdRuleNosortCfgByWorkCenterCode(String workCenterCode, String partNo, String organizeCode) {
StringBuffer hql = new StringBuffer("select ns from MesProdRuleNosortCfg ns" +
" left join MesWcEquipment we on ns.equipmentCode = we.equipmentCode " +
" where ns.isDeleted=:isDeleted and ns.isValid = :isValid and ns.organizeCode = :organizeCode " +
" and we.isDeleted=:isDeleted and we.isValid = :isValid and we.organizeCode = :organizeCode " +
" and we.workCenterCode = :workCenterCode and ns.outPartNo = :outPartNo");
Query query = entityManager.createQuery(hql.toString(), MesProdRuleNosortCfg.class);
query.setParameter("organizeCode", organizeCode);
query.setParameter("isValid", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
query.setParameter("isDeleted", CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
query.setParameter("workCenterCode", workCenterCode);
query.setParameter("outPartNo", partNo);
return query.getResultList();
}
}

@ -0,0 +1,80 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesMoveRuleService;
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.MesMoveRule;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/5 9:08
* @Modify:
**/
@Service
@Slf4j
public class MesMoveRuleImpl extends BaseMesService<MesMoveRule> implements IMesMoveRuleService {
@Override
protected void setPackQueryBean(MesMoveRule bean, DdlPackBean packBean) {
DdlPreparedPack.getStringEqualPack(bean.getPartProdGroupCode(), "partProdGroupCode", packBean);
DdlPreparedPack.getStringEqualPack(bean.getSrcType(), "srcType", packBean);
}
@Override
protected void onInsertBean(MesMoveRule item) {
// 数据校验
checkNotNull(item);
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(item.getPartProdGroupCode(), "partProdGroupCode", ddlPackBean);
DdlPreparedPack.getStringEqualPack(item.getSrcType(), "srcType", ddlPackBean);
if (baseRDao.isExitByHql(ddlPackBean)) {
MesException.throwMesBusiException("零件生产组代码【%s】来源类型【%s】数据已存在", item.getPartProdGroupCode(), item.getSrcType());
}
}
@Override
protected void onUpdateBean(MesMoveRule item) {
// 数据校验
checkNotNull(item);
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(item.getPartProdGroupCode(), "partProdGroupCode", ddlPackBean);
DdlPreparedPack.getStringEqualPack(item.getSrcType(), "srcType", ddlPackBean);
DdlPreparedPack.getNumNOEqualPack(item.getId(), "id", ddlPackBean);
if (baseRDao.isExitByHql(ddlPackBean)) {
MesException.throwMesBusiException("零件生产组代码【%s】来源类型【%s】数据已存在", item.getPartProdGroupCode(), item.getSrcType());
}
}
@Override
public List<MesMoveRule> findMesMoveRuleByPartProdGroupCode(String partProdGroupCode, String organizeCode) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partProdGroupCode, "partProdGroupCode", ddlPackBean);
List<MesMoveRule> moveRules = baseRDao.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(moveRules)) {
MesException.throwMesBusiException("零件生产组代码【%s】移库规则数据不存在", partProdGroupCode);
}
return moveRules;
}
private void checkNotNull(MesMoveRule item) {
ValidatorBean.checkNotNull(item.getPartProdGroupCode(), "零件生产组代码不能为空");
ValidatorBean.checkNotNull(item.getErpSrcLocateNo(), "ERP来源库位不能为空");
ValidatorBean.checkNotNull(item.getErpDestLocateNo(), "ERP目的库位不能为空");
ValidatorBean.checkNotNull(item.getSrcType(), "来源类型不能为空");
ValidatorBean.checkNotNull(item.getReportType(), "汇报类型不能为空");
}
}

@ -11,6 +11,9 @@ import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
@Service
@Slf4j
@ -69,4 +72,15 @@ public class MesPartSapService extends BaseMesService<MesPartSap> implements IMe
}
return mesPart;
}
@Override
public List<MesPartSap> findMesPartSapByPartNoList(List<String> partNoList, String organizeCode) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(partNoList, "partNo", ddlPackBean);
List<MesPartSap> mesPartSapList = baseRDao.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(mesPartSapList)) {
MesException.throwMesBusiException("物料【%s】信息不存在", partNoList);
}
return mesPartSapList;
}
}

@ -7,10 +7,14 @@ 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.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesPartSap;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
@Service
@Slf4j
@ -33,6 +37,17 @@ public class MesPartService extends BaseMesService<MesPart> implements IMesPartS
return mesPart;
}
@Override
public List<MesPart> findMesPartByPartNoList(List<String> partNoList, String organizeCode) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(partNoList, "partNo", ddlPackBean);
List<MesPart> mesPartList = baseRDao.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(mesPartList)) {
MesException.throwMesBusiException("物料【%s】信息不存在", partNoList);
}
return mesPartList;
}
protected void onInsertBean(MesPart item) {
// 数据校验
ValidatorBean.checkNotNull(item.getPartNo(), "物料号不能为空");

@ -1,24 +1,29 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesProdRuleNosortCfgService;
import cn.estsh.i3plus.ext.mes.api.base.IMesTimeEfficientCfgService;
import cn.estsh.i3plus.ext.mes.apiservice.dao.IMesProdRuleNosortCfgDao;
import cn.estsh.i3plus.ext.mes.apiservice.unit.exception.MesException;
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.mes.bean.MesPartShippingGroup;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesTimeEfficientCfg;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
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;
@Service
@Slf4j
public class MesProdRuleNosortCfgService extends BaseMesService<MesProdRuleNosortCfg> implements IMesProdRuleNosortCfgService {
@Autowired
private IMesProdRuleNosortCfgDao mesProdRuleNosortCfgDao;
protected void setPackQueryBean(MesProdRuleNosortCfg bean, DdlPackBean packBean) {
DdlPreparedPack.getStringEqualPack(bean.getInPartNo(), "inPartNo", packBean);
@ -83,4 +88,13 @@ public class MesProdRuleNosortCfgService extends BaseMesService<MesProdRuleNosor
.build();
}
}
@Override
public MesProdRuleNosortCfg findMesProdRuleNosortCfgByWorkCenterCode(String workCenterCode, String partNo, String organizeCode) {
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = mesProdRuleNosortCfgDao.findMesProdRuleNosortCfgByWorkCenterCode(workCenterCode, partNo, organizeCode);
if(CollectionUtils.isEmpty(prodRuleNosortCfgList)){
MesException.throwMesBusiException("产线【%s】产出零件【%s】对应的非排序工艺路线信息不存在",workCenterCode,partNo);
}
return prodRuleNosortCfgList.iterator().next();
}
}

@ -45,7 +45,7 @@ public class MesProdRuleSortCfgService extends BaseMesService<MesProdRuleSortCfg
DdlPackBean seriesPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(item.getWorkCellCode(), "workCellCode", seriesPackBean);
DdlPreparedPack.getStringEqualPack(item.getWorkCenterCode(), "workCenterCode", seriesPackBean);
DdlPreparedPack.getStringEqualPack(item.getAssemblyPartNo(), "partNo", seriesPackBean);
DdlPreparedPack.getStringEqualPack(item.getAssemblyPartNo(), "assemblyPartNo", seriesPackBean);
boolean flg = baseRDao.isExitByHql(seriesPackBean);
@ -69,8 +69,8 @@ public class MesProdRuleSortCfgService extends BaseMesService<MesProdRuleSortCfg
DdlPackBean seriesPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(item.getWorkCellCode(), "workCellCode", seriesPackBean);
DdlPreparedPack.getStringEqualPack(item.getWorkCenterCode(), "workCenterCode", seriesPackBean);
DdlPreparedPack.getStringEqualPack(item.getAssemblyPartNo(), "partNo", seriesPackBean);
DdlPreparedPack.getStringEqualPack(item.getAssemblyPartNo(), "assemblyPartNo", seriesPackBean);
DdlPreparedPack.getNumNOEqualPack(item.getId(), "id", seriesPackBean);
boolean flg = baseRDao.isExitByHql(seriesPackBean);
if (flg) {

@ -1,6 +1,8 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesWorkCenterService;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -9,5 +11,11 @@ import org.springframework.stereotype.Service;
@Slf4j
public class MesWorkCenterService extends BaseMesService<MesWorkCenter> implements IMesWorkCenterService {
@Override
protected void setPackQueryBean(MesWorkCenter bean, DdlPackBean packBean) {
DdlPreparedPack.getStringLikerPack(bean.getErpWorkCenter(), "erpWorkCenter", packBean);
DdlPreparedPack.getStringLikerPack(bean.getWorkCenterCode(), "workCenterCode", packBean);
DdlPreparedPack.getStringLikerPack(bean.getWorkCenterName(), "workCenterName", packBean);
}
}

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.*;
import cn.estsh.i3plus.ext.mes.apiservice.config.AuthUtilExt;
import cn.estsh.i3plus.ext.mes.apiservice.dao.IMesWorkOrderDao;
import cn.estsh.i3plus.ext.mes.apiservice.unit.exception.MesException;
import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant;
@ -31,7 +32,9 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
@Slf4j
@ -64,7 +67,16 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
private MesCustomerPartRepository mesCustomerPartRDao;
@Autowired
private IMesPartSapService iMesPartSapService;
@Autowired
private IMesMoveRuleService mesMoveRuleService;
@Autowired
private MesProdRuleSortCfgRepository mesProdRuleSortCfgRDao;
@Autowired
private IMesProdRuleNosortCfgService mesProdRuleNosortCfgService;
@Autowired
private IMesPartSapService mesPartSapService;
@Autowired
private MesMoveRepository mesMoveRDao;
@Override
public MesWorkOrder insert(MesWorkOrder bean) {
//插入前构造数据
@ -327,13 +339,13 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
MesException.throwMesBusiException("vin号【%s】重复", item.getVinCode());
}
}
//校验零件生产组信息
// MesPartProdGroupDetail mesPartProdGroupDetail = new MesPartProdGroupDetail();
// mesPartProdGroupDetail.setWorkCenterCode(item.getWorkCenterCode());
// mesPartProdGroupDetail.setPartNo(item.getPartNo());
// mesPartProdGroupDetail.setOrganizeCode(item.getOrganizeCode());
// List<MesPartProdGroup> mesPartProdGroup = mesPartProdGroupService.findMesPartProdGroup(mesPartProdGroupDetail);
//校验零件生产组信息
if(StringUtil.isEmpty(item.getPartProdGroupCode())){
MesPartProdGroup mesPartProdGroup = getMesPartProdGroup(item);
item.setPartProdGroupCode(mesPartProdGroup.getPartProdGroupCode());
item.setPartProdGroupName(mesPartProdGroup.getPartProdGroupName());
}
//排序工单数量为1
item.setQty(1d);
@ -387,6 +399,19 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
}
private MesPartProdGroup getMesPartProdGroup(MesWorkOrder item) {
MesPartProdGroupDetail mesPartProdGroupDetail = new MesPartProdGroupDetail();
mesPartProdGroupDetail.setWorkCenterCode(item.getWorkCenterCode());
mesPartProdGroupDetail.setPartNo(item.getPartNo());
mesPartProdGroupDetail.setOrganizeCode(item.getOrganizeCode());
List<MesPartProdGroup> mesPartProdGroupList = mesPartProdGroupService.findMesPartProdGroup(mesPartProdGroupDetail);
if(CollectionUtils.isEmpty(mesPartProdGroupList)){
MesException.throwMesBusiException("生产线代码【%s】零件号【%s】对应的零件生产组信息没有维护");
}
MesPartProdGroup mesPartProdGroup = mesPartProdGroupList.iterator().next();
return mesPartProdGroup;
}
private void getCustomerPart(MesWorkOrder item) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(item.getPartNo(), "erpPartNo", ddlPackBean);
@ -476,23 +501,9 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
MesException.throwMesBusiException("产线【%s】不存在", mesWorkOrder.getWorkCenterCode());
}
//获取生产版本
ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(), "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesWorkCenter.getErpWorkCenter(), "workCenterCode", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getProductVersion(), "productVersion", ddlPackBean);
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
if (null == mesProductVersion) {
MesException.throwMesBusiException("物料【%s】生产版本信息不存在", mesWorkOrder.getPartNo());
}
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder);
//物料+生产版本获取bom信息
ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPart.getPartNo(), "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesProductVersion.getAlternativePartList(), "bomVersion", ddlPackBean);
List<MesBom> mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(mesBoms)) {
MesException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在",
mesWorkOrder.getPartNo(), mesProductVersion.getProductVersion());
}
List<MesBom> mesBoms = getMesBoms(mesWorkOrder, mesPart, mesProductVersion);
//报工类型
if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrder.getReportType()) {
mesWorkOrder.setReportedQty(MathOperation.add(mesWorkOrder.getNum(), mesWorkOrder.getReportedQty()));
@ -525,26 +536,251 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
update(mesWorkOrder);
//生成条码
// todo
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.REPORT_SN);
genSerialNoModel.setPartNo(mesWorkOrder.getPartNo());
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, mesWorkOrder.getCreateUser(), mesWorkOrder.getOrganizeCode(), mesWorkOrder.getNum()).getResultList();
List<String> resultList = getStringList(mesWorkOrder);
//保存数据
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
MesProductOffLine newMesProductOffLine;
for (String sn : resultList) {
for (MesBom mesBom : mesBoms) {
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom,false));
}
}
mesProductOffLineService.insertBatch(mesProductOffLineList);
}
@Override
public void doProductReportExt(MesWorkOrder mesWorkOrderNew) {
MesWorkOrder mesWorkOrder = baseRDao.getById(mesWorkOrderNew.getId());
if(Objects.isNull(mesWorkOrder)){
MesException.throwMesBusiException("工单id为【%s】工单信息不存在",mesWorkOrderNew.getId());
}
//查询物料信息
MesPart mesPart = iMesPartService.getPartByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode());
if(mesWorkOrderNew.getNum() <= 0){
MesException.throwMesBusiException("工单报工数量不能为0,不允许报工");
}
//报工类型
//报工
if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrder.getReportType()) {
mesWorkOrder.setReportedQty(MathOperation.add(mesWorkOrderNew.getNum(), mesWorkOrder.getReportedQty()));
} else {
//冲销数量大于工单完成数量报错
if (mesWorkOrderNew.getNum() > mesWorkOrder.getReportedQty()) {
MesException.throwMesBusiException("冲销数量【%s】大于工单完成数量【%s】,不允许冲销",
mesWorkOrderNew.getNum(), mesWorkOrder.getReportedQty());
}
//报工调整数量加-
mesWorkOrder.setAdjustQty((MathOperation.add(mesWorkOrderNew.getNum(), mesWorkOrder.getAdjustQty())));
//已汇报数量减一
mesWorkOrder.setReportedQty(MathOperation.sub(mesWorkOrder.getReportedQty(), mesWorkOrderNew.getNum()));
}
//更新工单状态
double unCompleteQty = MathOperation.sub(mesWorkOrder.getQty(), mesWorkOrder.getReportedQty());
mesWorkOrder.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0);
if (mesWorkOrder.getReportedQty() > mesWorkOrder.getQty()) {
MesException.throwMesBusiException("工单报工数量大于工单数量【%s】,不允许报工", mesWorkOrder.getQty());
} else if (Objects.equals(mesWorkOrder.getReportedQty(), mesWorkOrder.getQty())) {
mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
} else {
mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.process.getValue());
}
//获取生产版本
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder);
//物料+生产版本获取bom信息
List<MesBom> mesBoms = getMesBoms(mesWorkOrder, mesPart, mesProductVersion);
//生成条码
List<String> resultList = getStringList(mesWorkOrderNew);
//保存数据
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
List<MesMove> mesMoveList = new ArrayList<>();
boolean isReport = false;
boolean isMove = false;
//排序工单
if(MesExtEnumUtil.ORDER_TYPE.SORT.getValue() == mesWorkOrder.getWorkOrderType()){
//报工类型
if (MesExtEnumUtil.REPORT_TYPE.WRITE_OFF.getValue() == mesWorkOrder.getReportType()) {
MesException.throwMesBusiException("工单【%s】为排序工单不允许冲销",mesWorkOrder.getWorkOrderNo());
}
//排序加工规则
MesProdRuleSortCfg mesProdRuleSortCfg = getMesProdRuleSortCfg(mesWorkOrder);
if(MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue() == mesProdRuleSortCfg.getReportType()){
isReport = true;
} else if (MesExtEnumUtil.MES_REPORT_TYPE.MOVE.getValue() == mesProdRuleSortCfg.getReportType()) {
isMove = true;
}else if (MesExtEnumUtil.MES_REPORT_TYPE.REPORT_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) {
isReport = true;
isMove = true;
}else if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) {
customerSupplyMove(mesWorkOrder, mesProductVersion, mesBoms, resultList, mesProductOffLineList, mesMoveList);
}else{
log.info("工单{}排序加工规则报工类型未维护",mesWorkOrder.getWorkOrderNo());
return;
}
if(MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() != mesProdRuleSortCfg.getReportType()){
//查询SAP物料信息
MesPartSap mesPartSap = mesPartSapService.getMesPartSapByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode());
for (String sn : resultList) {
//成品汇报
if(isReport){
for (MesBom mesBom : mesBoms) {
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom,false));
}
}
//成品移库
if(isMove){
MesMove move = createMove(mesPartSap, mesProdRuleSortCfg.getSrcErpLocation(), mesProdRuleSortCfg.getDestErpLocation(), mesWorkOrder.getOrganizeCode(), 1d);
move.setMatnr(mesWorkOrder.getPartNo());
mesMoveList.add(move);
}
}
}
} else if (MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue() == mesWorkOrder.getWorkOrderType()) {
MesProdRuleNosortCfg mesProdRuleNoSortCfg = mesProdRuleNosortCfgService.findMesProdRuleNosortCfgByWorkCenterCode(mesWorkOrder.getWorkCenterCode(),mesWorkOrder.getPartNo(),mesWorkOrder.getOrganizeCode());
if( CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesProdRuleNoSortCfg.getReportType()){
for (String sn : resultList) {
for (MesBom mesBom : mesBoms) {
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom,false));
}
}
}
}else {
log.info("工单{}排序规则不属于排序工单和非排序工单",mesWorkOrder.getWorkOrderNo());
return;
}
//更新工单
update(mesWorkOrder);
//保存报工记录
if(CollectionUtils.isNotEmpty(mesProductOffLineList)){
mesProductOffLineService.insertBatch(mesProductOffLineList);
}
//保存移库记录
if(CollectionUtils.isNotEmpty(mesMoveList)){
mesMoveRDao.saveAll(mesMoveList);
}
}
private void customerSupplyMove(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, List<MesBom> mesBoms, List<String> resultList, List<MesProductOffLine> mesProductOffLineList, List<MesMove> mesMoveList) {
boolean isItemMove;
boolean isItemReport;
MesMoveRule moveRule;
//查询零件生产组的移库规则
List<MesMoveRule> moveRules = mesMoveRuleService.findMesMoveRuleByPartProdGroupCode(mesWorkOrder.getPartProdGroupCode(), mesWorkOrder.getOrganizeCode());
Map<String, List<MesMoveRule>> mesMoveRuleMap = moveRules.stream().filter(t -> Objects.nonNull(t.getSrcType())).collect(Collectors.groupingBy(MesMoveRule::getSrcType));
List<String> itemPartNoList = mesBoms.stream().map(MesBom::getItemPartNo).collect(Collectors.toList());
//子物料SAP下发信息
Map<String, List<MesPartSap>> mesPartSapMap = getPartSapMap(mesWorkOrder, itemPartNoList);
//获取物料信息
Map<String, List<MesPart>> itemPartMap = getItemPartMap(mesWorkOrder, itemPartNoList);
for (String sn : resultList) {
for (MesBom mesBom : mesBoms) {
isItemReport = false;
isItemMove = false;
moveRule = null;
if(itemPartMap.containsKey(mesBom.getItemPartNo())){
MesPart itemPart = itemPartMap.get(mesBom.getItemPartNo()).iterator().next();
if(!StringUtil.isEmpty(itemPart.getPartEds()) && mesMoveRuleMap.containsKey(itemPart.getPartEds())){
moveRule = mesMoveRuleMap.get(itemPart.getPartEds()).iterator().next();
if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT_MOVE.getValue() == moveRule.getReportType()) {
isItemMove = true;
isItemReport = true;
} else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT.getValue() == moveRule.getReportType()) {
isItemReport = true;
} else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.MOVE.getValue() == moveRule.getReportType()) {
isItemMove = true;
}
}
}
//汇报
if(isItemReport){
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom,true));
}
//移库
if(isItemMove){
MesPartSap mesPartSap = null;
if(mesPartSapMap.containsKey(mesBom.getItemPartNo())){
mesPartSap = mesPartSapMap.get(mesBom.getItemPartNo()).iterator().next();
}
MesMove move = createMove(mesPartSap, moveRule.getErpSrcLocateNo(), moveRule.getErpDestLocateNo(), mesBom.getOrganizeCode(), mesBom.getItemQty());
move.setMatnr(mesBom.getItemPartNo());
mesMoveList.add(move);
}
}
}
}
private Map<String, List<MesPartSap>> getPartSapMap(MesWorkOrder mesWorkOrder, List<String> itemPartNoList) {
List<MesPartSap> mesPartSapList = mesPartSapService.findMesPartSapByPartNoList(itemPartNoList, mesWorkOrder.getOrganizeCode());
Map<String, List<MesPartSap>> mesPartSapMap = mesPartSapList.stream().filter(t -> Objects.nonNull(t.getPartNo())).collect(Collectors.groupingBy(MesPartSap::getPartNo));
return mesPartSapMap;
}
private Map<String, List<MesPart>> getItemPartMap(MesWorkOrder mesWorkOrder, List<String> itemPartNoList) {
List<MesPart> itemPartList = iMesPartService.findMesPartByPartNoList(itemPartNoList, mesWorkOrder.getOrganizeCode());
Map<String, List<MesPart>> itemPartMap = itemPartList.stream().filter(t -> Objects.nonNull(t.getPartNo())).collect(Collectors.groupingBy(MesPart::getPartNo));
return itemPartMap;
}
private MesProdRuleSortCfg getMesProdRuleSortCfg(MesWorkOrder mesWorkOrder) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(),"reportPartNo",ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkCenterCode(),"workCenterCode",ddlPackBean);
MesProdRuleSortCfg mesProdRuleSortCfg = mesProdRuleSortCfgRDao.getByProperty(ddlPackBean);
if(Objects.isNull(mesProdRuleSortCfg)){
MesException.throwMesBusiException("产线【%s】物料【%s】排序加工规则未维护", mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getPartNo());
}
return mesProdRuleSortCfg;
}
private List<String> getStringList(MesWorkOrder mesWorkOrder) {
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.REPORT_SN);
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, mesWorkOrder.getCreateUser(), mesWorkOrder.getOrganizeCode(), mesWorkOrder.getNum()).getResultList();
return resultList;
}
private List<MesBom> getMesBoms(MesWorkOrder mesWorkOrder, MesPart mesPart, MesProductVersion mesProductVersion) {
DdlPackBean ddlPackBean;
ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPart.getPartNo(), "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesProductVersion.getAlternativePartList(), "bomVersion", ddlPackBean);
List<MesBom> mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(mesBoms)) {
MesException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在",
mesWorkOrder.getPartNo(), mesProductVersion.getProductVersion());
}
return mesBoms;
}
private MesProductVersion getMesProductVersion(MesWorkOrder mesWorkOrder) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(), "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getErpWorkCenter(), "workCenterCode", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getProductVersion(), "productVersion", ddlPackBean);
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
if (null == mesProductVersion) {
MesException.throwMesBusiException("物料【%s】生产版本信息不存在", mesWorkOrder.getPartNo());
}
return mesProductVersion;
}
private MesProductOffLine creatMesProductOffLine(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion,
String sn, MesBom mesBom,boolean isItemReport) {
MesProductOffLine newMesProductOffLine;
newMesProductOffLine = new MesProductOffLine();
if(!isItemReport){
newMesProductOffLine.setReportPartNo(mesWorkOrder.getPartNo());
newMesProductOffLine.setReportPartNameRdd(mesWorkOrder.getPartName());
}
newMesProductOffLine.setReportSn(sn);
newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo());
newMesProductOffLine.setItemPartName(mesBom.getItemPartName());
newMesProductOffLine.setItemQty(mesBom.getItemQty());
newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint());
newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint());
newMesProductOffLine.setQty(1d);
newMesProductOffLine.setReportSn(sn);
newMesProductOffLine.setBomVersion(mesWorkOrder.getProductVersion());
newMesProductOffLine.setSerialNumber(sn);
newMesProductOffLine.setUnit(mesBom.getUnit());
@ -553,14 +789,11 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
newMesProductOffLine.setWorkCenterCode(mesWorkOrder.getWorkCenterCode());
newMesProductOffLine.setWorkCellCode(mesWorkOrder.getWorkCellCode());
newMesProductOffLine.setReportType(mesWorkOrder.getReportType());
newMesProductOffLine.setSapWorkCenter(mesWorkCenter.getErpWorkCenter());
newMesProductOffLine.setSapWorkCenter(mesWorkOrder.getErpWorkCenter());
newMesProductOffLine.setOrganizeCode(mesWorkOrder.getOrganizeCode());
ConvertBean.serviceModelInitialize(newMesProductOffLine, mesWorkOrder.getCreateUser());
mesProductOffLineList.add(newMesProductOffLine);
}
}
mesProductOffLineService.insertBatch(mesProductOffLineList);
return newMesProductOffLine;
}
@Override
@ -581,4 +814,20 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
DdlPreparedPack.getInPackList(statusList, "workOrderStatus", packBean);
return mesWorkOrderRDao.findByHqlWhere(packBean);
}
private MesMove createMove(MesPartSap mesPart , String source, String target, String org,double qty) {
MesMove move = new MesMove();
if(!Objects.isNull(mesPart)){
move.setMeins(mesPart.getUnit());
}
move.setOrganizeCode(org);
move.setFactoryCode(org);
move.setLgort(source);
move.setUmlgo(target);
move.setMenge(qty);
move.setPostDate(TimeTool.getToday());
move.setPostTime(TimeTool.getTimeShortWithColon());
ConvertBean.serviceModelInitialize(move, AuthUtil.getSessionUser().getUserName());
return move;
}
}

@ -90,7 +90,7 @@ public class MesTimeRoundnessService implements IRoundnessStrategy {
MesWorkOrder mesWorkOrder = new MesWorkOrder();
mesWorkOrder.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.BTO.getValue());
mesWorkOrder.setWorkOrderSeq(createSeq.toString());
mesWorkOrder.setProduceSeq(createSeq.toString());
mesWorkOrder.setProduceSeq(createSeq);
mesWorkOrder.setOrganizeCode(detail.getOrganizeCode());
//产线
mesWorkOrder.setWorkCenterCode(detail.getWorkCenterCode());

Loading…
Cancel
Save