hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
@@ -52,7 +52,7 @@ public static final Integer GLASS_STATE_SCHEDULE_ING = 104; public static final Integer GLASS_STATE_TAKE = 200; public static final Integer GLASS_STATE_DAMAGE = 201; public static final List<Integer> GLASS_STATE_IN_ALL = Arrays.asList(100, 102, 103); public static final List<Integer> GLASS_STATE_IN_ALL = Arrays.asList(100, 102, 103, 104); /** * 卧式理片笼详情表玻璃状态 hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/impl/DamageServiceImpl.java
@@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.mapper.GlassInfoMapper; import com.mes.pp.entity.BasicDataProduce; import com.mes.pp.entity.ReportingWork; import com.mes.work_assignment.entity.WorkAssignment; import com.mes.work_assignment.mapper.WorkAssignmentMapper; import org.springframework.beans.BeanUtils; @@ -18,6 +20,8 @@ import java.sql.Timestamp; import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> @@ -58,21 +62,134 @@ * 提交报工 */ @Override public void submitDamage(String startTime, String endTime, int type, int status, String workingProcedure){ public void submitDamage(String startTime, String endTime, int type, int status, String workingProcedures){ LambdaUpdateWrapper<Damage> damageUpdateWrapper=new LambdaUpdateWrapper<>(); damageUpdateWrapper.between(Damage::getDamageTime,startTime,endTime); LambdaQueryWrapper<Damage> damageLambdaQueryWrapper=new LambdaQueryWrapper<>() ; damageUpdateWrapper.between(Damage::getDamageTime,startTime,endTime); damageLambdaQueryWrapper.between(Damage::getDamageTime,startTime,endTime); if (type!=0){ damageUpdateWrapper.eq(Damage::getType,type); damageLambdaQueryWrapper.eq(Damage::getType,type); } if (status!=0){ damageUpdateWrapper.eq(Damage::getStatus,status); damageLambdaQueryWrapper.eq(Damage::getStatus,status); } if(!"0".equals(workingProcedure)){ damageUpdateWrapper.eq(Damage::getWorkingProcedure,workingProcedure); if(!"0".equals(workingProcedures)){ damageUpdateWrapper.eq(Damage::getWorkingProcedure,workingProcedures); damageLambdaQueryWrapper.eq(Damage::getWorkingProcedure,workingProcedures); } Damage damage=new Damage(); damage.setStatus(2); baseMapper.update(damage,damageUpdateWrapper); // Damage damage=new Damage(); // damage.setStatus(2); // baseMapper.update(damage,damageUpdateWrapper); List<Damage> damageList = baseMapper.selectList(damageLambdaQueryWrapper); Map<String, Map<String, Map<String, Map<String, List<Damage>>>>> resultMap = damageList.stream() .collect(Collectors.groupingBy( Damage::getProcessId, Collectors.groupingBy( Damage::getWorkingProcedure, Collectors.groupingBy( Damage::getDeviceName, Collectors.groupingBy(Damage::getTeamsGroupsName) ) ) )); // 遍历 resultMap for (Map.Entry<String, Map<String, Map<String, Map<String, List<Damage>>>>> processEntry : resultMap.entrySet()) { String processId = processEntry.getKey(); System.out.println("ProcessId: " + processId); // 获取第二层的 Map,按 workingProcedure 分组的结果 Map<String, Map<String, Map<String, List<Damage>>>> workingProcedureMap = processEntry.getValue(); // 遍历 workingProcedureMap for (Map.Entry<String, Map<String, Map<String, List<Damage>>>> workingProcedureEntry : workingProcedureMap.entrySet()) { String workingProcedure = workingProcedureEntry.getKey(); System.out.println(" WorkingProcedure: " + workingProcedure); // 获取第三层的 Map,按 deviceName 分组的结果 Map<String, Map<String, List<Damage>>> deviceNameMap = workingProcedureEntry.getValue(); // 遍历 deviceNameMap for (Map.Entry<String, Map<String, List<Damage>>> deviceNameEntry : deviceNameMap.entrySet()) { String deviceName = deviceNameEntry.getKey(); System.out.println(" DeviceName: " + deviceName); // 获取第四层的 Map,按 teamsGroupsName 分组的结果 Map<String, List<Damage>> teamsGroupsNameMap = deviceNameEntry.getValue(); // 遍历 teamsGroupsNameMap for (Map.Entry<String, List<Damage>> teamsGroupsNameEntry : teamsGroupsNameMap.entrySet()) { String teamsGroupsName = teamsGroupsNameEntry.getKey(); System.out.println(" TeamsGroupsName: " + teamsGroupsName); // 获取 Damage 列表 List<Damage> damageListForTeamsGroupsName = teamsGroupsNameEntry.getValue(); // 使用 stream 对 damageListForTeamsGroupsName 进行再次分组 Map<Integer, Map<Integer, Map<String, List<Damage>>>> groupedByOrderTechBreakage = damageListForTeamsGroupsName.stream() .collect(Collectors.groupingBy( Damage::getOrderNumber, Collectors.groupingBy( Damage::getTechnologyNumber, Collectors.groupingBy( Damage::getBreakageType, Collectors.toList() ) ) )); // 遍历 groupedByOrderTechBreakage for (Map.Entry<Integer, Map<Integer, Map<String, List<Damage>>>> orderEntry : groupedByOrderTechBreakage.entrySet()) { Integer orderNumber = orderEntry.getKey(); System.out.println(" OrderNumber: " + orderNumber); // 获取第二层的 Map,按 technologyNumber 分组的结果 Map<Integer, Map<String, List<Damage>>> technologyNumberMap = orderEntry.getValue(); // 遍历 technologyNumberMap for (Map.Entry<Integer, Map<String, List<Damage>>> technologyEntry : technologyNumberMap.entrySet()) { Integer technologyNumber = technologyEntry.getKey(); System.out.println(" TechnologyNumber: " + technologyNumber); // 获取第三层的 Map,按 breakageType 分组的结果 Map<String, List<Damage>> breakageTypeMap = technologyEntry.getValue(); // 遍历 breakageTypeMap for (Map.Entry<String, List<Damage>> breakageTypeEntry : breakageTypeMap.entrySet()) { String breakageType = breakageTypeEntry.getKey(); System.out.println(" BreakageType: " + breakageType); ReportingWork reportingWork=new ReportingWork(); reportingWork.setProcessId(processId); reportingWork.setThisProcess(workingProcedure); reportingWork.setDeviceName(deviceName); reportingWork.setTeamsGroupsName(teamsGroupsName); // 获取 Damage 列表 List<Damage> damageListForBreakageType = breakageTypeEntry.getValue(); int completedQuantity=0; int breakageQuantity=0; // 遍历 Damage 列表 for (Damage damage : damageListForBreakageType) { // 打印或处理每个 Damage 对象 System.out.println(" Damage: " + damage.toString()); if(damage.getType()==1){ completedQuantity+=1; }else if(damage.getType()==2){ breakageQuantity+=1; } } } } } } } } } } /** hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/BasicDataProduceController.java
New file @@ -0,0 +1,39 @@ package com.mes.pp.controller; import com.mes.pp.service.BasicDataProduceService; import com.mes.utils.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; /** * <p> * 前端控制器 * </p> * * @author wu * @since 2024-07-25 */ @Api(description = "生产基础数据") @RestController @RequestMapping("/basic_data_produce") public class BasicDataProduceController { @Autowired //获取待选择的工程号 private BasicDataProduceService basicDataProduceService; @ApiOperation("查询基础数据") @PostMapping("/selectBasicDataProduceGroup") //显示工程选择信息 @ResponseBody public Result selectBasicDataProduceGroup() { return Result.build(200, "查询成功", basicDataProduceService.selectBasicDataProduceGroup()); } } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/DamageDetailsController.java
New file @@ -0,0 +1,31 @@ package com.mes.pp.controller; import com.mes.pp.entity.BasicDataProduce; import com.mes.pp.entity.OptimizeProject; import com.mes.pp.entity.request.OptimizeRequest; import com.mes.pp.service.BasicDataProduceService; import com.mes.pp.service.OptimizeProjectService; import com.mes.utils.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * <p> * 前端控制器 * </p> * * @author wu * @since 2024-07-26 */ @RestController @RequestMapping("/damage_details") public class DamageDetailsController { } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/ReportingWorkDetailController.java
New file @@ -0,0 +1,21 @@ package com.mes.pp.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 前端控制器 * </p> * * @author wu * @since 2024-07-25 */ @RestController @RequestMapping("/reporting-work-detail") public class ReportingWorkDetailController { } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/BasicDataProduce.java
New file @@ -0,0 +1,55 @@ package com.mes.pp.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.sql.Timestamp; import java.time.LocalDateTime; import java.io.Serializable; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * * </p> * * @author wu * @since 2024-07-25 */ @Data @EqualsAndHashCode(callSuper = false) public class BasicDataProduce implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 基础数据类型 */ private String basicType; /** * 基础数据名称 */ private String basicName; /** * 基础数据类别 */ private String basicCategory; /** * 创建时间 */ private Timestamp createTime; /** * 修改时间 */ private Timestamp updateTime; } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/DamageDetails.java
New file @@ -0,0 +1,115 @@ package com.mes.pp.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * * </p> * * @author wu * @since 2024-07-26 */ @Data @EqualsAndHashCode(callSuper = false) public class DamageDetails implements Serializable { private static final long serialVersionUID = 1L; /** * <次破明细表> */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 报工编号 */ private String reportingWorkId; /** * 流程卡号 */ private String processId; /** * 序号 */ private Integer orderNumber; /** * 工艺确认序号(层号) */ private Integer technologyNumber; /** * 次破数量 */ private Integer breakageQuantity; /** * 次破类型 */ private String breakageType; /** * 次破原因 */ private String breakageReason; /** * 可利用(默认0,需要返工1) */ private Integer available; /** * 返工/补片数量 */ private Integer quantity; /** * 返工工序 */ private String returnProcess; /** * 责任工序 */ private String responsibleProcess; /** * 责任人员 */ private String responsiblePersonnel; /** * 责任班组 */ private String responsibleTeam; /** * 责任设备 */ private String responsibleEquipment; /** * 质检员 */ private String qualityInspector; /** * 补片状态(默认0,已补片1) */ private Integer patchStatus; /** * 质检状态(默认0,1待质检1,已质检2) */ private Integer qualityInsStatus; } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/ReportingWorkDetail.java
New file @@ -0,0 +1,151 @@ package com.mes.pp.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.time.LocalDateTime; import java.io.Serializable; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * * </p> * * @author wu * @since 2024-07-25 */ @Data @EqualsAndHashCode(callSuper = false) public class ReportingWorkDetail implements Serializable { private static final long serialVersionUID = 1L; /** * <报工明细> */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 报工编号 */ private String reportingWorkId; /** * 序号 */ private Integer orderNumber; /** * 工艺确认序号 */ private Integer technologyNumber; /** * 完工数量 */ private Integer completedQuantity; /** * 次破数量 */ private Integer breakageQuantity; /** * 次破类型 */ private String breakageType; /** * 次破原因 */ private String breakageReason; /** * 可利用(1可利用0默认) */ private Integer available; /** * 退回工序 */ private String returnProcess; /** * 责任工序 */ private String responsibleProcess; /** * 责任人员 */ private String responsiblePersonnel; /** * 责任班组 */ private String responsibleTeam; /** * 责任设备 */ private String responsibleEquipment; /** * 质检员 */ private String qualityInspector; /** * 补片状态 */ private Integer patchStatus; /** * 在制品名称 */ private String workProgress; /** * 质检状态 */ private Integer qualityInsStatus; /** * 报工类型 */ private Integer type; /** * 待返工数量 */ private Integer waitReworkQuantity; /** * 返工班组 */ private String reworkTeam; /** * 返工审核人 */ private String reviewer; /** * 返工审核状态 */ private String reviewStatus; /** * 返工时间 */ private LocalDateTime reworkTime; /** * 返工修改时间 */ private LocalDateTime reworkUpdateTime; } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/BasicDataProduceMapper.java
New file @@ -0,0 +1,18 @@ package com.mes.pp.mapper; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mes.pp.entity.BasicDataProduce; /** * <p> * Mapper 接口 * </p> * * @author wu * @since 2024-07-25 */ @DS("pp") public interface BasicDataProduceMapper extends BaseMapper<BasicDataProduce> { } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/ReportingWorkDetailMapper.java
New file @@ -0,0 +1,16 @@ package com.mes.pp.mapper; import com.mes.pp.entity.ReportingWorkDetail; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * Mapper 接口 * </p> * * @author wu * @since 2024-07-25 */ public interface ReportingWorkDetailMapper extends BaseMapper<ReportingWorkDetail> { } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/BasicDataProduceService.java
New file @@ -0,0 +1,20 @@ package com.mes.pp.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.pp.entity.BasicDataProduce; import java.util.List; import java.util.Map; /** * <p> * 服务类 * </p> * * @author wu * @since 2024-07-25 */ public interface BasicDataProduceService extends IService<BasicDataProduce> { Map<String, List<BasicDataProduce>> selectBasicDataProduceGroup(); } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/DamageDetailsService.java
New file @@ -0,0 +1,16 @@ package com.mes.pp.service; import com.mes.pp.entity.DamageDetails; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 服务类 * </p> * * @author wu * @since 2024-07-26 */ public interface DamageDetailsService extends IService<DamageDetails> { } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/ReportingWorkDetailService.java
New file @@ -0,0 +1,16 @@ package com.mes.pp.service; import com.mes.pp.entity.ReportingWorkDetail; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 服务类 * </p> * * @author wu * @since 2024-07-25 */ public interface ReportingWorkDetailService extends IService<ReportingWorkDetail> { } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/BasicDataProduceServiceImpl.java
New file @@ -0,0 +1,30 @@ package com.mes.pp.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mes.pp.entity.BasicDataProduce; import com.mes.pp.mapper.BasicDataProduceMapper; import com.mes.pp.service.BasicDataProduceService; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> * 服务实现类 * </p> * * @author wu * @since 2024-07-25 */ @Service public class BasicDataProduceServiceImpl extends ServiceImpl<BasicDataProduceMapper, BasicDataProduce> implements BasicDataProduceService { @Override public Map<String, List<BasicDataProduce>> selectBasicDataProduceGroup(){ List<BasicDataProduce> basicDataProduceList=baseMapper.selectList(null); Map<String, List<BasicDataProduce>> listMap = basicDataProduceList.stream().collect(Collectors.groupingBy(item -> item.getBasicType())); return listMap; } } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/DamageDetailsService.java
New file @@ -0,0 +1,16 @@ package com.mes.pp.service.impl; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.pp.entity.DamageDetails; /** * <p> * 服务类 * </p> * * @author wu * @since 2024-07-26 */ public interface DamageDetailsService extends IService<DamageDetails> { } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/ReportingWorkDetailService.java
New file @@ -0,0 +1,16 @@ package com.mes.pp.service.impl; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.pp.entity.ReportingWorkDetail; /** * <p> * 服务类 * </p> * * @author wu * @since 2024-07-25 */ public interface ReportingWorkDetailService extends IService<ReportingWorkDetail> { } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java
@@ -3,6 +3,7 @@ import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.service.BigStorageCageDetailsService; import com.mes.bigstorage.service.BigStorageCageService; import com.mes.common.utils.RedisUtil; import com.mes.utils.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; import java.util.Map; @@ -32,6 +34,8 @@ private BigStorageCageDetailsService bigStorageCageDetailsService; @Autowired private BigStorageCageService bigStorageCageService; @Resource private RedisUtil redisUtil; @ApiOperation("玻璃详情查询") @@ -100,7 +104,8 @@ @ApiOperation("是否钢化开关") @PostMapping("/temperingSwitch") public Result temperingSwitch(Boolean flag) { return Result.build(200, "修改成功", bigStorageCageDetailsService.temperingSwitch(flag)); bigStorageCageDetailsService.temperingSwitch(flag); return Result.build(200, "修改成功", redisUtil.getCacheObject("temperingSwitch")); } } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageCageDetailsMapper.java
@@ -32,7 +32,7 @@ * * @return */ TemperingLayoutDTO queryTemperingOccupySlot(@Param(value = "count") int count); List<TemperingLayoutDTO> queryTemperingOccupySlot(@Param(value = "count") int count); List<SlotSequenceDTO> queryGlassMaxAndMin(@Param(value = "engineerId") String engineerId, @Param(value = "temperingLayoutId") Integer temperingLayoutId); hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java
@@ -21,7 +21,9 @@ */ public interface BigStorageCageDetailsService extends IService<BigStorageCageDetails> { List<BigStorageCageDetails> selectTask(int taskType); List<BigStorageCageDetails> selectFeedTask(); List<BigStorageCageDetails> selectOutTask(); double selectGetBoard(String plcFeedReqLine); @@ -56,7 +58,7 @@ * * @return */ TemperingLayoutDTO queryTemperingOccupySlot(); List<TemperingLayoutDTO> queryTemperingOccupySlot(); /** * 获取版图每个格子的最大最小序号 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -87,56 +87,34 @@ private boolean sequenceOrder; /** * 查询进/出片任务 */ @Override public List<BigStorageCageDetails> selectTask(int taskType) { if (taskType == 1) { //进片任务数据 LambdaQueryWrapper<BigStorageCageDetails> feedWrapper = new LambdaQueryWrapper<>(); feedWrapper.eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN); List<BigStorageCageDetails> bigStorageCageDetailsList = baseMapper.selectList(feedWrapper); public List<BigStorageCageDetails> selectFeedTask(){ //进片任务数据 LambdaQueryWrapper<BigStorageCageDetails> feedWrapper = new LambdaQueryWrapper<>(); feedWrapper.eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW); List<BigStorageCageDetails> bigStorageCageDetailsList = baseMapper.selectList(feedWrapper); LambdaQueryWrapper<BigStorageCageFeedTask> feedTaskWrapper = new LambdaQueryWrapper<>(); feedTaskWrapper .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) .isNotNull(BigStorageCageFeedTask::getTargetSlot); List<BigStorageCageFeedTask> bigStorageCageFeedTaskList = bigStorageCageFeedTaskMapper.selectList(feedTaskWrapper); Map<String, BigStorageCageFeedTask> listMap = bigStorageCageFeedTaskList.stream() .collect(Collectors.toMap(BigStorageCageFeedTask::getGlassId, task -> task)); LambdaQueryWrapper<BigStorageCageFeedTask> feedTaskWrapper = new LambdaQueryWrapper<>(); feedTaskWrapper .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) .isNotNull(BigStorageCageFeedTask::getTargetSlot); List<BigStorageCageFeedTask> bigStorageCageFeedTaskList = bigStorageCageFeedTaskMapper.selectList(feedTaskWrapper); Map<String, BigStorageCageFeedTask> listMap = bigStorageCageFeedTaskList.stream() .collect(Collectors.toMap(BigStorageCageFeedTask::getGlassId, task -> task)); Iterator<BigStorageCageDetails> iterator = bigStorageCageDetailsList.iterator(); while (iterator.hasNext()) { BigStorageCageDetails bigStorageCageDetails = iterator.next(); BigStorageCageFeedTask bigStorageCageFeedTask = listMap.get(bigStorageCageDetails.getGlassId()); bigStorageCageDetails.setBigStorageCageFeedTask(bigStorageCageFeedTask); if (bigStorageCageDetails.getBigStorageCageFeedTask() == null) { iterator.remove(); } } LambdaQueryWrapper<BigStorageCageFeedTask> feedTaskNoTargetWrapper = new LambdaQueryWrapper<>(); feedTaskNoTargetWrapper .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT) .isNull(BigStorageCageFeedTask::getTargetSlot); List<BigStorageCageFeedTask> bigStorageCageFeedTaskNoTargetList = bigStorageCageFeedTaskMapper.selectList(feedTaskNoTargetWrapper); for (BigStorageCageFeedTask bigStorageCageFeedTask : bigStorageCageFeedTaskNoTargetList ) { BigStorageCageDetails bigStorageCageDetails = new BigStorageCageDetails(); LambdaQueryWrapper<GlassInfo> glassInfoWrapper = new LambdaQueryWrapper<>(); glassInfoWrapper.eq(GlassInfo::getGlassId, bigStorageCageFeedTask.getGlassId()); GlassInfo glassInfo = glassInfoMapper.selectOne(glassInfoWrapper); BeanUtils.copyProperties(glassInfo, bigStorageCageDetails); bigStorageCageDetails.setBigStorageCageFeedTask(bigStorageCageFeedTask); bigStorageCageDetailsList.add(bigStorageCageDetails); } return bigStorageCageDetailsList; } else { //出片任务数据 LambdaQueryWrapper<BigStorageCageDetails> outWrapper = new LambdaQueryWrapper<>(); outWrapper.eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN); List<BigStorageCageDetails> bigStorageCageDetailsList = baseMapper.selectList(outWrapper); } @Override public List<BigStorageCageDetails> selectOutTask(){ LambdaQueryWrapper<BigStorageCageDetails> outWrapper = new LambdaQueryWrapper<>(); outWrapper.in(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING,Const.GLASS_STATE_SCHEDULE_ING); List<BigStorageCageDetails> bigStorageCageDetailsList = baseMapper.selectList(outWrapper); LambdaQueryWrapper<BigStorageCageOutTask> outTaskWrapper = new LambdaQueryWrapper<>(); outTaskWrapper.lt(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_SUCCESS); List<BigStorageCageOutTask> bigStorageCageOutTaskList = bigStorageCageOutTaskMapper.selectList(outTaskWrapper); @@ -152,13 +130,10 @@ BigStorageCageDetails bigStorageCageDetails = iterator.next(); BigStorageCageOutTask bigStorageCageOutTask = listMap.get(bigStorageCageDetails.getGlassId()); bigStorageCageDetails.setBigStorageCageOutTask(bigStorageCageOutTask); if (bigStorageCageDetails.getBigStorageCageOutTask() == null) { iterator.remove(); } } return bigStorageCageDetailsList; } } /** * 判断当前玻璃是否能上车 @@ -361,7 +336,7 @@ @Override public TemperingLayoutDTO queryTemperingOccupySlot() { public List<TemperingLayoutDTO> queryTemperingOccupySlot() { return baseMapper.queryTemperingOccupySlot(minCount); } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcSlicecage.java
@@ -45,11 +45,11 @@ jsonObject.append("bigStorageCageInfos", bigStorageCageService.querybigStorageCageDetail()); //进片任务数据 List<BigStorageCageDetails> bigStorageCageDetailsFeedTask=bigStorageCageDetailsService.selectTask(1); List<BigStorageCageDetails> bigStorageCageDetailsFeedTask=bigStorageCageDetailsService.selectFeedTask(); jsonObject.append("bigStorageCageDetailsFeedTask", bigStorageCageDetailsFeedTask); //出片任务数据 List<BigStorageCageDetails> bigStorageCageDetailsOutTask=bigStorageCageDetailsService.selectTask(2); List<BigStorageCageDetails> bigStorageCageDetailsOutTask=bigStorageCageDetailsService.selectOutTask(); jsonObject.append("bigStorageCageDetailsOutTask", bigStorageCageDetailsOutTask); //理片笼使用情况 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
@@ -244,7 +244,7 @@ log.info("大理片笼空车进片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); } @Scheduled(fixedDelay = 5000) @Scheduled(fixedDelay = 2000) public void plcToHomeEdgOutTask() { Date startDate = new Date(); log.info("大理片笼空车进片任务开始执行时间:{}", startDate); @@ -311,48 +311,53 @@ } } //执行内部调度任务 TemperingLayoutDTO temperingOccupySlot = bigStorageCageDetailsService.queryTemperingOccupySlot(); if (null != temperingOccupySlot) { 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)); 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)); } //新增调度任务 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; } //新增调度任务 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()).eq(BigStorageCageDetails::getGlassId, glassList)); } //向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; } } //向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; } } @@ -371,16 +376,16 @@ .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT)); if (CollectionUtils.isNotEmpty(inSuccessGlass)) { log.info("3、获取进片已完成的玻璃信息id:{}", inSuccessGlass); List<String> inSuccessGlassIds = inSuccessGlass.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()); 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:{}", inSuccessGlassIds); log.info("4、大理片笼进片状态已完成已完成的玻璃信息id:{}", inSuccessGlass); //更新理片笼玻璃尺寸 updateSlotRemain(inSuccessGlassIds, Boolean.TRUE); updateSlotRemainBySlots(inSuccessGlassSlot); log.info("5、大理片笼进片目标格子尺寸更新完成"); } @@ -412,10 +417,47 @@ return storageCageDTO; }).collect(Collectors.toList()); bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_OUT); List<String> outSuccessGlassIds = outSuccessGlass.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); log.info("4、大理片笼出片状态已完成已完成的玻璃信息id:{}", outSuccessGlassIds); List<Integer> outSuccessSlotList = outSuccessGlass.stream().map(BigStorageCageOutTask::getStartSlot).collect(Collectors.toList()); log.info("4、大理片笼出片状态已完成已完成的玻璃信息id:{}", outSuccessGlass); //更新理片笼玻璃尺寸 updateSlotRemain(outSuccessGlassIds, Boolean.FALSE); 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、大理片笼进片目标格子尺寸更新完成"); } } @@ -439,8 +481,8 @@ log.info("获取进片任务表中破损的玻璃信息{}", inDamageTaskInfoList); bigStorageCageFeedTaskService.remove(new LambdaQueryWrapper<BigStorageCageFeedTask>().eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_DAMAGE)); //理片笼详情表数据状态更新 bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() .set(BigStorageCageDetails::getState, Const.GLASS_STATE_DAMAGE).in(BigStorageCageDetails::getGlassId, inDamageTaskInfoList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()))); bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>() .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW).in(BigStorageCageDetails::getGlassId, inDamageTaskInfoList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()))); //将破损信息新增入破损表 for (BigStorageCageFeedTask bigStorageCageFeedTask : inDamageTaskInfoList) { Damage damage = new Damage(); @@ -462,9 +504,8 @@ List<String> glassIdList = outDamageTaskInfoList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); //移除钢化下片表数据 temperingGlassInfoService.remove(new LambdaQueryWrapper<TemperingGlassInfo>().in(TemperingGlassInfo::getGlassId, glassIdList)); //理片笼详情表数据状态更新 bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>() .set(BigStorageCageDetails::getState, Const.GLASS_STATE_DAMAGE).in(BigStorageCageDetails::getGlassId, glassIdList)); //理片笼详情表数据状态删除 bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>().in(BigStorageCageDetails::getGlassId, glassIdList)); //将破损信息新增入破损表 for (BigStorageCageOutTask bigStorageCageOutTask : outDamageTaskInfoList) { @@ -623,9 +664,9 @@ BeanUtils.copyProperties(info, cageDetails); //2、获取目标格子信息 BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info); //3、更新大理片笼表剩余宽度(更新大理片笼剩余尺寸移到进笼完成后执行) // bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - info.getWidth() - glassGap) // .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot())); //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); @@ -636,6 +677,7 @@ cageDetails.setDeviceId(bigStorageDTO.getDeviceId()); cageDetails.setGap(glassGap); bigStorageCageDetailsService.save(cageDetails); } sendTaskListToPLC(taskList, line); return Boolean.TRUE; @@ -716,47 +758,29 @@ return Boolean.TRUE; } /** * 更新笼子内格子的剩余尺寸 * * @param taskGlassIds 本次任务出去的玻璃ids * @param flag 是否进出片 true 进片 false 出片 */ public void updateSlotRemain(List<String> taskGlassIds, Boolean flag) { //按照玻璃id获取玻璃信息及玻璃的格子号 List<BigStorageCageDetails> glassList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() .in(BigStorageCageDetails::getGlassId, taskGlassIds)); //获取需要出去/进笼(包括待出去的)的所有玻璃格子号 List<Integer> slotList = glassList.stream().map(BigStorageCageDetails::getSlot).distinct().collect(Collectors.toList()); 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 = null; if (flag) { slotRemainMap = inSlotGlassList.stream().filter(e -> taskGlassIds.contains(e.getGlassId())) .collect(Collectors.groupingBy(BigStorageCageDetails::getSlot, Collectors.summingDouble(item -> item.getWidth() + glassGap))); } else { slotRemainMap = inSlotGlassList.stream().filter(e -> !taskGlassIds.contains(e.getGlassId())) .collect(Collectors.groupingBy(BigStorageCageDetails::getSlot, Collectors.summingDouble(item -> item.getWidth() + glassGap))); } //格子内有玻璃的,计算为: 格子的宽度 - (给子内玻璃的尺寸+间距) if (CollectionUtils.isNotEmpty(slotRemainMap)) { 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) -> { bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth - v) double remainWidth = slotWidth - v >= 0 ? slotWidth - v : 0; bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, remainWidth) .eq(BigStorageCage::getSlot, e)); }); } //只更新进笼完成的状态,如果进笼完成,格子内必定有玻璃,不存在出片后格子内没有玻璃的情况,所有格子尺寸重置,只能存在于出片任务 if (!flag) { 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)); } //过滤不存在玻璃的格子 将宽度重置为原始宽度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) { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -52,7 +52,7 @@ GROUP BY ENGINEER_ID, TEMPERING_LAYOUT_ID HAVING SLOT_COUNT >= #{count} ORDER BY SLOT_COUNT DESC LIMIT 1 ORDER BY SLOT_COUNT DESC </select> <select id="queryGlassMaxAndMin" resultMap="slotSequenceDTO"> SELECT T.*,