生产开模统计数据发送

追溯报表开发
tags/yfai-mes-ext-v1.0
jun 1 year ago
parent 4326bbe286
commit f605d49d1d

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesCraftRouteDetail;
import io.swagger.annotations.ApiOperation;
import java.util.List;
@ -18,4 +19,7 @@ public interface IMesCraftRouteDetailService extends IBaseMesService<MesCraftRou
void updateMesCraftRouteDetailBatch(List<MesCraftRouteDetail> mesCraftRouteDetailList);
void deleteMesCraftRouteDetailBatch(String organizeCode, String userName, String craftRouteCode);
@ApiOperation("查找工艺路线")
List<MesCraftRouteDetail> findProdCraftRouteDetail(String organizeCode, String workCenterCode, String partNo);
}

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesProdCraftRoute;
import io.swagger.annotations.ApiOperation;
/**
* @Description :线
@ -10,4 +11,7 @@ import cn.estsh.i3plus.pojo.mes.bean.MesProdCraftRoute;
* @Modify:
**/
public interface IMesProdCraftRouteService extends IBaseMesService<MesProdCraftRoute> {
@ApiOperation("工艺路线代码")
String getCraftRouteCode(String organizeCode, String workCenterCode, String partNo);
}

@ -0,0 +1,19 @@
package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/28 9:20
* @Modify:
**/
public interface IMesProduceSnService extends IBaseMesService<MesProduceSn> {
@ApiOperation(value = "根据条码查询产品条码表")
List<MesProduceSn> findMesProduceSn(String organizeCode, String sn);
}

@ -0,0 +1,19 @@
package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/28 9:20
* @Modify:
**/
public interface IMesProductionRecordService extends IBaseMesService<MesProductionRecord> {
@ApiOperation(value = "根据条码查询设备加工记录表")
List<MesProductionRecord> findMesProductionRecord(String organizeCode, String sn);
}

@ -6,7 +6,11 @@ import cn.estsh.i3plus.ext.mes.pojo.model.report.MesProdRuleReportConditionModel
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.model.report.MesTraceabilityReportModel;
import cn.estsh.impp.framework.boot.util.ResultBean;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @Description : -
@ -34,4 +38,7 @@ public interface IMesYfReportService {
ResultBean queryMesProdRuleByPager(MesProdRuleReportConditionModel queryReportModel, Pager pager);
ListPager<MesProduceSn> queryMesSuspiciousSnMsgByPager(MesProduceSn mesProduceSn, Pager pager);
@ApiOperation("查询追溯报表")
List<MesTraceabilityReportModel> findTraceabilityReport(MesProduceSn mesProduceSn);
}

@ -0,0 +1,48 @@
package cn.estsh.i3plus.ext.mes.apiservice.controller.report;
import cn.estsh.i3plus.ext.mes.api.busi.report.IMesYfReportService;
import cn.estsh.i3plus.ext.mes.apiservice.config.AuthUtilExt;
import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.impp.framework.base.controller.MesBaseController;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description : Mes
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/28 14:17
* @Modify:
**/
@Api("Mes业务报表")
@RestController
@RequestMapping(MesCommonConstant.MES_YANFEN + "/report")
public class MesBusiReportController extends MesBaseController {
@Autowired
private IMesYfReportService mesYfReportService;
@ApiOperation(value = "查询追溯报表", notes = "查询追溯报表")
@GetMapping("/traceability/find")
public ResultBean findTraceabilityReport(MesProduceSn mesProduceSn) {
try {
ValidatorBean.beginValid(mesProduceSn).notNull("productSn", mesProduceSn.getProductSn());
mesProduceSn.setOrganizeCode(AuthUtilExt.getOrganizeCode());
return ResultBean.success("查询成功").setResultList(mesYfReportService.findTraceabilityReport(mesProduceSn));
} catch (ImppBusiException e) {
return ResultBean.fail(e);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -3,18 +3,20 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesCraftRouteDetailService;
import cn.estsh.i3plus.ext.mes.api.base.IMesCraftRouteService;
import cn.estsh.i3plus.ext.mes.api.base.IMesCraftService;
import cn.estsh.i3plus.ext.mes.api.base.IMesProdCraftRouteService;
import cn.estsh.i3plus.ext.mes.apiservice.config.AuthUtilExt;
import cn.estsh.i3plus.ext.mes.apiservice.unit.exception.MesException;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
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.common.Pager;
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.MesCraft;
import cn.estsh.i3plus.pojo.mes.bean.MesCraftRoute;
import cn.estsh.i3plus.pojo.mes.bean.MesCraftRouteDetail;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -44,6 +46,8 @@ public class MesCraftRouteDetailServiceImpl extends BaseMesService<MesCraftRoute
@Autowired
private IMesCraftService mesCraftService;
@Autowired
private IMesProdCraftRouteService mesProdCraftRouteService;
@Override
protected void setPackQueryBean(MesCraftRouteDetail bean, DdlPackBean packBean) {
@ -143,6 +147,17 @@ public class MesCraftRouteDetailServiceImpl extends BaseMesService<MesCraftRoute
new Object[]{userName, TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()}, ddlPackBean);
}
@Override
public List<MesCraftRouteDetail> findProdCraftRouteDetail(String organizeCode, String workCenterCode, String partNo) {
String craftRouteCode = mesProdCraftRouteService.getCraftRouteCode(organizeCode, workCenterCode, partNo);
if(StringUtil.isEmpty(craftRouteCode)){
return null;
}
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(craftRouteCode,"craftRouteCode",packBean);
return baseRDao.findByHqlWhere(packBean);
}
private void checkCraft(List<MesCraftRouteDetail> mesCraftRouteDetailList, String routeCode) {
//获取工艺路线信息
MesCraftRouteDetail craftRouteDetailFist = mesCraftRouteDetailList.iterator().next();

@ -1,5 +1,6 @@
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.IMesProdCraftRouteService;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.util.MesConstWords;
@ -8,6 +9,7 @@ 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.MesCraftRoute;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesProdCraftRoute;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.repository.MesCraftRouteRepository;
@ -17,7 +19,10 @@ 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;
import java.util.Objects;
/**
@ -35,6 +40,8 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
private MesCraftRouteRepository mesCraftRouteRDao;
@Autowired
private MesWorkCenterRepository mesWorkCenterRDao;
@Autowired
private IMesPartService mesPartService;
@Override
protected void setPackQueryBean(MesProdCraftRoute bean, DdlPackBean packBean) {
@ -45,6 +52,7 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
DdlPreparedPack.getStringEqualPack(bean.getPptCode(), "pptCode", packBean);
DdlPreparedPack.getStringLikerPack(bean.getPartNo(), "partNo", packBean);
}
@Override
protected void onInsertBean(MesProdCraftRoute item) {
// 数据校验
@ -68,7 +76,7 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
.setErrorDetail("工艺路线代码【%s】无效", item.getWorkCenterCode())
.build();
}
if(!StringUtil.isEmpty(workCenterCode)){//生产线维度配置 工艺路线类型必须与产线类型保持一致
if (!StringUtil.isEmpty(workCenterCode)) {//生产线维度配置 工艺路线类型必须与产线类型保持一致
//校验产线
MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(
new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID, "workCenterCode"},
@ -81,7 +89,7 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
.setErrorDetail("产线代码【%s】无效", item.getWorkCenterCode())
.build();
}
if(!Objects.equals(mesCraftRoute.getCraftRouteType(), mesWorkCenter.getCenterType())){//todo 工作版本",notes = "使用: 生产线类型: 排序/非排序
if (!Objects.equals(mesCraftRoute.getCraftRouteType(), mesWorkCenter.getCenterType())) {//todo 工作版本",notes = "使用: 生产线类型: 排序/非排序
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
@ -91,17 +99,17 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
item.setAreaCode(mesWorkCenter.getAreaCode());
}
//20 非排序类型
if(item.getCraftRouteType().equals("20")){
if(!StringUtil.isEmpty(partNo)){//零件维度配置 ①非排序类型的工艺路线直接跟物料关联,生产线与零件产品类型均不填
if(!StringUtil.isEmpty(workCenterCode) || !StringUtil.isEmpty(pptCode)){
if (item.getCraftRouteType().equals("20")) {
if (!StringUtil.isEmpty(partNo)) {//零件维度配置 ①非排序类型的工艺路线直接跟物料关联,生产线与零件产品类型均不填
if (!StringUtil.isEmpty(workCenterCode) || !StringUtil.isEmpty(pptCode)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工艺路线代码【%s】【非排序类型】【零件维度配置】生产线与零件产品类型均不填请检查数据", item.getCraftRouteCode())
.build();
}
}else if(!StringUtil.isEmpty(pptCode)){//零件产品类型维度配置 ①非排序类型的工艺路线直接跟零件产品类型关联,生产线与零件均不填
if(!StringUtil.isEmpty(workCenterCode) || !StringUtil.isEmpty(partNo)){
} else if (!StringUtil.isEmpty(pptCode)) {//零件产品类型维度配置 ①非排序类型的工艺路线直接跟零件产品类型关联,生产线与零件均不填
if (!StringUtil.isEmpty(workCenterCode) || !StringUtil.isEmpty(partNo)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
@ -109,24 +117,24 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
.build();
}
}
}else {//10 排序类型
if(StringUtil.isEmpty(workCenterCode)){
} else {//10 排序类型
if (StringUtil.isEmpty(workCenterCode)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工艺路线代码【%s】产线代码【%s】不能为空", item.getCraftRouteCode(), item.getWorkCenterCode())
.build();
}
if(!StringUtil.isEmpty(partNo)){//零件维度配置 -排序类型的工艺路线与生产线+零件关联,零件产品类型不填;
if( !StringUtil.isEmpty(pptCode)){
if (!StringUtil.isEmpty(partNo)) {//零件维度配置 -排序类型的工艺路线与生产线+零件关联,零件产品类型不填;
if (!StringUtil.isEmpty(pptCode)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工艺路线代码【%s】【排序类型】的工艺路线与生产线+零件关联,零件产品类型不填,请检查数据", item.getCraftRouteCode())
.build();
}
}else if(!StringUtil.isEmpty(pptCode)){//零件产品类型维度配置 -排序类型的工艺路线与生产线+零件产品类型关联,零件不填
if(!StringUtil.isEmpty(partNo)){
} else if (!StringUtil.isEmpty(pptCode)) {//零件产品类型维度配置 -排序类型的工艺路线与生产线+零件产品类型关联,零件不填
if (!StringUtil.isEmpty(partNo)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
@ -149,6 +157,7 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
.build();
}
}
@Override
protected void onUpdateBean(MesProdCraftRoute item) {
// 数据校验
@ -171,7 +180,7 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
.setErrorDetail("工艺路线代码【%s】无效", item.getWorkCenterCode())
.build();
}
if(!StringUtil.isEmpty(workCenterCode)){//生产线维度配置 工艺路线类型必须与产线类型保持一致
if (!StringUtil.isEmpty(workCenterCode)) {//生产线维度配置 工艺路线类型必须与产线类型保持一致
//校验产线
MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(
new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID, "workCenterCode"},
@ -184,7 +193,7 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
.setErrorDetail("产线代码【%s】无效", item.getWorkCenterCode())
.build();
}
if(!Objects.equals(mesCraftRoute.getCraftRouteType(), mesWorkCenter.getCenterType())){//todo 工作版本",notes = "使用: 生产线类型: 排序/非排序
if (!Objects.equals(mesCraftRoute.getCraftRouteType(), mesWorkCenter.getCenterType())) {//todo 工作版本",notes = "使用: 生产线类型: 排序/非排序
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
@ -194,17 +203,17 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
item.setAreaCode(mesWorkCenter.getAreaCode());
}
//20 非排序类型
if(item.getCraftRouteType().equals("20")){
if(!StringUtil.isEmpty(partNo)){//零件维度配置 ①非排序类型的工艺路线直接跟物料关联,生产线与零件产品类型均不填
if(!StringUtil.isEmpty(workCenterCode) || !StringUtil.isEmpty(pptCode)){
if (item.getCraftRouteType().equals("20")) {
if (!StringUtil.isEmpty(partNo)) {//零件维度配置 ①非排序类型的工艺路线直接跟物料关联,生产线与零件产品类型均不填
if (!StringUtil.isEmpty(workCenterCode) || !StringUtil.isEmpty(pptCode)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工艺路线代码【%s】【非排序类型】【零件维度配置】生产线与零件产品类型均不填请检查数据", item.getCraftRouteCode())
.build();
}
}else if(!StringUtil.isEmpty(pptCode)){//零件产品类型维度配置 ①非排序类型的工艺路线直接跟零件产品类型关联,生产线与零件均不填
if(!StringUtil.isEmpty(workCenterCode) || !StringUtil.isEmpty(partNo)){
} else if (!StringUtil.isEmpty(pptCode)) {//零件产品类型维度配置 ①非排序类型的工艺路线直接跟零件产品类型关联,生产线与零件均不填
if (!StringUtil.isEmpty(workCenterCode) || !StringUtil.isEmpty(partNo)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
@ -212,24 +221,24 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
.build();
}
}
}else {//10 排序类型
if(StringUtil.isEmpty(workCenterCode)){
} else {//10 排序类型
if (StringUtil.isEmpty(workCenterCode)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工艺路线代码【%s】产线代码【%s】不能为空", item.getCraftRouteCode(), item.getWorkCenterCode())
.build();
}
if(!StringUtil.isEmpty(partNo)){//零件维度配置 -排序类型的工艺路线与生产线+零件关联,零件产品类型不填;
if( !StringUtil.isEmpty(pptCode)){
if (!StringUtil.isEmpty(partNo)) {//零件维度配置 -排序类型的工艺路线与生产线+零件关联,零件产品类型不填;
if (!StringUtil.isEmpty(pptCode)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工艺路线代码【%s】【排序类型】的工艺路线与生产线+零件关联,零件产品类型不填,请检查数据", item.getCraftRouteCode())
.build();
}
}else if(!StringUtil.isEmpty(pptCode)){//零件产品类型维度配置 -排序类型的工艺路线与生产线+零件产品类型关联,零件不填
if(!StringUtil.isEmpty(partNo)){
} else if (!StringUtil.isEmpty(pptCode)) {//零件产品类型维度配置 -排序类型的工艺路线与生产线+零件产品类型关联,零件不填
if (!StringUtil.isEmpty(partNo)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
@ -253,4 +262,41 @@ public class MesProdCraftRouteServiceImpl extends BaseMesService<MesProdCraftRou
.build();
}
}
@Override
public String getCraftRouteCode(String organizeCode, String workCenterCode, String partNo) {
//按照物料查找工艺路线
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partNo, MesConstWords.PART_NO, packBean);
DdlPreparedPack.getIsNull("pptCode", packBean);
List<MesProdCraftRoute> prodCraftRouteList = baseRDao.findByHqlWhere(packBean);
if (!CollectionUtils.isEmpty(prodCraftRouteList)) {
return prodCraftRouteList.iterator().next().getCraftRouteCode();
}
MesPart partDb = mesPartService.getPartByPartNo(partNo, organizeCode);
if (null == partDb || StringUtils.isEmpty(partDb.getPptCode())) {
return null;
}
//按照物料产品类型查找工艺路线
packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partDb.getPptCode(), "pptCode", packBean);
DdlPreparedPack.getIsNull(MesConstWords.PART_NO, packBean);
prodCraftRouteList = baseRDao.findByHqlWhere(packBean);
if (!CollectionUtils.isEmpty(prodCraftRouteList)) {
return prodCraftRouteList.iterator().next().getCraftRouteCode();
}
//按照产线查找工艺路线
packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode, MesConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getIsNull(MesConstWords.PART_NO, packBean);
DdlPreparedPack.getIsNull("pptCode", packBean);
prodCraftRouteList = baseRDao.findByHqlWhere(packBean);
if (!CollectionUtils.isEmpty(prodCraftRouteList)) {
return prodCraftRouteList.iterator().next().getCraftRouteCode();
}
return null;
}
}

@ -0,0 +1,35 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesProduceSnService;
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.MesProduceSn;
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/28 9:27
* @Modify:
**/
@Service
@Slf4j
public class MesProduceSnServiceImpl extends BaseMesService<MesProduceSn> implements IMesProduceSnService {
@Override
public List<MesProduceSn> findMesProduceSn(String organizeCode, String sn) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(sn, "productSn", packBean);
List<MesProduceSn> produceSnList = baseRDao.findByHqlWhere(packBean);
if (CollectionUtils.isEmpty(produceSnList)) {
MesException.throwMesBusiException("条码【%s】信息不存在", sn);
}
return produceSnList;
}
}

@ -0,0 +1,37 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesProductionRecordService;
import cn.estsh.i3plus.ext.mes.apiservice.unit.exception.MesException;
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.MesProductionRecord;
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/28 9:27
* @Modify:
**/
@Service
@Slf4j
public class MesProductionRecordServiceImpl extends BaseMesService<MesProductionRecord> implements IMesProductionRecordService {
@Override
public List<MesProductionRecord> findMesProductionRecord(String organizeCode, String sn) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(sn, "productSn", packBean);
DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.ASC.getValue(),packBean);
List<MesProductionRecord> produceSnList = baseRDao.findByHqlWhere(packBean);
if (CollectionUtils.isEmpty(produceSnList)) {
MesException.throwMesBusiException("条码【%s】加工记录信息不存在", sn);
}
return produceSnList;
}
}

@ -1,10 +1,14 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.report;
import cn.estsh.i3plus.ext.mes.api.base.IMesProduceSnService;
import cn.estsh.i3plus.ext.mes.api.base.IMesProductionRecordService;
import cn.estsh.i3plus.ext.mes.api.busi.report.IMesYfReportService;
import cn.estsh.i3plus.ext.mes.apiservice.dao.report.IMesYfReportDao;
import cn.estsh.i3plus.ext.mes.pojo.model.report.MesDeviceDataQueryReportConditionModel;
import cn.estsh.i3plus.ext.mes.pojo.model.report.MesDeviceDataQueryReportResultModel;
import cn.estsh.i3plus.ext.mes.pojo.model.report.MesProdRuleReportConditionModel;
import cn.estsh.i3plus.mes.apiservice.util.DateUtil;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
@ -12,19 +16,25 @@ import cn.estsh.i3plus.pojo.base.common.PagerHelper;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleSortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.repository.MesProdRuleNoSortCfgRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProdRuleSortCfgRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.report.MesTraceabilityReportDataModel;
import cn.estsh.i3plus.pojo.mes.model.report.MesTraceabilityReportModel;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.ResultBean;
import jodd.util.StringUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @Description : -
@ -48,6 +58,18 @@ public class MesYfReportServiceImpl implements IMesYfReportService {
@Autowired
private MesProdRuleNoSortCfgRepository mesProdRuleNoSortCfgRepository;
@Autowired
private IMesProduceSnService mesProduceSnService;
@Autowired
private IMesProductionRecordService mesProductionRecordService;
@Autowired
private MesProductionAssemblyRepository mesProductionAssemblyRepository;
@Autowired
private MesWorkCellScanMonitorLogRepository mesWorkCellScanMonitorLogRepository;
@Override
public ListPager<MesDeviceDataQueryReportResultModel> queryMesDeviceDataByPager(MesDeviceDataQueryReportConditionModel queryReportModel, Pager pager) {
ListPager<MesDeviceDataQueryReportResultModel> mesDeviceDataQueryReportResultModelListPager =
@ -70,7 +92,7 @@ public class MesYfReportServiceImpl implements IMesYfReportService {
pager = PagerHelper.getPager(pager, mesProdRuleSortCfgRepository.findByHqlWhereCount(queryPackBean));
List<MesProdRuleSortCfg> mesProdRuleSortCfgList = mesProdRuleSortCfgRepository.findByHqlWherePage(queryPackBean, pager);
return ResultBean.success("查询设备数据成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setListPager(new ListPager(mesProdRuleSortCfgList, pager));
}else {
} else {
//查询“非排序产品加工规则配置”
DdlPreparedPack.getStringEqualPack(queryReportModel.getInPartNo(), "inPartNo", queryPackBean);
DdlPreparedPack.getStringEqualPack(queryReportModel.getInPartNoRule(), "inPartNoRule", queryPackBean);
@ -91,9 +113,9 @@ public class MesYfReportServiceImpl implements IMesYfReportService {
DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBean);
DdlPreparedPack.getStringEqualPack(bean.getProductSn(), "productSn", packBean);
DdlPreparedPack.getStringEqualPack(bean.getLotNo(), "lotNo", packBean);
if(!StringUtil.isEmpty(bean.orderBy())){
if (!StringUtil.isEmpty(bean.orderBy())) {
packBean.setOrderByStr(bean.orderBy());
}else {
} else {
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
}
pager = PagerHelper.getPager(pager, mesProduceSnRDao.findByHqlWhereCount(packBean));
@ -102,4 +124,95 @@ public class MesYfReportServiceImpl implements IMesYfReportService {
return new ListPager<>(resultList, pager);
}
@Override
public List<MesTraceabilityReportModel> findTraceabilityReport(MesProduceSn mesProduceSn) {
DdlPackBean packBean = getDdlPackBean(mesProduceSn);
//查询条码记录表
List<MesProduceSn> produceSnList = mesProduceSnService.findMesProduceSn(mesProduceSn.getOrganizeCode(), mesProduceSn.getOrganizeCode());
Map<String, MesProduceSn> mesProduceSnMap = produceSnList.stream().collect(Collectors.toMap(MesProduceSn::getPartNo, t -> t));
//设备加工记录表
List<MesProductionRecord> productionRecordList = mesProductionRecordService.findMesProductionRecord(mesProduceSn.getOrganizeCode(), mesProduceSn.getOrganizeCode());
Map<String, List<MesProductionRecord>> productionRecordMap = productionRecordList.stream().collect(Collectors.groupingBy(MesProductionRecord::getPartNo));
//装配记录表
List<MesProductionAssembly> productionAssemblyList = mesProductionAssemblyRepository.findByHqlWhere(packBean);
Map<String, List<MesProductionAssembly>> productionAssemblyMap = CollectionUtils.isEmpty(productionAssemblyList) ? null : productionAssemblyList.stream().collect(Collectors.groupingBy(t -> t.getPartNo() + t.getWorkCenterCode() + t.getWorkCellCode() + t.getEquipmentCode()));
//工位扫描监控日志
List<MesWorkCellScanMonitorLog> mesWorkCellScanMonitorLogs = mesWorkCellScanMonitorLogRepository.findByHqlWhere(packBean);
Map<String, List<MesWorkCellScanMonitorLog>> mesWorkCellScanMonitorMap = CollectionUtils.isEmpty(mesWorkCellScanMonitorLogs) ? null : mesWorkCellScanMonitorLogs.stream().collect(Collectors.groupingBy(t -> t.getPartNo() + t.getWorkCenterCode() + t.getWorkCellCode() + t.getEquipmentCode()));
//数据组装
List<MesTraceabilityReportModel> mesTraceabilityReportModelList = new ArrayList<>();
for (Map.Entry<String, MesProduceSn> produceSnEntry : mesProduceSnMap.entrySet()) {
MesTraceabilityReportModel mesTraceabilityReportModel = new MesTraceabilityReportModel();
BeanUtils.copyProperties(produceSnEntry.getValue(), mesTraceabilityReportModel);
if (productionRecordMap.containsKey(produceSnEntry.getKey())) {
List<MesProductionRecord> mesProductionRecordList = productionRecordMap.get(produceSnEntry.getKey());
int duration = 0;
for (MesProductionRecord mesProductionRecord : mesProductionRecordList) {
MesTraceabilityReportDataModel dataModel = new MesTraceabilityReportDataModel();
BeanUtils.copyProperties(mesProductionRecord, dataModel);
//持续时间
if (StringUtil.isNotEmpty(dataModel.getStartDateTime()) && StringUtil.isNotEmpty(dataModel.getCompleteDateTime())) {
dataModel.setDuration(getTimeDifference(dataModel.getStartDateTime(), dataModel.getCompleteDateTime()));
dataModel.setDurationStr(dateFormat(dataModel.getDuration()));
duration += dataModel.getDuration();
}
//装配记录表
String key = mesProductionRecord.getPartNo() + mesProductionRecord.getWorkCenterCode() + mesProductionRecord.getWorkCellCode() + mesProductionRecord.getEquipmentCode();
if (!Objects.isNull(productionAssemblyMap) && productionAssemblyMap.containsKey(key)) {
dataModel.setProductionAssemblyList(productionAssemblyMap.get(key));
}
//工位扫描监控日志
if (!Objects.isNull(mesWorkCellScanMonitorMap) && mesWorkCellScanMonitorMap.containsKey(key)) {
dataModel.setMesWorkCellScanMonitorLogs(mesWorkCellScanMonitorMap.get(key));
}
mesTraceabilityReportModel.getMesTraceabilityReportDataModelList().add(dataModel);
}
//开始时间
mesTraceabilityReportModel.setProduceBegin(mesProductionRecordList.iterator().next().getStartDateTime());
//结束时间
if (mesTraceabilityReportModel.getSnStatus() >= MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue()) {
mesTraceabilityReportModel.setProduceEnd(mesProductionRecordList.get(mesProductionRecordList.size() - 1).getCompleteDateTime());
}
mesTraceabilityReportModel.setDurationStr(dateFormat(duration));
mesTraceabilityReportModel.setDuration(duration);
}
mesTraceabilityReportModelList.add(mesTraceabilityReportModel);
}
return mesTraceabilityReportModelList;
}
private DdlPackBean getDdlPackBean(MesProduceSn mesProduceSn) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesProduceSn.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesProduceSn.getProductSn(), "productSn", packBean);
DdlPreparedPack.getOrderBy(null, null, packBean);
return packBean;
}
public static String dateFormat(int secound) {
StringBuilder time = new StringBuilder();
SimpleDateFormat destFormat = new SimpleDateFormat(DateUtil.SHORT_FORMAT_HOUR_MINUTE);
try {
// 将时间差转换为小时、分钟和秒
long diffSeconds = (secound) % 60;
long diffMinutes = (secound / 60) % 60;
long diffHours = secound / (60 * 60);
return destFormat.format(destFormat.parse(time.append(diffHours).append(":").append(diffMinutes).append(":").append(diffSeconds).toString()));
} catch (ParseException var17) {
var17.printStackTrace();
return null;
}
}
public int getTimeDifference(String startTime, String endTime) {
try {
return TimeTool.getSecoundsBetweenTime(1, startTime, endTime);
} catch (ParseException var17) {
var17.printStackTrace();
return 0;
}
}
}

Loading…
Cancel
Save