Merge remote-tracking branch 'origin/master'
| | |
| | | } |
| | | const pieChartVOS = ref([]); |
| | | pieChartVOS.value = data.pieChartVOS[0]; |
| | | |
| | | let oneFinish = ref(); |
| | | let twoFinish = ref(); |
| | | let oneunFinish = ref(); |
| | | let twounFinish = ref(); |
| | | if (pieChartVOS.length > 0) { |
| | | if (pieChartVOS.value.length > 0) { |
| | | if (load.value) { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedQuantity; |
| | | twoFinish = pieChartVOS.value[0].twoCompletedQuantity; |
| | |
| | | let oneFinish = ref(); |
| | | let ondDamage = ref(); |
| | | let oneunFinish = ref(); |
| | | if (pieChartVOS.length > 0) { |
| | | if (pieChartVOS.value.length > 0) { |
| | | if (temp.value) { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedQuantity; |
| | | ondDamage = pieChartVOS.value[0].oneDamageQuantity; |
| | |
| | | let twoFinish = ref(); |
| | | let oneunFinish = ref(); |
| | | let twounFinish = ref(); |
| | | if (pieChartVOS.length > 0) { |
| | | if (pieChartVOS.value.length > 0) { |
| | | if (edg.value) { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedQuantity; |
| | | twoFinish = pieChartVOS.value[0].twoCompletedQuantity; |
| | |
| | | let twoFinish = ref(); |
| | | let oneunFinish = ref(); |
| | | let twounFinish = ref(); |
| | | if (pieChartVOS.length > 0) { |
| | | if (pieChartVOS.value.length > 0) { |
| | | if (hollow.value) { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedQuantity; |
| | | twoFinish = pieChartVOS.value[0].twoCompletedQuantity; |
| | |
| | | public static final Integer A09_OUT_TARGET_POSITION = 2001; |
| | | public static final Integer A10_OUT_TARGET_POSITION = 2002; |
| | | |
| | | /** |
| | | * 卧式理片出片目标方向 |
| | | */ |
| | | public static final Integer ONE_OUT_TARGET_POSITION = 1; |
| | | public static final Integer TWO_OUT_TARGET_POSITION = 2; |
| | | /** |
| | | * 卧式理片 磨边前片台状态 |
| | | * 空闲 0 |
| | | * 忙碌 1 |
| | | * 禁用 2 |
| | | */ |
| | | public static final String OUT_FREE = "0"; |
| | | public static final String OUT_BUSY = "1"; |
| | | public static final String OUT_DISABLE = "2"; |
| | | public static final List<String> OUT_DISABLE_ALL = Arrays.asList("1", "2"); |
| | | |
| | | |
| | | /** |
| | | * A09出片目标位置 d02卧转立 钢化出片 3001 |
| | |
| | | */ |
| | | public class ConstSysConfig { |
| | | |
| | | |
| | | // 钢化炉数阈值 |
| | | public static final Integer CACHE_THRESHOLD = 1; |
| | | // 磨边参数换算率 |
| | | public static final Integer CACHE_RATIO = 2; |
| | | // 卧理最大长边 |
| | | // 卧理笼最大长边 |
| | | public static final Integer CACHE_CACHE_WIDTH = 3; |
| | | // 卧理最大短边 |
| | | // 卧理笼最大短边 |
| | | public static final Integer CACHE_CACHE_HEIGHT = 4; |
| | | // 磨边二线最大长边 |
| | | public static final Integer CACHE_MAX_FIRST_LENGTH = 5; |
| | | // 磨边二线最大短边 |
| | | public static final Integer CACHE_MAX_SECOND_LENGTH = 6; |
| | | // 磨边一线最大长边 |
| | | // 磨边一线最小长边 |
| | | public static final Integer CACHE_MIN_ONE_FIRST_LENGTH = 7; |
| | | // 磨边一线最大短边 |
| | | // 磨边一线最小短边 |
| | | public static final Integer CACHE_MIN_ONE_SECOND_LENGTH = 8; |
| | | // 磨边二线最大长边 |
| | | // 磨边二线最小长边 |
| | | public static final Integer CACHE_MIN_TWO_FIRST_LENGTH = 9; |
| | | // 磨边二线最大短边 |
| | | // 磨边二线最小短边 |
| | | public static final Integer CACHE_MIN_TWO_SECOND_LENGTH = 10; |
| | | // 卧理玻璃间隙 |
| | | public static final Integer CACHE_GLASS_GAP = 1; |
| | | public static final Integer CACHE_GLASS_GAP = 11; |
| | | // 卧理格子宽度 |
| | | public static final Integer CACHE_CELL_LENGTH = 12; |
| | | // 排序方式 |
| | | public static final Integer CACHE_SEQUENCE_ORDER_FALSE = 13; |
| | | // 排序方式 |
| | | // 二号线最大厚度(不包括) |
| | | public static final Integer CACHE_MAX_THICKNESS = 13; |
| | | |
| | | // 钢化出片排序方式 |
| | | public static final Integer CACHE_SEQUENCE_ORDER_TRUE = 14; |
| | | |
| | | // 一炉玻璃占用格子数 |
| | | public static final Integer VERTICAL_MINCOUNT = 15; |
| | | // 一炉玻璃占用格子数(调度) |
| | | public static final Integer VERTICAL_MIN_COUNT = 15; |
| | | // 大车宽度 |
| | | public static final Integer VERTICAL_CAR_WIDTH = 16; |
| | | // 格子宽度 |
| | | public static final Integer VERTICAL_SLOT_WIDTH = 17; |
| | | // 进片车最大玻璃数 |
| | | // 进片车最大玻璃数-1 |
| | | public static final Integer VERTICAL_IN_CAR_SIZE = 18; |
| | | // 出片车最大玻璃数 |
| | | public static final Integer VERTICAL_OUT_CAR_SIZE = 19; |
| | |
| | | // 格子最大高度 |
| | | public static final Integer VERTICAL_SLOT_MAX_HEIGHT = 22; |
| | | // 格子最大厚度 |
| | | public static final Integer VERTICAL_SLOT_MAXTHICKNESS = 23; |
| | | public static final Integer VERTICAL_SLOT_MAX_THICKNESS = 23; |
| | | // 钢出目标位置 |
| | | public static final Integer VERTICAL_TEMPERING_OUT_TARGET_POSITION = 24; |
| | | // 人工下片目标位置 |
| | | public static final Integer VERTICAL_ARTIFICIAL_OUT_TARGET_POSITION = 25; |
| | | |
| | | // 排序方式 |
| | | public static final Integer HOLLOW_SEQUENCE_ORDER = 26; |
| | | // 一炉玻璃占用格子数 |
| | | public static final Integer HOLLOW_MINCOUNT = 27; |
| | | |
| | | // 大车宽度 |
| | | public static final Integer HOLLOW_CAR_WIDTH = 28; |
| | | public static final Integer HOLLOW_CAR_WIDTH = 26; |
| | | // 格子宽度 |
| | | public static final Integer HOLLOW_SLOT_WIDTH = 29; |
| | | // 进片车最大玻璃数 |
| | | public static final Integer HOLLOW_IN_CAR_SIZE = 30; |
| | | public static final Integer HOLLOW_SLOT_WIDTH = 27; |
| | | // 进片车最大玻璃数-1 |
| | | public static final Integer HOLLOW_IN_CAR_SIZE = 28; |
| | | // 出片车最大玻璃数 |
| | | public static final Integer HOLLOW_OUT_CAR_SIZE = 31; |
| | | public static final Integer HOLLOW_OUT_CAR_SIZE = 29; |
| | | // 玻璃间隙 |
| | | public static final Integer HOLLOW_GLASS_GAP = 32; |
| | | // 钢化炉长度 |
| | | public static final Integer HOLLOW_X_MAX_SIZE = 33; |
| | | // 钢出目标位置 |
| | | public static final Integer HOLLOW_TEMPERING_OUT_TARGET_POSITION = 34; |
| | | // 人工下片目标位置 |
| | | public static final Integer HOLLOW_ARTIFICIAL_OUT_TARGET_POSITION = 35; |
| | | public static final Integer HOLLOW_GLASS_GAP = 30; |
| | | // 格子最大高度 |
| | | public static final Integer HOLLOW_SLOT_MAX_HEIGHT = 36; |
| | | public static final Integer HOLLOW_SLOT_MAX_HEIGHT = 31; |
| | | // 格子最大厚度 |
| | | public static final Integer HOLLOW_SLOT_MAXTHICKNESS = 37; |
| | | public static final Integer HOLLOW_SLOT_MAX_THICKNESS = 32; |
| | | |
| | | // 钢化炉长度 |
| | | public static final Integer TEMPERING_WIDTH = 38; |
| | | public static final Integer TEMPERING_WIDTH = 33; |
| | | // 钢化炉宽度 |
| | | public static final Integer TEMPERING_HEIGHT = 39; |
| | | public static final Integer TEMPERING_HEIGHT = 34; |
| | | |
| | | |
| | | |
| | |
| | | package com.mes.opctask.entity.request; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.mes.base.entity.PageRequest; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | |
| | | */ |
| | | @ApiModelProperty(value = "开始时间", position = 6) |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date beginDate; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @ApiModelProperty(value = "结束时间", position = 7) |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date endDate; |
| | | |
| | | } |
| | |
| | | |
| | | Boolean deleteConfig(Serializable id); |
| | | |
| | | String queryConfigValue(Serializable id); |
| | | Integer queryConfigValue(Serializable id); |
| | | |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | @Override |
| | | public String queryConfigValue(Serializable id) { |
| | | public Integer queryConfigValue(Serializable id) { |
| | | SysConfig sysConfig = this.queryConfigById(id); |
| | | if (sysConfig == null) { |
| | | log.info("系统配置查询为空,请检查该配置是否存在:{}", id); |
| | | return null; |
| | | } |
| | | return sysConfig.getConfigValue(); |
| | | return Integer.parseInt(sysConfig.getConfigValue()); |
| | | } |
| | | } |
| | | |
| | |
| | | public interface TemperingGlassInfoService extends MPJBaseService<TemperingGlassInfo> { |
| | | /** |
| | | * 等待中的玻璃 |
| | | * |
| | | * @return |
| | | */ |
| | | List<TemperingGlassInfo> selectWaitingGlassByOpc(); |
| | | |
| | | /** |
| | | * 等待中的玻璃 |
| | | * |
| | | * @return |
| | | */ |
| | | List<TemperingGlassInfo> selectWaitingGlass(); |
| | | |
| | | /** |
| | | * 进炉中的玻璃 |
| | | * |
| | | * @return |
| | | */ |
| | | List<TemperingGlassInfo> selectIntoGlass(TemperingGlassInfo temperingGlassInfo); |
| | | |
| | | /** |
| | | * 出炉中的玻璃 |
| | | * |
| | | * @return |
| | | */ |
| | | List<TemperingGlassInfo> selectOutGlass(); |
| | |
| | | package com.mes.temperingglass.service.impl; |
| | | |
| | | import com.baomidou.dynamic.datasource.annotation.DS; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.github.yulichang.base.MPJBaseServiceImpl; |
| | | import com.github.yulichang.query.MPJQueryWrapper; |
| | | import com.kangaroohy.milo.model.ReadWriteEntity; |
| | | import com.kangaroohy.milo.service.MiloService; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.entity.LoadGlassInfo; |
| | | import com.mes.glassinfo.mapper.GlassInfoMapper; |
| | |
| | | import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | import com.mes.temperingglass.mapper.TemperingGlassInfoMapper; |
| | | import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Service |
| | | @DS("north_glass_mes") |
| | | @Slf4j |
| | | public class TemperingGlassInfoServiceImpl extends MPJBaseServiceImpl<TemperingGlassInfoMapper, TemperingGlassInfo> implements TemperingGlassInfoService { |
| | | @Resource |
| | | TemperingGlassInfoMapper temperingMapper; |
| | | @Autowired |
| | | |
| | | @Resource |
| | | private GlassInfoMapper glassInfoMapper; |
| | | |
| | | @Autowired(required = false) |
| | | MiloService miloService; |
| | | |
| | | @Override |
| | | public List<TemperingGlassInfo> selectWaitingGlassByOpc() { |
| | | //获取等待进炉中的玻璃信息 |
| | | try { |
| | | ReadWriteEntity engineerEntity = miloService.readFromOpcUa("GH2S7.GH2S7.F09_ENGINEER_ID"); |
| | | ReadWriteEntity temperingLayoutIdEntity = miloService.readFromOpcUa("GH2S7.GH2S7.F09_TEMPERING_LAYOUT_ID"); |
| | | |
| | | if (null == engineerEntity || null == temperingLayoutIdEntity) { |
| | | engineerEntity = miloService.readFromOpcUa("GH2S7.GH2S7.F08_ENGINEER_ID"); |
| | | temperingLayoutIdEntity = miloService.readFromOpcUa("GH2S7.GH2S7.F08_TEMPERING_LAYOUT_ID"); |
| | | if (null == engineerEntity || null == temperingLayoutIdEntity) { |
| | | log.info("获取参数异常,结束本次任务"); |
| | | return new ArrayList<>(); |
| | | } |
| | | } |
| | | return this.list(new LambdaQueryWrapper<TemperingGlassInfo>() |
| | | .eq(TemperingGlassInfo::getEngineerId, engineerEntity.getValue() + "") |
| | | .eq(TemperingGlassInfo::getTemperingLayoutId, temperingLayoutIdEntity.getValue() + "")); |
| | | } catch (Exception e) { |
| | | log.info("获取钢化参数异常:{}", e); |
| | | return new ArrayList<>(); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<TemperingGlassInfo> selectWaitingGlass() { |
| | | //获取等待进炉中的玻璃信息 |
| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.edgglasstask.entity.EdgGlassTaskInfo; |
| | | import com.mes.edgglasstask.entity.request.EdgGlassInfoRequest; |
| | | import com.mes.edgglasstask.mapper.EdgGlassTaskInfoMapper; |
| | | import com.mes.edgglasstask.service.EdgGlassTaskInfoService; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import com.mes.tools.DateUtil; |
| | | import com.mes.utils.RedisUtil; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | |
| | | @Autowired |
| | | RedisUtil redisUtil; |
| | | @Resource |
| | | SysConfigService sysConfigService; |
| | | |
| | | @Value("${mes.ratio}") |
| | | private int ratio; |
| | | // @Value("${mes.ratio}") |
| | | // private int ratio; |
| | | |
| | | |
| | | @Override |
| | | public List<EdgGlassTaskInfo> selectEdgInfo() { |
| | | int ratio = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_RATIO); |
| | | EdgGlassInfoRequest request = redisUtil.getCacheObject("edgGlassRequest"); |
| | | |
| | | if (null == request) { |
| | |
| | | import io.swagger.annotations.ApiOperation; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | import com.mes.edgstoragecage.entity.vo.EdgSlotRemainVO; |
| | | import com.mes.largenscreen.entity.PieChartVO; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import org.springframework.security.core.parameters.P; |
| | | |
| | | import java.util.List; |
| | | |
| | |
| | | */ |
| | | public interface EdgStorageCageDetailsMapper extends MPJBaseMapper<EdgStorageCageDetails> { |
| | | |
| | | EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height); |
| | | EdgStorageCageDetails queryEdgStorageDetailsBySize(@Param("deviceId") int deviceId, @Param("currentSlot") int currentSlot, @Param("width") double width, |
| | | @Param("height") double height, @Param("cell") int cell, @Param("maxThickness") int maxThickness); |
| | | |
| | | EdgStorageCageDetails queryEdgStorageDetailsByLimitSize(@Param("deviceId") int deviceId, @Param("currentCell") Integer currentCell, |
| | | @Param("width") double width, @Param("height") double height, @Param("cell") int cell, |
| | | @Param("minOneFirstLength") int minOneFirstLength, @Param("minOneSecondLength") int minOneSecondLength, |
| | | @Param("maxTwoFirstLength") int maxTwoFirstLength, @Param("maxTwoSecondLength") int maxTwoSecondLength, |
| | | @Param("maxThickness") int maxThickness); |
| | | |
| | | List<CutDrawingVO> queryCutDrawingByEngineerId(@Param("engineerId") String engineerId, @Param("patternSequence") int patternSequence, @Param("isAll") int isAll); |
| | | |
| | | List<EdgSlotRemainVO> querySlotRemainWidth(@Param("cellLength") int cellLength, @Param("glassGap") int glassGap); |
| | | |
| | | |
| | | List<PieChartVO> queryPieChart(); |
| | | } |
| | |
| | | import com.github.yulichang.base.MPJBaseService; |
| | | import com.mes.damage.entity.request.DamageRequest; |
| | | import com.mes.edgstoragecage.entity.EdgStorageCageDetails; |
| | | import com.mes.edgstoragecage.entity.vo.CutDrawingVO; |
| | | import com.mes.edgstoragecage.entity.vo.EdgSlotRemainVO; |
| | | import com.mes.largenscreen.entity.PieChartVO; |
| | | |
| | |
| | | * @param deviceId |
| | | * @param width |
| | | * @param height |
| | | * @param cell |
| | | * @param maxThickness |
| | | * @return |
| | | */ |
| | | EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height); |
| | | EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height, int cell, int maxThickness); |
| | | |
| | | /** |
| | | * 按照尺寸,线路、线路最大最小尺寸获取符合要求的玻璃小片数据 |
| | | * |
| | | * @param deviceId |
| | | * @param width |
| | | * @param height |
| | | * @param maxThickness |
| | | * @return |
| | | */ |
| | | EdgStorageCageDetails queryEdgStorageDetailsByLimitSize(int deviceId, Integer currentCell, double width, double height, int cell, int minOneFirstLength, int minOneSecondLength, int maxTwoFirstLength, int maxTwoSecondLength, int maxThickness); |
| | | |
| | | String edgDetailsOperate(DamageRequest request); |
| | | |
| | |
| | | import com.mes.edgstoragecage.entity.vo.EdgStorageCageVO; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | * |
| | | * @return |
| | | */ |
| | | EdgStorageCage selectNearestEmpty(int currentSlot, boolean flag); |
| | | EdgStorageCage selectNearestEmpty(Integer currentCell, int deviceId, boolean flag); |
| | | |
| | | /** |
| | | * 按照设备号返回对应的笼内详情数据 |
| | |
| | | } |
| | | |
| | | @Override |
| | | public EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height) { |
| | | return baseMapper.queryEdgStorageDetailsBySize(deviceId, currentSlot, width, height); |
| | | public EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height, int cell, int maxThickness) { |
| | | return baseMapper.queryEdgStorageDetailsBySize(deviceId, currentSlot, width, height, cell, maxThickness); |
| | | } |
| | | |
| | | @Override |
| | | public EdgStorageCageDetails queryEdgStorageDetailsByLimitSize(int deviceId, Integer currentCell, double width, double height, int cell, int minOneFirstLength, int minOneSecondLength, int maxTwoFirstLength, int maxTwoSecondLength, int maxThickness) { |
| | | return baseMapper.queryEdgStorageDetailsByLimitSize(deviceId, currentCell, width, height, cell, minOneFirstLength, minOneSecondLength, maxTwoFirstLength, maxTwoSecondLength, maxThickness); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<PieChartVO> queryPieChart(){ |
| | | public List<PieChartVO> queryPieChart() { |
| | | return this.baseMapper.queryPieChart(); |
| | | } |
| | | } |
| | |
| | | package com.mes.edgstoragecage.service.impl; |
| | | |
| | | import cn.hutool.core.collection.CollectionUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.github.yulichang.base.MPJBaseServiceImpl; |
| | | import com.github.yulichang.toolkit.JoinWrappers; |
| | | import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.damage.entity.Damage; |
| | |
| | | import com.mes.edgstoragecage.entity.vo.EdgStorageCageVO; |
| | | import com.mes.edgstoragecage.mapper.EdgStorageCageDetailsMapper; |
| | | import com.mes.edgstoragecage.mapper.EdgStorageCageMapper; |
| | | import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; |
| | | import com.mes.edgstoragecage.service.EdgStorageCageService; |
| | | import com.mes.uppattenusage.entity.UpPattenUsage; |
| | | import com.mes.uppattenusage.mapper.UpPattenUsageMapper; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | DamageService damageService; |
| | | |
| | | @Override |
| | | public EdgStorageCage selectNearestEmpty(int currentSlot, boolean flag) { |
| | | public EdgStorageCage selectNearestEmpty(Integer currentSlot, int deviceId, boolean flag) { |
| | | List<EdgStorageCage> emptyList = this.selectJoinList(EdgStorageCage.class, new MPJLambdaWrapper<EdgStorageCage>() |
| | | .selectAll(EdgStorageCage.class) |
| | | .leftJoin(EdgStorageCageDetails.class, on -> on |
| | |
| | | .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)) |
| | | .isNull(EdgStorageCageDetails::getSlot) |
| | | .eq(EdgStorageCage::getEnableState, Const.SLOT_ON) |
| | | .eq(EdgStorageCage::getDeviceId, deviceId) |
| | | .last("order by abs(t.slot - " + currentSlot + ") asc limit 2") |
| | | ); |
| | | if (flag && CollectionUtil.isNotEmpty(emptyList)) { |
| | |
| | | package com.mes.job; |
| | | |
| | | import cn.hutool.core.collection.CollectionUtil; |
| | | import cn.hutool.core.lang.Assert; |
| | | import cn.hutool.json.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | import com.github.yulichang.query.MPJQueryWrapper; |
| | | import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | import com.mes.common.S7object; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.damage.entity.Damage; |
| | | import com.mes.damage.service.DamageService; |
| | | import com.mes.device.PlcParameterObject; |
| | | import com.mes.edgglasstask.entity.EdgGlassTaskInfo; |
| | | import com.mes.edgglasstask.service.EdgGlassTaskInfoService; |
| | | import com.mes.edgstoragecage.entity.EdgStorageCage; |
| | | import com.mes.edgstoragecage.entity.EdgStorageCageDetails; |
| | | import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; |
| | | import com.mes.edgstoragecage.service.EdgStorageCageService; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.taskcache.entity.TaskCache; |
| | | import com.mes.taskcache.service.TaskCacheService; |
| | | import com.mes.tools.WebSocketServer; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @Author : zhoush |
| | | * @Date: 2024/5/8 8:17 |
| | | * @Description: |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class CacheGlassTask { |
| | | |
| | | @Autowired |
| | | TaskCacheService taskCacheService; |
| | | @Autowired |
| | | GlassInfoService glassInfoService; |
| | | @Autowired |
| | | EdgStorageCageService edgStorageCageService; |
| | | @Autowired |
| | | EdgStorageCageDetailsService edgStorageCageDetailsService; |
| | | |
| | | @Autowired |
| | | EdgGlassTaskInfoService edgGlassTaskInfoService; |
| | | |
| | | @Autowired |
| | | WebSocketServer webServerService; |
| | | @Autowired |
| | | DamageService damageService; |
| | | |
| | | @Value("${mes.threshold}") |
| | | private int threshold; |
| | | |
| | | @Value("${mes.ratio}") |
| | | private int ratio; |
| | | |
| | | @Value("${mes.sequence.order}") |
| | | private boolean sequenceOrder; |
| | | |
| | | @Value("${mes.max.firstLength}") |
| | | private String firstLength; |
| | | |
| | | @Value("${mes.max.secondLength}") |
| | | private String secondLength; |
| | | |
| | | @Value("${mes.cache.cacheWidth}") |
| | | private double cacheWidth; |
| | | |
| | | @Value("${mes.cache.cacheHeight}") |
| | | private double cacheHeight; |
| | | |
| | | @Value("${mes.min.one.firstLength}") |
| | | private String minOneFirstLength; |
| | | |
| | | @Value("${mes.min.one.secondLength}") |
| | | private String minOneSecondLength; |
| | | |
| | | @Value("${mes.min.two.firstLength}") |
| | | private String minTwoFirstLength; |
| | | |
| | | @Value("${mes.min.two.secondLength}") |
| | | private String minTwoSecondLength; |
| | | |
| | | public static String engineerId = ""; |
| | | |
| | | // @Scheduled(fixedDelay = 1000) |
| | | public void plcHomeEdgTask() { |
| | | Date startDate = new Date(); |
| | | log.info("本次任务开始执行时间:{}", startDate); |
| | | PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | String taskRequestTypeValue = plcParameterObject.getPlcParameter("A06_request_word").getValue(); |
| | | String glassIdeValue = plcParameterObject.getPlcParameter("A05_scanning_ID").getValue(); |
| | | String confirmationWrodValue = plcParameterObject.getPlcParameter("MES_confirmation_word").getValue(); |
| | | //A08 A09表示线路相同 可做等价 无数据转int异常 |
| | | String out08Glassstate = plcParameterObject.getPlcParameter("A08_glass_status").getValue(); |
| | | String out10Glassstate = plcParameterObject.getPlcParameter("A10_glass_status").getValue(); |
| | | String confirmationWrodAddress = plcParameterObject.getPlcParameter("MES_confirmation_word").getAddress(); |
| | | String currentSlot = plcParameterObject.getPlcParameter("Current_slot").getValue(); |
| | | |
| | | // taskRequestTypeValue = "2"; |
| | | // out08Glassstate = "1"; |
| | | // out10Glassstate = "1"; |
| | | // currentSlot = "5"; |
| | | // confirmationWrodValue = "0"; |
| | | // glassIdeValue = "P24092706|15|5"; |
| | | |
| | | log.info("1、获取到的请求字为:{},获取到的扫描ID为:{},获取到的确认字为:{},获取到的出片状态分别为:A09:{}、A10:{},当前格子号为:{}", |
| | | taskRequestTypeValue, glassIdeValue, confirmationWrodValue, out08Glassstate, out10Glassstate, currentSlot); |
| | | |
| | | if ("0".equals(taskRequestTypeValue)) { |
| | | if ("0".equals(confirmationWrodValue)) { |
| | | log.info("2、获取到的请求字为0,且确认字为0,不执行任务"); |
| | | return; |
| | | } |
| | | log.info("2、获取到的请求字为0,将确认字改为0"); |
| | | S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, 0); |
| | | return; |
| | | } |
| | | if (!"0".equals(confirmationWrodValue)) { |
| | | log.info("2、获取到的请求字不为0,将确认字不为0,直接结束"); |
| | | return; |
| | | } |
| | | boolean result = edgStorageCageDetailsService.inToVerify(glassIdeValue); |
| | | if ("1".equals(taskRequestTypeValue) && result) { |
| | | log.info("2、进片请求,且确认字为0,执行进片任务,扫码重复ID验证【有重复=false,无重复=true】:{}", result); |
| | | inTo(glassIdeValue, confirmationWrodAddress, currentSlot); |
| | | } else if ("2".equals(taskRequestTypeValue)) { |
| | | //09空闲 :1 10空闲 :2 都空闲:3 其他0 |
| | | log.info("2、出片请求,且确认字为0,执行出片任务"); |
| | | outTo(Integer.parseInt(out08Glassstate), |
| | | Integer.parseInt(out10Glassstate), confirmationWrodAddress, "", Integer.parseInt(currentSlot)); |
| | | } else if ("3".equals(taskRequestTypeValue)) { |
| | | log.info("2、进片和出片都空闲,执行出片任务"); |
| | | //加笼子里面是否有玻璃,有先出,无玻璃先进 |
| | | boolean outFlase = outTo(Integer.parseInt(out08Glassstate), |
| | | Integer.parseInt(out10Glassstate), confirmationWrodAddress, glassIdeValue, Integer.parseInt(currentSlot)); |
| | | log.info("出片任务是否完成:{},且玻璃id:{}不为空则执行进片任务,扫码重复ID验证【有重复=false,无重复=true】:{}", outFlase, glassIdeValue, result); |
| | | if (!outFlase && StringUtils.isNotBlank(glassIdeValue) && result) { |
| | | inTo(glassIdeValue, confirmationWrodAddress, currentSlot); |
| | | } |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("本次任务结束时间:{},共耗时:{}ms", endDate, endDate.getTime() - startDate.getTime()); |
| | | } |
| | | |
| | | |
| | | // @Scheduled(fixedDelay = 1000) |
| | | public void dealDamageTask() { |
| | | Date startDate = new Date(); |
| | | log.info("卧式理片破损玻璃清除任务开始执行时间:{}", startDate); |
| | | List<TaskCache> taskCacheList = taskCacheService.list(new LambdaQueryWrapper<TaskCache>().in(TaskCache::getTaskStatus, Const.GLASS_STATE_DAMAGE_TAKE) |
| | | .in(TaskCache::getTaskType, Const.GLASS_CACHE_TYPE_OUT_ALL)); |
| | | if (CollectionUtils.isNotEmpty(taskCacheList)) { |
| | | //获取破损/拿走玻璃id |
| | | List<String> glassList = taskCacheList.stream().map(TaskCache::getGlassId).collect(Collectors.toList()); |
| | | //将磨边队列的数据删除 |
| | | edgGlassTaskInfoService.remove(new LambdaQueryWrapper<EdgGlassTaskInfo>().in(EdgGlassTaskInfo::getGlassId, glassList)); |
| | | //将任务表中的数据删除 |
| | | taskCacheService.remove(new LambdaQueryWrapper<TaskCache>().in(TaskCache::getGlassId, glassList).in(TaskCache::getTaskType, Const.GLASS_CACHE_TYPE_OUT_ALL)); |
| | | List<Damage> damageList = taskCacheList.stream().map(e -> { |
| | | Damage damage = new Damage(); |
| | | damage.setGlassId(e.getGlassId()); |
| | | damage.setLine(e.getEndCell()); |
| | | damage.setWorkingProcedure("磨边"); |
| | | damage.setRemark("磨边前卧式理片"); |
| | | damage.setStatus(1); |
| | | damage.setType(e.getTaskStatus()); |
| | | return damage; |
| | | }).collect(Collectors.toList()); |
| | | damageService.batchInsertDamage(damageList); |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("本次任务结束时间:{},共耗时:{}ms", endDate, endDate.getTime() - startDate.getTime()); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 进片任务 |
| | | * |
| | | * @param glassId |
| | | * @param confirmationWrodAddress |
| | | * @param currentSlot |
| | | */ |
| | | public void inTo(String glassId, String confirmationWrodAddress, String currentSlot) { |
| | | log.info("1、按照玻璃id:{}获取玻璃小片信息,当前格子为:{}", glassId, currentSlot); |
| | | |
| | | GlassInfo feedGlassInfo = glassInfoService.getOne( |
| | | new LambdaQueryWrapper<GlassInfo>() |
| | | .eq(GlassInfo::getGlassId, glassId) |
| | | ); |
| | | if (Math.max(feedGlassInfo.getWidth(), feedGlassInfo.getHeight()) > cacheWidth || Math.min(feedGlassInfo.getWidth(), feedGlassInfo.getHeight()) > cacheHeight) { |
| | | log.info("1.1、玻璃超过卧式理片最大尺寸:{}", feedGlassInfo); |
| | | return; |
| | | } |
| | | |
| | | //添加进片任务 查找空格 |
| | | EdgStorageCage nearestEmpty = edgStorageCageService.selectNearestEmpty(Integer.parseInt(currentSlot), Boolean.FALSE); |
| | | Assert.isTrue(null != nearestEmpty, "格子已满"); |
| | | log.info("2、查询卧式理片笼里面的空格:{}", nearestEmpty); |
| | | |
| | | //查询玻璃信息 |
| | | GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId)); |
| | | if (glassInfo == null) { |
| | | return; |
| | | } |
| | | if ((glassInfo.getWidth() < Double.parseDouble(minTwoFirstLength) && glassInfo.getHeight() < Double.parseDouble(minTwoSecondLength)) || (glassInfo.getWidth() < Double.parseDouble(minTwoSecondLength) && glassInfo.getHeight() < Double.parseDouble(minTwoFirstLength))) { |
| | | log.info("3、玻璃信息不符合进入理片笼最小尺寸,玻璃信息为{}", glassInfo); |
| | | return; |
| | | } |
| | | log.info("4、将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); |
| | | EdgStorageCageDetails details = new EdgStorageCageDetails(); |
| | | BeanUtils.copyProperties(glassInfo, details); |
| | | details.setState(Const.GLASS_STATE_IN); |
| | | details.setSlot(nearestEmpty.getSlot()); |
| | | details.setDeviceId(nearestEmpty.getDeviceId()); |
| | | edgStorageCageDetailsService.save(details); |
| | | damageService.deleteByGlassId(glassId); |
| | | log.info("5、玻璃信息已存入理片笼详情表,玻璃信息为{}", details); |
| | | //添加进片任务 |
| | | boolean taskCache = saveTaskCache(details.getGlassId(), 0, nearestEmpty.getSlot(), Const.GLASS_CACHE_TYPE_IN); |
| | | log.info("6、生成进片任务信息存入任务表是否完成:{}", taskCache); |
| | | |
| | | S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, 1); |
| | | log.info("7、发送确认字完成"); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 查询玻璃并进行交换 |
| | | * |
| | | * @param glassId |
| | | * @return |
| | | */ |
| | | public String queryAndChangeGlass(String glassId) { |
| | | GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId)); |
| | | // .inSql(GlassInfo::getEngineerId, "select engineer_id from engineering where state = 1")); |
| | | Assert.isFalse(null == glassInfo, "玻璃信息不存在"); //按照玻璃尺寸 |
| | | LambdaQueryWrapper<GlassInfo> queryWrapper = new LambdaQueryWrapper<GlassInfo>() |
| | | .eq(GlassInfo::getWidth, glassInfo.getWidth()) |
| | | .eq(GlassInfo::getHeight, glassInfo.getHeight()) |
| | | .eq(GlassInfo::getThickness, glassInfo.getThickness()) |
| | | .eq(GlassInfo::getFilmsid, glassInfo.getFilmsid()) |
| | | .eq(GlassInfo::getFlowCardId, glassInfo.getFlowCardId()) |
| | | .eq(GlassInfo::getTotalLayer, glassInfo.getTotalLayer()) |
| | | .eq(GlassInfo::getLayer, glassInfo.getLayer()) |
| | | .eq(GlassInfo::getEngineerId, glassInfo.getEngineerId()) |
| | | .notInSql(GlassInfo::getGlassId, "select distinct glass_id from edg_storage_cage_details " + |
| | | "where engineer_id = '" + glassInfo.getEngineerId() + "' and width = " + glassInfo.getWidth() + " and height = " + glassInfo.getHeight() |
| | | + " and state != 100") |
| | | .orderByAsc(GlassInfo::getTemperingLayoutId) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence) |
| | | .last("Limit 1"); |
| | | GlassInfo swapGlassInfo = glassInfoService.getOne(queryWrapper); |
| | | if (swapGlassInfo != null && !glassInfo.getGlassId().equals(swapGlassInfo.getGlassId())) { |
| | | String swapGlassId = swapGlassInfo.getGlassId(); |
| | | log.info("将玻璃{}和玻璃{},信息互换,进玻璃 {}", glassInfo, swapGlassInfo, swapGlassInfo); |
| | | swapGlassInfo.setGlassId(glassId); |
| | | glassInfo.setGlassId(swapGlassId); |
| | | glassInfoService.updateById(swapGlassInfo); |
| | | glassInfoService.updateById(glassInfo); |
| | | return swapGlassId; |
| | | } |
| | | return ""; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 查询卧式理片玻璃并进行交换 |
| | | * |
| | | * @param glassId |
| | | * @return |
| | | */ |
| | | public void queryEdgAndChangeGlass(String glassId, String swapGlassId) { |
| | | if (StringUtils.isBlank(swapGlassId)) { |
| | | log.info("当前出笼玻璃不存在需要替换的玻璃"); |
| | | return; |
| | | } |
| | | //获取待出笼的玻璃 |
| | | EdgStorageCageDetails glassInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getGlassId, glassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); |
| | | // 获取待出笼的玻璃需要替换的玻璃信息 |
| | | EdgStorageCageDetails swapGlassDetailInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getGlassId, swapGlassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); |
| | | |
| | | // 玻璃小片表中玻璃已经替换,更新卧理笼内现有的准备出笼的玻璃信息, |
| | | if (null == swapGlassDetailInfo) { |
| | | GlassInfo glassInfoBase = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | .eq(GlassInfo::getGlassId, glassId)); |
| | | //需要替换的玻璃为存进卧理,仅需更新当前需要出笼的玻璃信息即可 |
| | | edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getGlassId, glassId) |
| | | .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfoBase.getTemperingLayoutId()) |
| | | .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfoBase.getTemperingFeedSequence())); |
| | | } else { |
| | | //需要替换的玻璃都在卧理内,按照玻璃id对调玻璃信息:对调玻璃id即可 |
| | | edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getId, glassInfo.getId()) |
| | | .set(EdgStorageCageDetails::getTemperingLayoutId, swapGlassDetailInfo.getTemperingLayoutId()) |
| | | .set(EdgStorageCageDetails::getTemperingFeedSequence, swapGlassDetailInfo.getTemperingFeedSequence()) |
| | | ); |
| | | edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getId, swapGlassDetailInfo.getId()) |
| | | .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId()) |
| | | .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence()) |
| | | ); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 出片任务 |
| | | * |
| | | * @param out08Glassstate |
| | | * @param out10Glassstate |
| | | * @param confirmationWrodAddress |
| | | * @param glassId |
| | | * @param currentSlot |
| | | */ |
| | | public boolean outTo(int out08Glassstate, int out10Glassstate, String confirmationWrodAddress, String glassId, int currentSlot) { |
| | | //逻辑步骤: |
| | | // 0、A09、A10是否空闲,是否可以执行出片任务 |
| | | // 1、获取钢化版图是否超过阈值 |
| | | // 1.1、超过阈值:获取当前最小版图需要出片的玻璃信息 |
| | | // 1.1.1、获取两条线最后一次出片的任务信息 |
| | | // 1.1.2、按照出片信息去详情表查询格子在笼子里面剩余相同尺寸的玻璃数据 |
| | | // 1.1.3、判断哪条线玻璃数量在理片笼内的数据最少,决定最小版图走该条线(问题:如果这条线非空闲,直接结束) |
| | | // 1.2、未超过阈值: |
| | | // 1.2.1、获取程序那条线空闲 |
| | | // 1.2.2、获取该条线最后一次出片的任务信息 |
| | | // 1.2.3、按照出片信息去详情表查询格子在笼子里面剩余相同尺寸的玻璃数据且以版图id、版序升序排序 取第一块玻璃出片 |
| | | // 2、如果没有历史出片任务 |
| | | // 2.1、出当前版图id最小版序最小的玻璃(问题:两条线都没有历史任务,出片时两条线的玻璃尺寸相同,是否找尺寸不同的) |
| | | if ((out08Glassstate == 2 && out10Glassstate == 2) || (out08Glassstate == 0 && out10Glassstate == 0)) { |
| | | log.info("A09、A10为{},{}非自动状态,无法出片", out08Glassstate, out10Glassstate); |
| | | return Boolean.FALSE; |
| | | } |
| | | log.info("0、出片任务出的状态:A09:【{}】;A10:【{}】)", out08Glassstate, out10Glassstate); |
| | | //定义出片玻璃信息 |
| | | int endcell = 0; |
| | | EdgStorageCageDetails glassInfo = null; |
| | | |
| | | |
| | | boolean flag = queryMaxMinDiff(threshold); |
| | | log.info("1、获取钢化版图是否超过阈值:{}", flag); |
| | | if (flag) { |
| | | //获取当前最小版图需要出片的玻璃信息 |
| | | glassInfo = queryMinGlass(0.0, 0.0, glassId); |
| | | log.info("1.1、超过阈值:获取当前最小版图需要出片的玻璃信息:{}", glassInfo); |
| | | if (glassInfo == null) { |
| | | log.info("笼子内和待进片没有玻璃"); |
| | | return Boolean.FALSE; |
| | | } |
| | | EdgStorageCageDetails a09EdgGlass = queryGlassByTaskCache(Const.A09_OUT_TARGET_POSITION, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | EdgStorageCageDetails a10EdgGlass = queryGlassByTaskCache(Const.A10_OUT_TARGET_POSITION, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | endcell = queryLineByGlassInfo(a09EdgGlass, a10EdgGlass, glassInfo, out08Glassstate, out10Glassstate); |
| | | } else { |
| | | //按照状态判断两条线走那条线 |
| | | endcell = computerLineByState(out08Glassstate, out10Glassstate); |
| | | |
| | | if (out08Glassstate == 1 && out10Glassstate == 1) { |
| | | EdgStorageCageDetails a09EdgGlass = queryGlassByTaskCache(Const.A09_OUT_TARGET_POSITION, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | EdgStorageCageDetails a10EdgGlass = queryGlassByTaskCache(Const.A10_OUT_TARGET_POSITION, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | if (a09EdgGlass == null && a10EdgGlass == null) { |
| | | MPJQueryWrapper<EdgStorageCageDetails> wrapper = new MPJQueryWrapper<>(); |
| | | wrapper.select("count(t.glass_id), t.width, t.height") |
| | | .eq("t.state", Const.GLASS_STATE_IN) |
| | | .inSql("t.slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) |
| | | .groupBy("t.width, t.height"); |
| | | if (endcell == Const.A10_OUT_TARGET_POSITION) { |
| | | wrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | "on t.glass_id = t1.glass_id and (t1.first_length between " + minTwoFirstLength + " and " + firstLength |
| | | + " and t1.second_length between " + minTwoSecondLength + " and " + secondLength + ") "); |
| | | } else { |
| | | wrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | "on t.glass_id = t1.glass_id and (t1.first_length >=" + minOneFirstLength + " and t1.second_length>=" + minOneSecondLength + ") "); |
| | | } |
| | | wrapper.last("order by count(t.glass_id) desc limit 2"); |
| | | List<EdgStorageCageDetails> list = edgStorageCageDetailsService.list(wrapper); |
| | | if (CollectionUtil.isEmpty(list)) { |
| | | MPJQueryWrapper<GlassInfo> queryWrapper = new MPJQueryWrapper<GlassInfo>() |
| | | .selectAll(GlassInfo.class).eq("t.glass_id", glassId); |
| | | if (endcell == Const.A10_OUT_TARGET_POSITION) { |
| | | queryWrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | "on t.glass_id = t1.glass_id and (t1.first_length between " + minTwoFirstLength + " and " + firstLength |
| | | + " and t1.second_length between " + minTwoSecondLength + " and " + secondLength + ") "); |
| | | } else { |
| | | queryWrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | "on t.glass_id = t1.glass_id and (t1.first_length >=" + minOneFirstLength + " and t1.second_length>=" + minOneSecondLength + ") "); |
| | | } |
| | | GlassInfo one = glassInfoService.getOne(queryWrapper); |
| | | if (one != null) { |
| | | EdgStorageCageDetails resultDetails = new EdgStorageCageDetails(); |
| | | BeanUtils.copyProperties(one, resultDetails); |
| | | glassInfo = resultDetails; |
| | | } else { |
| | | log.info("获取笼内玻璃和待进片玻璃为空或者不符合磨边尺寸"); |
| | | } |
| | | } else { |
| | | glassInfo = queryMinGlass(list.get(0).getWidth(), list.get(0).getHeight(), glassId); |
| | | } |
| | | } else if (a09EdgGlass != null && a10EdgGlass != null) { |
| | | List<EdgStorageCageDetails> a09Count = queryGlassByTaskLine(Const.A09_OUT_TARGET_POSITION); |
| | | List<EdgStorageCageDetails> a10Count = queryGlassByTaskLine(Const.A10_OUT_TARGET_POSITION); |
| | | endcell = a09Count.size() > a10Count.size() ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | glassInfo = a09Count.size() > a10Count.size() ? queryMinGlass(a09EdgGlass.getWidth(), a09EdgGlass.getHeight(), glassId) |
| | | : queryMinGlass(a10EdgGlass.getWidth(), a10EdgGlass.getHeight(), glassId); |
| | | } else { |
| | | //按照历史任务获取需要执行的路线,如果该条线笼内无玻璃 走其他逻辑 |
| | | endcell = a09EdgGlass == null ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | List<EdgStorageCageDetails> details = queryGlassByTaskLine(endcell); |
| | | if (CollectionUtil.isEmpty(details)) { |
| | | int othercell = endcell == Const.A10_OUT_TARGET_POSITION ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | glassInfo = queryChangeGlassInfo(othercell, glassId); |
| | | } else { |
| | | glassInfo = a09EdgGlass != null ? queryMinGlass(a09EdgGlass.getWidth(), a09EdgGlass.getHeight(), glassId) |
| | | : queryMinGlass(a10EdgGlass.getWidth(), a10EdgGlass.getHeight(), glassId); |
| | | } |
| | | } |
| | | } else { |
| | | List<EdgStorageCageDetails> edgStorageCageDetails = queryGlassByTaskLine(endcell); |
| | | if (CollectionUtil.isNotEmpty(edgStorageCageDetails)) { |
| | | glassInfo = edgStorageCageDetails.get(0); |
| | | } else { |
| | | //获取笼内所有玻璃信息,包括待进片的 |
| | | List<EdgStorageCageDetails> glassList = queryEdgAllGlass(glassId); |
| | | if (CollectionUtil.isEmpty(glassList)) { |
| | | log.info("笼内和待进片都没有玻璃"); |
| | | return Boolean.FALSE; |
| | | } |
| | | if (glassList.size() == 1 && glassId.equals(glassList.get(0).getGlassId())) { |
| | | glassInfo = glassList.get(0); |
| | | } else { |
| | | int othercell = endcell == Const.A10_OUT_TARGET_POSITION ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | glassInfo = queryChangeGlassInfo(othercell, glassId); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return saveOutGlassMessageBySlot(glassInfo, endcell, confirmationWrodAddress, glassId, currentSlot); |
| | | } |
| | | |
| | | /** |
| | | * 获取笼子内所有玻璃信息,包括待进片的 |
| | | * |
| | | * @param glassId |
| | | */ |
| | | private List<EdgStorageCageDetails> queryEdgAllGlass(String glassId) { |
| | | List<EdgStorageCageDetails> glassList = new ArrayList<>(); |
| | | //获取待进片玻璃 |
| | | //todo: 获取正在执行的工程信息 |
| | | if (StringUtils.isNotBlank(glassId)) { |
| | | GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | .eq(GlassInfo::getGlassId, glassId)); |
| | | // .inSql(GlassInfo::getEngineerId, "select engineer_id from engineering where state = 1")); |
| | | EdgStorageCageDetails resultDetails = new EdgStorageCageDetails(); |
| | | BeanUtils.copyProperties(one, resultDetails); |
| | | glassList.add(resultDetails); |
| | | } |
| | | //获取笼内玻璃 |
| | | List<EdgStorageCageDetails> details = edgStorageCageDetailsService.selectJoinList(EdgStorageCageDetails.class, new MPJLambdaWrapper<EdgStorageCageDetails>().selectAll(EdgStorageCageDetails.class) |
| | | .leftJoin(EdgStorageCage.class, on -> on.eq(EdgStorageCage::getSlot, EdgStorageCageDetails::getSlot).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)) |
| | | .eq(EdgStorageCage::getEnableState, Const.SLOT_ON)); |
| | | glassList.addAll(details); |
| | | return glassList; |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 获取详情表内最大最小版图id的差值,判断是否出最小版图玻璃 |
| | | * |
| | | * @return |
| | | */ |
| | | public boolean queryMaxMinDiff(int threshold) { |
| | | //获取笼子内最大版图id和最小版图id插值,判断是否大于阈值,大于阈值直接出最小版图玻璃 |
| | | QueryWrapper<EdgStorageCageDetails> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.select("max(tempering_layout_id)-min(tempering_layout_id) as diff") |
| | | .eq("state", Const.GLASS_STATE_IN) |
| | | .inSql("slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON); |
| | | List<Object> list = edgStorageCageDetailsService.listObjs(queryWrapper); |
| | | //获取笼内玻璃版图差值是否大于阈值 |
| | | if (CollectionUtil.isNotEmpty(list)) { |
| | | Long diff = (Long) list.get(0); |
| | | return diff > threshold; |
| | | } else { |
| | | return Boolean.FALSE; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取当前最小版图需要出片的玻璃信息 |
| | | * |
| | | * @param width |
| | | * @param height |
| | | */ |
| | | private EdgStorageCageDetails queryMinGlass(double width, double height, String glassId) { |
| | | //获取表内版图id最小的玻璃信息 |
| | | EdgStorageCageDetails glassDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getState, 100) |
| | | .eq(width != 0, EdgStorageCageDetails::getWidth, width) |
| | | .eq(height != 0, EdgStorageCageDetails::getHeight, height) |
| | | .inSql(EdgStorageCageDetails::getSlot, "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) |
| | | .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, EdgStorageCageDetails::getTemperingFeedSequence) |
| | | .last("limit 1")); |
| | | if (StringUtils.isBlank(glassId)) { |
| | | return glassDetails; |
| | | } |
| | | GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | .eq(GlassInfo::getGlassId, glassId) |
| | | // .inSql(GlassInfo::getEngineerId, "select engineer_id from engineering where state = 1") |
| | | ); |
| | | EdgStorageCageDetails resultDetails = new EdgStorageCageDetails(); |
| | | BeanUtils.copyProperties(one, resultDetails); |
| | | if (null == glassDetails) { |
| | | return resultDetails; |
| | | } |
| | | return resultDetails.getTemperingLayoutId() <= glassDetails.getTemperingLayoutId() && resultDetails.getTemperingFeedSequence() > glassDetails.getTemperingFeedSequence() ? |
| | | resultDetails : glassDetails; |
| | | } |
| | | |
| | | /** |
| | | * 获取任务表中指定线路笼子内还剩余的玻璃信息 |
| | | */ |
| | | private List<EdgStorageCageDetails> queryGlassByTaskLine(int line) { |
| | | //获取任务表中最后一次出片的玻璃id |
| | | TaskCache taskCache = taskCacheService.queryGlassByTaskCache(line, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | if (null == taskCache) { |
| | | log.info("没有找到{}线任务信息", line); |
| | | return new ArrayList<>(); |
| | | } |
| | | MPJQueryWrapper<EdgStorageCageDetails> mpjLambdaWrapper = new MPJQueryWrapper<>(); |
| | | mpjLambdaWrapper.select("t1.*") |
| | | .innerJoin("edg_storage_cage_details t1 on t.width = t1.width and t.height = t1.height") |
| | | .eq("t.glass_id", taskCache.getGlassId()) |
| | | .ne("t1.glass_id", taskCache.getGlassId()) |
| | | .eq("t1.state", Const.GLASS_STATE_IN) |
| | | .inSql("t1.slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) |
| | | .orderByAsc("t1.tempering_layout_id") |
| | | .orderBy(Boolean.TRUE, sequenceOrder, "t1.tempering_feed_sequence"); |
| | | List<EdgStorageCageDetails> details = edgStorageCageDetailsService.selectJoinList(EdgStorageCageDetails.class, mpjLambdaWrapper); |
| | | if (CollectionUtil.isEmpty(details)) { |
| | | return new ArrayList<>(); |
| | | } |
| | | return details; |
| | | } |
| | | |
| | | /** |
| | | * 按照任务类型、线号获取任务信息 |
| | | * |
| | | * @param line |
| | | * @param taskTypes |
| | | * @return |
| | | */ |
| | | private EdgStorageCageDetails queryGlassByTaskCache(int line, List<Integer> taskTypes) { |
| | | TaskCache taskCache = taskCacheService.queryGlassByTaskCache(line, taskTypes); |
| | | if (null == taskCache) { |
| | | log.info("没有找到{}线任务信息", line); |
| | | return null; |
| | | } |
| | | return edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>().eq(EdgStorageCageDetails::getGlassId, taskCache.getGlassId()) |
| | | .inSql(EdgStorageCageDetails::getSlot, "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) |
| | | .last(" limit 1 ")); |
| | | } |
| | | |
| | | /** |
| | | * 按照任务玻璃信息和待出片玻璃信息获取出片路径 |
| | | * |
| | | * @param a08EdgStorageCageDetails 09号线出片玻璃信息 |
| | | * @param a10EdgStorageCageDetails 10号线出片玻璃信息 |
| | | * @param glassInfo 带出片玻璃信息 |
| | | * @param out08Glassstate 09号线空闲状态 |
| | | * @param out10Glassstate 10号线空闲状态 |
| | | * @return |
| | | */ |
| | | private Integer queryLineByGlassInfo(EdgStorageCageDetails a08EdgStorageCageDetails, EdgStorageCageDetails a10EdgStorageCageDetails, |
| | | EdgStorageCageDetails glassInfo, int out08Glassstate, int out10Glassstate) { |
| | | //存在出片任务 07为空 |
| | | if (out08Glassstate == 1 && out10Glassstate == 1) { |
| | | boolean b08 = a08EdgStorageCageDetails != null && a08EdgStorageCageDetails.getHeight() == glassInfo.getHeight() |
| | | && a08EdgStorageCageDetails.getWidth() == glassInfo.getWidth(); |
| | | boolean b10 = a10EdgStorageCageDetails != null && a10EdgStorageCageDetails.getHeight() == glassInfo.getHeight() |
| | | && a10EdgStorageCageDetails.getWidth() == glassInfo.getWidth(); |
| | | if (b08) { |
| | | return Const.A09_OUT_TARGET_POSITION; |
| | | } |
| | | if (b10) { |
| | | return Const.A10_OUT_TARGET_POSITION; |
| | | } |
| | | } |
| | | return computerLineByState(out08Glassstate, out10Glassstate); |
| | | } |
| | | |
| | | /** |
| | | * 按照尺寸出玻璃 |
| | | * |
| | | * @param endcell endcell = out08Glassstate == 1 ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | * @param glassId |
| | | * @return |
| | | */ |
| | | public EdgStorageCageDetails queryChangeGlassInfo(int endcell, String glassId) { |
| | | //获取笼子内数量前二的玻璃数量 |
| | | MPJQueryWrapper<EdgStorageCageDetails> wrapper = new MPJQueryWrapper<>(); |
| | | wrapper.select("count(t.glass_id) as count, t.width, t.height") |
| | | .eq("t.state", Const.GLASS_STATE_IN) |
| | | .inSql("t.slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) |
| | | .groupBy("t.width, t.height"); |
| | | if (endcell == Const.A10_OUT_TARGET_POSITION) { |
| | | wrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | "on t.glass_id = t1.glass_id and (t1.first_length >= " + minOneFirstLength + " and t1.second_length >= " + minOneSecondLength + ")"); |
| | | } else { |
| | | wrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | "on t.glass_id = t1.glass_id and (t1.first_length between " + minTwoFirstLength + " and " + firstLength |
| | | + " and t1.second_length between " + minTwoSecondLength + " and " + secondLength + ") "); |
| | | } |
| | | wrapper.last("order by count(t.glass_id) desc limit 2"); |
| | | List<EdgStorageCageDetails> list = edgStorageCageDetailsService.list(wrapper); |
| | | if (CollectionUtil.isEmpty(list)) { |
| | | return null; |
| | | } |
| | | log.info("获取笼子内数量前二的玻璃数量:{}", list); |
| | | //获取宽高拍第一的玻璃信息 |
| | | EdgStorageCageDetails firstSize = list.get(0); |
| | | Integer firstCount = firstSize.getCount(); |
| | | double firstWidth = firstSize.getWidth(); |
| | | double firstHeight = firstSize.getHeight(); |
| | | if (list.size() == 1) { |
| | | return queryMinGlass(firstWidth, firstHeight, glassId); |
| | | } |
| | | //获取宽高拍第二的玻璃信息 |
| | | EdgStorageCageDetails secondSize = list.get(1); |
| | | Integer secondCount = secondSize.getCount(); |
| | | double secondWidth = secondSize.getWidth(); |
| | | double secondHeight = secondSize.getHeight(); |
| | | //获取数量前2的玻璃数量比例 |
| | | Integer mix = firstCount / secondCount; |
| | | log.info("获取玻璃数量前2的玻璃占比为:{}", mix); |
| | | |
| | | if (mix >= 2) { |
| | | log.info("获取玻璃数量前2的玻璃占比为{},大于2,直接出玻璃数据的最多的,宽:{},高:{}", mix, firstWidth, firstHeight); |
| | | return queryMinGlass(firstWidth, firstHeight, glassId); |
| | | } else { |
| | | log.info("获取玻璃数量前2的玻璃占比为{},小于2", mix); |
| | | //获取任务表中最后一次出片的玻璃id |
| | | TaskCache taskCache = taskCacheService.queryGlassByTaskCache(endcell, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | log.info("获取任务表中{}线最后一次出片的玻璃任务信息:{}", endcell, taskCache); |
| | | if (null == taskCache) { |
| | | log.info("{}线没有出片任务信息,直接出片", endcell); |
| | | return queryMinGlass(firstSize.getWidth(), firstSize.getHeight(), glassId); |
| | | } |
| | | EdgStorageCageDetails outGlassInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getGlassId, taskCache.getGlassId()).last("limit 1")); |
| | | log.info("{}线有出片任务信息,任务信息为{},玻璃信息为{}", endcell, taskCache, outGlassInfo); |
| | | if (outGlassInfo.getWidth() == firstWidth && outGlassInfo.getHeight() == firstHeight) { |
| | | log.info("数量最多的宽{}高{}和{}线任务的宽{}高{}相同,出数量排第二的玻璃,宽{}高{}", |
| | | firstWidth, firstHeight, endcell, outGlassInfo.getWidth(), outGlassInfo.getHeight(), secondWidth, secondHeight); |
| | | return queryMinGlass(secondWidth, secondHeight, glassId); |
| | | } else { |
| | | log.info("数量第二多的宽{}高{}和{}线任务的宽{}高{}相同,出数量排第二的玻璃,宽{}高{}", |
| | | secondWidth, secondHeight, endcell, outGlassInfo.getWidth(), outGlassInfo.getHeight(), firstWidth, firstHeight); |
| | | return queryMinGlass(firstWidth, firstHeight, glassId); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 保存出片任务相关信息 |
| | | * |
| | | * @param glassInfo |
| | | * @param endcell |
| | | * @param confirmationWrodAddress |
| | | * @param glassId |
| | | * @return |
| | | */ |
| | | private boolean saveOutGlassMessage(EdgStorageCageDetails glassInfo, int endcell, String confirmationWrodAddress, String glassId, Integer currentSlot) { |
| | | if (glassInfo != null) { |
| | | log.info("4、添加出片任务,玻璃id:{},任务类型:{},起始位置:{},结束位置:{}", glassInfo.getGlassId(), |
| | | 2, glassInfo.getSlot(), endcell); |
| | | if (glassInfo.getGlassId().equals(glassId)) { |
| | | |
| | | log.info("5、直通任务,将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); |
| | | EdgStorageCageDetails details = new EdgStorageCageDetails(); |
| | | BeanUtils.copyProperties(glassInfo, details); |
| | | EdgStorageCage nearestEmpty = edgStorageCageService.selectNearestEmpty(currentSlot, Boolean.TRUE); |
| | | Assert.isTrue(null != nearestEmpty, "格子已满,无法执行直通任务"); |
| | | log.info("3、查询卧式理片笼里面的空格:{}", nearestEmpty); |
| | | details.setSlot(nearestEmpty.getSlot()); |
| | | details.setState(Const.GLASS_STATE_OUT); |
| | | edgStorageCageDetailsService.save(details); |
| | | boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), nearestEmpty.getSlot(), endcell, Const.GLASS_CACHE_TYPE_THROUGH); |
| | | log.info("6、添加出片任务是否完成:{}", taskCacheStatus); |
| | | } else { |
| | | log.info("5、非直通任务,将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); |
| | | LambdaUpdateWrapper<EdgStorageCageDetails> wrapper = new LambdaUpdateWrapper<>(); |
| | | wrapper.eq(EdgStorageCageDetails::getGlassId, glassInfo.getGlassId()).set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT); |
| | | edgStorageCageDetailsService.update(wrapper); |
| | | log.info("5、更新出片玻璃的状态为{}", Const.GLASS_STATE_OUT); |
| | | |
| | | boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), glassInfo.getSlot(), endcell, Const.GLASS_CACHE_TYPE_OUT); |
| | | log.info("6、添加出片任务是否完成:{}", taskCacheStatus); |
| | | } |
| | | boolean glassSizeStatus = saveGlassSize(glassInfo, endcell); |
| | | log.info("7、添加出片玻璃尺寸信息到磨边前玻璃表是否完成:{}", glassSizeStatus); |
| | | S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, 1); |
| | | log.info("8、发送确认字已完成"); |
| | | Damage damage = new Damage(); |
| | | damage.setGlassId(glassInfo.getGlassId()); |
| | | damage.setWorkingProcedure("切割"); |
| | | damage.setLine(1001); |
| | | damage.setType(1); |
| | | damage.setRemark("过卧式理片"); |
| | | damageService.insertDamage(damage); |
| | | return Boolean.TRUE; |
| | | } |
| | | return Boolean.FALSE; |
| | | } |
| | | |
| | | /** |
| | | * 保存出片任务相关信息 |
| | | * |
| | | * @param glassInfo |
| | | * @param endcell |
| | | * @param confirmationWrodAddress |
| | | * @param glassId |
| | | * @return |
| | | */ |
| | | private boolean saveOutGlassMessageBySlot(EdgStorageCageDetails glassInfo, int endcell, String confirmationWrodAddress, String glassId, Integer currentSlot) { |
| | | if (glassInfo != null) { |
| | | log.info("4、添加出片任务,玻璃id:{},任务类型:{},起始位置:{},结束位置:{}", glassInfo.getGlassId(), |
| | | 2, glassInfo.getSlot(), endcell); |
| | | if (glassInfo.getGlassId().equals(glassId)) { |
| | | log.info("5、直通任务,将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); |
| | | EdgStorageCageDetails details = new EdgStorageCageDetails(); |
| | | //玻璃信息替换 |
| | | String glassIdChange = queryAndChangeGlass(glassId); |
| | | if (StringUtils.isBlank(glassIdChange)) { |
| | | BeanUtils.copyProperties(glassInfo, details); |
| | | } else { |
| | | GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId)); |
| | | BeanUtils.copyProperties(one, details); |
| | | } |
| | | EdgStorageCage nearestEmpty = edgStorageCageService.selectNearestEmpty(currentSlot, Boolean.TRUE); |
| | | Assert.isTrue(null != nearestEmpty, "格子已满,无法执行直通任务"); |
| | | log.info("3、查询卧式理片笼里面的空格:{}", nearestEmpty); |
| | | details.setSlot(nearestEmpty.getSlot()); |
| | | details.setState(Const.GLASS_STATE_OUT); |
| | | edgStorageCageDetailsService.save(details); |
| | | boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), nearestEmpty.getSlot(), endcell, Const.GLASS_CACHE_TYPE_THROUGH); |
| | | log.info("6、添加出片任务是否完成:{}", taskCacheStatus); |
| | | } else { |
| | | log.info("5、非直通任务,将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); |
| | | if (!glassInfo.getSlot().equals(currentSlot)) { |
| | | EdgStorageCageDetails currentGlass = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .eq(EdgStorageCageDetails::getSlot, currentSlot).eq(EdgStorageCageDetails::getWidth, glassInfo.getWidth()) |
| | | .eq(EdgStorageCageDetails::getHeight, glassInfo.getHeight()).eq(EdgStorageCageDetails::getThickness, glassInfo.getThickness()) |
| | | ); |
| | | if (null != currentGlass) { |
| | | glassInfo = currentGlass; |
| | | } |
| | | } |
| | | //玻璃信息替换 |
| | | String glassIdChange = queryAndChangeGlass(glassInfo.getGlassId()); |
| | | //处理在卧理内的玻璃信息:笼内的数据处理 |
| | | queryEdgAndChangeGlass(glassInfo.getGlassId(), glassIdChange); |
| | | LambdaUpdateWrapper<EdgStorageCageDetails> wrapper = new LambdaUpdateWrapper<>(); |
| | | wrapper.eq(EdgStorageCageDetails::getGlassId, glassInfo.getGlassId()).set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT); |
| | | edgStorageCageDetailsService.update(wrapper); |
| | | log.info("5、更新出片玻璃的状态为{}", Const.GLASS_STATE_OUT); |
| | | |
| | | boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), glassInfo.getSlot(), endcell, Const.GLASS_CACHE_TYPE_OUT); |
| | | log.info("6、添加出片任务是否完成:{}", taskCacheStatus); |
| | | } |
| | | boolean glassSizeStatus = saveGlassSize(glassInfo, endcell); |
| | | log.info("7、添加出片玻璃尺寸信息到磨边前玻璃表是否完成:{}", glassSizeStatus); |
| | | S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, 1); |
| | | log.info("8、发送确认字已完成"); |
| | | Damage damage = new Damage(); |
| | | damage.setGlassId(glassInfo.getGlassId()); |
| | | damage.setWorkingProcedure("切割"); |
| | | damage.setLine(1001); |
| | | damage.setType(1); |
| | | damage.setRemark("过卧式理片"); |
| | | damageService.insertDamage(damage); |
| | | damageService.deleteByGlassId(glassId); |
| | | return Boolean.TRUE; |
| | | } |
| | | return Boolean.FALSE; |
| | | } |
| | | |
| | | /** |
| | | * 添加理片笼任务 |
| | | * |
| | | * @param glassId |
| | | * @param startcell |
| | | * @param endcell |
| | | * @param taskType |
| | | * @return |
| | | */ |
| | | private boolean saveTaskCache(String glassId, int startcell, int endcell, int taskType) { |
| | | TaskCache taskCache = new TaskCache(); |
| | | taskCache.setGlassId(glassId); |
| | | taskCache.setTaskStatus(0); |
| | | taskCache.setStartCell(startcell); |
| | | taskCache.setEndCell(endcell); |
| | | taskCache.setTaskType(taskType); |
| | | taskCache.setCreateTime(new Date()); |
| | | return taskCacheService.save(taskCache); |
| | | } |
| | | |
| | | /** |
| | | * 添加磨边队列信息 |
| | | * |
| | | * @param glassInfo |
| | | * @param endcell |
| | | * @return |
| | | */ |
| | | private boolean saveGlassSize(EdgStorageCageDetails glassInfo, int endcell) { |
| | | EdgGlassTaskInfo edgGlassTaskInfo = new EdgGlassTaskInfo(); |
| | | BeanUtils.copyProperties(glassInfo, edgGlassTaskInfo); |
| | | edgGlassTaskInfo.setHeight((int) (glassInfo.getHeight() * ratio)); |
| | | edgGlassTaskInfo.setWidth((int) (glassInfo.getWidth() * ratio)); |
| | | edgGlassTaskInfo.setThickness((int) (glassInfo.getThickness() * ratio)); |
| | | edgGlassTaskInfo.setState(Const.EDG_GLASS_BEFORE); |
| | | edgGlassTaskInfo.setLine(endcell); |
| | | edgGlassTaskInfo.setCreateTime(new Date()); |
| | | edgGlassTaskInfo.setUpdateTime(new Date()); |
| | | //先将历史对列表中本玻璃的数据删除,重新新增一份最新的数据 |
| | | edgGlassTaskInfoService.remove(new LambdaQueryWrapper<EdgGlassTaskInfo>().eq(EdgGlassTaskInfo::getGlassId, glassInfo.getGlassId())); |
| | | return edgGlassTaskInfoService.save(edgGlassTaskInfo); |
| | | } |
| | | |
| | | /** |
| | | * 计算出片线路 |
| | | * 已排除都为2 都为0 的情况 |
| | | * |
| | | * @param out08Glassstate |
| | | * @param out10Glassstate |
| | | * @return |
| | | */ |
| | | private int computerLineByState(int out08Glassstate, int out10Glassstate) { |
| | | if (out08Glassstate == 0) { |
| | | if (out10Glassstate == 2) { |
| | | return Const.A09_OUT_TARGET_POSITION; |
| | | } else { |
| | | return Const.A10_OUT_TARGET_POSITION; |
| | | } |
| | | } else if (out08Glassstate == 1) { |
| | | return Const.A09_OUT_TARGET_POSITION; |
| | | } else { |
| | | return Const.A10_OUT_TARGET_POSITION; |
| | | } |
| | | } |
| | | |
| | | } |
| | | //package com.mes.job; |
| | | // |
| | | //import cn.hutool.core.collection.CollectionUtil; |
| | | //import cn.hutool.core.lang.Assert; |
| | | //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | //import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | //import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | //import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | //import com.github.yulichang.query.MPJQueryWrapper; |
| | | //import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | //import com.mes.common.S7object; |
| | | //import com.mes.common.config.Const; |
| | | //import com.mes.damage.entity.Damage; |
| | | //import com.mes.damage.service.DamageService; |
| | | //import com.mes.device.PlcParameterObject; |
| | | //import com.mes.edgglasstask.entity.EdgGlassTaskInfo; |
| | | //import com.mes.edgglasstask.service.EdgGlassTaskInfoService; |
| | | //import com.mes.edgstoragecage.entity.EdgStorageCage; |
| | | //import com.mes.edgstoragecage.entity.EdgStorageCageDetails; |
| | | //import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; |
| | | //import com.mes.edgstoragecage.service.EdgStorageCageService; |
| | | //import com.mes.glassinfo.entity.GlassInfo; |
| | | //import com.mes.glassinfo.service.GlassInfoService; |
| | | //import com.mes.taskcache.entity.TaskCache; |
| | | //import com.mes.taskcache.service.TaskCacheService; |
| | | //import com.mes.tools.WebSocketServer; |
| | | //import lombok.extern.slf4j.Slf4j; |
| | | //import org.apache.commons.lang.StringUtils; |
| | | //import org.springframework.beans.BeanUtils; |
| | | //import org.springframework.beans.factory.annotation.Autowired; |
| | | //import org.springframework.beans.factory.annotation.Value; |
| | | //import org.springframework.stereotype.Component; |
| | | // |
| | | //import java.util.ArrayList; |
| | | //import java.util.Date; |
| | | //import java.util.List; |
| | | //import java.util.stream.Collectors; |
| | | // |
| | | ///** |
| | | // * @Author : zhoush |
| | | // * @Date: 2024/5/8 8:17 |
| | | // * @Description: |
| | | // */ |
| | | //@Component |
| | | //@Slf4j |
| | | //public class CacheGlassTask { |
| | | // |
| | | // @Autowired |
| | | // TaskCacheService taskCacheService; |
| | | // @Autowired |
| | | // GlassInfoService glassInfoService; |
| | | // @Autowired |
| | | // EdgStorageCageService edgStorageCageService; |
| | | // @Autowired |
| | | // EdgStorageCageDetailsService edgStorageCageDetailsService; |
| | | // |
| | | // @Autowired |
| | | // EdgGlassTaskInfoService edgGlassTaskInfoService; |
| | | // |
| | | // @Autowired |
| | | // WebSocketServer webServerService; |
| | | // @Autowired |
| | | // DamageService damageService; |
| | | // |
| | | // @Value("${mes.threshold}") |
| | | // private int threshold; |
| | | // |
| | | // @Value("${mes.ratio}") |
| | | // private int ratio; |
| | | // |
| | | // @Value("${mes.sequence.order}") |
| | | // private boolean sequenceOrder; |
| | | // |
| | | // @Value("${mes.max.firstLength}") |
| | | // private String firstLength; |
| | | // |
| | | // @Value("${mes.max.secondLength}") |
| | | // private String secondLength; |
| | | // |
| | | // @Value("${mes.cache.cacheWidth}") |
| | | // private double cacheWidth; |
| | | // |
| | | // @Value("${mes.cache.cacheHeight}") |
| | | // private double cacheHeight; |
| | | // |
| | | // @Value("${mes.min.one.firstLength}") |
| | | // private String minOneFirstLength; |
| | | // |
| | | // @Value("${mes.min.one.secondLength}") |
| | | // private String minOneSecondLength; |
| | | // |
| | | // @Value("${mes.min.two.firstLength}") |
| | | // private String minTwoFirstLength; |
| | | // |
| | | // @Value("${mes.min.two.secondLength}") |
| | | // private String minTwoSecondLength; |
| | | // |
| | | // public static String engineerId = ""; |
| | | // |
| | | // // @Scheduled(fixedDelay = 1000) |
| | | // public void plcHomeEdgTask() { |
| | | // Date startDate = new Date(); |
| | | // log.info("本次任务开始执行时间:{}", startDate); |
| | | // PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | // String taskRequestTypeValue = plcParameterObject.getPlcParameter("A06_request_word").getValue(); |
| | | // String glassIdeValue = plcParameterObject.getPlcParameter("A05_scanning_ID").getValue(); |
| | | // String confirmationWrodValue = plcParameterObject.getPlcParameter("MES_confirmation_word").getValue(); |
| | | // //A08 A09表示线路相同 可做等价 无数据转int异常 |
| | | // String out08Glassstate = plcParameterObject.getPlcParameter("A08_glass_status").getValue(); |
| | | // String out10Glassstate = plcParameterObject.getPlcParameter("A10_glass_status").getValue(); |
| | | // String confirmationWrodAddress = plcParameterObject.getPlcParameter("MES_confirmation_word").getAddress(); |
| | | // String currentSlot = plcParameterObject.getPlcParameter("Current_slot").getValue(); |
| | | // |
| | | //// taskRequestTypeValue = "2"; |
| | | //// out08Glassstate = "1"; |
| | | //// out10Glassstate = "1"; |
| | | //// currentSlot = "5"; |
| | | //// confirmationWrodValue = "0"; |
| | | //// glassIdeValue = "P24092706|15|5"; |
| | | // |
| | | // log.info("1、获取到的请求字为:{},获取到的扫描ID为:{},获取到的确认字为:{},获取到的出片状态分别为:A09:{}、A10:{},当前格子号为:{}", |
| | | // taskRequestTypeValue, glassIdeValue, confirmationWrodValue, out08Glassstate, out10Glassstate, currentSlot); |
| | | // |
| | | // if ("0".equals(taskRequestTypeValue)) { |
| | | // if ("0".equals(confirmationWrodValue)) { |
| | | // log.info("2、获取到的请求字为0,且确认字为0,不执行任务"); |
| | | // return; |
| | | // } |
| | | // log.info("2、获取到的请求字为0,将确认字改为0"); |
| | | // S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, 0); |
| | | // return; |
| | | // } |
| | | // if (!"0".equals(confirmationWrodValue)) { |
| | | // log.info("2、获取到的请求字不为0,将确认字不为0,直接结束"); |
| | | // return; |
| | | // } |
| | | // boolean result = edgStorageCageDetailsService.inToVerify(glassIdeValue); |
| | | // if ("1".equals(taskRequestTypeValue) && result) { |
| | | // log.info("2、进片请求,且确认字为0,执行进片任务,扫码重复ID验证【有重复=false,无重复=true】:{}", result); |
| | | //// inTo(glassIdeValue, confirmationWrodAddress, currentSlot); |
| | | // } else if ("2".equals(taskRequestTypeValue)) { |
| | | // //09空闲 :1 10空闲 :2 都空闲:3 其他0 |
| | | // log.info("2、出片请求,且确认字为0,执行出片任务"); |
| | | // outTo(Integer.parseInt(out08Glassstate), |
| | | // Integer.parseInt(out10Glassstate), confirmationWrodAddress, "", Integer.parseInt(currentSlot)); |
| | | // } else if ("3".equals(taskRequestTypeValue)) { |
| | | // log.info("2、进片和出片都空闲,执行出片任务"); |
| | | // //加笼子里面是否有玻璃,有先出,无玻璃先进 |
| | | // boolean outFlase = outTo(Integer.parseInt(out08Glassstate), |
| | | // Integer.parseInt(out10Glassstate), confirmationWrodAddress, glassIdeValue, Integer.parseInt(currentSlot)); |
| | | // log.info("出片任务是否完成:{},且玻璃id:{}不为空则执行进片任务,扫码重复ID验证【有重复=false,无重复=true】:{}", outFlase, glassIdeValue, result); |
| | | // if (!outFlase && StringUtils.isNotBlank(glassIdeValue) && result) { |
| | | //// inTo(glassIdeValue, confirmationWrodAddress, currentSlot); |
| | | // } |
| | | // } |
| | | // Date endDate = new Date(); |
| | | // log.info("本次任务结束时间:{},共耗时:{}ms", endDate, endDate.getTime() - startDate.getTime()); |
| | | // } |
| | | // |
| | | // |
| | | // // @Scheduled(fixedDelay = 1000) |
| | | // public void dealDamageTask() { |
| | | // Date startDate = new Date(); |
| | | // log.info("卧式理片破损玻璃清除任务开始执行时间:{}", startDate); |
| | | // List<TaskCache> taskCacheList = taskCacheService.list(new LambdaQueryWrapper<TaskCache>().in(TaskCache::getTaskStatus, Const.GLASS_STATE_DAMAGE_TAKE) |
| | | // .in(TaskCache::getTaskType, Const.GLASS_CACHE_TYPE_OUT_ALL)); |
| | | // if (CollectionUtils.isNotEmpty(taskCacheList)) { |
| | | // //获取破损/拿走玻璃id |
| | | // List<String> glassList = taskCacheList.stream().map(TaskCache::getGlassId).collect(Collectors.toList()); |
| | | // //将磨边队列的数据删除 |
| | | // edgGlassTaskInfoService.remove(new LambdaQueryWrapper<EdgGlassTaskInfo>().in(EdgGlassTaskInfo::getGlassId, glassList)); |
| | | // //将任务表中的数据删除 |
| | | // taskCacheService.remove(new LambdaQueryWrapper<TaskCache>().in(TaskCache::getGlassId, glassList).in(TaskCache::getTaskType, Const.GLASS_CACHE_TYPE_OUT_ALL)); |
| | | // List<Damage> damageList = taskCacheList.stream().map(e -> { |
| | | // Damage damage = new Damage(); |
| | | // damage.setGlassId(e.getGlassId()); |
| | | // damage.setLine(e.getEndCell()); |
| | | // damage.setWorkingProcedure("磨边"); |
| | | // damage.setRemark("磨边前卧式理片"); |
| | | // damage.setStatus(1); |
| | | // damage.setType(e.getTaskStatus()); |
| | | // return damage; |
| | | // }).collect(Collectors.toList()); |
| | | // damageService.batchInsertDamage(damageList); |
| | | // } |
| | | // Date endDate = new Date(); |
| | | // log.info("本次任务结束时间:{},共耗时:{}ms", endDate, endDate.getTime() - startDate.getTime()); |
| | | // } |
| | | // |
| | | // |
| | | // /** |
| | | // * 进片任务 |
| | | // * |
| | | // * @param glassId |
| | | // * @param confirmationWrodAddress |
| | | // * @param currentSlot |
| | | // */ |
| | | //// public void inTo(String glassId, String confirmationWrodAddress, String currentSlot) { |
| | | //// log.info("1、按照玻璃id:{}获取玻璃小片信息,当前格子为:{}", glassId, currentSlot); |
| | | //// |
| | | //// GlassInfo feedGlassInfo = glassInfoService.getOne( |
| | | //// new LambdaQueryWrapper<GlassInfo>() |
| | | //// .eq(GlassInfo::getGlassId, glassId) |
| | | //// ); |
| | | //// if (Math.max(feedGlassInfo.getWidth(), feedGlassInfo.getHeight()) > cacheWidth || Math.min(feedGlassInfo.getWidth(), feedGlassInfo.getHeight()) > cacheHeight) { |
| | | //// log.info("1.1、玻璃超过卧式理片最大尺寸:{}", feedGlassInfo); |
| | | //// return; |
| | | //// } |
| | | //// |
| | | //// //添加进片任务 查找空格 |
| | | //// EdgStorageCage nearestEmpty = edgStorageCageService.selectNearestEmpty(task.getCurrentCell(), Integer.parseInt(currentSlot), Boolean.FALSE); |
| | | //// Assert.isTrue(null != nearestEmpty, "格子已满"); |
| | | //// log.info("2、查询卧式理片笼里面的空格:{}", nearestEmpty); |
| | | //// |
| | | //// //查询玻璃信息 |
| | | //// GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId)); |
| | | //// if (glassInfo == null) { |
| | | //// return; |
| | | //// } |
| | | //// if ((glassInfo.getWidth() < Double.parseDouble(minTwoFirstLength) && glassInfo.getHeight() < Double.parseDouble(minTwoSecondLength)) || (glassInfo.getWidth() < Double.parseDouble(minTwoSecondLength) && glassInfo.getHeight() < Double.parseDouble(minTwoFirstLength))) { |
| | | //// log.info("3、玻璃信息不符合进入理片笼最小尺寸,玻璃信息为{}", glassInfo); |
| | | //// return; |
| | | //// } |
| | | //// log.info("4、将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); |
| | | //// EdgStorageCageDetails details = new EdgStorageCageDetails(); |
| | | //// BeanUtils.copyProperties(glassInfo, details); |
| | | //// details.setState(Const.GLASS_STATE_IN); |
| | | //// details.setSlot(nearestEmpty.getSlot()); |
| | | //// details.setDeviceId(nearestEmpty.getDeviceId()); |
| | | //// edgStorageCageDetailsService.save(details); |
| | | //// damageService.deleteByGlassId(glassId); |
| | | //// log.info("5、玻璃信息已存入理片笼详情表,玻璃信息为{}", details); |
| | | //// //添加进片任务 |
| | | //// boolean taskCache = saveTaskCache(details.getGlassId(), 0, nearestEmpty.getSlot(), Const.GLASS_CACHE_TYPE_IN); |
| | | //// log.info("6、生成进片任务信息存入任务表是否完成:{}", taskCache); |
| | | //// |
| | | //// S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, 1); |
| | | //// log.info("7、发送确认字完成"); |
| | | //// |
| | | //// } |
| | | // |
| | | // /** |
| | | // * 查询玻璃并进行交换 |
| | | // * |
| | | // * @param glassId |
| | | // * @return |
| | | // */ |
| | | // public String queryAndChangeGlass(String glassId) { |
| | | // GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId)); |
| | | //// .inSql(GlassInfo::getEngineerId, "select engineer_id from engineering where state = 1")); |
| | | // Assert.isFalse(null == glassInfo, "玻璃信息不存在"); //按照玻璃尺寸 |
| | | // LambdaQueryWrapper<GlassInfo> queryWrapper = new LambdaQueryWrapper<GlassInfo>() |
| | | // .eq(GlassInfo::getWidth, glassInfo.getWidth()) |
| | | // .eq(GlassInfo::getHeight, glassInfo.getHeight()) |
| | | // .eq(GlassInfo::getThickness, glassInfo.getThickness()) |
| | | // .eq(GlassInfo::getFilmsid, glassInfo.getFilmsid()) |
| | | // .eq(GlassInfo::getFlowCardId, glassInfo.getFlowCardId()) |
| | | // .eq(GlassInfo::getTotalLayer, glassInfo.getTotalLayer()) |
| | | // .eq(GlassInfo::getLayer, glassInfo.getLayer()) |
| | | // .eq(GlassInfo::getEngineerId, glassInfo.getEngineerId()) |
| | | // .notInSql(GlassInfo::getGlassId, "select distinct glass_id from edg_storage_cage_details " + |
| | | // "where engineer_id = '" + glassInfo.getEngineerId() + "' and width = " + glassInfo.getWidth() + " and height = " + glassInfo.getHeight() |
| | | // + " and state != 100") |
| | | // .orderByAsc(GlassInfo::getTemperingLayoutId) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence) |
| | | // .last("Limit 1"); |
| | | // GlassInfo swapGlassInfo = glassInfoService.getOne(queryWrapper); |
| | | // if (swapGlassInfo != null && !glassInfo.getGlassId().equals(swapGlassInfo.getGlassId())) { |
| | | // String swapGlassId = swapGlassInfo.getGlassId(); |
| | | // log.info("将玻璃{}和玻璃{},信息互换,进玻璃 {}", glassInfo, swapGlassInfo, swapGlassInfo); |
| | | // swapGlassInfo.setGlassId(glassId); |
| | | // glassInfo.setGlassId(swapGlassId); |
| | | // glassInfoService.updateById(swapGlassInfo); |
| | | // glassInfoService.updateById(glassInfo); |
| | | // return swapGlassId; |
| | | // } |
| | | // return ""; |
| | | // } |
| | | // |
| | | // |
| | | // /** |
| | | // * 查询卧式理片玻璃并进行交换 |
| | | // * |
| | | // * @param glassId |
| | | // * @return |
| | | // */ |
| | | // public void queryEdgAndChangeGlass(String glassId, String swapGlassId) { |
| | | // if (StringUtils.isBlank(swapGlassId)) { |
| | | // log.info("当前出笼玻璃不存在需要替换的玻璃"); |
| | | // return; |
| | | // } |
| | | // //获取待出笼的玻璃 |
| | | // EdgStorageCageDetails glassInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | // .eq(EdgStorageCageDetails::getGlassId, glassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); |
| | | //// 获取待出笼的玻璃需要替换的玻璃信息 |
| | | // EdgStorageCageDetails swapGlassDetailInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | // .eq(EdgStorageCageDetails::getGlassId, swapGlassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); |
| | | // |
| | | //// 玻璃小片表中玻璃已经替换,更新卧理笼内现有的准备出笼的玻璃信息, |
| | | // if (null == swapGlassDetailInfo) { |
| | | // GlassInfo glassInfoBase = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | // .eq(GlassInfo::getGlassId, glassId)); |
| | | // //需要替换的玻璃为存进卧理,仅需更新当前需要出笼的玻璃信息即可 |
| | | // edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() |
| | | // .eq(EdgStorageCageDetails::getGlassId, glassId) |
| | | // .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfoBase.getTemperingLayoutId()) |
| | | // .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfoBase.getTemperingFeedSequence())); |
| | | // } else { |
| | | // //需要替换的玻璃都在卧理内,按照玻璃id对调玻璃信息:对调玻璃id即可 |
| | | // edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() |
| | | // .eq(EdgStorageCageDetails::getId, glassInfo.getId()) |
| | | // .set(EdgStorageCageDetails::getTemperingLayoutId, swapGlassDetailInfo.getTemperingLayoutId()) |
| | | // .set(EdgStorageCageDetails::getTemperingFeedSequence, swapGlassDetailInfo.getTemperingFeedSequence()) |
| | | // ); |
| | | // edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() |
| | | // .eq(EdgStorageCageDetails::getId, swapGlassDetailInfo.getId()) |
| | | // .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId()) |
| | | // .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence()) |
| | | // ); |
| | | // } |
| | | // } |
| | | // |
| | | // /** |
| | | // * 出片任务 |
| | | // * |
| | | // * @param out08Glassstate |
| | | // * @param out10Glassstate |
| | | // * @param confirmationWrodAddress |
| | | // * @param glassId |
| | | // * @param currentSlot |
| | | // */ |
| | | // public boolean outTo(int out08Glassstate, int out10Glassstate, String confirmationWrodAddress, String glassId, int currentSlot) { |
| | | // //逻辑步骤: |
| | | //// 0、A09、A10是否空闲,是否可以执行出片任务 |
| | | //// 1、获取钢化版图是否超过阈值 |
| | | //// 1.1、超过阈值:获取当前最小版图需要出片的玻璃信息 |
| | | //// 1.1.1、获取两条线最后一次出片的任务信息 |
| | | //// 1.1.2、按照出片信息去详情表查询格子在笼子里面剩余相同尺寸的玻璃数据 |
| | | //// 1.1.3、判断哪条线玻璃数量在理片笼内的数据最少,决定最小版图走该条线(问题:如果这条线非空闲,直接结束) |
| | | //// 1.2、未超过阈值: |
| | | //// 1.2.1、获取程序那条线空闲 |
| | | //// 1.2.2、获取该条线最后一次出片的任务信息 |
| | | //// 1.2.3、按照出片信息去详情表查询格子在笼子里面剩余相同尺寸的玻璃数据且以版图id、版序升序排序 取第一块玻璃出片 |
| | | //// 2、如果没有历史出片任务 |
| | | //// 2.1、出当前版图id最小版序最小的玻璃(问题:两条线都没有历史任务,出片时两条线的玻璃尺寸相同,是否找尺寸不同的) |
| | | // if ((out08Glassstate == 2 && out10Glassstate == 2) || (out08Glassstate == 0 && out10Glassstate == 0)) { |
| | | // log.info("A09、A10为{},{}非自动状态,无法出片", out08Glassstate, out10Glassstate); |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // log.info("0、出片任务出的状态:A09:【{}】;A10:【{}】)", out08Glassstate, out10Glassstate); |
| | | // //定义出片玻璃信息 |
| | | // int endcell = 0; |
| | | // EdgStorageCageDetails glassInfo = null; |
| | | // |
| | | // |
| | | // boolean flag = queryMaxMinDiff(threshold); |
| | | // log.info("1、获取钢化版图是否超过阈值:{}", flag); |
| | | // if (flag) { |
| | | // //获取当前最小版图需要出片的玻璃信息 |
| | | // glassInfo = queryMinGlass(0.0, 0.0, glassId); |
| | | // log.info("1.1、超过阈值:获取当前最小版图需要出片的玻璃信息:{}", glassInfo); |
| | | // if (glassInfo == null) { |
| | | // log.info("笼子内和待进片没有玻璃"); |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // EdgStorageCageDetails a09EdgGlass = queryGlassByTaskCache(Const.A09_OUT_TARGET_POSITION, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | // EdgStorageCageDetails a10EdgGlass = queryGlassByTaskCache(Const.A10_OUT_TARGET_POSITION, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | // endcell = queryLineByGlassInfo(a09EdgGlass, a10EdgGlass, glassInfo, out08Glassstate, out10Glassstate); |
| | | // } else { |
| | | // //按照状态判断两条线走那条线 |
| | | // endcell = computerLineByState(out08Glassstate, out10Glassstate); |
| | | // |
| | | // if (out08Glassstate == 1 && out10Glassstate == 1) { |
| | | // EdgStorageCageDetails a09EdgGlass = queryGlassByTaskCache(Const.A09_OUT_TARGET_POSITION, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | // EdgStorageCageDetails a10EdgGlass = queryGlassByTaskCache(Const.A10_OUT_TARGET_POSITION, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | // if (a09EdgGlass == null && a10EdgGlass == null) { |
| | | // MPJQueryWrapper<EdgStorageCageDetails> wrapper = new MPJQueryWrapper<>(); |
| | | // wrapper.select("count(t.glass_id), t.width, t.height") |
| | | // .eq("t.state", Const.GLASS_STATE_IN) |
| | | // .inSql("t.slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) |
| | | // .groupBy("t.width, t.height"); |
| | | // if (endcell == Const.A10_OUT_TARGET_POSITION) { |
| | | // wrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | // "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | // "on t.glass_id = t1.glass_id and (t1.first_length between " + minTwoFirstLength + " and " + firstLength |
| | | // + " and t1.second_length between " + minTwoSecondLength + " and " + secondLength + ") "); |
| | | // } else { |
| | | // wrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | // "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | // "on t.glass_id = t1.glass_id and (t1.first_length >=" + minOneFirstLength + " and t1.second_length>=" + minOneSecondLength + ") "); |
| | | // } |
| | | // wrapper.last("order by count(t.glass_id) desc limit 2"); |
| | | // List<EdgStorageCageDetails> list = edgStorageCageDetailsService.list(wrapper); |
| | | // if (CollectionUtil.isEmpty(list)) { |
| | | // MPJQueryWrapper<GlassInfo> queryWrapper = new MPJQueryWrapper<GlassInfo>() |
| | | // .selectAll(GlassInfo.class).eq("t.glass_id", glassId); |
| | | // if (endcell == Const.A10_OUT_TARGET_POSITION) { |
| | | // queryWrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | // "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | // "on t.glass_id = t1.glass_id and (t1.first_length between " + minTwoFirstLength + " and " + firstLength |
| | | // + " and t1.second_length between " + minTwoSecondLength + " and " + secondLength + ") "); |
| | | // } else { |
| | | // queryWrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | // "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | // "on t.glass_id = t1.glass_id and (t1.first_length >=" + minOneFirstLength + " and t1.second_length>=" + minOneSecondLength + ") "); |
| | | // } |
| | | // GlassInfo one = glassInfoService.getOne(queryWrapper); |
| | | // if (one != null) { |
| | | // EdgStorageCageDetails resultDetails = new EdgStorageCageDetails(); |
| | | // BeanUtils.copyProperties(one, resultDetails); |
| | | // glassInfo = resultDetails; |
| | | // } else { |
| | | // log.info("获取笼内玻璃和待进片玻璃为空或者不符合磨边尺寸"); |
| | | // } |
| | | // } else { |
| | | // glassInfo = queryMinGlass(list.get(0).getWidth(), list.get(0).getHeight(), glassId); |
| | | // } |
| | | // } else if (a09EdgGlass != null && a10EdgGlass != null) { |
| | | // List<EdgStorageCageDetails> a09Count = queryGlassByTaskLine(Const.A09_OUT_TARGET_POSITION); |
| | | // List<EdgStorageCageDetails> a10Count = queryGlassByTaskLine(Const.A10_OUT_TARGET_POSITION); |
| | | // endcell = a09Count.size() > a10Count.size() ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | // glassInfo = a09Count.size() > a10Count.size() ? queryMinGlass(a09EdgGlass.getWidth(), a09EdgGlass.getHeight(), glassId) |
| | | // : queryMinGlass(a10EdgGlass.getWidth(), a10EdgGlass.getHeight(), glassId); |
| | | // } else { |
| | | // //按照历史任务获取需要执行的路线,如果该条线笼内无玻璃 走其他逻辑 |
| | | // endcell = a09EdgGlass == null ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | // List<EdgStorageCageDetails> details = queryGlassByTaskLine(endcell); |
| | | // if (CollectionUtil.isEmpty(details)) { |
| | | // int othercell = endcell == Const.A10_OUT_TARGET_POSITION ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | // glassInfo = queryChangeGlassInfo(othercell, glassId); |
| | | // } else { |
| | | // glassInfo = a09EdgGlass != null ? queryMinGlass(a09EdgGlass.getWidth(), a09EdgGlass.getHeight(), glassId) |
| | | // : queryMinGlass(a10EdgGlass.getWidth(), a10EdgGlass.getHeight(), glassId); |
| | | // } |
| | | // } |
| | | // } else { |
| | | // List<EdgStorageCageDetails> edgStorageCageDetails = queryGlassByTaskLine(endcell); |
| | | // if (CollectionUtil.isNotEmpty(edgStorageCageDetails)) { |
| | | // glassInfo = edgStorageCageDetails.get(0); |
| | | // } else { |
| | | // //获取笼内所有玻璃信息,包括待进片的 |
| | | // List<EdgStorageCageDetails> glassList = queryEdgAllGlass(glassId); |
| | | // if (CollectionUtil.isEmpty(glassList)) { |
| | | // log.info("笼内和待进片都没有玻璃"); |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // if (glassList.size() == 1 && glassId.equals(glassList.get(0).getGlassId())) { |
| | | // glassInfo = glassList.get(0); |
| | | // } else { |
| | | // int othercell = endcell == Const.A10_OUT_TARGET_POSITION ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | // glassInfo = queryChangeGlassInfo(othercell, glassId); |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // return saveOutGlassMessageBySlot(glassInfo, endcell, confirmationWrodAddress, glassId, currentSlot); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 获取笼子内所有玻璃信息,包括待进片的 |
| | | // * |
| | | // * @param glassId |
| | | // */ |
| | | // private List<EdgStorageCageDetails> queryEdgAllGlass(String glassId) { |
| | | // List<EdgStorageCageDetails> glassList = new ArrayList<>(); |
| | | // //获取待进片玻璃 |
| | | // //todo: 获取正在执行的工程信息 |
| | | // if (StringUtils.isNotBlank(glassId)) { |
| | | // GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | // .eq(GlassInfo::getGlassId, glassId)); |
| | | //// .inSql(GlassInfo::getEngineerId, "select engineer_id from engineering where state = 1")); |
| | | // EdgStorageCageDetails resultDetails = new EdgStorageCageDetails(); |
| | | // BeanUtils.copyProperties(one, resultDetails); |
| | | // glassList.add(resultDetails); |
| | | // } |
| | | // //获取笼内玻璃 |
| | | // List<EdgStorageCageDetails> details = edgStorageCageDetailsService.selectJoinList(EdgStorageCageDetails.class, new MPJLambdaWrapper<EdgStorageCageDetails>().selectAll(EdgStorageCageDetails.class) |
| | | // .leftJoin(EdgStorageCage.class, on -> on.eq(EdgStorageCage::getSlot, EdgStorageCageDetails::getSlot).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)) |
| | | // .eq(EdgStorageCage::getEnableState, Const.SLOT_ON)); |
| | | // glassList.addAll(details); |
| | | // return glassList; |
| | | // |
| | | // } |
| | | // |
| | | // /** |
| | | // * 获取详情表内最大最小版图id的差值,判断是否出最小版图玻璃 |
| | | // * |
| | | // * @return |
| | | // */ |
| | | // public boolean queryMaxMinDiff(int threshold) { |
| | | // //获取笼子内最大版图id和最小版图id插值,判断是否大于阈值,大于阈值直接出最小版图玻璃 |
| | | // QueryWrapper<EdgStorageCageDetails> queryWrapper = new QueryWrapper<>(); |
| | | // queryWrapper.select("max(tempering_layout_id)-min(tempering_layout_id) as diff") |
| | | // .eq("state", Const.GLASS_STATE_IN) |
| | | // .inSql("slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON); |
| | | // List<Object> list = edgStorageCageDetailsService.listObjs(queryWrapper); |
| | | // //获取笼内玻璃版图差值是否大于阈值 |
| | | // if (CollectionUtil.isNotEmpty(list)) { |
| | | // Long diff = (Long) list.get(0); |
| | | // return diff > threshold; |
| | | // } else { |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // } |
| | | // |
| | | // /** |
| | | // * 获取当前最小版图需要出片的玻璃信息 |
| | | // * |
| | | // * @param width |
| | | // * @param height |
| | | // */ |
| | | // private EdgStorageCageDetails queryMinGlass(double width, double height, String glassId) { |
| | | // //获取表内版图id最小的玻璃信息 |
| | | // EdgStorageCageDetails glassDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | // .eq(EdgStorageCageDetails::getState, 100) |
| | | // .eq(width != 0, EdgStorageCageDetails::getWidth, width) |
| | | // .eq(height != 0, EdgStorageCageDetails::getHeight, height) |
| | | // .inSql(EdgStorageCageDetails::getSlot, "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) |
| | | // .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, EdgStorageCageDetails::getTemperingFeedSequence) |
| | | // .last("limit 1")); |
| | | // if (StringUtils.isBlank(glassId)) { |
| | | // return glassDetails; |
| | | // } |
| | | // GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | // .eq(GlassInfo::getGlassId, glassId) |
| | | //// .inSql(GlassInfo::getEngineerId, "select engineer_id from engineering where state = 1") |
| | | // ); |
| | | // EdgStorageCageDetails resultDetails = new EdgStorageCageDetails(); |
| | | // BeanUtils.copyProperties(one, resultDetails); |
| | | // if (null == glassDetails) { |
| | | // return resultDetails; |
| | | // } |
| | | // return resultDetails.getTemperingLayoutId() <= glassDetails.getTemperingLayoutId() && resultDetails.getTemperingFeedSequence() > glassDetails.getTemperingFeedSequence() ? |
| | | // resultDetails : glassDetails; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 获取任务表中指定线路笼子内还剩余的玻璃信息 |
| | | // */ |
| | | // private List<EdgStorageCageDetails> queryGlassByTaskLine(int line) { |
| | | // //获取任务表中最后一次出片的玻璃id |
| | | // TaskCache taskCache = taskCacheService.queryGlassByTaskCache(line, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | // if (null == taskCache) { |
| | | // log.info("没有找到{}线任务信息", line); |
| | | // return new ArrayList<>(); |
| | | // } |
| | | // MPJQueryWrapper<EdgStorageCageDetails> mpjLambdaWrapper = new MPJQueryWrapper<>(); |
| | | // mpjLambdaWrapper.select("t1.*") |
| | | // .innerJoin("edg_storage_cage_details t1 on t.width = t1.width and t.height = t1.height") |
| | | // .eq("t.glass_id", taskCache.getGlassId()) |
| | | // .ne("t1.glass_id", taskCache.getGlassId()) |
| | | // .eq("t1.state", Const.GLASS_STATE_IN) |
| | | // .inSql("t1.slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) |
| | | // .orderByAsc("t1.tempering_layout_id") |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, "t1.tempering_feed_sequence"); |
| | | // List<EdgStorageCageDetails> details = edgStorageCageDetailsService.selectJoinList(EdgStorageCageDetails.class, mpjLambdaWrapper); |
| | | // if (CollectionUtil.isEmpty(details)) { |
| | | // return new ArrayList<>(); |
| | | // } |
| | | // return details; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 按照任务类型、线号获取任务信息 |
| | | // * |
| | | // * @param line |
| | | // * @param taskTypes |
| | | // * @return |
| | | // */ |
| | | // private EdgStorageCageDetails queryGlassByTaskCache(int line, List<Integer> taskTypes) { |
| | | // TaskCache taskCache = taskCacheService.queryGlassByTaskCache(line, taskTypes); |
| | | // if (null == taskCache) { |
| | | // log.info("没有找到{}线任务信息", line); |
| | | // return null; |
| | | // } |
| | | // return edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>().eq(EdgStorageCageDetails::getGlassId, taskCache.getGlassId()) |
| | | // .inSql(EdgStorageCageDetails::getSlot, "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) |
| | | // .last(" limit 1 ")); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 按照任务玻璃信息和待出片玻璃信息获取出片路径 |
| | | // * |
| | | // * @param a08EdgStorageCageDetails 09号线出片玻璃信息 |
| | | // * @param a10EdgStorageCageDetails 10号线出片玻璃信息 |
| | | // * @param glassInfo 带出片玻璃信息 |
| | | // * @param out08Glassstate 09号线空闲状态 |
| | | // * @param out10Glassstate 10号线空闲状态 |
| | | // * @return |
| | | // */ |
| | | // private Integer queryLineByGlassInfo(EdgStorageCageDetails a08EdgStorageCageDetails, EdgStorageCageDetails a10EdgStorageCageDetails, |
| | | // EdgStorageCageDetails glassInfo, int out08Glassstate, int out10Glassstate) { |
| | | // //存在出片任务 07为空 |
| | | // if (out08Glassstate == 1 && out10Glassstate == 1) { |
| | | // boolean b08 = a08EdgStorageCageDetails != null && a08EdgStorageCageDetails.getHeight() == glassInfo.getHeight() |
| | | // && a08EdgStorageCageDetails.getWidth() == glassInfo.getWidth(); |
| | | // boolean b10 = a10EdgStorageCageDetails != null && a10EdgStorageCageDetails.getHeight() == glassInfo.getHeight() |
| | | // && a10EdgStorageCageDetails.getWidth() == glassInfo.getWidth(); |
| | | // if (b08) { |
| | | // return Const.A09_OUT_TARGET_POSITION; |
| | | // } |
| | | // if (b10) { |
| | | // return Const.A10_OUT_TARGET_POSITION; |
| | | // } |
| | | // } |
| | | // return computerLineByState(out08Glassstate, out10Glassstate); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 按照尺寸出玻璃 |
| | | // * |
| | | // * @param endcell endcell = out08Glassstate == 1 ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | // * @param glassId |
| | | // * @return |
| | | // */ |
| | | // public EdgStorageCageDetails queryChangeGlassInfo(int endcell, String glassId) { |
| | | // //获取笼子内数量前二的玻璃数量 |
| | | // MPJQueryWrapper<EdgStorageCageDetails> wrapper = new MPJQueryWrapper<>(); |
| | | // wrapper.select("count(t.glass_id) as count, t.width, t.height") |
| | | // .eq("t.state", Const.GLASS_STATE_IN) |
| | | // .inSql("t.slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) |
| | | // .groupBy("t.width, t.height"); |
| | | // if (endcell == Const.A10_OUT_TARGET_POSITION) { |
| | | // wrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | // "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | // "on t.glass_id = t1.glass_id and (t1.first_length >= " + minOneFirstLength + " and t1.second_length >= " + minOneSecondLength + ")"); |
| | | // } else { |
| | | // wrapper.innerJoin("(select glass_id, case when height <= width then width else height end as first_length, " + |
| | | // "case when width < height then width else height end as second_length from edg_storage_cage_details) t1 " + |
| | | // "on t.glass_id = t1.glass_id and (t1.first_length between " + minTwoFirstLength + " and " + firstLength |
| | | // + " and t1.second_length between " + minTwoSecondLength + " and " + secondLength + ") "); |
| | | // } |
| | | // wrapper.last("order by count(t.glass_id) desc limit 2"); |
| | | // List<EdgStorageCageDetails> list = edgStorageCageDetailsService.list(wrapper); |
| | | // if (CollectionUtil.isEmpty(list)) { |
| | | // return null; |
| | | // } |
| | | // log.info("获取笼子内数量前二的玻璃数量:{}", list); |
| | | // //获取宽高拍第一的玻璃信息 |
| | | // EdgStorageCageDetails firstSize = list.get(0); |
| | | // Integer firstCount = firstSize.getCount(); |
| | | // double firstWidth = firstSize.getWidth(); |
| | | // double firstHeight = firstSize.getHeight(); |
| | | // if (list.size() == 1) { |
| | | // return queryMinGlass(firstWidth, firstHeight, glassId); |
| | | // } |
| | | // //获取宽高拍第二的玻璃信息 |
| | | // EdgStorageCageDetails secondSize = list.get(1); |
| | | // Integer secondCount = secondSize.getCount(); |
| | | // double secondWidth = secondSize.getWidth(); |
| | | // double secondHeight = secondSize.getHeight(); |
| | | // //获取数量前2的玻璃数量比例 |
| | | // Integer mix = firstCount / secondCount; |
| | | // log.info("获取玻璃数量前2的玻璃占比为:{}", mix); |
| | | // |
| | | // if (mix >= 2) { |
| | | // log.info("获取玻璃数量前2的玻璃占比为{},大于2,直接出玻璃数据的最多的,宽:{},高:{}", mix, firstWidth, firstHeight); |
| | | // return queryMinGlass(firstWidth, firstHeight, glassId); |
| | | // } else { |
| | | // log.info("获取玻璃数量前2的玻璃占比为{},小于2", mix); |
| | | // //获取任务表中最后一次出片的玻璃id |
| | | // TaskCache taskCache = taskCacheService.queryGlassByTaskCache(endcell, Const.GLASS_CACHE_TYPE_OUT_ALL); |
| | | // log.info("获取任务表中{}线最后一次出片的玻璃任务信息:{}", endcell, taskCache); |
| | | // if (null == taskCache) { |
| | | // log.info("{}线没有出片任务信息,直接出片", endcell); |
| | | // return queryMinGlass(firstSize.getWidth(), firstSize.getHeight(), glassId); |
| | | // } |
| | | // EdgStorageCageDetails outGlassInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | // .eq(EdgStorageCageDetails::getGlassId, taskCache.getGlassId()).last("limit 1")); |
| | | // log.info("{}线有出片任务信息,任务信息为{},玻璃信息为{}", endcell, taskCache, outGlassInfo); |
| | | // if (outGlassInfo.getWidth() == firstWidth && outGlassInfo.getHeight() == firstHeight) { |
| | | // log.info("数量最多的宽{}高{}和{}线任务的宽{}高{}相同,出数量排第二的玻璃,宽{}高{}", |
| | | // firstWidth, firstHeight, endcell, outGlassInfo.getWidth(), outGlassInfo.getHeight(), secondWidth, secondHeight); |
| | | // return queryMinGlass(secondWidth, secondHeight, glassId); |
| | | // } else { |
| | | // log.info("数量第二多的宽{}高{}和{}线任务的宽{}高{}相同,出数量排第二的玻璃,宽{}高{}", |
| | | // secondWidth, secondHeight, endcell, outGlassInfo.getWidth(), outGlassInfo.getHeight(), firstWidth, firstHeight); |
| | | // return queryMinGlass(firstWidth, firstHeight, glassId); |
| | | // } |
| | | // } |
| | | // } |
| | | // |
| | | // /** |
| | | // * 保存出片任务相关信息 |
| | | // * |
| | | // * @param glassInfo |
| | | // * @param endcell |
| | | // * @param confirmationWrodAddress |
| | | // * @param glassId |
| | | // * @return |
| | | // */ |
| | | // private boolean saveOutGlassMessage(EdgStorageCageDetails glassInfo, int endcell, String confirmationWrodAddress, String glassId, Integer currentSlot) { |
| | | // if (glassInfo != null) { |
| | | // log.info("4、添加出片任务,玻璃id:{},任务类型:{},起始位置:{},结束位置:{}", glassInfo.getGlassId(), |
| | | // 2, glassInfo.getSlot(), endcell); |
| | | // if (glassInfo.getGlassId().equals(glassId)) { |
| | | // |
| | | // log.info("5、直通任务,将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); |
| | | // EdgStorageCageDetails details = new EdgStorageCageDetails(); |
| | | // BeanUtils.copyProperties(glassInfo, details); |
| | | // EdgStorageCage nearestEmpty = edgStorageCageService.selectNearestEmpty(task.getCurrentCell(), currentSlot, Boolean.TRUE); |
| | | // Assert.isTrue(null != nearestEmpty, "格子已满,无法执行直通任务"); |
| | | // log.info("3、查询卧式理片笼里面的空格:{}", nearestEmpty); |
| | | // details.setSlot(nearestEmpty.getSlot()); |
| | | // details.setState(Const.GLASS_STATE_OUT); |
| | | // edgStorageCageDetailsService.save(details); |
| | | // boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), nearestEmpty.getSlot(), endcell, Const.GLASS_CACHE_TYPE_THROUGH); |
| | | // log.info("6、添加出片任务是否完成:{}", taskCacheStatus); |
| | | // } else { |
| | | // log.info("5、非直通任务,将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); |
| | | // LambdaUpdateWrapper<EdgStorageCageDetails> wrapper = new LambdaUpdateWrapper<>(); |
| | | // wrapper.eq(EdgStorageCageDetails::getGlassId, glassInfo.getGlassId()).set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT); |
| | | // edgStorageCageDetailsService.update(wrapper); |
| | | // log.info("5、更新出片玻璃的状态为{}", Const.GLASS_STATE_OUT); |
| | | // |
| | | // boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), glassInfo.getSlot(), endcell, Const.GLASS_CACHE_TYPE_OUT); |
| | | // log.info("6、添加出片任务是否完成:{}", taskCacheStatus); |
| | | // } |
| | | // boolean glassSizeStatus = saveGlassSize(glassInfo, endcell); |
| | | // log.info("7、添加出片玻璃尺寸信息到磨边前玻璃表是否完成:{}", glassSizeStatus); |
| | | // S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, 1); |
| | | // log.info("8、发送确认字已完成"); |
| | | // Damage damage = new Damage(); |
| | | // damage.setGlassId(glassInfo.getGlassId()); |
| | | // damage.setWorkingProcedure("切割"); |
| | | // damage.setLine(1001); |
| | | // damage.setType(1); |
| | | // damage.setRemark("过卧式理片"); |
| | | // damageService.insertDamage(damage); |
| | | // return Boolean.TRUE; |
| | | // } |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 保存出片任务相关信息 |
| | | // * |
| | | // * @param glassInfo |
| | | // * @param endcell |
| | | // * @param confirmationWrodAddress |
| | | // * @param glassId |
| | | // * @return |
| | | // */ |
| | | // private boolean saveOutGlassMessageBySlot(EdgStorageCageDetails glassInfo, int endcell, String confirmationWrodAddress, String glassId, Integer currentSlot) { |
| | | // if (glassInfo != null) { |
| | | // log.info("4、添加出片任务,玻璃id:{},任务类型:{},起始位置:{},结束位置:{}", glassInfo.getGlassId(), |
| | | // 2, glassInfo.getSlot(), endcell); |
| | | // if (glassInfo.getGlassId().equals(glassId)) { |
| | | // log.info("5、直通任务,将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); |
| | | // EdgStorageCageDetails details = new EdgStorageCageDetails(); |
| | | // //玻璃信息替换 |
| | | // String glassIdChange = queryAndChangeGlass(glassId); |
| | | // if (StringUtils.isBlank(glassIdChange)) { |
| | | // BeanUtils.copyProperties(glassInfo, details); |
| | | // } else { |
| | | // GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId)); |
| | | // BeanUtils.copyProperties(one, details); |
| | | // } |
| | | // EdgStorageCage nearestEmpty = edgStorageCageService.selectNearestEmpty(task.getCurrentCell(), currentSlot, Boolean.TRUE); |
| | | // Assert.isTrue(null != nearestEmpty, "格子已满,无法执行直通任务"); |
| | | // log.info("3、查询卧式理片笼里面的空格:{}", nearestEmpty); |
| | | // details.setSlot(nearestEmpty.getSlot()); |
| | | // details.setState(Const.GLASS_STATE_OUT); |
| | | // edgStorageCageDetailsService.save(details); |
| | | // boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), nearestEmpty.getSlot(), endcell, Const.GLASS_CACHE_TYPE_THROUGH); |
| | | // log.info("6、添加出片任务是否完成:{}", taskCacheStatus); |
| | | // } else { |
| | | // log.info("5、非直通任务,将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); |
| | | // if (!glassInfo.getSlot().equals(currentSlot)) { |
| | | // EdgStorageCageDetails currentGlass = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | // .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | // .eq(EdgStorageCageDetails::getSlot, currentSlot).eq(EdgStorageCageDetails::getWidth, glassInfo.getWidth()) |
| | | // .eq(EdgStorageCageDetails::getHeight, glassInfo.getHeight()).eq(EdgStorageCageDetails::getThickness, glassInfo.getThickness()) |
| | | // ); |
| | | // if (null != currentGlass) { |
| | | // glassInfo = currentGlass; |
| | | // } |
| | | // } |
| | | // //玻璃信息替换 |
| | | // String glassIdChange = queryAndChangeGlass(glassInfo.getGlassId()); |
| | | // //处理在卧理内的玻璃信息:笼内的数据处理 |
| | | // queryEdgAndChangeGlass(glassInfo.getGlassId(), glassIdChange); |
| | | // LambdaUpdateWrapper<EdgStorageCageDetails> wrapper = new LambdaUpdateWrapper<>(); |
| | | // wrapper.eq(EdgStorageCageDetails::getGlassId, glassInfo.getGlassId()).set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT); |
| | | // edgStorageCageDetailsService.update(wrapper); |
| | | // log.info("5、更新出片玻璃的状态为{}", Const.GLASS_STATE_OUT); |
| | | // |
| | | // boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), glassInfo.getSlot(), endcell, Const.GLASS_CACHE_TYPE_OUT); |
| | | // log.info("6、添加出片任务是否完成:{}", taskCacheStatus); |
| | | // } |
| | | // boolean glassSizeStatus = saveGlassSize(glassInfo, endcell); |
| | | // log.info("7、添加出片玻璃尺寸信息到磨边前玻璃表是否完成:{}", glassSizeStatus); |
| | | // S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, 1); |
| | | // log.info("8、发送确认字已完成"); |
| | | // Damage damage = new Damage(); |
| | | // damage.setGlassId(glassInfo.getGlassId()); |
| | | // damage.setWorkingProcedure("切割"); |
| | | // damage.setLine(1001); |
| | | // damage.setType(1); |
| | | // damage.setRemark("过卧式理片"); |
| | | // damageService.insertDamage(damage); |
| | | // damageService.deleteByGlassId(glassId); |
| | | // return Boolean.TRUE; |
| | | // } |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 添加理片笼任务 |
| | | // * |
| | | // * @param glassId |
| | | // * @param startcell |
| | | // * @param endcell |
| | | // * @param taskType |
| | | // * @return |
| | | // */ |
| | | // private boolean saveTaskCache(String glassId, int startcell, int endcell, int taskType) { |
| | | // TaskCache taskCache = new TaskCache(); |
| | | // taskCache.setGlassId(glassId); |
| | | // taskCache.setTaskStatus(0); |
| | | // taskCache.setStartCell(startcell); |
| | | // taskCache.setEndCell(endcell); |
| | | // taskCache.setTaskType(taskType); |
| | | // taskCache.setCreateTime(new Date()); |
| | | // return taskCacheService.save(taskCache); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 添加磨边队列信息 |
| | | // * |
| | | // * @param glassInfo |
| | | // * @param endcell |
| | | // * @return |
| | | // */ |
| | | // private boolean saveGlassSize(EdgStorageCageDetails glassInfo, int endcell) { |
| | | // EdgGlassTaskInfo edgGlassTaskInfo = new EdgGlassTaskInfo(); |
| | | // BeanUtils.copyProperties(glassInfo, edgGlassTaskInfo); |
| | | // edgGlassTaskInfo.setHeight((int) (glassInfo.getHeight() * ratio)); |
| | | // edgGlassTaskInfo.setWidth((int) (glassInfo.getWidth() * ratio)); |
| | | // edgGlassTaskInfo.setThickness((int) (glassInfo.getThickness() * ratio)); |
| | | // edgGlassTaskInfo.setState(Const.EDG_GLASS_BEFORE); |
| | | // edgGlassTaskInfo.setLine(endcell); |
| | | // edgGlassTaskInfo.setCreateTime(new Date()); |
| | | // edgGlassTaskInfo.setUpdateTime(new Date()); |
| | | // //先将历史对列表中本玻璃的数据删除,重新新增一份最新的数据 |
| | | // edgGlassTaskInfoService.remove(new LambdaQueryWrapper<EdgGlassTaskInfo>().eq(EdgGlassTaskInfo::getGlassId, glassInfo.getGlassId())); |
| | | // return edgGlassTaskInfoService.save(edgGlassTaskInfo); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 计算出片线路 |
| | | // * 已排除都为2 都为0 的情况 |
| | | // * |
| | | // * @param out08Glassstate |
| | | // * @param out10Glassstate |
| | | // * @return |
| | | // */ |
| | | // private int computerLineByState(int out08Glassstate, int out10Glassstate) { |
| | | // if (out08Glassstate == 0) { |
| | | // if (out10Glassstate == 2) { |
| | | // return Const.A09_OUT_TARGET_POSITION; |
| | | // } else { |
| | | // return Const.A10_OUT_TARGET_POSITION; |
| | | // } |
| | | // } else if (out08Glassstate == 1) { |
| | | // return Const.A09_OUT_TARGET_POSITION; |
| | | // } else { |
| | | // return Const.A10_OUT_TARGET_POSITION; |
| | | // } |
| | | // } |
| | | // |
| | | //} |
New file |
| | |
| | | package com.mes.job; |
| | | |
| | | import cn.hutool.core.collection.CollectionUtil; |
| | | import cn.hutool.core.lang.Assert; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.kangaroohy.milo.model.ReadWriteEntity; |
| | | import com.kangaroohy.milo.service.MiloService; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.damage.service.DamageService; |
| | | import com.mes.edgglasstask.entity.EdgGlassTaskInfo; |
| | | import com.mes.edgglasstask.service.EdgGlassTaskInfoService; |
| | | import com.mes.edgstoragecage.entity.EdgStorageCage; |
| | | import com.mes.edgstoragecage.entity.EdgStorageCageDetails; |
| | | import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; |
| | | import com.mes.edgstoragecage.service.EdgStorageCageService; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.opctask.entity.EdgStorageDeviceTask; |
| | | import com.mes.opctask.entity.EdgStorageDeviceTaskHistory; |
| | | import com.mes.opctask.service.EdgStorageDeviceTaskHistoryService; |
| | | import com.mes.opctask.service.EdgStorageDeviceTaskService; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @Author : zhoush |
| | | * @Date: 2024/10/10 8:05 |
| | | * @Description: |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class OpcCacheGlassNewTask { |
| | | |
| | | private static final String EDG_STORAGE_DEVICE_ONE_TASK = "edg_storage_device_one_task"; |
| | | |
| | | private static final String EDG_STORAGE_DEVICE_TWO_TASK = "edg_storage_device_two_task"; |
| | | |
| | | @Autowired(required = false) |
| | | MiloService miloService; |
| | | |
| | | @Resource |
| | | EdgStorageDeviceTaskService edgStorageDeviceTaskService; |
| | | @Autowired |
| | | EdgGlassTaskInfoService edgGlassTaskInfoService; |
| | | @Resource |
| | | GlassInfoService glassInfoService; |
| | | @Resource |
| | | EdgStorageCageDetailsService edgStorageCageDetailsService; |
| | | @Resource |
| | | EdgStorageCageService edgStorageCageService; |
| | | @Resource |
| | | EdgStorageDeviceTaskHistoryService edgStorageDeviceTaskHistoryService; |
| | | @Resource |
| | | DamageService damageService; |
| | | @Resource |
| | | SysConfigService sysConfigService; |
| | | |
| | | // @Value("${mes.threshold}") |
| | | private int threshold; |
| | | // @Value("${mes.cellLength}") |
| | | private int cellLength; |
| | | // @Value("${mes.ratio}") |
| | | private int ratio; |
| | | |
| | | // @Value("${mes.min.one.firstLength}") |
| | | private int minOneFirstLength; |
| | | // |
| | | // @Value("${mes.min.one.secondLength}") |
| | | private int minOneSecondLength; |
| | | // |
| | | // @Value("${mes.min.two.firstLength}") |
| | | private int minTwoFirstLength; |
| | | // |
| | | // @Value("${mes.min.two.secondLength}") |
| | | private int minTwoSecondLength; |
| | | // |
| | | // @Value("${mes.max.firstLength}") |
| | | private int maxTwoFirstLength; |
| | | // |
| | | // @Value("${mes.max.secondLength}") |
| | | private int maxTwoSecondLength; |
| | | // |
| | | // @Value("${mes.maxThickness}") |
| | | private int maxThickness; |
| | | |
| | | private String glassInIdOne = ""; |
| | | private String glassInIdTwo = ""; |
| | | private String glassIdOne = ""; |
| | | private String glassIdTwo = ""; |
| | | |
| | | @Scheduled(fixedDelay = 1000) |
| | | public void startOneOpcTask() throws Exception { |
| | | //获取第二条线路的卧式理片笼状态 |
| | | ReadWriteEntity twoInkageEntity = miloService.readFromOpcUa("WL2.WL2.deviceState"); |
| | | //默认只跑一台卧式理片,两条线路都可以走 |
| | | int cellFlag = 1; |
| | | //如果两条线都启动则只能跑一条线 |
| | | if (twoInkageEntity != null && !Boolean.parseBoolean(twoInkageEntity.getValue() + "")) { |
| | | cellFlag = 2; |
| | | } |
| | | startOneOpcTaskChild(EDG_STORAGE_DEVICE_ONE_TASK, 1, cellFlag); |
| | | } |
| | | |
| | | @Scheduled(fixedDelay = 1000) |
| | | public void startTwoOpcTask() throws Exception { |
| | | ReadWriteEntity oneInkageEntity = miloService.readFromOpcUa("WL1.WL1.deviceState"); |
| | | int cellFlag = 1; |
| | | if (oneInkageEntity != null && !Boolean.parseBoolean(oneInkageEntity.getValue() + "")) { |
| | | cellFlag = 2; |
| | | } |
| | | startOneOpcTaskChild(EDG_STORAGE_DEVICE_TWO_TASK, 2, cellFlag); |
| | | } |
| | | |
| | | private void startOneOpcTaskChild(String tableName, int device, int cellFlag) throws Exception { |
| | | threshold = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_THRESHOLD); |
| | | cellLength = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_CELL_LENGTH); |
| | | ratio = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_RATIO); |
| | | minOneFirstLength = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_MIN_ONE_FIRST_LENGTH); |
| | | minOneSecondLength = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_MIN_ONE_SECOND_LENGTH); |
| | | minTwoFirstLength = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_MIN_TWO_FIRST_LENGTH); |
| | | minTwoSecondLength = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_MIN_TWO_SECOND_LENGTH); |
| | | maxTwoFirstLength = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_MAX_FIRST_LENGTH); |
| | | maxTwoSecondLength = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_MAX_SECOND_LENGTH); |
| | | maxThickness = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_MAX_THICKNESS); |
| | | |
| | | EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(tableName); |
| | | if (task == null) { |
| | | log.info("任务表基础数据录入失败,请检查数据是否录入成功"); |
| | | return; |
| | | } |
| | | if (task.getTaskState() == 2) { |
| | | //防止出片任务且笼前有玻璃的情况,将进片id置空,即出片仅考虑笼内的玻璃 |
| | | task.setGlassIdIn(""); |
| | | } |
| | | int request = task.getTaskState(); |
| | | int taskRunning = task.getTaskRunning(); |
| | | log.info("开始执行任务,任务请信息为{}", task); |
| | | if (request == 0) { |
| | | log.info("设备:{}状态:{}", device, request); |
| | | log.info("未收到任务请求,结束本次任务"); |
| | | } else if (request == 1 && taskRunning == 0) { |
| | | //进片任务 |
| | | log.info("设备:{}状态:{}", device, request); |
| | | log.info("进片任务:进片玻璃id为:{}", task.getGlassIdIn()); |
| | | intoTask(task, tableName, device); |
| | | } else if (request == 2 && taskRunning == 0) { |
| | | //出片任务 |
| | | outTask(task, tableName, device, cellFlag); |
| | | } else if (request == 3 && taskRunning == 0) { |
| | | //直通任务 |
| | | log.info("设备:{}状态:{}", device, request); |
| | | if (!outTask(task, tableName, device, cellFlag)) { |
| | | intoTask(task, tableName, device); |
| | | } |
| | | } else if (request == 4) { |
| | | log.info("设备:{}状态:{}", device, request); |
| | | log.info("将启动子改为4"); |
| | | task.setTaskRunning(Const.GLASS_CACHE_TYPE_RUNNING); |
| | | edgStorageDeviceTaskService.updateTaskMessage(tableName, task); |
| | | } else if (request == 5) { |
| | | log.info("设备:{}状态:{}", device, request); |
| | | finishTask(task, tableName, device); |
| | | } else { |
| | | log.info("玻璃异常处理"); |
| | | damageTask(task, tableName, device); |
| | | } |
| | | // } catch(Exception e) |
| | | // |
| | | // { |
| | | // log.info("执行任务过程中发生异常,任务字{},{}", task.getTaskState(), e.getMessage()); |
| | | // log.info("将启动字改为0"); |
| | | // task.setTaskRunning(Const.GLASS_CACHE_TYPE_EMPTY); |
| | | // edgStorageDeviceTaskService.updateTaskMessage(tableName, task); |
| | | // } |
| | | |
| | | } |
| | | |
| | | |
| | | @Scheduled(fixedDelay = 1000) |
| | | public void edgOneOpcTask() throws Exception { |
| | | EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(EDG_STORAGE_DEVICE_ONE_TASK); |
| | | String glassId = task.getGlassId(); |
| | | if (StringUtils.isBlank(glassId) || glassId.equals(glassIdOne)) { |
| | | log.info("{}号线磨边前玻璃未就位,结束本次任务", 1); |
| | | return; |
| | | } |
| | | edgTaskChild(glassId, 1); |
| | | } |
| | | |
| | | @Scheduled(fixedDelay = 1000) |
| | | public void edgTwoOpcTask() throws Exception { |
| | | EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(EDG_STORAGE_DEVICE_TWO_TASK); |
| | | String glassId = task.getGlassId(); |
| | | if (StringUtils.isBlank(glassId) || glassId.equals(glassIdTwo)) { |
| | | log.info("{}号线磨边前玻璃未就位,结束本次任务", 2); |
| | | return; |
| | | } |
| | | edgTaskChild(glassId, 2); |
| | | } |
| | | |
| | | private void edgTaskChild(String glassId, int cell) throws Exception { |
| | | ratio = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_RATIO); |
| | | GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId).last("limit 1")); |
| | | if (glassInfo == null) { |
| | | log.info("对列表中的玻璃id错误,请检查数据,玻璃id:{}", glassId); |
| | | return; |
| | | } |
| | | String toEndingId = glassInfo.getTemperingLayoutId() + "" + glassInfo.getTemperingFeedSequence(); |
| | | List<ReadWriteEntity> list = new ArrayList<>(); |
| | | // list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".mesControl", true)); |
| | | list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".glassId", Integer.parseInt(toEndingId))); |
| | | list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".toEdingId", Integer.parseInt(toEndingId))); |
| | | list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".width", (int) Math.max(glassInfo.getWidth() * ratio, glassInfo.getHeight() * ratio))); |
| | | list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".height", (int) Math.min(glassInfo.getWidth() * ratio, glassInfo.getHeight() * ratio))); |
| | | |
| | | miloService.writeToOpcUa(list); |
| | | miloService.writeToOpcWord(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".thickness", (int) glassInfo.getThickness() * ratio)); |
| | | //修改磨边对列中的磨边线路及状态 |
| | | edgGlassTaskInfoService.update(new LambdaUpdateWrapper<EdgGlassTaskInfo>() |
| | | .set(EdgGlassTaskInfo::getLine, cell) |
| | | .set(EdgGlassTaskInfo::getState, Const.EDG_GLASS_START) |
| | | .set(EdgGlassTaskInfo::getUpdateTime, new Date()) |
| | | .eq(EdgGlassTaskInfo::getGlassId, glassId) |
| | | .eq(EdgGlassTaskInfo::getState, Const.EDG_GLASS_BEFORE)); |
| | | if (cell == 1) { |
| | | glassIdOne = glassId; |
| | | } else { |
| | | glassIdTwo = glassId; |
| | | } |
| | | } |
| | | |
| | | private boolean intoTask(EdgStorageDeviceTask task, String tableName, int deviceId) { |
| | | Date startDate = new Date(); |
| | | log.info("开始执行进片任务,任务信息为:{},表名为:{},设备id:{},开始时间:{}", task, tableName, deviceId, startDate); |
| | | //获取玻璃的基本信息 |
| | | GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, task.getGlassIdIn())); |
| | | if (null == glassInfo) { |
| | | log.info("进片玻璃信息不存在,玻璃id:{}", task.getGlassIdIn()); |
| | | Date endDate = new Date(); |
| | | log.info("结束进片任务设备为{},结束时间为:{},共耗时:{}ms", deviceId, endDate, endDate.getTime() - startDate.getTime()); |
| | | return Boolean.FALSE; |
| | | } |
| | | if (glassInIdOne.equals(task.getGlassIdIn()) || glassInIdTwo.equals(task.getGlassIdIn())) { |
| | | log.info("玻璃id与上次相同,禁止进片"); |
| | | Date endDate = new Date(); |
| | | log.info("结束进片任务设备为{},结束时间为:{},共耗时:{}ms", deviceId, endDate, endDate.getTime() - startDate.getTime()); |
| | | return Boolean.FALSE; |
| | | } |
| | | int firstLength = minTwoFirstLength; |
| | | int secondLength = minTwoSecondLength; |
| | | if (deviceId == 1) { |
| | | firstLength = minOneFirstLength; |
| | | secondLength = minOneSecondLength; |
| | | } |
| | | if (Math.max(glassInfo.getWidth(), glassInfo.getHeight()) < firstLength || Math.min(glassInfo.getWidth(), glassInfo.getHeight()) < secondLength) { |
| | | log.info("进片玻璃尺寸小于{}*{},禁止进笼玻璃id:{},尺寸为{}、{}", firstLength, secondLength, task.getGlassIdIn(), glassInfo.getWidth(), glassInfo.getHeight()); |
| | | Date endDate = new Date(); |
| | | log.info("结束进片任务设备为{},结束时间为:{},共耗时:{}ms", deviceId, endDate, endDate.getTime() - startDate.getTime()); |
| | | return Boolean.FALSE; |
| | | } |
| | | EdgStorageCage edgStorageCage = edgStorageCageService.selectNearestEmpty(task.getCurrentCell(), deviceId, Boolean.FALSE); |
| | | Assert.isTrue(null != edgStorageCage, "格子已满"); |
| | | log.info("4、将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); |
| | | EdgStorageCageDetails details = new EdgStorageCageDetails(); |
| | | BeanUtils.copyProperties(glassInfo, details); |
| | | details.setState(Const.GLASS_STATE_IN); |
| | | details.setSlot(edgStorageCage.getSlot()); |
| | | details.setDeviceId(edgStorageCage.getDeviceId()); |
| | | edgStorageCageDetailsService.save(details); |
| | | |
| | | //更新任务信息 |
| | | task.setStartCell(edgStorageCage.getSlot()); |
| | | task.setTaskRunning(Const.GLASS_CACHE_TYPE_IN); |
| | | edgStorageDeviceTaskService.updateTaskMessage(tableName, task); |
| | | saveHistoryTask(task, deviceId); |
| | | //记录进片任务的玻璃id用于下次任务的比较,防止同一块玻璃重复执行 |
| | | if (deviceId == 1) { |
| | | glassInIdOne = task.getGlassIdIn(); |
| | | } else { |
| | | glassInIdTwo = task.getGlassIdIn(); |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("结束进片任务设备为{},结束时间为:{},共耗时:{}ms", deviceId, endDate, endDate.getTime() - startDate.getTime()); |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | private boolean outTask(EdgStorageDeviceTask task, String tableName, int deviceId, int cellFlag) throws Exception { |
| | | Date startDate = new Date(); |
| | | //获取对应的设备状态信息 |
| | | ReadWriteEntity oneOutStateEntity = miloService.readFromOpcUa("WL1.WL1.slotState"); |
| | | ReadWriteEntity twoOutStateEntity = miloService.readFromOpcUa("WL2.WL2.slotState"); |
| | | //状态有3中情况:0空闲 1忙碌 2禁用 |
| | | String oneOutState = "2"; |
| | | String twoOutState = "2"; |
| | | if (null != oneOutStateEntity && null != oneOutStateEntity.getValue()) { |
| | | oneOutState = oneOutStateEntity.getValue().toString(); |
| | | } |
| | | if (null != twoOutStateEntity && null != twoOutStateEntity.getValue()) { |
| | | twoOutState = twoOutStateEntity.getValue().toString(); |
| | | } |
| | | |
| | | if ((cellFlag == 2 && Const.OUT_BUSY.equals(oneOutState) && Const.OUT_BUSY.equals(twoOutState)) || (Const.OUT_DISABLE.equals(oneOutState) && Const.OUT_DISABLE.equals(twoOutState))) { |
| | | log.info("A09、A10为{},{}非自动状态,无法出片", oneOutState, oneOutState); |
| | | return Boolean.FALSE; |
| | | } |
| | | log.info("开始执行出片/直通任务,任务信息为:{},表名为:{},设备id:{},开始时间:{},一号线状态:{},二号线状态:{}", |
| | | task, tableName, deviceId, startDate, oneOutState, twoOutState); |
| | | //获取当前需要走那条线 |
| | | int cell = 0; |
| | | if (cellFlag == 1) { |
| | | cell = deviceId; |
| | | } else { |
| | | if (Const.OUT_FREE.equals(twoOutState)) { |
| | | cell = Const.TWO_OUT_TARGET_POSITION; |
| | | } else if (Const.OUT_FREE.equals(oneOutState)) { |
| | | cell = Const.ONE_OUT_TARGET_POSITION; |
| | | } else { |
| | | return Boolean.FALSE; |
| | | } |
| | | } |
| | | if (Const.OUT_FREE.equals(oneOutState) && Const.OUT_FREE.equals(twoOutState)) { |
| | | if (cellFlag == 2) { |
| | | if (!outChildTask(task, tableName, deviceId, cell, startDate)) { |
| | | cell = cell == Const.ONE_OUT_TARGET_POSITION ? Const.TWO_OUT_TARGET_POSITION : Const.ONE_OUT_TARGET_POSITION; |
| | | return outChildTask(task, tableName, deviceId, cell, startDate); |
| | | } |
| | | } else { |
| | | return outChildTask(task, tableName, deviceId, cell, startDate); |
| | | } |
| | | } else { |
| | | return outChildTask(task, tableName, deviceId, cell, startDate); |
| | | } |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | private boolean outChildTask(EdgStorageDeviceTask task, String tableName, int deviceId, int cell, Date startDate) { |
| | | EdgStorageCageDetails edgStorageCageDetails = null; |
| | | |
| | | //笼内是版图相差是否超过阈值 |
| | | boolean flag = queryMaxMinDiffByDevice(threshold, deviceId); |
| | | if (flag) { |
| | | //先找最小版图版序的玻璃小片 |
| | | EdgStorageCageDetails minEdgDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | .inSql(EdgStorageCageDetails::getSlot, "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) |
| | | .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .eq(EdgStorageCageDetails::getDeviceId, deviceId) |
| | | .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId) |
| | | .orderByAsc(EdgStorageCageDetails::getTemperingFeedSequence) |
| | | .last("limit 1")); |
| | | double maxLength = Math.max(minEdgDetails.getWidth(), minEdgDetails.getHeight()); |
| | | double minLength = Math.min(minEdgDetails.getWidth(), minEdgDetails.getHeight()); |
| | | if ((cell == 1 && maxLength >= minOneFirstLength && minLength >= minOneSecondLength) || |
| | | (cell == 2 && maxLength <= maxTwoFirstLength && minLength <= maxTwoSecondLength && minEdgDetails.getThickness() < maxThickness)) { |
| | | //玻璃小片同尺寸的离当前格子最近的玻璃小片 |
| | | edgStorageCageDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getWidth, minEdgDetails.getWidth()) |
| | | .eq(EdgStorageCageDetails::getHeight, minEdgDetails.getHeight()) |
| | | .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .eq(EdgStorageCageDetails::getDeviceId, deviceId) |
| | | .last("order by abs(slot - " + task.getCurrentCell() + ") asc limit 1") |
| | | ); |
| | | } |
| | | } |
| | | if (null == edgStorageCageDetails) { |
| | | // 获取历史表中上次任务最后一片尺寸 |
| | | EdgStorageDeviceTaskHistory edgeData = edgStorageDeviceTaskHistoryService.getOne(new LambdaQueryWrapper<EdgStorageDeviceTaskHistory>() |
| | | .eq(EdgStorageDeviceTaskHistory::getDeviceId, cell) |
| | | .in(EdgStorageDeviceTaskHistory::getTaskType, Const.GLASS_CACHE_TYPE_OUT, Const.GLASS_CACHE_TYPE_THROUGH) |
| | | .orderByDesc(EdgStorageDeviceTaskHistory::getId).last("limit 1")); |
| | | if (null != edgeData) { |
| | | GlassInfo glassOutInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, edgeData.getGlassIdOut())); |
| | | //笼内的玻璃的尺寸是否和上一次任务一致 |
| | | edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), glassOutInfo.getWidth(), glassOutInfo.getHeight(), cell, maxThickness); |
| | | if (null == edgStorageCageDetails && StringUtils.isNotBlank(task.getGlassIdIn())) { |
| | | GlassInfo glassInInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | .eq(GlassInfo::getGlassId, task.getGlassIdIn()) |
| | | .eq(GlassInfo::getWidth, glassOutInfo.getWidth()) |
| | | .eq(GlassInfo::getHeight, glassOutInfo.getHeight())); |
| | | if (null != glassInInfo) { |
| | | if (cell == 2 && glassInInfo.getThickness() < maxThickness) { |
| | | edgStorageCageDetails = new EdgStorageCageDetails(); |
| | | BeanUtils.copyProperties(glassInInfo, edgStorageCageDetails); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | //前面已经尺寸问题处理完毕,开始计算无相同尺寸的新玻璃小片 |
| | | if (null == edgStorageCageDetails) { |
| | | edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsByLimitSize(deviceId, task.getCurrentCell(), 0, 0, |
| | | cell, minOneFirstLength, minOneSecondLength, maxTwoFirstLength, maxTwoSecondLength, maxThickness); |
| | | } |
| | | if (edgStorageCageDetails == null && StringUtils.isNotBlank(task.getGlassIdIn())) { |
| | | //和上次任务不存在相同尺寸 |
| | | GlassInfo glassInInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, task.getGlassIdIn())); |
| | | |
| | | double maxLength = Math.max(glassInInfo.getWidth(), glassInInfo.getHeight()); |
| | | double minLength = Math.min(glassInInfo.getWidth(), glassInInfo.getHeight()); |
| | | if ((cell == 1 && maxLength >= minOneFirstLength && minLength >= minOneSecondLength) || |
| | | (cell == 2 && maxLength <= maxTwoFirstLength && minLength <= maxTwoSecondLength |
| | | && maxLength >= minTwoFirstLength && minLength >= minTwoSecondLength && glassInInfo.getThickness() < maxThickness)) { |
| | | //玻璃小片同尺寸的离当前格子最近的玻璃小片 |
| | | edgStorageCageDetails = new EdgStorageCageDetails(); |
| | | BeanUtils.copyProperties(glassInInfo, edgStorageCageDetails); |
| | | } else { |
| | | log.info("直通任务目标线路为{},进片玻璃尺寸为{}*{},不符合出片条件", cell, maxLength, minLength); |
| | | } |
| | | } |
| | | if (edgStorageCageDetails == null) { |
| | | //和上次任务不存在相同尺寸 |
| | | log.info("笼内没有玻璃了"); |
| | | return Boolean.FALSE; |
| | | } |
| | | int taskType = Const.GLASS_CACHE_TYPE_OUT; |
| | | String glassId = edgStorageCageDetails.getGlassId(); |
| | | if (glassId.equals(task.getGlassIdIn())) { |
| | | if (3 != task.getTaskState()) { |
| | | return Boolean.FALSE; |
| | | } |
| | | log.info("5、直通任务,将玻璃信息插入卧式理片笼,当前玻璃信息:{}", edgStorageCageDetails); |
| | | if (glassInIdOne.equals(task.getGlassIdIn()) || glassInIdTwo.equals(task.getGlassIdIn())) { |
| | | log.info("玻璃id与上次相同,禁止进片"); |
| | | return Boolean.FALSE; |
| | | } |
| | | //玻璃信息替换 |
| | | String glassIdChange = queryAndChangeGlass(glassId); |
| | | //处理在卧理内的玻璃信息:笼内的数据处理 |
| | | queryEdgAndChangeGlass(edgStorageCageDetails.getGlassId(), glassIdChange); |
| | | if (StringUtils.isNotBlank(glassIdChange)) { |
| | | edgStorageCageDetails = new EdgStorageCageDetails(); |
| | | GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId)); |
| | | BeanUtils.copyProperties(one, edgStorageCageDetails); |
| | | } |
| | | EdgStorageCage storageCage = edgStorageCageService.getOne(new LambdaQueryWrapper<EdgStorageCage>() |
| | | .eq(EdgStorageCage::getDeviceId, deviceId) |
| | | .eq(EdgStorageCage::getEnableState, Const.SLOT_ON) |
| | | .ge(EdgStorageCage::getRemainWidth, cellLength) |
| | | .last("order by abs(slot - " + task.getCurrentCell() + ") limit 1")); |
| | | Assert.isTrue(null != storageCage, "格子已满,无法执行直通任务"); |
| | | log.info("3、查询卧式理片笼里面的空格:{}", storageCage); |
| | | edgStorageCageDetails.setSlot(storageCage.getSlot()); |
| | | edgStorageCageDetails.setDeviceId(storageCage.getDeviceId()); |
| | | edgStorageCageDetails.setState(Const.GLASS_STATE_OUT); |
| | | edgStorageCageDetailsService.save(edgStorageCageDetails); |
| | | taskType = Const.GLASS_CACHE_TYPE_THROUGH; |
| | | } else { |
| | | log.info("5、非直通任务,将玻璃信息插入卧式理片笼,当前玻璃信息:{}", edgStorageCageDetails); |
| | | if (!edgStorageCageDetails.getSlot().equals(task.getCurrentCell())) { |
| | | EdgStorageCageDetails currentGlass = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .eq(EdgStorageCageDetails::getDeviceId, deviceId) |
| | | .eq(EdgStorageCageDetails::getSlot, task.getCurrentCell()).eq(EdgStorageCageDetails::getWidth, edgStorageCageDetails.getWidth()) |
| | | .eq(EdgStorageCageDetails::getHeight, edgStorageCageDetails.getHeight()).eq(EdgStorageCageDetails::getThickness, edgStorageCageDetails.getThickness()) |
| | | .orderByAsc(EdgStorageCageDetails::getId).last("limit 1") |
| | | ); |
| | | if (null != currentGlass) { |
| | | edgStorageCageDetails = currentGlass; |
| | | } |
| | | } |
| | | //玻璃信息替换 |
| | | String glassIdChange = queryAndChangeGlass(edgStorageCageDetails.getGlassId()); |
| | | //处理在卧理内的玻璃信息:笼内的数据处理 |
| | | queryEdgAndChangeGlass(edgStorageCageDetails.getGlassId(), glassIdChange); |
| | | LambdaUpdateWrapper<EdgStorageCageDetails> wrapper = new LambdaUpdateWrapper<>(); |
| | | wrapper.eq(EdgStorageCageDetails::getGlassId, edgStorageCageDetails.getGlassId()).set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT); |
| | | edgStorageCageDetailsService.update(wrapper); |
| | | log.info("5、更新出片玻璃的状态为{}", Const.GLASS_STATE_OUT); |
| | | } |
| | | //生成出片任务 |
| | | task.setGlassIdOut(edgStorageCageDetails.getGlassId()); |
| | | task.setStartCell(edgStorageCageDetails.getSlot()); |
| | | task.setTaskRunning(taskType); |
| | | task.setEndCell(cell); |
| | | |
| | | edgStorageDeviceTaskService.updateTaskMessage(tableName, task); |
| | | saveHistoryTask(task, deviceId); |
| | | //记录直通任务的玻璃id用于下次任务的比较,防止同一块玻璃重复执行 |
| | | if (3 == task.getTaskState()) { |
| | | if (deviceId == 1) { |
| | | glassInIdOne = edgStorageCageDetails.getGlassId(); |
| | | } else { |
| | | glassInIdTwo = edgStorageCageDetails.getGlassId(); |
| | | } |
| | | } |
| | | //更新详情表任务出片中 |
| | | edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() |
| | | .set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT) |
| | | .eq(EdgStorageCageDetails::getGlassId, edgStorageCageDetails.getGlassId())); |
| | | //磨边对列表新增一条数据 |
| | | saveGlassSize(edgStorageCageDetails); |
| | | Date endDate = new Date(); |
| | | log.info("结束出片/直通任务设备为{},结束时间为:{},共耗时:{}ms", deviceId, endDate, endDate.getTime() - startDate.getTime()); |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | private boolean finishTask(EdgStorageDeviceTask task, String tableName, int device) { |
| | | if (task.getTaskState() <= 4) { |
| | | log.info("有正在执行的任务或这任务已执行任务状态{},任务启动情况{},结束", task.getTaskState(), task.getTaskRunning()); |
| | | return Boolean.FALSE; |
| | | } |
| | | Date startDate = new Date(); |
| | | log.info("开始执行完成任务后清除动作,任务信息为:{},表名为:{},开始时间:{}", task, tableName, startDate); |
| | | task.setTaskRunning(Const.GLASS_CACHE_TYPE_EMPTY); |
| | | task.setGlassIdOut(""); |
| | | task.setStartCell(0); |
| | | task.setEndCell(0); |
| | | EdgStorageDeviceTaskHistory taskHistory = edgStorageDeviceTaskHistoryService.getOne(new LambdaQueryWrapper<EdgStorageDeviceTaskHistory>() |
| | | .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_NEW) |
| | | .eq(EdgStorageDeviceTaskHistory::getDeviceId, device) |
| | | .orderByDesc(EdgStorageDeviceTaskHistory::getCreateTime).last("limit 1")); |
| | | if (null != taskHistory) { |
| | | //如果任务类型为1,3,将切割完成的玻璃自动报工 |
| | | if (Const.GLASS_CACHE_TYPE_IN_ALL.contains(taskHistory.getTaskType())) { |
| | | damageService.autoSubmitReport(taskHistory.getGlassIdIn(), taskHistory.getDeviceId(), "切割", "进卧理", 1); |
| | | } |
| | | |
| | | edgStorageDeviceTaskHistoryService.update(new LambdaUpdateWrapper<EdgStorageDeviceTaskHistory>() |
| | | .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_NEW) |
| | | .eq(EdgStorageDeviceTaskHistory::getDeviceId, device) |
| | | .set(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_SUCCESS) |
| | | ); |
| | | } |
| | | //最后更新任务,保证任务前的动作都做完 |
| | | edgStorageDeviceTaskService.updateTaskMessage(tableName, task); |
| | | Date endDate = new Date(); |
| | | log.info("结束完成任务后清除动作,表名为:{},结束时间为:{},共耗时:{}ms", tableName, endDate, endDate.getTime() - startDate.getTime()); |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | private boolean damageTask(EdgStorageDeviceTask task, String tableName, int device) { |
| | | if (task.getTaskState() <= 5) { |
| | | log.info("任务未发生异常清空,任务结束,电气状态{},mes状态{}", task.getTaskState(), task.getTaskRunning()); |
| | | return Boolean.FALSE; |
| | | } |
| | | Date startDate = new Date(); |
| | | log.info("开始执行异常处理任务后清除动作,任务信息为:{},表名为:{},开始时间:{}", task, tableName, startDate); |
| | | EdgStorageDeviceTaskHistory taskHistory = edgStorageDeviceTaskHistoryService.getOne(new LambdaQueryWrapper<EdgStorageDeviceTaskHistory>() |
| | | .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_NEW) |
| | | .eq(EdgStorageDeviceTaskHistory::getDeviceId, device) |
| | | .orderByDesc(EdgStorageDeviceTaskHistory::getCreateTime).last("limit 1")); |
| | | if (null != taskHistory) { |
| | | Integer cell = taskHistory.getStartCell(); |
| | | Integer taskType = taskHistory.getTaskType(); |
| | | if (Const.GLASS_CACHE_TYPE_IN_ALL.contains(taskType)) { |
| | | String glassId = taskHistory.getGlassIdIn(); |
| | | edgStorageCageDetailsService.remove(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getDeviceId, device) |
| | | .eq(EdgStorageCageDetails::getSlot, cell) |
| | | .eq(EdgStorageCageDetails::getGlassId, glassId)); |
| | | } else { |
| | | String glassId = taskHistory.getGlassIdOut(); |
| | | edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() |
| | | .set(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .eq(EdgStorageCageDetails::getDeviceId, device) |
| | | .eq(EdgStorageCageDetails::getSlot, cell) |
| | | .eq(EdgStorageCageDetails::getGlassId, glassId)); |
| | | } |
| | | |
| | | edgStorageDeviceTaskHistoryService.update(new LambdaUpdateWrapper<EdgStorageDeviceTaskHistory>() |
| | | .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_NEW) |
| | | .eq(EdgStorageDeviceTaskHistory::getDeviceId, device) |
| | | .set(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_FAILURE) |
| | | ); |
| | | } |
| | | //最后更新任务,保证任务前的动作都做完 |
| | | task.setTaskRunning(Const.GLASS_CACHE_TYPE_EMPTY); |
| | | task.setGlassIdOut(""); |
| | | task.setStartCell(0); |
| | | task.setEndCell(0); |
| | | edgStorageDeviceTaskService.updateTaskMessage(tableName, task); |
| | | Date endDate = new Date(); |
| | | log.info("完成执行异常处理任务后清除动作,表名为:{},结束时间为:{},共耗时:{}ms", tableName, endDate, endDate.getTime() - startDate.getTime()); |
| | | return Boolean.TRUE; |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 查询玻璃并进行交换 |
| | | * |
| | | * @param glassId |
| | | * @return |
| | | */ |
| | | public String queryAndChangeGlass(String glassId) { |
| | | GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId)); |
| | | // .inSql(GlassInfo::getEngineerId, "select engineer_id from engineering where state = 1")); |
| | | Assert.isFalse(null == glassInfo, "玻璃信息不存在"); //按照玻璃尺寸 |
| | | LambdaQueryWrapper<GlassInfo> queryWrapper = new LambdaQueryWrapper<GlassInfo>() |
| | | .eq(GlassInfo::getWidth, glassInfo.getWidth()) |
| | | .eq(GlassInfo::getHeight, glassInfo.getHeight()) |
| | | .eq(GlassInfo::getThickness, glassInfo.getThickness()) |
| | | .eq(GlassInfo::getFilmsid, glassInfo.getFilmsid()) |
| | | .eq(GlassInfo::getFlowCardId, glassInfo.getFlowCardId()) |
| | | .eq(GlassInfo::getTotalLayer, glassInfo.getTotalLayer()) |
| | | .eq(GlassInfo::getLayer, glassInfo.getLayer()) |
| | | .eq(GlassInfo::getEngineerId, glassInfo.getEngineerId()) |
| | | .notInSql(GlassInfo::getGlassId, "select distinct glass_id from edg_storage_cage_details " + |
| | | "where engineer_id = '" + glassInfo.getEngineerId() + "' and width = " + glassInfo.getWidth() + " and height = " + glassInfo.getHeight() |
| | | + " and state != 100") |
| | | .orderByAsc(GlassInfo::getTemperingLayoutId) |
| | | .orderByAsc(GlassInfo::getTemperingFeedSequence) |
| | | .last("Limit 1"); |
| | | GlassInfo swapGlassInfo = glassInfoService.getOne(queryWrapper); |
| | | if (swapGlassInfo != null && !glassInfo.getGlassId().equals(swapGlassInfo.getGlassId())) { |
| | | //待替换的玻璃信息 |
| | | Integer ishorizontal = glassInfo.getIshorizontal(); |
| | | Integer temperingLayoutId = glassInfo.getTemperingLayoutId(); |
| | | Integer temperingFeedSequence = glassInfo.getTemperingFeedSequence(); |
| | | Integer xCoordinate = glassInfo.getXCoordinate(); |
| | | Integer yCoordinate = glassInfo.getYCoordinate(); |
| | | double angle = glassInfo.getAngle(); |
| | | Integer ruleId = glassInfo.getRuleId(); |
| | | //替换后的玻璃信息 |
| | | Integer swapIshorizontal = swapGlassInfo.getIshorizontal(); |
| | | Integer swapTemperingLayoutId = swapGlassInfo.getTemperingLayoutId(); |
| | | Integer swapTemperingFeedSequence = swapGlassInfo.getTemperingFeedSequence(); |
| | | Integer swapXCoordinate = swapGlassInfo.getXCoordinate(); |
| | | Integer swapYCoordinate = swapGlassInfo.getYCoordinate(); |
| | | double swapAngle = swapGlassInfo.getAngle(); |
| | | Integer swapRuleId = swapGlassInfo.getRuleId(); |
| | | //替换玻璃信息 |
| | | glassInfo.setIshorizontal(swapIshorizontal); |
| | | glassInfo.setTemperingLayoutId(swapTemperingLayoutId); |
| | | glassInfo.setTemperingFeedSequence(swapTemperingFeedSequence); |
| | | glassInfo.setXCoordinate(swapXCoordinate); |
| | | glassInfo.setYCoordinate(swapYCoordinate); |
| | | glassInfo.setAngle(swapAngle); |
| | | glassInfo.setRuleId(swapRuleId); |
| | | |
| | | swapGlassInfo.setIshorizontal(ishorizontal); |
| | | swapGlassInfo.setTemperingLayoutId(temperingLayoutId); |
| | | swapGlassInfo.setTemperingFeedSequence(temperingFeedSequence); |
| | | swapGlassInfo.setXCoordinate(xCoordinate); |
| | | swapGlassInfo.setYCoordinate(yCoordinate); |
| | | swapGlassInfo.setAngle(angle); |
| | | swapGlassInfo.setRuleId(ruleId); |
| | | |
| | | log.info("将玻璃{}和玻璃{},信息互换(原片序号及坐标除外),进玻璃 {}", glassInfo, swapGlassInfo, swapGlassInfo); |
| | | glassInfoService.updateById(swapGlassInfo); |
| | | glassInfoService.updateById(glassInfo); |
| | | return swapGlassInfo.getGlassId(); |
| | | } |
| | | return ""; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 查询卧式理片玻璃并进行交换 |
| | | * |
| | | * @param glassId |
| | | * @return |
| | | */ |
| | | public void queryEdgAndChangeGlass(String glassId, String swapGlassId) { |
| | | if (StringUtils.isBlank(swapGlassId)) { |
| | | log.info("当前出笼玻璃不存在需要替换的玻璃"); |
| | | return; |
| | | } |
| | | //获取待出笼的玻璃 |
| | | EdgStorageCageDetails glassInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getGlassId, glassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); |
| | | // 获取待出笼的玻璃需要替换的玻璃信息 |
| | | EdgStorageCageDetails swapGlassDetailInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getGlassId, swapGlassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); |
| | | |
| | | // 玻璃小片表中玻璃已经替换,更新卧理笼内现有的准备出笼的玻璃信息, |
| | | if (null == swapGlassDetailInfo) { |
| | | GlassInfo glassInfoBase = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | .eq(GlassInfo::getGlassId, glassId)); |
| | | //需要替换的玻璃为存进卧理,仅需更新当前需要出笼的玻璃信息即可 |
| | | edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getGlassId, glassId) |
| | | .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfoBase.getTemperingLayoutId()) |
| | | .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfoBase.getTemperingFeedSequence())); |
| | | } else { |
| | | //需要替换的玻璃都在卧理内,按照玻璃id对调玻璃信息:对调玻璃id即可 |
| | | edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getId, glassInfo.getId()) |
| | | .set(EdgStorageCageDetails::getTemperingLayoutId, swapGlassDetailInfo.getTemperingLayoutId()) |
| | | .set(EdgStorageCageDetails::getTemperingFeedSequence, swapGlassDetailInfo.getTemperingFeedSequence()) |
| | | ); |
| | | edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() |
| | | .eq(EdgStorageCageDetails::getId, swapGlassDetailInfo.getId()) |
| | | .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId()) |
| | | .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence()) |
| | | ); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取详情表内最大最小版图id的差值,判断是否出最小版图玻璃 |
| | | * |
| | | * @return |
| | | */ |
| | | public boolean queryMaxMinDiffByDevice(int threshold, int deviceId) { |
| | | //获取笼子内最大版图id和最小版图id插值,判断是否大于阈值,大于阈值直接出最小版图玻璃 |
| | | QueryWrapper<EdgStorageCageDetails> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.select("max(tempering_layout_id)-min(tempering_layout_id) as diff") |
| | | .eq("state", Const.GLASS_STATE_IN) |
| | | .eq("device_id", deviceId) |
| | | .inSql("slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON); |
| | | List<Object> list = edgStorageCageDetailsService.listObjs(queryWrapper); |
| | | //获取笼内玻璃版图差值是否大于阈值 |
| | | if (CollectionUtil.isNotEmpty(list)) { |
| | | Long diff = (Long) list.get(0); |
| | | return diff > threshold; |
| | | } else { |
| | | return Boolean.FALSE; |
| | | } |
| | | } |
| | | |
| | | public boolean saveHistoryTask(EdgStorageDeviceTask task, int deviceId) { |
| | | EdgStorageDeviceTaskHistory taskHistory = new EdgStorageDeviceTaskHistory(); |
| | | BeanUtils.copyProperties(task, taskHistory); |
| | | taskHistory.setTaskType(task.getTaskRunning()); |
| | | taskHistory.setCreateTime(new Date()); |
| | | taskHistory.setTaskState(Const.RAW_GLASS_TASK_NEW); |
| | | taskHistory.setDeviceId(deviceId); |
| | | edgStorageDeviceTaskHistoryService.save(taskHistory); |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | private boolean saveGlassSize(EdgStorageCageDetails glassInfo) { |
| | | EdgGlassTaskInfo edgGlassTaskInfo = new EdgGlassTaskInfo(); |
| | | BeanUtils.copyProperties(glassInfo, edgGlassTaskInfo); |
| | | edgGlassTaskInfo.setHeight((int) (glassInfo.getHeight() * ratio)); |
| | | edgGlassTaskInfo.setWidth((int) (glassInfo.getWidth() * ratio)); |
| | | edgGlassTaskInfo.setThickness((int) (glassInfo.getThickness() * ratio)); |
| | | edgGlassTaskInfo.setState(Const.EDG_GLASS_BEFORE); |
| | | edgGlassTaskInfo.setCreateTime(new Date()); |
| | | edgGlassTaskInfo.setUpdateTime(new Date()); |
| | | //先将历史对列表中本玻璃的数据删除,重新新增一份最新的数据 |
| | | edgGlassTaskInfoService.remove(new LambdaQueryWrapper<EdgGlassTaskInfo>().eq(EdgGlassTaskInfo::getGlassId, glassInfo.getGlassId())); |
| | | return edgGlassTaskInfoService.save(edgGlassTaskInfo); |
| | | } |
| | | |
| | | private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) { |
| | | return ReadWriteEntity.builder() |
| | | .identifier(identifier) |
| | | //Kep中是Long类型,即:Int32,Java中的int类型 |
| | | .value(value) |
| | | .build(); |
| | | } |
| | | } |
| | |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | @Resource |
| | | DamageService damageService; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | // @Value("${mes.glassGap}") |
| | | private int glassGap; |
| | | @Value("${mes.threshold}") |
| | | // @Value("${mes.threshold}") |
| | | private int threshold; |
| | | @Value("${mes.cellLength}") |
| | | // @Value("${mes.cellLength}") |
| | | private int cellLength; |
| | | @Value("${mes.ratio}") |
| | | // @Value("${mes.ratio}") |
| | | private int ratio; |
| | | |
| | | @Value("${mes.min.one.firstLength}") |
| | | // @Value("${mes.min.one.firstLength}") |
| | | private int minOneFirstLength; |
| | | |
| | | @Value("${mes.min.one.secondLength}") |
| | | // @Value("${mes.min.one.secondLength}") |
| | | private int minOneSecondLength; |
| | | |
| | | @Value("${mes.min.two.firstLength}") |
| | | // @Value("${mes.min.two.firstLength}") |
| | | private int minTwoFirstLength; |
| | | |
| | | @Value("${mes.min.two.secondLength}") |
| | | // @Value("${mes.min.two.secondLength}") |
| | | private int minTwoSecondLength; |
| | | |
| | | private String glassInIdOne = ""; |
| | |
| | | private String glassIdOne = ""; |
| | | private String glassIdTwo = ""; |
| | | |
| | | @Scheduled(fixedDelay = 1000) |
| | | // @Scheduled(fixedDelay = 1000) |
| | | public void startOneOpcTask() { |
| | | startOneOpcTaskChild(EDG_STORAGE_DEVICE_ONE_TASK, 1); |
| | | } |
| | | |
| | | @Scheduled(fixedDelay = 1000) |
| | | // @Scheduled(fixedDelay = 1000) |
| | | public void startTwoOpcTask() { |
| | | startOneOpcTaskChild(EDG_STORAGE_DEVICE_TWO_TASK, 2); |
| | | } |
| | |
| | | } |
| | | |
| | | |
| | | @Scheduled(fixedDelay = 1000) |
| | | // @Scheduled(fixedDelay = 1000) |
| | | public void edgOneOpcTask() throws Exception { |
| | | EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(EDG_STORAGE_DEVICE_ONE_TASK); |
| | | String glassId = task.getGlassId(); |
| | |
| | | edgTaskChild(glassId, 1); |
| | | } |
| | | |
| | | @Scheduled(fixedDelay = 1000) |
| | | // @Scheduled(fixedDelay = 1000) |
| | | public void edgTwoOpcTask() throws Exception { |
| | | EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(EDG_STORAGE_DEVICE_TWO_TASK); |
| | | String glassId = task.getGlassId(); |
| | |
| | | if (null != edgeData) { |
| | | GlassInfo glassOutInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, edgeData.getGlassIdOut())); |
| | | //笼内的玻璃的尺寸是否和上一次任务一致 |
| | | edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), glassOutInfo.getWidth(), glassOutInfo.getHeight()); |
| | | edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), glassOutInfo.getWidth(), glassOutInfo.getHeight(), 0, 0); |
| | | if (null == edgStorageCageDetails && StringUtils.isNotBlank(task.getGlassIdIn())) { |
| | | GlassInfo glassInInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | .eq(GlassInfo::getGlassId, task.getGlassIdIn()) |
| | |
| | | } |
| | | } |
| | | if (null == edgStorageCageDetails) { |
| | | edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), 0, 0); |
| | | edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), 0, 0, 0, 0); |
| | | } |
| | | if (edgStorageCageDetails == null && StringUtils.isNotBlank(task.getGlassIdIn())) { |
| | | //和上次任务不存在相同尺寸 |
New file |
| | |
| | | package com.mes.job; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.kangaroohy.milo.model.ReadWriteEntity; |
| | | import com.kangaroohy.milo.service.MiloService; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @Author : zhoush |
| | | * @Date: 2024/10/10 8:05 |
| | | * @Description: |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class OpcEdgTask { |
| | | |
| | | |
| | | @Autowired(required = false) |
| | | MiloService miloService; |
| | | |
| | | @Resource |
| | | GlassInfoService glassInfoService; |
| | | |
| | | |
| | | @Scheduled(fixedDelay = 2000) |
| | | public void startOneEdgTask() throws Exception { |
| | | startEdgTaskChild("01"); |
| | | } |
| | | |
| | | @Scheduled(fixedDelay = 2000) |
| | | public void startTwoEdgTask() throws Exception { |
| | | startEdgTaskChild("02"); |
| | | } |
| | | |
| | | private void startEdgTaskChild(String cell) throws Exception { |
| | | ReadWriteEntity request = miloService.readFromOpcUa("MB04.MB04.request" + cell); |
| | | if (null == request || "0".equals(request.getValue() + "")) { |
| | | log.info("未收到玻璃请求,结束本次任务"); |
| | | return; |
| | | } |
| | | ReadWriteEntity glassIdEntity = miloService.readFromOpcUa("MB04.MB04.plc_glass_id_" + cell); |
| | | |
| | | if (null == glassIdEntity || StringUtils.isEmpty(glassIdEntity.getValue() + "")) { |
| | | log.info("有请求但玻璃id为空,结束本次任务"); |
| | | return; |
| | | } |
| | | String glassId = glassIdEntity.getValue() + ""; |
| | | log.info("获取到{}线的玻璃id:{}", cell, glassId); |
| | | GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId).last("limit 1")); |
| | | |
| | | List<ReadWriteEntity> ualist = new ArrayList<>(); |
| | | miloService.writeToOpcUa(generateReadWriteEntity("MB04.MB04.mes_glass_Id_" + cell, glassId)); |
| | | ualist.add(generateReadWriteEntity("MB04.MB04.width" + cell, (int) Math.max(glassInfo.getWidth() * 10, glassInfo.getHeight() * 10))); |
| | | ualist.add(generateReadWriteEntity("MB04.MB04.height" + cell, (int) Math.min(glassInfo.getWidth() * 10, glassInfo.getHeight() * 10))); |
| | | ualist.add(generateReadWriteEntity("MB04.MB04.thickness" + cell, (int) glassInfo.getThickness() * 10)); |
| | | miloService.writeToOpcWord(ualist); |
| | | } |
| | | |
| | | private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) { |
| | | return ReadWriteEntity.builder() |
| | | .identifier(identifier) |
| | | //Kep中是Long类型,即:Int32,Java中的int类型 |
| | | .value(value) |
| | | .build(); |
| | | } |
| | | |
| | | } |
| | |
| | | import com.kangaroohy.milo.runner.subscription.SubscriptionCallback; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.edgglasstask.service.EdgGlassTaskInfoService; |
| | | import com.mes.edgstoragecage.entity.EdgStorageCage; |
| | | import com.mes.edgstoragecage.entity.EdgStorageCageDetails; |
| | | import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; |
| | | import com.mes.edgstoragecage.service.EdgStorageCageService; |
| | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | @Resource |
| | | EdgGlassTaskInfoService edgGlassTaskInfoService; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private int glassGap; |
| | | @Value("${mes.threshold}") |
| | | private int threshold; |
| | | @Value("${mes.cellLength}") |
| | | private int cellLength; |
| | | // @Value("${mes.glassGap}") |
| | | // private int glassGap; |
| | | // @Value("${mes.threshold}") |
| | | // private int threshold; |
| | | // @Value("${mes.cellLength}") |
| | | // private int cellLength; |
| | | |
| | | private Date startDate; |
| | | |
| | |
| | | } |
| | | |
| | | private boolean updateCellRemainWidth(int slot, int device) { |
| | | List<EdgStorageCageDetails> list = edgStorageCageDetailsService.list(new LambdaQueryWrapper<EdgStorageCageDetails>().eq(EdgStorageCageDetails::getSlot, slot) |
| | | .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); |
| | | int remainWidth = cellLength; |
| | | if (CollectionUtil.isNotEmpty(list)) { |
| | | int widthTotal = (int) list.stream().map(e -> Math.max(e.getWidth(), e.getHeight()) + glassGap).mapToDouble(Double::intValue).sum(); |
| | | remainWidth = cellLength - widthTotal >= 0 ? cellLength - widthTotal : 0; |
| | | } |
| | | edgStorageCageService.update(new LambdaUpdateWrapper<EdgStorageCage>(). |
| | | set(EdgStorageCage::getRemainWidth, remainWidth).eq(EdgStorageCage::getSlot, slot).eq(EdgStorageCage::getDeviceId, device)); |
| | | // List<EdgStorageCageDetails> list = edgStorageCageDetailsService.list(new LambdaQueryWrapper<EdgStorageCageDetails>().eq(EdgStorageCageDetails::getSlot, slot) |
| | | // .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); |
| | | // int remainWidth = cellLength; |
| | | // if (CollectionUtil.isNotEmpty(list)) { |
| | | // int widthTotal = (int) list.stream().map(e -> Math.max(e.getWidth(), e.getHeight()) + glassGap).mapToDouble(Double::intValue).sum(); |
| | | // remainWidth = cellLength - widthTotal >= 0 ? cellLength - widthTotal : 0; |
| | | // } |
| | | // edgStorageCageService.update(new LambdaUpdateWrapper<EdgStorageCage>(). |
| | | // set(EdgStorageCage::getRemainWidth, remainWidth).eq(EdgStorageCage::getSlot, slot).eq(EdgStorageCage::getDeviceId, device)); |
| | | return Boolean.TRUE; |
| | | } |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.edgstoragecage.entity.EdgStorageCage; |
| | | import com.mes.edgstoragecage.entity.EdgStorageCageDetails; |
| | | import com.mes.edgstoragecage.entity.vo.EdgSlotRemainVO; |
| | |
| | | import com.mes.opctask.mapper.EdgStorageDeviceTaskMapper; |
| | | import com.mes.opctask.service.EdgStorageDeviceTaskHistoryService; |
| | | import com.mes.opctask.service.EdgStorageDeviceTaskService; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | private EdgStorageCageService edgStorageCageService; |
| | | @Resource |
| | | EdgStorageDeviceTaskMapper edgStorageDeviceTaskMapper; |
| | | @Resource |
| | | SysConfigService sysConfigService; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private int glassGap; |
| | | @Value("${mes.cellLength}") |
| | | private int cellLength; |
| | | // @Value("${mes.glassGap}") |
| | | // private int glassGap; |
| | | // @Value("${mes.cellLength}") |
| | | // private int cellLength; |
| | | |
| | | @Override |
| | | public EdgStorageDeviceTask queryTaskMessage(String tableName) { |
| | |
| | | task.setTaskRunning(Const.GLASS_CACHE_TYPE_EMPTY); |
| | | task.setGlassIdOut(""); |
| | | task.setStartCell(0); |
| | | task.setEndCell(0); |
| | | this.updateTaskMessage(tableName, task); |
| | | return Boolean.TRUE; |
| | | } |
| | |
| | | task.setTaskRunning(Const.GLASS_CACHE_TYPE_EMPTY); |
| | | task.setGlassIdOut(""); |
| | | task.setStartCell(0); |
| | | task.setEndCell(0); |
| | | this.updateTaskMessage(tableName, task); |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | private boolean resetSlotRemainWidth() { |
| | | int cellLength = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_CELL_LENGTH); |
| | | int glassGap = sysConfigService.queryConfigValue(ConstSysConfig.CACHE_GLASS_GAP); |
| | | //将尺寸重置为原始尺寸 |
| | | edgStorageCageService.update(new LambdaUpdateWrapper<EdgStorageCage>().set(EdgStorageCage::getRemainWidth, cellLength)); |
| | | //获取笼内的详情数据 |
| | | List<EdgSlotRemainVO> edgSlotRemainVOS = edgStorageCageDetailsService.querySlotRemainWidth(cellLength, glassGap); |
| | | //按照查询结果对笼内现有玻璃的格子尺寸进行更新 |
| | | if(CollectionUtils.isNotEmpty(edgSlotRemainVOS)){ |
| | | if (CollectionUtils.isNotEmpty(edgSlotRemainVOS)) { |
| | | edgStorageCageService.resetSlotRemainWidth(edgSlotRemainVOS); |
| | | } |
| | | return Boolean.TRUE; |
| | |
| | | database: 0 |
| | | host: 127.0.0.1 |
| | | port: 6379 |
| | | password: 123456 |
| | | password: 123456 |
| | | kangaroohy: |
| | | milo: |
| | | enabled: false |
| | | primary: default |
| | | config: |
| | | default: |
| | | endpoint: opc.tcp://192.168.2.100:49320 |
| | | security-policy: basic256sha256 |
| | | username: admin |
| | | password: 1qaz2wsx3edc4rfv |
| | |
| | | secondLength: 300 |
| | | glassGap: 2500 |
| | | cellLength: 2500 |
| | | maxThickness: 8 |
| | | sequence: |
| | | order: false |
| | | kangaroohy: |
| | | milo: |
| | | enabled: true |
| | | primary: default |
| | | config: |
| | | default: |
| | | endpoint: opc.tcp://10.153.19.150:49320 |
| | | security-policy: basic256sha256 |
| | | username: admin |
| | | password: 1qaz2wsx3edc4rfv |
| | | |
| | |
| | | <if test="height != 0"> |
| | | and t.height = #{height} |
| | | </if> |
| | | <if test="cell == 2"> |
| | | and t.thickness < #{maxThickness} |
| | | </if> |
| | | </where> |
| | | order by total_count desc, glass_count, abs(t.slot - #{currentSlot}) |
| | | ) |
| | |
| | | |
| | | </select> |
| | | <select id="querySlotRemainWidth" resultType="com.mes.edgstoragecage.entity.vo.EdgSlotRemainVO"> |
| | | select device_id,slot, if(#{cellLength} - sum(GREATEST(width,height)+#{glassGap}) < 0 ,0,#{cellLength} - |
| | | sum(GREATEST(width,height)+#{glassGap}) )as |
| | | remain_width from edg_storage_cage_details where state = 100 group by device_id,slot |
| | | select device_id, |
| | | slot, |
| | | if(#{cellLength} - sum(GREATEST(width, height) + #{glassGap}) < 0, 0, #{cellLength} - |
| | | sum(GREATEST(width, height) + #{glassGap})) as |
| | | remain_width |
| | | from edg_storage_cage_details |
| | | where state = 100 |
| | | group by device_id, slot |
| | | </select> |
| | | <select id="queryEdgStorageDetailsByLimitSize" resultMap="baseMap"> |
| | | SELECT t1.* |
| | | FROM edg_storage_cage t |
| | | LEFT JOIN edg_storage_cage_details t1 ON t.device_id = t1.device_id |
| | | AND t.slot = t1.slot |
| | | <where> |
| | | t.enable_state = 1 |
| | | AND t1.state = 100 |
| | | AND t1.device_id = #{deviceId} |
| | | <if test="width != 0"> |
| | | and t1.width = #{width} |
| | | </if> |
| | | <if test="height != 0"> |
| | | and t1.height = #{height} |
| | | </if> |
| | | <if test="cell == 1"> |
| | | and #{minOneFirstLength} <= GREATEST(t1.width, t1.height) |
| | | and #{minOneSecondLength} <= least(t1.width, t1.height) |
| | | </if> |
| | | <if test="cell == 2"> |
| | | and #{maxTwoFirstLength} >= GREATEST(t1.width, t1.height) |
| | | and #{maxTwoSecondLength} >= least(t1.width, t1.height) |
| | | and t1.thickness < #{maxThickness} |
| | | </if> |
| | | </where> |
| | | ORDER BY abs(t.slot - #{currentCell}) |
| | | limit 1 |
| | | </select> |
| | | <select id="queryPieChart" resultType="com.mes.largenscreen.entity.PieChartVO"> |
| | | SELECT |
| | | round(sum( CASE WHEN e.station_cell = 5 THEN 1 ELSE 0 END ),2) as oneCompletedQuantity, |
| | | round(sum( CASE WHEN e.station_cell = 5 THEN escd.width*escd.height/1000000 ELSE 0 END ),2) as oneCompletedArea, |
| | | round(sum( CASE WHEN e.station_cell = 6 THEN 1 ELSE 0 END ),2) as twoCompletedQuantity, |
| | | round(sum( CASE WHEN e.station_cell = 6 THEN escd.width*escd.height/1000000 ELSE 0 END ),2) as twoCompletedArea, |
| | | round(sum( CASE WHEN e.station_cell = 5 and escd.device_id is null THEN 1 ELSE 0 END ),2) as oneUncompletedQuantity, |
| | | round(sum( CASE WHEN e.station_cell = 5 and escd.device_id is null THEN gi.width*gi.height/1000000 ELSE 0 END ),2) as oneUncompletedArea, |
| | | round(sum( CASE WHEN e.station_cell = 6 and escd.device_id is null THEN 1 ELSE 0 END ),2) as twoUncompletedQuantity, |
| | | SELECT round(sum(CASE WHEN e.station_cell = 5 THEN 1 ELSE 0 END), 2) as oneCompletedQuantity, |
| | | round(sum(CASE WHEN e.station_cell = 5 THEN escd.width * escd.height / 1000000 ELSE 0 END), |
| | | 2) as oneCompletedArea, |
| | | round(sum(CASE WHEN e.station_cell = 6 THEN 1 ELSE 0 END), 2) as twoCompletedQuantity, |
| | | round(sum(CASE WHEN e.station_cell = 6 THEN escd.width * escd.height / 1000000 ELSE 0 END), |
| | | 2) as twoCompletedArea, |
| | | round(sum(CASE WHEN e.station_cell = 5 and escd.device_id is null THEN 1 ELSE 0 END), |
| | | 2) as oneUncompletedQuantity, |
| | | round(sum(CASE |
| | | WHEN e.station_cell = 5 and escd.device_id is null THEN gi.width * gi.height / 1000000 |
| | | ELSE 0 END), |
| | | 2) as oneUncompletedArea, |
| | | round(sum(CASE WHEN e.station_cell = 6 and escd.device_id is null THEN 1 ELSE 0 END), |
| | | 2) as twoUncompletedQuantity, |
| | | round(sum( CASE WHEN e.station_cell = 6 and escd.device_id is null THEN gi.width*gi.height/1000000 ELSE 0 END ),2) as twoUncompletedArea |
| | | FROM |
| | | glass_info gi |
| | |
| | | <id column="glass_id_out" property="glassIdOut"/> |
| | | <id column="current_cell" property="currentCell"/> |
| | | <id column="start_cell" property="startCell"/> |
| | | <id column="enc_cell" property="endCell"/> |
| | | <id column="end_cell" property="endCell"/> |
| | | <id column="task_state" property="taskState"/> |
| | | <id column="create_time" property="createTime"/> |
| | | <id column="update_time" property="updateTime"/> |
| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.github.yulichang.toolkit.JoinWrappers; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.edgstoragecage.entity.EdgStorageCageDetails; |
| | | import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; |
| | | import com.mes.edgstoragecage.service.EdgStorageCageService; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.job.CacheGlassTask; |
| | | import com.mes.pp.entity.OptimizeDetail; |
| | | import com.mes.pp.entity.OptimizeLayout; |
| | | import com.mes.pp.mapper.OptimizeDetailMapper; |
| | |
| | | OptimizeDetailMapper optimizeDetailMapper; |
| | | @Autowired |
| | | GlassInfoService glassInfoService; |
| | | @Autowired |
| | | CacheGlassTask cacheGlassTask; |
| | | // @Autowired |
| | | // CacheGlassTask cacheGlassTask; |
| | | |
| | | @Autowired |
| | | TaskCacheService taskCacheService; |
| | |
| | | log.info("完整路径:{}", Arrays.asList(url)); |
| | | } |
| | | |
| | | @Test |
| | | public void queryChangeGlassInfo() { |
| | | cacheGlassTask.queryChangeGlassInfo(Const.A10_OUT_TARGET_POSITION, ""); |
| | | } |
| | | |
| | | @Test |
| | | public void testChangeCellSize() { |
| | | cacheGlassTask.queryChangeGlassInfo(Const.A09_OUT_TARGET_POSITION, ""); |
| | | } |
| | | |
| | | @Test |
| | | public void testCellSize() { |
| | | cacheGlassTask.outTo(0, 0, "", "NG24051802A001|1|1|1|1", 0); |
| | | } |
| | | |
| | | @Test |
| | | public void testinTo() { |
| | | cacheGlassTask.inTo("NG24051802A001|1|1|2|1", "1", "1"); |
| | | } |
| | | |
| | | @Test |
| | | public void testChangeGlassInfo() { |
| | | cacheGlassTask.queryAndChangeGlass("NG24051802A001|1|1|1|1"); |
| | | } |
| | | // @Test |
| | | // public void queryChangeGlassInfo() { |
| | | // cacheGlassTask.queryChangeGlassInfo(Const.A10_OUT_TARGET_POSITION, ""); |
| | | // } |
| | | // |
| | | // @Test |
| | | // public void testChangeCellSize() { |
| | | // cacheGlassTask.queryChangeGlassInfo(Const.A09_OUT_TARGET_POSITION, ""); |
| | | // } |
| | | // |
| | | // @Test |
| | | // public void testCellSize() { |
| | | // cacheGlassTask.outTo(0, 0, "", "NG24051802A001|1|1|1|1", 0); |
| | | // } |
| | | // |
| | | // @Test |
| | | // public void testinTo() { |
| | | // cacheGlassTask.inTo("NG24051802A001|1|1|2|1", "1", "1"); |
| | | // } |
| | | // |
| | | // @Test |
| | | // public void testChangeGlassInfo() { |
| | | // cacheGlassTask.queryAndChangeGlass("NG24051802A001|1|1|1|1"); |
| | | // } |
| | | |
| | | @Test |
| | | public void testSqlServer() { |
| | |
| | | import com.mes.bigstoragetask.mapper.BigStorageCageFeedTaskMapper; |
| | | import com.mes.bigstoragetask.mapper.BigStorageCageOutTaskMapper; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.damage.entity.Damage; |
| | | import com.mes.damage.service.DamageService; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.mapper.GlassInfoMapper; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.job.PlcStorageCageTask; |
| | | import com.mes.sysconfig.entity.SysConfig; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | import com.mes.temperingglass.mapper.TemperingGlassInfoMapper; |
| | | import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | import com.mes.utils.RedisUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | |
| | | @Resource |
| | | private TemperingGlassInfoService temperingGlassInfoService; |
| | | |
| | | @Resource |
| | | private PlcStorageCageTask plcStorageCageTask; |
| | | private SysConfigService sysConfigService; |
| | | |
| | | // @Resource |
| | | // private PlcStorageCageTask plcStorageCageTask; |
| | | |
| | | @Resource |
| | | private DamageService damageService; |
| | |
| | | |
| | | @Resource |
| | | BigStorageCageHistoryTaskService bigStorageCageHistoryTaskService; |
| | | |
| | | @Value("${mes.minCount}") |
| | | private int minCount; |
| | | |
| | | @Value("${mes.slotWidth}") |
| | | private Integer slotWidth; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | |
| | | @Value("${mes.sequence.order}") |
| | | private boolean sequenceOrder; |
| | | // |
| | | // @Value("${mes.minCount}") |
| | | // private int minCount; |
| | | // |
| | | // @Value("${mes.slotWidth}") |
| | | // private Integer slotWidth; |
| | | // |
| | | // @Value("${mes.glassGap}") |
| | | // private Integer glassGap; |
| | | // |
| | | // @Value("${mes.sequence.order}") |
| | | // private boolean sequenceOrder; |
| | | |
| | | |
| | | @Override |
| | |
| | | for (BigStorageCageDetails bigStorageCageDetails : bigStorageCageDetailsList |
| | | ) { |
| | | if (bigStorageCageDetails.getBigStorageCageFeedTask().getTaskState() == 0) { |
| | | carWidth = carWidth - bigStorageCageDetails.getWidth() - glassGap; |
| | | carWidth = carWidth - bigStorageCageDetails.getWidth() - 250; |
| | | } |
| | | } |
| | | return carWidth; |
| | |
| | | if (glassInfo != null) { |
| | | BeanUtils.copyProperties(glassInfo, bigStorageCageDetails); |
| | | bigStorageCageDetails.setState(1); |
| | | bigStorageCageDetails.setGap(glassGap); |
| | | bigStorageCageDetails.setGap(250); |
| | | bigStorageCageDetailsList = new ArrayList<>(); |
| | | bigStorageCageDetailsList.add(bigStorageCageDetails); |
| | | } |
| | |
| | | @Override |
| | | public BigStorageDTO queryTargetSlotByTempering(GlassInfo glassInfo) { |
| | | BigStorageDTO bigStorageDTO = null; |
| | | int slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH); |
| | | MPJLambdaWrapper<BigStorageCage> wrapper = new MPJLambdaWrapper<>(BigStorageCage.class) |
| | | .selectAll(BigStorageCage.class) |
| | | .leftJoin(BigStorageCageDetails.class, BigStorageCageDetails::getSlot, BigStorageCage::getSlot) |
| | |
| | | |
| | | @Override |
| | | public List<TemperingLayoutDTO> queryTemperingOccupySlot() { |
| | | return baseMapper.queryTemperingOccupySlot(minCount); |
| | | return baseMapper.queryTemperingOccupySlot(10); |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | public boolean temperingGlass(String temperingLayoutId, String engineerId, String temperingFeedSequence) { |
| | | LambdaQueryWrapper<TemperingGlassInfo> temperingGlassInfoLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | SysConfig sysConfig = sysConfigService.queryConfigById(ConstSysConfig.CACHE_SEQUENCE_ORDER_TRUE); |
| | | boolean sequenceOrder = Boolean.parseBoolean(sysConfig.getConfigValue()); |
| | | temperingGlassInfoLambdaQueryWrapper |
| | | .eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW); |
| | | List<TemperingGlassInfo> temperingGlassInfoList = temperingGlassInfoMapper.selectList(temperingGlassInfoLambdaQueryWrapper); |
| | |
| | | if (CollectionUtils.isNotEmpty(temperingGlassInfos)) { |
| | | if ("0".equals(temperingFeedSequence)) { |
| | | if (CollectionUtils.isNotEmpty(temperingGlassInfos)) { |
| | | plcStorageCageTask.computeOutMoreGlassInfo(temperingGlassInfos, Boolean.FALSE, ""); |
| | | // plcStorageCageTask.computeOutMoreGlassInfo(temperingGlassInfos, Boolean.FALSE, ""); |
| | | } |
| | | } else { |
| | | temperingGlassInfoService.saveBatch(temperingGlassInfos); |
| | |
| | | import com.mes.bigstorage.mapper.BigStorageCageMapper; |
| | | import com.mes.bigstorage.service.BigStorageCageService; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.largenscreen.entity.PieChartVO; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | |
| | | @Resource |
| | | private GlassInfoService glassInfoService; |
| | | @Resource |
| | | private SysConfigService sysConfigService; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | |
| | | @Value("${mes.slotWidth}") |
| | | private Integer slotWidth; |
| | | // @Value("${mes.glassGap}") |
| | | // private Integer glassGap; |
| | | // |
| | | // @Value("${mes.slotWidth}") |
| | | // private Integer slotWidth; |
| | | |
| | | //进片逻辑 |
| | | @Override |
| | |
| | | @Override |
| | | public void updateRemainWidth(int slot) { |
| | | log.info("获取该格子内玻璃信息,计算格子剩余宽度"); |
| | | double width = 5000; |
| | | double width = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH); |
| | | double glassGap = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_GLASS_GAP); |
| | | LambdaQueryWrapper<BigStorageCageDetails> bigStorageCageDetailsWrapper = new LambdaQueryWrapper(); |
| | | bigStorageCageDetailsWrapper |
| | | .eq(BigStorageCageDetails::getSlot, slot) |
| | |
| | | @Override |
| | | public List<Map<String, Object>> selectBigStorageCageUsage() { |
| | | QueryWrapper<BigStorageCage> wrapper = new QueryWrapper<>(); |
| | | double slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH); |
| | | wrapper.select("device_id,ROUND(1 - SUM(CASE WHEN remain_width = " + slotWidth + " THEN 1 ELSE 0 END) / COUNT(device_id), 2)*100 AS percentage,SUM(CASE WHEN remain_width = " + slotWidth + " THEN 1 ELSE 0 END) AS count") |
| | | .eq("enable_state", Const.SLOT_ON) |
| | | .groupBy("device_id"); |
| | |
| | | |
| | | @Override |
| | | public Boolean resetCage() { |
| | | double slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH); |
| | | bigStorageCageDetailsMapper.delete(Wrappers.<BigStorageCageDetails>lambdaQuery().eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW)); |
| | | this.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth) |
| | | .notInSql(BigStorageCage::getSlot, "select distinct slot from big_storage_cage_details where state in ( 100, 102, 103, 104)")); |
| | |
| | | return baseMapper.queryPieChart(); |
| | | } |
| | | |
| | | // @Override |
| | | // public List<Integer> queryFreeDeviceByNotUsed(double thickness) { |
| | | // return baseMapper.queryFreeDeviceByNotUsed(thickness); |
| | | // } |
| | | } |
| | |
| | | import com.mes.bigstorage.service.BigStorageGlassInfoService; |
| | | import com.mes.bigstorage.service.BigStorageGlassRelationInfoService; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | BigStorageCageDetailsService bigStorageCageDetailsService; |
| | | @Resource |
| | | BigStorageGlassRelationInfoService bigStorageGlassRelationInfoService; |
| | | @Value("${mes.slotWidth}") |
| | | private Integer slotWidth; |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | @Value("${mes.outCarMaxSize}") |
| | | private Integer outCarMaxSize; |
| | | @Resource |
| | | SysConfigService sysConfigService; |
| | | // @Value("${mes.slotWidth}") |
| | | // private Integer slotWidth; |
| | | // @Value("${mes.glassGap}") |
| | | // private Integer glassGap; |
| | | // @Value("${mes.outCarMaxSize}") |
| | | // private Integer outCarMaxSize; |
| | | |
| | | @Override |
| | | public BigStorageDTO queryBigStorageTargetSlot(String engineerId, Integer temperingLayoutId, Integer temperingFeedSequence) { |
| | |
| | | .eq(BigStorageGlassRelationInfo::getTemperingLayoutId, temperingLayoutId) |
| | | .eq(BigStorageGlassRelationInfo::getTemperingFeedSequence, temperingFeedSequence)); |
| | | } |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH); |
| | | BigStorageCageDetails bigStorageCageDetails = bigStorageCageDetailsService.getOne(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getSlot, relationInfoOne.getSlot()).in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL_ZERO) |
| | | .orderByDesc(BigStorageCageDetails::getSequence).last("limit 1")); |
| | |
| | | if (CollectionUtil.isNotEmpty(list)) { |
| | | return; |
| | | } |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH); |
| | | Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_GLASS_GAP); |
| | | Integer outCarMaxSize = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_OUT_CAR_SIZE); |
| | | // Engineering engineering = engineeringMapper.selectOne(new LambdaQueryWrapper<Engineering>() |
| | | // .eq(Engineering::getEngineerId, glassInfo.getEngineerId())); |
| | | //获取玻璃的工程id,按照工程id获取工程下的所有玻璃信息 |
| | |
| | | @Override |
| | | public int bigStorageSlotPair(BigStorageGlassInfo bigStorageGlassInfo) { |
| | | //获取所有空闲可用的格子号 |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH); |
| | | BigStorageCage storageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>() |
| | | .eq(BigStorageCage::getEnableState, Const.SLOT_ON).eq(BigStorageCage::getRemainWidth, slotWidth) |
| | | .le(BigStorageCage::getMinThickness, bigStorageGlassInfo.getThickness()) |
| | |
| | | */ |
| | | @ApiModelProperty(value = "开始时间", position = 6) |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date beginDate; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @ApiModelProperty(value = "结束时间", position = 7) |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date endDate; |
| | | } |
| | |
| | | import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; |
| | | import com.mes.bigstoragetask.mapper.BigStorageCageFeedTaskMapper; |
| | | import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | @Service |
| | | public class BigStorageCageFeedTaskServiceImpl extends ServiceImpl<BigStorageCageFeedTaskMapper, BigStorageCageFeedTask> implements BigStorageCageFeedTaskService { |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | // @Value("${mes.glassGap}") |
| | | // private Integer glassGap; |
| | | @Resource |
| | | SysConfigService sysConfigService; |
| | | |
| | | @Override |
| | | public void addFeedTask(BigStorageCageDetails slotInfo, Integer plcFeedReqLine, int taskType) { |
| | |
| | | |
| | | @Override |
| | | public BigStorageDTO querySitToUpRemainWidth(Integer line) { |
| | | Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_GLASS_GAP); |
| | | return baseMapper.querySitToUpRemainWidth(line, glassGap); |
| | | } |
| | | |
| | |
| | | import com.mes.bigstoragecagetask.service.BigStorageCageTaskService; |
| | | import com.mes.bigstoragetask.entity.UpdateBigStorageCageDTO; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.damage.entity.Damage; |
| | | import com.mes.damage.service.DamageService; |
| | | import com.mes.edgglasstask.entity.EdgGlassTaskInfo; |
| | | import com.mes.edgglasstask.service.EdgGlassTaskInfoService; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | import com.mes.utils.RedisUtil; |
| | |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | |
| | | @Autowired(required = false) |
| | | MiloService miloService; |
| | | |
| | | @Resource |
| | | SysConfigService sysConfigService; |
| | | |
| | | /** |
| | | * 直通格子 |
| | | */ |
| | |
| | | |
| | | @Resource |
| | | private RedisUtil redisUtil; |
| | | |
| | | @Value("${mes.slotWidth}") |
| | | private Integer slotWidth; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | |
| | | @Value("${mes.carWidth}") |
| | | private Integer carWidth; |
| | | |
| | | @Value("${mes.outCarMaxSize}") |
| | | private Integer outCarMaxSize; |
| | | |
| | | @Value("${mes.temperingOutTargetPosition}") |
| | | private Integer temperingOutTargetPosition; |
| | | @Value("${mes.artificialOutTargetPosition}") |
| | | private Integer artificialOutTargetPosition; |
| | | @Value("${mes.slotMaxHeight}") |
| | | private Integer slotMaxHeight; |
| | | @Value("${mes.slotMaxthickness}") |
| | | private Integer slotMaxthickness; |
| | | |
| | | @Scheduled(fixedDelay = 1000) |
| | | public void inBigStorageTask() throws Exception { |
| | |
| | | miloService.writeToOpcWord(generateReadWriteEntity("DLP1A.DLP1A.alarmSignal", 8)); |
| | | return; |
| | | } |
| | | Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_GLASS_GAP); |
| | | Integer slotMaxthickness = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_MAX_THICKNESS); |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH); |
| | | Integer slotMaxHeight = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_MAX_HEIGHT); |
| | | //按照玻璃厚度分组,判断剩余格子是否可以存放 |
| | | Map<Double, Long> thickCountMap = glassInfoList.stream().collect(Collectors.groupingBy(GlassInfo::getThickness, Collectors.counting())); |
| | | if (glassInfoList.get(0).getThickness() < slotMaxthickness) { |
| | |
| | | //是否允许钢化 |
| | | //是否有正在钢化的玻璃:钢化小片表关联历史任务表,筛选未出笼的玻璃信息 |
| | | // 获取当前钢化任务未完成出片的玻璃信息 |
| | | |
| | | Integer temperingOutTargetPosition = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_TEMPERING_OUT_TARGET_POSITION); |
| | | List<TemperingGlassInfo> unFinishTemperingGlassInfoList = temperingGlassInfoService.list(new LambdaQueryWrapper<TemperingGlassInfo>() |
| | | .eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW).orderByAsc(TemperingGlassInfo::getTemperingLayoutId).orderByAsc(TemperingGlassInfo::getTemperingFeedSequence)); |
| | | if (CollectionUtil.isNotEmpty(unFinishTemperingGlassInfoList)) { |
| | |
| | | } |
| | | } |
| | | //是否有人工下片任务 有直接出 |
| | | Integer artificialOutTargetPosition = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_ARTIFICIAL_OUT_TARGET_POSITION); |
| | | Integer outCarMaxSize = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_OUT_CAR_SIZE); |
| | | List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL) |
| | | .orderByAsc(BigStorageCageDetails::getSlot) |
| | |
| | | //任务数据:获取车子存放玻璃最大数量,玻璃间隔 |
| | | List<BigStorageCageTask> bigStorageCageTaskList = new ArrayList<>(); |
| | | //打车剩余尺寸 |
| | | Integer remainWidth = carWidth; |
| | | Integer outCarMaxSize = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_OUT_CAR_SIZE); |
| | | Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_GLASS_GAP); |
| | | Integer remainWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_CAR_WIDTH); |
| | | for (T e : list) { |
| | | if (bigStorageCageTaskList.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) { |
| | | break; |
| | |
| | | List<BigStorageCageDetails> inSlotGlassList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .in(BigStorageCageDetails::getSlot, slotList).in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL)); |
| | | Map<Integer, Double> slotRemainMap = new HashMap<>(); |
| | | Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_GLASS_GAP); |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH); |
| | | //是否存在有格子非空的玻璃 |
| | | if (CollectionUtil.isNotEmpty(inSlotGlassList)) { |
| | | //存在 将格子内的玻璃分别进行更新 |
| | |
| | | package com.mes.job; |
| | | |
| | | import cn.hutool.core.collection.CollectionUtil; |
| | | import cn.hutool.core.lang.Assert; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.github.yulichang.toolkit.JoinWrappers; |
| | | import com.kangaroohy.milo.model.ReadWriteEntity; |
| | | import com.kangaroohy.milo.service.MiloService; |
| | | import com.mes.base.entity.BigStorageCageBaseInfo; |
| | | import com.mes.bigstorage.entity.BigStorageCage; |
| | | import com.mes.bigstorage.entity.BigStorageCageDetails; |
| | | import com.mes.bigstorage.entity.dto.BigStorageDTO; |
| | | import com.mes.bigstorage.entity.dto.SlotSequenceDTO; |
| | | import com.mes.bigstorage.entity.dto.TemperingLayoutDTO; |
| | | import com.mes.bigstorage.service.BigStorageCageDetailsService; |
| | | import com.mes.bigstorage.service.BigStorageCageService; |
| | | import com.mes.bigstoragecagetask.entity.BigStorageCageHistoryTask; |
| | | import com.mes.bigstoragecagetask.entity.BigStorageCageTask; |
| | | import com.mes.bigstoragecagetask.service.BigStorageCageHistoryTaskService; |
| | | import com.mes.bigstoragecagetask.service.BigStorageCageTaskService; |
| | | import com.mes.bigstoragetask.entity.UpdateBigStorageCageDTO; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.damage.entity.Damage; |
| | | import com.mes.damage.service.DamageService; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | import com.mes.utils.RedisUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @author SNG-015 |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class OpcPlcStorageCageTask { |
| | | @Resource |
| | | private BigStorageCageDetailsService bigStorageCageDetailsService; |
| | | @Resource |
| | | private TemperingGlassInfoService temperingGlassInfoService; |
| | | @Resource |
| | | private DamageService damageService; |
| | | @Resource |
| | | private GlassInfoService glassInfoService; |
| | | @Resource |
| | | private BigStorageCageService bigStorageCageService; |
| | | @Resource |
| | | private BigStorageCageHistoryTaskService bigStorageCageHistoryTaskService; |
| | | @Resource |
| | | private BigStorageCageTaskService bigStorageCageTaskService; |
| | | |
| | | @Autowired(required = false) |
| | | MiloService miloService; |
| | | |
| | | @Resource |
| | | private RedisUtil redisUtil; |
| | | |
| | | @Value("${mes.slotWidth}") |
| | | private Integer slotWidth; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | |
| | | @Value("${mes.carWidth}") |
| | | private Integer carWidth; |
| | | |
| | | @Value("${mes.outCarMaxSize}") |
| | | private Integer outCarMaxSize; |
| | | |
| | | @Value("${mes.sequence.order}") |
| | | private boolean sequenceOrder; |
| | | |
| | | @Value("${mes.temperingOutTargetPosition}") |
| | | private Integer temperingOutTargetPosition; |
| | | @Value("${mes.artificialOutTargetPosition}") |
| | | private Integer artificialOutTargetPosition; |
| | | |
| | | |
| | | // @Scheduled(fixedDelay = 1000) |
| | | public void inBigStorageTask() throws Exception { |
| | | ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1A.DLP1A.mesControl"); |
| | | if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) { |
| | | log.info("当前为非联机状态,结束进片任务"); |
| | | return; |
| | | } |
| | | ReadWriteEntity requestEntity = miloService.readFromOpcUa("DLP1A.DLP1A.RequestMes"); |
| | | if (!"1".equals(requestEntity.getValue() + "")) { |
| | | log.info("当前未收到进片请求,结束进片任务"); |
| | | return; |
| | | } |
| | | ReadWriteEntity mesReplyEntity = miloService.readFromOpcUa("DLP1A.DLP1A.MesReply"); |
| | | if ("1".equals(mesReplyEntity.getValue() + "")) { |
| | | log.info("有正在执行的任务,结束进片任务"); |
| | | return; |
| | | } |
| | | //获取进片任务表 |
| | | List<BigStorageCageTask> inTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_in_one_task"); |
| | | if (CollectionUtil.isEmpty(inTaskList)) { |
| | | log.info("当前大车无进片玻璃,结束进片任务"); |
| | | } |
| | | |
| | | List<String> glassIdList = inTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()); |
| | | log.info("获取任务的玻璃id:{}", glassIdList); |
| | | Map<String, Long> glassCountMap = glassIdList.stream().collect(Collectors.groupingBy(e -> e, Collectors.counting())); |
| | | for (Map.Entry<String, Long> entry : glassCountMap.entrySet()) { |
| | | if (entry.getValue() > 1) { |
| | | log.info("进片玻璃{}存在相同,结束本次任务", entry.getKey()); |
| | | //todo:向plc发送报警 |
| | | return; |
| | | } |
| | | } |
| | | List<BigStorageCageDetails> detailsList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>().in(BigStorageCageDetails::getGlassId, glassIdList) |
| | | .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL)); |
| | | if (CollectionUtil.isNotEmpty(detailsList)) { |
| | | log.info("理片笼存在相同的进片玻璃{},结束本次任务", detailsList); |
| | | //todo:向plc发送报警 |
| | | return; |
| | | } |
| | | List<GlassInfo> glassInfoList = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIdList)); |
| | | |
| | | Map<String, List<GlassInfo>> glassListMap = glassInfoList.stream().collect(Collectors.groupingBy(GlassInfo::getGlassId)); |
| | | |
| | | //计算目标格子 |
| | | List<BigStorageCageHistoryTask> historyTasks = new ArrayList<>(); |
| | | for (BigStorageCageTask task : inTaskList) { |
| | | GlassInfo info = glassListMap.get(task.getGlassId()).get(0); |
| | | //获取目标格子信息 |
| | | BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info); |
| | | // 临时更新格子的剩余尺寸:防止相邻玻璃进同一格子造成剩余尺寸不足,玻璃越界的情况,任务完成后再次更新大理片笼表剩余宽度(按照笼内玻璃数量更新大理片笼剩余尺寸) |
| | | bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>() |
| | | .set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap) |
| | | .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot())); |
| | | task.setTargetSlot(bigStorageDTO.getSlot()); |
| | | task.setGlassId(info.getGlassId()); |
| | | bigStorageCageTaskService.updateTaskMessage("big_storage_cage_in_one_task", task); |
| | | //存放历史任务 |
| | | BigStorageCageHistoryTask historyTask = new BigStorageCageHistoryTask(); |
| | | BeanUtils.copyProperties(task, historyTask); |
| | | historyTask.setTaskType(Const.BIG_STORAGE_BEFORE_IN); |
| | | historyTask.setGlassCount(glassInfoList.size()); |
| | | historyTask.setTaskState(Const.ENGINEERING_NEW); |
| | | historyTasks.add(historyTask); |
| | | BigStorageCageDetails cageDetails = new BigStorageCageDetails(); |
| | | BeanUtils.copyProperties(info, cageDetails); |
| | | cageDetails.setSlot(bigStorageDTO.getSlot()); |
| | | cageDetails.setState(Const.GLASS_STATE_NEW); |
| | | cageDetails.setDeviceId(bigStorageDTO.getDeviceId()); |
| | | cageDetails.setGap(glassGap); |
| | | cageDetails.setId(null); |
| | | bigStorageCageDetailsService.save(cageDetails); |
| | | } |
| | | //历史数据入库 |
| | | bigStorageCageHistoryTaskService.saveBatch(historyTasks); |
| | | //向opc发送启动信号 |
| | | miloService.writeToOpcWord(generateReadWriteEntity("DLP1A.DLP1A.MesReply", 1)); |
| | | } |
| | | |
| | | // @Scheduled(fixedDelay = 1000) |
| | | public void outBigStorageTask() throws Exception { |
| | | Date startDate = new Date(); |
| | | ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1B.DLP1B.mesControl"); |
| | | if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) { |
| | | log.info("当前为非联机状态,结束进片任务"); |
| | | return; |
| | | } |
| | | ReadWriteEntity requestEntity = miloService.readFromOpcUa("DLP1B.DLP1B.RequestMes"); |
| | | if (!"1".equals(requestEntity.getValue() + "")) { |
| | | log.info("当前未收到出片请求,结束出片任务"); |
| | | return; |
| | | } |
| | | //获取出片任务表 |
| | | List<BigStorageCageTask> outTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_out_one_task"); |
| | | if (CollectionUtil.isNotEmpty(outTaskList)) { |
| | | log.info("有正在执行的出片任务,结束本次出片任务"); |
| | | return; |
| | | } |
| | | //todo:是否允许钢化 |
| | | if (redisUtil.getCacheObject("temperingSwitch")) { |
| | | //是否有正在钢化的玻璃:钢化小片表关联历史任务表,筛选未出笼的玻璃信息 |
| | | // 获取当前钢化任务未完成出片的玻璃信息 |
| | | List<TemperingGlassInfo> unFinishTemperingGlassInfoList = temperingGlassInfoService.list(new LambdaQueryWrapper<TemperingGlassInfo>().eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW)); |
| | | if (CollectionUtil.isNotEmpty(unFinishTemperingGlassInfoList)) { |
| | | List<String> glassIdList = unFinishTemperingGlassInfoList.stream().map(TemperingGlassInfo::getGlassId).collect(Collectors.toList()); |
| | | List<BigStorageCageHistoryTask> historyTaskList = bigStorageCageHistoryTaskService.list(new LambdaQueryWrapper<BigStorageCageHistoryTask>() |
| | | .eq(BigStorageCageHistoryTask::getTaskType, Const.BIG_STORAGE_BEFORE_OUT) |
| | | .in(BigStorageCageHistoryTask::getGlassId, glassIdList)); |
| | | List<TemperingGlassInfo> temperingGlassList = unFinishTemperingGlassInfoList; |
| | | if (CollectionUtil.isNotEmpty(historyTaskList)) { |
| | | List<String> taskGlassList = historyTaskList.stream().map(BigStorageCageHistoryTask::getGlassId).collect(Collectors.toList()); |
| | | temperingGlassList = unFinishTemperingGlassInfoList.stream().filter(e -> !taskGlassList.contains(e.getGlassId())).collect(Collectors.toList()); |
| | | } |
| | | if (CollectionUtil.isNotEmpty(temperingGlassList)) { |
| | | log.info("有正在出片的钢化任务"); |
| | | computeOutGlassInfo(temperingGlassList, "big_storage_cage_out_one_task", temperingOutTargetPosition, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT); |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | } |
| | | //钢化优先:获取理片笼 玻璃小片 破损表 数量 判断笼内版图是否到齐 |
| | | List<TemperingLayoutDTO> temperingLayoutDTOList = bigStorageCageDetailsService.temperingIsAll(); |
| | | if (CollectionUtil.isNotEmpty(temperingLayoutDTOList)) { |
| | | //玻璃到齐包括已出片的 |
| | | //到齐,将玻璃小片数据存入钢化小片表,逻辑生成出片任务 结束 |
| | | for (TemperingLayoutDTO item : temperingLayoutDTOList) { |
| | | // if (item.getEngineerId().equals(redisUtil.getCacheObject("temperingengineerId"))) { |
| | | List<TemperingGlassInfo> temperingGlassInfos = glassInfoService.selectJoinList(TemperingGlassInfo.class, JoinWrappers.lambda(GlassInfo.class) |
| | | .selectAll(GlassInfo.class) |
| | | .select("-1 as state") |
| | | .selectAs(BigStorageCageDetails::getSlot, TemperingGlassInfo::getSlot) |
| | | .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId) |
| | | .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .eq(GlassInfo::getTemperingLayoutId, item.getTemperingLayoutId()) |
| | | .eq(GlassInfo::getEngineerId, item.getEngineerId()) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence)); |
| | | if (CollectionUtil.isNotEmpty(temperingGlassInfos)) { |
| | | temperingGlassInfoService.saveBatch(temperingGlassInfos); |
| | | computeOutGlassInfo(temperingGlassInfos, "big_storage_cage_out_one_task", temperingOutTargetPosition, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT); |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | //package com.mes.job; |
| | | // |
| | | //import cn.hutool.core.collection.CollectionUtil; |
| | | //import cn.hutool.core.lang.Assert; |
| | | //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | //import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | //import com.github.yulichang.toolkit.JoinWrappers; |
| | | //import com.kangaroohy.milo.model.ReadWriteEntity; |
| | | //import com.kangaroohy.milo.service.MiloService; |
| | | //import com.mes.base.entity.BigStorageCageBaseInfo; |
| | | //import com.mes.bigstorage.entity.BigStorageCage; |
| | | //import com.mes.bigstorage.entity.BigStorageCageDetails; |
| | | //import com.mes.bigstorage.entity.dto.BigStorageDTO; |
| | | //import com.mes.bigstorage.entity.dto.SlotSequenceDTO; |
| | | //import com.mes.bigstorage.entity.dto.TemperingLayoutDTO; |
| | | //import com.mes.bigstorage.service.BigStorageCageDetailsService; |
| | | //import com.mes.bigstorage.service.BigStorageCageService; |
| | | //import com.mes.bigstoragecagetask.entity.BigStorageCageHistoryTask; |
| | | //import com.mes.bigstoragecagetask.entity.BigStorageCageTask; |
| | | //import com.mes.bigstoragecagetask.service.BigStorageCageHistoryTaskService; |
| | | //import com.mes.bigstoragecagetask.service.BigStorageCageTaskService; |
| | | //import com.mes.bigstoragetask.entity.UpdateBigStorageCageDTO; |
| | | //import com.mes.common.config.Const; |
| | | //import com.mes.damage.entity.Damage; |
| | | //import com.mes.damage.service.DamageService; |
| | | //import com.mes.glassinfo.entity.GlassInfo; |
| | | //import com.mes.glassinfo.service.GlassInfoService; |
| | | //import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | //import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | //import com.mes.utils.RedisUtil; |
| | | //import lombok.extern.slf4j.Slf4j; |
| | | //import org.apache.commons.lang.StringUtils; |
| | | //import org.springframework.beans.BeanUtils; |
| | | //import org.springframework.beans.factory.annotation.Autowired; |
| | | //import org.springframework.beans.factory.annotation.Value; |
| | | //import org.springframework.stereotype.Component; |
| | | // |
| | | //import javax.annotation.Resource; |
| | | //import java.util.*; |
| | | //import java.util.stream.Collectors; |
| | | // |
| | | ///** |
| | | // * @author SNG-015 |
| | | // */ |
| | | //@Component |
| | | //@Slf4j |
| | | //public class OpcPlcStorageCageTask { |
| | | // @Resource |
| | | // private BigStorageCageDetailsService bigStorageCageDetailsService; |
| | | // @Resource |
| | | // private TemperingGlassInfoService temperingGlassInfoService; |
| | | // @Resource |
| | | // private DamageService damageService; |
| | | // @Resource |
| | | // private GlassInfoService glassInfoService; |
| | | // @Resource |
| | | // private BigStorageCageService bigStorageCageService; |
| | | // @Resource |
| | | // private BigStorageCageHistoryTaskService bigStorageCageHistoryTaskService; |
| | | // @Resource |
| | | // private BigStorageCageTaskService bigStorageCageTaskService; |
| | | // |
| | | // @Autowired(required = false) |
| | | // MiloService miloService; |
| | | // |
| | | // @Resource |
| | | // private RedisUtil redisUtil; |
| | | // |
| | | // @Value("${mes.slotWidth}") |
| | | // private Integer slotWidth; |
| | | // |
| | | // @Value("${mes.glassGap}") |
| | | // private Integer glassGap; |
| | | // |
| | | // @Value("${mes.carWidth}") |
| | | // private Integer carWidth; |
| | | // |
| | | // @Value("${mes.outCarMaxSize}") |
| | | // private Integer outCarMaxSize; |
| | | // |
| | | // @Value("${mes.sequence.order}") |
| | | // private boolean sequenceOrder; |
| | | // |
| | | // @Value("${mes.temperingOutTargetPosition}") |
| | | // private Integer temperingOutTargetPosition; |
| | | // @Value("${mes.artificialOutTargetPosition}") |
| | | // private Integer artificialOutTargetPosition; |
| | | // |
| | | // |
| | | // // @Scheduled(fixedDelay = 1000) |
| | | // public void inBigStorageTask() throws Exception { |
| | | // ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1A.DLP1A.mesControl"); |
| | | // if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) { |
| | | // log.info("当前为非联机状态,结束进片任务"); |
| | | // return; |
| | | // } |
| | | // ReadWriteEntity requestEntity = miloService.readFromOpcUa("DLP1A.DLP1A.RequestMes"); |
| | | // if (!"1".equals(requestEntity.getValue() + "")) { |
| | | // log.info("当前未收到进片请求,结束进片任务"); |
| | | // return; |
| | | // } |
| | | // ReadWriteEntity mesReplyEntity = miloService.readFromOpcUa("DLP1A.DLP1A.MesReply"); |
| | | // if ("1".equals(mesReplyEntity.getValue() + "")) { |
| | | // log.info("有正在执行的任务,结束进片任务"); |
| | | // return; |
| | | // } |
| | | // //获取进片任务表 |
| | | // List<BigStorageCageTask> inTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_in_one_task"); |
| | | // if (CollectionUtil.isEmpty(inTaskList)) { |
| | | // log.info("当前大车无进片玻璃,结束进片任务"); |
| | | // } |
| | | // |
| | | // List<String> glassIdList = inTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()); |
| | | // log.info("获取任务的玻璃id:{}", glassIdList); |
| | | // Map<String, Long> glassCountMap = glassIdList.stream().collect(Collectors.groupingBy(e -> e, Collectors.counting())); |
| | | // for (Map.Entry<String, Long> entry : glassCountMap.entrySet()) { |
| | | // if (entry.getValue() > 1) { |
| | | // log.info("进片玻璃{}存在相同,结束本次任务", entry.getKey()); |
| | | // //todo:向plc发送报警 |
| | | // return; |
| | | // } |
| | | // } |
| | | // List<BigStorageCageDetails> detailsList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>().in(BigStorageCageDetails::getGlassId, glassIdList) |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL)); |
| | | // if (CollectionUtil.isNotEmpty(detailsList)) { |
| | | // log.info("理片笼存在相同的进片玻璃{},结束本次任务", detailsList); |
| | | // //todo:向plc发送报警 |
| | | // return; |
| | | // } |
| | | // List<GlassInfo> glassInfoList = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIdList)); |
| | | // |
| | | // Map<String, List<GlassInfo>> glassListMap = glassInfoList.stream().collect(Collectors.groupingBy(GlassInfo::getGlassId)); |
| | | // |
| | | // //计算目标格子 |
| | | // List<BigStorageCageHistoryTask> historyTasks = new ArrayList<>(); |
| | | // for (BigStorageCageTask task : inTaskList) { |
| | | // GlassInfo info = glassListMap.get(task.getGlassId()).get(0); |
| | | // //获取目标格子信息 |
| | | // BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info); |
| | | //// 临时更新格子的剩余尺寸:防止相邻玻璃进同一格子造成剩余尺寸不足,玻璃越界的情况,任务完成后再次更新大理片笼表剩余宽度(按照笼内玻璃数量更新大理片笼剩余尺寸) |
| | | // bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>() |
| | | // .set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap) |
| | | // .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot())); |
| | | // task.setTargetSlot(bigStorageDTO.getSlot()); |
| | | // task.setGlassId(info.getGlassId()); |
| | | // bigStorageCageTaskService.updateTaskMessage("big_storage_cage_in_one_task", task); |
| | | // //存放历史任务 |
| | | // BigStorageCageHistoryTask historyTask = new BigStorageCageHistoryTask(); |
| | | // BeanUtils.copyProperties(task, historyTask); |
| | | // historyTask.setTaskType(Const.BIG_STORAGE_BEFORE_IN); |
| | | // historyTask.setGlassCount(glassInfoList.size()); |
| | | // historyTask.setTaskState(Const.ENGINEERING_NEW); |
| | | // historyTasks.add(historyTask); |
| | | // BigStorageCageDetails cageDetails = new BigStorageCageDetails(); |
| | | // BeanUtils.copyProperties(info, cageDetails); |
| | | // cageDetails.setSlot(bigStorageDTO.getSlot()); |
| | | // cageDetails.setState(Const.GLASS_STATE_NEW); |
| | | // cageDetails.setDeviceId(bigStorageDTO.getDeviceId()); |
| | | // cageDetails.setGap(glassGap); |
| | | // cageDetails.setId(null); |
| | | // bigStorageCageDetailsService.save(cageDetails); |
| | | // } |
| | | // //历史数据入库 |
| | | // bigStorageCageHistoryTaskService.saveBatch(historyTasks); |
| | | // //向opc发送启动信号 |
| | | // miloService.writeToOpcWord(generateReadWriteEntity("DLP1A.DLP1A.MesReply", 1)); |
| | | // } |
| | | // |
| | | // // @Scheduled(fixedDelay = 1000) |
| | | // public void outBigStorageTask() throws Exception { |
| | | // Date startDate = new Date(); |
| | | // ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1B.DLP1B.mesControl"); |
| | | // if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) { |
| | | // log.info("当前为非联机状态,结束进片任务"); |
| | | // return; |
| | | // } |
| | | // ReadWriteEntity requestEntity = miloService.readFromOpcUa("DLP1B.DLP1B.RequestMes"); |
| | | // if (!"1".equals(requestEntity.getValue() + "")) { |
| | | // log.info("当前未收到出片请求,结束出片任务"); |
| | | // return; |
| | | // } |
| | | // //获取出片任务表 |
| | | // List<BigStorageCageTask> outTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_out_one_task"); |
| | | // if (CollectionUtil.isNotEmpty(outTaskList)) { |
| | | // log.info("有正在执行的出片任务,结束本次出片任务"); |
| | | // return; |
| | | // } |
| | | // //todo:是否允许钢化 |
| | | // if (redisUtil.getCacheObject("temperingSwitch")) { |
| | | // //是否有正在钢化的玻璃:钢化小片表关联历史任务表,筛选未出笼的玻璃信息 |
| | | //// 获取当前钢化任务未完成出片的玻璃信息 |
| | | // List<TemperingGlassInfo> unFinishTemperingGlassInfoList = temperingGlassInfoService.list(new LambdaQueryWrapper<TemperingGlassInfo>().eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW)); |
| | | // if (CollectionUtil.isNotEmpty(unFinishTemperingGlassInfoList)) { |
| | | // List<String> glassIdList = unFinishTemperingGlassInfoList.stream().map(TemperingGlassInfo::getGlassId).collect(Collectors.toList()); |
| | | // List<BigStorageCageHistoryTask> historyTaskList = bigStorageCageHistoryTaskService.list(new LambdaQueryWrapper<BigStorageCageHistoryTask>() |
| | | // .eq(BigStorageCageHistoryTask::getTaskType, Const.BIG_STORAGE_BEFORE_OUT) |
| | | // .in(BigStorageCageHistoryTask::getGlassId, glassIdList)); |
| | | // List<TemperingGlassInfo> temperingGlassList = unFinishTemperingGlassInfoList; |
| | | // if (CollectionUtil.isNotEmpty(historyTaskList)) { |
| | | // List<String> taskGlassList = historyTaskList.stream().map(BigStorageCageHistoryTask::getGlassId).collect(Collectors.toList()); |
| | | // temperingGlassList = unFinishTemperingGlassInfoList.stream().filter(e -> !taskGlassList.contains(e.getGlassId())).collect(Collectors.toList()); |
| | | // } |
| | | // if (CollectionUtil.isNotEmpty(temperingGlassList)) { |
| | | // log.info("有正在出片的钢化任务"); |
| | | // computeOutGlassInfo(temperingGlassList, "big_storage_cage_out_one_task", temperingOutTargetPosition, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT); |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // } |
| | | // //钢化优先:获取理片笼 玻璃小片 破损表 数量 判断笼内版图是否到齐 |
| | | // List<TemperingLayoutDTO> temperingLayoutDTOList = bigStorageCageDetailsService.temperingIsAll(); |
| | | // if (CollectionUtil.isNotEmpty(temperingLayoutDTOList)) { |
| | | // //玻璃到齐包括已出片的 |
| | | // //到齐,将玻璃小片数据存入钢化小片表,逻辑生成出片任务 结束 |
| | | // for (TemperingLayoutDTO item : temperingLayoutDTOList) { |
| | | //// if (item.getEngineerId().equals(redisUtil.getCacheObject("temperingengineerId"))) { |
| | | // List<TemperingGlassInfo> temperingGlassInfos = glassInfoService.selectJoinList(TemperingGlassInfo.class, JoinWrappers.lambda(GlassInfo.class) |
| | | // .selectAll(GlassInfo.class) |
| | | // .select("-1 as state") |
| | | // .selectAs(BigStorageCageDetails::getSlot, TemperingGlassInfo::getSlot) |
| | | // .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId) |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | // .eq(GlassInfo::getTemperingLayoutId, item.getTemperingLayoutId()) |
| | | // .eq(GlassInfo::getEngineerId, item.getEngineerId()) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence)); |
| | | // if (CollectionUtil.isNotEmpty(temperingGlassInfos)) { |
| | | // temperingGlassInfoService.saveBatch(temperingGlassInfos); |
| | | // computeOutGlassInfo(temperingGlassInfos, "big_storage_cage_out_one_task", temperingOutTargetPosition, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT); |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | } |
| | | } |
| | | } |
| | | //是否有人工下片任务 有直接出 |
| | | List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL) |
| | | .orderByAsc(BigStorageCageDetails::getSlot) |
| | | .orderByAsc(BigStorageCageDetails::getId)); |
| | | if (CollectionUtil.isNotEmpty(artificialList)) { |
| | | computeOutGlassInfo(artificialList, "big_storage_cage_out_one_task", artificialOutTargetPosition, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT); |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | //是否存在需要内部调度的格子:执行内部调度任务 |
| | | List<TemperingLayoutDTO> temperingOccupySlotList = bigStorageCageDetailsService.queryTemperingOccupySlot(); |
| | | if (CollectionUtil.isNotEmpty(temperingOccupySlotList)) { |
| | | loop: |
| | | for (TemperingLayoutDTO temperingOccupySlot : temperingOccupySlotList) { |
| | | List<SlotSequenceDTO> slotSequenceList = bigStorageCageDetailsService.queryGlassMaxAndMin(temperingOccupySlot.getEngineerId(), temperingOccupySlot.getTemperingLayoutId()); |
| | | for (int i = 0; i < slotSequenceList.size() - 1; i++) { |
| | | SlotSequenceDTO first = slotSequenceList.get(i); |
| | | SlotSequenceDTO second = slotSequenceList.get(i + 1); |
| | | int slotWidth = carWidth - first.getRemainWidth() - glassGap; |
| | | int totalCount = first.getGlassCount() + second.getGlassCount(); |
| | | if (totalCount <= 6 && first.getMinSequence() == second.getMaxSequence() + 1 |
| | | && second.getRemainWidth() > slotWidth && slotWidth >= 0) { |
| | | List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getSlot, first.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence)); |
| | | if (CollectionUtil.isNotEmpty(list)) { |
| | | computeOutGlassInfo(list, "big_storage_cage_out_one_task", second.getSlot(), Const.GLASS_STATE_SCHEDULE_ING, Const.BIG_STORAGE_BEFORE_DISPATCH); |
| | | } |
| | | //使用Arrays.asList() 使用removeAll报错,改为正常使用List |
| | | List<Integer> slotList = new ArrayList<>(); |
| | | slotList.add(second.getSlot()); |
| | | updateSlotRemainBySlots(slotList); |
| | | break loop; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | |
| | | // @Scheduled(fixedDelay = 1000) |
| | | public void finishInBigStorageTask() throws Exception { |
| | | ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1A.DLP1A.mesControl"); |
| | | if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) { |
| | | log.info("当前为非联机状态,结束完成进片任务"); |
| | | return; |
| | | } |
| | | //获取进片任务表 |
| | | List<BigStorageCageTask> inTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_in_one_task"); |
| | | if (CollectionUtil.isEmpty(inTaskList)) { |
| | | log.info("当前大车无进片玻璃,结束完成进片任务"); |
| | | return; |
| | | } |
| | | List<BigStorageCageTask> unFinishTaskList = inTaskList.stream().filter(e -> e.getTaskState() <= 1 || e.getStartSlot() == 0).collect(Collectors.toList()); |
| | | if (CollectionUtil.isNotEmpty(unFinishTaskList)) { |
| | | log.info("存在未完成的玻璃信息,玻璃:{}", unFinishTaskList); |
| | | return; |
| | | } |
| | | Map<Integer, List<BigStorageCageTask>> taskMap = inTaskList.stream().collect(Collectors.groupingBy(BigStorageCageTask::getTaskState)); |
| | | //按照任务状态修改大理片笼内的玻璃数据 |
| | | // 重新计算大理片笼内的剩余尺寸 |
| | | taskMap.forEach((e1, v) -> { |
| | | if (e1 == 2) { |
| | | //进片完成 |
| | | log.info("3、获取进片已完成的玻璃信息id:{}", v); |
| | | List<Integer> inSuccessGlassSlot = v.stream().map(BigStorageCageTask::getTargetSlot).collect(Collectors.toList()); |
| | | List<UpdateBigStorageCageDTO> storageCageDTOList = v.stream().map(e -> { |
| | | UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); |
| | | BeanUtils.copyProperties(e, storageCageDTO); |
| | | return storageCageDTO; |
| | | }).collect(Collectors.toList()); |
| | | bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN); |
| | | log.info("4、大理片笼进片状态已完成已完成的玻璃信息id:{}", v); |
| | | updateSlotRemainBySlots(inSuccessGlassSlot); |
| | | } else if (e1 == 3) { |
| | | //破损处理 |
| | | dealDamageInTask(v); |
| | | } else { |
| | | //清空理片笼空数据 |
| | | noDealInTask(v); |
| | | } |
| | | }); |
| | | for (BigStorageCageTask item : inTaskList) { |
| | | //更新历史任务表中的任务状态 |
| | | bigStorageCageHistoryTaskService.update(new LambdaUpdateWrapper<BigStorageCageHistoryTask>() |
| | | .set(BigStorageCageHistoryTask::getTaskState, item.getTaskState()) |
| | | .eq(BigStorageCageHistoryTask::getTaskType, Const.BIG_STORAGE_BEFORE_IN) |
| | | .eq(BigStorageCageHistoryTask::getTargetSlot, item.getTargetSlot()) |
| | | .eq(BigStorageCageHistoryTask::getGlassId, item.getGlassId())); |
| | | item.setTargetSlot(0); |
| | | //清空任务表数据 |
| | | bigStorageCageTaskService.updateTaskMessage("big_storage_cage_in_one_task", item); |
| | | } |
| | | //清空启动状态 |
| | | //向opc发送启动信号 |
| | | miloService.writeToOpcWord(generateReadWriteEntity("DLP1A.DLP1A.MesReply", 0)); |
| | | } |
| | | |
| | | // @Scheduled(fixedDelay = 1000) |
| | | public void finishOutBigStorageTask() throws Exception { |
| | | ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1B.DLP1B.mesControl"); |
| | | if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) { |
| | | log.info("当前为非联机状态,结束完成出片任务"); |
| | | return; |
| | | } |
| | | //获取进片任务表 |
| | | List<BigStorageCageTask> outTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_out_one_task"); |
| | | if (CollectionUtil.isEmpty(outTaskList)) { |
| | | log.info("当前大车无进片玻璃,结束完成进片任务"); |
| | | return; |
| | | } |
| | | List<BigStorageCageTask> unFinishTaskList = outTaskList.stream().filter(e -> e.getTaskState() <= 1 || e.getStartSlot() == 0).collect(Collectors.toList()); |
| | | if (CollectionUtil.isNotEmpty(unFinishTaskList)) { |
| | | log.info("存在未完成的玻璃信息,玻璃:{}", unFinishTaskList); |
| | | return; |
| | | } |
| | | Map<Integer, List<BigStorageCageTask>> taskMap = outTaskList.stream().collect(Collectors.groupingBy(BigStorageCageTask::getTaskState)); |
| | | int taskType = 0; |
| | | if (Const.OUT_TARGET_POSITION_ALL.contains(outTaskList.get(0).getTargetSlot())) { |
| | | taskType = Const.BIG_STORAGE_BEFORE_OUT; |
| | | } else { |
| | | taskType = Const.BIG_STORAGE_BEFORE_DISPATCH; |
| | | } |
| | | //按照任务状态修改大理片笼内的玻璃数据 |
| | | // 重新计算大理片笼内的剩余尺寸 |
| | | Integer finalTaskType = taskType; |
| | | taskMap.forEach((e1, v) -> { |
| | | if (e1 == 2) { |
| | | //进片完成 |
| | | log.info("3、获取进片已完成的玻璃信息id:{}", v); |
| | | List<Integer> outSuccessGlassSlot = new ArrayList<>(); |
| | | if (finalTaskType.equals(Const.BIG_STORAGE_BEFORE_OUT)) { |
| | | outSuccessGlassSlot = v.stream().map(BigStorageCageTask::getStartSlot).collect(Collectors.toList()); |
| | | } else { |
| | | outSuccessGlassSlot = v.stream().map(BigStorageCageTask::getTargetSlot).collect(Collectors.toList()); |
| | | } |
| | | List<UpdateBigStorageCageDTO> storageCageDTOList = v.stream().map(e -> { |
| | | UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); |
| | | storageCageDTO.setGlassId(e.getGlassId()); |
| | | if (finalTaskType.equals(Const.BIG_STORAGE_BEFORE_OUT)) { |
| | | storageCageDTO.setTargetSlot(e.getStartSlot()); |
| | | } else { |
| | | storageCageDTO.setTargetSlot(e.getTargetSlot()); |
| | | } |
| | | return storageCageDTO; |
| | | }).collect(Collectors.toList()); |
| | | bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_OUT); |
| | | log.info("4、大理片笼进片状态已完成已完成的玻璃信息id:{}", v); |
| | | updateSlotRemainBySlots(outSuccessGlassSlot); |
| | | } else if (e1 == 3) { |
| | | //破损处理 |
| | | dealDamageOutTask(v); |
| | | } else { |
| | | //清空理片笼空数据 |
| | | noDealOutTask(v); |
| | | } |
| | | }); |
| | | for (BigStorageCageTask item : outTaskList) { |
| | | //更新历史任务表中的任务状态 |
| | | bigStorageCageHistoryTaskService.update(new LambdaUpdateWrapper<BigStorageCageHistoryTask>() |
| | | .set(BigStorageCageHistoryTask::getTaskState, item.getTaskState()) |
| | | .eq(BigStorageCageHistoryTask::getTaskType, taskType) |
| | | .eq(BigStorageCageHistoryTask::getGlassId, item.getGlassId())); |
| | | //更新钢化小片表 |
| | | Integer taskState = item.getTaskState(); |
| | | if (taskState == 2) { |
| | | temperingGlassInfoService.update(new LambdaUpdateWrapper<TemperingGlassInfo>() |
| | | .set(TemperingGlassInfo::getState, Const.TEMPERING_OUT).eq(TemperingGlassInfo::getGlassId, item.getGlassId())); |
| | | } else if (taskState == 3) { |
| | | // temperingGlassInfoService.remove(new LambdaQueryWrapper<TemperingGlassInfo>().eq(TemperingGlassInfo::getGlassId, item.getGlassId())); |
| | | temperingGlassInfoService.update(new LambdaUpdateWrapper<TemperingGlassInfo>() |
| | | .set(TemperingGlassInfo::getState, Const.TEMPERING_DAMAGE |
| | | ).eq(TemperingGlassInfo::getGlassId, item.getGlassId())); |
| | | |
| | | } else { |
| | | // 空执行 |
| | | } |
| | | } |
| | | // 重置任务表数据 |
| | | bigStorageCageTaskService.updateOutTaskMessage("big_storage_cage_out_one_task"); |
| | | //清空启动状态 |
| | | //向opc发送启动信号 |
| | | miloService.writeToOpcWord(generateReadWriteEntity("DLP1B.DLP1B.MesReply", 0)); |
| | | } |
| | | |
| | | private void dealDamageInTask(List<BigStorageCageTask> damageTaskList) { |
| | | // 获取进片任务表中状态为破损的数据 |
| | | log.info("破损的玻璃信息有:{}", damageTaskList); |
| | | //移除理片笼详情表任务执行过程中破损的玻璃 |
| | | bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW) |
| | | .in(BigStorageCageDetails::getGlassId, damageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()))); |
| | | //将破损信息新增入破损表 |
| | | List<Integer> slotList = new ArrayList<>(); |
| | | for (BigStorageCageTask item : damageTaskList) { |
| | | Damage damage = new Damage(); |
| | | damage.setGlassId(item.getGlassId()); |
| | | damage.setLine(item.getStartSlot()); |
| | | damage.setWorkingProcedure("磨边"); |
| | | damage.setRemark("进笼前卧转立"); |
| | | damage.setStatus(1); |
| | | damage.setType(item.getTaskState()); |
| | | damageService.insertDamage(damage); |
| | | slotList.add(item.getTargetSlot()); |
| | | } |
| | | //更新格子剩余宽度 |
| | | updateSlotRemainBySlots(slotList); |
| | | log.info("进片任务-破损任务执行完成"); |
| | | } |
| | | |
| | | private void dealDamageOutTask(List<BigStorageCageTask> damageTaskList) { |
| | | // 获取进片任务表中状态为破损的数据 |
| | | log.info("破损的玻璃信息有:{}", damageTaskList); |
| | | //移除理片笼详情表任务执行过程中破损的玻璃 |
| | | bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL_ZERO) |
| | | .in(BigStorageCageDetails::getGlassId, damageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()))); |
| | | //将破损信息新增入破损表 |
| | | List<Integer> slotList = new ArrayList<>(); |
| | | for (BigStorageCageTask item : damageTaskList) { |
| | | Damage damage = new Damage(); |
| | | damage.setGlassId(item.getGlassId()); |
| | | damage.setLine(item.getStartSlot()); |
| | | damage.setWorkingProcedure("钢化前"); |
| | | damage.setRemark("进笼后卧转立"); |
| | | damage.setStatus(1); |
| | | damage.setType(item.getTaskState()); |
| | | damageService.insertDamage(damage); |
| | | slotList.add(item.getTargetSlot()); |
| | | slotList.add(item.getStartSlot()); |
| | | } |
| | | //更新格子剩余宽度 |
| | | updateSlotRemainBySlots(slotList); |
| | | log.info("出片任务-破损任务执行完成"); |
| | | } |
| | | |
| | | private void noDealInTask(List<BigStorageCageTask> noDealTaskList) { |
| | | // 获取进片任务表中状态为破损的数据 |
| | | log.info("破损的玻璃信息有:{}", noDealTaskList); |
| | | //移除理片笼详情表未执行任务的空记录信息 |
| | | bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW) |
| | | .in(BigStorageCageDetails::getGlassId, noDealTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()))); |
| | | //记录格子号,按格子号更新剩余尺寸 |
| | | List<Integer> slotList = new ArrayList<>(); |
| | | for (BigStorageCageTask item : noDealTaskList) { |
| | | slotList.add(item.getTargetSlot()); |
| | | slotList.add(item.getStartSlot()); |
| | | } |
| | | //更新格子剩余宽度 |
| | | updateSlotRemainBySlots(slotList); |
| | | log.info("进片任务-无动作执行完成"); |
| | | } |
| | | |
| | | private void noDealOutTask(List<BigStorageCageTask> noDealTaskList) { |
| | | // 获取进片任务表中状态为破损的数据 |
| | | log.info("破损的玻璃信息有:{}", noDealTaskList); |
| | | if (Const.OUT_TARGET_POSITION_ALL.contains(noDealTaskList.get(0).getTargetSlot())) { |
| | | //出片任务:将出片中状态恢复为在笼内 |
| | | List<String> glassList = noDealTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()); |
| | | bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | .set(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .in(BigStorageCageDetails::getGlassId, glassList)); |
| | | |
| | | } else { |
| | | //调度任务:将调度中状态改为在笼内,格子号恢复为调度前的格子 |
| | | for (BigStorageCageTask item : noDealTaskList) { |
| | | bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | .set(BigStorageCageDetails::getSlot, item.getStartSlot()) |
| | | .set(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .eq(BigStorageCageDetails::getGlassId, item.getGlassId())); |
| | | } |
| | | } |
| | | //将破损信息新增入破损表 |
| | | List<Integer> slotList = new ArrayList<>(); |
| | | for (BigStorageCageTask item : noDealTaskList) { |
| | | slotList.add(item.getTargetSlot()); |
| | | slotList.add(item.getStartSlot()); |
| | | } |
| | | //更新格子剩余宽度 |
| | | updateSlotRemainBySlots(slotList); |
| | | log.info("出片任务-无动作执行完成"); |
| | | } |
| | | |
| | | /** |
| | | * 出片一次仅生成一车玻璃 |
| | | * |
| | | * @param list |
| | | * @param <T> |
| | | * @return |
| | | */ |
| | | private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, String tableName, int targetSlot, int state, int taskType) { |
| | | //任务数据:获取车子存放玻璃最大数量,玻璃间隔 |
| | | List<BigStorageCageTask> bigStorageCageTaskList = new ArrayList<>(); |
| | | //打车剩余尺寸 |
| | | Integer remainWidth = carWidth; |
| | | for (T e : list) { |
| | | if (bigStorageCageTaskList.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) { |
| | | break; |
| | | } |
| | | //计算当前出片车剩尺寸 |
| | | remainWidth = remainWidth - Math.max((int) e.getWidth(), (int) e.getHeight()) - glassGap; |
| | | bigStorageCageTaskList.add(new BigStorageCageTask(e.getGlassId(), e.getSlot(), targetSlot, |
| | | 0)); |
| | | } |
| | | Assert.isFalse(CollectionUtil.isEmpty(bigStorageCageTaskList), "未获取出片数据,结束出片任务"); |
| | | log.info("获取出片任务数据{}条,执行保存", bigStorageCageTaskList.size()); |
| | | List<String> glassIds = bigStorageCageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()); |
| | | int glassCount = bigStorageCageTaskList.size(); |
| | | //生成出片任务条数不足6补全 |
| | | while (bigStorageCageTaskList.size() < 6) { |
| | | bigStorageCageTaskList.add(new BigStorageCageTask("", 0, 0, 0)); |
| | | } |
| | | //清空任务表数据 |
| | | bigStorageCageTaskService.removeAll("big_storage_cage_out_one_task"); |
| | | bigStorageCageTaskService.saveTaskMessage(tableName, bigStorageCageTaskList); |
| | | List<BigStorageCageHistoryTask> historyList = bigStorageCageTaskList.stream().filter(e -> StringUtils.isNotBlank(e.getGlassId())).map(e -> { |
| | | BigStorageCageHistoryTask history = new BigStorageCageHistoryTask(); |
| | | BeanUtils.copyProperties(e, history); |
| | | history.setGlassCount(glassCount); |
| | | history.setTaskType(taskType); |
| | | return history; |
| | | }).collect(Collectors.toList()); |
| | | bigStorageCageHistoryTaskService.saveBatch(historyList); |
| | | |
| | | log.info("将出片玻璃{}玻璃状态改为出片中", glassIds); |
| | | bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | .set(BigStorageCageDetails::getState, state) |
| | | .set(Const.GLASS_STATE_SCHEDULE_ING.equals(state), BigStorageCageBaseInfo::getSlot, targetSlot) |
| | | .in(BigStorageCageDetails::getGlassId, glassIds)); |
| | | try { |
| | | miloService.writeToOpcWord(generateReadWriteEntity("DLP1B.DLP1B.MesReply", 1)); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | |
| | | public void updateSlotRemainBySlots(List<Integer> slotList) { |
| | | //获取格子内所有的玻璃信息 |
| | | List<BigStorageCageDetails> inSlotGlassList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .in(BigStorageCageDetails::getSlot, slotList).in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL)); |
| | | Map<Integer, Double> slotRemainMap = new HashMap<>(); |
| | | //是否存在有格子非空的玻璃 |
| | | if (CollectionUtil.isNotEmpty(inSlotGlassList)) { |
| | | //存在 将格子内的玻璃分别进行更新 |
| | | slotRemainMap = inSlotGlassList.stream() |
| | | .collect(Collectors.groupingBy(BigStorageCageDetails::getSlot, Collectors.summingDouble(item -> Math.max(item.getWidth(), item.getHeight()) + glassGap))); |
| | | slotRemainMap.forEach((e, v) -> { |
| | | double remainWidth = slotWidth - v >= 0 ? slotWidth - v : 0; |
| | | bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, remainWidth) |
| | | .eq(BigStorageCage::getSlot, e)); |
| | | }); |
| | | } |
| | | //过滤不存在玻璃的格子 将宽度重置为原始宽度5000 |
| | | Set<Integer> remainSlotList = slotRemainMap.keySet(); |
| | | slotList.removeAll(remainSlotList); |
| | | if (CollectionUtil.isNotEmpty(slotList)) { |
| | | bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth) |
| | | .in(BigStorageCage::getSlot, slotList)); |
| | | } |
| | | } |
| | | |
| | | private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) { |
| | | return ReadWriteEntity.builder() |
| | | .identifier(identifier) |
| | | //Kep中是Long类型,即:Int32,Java中的int类型 |
| | | .value(value) |
| | | .build(); |
| | | } |
| | | } |
| | | //// } |
| | | // } |
| | | // } |
| | | // } |
| | | // //是否有人工下片任务 有直接出 |
| | | // List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL) |
| | | // .orderByAsc(BigStorageCageDetails::getSlot) |
| | | // .orderByAsc(BigStorageCageDetails::getId)); |
| | | // if (CollectionUtil.isNotEmpty(artificialList)) { |
| | | // computeOutGlassInfo(artificialList, "big_storage_cage_out_one_task", artificialOutTargetPosition, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT); |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // //是否存在需要内部调度的格子:执行内部调度任务 |
| | | // List<TemperingLayoutDTO> temperingOccupySlotList = bigStorageCageDetailsService.queryTemperingOccupySlot(); |
| | | // if (CollectionUtil.isNotEmpty(temperingOccupySlotList)) { |
| | | // loop: |
| | | // for (TemperingLayoutDTO temperingOccupySlot : temperingOccupySlotList) { |
| | | // List<SlotSequenceDTO> slotSequenceList = bigStorageCageDetailsService.queryGlassMaxAndMin(temperingOccupySlot.getEngineerId(), temperingOccupySlot.getTemperingLayoutId()); |
| | | // for (int i = 0; i < slotSequenceList.size() - 1; i++) { |
| | | // SlotSequenceDTO first = slotSequenceList.get(i); |
| | | // SlotSequenceDTO second = slotSequenceList.get(i + 1); |
| | | // int slotWidth = carWidth - first.getRemainWidth() - glassGap; |
| | | // int totalCount = first.getGlassCount() + second.getGlassCount(); |
| | | // if (totalCount <= 6 && first.getMinSequence() == second.getMaxSequence() + 1 |
| | | // && second.getRemainWidth() > slotWidth && slotWidth >= 0) { |
| | | // List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getSlot, first.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence)); |
| | | // if (CollectionUtil.isNotEmpty(list)) { |
| | | // computeOutGlassInfo(list, "big_storage_cage_out_one_task", second.getSlot(), Const.GLASS_STATE_SCHEDULE_ING, Const.BIG_STORAGE_BEFORE_DISPATCH); |
| | | // } |
| | | // //使用Arrays.asList() 使用removeAll报错,改为正常使用List |
| | | // List<Integer> slotList = new ArrayList<>(); |
| | | // slotList.add(second.getSlot()); |
| | | // updateSlotRemainBySlots(slotList); |
| | | // break loop; |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // |
| | | // // @Scheduled(fixedDelay = 1000) |
| | | // public void finishInBigStorageTask() throws Exception { |
| | | // ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1A.DLP1A.mesControl"); |
| | | // if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) { |
| | | // log.info("当前为非联机状态,结束完成进片任务"); |
| | | // return; |
| | | // } |
| | | // //获取进片任务表 |
| | | // List<BigStorageCageTask> inTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_in_one_task"); |
| | | // if (CollectionUtil.isEmpty(inTaskList)) { |
| | | // log.info("当前大车无进片玻璃,结束完成进片任务"); |
| | | // return; |
| | | // } |
| | | // List<BigStorageCageTask> unFinishTaskList = inTaskList.stream().filter(e -> e.getTaskState() <= 1 || e.getStartSlot() == 0).collect(Collectors.toList()); |
| | | // if (CollectionUtil.isNotEmpty(unFinishTaskList)) { |
| | | // log.info("存在未完成的玻璃信息,玻璃:{}", unFinishTaskList); |
| | | // return; |
| | | // } |
| | | // Map<Integer, List<BigStorageCageTask>> taskMap = inTaskList.stream().collect(Collectors.groupingBy(BigStorageCageTask::getTaskState)); |
| | | // //按照任务状态修改大理片笼内的玻璃数据 |
| | | //// 重新计算大理片笼内的剩余尺寸 |
| | | // taskMap.forEach((e1, v) -> { |
| | | // if (e1 == 2) { |
| | | // //进片完成 |
| | | // log.info("3、获取进片已完成的玻璃信息id:{}", v); |
| | | // List<Integer> inSuccessGlassSlot = v.stream().map(BigStorageCageTask::getTargetSlot).collect(Collectors.toList()); |
| | | // List<UpdateBigStorageCageDTO> storageCageDTOList = v.stream().map(e -> { |
| | | // UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); |
| | | // BeanUtils.copyProperties(e, storageCageDTO); |
| | | // return storageCageDTO; |
| | | // }).collect(Collectors.toList()); |
| | | // bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN); |
| | | // log.info("4、大理片笼进片状态已完成已完成的玻璃信息id:{}", v); |
| | | // updateSlotRemainBySlots(inSuccessGlassSlot); |
| | | // } else if (e1 == 3) { |
| | | // //破损处理 |
| | | // dealDamageInTask(v); |
| | | // } else { |
| | | // //清空理片笼空数据 |
| | | // noDealInTask(v); |
| | | // } |
| | | // }); |
| | | // for (BigStorageCageTask item : inTaskList) { |
| | | // //更新历史任务表中的任务状态 |
| | | // bigStorageCageHistoryTaskService.update(new LambdaUpdateWrapper<BigStorageCageHistoryTask>() |
| | | // .set(BigStorageCageHistoryTask::getTaskState, item.getTaskState()) |
| | | // .eq(BigStorageCageHistoryTask::getTaskType, Const.BIG_STORAGE_BEFORE_IN) |
| | | // .eq(BigStorageCageHistoryTask::getTargetSlot, item.getTargetSlot()) |
| | | // .eq(BigStorageCageHistoryTask::getGlassId, item.getGlassId())); |
| | | // item.setTargetSlot(0); |
| | | // //清空任务表数据 |
| | | // bigStorageCageTaskService.updateTaskMessage("big_storage_cage_in_one_task", item); |
| | | // } |
| | | // //清空启动状态 |
| | | // //向opc发送启动信号 |
| | | // miloService.writeToOpcWord(generateReadWriteEntity("DLP1A.DLP1A.MesReply", 0)); |
| | | // } |
| | | // |
| | | // // @Scheduled(fixedDelay = 1000) |
| | | // public void finishOutBigStorageTask() throws Exception { |
| | | // ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1B.DLP1B.mesControl"); |
| | | // if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) { |
| | | // log.info("当前为非联机状态,结束完成出片任务"); |
| | | // return; |
| | | // } |
| | | // //获取进片任务表 |
| | | // List<BigStorageCageTask> outTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_out_one_task"); |
| | | // if (CollectionUtil.isEmpty(outTaskList)) { |
| | | // log.info("当前大车无进片玻璃,结束完成进片任务"); |
| | | // return; |
| | | // } |
| | | // List<BigStorageCageTask> unFinishTaskList = outTaskList.stream().filter(e -> e.getTaskState() <= 1 || e.getStartSlot() == 0).collect(Collectors.toList()); |
| | | // if (CollectionUtil.isNotEmpty(unFinishTaskList)) { |
| | | // log.info("存在未完成的玻璃信息,玻璃:{}", unFinishTaskList); |
| | | // return; |
| | | // } |
| | | // Map<Integer, List<BigStorageCageTask>> taskMap = outTaskList.stream().collect(Collectors.groupingBy(BigStorageCageTask::getTaskState)); |
| | | // int taskType = 0; |
| | | // if (Const.OUT_TARGET_POSITION_ALL.contains(outTaskList.get(0).getTargetSlot())) { |
| | | // taskType = Const.BIG_STORAGE_BEFORE_OUT; |
| | | // } else { |
| | | // taskType = Const.BIG_STORAGE_BEFORE_DISPATCH; |
| | | // } |
| | | // //按照任务状态修改大理片笼内的玻璃数据 |
| | | //// 重新计算大理片笼内的剩余尺寸 |
| | | // Integer finalTaskType = taskType; |
| | | // taskMap.forEach((e1, v) -> { |
| | | // if (e1 == 2) { |
| | | // //进片完成 |
| | | // log.info("3、获取进片已完成的玻璃信息id:{}", v); |
| | | // List<Integer> outSuccessGlassSlot = new ArrayList<>(); |
| | | // if (finalTaskType.equals(Const.BIG_STORAGE_BEFORE_OUT)) { |
| | | // outSuccessGlassSlot = v.stream().map(BigStorageCageTask::getStartSlot).collect(Collectors.toList()); |
| | | // } else { |
| | | // outSuccessGlassSlot = v.stream().map(BigStorageCageTask::getTargetSlot).collect(Collectors.toList()); |
| | | // } |
| | | // List<UpdateBigStorageCageDTO> storageCageDTOList = v.stream().map(e -> { |
| | | // UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); |
| | | // storageCageDTO.setGlassId(e.getGlassId()); |
| | | // if (finalTaskType.equals(Const.BIG_STORAGE_BEFORE_OUT)) { |
| | | // storageCageDTO.setTargetSlot(e.getStartSlot()); |
| | | // } else { |
| | | // storageCageDTO.setTargetSlot(e.getTargetSlot()); |
| | | // } |
| | | // return storageCageDTO; |
| | | // }).collect(Collectors.toList()); |
| | | // bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_OUT); |
| | | // log.info("4、大理片笼进片状态已完成已完成的玻璃信息id:{}", v); |
| | | // updateSlotRemainBySlots(outSuccessGlassSlot); |
| | | // } else if (e1 == 3) { |
| | | // //破损处理 |
| | | // dealDamageOutTask(v); |
| | | // } else { |
| | | // //清空理片笼空数据 |
| | | // noDealOutTask(v); |
| | | // } |
| | | // }); |
| | | // for (BigStorageCageTask item : outTaskList) { |
| | | // //更新历史任务表中的任务状态 |
| | | // bigStorageCageHistoryTaskService.update(new LambdaUpdateWrapper<BigStorageCageHistoryTask>() |
| | | // .set(BigStorageCageHistoryTask::getTaskState, item.getTaskState()) |
| | | // .eq(BigStorageCageHistoryTask::getTaskType, taskType) |
| | | // .eq(BigStorageCageHistoryTask::getGlassId, item.getGlassId())); |
| | | // //更新钢化小片表 |
| | | // Integer taskState = item.getTaskState(); |
| | | // if (taskState == 2) { |
| | | // temperingGlassInfoService.update(new LambdaUpdateWrapper<TemperingGlassInfo>() |
| | | // .set(TemperingGlassInfo::getState, Const.TEMPERING_OUT).eq(TemperingGlassInfo::getGlassId, item.getGlassId())); |
| | | // } else if (taskState == 3) { |
| | | //// temperingGlassInfoService.remove(new LambdaQueryWrapper<TemperingGlassInfo>().eq(TemperingGlassInfo::getGlassId, item.getGlassId())); |
| | | // temperingGlassInfoService.update(new LambdaUpdateWrapper<TemperingGlassInfo>() |
| | | // .set(TemperingGlassInfo::getState, Const.TEMPERING_DAMAGE |
| | | // ).eq(TemperingGlassInfo::getGlassId, item.getGlassId())); |
| | | // |
| | | // } else { |
| | | //// 空执行 |
| | | // } |
| | | // } |
| | | //// 重置任务表数据 |
| | | // bigStorageCageTaskService.updateOutTaskMessage("big_storage_cage_out_one_task"); |
| | | // //清空启动状态 |
| | | // //向opc发送启动信号 |
| | | // miloService.writeToOpcWord(generateReadWriteEntity("DLP1B.DLP1B.MesReply", 0)); |
| | | // } |
| | | // |
| | | // private void dealDamageInTask(List<BigStorageCageTask> damageTaskList) { |
| | | //// 获取进片任务表中状态为破损的数据 |
| | | // log.info("破损的玻璃信息有:{}", damageTaskList); |
| | | // //移除理片笼详情表任务执行过程中破损的玻璃 |
| | | // bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW) |
| | | // .in(BigStorageCageDetails::getGlassId, damageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()))); |
| | | // //将破损信息新增入破损表 |
| | | // List<Integer> slotList = new ArrayList<>(); |
| | | // for (BigStorageCageTask item : damageTaskList) { |
| | | // Damage damage = new Damage(); |
| | | // damage.setGlassId(item.getGlassId()); |
| | | // damage.setLine(item.getStartSlot()); |
| | | // damage.setWorkingProcedure("磨边"); |
| | | // damage.setRemark("进笼前卧转立"); |
| | | // damage.setStatus(1); |
| | | // damage.setType(item.getTaskState()); |
| | | // damageService.insertDamage(damage); |
| | | // slotList.add(item.getTargetSlot()); |
| | | // } |
| | | // //更新格子剩余宽度 |
| | | // updateSlotRemainBySlots(slotList); |
| | | // log.info("进片任务-破损任务执行完成"); |
| | | // } |
| | | // |
| | | // private void dealDamageOutTask(List<BigStorageCageTask> damageTaskList) { |
| | | //// 获取进片任务表中状态为破损的数据 |
| | | // log.info("破损的玻璃信息有:{}", damageTaskList); |
| | | // //移除理片笼详情表任务执行过程中破损的玻璃 |
| | | // bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL_ZERO) |
| | | // .in(BigStorageCageDetails::getGlassId, damageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()))); |
| | | // //将破损信息新增入破损表 |
| | | // List<Integer> slotList = new ArrayList<>(); |
| | | // for (BigStorageCageTask item : damageTaskList) { |
| | | // Damage damage = new Damage(); |
| | | // damage.setGlassId(item.getGlassId()); |
| | | // damage.setLine(item.getStartSlot()); |
| | | // damage.setWorkingProcedure("钢化前"); |
| | | // damage.setRemark("进笼后卧转立"); |
| | | // damage.setStatus(1); |
| | | // damage.setType(item.getTaskState()); |
| | | // damageService.insertDamage(damage); |
| | | // slotList.add(item.getTargetSlot()); |
| | | // slotList.add(item.getStartSlot()); |
| | | // } |
| | | // //更新格子剩余宽度 |
| | | // updateSlotRemainBySlots(slotList); |
| | | // log.info("出片任务-破损任务执行完成"); |
| | | // } |
| | | // |
| | | // private void noDealInTask(List<BigStorageCageTask> noDealTaskList) { |
| | | //// 获取进片任务表中状态为破损的数据 |
| | | // log.info("破损的玻璃信息有:{}", noDealTaskList); |
| | | // //移除理片笼详情表未执行任务的空记录信息 |
| | | // bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW) |
| | | // .in(BigStorageCageDetails::getGlassId, noDealTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()))); |
| | | // //记录格子号,按格子号更新剩余尺寸 |
| | | // List<Integer> slotList = new ArrayList<>(); |
| | | // for (BigStorageCageTask item : noDealTaskList) { |
| | | // slotList.add(item.getTargetSlot()); |
| | | // slotList.add(item.getStartSlot()); |
| | | // } |
| | | // //更新格子剩余宽度 |
| | | // updateSlotRemainBySlots(slotList); |
| | | // log.info("进片任务-无动作执行完成"); |
| | | // } |
| | | // |
| | | // private void noDealOutTask(List<BigStorageCageTask> noDealTaskList) { |
| | | //// 获取进片任务表中状态为破损的数据 |
| | | // log.info("破损的玻璃信息有:{}", noDealTaskList); |
| | | // if (Const.OUT_TARGET_POSITION_ALL.contains(noDealTaskList.get(0).getTargetSlot())) { |
| | | // //出片任务:将出片中状态恢复为在笼内 |
| | | // List<String> glassList = noDealTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()); |
| | | // bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | // .set(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | // .in(BigStorageCageDetails::getGlassId, glassList)); |
| | | // |
| | | // } else { |
| | | // //调度任务:将调度中状态改为在笼内,格子号恢复为调度前的格子 |
| | | // for (BigStorageCageTask item : noDealTaskList) { |
| | | // bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | // .set(BigStorageCageDetails::getSlot, item.getStartSlot()) |
| | | // .set(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | // .eq(BigStorageCageDetails::getGlassId, item.getGlassId())); |
| | | // } |
| | | // } |
| | | // //将破损信息新增入破损表 |
| | | // List<Integer> slotList = new ArrayList<>(); |
| | | // for (BigStorageCageTask item : noDealTaskList) { |
| | | // slotList.add(item.getTargetSlot()); |
| | | // slotList.add(item.getStartSlot()); |
| | | // } |
| | | // //更新格子剩余宽度 |
| | | // updateSlotRemainBySlots(slotList); |
| | | // log.info("出片任务-无动作执行完成"); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 出片一次仅生成一车玻璃 |
| | | // * |
| | | // * @param list |
| | | // * @param <T> |
| | | // * @return |
| | | // */ |
| | | // private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, String tableName, int targetSlot, int state, int taskType) { |
| | | // //任务数据:获取车子存放玻璃最大数量,玻璃间隔 |
| | | // List<BigStorageCageTask> bigStorageCageTaskList = new ArrayList<>(); |
| | | // //打车剩余尺寸 |
| | | // Integer remainWidth = carWidth; |
| | | // for (T e : list) { |
| | | // if (bigStorageCageTaskList.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) { |
| | | // break; |
| | | // } |
| | | // //计算当前出片车剩尺寸 |
| | | // remainWidth = remainWidth - Math.max((int) e.getWidth(), (int) e.getHeight()) - glassGap; |
| | | // bigStorageCageTaskList.add(new BigStorageCageTask(e.getGlassId(), e.getSlot(), targetSlot, |
| | | // 0)); |
| | | // } |
| | | // Assert.isFalse(CollectionUtil.isEmpty(bigStorageCageTaskList), "未获取出片数据,结束出片任务"); |
| | | // log.info("获取出片任务数据{}条,执行保存", bigStorageCageTaskList.size()); |
| | | // List<String> glassIds = bigStorageCageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList()); |
| | | // int glassCount = bigStorageCageTaskList.size(); |
| | | // //生成出片任务条数不足6补全 |
| | | // while (bigStorageCageTaskList.size() < 6) { |
| | | // bigStorageCageTaskList.add(new BigStorageCageTask("", 0, 0, 0)); |
| | | // } |
| | | // //清空任务表数据 |
| | | // bigStorageCageTaskService.removeAll("big_storage_cage_out_one_task"); |
| | | // bigStorageCageTaskService.saveTaskMessage(tableName, bigStorageCageTaskList); |
| | | // List<BigStorageCageHistoryTask> historyList = bigStorageCageTaskList.stream().filter(e -> StringUtils.isNotBlank(e.getGlassId())).map(e -> { |
| | | // BigStorageCageHistoryTask history = new BigStorageCageHistoryTask(); |
| | | // BeanUtils.copyProperties(e, history); |
| | | // history.setGlassCount(glassCount); |
| | | // history.setTaskType(taskType); |
| | | // return history; |
| | | // }).collect(Collectors.toList()); |
| | | // bigStorageCageHistoryTaskService.saveBatch(historyList); |
| | | // |
| | | // log.info("将出片玻璃{}玻璃状态改为出片中", glassIds); |
| | | // bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | // .set(BigStorageCageDetails::getState, state) |
| | | // .set(Const.GLASS_STATE_SCHEDULE_ING.equals(state), BigStorageCageBaseInfo::getSlot, targetSlot) |
| | | // .in(BigStorageCageDetails::getGlassId, glassIds)); |
| | | // try { |
| | | // miloService.writeToOpcWord(generateReadWriteEntity("DLP1B.DLP1B.MesReply", 1)); |
| | | // } catch (Exception e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // return Boolean.TRUE; |
| | | // } |
| | | // |
| | | // |
| | | // public void updateSlotRemainBySlots(List<Integer> slotList) { |
| | | // //获取格子内所有的玻璃信息 |
| | | // List<BigStorageCageDetails> inSlotGlassList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .in(BigStorageCageDetails::getSlot, slotList).in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL)); |
| | | // Map<Integer, Double> slotRemainMap = new HashMap<>(); |
| | | // //是否存在有格子非空的玻璃 |
| | | // if (CollectionUtil.isNotEmpty(inSlotGlassList)) { |
| | | // //存在 将格子内的玻璃分别进行更新 |
| | | // slotRemainMap = inSlotGlassList.stream() |
| | | // .collect(Collectors.groupingBy(BigStorageCageDetails::getSlot, Collectors.summingDouble(item -> Math.max(item.getWidth(), item.getHeight()) + glassGap))); |
| | | // slotRemainMap.forEach((e, v) -> { |
| | | // double remainWidth = slotWidth - v >= 0 ? slotWidth - v : 0; |
| | | // bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, remainWidth) |
| | | // .eq(BigStorageCage::getSlot, e)); |
| | | // }); |
| | | // } |
| | | // //过滤不存在玻璃的格子 将宽度重置为原始宽度5000 |
| | | // Set<Integer> remainSlotList = slotRemainMap.keySet(); |
| | | // slotList.removeAll(remainSlotList); |
| | | // if (CollectionUtil.isNotEmpty(slotList)) { |
| | | // bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth) |
| | | // .in(BigStorageCage::getSlot, slotList)); |
| | | // } |
| | | // } |
| | | // |
| | | // private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) { |
| | | // return ReadWriteEntity.builder() |
| | | // .identifier(identifier) |
| | | // //Kep中是Long类型,即:Int32,Java中的int类型 |
| | | // .value(value) |
| | | // .build(); |
| | | // } |
| | | //} |
| | |
| | | package com.mes.job; |
| | | |
| | | import cn.hutool.core.lang.Assert; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | import com.github.yulichang.toolkit.JoinWrappers; |
| | | import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | import com.mes.base.entity.BigStorageCageBaseInfo; |
| | | import com.mes.bigstorage.entity.BigStorageCage; |
| | | import com.mes.bigstorage.entity.BigStorageCageDetails; |
| | | import com.mes.bigstorage.entity.dto.BigStorageDTO; |
| | | import com.mes.bigstorage.entity.dto.SlotSequenceDTO; |
| | | import com.mes.bigstorage.entity.dto.TemperingLayoutDTO; |
| | | import com.mes.bigstorage.service.BigStorageCageDetailsService; |
| | | import com.mes.bigstorage.service.BigStorageCageService; |
| | | import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; |
| | | import com.mes.bigstoragetask.entity.BigStorageCageOutTask; |
| | | import com.mes.bigstoragetask.entity.UpdateBigStorageCageDTO; |
| | | import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService; |
| | | import com.mes.bigstoragetask.service.BigStorageCageOutTaskService; |
| | | import com.mes.common.S7object; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.damage.entity.Damage; |
| | | import com.mes.damage.service.DamageService; |
| | | import com.mes.device.PlcParameterObject; |
| | | import com.mes.edgglasstask.entity.EdgGlassTaskInfo; |
| | | import com.mes.edgglasstask.service.EdgGlassTaskInfoService; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | import com.mes.tools.S7control; |
| | | import com.mes.utils.RedisUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @author SNG-015 |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class PlcStorageCageTask { |
| | | |
| | | @Resource |
| | | private BigStorageCageService bigStorageCageService; |
| | | @Resource |
| | | private BigStorageCageDetailsService bigStorageCageDetailsService; |
| | | @Resource |
| | | private GlassInfoService glassInfoService; |
| | | @Resource |
| | | private BigStorageCageFeedTaskService bigStorageCageFeedTaskService; |
| | | @Resource |
| | | private BigStorageCageOutTaskService bigStorageCageOutTaskService; |
| | | @Resource |
| | | private EdgGlassTaskInfoService edgGlassTaskInfoService; |
| | | @Resource |
| | | private TemperingGlassInfoService temperingGlassInfoService; |
| | | @Resource |
| | | private DamageService damageService; |
| | | |
| | | @Resource |
| | | private RedisUtil redisUtil; |
| | | |
| | | private static final String REQUEST_WORD = "1"; |
| | | |
| | | @Value("${mes.sequence.order}") |
| | | private boolean sequenceOrder; |
| | | |
| | | @Value("${mes.carWidth}") |
| | | private Integer carWidth; |
| | | |
| | | @Value("${mes.slotWidth}") |
| | | private Integer slotWidth; |
| | | |
| | | @Value("${mes.inCarMaxSize}") |
| | | private Integer inCarMaxSize; |
| | | |
| | | @Value("${mes.outCarMaxSize}") |
| | | private Integer outCarMaxSize; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | |
| | | @Value("${mes.xMaxSize}") |
| | | private Integer xMaxSize; |
| | | |
| | | |
| | | private String d01GlassId = ""; |
| | | private String d04GlassId = ""; |
| | | |
| | | // @Scheduled(fixedDelay = 300) |
| | | public void plcToHomeEdgScan() { |
| | | Date startDate = new Date(); |
| | | log.info("大理片笼扫码任务开始执行时间:{}", startDate); |
| | | PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | String d01Id = plcParameterObject.getPlcParameter("D01ID").getValue(); |
| | | String d04Id = plcParameterObject.getPlcParameter("D04ID").getValue(); |
| | | //D02id判断是否为空 确认是否空闲 允许进片 |
| | | String d02State = plcParameterObject.getPlcParameter("D02ID").getValue(); |
| | | String d03State = plcParameterObject.getPlcParameter("D03State").getValue(); |
| | | String d05State = plcParameterObject.getPlcParameter("D05State").getValue(); |
| | | String mesD01Value = plcParameterObject.getPlcParameter("MESToD01").getValue(); |
| | | String mesD04Value = plcParameterObject.getPlcParameter("MESToD04").getValue(); |
| | | String mesD01Address = plcParameterObject.getPlcParameter("MESToD01").getAddress(); |
| | | String mesD04Address = plcParameterObject.getPlcParameter("MESToD04").getAddress(); |
| | | String d01ToMES = plcParameterObject.getPlcParameter("D01ToMES").getValue(); |
| | | String d04ToMES = plcParameterObject.getPlcParameter("D04ToMES").getValue(); |
| | | |
| | | log.info("1、获取d01Id扫描ID为:{},请求字为{};获取d04Id扫描ID为:{},请求字为{};", d01Id, d01ToMES, d04Id, d04ToMES); |
| | | if (StringUtils.isBlank(d01ToMES) && StringUtils.isBlank(d04ToMES)) { |
| | | log.info("两条线未收到进片任务,结束本次扫描进卧转立任务"); |
| | | return; |
| | | } |
| | | if (REQUEST_WORD.equals(d03State) && REQUEST_WORD.equals(d05State)) { |
| | | log.info("两条线卧转立均在执行任务,结束本次扫描进卧转立任务"); |
| | | return; |
| | | } |
| | | //按照线路及玻璃id获取相邻两块玻璃 卧转立上的玻璃: 状态为0不操作(D01送片,0不操作,1允许送片),请求字为1, (02玻璃id为空或者卧转立未启动) |
| | | if (!REQUEST_WORD.equals(mesD01Value) && REQUEST_WORD.equals(d01ToMES) && (StringUtils.isBlank(d02State) || !REQUEST_WORD.equals(d03State))) { |
| | | List<BigStorageCageFeedTask> bigStorageCageFeedTasks = bigStorageCageFeedTaskService.list( |
| | | new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | .eq(BigStorageCageFeedTask::getLine, Const.A09_OUT_TARGET_POSITION) |
| | | .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | ); |
| | | if (CollectionUtils.isEmpty(bigStorageCageFeedTasks)) { |
| | | if (!d01GlassId.equals(d01Id)) { |
| | | judgeGlassTypeStatus(d01Id, Const.A09_OUT_TARGET_POSITION, mesD01Address); |
| | | edgGlassTaskInfoService.update(new LambdaUpdateWrapper<EdgGlassTaskInfo>() |
| | | .set(EdgGlassTaskInfo::getState, Const.EDG_GLASS_SUCCESS).eq(EdgGlassTaskInfo::getGlassId, d01Id)); |
| | | // d01GlassId = d01Id; |
| | | } |
| | | } |
| | | } |
| | | // 状态为0不操作(D01送片,0不操作,1允许送片),请求字为1, 卧转立未启动 |
| | | if (!REQUEST_WORD.equals(mesD04Value) && REQUEST_WORD.equals(d04ToMES) && !REQUEST_WORD.equals(d05State)) { |
| | | List<BigStorageCageFeedTask> bigStorageCageFeedTasks = bigStorageCageFeedTaskService.list( |
| | | new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | .eq(BigStorageCageFeedTask::getLine, Const.A10_OUT_TARGET_POSITION) |
| | | .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | ); |
| | | if (CollectionUtils.isEmpty(bigStorageCageFeedTasks)) { |
| | | if (!d04GlassId.equals(d04Id)) { |
| | | judgeGlassTypeStatus(d04Id, Const.A10_OUT_TARGET_POSITION, mesD04Address); |
| | | edgGlassTaskInfoService.update(new LambdaUpdateWrapper<EdgGlassTaskInfo>() |
| | | .set(EdgGlassTaskInfo::getState, Const.EDG_GLASS_SUCCESS).eq(EdgGlassTaskInfo::getGlassId, d04Id)); |
| | | // d04GlassId = d04Id; |
| | | } |
| | | } |
| | | |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼扫码任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | } |
| | | |
| | | // @Scheduled(fixedDelay = 300) |
| | | public void plcToHomeEdgFreeCarTask() { |
| | | Date startDate = new Date(); |
| | | log.info("大理片笼空车进片任务开始执行时间:{}", startDate); |
| | | PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject; |
| | | String mesD03Address = plcMesObject.getPlcParameter("MESToD03").getValue(); |
| | | String mesD05Address = plcMesObject.getPlcParameter("MESToD05").getValue(); |
| | | log.info("MESToD03:{},MESToD05:{}", mesD03Address, mesD05Address); |
| | | if ("2".equals(mesD03Address) || "2".equals(mesD05Address)) { |
| | | log.info("有启动信号,MESToD03:{},MESToD05:{}", mesD03Address, mesD05Address); |
| | | } |
| | | PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | String e01Status = plcParameterObject.getPlcParameter("E01State").getValue(); |
| | | String d03ToMES = plcParameterObject.getPlcParameter("D03ToMES").getValue(); |
| | | String d05ToMES = plcParameterObject.getPlcParameter("D05ToMES").getValue(); |
| | | log.info("执行空车送片任务,获取到的大车状态为{},卧转立状态分别为d03:{},d05:{}", e01Status, d03ToMES, d05ToMES); |
| | | List<BigStorageCageFeedTask> bigStorageCageFeedTasks = bigStorageCageFeedTaskService.list( |
| | | new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .ne(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | ); |
| | | if (bigStorageCageFeedTasks.size() > 0) { |
| | | Date endDate = new Date(); |
| | | log.info("大车有正在执行的任务{},结束送片任务,任务结束时间:{},共耗时:{}ms,结束扫码任务", bigStorageCageFeedTasks, endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | if (REQUEST_WORD.equals(e01Status)) { |
| | | Date endDate = new Date(); |
| | | log.info("进片大车非空闲,结束送片任务,任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | if (!REQUEST_WORD.equals(d03ToMES) && !REQUEST_WORD.equals(d05ToMES)) { |
| | | Date endDate = new Date(); |
| | | log.info("卧转立第一次没有送片请求,结束送片任务,任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | if (!REQUEST_WORD.equals(d03ToMES) && !REQUEST_WORD.equals(d05ToMES)) { |
| | | Date endDate = new Date(); |
| | | log.info("卧转立第二次没有送片请求,结束送片任务,任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | // List<Integer> lines=new ArrayList<>(); |
| | | // if(REQUEST_WORD.equals(d03ToMES)){ |
| | | // lines.add(Const.A09_OUT_TARGET_POSITION); |
| | | //package com.mes.job; |
| | | // |
| | | //import cn.hutool.core.lang.Assert; |
| | | //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | //import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | //import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | //import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | //import com.github.yulichang.toolkit.JoinWrappers; |
| | | //import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | //import com.mes.base.entity.BigStorageCageBaseInfo; |
| | | //import com.mes.bigstorage.entity.BigStorageCage; |
| | | //import com.mes.bigstorage.entity.BigStorageCageDetails; |
| | | //import com.mes.bigstorage.entity.dto.BigStorageDTO; |
| | | //import com.mes.bigstorage.entity.dto.SlotSequenceDTO; |
| | | //import com.mes.bigstorage.entity.dto.TemperingLayoutDTO; |
| | | //import com.mes.bigstorage.service.BigStorageCageDetailsService; |
| | | //import com.mes.bigstorage.service.BigStorageCageService; |
| | | //import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; |
| | | //import com.mes.bigstoragetask.entity.BigStorageCageOutTask; |
| | | //import com.mes.bigstoragetask.entity.UpdateBigStorageCageDTO; |
| | | //import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService; |
| | | //import com.mes.bigstoragetask.service.BigStorageCageOutTaskService; |
| | | //import com.mes.common.S7object; |
| | | //import com.mes.common.config.Const; |
| | | //import com.mes.damage.entity.Damage; |
| | | //import com.mes.damage.service.DamageService; |
| | | //import com.mes.device.PlcParameterObject; |
| | | //import com.mes.edgglasstask.entity.EdgGlassTaskInfo; |
| | | //import com.mes.edgglasstask.service.EdgGlassTaskInfoService; |
| | | //import com.mes.glassinfo.entity.GlassInfo; |
| | | //import com.mes.glassinfo.service.GlassInfoService; |
| | | //import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | //import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | //import com.mes.tools.S7control; |
| | | //import com.mes.utils.RedisUtil; |
| | | //import lombok.extern.slf4j.Slf4j; |
| | | //import org.apache.commons.lang.StringUtils; |
| | | //import org.springframework.beans.BeanUtils; |
| | | //import org.springframework.beans.factory.annotation.Value; |
| | | //import org.springframework.stereotype.Component; |
| | | // |
| | | //import javax.annotation.Resource; |
| | | //import java.util.*; |
| | | //import java.util.stream.Collectors; |
| | | // |
| | | ///** |
| | | // * @author SNG-015 |
| | | // */ |
| | | //@Component |
| | | //@Slf4j |
| | | //public class PlcStorageCageTask { |
| | | // |
| | | // @Resource |
| | | // private BigStorageCageService bigStorageCageService; |
| | | // @Resource |
| | | // private BigStorageCageDetailsService bigStorageCageDetailsService; |
| | | // @Resource |
| | | // private GlassInfoService glassInfoService; |
| | | // @Resource |
| | | // private BigStorageCageFeedTaskService bigStorageCageFeedTaskService; |
| | | // @Resource |
| | | // private BigStorageCageOutTaskService bigStorageCageOutTaskService; |
| | | // @Resource |
| | | // private EdgGlassTaskInfoService edgGlassTaskInfoService; |
| | | // @Resource |
| | | // private TemperingGlassInfoService temperingGlassInfoService; |
| | | // @Resource |
| | | // private DamageService damageService; |
| | | // |
| | | // @Resource |
| | | // private RedisUtil redisUtil; |
| | | // |
| | | // private static final String REQUEST_WORD = "1"; |
| | | // |
| | | // @Value("${mes.sequence.order}") |
| | | // private boolean sequenceOrder; |
| | | // |
| | | // @Value("${mes.carWidth}") |
| | | // private Integer carWidth; |
| | | // |
| | | // @Value("${mes.slotWidth}") |
| | | // private Integer slotWidth; |
| | | // |
| | | // @Value("${mes.inCarMaxSize}") |
| | | // private Integer inCarMaxSize; |
| | | // |
| | | // @Value("${mes.outCarMaxSize}") |
| | | // private Integer outCarMaxSize; |
| | | // |
| | | // @Value("${mes.glassGap}") |
| | | // private Integer glassGap; |
| | | // |
| | | // @Value("${mes.xMaxSize}") |
| | | // private Integer xMaxSize; |
| | | // |
| | | // |
| | | // private String d01GlassId = ""; |
| | | // private String d04GlassId = ""; |
| | | // |
| | | // // @Scheduled(fixedDelay = 300) |
| | | // public void plcToHomeEdgScan() { |
| | | // Date startDate = new Date(); |
| | | // log.info("大理片笼扫码任务开始执行时间:{}", startDate); |
| | | // PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | // String d01Id = plcParameterObject.getPlcParameter("D01ID").getValue(); |
| | | // String d04Id = plcParameterObject.getPlcParameter("D04ID").getValue(); |
| | | // //D02id判断是否为空 确认是否空闲 允许进片 |
| | | // String d02State = plcParameterObject.getPlcParameter("D02ID").getValue(); |
| | | // String d03State = plcParameterObject.getPlcParameter("D03State").getValue(); |
| | | // String d05State = plcParameterObject.getPlcParameter("D05State").getValue(); |
| | | // String mesD01Value = plcParameterObject.getPlcParameter("MESToD01").getValue(); |
| | | // String mesD04Value = plcParameterObject.getPlcParameter("MESToD04").getValue(); |
| | | // String mesD01Address = plcParameterObject.getPlcParameter("MESToD01").getAddress(); |
| | | // String mesD04Address = plcParameterObject.getPlcParameter("MESToD04").getAddress(); |
| | | // String d01ToMES = plcParameterObject.getPlcParameter("D01ToMES").getValue(); |
| | | // String d04ToMES = plcParameterObject.getPlcParameter("D04ToMES").getValue(); |
| | | // |
| | | // log.info("1、获取d01Id扫描ID为:{},请求字为{};获取d04Id扫描ID为:{},请求字为{};", d01Id, d01ToMES, d04Id, d04ToMES); |
| | | // if (StringUtils.isBlank(d01ToMES) && StringUtils.isBlank(d04ToMES)) { |
| | | // log.info("两条线未收到进片任务,结束本次扫描进卧转立任务"); |
| | | // return; |
| | | // } |
| | | // if(REQUEST_WORD.equals(d05ToMES)){ |
| | | // lines.add(Const.A10_OUT_TARGET_POSITION); |
| | | // if (REQUEST_WORD.equals(d03State) && REQUEST_WORD.equals(d05State)) { |
| | | // log.info("两条线卧转立均在执行任务,结束本次扫描进卧转立任务"); |
| | | // return; |
| | | // } |
| | | LambdaQueryWrapper<BigStorageCageFeedTask> wrapper = new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .eq(BigStorageCageFeedTask::getTaskType, Const.BIG_STORAGE_IN_RUN) |
| | | .and(e -> e.isNull(BigStorageCageFeedTask::getTargetSlot).or().eq(BigStorageCageFeedTask::getTargetSlot, Const.OUT_TARGET_POSITION_ZERO)) |
| | | .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP); |
| | | // .in(BigStorageCageFeedTask::getLine,lines); |
| | | //获取可以启动卧转立的任务线路 |
| | | List<BigStorageCageFeedTask> feedTaskList = bigStorageCageFeedTaskService.list(wrapper); |
| | | if (CollectionUtils.isNotEmpty(feedTaskList)) { |
| | | if (feedTaskList.size() == 1) { |
| | | computeTargetByLine(feedTaskList.get(0).getLine()); |
| | | } else { |
| | | //比较最早一片任务的版图id及版序 求出卧转立的线路 |
| | | Integer startLine = getStartLine(); |
| | | // //计算目标格子,发送启动任务 |
| | | computeTargetByLine(startLine); |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | String d01Id = plcParameterObject.getPlcParameter("D01ID").getValue(); |
| | | String d04Id = plcParameterObject.getPlcParameter("D04ID").getValue(); |
| | | log.info("1、获取d01Id扫描ID为:{};获取d04Id扫描ID为:{};", d01Id, d04Id); |
| | | //获取两条线卧转立是否有玻璃,且任务状态为1/2 |
| | | List<Integer> lineList = bigStorageCageFeedTaskService.querySitToUpGlass(); |
| | | if (CollectionUtils.isEmpty(lineList)) { |
| | | Date endDate = new Date(); |
| | | log.info("两条线卧转立为空或者有进片任务未完成,结束任务,大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | Integer lineFirst = lineList.get(0); |
| | | String lineGlassId = lineFirst.equals(Const.A09_OUT_TARGET_POSITION) ? d01Id : d04Id; |
| | | //仅有一条先符合启动启动条件 |
| | | if (lineList.size() == 1) { |
| | | //如果进片请求但玻璃为空,计算任务表进片格子 发送进片任务 |
| | | if (StringUtils.isEmpty(lineGlassId)) { |
| | | computeTargetByLine(lineFirst); |
| | | } else { |
| | | //todo:计算扫描到的玻璃是否可以存进卧转立 |
| | | //获取卧转立剩余宽度 |
| | | if (computeIsRun(lineFirst, lineGlassId)) { |
| | | computeTargetByLine(lineFirst); |
| | | } else { |
| | | log.info("当前线路:{},有扫码玻璃:{}", lineFirst, lineGlassId); |
| | | } |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | //两条先均可执行进片任务,判断两条线是否进片请求是否都为空 |
| | | if (StringUtils.isBlank(d01Id) && StringUtils.isBlank(d04Id)) { |
| | | //比较最早一片任务的版图id及版序 求出卧转立的线路 |
| | | Integer line = getStartLine(); |
| | | //计算任务表进片格子 发送进片任务 |
| | | computeTargetByLine(line); |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } else if (StringUtils.isNotBlank(d01Id) && StringUtils.isNotBlank(d04Id)) { |
| | | // todo:两个都有进片玻璃 |
| | | if (computeIsRun(Const.A09_OUT_TARGET_POSITION, d01Id) && computeIsRun(Const.A10_OUT_TARGET_POSITION, d04Id)) { |
| | | //比较最早一片任务的版图id及版序 求出卧转立的线路 |
| | | Integer line = getStartLine(); |
| | | //计算任务表进片格子 发送进片任务 |
| | | computeTargetByLine(line); |
| | | } else if (computeIsRun(Const.A09_OUT_TARGET_POSITION, d01Id)) { |
| | | computeTargetByLine(Const.A09_OUT_TARGET_POSITION); |
| | | } else if (computeIsRun(Const.A10_OUT_TARGET_POSITION, d04Id)) { |
| | | computeTargetByLine(Const.A10_OUT_TARGET_POSITION); |
| | | } else { |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | } else { |
| | | //,或者仅有一条有玻璃 |
| | | //一条线为空,一条线有进片请求有玻璃 |
| | | int outLine = StringUtils.isBlank(d01Id) ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | //获取进片请求玻璃为空的,计算任务表进片格子 发送进片任务 |
| | | computeTargetByLine(outLine); |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | } |
| | | |
| | | // @Scheduled(fixedDelay = 10000) |
| | | public void plcToHomeEdgOutTask() { |
| | | Date startDate = new Date(); |
| | | log.info("大理片笼空车进片任务开始执行时间:{}", startDate); |
| | | PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject; |
| | | String e02State = plcMesObject.getPlcParameter("E02State").getValue(); |
| | | if (REQUEST_WORD.equals(e02State)) { |
| | | log.info("出片忙碌,结束出片任务"); |
| | | return; |
| | | } |
| | | String mesToPLCAddress = plcMesObject.getPlcParameter("MESToPLC").getAddress(); |
| | | List<BigStorageCageOutTask> outingList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>() |
| | | .eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_NEW)); |
| | | if (CollectionUtils.isNotEmpty(outingList)) { |
| | | log.info("有正在执行出片的任务,结束当前出片线程"); |
| | | return; |
| | | } |
| | | if (redisUtil.getCacheObject("temperingSwitch")) { |
| | | //是否有正在钢化的玻璃 |
| | | List<TemperingGlassInfo> temperingGlassInfoList = temperingGlassInfoService.selectJoinList(TemperingGlassInfo.class, new MPJLambdaWrapper<TemperingGlassInfo>() |
| | | .selectAll(TemperingGlassInfo.class) |
| | | .leftJoin(BigStorageCageOutTask.class, BigStorageCageOutTask::getGlassId, TemperingGlassInfo::getGlassId) |
| | | .eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW) |
| | | .isNull(BigStorageCageOutTask::getGlassId) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, TemperingGlassInfo::getTemperingFeedSequence)); |
| | | if (CollectionUtils.isNotEmpty(temperingGlassInfoList)) { |
| | | log.info("有正在出片的钢化任务"); |
| | | computeOutMoreGlassInfo(temperingGlassInfoList, Boolean.TRUE, mesToPLCAddress); |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | //是否有人工下片任务 有直接出 |
| | | // List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL).orderByDesc(BigStorageCageDetails::getWidth)); |
| | | List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL) |
| | | .orderByAsc(BigStorageCageDetails::getSlot) |
| | | .orderByDesc(BigStorageCageDetails::getId)); |
| | | if (CollectionUtils.isNotEmpty(artificialList)) { |
| | | computeOutMoreGlassInfo(artificialList, Boolean.FALSE, mesToPLCAddress); |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | //钢化优先:获取理片笼 玻璃小片 破损表 数量 判断笼内版图是否到齐 |
| | | List<TemperingLayoutDTO> temperingLayoutDTOList = bigStorageCageDetailsService.temperingIsAll(); |
| | | if (CollectionUtils.isNotEmpty(temperingLayoutDTOList)) { |
| | | //玻璃到齐包括已出片的 |
| | | //到齐,将玻璃小片数据存入钢化小片表,逻辑生成出片任务 结束 |
| | | for (TemperingLayoutDTO item : temperingLayoutDTOList) { |
| | | if (redisUtil.getCacheObject("temperingengineerId").equals(item.getEngineerId())) { |
| | | List<TemperingGlassInfo> temperingGlassInfos = glassInfoService.selectJoinList(TemperingGlassInfo.class, JoinWrappers.lambda(GlassInfo.class) |
| | | .selectAll(GlassInfo.class) |
| | | .select("-1 as state") |
| | | .selectAs(BigStorageCageDetails::getSlot, TemperingGlassInfo::getSlot) |
| | | .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId) |
| | | .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .eq(GlassInfo::getTemperingLayoutId, item.getTemperingLayoutId()) |
| | | .eq(GlassInfo::getEngineerId, item.getEngineerId()) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence)); |
| | | if (CollectionUtils.isNotEmpty(temperingGlassInfos)) { |
| | | temperingGlassInfoService.saveBatch(temperingGlassInfos); |
| | | computeOutMoreGlassInfo(temperingGlassInfoList, Boolean.TRUE, mesToPLCAddress); |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | //执行内部调度任务 |
| | | List<TemperingLayoutDTO> temperingOccupySlotList = bigStorageCageDetailsService.queryTemperingOccupySlot(); |
| | | if (CollectionUtils.isNotEmpty(temperingOccupySlotList)) { |
| | | loop: |
| | | for (TemperingLayoutDTO temperingOccupySlot : temperingOccupySlotList) { |
| | | List<SlotSequenceDTO> slotSequenceList = bigStorageCageDetailsService.queryGlassMaxAndMin(temperingOccupySlot.getEngineerId(), temperingOccupySlot.getTemperingLayoutId()); |
| | | for (int i = 0; i < slotSequenceList.size() - 1; i++) { |
| | | SlotSequenceDTO first = slotSequenceList.get(i); |
| | | SlotSequenceDTO second = slotSequenceList.get(i + 1); |
| | | int slotWidth = carWidth - first.getRemainWidth() - glassGap; |
| | | if (first.getMinSequence() == second.getMaxSequence() + 1 |
| | | && second.getRemainWidth() > slotWidth && slotWidth >= 0) { |
| | | List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getSlot, first.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence)); |
| | | if (CollectionUtils.isNotEmpty(list)) { |
| | | List<BigStorageCageOutTask> outTasks = new ArrayList<>(); |
| | | int serialNumber = 1; |
| | | for (BigStorageCageDetails item : list) { |
| | | outTasks.add(new BigStorageCageOutTask(item.getGlassId(), first.getSlot(), second.getSlot(), |
| | | item.getWidth() * 10, item.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date())); |
| | | } |
| | | //新增调度任务 |
| | | bigStorageCageOutTaskService.saveBatch(outTasks); |
| | | //更新理片笼详情表调度的后的玻璃位置信息:生成任务后先将玻璃格子位置进行调整,玻璃状态改为调度中,新增调度完成任务,处理调度完成后玻璃状态改为100. |
| | | List<String> glassList = list.stream().map(BigStorageCageDetails::getGlassId).collect(Collectors.toList()); |
| | | bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>().set(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING) |
| | | .set(BigStorageCageBaseInfo::getSlot, second.getSlot()).in(BigStorageCageDetails::getGlassId, glassList)); |
| | | //两次更新笼子的剩余尺寸:第一次防止有玻璃继续进调度后的笼子,第二次更新:计算格子的实际尺寸 |
| | | // 仅更新调度后的格子信息:起始格子完成后更新:防止调度出片过程中有新玻璃进入, |
| | | updateSlotRemainBySlots(Arrays.asList(second.getSlot())); |
| | | break loop; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // //向plc写入确认字 |
| | | // int returnData = 0; |
| | | // int count = 1; |
| | | // while (returnData == 0) { |
| | | // log.info("已向plc第{}次送协议", count); |
| | | // S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1); |
| | | // returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0); |
| | | // log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, mesToPLCAddress, returnData); |
| | | // //按照线路及玻璃id获取相邻两块玻璃 卧转立上的玻璃: 状态为0不操作(D01送片,0不操作,1允许送片),请求字为1, (02玻璃id为空或者卧转立未启动) |
| | | // if (!REQUEST_WORD.equals(mesD01Value) && REQUEST_WORD.equals(d01ToMES) && (StringUtils.isBlank(d02State) || !REQUEST_WORD.equals(d03State))) { |
| | | // List<BigStorageCageFeedTask> bigStorageCageFeedTasks = bigStorageCageFeedTaskService.list( |
| | | // new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | // .eq(BigStorageCageFeedTask::getLine, Const.A09_OUT_TARGET_POSITION) |
| | | // .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | // ); |
| | | // if (CollectionUtils.isEmpty(bigStorageCageFeedTasks)) { |
| | | // if (!d01GlassId.equals(d01Id)) { |
| | | // judgeGlassTypeStatus(d01Id, Const.A09_OUT_TARGET_POSITION, mesD01Address); |
| | | // edgGlassTaskInfoService.update(new LambdaUpdateWrapper<EdgGlassTaskInfo>() |
| | | // .set(EdgGlassTaskInfo::getState, Const.EDG_GLASS_SUCCESS).eq(EdgGlassTaskInfo::getGlassId, d01Id)); |
| | | //// d01GlassId = d01Id; |
| | | // } |
| | | // } |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | // @Scheduled(fixedDelay = 300) |
| | | public void updateInGlassStateTask() { |
| | | Date startDate = new Date(); |
| | | log.info("1、大理片笼进片完成后更新大理片笼数据任务开始执行时间:{}", startDate); |
| | | //因为大理片笼和出片任务是两个库的数据,所以要分开查找 |
| | | List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW)); |
| | | if (CollectionUtils.isNotEmpty(list)) { |
| | | log.info("2、获取所有正在进片的玻璃信息id:{}", list); |
| | | List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList()); |
| | | List<BigStorageCageFeedTask> inSuccessGlass = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .in(BigStorageCageFeedTask::getGlassId, glassIds) |
| | | .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT)); |
| | | if (CollectionUtils.isNotEmpty(inSuccessGlass)) { |
| | | log.info("3、获取进片已完成的玻璃信息id:{}", inSuccessGlass); |
| | | List<Integer> inSuccessGlassSlot = inSuccessGlass.stream().map(BigStorageCageFeedTask::getTargetSlot).collect(Collectors.toList()); |
| | | List<UpdateBigStorageCageDTO> storageCageDTOList = inSuccessGlass.stream().map(e -> { |
| | | UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); |
| | | BeanUtils.copyProperties(e, storageCageDTO); |
| | | return storageCageDTO; |
| | | }).collect(Collectors.toList()); |
| | | bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN); |
| | | log.info("4、大理片笼进片状态已完成已完成的玻璃信息id:{}", inSuccessGlass); |
| | | //更新理片笼玻璃尺寸 |
| | | updateSlotRemainBySlots(inSuccessGlassSlot); |
| | | log.info("5、大理片笼进片目标格子尺寸更新完成"); |
| | | } |
| | | |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("end:大理片笼进片完成后更新大理片笼数据任务结束时间:{},共耗时:{}ms,结束任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | |
| | | } |
| | | |
| | | // @Scheduled(fixedDelay = 300) |
| | | public void updateOutGlassStateTask() { |
| | | Date startDate = new Date(); |
| | | log.info("1、大理片笼出片完成后更新大理片笼数据任务开始执行时间:{}", startDate); |
| | | //因为大理片笼和出片任务是两个库的数据,所以要分开查找 |
| | | List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING)); |
| | | if (CollectionUtils.isNotEmpty(list)) { |
| | | log.info("2、获取所有正在出片的玻璃信息id:{}", list); |
| | | List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList()); |
| | | List<BigStorageCageOutTask> outSuccessGlass = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>() |
| | | .in(BigStorageCageOutTask::getGlassId, glassIds).in(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_ALL)); |
| | | if (CollectionUtils.isNotEmpty(outSuccessGlass)) { |
| | | for (BigStorageCageOutTask bigStorageCageOutTask : outSuccessGlass |
| | | ) { |
| | | if (bigStorageCageOutTask.getEndSlot().equals(Const.ARTIFICIAL_OUT_TARGET_POSITION)) { |
| | | temperingGlassInfoService.update( |
| | | new LambdaUpdateWrapper<TemperingGlassInfo>() |
| | | .set(TemperingGlassInfo::getState, Const.TEMPERING_END) |
| | | .eq(TemperingGlassInfo::getGlassId, bigStorageCageOutTask.getGlassId()) |
| | | ); |
| | | } |
| | | } |
| | | log.info("3、获取出片已完成的玻璃信息id:{}", outSuccessGlass); |
| | | List<UpdateBigStorageCageDTO> storageCageDTOList = outSuccessGlass.stream().map(e -> { |
| | | UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); |
| | | storageCageDTO.setGlassId(e.getGlassId()); |
| | | storageCageDTO.setTargetSlot(e.getStartSlot()); |
| | | return storageCageDTO; |
| | | }).collect(Collectors.toList()); |
| | | bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_OUT); |
| | | List<Integer> outSuccessSlotList = outSuccessGlass.stream().map(BigStorageCageOutTask::getStartSlot).collect(Collectors.toList()); |
| | | log.info("4、大理片笼出片状态已完成已完成的玻璃信息id:{}", outSuccessGlass); |
| | | //更新理片笼玻璃尺寸 |
| | | updateSlotRemainBySlots(outSuccessSlotList); |
| | | log.info("5、大理片笼进片目标格子尺寸更新完成"); |
| | | } |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("end:大理片笼出片完成后更新大理片笼数据任务结束时间:{},共耗时:{}ms,结束任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | |
| | | } |
| | | |
| | | // @Scheduled(fixedDelay = 300) |
| | | public void updateScheduleGlassStateTask() { |
| | | Date startDate = new Date(); |
| | | log.info("1、大理片笼调度完成后更新大理片笼数据任务开始执行时间:{}", startDate); |
| | | //因为大理片笼和调度任务是两个库的数据,所以要分开查找 |
| | | List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING)); |
| | | if (CollectionUtils.isNotEmpty(list)) { |
| | | log.info("2、获取所有正在出片的玻璃信息id:{}", list); |
| | | List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList()); |
| | | List<BigStorageCageOutTask> scheduleSuccessGlass = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>() |
| | | .in(BigStorageCageOutTask::getGlassId, glassIds).eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_SUCCESS) |
| | | .notIn(BigStorageCageOutTask::getEndSlot, Const.TEMPERING_OUT_TARGET_POSITION, Const.ARTIFICIAL_OUT_TARGET_POSITION)); |
| | | if (CollectionUtils.isNotEmpty(scheduleSuccessGlass)) { |
| | | log.info("3、获取调度已完成的玻璃信息id:{}", scheduleSuccessGlass); |
| | | List<UpdateBigStorageCageDTO> storageCageDTOList = scheduleSuccessGlass.stream().map(e -> { |
| | | UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); |
| | | storageCageDTO.setGlassId(e.getGlassId()); |
| | | storageCageDTO.setTargetSlot(e.getEndSlot()); |
| | | return storageCageDTO; |
| | | }).collect(Collectors.toList()); |
| | | bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN); |
| | | List<String> scheduleSuccessGlassIds = scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | log.info("4、大理片笼出片状态已完成已完成的玻璃信息id:{}", scheduleSuccessGlassIds); |
| | | //更新理片笼玻璃尺寸 |
| | | List<Integer> slotList = scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getStartSlot).distinct().collect(Collectors.toList()); |
| | | slotList.addAll(scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getEndSlot).distinct().collect(Collectors.toList())); |
| | | updateSlotRemainBySlots(slotList); |
| | | log.info("5、大理片笼进片目标格子尺寸更新完成"); |
| | | } |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("end:大理片笼出片完成后更新大理片笼数据任务结束时间:{},共耗时:{}ms,结束任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 处理破损表任务 |
| | | */ |
| | | // @Scheduled(fixedDelay = 300) |
| | | public void dealDamageTask() { |
| | | Date startDate = new Date(); |
| | | log.info("大理片笼破损玻璃清除任务开始执行时间:{}", startDate); |
| | | //获取进片任务表中状态为破损的数据 |
| | | List<BigStorageCageFeedTask> inDamageTaskInfoList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .in(BigStorageCageFeedTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); |
| | | if (CollectionUtils.isNotEmpty(inDamageTaskInfoList)) { |
| | | log.info("获取进片任务表中破损的玻璃信息{}", inDamageTaskInfoList); |
| | | bigStorageCageFeedTaskService.remove(new LambdaQueryWrapper<BigStorageCageFeedTask>().in(BigStorageCageFeedTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); |
| | | //理片笼详情表数据状态更新 |
| | | bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW).in(BigStorageCageDetails::getGlassId, inDamageTaskInfoList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()))); |
| | | //将破损信息新增入破损表 |
| | | List<Integer> slotList = new ArrayList<>(); |
| | | for (BigStorageCageFeedTask bigStorageCageFeedTask : inDamageTaskInfoList) { |
| | | Damage damage = new Damage(); |
| | | damage.setGlassId(bigStorageCageFeedTask.getGlassId()); |
| | | damage.setLine(bigStorageCageFeedTask.getLine()); |
| | | damage.setWorkingProcedure("磨边"); |
| | | damage.setRemark("进笼前卧转立"); |
| | | damage.setStatus(1); |
| | | damage.setType(bigStorageCageFeedTask.getTaskState()); |
| | | damageService.insertDamage(damage); |
| | | slotList.add(bigStorageCageFeedTask.getTargetSlot()); |
| | | } |
| | | //更新格子剩余宽度 |
| | | updateSlotRemainBySlots(slotList); |
| | | log.info("进片任务执行完成"); |
| | | } |
| | | //获取出片任务表中状态为破损的数据 |
| | | List<BigStorageCageOutTask> outDamageTaskInfoList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>() |
| | | .in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); |
| | | if (CollectionUtils.isNotEmpty(outDamageTaskInfoList)) { |
| | | log.info("获取出片任务表中破损的玻璃信息{}", outDamageTaskInfoList); |
| | | bigStorageCageOutTaskService.remove(new LambdaQueryWrapper<BigStorageCageOutTask>().in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); |
| | | List<String> glassIdList = outDamageTaskInfoList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | //移除钢化下片表数据 |
| | | temperingGlassInfoService.remove(new LambdaQueryWrapper<TemperingGlassInfo>().in(TemperingGlassInfo::getGlassId, glassIdList)); |
| | | //理片笼详情表数据状态删除 |
| | | bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>().in(BigStorageCageDetails::getGlassId, glassIdList)); |
| | | //将破损信息新增入破损表 |
| | | List<Integer> slotList = new ArrayList<>(); |
| | | for (BigStorageCageOutTask bigStorageCageOutTask : outDamageTaskInfoList) { |
| | | Damage damage = new Damage(); |
| | | damage.setGlassId(bigStorageCageOutTask.getGlassId()); |
| | | damage.setLine(bigStorageCageOutTask.getEndSlot()); |
| | | damage.setWorkingProcedure("钢化"); |
| | | damage.setRemark("出片后卧转立"); |
| | | damage.setStatus(1); |
| | | damage.setType(bigStorageCageOutTask.getTaskState()); |
| | | damageService.insertDamage(damage); |
| | | slotList.add(bigStorageCageOutTask.getStartSlot()); |
| | | } |
| | | //更新格子剩余宽度 |
| | | updateSlotRemainBySlots(slotList); |
| | | log.info("出片任务执行完成"); |
| | | } |
| | | Date endDate = new Date(); |
| | | log.info("大理片笼破损玻璃清除任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | return; |
| | | } |
| | | |
| | | /** |
| | | * 确认字清空 |
| | | */ |
| | | // @Scheduled(fixedDelay = 300) |
| | | public void confirmClear() { |
| | | PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | String d01ToMES = plcParameterObject.getPlcParameter("D01ToMES").getValue(); |
| | | String d04ToMES = plcParameterObject.getPlcParameter("D04ToMES").getValue(); |
| | | String mesD01Address = plcParameterObject.getPlcParameter("MESToD01").getAddress(); |
| | | String mesD04Address = plcParameterObject.getPlcParameter("MESToD04").getAddress(); |
| | | // } |
| | | //// 状态为0不操作(D01送片,0不操作,1允许送片),请求字为1, 卧转立未启动 |
| | | // if (!REQUEST_WORD.equals(mesD04Value) && REQUEST_WORD.equals(d04ToMES) && !REQUEST_WORD.equals(d05State)) { |
| | | // List<BigStorageCageFeedTask> bigStorageCageFeedTasks = bigStorageCageFeedTaskService.list( |
| | | // new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | // .eq(BigStorageCageFeedTask::getLine, Const.A10_OUT_TARGET_POSITION) |
| | | // .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | // ); |
| | | // if (CollectionUtils.isEmpty(bigStorageCageFeedTasks)) { |
| | | // if (!d04GlassId.equals(d04Id)) { |
| | | // judgeGlassTypeStatus(d04Id, Const.A10_OUT_TARGET_POSITION, mesD04Address); |
| | | // edgGlassTaskInfoService.update(new LambdaUpdateWrapper<EdgGlassTaskInfo>() |
| | | // .set(EdgGlassTaskInfo::getState, Const.EDG_GLASS_SUCCESS).eq(EdgGlassTaskInfo::getGlassId, d04Id)); |
| | | //// d04GlassId = d04Id; |
| | | // } |
| | | // } |
| | | // |
| | | // } |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼扫码任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // } |
| | | // |
| | | // // @Scheduled(fixedDelay = 300) |
| | | // public void plcToHomeEdgFreeCarTask() { |
| | | // Date startDate = new Date(); |
| | | // log.info("大理片笼空车进片任务开始执行时间:{}", startDate); |
| | | // PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject; |
| | | // String mesD03Address = plcMesObject.getPlcParameter("MESToD03").getValue(); |
| | | // String mesD05Address = plcMesObject.getPlcParameter("MESToD05").getValue(); |
| | | // log.info("MESToD03:{},MESToD05:{}", mesD03Address, mesD05Address); |
| | | // if ("2".equals(mesD03Address) || "2".equals(mesD05Address)) { |
| | | // log.info("有启动信号,MESToD03:{},MESToD05:{}", mesD03Address, mesD05Address); |
| | | // } |
| | | // PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | // String e01Status = plcParameterObject.getPlcParameter("E01State").getValue(); |
| | | // String d03ToMES = plcParameterObject.getPlcParameter("D03ToMES").getValue(); |
| | | // String d05ToMES = plcParameterObject.getPlcParameter("D05ToMES").getValue(); |
| | | String d03ToMES = plcParameterObject.getPlcParameter("D03Request").getValue(); |
| | | String d05ToMES = plcParameterObject.getPlcParameter("D05Request").getValue(); |
| | | String mesD03Address = plcParameterObject.getPlcParameter("MESToD03").getAddress(); |
| | | String mesD05Address = plcParameterObject.getPlcParameter("MESToD05").getAddress(); |
| | | if (!REQUEST_WORD.equals(d01ToMES)) { |
| | | log.info("地址:{}写入0", mesD01Address); |
| | | S7object.getinstance().plccontrol.writeWord(mesD01Address, 0); |
| | | } |
| | | if (!REQUEST_WORD.equals(d04ToMES)) { |
| | | log.info("地址:{}写入0", mesD04Address); |
| | | S7object.getinstance().plccontrol.writeWord(mesD04Address, 0); |
| | | } |
| | | if (!REQUEST_WORD.equals(d03ToMES)) { |
| | | log.info("地址:{}写入0", mesD03Address); |
| | | S7object.getinstance().plccontrol.writeWord(mesD03Address, 0); |
| | | } |
| | | if (!REQUEST_WORD.equals(d05ToMES)) { |
| | | log.info("地址:{}写入0", mesD05Address); |
| | | S7object.getinstance().plccontrol.writeWord(mesD05Address, 0); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 进片状态修改 |
| | | */ |
| | | // @Scheduled(fixedDelay = 300) |
| | | public void feedStatusUpdate() { |
| | | PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | String mesD03Address = plcParameterObject.getPlcParameter("MESToD03").getAddress(); |
| | | String mesD05Address = plcParameterObject.getPlcParameter("MESToD05").getAddress(); |
| | | List<String> glassIds1 = new ArrayList<>(); |
| | | List<String> glassIds2 = new ArrayList<>(); |
| | | for (int i = 1; i <= 6; i++) { |
| | | String line1GlassId = plcParameterObject.getPlcParameter("D03ID" + i).getValue(); |
| | | if (StringUtils.isNotEmpty(line1GlassId)) { |
| | | glassIds1.add(line1GlassId); |
| | | } |
| | | String line2GlassId = plcParameterObject.getPlcParameter("D05ID" + i).getValue(); |
| | | if (StringUtils.isNotEmpty(line2GlassId)) { |
| | | glassIds2.add(line2GlassId); |
| | | } |
| | | } |
| | | List<BigStorageCageFeedTask> bigStorageCageFeedTasks1 = bigStorageCageFeedTaskService.list( |
| | | new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_NEW) |
| | | .eq(BigStorageCageFeedTask::getLine, Const.A09_OUT_TARGET_POSITION) |
| | | ); |
| | | List<BigStorageCageFeedTask> bigStorageCageFeedTasks2 = bigStorageCageFeedTaskService.list( |
| | | new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_NEW) |
| | | .eq(BigStorageCageFeedTask::getLine, Const.A10_OUT_TARGET_POSITION) |
| | | ); |
| | | if (CollectionUtils.isNotEmpty(bigStorageCageFeedTasks1) && CollectionUtils.isNotEmpty(glassIds1)) { |
| | | List<String> matchingIds1 = bigStorageCageFeedTasks1.stream() |
| | | .map(BigStorageCageFeedTask::getGlassId) |
| | | .filter(glassIds1::contains) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | log.info("D3id{},匹配id:{}", glassIds1, matchingIds1); |
| | | if (CollectionUtils.isNotEmpty(matchingIds1)) { |
| | | bigStorageCageFeedTaskService.update( |
| | | new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | .in(BigStorageCageFeedTask::getGlassId, matchingIds1) |
| | | .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | ); |
| | | } |
| | | } |
| | | if (CollectionUtils.isNotEmpty(bigStorageCageFeedTasks2) && CollectionUtils.isNotEmpty(glassIds2)) { |
| | | List<String> matchingIds2 = bigStorageCageFeedTasks2.stream() |
| | | .map(BigStorageCageFeedTask::getGlassId) |
| | | .filter(glassIds2::contains) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | log.info("D5id{},匹配id:{}", glassIds2, matchingIds2); |
| | | if (CollectionUtils.isNotEmpty(matchingIds2)) { |
| | | bigStorageCageFeedTaskService.update( |
| | | new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | .in(BigStorageCageFeedTask::getGlassId, matchingIds2) |
| | | .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | ); |
| | | } |
| | | } |
| | | if (CollectionUtils.isEmpty(glassIds1)) { |
| | | S7object.getinstance().plccontrol.writeWord(mesD03Address, 0); |
| | | log.info("{}线修改玻璃状态为3", Const.A09_OUT_TARGET_POSITION); |
| | | bigStorageCageFeedTaskService.update( |
| | | new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | .eq(BigStorageCageFeedTask::getLine, Const.A09_OUT_TARGET_POSITION) |
| | | .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_CAR) |
| | | ); |
| | | } |
| | | if (CollectionUtils.isEmpty(glassIds2)) { |
| | | S7object.getinstance().plccontrol.writeWord(mesD05Address, 0); |
| | | log.info("{}线修改玻璃状态为3", Const.A10_OUT_TARGET_POSITION); |
| | | bigStorageCageFeedTaskService.update( |
| | | new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | .eq(BigStorageCageFeedTask::getLine, Const.A10_OUT_TARGET_POSITION) |
| | | .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_CAR) |
| | | ); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 按照玻璃id判断玻璃状态及卧转立是否可直接启动 |
| | | */ |
| | | public Boolean judgeGlassTypeStatus(String glassId, Integer line, String mesAddress) { |
| | | //判断此玻璃是在笼内或已生成进片任务 |
| | | BigStorageCageFeedTask bigStorageCageFeedTask = bigStorageCageFeedTaskService.getOne( |
| | | new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | .eq(BigStorageCageFeedTask::getGlassId, glassId) |
| | | ); |
| | | BigStorageCageDetails bigStorageCageDetails = bigStorageCageDetailsService.getOne( |
| | | new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getGlassId, glassId) |
| | | .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | ); |
| | | if (bigStorageCageFeedTask != null || bigStorageCageDetails != null) { |
| | | log.info("此玻璃存任务或已在笼内"); |
| | | return Boolean.TRUE; |
| | | } |
| | | //1、获取任务表中相邻玻璃 |
| | | List<EdgGlassTaskInfo> edgGlassTaskInfoList; |
| | | edgGlassTaskInfoList = edgGlassTaskInfoService.list(new LambdaQueryWrapper<EdgGlassTaskInfo>() |
| | | .eq(EdgGlassTaskInfo::getLine, line) |
| | | .apply("time >= (select time from edg_glass_task_info where line='" + line + "' and glass_id = '" + glassId + "' and deleted = 0)") |
| | | .orderByAsc(EdgGlassTaskInfo::getCreateTime)); |
| | | if (edgGlassTaskInfoList.size() == 0) { |
| | | edgGlassTaskInfoList = edgGlassTaskInfoService.list(new QueryWrapper<EdgGlassTaskInfo>() |
| | | .select("Top 1 *") |
| | | .eq("glass_id", glassId) |
| | | ); |
| | | log.info("在尺寸表中获取玻璃信息{}", edgGlassTaskInfoList); |
| | | if (edgGlassTaskInfoList.size() == 0) { |
| | | GlassInfo glassInfo = glassInfoService.getOne( |
| | | new LambdaQueryWrapper<GlassInfo>() |
| | | .eq(GlassInfo::getGlassId, glassId) |
| | | ); |
| | | EdgGlassTaskInfo edgGlassTaskInfo = new EdgGlassTaskInfo(); |
| | | BeanUtils.copyProperties(glassInfo, edgGlassTaskInfo); |
| | | edgGlassTaskInfo.setWidth((int) glassInfo.getWidth()); |
| | | edgGlassTaskInfo.setHeight((int) glassInfo.getHeight()); |
| | | edgGlassTaskInfoList.add(edgGlassTaskInfo); |
| | | log.info("在玻璃信息表中获取玻璃信息{}", edgGlassTaskInfoList); |
| | | } |
| | | } |
| | | Assert.isFalse(CollectionUtils.isEmpty(edgGlassTaskInfoList), "识别玻璃信息未出现在尺寸表中,获取相邻两块玻璃失败"); |
| | | //2、获取卧转立剩余宽度 |
| | | BigStorageDTO sitToUpRemainWidth = bigStorageCageFeedTaskService.querySitToUpRemainWidth(line); |
| | | Integer remainWidth; |
| | | Integer glassCount; |
| | | if (0 == sitToUpRemainWidth.getGlassCount()) { |
| | | remainWidth = carWidth; |
| | | glassCount = 0; |
| | | } else { |
| | | remainWidth = sitToUpRemainWidth.getWidth(); |
| | | glassCount = sitToUpRemainWidth.getGlassCount(); |
| | | } |
| | | |
| | | Boolean flag = Boolean.TRUE; |
| | | //2、获取卧转立 |
| | | Integer widthFirst = Math.max(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10); |
| | | Integer heightFirst = Math.min(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10); |
| | | if (edgGlassTaskInfoList.size() == 1) { |
| | | if (remainWidth >= widthFirst) { |
| | | if (glassCount < inCarMaxSize) { |
| | | addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst); |
| | | } else { |
| | | if (glassCount < inCarMaxSize + 1) { |
| | | addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | } else { |
| | | return Boolean.FALSE; |
| | | } |
| | | } |
| | | } else { |
| | | flag = Boolean.FALSE; |
| | | } |
| | | } else { |
| | | Integer widthSecond = Math.max(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10); |
| | | Integer heightSecond = Math.min(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10); |
| | | if (remainWidth >= widthFirst) { |
| | | if (remainWidth - widthFirst - glassGap >= widthSecond) { |
| | | if (glassCount < inCarMaxSize) { |
| | | addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst); |
| | | } else { |
| | | if (glassCount < inCarMaxSize + 1) { |
| | | addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | } else { |
| | | return Boolean.FALSE; |
| | | } |
| | | } |
| | | } else { |
| | | if (glassCount < inCarMaxSize + 1) { |
| | | addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | } else { |
| | | return Boolean.FALSE; |
| | | } |
| | | } |
| | | } else { |
| | | flag = Boolean.FALSE; |
| | | } |
| | | } |
| | | //向plc发送进片确认 |
| | | if (flag) { |
| | | //向plc写入确认字 |
| | | PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | int returnData = 1; |
| | | int count = 1; |
| | | while (returnData != 0) { |
| | | S7object.getinstance().plccontrol.writeWord(mesAddress, 1); |
| | | |
| | | if (Const.A10_OUT_TARGET_POSITION.equals(line)) { |
| | | returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D04ToMES").getValue()); |
| | | } else { |
| | | returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D01ToMES").getValue()); |
| | | } |
| | | // returnData = S7object.getinstance().plccontrol.readWord(mesAddress, 1).get(0); |
| | | log.info("进卧转立第{}次发送确认字完成,地址为:{},写入的内容为{}", count++, mesAddress, 1); |
| | | } |
| | | } |
| | | //记录无法放下玻璃,后续判断启动 |
| | | return flag; |
| | | } |
| | | |
| | | /** |
| | | * 添加任务信息 |
| | | */ |
| | | private Boolean addFeedTask(String glassId, Integer line, Integer taskType, Integer width, Integer height) { |
| | | BigStorageCageFeedTask bigStorageCageFeedTask = new BigStorageCageFeedTask(); |
| | | bigStorageCageFeedTask.setGlassId(glassId); |
| | | bigStorageCageFeedTask.setTaskState(Const.BIG_STORAGE_IN_NEW); |
| | | bigStorageCageFeedTask.setLine(line); |
| | | bigStorageCageFeedTask.setTaskType(taskType); |
| | | bigStorageCageFeedTask.setWidth(width); |
| | | bigStorageCageFeedTask.setHeight(height); |
| | | bigStorageCageFeedTask.setCreateTime(new Date()); |
| | | //删除理片笼表拿走/破损数据数据 |
| | | damageService.deleteByGlassId(glassId); |
| | | Damage damage = new Damage(); |
| | | damage.setGlassId(glassId); |
| | | damage.setWorkingProcedure("磨边"); |
| | | damage.setLine(line); |
| | | damage.setType(1); |
| | | damage.setRemark("进大理片"); |
| | | damageService.insertDamage(damage); |
| | | return bigStorageCageFeedTaskService.save(bigStorageCageFeedTask); |
| | | } |
| | | |
| | | /** |
| | | * 获取需要启动的线路:两条线都可启动 获取第一片玻璃版图id最小 版序最大的线路 |
| | | * |
| | | * @return 需要启动的线路 |
| | | */ |
| | | public Integer getStartLine() { |
| | | List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .inSql(BigStorageCageFeedTask::getId, "select min(id) from big_storage_cage_feed_task where task_state = 2" + |
| | | "and (target_slot = 0 or target_slot is null) group by line")); |
| | | Assert.isFalse(CollectionUtils.isEmpty(taskList), "卧转立两条线都没有玻璃进片任务"); |
| | | Map<String, Integer> taskMap = taskList.stream().collect(Collectors.toMap(BigStorageCageFeedTask::getGlassId, |
| | | BigStorageCageFeedTask::getLine)); |
| | | GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | .in(GlassInfo::getGlassId, taskMap.keySet()) |
| | | .orderByAsc(GlassInfo::getTemperingLayoutId) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence) |
| | | .last("limit 1")); |
| | | return taskMap.get(glassInfo.getGlassId()); |
| | | } |
| | | |
| | | /** |
| | | * 计算任务表进片线路的目标格子,并启动任务 |
| | | */ |
| | | public boolean computeTargetByLine(Integer line) { |
| | | //1、获取任务表中的所有玻璃(指定线路且已经进卧转立完成) |
| | | List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .eq(BigStorageCageFeedTask::getLine, line) |
| | | .and(e -> e.isNull(BigStorageCageFeedTask::getTargetSlot).or().eq(BigStorageCageFeedTask::getTargetSlot, Const.OUT_TARGET_POSITION_ZERO)) |
| | | .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP_ALL) |
| | | .orderByAsc(BigStorageCageFeedTask::getId)); |
| | | //2、去笼子内查找是否可以继续存放的笼子 |
| | | List<String> glassIds = taskList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()); |
| | | List<GlassInfo> glassInfos = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIds)); |
| | | return computeIsTemperingTargetByLine(glassInfos, taskList, line); |
| | | } |
| | | |
| | | /** |
| | | * 是否钢化玻璃进笼目标位置 |
| | | * |
| | | * @param glassInfos 当条线卧转立所有玻璃 |
| | | * @param taskList 当条线卧转立所有任务 |
| | | * @param line 任务是哪条线 |
| | | */ |
| | | private boolean computeIsTemperingTargetByLine(List<GlassInfo> glassInfos, List<BigStorageCageFeedTask> taskList, Integer line) { |
| | | //1、将玻璃信息集合转为glassid为key的map |
| | | Map<String, GlassInfo> glassInfoMap = glassInfos.stream() |
| | | .collect(Collectors.toMap(GlassInfo::getGlassId, p -> p)); |
| | | for (BigStorageCageFeedTask e : taskList) { |
| | | GlassInfo info = glassInfoMap.get(e.getGlassId()); |
| | | if (info == null) { |
| | | continue; |
| | | } |
| | | BigStorageCageDetails cageDetails = new BigStorageCageDetails(); |
| | | BeanUtils.copyProperties(info, cageDetails); |
| | | //2、获取目标格子信息 |
| | | BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info); |
| | | //3、临时更新格子的剩余尺寸:防止相邻玻璃进同一格子造成剩余尺寸不足,玻璃越界的情况,任务完成后再次更新大理片笼表剩余宽度(按照笼内玻璃数量更新大理片笼剩余尺寸) |
| | | bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap) |
| | | .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot())); |
| | | //4、更新进片任务表,目标格子及状态(状态改为2 电气扫到自行处理) 遇到问题:无法批量更新,批量更新无法走指定从库 |
| | | e.setTargetSlot(bigStorageDTO.getSlot()); |
| | | bigStorageCageFeedTaskService.updateById(e); |
| | | |
| | | //5、将进片信息存入大理片笼详情表 |
| | | cageDetails.setSlot(bigStorageDTO.getSlot()); |
| | | cageDetails.setState(Const.GLASS_STATE_NEW); |
| | | cageDetails.setDeviceId(bigStorageDTO.getDeviceId()); |
| | | cageDetails.setGap(glassGap); |
| | | bigStorageCageDetailsService.save(cageDetails); |
| | | |
| | | } |
| | | sendTaskListToPLC(taskList, line); |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | private void sendTaskListToPLC(List<BigStorageCageFeedTask> taskList, Integer line) { |
| | | log.info("送片任务发送进片玻璃信息"); |
| | | S7control s7control = S7object.getinstance().plccontrol; |
| | | PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject; |
| | | String mesD03Address = plcMesObject.getPlcParameter("MESToD03").getAddress(); |
| | | String mesD05Address = plcMesObject.getPlcParameter("MESToD05").getAddress(); |
| | | String outLine = line.equals(Const.A09_OUT_TARGET_POSITION) ? mesD03Address : mesD05Address; |
| | | List<String> returnData = new ArrayList<>(); |
| | | |
| | | for (int i = 1; i <= taskList.size(); i++) { |
| | | s7control.writeWord(plcMesObject.getPlcParameter("StartAddToImport" + i).getAddress(), taskList.get(i - 1).getLine()); |
| | | s7control.writeWord(plcMesObject.getPlcParameter("TargetAddToImport" + i).getAddress(), taskList.get(i - 1).getTargetSlot()); |
| | | returnData.add(taskList.get(i - 1).getGlassId()); |
| | | log.info("向plc发送第{}片玻璃已完成,起始位置是{},目标位置是", i, taskList.get(i - 1).getLine(), taskList.get(i - 1).getTargetSlot()); |
| | | } |
| | | // int returnData = 1; |
| | | int count = 1; |
| | | |
| | | |
| | | while (CollectionUtils.isNotEmpty(returnData)) { |
| | | List<String> glassIds1 = new ArrayList<>(); |
| | | List<String> glassIds2 = new ArrayList<>(); |
| | | s7control.writeWord(outLine, 2); |
| | | for (int i = 1; i <= 6; i++) { |
| | | String line1GlassId = plcMesObject.getPlcParameter("D03ID" + i).getValue(); |
| | | if (StringUtils.isNotEmpty(line1GlassId)) { |
| | | glassIds1.add(line1GlassId); |
| | | } |
| | | String line2GlassId = plcMesObject.getPlcParameter("D05ID" + i).getValue(); |
| | | if (StringUtils.isNotEmpty(line2GlassId)) { |
| | | glassIds2.add(line2GlassId); |
| | | } |
| | | } |
| | | if (line.equals(Const.A09_OUT_TARGET_POSITION)) { |
| | | // returnData = Integer.parseInt(plcMesObject.getPlcParameter("D03ToMES").getValue()); |
| | | returnData = glassIds1; |
| | | } else { |
| | | // returnData = Integer.parseInt(plcMesObject.getPlcParameter("D05ToMES").getValue()); |
| | | returnData = glassIds2; |
| | | } |
| | | // returnData = s7control.readWord(outLine, 1).get(0); |
| | | log.info("已向plc第{}次发送进片任务确认,地址为:{},写入的内容为{},读到的请求为{}", count++, outLine, 2, returnData); |
| | | } |
| | | // while (returnData != 0) { |
| | | // log.info("执行空车送片任务,获取到的大车状态为{},卧转立状态分别为d03:{},d05:{}", e01Status, d03ToMES, d05ToMES); |
| | | // List<BigStorageCageFeedTask> bigStorageCageFeedTasks = bigStorageCageFeedTaskService.list( |
| | | // new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .ne(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | // .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | // ); |
| | | // if (bigStorageCageFeedTasks.size() > 0) { |
| | | // Date endDate = new Date(); |
| | | // log.info("大车有正在执行的任务{},结束送片任务,任务结束时间:{},共耗时:{}ms,结束扫码任务", bigStorageCageFeedTasks, endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // if (REQUEST_WORD.equals(e01Status)) { |
| | | // Date endDate = new Date(); |
| | | // log.info("进片大车非空闲,结束送片任务,任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // if (!REQUEST_WORD.equals(d03ToMES) && !REQUEST_WORD.equals(d05ToMES)) { |
| | | // Date endDate = new Date(); |
| | | // log.info("卧转立第一次没有送片请求,结束送片任务,任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // if (!REQUEST_WORD.equals(d03ToMES) && !REQUEST_WORD.equals(d05ToMES)) { |
| | | // Date endDate = new Date(); |
| | | // log.info("卧转立第二次没有送片请求,结束送片任务,任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | //// List<Integer> lines=new ArrayList<>(); |
| | | //// if(REQUEST_WORD.equals(d03ToMES)){ |
| | | //// lines.add(Const.A09_OUT_TARGET_POSITION); |
| | | //// } |
| | | //// if(REQUEST_WORD.equals(d05ToMES)){ |
| | | //// lines.add(Const.A10_OUT_TARGET_POSITION); |
| | | //// } |
| | | // LambdaQueryWrapper<BigStorageCageFeedTask> wrapper = new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .eq(BigStorageCageFeedTask::getTaskType, Const.BIG_STORAGE_IN_RUN) |
| | | // .and(e -> e.isNull(BigStorageCageFeedTask::getTargetSlot).or().eq(BigStorageCageFeedTask::getTargetSlot, Const.OUT_TARGET_POSITION_ZERO)) |
| | | // .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP); |
| | | //// .in(BigStorageCageFeedTask::getLine,lines); |
| | | // //获取可以启动卧转立的任务线路 |
| | | // List<BigStorageCageFeedTask> feedTaskList = bigStorageCageFeedTaskService.list(wrapper); |
| | | // if (CollectionUtils.isNotEmpty(feedTaskList)) { |
| | | // if (feedTaskList.size() == 1) { |
| | | // computeTargetByLine(feedTaskList.get(0).getLine()); |
| | | // } else { |
| | | // //比较最早一片任务的版图id及版序 求出卧转立的线路 |
| | | // Integer startLine = getStartLine(); |
| | | //// //计算目标格子,发送启动任务 |
| | | // computeTargetByLine(startLine); |
| | | // } |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // String d01Id = plcParameterObject.getPlcParameter("D01ID").getValue(); |
| | | // String d04Id = plcParameterObject.getPlcParameter("D04ID").getValue(); |
| | | // log.info("1、获取d01Id扫描ID为:{};获取d04Id扫描ID为:{};", d01Id, d04Id); |
| | | // //获取两条线卧转立是否有玻璃,且任务状态为1/2 |
| | | // List<Integer> lineList = bigStorageCageFeedTaskService.querySitToUpGlass(); |
| | | // if (CollectionUtils.isEmpty(lineList)) { |
| | | // Date endDate = new Date(); |
| | | // log.info("两条线卧转立为空或者有进片任务未完成,结束任务,大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // Integer lineFirst = lineList.get(0); |
| | | // String lineGlassId = lineFirst.equals(Const.A09_OUT_TARGET_POSITION) ? d01Id : d04Id; |
| | | // //仅有一条先符合启动启动条件 |
| | | // if (lineList.size() == 1) { |
| | | // //如果进片请求但玻璃为空,计算任务表进片格子 发送进片任务 |
| | | // if (StringUtils.isEmpty(lineGlassId)) { |
| | | // computeTargetByLine(lineFirst); |
| | | // } else { |
| | | // //todo:计算扫描到的玻璃是否可以存进卧转立 |
| | | // //获取卧转立剩余宽度 |
| | | // if (computeIsRun(lineFirst, lineGlassId)) { |
| | | // computeTargetByLine(lineFirst); |
| | | // } else { |
| | | // log.info("当前线路:{},有扫码玻璃:{}", lineFirst, lineGlassId); |
| | | // } |
| | | // } |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // //两条先均可执行进片任务,判断两条线是否进片请求是否都为空 |
| | | // if (StringUtils.isBlank(d01Id) && StringUtils.isBlank(d04Id)) { |
| | | // //比较最早一片任务的版图id及版序 求出卧转立的线路 |
| | | // Integer line = getStartLine(); |
| | | // //计算任务表进片格子 发送进片任务 |
| | | // computeTargetByLine(line); |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } else if (StringUtils.isNotBlank(d01Id) && StringUtils.isNotBlank(d04Id)) { |
| | | //// todo:两个都有进片玻璃 |
| | | // if (computeIsRun(Const.A09_OUT_TARGET_POSITION, d01Id) && computeIsRun(Const.A10_OUT_TARGET_POSITION, d04Id)) { |
| | | // //比较最早一片任务的版图id及版序 求出卧转立的线路 |
| | | // Integer line = getStartLine(); |
| | | // //计算任务表进片格子 发送进片任务 |
| | | // computeTargetByLine(line); |
| | | // } else if (computeIsRun(Const.A09_OUT_TARGET_POSITION, d01Id)) { |
| | | // computeTargetByLine(Const.A09_OUT_TARGET_POSITION); |
| | | // } else if (computeIsRun(Const.A10_OUT_TARGET_POSITION, d04Id)) { |
| | | // computeTargetByLine(Const.A10_OUT_TARGET_POSITION); |
| | | // } else { |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // } else { |
| | | // //,或者仅有一条有玻璃 |
| | | // //一条线为空,一条线有进片请求有玻璃 |
| | | // int outLine = StringUtils.isBlank(d01Id) ? Const.A09_OUT_TARGET_POSITION : Const.A10_OUT_TARGET_POSITION; |
| | | // //获取进片请求玻璃为空的,计算任务表进片格子 发送进片任务 |
| | | // computeTargetByLine(outLine); |
| | | // } |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // } |
| | | // |
| | | // // @Scheduled(fixedDelay = 10000) |
| | | // public void plcToHomeEdgOutTask() { |
| | | // Date startDate = new Date(); |
| | | // log.info("大理片笼空车进片任务开始执行时间:{}", startDate); |
| | | // PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject; |
| | | // String e02State = plcMesObject.getPlcParameter("E02State").getValue(); |
| | | // if (REQUEST_WORD.equals(e02State)) { |
| | | // log.info("出片忙碌,结束出片任务"); |
| | | // return; |
| | | // } |
| | | // String mesToPLCAddress = plcMesObject.getPlcParameter("MESToPLC").getAddress(); |
| | | // List<BigStorageCageOutTask> outingList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>() |
| | | // .eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_NEW)); |
| | | // if (CollectionUtils.isNotEmpty(outingList)) { |
| | | // log.info("有正在执行出片的任务,结束当前出片线程"); |
| | | // return; |
| | | // } |
| | | // if (redisUtil.getCacheObject("temperingSwitch")) { |
| | | // //是否有正在钢化的玻璃 |
| | | // List<TemperingGlassInfo> temperingGlassInfoList = temperingGlassInfoService.selectJoinList(TemperingGlassInfo.class, new MPJLambdaWrapper<TemperingGlassInfo>() |
| | | // .selectAll(TemperingGlassInfo.class) |
| | | // .leftJoin(BigStorageCageOutTask.class, BigStorageCageOutTask::getGlassId, TemperingGlassInfo::getGlassId) |
| | | // .eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW) |
| | | // .isNull(BigStorageCageOutTask::getGlassId) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, TemperingGlassInfo::getTemperingFeedSequence)); |
| | | // if (CollectionUtils.isNotEmpty(temperingGlassInfoList)) { |
| | | // log.info("有正在出片的钢化任务"); |
| | | // computeOutMoreGlassInfo(temperingGlassInfoList, Boolean.TRUE, mesToPLCAddress); |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // //是否有人工下片任务 有直接出 |
| | | //// List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | //// .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL).orderByDesc(BigStorageCageDetails::getWidth)); |
| | | // List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL) |
| | | // .orderByAsc(BigStorageCageDetails::getSlot) |
| | | // .orderByDesc(BigStorageCageDetails::getId)); |
| | | // if (CollectionUtils.isNotEmpty(artificialList)) { |
| | | // computeOutMoreGlassInfo(artificialList, Boolean.FALSE, mesToPLCAddress); |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // //钢化优先:获取理片笼 玻璃小片 破损表 数量 判断笼内版图是否到齐 |
| | | // List<TemperingLayoutDTO> temperingLayoutDTOList = bigStorageCageDetailsService.temperingIsAll(); |
| | | // if (CollectionUtils.isNotEmpty(temperingLayoutDTOList)) { |
| | | // //玻璃到齐包括已出片的 |
| | | // //到齐,将玻璃小片数据存入钢化小片表,逻辑生成出片任务 结束 |
| | | // for (TemperingLayoutDTO item : temperingLayoutDTOList) { |
| | | // if (redisUtil.getCacheObject("temperingengineerId").equals(item.getEngineerId())) { |
| | | // List<TemperingGlassInfo> temperingGlassInfos = glassInfoService.selectJoinList(TemperingGlassInfo.class, JoinWrappers.lambda(GlassInfo.class) |
| | | // .selectAll(GlassInfo.class) |
| | | // .select("-1 as state") |
| | | // .selectAs(BigStorageCageDetails::getSlot, TemperingGlassInfo::getSlot) |
| | | // .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId) |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | // .eq(GlassInfo::getTemperingLayoutId, item.getTemperingLayoutId()) |
| | | // .eq(GlassInfo::getEngineerId, item.getEngineerId()) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence)); |
| | | // if (CollectionUtils.isNotEmpty(temperingGlassInfos)) { |
| | | // temperingGlassInfoService.saveBatch(temperingGlassInfos); |
| | | // computeOutMoreGlassInfo(temperingGlassInfoList, Boolean.TRUE, mesToPLCAddress); |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // //执行内部调度任务 |
| | | // List<TemperingLayoutDTO> temperingOccupySlotList = bigStorageCageDetailsService.queryTemperingOccupySlot(); |
| | | // if (CollectionUtils.isNotEmpty(temperingOccupySlotList)) { |
| | | // loop: |
| | | // for (TemperingLayoutDTO temperingOccupySlot : temperingOccupySlotList) { |
| | | // List<SlotSequenceDTO> slotSequenceList = bigStorageCageDetailsService.queryGlassMaxAndMin(temperingOccupySlot.getEngineerId(), temperingOccupySlot.getTemperingLayoutId()); |
| | | // for (int i = 0; i < slotSequenceList.size() - 1; i++) { |
| | | // SlotSequenceDTO first = slotSequenceList.get(i); |
| | | // SlotSequenceDTO second = slotSequenceList.get(i + 1); |
| | | // int slotWidth = carWidth - first.getRemainWidth() - glassGap; |
| | | // if (first.getMinSequence() == second.getMaxSequence() + 1 |
| | | // && second.getRemainWidth() > slotWidth && slotWidth >= 0) { |
| | | // List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getSlot, first.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence)); |
| | | // if (CollectionUtils.isNotEmpty(list)) { |
| | | // List<BigStorageCageOutTask> outTasks = new ArrayList<>(); |
| | | // int serialNumber = 1; |
| | | // for (BigStorageCageDetails item : list) { |
| | | // outTasks.add(new BigStorageCageOutTask(item.getGlassId(), first.getSlot(), second.getSlot(), |
| | | // item.getWidth() * 10, item.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date())); |
| | | // } |
| | | // //新增调度任务 |
| | | // bigStorageCageOutTaskService.saveBatch(outTasks); |
| | | // //更新理片笼详情表调度的后的玻璃位置信息:生成任务后先将玻璃格子位置进行调整,玻璃状态改为调度中,新增调度完成任务,处理调度完成后玻璃状态改为100. |
| | | // List<String> glassList = list.stream().map(BigStorageCageDetails::getGlassId).collect(Collectors.toList()); |
| | | // bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>().set(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING) |
| | | // .set(BigStorageCageBaseInfo::getSlot, second.getSlot()).in(BigStorageCageDetails::getGlassId, glassList)); |
| | | // //两次更新笼子的剩余尺寸:第一次防止有玻璃继续进调度后的笼子,第二次更新:计算格子的实际尺寸 |
| | | // // 仅更新调度后的格子信息:起始格子完成后更新:防止调度出片过程中有新玻璃进入, |
| | | // updateSlotRemainBySlots(Arrays.asList(second.getSlot())); |
| | | // break loop; |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | //// //向plc写入确认字 |
| | | //// int returnData = 0; |
| | | //// int count = 1; |
| | | //// while (returnData == 0) { |
| | | //// log.info("已向plc第{}次送协议", count); |
| | | //// S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1); |
| | | //// returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0); |
| | | //// log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, mesToPLCAddress, returnData); |
| | | //// } |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // } |
| | | // |
| | | // // @Scheduled(fixedDelay = 300) |
| | | // public void updateInGlassStateTask() { |
| | | // Date startDate = new Date(); |
| | | // log.info("1、大理片笼进片完成后更新大理片笼数据任务开始执行时间:{}", startDate); |
| | | // //因为大理片笼和出片任务是两个库的数据,所以要分开查找 |
| | | // List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW)); |
| | | // if (CollectionUtils.isNotEmpty(list)) { |
| | | // log.info("2、获取所有正在进片的玻璃信息id:{}", list); |
| | | // List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList()); |
| | | // List<BigStorageCageFeedTask> inSuccessGlass = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .in(BigStorageCageFeedTask::getGlassId, glassIds) |
| | | // .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT)); |
| | | // if (CollectionUtils.isNotEmpty(inSuccessGlass)) { |
| | | // log.info("3、获取进片已完成的玻璃信息id:{}", inSuccessGlass); |
| | | // List<Integer> inSuccessGlassSlot = inSuccessGlass.stream().map(BigStorageCageFeedTask::getTargetSlot).collect(Collectors.toList()); |
| | | // List<UpdateBigStorageCageDTO> storageCageDTOList = inSuccessGlass.stream().map(e -> { |
| | | // UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); |
| | | // BeanUtils.copyProperties(e, storageCageDTO); |
| | | // return storageCageDTO; |
| | | // }).collect(Collectors.toList()); |
| | | // bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN); |
| | | // log.info("4、大理片笼进片状态已完成已完成的玻璃信息id:{}", inSuccessGlass); |
| | | // //更新理片笼玻璃尺寸 |
| | | // updateSlotRemainBySlots(inSuccessGlassSlot); |
| | | // log.info("5、大理片笼进片目标格子尺寸更新完成"); |
| | | // } |
| | | // |
| | | // } |
| | | // Date endDate = new Date(); |
| | | // log.info("end:大理片笼进片完成后更新大理片笼数据任务结束时间:{},共耗时:{}ms,结束任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // |
| | | // } |
| | | // |
| | | // // @Scheduled(fixedDelay = 300) |
| | | // public void updateOutGlassStateTask() { |
| | | // Date startDate = new Date(); |
| | | // log.info("1、大理片笼出片完成后更新大理片笼数据任务开始执行时间:{}", startDate); |
| | | // //因为大理片笼和出片任务是两个库的数据,所以要分开查找 |
| | | // List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING)); |
| | | // if (CollectionUtils.isNotEmpty(list)) { |
| | | // log.info("2、获取所有正在出片的玻璃信息id:{}", list); |
| | | // List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList()); |
| | | // List<BigStorageCageOutTask> outSuccessGlass = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>() |
| | | // .in(BigStorageCageOutTask::getGlassId, glassIds).in(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_ALL)); |
| | | // if (CollectionUtils.isNotEmpty(outSuccessGlass)) { |
| | | // for (BigStorageCageOutTask bigStorageCageOutTask : outSuccessGlass |
| | | // ) { |
| | | // if (bigStorageCageOutTask.getEndSlot().equals(Const.ARTIFICIAL_OUT_TARGET_POSITION)) { |
| | | // temperingGlassInfoService.update( |
| | | // new LambdaUpdateWrapper<TemperingGlassInfo>() |
| | | // .set(TemperingGlassInfo::getState, Const.TEMPERING_END) |
| | | // .eq(TemperingGlassInfo::getGlassId, bigStorageCageOutTask.getGlassId()) |
| | | // ); |
| | | // } |
| | | // } |
| | | // log.info("3、获取出片已完成的玻璃信息id:{}", outSuccessGlass); |
| | | // List<UpdateBigStorageCageDTO> storageCageDTOList = outSuccessGlass.stream().map(e -> { |
| | | // UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); |
| | | // storageCageDTO.setGlassId(e.getGlassId()); |
| | | // storageCageDTO.setTargetSlot(e.getStartSlot()); |
| | | // return storageCageDTO; |
| | | // }).collect(Collectors.toList()); |
| | | // bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_OUT); |
| | | // List<Integer> outSuccessSlotList = outSuccessGlass.stream().map(BigStorageCageOutTask::getStartSlot).collect(Collectors.toList()); |
| | | // log.info("4、大理片笼出片状态已完成已完成的玻璃信息id:{}", outSuccessGlass); |
| | | // //更新理片笼玻璃尺寸 |
| | | // updateSlotRemainBySlots(outSuccessSlotList); |
| | | // log.info("5、大理片笼进片目标格子尺寸更新完成"); |
| | | // } |
| | | // } |
| | | // Date endDate = new Date(); |
| | | // log.info("end:大理片笼出片完成后更新大理片笼数据任务结束时间:{},共耗时:{}ms,结束任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // |
| | | // } |
| | | // |
| | | // // @Scheduled(fixedDelay = 300) |
| | | // public void updateScheduleGlassStateTask() { |
| | | // Date startDate = new Date(); |
| | | // log.info("1、大理片笼调度完成后更新大理片笼数据任务开始执行时间:{}", startDate); |
| | | // //因为大理片笼和调度任务是两个库的数据,所以要分开查找 |
| | | // List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING)); |
| | | // if (CollectionUtils.isNotEmpty(list)) { |
| | | // log.info("2、获取所有正在出片的玻璃信息id:{}", list); |
| | | // List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList()); |
| | | // List<BigStorageCageOutTask> scheduleSuccessGlass = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>() |
| | | // .in(BigStorageCageOutTask::getGlassId, glassIds).eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_SUCCESS) |
| | | // .notIn(BigStorageCageOutTask::getEndSlot, Const.TEMPERING_OUT_TARGET_POSITION, Const.ARTIFICIAL_OUT_TARGET_POSITION)); |
| | | // if (CollectionUtils.isNotEmpty(scheduleSuccessGlass)) { |
| | | // log.info("3、获取调度已完成的玻璃信息id:{}", scheduleSuccessGlass); |
| | | // List<UpdateBigStorageCageDTO> storageCageDTOList = scheduleSuccessGlass.stream().map(e -> { |
| | | // UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); |
| | | // storageCageDTO.setGlassId(e.getGlassId()); |
| | | // storageCageDTO.setTargetSlot(e.getEndSlot()); |
| | | // return storageCageDTO; |
| | | // }).collect(Collectors.toList()); |
| | | // bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN); |
| | | // List<String> scheduleSuccessGlassIds = scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | // log.info("4、大理片笼出片状态已完成已完成的玻璃信息id:{}", scheduleSuccessGlassIds); |
| | | // //更新理片笼玻璃尺寸 |
| | | // List<Integer> slotList = scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getStartSlot).distinct().collect(Collectors.toList()); |
| | | // slotList.addAll(scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getEndSlot).distinct().collect(Collectors.toList())); |
| | | // updateSlotRemainBySlots(slotList); |
| | | // log.info("5、大理片笼进片目标格子尺寸更新完成"); |
| | | // } |
| | | // } |
| | | // Date endDate = new Date(); |
| | | // log.info("end:大理片笼出片完成后更新大理片笼数据任务结束时间:{},共耗时:{}ms,结束任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // |
| | | // } |
| | | // |
| | | // /** |
| | | // * 处理破损表任务 |
| | | // */ |
| | | //// @Scheduled(fixedDelay = 300) |
| | | // public void dealDamageTask() { |
| | | // Date startDate = new Date(); |
| | | // log.info("大理片笼破损玻璃清除任务开始执行时间:{}", startDate); |
| | | // //获取进片任务表中状态为破损的数据 |
| | | // List<BigStorageCageFeedTask> inDamageTaskInfoList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .in(BigStorageCageFeedTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); |
| | | // if (CollectionUtils.isNotEmpty(inDamageTaskInfoList)) { |
| | | // log.info("获取进片任务表中破损的玻璃信息{}", inDamageTaskInfoList); |
| | | // bigStorageCageFeedTaskService.remove(new LambdaQueryWrapper<BigStorageCageFeedTask>().in(BigStorageCageFeedTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); |
| | | // //理片笼详情表数据状态更新 |
| | | // bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW).in(BigStorageCageDetails::getGlassId, inDamageTaskInfoList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()))); |
| | | // //将破损信息新增入破损表 |
| | | // List<Integer> slotList = new ArrayList<>(); |
| | | // for (BigStorageCageFeedTask bigStorageCageFeedTask : inDamageTaskInfoList) { |
| | | // Damage damage = new Damage(); |
| | | // damage.setGlassId(bigStorageCageFeedTask.getGlassId()); |
| | | // damage.setLine(bigStorageCageFeedTask.getLine()); |
| | | // damage.setWorkingProcedure("磨边"); |
| | | // damage.setRemark("进笼前卧转立"); |
| | | // damage.setStatus(1); |
| | | // damage.setType(bigStorageCageFeedTask.getTaskState()); |
| | | // damageService.insertDamage(damage); |
| | | // slotList.add(bigStorageCageFeedTask.getTargetSlot()); |
| | | // } |
| | | // //更新格子剩余宽度 |
| | | // updateSlotRemainBySlots(slotList); |
| | | // log.info("进片任务执行完成"); |
| | | // } |
| | | // //获取出片任务表中状态为破损的数据 |
| | | // List<BigStorageCageOutTask> outDamageTaskInfoList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>() |
| | | // .in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); |
| | | // if (CollectionUtils.isNotEmpty(outDamageTaskInfoList)) { |
| | | // log.info("获取出片任务表中破损的玻璃信息{}", outDamageTaskInfoList); |
| | | // bigStorageCageOutTaskService.remove(new LambdaQueryWrapper<BigStorageCageOutTask>().in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); |
| | | // List<String> glassIdList = outDamageTaskInfoList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | // //移除钢化下片表数据 |
| | | // temperingGlassInfoService.remove(new LambdaQueryWrapper<TemperingGlassInfo>().in(TemperingGlassInfo::getGlassId, glassIdList)); |
| | | // //理片笼详情表数据状态删除 |
| | | // bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>().in(BigStorageCageDetails::getGlassId, glassIdList)); |
| | | // //将破损信息新增入破损表 |
| | | // List<Integer> slotList = new ArrayList<>(); |
| | | // for (BigStorageCageOutTask bigStorageCageOutTask : outDamageTaskInfoList) { |
| | | // Damage damage = new Damage(); |
| | | // damage.setGlassId(bigStorageCageOutTask.getGlassId()); |
| | | // damage.setLine(bigStorageCageOutTask.getEndSlot()); |
| | | // damage.setWorkingProcedure("钢化"); |
| | | // damage.setRemark("出片后卧转立"); |
| | | // damage.setStatus(1); |
| | | // damage.setType(bigStorageCageOutTask.getTaskState()); |
| | | // damageService.insertDamage(damage); |
| | | // slotList.add(bigStorageCageOutTask.getStartSlot()); |
| | | // } |
| | | // //更新格子剩余宽度 |
| | | // updateSlotRemainBySlots(slotList); |
| | | // log.info("出片任务执行完成"); |
| | | // } |
| | | // Date endDate = new Date(); |
| | | // log.info("大理片笼破损玻璃清除任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); |
| | | // return; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 确认字清空 |
| | | // */ |
| | | //// @Scheduled(fixedDelay = 300) |
| | | // public void confirmClear() { |
| | | // PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | // String d01ToMES = plcParameterObject.getPlcParameter("D01ToMES").getValue(); |
| | | // String d04ToMES = plcParameterObject.getPlcParameter("D04ToMES").getValue(); |
| | | // String mesD01Address = plcParameterObject.getPlcParameter("MESToD01").getAddress(); |
| | | // String mesD04Address = plcParameterObject.getPlcParameter("MESToD04").getAddress(); |
| | | //// String d03ToMES = plcParameterObject.getPlcParameter("D03ToMES").getValue(); |
| | | //// String d05ToMES = plcParameterObject.getPlcParameter("D05ToMES").getValue(); |
| | | // String d03ToMES = plcParameterObject.getPlcParameter("D03Request").getValue(); |
| | | // String d05ToMES = plcParameterObject.getPlcParameter("D05Request").getValue(); |
| | | // String mesD03Address = plcParameterObject.getPlcParameter("MESToD03").getAddress(); |
| | | // String mesD05Address = plcParameterObject.getPlcParameter("MESToD05").getAddress(); |
| | | // if (!REQUEST_WORD.equals(d01ToMES)) { |
| | | // log.info("地址:{}写入0", mesD01Address); |
| | | // S7object.getinstance().plccontrol.writeWord(mesD01Address, 0); |
| | | // } |
| | | // if (!REQUEST_WORD.equals(d04ToMES)) { |
| | | // log.info("地址:{}写入0", mesD04Address); |
| | | // S7object.getinstance().plccontrol.writeWord(mesD04Address, 0); |
| | | // } |
| | | // if (!REQUEST_WORD.equals(d03ToMES)) { |
| | | // log.info("地址:{}写入0", mesD03Address); |
| | | // S7object.getinstance().plccontrol.writeWord(mesD03Address, 0); |
| | | // } |
| | | // if (!REQUEST_WORD.equals(d05ToMES)) { |
| | | // log.info("地址:{}写入0", mesD05Address); |
| | | // S7object.getinstance().plccontrol.writeWord(mesD05Address, 0); |
| | | // } |
| | | // } |
| | | // |
| | | // /** |
| | | // * 进片状态修改 |
| | | // */ |
| | | //// @Scheduled(fixedDelay = 300) |
| | | // public void feedStatusUpdate() { |
| | | // PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | // String mesD03Address = plcParameterObject.getPlcParameter("MESToD03").getAddress(); |
| | | // String mesD05Address = plcParameterObject.getPlcParameter("MESToD05").getAddress(); |
| | | // List<String> glassIds1 = new ArrayList<>(); |
| | | // List<String> glassIds2 = new ArrayList<>(); |
| | | // for (int i = 1; i <= 6; i++) { |
| | | // String line1GlassId = plcParameterObject.getPlcParameter("D03ID" + i).getValue(); |
| | | // if (StringUtils.isNotEmpty(line1GlassId)) { |
| | | // glassIds1.add(line1GlassId); |
| | | // } |
| | | // String line2GlassId = plcParameterObject.getPlcParameter("D05ID" + i).getValue(); |
| | | // if (StringUtils.isNotEmpty(line2GlassId)) { |
| | | // glassIds2.add(line2GlassId); |
| | | // } |
| | | // } |
| | | // List<BigStorageCageFeedTask> bigStorageCageFeedTasks1 = bigStorageCageFeedTaskService.list( |
| | | // new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_NEW) |
| | | // .eq(BigStorageCageFeedTask::getLine, Const.A09_OUT_TARGET_POSITION) |
| | | // ); |
| | | // List<BigStorageCageFeedTask> bigStorageCageFeedTasks2 = bigStorageCageFeedTaskService.list( |
| | | // new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_NEW) |
| | | // .eq(BigStorageCageFeedTask::getLine, Const.A10_OUT_TARGET_POSITION) |
| | | // ); |
| | | // if (CollectionUtils.isNotEmpty(bigStorageCageFeedTasks1) && CollectionUtils.isNotEmpty(glassIds1)) { |
| | | // List<String> matchingIds1 = bigStorageCageFeedTasks1.stream() |
| | | // .map(BigStorageCageFeedTask::getGlassId) |
| | | // .filter(glassIds1::contains) |
| | | // .distinct() |
| | | // .collect(Collectors.toList()); |
| | | // log.info("D3id{},匹配id:{}", glassIds1, matchingIds1); |
| | | // if (CollectionUtils.isNotEmpty(matchingIds1)) { |
| | | // bigStorageCageFeedTaskService.update( |
| | | // new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | // .in(BigStorageCageFeedTask::getGlassId, matchingIds1) |
| | | // .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | // .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | // ); |
| | | // } |
| | | // } |
| | | // if (CollectionUtils.isNotEmpty(bigStorageCageFeedTasks2) && CollectionUtils.isNotEmpty(glassIds2)) { |
| | | // List<String> matchingIds2 = bigStorageCageFeedTasks2.stream() |
| | | // .map(BigStorageCageFeedTask::getGlassId) |
| | | // .filter(glassIds2::contains) |
| | | // .distinct() |
| | | // .collect(Collectors.toList()); |
| | | // log.info("D5id{},匹配id:{}", glassIds2, matchingIds2); |
| | | // if (CollectionUtils.isNotEmpty(matchingIds2)) { |
| | | // bigStorageCageFeedTaskService.update( |
| | | // new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | // .in(BigStorageCageFeedTask::getGlassId, matchingIds2) |
| | | // .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | // .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | // ); |
| | | // } |
| | | // } |
| | | // if (CollectionUtils.isEmpty(glassIds1)) { |
| | | // S7object.getinstance().plccontrol.writeWord(mesD03Address, 0); |
| | | // log.info("{}线修改玻璃状态为3", Const.A09_OUT_TARGET_POSITION); |
| | | // bigStorageCageFeedTaskService.update( |
| | | // new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | // .eq(BigStorageCageFeedTask::getLine, Const.A09_OUT_TARGET_POSITION) |
| | | // .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | // .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | // .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | // .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_CAR) |
| | | // ); |
| | | // } |
| | | // if (CollectionUtils.isEmpty(glassIds2)) { |
| | | // S7object.getinstance().plccontrol.writeWord(mesD05Address, 0); |
| | | // log.info("{}线修改玻璃状态为3", Const.A10_OUT_TARGET_POSITION); |
| | | // bigStorageCageFeedTaskService.update( |
| | | // new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | // .eq(BigStorageCageFeedTask::getLine, Const.A10_OUT_TARGET_POSITION) |
| | | // .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | // .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | // .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | // .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_CAR) |
| | | // ); |
| | | // } |
| | | // } |
| | | // |
| | | // /** |
| | | // * 按照玻璃id判断玻璃状态及卧转立是否可直接启动 |
| | | // */ |
| | | // public Boolean judgeGlassTypeStatus(String glassId, Integer line, String mesAddress) { |
| | | // //判断此玻璃是在笼内或已生成进片任务 |
| | | // BigStorageCageFeedTask bigStorageCageFeedTask = bigStorageCageFeedTaskService.getOne( |
| | | // new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | // .eq(BigStorageCageFeedTask::getGlassId, glassId) |
| | | // ); |
| | | // BigStorageCageDetails bigStorageCageDetails = bigStorageCageDetailsService.getOne( |
| | | // new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getGlassId, glassId) |
| | | // .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | // ); |
| | | // if (bigStorageCageFeedTask != null || bigStorageCageDetails != null) { |
| | | // log.info("此玻璃存任务或已在笼内"); |
| | | // return Boolean.TRUE; |
| | | // } |
| | | // //1、获取任务表中相邻玻璃 |
| | | // List<EdgGlassTaskInfo> edgGlassTaskInfoList; |
| | | // edgGlassTaskInfoList = edgGlassTaskInfoService.list(new LambdaQueryWrapper<EdgGlassTaskInfo>() |
| | | // .eq(EdgGlassTaskInfo::getLine, line) |
| | | // .apply("time >= (select time from edg_glass_task_info where line='" + line + "' and glass_id = '" + glassId + "' and deleted = 0)") |
| | | // .orderByAsc(EdgGlassTaskInfo::getCreateTime)); |
| | | // if (edgGlassTaskInfoList.size() == 0) { |
| | | // edgGlassTaskInfoList = edgGlassTaskInfoService.list(new QueryWrapper<EdgGlassTaskInfo>() |
| | | // .select("Top 1 *") |
| | | // .eq("glass_id", glassId) |
| | | // ); |
| | | // log.info("在尺寸表中获取玻璃信息{}", edgGlassTaskInfoList); |
| | | // if (edgGlassTaskInfoList.size() == 0) { |
| | | // GlassInfo glassInfo = glassInfoService.getOne( |
| | | // new LambdaQueryWrapper<GlassInfo>() |
| | | // .eq(GlassInfo::getGlassId, glassId) |
| | | // ); |
| | | // EdgGlassTaskInfo edgGlassTaskInfo = new EdgGlassTaskInfo(); |
| | | // BeanUtils.copyProperties(glassInfo, edgGlassTaskInfo); |
| | | // edgGlassTaskInfo.setWidth((int) glassInfo.getWidth()); |
| | | // edgGlassTaskInfo.setHeight((int) glassInfo.getHeight()); |
| | | // edgGlassTaskInfoList.add(edgGlassTaskInfo); |
| | | // log.info("在玻璃信息表中获取玻璃信息{}", edgGlassTaskInfoList); |
| | | // } |
| | | // } |
| | | // Assert.isFalse(CollectionUtils.isEmpty(edgGlassTaskInfoList), "识别玻璃信息未出现在尺寸表中,获取相邻两块玻璃失败"); |
| | | // //2、获取卧转立剩余宽度 |
| | | // BigStorageDTO sitToUpRemainWidth = bigStorageCageFeedTaskService.querySitToUpRemainWidth(line); |
| | | // Integer remainWidth; |
| | | // Integer glassCount; |
| | | // if (0 == sitToUpRemainWidth.getGlassCount()) { |
| | | // remainWidth = carWidth; |
| | | // glassCount = 0; |
| | | // } else { |
| | | // remainWidth = sitToUpRemainWidth.getWidth(); |
| | | // glassCount = sitToUpRemainWidth.getGlassCount(); |
| | | // } |
| | | // |
| | | // Boolean flag = Boolean.TRUE; |
| | | // //2、获取卧转立 |
| | | // Integer widthFirst = Math.max(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10); |
| | | // Integer heightFirst = Math.min(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10); |
| | | // if (edgGlassTaskInfoList.size() == 1) { |
| | | // if (remainWidth >= widthFirst) { |
| | | // if (glassCount < inCarMaxSize) { |
| | | // addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst); |
| | | // } else { |
| | | // if (glassCount < inCarMaxSize + 1) { |
| | | // addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | // } else { |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // } |
| | | // } else { |
| | | // flag = Boolean.FALSE; |
| | | // } |
| | | // } else { |
| | | // Integer widthSecond = Math.max(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10); |
| | | // Integer heightSecond = Math.min(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10); |
| | | // if (remainWidth >= widthFirst) { |
| | | // if (remainWidth - widthFirst - glassGap >= widthSecond) { |
| | | // if (glassCount < inCarMaxSize) { |
| | | // addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst); |
| | | // } else { |
| | | // if (glassCount < inCarMaxSize + 1) { |
| | | // addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | // } else { |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // } |
| | | // } else { |
| | | // if (glassCount < inCarMaxSize + 1) { |
| | | // addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | // } else { |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // } |
| | | // } else { |
| | | // flag = Boolean.FALSE; |
| | | // } |
| | | // } |
| | | // //向plc发送进片确认 |
| | | // if (flag) { |
| | | // //向plc写入确认字 |
| | | // PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | // int returnData = 1; |
| | | // int count = 1; |
| | | // while (returnData != 0) { |
| | | // S7object.getinstance().plccontrol.writeWord(mesAddress, 1); |
| | | // |
| | | // if (Const.A10_OUT_TARGET_POSITION.equals(line)) { |
| | | // returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D04ToMES").getValue()); |
| | | // } else { |
| | | // returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D01ToMES").getValue()); |
| | | // } |
| | | //// returnData = S7object.getinstance().plccontrol.readWord(mesAddress, 1).get(0); |
| | | // log.info("进卧转立第{}次发送确认字完成,地址为:{},写入的内容为{}", count++, mesAddress, 1); |
| | | // } |
| | | // } |
| | | // //记录无法放下玻璃,后续判断启动 |
| | | // return flag; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 添加任务信息 |
| | | // */ |
| | | // private Boolean addFeedTask(String glassId, Integer line, Integer taskType, Integer width, Integer height) { |
| | | // BigStorageCageFeedTask bigStorageCageFeedTask = new BigStorageCageFeedTask(); |
| | | // bigStorageCageFeedTask.setGlassId(glassId); |
| | | // bigStorageCageFeedTask.setTaskState(Const.BIG_STORAGE_IN_NEW); |
| | | // bigStorageCageFeedTask.setLine(line); |
| | | // bigStorageCageFeedTask.setTaskType(taskType); |
| | | // bigStorageCageFeedTask.setWidth(width); |
| | | // bigStorageCageFeedTask.setHeight(height); |
| | | // bigStorageCageFeedTask.setCreateTime(new Date()); |
| | | // //删除理片笼表拿走/破损数据数据 |
| | | // damageService.deleteByGlassId(glassId); |
| | | // Damage damage = new Damage(); |
| | | // damage.setGlassId(glassId); |
| | | // damage.setWorkingProcedure("磨边"); |
| | | // damage.setLine(line); |
| | | // damage.setType(1); |
| | | // damage.setRemark("进大理片"); |
| | | // damageService.insertDamage(damage); |
| | | // return bigStorageCageFeedTaskService.save(bigStorageCageFeedTask); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 获取需要启动的线路:两条线都可启动 获取第一片玻璃版图id最小 版序最大的线路 |
| | | // * |
| | | // * @return 需要启动的线路 |
| | | // */ |
| | | // public Integer getStartLine() { |
| | | // List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .inSql(BigStorageCageFeedTask::getId, "select min(id) from big_storage_cage_feed_task where task_state = 2" + |
| | | // "and (target_slot = 0 or target_slot is null) group by line")); |
| | | // Assert.isFalse(CollectionUtils.isEmpty(taskList), "卧转立两条线都没有玻璃进片任务"); |
| | | // Map<String, Integer> taskMap = taskList.stream().collect(Collectors.toMap(BigStorageCageFeedTask::getGlassId, |
| | | // BigStorageCageFeedTask::getLine)); |
| | | // GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | // .in(GlassInfo::getGlassId, taskMap.keySet()) |
| | | // .orderByAsc(GlassInfo::getTemperingLayoutId) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence) |
| | | // .last("limit 1")); |
| | | // return taskMap.get(glassInfo.getGlassId()); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 计算任务表进片线路的目标格子,并启动任务 |
| | | // */ |
| | | // public boolean computeTargetByLine(Integer line) { |
| | | // //1、获取任务表中的所有玻璃(指定线路且已经进卧转立完成) |
| | | // List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .eq(BigStorageCageFeedTask::getLine, line) |
| | | // .and(e -> e.isNull(BigStorageCageFeedTask::getTargetSlot).or().eq(BigStorageCageFeedTask::getTargetSlot, Const.OUT_TARGET_POSITION_ZERO)) |
| | | // .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP_ALL) |
| | | // .orderByAsc(BigStorageCageFeedTask::getId)); |
| | | // //2、去笼子内查找是否可以继续存放的笼子 |
| | | // List<String> glassIds = taskList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()); |
| | | // List<GlassInfo> glassInfos = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIds)); |
| | | // return computeIsTemperingTargetByLine(glassInfos, taskList, line); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 是否钢化玻璃进笼目标位置 |
| | | // * |
| | | // * @param glassInfos 当条线卧转立所有玻璃 |
| | | // * @param taskList 当条线卧转立所有任务 |
| | | // * @param line 任务是哪条线 |
| | | // */ |
| | | // private boolean computeIsTemperingTargetByLine(List<GlassInfo> glassInfos, List<BigStorageCageFeedTask> taskList, Integer line) { |
| | | // //1、将玻璃信息集合转为glassid为key的map |
| | | // Map<String, GlassInfo> glassInfoMap = glassInfos.stream() |
| | | // .collect(Collectors.toMap(GlassInfo::getGlassId, p -> p)); |
| | | // for (BigStorageCageFeedTask e : taskList) { |
| | | // GlassInfo info = glassInfoMap.get(e.getGlassId()); |
| | | // if (info == null) { |
| | | // continue; |
| | | // } |
| | | // BigStorageCageDetails cageDetails = new BigStorageCageDetails(); |
| | | // BeanUtils.copyProperties(info, cageDetails); |
| | | // //2、获取目标格子信息 |
| | | // BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info); |
| | | // //3、临时更新格子的剩余尺寸:防止相邻玻璃进同一格子造成剩余尺寸不足,玻璃越界的情况,任务完成后再次更新大理片笼表剩余宽度(按照笼内玻璃数量更新大理片笼剩余尺寸) |
| | | // bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap) |
| | | // .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot())); |
| | | // //4、更新进片任务表,目标格子及状态(状态改为2 电气扫到自行处理) 遇到问题:无法批量更新,批量更新无法走指定从库 |
| | | // e.setTargetSlot(bigStorageDTO.getSlot()); |
| | | // bigStorageCageFeedTaskService.updateById(e); |
| | | // |
| | | // //5、将进片信息存入大理片笼详情表 |
| | | // cageDetails.setSlot(bigStorageDTO.getSlot()); |
| | | // cageDetails.setState(Const.GLASS_STATE_NEW); |
| | | // cageDetails.setDeviceId(bigStorageDTO.getDeviceId()); |
| | | // cageDetails.setGap(glassGap); |
| | | // bigStorageCageDetailsService.save(cageDetails); |
| | | // |
| | | // } |
| | | // sendTaskListToPLC(taskList, line); |
| | | // return Boolean.TRUE; |
| | | // } |
| | | // |
| | | // private void sendTaskListToPLC(List<BigStorageCageFeedTask> taskList, Integer line) { |
| | | // log.info("送片任务发送进片玻璃信息"); |
| | | // S7control s7control = S7object.getinstance().plccontrol; |
| | | // PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject; |
| | | // String mesD03Address = plcMesObject.getPlcParameter("MESToD03").getAddress(); |
| | | // String mesD05Address = plcMesObject.getPlcParameter("MESToD05").getAddress(); |
| | | // String outLine = line.equals(Const.A09_OUT_TARGET_POSITION) ? mesD03Address : mesD05Address; |
| | | // List<String> returnData = new ArrayList<>(); |
| | | // |
| | | // for (int i = 1; i <= taskList.size(); i++) { |
| | | // s7control.writeWord(plcMesObject.getPlcParameter("StartAddToImport" + i).getAddress(), taskList.get(i - 1).getLine()); |
| | | // s7control.writeWord(plcMesObject.getPlcParameter("TargetAddToImport" + i).getAddress(), taskList.get(i - 1).getTargetSlot()); |
| | | // returnData.add(taskList.get(i - 1).getGlassId()); |
| | | // log.info("向plc发送第{}片玻璃已完成,起始位置是{},目标位置是", i, taskList.get(i - 1).getLine(), taskList.get(i - 1).getTargetSlot()); |
| | | // } |
| | | //// int returnData = 1; |
| | | // int count = 1; |
| | | // |
| | | // |
| | | // while (CollectionUtils.isNotEmpty(returnData)) { |
| | | // List<String> glassIds1 = new ArrayList<>(); |
| | | // List<String> glassIds2 = new ArrayList<>(); |
| | | // s7control.writeWord(outLine, 2); |
| | | // for (int i = 1; i <= 6; i++) { |
| | | // String line1GlassId = plcMesObject.getPlcParameter("D03ID" + i).getValue(); |
| | | // if (StringUtils.isNotEmpty(line1GlassId)) { |
| | | // glassIds1.add(line1GlassId); |
| | | // } |
| | | // String line2GlassId = plcMesObject.getPlcParameter("D05ID" + i).getValue(); |
| | | // if (StringUtils.isNotEmpty(line2GlassId)) { |
| | | // glassIds2.add(line2GlassId); |
| | | // } |
| | | // } |
| | | // if (line.equals(Const.A09_OUT_TARGET_POSITION)) { |
| | | //// returnData = Integer.parseInt(plcMesObject.getPlcParameter("D03ToMES").getValue()); |
| | | // returnData = s7control.readWord(plcMesObject.getPlcParameter("D03Request").getAddress(), 1).get(0); |
| | | // returnData = glassIds1; |
| | | // } else { |
| | | //// returnData = Integer.parseInt(plcMesObject.getPlcParameter("D05ToMES").getValue()); |
| | | // returnData = s7control.readWord(plcMesObject.getPlcParameter("D05Request").getAddress(), 1).get(0); |
| | | // returnData = glassIds2; |
| | | // } |
| | | //// returnData = s7control.readWord(outLine, 1).get(0); |
| | | // log.info("已向plc第{}次发送进片任务确认,地址为:{},写入的内容为{},读到的请求为{}", count++, outLine, 2,returnData); |
| | | // log.info("已向plc第{}次发送进片任务确认,地址为:{},写入的内容为{},读到的请求为{}", count++, outLine, 2, returnData); |
| | | // } |
| | | } |
| | | |
| | | /** |
| | | * 出片一次仅生成一车玻璃 |
| | | * |
| | | * @param list |
| | | * @param isTempering |
| | | * @param mesToPLCAddress |
| | | * @param <T> |
| | | * @return |
| | | */ |
| | | private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) { |
| | | //任务数据 获取车子存放玻璃最大数量 玻璃间隔 |
| | | List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>(); |
| | | //打车剩余尺寸 |
| | | Integer remainWidth = carWidth; |
| | | int maxX = 0; |
| | | for (T e : list) { |
| | | if (bigStorageCageOutTaskList.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) { |
| | | break; |
| | | } |
| | | remainWidth = remainWidth - Math.max((int) e.getWidth(), (int) e.getHeight()) - glassGap; |
| | | if (isTempering) { |
| | | int minLength = Math.min((int) e.getWidth(), (int) e.getHeight()); |
| | | if (maxX + minLength <= xMaxSize) { |
| | | bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | e.getWidth() * 10, e.getHeight() * 10, 0, 0, 1, new Date())); |
| | | // maxX = Math.max(maxX, e.getXCoordinate()); |
| | | } else { |
| | | break; |
| | | } |
| | | |
| | | } else { |
| | | bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION, |
| | | e.getWidth() * 10, e.getHeight(), 0, 0, 1, new Date())); |
| | | } |
| | | } |
| | | Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "未获取出片数据,结束出片任务"); |
| | | log.info("获取出片任务数据{}条,执行保存", bigStorageCageOutTaskList.size()); |
| | | bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList); |
| | | List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | log.info("将出片玻璃{}玻璃状态改为已出片", glassIds); |
| | | bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING) |
| | | .in(BigStorageCageDetails::getGlassId, glassIds)); |
| | | int returnData = 0; |
| | | int count = 1; |
| | | while (returnData == 0) { |
| | | S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1); |
| | | returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0); |
| | | log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, mesToPLCAddress, returnData); |
| | | } |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | /** |
| | | * 出片一次生成一炉玻璃 |
| | | * |
| | | * @param list |
| | | * @param isTempering |
| | | * @param mesToPLCAddress |
| | | * @param <T> |
| | | * @return |
| | | */ |
| | | public <T extends BigStorageCageBaseInfo> Boolean computeOutMoreGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) { |
| | | //任务数据 获取车子存放玻璃最大数量 玻璃间隔 |
| | | List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>(); |
| | | //打车剩余尺寸 |
| | | Integer remainWidth = carWidth; |
| | | int trainNumber = 1; |
| | | int serialNumber = 1; |
| | | int maxX = 0; |
| | | for (T e : list) { |
| | | int maxLength = Math.max((int) e.getWidth(), (int) e.getHeight()); |
| | | if (serialNumber > outCarMaxSize || maxLength > remainWidth) { |
| | | remainWidth = carWidth; |
| | | trainNumber = trainNumber + 1; |
| | | serialNumber = 1; |
| | | maxX = 0; |
| | | } |
| | | remainWidth = remainWidth - maxLength - glassGap; |
| | | if (isTempering) { |
| | | int minLength = Math.min((int) e.getWidth(), (int) e.getHeight()); |
| | | if (maxX + minLength <= xMaxSize) { |
| | | bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | e.getWidth() * 10, e.getHeight() * 10, trainNumber, serialNumber++, 1, new Date())); |
| | | // maxX = Math.max(maxX, e.getXCoordinate()); |
| | | } else { |
| | | remainWidth = carWidth - maxLength - glassGap; |
| | | trainNumber = trainNumber + 1; |
| | | serialNumber = 1; |
| | | // maxX = e.getXCoordinate(); |
| | | bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date())); |
| | | } |
| | | } else { |
| | | bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION, |
| | | e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date())); |
| | | } |
| | | } |
| | | Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "未获取出片数据,结束出片任务"); |
| | | log.info("获取出片任务数据{}条,执行保存", bigStorageCageOutTaskList.size()); |
| | | for (BigStorageCageOutTask bigStorageCageOutTask : bigStorageCageOutTaskList |
| | | ) { |
| | | bigStorageCageOutTaskService.save(bigStorageCageOutTask); |
| | | } |
| | | //// while (returnData != 0) { |
| | | //// s7control.writeWord(outLine, 2); |
| | | //// if (line.equals(Const.A09_OUT_TARGET_POSITION)) { |
| | | ////// returnData = Integer.parseInt(plcMesObject.getPlcParameter("D03ToMES").getValue()); |
| | | //// returnData = s7control.readWord(plcMesObject.getPlcParameter("D03Request").getAddress(), 1).get(0); |
| | | //// } else { |
| | | ////// returnData = Integer.parseInt(plcMesObject.getPlcParameter("D05ToMES").getValue()); |
| | | //// returnData = s7control.readWord(plcMesObject.getPlcParameter("D05Request").getAddress(), 1).get(0); |
| | | //// } |
| | | ////// returnData = s7control.readWord(outLine, 1).get(0); |
| | | //// log.info("已向plc第{}次发送进片任务确认,地址为:{},写入的内容为{},读到的请求为{}", count++, outLine, 2,returnData); |
| | | //// } |
| | | // } |
| | | // |
| | | // /** |
| | | // * 出片一次仅生成一车玻璃 |
| | | // * |
| | | // * @param list |
| | | // * @param isTempering |
| | | // * @param mesToPLCAddress |
| | | // * @param <T> |
| | | // * @return |
| | | // */ |
| | | // private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) { |
| | | // //任务数据 获取车子存放玻璃最大数量 玻璃间隔 |
| | | // List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>(); |
| | | // //打车剩余尺寸 |
| | | // Integer remainWidth = carWidth; |
| | | // int maxX = 0; |
| | | // for (T e : list) { |
| | | // if (bigStorageCageOutTaskList.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) { |
| | | // break; |
| | | // } |
| | | // remainWidth = remainWidth - Math.max((int) e.getWidth(), (int) e.getHeight()) - glassGap; |
| | | // if (isTempering) { |
| | | // int minLength = Math.min((int) e.getWidth(), (int) e.getHeight()); |
| | | // if (maxX + minLength <= xMaxSize) { |
| | | // bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | // e.getWidth() * 10, e.getHeight() * 10, 0, 0, 1, new Date())); |
| | | //// maxX = Math.max(maxX, e.getXCoordinate()); |
| | | // } else { |
| | | // break; |
| | | // } |
| | | // |
| | | // } else { |
| | | // bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION, |
| | | // e.getWidth() * 10, e.getHeight(), 0, 0, 1, new Date())); |
| | | // } |
| | | // } |
| | | // Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "未获取出片数据,结束出片任务"); |
| | | // log.info("获取出片任务数据{}条,执行保存", bigStorageCageOutTaskList.size()); |
| | | // bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList); |
| | | List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | log.info("将出片玻璃{}玻璃状态改为已出片", glassIds); |
| | | bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING) |
| | | .in(BigStorageCageDetails::getGlassId, glassIds) |
| | | .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT)); |
| | | // List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | // log.info("将出片玻璃{}玻璃状态改为已出片", glassIds); |
| | | // bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | // .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING) |
| | | // .in(BigStorageCageDetails::getGlassId, glassIds)); |
| | | // int returnData = 0; |
| | | // int count = 1; |
| | | // while (returnData == 0) { |
| | |
| | | // returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0); |
| | | // log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, mesToPLCAddress, returnData); |
| | | // } |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | public void updateSlotRemainBySlots(List<Integer> slotList) { |
| | | //获取格子内所有的玻璃信息 |
| | | List<BigStorageCageDetails> inSlotGlassList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .in(BigStorageCageDetails::getSlot, slotList).in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL)); |
| | | Map<Integer, Double> slotRemainMap = new HashMap<>(); |
| | | //是否存在有格子非空的玻璃 |
| | | if (CollectionUtils.isNotEmpty(inSlotGlassList)) { |
| | | //存在 将格子内的玻璃分别进行更新 |
| | | slotRemainMap = inSlotGlassList.stream() |
| | | .collect(Collectors.groupingBy(BigStorageCageDetails::getSlot, Collectors.summingDouble(item -> Math.max(item.getWidth(), item.getHeight()) + glassGap))); |
| | | slotRemainMap.forEach((e, v) -> { |
| | | double remainWidth = slotWidth - v >= 0 ? slotWidth - v : 0; |
| | | bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, remainWidth) |
| | | .eq(BigStorageCage::getSlot, e)); |
| | | }); |
| | | } |
| | | //过滤不存在玻璃的格子 将宽度重置为原始宽度5000 |
| | | Set<Integer> remainSlotList = slotRemainMap.keySet(); |
| | | slotList.removeAll(remainSlotList); |
| | | if (CollectionUtils.isNotEmpty(slotList)) { |
| | | bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth) |
| | | .in(BigStorageCage::getSlot, slotList)); |
| | | } |
| | | } |
| | | |
| | | public Boolean computeIsRun(int line, String glassId) { |
| | | //获取卧转立剩余宽度 |
| | | BigStorageDTO sitToUpRemainWidth = bigStorageCageFeedTaskService.querySitToUpRemainWidth(line); |
| | | if (sitToUpRemainWidth.getGlassCount() == 0) { |
| | | return Boolean.FALSE; |
| | | } |
| | | //获取玻璃信息 |
| | | GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId)); |
| | | return sitToUpRemainWidth.getWidth() < Math.max(glassInfo.getWidth(), glassInfo.getHeight()); |
| | | } |
| | | |
| | | } |
| | | // return Boolean.TRUE; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 出片一次生成一炉玻璃 |
| | | // * |
| | | // * @param list |
| | | // * @param isTempering |
| | | // * @param mesToPLCAddress |
| | | // * @param <T> |
| | | // * @return |
| | | // */ |
| | | // public <T extends BigStorageCageBaseInfo> Boolean computeOutMoreGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) { |
| | | // //任务数据 获取车子存放玻璃最大数量 玻璃间隔 |
| | | // List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>(); |
| | | // //打车剩余尺寸 |
| | | // Integer remainWidth = carWidth; |
| | | // int trainNumber = 1; |
| | | // int serialNumber = 1; |
| | | // int maxX = 0; |
| | | // for (T e : list) { |
| | | // int maxLength = Math.max((int) e.getWidth(), (int) e.getHeight()); |
| | | // if (serialNumber > outCarMaxSize || maxLength > remainWidth) { |
| | | // remainWidth = carWidth; |
| | | // trainNumber = trainNumber + 1; |
| | | // serialNumber = 1; |
| | | // maxX = 0; |
| | | // } |
| | | // remainWidth = remainWidth - maxLength - glassGap; |
| | | // if (isTempering) { |
| | | // int minLength = Math.min((int) e.getWidth(), (int) e.getHeight()); |
| | | // if (maxX + minLength <= xMaxSize) { |
| | | // bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | // e.getWidth() * 10, e.getHeight() * 10, trainNumber, serialNumber++, 1, new Date())); |
| | | //// maxX = Math.max(maxX, e.getXCoordinate()); |
| | | // } else { |
| | | // remainWidth = carWidth - maxLength - glassGap; |
| | | // trainNumber = trainNumber + 1; |
| | | // serialNumber = 1; |
| | | //// maxX = e.getXCoordinate(); |
| | | // bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | // e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date())); |
| | | // } |
| | | // } else { |
| | | // bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION, |
| | | // e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date())); |
| | | // } |
| | | // } |
| | | // Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "未获取出片数据,结束出片任务"); |
| | | // log.info("获取出片任务数据{}条,执行保存", bigStorageCageOutTaskList.size()); |
| | | // for (BigStorageCageOutTask bigStorageCageOutTask : bigStorageCageOutTaskList |
| | | // ) { |
| | | // bigStorageCageOutTaskService.save(bigStorageCageOutTask); |
| | | // } |
| | | //// bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList); |
| | | // List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | // log.info("将出片玻璃{}玻璃状态改为已出片", glassIds); |
| | | // bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | // .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING) |
| | | // .in(BigStorageCageDetails::getGlassId, glassIds) |
| | | // .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT)); |
| | | //// int returnData = 0; |
| | | //// int count = 1; |
| | | //// while (returnData == 0) { |
| | | //// S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1); |
| | | //// returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0); |
| | | //// log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, mesToPLCAddress, returnData); |
| | | //// } |
| | | // return Boolean.TRUE; |
| | | // } |
| | | // |
| | | // public void updateSlotRemainBySlots(List<Integer> slotList) { |
| | | // //获取格子内所有的玻璃信息 |
| | | // List<BigStorageCageDetails> inSlotGlassList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .in(BigStorageCageDetails::getSlot, slotList).in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL)); |
| | | // Map<Integer, Double> slotRemainMap = new HashMap<>(); |
| | | // //是否存在有格子非空的玻璃 |
| | | // if (CollectionUtils.isNotEmpty(inSlotGlassList)) { |
| | | // //存在 将格子内的玻璃分别进行更新 |
| | | // slotRemainMap = inSlotGlassList.stream() |
| | | // .collect(Collectors.groupingBy(BigStorageCageDetails::getSlot, Collectors.summingDouble(item -> Math.max(item.getWidth(), item.getHeight()) + glassGap))); |
| | | // slotRemainMap.forEach((e, v) -> { |
| | | // double remainWidth = slotWidth - v >= 0 ? slotWidth - v : 0; |
| | | // bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, remainWidth) |
| | | // .eq(BigStorageCage::getSlot, e)); |
| | | // }); |
| | | // } |
| | | // //过滤不存在玻璃的格子 将宽度重置为原始宽度5000 |
| | | // Set<Integer> remainSlotList = slotRemainMap.keySet(); |
| | | // slotList.removeAll(remainSlotList); |
| | | // if (CollectionUtils.isNotEmpty(slotList)) { |
| | | // bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth) |
| | | // .in(BigStorageCage::getSlot, slotList)); |
| | | // } |
| | | // } |
| | | // |
| | | // public Boolean computeIsRun(int line, String glassId) { |
| | | // //获取卧转立剩余宽度 |
| | | // BigStorageDTO sitToUpRemainWidth = bigStorageCageFeedTaskService.querySitToUpRemainWidth(line); |
| | | // if (sitToUpRemainWidth.getGlassCount() == 0) { |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // //获取玻璃信息 |
| | | // GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId)); |
| | | // return sitToUpRemainWidth.getWidth() < Math.max(glassInfo.getWidth(), glassInfo.getHeight()); |
| | | // } |
| | | // |
| | | //} |
| | |
| | | package com.mes.job.opccallback; |
| | | |
| | | import cn.hutool.core.lang.Assert; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | import com.github.yulichang.toolkit.JoinWrappers; |
| | | import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | import com.kangaroohy.milo.runner.subscription.SubscriptionCallback; |
| | | import com.mes.base.entity.BigStorageCageBaseInfo; |
| | | import com.mes.bigstorage.entity.BigStorageCage; |
| | | import com.mes.bigstorage.entity.BigStorageCageDetails; |
| | | import com.mes.bigstorage.entity.dto.BigStorageDTO; |
| | | import com.mes.bigstorage.entity.dto.SlotSequenceDTO; |
| | | import com.mes.bigstorage.entity.dto.TemperingLayoutDTO; |
| | | import com.mes.bigstorage.service.BigStorageCageDetailsService; |
| | | import com.mes.bigstorage.service.BigStorageCageService; |
| | | import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; |
| | | import com.mes.bigstoragetask.entity.BigStorageCageOutTask; |
| | | import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService; |
| | | import com.mes.bigstoragetask.service.BigStorageCageOutTaskService; |
| | | import com.mes.common.S7object; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.damage.entity.Damage; |
| | | import com.mes.damage.service.DamageService; |
| | | import com.mes.device.PlcParameterObject; |
| | | import com.mes.edgglasstask.entity.EdgGlassTaskInfo; |
| | | import com.mes.edgglasstask.service.EdgGlassTaskInfoService; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | import com.mes.tools.S7control; |
| | | import com.mes.utils.RedisUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @Author : zhoush |
| | | * @Date: 2024/10/28 21:22 |
| | | * @Description: |
| | | */ |
| | | @Service |
| | | @Slf4j |
| | | public class BigStorageStartCallback implements SubscriptionCallback { |
| | | |
| | | |
| | | @Resource |
| | | private BigStorageCageService bigStorageCageService; |
| | | @Resource |
| | | private BigStorageCageDetailsService bigStorageCageDetailsService; |
| | | @Resource |
| | | private GlassInfoService glassInfoService; |
| | | @Resource |
| | | private BigStorageCageFeedTaskService bigStorageCageFeedTaskService; |
| | | @Resource |
| | | private BigStorageCageOutTaskService bigStorageCageOutTaskService; |
| | | @Resource |
| | | private EdgGlassTaskInfoService edgGlassTaskInfoService; |
| | | @Resource |
| | | private TemperingGlassInfoService temperingGlassInfoService; |
| | | @Resource |
| | | private DamageService damageService; |
| | | |
| | | @Resource |
| | | private RedisUtil redisUtil; |
| | | |
| | | private static final String REQUEST_WORD = "1"; |
| | | |
| | | @Value("${mes.sequence.order}") |
| | | private boolean sequenceOrder; |
| | | |
| | | @Value("${mes.carWidth}") |
| | | private Integer carWidth; |
| | | |
| | | @Value("${mes.slotWidth}") |
| | | private Integer slotWidth; |
| | | |
| | | @Value("${mes.inCarMaxSize}") |
| | | private Integer inCarMaxSize; |
| | | |
| | | @Value("${mes.outCarMaxSize}") |
| | | private Integer outCarMaxSize; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | |
| | | @Value("${mes.xMaxSize}") |
| | | private Integer xMaxSize; |
| | | |
| | | |
| | | private String d01GlassId = ""; |
| | | private String d04GlassId = ""; |
| | | |
| | | @Override |
| | | public void onSubscribe(String identifier, Object value) { |
| | | //todo:获取任务列表 |
| | | String tableName = ""; |
| | | //todo:按照表明获取伍信息 |
| | | List<BigStorageCageFeedTask> tasks = new ArrayList<>(); |
| | | if (CollectionUtils.isEmpty(tasks)) { |
| | | log.info("卧转立上没有玻璃"); |
| | | //todo 与卧转立交互,将请求字大车请求变为0,确保订阅任务可再次执行 |
| | | return; |
| | | } |
| | | List<String> glassIds = tasks.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()); |
| | | List<GlassInfo> glassInfos = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIds)); |
| | | computeIsTemperingTargetByLine(glassInfos, tasks); |
| | | } |
| | | |
| | | |
| | | // @Scheduled(fixedDelay = 10000) |
| | | public void plcToHomeEdgOutTask() { |
| | | String mesToPLCAddress = ""; |
| | | List<BigStorageCageOutTask> outingList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>() |
| | | .eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_NEW)); |
| | | if (CollectionUtils.isNotEmpty(outingList)) { |
| | | log.info("有正在执行出片的任务,结束当前出片线程"); |
| | | return; |
| | | } |
| | | if (redisUtil.getCacheObject("temperingSwitch")) { |
| | | //是否有正在钢化的玻璃 |
| | | List<TemperingGlassInfo> temperingGlassInfoList = temperingGlassInfoService.selectJoinList(TemperingGlassInfo.class, new MPJLambdaWrapper<TemperingGlassInfo>() |
| | | .selectAll(TemperingGlassInfo.class) |
| | | .leftJoin(BigStorageCageOutTask.class, BigStorageCageOutTask::getGlassId, TemperingGlassInfo::getGlassId) |
| | | .eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW) |
| | | .isNull(BigStorageCageOutTask::getGlassId) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, TemperingGlassInfo::getTemperingFeedSequence)); |
| | | if (CollectionUtils.isNotEmpty(temperingGlassInfoList)) { |
| | | log.info("有正在出片的钢化任务"); |
| | | computeOutMoreGlassInfo(temperingGlassInfoList, Boolean.TRUE, mesToPLCAddress); |
| | | return; |
| | | } |
| | | //是否有人工下片任务 有直接出 |
| | | // List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL).orderByDesc(BigStorageCageDetails::getWidth)); |
| | | List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL) |
| | | .orderByAsc(BigStorageCageDetails::getSlot) |
| | | .orderByDesc(BigStorageCageDetails::getId)); |
| | | if (CollectionUtils.isNotEmpty(artificialList)) { |
| | | computeOutMoreGlassInfo(artificialList, Boolean.FALSE, mesToPLCAddress); |
| | | return; |
| | | } |
| | | //钢化优先:获取理片笼 玻璃小片 破损表 数量 判断笼内版图是否到齐 |
| | | List<TemperingLayoutDTO> temperingLayoutDTOList = bigStorageCageDetailsService.temperingIsAll(); |
| | | if (CollectionUtils.isNotEmpty(temperingLayoutDTOList)) { |
| | | //玻璃到齐包括已出片的 |
| | | //到齐,将玻璃小片数据存入钢化小片表,逻辑生成出片任务 结束 |
| | | for (TemperingLayoutDTO item : temperingLayoutDTOList) { |
| | | if (redisUtil.getCacheObject("temperingengineerId").equals(item.getEngineerId())) { |
| | | List<TemperingGlassInfo> temperingGlassInfos = glassInfoService.selectJoinList(TemperingGlassInfo.class, JoinWrappers.lambda(GlassInfo.class) |
| | | .selectAll(GlassInfo.class) |
| | | .select("-1 as state") |
| | | .selectAs(BigStorageCageDetails::getSlot, TemperingGlassInfo::getSlot) |
| | | .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId) |
| | | .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .eq(GlassInfo::getTemperingLayoutId, item.getTemperingLayoutId()) |
| | | .eq(GlassInfo::getEngineerId, item.getEngineerId()) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence)); |
| | | if (CollectionUtils.isNotEmpty(temperingGlassInfos)) { |
| | | temperingGlassInfoService.saveBatch(temperingGlassInfos); |
| | | computeOutMoreGlassInfo(temperingGlassInfoList, Boolean.TRUE, mesToPLCAddress); |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | //执行内部调度任务 |
| | | List<TemperingLayoutDTO> temperingOccupySlotList = bigStorageCageDetailsService.queryTemperingOccupySlot(); |
| | | if (CollectionUtils.isNotEmpty(temperingOccupySlotList)) { |
| | | loop: |
| | | for (TemperingLayoutDTO temperingOccupySlot : temperingOccupySlotList) { |
| | | List<SlotSequenceDTO> slotSequenceList = bigStorageCageDetailsService.queryGlassMaxAndMin(temperingOccupySlot.getEngineerId(), temperingOccupySlot.getTemperingLayoutId()); |
| | | for (int i = 0; i < slotSequenceList.size() - 1; i++) { |
| | | SlotSequenceDTO first = slotSequenceList.get(i); |
| | | SlotSequenceDTO second = slotSequenceList.get(i + 1); |
| | | int slotWidth = carWidth - first.getRemainWidth() - glassGap; |
| | | if (first.getMinSequence() == second.getMaxSequence() + 1 |
| | | && second.getRemainWidth() > slotWidth && slotWidth >= 0) { |
| | | List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getSlot, first.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence)); |
| | | if (CollectionUtils.isNotEmpty(list)) { |
| | | List<BigStorageCageOutTask> outTasks = new ArrayList<>(); |
| | | int serialNumber = 1; |
| | | for (BigStorageCageDetails item : list) { |
| | | outTasks.add(new BigStorageCageOutTask(item.getGlassId(), first.getSlot(), second.getSlot(), |
| | | item.getWidth() * 10, item.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date())); |
| | | } |
| | | //新增调度任务 |
| | | bigStorageCageOutTaskService.saveBatch(outTasks); |
| | | //更新理片笼详情表调度的后的玻璃位置信息:生成任务后先将玻璃格子位置进行调整,玻璃状态改为调度中,新增调度完成任务,处理调度完成后玻璃状态改为100. |
| | | List<String> glassList = list.stream().map(BigStorageCageDetails::getGlassId).collect(Collectors.toList()); |
| | | bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>().set(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING) |
| | | .set(BigStorageCageBaseInfo::getSlot, second.getSlot()).in(BigStorageCageDetails::getGlassId, glassList)); |
| | | //两次更新笼子的剩余尺寸:第一次防止有玻璃继续进调度后的笼子,第二次更新:计算格子的实际尺寸 |
| | | // 仅更新调度后的格子信息:起始格子完成后更新:防止调度出片过程中有新玻璃进入, |
| | | // todo:临时解决报错 |
| | | // updateSlotRemainBySlots(Arrays.asList(second.getSlot())); |
| | | break loop; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // //向plc写入确认字 |
| | | // int returnData = 0; |
| | | // int count = 1; |
| | | // while (returnData == 0) { |
| | | // log.info("已向plc第{}次送协议", count); |
| | | // S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1); |
| | | // returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0); |
| | | // log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, mesToPLCAddress, returnData); |
| | | //package com.mes.job.opccallback; |
| | | // |
| | | //import cn.hutool.core.lang.Assert; |
| | | //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | //import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | //import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | //import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | //import com.github.yulichang.toolkit.JoinWrappers; |
| | | //import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | //import com.kangaroohy.milo.runner.subscription.SubscriptionCallback; |
| | | //import com.mes.base.entity.BigStorageCageBaseInfo; |
| | | //import com.mes.bigstorage.entity.BigStorageCage; |
| | | //import com.mes.bigstorage.entity.BigStorageCageDetails; |
| | | //import com.mes.bigstorage.entity.dto.BigStorageDTO; |
| | | //import com.mes.bigstorage.entity.dto.SlotSequenceDTO; |
| | | //import com.mes.bigstorage.entity.dto.TemperingLayoutDTO; |
| | | //import com.mes.bigstorage.service.BigStorageCageDetailsService; |
| | | //import com.mes.bigstorage.service.BigStorageCageService; |
| | | //import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; |
| | | //import com.mes.bigstoragetask.entity.BigStorageCageOutTask; |
| | | //import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService; |
| | | //import com.mes.bigstoragetask.service.BigStorageCageOutTaskService; |
| | | //import com.mes.common.S7object; |
| | | //import com.mes.common.config.Const; |
| | | //import com.mes.damage.entity.Damage; |
| | | //import com.mes.damage.service.DamageService; |
| | | //import com.mes.device.PlcParameterObject; |
| | | //import com.mes.edgglasstask.entity.EdgGlassTaskInfo; |
| | | //import com.mes.edgglasstask.service.EdgGlassTaskInfoService; |
| | | //import com.mes.glassinfo.entity.GlassInfo; |
| | | //import com.mes.glassinfo.service.GlassInfoService; |
| | | //import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | //import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | //import com.mes.tools.S7control; |
| | | //import com.mes.utils.RedisUtil; |
| | | //import lombok.extern.slf4j.Slf4j; |
| | | //import org.apache.commons.lang.StringUtils; |
| | | //import org.springframework.beans.BeanUtils; |
| | | //import org.springframework.beans.factory.annotation.Value; |
| | | //import org.springframework.stereotype.Service; |
| | | // |
| | | //import javax.annotation.Resource; |
| | | //import java.util.ArrayList; |
| | | //import java.util.Date; |
| | | //import java.util.List; |
| | | //import java.util.Map; |
| | | //import java.util.stream.Collectors; |
| | | // |
| | | ///** |
| | | // * @Author : zhoush |
| | | // * @Date: 2024/10/28 21:22 |
| | | // * @Description: |
| | | // */ |
| | | //@Service |
| | | //@Slf4j |
| | | //public class BigStorageStartCallback implements SubscriptionCallback { |
| | | // |
| | | // |
| | | // @Resource |
| | | // private BigStorageCageService bigStorageCageService; |
| | | // @Resource |
| | | // private BigStorageCageDetailsService bigStorageCageDetailsService; |
| | | // @Resource |
| | | // private GlassInfoService glassInfoService; |
| | | // @Resource |
| | | // private BigStorageCageFeedTaskService bigStorageCageFeedTaskService; |
| | | // @Resource |
| | | // private BigStorageCageOutTaskService bigStorageCageOutTaskService; |
| | | // @Resource |
| | | // private EdgGlassTaskInfoService edgGlassTaskInfoService; |
| | | // @Resource |
| | | // private TemperingGlassInfoService temperingGlassInfoService; |
| | | // @Resource |
| | | // private DamageService damageService; |
| | | // |
| | | // @Resource |
| | | // private RedisUtil redisUtil; |
| | | // |
| | | // private static final String REQUEST_WORD = "1"; |
| | | // |
| | | // @Value("${mes.sequence.order}") |
| | | // private boolean sequenceOrder; |
| | | // |
| | | // @Value("${mes.carWidth}") |
| | | // private Integer carWidth; |
| | | // |
| | | // @Value("${mes.slotWidth}") |
| | | // private Integer slotWidth; |
| | | // |
| | | // @Value("${mes.inCarMaxSize}") |
| | | // private Integer inCarMaxSize; |
| | | // |
| | | // @Value("${mes.outCarMaxSize}") |
| | | // private Integer outCarMaxSize; |
| | | // |
| | | // @Value("${mes.glassGap}") |
| | | // private Integer glassGap; |
| | | // |
| | | // @Value("${mes.xMaxSize}") |
| | | // private Integer xMaxSize; |
| | | // |
| | | // |
| | | // private String d01GlassId = ""; |
| | | // private String d04GlassId = ""; |
| | | // |
| | | // @Override |
| | | // public void onSubscribe(String identifier, Object value) { |
| | | // //todo:获取任务列表 |
| | | // String tableName = ""; |
| | | // //todo:按照表明获取伍信息 |
| | | // List<BigStorageCageFeedTask> tasks = new ArrayList<>(); |
| | | // if (CollectionUtils.isEmpty(tasks)) { |
| | | // log.info("卧转立上没有玻璃"); |
| | | // //todo 与卧转立交互,将请求字大车请求变为0,确保订阅任务可再次执行 |
| | | // return; |
| | | // } |
| | | // List<String> glassIds = tasks.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()); |
| | | // List<GlassInfo> glassInfos = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIds)); |
| | | // computeIsTemperingTargetByLine(glassInfos, tasks); |
| | | // } |
| | | // |
| | | // |
| | | // // @Scheduled(fixedDelay = 10000) |
| | | // public void plcToHomeEdgOutTask() { |
| | | // String mesToPLCAddress = ""; |
| | | // List<BigStorageCageOutTask> outingList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>() |
| | | // .eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_NEW)); |
| | | // if (CollectionUtils.isNotEmpty(outingList)) { |
| | | // log.info("有正在执行出片的任务,结束当前出片线程"); |
| | | // return; |
| | | // } |
| | | // if (redisUtil.getCacheObject("temperingSwitch")) { |
| | | // //是否有正在钢化的玻璃 |
| | | // List<TemperingGlassInfo> temperingGlassInfoList = temperingGlassInfoService.selectJoinList(TemperingGlassInfo.class, new MPJLambdaWrapper<TemperingGlassInfo>() |
| | | // .selectAll(TemperingGlassInfo.class) |
| | | // .leftJoin(BigStorageCageOutTask.class, BigStorageCageOutTask::getGlassId, TemperingGlassInfo::getGlassId) |
| | | // .eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW) |
| | | // .isNull(BigStorageCageOutTask::getGlassId) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, TemperingGlassInfo::getTemperingFeedSequence)); |
| | | // if (CollectionUtils.isNotEmpty(temperingGlassInfoList)) { |
| | | // log.info("有正在出片的钢化任务"); |
| | | // computeOutMoreGlassInfo(temperingGlassInfoList, Boolean.TRUE, mesToPLCAddress); |
| | | // return; |
| | | // } |
| | | return; |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 确认字清空 |
| | | */ |
| | | // @Scheduled(fixedDelay = 300) |
| | | public void confirmClear() { |
| | | PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | String d01ToMES = plcParameterObject.getPlcParameter("D01ToMES").getValue(); |
| | | String d04ToMES = plcParameterObject.getPlcParameter("D04ToMES").getValue(); |
| | | String mesD01Address = plcParameterObject.getPlcParameter("MESToD01").getAddress(); |
| | | String mesD04Address = plcParameterObject.getPlcParameter("MESToD04").getAddress(); |
| | | String d03ToMES = plcParameterObject.getPlcParameter("D03ToMES").getValue(); |
| | | String d05ToMES = plcParameterObject.getPlcParameter("D05ToMES").getValue(); |
| | | String mesD03Address = plcParameterObject.getPlcParameter("MESToD03").getAddress(); |
| | | String mesD05Address = plcParameterObject.getPlcParameter("MESToD05").getAddress(); |
| | | if (!REQUEST_WORD.equals(d01ToMES)) { |
| | | S7object.getinstance().plccontrol.writeWord(mesD01Address, 0); |
| | | } |
| | | if (!REQUEST_WORD.equals(d04ToMES)) { |
| | | S7object.getinstance().plccontrol.writeWord(mesD04Address, 0); |
| | | } |
| | | if (!REQUEST_WORD.equals(d03ToMES)) { |
| | | S7object.getinstance().plccontrol.writeWord(mesD03Address, 0); |
| | | } |
| | | if (!REQUEST_WORD.equals(d05ToMES)) { |
| | | S7object.getinstance().plccontrol.writeWord(mesD05Address, 0); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 进片状态修改 |
| | | */ |
| | | // @Scheduled(fixedDelay = 300) |
| | | public void feedStatusUpdate() { |
| | | PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | List<String> glassIds1 = new ArrayList<>(); |
| | | List<String> glassIds2 = new ArrayList<>(); |
| | | for (int i = 1; i <= 6; i++) { |
| | | String line1GlassId = plcParameterObject.getPlcParameter("D03ID" + i).getValue(); |
| | | if (StringUtils.isNotEmpty(line1GlassId)) { |
| | | glassIds1.add(line1GlassId); |
| | | } |
| | | String line2GlassId = plcParameterObject.getPlcParameter("D05ID" + i).getValue(); |
| | | if (StringUtils.isNotEmpty(line2GlassId)) { |
| | | glassIds2.add(line2GlassId); |
| | | } |
| | | } |
| | | List<BigStorageCageFeedTask> bigStorageCageFeedTasks1 = bigStorageCageFeedTaskService.list( |
| | | new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_NEW) |
| | | .eq(BigStorageCageFeedTask::getLine, Const.A09_OUT_TARGET_POSITION) |
| | | ); |
| | | List<BigStorageCageFeedTask> bigStorageCageFeedTasks2 = bigStorageCageFeedTaskService.list( |
| | | new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_NEW) |
| | | .eq(BigStorageCageFeedTask::getLine, Const.A10_OUT_TARGET_POSITION) |
| | | ); |
| | | if (CollectionUtils.isNotEmpty(bigStorageCageFeedTasks1) && CollectionUtils.isNotEmpty(glassIds1)) { |
| | | List<String> matchingIds1 = bigStorageCageFeedTasks1.stream() |
| | | .map(BigStorageCageFeedTask::getGlassId) |
| | | .filter(glassIds1::contains) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | bigStorageCageFeedTaskService.update( |
| | | new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | .in(BigStorageCageFeedTask::getGlassId, matchingIds1) |
| | | .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | ); |
| | | } |
| | | if (CollectionUtils.isNotEmpty(bigStorageCageFeedTasks2) && CollectionUtils.isNotEmpty(glassIds2)) { |
| | | List<String> matchingIds2 = bigStorageCageFeedTasks2.stream() |
| | | .map(BigStorageCageFeedTask::getGlassId) |
| | | .filter(glassIds2::contains) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | bigStorageCageFeedTaskService.update( |
| | | new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | .in(BigStorageCageFeedTask::getGlassId, matchingIds2) |
| | | .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | ); |
| | | } |
| | | if (CollectionUtils.isEmpty(glassIds1)) { |
| | | bigStorageCageFeedTaskService.update( |
| | | new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | .eq(BigStorageCageFeedTask::getLine, Const.A09_OUT_TARGET_POSITION) |
| | | .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_CAR) |
| | | ); |
| | | } |
| | | if (CollectionUtils.isEmpty(glassIds2)) { |
| | | bigStorageCageFeedTaskService.update( |
| | | new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | .eq(BigStorageCageFeedTask::getLine, Const.A10_OUT_TARGET_POSITION) |
| | | .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_CAR) |
| | | ); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 按照玻璃id判断玻璃状态及卧转立是否可直接启动 |
| | | */ |
| | | public Boolean judgeGlassTypeStatus(String glassId, Integer line, String mesAddress) { |
| | | //判断此玻璃是在笼内或已生成进片任务 |
| | | BigStorageCageFeedTask bigStorageCageFeedTask = bigStorageCageFeedTaskService.getOne( |
| | | new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | .eq(BigStorageCageFeedTask::getGlassId, glassId) |
| | | ); |
| | | BigStorageCageDetails bigStorageCageDetails = bigStorageCageDetailsService.getOne( |
| | | new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .eq(BigStorageCageDetails::getGlassId, glassId) |
| | | .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | ); |
| | | if (bigStorageCageFeedTask != null || bigStorageCageDetails != null) { |
| | | log.info("此玻璃存任务或已在笼内"); |
| | | return Boolean.TRUE; |
| | | } |
| | | //1、获取任务表中相邻玻璃 |
| | | List<EdgGlassTaskInfo> edgGlassTaskInfoList; |
| | | edgGlassTaskInfoList = edgGlassTaskInfoService.list(new LambdaQueryWrapper<EdgGlassTaskInfo>() |
| | | .eq(EdgGlassTaskInfo::getLine, line) |
| | | .apply("time >= (select time from edg_glass_task_info where line='" + line + "' and glass_id = '" + glassId + "' and deleted = 0)") |
| | | .orderByAsc(EdgGlassTaskInfo::getCreateTime)); |
| | | if (edgGlassTaskInfoList.size() == 0) { |
| | | edgGlassTaskInfoList = edgGlassTaskInfoService.list(new QueryWrapper<EdgGlassTaskInfo>() |
| | | .select("Top 1 *") |
| | | .eq("glass_id", glassId) |
| | | ); |
| | | log.info("在尺寸表中获取玻璃信息{}", edgGlassTaskInfoList); |
| | | if (edgGlassTaskInfoList.size() == 0) { |
| | | GlassInfo glassInfo = glassInfoService.getOne( |
| | | new LambdaQueryWrapper<GlassInfo>() |
| | | .eq(GlassInfo::getGlassId, glassId) |
| | | ); |
| | | EdgGlassTaskInfo edgGlassTaskInfo = new EdgGlassTaskInfo(); |
| | | BeanUtils.copyProperties(glassInfo, edgGlassTaskInfo); |
| | | edgGlassTaskInfo.setWidth((int) glassInfo.getWidth()); |
| | | edgGlassTaskInfo.setHeight((int) glassInfo.getHeight()); |
| | | edgGlassTaskInfoList.add(edgGlassTaskInfo); |
| | | log.info("在玻璃信息表中获取玻璃信息{}", edgGlassTaskInfoList); |
| | | } |
| | | } |
| | | Assert.isFalse(CollectionUtils.isEmpty(edgGlassTaskInfoList), "识别玻璃信息未出现在尺寸表中,获取相邻两块玻璃失败"); |
| | | //2、获取卧转立剩余宽度 |
| | | BigStorageDTO sitToUpRemainWidth = bigStorageCageFeedTaskService.querySitToUpRemainWidth(line); |
| | | Integer remainWidth; |
| | | Integer glassCount; |
| | | if (0 == sitToUpRemainWidth.getGlassCount()) { |
| | | remainWidth = carWidth; |
| | | glassCount = 0; |
| | | } else { |
| | | remainWidth = sitToUpRemainWidth.getWidth(); |
| | | glassCount = sitToUpRemainWidth.getGlassCount(); |
| | | } |
| | | |
| | | Boolean flag = Boolean.TRUE; |
| | | //2、获取卧转立 |
| | | Integer widthFirst = Math.max(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10); |
| | | Integer heightFirst = Math.min(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10); |
| | | if (edgGlassTaskInfoList.size() == 1) { |
| | | if (remainWidth >= widthFirst) { |
| | | if (glassCount < inCarMaxSize) { |
| | | addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst); |
| | | } else { |
| | | if (glassCount < inCarMaxSize + 1) { |
| | | addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | } else { |
| | | return Boolean.FALSE; |
| | | } |
| | | } |
| | | } else { |
| | | flag = Boolean.FALSE; |
| | | } |
| | | } else { |
| | | Integer widthSecond = Math.max(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10); |
| | | Integer heightSecond = Math.min(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10); |
| | | if (remainWidth >= widthFirst) { |
| | | if (remainWidth - widthFirst - glassGap >= widthSecond) { |
| | | if (glassCount < inCarMaxSize) { |
| | | addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst); |
| | | } else { |
| | | if (glassCount < inCarMaxSize + 1) { |
| | | addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | } else { |
| | | return Boolean.FALSE; |
| | | } |
| | | } |
| | | } else { |
| | | if (glassCount < inCarMaxSize + 1) { |
| | | addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | } else { |
| | | return Boolean.FALSE; |
| | | } |
| | | } |
| | | } else { |
| | | flag = Boolean.FALSE; |
| | | } |
| | | } |
| | | //向plc发送进片确认 |
| | | if (flag) { |
| | | //向plc写入确认字 |
| | | PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | int returnData = 1; |
| | | int count = 1; |
| | | while (returnData != 0) { |
| | | S7object.getinstance().plccontrol.writeWord(mesAddress, 1); |
| | | |
| | | if (Const.A10_OUT_TARGET_POSITION.equals(line)) { |
| | | returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D04ToMES").getValue()); |
| | | } else { |
| | | returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D01ToMES").getValue()); |
| | | } |
| | | // returnData = S7object.getinstance().plccontrol.readWord(mesAddress, 1).get(0); |
| | | log.info("进卧转立第{}次发送确认字完成,地址为:{},写入的内容为{}", count++, mesAddress, 1); |
| | | } |
| | | } |
| | | //记录无法放下玻璃,后续判断启动 |
| | | return flag; |
| | | } |
| | | |
| | | /** |
| | | * 添加任务信息 |
| | | */ |
| | | private Boolean addFeedTask(String glassId, Integer line, Integer taskType, Integer width, Integer height) { |
| | | BigStorageCageFeedTask bigStorageCageFeedTask = new BigStorageCageFeedTask(); |
| | | bigStorageCageFeedTask.setGlassId(glassId); |
| | | bigStorageCageFeedTask.setTaskState(Const.BIG_STORAGE_IN_NEW); |
| | | bigStorageCageFeedTask.setLine(line); |
| | | bigStorageCageFeedTask.setTaskType(taskType); |
| | | bigStorageCageFeedTask.setWidth(width); |
| | | bigStorageCageFeedTask.setHeight(height); |
| | | bigStorageCageFeedTask.setCreateTime(new Date()); |
| | | //删除理片笼表拿走/破损数据数据 |
| | | damageService.deleteByGlassId(glassId); |
| | | Damage damage = new Damage(); |
| | | damage.setGlassId(glassId); |
| | | damage.setWorkingProcedure("磨边"); |
| | | damage.setLine(line); |
| | | damage.setType(1); |
| | | damage.setRemark("进大理片"); |
| | | damageService.insertDamage(damage); |
| | | return bigStorageCageFeedTaskService.save(bigStorageCageFeedTask); |
| | | } |
| | | |
| | | /** |
| | | * 获取需要启动的线路:两条线都可启动 获取第一片玻璃版图id最小 版序最大的线路 |
| | | * |
| | | * @return 需要启动的线路 |
| | | */ |
| | | public Integer getStartLine() { |
| | | List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .inSql(BigStorageCageFeedTask::getId, "select min(id) from big_storage_cage_feed_task where task_state = 2" + |
| | | "and (target_slot = 0 or target_slot is null) group by line")); |
| | | Assert.isFalse(CollectionUtils.isEmpty(taskList), "卧转立两条线都没有玻璃进片任务"); |
| | | Map<String, Integer> taskMap = taskList.stream().collect(Collectors.toMap(BigStorageCageFeedTask::getGlassId, |
| | | BigStorageCageFeedTask::getLine)); |
| | | GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | .in(GlassInfo::getGlassId, taskMap.keySet()) |
| | | .orderByAsc(GlassInfo::getTemperingLayoutId) |
| | | .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence) |
| | | .last("limit 1")); |
| | | return taskMap.get(glassInfo.getGlassId()); |
| | | } |
| | | |
| | | /** |
| | | * 计算任务表进片线路的目标格子,并启动任务 |
| | | */ |
| | | public boolean computeTargetByLine(Integer line) { |
| | | //1、获取任务表中的所有玻璃(指定线路且已经进卧转立完成) |
| | | List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | .eq(BigStorageCageFeedTask::getLine, line) |
| | | .and(e -> e.isNull(BigStorageCageFeedTask::getTargetSlot).or().eq(BigStorageCageFeedTask::getTargetSlot, Const.OUT_TARGET_POSITION_ZERO)) |
| | | .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP_ALL) |
| | | .orderByAsc(BigStorageCageFeedTask::getId)); |
| | | //2、去笼子内查找是否可以继续存放的笼子 |
| | | List<String> glassIds = taskList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()); |
| | | List<GlassInfo> glassInfos = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIds)); |
| | | return computeIsTemperingTargetByLine(glassInfos, taskList); |
| | | } |
| | | |
| | | /** |
| | | * 是否钢化玻璃进笼目标位置 |
| | | * |
| | | * @param glassInfos 当条线卧转立所有玻璃 |
| | | * @param taskList 当条线卧转立所有任务 |
| | | */ |
| | | private boolean computeIsTemperingTargetByLine(List<GlassInfo> glassInfos, List<BigStorageCageFeedTask> taskList) { |
| | | //1、将玻璃信息集合转为glassid为key的map |
| | | Map<String, GlassInfo> glassInfoMap = glassInfos.stream() |
| | | .collect(Collectors.toMap(GlassInfo::getGlassId, p -> p)); |
| | | for (BigStorageCageFeedTask e : taskList) { |
| | | GlassInfo info = glassInfoMap.get(e.getGlassId()); |
| | | if (info == null) { |
| | | continue; |
| | | } |
| | | BigStorageCageDetails cageDetails = new BigStorageCageDetails(); |
| | | BeanUtils.copyProperties(info, cageDetails); |
| | | //todo:2、获取目标格子信息 |
| | | BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info); |
| | | //3、临时更新格子的剩余尺寸:防止相邻玻璃进同一格子造成剩余尺寸不足,玻璃越界的情况,任务完成后再次更新大理片笼表剩余宽度(按照笼内玻璃数量更新大理片笼剩余尺寸) |
| | | bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap) |
| | | .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot())); |
| | | //4、更新进片任务表,目标格子及状态(状态改为2 电气扫到自行处理) 遇到问题:无法批量更新,批量更新无法走指定从库 |
| | | e.setTargetSlot(bigStorageDTO.getSlot()); |
| | | bigStorageCageFeedTaskService.updateById(e); |
| | | |
| | | //5、将进片信息存入大理片笼详情表 |
| | | cageDetails.setSlot(bigStorageDTO.getSlot()); |
| | | cageDetails.setState(Const.GLASS_STATE_NEW); |
| | | cageDetails.setDeviceId(bigStorageDTO.getDeviceId()); |
| | | cageDetails.setGap(glassGap); |
| | | bigStorageCageDetailsService.save(cageDetails); |
| | | |
| | | } |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | private void sendTaskListToPLC(List<BigStorageCageFeedTask> taskList, Integer line) { |
| | | log.info("送片任务发送进片玻璃信息"); |
| | | S7control s7control = S7object.getinstance().plccontrol; |
| | | PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject; |
| | | String mesD03Address = plcMesObject.getPlcParameter("MESToD03").getAddress(); |
| | | String mesD05Address = plcMesObject.getPlcParameter("MESToD05").getAddress(); |
| | | String outLine = line.equals(Const.A09_OUT_TARGET_POSITION) ? mesD03Address : mesD05Address; |
| | | for (int i = 1; i <= taskList.size(); i++) { |
| | | s7control.writeWord(plcMesObject.getPlcParameter("StartAddToImport" + i).getAddress(), taskList.get(i - 1).getLine()); |
| | | s7control.writeWord(plcMesObject.getPlcParameter("TargetAddToImport" + i).getAddress(), taskList.get(i - 1).getTargetSlot()); |
| | | log.info("向plc发送第{}片玻璃已完成,起始位置是{},目标位置是", i, taskList.get(i - 1).getLine(), taskList.get(i - 1).getTargetSlot()); |
| | | } |
| | | int returnData = 1; |
| | | int count = 1; |
| | | while (returnData != 0) { |
| | | s7control.writeWord(outLine, 2); |
| | | if (line.equals(Const.A09_OUT_TARGET_POSITION)) { |
| | | returnData = Integer.parseInt(plcMesObject.getPlcParameter("D03ToMES").getValue()); |
| | | } else { |
| | | returnData = Integer.parseInt(plcMesObject.getPlcParameter("D05ToMES").getValue()); |
| | | } |
| | | // returnData = s7control.readWord(outLine, 1).get(0); |
| | | log.info("已向plc第{}次发送进片任务确认,地址为:{},写入的内容为{}", count++, outLine, 2); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 出片一次仅生成一车玻璃 |
| | | * |
| | | * @param list |
| | | * @param isTempering |
| | | * @param mesToPLCAddress |
| | | * @param <T> |
| | | * @return |
| | | */ |
| | | private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) { |
| | | //任务数据 获取车子存放玻璃最大数量 玻璃间隔 |
| | | List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>(); |
| | | //打车剩余尺寸 |
| | | Integer remainWidth = carWidth; |
| | | int maxX = 0; |
| | | for (T e : list) { |
| | | if (bigStorageCageOutTaskList.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) { |
| | | break; |
| | | } |
| | | remainWidth = remainWidth - Math.max((int) e.getWidth(), (int) e.getHeight()) - glassGap; |
| | | if (isTempering) { |
| | | int minLength = Math.min((int) e.getWidth(), (int) e.getHeight()); |
| | | if (maxX + minLength <= xMaxSize) { |
| | | bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | e.getWidth() * 10, e.getHeight() * 10, 0, 0, 1, new Date())); |
| | | // maxX = Math.max(maxX, e.getXCoordinate()); |
| | | } else { |
| | | break; |
| | | } |
| | | |
| | | } else { |
| | | bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION, |
| | | e.getWidth() * 10, e.getHeight(), 0, 0, 1, new Date())); |
| | | } |
| | | } |
| | | Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "未获取出片数据,结束出片任务"); |
| | | log.info("获取出片任务数据{}条,执行保存", bigStorageCageOutTaskList.size()); |
| | | bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList); |
| | | List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | log.info("将出片玻璃{}玻璃状态改为已出片", glassIds); |
| | | bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING) |
| | | .in(BigStorageCageDetails::getGlassId, glassIds)); |
| | | int returnData = 0; |
| | | int count = 1; |
| | | while (returnData == 0) { |
| | | S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1); |
| | | returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0); |
| | | log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, mesToPLCAddress, returnData); |
| | | } |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | /** |
| | | * 出片一次生成一炉玻璃 |
| | | * |
| | | * @param list |
| | | * @param isTempering |
| | | * @param mesToPLCAddress |
| | | * @param <T> |
| | | * @return |
| | | */ |
| | | public <T extends BigStorageCageBaseInfo> Boolean computeOutMoreGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) { |
| | | //任务数据 获取车子存放玻璃最大数量 玻璃间隔 |
| | | List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>(); |
| | | //打车剩余尺寸 |
| | | Integer remainWidth = carWidth; |
| | | int trainNumber = 1; |
| | | int serialNumber = 1; |
| | | int maxX = 0; |
| | | for (T e : list) { |
| | | int maxLength = Math.max((int) e.getWidth(), (int) e.getHeight()); |
| | | if (serialNumber > outCarMaxSize || maxLength > remainWidth) { |
| | | remainWidth = carWidth; |
| | | trainNumber = trainNumber + 1; |
| | | serialNumber = 1; |
| | | maxX = 0; |
| | | } |
| | | remainWidth = remainWidth - maxLength - glassGap; |
| | | if (isTempering) { |
| | | int minLength = Math.min((int) e.getWidth(), (int) e.getHeight()); |
| | | if (maxX + minLength <= xMaxSize) { |
| | | bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | e.getWidth() * 10, e.getHeight() * 10, trainNumber, serialNumber++, 1, new Date())); |
| | | // maxX = Math.max(maxX, e.getXCoordinate()); |
| | | } else { |
| | | remainWidth = carWidth - maxLength - glassGap; |
| | | trainNumber = trainNumber + 1; |
| | | serialNumber = 1; |
| | | // maxX = e.getXCoordinate(); |
| | | bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date())); |
| | | } |
| | | } else { |
| | | bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION, |
| | | e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date())); |
| | | } |
| | | } |
| | | Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "未获取出片数据,结束出片任务"); |
| | | log.info("获取出片任务数据{}条,执行保存", bigStorageCageOutTaskList.size()); |
| | | for (BigStorageCageOutTask bigStorageCageOutTask : bigStorageCageOutTaskList |
| | | ) { |
| | | bigStorageCageOutTaskService.save(bigStorageCageOutTask); |
| | | } |
| | | // //是否有人工下片任务 有直接出 |
| | | //// List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | //// .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL).orderByDesc(BigStorageCageDetails::getWidth)); |
| | | // List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL) |
| | | // .orderByAsc(BigStorageCageDetails::getSlot) |
| | | // .orderByDesc(BigStorageCageDetails::getId)); |
| | | // if (CollectionUtils.isNotEmpty(artificialList)) { |
| | | // computeOutMoreGlassInfo(artificialList, Boolean.FALSE, mesToPLCAddress); |
| | | // return; |
| | | // } |
| | | // //钢化优先:获取理片笼 玻璃小片 破损表 数量 判断笼内版图是否到齐 |
| | | // List<TemperingLayoutDTO> temperingLayoutDTOList = bigStorageCageDetailsService.temperingIsAll(); |
| | | // if (CollectionUtils.isNotEmpty(temperingLayoutDTOList)) { |
| | | // //玻璃到齐包括已出片的 |
| | | // //到齐,将玻璃小片数据存入钢化小片表,逻辑生成出片任务 结束 |
| | | // for (TemperingLayoutDTO item : temperingLayoutDTOList) { |
| | | // if (redisUtil.getCacheObject("temperingengineerId").equals(item.getEngineerId())) { |
| | | // List<TemperingGlassInfo> temperingGlassInfos = glassInfoService.selectJoinList(TemperingGlassInfo.class, JoinWrappers.lambda(GlassInfo.class) |
| | | // .selectAll(GlassInfo.class) |
| | | // .select("-1 as state") |
| | | // .selectAs(BigStorageCageDetails::getSlot, TemperingGlassInfo::getSlot) |
| | | // .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId) |
| | | // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | // .eq(GlassInfo::getTemperingLayoutId, item.getTemperingLayoutId()) |
| | | // .eq(GlassInfo::getEngineerId, item.getEngineerId()) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence)); |
| | | // if (CollectionUtils.isNotEmpty(temperingGlassInfos)) { |
| | | // temperingGlassInfoService.saveBatch(temperingGlassInfos); |
| | | // computeOutMoreGlassInfo(temperingGlassInfoList, Boolean.TRUE, mesToPLCAddress); |
| | | // return; |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // //执行内部调度任务 |
| | | // List<TemperingLayoutDTO> temperingOccupySlotList = bigStorageCageDetailsService.queryTemperingOccupySlot(); |
| | | // if (CollectionUtils.isNotEmpty(temperingOccupySlotList)) { |
| | | // loop: |
| | | // for (TemperingLayoutDTO temperingOccupySlot : temperingOccupySlotList) { |
| | | // List<SlotSequenceDTO> slotSequenceList = bigStorageCageDetailsService.queryGlassMaxAndMin(temperingOccupySlot.getEngineerId(), temperingOccupySlot.getTemperingLayoutId()); |
| | | // for (int i = 0; i < slotSequenceList.size() - 1; i++) { |
| | | // SlotSequenceDTO first = slotSequenceList.get(i); |
| | | // SlotSequenceDTO second = slotSequenceList.get(i + 1); |
| | | // int slotWidth = carWidth - first.getRemainWidth() - glassGap; |
| | | // if (first.getMinSequence() == second.getMaxSequence() + 1 |
| | | // && second.getRemainWidth() > slotWidth && slotWidth >= 0) { |
| | | // List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getSlot, first.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence)); |
| | | // if (CollectionUtils.isNotEmpty(list)) { |
| | | // List<BigStorageCageOutTask> outTasks = new ArrayList<>(); |
| | | // int serialNumber = 1; |
| | | // for (BigStorageCageDetails item : list) { |
| | | // outTasks.add(new BigStorageCageOutTask(item.getGlassId(), first.getSlot(), second.getSlot(), |
| | | // item.getWidth() * 10, item.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date())); |
| | | // } |
| | | // //新增调度任务 |
| | | // bigStorageCageOutTaskService.saveBatch(outTasks); |
| | | // //更新理片笼详情表调度的后的玻璃位置信息:生成任务后先将玻璃格子位置进行调整,玻璃状态改为调度中,新增调度完成任务,处理调度完成后玻璃状态改为100. |
| | | // List<String> glassList = list.stream().map(BigStorageCageDetails::getGlassId).collect(Collectors.toList()); |
| | | // bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>().set(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING) |
| | | // .set(BigStorageCageBaseInfo::getSlot, second.getSlot()).in(BigStorageCageDetails::getGlassId, glassList)); |
| | | // //两次更新笼子的剩余尺寸:第一次防止有玻璃继续进调度后的笼子,第二次更新:计算格子的实际尺寸 |
| | | // // 仅更新调度后的格子信息:起始格子完成后更新:防止调度出片过程中有新玻璃进入, |
| | | //// todo:临时解决报错 |
| | | //// updateSlotRemainBySlots(Arrays.asList(second.getSlot())); |
| | | // break loop; |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | //// //向plc写入确认字 |
| | | //// int returnData = 0; |
| | | //// int count = 1; |
| | | //// while (returnData == 0) { |
| | | //// log.info("已向plc第{}次送协议", count); |
| | | //// S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1); |
| | | //// returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0); |
| | | //// log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, mesToPLCAddress, returnData); |
| | | //// } |
| | | // return; |
| | | // } |
| | | // } |
| | | // |
| | | // |
| | | // /** |
| | | // * 确认字清空 |
| | | // */ |
| | | //// @Scheduled(fixedDelay = 300) |
| | | // public void confirmClear() { |
| | | // PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | // String d01ToMES = plcParameterObject.getPlcParameter("D01ToMES").getValue(); |
| | | // String d04ToMES = plcParameterObject.getPlcParameter("D04ToMES").getValue(); |
| | | // String mesD01Address = plcParameterObject.getPlcParameter("MESToD01").getAddress(); |
| | | // String mesD04Address = plcParameterObject.getPlcParameter("MESToD04").getAddress(); |
| | | // String d03ToMES = plcParameterObject.getPlcParameter("D03ToMES").getValue(); |
| | | // String d05ToMES = plcParameterObject.getPlcParameter("D05ToMES").getValue(); |
| | | // String mesD03Address = plcParameterObject.getPlcParameter("MESToD03").getAddress(); |
| | | // String mesD05Address = plcParameterObject.getPlcParameter("MESToD05").getAddress(); |
| | | // if (!REQUEST_WORD.equals(d01ToMES)) { |
| | | // S7object.getinstance().plccontrol.writeWord(mesD01Address, 0); |
| | | // } |
| | | // if (!REQUEST_WORD.equals(d04ToMES)) { |
| | | // S7object.getinstance().plccontrol.writeWord(mesD04Address, 0); |
| | | // } |
| | | // if (!REQUEST_WORD.equals(d03ToMES)) { |
| | | // S7object.getinstance().plccontrol.writeWord(mesD03Address, 0); |
| | | // } |
| | | // if (!REQUEST_WORD.equals(d05ToMES)) { |
| | | // S7object.getinstance().plccontrol.writeWord(mesD05Address, 0); |
| | | // } |
| | | // } |
| | | // |
| | | // /** |
| | | // * 进片状态修改 |
| | | // */ |
| | | //// @Scheduled(fixedDelay = 300) |
| | | // public void feedStatusUpdate() { |
| | | // PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | // List<String> glassIds1 = new ArrayList<>(); |
| | | // List<String> glassIds2 = new ArrayList<>(); |
| | | // for (int i = 1; i <= 6; i++) { |
| | | // String line1GlassId = plcParameterObject.getPlcParameter("D03ID" + i).getValue(); |
| | | // if (StringUtils.isNotEmpty(line1GlassId)) { |
| | | // glassIds1.add(line1GlassId); |
| | | // } |
| | | // String line2GlassId = plcParameterObject.getPlcParameter("D05ID" + i).getValue(); |
| | | // if (StringUtils.isNotEmpty(line2GlassId)) { |
| | | // glassIds2.add(line2GlassId); |
| | | // } |
| | | // } |
| | | // List<BigStorageCageFeedTask> bigStorageCageFeedTasks1 = bigStorageCageFeedTaskService.list( |
| | | // new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_NEW) |
| | | // .eq(BigStorageCageFeedTask::getLine, Const.A09_OUT_TARGET_POSITION) |
| | | // ); |
| | | // List<BigStorageCageFeedTask> bigStorageCageFeedTasks2 = bigStorageCageFeedTaskService.list( |
| | | // new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_NEW) |
| | | // .eq(BigStorageCageFeedTask::getLine, Const.A10_OUT_TARGET_POSITION) |
| | | // ); |
| | | // if (CollectionUtils.isNotEmpty(bigStorageCageFeedTasks1) && CollectionUtils.isNotEmpty(glassIds1)) { |
| | | // List<String> matchingIds1 = bigStorageCageFeedTasks1.stream() |
| | | // .map(BigStorageCageFeedTask::getGlassId) |
| | | // .filter(glassIds1::contains) |
| | | // .distinct() |
| | | // .collect(Collectors.toList()); |
| | | // bigStorageCageFeedTaskService.update( |
| | | // new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | // .in(BigStorageCageFeedTask::getGlassId, matchingIds1) |
| | | // .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | // .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | // ); |
| | | // } |
| | | // if (CollectionUtils.isNotEmpty(bigStorageCageFeedTasks2) && CollectionUtils.isNotEmpty(glassIds2)) { |
| | | // List<String> matchingIds2 = bigStorageCageFeedTasks2.stream() |
| | | // .map(BigStorageCageFeedTask::getGlassId) |
| | | // .filter(glassIds2::contains) |
| | | // .distinct() |
| | | // .collect(Collectors.toList()); |
| | | // bigStorageCageFeedTaskService.update( |
| | | // new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | // .in(BigStorageCageFeedTask::getGlassId, matchingIds2) |
| | | // .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | // .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | // ); |
| | | // } |
| | | // if (CollectionUtils.isEmpty(glassIds1)) { |
| | | // bigStorageCageFeedTaskService.update( |
| | | // new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | // .eq(BigStorageCageFeedTask::getLine, Const.A09_OUT_TARGET_POSITION) |
| | | // .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | // .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | // .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | // .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_CAR) |
| | | // ); |
| | | // } |
| | | // if (CollectionUtils.isEmpty(glassIds2)) { |
| | | // bigStorageCageFeedTaskService.update( |
| | | // new LambdaUpdateWrapper<BigStorageCageFeedTask>() |
| | | // .eq(BigStorageCageFeedTask::getLine, Const.A10_OUT_TARGET_POSITION) |
| | | // .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP) |
| | | // .gt(BigStorageCageFeedTask::getTargetSlot, 0) |
| | | // .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | // .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_CAR) |
| | | // ); |
| | | // } |
| | | // } |
| | | // |
| | | // /** |
| | | // * 按照玻璃id判断玻璃状态及卧转立是否可直接启动 |
| | | // */ |
| | | // public Boolean judgeGlassTypeStatus(String glassId, Integer line, String mesAddress) { |
| | | // //判断此玻璃是在笼内或已生成进片任务 |
| | | // BigStorageCageFeedTask bigStorageCageFeedTask = bigStorageCageFeedTaskService.getOne( |
| | | // new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) |
| | | // .eq(BigStorageCageFeedTask::getGlassId, glassId) |
| | | // ); |
| | | // BigStorageCageDetails bigStorageCageDetails = bigStorageCageDetailsService.getOne( |
| | | // new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | // .eq(BigStorageCageDetails::getGlassId, glassId) |
| | | // .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) |
| | | // ); |
| | | // if (bigStorageCageFeedTask != null || bigStorageCageDetails != null) { |
| | | // log.info("此玻璃存任务或已在笼内"); |
| | | // return Boolean.TRUE; |
| | | // } |
| | | // //1、获取任务表中相邻玻璃 |
| | | // List<EdgGlassTaskInfo> edgGlassTaskInfoList; |
| | | // edgGlassTaskInfoList = edgGlassTaskInfoService.list(new LambdaQueryWrapper<EdgGlassTaskInfo>() |
| | | // .eq(EdgGlassTaskInfo::getLine, line) |
| | | // .apply("time >= (select time from edg_glass_task_info where line='" + line + "' and glass_id = '" + glassId + "' and deleted = 0)") |
| | | // .orderByAsc(EdgGlassTaskInfo::getCreateTime)); |
| | | // if (edgGlassTaskInfoList.size() == 0) { |
| | | // edgGlassTaskInfoList = edgGlassTaskInfoService.list(new QueryWrapper<EdgGlassTaskInfo>() |
| | | // .select("Top 1 *") |
| | | // .eq("glass_id", glassId) |
| | | // ); |
| | | // log.info("在尺寸表中获取玻璃信息{}", edgGlassTaskInfoList); |
| | | // if (edgGlassTaskInfoList.size() == 0) { |
| | | // GlassInfo glassInfo = glassInfoService.getOne( |
| | | // new LambdaQueryWrapper<GlassInfo>() |
| | | // .eq(GlassInfo::getGlassId, glassId) |
| | | // ); |
| | | // EdgGlassTaskInfo edgGlassTaskInfo = new EdgGlassTaskInfo(); |
| | | // BeanUtils.copyProperties(glassInfo, edgGlassTaskInfo); |
| | | // edgGlassTaskInfo.setWidth((int) glassInfo.getWidth()); |
| | | // edgGlassTaskInfo.setHeight((int) glassInfo.getHeight()); |
| | | // edgGlassTaskInfoList.add(edgGlassTaskInfo); |
| | | // log.info("在玻璃信息表中获取玻璃信息{}", edgGlassTaskInfoList); |
| | | // } |
| | | // } |
| | | // Assert.isFalse(CollectionUtils.isEmpty(edgGlassTaskInfoList), "识别玻璃信息未出现在尺寸表中,获取相邻两块玻璃失败"); |
| | | // //2、获取卧转立剩余宽度 |
| | | // BigStorageDTO sitToUpRemainWidth = bigStorageCageFeedTaskService.querySitToUpRemainWidth(line); |
| | | // Integer remainWidth; |
| | | // Integer glassCount; |
| | | // if (0 == sitToUpRemainWidth.getGlassCount()) { |
| | | // remainWidth = carWidth; |
| | | // glassCount = 0; |
| | | // } else { |
| | | // remainWidth = sitToUpRemainWidth.getWidth(); |
| | | // glassCount = sitToUpRemainWidth.getGlassCount(); |
| | | // } |
| | | // |
| | | // Boolean flag = Boolean.TRUE; |
| | | // //2、获取卧转立 |
| | | // Integer widthFirst = Math.max(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10); |
| | | // Integer heightFirst = Math.min(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10); |
| | | // if (edgGlassTaskInfoList.size() == 1) { |
| | | // if (remainWidth >= widthFirst) { |
| | | // if (glassCount < inCarMaxSize) { |
| | | // addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst); |
| | | // } else { |
| | | // if (glassCount < inCarMaxSize + 1) { |
| | | // addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | // } else { |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // } |
| | | // } else { |
| | | // flag = Boolean.FALSE; |
| | | // } |
| | | // } else { |
| | | // Integer widthSecond = Math.max(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10); |
| | | // Integer heightSecond = Math.min(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10); |
| | | // if (remainWidth >= widthFirst) { |
| | | // if (remainWidth - widthFirst - glassGap >= widthSecond) { |
| | | // if (glassCount < inCarMaxSize) { |
| | | // addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst); |
| | | // } else { |
| | | // if (glassCount < inCarMaxSize + 1) { |
| | | // addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | // } else { |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // } |
| | | // } else { |
| | | // if (glassCount < inCarMaxSize + 1) { |
| | | // addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst); |
| | | // } else { |
| | | // return Boolean.FALSE; |
| | | // } |
| | | // } |
| | | // } else { |
| | | // flag = Boolean.FALSE; |
| | | // } |
| | | // } |
| | | // //向plc发送进片确认 |
| | | // if (flag) { |
| | | // //向plc写入确认字 |
| | | // PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | // int returnData = 1; |
| | | // int count = 1; |
| | | // while (returnData != 0) { |
| | | // S7object.getinstance().plccontrol.writeWord(mesAddress, 1); |
| | | // |
| | | // if (Const.A10_OUT_TARGET_POSITION.equals(line)) { |
| | | // returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D04ToMES").getValue()); |
| | | // } else { |
| | | // returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D01ToMES").getValue()); |
| | | // } |
| | | //// returnData = S7object.getinstance().plccontrol.readWord(mesAddress, 1).get(0); |
| | | // log.info("进卧转立第{}次发送确认字完成,地址为:{},写入的内容为{}", count++, mesAddress, 1); |
| | | // } |
| | | // } |
| | | // //记录无法放下玻璃,后续判断启动 |
| | | // return flag; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 添加任务信息 |
| | | // */ |
| | | // private Boolean addFeedTask(String glassId, Integer line, Integer taskType, Integer width, Integer height) { |
| | | // BigStorageCageFeedTask bigStorageCageFeedTask = new BigStorageCageFeedTask(); |
| | | // bigStorageCageFeedTask.setGlassId(glassId); |
| | | // bigStorageCageFeedTask.setTaskState(Const.BIG_STORAGE_IN_NEW); |
| | | // bigStorageCageFeedTask.setLine(line); |
| | | // bigStorageCageFeedTask.setTaskType(taskType); |
| | | // bigStorageCageFeedTask.setWidth(width); |
| | | // bigStorageCageFeedTask.setHeight(height); |
| | | // bigStorageCageFeedTask.setCreateTime(new Date()); |
| | | // //删除理片笼表拿走/破损数据数据 |
| | | // damageService.deleteByGlassId(glassId); |
| | | // Damage damage = new Damage(); |
| | | // damage.setGlassId(glassId); |
| | | // damage.setWorkingProcedure("磨边"); |
| | | // damage.setLine(line); |
| | | // damage.setType(1); |
| | | // damage.setRemark("进大理片"); |
| | | // damageService.insertDamage(damage); |
| | | // return bigStorageCageFeedTaskService.save(bigStorageCageFeedTask); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 获取需要启动的线路:两条线都可启动 获取第一片玻璃版图id最小 版序最大的线路 |
| | | // * |
| | | // * @return 需要启动的线路 |
| | | // */ |
| | | // public Integer getStartLine() { |
| | | // List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .inSql(BigStorageCageFeedTask::getId, "select min(id) from big_storage_cage_feed_task where task_state = 2" + |
| | | // "and (target_slot = 0 or target_slot is null) group by line")); |
| | | // Assert.isFalse(CollectionUtils.isEmpty(taskList), "卧转立两条线都没有玻璃进片任务"); |
| | | // Map<String, Integer> taskMap = taskList.stream().collect(Collectors.toMap(BigStorageCageFeedTask::getGlassId, |
| | | // BigStorageCageFeedTask::getLine)); |
| | | // GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() |
| | | // .in(GlassInfo::getGlassId, taskMap.keySet()) |
| | | // .orderByAsc(GlassInfo::getTemperingLayoutId) |
| | | // .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence) |
| | | // .last("limit 1")); |
| | | // return taskMap.get(glassInfo.getGlassId()); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 计算任务表进片线路的目标格子,并启动任务 |
| | | // */ |
| | | // public boolean computeTargetByLine(Integer line) { |
| | | // //1、获取任务表中的所有玻璃(指定线路且已经进卧转立完成) |
| | | // List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>() |
| | | // .eq(BigStorageCageFeedTask::getLine, line) |
| | | // .and(e -> e.isNull(BigStorageCageFeedTask::getTargetSlot).or().eq(BigStorageCageFeedTask::getTargetSlot, Const.OUT_TARGET_POSITION_ZERO)) |
| | | // .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP_ALL) |
| | | // .orderByAsc(BigStorageCageFeedTask::getId)); |
| | | // //2、去笼子内查找是否可以继续存放的笼子 |
| | | // List<String> glassIds = taskList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()); |
| | | // List<GlassInfo> glassInfos = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIds)); |
| | | // return computeIsTemperingTargetByLine(glassInfos, taskList); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 是否钢化玻璃进笼目标位置 |
| | | // * |
| | | // * @param glassInfos 当条线卧转立所有玻璃 |
| | | // * @param taskList 当条线卧转立所有任务 |
| | | // */ |
| | | // private boolean computeIsTemperingTargetByLine(List<GlassInfo> glassInfos, List<BigStorageCageFeedTask> taskList) { |
| | | // //1、将玻璃信息集合转为glassid为key的map |
| | | // Map<String, GlassInfo> glassInfoMap = glassInfos.stream() |
| | | // .collect(Collectors.toMap(GlassInfo::getGlassId, p -> p)); |
| | | // for (BigStorageCageFeedTask e : taskList) { |
| | | // GlassInfo info = glassInfoMap.get(e.getGlassId()); |
| | | // if (info == null) { |
| | | // continue; |
| | | // } |
| | | // BigStorageCageDetails cageDetails = new BigStorageCageDetails(); |
| | | // BeanUtils.copyProperties(info, cageDetails); |
| | | // //todo:2、获取目标格子信息 |
| | | // BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info); |
| | | // //3、临时更新格子的剩余尺寸:防止相邻玻璃进同一格子造成剩余尺寸不足,玻璃越界的情况,任务完成后再次更新大理片笼表剩余宽度(按照笼内玻璃数量更新大理片笼剩余尺寸) |
| | | // bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap) |
| | | // .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot())); |
| | | // //4、更新进片任务表,目标格子及状态(状态改为2 电气扫到自行处理) 遇到问题:无法批量更新,批量更新无法走指定从库 |
| | | // e.setTargetSlot(bigStorageDTO.getSlot()); |
| | | // bigStorageCageFeedTaskService.updateById(e); |
| | | // |
| | | // //5、将进片信息存入大理片笼详情表 |
| | | // cageDetails.setSlot(bigStorageDTO.getSlot()); |
| | | // cageDetails.setState(Const.GLASS_STATE_NEW); |
| | | // cageDetails.setDeviceId(bigStorageDTO.getDeviceId()); |
| | | // cageDetails.setGap(glassGap); |
| | | // bigStorageCageDetailsService.save(cageDetails); |
| | | // |
| | | // } |
| | | // return Boolean.TRUE; |
| | | // } |
| | | // |
| | | // private void sendTaskListToPLC(List<BigStorageCageFeedTask> taskList, Integer line) { |
| | | // log.info("送片任务发送进片玻璃信息"); |
| | | // S7control s7control = S7object.getinstance().plccontrol; |
| | | // PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject; |
| | | // String mesD03Address = plcMesObject.getPlcParameter("MESToD03").getAddress(); |
| | | // String mesD05Address = plcMesObject.getPlcParameter("MESToD05").getAddress(); |
| | | // String outLine = line.equals(Const.A09_OUT_TARGET_POSITION) ? mesD03Address : mesD05Address; |
| | | // for (int i = 1; i <= taskList.size(); i++) { |
| | | // s7control.writeWord(plcMesObject.getPlcParameter("StartAddToImport" + i).getAddress(), taskList.get(i - 1).getLine()); |
| | | // s7control.writeWord(plcMesObject.getPlcParameter("TargetAddToImport" + i).getAddress(), taskList.get(i - 1).getTargetSlot()); |
| | | // log.info("向plc发送第{}片玻璃已完成,起始位置是{},目标位置是", i, taskList.get(i - 1).getLine(), taskList.get(i - 1).getTargetSlot()); |
| | | // } |
| | | // int returnData = 1; |
| | | // int count = 1; |
| | | // while (returnData != 0) { |
| | | // s7control.writeWord(outLine, 2); |
| | | // if (line.equals(Const.A09_OUT_TARGET_POSITION)) { |
| | | // returnData = Integer.parseInt(plcMesObject.getPlcParameter("D03ToMES").getValue()); |
| | | // } else { |
| | | // returnData = Integer.parseInt(plcMesObject.getPlcParameter("D05ToMES").getValue()); |
| | | // } |
| | | //// returnData = s7control.readWord(outLine, 1).get(0); |
| | | // log.info("已向plc第{}次发送进片任务确认,地址为:{},写入的内容为{}", count++, outLine, 2); |
| | | // } |
| | | // } |
| | | // |
| | | // /** |
| | | // * 出片一次仅生成一车玻璃 |
| | | // * |
| | | // * @param list |
| | | // * @param isTempering |
| | | // * @param mesToPLCAddress |
| | | // * @param <T> |
| | | // * @return |
| | | // */ |
| | | // private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) { |
| | | // //任务数据 获取车子存放玻璃最大数量 玻璃间隔 |
| | | // List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>(); |
| | | // //打车剩余尺寸 |
| | | // Integer remainWidth = carWidth; |
| | | // int maxX = 0; |
| | | // for (T e : list) { |
| | | // if (bigStorageCageOutTaskList.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) { |
| | | // break; |
| | | // } |
| | | // remainWidth = remainWidth - Math.max((int) e.getWidth(), (int) e.getHeight()) - glassGap; |
| | | // if (isTempering) { |
| | | // int minLength = Math.min((int) e.getWidth(), (int) e.getHeight()); |
| | | // if (maxX + minLength <= xMaxSize) { |
| | | // bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | // e.getWidth() * 10, e.getHeight() * 10, 0, 0, 1, new Date())); |
| | | //// maxX = Math.max(maxX, e.getXCoordinate()); |
| | | // } else { |
| | | // break; |
| | | // } |
| | | // |
| | | // } else { |
| | | // bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION, |
| | | // e.getWidth() * 10, e.getHeight(), 0, 0, 1, new Date())); |
| | | // } |
| | | // } |
| | | // Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "未获取出片数据,结束出片任务"); |
| | | // log.info("获取出片任务数据{}条,执行保存", bigStorageCageOutTaskList.size()); |
| | | // bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList); |
| | | List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | log.info("将出片玻璃{}玻璃状态改为已出片", glassIds); |
| | | bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING) |
| | | .in(BigStorageCageDetails::getGlassId, glassIds) |
| | | .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT)); |
| | | |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | private BigStorageDTO queryTargetSlotByTempering(GlassInfo glassInfo) { |
| | | |
| | | MPJLambdaWrapper<BigStorageCage> wrapper = new MPJLambdaWrapper<>(BigStorageCage.class) |
| | | .selectAll(BigStorageCage.class) |
| | | .leftJoin(BigStorageCageDetails.class, BigStorageCageDetails::getSlot, BigStorageCage::getSlot) |
| | | .eq(BigStorageCage::getEnableState, Const.SLOT_ON) |
| | | .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL_ZERO) |
| | | .eq(BigStorageCageDetails::getEngineerId, glassInfo.getEngineerId()) |
| | | .eq(BigStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId()) |
| | | .gt(BigStorageCage::getRemainWidth, Math.max(glassInfo.getWidth(), glassInfo.getHeight())) |
| | | .last("limit 1"); |
| | | if (glassInfo.getTemperingLayoutId() == 0) { |
| | | wrapper.eq(BigStorageCageDetails::getFlowCardId, glassInfo.getFlowCardId()) |
| | | .eq(BigStorageCageDetails::getLayer, glassInfo.getLayer()); |
| | | // wrapper.eq(BigStorageCageDetails::getWidth, glassInfo.getWidth()).eq(BigStorageCageDetails::getHeight, glassInfo.getHeight()); |
| | | } else { |
| | | wrapper.eq(BigStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence() + 1); |
| | | } |
| | | BigStorageCage bigStorageCage = bigStorageCageService.selectJoinOne(BigStorageCage.class, wrapper); |
| | | return null; |
| | | } |
| | | |
| | | // @Scheduled(fixedDelay = 300) |
| | | public void querySizeByEngineerTask() { |
| | | log.info("查询结果:{}", querySizeByEngineer("P24072402", 1, 10, 8)); |
| | | log.info("查询结果:{}", querySizeByEngineer("P24072402", 1, 5, 8)); |
| | | |
| | | } |
| | | |
| | | public BigStorageDTO querySizeByEngineer(String engineerId, int temperingLayoutId, int temperingFeedSequence, double thickness) { |
| | | BigStorageDTO bigStorageDTO = null; |
| | | BigStorageCage bigStorageCage = null; |
| | | //获取笼内当前版图每个格子已有玻璃的最小版序 获取笼内当前版图的所有玻璃信息 |
| | | List<BigStorageCageDetails> cageDetailsList = bigStorageCageDetailsService.list(new QueryWrapper<BigStorageCageDetails>() |
| | | .select("slot", "min(tempering_feed_sequence) as tempering_feed_sequence") |
| | | .eq("engineer_id", engineerId).eq("tempering_layout_id", temperingLayoutId) |
| | | .in("state", Const.GLASS_STATE_IN_ALL_ZERO).groupBy("slot").orderByAsc("min(tempering_feed_sequence)")); |
| | | if (CollectionUtils.isNotEmpty(cageDetailsList)) { |
| | | Integer minLength = cageDetailsList.stream().filter(e -> e.getTemperingFeedSequence() > temperingFeedSequence) |
| | | .mapToInt(BigStorageCageDetails::getTemperingFeedSequence).min().orElse(1000); |
| | | List<GlassInfo> infoList = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>() |
| | | .notInSql(GlassInfo::getGlassId, "select glass_id from damage where tempering_layout_id = " + temperingLayoutId + " and engineer_id = '" + engineerId + "'") |
| | | .eq(GlassInfo::getTemperingLayoutId, temperingLayoutId).eq(GlassInfo::getEngineerId, engineerId).orderByAsc(GlassInfo::getTemperingFeedSequence)); |
| | | int remainWidth = carWidth; |
| | | int trainNumber = 1; |
| | | int serialNumber = 0; |
| | | int min = 0; |
| | | int temp = infoList.get(0).getTemperingFeedSequence(); |
| | | int slot = 0; |
| | | int resultTrainNumber = 0; |
| | | for (GlassInfo e : infoList) { |
| | | int maxLength = Math.max((int) e.getWidth(), (int) e.getHeight()); |
| | | if (serialNumber >= outCarMaxSize || maxLength > remainWidth || e.getTemperingFeedSequence() >= minLength) { |
| | | if (resultTrainNumber != 0) { |
| | | min = temp; |
| | | break; |
| | | } |
| | | temp = e.getTemperingFeedSequence(); |
| | | remainWidth = carWidth; |
| | | trainNumber = trainNumber + 1; |
| | | serialNumber = 0; |
| | | } |
| | | if (temperingFeedSequence == e.getTemperingFeedSequence()) { |
| | | resultTrainNumber = trainNumber; |
| | | } |
| | | remainWidth = remainWidth - maxLength - glassGap > 0 ? remainWidth - maxLength - glassGap : 0; |
| | | serialNumber += 1; |
| | | log.info("{},{},{}", trainNumber, remainWidth, serialNumber); |
| | | if (e.getTemperingFeedSequence().equals(infoList.get(infoList.size() - 1).getTemperingFeedSequence())) { |
| | | min = temp; |
| | | } |
| | | } |
| | | for (BigStorageCageDetails item : cageDetailsList) { |
| | | if (min <= item.getTemperingFeedSequence() && item.getTemperingFeedSequence() < minLength) { |
| | | slot = item.getSlot(); |
| | | bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>() |
| | | .eq(BigStorageCage::getSlot, slot).eq(BigStorageCage::getEnableState, Const.SLOT_ON)); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (bigStorageCage != null) { |
| | | bigStorageDTO = new BigStorageDTO(); |
| | | bigStorageDTO.setWidth(bigStorageCage.getRemainWidth()); |
| | | bigStorageDTO.setSlot(bigStorageCage.getSlot()); |
| | | bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId()); |
| | | return bigStorageDTO; |
| | | } |
| | | |
| | | bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>() |
| | | .eq(BigStorageCage::getEnableState, Const.SLOT_ON) |
| | | .eq(BigStorageCage::getRemainWidth, slotWidth).orderByAsc(BigStorageCage::getSlot) |
| | | .inSql(BigStorageCage::getDeviceId, |
| | | "select distinct device_id from big_storage_cage_details where engineer_id = '" + engineerId + "' and tempering_layout_id = " + temperingLayoutId) |
| | | .last("limit 1")); |
| | | if (null != bigStorageCage) { |
| | | log.info("根据版图id找到笼子内的目标格子:{}", bigStorageCage.getSlot()); |
| | | bigStorageDTO = new BigStorageDTO(); |
| | | bigStorageDTO.setWidth(bigStorageCage.getRemainWidth()); |
| | | bigStorageDTO.setSlot(bigStorageCage.getSlot()); |
| | | bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId()); |
| | | return bigStorageDTO; |
| | | |
| | | } |
| | | |
| | | //获取玻璃的厚度:重新选笼子需要按照笼子可放玻璃厚度进行选择 因为子查询排序对主sql无影响,所以先执行子查询获取顺序,然后一次去查询 |
| | | List<Integer> deviceUsedList = bigStorageCageService.queryFreeDeviceByUsed(thickness); |
| | | for (Integer item : deviceUsedList) { |
| | | bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>() |
| | | .eq(BigStorageCage::getRemainWidth, slotWidth).orderByAsc(BigStorageCage::getSlot) |
| | | .eq(BigStorageCage::getEnableState, Const.SLOT_ON) |
| | | .eq(BigStorageCage::getDeviceId, item) |
| | | .last("limit 1")); |
| | | if (null != bigStorageCage) { |
| | | log.info("按照存笼玻璃格子数占用最少方式获取信息格子为:{}", bigStorageCage.getSlot()); |
| | | bigStorageDTO = new BigStorageDTO(); |
| | | bigStorageDTO.setWidth(bigStorageCage.getRemainWidth()); |
| | | bigStorageDTO.setSlot(bigStorageCage.getSlot()); |
| | | bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId()); |
| | | return bigStorageDTO; |
| | | } |
| | | } |
| | | Assert.isTrue(null != bigStorageCage, "没有空余的笼子存放玻璃"); |
| | | return bigStorageDTO; |
| | | } |
| | | |
| | | } |
| | | // List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | // log.info("将出片玻璃{}玻璃状态改为已出片", glassIds); |
| | | // bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | // .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING) |
| | | // .in(BigStorageCageDetails::getGlassId, glassIds)); |
| | | // int returnData = 0; |
| | | // int count = 1; |
| | | // while (returnData == 0) { |
| | | // S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1); |
| | | // returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0); |
| | | // log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, mesToPLCAddress, returnData); |
| | | // } |
| | | // return Boolean.TRUE; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 出片一次生成一炉玻璃 |
| | | // * |
| | | // * @param list |
| | | // * @param isTempering |
| | | // * @param mesToPLCAddress |
| | | // * @param <T> |
| | | // * @return |
| | | // */ |
| | | // public <T extends BigStorageCageBaseInfo> Boolean computeOutMoreGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) { |
| | | // //任务数据 获取车子存放玻璃最大数量 玻璃间隔 |
| | | // List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>(); |
| | | // //打车剩余尺寸 |
| | | // Integer remainWidth = carWidth; |
| | | // int trainNumber = 1; |
| | | // int serialNumber = 1; |
| | | // int maxX = 0; |
| | | // for (T e : list) { |
| | | // int maxLength = Math.max((int) e.getWidth(), (int) e.getHeight()); |
| | | // if (serialNumber > outCarMaxSize || maxLength > remainWidth) { |
| | | // remainWidth = carWidth; |
| | | // trainNumber = trainNumber + 1; |
| | | // serialNumber = 1; |
| | | // maxX = 0; |
| | | // } |
| | | // remainWidth = remainWidth - maxLength - glassGap; |
| | | // if (isTempering) { |
| | | // int minLength = Math.min((int) e.getWidth(), (int) e.getHeight()); |
| | | // if (maxX + minLength <= xMaxSize) { |
| | | // bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | // e.getWidth() * 10, e.getHeight() * 10, trainNumber, serialNumber++, 1, new Date())); |
| | | //// maxX = Math.max(maxX, e.getXCoordinate()); |
| | | // } else { |
| | | // remainWidth = carWidth - maxLength - glassGap; |
| | | // trainNumber = trainNumber + 1; |
| | | // serialNumber = 1; |
| | | //// maxX = e.getXCoordinate(); |
| | | // bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION, |
| | | // e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date())); |
| | | // } |
| | | // } else { |
| | | // bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION, |
| | | // e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date())); |
| | | // } |
| | | // } |
| | | // Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "未获取出片数据,结束出片任务"); |
| | | // log.info("获取出片任务数据{}条,执行保存", bigStorageCageOutTaskList.size()); |
| | | // for (BigStorageCageOutTask bigStorageCageOutTask : bigStorageCageOutTaskList |
| | | // ) { |
| | | // bigStorageCageOutTaskService.save(bigStorageCageOutTask); |
| | | // } |
| | | //// bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList); |
| | | // List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); |
| | | // log.info("将出片玻璃{}玻璃状态改为已出片", glassIds); |
| | | // bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() |
| | | // .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING) |
| | | // .in(BigStorageCageDetails::getGlassId, glassIds) |
| | | // .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT)); |
| | | // |
| | | // return Boolean.TRUE; |
| | | // } |
| | | // |
| | | // private BigStorageDTO queryTargetSlotByTempering(GlassInfo glassInfo) { |
| | | // |
| | | // MPJLambdaWrapper<BigStorageCage> wrapper = new MPJLambdaWrapper<>(BigStorageCage.class) |
| | | // .selectAll(BigStorageCage.class) |
| | | // .leftJoin(BigStorageCageDetails.class, BigStorageCageDetails::getSlot, BigStorageCage::getSlot) |
| | | // .eq(BigStorageCage::getEnableState, Const.SLOT_ON) |
| | | // .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL_ZERO) |
| | | // .eq(BigStorageCageDetails::getEngineerId, glassInfo.getEngineerId()) |
| | | // .eq(BigStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId()) |
| | | // .gt(BigStorageCage::getRemainWidth, Math.max(glassInfo.getWidth(), glassInfo.getHeight())) |
| | | // .last("limit 1"); |
| | | // if (glassInfo.getTemperingLayoutId() == 0) { |
| | | // wrapper.eq(BigStorageCageDetails::getFlowCardId, glassInfo.getFlowCardId()) |
| | | // .eq(BigStorageCageDetails::getLayer, glassInfo.getLayer()); |
| | | //// wrapper.eq(BigStorageCageDetails::getWidth, glassInfo.getWidth()).eq(BigStorageCageDetails::getHeight, glassInfo.getHeight()); |
| | | // } else { |
| | | // wrapper.eq(BigStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence() + 1); |
| | | // } |
| | | // BigStorageCage bigStorageCage = bigStorageCageService.selectJoinOne(BigStorageCage.class, wrapper); |
| | | // return null; |
| | | // } |
| | | // |
| | | // // @Scheduled(fixedDelay = 300) |
| | | // public void querySizeByEngineerTask() { |
| | | // log.info("查询结果:{}", querySizeByEngineer("P24072402", 1, 10, 8)); |
| | | // log.info("查询结果:{}", querySizeByEngineer("P24072402", 1, 5, 8)); |
| | | // |
| | | // } |
| | | // |
| | | // public BigStorageDTO querySizeByEngineer(String engineerId, int temperingLayoutId, int temperingFeedSequence, double thickness) { |
| | | // BigStorageDTO bigStorageDTO = null; |
| | | // BigStorageCage bigStorageCage = null; |
| | | // //获取笼内当前版图每个格子已有玻璃的最小版序 获取笼内当前版图的所有玻璃信息 |
| | | // List<BigStorageCageDetails> cageDetailsList = bigStorageCageDetailsService.list(new QueryWrapper<BigStorageCageDetails>() |
| | | // .select("slot", "min(tempering_feed_sequence) as tempering_feed_sequence") |
| | | // .eq("engineer_id", engineerId).eq("tempering_layout_id", temperingLayoutId) |
| | | // .in("state", Const.GLASS_STATE_IN_ALL_ZERO).groupBy("slot").orderByAsc("min(tempering_feed_sequence)")); |
| | | // if (CollectionUtils.isNotEmpty(cageDetailsList)) { |
| | | // Integer minLength = cageDetailsList.stream().filter(e -> e.getTemperingFeedSequence() > temperingFeedSequence) |
| | | // .mapToInt(BigStorageCageDetails::getTemperingFeedSequence).min().orElse(1000); |
| | | // List<GlassInfo> infoList = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>() |
| | | // .notInSql(GlassInfo::getGlassId, "select glass_id from damage where tempering_layout_id = " + temperingLayoutId + " and engineer_id = '" + engineerId + "'") |
| | | // .eq(GlassInfo::getTemperingLayoutId, temperingLayoutId).eq(GlassInfo::getEngineerId, engineerId).orderByAsc(GlassInfo::getTemperingFeedSequence)); |
| | | // int remainWidth = carWidth; |
| | | // int trainNumber = 1; |
| | | // int serialNumber = 0; |
| | | // int min = 0; |
| | | // int temp = infoList.get(0).getTemperingFeedSequence(); |
| | | // int slot = 0; |
| | | // int resultTrainNumber = 0; |
| | | // for (GlassInfo e : infoList) { |
| | | // int maxLength = Math.max((int) e.getWidth(), (int) e.getHeight()); |
| | | // if (serialNumber >= outCarMaxSize || maxLength > remainWidth || e.getTemperingFeedSequence() >= minLength) { |
| | | // if (resultTrainNumber != 0) { |
| | | // min = temp; |
| | | // break; |
| | | // } |
| | | // temp = e.getTemperingFeedSequence(); |
| | | // remainWidth = carWidth; |
| | | // trainNumber = trainNumber + 1; |
| | | // serialNumber = 0; |
| | | // } |
| | | // if (temperingFeedSequence == e.getTemperingFeedSequence()) { |
| | | // resultTrainNumber = trainNumber; |
| | | // } |
| | | // remainWidth = remainWidth - maxLength - glassGap > 0 ? remainWidth - maxLength - glassGap : 0; |
| | | // serialNumber += 1; |
| | | // log.info("{},{},{}", trainNumber, remainWidth, serialNumber); |
| | | // if (e.getTemperingFeedSequence().equals(infoList.get(infoList.size() - 1).getTemperingFeedSequence())) { |
| | | // min = temp; |
| | | // } |
| | | // } |
| | | // for (BigStorageCageDetails item : cageDetailsList) { |
| | | // if (min <= item.getTemperingFeedSequence() && item.getTemperingFeedSequence() < minLength) { |
| | | // slot = item.getSlot(); |
| | | // bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>() |
| | | // .eq(BigStorageCage::getSlot, slot).eq(BigStorageCage::getEnableState, Const.SLOT_ON)); |
| | | // break; |
| | | // } |
| | | // } |
| | | // } |
| | | // |
| | | // if (bigStorageCage != null) { |
| | | // bigStorageDTO = new BigStorageDTO(); |
| | | // bigStorageDTO.setWidth(bigStorageCage.getRemainWidth()); |
| | | // bigStorageDTO.setSlot(bigStorageCage.getSlot()); |
| | | // bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId()); |
| | | // return bigStorageDTO; |
| | | // } |
| | | // |
| | | // bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>() |
| | | // .eq(BigStorageCage::getEnableState, Const.SLOT_ON) |
| | | // .eq(BigStorageCage::getRemainWidth, slotWidth).orderByAsc(BigStorageCage::getSlot) |
| | | // .inSql(BigStorageCage::getDeviceId, |
| | | // "select distinct device_id from big_storage_cage_details where engineer_id = '" + engineerId + "' and tempering_layout_id = " + temperingLayoutId) |
| | | // .last("limit 1")); |
| | | // if (null != bigStorageCage) { |
| | | // log.info("根据版图id找到笼子内的目标格子:{}", bigStorageCage.getSlot()); |
| | | // bigStorageDTO = new BigStorageDTO(); |
| | | // bigStorageDTO.setWidth(bigStorageCage.getRemainWidth()); |
| | | // bigStorageDTO.setSlot(bigStorageCage.getSlot()); |
| | | // bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId()); |
| | | // return bigStorageDTO; |
| | | // |
| | | // } |
| | | // |
| | | // //获取玻璃的厚度:重新选笼子需要按照笼子可放玻璃厚度进行选择 因为子查询排序对主sql无影响,所以先执行子查询获取顺序,然后一次去查询 |
| | | // List<Integer> deviceUsedList = bigStorageCageService.queryFreeDeviceByUsed(thickness); |
| | | // for (Integer item : deviceUsedList) { |
| | | // bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>() |
| | | // .eq(BigStorageCage::getRemainWidth, slotWidth).orderByAsc(BigStorageCage::getSlot) |
| | | // .eq(BigStorageCage::getEnableState, Const.SLOT_ON) |
| | | // .eq(BigStorageCage::getDeviceId, item) |
| | | // .last("limit 1")); |
| | | // if (null != bigStorageCage) { |
| | | // log.info("按照存笼玻璃格子数占用最少方式获取信息格子为:{}", bigStorageCage.getSlot()); |
| | | // bigStorageDTO = new BigStorageDTO(); |
| | | // bigStorageDTO.setWidth(bigStorageCage.getRemainWidth()); |
| | | // bigStorageDTO.setSlot(bigStorageCage.getSlot()); |
| | | // bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId()); |
| | | // return bigStorageDTO; |
| | | // } |
| | | // } |
| | | // Assert.isTrue(null != bigStorageCage, "没有空余的笼子存放玻璃"); |
| | | // return bigStorageDTO; |
| | | // } |
| | | // |
| | | //} |
| | |
| | | import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; |
| | | import com.mes.common.S7object; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.device.PlcParameterObject; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import com.mes.tools.S7control; |
| | | import com.mes.tools.service.BigStorageBaseService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | @Resource |
| | | GlassInfoService glassInfoService; |
| | | |
| | | @Value("${mes.slotWidth}") |
| | | private Integer slotWidth; |
| | | @Resource |
| | | SysConfigService sysConfigService; |
| | | |
| | | @Value("${mes.carWidth}") |
| | | private Integer carWidth; |
| | | |
| | | @Value("${mes.outCarMaxSize}") |
| | | private Integer outCarMaxSize; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | // @Value("${mes.slotWidth}") |
| | | // private Integer slotWidth; |
| | | // |
| | | // @Value("${mes.carWidth}") |
| | | // private Integer carWidth; |
| | | // |
| | | // @Value("${mes.outCarMaxSize}") |
| | | // private Integer outCarMaxSize; |
| | | // |
| | | // @Value("${mes.glassGap}") |
| | | // private Integer glassGap; |
| | | |
| | | |
| | | @Override |
| | | public void updateSlotRemainBySlots(List<Integer> slotList) { |
| | | //获取格子内所有的玻璃信息 |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH); |
| | | int glassGap = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_GLASS_GAP); |
| | | List<BigStorageCageDetails> inSlotGlassList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() |
| | | .in(BigStorageCageDetails::getSlot, slotList).in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL)); |
| | | Map<Integer, Double> slotRemainMap = new HashMap<>(); |
| | |
| | | List<GlassInfo> infoList = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>() |
| | | .notInSql(GlassInfo::getGlassId, "select glass_id from damage where tempering_layout_id = " + temperingLayoutId + " and engineer_id = '" + engineerId + "'") |
| | | .eq(GlassInfo::getTemperingLayoutId, temperingLayoutId).eq(GlassInfo::getEngineerId, engineerId).orderByAsc(GlassInfo::getTemperingFeedSequence)); |
| | | int remainWidth = carWidth; |
| | | int remainWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_CAR_WIDTH); |
| | | int trainNumber = 1; |
| | | int serialNumber = 0; |
| | | int min = 0; |
| | | int temp = infoList.get(0).getTemperingFeedSequence(); |
| | | int slot = 0; |
| | | int resultTrainNumber = 0; |
| | | int outCarMaxSize = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_OUT_CAR_SIZE); |
| | | int carWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_CAR_WIDTH); |
| | | int glassGap = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_GLASS_GAP); |
| | | for (GlassInfo e : infoList) { |
| | | int maxLength = Math.max((int) e.getWidth(), (int) e.getHeight()); |
| | | if (serialNumber >= outCarMaxSize || maxLength > remainWidth || e.getTemperingFeedSequence() >= minLength) { |
| | |
| | | bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId()); |
| | | return bigStorageDTO; |
| | | } |
| | | |
| | | int slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH); |
| | | bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>() |
| | | .eq(BigStorageCage::getEnableState, Const.SLOT_ON) |
| | | .eq(BigStorageCage::getRemainWidth, slotWidth).orderByAsc(BigStorageCage::getSlot) |
| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.damage.entity.Damage; |
| | | import com.mes.damage.service.DamageService; |
| | | import com.mes.engineering.entity.Engineering; |
| | | import com.mes.largenscreen.entity.PieChartVO; |
| | | import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | import com.mes.tools.WebSocketServer; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @author SNG-010 |
| | |
| | | public void temperingGlassHome() { |
| | | JSONObject jsonObject = new JSONObject(); |
| | | //正在等待进片的玻璃 |
| | | List<TemperingGlassInfo> waitingGlass = temperingAgoService.selectWaitingGlass(); |
| | | List<TemperingGlassInfo> waitingGlass = temperingAgoService.selectWaitingGlassByOpc(); |
| | | if (waitingGlass != null) { |
| | | jsonObject.append("waitingGlass", waitingGlass); |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.mes.common.S7object; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.damage.entity.Damage; |
| | | import com.mes.damage.service.DamageService; |
| | | import com.mes.device.PlcParameterObject; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import com.mes.sysdict.entity.SysDictData; |
| | | import com.mes.sysdict.service.SysDictDataService; |
| | | import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.Comparator; |
| | |
| | | @Autowired |
| | | private SysDictDataService sysDictDataService; |
| | | |
| | | @Autowired |
| | | private SysConfigService sysConfigService; |
| | | |
| | | private static final String ALONE_STATE = "0"; |
| | | |
| | | @Value("${mes.width}") |
| | | private Integer temperingWidth; |
| | | @Value("${mes.height}") |
| | | private Integer temperingHeight; |
| | | |
| | | // @Scheduled(fixedDelay = 1000) |
| | | // @Scheduled(fixedDelay = 1000) |
| | | public void temperingGlassBefore() { |
| | | Date startDate = new Date(); |
| | | log.info("本次任务开始执行时间:{}", startDate); |
| | |
| | | double maxArea = temperingGlassList.stream().mapToDouble(e -> e.getWidth() * e.getHeight()).max().orElse(0.0); |
| | | double minArea = temperingGlassList.stream().mapToDouble(e -> e.getWidth() * e.getHeight()).min().orElse(0.0); |
| | | double areaDifference = (10000 * (maxArea - minArea) / maxArea); |
| | | Integer temperingHeight = sysConfigService.queryConfigValue(ConstSysConfig.TEMPERING_HEIGHT); |
| | | Integer temperingWidth = sysConfigService.queryConfigValue(ConstSysConfig.TEMPERING_HEIGHT); |
| | | double loadingRate = (int) (10000 * sumArea / (temperingHeight * temperingWidth)); |
| | | TemperingRecord temperingRecord = new TemperingRecord(); |
| | | temperingRecord.setEngineerId(maxGlassInfo.getEngineerId()); |
| | |
| | | */ |
| | | @ApiModelProperty(value = "开始时间", position = 6) |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date beginDate; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @ApiModelProperty(value = "结束时间", position = 7) |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date endDate; |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.hollow.entity.HollowBigStorageCage; |
| | | import com.mes.hollow.entity.HollowBigStorageCageDetails; |
| | | import com.mes.hollow.entity.dto.FlowCardVirtualSlotDTO; |
| | |
| | | import com.mes.hollow.mapper.HollowGlassRelationInfoMapper; |
| | | import com.mes.hollow.service.HollowBigStorageCageDetailsService; |
| | | import com.mes.hollow.service.HollowBigStorageCageService; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | @Service |
| | | public class HollowBigStorageCageServiceImpl extends ServiceImpl<HollowBigStorageCageMapper, HollowBigStorageCage> implements HollowBigStorageCageService { |
| | | |
| | | @Value("${mes.slotWidth}") |
| | | private Integer slotWidth; |
| | | // @Value("${mes.slotWidth}") |
| | | // private Integer slotWidth; |
| | | |
| | | @Resource |
| | | private HollowBigStorageCageDetailsService hollowBigStorageCageDetailsService; |
| | | @Resource |
| | | private HollowGlassRelationInfoMapper hollowGlassRelationInfoMapper; |
| | | @Resource |
| | | private SysConfigService sysConfigService; |
| | | |
| | | @Override |
| | | public List<HollowBigStorageAndDetailsDTO> queryHollowBigStorageCageDetail(HollowBigStorageDetailsQueryVO query) { |
| | |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> selectBigStorageCageUsage() { |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH); |
| | | QueryWrapper<HollowBigStorageCage> wrapper = new QueryWrapper<>(); |
| | | wrapper.select("device_id,ROUND(1 - SUM(CASE WHEN remain_width = " + slotWidth + " THEN 1 ELSE 0 END) / COUNT(device_id), 2)*100 AS percentage,SUM(CASE WHEN remain_width = " + slotWidth + " THEN 1 ELSE 0 END) AS count") |
| | | .groupBy("device_id"); |
| | |
| | | hollowBigStorageCageDetailsService.remove(new LambdaQueryWrapper<HollowBigStorageCageDetails>() |
| | | .eq(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_NEW)); |
| | | // 2将空格子的尺寸置为初始尺寸 |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH); |
| | | this.update(new LambdaUpdateWrapper<HollowBigStorageCage>() |
| | | .set(HollowBigStorageCage::getRemainWidth, slotWidth) |
| | | .notInSql(HollowBigStorageCage::getSlot, "select distinct slot from hollow_big_storage_cage_details where state in( 100 , 102 , 103 ,104)")); |
| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.hollow.controller.HollowBigStorageCageController; |
| | |
| | | import com.mes.hollowqueue.entity.HollowGlassQueueInfo; |
| | | import com.mes.hollowqueue.service.HollowGlassQueueInfoService; |
| | | import com.mes.largenscreen.entity.PieChartVO; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import com.mes.tools.DateUtil; |
| | | import com.mes.utils.Blank; |
| | | import com.mes.utils.RedisUtil; |
| | |
| | | import freemarker.template.Version; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | HollowFormulaDetailsService hollowFormulaDetailsService; |
| | | @Resource |
| | | HollowGlassRelationInfoService hollowGlassRelationInfoService; |
| | | @Resource |
| | | SysConfigService sysConfigService; |
| | | |
| | | @Resource |
| | | RedisUtil redisUtil; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | |
| | | @Value("${mes.carWidth}") |
| | | private Integer carWidth; |
| | | // @Value("${mes.glassGap}") |
| | | // private Integer glassGap; |
| | | // |
| | | // @Value("${mes.carWidth}") |
| | | // private Integer carWidth; |
| | | |
| | | private static final int ID_RATIO = 10; |
| | | |
| | |
| | | .queryOutGlassList(request.getFlowCardId(), request.getCell()); |
| | | int isPairCount = glassInfo.getTotalLayer() * request.getTotalPairQuantity(); |
| | | List<HollowGlassQueueInfo> hollowQueues = new ArrayList<>(); |
| | | |
| | | Integer carWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_CAR_WIDTH); |
| | | Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_GLASS_GAP); |
| | | if (930 == request.getCell()) { |
| | | Map<Integer, List<HollowBigStorageCageDetails>> listMap = hollowBigStorageCageDetailsList.stream() |
| | | .collect(Collectors.groupingBy(HollowBigStorageCageDetails::getHollowSequence)); |
| | |
| | | import com.baomidou.mybatisplus.core.toolkit.StringUtils; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.mes.glassinfo.service.GlassInfoService; |
| | | import com.mes.hollow.entity.HollowBigStorageCage; |
| | |
| | | import com.mes.hollow.service.HollowBigStorageCageService; |
| | | import com.mes.hollow.service.HollowGlassOutRelationInfoService; |
| | | import com.mes.hollow.service.HollowGlassRelationInfoService; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | HollowGlassOutRelationInfoService hollowGlassOutRelationInfoService; |
| | | @Resource |
| | | HollowBigStorageCageDetailsService hollowBigStorageCageDetailsService; |
| | | @Value("${mes.slotWidth}") |
| | | private Integer slotWidth; |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | |
| | | @Value("${mes.outCarMaxSize}") |
| | | private Integer outCarMaxSize; |
| | | @Resource |
| | | SysConfigService sysConfigService; |
| | | // @Value("${mes.slotWidth}") |
| | | // private Integer slotWidth; |
| | | // @Value("${mes.glassGap}") |
| | | // private Integer glassGap; |
| | | // |
| | | // @Value("${mes.outCarMaxSize}") |
| | | // private Integer outCarMaxSize; |
| | | |
| | | @Override |
| | | public HollowBigStorageDTO queryHollowTargetSlot(String flowCardId, double width, double height, int totalLayer, int layer) { |
| | |
| | | .last("limit 1") |
| | | ); |
| | | } |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH); |
| | | //详情表内获取本组是否已经有玻璃在笼子内(0表示提前占用) |
| | | int taskCount = hollowGlassOutRelationInfoService.count(new LambdaQueryWrapper<HollowGlassOutRelationInfo>() |
| | | .eq(HollowGlassOutRelationInfo::getFlowCardId, flowCardId)); |
| | |
| | | // List<HollowBigStorageCage> hollowSlotList = HollowBigStorageCageService.list(new LambdaQueryWrapper<HollowBigStorageCage>() |
| | | // .eq(HollowBigStorageCage::getEnableState, Const.SLOT_ON).eq(HollowBigStorageCage::getRemainWidth, slotWidth)); |
| | | //方式二:将玻璃按流程卡、尺寸、版图、版序 ,优先将格子全部补全后 依次计算后面的格子号 |
| | | |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH); |
| | | Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_GLASS_GAP); |
| | | Integer outCarMaxSize = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_OUT_CAR_SIZE); |
| | | List<HollowGlassRelationInfo> relationInfoList = new ArrayList(); |
| | | List<List<HollowGlassRelationInfo>> tempHollowList = new ArrayList<>(); |
| | | int slotNumber = 1; |
| | |
| | | import com.mes.utils.Result; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | |
| | | public Result<List<HollowGlassQueueInfo>> queryHollowGlassQueueInfoByTask(int taskId) { |
| | | return Result.success(hollowGlassQueueInfoService.queryHollowGlassQueueInfoByTask(taskId)); |
| | | } |
| | | |
| | | @ApiOperation("铝框确认/破损") |
| | | @PostMapping("/confirmBorder") |
| | | public Result confirmBorder(@RequestBody HollowGlassQueueInfo hollowGlassQueueInfo) { |
| | | hollowGlassQueueInfoService.confirmBorder(hollowGlassQueueInfo); |
| | | return Result.build(200, "修改成功", 1); |
| | | } |
| | | |
| | | @ApiOperation("铝框查询") |
| | | @PostMapping("/queryHollowGlassQueueInfoByLine") |
| | | public Result queryHollowGlassQueueInfoByLine(@RequestBody HollowGlassQueueInfo hollowGlassQueueInfo) { |
| | | return Result.build(200, "操作成功", hollowGlassQueueInfoService.queryHollowGlassQueueInfoByLine(hollowGlassQueueInfo.getCell())); |
| | | } |
| | | } |
| | | |
| | |
| | | public interface HollowGlassQueueInfoService extends IService<HollowGlassQueueInfo> { |
| | | |
| | | List<HollowGlassQueueInfo> queryHollowGlassQueueInfoByTask(int taskId); |
| | | |
| | | List<HollowGlassQueueInfo> queryHollowGlassQueueInfoByLine(int cell); |
| | | |
| | | void confirmBorder(HollowGlassQueueInfo hollowGlassQueueInfo); |
| | | } |
| | | |
| | |
| | | package com.mes.hollowqueue.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.damage.entity.Damage; |
| | | import com.mes.damage.service.DamageService; |
| | | import com.mes.hollow.entity.HollowGlassOutRelationInfo; |
| | | import com.mes.hollow.service.HollowGlassOutRelationInfoService; |
| | | import com.mes.hollowqueue.entity.HollowGlassQueueInfo; |
| | |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.List; |
| | | import java.util.Optional; |
| | | |
| | | /** |
| | | * (HollowGlassQueueInfo)表服务实现类 |
| | |
| | | |
| | | @Resource |
| | | HollowGlassOutRelationInfoService hollowGlassOutRelationInfoService; |
| | | |
| | | @Resource |
| | | DamageService damageService; |
| | | |
| | | |
| | | @Override |
| | |
| | | .orderByAsc(HollowGlassQueueInfo::getHollowSequence) |
| | | .orderByAsc(HollowGlassQueueInfo::getLayer)); |
| | | } |
| | | |
| | | @Override |
| | | public List<HollowGlassQueueInfo> queryHollowGlassQueueInfoByLine(int cell) { |
| | | List<String> relationIds = this.listObjs( |
| | | new LambdaQueryWrapper<HollowGlassQueueInfo>() |
| | | .lt(HollowGlassQueueInfo::getState, 1) |
| | | .eq(HollowGlassQueueInfo::getCell, cell) |
| | | .select(HollowGlassQueueInfo::getRelationId) |
| | | .groupBy(HollowGlassQueueInfo::getRelationId), |
| | | Object::toString |
| | | ); |
| | | List<HollowGlassQueueInfo> resultList = this.list( |
| | | new QueryWrapper<HollowGlassQueueInfo>() |
| | | .in("relation_id", relationIds) |
| | | .eq("cell", cell) |
| | | .eq("is_pair", 1) |
| | | .select("width","height","flow_card_id","relation_id", "hollow_sequence", "cell", "MAX(state) as state", "MAX(layer) as layer") |
| | | .groupBy("relation_id", "hollow_sequence") |
| | | .orderByAsc("relation_id", "hollow_sequence") |
| | | ); |
| | | |
| | | // 修改内存中集合的第一条 state 为 0 或 -1 的对象的 state 为 -2 |
| | | for (HollowGlassQueueInfo item : resultList) { |
| | | if (item.getState() == 0 || item.getState() == -1) { |
| | | item.setState(-2); |
| | | break; // 只改第一条,改完就退出循环 |
| | | } |
| | | } |
| | | return resultList; |
| | | } |
| | | |
| | | @Override |
| | | public void confirmBorder(HollowGlassQueueInfo hollowGlassQueueInfo) { |
| | | |
| | | if (hollowGlassQueueInfo.getState() == 8) { |
| | | HollowGlassQueueInfo hollowGlassQueueInfoDamage = this.getOne( |
| | | new LambdaQueryWrapper<HollowGlassQueueInfo>() |
| | | .eq(HollowGlassQueueInfo::getLayer, hollowGlassQueueInfo.getLayer()) |
| | | .eq(HollowGlassQueueInfo::getRelationId, hollowGlassQueueInfo.getRelationId()) |
| | | .eq(HollowGlassQueueInfo::getHollowSequence, hollowGlassQueueInfo.getHollowSequence()) |
| | | ); |
| | | hollowGlassQueueInfoDamage.setState(hollowGlassQueueInfo.getState()); |
| | | this.updateById(hollowGlassQueueInfoDamage); |
| | | Damage damage = new Damage(); |
| | | damage.setGlassId(hollowGlassQueueInfoDamage.getGlassId()); |
| | | damage.setLine(hollowGlassQueueInfoDamage.getCell()); |
| | | damage.setWorkingProcedure("中空"); |
| | | damage.setRemark("折铝框"); |
| | | damage.setStatus(1); |
| | | damage.setType(hollowGlassQueueInfoDamage.getState()); |
| | | damageService.insertDamage(damage); |
| | | } else { |
| | | this.update( |
| | | new LambdaUpdateWrapper<HollowGlassQueueInfo>() |
| | | .set(HollowGlassQueueInfo::getState, hollowGlassQueueInfo.getState()) |
| | | .eq(HollowGlassQueueInfo::getRelationId, hollowGlassQueueInfo.getRelationId()) |
| | | .eq(HollowGlassQueueInfo::getHollowSequence, hollowGlassQueueInfo.getHollowSequence()) |
| | | ); |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | */ |
| | | @ApiModelProperty(value = "开始时间", position = 6) |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date beginDate; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @ApiModelProperty(value = "结束时间", position = 7) |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date endDate; |
| | | } |
| | |
| | | hollowRemoveChildTask("CMJ2.CMJ2."); |
| | | } |
| | | |
| | | private void hollowRemoveChildTask(String cell) throws Exception { |
| | | private void hollowRemoveChildTask(String cell) throws Exception { |
| | | ReadWriteEntity requestEntity = miloService.readFromOpcUa(cell + "mesControl"); |
| | | if ("0".equals(requestEntity.getValue() + "")) { |
| | | log.info("当前除膜机为单机状态"); |
| | |
| | | log.info("当前未收到玻璃id数据,结束任务"); |
| | | return; |
| | | } |
| | | log.info("当前需要除膜的玻璃id为:{}", glassIdEntity.getValue() + ""); |
| | | //按照玻璃id获取对应的任务id |
| | | HollowGlassFormulaVO detailsVO = hollowFormulaDetailsService.queryFormulaDetailsByGlassId(glassIdEntity.getValue() + "", null, null); |
| | | if (null == detailsVO) { |
| | |
| | | import com.mes.bigstoragecagetask.entity.BigStorageCageTask; |
| | | import com.mes.bigstoragecagetask.service.BigStorageCageTaskService; |
| | | import com.mes.common.config.Const; |
| | | import com.mes.common.config.ConstSysConfig; |
| | | import com.mes.damage.entity.Damage; |
| | | import com.mes.damage.service.DamageService; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | |
| | | import com.mes.hollowqueue.service.HollowGlassQueueInfoService; |
| | | import com.mes.hollowtask.entity.HollowBigStorageCageHistoryTask; |
| | | import com.mes.hollowtask.service.HollowBigStorageCageHistoryTaskService; |
| | | import com.mes.sysconfig.service.SysConfigService; |
| | | import com.mes.temperingglass.entity.TemperingGlassInfo; |
| | | import com.mes.temperingglass.service.TemperingGlassInfoService; |
| | | import com.mes.utils.RedisUtil; |
| | |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | |
| | | private HollowGlassQueueInfoService hollowGlassQueueInfoService; |
| | | @Resource |
| | | private HollowGlassOutRelationInfoService hollowGlassOutRelationInfoService; |
| | | @Resource |
| | | private SysConfigService sysConfigService; |
| | | |
| | | private static final String BIG_STORAGE_CAGE_IN_TWO_TASK = "big_storage_cage_in_two_task"; |
| | | private static final String BIG_STORAGE_CAGE_OUT_TWO_TASK = "big_storage_cage_out_two_task"; |
| | |
| | | @Resource |
| | | private RedisUtil redisUtil; |
| | | |
| | | @Value("${mes.slotWidth}") |
| | | private Integer slotWidth; |
| | | |
| | | @Value("${mes.glassGap}") |
| | | private Integer glassGap; |
| | | |
| | | @Value("${mes.carWidth}") |
| | | private Integer carWidth; |
| | | |
| | | @Value("${mes.outCarMaxSize}") |
| | | private Integer outCarMaxSize; |
| | | |
| | | @Value("${mes.slotMaxHeight}") |
| | | private Integer slotMaxHeight; |
| | | @Value("${mes.slotMaxthickness}") |
| | | private Integer slotMaxthickness; |
| | | // @Value("${mes.slotWidth}") |
| | | // private Integer slotWidth; |
| | | // |
| | | // @Value("${mes.glassGap}") |
| | | // private Integer glassGap; |
| | | // |
| | | // @Value("${mes.carWidth}") |
| | | // private Integer carWidth; |
| | | // |
| | | // @Value("${mes.outCarMaxSize}") |
| | | // private Integer outCarMaxSize; |
| | | // |
| | | // @Value("${mes.slotMaxHeight}") |
| | | // private Integer slotMaxHeight; |
| | | // @Value("${mes.slotMaxthickness}") |
| | | // private Integer slotMaxthickness; |
| | | |
| | | @Scheduled(fixedDelay = 1000) |
| | | public void inBigStorageTask() throws Exception { |
| | |
| | | miloService.writeToOpcWord(generateReadWriteEntity("DLP2A.DLP2A.alarmSignal", 8)); |
| | | return; |
| | | } |
| | | |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH); |
| | | //按照玻璃厚度分组,判断剩余格子是否可以存放 |
| | | Map<Double, Long> thickCountMap = glassInfoList.stream().collect(Collectors.groupingBy(GlassInfo::getThickness, Collectors.counting())); |
| | | for (Map.Entry<Double, Long> entry : thickCountMap.entrySet()) { |
| | |
| | | } |
| | | } |
| | | //超大尺寸 |
| | | Integer slotMaxHeight = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_MAX_HEIGHT); |
| | | Integer slotMaxthickness = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_MAX_THICKNESS); |
| | | if (slotMaxHeight < Math.min(glassInfoList.get(0).getWidth(), glassInfoList.get(0).getHeight()) || glassInfoList.get(0).getThickness() >= slotMaxthickness) { |
| | | int count = hollowBigStorageCageDetailsService.count(new LambdaQueryWrapper<HollowBigStorageCageDetails>() |
| | | .eq(HollowBigStorageCageDetails::getSlot, THROUGH_SLOT) |
| | |
| | | |
| | | //计算目标格子 |
| | | List<HollowBigStorageCageHistoryTask> historyTasks = new ArrayList<>(); |
| | | |
| | | Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_GLASS_GAP); |
| | | try { |
| | | if (slotMaxHeight > Math.min(glassInfoList.get(0).getWidth(), glassInfoList.get(0).getHeight()) && glassInfoList.get(0).getThickness() < slotMaxthickness) { |
| | | for (BigStorageCageTask task : inTaskList) { |
| | |
| | | } |
| | | |
| | | //获取空闲且领取任务的数据信息,没有任务直接走玻璃调度 |
| | | HashMap<Integer, ReadWriteEntity> map = new HashMap<>(); |
| | | ReadWriteEntity oneEntity = miloService.readFromOpcUa("CMJ1.CMJ1.isFree"); |
| | | ReadWriteEntity twoEntity = miloService.readFromOpcUa("ZKQ2.ZKQ2.isFree"); |
| | | ReadWriteEntity threeEntity = miloService.readFromOpcUa("ZKQ2.ZKQ2.isFree03"); |
| | | map.put(930, oneEntity); |
| | | map.put(931, twoEntity); |
| | | map.put(932, threeEntity); |
| | | HollowGlassOutRelationInfo hollowGlassOutRelationInfo = null; |
| | | int cell = -1; |
| | | //李赛克线需要获取韩江plc的线路空闲状态:10000000第8位为 1表示忙碌 0表示空闲 |
| | | if (null != oneEntity.getValue() && "1".equals(oneEntity.getValue() + "")) { |
| | | cell = 930; |
| | | hollowGlassOutRelationInfo = hollowGlassOutRelationInfoService |
| | | .getOne(new LambdaQueryWrapper<HollowGlassOutRelationInfo>() |
| | | .eq(HollowGlassOutRelationInfo::getCell, cell) |
| | | .eq(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_START) |
| | | ); |
| | | for (int i = 930; i <= 932; i++) { |
| | | if (null == hollowGlassOutRelationInfo) { |
| | | ReadWriteEntity entity = map.get(i); |
| | | cell = i; |
| | | if (null != entity.getValue() && ("1".equals(entity.getValue() + "") || Boolean.parseBoolean(entity.getValue() + ""))) { |
| | | hollowGlassOutRelationInfo = hollowGlassOutRelationInfoService |
| | | .getOne(new LambdaQueryWrapper<HollowGlassOutRelationInfo>() |
| | | .eq(HollowGlassOutRelationInfo::getCell, cell) |
| | | .eq(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_START) |
| | | ); |
| | | } |
| | | } else { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | ReadWriteEntity twoEntity = miloService.readFromOpcUa("ZKQ2.ZKQ2.isFree"); |
| | | if (null == hollowGlassOutRelationInfo && null != twoEntity.getValue() && Boolean.parseBoolean(twoEntity.getValue() + "")) { |
| | | cell = 931; |
| | | hollowGlassOutRelationInfo = hollowGlassOutRelationInfoService |
| | | .getOne(new LambdaQueryWrapper<HollowGlassOutRelationInfo>() |
| | | .eq(HollowGlassOutRelationInfo::getCell, cell) |
| | | .eq(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_START) |
| | | ); |
| | | } |
| | | if (null == hollowGlassOutRelationInfo) { |
| | | cell = 930; |
| | | hollowGlassOutRelationInfo = hollowGlassOutRelationInfoService |
| | | .getOne(new LambdaQueryWrapper<HollowGlassOutRelationInfo>() |
| | | .eq(HollowGlassOutRelationInfo::getCell, cell) |
| | | .eq(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_START) |
| | | ); |
| | | } |
| | | |
| | | if (null == hollowGlassOutRelationInfo) { |
| | | cell = 931; |
| | | hollowGlassOutRelationInfo = hollowGlassOutRelationInfoService |
| | | .getOne(new LambdaQueryWrapper<HollowGlassOutRelationInfo>() |
| | | .eq(HollowGlassOutRelationInfo::getCell, cell) |
| | | .eq(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_START) |
| | | ); |
| | | for (int i = 930; i <= 932; i++) { |
| | | if (null == hollowGlassOutRelationInfo) { |
| | | cell = i; |
| | | hollowGlassOutRelationInfo = hollowGlassOutRelationInfoService |
| | | .getOne(new LambdaQueryWrapper<HollowGlassOutRelationInfo>() |
| | | .eq(HollowGlassOutRelationInfo::getCell, cell) |
| | | .eq(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_START) |
| | | ); |
| | | } else { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (null != hollowGlassOutRelationInfo) { |
| | |
| | | } |
| | | |
| | | |
| | | private <T extends HollowBigStorageCageBaseInfo> Boolean hollowOutGlassByIsPair(List<T> list, int targetSlot, int isPair, int totalLayer, int isForce) throws Exception { |
| | | private <T extends HollowBigStorageCageBaseInfo> Boolean hollowOutGlassByIsPair(List<T> list, |
| | | int targetSlot, int isPair, int totalLayer, int isForce) throws Exception { |
| | | List<T> resultList = new ArrayList<>(); |
| | | List<T> tempList = new ArrayList<>(); |
| | | int taskType = Const.BIG_STORAGE_AFTER_OUT; |
| | |
| | | break; |
| | | } |
| | | } |
| | | |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH); |
| | | if (isPair == 0 && isForce != 1) { |
| | | taskType = Const.BIG_STORAGE_AFTER_DISPATCH; |
| | | taskState = Const.GLASS_STATE_SCHEDULE_ING; |
| | |
| | | * @param totalLayer |
| | | * @return |
| | | */ |
| | | private <T extends HollowBigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, String tableName, int targetSlot, int state, int taskType, int totalLayer, int isForce) { |
| | | private <T extends HollowBigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, String tableName, |
| | | int targetSlot, int state, int taskType, int totalLayer, int isForce) { |
| | | //任务数据:获取车子存放玻璃最大数量,玻璃间隔 |
| | | List<T> templist = new ArrayList<>(); |
| | | //打车剩余尺寸 |
| | | Integer remainWidth = carWidth; |
| | | Integer remainWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH); |
| | | Integer outCarMaxSize = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_OUT_CAR_SIZE); |
| | | Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_GLASS_GAP); |
| | | for (T e : list) { |
| | | if (templist.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) { |
| | | break; |
| | |
| | | .in(HollowBigStorageCageDetails::getSlot, slotList).in(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL)); |
| | | Map<Integer, Double> slotRemainMap = new HashMap<>(); |
| | | //是否存在有格子非空的玻璃 |
| | | Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_GLASS_GAP); |
| | | Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH); |
| | | if (CollectionUtils.isNotEmpty(inSlotGlassList)) { |
| | | //存在 将格子内的玻璃分别进行更新 |
| | | // List<HollowBigStorageCage> hollowBigStorageCageList = hollowBigStorageCageService.list(new LambdaQueryWrapper<HollowBigStorageCage>() |