设备停机

tags/yfai-mes-ext-v2.2
xiangwei.zhang 7 months ago
parent 2c1936b5ea
commit d96f360a0f

@ -1,8 +1,11 @@
package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesDowntimeRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipment;
import cn.estsh.i3plus.pojo.mes.model.report.MesDowntimeRecordResModel;
import java.util.List;
@ -20,4 +23,6 @@ public interface IMesDowntimeRecordService extends IBaseMesService<MesDowntimeRe
* @param mesEquipmentList
*/
void doMesDowntimeRecordJob(String organizeCode, List<MesEquipment> mesEquipmentList);
ListPager<MesDowntimeRecordResModel> queryRecordList(MesDowntimeRecord downtimeRecord, Pager pager);
}

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.apiservice.schedulejob.MesAccountJob;
import cn.estsh.i3plus.ext.mes.apiservice.schedulejob.MesDowntimeRecordJob;
import cn.estsh.i3plus.ext.mes.apiservice.schedulejob.MesGenerateAccountJob;
import cn.estsh.i3plus.ext.mes.apiservice.schedulejob.MesWorkOrderUpdateQtyJob;
import io.swagger.annotations.ApiOperation;
@ -23,6 +24,9 @@ public class TestController {
@Autowired
private MesGenerateAccountJob mesGenerateAccountJob;
@Autowired
private MesDowntimeRecordJob mesDowntimeRecordJob;
@GetMapping("/reportOrder")
@ApiOperation(value = "报工")
public void reportOrder() {
@ -40,4 +44,11 @@ public class TestController {
public void generateMesAccount() {
mesGenerateAccountJob.executeMesJob(null, null);
}
@GetMapping("/mesDowntimeRecordJob")
@ApiOperation(value = "downtime")
public void mesDowntimeRecordJob() {
mesDowntimeRecordJob.executeMesJob(null, null);
}
}

@ -1,13 +1,17 @@
package cn.estsh.i3plus.ext.mes.apiservice.controller.report;
import cn.estsh.i3plus.ext.mes.api.base.IMesDowntimeRecordService;
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.config.AuthUtilExt;
import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesDowntimeRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.model.MesProductionRecordModel;
import cn.estsh.i3plus.pojo.mes.model.report.MesDowntimeRecordResModel;
import cn.estsh.i3plus.pojo.mes.model.report.MesProductAccountModel;
import cn.estsh.i3plus.pojo.mes.model.report.MesProductAccountResModel;
import cn.estsh.impp.framework.base.controller.MesBaseController;
@ -44,6 +48,9 @@ public class MesBusiReportController extends MesBaseController {
@Autowired
private IMesProductionRecordService mesProductionRecordService;
@Autowired
private IMesDowntimeRecordService mesDowntimeRecordService;
@ApiOperation(value = "查询追溯报表", notes = "查询追溯报表")
@GetMapping("/traceability/find")
public ResultBean findTraceabilityReport(MesProduceSn mesProduceSn) {
@ -125,4 +132,20 @@ public class MesBusiReportController extends MesBaseController {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@ApiOperation(value = "设备停机记录报表", notes = "设备停机记录报表")
@GetMapping("/equipment/downtime/record")
public ResultBean downtimeRecord(MesDowntimeRecord mesDowntimeRecord, Pager pager) {
try {
ListPager<MesDowntimeRecordResModel> recordList = mesDowntimeRecordService.queryRecordList(mesDowntimeRecord, pager);
return ResultBean.success("查询成功").setListPager(recordList);
} catch (ImppBusiException e) {
return ResultBean.fail(e);
} catch (Exception e) {
e.printStackTrace();
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -21,6 +21,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
@ -34,6 +35,7 @@ import java.util.List;
**/
@DisallowConcurrentExecution
@ApiOperation("MES设备生产停机记录")
@Service
public class MesDowntimeRecordJob extends BaseMesScheduleJob {
public static final Logger LOGGER = LoggerFactory.getLogger(MesDowntimeRecordJob.class);
@ -60,9 +62,9 @@ public class MesDowntimeRecordJob extends BaseMesScheduleJob {
public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) {
try {
String jobParam = this.getJobParam();
//String jobParam = "CK01";
if (StringUtils.isBlank(jobParam)) {
throw new IllegalArgumentException("job参数为空请检查参数");
jobParam = "CK01";
}
String[] organizeCodeList = jobParam.split(",");
LOGGER.info("MES设备生产停机记录 -----start");

@ -2,31 +2,37 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.api.base.IMesConfigService;
import cn.estsh.i3plus.ext.mes.api.base.IMesDowntimeRecordService;
import cn.estsh.i3plus.ext.mes.apiservice.utils.BeanUtil;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.platform.common.util.MesConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
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.*;
import cn.estsh.i3plus.pojo.mes.repository.MesDowntimeRecordRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWcEquipmentRepository;
import cn.estsh.i3plus.pojo.mes.model.report.MesDowntimeRecordResModel;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import cn.hutool.core.stream.CollectorUtil;
import com.codepoetics.protonpack.collectors.CollectorUtils;
import com.xxl.job.core.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.map.HashedMap;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -46,10 +52,26 @@ public class MesDowntimeRecordServiceImpl extends BaseMesService<MesDowntimeReco
private MesDowntimeRecordRepository mesDowntimeRecordRDao;
@Autowired
private IMesConfigService mesConfigService;
private IMesBasDowntimeReasonRepository downtimeReasonRepository;
@Autowired
private IMesBasDowntimeReasonTypeRepository downtimeReasonTypeRepository;
@Autowired
private MesWcEquipmentRepository wcEquipmentRepository;
@Autowired
private MesEquipmentRepository equipmentRepository;
@Autowired
private IMesConfigService mesConfigService;
@Autowired
private MesWorkCenterRepository workCenterRepository;
@Autowired
private MesWorkCellRepository workCellRepository;
@Override
protected void setPackQueryBean(MesDowntimeRecord bean, DdlPackBean packBean) {
DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBean);
@ -117,10 +139,12 @@ public class MesDowntimeRecordServiceImpl extends BaseMesService<MesDowntimeReco
if(!StringUtil.isEmpty(type)){
DdlPreparedPack.getStringEqualPack(type, "reasonTypeCode", ddlPackBeanDowntime);
}
MesDowntimeRecord mesDowntimeRecordDao = mesDowntimeRecordRDao.getByProperty(ddlPackBeanDowntime);
if (StringUtil.isEmpty(mesDowntimeRecordDao)) {
DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBeanDowntime);
List<MesDowntimeRecord> mesDowntimeRecordDaoList = mesDowntimeRecordRDao.findByHqlTopWhere(ddlPackBeanDowntime, 1);
if (CollectionUtils.isEmpty(mesDowntimeRecordDaoList)) {
MesWcEquipment wcEquipmentDbList = wcEquipmentRepository.getByProperty(
new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID,""},
new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID,"equipmentCode"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(),
mesEquipment.getEquipmentCode()});
//新增设备停机记录
@ -134,6 +158,8 @@ public class MesDowntimeRecordServiceImpl extends BaseMesService<MesDowntimeReco
mesDowntimeRecord.setReasonCode(StringUtil.isEmpty(reason)?"21":reason);
mesDowntimeRecord.setReasonTypeCode(StringUtil.isEmpty(type)?"6":type);
ConvertBean.serviceModelInitialize(mesDowntimeRecord, "MesDowntimeRecordJob");
mesDowntimeRecord.setSystemSyncStatus(2);
mesDowntimeRecord.setModifyDatetime(null);
//将当前新增数据的create_date_time时间些到上一条记录的modify_date_time字段
DdlPackBean ddlPackBeanOt = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesEquipment.getEquipmentCode(), "equipmentCode", ddlPackBeanOt);
@ -147,12 +173,172 @@ public class MesDowntimeRecordServiceImpl extends BaseMesService<MesDowntimeReco
mesDowntimeRecordRDao.insert(mesDowntimeRecord);
}else {
ConvertBean.serviceModelUpdate(mesDowntimeRecordDao, "MesDowntimeRecordJob");
ConvertBean.serviceModelUpdate(mesDowntimeRecordDaoList.get(0), "MesDowntimeRecordJob");
mesDowntimeRecordDaoList.get(0).setSystemSyncStatus(2);
mesDowntimeRecordRDao.update(mesDowntimeRecordDaoList.get(0));
}
} else {
DdlPackBean ddlPackBeanDowntime = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesEquipment.getEquipmentCode(), "equipmentCode", ddlPackBeanDowntime);
if(!StringUtil.isEmpty(reason)){
DdlPreparedPack.getStringEqualPack(reason, "reasonCode", ddlPackBeanDowntime);
}
if(!StringUtil.isEmpty(type)){
DdlPreparedPack.getStringEqualPack(type, "reasonTypeCode", ddlPackBeanDowntime);
}
DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBeanDowntime);
MesDowntimeRecord mesDowntimeRecordDao = mesDowntimeRecordRDao.getByProperty(ddlPackBeanDowntime);
if (mesDowntimeRecordDao != null) {
mesDowntimeRecordDao.setModifyDatetime(mesProductionRecord.getCompleteDateTime());
mesDowntimeRecordRDao.update(mesDowntimeRecordDao);
}
}
}
}
@Override
public ListPager<MesDowntimeRecordResModel> queryRecordList(MesDowntimeRecord downtimeRecord, Pager pager) {
ListPager pagerList = new ListPager();
List<MesDowntimeRecordResModel> list = new ArrayList<>();
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
if (!StringUtils.isEmpty(downtimeRecord.getEquipmentCode())) {
DdlPreparedPack.getStringEqualPack(downtimeRecord.getEquipmentCode(), "equipmentCode", ddlPackBean);
}
if (!StringUtils.isEmpty(downtimeRecord.getWorkCenterCode())) {
DdlPreparedPack.getStringEqualPack(downtimeRecord.getWorkCenterCode(), "workCenterCode", ddlPackBean);
}
if (!StringUtils.isEmpty(downtimeRecord.getWorkCellCode())) {
DdlPreparedPack.getStringEqualPack(downtimeRecord.getWorkCellCode(), "workCellCode", ddlPackBean);
}
DdlPreparedPack.getStringEqualPack(downtimeRecord.getReasonTypeCode(),"reasonTypeCode", ddlPackBean);
if (!StringUtils.isEmpty(downtimeRecord.getCreateDatetime())) {
DdlPreparedPack.getStringBiggerPack(downtimeRecord.getCreateDatetime(), "createDatetime", ddlPackBean);
}
if (!StringUtils.isEmpty(downtimeRecord.getModifyDatetime())) {
DdlPreparedPack.getStringBiggerPack(downtimeRecord.getModifyDatetime(), "modifyDatetime", ddlPackBean);
}
List<MesDowntimeRecord> recordList = mesDowntimeRecordRDao.findByHqlWherePage(ddlPackBean, pager);
if (!CollectionUtils.isEmpty(recordList)) {
List<String> reasonCodeList = recordList.stream().map(MesDowntimeRecord::getReasonCode).distinct().collect(Collectors.toList());
List<String> reasonTypeCodeList = recordList.stream().map(MesDowntimeRecord::getReasonTypeCode).distinct().collect(Collectors.toList());
List<String> equipmentInfoList = recordList.stream().map(MesDowntimeRecord::getEquipmentCode).distinct().collect(Collectors.toList());
List<String> workCellList = recordList.stream().map(MesDowntimeRecord::getWorkCellCode).distinct().collect(Collectors.toList());
List<String> workCenterList = recordList.stream().map(MesDowntimeRecord::getWorkCenterCode).distinct().collect(Collectors.toList());
Map<String, List<MesDowntimeReason>> reasonMap = getReason(reasonCodeList);
Map<String, MesEquipment> equipmentMap = getEquipment(equipmentInfoList);
Map<String, MesWorkCenter> workCenterMap = getWorkCenter(workCenterList);
Map<String, MesWorkCell> workCellMap = getWorkCell(workCellList);
Map<String, List<MesDowntimeReasonType>> reasonTypeMap = getReasonType(reasonTypeCodeList);
recordList.stream().forEach(record -> {
MesDowntimeRecordResModel mesDowntimeRecordResModel = new MesDowntimeRecordResModel();
BeanUtils.copyProperties(record, mesDowntimeRecordResModel);
if (!StringUtils.isEmpty(record.getReasonCode())) {
if (reasonMap.get(record.getReasonCode()) != null) {
mesDowntimeRecordResModel.setReasonName(reasonMap.get(record.getReasonCode()).get(0).getReasonName());
}
}
if (!StringUtils.isEmpty(record.getReasonTypeCode())) {
if (reasonTypeMap.get(record.getReasonTypeCode()) != null) {
mesDowntimeRecordResModel.setReasonTypeName(reasonTypeMap.get(record.getReasonTypeCode()).get(0).getReasonTypeName());
}
}
if (!StringUtils.isEmpty(record.getEquipmentCode())) {
mesDowntimeRecordResModel.setEquipmentName(equipmentMap.get(record.getEquipmentCode()).getEquipmentName());
}
if (!StringUtils.isEmpty(record.getWorkCenterCode())) {
mesDowntimeRecordResModel.setWorkCenterName(workCenterMap.get(record.getWorkCenterCode()).getWorkCenterName());
}
if (!StringUtils.isEmpty(record.getWorkCellCode())) {
mesDowntimeRecordResModel.setWorkCellName(workCellMap.get(record.getWorkCellCode()).getWorkCellName());
}
// 如果停机结束时间还在,则需要补充动态停机时间,否则需要有停机时间
if (StringUtils.isEmpty(mesDowntimeRecordResModel.getModifyDatetime())) {
Date startTime = DateUtil.parseDateTime(mesDowntimeRecordResModel.getCreateDatetime());
Date currentTime = new Date();
Long time = (currentTime.getTime() - startTime.getTime())/1000;
mesDowntimeRecordResModel.setCurrentDownTime(time.intValue());
} else {
Date startTime = DateUtil.parseDateTime(mesDowntimeRecordResModel.getCreateDatetime());
Date endTime = DateUtil.parseDateTime(mesDowntimeRecordResModel.getModifyDatetime());
Long time = (endTime.getTime() - startTime.getTime())/1000;
mesDowntimeRecordResModel.setDownTime(time.intValue());
}
list.add(mesDowntimeRecordResModel);
});
}
pagerList.setObjectList(list);
pagerList.setObjectPager(pager);
return pagerList;
}
private Map<String, List<MesDowntimeReason>> getReason(List<String> reasonCodeList) {
Map<String, List<MesDowntimeReason>> reasonMap = new HashedMap();
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getInPackList(reasonCodeList, "reasonCode", ddlPackBean);
List<MesDowntimeReason> downtimeReasons = downtimeReasonRepository.findByHqlWhere(ddlPackBean);
if (!CollectionUtils.isEmpty(downtimeReasons)) {
reasonMap = downtimeReasons.stream().distinct().collect(Collectors.groupingBy(MesDowntimeReason::getReasonCode));
}
return reasonMap;
}
private Map<String, List<MesDowntimeReasonType>> getReasonType(List<String> reasonTypeCodeList) {
Map<String, List<MesDowntimeReasonType>> reasonMap = new HashedMap();
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getInPackList(reasonTypeCodeList, "reasonTypeCode", ddlPackBean);
List<MesDowntimeReasonType> downtimeReasonTypes = downtimeReasonTypeRepository.findByHqlWhere(ddlPackBean);
if (!CollectionUtils.isEmpty(downtimeReasonTypes)) {
reasonMap = downtimeReasonTypes.stream().collect(Collectors.groupingBy(MesDowntimeReasonType::getReasonTypeCode));
}
return reasonMap;
}
private Map<String, MesEquipment> getEquipment(List<String> equipmentList) {
Map<String, MesEquipment> equipmentMap = new HashedMap();
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getInPackList(equipmentList, "equipmentCode", ddlPackBean);
List<MesEquipment> equipments = equipmentRepository.findByHqlWhere(ddlPackBean);
if (!CollectionUtils.isEmpty(equipments)) {
equipmentMap = equipments.stream().collect(Collectors.toMap(MesEquipment::getEquipmentCode, m -> m));
}
return equipmentMap;
}
private Map<String, MesWorkCenter> getWorkCenter(List<String> workCenterList) {
Map<String, MesWorkCenter> workCenterMap = new HashedMap();
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getInPackList(workCenterList, "workCenterCode", ddlPackBean);
List<MesWorkCenter> workCenters = workCenterRepository.findByHqlWhere(ddlPackBean);
if (!CollectionUtils.isEmpty(workCenters)) {
workCenterMap = workCenters.stream().collect(Collectors.toMap(MesWorkCenter::getWorkCenterCode, m -> m));
}
return workCenterMap;
}
private Map<String, MesWorkCell> getWorkCell(List<String> equipmentList) {
Map<String, MesWorkCell> workCellMap = new HashedMap();
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getInPackList(equipmentList, "workCellCode", ddlPackBean);
List<MesWorkCell> workCells = workCellRepository.findByHqlWhere(ddlPackBean);
if (!CollectionUtils.isEmpty(workCells)) {
workCellMap = workCells.stream().collect(Collectors.toMap(MesWorkCell::getWorkCellCode, m -> m));
}
return workCellMap;
}
/**

@ -30,7 +30,7 @@ public class MesPartTransferDetailService extends BaseMesService<MesPartTransfer
ValidatorBean.checkNotNull(item.getPartNo(), "partNo不能为空");
ValidatorBean.checkNotNull(item.getCustPartNo(), "custPartNo不能为空" );
ValidatorBean.checkNotNull(item.getFeatureNo(), "featureNo不能为空");
// ValidatorBean.checkNotNull(item.getCustCode(), "custCode不能为空" );
// ValidatorBean.checkNotNull(item.getCustCode(), "custCode不能为空" );+
// ValidatorBean.checkNotNull(item.getMessageNo(), "messageNo不能为空");
// ValidatorBean.checkNotNull(item.getCustOrganizeCode(), "custOrganizeCode不能为空" );

Loading…
Cancel
Save