UI-Project/src/views/ReportWork/reportWork.vue
@@ -36,15 +36,15 @@ <el-table height="700" ref="table" :data="reportData" :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }"> <el-table-column prop="teamsGroupsName" align="center" :label="$t('reportmanage.reporteam')" min-width="135" /> min-width="100" /> <el-table-column prop="deviceName" align="center" :label="$t('reportmanage.reportingequipment')" min-width="156" /> min-width="100" /> <el-table-column prop="line" align="center" :label="$t('reportmanage.line')" min-width="120" /> <el-table-column prop="workingProcedure" align="center" :label="$t('reportmanage.process')" min-width="120" /> <el-table-column prop="glassId" align="center" :label="$t('reportmanage.glassID')" min-width="130" /> <el-table-column prop="engineerId" align="center" :label="$t('reportmanage.projectnumber')" min-width="120" /> <el-table-column prop="workingProcedure" align="center" :label="$t('reportmanage.process')" min-width="100" /> <el-table-column prop="glassId" align="center" :label="$t('reportmanage.glassID')" min-width="100" /> <el-table-column prop="engineerId" align="center" :label="$t('reportmanage.projectnumber')" min-width="100" /> <el-table-column prop="temperingLayoutId" align="center" :label="$t('reportmanage.layoutID')" min-width="120" /> min-width="100" /> <el-table-column prop="formattedCreateTime" align="center" :label="$t('reportmanage.productiontime')" min-width="230" /> <el-table-column @@ -71,10 +71,12 @@ </el-tag> </template> </el-table-column> <el-table-column prop="processId" align="center" :label="$t('reportmanage.processcards')" min-width="140" /> <el-table-column prop="orderNumber" align="center" :label="$t('reportmanage.number')" min-width="120" /> <el-table-column prop="technologyNumber" align="center" :label="$t('reportmanage.layer')" min-width="120" /> <el-table-column prop="breakageType" align="center" :label="$t('reportmanage.typebreakage')" min-width="180"> <el-table-column prop="processId" align="center" :label="$t('reportmanage.processcards')" min-width="100" /> <el-table-column prop="orderNumber" align="center" :label="$t('reportmanage.number')" min-width="100" /> <el-table-column prop="technologyNumber" align="center" :label="$t('reportmanage.layer')" min-width="50" /> <el-table-column prop="width" align="center" :label="$t('processCard.width')" min-width="70" /> <el-table-column prop="height" align="center" :label="$t('processCard.height')" min-width="70" /> <el-table-column prop="breakageType" align="center" :label="$t('reportmanage.typebreakage')" min-width="100"> <template #default="{ row }"> <el-select v-model="row.breakageType" filterable :placeholder="$t('reportmanage.pcausebreakage')" :disabled="selectedType" clearable @input="handleInputChangea($event, row.id)"> UI-Project/src/views/hollow/hollowequipment.vue
@@ -1885,7 +1885,9 @@ const blinde = ref(false) const labelPrint = ref(false); const handleBinde = (flowCard) => { const summary = flowCard.reduce((map, item) => { const summary = flowCard .filter(item => item.isPair !== 0) .reduce((map, item) => { const key = `${item.hollowSequence}`; if (!map[key]) { map[key] = { @@ -1898,6 +1900,7 @@ return map; }, {}); listFlow.value = Object.values(summary); console.log(listFlow.value) blinde.value = true; getTags(); hiprint.init(); UI-Project/src/views/hollow/hollowequipmenthree.vue
@@ -1144,7 +1144,9 @@ const blinde = ref(false) const labelPrint = ref(false); const handleBinde = (flowCard) => { const summary = flowCard.reduce((map, item) => { const summary = flowCard .filter(item => item.isPair !== 0) .reduce((map, item) => { const key = `${item.hollowSequence}`; if (!map[key]) { map[key] = { UI-Project/src/views/hollow/hollowequipmenttwo.vue
@@ -681,7 +681,9 @@ blindc.value = true; }; const handleBinde = (flowCard) => { const summary = flowCard.reduce((map, item) => { const summary = flowCard .filter(item => item.isPair !== 0) .reduce((map, item) => { const key = `${item.hollowSequence}`; if (!map[key]) { map[key] = { hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/controller/DamageController.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mes.damage.entity.Damage; import com.mes.damage.entity.DamagePrint; import com.mes.damage.entity.dto.DamageDTO; import com.mes.damage.service.DamageService; import com.mes.opctask.entity.LoadGlassDeviceTaskHistory; import com.mes.utils.Result; @@ -34,7 +35,7 @@ @ApiOperation("报工数据查询") @PostMapping("/selectDamage") public Result<Page<Damage>> selectDamage(@RequestBody Map map) { public Result<Page<DamageDTO>> selectDamage(@RequestBody Map map) { String startTime = map.get("startTime").toString(); String endTime = map.get("endTime").toString(); int type = Integer.parseInt(map.get("type").toString()); hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/dto/DamageDTO.java
New file @@ -0,0 +1,29 @@ package com.mes.damage.entity.dto; import com.mes.damage.entity.Damage; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * * </p> * * @author wu * @since 2024-06-25 */ @Data @EqualsAndHashCode(callSuper = false) public class DamageDTO extends Damage { /** * 宽 */ private Integer width; /** * 宽 */ private Integer height; } hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/mapper/DamageMapper.java
@@ -3,6 +3,7 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.github.yulichang.base.MPJBaseMapper; import com.mes.damage.entity.Damage; import com.mes.damage.entity.dto.DamageDTO; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -19,4 +20,12 @@ public interface DamageMapper extends MPJBaseMapper<Damage> { List<Damage> queryUnTempByFlowCardId(@Param("flowCardId") String flowCardId); List<DamageDTO> selectDamageList( @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("type") int type, @Param("status") int status, @Param("workingProcedure") String workingProcedure ); } hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/DamageService.java
@@ -4,6 +4,7 @@ import com.github.yulichang.base.MPJBaseService; import com.mes.damage.entity.Damage; import com.mes.damage.entity.DamagePrint; import com.mes.damage.entity.dto.DamageDTO; import com.mes.opctask.entity.LoadGlassDeviceTaskHistory; import com.mes.pp.entity.ReportingWork; import com.mes.pp.entity.ReportingWorkDetail; @@ -21,7 +22,7 @@ */ public interface DamageService extends MPJBaseService<Damage> { Page<Damage> selectDamage( Page<DamageDTO> selectDamage( String startTime, String endTime, int type, hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/impl/DamageServiceImpl.java
@@ -3,6 +3,7 @@ import cn.hutool.json.JSONArray; 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.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; @@ -11,6 +12,7 @@ import com.mes.common.config.Const; import com.mes.damage.entity.Damage; import com.mes.damage.entity.DamagePrint; import com.mes.damage.entity.dto.DamageDTO; import com.mes.damage.mapper.DamageMapper; import com.mes.damage.service.DamageService; import com.mes.glassinfo.entity.GlassInfo; @@ -36,6 +38,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -67,17 +70,18 @@ /** * 分页查询损坏记录 * @param startTime 开始时间(格式:yyyy-MM-dd HH:mm:ss) * @param endTime 结束时间(格式:yyyy-MM-dd HH:mm:ss) * @param type 损坏类型(0表示查询所有类型) * @param status 状态(0表示查询所有状态) * * @param startTime 开始时间(格式:yyyy-MM-dd HH:mm:ss) * @param endTime 结束时间(格式:yyyy-MM-dd HH:mm:ss) * @param type 损坏类型(0表示查询所有类型) * @param status 状态(0表示查询所有状态) * @param workingProcedure 工序("0"表示查询所有工序) * @param pageNum 页码(从1开始) * @param pageSize 每页条数 * @param pageNum 页码(从1开始) * @param pageSize 每页条数 * @return 分页后的损坏记录列表 */ @Override public Page<Damage> selectDamage( public Page<DamageDTO> selectDamage( String startTime, String endTime, int type, @@ -86,15 +90,27 @@ int pageNum, // 新增:动态页码 int pageSize // 新增:动态每页条数 ) { Page<Damage> page = new Page<>(pageNum, pageSize); LambdaQueryWrapper<Damage> damageSelectWrapper = new LambdaQueryWrapper<>(); damageSelectWrapper.between(Damage::getDamageTime, startTime, endTime) .eq(type != 0, Damage::getType, type) .eq(status != 0, Damage::getStatus, status) .eq(!"0".equals(workingProcedure), Damage::getWorkingProcedure, workingProcedure); return this.page(page, damageSelectWrapper); if (workingProcedure == null || workingProcedure.trim().isEmpty() || "0".equals(workingProcedure)) { workingProcedure = null; } Page<DamageDTO> page = new Page<>(pageNum, pageSize); List<DamageDTO> damages = this.baseMapper.selectDamageList( startTime, endTime, type, status, workingProcedure ); page.setTotal(damages.size()); int startIndex = (int) ((pageNum - 1) * pageSize); int endIndex = Math.min((int) (pageNum * pageSize), damages.size()); if (startIndex < endIndex) { List<DamageDTO> pageRecords = damages.subList(startIndex, endIndex); page.setRecords(pageRecords); } else { page.setRecords(Collections.emptyList()); } return page; } /** @@ -432,7 +448,7 @@ } @Override public List<Damage> queryUnTempByFlowCardId(String flowCardId){ public List<Damage> queryUnTempByFlowCardId(String flowCardId) { return baseMapper.queryUnTempByFlowCardId(flowCardId); } } hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/ProcessCardReport.java
New file @@ -0,0 +1,89 @@ package com.mes.order.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; /** * <p> * * </p> * * @author wu * @since 2024-06-17 */ @Data @EqualsAndHashCode(callSuper = false) public class ProcessCardReport implements Serializable { private static final long serialVersionUID = 1L; /** * <订单表> */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 订单Id */ private String orderId; /** * 流程卡号 */ private String processId; /** * 订单序号 */ private Integer orderNumber; /** * 层号 */ private Integer technologyNumber; /** * 工艺 */ private String process; /** * 累计报工数 */ private Integer reportWorkNumCount; /** * 报工数 */ private Integer reportWorkNum; /** * 破损数量 */ private Integer brokenNum; /** * 创建时间 */ private Data createTime; /** * 最后一次报工时间 */ private Data updateTime; /** * 流程卡数量 */ private Integer quantity; /** * 缺片数量 */ private Integer lackQuantity; } hangzhoumesParent/common/servicebase/src/main/resources/mapper/DamageMapper.xml
New file @@ -0,0 +1,48 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mes.damage.mapper.DamageMapper"> <select id="queryUnTempByFlowCardId" resultType="com.mes.damage.entity.Damage"> SELECT glass_id, order_number, technology_number, working_procedure FROM ( SELECT glass_id, order_number, technology_number, working_procedure, ROW_NUMBER() OVER ( PARTITION BY glass_id ORDER BY damage_time DESC ) AS rn FROM damage WHERE process_id = #{flowCardId} AND glass_id NOT IN ( SELECT DISTINCT glass_id FROM damage WHERE process_id = #{flowCardId} AND working_procedure = "钢化" ) ) t WHERE rn = 1; </select> <select id="selectDamageList" resultType="com.mes.damage.entity.dto.DamageDTO"> SELECT t.*,t1.width,t1.height FROM damage t left join glass_info t1 on t.glass_id=t1.glass_id <where> damage_time BETWEEN #{startTime} AND #{endTime} <if test="type != null and type != 0"> AND t.type = #{type} </if> <if test="status != null and status != 0"> AND t.status = #{status} </if> <if test="workingProcedure != null"> AND t.working_procedure = #{workingProcedure} </if> </where> </select> </mapper> hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageNewTask.java
@@ -3,8 +3,8 @@ 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.xingshuangs.iot.protocol.s7.serializer.S7Serializer; import com.github.yulichang.toolkit.JoinWrappers; import com.kangaroohy.milo.model.ReadWriteEntity; @@ -414,6 +414,8 @@ LambdaQueryWrapper<BigStorageCage> queryWrapper = new LambdaQueryWrapper<BigStorageCage>() .eq(BigStorageCage::getRemainWidth, slotWidth) .eq(BigStorageCage::getEnableState, Const.SLOT_ON) .le(BigStorageCage::getMinThickness, info.getThickness()) .ge(BigStorageCage::getMaxThickness, info.getThickness()) .orderByAsc(BigStorageCage::getDeviceId).orderByAsc(BigStorageCage::getSlot) .last("limit 1"); @@ -478,13 +480,30 @@ String temperingEngineerId = redisUtil.getCacheObject("temperingEngineerId"); if (StringUtils.isNotBlank(temperingEngineerId)) { TemperingGlassInfo temperingGlassInfo = temperingGlassInfoService.getOne(new QueryWrapper<TemperingGlassInfo>() .select("Top 1 *") .eq("engineer_id", temperingEngineerId) .orderByDesc("tempering_layout_id")); List<TemperingGlassInfo> temperingGlassInfoList = temperingGlassInfoService.list( new LambdaQueryWrapper<TemperingGlassInfo>() .eq(TemperingGlassInfo::getEngineerId, temperingEngineerId) .orderByAsc(TemperingGlassInfo::getId) ); int temperingLayoutId = 1; if (temperingGlassInfo != null) { temperingLayoutId = temperingGlassInfo.getTemperingLayoutId() + 1; if (CollectionUtils.isEmpty(temperingGlassInfoList)) { temperingLayoutId = 1; } else { List<Integer> tempIds = temperingGlassInfoList.stream() .map(TemperingGlassInfo::getTemperingLayoutId) .distinct() .sorted() .collect(Collectors.toList()); int expected = 1; for (int current : tempIds) { if (current > expected) { break; // 找到第一个缺失值,跳出循环 } else if (current == expected) { expected++; // 连续则递增期望的值 } } temperingLayoutId = expected; // 缺失则为expected,连续则为max+1 } List<GlassInfo> glassInfos = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getEngineerId, temperingEngineerId).eq(GlassInfo::getTemperingLayoutId, temperingLayoutId)); if (CollectionUtil.isEmpty(glassInfos)) { @@ -575,6 +594,7 @@ .eq(BigStorageCage::getEnableState, Const.SLOT_ON)); //定义10个格子为阈值 if (count <= 10) { log.info("笼子超过阈值,执行4号笼子调度逻辑"); //获取序号为1的格子 将格子内的所有玻璃送到对应的笼子 BigStorageCage bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>() .eq(BigStorageCage::getRemainWidth, slotWidth) @@ -582,15 +602,18 @@ .in(BigStorageCage::getDeviceId, Arrays.asList(5, 6)) .orderByAsc(BigStorageCage::getDeviceId).orderByAsc(BigStorageCage::getSlot) .last("limit 1")); list = bigStorageCageDetailsService.queryNeedDispatch(); computeOutGlassInfoByVirtualSlot(list, "big_storage_cage_out_one_task", bigStorageCage.getSlot(), Const.GLASS_STATE_SCHEDULE_ING, Const.BIG_STORAGE_BEFORE_DISPATCH); List<Integer> slotList = new ArrayList<>(); slotList.add(bigStorageCage.getSlot()); slotList.add(list.get(0).getSlot()); updateSlotRemainBySlots(slotList); return; if (null != bigStorageCage) { list = bigStorageCageDetailsService.queryNeedDispatch(); if (CollectionUtil.isNotEmpty(list)) { computeOutGlassInfoByVirtualSlot(list, "big_storage_cage_out_one_task", bigStorageCage.getSlot(), Const.GLASS_STATE_SCHEDULE_ING, Const.BIG_STORAGE_BEFORE_DISPATCH); List<Integer> slotList = new ArrayList<>(); slotList.add(bigStorageCage.getSlot()); slotList.add(list.get(0).getSlot()); updateSlotRemainBySlots(slotList); return; } } } //生成调度任务按照组号组序由1开始依次往5号笼子送小片 BigStorageSlotDTO slotDTO = bigStorageCageDetailsService.queryNeedDispatchSlotBySequence(); hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -308,7 +308,7 @@ FROM big_storage_cage_details WHERE STATE = 100 AND SLOT = (SELECT SLOT FROM big_storage_cage_details WHERE STATE = 100 AND sequence = 1 order by slot desc LIMIT 1) (SELECT SLOT FROM big_storage_cage_details WHERE STATE = 100 AND sequence = 1 AND device_id = 4 order by slot desc LIMIT 1) ORDER BY tempering_feed_sequence </select> hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageHollowTask.java
@@ -1079,7 +1079,7 @@ } private List<HollowGlassQueueInfo> computeOutHollowQueue(List<HollowGlassQueueInfo> queueInfoList, HollowGlassOutRelationInfo hollowGlassOutRelationInfo) { if (CollectionUtil.isNotEmpty(queueInfoList)) { if (CollectionUtil.isEmpty(queueInfoList)) { return new ArrayList<>(); } //任务为强制,只直接返回原有的队列 @@ -1093,11 +1093,6 @@ List<HollowGlassQueueInfo> resultQueue = new ArrayList<>(); for (List<HollowGlassQueueInfo> items : gridGroups.values()) { // 情况1:格子内只有一个数据且未配对 - 过滤掉 if (items.size() == 1 && 0 == items.get(0).getSlot()) { continue; } // 情况2:格子内全部为未配对的数据 - 过滤掉 boolean allUnpaired = items.stream().noneMatch(e -> e.getIsPair() == 1); if (allUnpaired) { @@ -1106,6 +1101,7 @@ // 否则保留这个格子内的所有数据 resultQueue.addAll(items); } Collections.sort(resultQueue, Comparator.comparing(HollowGlassQueueInfo::getId)); return resultQueue; }