diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkPlan.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkPlan.java index 5a5d3b93..d404f46b 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkPlan.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkPlan.java @@ -98,12 +98,12 @@ public class WorkPlan extends BaseEntity { * 计划开始 */ @Schema(description = "计划开始") - private LocalDateTime startTime; + private LocalDateTime planStartTime; /** * 计划结束 */ @Schema(description = "计划结束") - private LocalDateTime endTime; + private LocalDateTime planEndTime; /** * 加工班组 */ diff --git a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkOrderEntity.java b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkOrderEntity.java index 42e2958d..db6fc10f 100644 --- a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkOrderEntity.java +++ b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkOrderEntity.java @@ -330,5 +330,27 @@ public class WorkOrderEntity extends BaseEntity { @Schema(description = "零件号") private String partCode; + /** + * 计划开始 + */ + @Schema(description = "计划开始") + private LocalDateTime planStartTime; + /** + * 计划结束 + */ + @Schema(description = "计划结束") + private LocalDateTime planEndTime; + + /** + * 实际开始 + */ + @Schema(description = "实际开始") + private LocalDateTime factStartTime; + /** + * 实际结束 + */ + @Schema(description = "实际结束") + private LocalDateTime factEndTime; + } diff --git a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java index fd403ece..0f41ac6d 100644 --- a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java +++ b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java @@ -102,12 +102,12 @@ public class WorkPlanEntity extends BaseEntity { * 计划开始 */ @Schema(description = "计划开始") - private LocalDateTime startTime; + private LocalDateTime planStartTime; /** * 计划结束 */ @Schema(description = "计划结束") - private LocalDateTime endTime; + private LocalDateTime planEndTime; /** * 加工班组 */ @@ -157,12 +157,12 @@ public class WorkPlanEntity extends BaseEntity { * 实际开始 */ @Schema(description = "实际开始") - private Date factStartTime; + private LocalDateTime factStartTime; /** * 实际结束 */ @Schema(description = "实际结束") - private Date factEndTime; + private LocalDateTime factEndTime; /** * */ @@ -269,4 +269,14 @@ public class WorkPlanEntity extends BaseEntity { */ private String teamMembers; + /** + * 班组人员 + */ + private String factTeamMembers; + + /** + * 零件号 + */ + private String partCode; + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaSaveServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaSaveServiceImpl.java index a7a0ae98..d5858304 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaSaveServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaSaveServiceImpl.java @@ -521,10 +521,10 @@ public class PdaSaveServiceImpl extends BaseServiceImpl> selectQuaExecuteAnalysisPage(WorkPlanVO workPlan, Query query) { + IPage pages = workOrderService.selectQuaExecuteAnalysisPage(Condition.getPage(query), workPlan); + return R.data(pages); + } + + /** + * 执行分析-按作业中心 自定义分页 + */ + @GetMapping("/selectCenterExecuteList") + @ApiOperationSupport(order = 3) + @Operation(summary = "分页", description = "传入WorkOrder") + public R> selectCenterExecuteList(WorkPlanVO workPlan) { + List list = workOrderService.selectCenterExecuteList(workPlan); + return R.data(list); + } + + /** + * 资质执行分析 自定义分页 + */ + @GetMapping("/selectOrderExecuteDetailPage") + @ApiOperationSupport(order = 3) + @Operation(summary = "分页", description = "传入WorkOrder") + public R> selectOrderExecuteDetailPage(WorkPlanVO workPlan, Query query) { + IPage pages = workOrderService.selectOrderExecuteDetailPage(Condition.getPage(query), workPlan); + return R.data(pages); + } + } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java index 8cfbe779..1926cd65 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java @@ -34,6 +34,7 @@ import org.springblade.scheduling.pojo.entity.WorkOrderEntity; import org.springblade.scheduling.scheduling.excel.SchedulingBoardExcel; import org.springblade.scheduling.scheduling.excel.WorkOrderExcel; import org.springblade.scheduling.pojo.vo.WorkOrderVO; +import org.springblade.scheduling.scheduling.vo.WorkPlanVO; import java.util.List; @@ -81,4 +82,11 @@ public interface WorkOrderMapper extends BaseMapper { List selectGlassCakeOrderPage(IPage page, WorkOrderVO workOrder); + + List selectQuaExecuteAnalysisPage(IPage page, WorkPlanVO workPlan); + + List selectCenterExecuteList(WorkPlanVO workPlan); + + List selectOrderExecuteDetailPage(IPage page, WorkPlanVO workPlan); + } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml index 17105a4d..b5e42fe3 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml @@ -97,10 +97,10 @@ to_char(g.receive_time,'YYYY-MM-DD') AS "receiveTime", f.name AS "currentProcessName", d.name AS "processName", - to_char(b.start_time,'YYYY-MM-DD HH24:MI') AS "startTime", - to_char(b.end_time,'YYYY-MM-DD HH24:MI') AS "endTime", - to_char(b.start_time,'YYYY-MM-DD HH24:MI:SS') AS "planStartTime", - to_char(b.end_time,'YYYY-MM-DD HH24:MI:SS') AS "planEndTime", + to_char(b.plan_start_time,'YYYY-MM-DD HH24:MI') AS "startTime", + to_char(b.plan_end_time,'YYYY-MM-DD HH24:MI') AS "endTime", + to_char(b.plan_start_time,'YYYY-MM-DD HH24:MI:SS') AS "planStartTime", + to_char(b.plan_end_time,'YYYY-MM-DD HH24:MI:SS') AS "planEndTime", to_char(b.fact_start_time,'YYYY-MM-DD HH24:MI:SS') AS "factStartTime", to_char(b.fact_end_time,'YYYY-MM-DD HH24:MI:SS') AS "factEndTime", c.ts_name AS "teamName", @@ -119,12 +119,12 @@ LEFT JOIN MES_YIELD_ORDER g on g.id = a.yo_id a.is_deleted = 0 and b.is_deleted = 0 and a.status in (1,2,3,5) - and b.start_time is not null and b.end_time is not null and g.work_center_id = 81 + and b.plan_start_time is not null and b.plan_end_time is not null and g.work_center_id = 81 - and to_char(b.start_time,'YYYY-MM-DD') = ]]> #{startTime} + and to_char(b.plan_start_time,'YYYY-MM-DD') = ]]> #{startTime} - and to_char(b.end_time,'YYYY-MM-DD') #{endTime} + and to_char(b.plan_end_time,'YYYY-MM-DD') #{endTime} and a.wo_code = #{woCode} @@ -151,7 +151,7 @@ - order by g.release_date,b.start_time,a.WO_CODE + order by g.release_date,b.plan_start_time,a.WO_CODE + + + + + + diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/YieldOrderMapper.xml b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/YieldOrderMapper.xml index 5548ee42..75b57515 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/YieldOrderMapper.xml +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/YieldOrderMapper.xml @@ -87,6 +87,7 @@ and work_center_id = #{yieldOrder.workCenterId} + order by receive_time desc diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java index 47959810..4eef3a0d 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java @@ -28,11 +28,13 @@ package org.springblade.scheduling.scheduling.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; +import org.springblade.desk.produce.pojo.entity.WorkPlan; import org.springblade.scheduling.scheduling.dto.WorkOrderDto; import org.springblade.scheduling.pojo.entity.WorkOrderEntity; import org.springblade.scheduling.scheduling.excel.SchedulingBoardExcel; import org.springblade.scheduling.scheduling.excel.WorkOrderExcel; import org.springblade.scheduling.pojo.vo.WorkOrderVO; +import org.springblade.scheduling.scheduling.vo.WorkPlanVO; import java.util.List; @@ -105,4 +107,10 @@ public interface IWorkOrderService extends BaseService { * @param cardNo */ void saveWorkOrderFromBak(String cardNo); + + IPage selectQuaExecuteAnalysisPage(IPage page, WorkPlanVO workPlan); + + List selectCenterExecuteList(WorkPlanVO workPlan); + + IPage selectOrderExecuteDetailPage(IPage page, WorkPlanVO workPlan); } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java index 81d1e793..50b6f1eb 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java @@ -49,6 +49,7 @@ import org.springblade.scheduling.scheduling.mapper.WorkOrderMapper; import org.springblade.scheduling.scheduling.service.*; import org.springblade.scheduling.scheduling.vo.SameTroughVO; import org.springblade.scheduling.pojo.vo.WorkOrderVO; +import org.springblade.scheduling.scheduling.vo.WorkPlanVO; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -184,10 +185,10 @@ public class WorkOrderServiceImpl extends BaseServiceImpl workCenterList = workCenterService.list(); - Map workCenterMap = workCenterList.stream().collect(Collectors.toMap(BaseEntity::getId,WorkCenterEntity::getWcName)); + Map workCenterMap = workCenterList.stream().collect(Collectors.toMap(BaseEntity::getId, WorkCenterEntity::getWcName)); //初始化工艺能力 List craftAbilityList = craftAbilityService.list(); - Map craftAbilityMap = craftAbilityList.stream().collect(Collectors.toMap(BaseEntity::getId,CraftAbilityEntity::getCaName)); + Map craftAbilityMap = craftAbilityList.stream().collect(Collectors.toMap(BaseEntity::getId, CraftAbilityEntity::getCaName)); //初始化烧结温度曲线 List sintList = sintTempCurveService.list(); Map> sintMap = sintList.stream().collect(Collectors.groupingBy(SintTempCurveEntity::getProcessId)); @@ -220,7 +221,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl(), r -> new Thread(r, "scheduling-thread-" + System.currentTimeMillis())); map.forEach((workcenter, orders) -> { - threadPool.execute(() -> allocateResources(orders, personAbilityMap, mainProducerMap, planMap, processMap,sintMap,workCenterMap,craftAbilityMap)); + threadPool.execute(() -> allocateResources(orders, personAbilityMap, mainProducerMap, planMap, processMap, sintMap, workCenterMap, craftAbilityMap)); }); } @@ -229,15 +230,15 @@ public class WorkOrderServiceImpl extends BaseServiceImpl schedulingBoard(WorkOrderDto workOrder) { List list = baseMapper.selectWorkOrderList(workOrder); - String yesterday = DateFormatUtils.format(DateUtils.addDays(new Date(),-1),"yyyy-MM-dd"); - String twodaysAgo = DateFormatUtils.format(DateUtils.addDays(new Date(),-2),"yyyy-MM-dd"); - String threeDaysAgo = DateFormatUtils.format(DateUtils.addDays(new Date(),-3),"yyyy-MM-dd"); + String yesterday = DateFormatUtils.format(DateUtils.addDays(new Date(), -1), "yyyy-MM-dd"); + String twodaysAgo = DateFormatUtils.format(DateUtils.addDays(new Date(), -2), "yyyy-MM-dd"); + String threeDaysAgo = DateFormatUtils.format(DateUtils.addDays(new Date(), -3), "yyyy-MM-dd"); list.forEach(item -> { - if((yesterday.equals(item.getReceiveTime()) || twodaysAgo.equals(item.getReceiveTime())) && !"5".equals(item.getPlanStatus()) && !"3".equals(item.getPlanStatus())){ + if ((yesterday.equals(item.getReceiveTime()) || twodaysAgo.equals(item.getReceiveTime())) && !"5".equals(item.getPlanStatus()) && !"3".equals(item.getPlanStatus())) { item.setRemindStatus("1"); } try { - if(DateUtils.parseDate(threeDaysAgo,"yyyy-MM-dd").compareTo(DateUtils.parseDate(item.getReceiveTime(),"yyyy-MM-dd")) > 0 && !"5".equals(item.getPlanStatus()) && !"3".equals(item.getPlanStatus())){ + if (DateUtils.parseDate(threeDaysAgo, "yyyy-MM-dd").compareTo(DateUtils.parseDate(item.getReceiveTime(), "yyyy-MM-dd")) > 0 && !"5".equals(item.getPlanStatus()) && !"3".equals(item.getPlanStatus())) { item.setRemindStatus("2"); } } catch (ParseException e) { @@ -246,22 +247,46 @@ public class WorkOrderServiceImpl extends BaseServiceImpl> woCodeGroup = list.stream().collect(Collectors.groupingBy(WorkOrderDto::getWoCode)); + //默认不展示所有工序都完成的订单 + if(StringUtils.isEmpty(workOrder.getBatchNo())){ + woCodeGroup = woCodeGroup.entrySet().stream() + .filter(entry -> { + // 检查当前分组是否存在至少一个status≠5的元素 + return entry.getValue().stream().anyMatch(dto -> !"5".equals(dto.getPlanStatus())); + }) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + //根据工序名称过滤订单 + if(StringUtils.isNotEmpty(workOrder.getProcessName())){ + woCodeGroup = woCodeGroup.entrySet().stream() + .filter(entry -> { + return entry.getValue().stream() + .anyMatch(dto -> workOrder.getProcessName().equals(dto.getProcessName())); + }) + .collect(Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (oldValue, newValue) -> oldValue, + LinkedHashMap::new + )); + } List resultList = new ArrayList<>(); for (Map.Entry> entry : woCodeGroup.entrySet()) { - if(StringUtils.isNotEmpty(workOrder.getProcessName())){ + //根据工序名称过滤订单 + /* if (StringUtils.isNotEmpty(workOrder.getProcessName())) { List list1 = entry.getValue(); List processNameList = list1.stream().map(WorkOrderDto::getProcessName).collect(Collectors.toList()); - if(processNameList.contains(workOrder.getProcessName())){ + if (processNameList.contains(workOrder.getProcessName())) { WorkOrderDto workOrderDto = new WorkOrderDto(); String woCode = entry.getKey(); workOrderDto.setWoCode(woCode); workOrderDto.setWorkOrderList(entry.getValue()); resultList.add(workOrderDto); continue; - }else{ + } else { continue; } - } + }*/ WorkOrderDto workOrderDto = new WorkOrderDto(); String woCode = entry.getKey(); workOrderDto.setWoCode(woCode); @@ -316,35 +341,35 @@ public class WorkOrderServiceImpl extends BaseServiceImpl selectEquip() { - return baseMapper.selectEquip(); - } - - @Override - public List exportSchedulingBoard(WorkOrderDto workOrder) { - return baseMapper.exportSchedulingBoard(workOrder); - } - - @Override - public void receiveDispatcherFromOldMes(Long id, Long userId) { - WorkOrderEntity workOrder = new WorkOrderEntity(); - workOrder.setId(id); - workOrder.setDispatcher(userId); - updateById(workOrder); - } - - void calculateCr(List list) { - //查询订单下的工序,计算cr值 - for (YieldOrderEntity entity : list) { - List craftList = yieldOrderCraftService.list(Wrappers.lambdaQuery().eq(YieldOrderCraftEntity::getYoId, entity.getId())); - //定义订单总工时 - BigDecimal total = new BigDecimal(0); - for (YieldOrderCraftEntity craftEntity : craftList) { - total = total.add(craftEntity.getHourQuota()); - } - //换算成天 - total = total.divide(BigDecimal.valueOf(1440), 2, RoundingMode.HALF_UP); + @Override + public List selectEquip() { + return baseMapper.selectEquip(); + } + + @Override + public List exportSchedulingBoard(WorkOrderDto workOrder) { + return baseMapper.exportSchedulingBoard(workOrder); + } + + @Override + public void receiveDispatcherFromOldMes(Long id, Long userId) { + WorkOrderEntity workOrder = new WorkOrderEntity(); + workOrder.setId(id); + workOrder.setDispatcher(userId); + updateById(workOrder); + } + + void calculateCr(List list) { + //查询订单下的工序,计算cr值 + for (YieldOrderEntity entity : list) { + List craftList = yieldOrderCraftService.list(Wrappers.lambdaQuery().eq(YieldOrderCraftEntity::getYoId, entity.getId())); + //定义订单总工时 + BigDecimal total = new BigDecimal(0); + for (YieldOrderCraftEntity craftEntity : craftList) { + total = total.add(craftEntity.getHourQuota()); + } + //换算成天 + total = total.divide(BigDecimal.valueOf(1440), 2, RoundingMode.HALF_UP); if (total.compareTo(new BigDecimal(0)) == 0) { entity.setCrValue(new BigDecimal(0)); continue; @@ -392,7 +417,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl processMap.get(ppsId)) .filter(chineseName -> chineseName != null && !chineseName.isEmpty()) .collect(Collectors.joining(",")); - order.setErrorInfo("工序信息不完整,工序:"+errorInfo+"未匹配作业中心"); + order.setErrorInfo("工序信息不完整,工序:" + errorInfo + "未匹配作业中心"); order.setStatus(YieldOrderEnum.STATUS_PROCESS_ERROR.getCode()); yieldOrderService.updateById(order); continue; @@ -403,32 +428,32 @@ public class WorkOrderServiceImpl extends BaseServiceImpl 0 ? prevProcessEnd : workPlanList.get(workPlanList.size() - 1).getEndTime(); + prevProcessEnd = prevProcessEnd.compareTo(workPlanList.get(workPlanList.size() - 1).getPlanEndTime()) > 0 ? prevProcessEnd : workPlanList.get(workPlanList.size() - 1).getPlanEndTime(); } //处理外协工序,外协可能多个工序连续的,共享开始结束时间 - Map> outSourceMap = craftList.stream().filter(item -> item.getIsOutsource() == true).collect(Collectors.groupingBy(YieldOrderCraftEntity::getOcId)); - Map ppsIdMap = new HashMap<>(); + Map> outSourceMap = craftList.stream().filter(item -> item.getIsOutsource() == true).collect(Collectors.groupingBy(YieldOrderCraftEntity::getOcId)); + Map ppsIdMap = new HashMap<>(); for (Map.Entry> entry : outSourceMap.entrySet()) { String ppsIdStr = entry.getValue().stream() .map(entity -> String.valueOf(entity.getPpsId())) // long → String // 等价写法:.map(entity -> Long.toString(entity.getPpsId())) .collect(Collectors.joining(",")); // 逗号分隔拼接 - ppsIdMap.put(entry.getKey(),ppsIdStr); + ppsIdMap.put(entry.getKey(), ppsIdStr); } for (int i = 0; i < craftList.size(); i++) { YieldOrderCraftEntity craft = craftList.get(i); //如果是外协的话,去查询外协工序时间,若未查询到先默认3天,跳过该工序的排产 - if(craft.getIsOutsource()){ + if (craft.getIsOutsource()) { String ppsIdStr = ppsIdMap.get(craft.getOcId()); - OutsourceProcessEntity outsourceProcess = outsourceProcessService.getOne(Wrappers.lambdaQuery().eq(OutsourceProcessEntity::getProcessId,ppsIdStr)); + OutsourceProcessEntity outsourceProcess = outsourceProcessService.getOne(Wrappers.lambdaQuery().eq(OutsourceProcessEntity::getProcessId, ppsIdStr)); BigDecimal totalTime = new BigDecimal(0); - if(outsourceProcess != null){ + if (outsourceProcess != null) { //外协多工序需要把时间平分,方便处理 - prevProcessEnd = prevProcessEnd.plusMinutes((long)((double)outsourceProcess.getDays()/ppsIdStr.split(",").length*24*60)); - totalTime = totalTime.add(BigDecimal.valueOf((long)((double)outsourceProcess.getDays()/ppsIdStr.split(",").length*24*60))); - }else{ + prevProcessEnd = prevProcessEnd.plusMinutes((long) ((double) outsourceProcess.getDays() / ppsIdStr.split(",").length * 24 * 60)); + totalTime = totalTime.add(BigDecimal.valueOf((long) ((double) outsourceProcess.getDays() / ppsIdStr.split(",").length * 24 * 60))); + } else { prevProcessEnd = prevProcessEnd.plusDays(3); - totalTime = totalTime.add(BigDecimal.valueOf(3*24*60)); + totalTime = totalTime.add(BigDecimal.valueOf(3 * 24 * 60)); } WorkPlanEntity workPlan = new WorkPlanEntity(); workPlan.setWoId(order.getId()); @@ -445,21 +470,21 @@ public class WorkOrderServiceImpl extends BaseServiceImpl sameFurnaceMap = new HashMap<>(); + Map sameFurnaceMap = new HashMap<>(); //烧结同炉 - if(sintMap.containsKey(craft.getPpsId())){ - sameFurnaceMap = sameFurnace(order,craft,workPlanList,prevProcessEnd,glassCodeStr,sintMap); + if (sintMap.containsKey(craft.getPpsId())) { + sameFurnaceMap = sameFurnace(order, craft, workPlanList, prevProcessEnd, glassCodeStr, sintMap); //同炉的话就不用走下面的匹配了,直接下一工序 - if(sameFurnaceMap.get("isSameFurnace").toString() == "true"){ + if (sameFurnaceMap.get("isSameFurnace").toString() == "true") { continue; } } @@ -467,7 +492,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl equipAbilityList = equipAbilityService.list(Wrappers.lambdaQuery().in(EquipAbilityEntity::getWorkCenterId, craft.getWorkCenterId()).eq(EquipAbilityEntity::getCraftId, craft.getCaId())); if (CollectionUtils.isEmpty(equipAbilityList)) { - order.setErrorInfo("作业中心:"+workCenterMap.get(craft.getWorkCenterId())+",工艺:"+craftAbilityMap.get(craft.getCaId())+",工序:"+processMap.get(craft.getPpsId()) +",未匹配到对应的设备能力"); + order.setErrorInfo("作业中心:" + workCenterMap.get(craft.getWorkCenterId()) + ",工艺:" + craftAbilityMap.get(craft.getCaId()) + ",工序:" + processMap.get(craft.getPpsId()) + ",未匹配到对应的设备能力"); order.setStatus(YieldOrderEnum.STATUS_PROCESS_ERROR.getCode()); yieldOrderService.updateById(order); isSchecuding = false; @@ -526,11 +551,11 @@ public class WorkOrderServiceImpl extends BaseServiceImpl memberList = baseMapper.selectTeamMember(workPlan.getMakeTeam(),ability.getCertificateId()); - if(CollectionUtils.isNotEmpty(memberList)){ + && workPlan.getMakeTeam() != null) { + List memberList = baseMapper.selectTeamMember(workPlan.getMakeTeam(), ability.getCertificateId()); + if (CollectionUtils.isNotEmpty(memberList)) { workPlan.setTeamMembers(memberList.stream().collect(Collectors.joining(","))); } } - }else{ + } else { prevProcessEnd = prevProcessEnd.plusMinutes(30); totalTime = BigDecimal.valueOf(30); } @@ -660,7 +685,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl 0; i--) { - if (workPlanList.get(i).getEndTime() != null) { + if (workPlanList.get(i).getPlanEndTime() != null) { endIndex = i; break; } @@ -790,13 +817,13 @@ public class WorkOrderServiceImpl extends BaseServiceImpl Objects.isNull(item.getStartTime()) - && Objects.isNull(item.getEndTime())); - if(isEmpty){ + boolean isEmpty = list.stream().allMatch(item -> Objects.isNull(item.getPlanStartTime()) + && Objects.isNull(item.getPlanEndTime())); + if (isEmpty) { //上一道工序结束时间 LocalDateTime prevProcessEnd = LocalDateTime.now(); - for(int i=0;i workPlanList){ + public Boolean sameTrough(YieldOrderEntity order, YieldOrderCraftEntity craft, LocalDateTime dateTime, List workPlanList) { Boolean isSameTrough = false; - SameTroughEntity sameTrough =sameTroughService.getOne(Wrappers.lambdaQuery() - .eq(SameTroughEntity::getWorkCenterId,craft.getWorkCenterId()) - .eq(SameTroughEntity::getCraftId,craft.getCaId()) - .eq(SameTroughEntity::getProcessId,craft.getPpsId())); - if(sameTrough != null){ + SameTroughEntity sameTrough = sameTroughService.getOne(Wrappers.lambdaQuery() + .eq(SameTroughEntity::getWorkCenterId, craft.getWorkCenterId()) + .eq(SameTroughEntity::getCraftId, craft.getCaId()) + .eq(SameTroughEntity::getProcessId, craft.getPpsId())); + if (sameTrough != null) { //查询是否有已经排产的计划 List workPlanOldList = workPlanService.list(Wrappers.lambdaQuery() - .eq(WorkPlanEntity::getWorkCenterId,craft.getWorkCenterId()) - .eq(WorkPlanEntity::getCaId,craft.getCaId()) - .eq(WorkPlanEntity::getPpsId,craft.getPpsId()) - .ge(WorkPlanEntity::getStartTime,dateTime).orderByAsc(WorkPlanEntity::getStartTime)); - if(CollectionUtils.isNotEmpty(workPlanOldList)){ + .eq(WorkPlanEntity::getWorkCenterId, craft.getWorkCenterId()) + .eq(WorkPlanEntity::getCaId, craft.getCaId()) + .eq(WorkPlanEntity::getPpsId, craft.getPpsId()) + .ge(WorkPlanEntity::getPlanStartTime, dateTime).orderByAsc(WorkPlanEntity::getPlanStartTime)); + if (CollectionUtils.isNotEmpty(workPlanOldList)) { //总生产量 BigDecimal sumCapacity = order.getYpArea().multiply(BigDecimal.valueOf(order.getYpQty())); //可能有多个订单符合要求,按照车间订单、时间分组排序 - Map> workPlanMap = workPlanOldList.stream().collect(Collectors.groupingBy(WorkPlanEntity::getWoId)); - for(Map.Entry> entry : workPlanMap.entrySet()){ + Map> workPlanMap = workPlanOldList.stream().collect(Collectors.groupingBy(WorkPlanEntity::getWoId)); + for (Map.Entry> entry : workPlanMap.entrySet()) { List planList = entry.getValue(); Boolean isEnough = true; List resourceList = new ArrayList<>(); - for(WorkPlanEntity workPlan : planList){ - if(workPlan.getEquipResourceId() != null){ + for (WorkPlanEntity workPlan : planList) { + if (workPlan.getEquipResourceId() != null) { EquipResourceEntity equipResource = equipResourceService.getById(workPlan.getEquipResourceId()); //判断剩余产能是否满足总产能 - if(sumCapacity.compareTo(equipResource.getRestCapacity()) > 0){ + if (sumCapacity.compareTo(equipResource.getRestCapacity()) > 0) { isEnough = false; resourceList.clear(); break; - }else{ + } else { resourceList.add(workPlan.getEquipResourceId()); } } } //如果产能满足,再判断是否满足同槽条件 - if(isEnough){ + if (isEnough) { WorkOrderEntity workOrder = this.getById(workPlanOldList.get(0).getWoId()); YieldOrderEntity yieldOrderEntity = yieldOrderService.getById(workOrder.getYoId()); List orderCraftList = yieldOrderCraftService.list(Wrappers.lambdaQuery() - .eq(YieldOrderCraftEntity::getYoId,yieldOrderEntity.getId()) - .eq(YieldOrderCraftEntity::getPpsId,craft.getPpsId()) - .eq(YieldOrderCraftEntity::getCaId,craft.getCaId()) - .eq(YieldOrderCraftEntity::getWorkCenterId,craft.getWorkCenterId())); + .eq(YieldOrderCraftEntity::getYoId, yieldOrderEntity.getId()) + .eq(YieldOrderCraftEntity::getPpsId, craft.getPpsId()) + .eq(YieldOrderCraftEntity::getCaId, craft.getCaId()) + .eq(YieldOrderCraftEntity::getWorkCenterId, craft.getWorkCenterId())); SameTroughVO voNew = sameTroughService.selectSameTroughInfo(craft.getId()); SameTroughVO voOld = sameTroughService.selectSameTroughInfo(orderCraftList.get(0).getId()); //根据同槽因素进行比对 Boolean isSameTrough2 = true; //键位 - if("1".equals(sameTrough.getKeyBinding()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getKeyBinding()) && StringUtils.isNotEmpty(voOld.getKeyBinding()) && !voNew.getKeyBinding().equals(voOld.getKeyBinding())){ + if ("1".equals(sameTrough.getKeyBinding()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getKeyBinding()) && StringUtils.isNotEmpty(voOld.getKeyBinding()) && !voNew.getKeyBinding().equals(voOld.getKeyBinding())) { isSameTrough2 = false; } //生产厂家 - if("1".equals(sameTrough.getProducter()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getProducter()) && StringUtils.isNotEmpty(voOld.getProducter()) && !voNew.getProducter().equals(voOld.getProducter())){ + if ("1".equals(sameTrough.getProducter()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getProducter()) && StringUtils.isNotEmpty(voOld.getProducter()) && !voNew.getProducter().equals(voOld.getProducter())) { isSameTrough2 = false; } //检验编号 - if("1".equals(sameTrough.getInspectionCode()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getInspectionCode()) && StringUtils.isNotEmpty(voOld.getInspectionCode()) && !voNew.getInspectionCode().equals(voOld.getInspectionCode())){ + if ("1".equals(sameTrough.getInspectionCode()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getInspectionCode()) && StringUtils.isNotEmpty(voOld.getInspectionCode()) && !voNew.getInspectionCode().equals(voOld.getInspectionCode())) { isSameTrough2 = false; } //材料 - if("1".equals(sameTrough.getMaterial()) && StringUtils.isNotEmpty(voNew.getMaterial()) && StringUtils.isNotEmpty(voOld.getMaterial()) && !voNew.getMaterial().equals(voOld.getMaterial())){ + if ("1".equals(sameTrough.getMaterial()) && StringUtils.isNotEmpty(voNew.getMaterial()) && StringUtils.isNotEmpty(voOld.getMaterial()) && !voNew.getMaterial().equals(voOld.getMaterial())) { isSameTrough2 = false; } //厚度 - if("1".equals(sameTrough.getThickness()) && StringUtils.isNotEmpty(voNew.getThickness()) && StringUtils.isNotEmpty(voOld.getThickness()) && !voNew.getThickness().equals(voOld.getThickness())){ + if ("1".equals(sameTrough.getThickness()) && StringUtils.isNotEmpty(voNew.getThickness()) && StringUtils.isNotEmpty(voOld.getThickness()) && !voNew.getThickness().equals(voOld.getThickness())) { isSameTrough2 = false; } //钝化 - if("1".equals(sameTrough.getPassivation())){ - if(StringUtils.isNotEmpty(voNew.getPlate()) + if ("1".equals(sameTrough.getPassivation())) { + if (StringUtils.isNotEmpty(voNew.getPlate()) && StringUtils.isNotEmpty(voOld.getPlate()) && ((voNew.getPlate().contains("不钝化") && !voOld.getPlate().contains("不钝化")) || (voOld.getPlate().contains("不钝化") - && !voNew.getPlate().contains("不钝化")))){ + && !voNew.getPlate().contains("不钝化")))) { isSameTrough2 = false; } } //硬度 - if("1".equals(sameTrough.getHardness()) && StringUtils.isNotEmpty(voNew.getHardness()) && StringUtils.isNotEmpty(voOld.getHardness()) && !voNew.getHardness().equals(voOld.getHardness())){ + if ("1".equals(sameTrough.getHardness()) && StringUtils.isNotEmpty(voNew.getHardness()) && StringUtils.isNotEmpty(voOld.getHardness()) && !voNew.getHardness().equals(voOld.getHardness())) { isSameTrough2 = false; } //生产标识 - if("1".equals(sameTrough.getProductIdent())){ - List highIdentList = Arrays.asList(new String[]{"JHT","JI","JIX","YH","CC","SATA"}); - if(StringUtils.isNotEmpty(order.getProductIdent()) && highIdentList.contains(order.getProductIdent())){ + if ("1".equals(sameTrough.getProductIdent())) { + List highIdentList = Arrays.asList(new String[]{"JHT", "JI", "JIX", "YH", "CC", "SATA"}); + if (StringUtils.isNotEmpty(order.getProductIdent()) && highIdentList.contains(order.getProductIdent())) { isSameTrough2 = false; } - if(!(voNew.getPartCode().equals(voOld.getPartCode()) + if (!(voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getProductIdent()) && StringUtils.isNotEmpty(voOld.getProductIdent()) - && voNew.getProductIdent().equals(voOld.getProductIdent()))){ - isSameTrough2 = false; + && voNew.getProductIdent().equals(voOld.getProductIdent()))) { + isSameTrough2 = false; } } - if(isSameTrough2){ - for(Long resourceId : resourceList){ + if (isSameTrough2) { + for (Long resourceId : resourceList) { EquipResourceEntity equipResource = equipResourceService.getById(resourceId); //生成车间订单 WorkPlanEntity workPlan = new WorkPlanEntity(); - workPlan.setStartTime(equipResource.getStartTime()); + workPlan.setPlanStartTime(equipResource.getStartTime()); if ("0".equals(equipResource.getEquipType())) { - workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue())); + workPlan.setPlanEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue())); } else { - workPlan.setEndTime(equipResource.getEndTime()); + workPlan.setPlanEndTime(equipResource.getEndTime()); } workPlan.setWorkQty(order.getYpQty()); workPlan.setCaId(craft.getCaId()); @@ -1300,7 +1327,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl sameFurnace(YieldOrderEntity order,YieldOrderCraftEntity craft,List workPlanList,LocalDateTime prevProcessEnd,String glassCodeStr,Map> sintMap){ - Map map = new HashMap<>(); + + public Map sameFurnace(YieldOrderEntity order, YieldOrderCraftEntity craft, List workPlanList, LocalDateTime prevProcessEnd, String glassCodeStr, Map> sintMap) { + Map map = new HashMap<>(); Boolean isSameFurnace = false; - if(order.getYieldType() == YieldOrderEnum.YIELD_TYPE_2.getCode() || order.getYieldType() == YieldOrderEnum.YIELD_TYPE_3.getCode()){//烧结订单 + if (order.getYieldType() == YieldOrderEnum.YIELD_TYPE_2.getCode() || order.getYieldType() == YieldOrderEnum.YIELD_TYPE_3.getCode()) {//烧结订单 //获取当前工序的所有温度曲线 List sintList = sintMap.get(craft.getPpsId()); List> sintMaterialList = new ArrayList<>(); @@ -1332,44 +1360,44 @@ public class WorkOrderServiceImpl extends BaseServiceImpl childPartList = partService.selectChildPart(part); - if(CollectionUtils.isNotEmpty(childPartList)){ + if (CollectionUtils.isNotEmpty(childPartList)) { //获取子件的所有玻璃粉牌号 List materialList = childPartList.stream().filter(item -> StringUtils.isNotEmpty(item.getMaterial())).map(PartEntity::getMaterial).collect(Collectors.toList()); List maxMatchList = null; int maxCount = 0; - for(List glassCodeList : sintMaterialList){ + for (List glassCodeList : sintMaterialList) { int currentCount = (int) glassCodeList.stream().filter(materialList::contains).count(); if (currentCount > maxCount) { maxCount = currentCount; maxMatchList = glassCodeList; } } - if(maxMatchList != null){ + if (maxMatchList != null) { glassCodeStr = maxMatchList.stream().collect(Collectors.joining(",")); - map.put("glassCode",glassCodeStr); - log.info("订单:"+order.getYoCode()+",温度曲线是:"+glassCodeStr); + map.put("glassCode", glassCodeStr); + log.info("订单:" + order.getYoCode() + ",温度曲线是:" + glassCodeStr); } } //包含说明之前有过这个温度曲线的订单 //根据当前时间查询包含玻璃粉牌号的设备资源 List equipResourceList = equipResourceService.list(Wrappers.lambdaQuery() - .eq(EquipResourceEntity::getWorkCenterId,craft.getWorkCenterId()) - .eq(EquipResourceEntity::getCraftId,craft.getCaId()) - .ge(EquipResourceEntity::getStartTime,prevProcessEnd) - .eq(EquipResourceEntity::getGlassCode,glassCodeStr)); - if(CollectionUtils.isNotEmpty(equipResourceList)){ + .eq(EquipResourceEntity::getWorkCenterId, craft.getWorkCenterId()) + .eq(EquipResourceEntity::getCraftId, craft.getCaId()) + .ge(EquipResourceEntity::getStartTime, prevProcessEnd) + .eq(EquipResourceEntity::getGlassCode, glassCodeStr)); + if (CollectionUtils.isNotEmpty(equipResourceList)) { //计算生产所需产能,需将m2换算成dm2 BigDecimal sumCapacity = order.getYpArea().multiply(BigDecimal.valueOf(order.getYpQty())); - for(EquipResourceEntity equipResource : equipResourceList){ - if(equipResource.getRestCapacity().compareTo(sumCapacity) > 0){ + for (EquipResourceEntity equipResource : equipResourceList) { + if (equipResource.getRestCapacity().compareTo(sumCapacity) > 0) { //生成车间订单 WorkPlanEntity workPlan = new WorkPlanEntity(); - workPlan.setStartTime(equipResource.getStartTime()); + workPlan.setPlanStartTime(equipResource.getStartTime()); if ("0".equals(equipResource.getEquipType())) { - workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue())); + workPlan.setPlanEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue())); } else { - workPlan.setEndTime(equipResource.getEndTime()); + workPlan.setPlanEndTime(equipResource.getEndTime()); } workPlan.setWorkQty(order.getYpQty()); workPlan.setCaId(craft.getCaId()); @@ -1383,7 +1411,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl paramMap = new HashMap<>(); - paramMap.put("cardNo",cardNo); + paramMap.put("cardNo", cardNo); // 恢复老mes排产数据 String url = oldMesUrl + saveWorkOrderFromBak; try { - HttpUtil.post(url+"/"+cardNo, paramMap); + HttpUtil.post(url + "/" + cardNo, paramMap); } catch (Exception e) { - log.error("恢复老mes排产数据报错:"+e.getMessage()); + log.error("恢复老mes排产数据报错:" + e.getMessage()); e.printStackTrace(); } List cardNoList = Arrays.asList(cardNo.split(",")); - List orderList = yieldOrderService.list(Wrappers.lambdaQuery().in(YieldOrderEntity::getCardNo,cardNoList)); - orderList.forEach(item ->{ + List orderList = yieldOrderService.list(Wrappers.lambdaQuery().in(YieldOrderEntity::getCardNo, cardNoList)); + orderList.forEach(item -> { item.setStatus(YieldOrderEnum.STATUS_RECOVER.getCode()); yieldOrderService.updateById(item); }); } + @Override + public IPage selectQuaExecuteAnalysisPage(IPage page, WorkPlanVO workPlan) { + if (StringUtils.isNotEmpty(workPlan.getStartTime())) { + workPlan.setStartTime(workPlan.getStartTime() + " 00:00:00"); + } + if (StringUtils.isNotEmpty(workPlan.getEndTime())) { + workPlan.setEndTime(workPlan.getEndTime() + " 23:59:59"); + } + List list = baseMapper.selectQuaExecuteAnalysisPage(page, workPlan); + return page.setRecords(list); + } + + @Override + public List selectCenterExecuteList(WorkPlanVO workPlan) { + List list = baseMapper.selectCenterExecuteList(workPlan); + if (CollectionUtils.isNotEmpty(list)) { + for (WorkPlanVO vo : list) { + vo.setEarlyStartCountRate(vo.getEarlyStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getEarlyStartCount() / vo.getTotalOrderCount())) * 100 + "%"); + vo.setOnTimeStartCountRate(vo.getOnTimeStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getOnTimeStartCount() / vo.getTotalOrderCount())) * 100 + "%"); + vo.setDelayStartCountRate(vo.getDelayStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getDelayStartCount() / vo.getTotalOrderCount())) * 100 + "%"); + vo.setEarlyFinishCountRate(vo.getEarlyFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getEarlyFinishCount() / vo.getTotalOrderCount())) * 100 + "%"); + vo.setOnTimeFinishCountRate(vo.getOnTimeFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getOnTimeFinishCount() / vo.getTotalOrderCount())) * 100 + "%"); + vo.setDelayFinishCountRate(vo.getDelayFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getDelayFinishCount() / vo.getTotalOrderCount())) * 100 + "%"); + } + } + return list; + } + + @Override + public IPage selectOrderExecuteDetailPage(IPage page, WorkPlanVO workPlan) { + if (StringUtils.isNotEmpty(workPlan.getStartTime())) { + workPlan.setStartTime(workPlan.getStartTime() + " 00:00:00"); + } + if (StringUtils.isNotEmpty(workPlan.getEndTime())) { + workPlan.setEndTime(workPlan.getEndTime() + " 23:59:59"); + } + List list = baseMapper.selectOrderExecuteDetailPage(page, workPlan); + return page.setRecords(list); + } + + } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkPlanServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkPlanServiceImpl.java index 9e80c5a7..09d0122f 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkPlanServiceImpl.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkPlanServiceImpl.java @@ -38,6 +38,9 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseServiceImpl; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.Date; import java.util.List; @@ -69,7 +72,7 @@ public class WorkPlanServiceImpl extends BaseServiceImpl