bto-job第一个版本完成,按时圆整

tags/yfai-mes-ext-v1.0
administrator 11 months ago
parent 68af7786cf
commit 9338f4870a

@ -0,0 +1,19 @@
package cn.estsh.i3plus.ext.mes.api.base;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/2 11:47
* @Modify:
**/
public interface IMesBtoJobService {
/**
* jobbto
* @param organizeCode
* @param groupCodeList
*/
void doCreateBto(String organizeCode, List<String> groupCodeList);
}

@ -0,0 +1,32 @@
package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesCustSortInfo;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/2 20:38
* @Modify:
**/
public interface IMesCustSoftInfoService extends IBaseMesService<MesCustSortInfo> {
/**
*
* @param custCode
* @param custOrganizeCode
* @param infoPointCode
* @param organizeCode
* @param custPartNoList
* @return
*/
List<MesCustSortInfo> queryCustSortInfoList(String custCode,String custOrganizeCode,String infoPointCode,String organizeCode,List<String> custPartNoList);
/**
* custSortInfo
* @param custSortInfo
*/
void updateCustSortInfo(MesCustSortInfo custSortInfo);
}

@ -9,5 +9,5 @@ import cn.estsh.i3plus.pojo.mes.bean.MesCustomerMessagePoint;
*/
public interface IMesCustomerMessagePointService extends IBaseMesService<MesCustomerMessagePoint> {
MesCustomerMessagePoint getPointByCode(String pointCode,String organizeCode);
}

@ -13,4 +13,19 @@ import java.util.List;
public interface IMesPartProdGroupService extends IBaseMesService<MesPartProdGroup> {
List<MesPartProdGroup> findMesPartProdGroup(MesPartProdGroupDetail mesPartProdGroupDetail);
/**
* code
* @param organizeCode
* @param groupCodeList
* @return
*/
List<MesPartProdGroup> findMesPartProdGroups(String organizeCode, List<String> groupCodeList);
/**
* pid
* @param partGroupCode
* @return
*/
List<MesPartProdGroupDetail> findDetailByCode(String partGroupCode,String organizeCode);
}

@ -0,0 +1,19 @@
package cn.estsh.i3plus.ext.mes.api.base.strategy;
import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroup;
import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroupDetail;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesCustSortInfo;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/2 21:21
* @Modify:
**/
public interface IRoundnessStrategy {
void execute(MesPartProdGroup partProdGroup, List<MesCustSortInfo> sortInfoList, List<MesPartProdGroupDetail> details);
}

@ -0,0 +1,80 @@
package cn.estsh.i3plus.ext.mes.apiservice.schedulejob;
import cn.estsh.i3plus.ext.mes.api.base.IMesBtoJobService;
import cn.estsh.i3plus.mes.apiservice.schedulejob.BaseMesScheduleJob;
import cn.estsh.impp.framework.boot.init.ApplicationProperties;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.quartz.JobExecutionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
/*
{
"organizeCode": "CK01",
"partGroupCode": [
"CK01-Code",
"CK02-Code"
]
}
*/
/**
* @Description : BTO
* @Reference :
* @Author : castle
* @CreateDate : 2024-05-10 11:03
* @Modify:
**/
// 禁止 JOB 并发执行
@Component
@ApiOperation("Bto-job")
public class MesBtoJob extends BaseMesScheduleJob {
public static final Logger LOGGER = LoggerFactory.getLogger(MesBtoJob.class);
@Autowired
private IMesBtoJobService btoJobService;
public MesBtoJob() {
super(MesBtoJob.class, "BTO生成工单");
this.setMultiInstance(true);
}
@Override
public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) {
try {
String jobParam = this.getJobParam();
if (StringUtils.isBlank(jobParam)) {
throw new IllegalArgumentException("jobc参数为空请检查参数");
}
Map<String, Object> paramMap;
try {
paramMap = (Map<String, Object>) JSONObject.parse(jobParam);
} catch (Exception e) {
LOGGER.error("参数格式不是JSON");
return;
}
if (CollectionUtils.isEmpty(paramMap)) {
LOGGER.error("BTO生成工单,没有配置参数");
return;
}
String organizeCode = (String) paramMap.get("organizeCode");
List<String> groupCodeList = (List<String>) paramMap.get("groupCode");
btoJobService.doCreateBto(organizeCode, groupCodeList);
LOGGER.info("缺陷告警配置job结束 ----- end");
} catch (Exception e) {
LOGGER.error("SAP接口表数据同步作业任务结束e:{}", e.toString());
}
}
}

@ -87,7 +87,7 @@ public class MesBomService extends BaseMesService<MesBom> implements IMesBomServ
new Object[]{CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), bom.getOrganizeCode(), bom.getItemPartNo()});
recursionBomList(resultList);
bom.setChildTreeList(resultList);
// bom.setChildTreeList(resultList);
}
}
return bomList;

@ -0,0 +1,77 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesBtoJobService;
import cn.estsh.i3plus.ext.mes.api.base.strategy.IRoundnessStrategy;
import cn.estsh.i3plus.pojo.mes.bean.MesCustomerMessagePoint;
import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroup;
import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroupDetail;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesCustSortInfo;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/2 11:51
* @Modify:
**/
@Service
@Slf4j
public class MesBtoJobServiceImpl implements IMesBtoJobService {
@Autowired
private MesPartProdGroupService mesPartProdGroupService;
@Autowired
private MesCustomerMessagePointService mesCustomerMessagePointService;
@Autowired
private MesCustSoftInfoServiceImpl mesCustSoftInfoService;
@Override
public void doCreateBto(String organizeCode, List<String> groupCodeList) {
//1. 根据 organizeCode 和 groupCodeList 查询零件生产组
List<MesPartProdGroup> mesPartProdGroups = mesPartProdGroupService.findMesPartProdGroups(organizeCode, groupCodeList);
for (MesPartProdGroup prodGroup : mesPartProdGroups) {
//2. 根据生产组的infoPointId 获取 过点信息TM_BAS_INFO_POINT
MesCustomerMessagePoint messagePoint = mesCustomerMessagePointService.getPointByCode(prodGroup.getCustInfoPoint(),organizeCode);
if (messagePoint == null){
log.info("客户的信息点{}不存在",prodGroup.getCustInfoPoint());
}
//3. 根据零件生产组中reuseSoftInfo 获取排序信息
// Integer isReuseSortInfo = prodGroup.getIsReuseSortInfo();
List<MesPartProdGroupDetail> details = mesPartProdGroupService.findDetailByCode(prodGroup.getPartProdGroupCode(), organizeCode);
List<String> custPartNoList = details.stream().map(MesPartProdGroupDetail::getCustPartNo).collect(Collectors.toList());
List<MesCustSortInfo> sortInfoList = mesCustSoftInfoService.queryCustSortInfoList(prodGroup.getCustCode(), prodGroup.getCustOrganizeCode(), prodGroup.getCustInfoPoint(), organizeCode, custPartNoList);
//4. 如果没有订单需要更新窗口时间 TM_BAS_PRODUCT_GROUP_WINDOW_TIME
//5. 根据零件生产组中是否有assyCode(总成类型),去校验 客户排序信息中,是否包含了零件发运组的零件
// custsortinfolist.where(c=> partproductgroupinfo.AssCode.contains(c.AssCode)) == 0 直接返回
List<MesCustSortInfo> countInfo = sortInfoList.stream().filter(item -> item.getAssyCode().equals(prodGroup.getPartType())).collect(Collectors.toList());
if (countInfo.isEmpty()){
continue;
}
//6. 根据零件生产组的RoundnessType 去做策略,现在只做 窗口时间 策略; 入参
String roundnessService = MesExtEnumUtil.SHIPPING_GROUP_ROUND_METHOD.valueOfService(prodGroup.getRoundType());
IRoundnessStrategy roundnessStrategy = (IRoundnessStrategy)SpringContextsUtil.getBean(roundnessService);
roundnessStrategy.execute(prodGroup,sortInfoList, details);
}
}
/**
*
* @param infoPointCode
* @param organizeCode
* @param partGroupId
* @return
*/
private List<MesCustSortInfo> getCustSortInfoList(String infoPointCode, String organizeCode, Long partGroupId,String partGroupCode){
return null;
}
}

@ -0,0 +1,38 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesCustSoftInfoService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesCustSortInfo;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/2 20:39
* @Modify:
**/
@Service
public class MesCustSoftInfoServiceImpl extends BaseMesService<MesCustSortInfo> implements IMesCustSoftInfoService {
@Override
public List<MesCustSortInfo> queryCustSortInfoList(String custCode, String custOrganizeCode, String infoPointCode, String organizeCode, List<String> custPartNoList) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(custCode,"custCode", ddlPackBean);
DdlPreparedPack.getStringEqualPack(custOrganizeCode, "custOrganizeCode", ddlPackBean);
DdlPreparedPack.getStringEqualPack(infoPointCode, "infoPointCode", ddlPackBean);
DdlPreparedPack.getInPackList(custPartNoList,"custPartNo", ddlPackBean);
return baseRDao.findByHqlWhere(ddlPackBean);
}
@Override
public void updateCustSortInfo(MesCustSortInfo custSortInfo) {
ConvertBean.saveOrUpdate(custSortInfo,"edi");
baseRDao.update(custSortInfo);
}
}

@ -11,6 +11,9 @@ import cn.estsh.impp.framework.boot.util.ValidatorBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class MesCustomerMessagePointService extends BaseMesService<MesCustomerMessagePoint> implements IMesCustomerMessagePointService {
@ -54,4 +57,12 @@ public class MesCustomerMessagePointService extends BaseMesService<MesCustomerMe
protected void setPackQueryBean(MesCustomerMessagePoint bean, DdlPackBean packBean) {
DdlPreparedPack.getStringEqualPack(bean.getCustOrganizeCode(), "custOrganizeCode", packBean);
}
@Override
public MesCustomerMessagePoint getPointByCode(String pointCode, String organizeCode) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(pointCode, "messageNo", ddlPackBean);
List<MesCustomerMessagePoint> messagePoints = baseRDao.findByHqlWhere(ddlPackBean);
return messagePoints.isEmpty() ? null: messagePoints.get(0);
}
}

@ -19,6 +19,7 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@ -44,6 +45,19 @@ public class MesPartProdGroupService extends BaseMesService<MesPartProdGroup> im
return baseRDao.findByHqlWhere(ddlPackBean);
}
@Override
public List<MesPartProdGroup> findMesPartProdGroups(String organizeCode, List<String> groupCodeList) {
DdlPackBean partGroupPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(groupCodeList,"partProdGroupCode",partGroupPackBean);
return baseRDao.findByHqlWhere(partGroupPackBean);
}
@Override
public List<MesPartProdGroupDetail> findDetailByCode(String partGroupCode,String organizeCode) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partGroupCode,"partProdGroupCode",ddlPackBean);
return mesPartProdGroupDetailRDao.findByHqlWhere(ddlPackBean);
}
protected void setPackQueryBean(MesPartProdGroup bean, DdlPackBean packBean) {

@ -81,7 +81,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
GenSerialNoModel genSerialNoModel = new GenSerialNoModel();
//若工单类型为排序 则根据排序插入工单数量插入多行 工单数量为1
if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) {
Integer produceSeq = 0;
Long produceSeq = 0L;
if (null != result && result.getProduceSeq() != null) {
produceSeq = result.getProduceSeq();
}
@ -111,7 +111,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
} else {
//生成工单号
genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO);
Integer produceSeq = 0;
Long produceSeq = 0L;
if (null != result && result.getProduceSeq() != null) {
produceSeq = result.getProduceSeq();
}

@ -0,0 +1,179 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.roundness;
import cn.estsh.i3plus.ext.mes.api.base.strategy.IRoundnessStrategy;
import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesCustSoftInfoServiceImpl;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
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.bean.shipping.MesCustSortInfo;
import cn.estsh.i3plus.pojo.mes.repository.IMesProdGroupPartBtoCountRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesPartSapRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProductVersionRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Description : spring
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/2 21:22
* @Modify:
**/
@Service
public class MesTimeRoundnessService implements IRoundnessStrategy {
private static final Logger log = LoggerFactory.getLogger(MesTimeRoundnessService.class);
@Autowired
private IMesProdGroupPartBtoCountRepository btoCountRao;
@Autowired
private MesPartSapRepository mesPartSapRao;
@Autowired
private MesProductVersionRepository mesProductVersionRao;
@Autowired
private MesWorkOrderRepository mesWorkOrderRao;
@Autowired
private MesCustSoftInfoServiceImpl custSoftInfoService;
@Override
public void execute(MesPartProdGroup partProdGroup, List<MesCustSortInfo> sortInfoList, List<MesPartProdGroupDetail> details) {
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
Long createSeq = Long.parseLong(dateFormat.format(new Date()));
//遍历零件生产组零件,过滤出
for (MesPartProdGroupDetail detail : details) {
//根据detail.id 获取
MesProdGroupPartBtoCount btoCountInfo = getByGroupPartId(detail.getId(), detail.getOrganizeCode());
//历史累计差异
double btoCount = btoCountInfo.getCurrentQty();
//获取圆整数量
double roundQty = detail.getRoundQty();
List<MesCustSortInfo> sortInfos = sortInfoList.stream().filter(info -> info.getCustPartNo().equals(detail.getCustPartNo())).collect(Collectors.toList());
if (sortInfos.isEmpty()) {
continue;
}
//本次排序需要的数量
Double qty = sortInfoList.stream().map(MesCustSortInfo::getQty).reduce(Double::sum).get() * detail.getProductPartQty();
qty -= btoCount;
//倍数
int multiple;
//如果上次累计的差异值大于当前排序信息累计值,则不需要生成加工单
if (qty <= 0) {
multiple = 0;
} else {
//看看多少倍乘以圆整数量就是需求数QTY就是多累积数
multiple = (int) Math.round(Math.ceil(Math.ceil(qty / roundQty)));
}
//获取生产零件信息
MesPartSap mesPartSap = getMesPart(detail.getProductPartNo(), detail.getOrganizeCode());
if (mesPartSap.getId() == null) {
log.info("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo());
throw ImppExceptionBuilder.newInstance().setErrorDetail("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo()).build();
}
MesWorkOrder mesWorkOrder = new MesWorkOrder();
mesWorkOrder.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.BTO.getValue());
mesWorkOrder.setWorkOrderSeq(createSeq.toString());
mesWorkOrder.setProduceSeq(createSeq);
mesWorkOrder.setOrganizeCode(detail.getOrganizeCode());
//产线
mesWorkOrder.setWorkCenterCode(detail.getWorkCenterCode());
//工位
mesWorkOrder.setWorkCellCode(detail.getWorkCellCode());
//生产日期,计划时间
List<MesCustSortInfo> sortInfosSorted = sortInfos.stream().sorted(Comparator.comparing(MesCustSortInfo::getMatchTime)).collect(Collectors.toList());
// workorderinfo.ProductDate = custsortinfopartlist.Min(d => d.MatchTime.GetValueOrDefault()).ToString("yyyy-MM-dd");
// workorderinfo.PlanStartTime = custsortinfopartlist.Min(d => d.MatchTime.GetValueOrDefault());
// workorderinfo.PlanEndTime = custsortinfopartlist.Max(d => d.MatchTime.GetValueOrDefault());
// 10. 根据工厂,产线,planStartTime 获取班次名称
String matchTime = sortInfosSorted.get(0).getMatchTime();
// 11. 是否将生成日期减一天
// 12.零件相关
mesWorkOrder.setPartNo(mesPartSap.getPartNo());
mesWorkOrder.setPartNameRdd(mesPartSap.getPartName());
// 13.生产版本 organizeCode + partNo
MesProductVersion prodVersion = getProdVersion(detail.getOrganizeCode(), mesPartSap.getPartNo());
if (prodVersion == null) {
log.info("请配置工厂:{},partNo:{}的生产版本", detail.organizeCode, mesPartSap.getPartNo());
}
String productVersion = prodVersion.getProductVersion();
mesWorkOrder.setProductVersion(productVersion);
// 14.bomCode partNo + 生产版本+ organizeCode
// 数量
double realQty = roundQty * multiple;
mesWorkOrder.setQty(realQty);
mesWorkOrder.setUnCompleteQty(realQty);
mesWorkOrder.setUnit(mesPartSap.getUnit());
if (partProdGroup.getIsAutoRelease() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
mesWorkOrder.setStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
} else {
mesWorkOrder.setStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
}
mesWorkOrder.setPartProdGroupCode(partProdGroup.getPartProdGroupCode());
//bto
btoCountInfo.setGroupPartId(detail.getId());
btoCountInfo.setOrganizeCode(detail.getOrganizeCode());
btoCountInfo.setRoundnessQty(roundQty);
btoCountInfo.setCurrentQty(realQty-qty);
ConvertBean.saveOrUpdate(btoCountInfo,"edi");
btoCountRao.save(btoCountInfo);
// 保存工单
ConvertBean.saveOrUpdate(mesWorkOrder, "edi");
mesWorkOrderRao.insert(mesWorkOrder);
//更新 custSortInfo 状态已解析
for (MesCustSortInfo sortInfo : sortInfos) {
sortInfo.setServiceFlag(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
custSoftInfoService.updateCustSortInfo(sortInfo);
}
}
}
private MesProdGroupPartBtoCount getByGroupPartId(Long groupPartId, String organizeCode) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(groupPartId, "groupPartId", ddlPackBean);
List<MesProdGroupPartBtoCount> btoCountList = btoCountRao.findByHqlWhere(ddlPackBean);
return btoCountList.isEmpty() ? new MesProdGroupPartBtoCount() : btoCountList.get(0);
}
private MesPartSap getMesPart(String productPartNo, String organizeCode) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(productPartNo, "partNo", ddlPackBean);
List<MesPartSap> parts = mesPartSapRao.findByHqlWhere(ddlPackBean);
return parts.isEmpty() ? new MesPartSap() : parts.get(0);
}
private MesProductVersion getProdVersion(String organizeCode, String partNo) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean);
List<MesProductVersion> mesProductVersionList = mesProductVersionRao.findByHqlWhere(ddlPackBean);
return mesProductVersionList.isEmpty() ? null : mesProductVersionList.get(0);
}
public static void main(String[] args) {
double qty = 7.00;
double roundQty = 3.00;
int multiple = (int) Math.round(Math.ceil(Math.ceil(qty / roundQty)));
System.out.println(multiple);
}
}
Loading…
Cancel
Save