diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansubdetail/PlanSubDetailController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansubdetail/PlanSubDetailController.java index 0e34b267..b1dec08f 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansubdetail/PlanSubDetailController.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansubdetail/PlanSubDetailController.java @@ -1,5 +1,6 @@ package com.chanko.yunxi.mes.module.heli.controller.admin.plansubdetail; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO; import com.chanko.yunxi.mes.module.heli.service.plansub.PlanSubService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -159,4 +160,29 @@ public class PlanSubDetailController { public CommonResult> getList(@Valid PlanSubDetailPageReqVO pageReqVO) { return success( planSubDetailService.getList(pageReqVO)); } + @GetMapping("/getList1") + @PreAuthorize("@ss.hasPermission('heli:plan-sub-detail:query')") + public CommonResult> getList1(@Valid PlanSubDetailPageReqVO pageReqVO) { + return success( planSubDetailService.getList1(pageReqVO)); + } + @GetMapping("/getList2") + @PreAuthorize("@ss.hasPermission('heli:plan-sub-detail:query')") + public CommonResult> getList2(@Valid PlanSubDetailPageReqVO pageReqVO) { + return success( planSubDetailService.getList2(pageReqVO)); + } + @GetMapping("/getList3") + @PreAuthorize("@ss.hasPermission('heli:plan-sub-detail:query')") + public CommonResult> getList3(@Valid PlanSubDetailPageReqVO pageReqVO) { + return success( planSubDetailService.getList3(pageReqVO)); + } + @GetMapping("/getList4") + @PreAuthorize("@ss.hasPermission('heli:plan-sub-detail:query')") + public CommonResult> getList4(@Valid PlanSubDetailPageReqVO pageReqVO) { + return success( planSubDetailService.getList4(pageReqVO)); + } + @GetMapping("/getList5") + @PreAuthorize("@ss.hasPermission('heli:plan-sub-detail:query')") + public CommonResult> getList5(@Valid PlanSubDetailPageReqVO pageReqVO) { + return success( planSubDetailService.getList5(pageReqVO)); + } } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/ProjectOrderController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/ProjectOrderController.java index 6dbf4c8d..66a530b2 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/ProjectOrderController.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/ProjectOrderController.java @@ -122,11 +122,13 @@ public class ProjectOrderController { } } } - Set nameSimSet = new HashSet<>(); - for (ProjectOrderSubDO projectOrderSub : operateReqVO.getProjectOrderSubs()) { - String nameSim = projectOrderSub.getNameSim(); - if (!nameSimSet.add(nameSim)) { - return CommonResult.error(400,"该项目下子项目简码不能重复,请确认!"); + if (ObjectUtil.isNotEmpty(operateReqVO.getProjectOrderSubs())){ + Set nameSimSet = new HashSet<>(); + for (ProjectOrderSubDO projectOrderSub : operateReqVO.getProjectOrderSubs()) { + String nameSim = projectOrderSub.getNameSim(); + if (!nameSimSet.add(nameSim)) { + return CommonResult.error(400,"该项目下子项目简码不能重复,请确认!"); + } } } projectOrderService.operateProjectOrder(operateReqVO); @@ -146,7 +148,7 @@ public class ProjectOrderController { orderYsService.createOrUpdate(operateReqVO); // 订单批准时创建或者更新生产计划数据 crossOrderManager.generatePlan(operateReqVO.getId()); -// projectOrderService.createProjectOrderSnapshot(operateReqVO); +// projectOrderService.createProjectOrderSnapshot(operateReqVO); break; case TERMINATE: orderYsService.delete(operateReqVO); diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plansubdetail/PlanSubDetailDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plansubdetail/PlanSubDetailDO.java index ef5a69d2..07f1f1ff 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plansubdetail/PlanSubDetailDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plansubdetail/PlanSubDetailDO.java @@ -1,6 +1,8 @@ package com.chanko.yunxi.mes.module.heli.dal.dataobject.plansubdetail; import lombok.*; + +import java.math.BigDecimal; import java.util.*; import java.time.LocalDateTime; import java.time.LocalDateTime; @@ -115,6 +117,14 @@ public class PlanSubDetailDO extends BaseDO { //生产进度 @TableField(exist = false) private String productionSchedule; - - + @TableField(exist = false) + private String type; + @TableField(exist = false) + private BigDecimal workHours; + @TableField(exist = false) + private String percentage; + @TableField(exist = false) + private String PercentageFlag; + @TableField(exist = false) + private Date time; } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/taskdispatch/TaskDispatchDetailDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/taskdispatch/TaskDispatchDetailDO.java index 89d782d4..295ded67 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/taskdispatch/TaskDispatchDetailDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/taskdispatch/TaskDispatchDetailDO.java @@ -3,6 +3,7 @@ package com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch; import com.baomidou.mybatisplus.annotation.*; import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; import io.swagger.v3.oas.models.security.SecurityScheme; +import kotlin.jvm.internal.Lambda; import lombok.*; import org.apache.poi.hpsf.Date; @@ -261,4 +262,20 @@ public class TaskDispatchDetailDO extends BaseDO { private Integer receivingStatus; @TableField(exist = false) private Integer mplanStatus; + @TableField(exist = false) + private String partsProcurement; + @TableField(exist = false) + private String receiving; + @TableField(exist = false) + private String receivingFlag; + @TableField(exist = false) + private LocalDateTime receivingTime; + @TableField(exist = false) + private String percentage; + @TableField(exist = false) + private String report; + @TableField(exist = false) + private String reportFlag; + @TableField(exist = false) + private String finishedProduct; } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/plansub/PlanSubMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/plansub/PlanSubMapper.java index bdadd9aa..e41f867f 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/plansub/PlanSubMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/plansub/PlanSubMapper.java @@ -316,10 +316,10 @@ public interface PlanSubMapper extends BaseMapperX { query.eq(ProjectOrderSubDO::getDeleted,0); query.eq(CustomerDO::getDeleted,0); query.eq(PlanDO::getDeleted,0); - query.eq(ObjectUtil.isNotEmpty(pageReqVO.getProjectCode()), ProjectOrderDO::getCode, pageReqVO.getProjectCode()); - query.eq(ObjectUtil.isNotEmpty(pageReqVO.getProjectName()), ProjectOrderDO::getProjectName, pageReqVO.getProjectName()); - query.eq(ObjectUtil.isNotEmpty(pageReqVO.getProjectSubName()), ProjectOrderSubDO::getName, pageReqVO.getProjectSubName()); - query.eq(ObjectUtil.isNotEmpty(pageReqVO.getCustomerName()), CustomerDO::getName, pageReqVO.getCustomerName()); + query.like(ObjectUtil.isNotEmpty(pageReqVO.getProjectCode()), ProjectOrderDO::getCode, pageReqVO.getProjectCode()); + query.like(ObjectUtil.isNotEmpty(pageReqVO.getProjectName()), ProjectOrderDO::getProjectName, pageReqVO.getProjectName()); + query.like(ObjectUtil.isNotEmpty(pageReqVO.getProjectSubName()), ProjectOrderSubDO::getName, pageReqVO.getProjectSubName()); + query.like(ObjectUtil.isNotEmpty(pageReqVO.getCustomerName()), CustomerDO::getName, pageReqVO.getCustomerName()); query.orderByAsc(ProjectOrderDO::getCode); return selectPage(pageReqVO, query); } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processdesign/ProcessDesignMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processdesign/ProcessDesignMapper.java index f7452760..a0b93e1d 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processdesign/ProcessDesignMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processdesign/ProcessDesignMapper.java @@ -18,9 +18,11 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.springframework.util.StringUtils; import java.util.Date; +import java.util.List; /** * 工艺设计 Mapper @@ -395,4 +397,11 @@ public interface ProcessDesignMapper extends BaseMapperX { } @Delete("delete from pro_process_design where project_id = #{id}") void deleteOrderId(@Param("id") Long id); + + @Select("SELECT pd.* FROM pro_process_design pd " + + "INNER JOIN project_plan_sub_detail psd ON psd.project_sub_id = pd.project_sub_id " + + "AND psd.sub_type = pd.process_design_type " + + "WHERE pd.project_sub_id = #{projectSubId} " + + "AND pd.process_design_type IN ('BLUEPRINT_3D', 'BLUEPRINT_2D', 'BLUEPRINT_WORKBLANK')") + List selectWithDetailExists(@Param("projectSubId") Long projectSubId); } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchDetailMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchDetailMapper.java index ba5a06e1..41848e14 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchDetailMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchDetailMapper.java @@ -904,7 +904,15 @@ public interface TaskDispatchDetailMapper extends BaseMapperX query = new MPJLambdaWrapper<>(); query.selectAll(TaskDispatchDetailDO.class) .select("a.bom_detail_id as bomDetailId") - .leftJoin(TaskDispatchDO.class,"a",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId); + .select("b.material_name as materialName","c.name as projectSubName") + .select("d.name as procedureName","u.nickname as ownerName") + .leftJoin(TaskDispatchDO.class,"a",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId) + .leftJoin(ProcessBomDetailDO.class,"b",ProcessBomDetailDO::getId,TaskDispatchDO::getBomDetailId) + .leftJoin(ProjectOrderSubDO.class,"c",ProjectOrderSubDO::getId,TaskDispatchDO::getProjectSubId) + .leftJoin(ProcedureDO.class,"d",ProcedureDO::getId,TaskDispatchDetailDO::getProcedureId) + .leftJoin(AdminUserDO.class,"u",AdminUserDO::getId,TaskDispatchDetailDO::getOwner) + .orderByAsc(ProcessBomDetailDO::getMaterialName) + .orderByAsc(TaskDispatchDO::getCode); query.eq(TaskDispatchDO::getProjectSubId,projectSubId); query.eq(TaskDispatchDO::getDispatchType,"PRODUCTION"); query.eq(ObjectUtil.isNotEmpty(checkYn),TaskDispatchDetailDO::getCheckYn,checkYn); @@ -916,7 +924,13 @@ public interface TaskDispatchDetailMapper extends BaseMapperX query = new MPJLambdaWrapper<>(); query.selectAll(TaskDispatchDetailDO.class) .select("a.bom_detail_id as bomDetailId") - .leftJoin(TaskDispatchDO.class,"a",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId); + .select("d.name as procedureName","c.name as projectSubName") + .leftJoin(TaskDispatchDO.class,"a",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId) + .leftJoin(ProjectOrderSubDO.class,"c",ProjectOrderSubDO::getId,TaskDispatchDO::getProjectSubId) + .leftJoin(ProcedureDO.class,"d",ProcedureDO::getId,TaskDispatchDetailDO::getProcedureId) + .groupBy(TaskDispatchDetailDO::getId) + .orderByAsc(ProjectOrderSubDO::getName) + .orderByAsc(ProcedureDO::getName); query.eq(TaskDispatchDO::getProjectSubId,projectSubId); query.eq(TaskDispatchDO::getDispatchType,"ASSEMBLE"); return selectList(query); diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchMapper.java index e158dae1..443843da 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchMapper.java @@ -230,4 +230,13 @@ public interface TaskDispatchMapper extends BaseMapperX { @Delete("delete from pro_task_dispatch where project_id=#{id}") void deleteOrderId(@Param("id") Long id); + default List selectByIds(List ids){ + MPJLambdaWrapper query = new MPJLambdaWrapper<>(); + query.selectAll(TaskDispatchDO.class) + .select("a.craft_content as craftContent") + .leftJoin(PlanDO.class, "a", PlanDO::getId, TaskDispatchDO::getPlanId) + .in(TaskDispatchDO::getId, ids); + return selectList(query); + + } } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/partpurchaseorder/PartPurchaseOrderServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/partpurchaseorder/PartPurchaseOrderServiceImpl.java index d65aed72..8465f270 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/partpurchaseorder/PartPurchaseOrderServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/partpurchaseorder/PartPurchaseOrderServiceImpl.java @@ -54,6 +54,7 @@ import org.checkerframework.checker.units.qual.C; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; @@ -385,6 +386,7 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{ } @Override + @Transactional public Boolean approval(Long id) { PurchaseOrderMakeDO orderMakeDO = purchaseOrderMakeMapper.selectById(id); if (orderMakeDO.getStatus() != 1) throw exception(new ErrorCode(400, "该单据状态非待审核,请刷新界面!")); @@ -402,7 +404,7 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{ materialPlanBoom.setMplanStatus(2); materialPlanBoomMapper.updateById(materialPlanBoom); }); - List list = purchaseOrderMakeDetailMapper.selectList("project_purchase_order_make_id", id); + List list = purchaseOrderMakeDetailMapper.selectList("purchase_order_id", id); List ids = list.stream().map(PurchaseOrderMakeDetailDO::getId).collect(Collectors.toList()); if (ObjectUtil.isNotEmpty(ids)){ LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); @@ -656,6 +658,15 @@ if (ObjectUtil.isNotEmpty(materialDO)){ public Boolean approvals(List list) { if (ObjectUtil.isNotEmpty( list)){ List ids = list.stream().map(PurchaseOrderMakeDetailDO::getId).collect(Collectors.toList()); + List orderIds = list.stream().map(PurchaseOrderMakeDetailDO::getPurchaseOrderId).collect(Collectors.toList()); + if (ObjectUtil.isNotEmpty(orderIds)){ + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(PurchaseOrderMakeDO::getId, orderIds); + updateWrapper.set(PurchaseOrderMakeDO::getStatus,2); + updateWrapper.set(PurchaseOrderMakeDO::getAuditTime, LocalDateTime.now()); + updateWrapper.set(PurchaseOrderMakeDO::getAuditor, getLoginUser().getId()); + purchaseOrderMakeMapper.update(updateWrapper); + } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.in(PurchaseOrderMakeDetailDO::getId, ids); wrapper.ne(PurchaseOrderMakeDetailDO::getStatus,1); diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plan/PlanServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plan/PlanServiceImpl.java index 1ad91a02..f6a90afb 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plan/PlanServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plan/PlanServiceImpl.java @@ -3,6 +3,7 @@ package com.chanko.yunxi.mes.module.heli.service.plan; import cn.hutool.core.util.ObjectUtil; import cn.smallbun.screw.core.util.CollectionUtils; 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.chanko.yunxi.mes.framework.common.exception.ErrorCode; import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; @@ -74,6 +75,7 @@ import java.util.stream.Collectors; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PROJECT_PLAN; import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PROJECT_PLAN_TASK; +import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.OWNER_NOT_EXISTS; import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.PLAN_NOT_EXISTS; /** @@ -436,18 +438,22 @@ public class PlanServiceImpl implements PlanService { LocalDateTime dateAsLocalDateTime = processDesignProgressDO.getEndTime().toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); - if (dateAsLocalDateTime.isAfter(processDesignDO.getCraftEndDate())) { + if (ObjectUtil.isNotEmpty(planSubDO.getCraftEndDate())){ + if (dateAsLocalDateTime.isAfter(planSubDO.getCraftEndDate())) { planDO.setProcessFlag("1"); } else { planDO.setProcessFlag("0"); } + } } } else { - if (now.isAfter(processDesignDO.getCraftEndDate())) { + if (ObjectUtil.isNotEmpty(planSubDO.getCraftEndDate())){ + if (now.isAfter(planSubDO.getCraftEndDate())) { planDO.setProcessFlag("1"); } else { planDO.setProcessFlag("0"); } + } Long l = processDesignProgressMapper.selectCount(new LambdaQueryWrapper().eq(ProcessDesignProgressDO::getProcessDesignId, processDesignDO.getId())); if (l > 0) { planDO.setProcessProgress("执行中"); @@ -482,7 +488,7 @@ public class PlanServiceImpl implements PlanService { List purchaseOrderMakeDetailDOS = queryPurchaseOrderMakeDetails(subDO); // 判断所有采购订单是否都已完成 - boolean allCompleted = isAllPurchaseOrdersCompleted(purchaseOrderNoDetailDOS); + boolean allCompleted = isAllPurchaseOrdersCompleted(purchaseOrderNoDetailDOS,detailDOS); if (allCompleted) { subDO.setOutsourcingTasks(TASK_COMPLETED); @@ -529,7 +535,7 @@ public class PlanServiceImpl implements PlanService { List dispatchDetailDOList = taskDispatchDetailMapper .outSourceTask(subDO.getProjectSubId(), "N","0"); //2.查询过程检报工信息 - List processInspectionReports = queryProcessInspectionReports(dispatchDetailDOS); + List processInspectionReports = queryProcessInspectionReports(dispatchDetailDOList); boolean isSameSizeAndNotEmpty = isSameSizeAndNotEmpty(dispatchDetailDOList, processInspectionReports); if (isSameSizeAndNotEmpty){ subDO.setProcessInspection(TASK_COMPLETED); @@ -570,16 +576,14 @@ public class PlanServiceImpl implements PlanService { if (CollectionUtils.isEmpty(taskReportDOS)) { if (CollectionUtils.isNotEmpty(dispatchDetailDOS)){ subDO.setAssemblyTask(TASK_NOT_STARTED); - return; } + }else { + BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS); + BigDecimal reportedAmount = calculateReportedAmount(taskReportDOS); + int percentage = calculatePercentage(reportedAmount, dispatchAmount); + subDO.setAssemblyTask(String.format(TASK_STARTED_FORMAT, percentage)); + subDO.setAssemblyTaskFlag(TASK_FLAG_NORMAL); } - - BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS); - BigDecimal reportedAmount = calculateReportedAmount(taskReportDOS); - int percentage = calculatePercentage(reportedAmount, dispatchAmount); - - subDO.setAssemblyTask(String.format(TASK_STARTED_FORMAT, percentage)); - subDO.setAssemblyTaskFlag(TASK_FLAG_NORMAL); } /** * 处理进行中的任务状态 @@ -590,17 +594,17 @@ public class PlanServiceImpl implements PlanService { if (CollectionUtils.isEmpty(taskReportDOS)) { if (CollectionUtils.isNotEmpty(dispatchDetailDOS)){ - subDO.setProcessingTask(TASK_NOT_STARTED); - return; + subDO.setProcessInspection(TASK_NOT_STARTED); } + }else { + BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS); + BigDecimal reportedAmount = calculateAmount(taskReportDOS); + int percentage = calculatePercentage(reportedAmount, dispatchAmount); + subDO.setProcessInspection(String.format(TASK_STARTED_FORMAT, percentage)); + subDO.setProcessInspectionFlag(TASK_FLAG_NORMAL); } - BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS); - BigDecimal reportedAmount = calculateAmount(taskReportDOS); - int percentage = calculatePercentage(reportedAmount, dispatchAmount); - subDO.setProcessingTask(String.format(TASK_STARTED_FORMAT, percentage)); - subDO.setProcessingTaskFlag(TASK_FLAG_NORMAL); } /** * 判断两个集合大小相等且都不为空 @@ -680,16 +684,15 @@ public boolean isSameSizeAndNotEmpty(Collection list1, Collection list2) if (CollectionUtils.isEmpty(taskReportDOS)) { if (CollectionUtils.isNotEmpty(dispatchDetailDOS)){ subDO.setProcessingTask(TASK_NOT_STARTED); - return; } + }else { + BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS); + BigDecimal reportedAmount = calculateReportedAmount(taskReportDOS); + int percentage = calculatePercentage(reportedAmount, dispatchAmount); + + subDO.setProcessingTask(String.format(TASK_STARTED_FORMAT, percentage)); + subDO.setProcessingTaskFlag(TASK_FLAG_NORMAL); } - - BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS); - BigDecimal reportedAmount = calculateReportedAmount(taskReportDOS); - int percentage = calculatePercentage(reportedAmount, dispatchAmount); - - subDO.setProcessingTask(String.format(TASK_STARTED_FORMAT, percentage)); - subDO.setProcessingTaskFlag(TASK_FLAG_NORMAL); } /** * 处理装配任务时间逻辑 @@ -830,13 +833,13 @@ private List queryPurchaseOrderDetails(PlanSubDO subDO) } // 判断所有采购订单是否完成 - private boolean isAllPurchaseOrdersCompleted(List purchaseOrderNoDetailDOS) { + private boolean isAllPurchaseOrdersCompleted(List purchaseOrderNoDetailDOS,List taskDispatchDetailDOS) { if (CollectionUtils.isEmpty(purchaseOrderNoDetailDOS)) { return false; } return purchaseOrderNoDetailDOS.stream() .filter(Objects::nonNull) - .allMatch(item -> item.getReceivingStatus() == 3); + .allMatch(item -> item.getReceivingStatus() == 3) && taskDispatchDetailDOS.size()==purchaseOrderNoDetailDOS.size(); } // 计算已收货的采购数量 @@ -910,11 +913,7 @@ private List queryPurchaseOrderDetails(PlanSubDO subDO) * 查询已完成的工艺设计 */ private List getCompletedProcessDesigns(Long projectSubId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(ProcessDesignDO::getProjectSubId, projectSubId); - queryWrapper.in(ProcessDesignDO::getProcessDesignType, "BLUEPRINT_3D","BLUEPRINT_2D","BLUEPRINT_WORKBLANK"); - queryWrapper.eq(ProcessDesignDO::getIsOverProcess, "1"); - return processDesignMapper.selectList(queryWrapper); + return processDesignMapper.selectWithDetailExists(projectSubId); } /** @@ -929,10 +928,15 @@ private List queryPurchaseOrderDetails(PlanSubDO subDO) } /** - * 检查是否有足够的已完成设计(>=3) + * 检查设计是否完成 */ private boolean hasEnoughCompletedDesigns(List processDesigns) { - return ObjectUtil.isNotEmpty(processDesigns) && processDesigns.size() >= 3; + if (CollectionUtils.isEmpty(processDesigns)) { + return false; + } + return processDesigns.stream() + .filter(Objects::nonNull) + .allMatch(item -> item.getIsOverProcess() ==1); } /** @@ -967,8 +971,8 @@ private List queryPurchaseOrderDetails(PlanSubDO subDO) PlanSubDetailDO latestTwoDimPlan, LocalDateTime now) { if (ObjectUtil.isEmpty(processDesigns)) { - subDO.setDesignTask("未开始"); - return; + subDO.setDesignTask(""); + } List processDesignIds = processDesigns.stream() @@ -978,31 +982,30 @@ private List queryPurchaseOrderDetails(PlanSubDO subDO) // 获取工艺设计进度列表 List progressList = getProcessDesignProgressList(processDesignIds); - if (ObjectUtil.isEmpty(progressList)) { + if (ObjectUtil.isEmpty(progressList)&&ObjectUtil.isNotEmpty(latestTwoDimPlan)) { subDO.setDesignTask("未开始"); - return; } - + if (ObjectUtil.isNotEmpty(progressList)) { // 计算总工时和当前工时 BigDecimal totalWorkTime = calculateTotalWorkTime(progressList); BigDecimal currentTime = calculateCurrentTime(subDO); - currentTime = currentTime.multiply(new BigDecimal("8")); + currentTime = currentTime.multiply(new BigDecimal("8")); // 计算完成百分比 - Integer percentage = calculatePercentage( totalWorkTime,currentTime); + Integer percentage = calculatePercentage(totalWorkTime, currentTime); // 设置设计任务状态 subDO.setDesignTask(String.format("已开始(%d%%)", percentage)); subDO.setDesignTaskFlag("0"); - + } // 检查是否超期 - ProcessDesignProgressDO latestProgress = getLatestProgress(processDesignIds); - if (ObjectUtil.isNotEmpty(latestProgress) && + if ( ObjectUtil.isNotEmpty(latestTwoDimPlan) && now.isAfter(latestTwoDimPlan.getTwoDimDate())) { subDO.setDesignTaskFlag("1"); } } + /** * 获取最新的工艺设计进度 */ diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plansubdetail/PlanSubDetailService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plansubdetail/PlanSubDetailService.java index 854b6295..22bf6a8e 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plansubdetail/PlanSubDetailService.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plansubdetail/PlanSubDetailService.java @@ -8,6 +8,7 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.plansubdetail.vo.*; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansubdetail.PlanSubDetailDO; import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO; /** * 生产计划子项目设计时间明细 Service 接口 @@ -70,4 +71,14 @@ public interface PlanSubDetailService { CommonResult overlap(PlanSubDetailSaveReqVO updateReqVO); List getList(PlanSubDetailPageReqVO pageReqVO); + + List getList1(PlanSubDetailPageReqVO pageReqVO); + + List getList2(PlanSubDetailPageReqVO pageReqVO); + + List getList3(PlanSubDetailPageReqVO pageReqVO); + + List getList4(PlanSubDetailPageReqVO pageReqVO); + + List getList5(PlanSubDetailPageReqVO pageReqVO); } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plansubdetail/PlanSubDetailServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plansubdetail/PlanSubDetailServiceImpl.java index a8c4604b..28a0cf17 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plansubdetail/PlanSubDetailServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/plansubdetail/PlanSubDetailServiceImpl.java @@ -8,32 +8,58 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; import com.chanko.yunxi.mes.module.heli.controller.admin.plansub.vo.PlanSubPageReqVO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.pgmaster.PgMasterLineDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesign.ProcessDesignDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesignprogress.ProcessDesignProgressDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermakedetail.PurchaseOrderMakeDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.shopCalendar.ShopCalendarDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatchdetailowner.TaskDispatchDetailOwnerDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskreport.TaskReportDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.zjbgmasterline.ZjBgMasterLineDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.zjpgmaster.ZjPgMasterLineDO; +import com.chanko.yunxi.mes.module.heli.dal.mysql.pgmaster.PgMasterLineMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignProgressMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermakedetail.PurchaseOrderMakeDetailMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordernodetail.PurchaseOrderNoDetailMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.shopCalendar.ShopCalendarMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatchdetailowner.TaskDispatchDetailOwnerMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.taskreport.TaskReportMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.zjbgmasterline.ZjBgMasterLineMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.zjpgmaster.ZjPgMasterLineMapper; +import com.chanko.yunxi.mes.module.heli.service.taskdispatch.TaskDispatchService; +import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; +import com.chanko.yunxi.mes.module.system.dal.mysql.user.AdminUserMapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.extern.slf4j.Slf4j; +import org.checkerframework.checker.units.qual.A; +import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.Instant; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; import com.chanko.yunxi.mes.module.heli.controller.admin.plansubdetail.vo.*; @@ -69,6 +95,30 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { private ProjectOrderMapper projectOrderMapper; @Resource private ProcessDesignProgressMapper processDesignProgressMapper; + @Resource + private TaskDispatchDetailMapper taskDispatchDetailMapper; + @Resource + private PurchaseOrderNoDetailMapper purchaseOrderNoDetailMapper; + @Resource + private TaskReportMapper taskReportMapper; + @Resource + private PgMasterLineMapper pgMasterLineMapper; + @Resource + private ProjectOrderSubMapper projectOrderSubMapper; + @Resource + private AdminUserMapper adminUserMapper; + @Resource + private PurchaseOrderMakeDetailMapper purchaseOrderMakeDetailMapper; + @Resource + private TaskDispatchDetailOwnerMapper taskDispatchDetailOwnerMapper; + @Resource + private ZjPgMasterLineMapper zjPgMasterLineMapper; + @Resource + private ZjBgMasterLineMapper zjBgMasterLineMapper; + @Resource + private TaskDispatchMapper taskDispatchMapper; + @Resource + private TaskDispatchService taskDispatchService; @Override public Long createPlanSubDetail(PlanSubDetailSaveReqVO createReqVO) { // 插入 @@ -1764,80 +1814,1331 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { @Override public List getList(PlanSubDetailPageReqVO pageReqVO) { ArrayList planSubDetailDOS = new ArrayList<>(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ProjectOrderSubDO::getId,pageReqVO.getProjectSubId()); + wrapper.last("limit 1"); + ProjectOrderSubDO projectOrderSubDO = projectOrderSubMapper.selectOne(wrapper); LocalDateTime now = LocalDateTime.now(); //设计任务 PlanSubDetailDO designTask = new PlanSubDetailDO(); + // 设置基础信息 + designTask.setSubType("设计任务"); + designTask.setProjectSubName(projectOrderSubDO.getName()); + // 查询数据 + List planSubDetail = getPlanSubDetailsByProjectSubId(pageReqVO.getProjectSubId()); + // 设置日期字段 + setDateFields(designTask, planSubDetail); + // 设置状态和进度 + setTaskStatus(designTask, planSubDetail); + if ( !"已完成".equals(designTask.getStatus()) || + pageReqVO.getFlag()==1){ + // 如果未完成且有数据,计算进度 + if (!"已完成".equals(designTask.getStatus())) { + calculateAndSetProgress(designTask, pageReqVO.getProjectSubId()); + } + // 设置逾期状态 + setOverdueStatus(designTask, planSubDetail, pageReqVO.getProjectSubId(), now); + planSubDetailDOS.add(designTask); + } + //外协任务 + PlanSubDetailDO outsourcedTask = new PlanSubDetailDO(); + // 设置基础信息 + outsourcedTask.setSubType("外协任务"); + outsourcedTask.setProjectSubName(projectOrderSubDO.getName()); + + // 查询外协的派工单 + List dispatchDetailDOS = taskDispatchDetailMapper + .outSourceTask(pageReqVO.getProjectSubId(), "Y",null); + //设置日期字段 + setOutsourcedTaskDateFields(outsourcedTask, dispatchDetailDOS); + + List orderNoDetailDOS = queryPurchaseOrderDetails(pageReqVO.getProjectSubId()); + // 设置状态和进度 + setOutsourcedTaskStatus(outsourcedTask,orderNoDetailDOS,dispatchDetailDOS); + if ( !"已完成".equals(outsourcedTask.getStatus()) || + pageReqVO.getFlag()==1){ + // 如果未完成且有数据,计算进度 + // 计算已完成采购数量和派工数量 + BigDecimal completedPurchaseAmount = calculateCompletedPurchaseAmount(orderNoDetailDOS); + BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS); + // 计算完成百分比并设置 + Integer percentage = calculatePercentage(completedPurchaseAmount, dispatchAmount); + outsourcedTask.setProductionSchedule(percentage.toString()); + // 设置逾期状态 + processTimeLogic(outsourcedTask, dispatchDetailDOS,orderNoDetailDOS); + planSubDetailDOS.add(outsourcedTask); + } + //加工任务 + PlanSubDetailDO processingPlan = new PlanSubDetailDO(); + // 设置基础信息 + processingPlan.setSubType("加工任务"); + processingPlan.setProjectSubName(projectOrderSubDO.getName()); + // 查询外协的派工单 + List dispatchDetailDOList = taskDispatchDetailMapper + .outSourceTask(pageReqVO.getProjectSubId(), "N",null); + //设置日期字段 + setOutsourcedTaskDateFields(processingPlan, dispatchDetailDOList); + // 2. 查询报工数据 + List taskReportDOS = queryTaskReports(dispatchDetailDOList); + //设置状态 + setProcessingPlanStatus(processingPlan, dispatchDetailDOList); + if ( !"已完成".equals(processingPlan.getStatus()) || + pageReqVO.getFlag()==1){ + processTime(processingPlan, dispatchDetailDOList,taskReportDOS); + processInProgressTask(processingPlan, dispatchDetailDOList, taskReportDOS); + planSubDetailDOS.add(processingPlan); + } + + //过程检任务 + PlanSubDetailDO processInspection = new PlanSubDetailDO(); + // 设置基础信息 + processInspection.setSubType("过程检任务"); + processInspection.setProjectSubName(projectOrderSubDO.getName()); + //1.查询非外协需要过程检的数据 + List taskDispatchDetailDOS = taskDispatchDetailMapper + .outSourceTask(pageReqVO.getProjectSubId(), "N","0"); + //2.查询过程检报工信息 + List processInspectionReports = queryProcessInspectionReports(taskDispatchDetailDOS); + boolean isSameSizeAndNotEmpty = isSameSizeAndNotEmpty(taskDispatchDetailDOS, processInspectionReports); + if (isSameSizeAndNotEmpty){ + processInspection.setStatus("已完成"); + }else { + if (ObjectUtil.isNotEmpty(taskDispatchDetailDOS)){ + if (ObjectUtil.isNotEmpty(processInspectionReports)){ + processInspection.setStatus("已开始"); + processInspection.setStatusFlag("0"); + }else{ + processInspection.setStatus("未开始"); + processInspection.setProductionSchedule("0"); + } + } + } + if ( !"已完成".equals(processInspection.getStatus()) || + pageReqVO.getFlag()==1){ + processInspectionTask(processInspection, taskDispatchDetailDOS, processInspectionReports); + planSubDetailDOS.add(processInspection); + } + //装配任务 + PlanSubDetailDO assemblyTask = new PlanSubDetailDO(); + // 1. 设置基础信息 + assemblyTask.setSubType("装配任务"); + assemblyTask.setProjectSubName(projectOrderSubDO.getName()); + //查询该子项目的装配任务 + List taskDispatchDetailDOList = taskDispatchDetailMapper.assemblyTask(pageReqVO.getProjectSubId()); + // 2. 查询装配报工数据 + List taskReportDOList = queryTaskReports(taskDispatchDetailDOList); + setOutsourcedTaskDateFields(assemblyTask, taskDispatchDetailDOList); + // 设置状态和进度 + setProcessingPlanStatus(assemblyTask, taskDispatchDetailDOList); + if ( !"已完成".equals(assemblyTask.getStatus()) || + pageReqVO.getFlag()==1){ + processTime(assemblyTask, taskDispatchDetailDOList,taskReportDOList); + processInProgressTask(assemblyTask, taskDispatchDetailDOList, taskReportDOList); + planSubDetailDOS.add(assemblyTask); + } + return planSubDetailDOS; + } + + @Override + public List getList1(PlanSubDetailPageReqVO pageReqVO) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(PlanSubDetailDO::getProjectSubId,pageReqVO.getProjectSubId()); - List planSubDetail = planSubDetailMapper.selectList(lambdaQueryWrapper); - designTask.setSubType("设计"); - LocalDateTime minTime = planSubDetail.stream() + lambdaQueryWrapper.eq(PlanSubDetailDO::getProjectSubId, pageReqVO.getProjectSubId()); + lambdaQueryWrapper.orderByAsc(PlanSubDetailDO::getStartTwoDimDate); + List planSubDetailDOS = planSubDetailMapper.selectList(lambdaQueryWrapper); + // 1. 先批量查询所有需要的数据,避免N+1查询 + List userIds = planSubDetailDOS.stream() + .map(PlanSubDetailDO::getTwoDimOwner) .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + + Map userMap = Collections.emptyMap(); + if (!userIds.isEmpty()) { + LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); + userWrapper.in(AdminUserDO::getId, userIds); + List adminUsers = adminUserMapper.selectList(userWrapper); + userMap = adminUsers.stream() + .collect(Collectors.toMap(AdminUserDO::getId, Function.identity())); + } + +// 2. 批量查询ProcessDesign + List projectSubIds = planSubDetailDOS.stream() + .map(PlanSubDetailDO::getProjectSubId) + .distinct() + .collect(Collectors.toList()); + + List subTypes = planSubDetailDOS.stream() + .map(PlanSubDetailDO::getSubType) + .distinct() + .collect(Collectors.toList()); + + Map> processDesignMap = Collections.emptyMap(); + if (!projectSubIds.isEmpty() && !subTypes.isEmpty()) { + LambdaQueryWrapper pdWrapper = new LambdaQueryWrapper<>(); + pdWrapper.in(ProcessDesignDO::getProjectSubId, projectSubIds); + pdWrapper.in(ProcessDesignDO::getProcessDesignType, subTypes); + + List processDesigns = processDesignMapper.selectList(pdWrapper); + processDesignMap = processDesigns.stream() + .collect(Collectors.groupingBy(ProcessDesignDO::getProjectSubId)); + } + +// 3. 批量查询所有相关的ProcessDesignProgress + List processDesignIds = processDesignMap.values().stream() + .flatMap(List::stream) + .map(ProcessDesignDO::getId) + .distinct() + .collect(Collectors.toList()); + + Map> progressMap = Collections.emptyMap(); + if (!processDesignIds.isEmpty()) { + LambdaQueryWrapper pdpWrapper = new LambdaQueryWrapper<>(); + pdpWrapper.in(ProcessDesignProgressDO::getProcessDesignId, processDesignIds); + List progresses = processDesignProgressMapper.selectList(pdpWrapper); + progressMap = progresses.stream() + .collect(Collectors.groupingBy(ProcessDesignProgressDO::getProcessDesignId)); + } + +// 4. 定义类型映射 + Map typeMap = new HashMap<>(); + typeMap.put("BLUEPRINT_WORKBLANK", "毛坯"); + typeMap.put("BLUEPRINT_2D", "2D"); + typeMap.put("BLUEPRINT_3D", "3D"); + +// 5. 处理主逻辑 + for (PlanSubDetailDO planSubDetailDO : planSubDetailDOS) { + // 设置用户名 + if (planSubDetailDO.getTwoDimOwner() != null) { + AdminUserDO adminUserDO = userMap.get(planSubDetailDO.getTwoDimOwner()); + if (adminUserDO != null) { + planSubDetailDO.setTwoDimOwnerName(adminUserDO.getNickname()); + } + } + + // 设置类型 + planSubDetailDO.setType(typeMap.getOrDefault(planSubDetailDO.getSubType(), "3D")); + + // 处理ProcessDesign相关逻辑 + List designList = processDesignMap.get(planSubDetailDO.getProjectSubId()); + if (designList != null) { + ProcessDesignDO processDesignDO = designList.stream() + .filter(pd -> planSubDetailDO.getSubType().equals(pd.getProcessDesignType())) + .findFirst() + .orElse(null); + + if (processDesignDO != null) { + processDesignLogic(planSubDetailDO, processDesignDO, progressMap); + } else { + planSubDetailDO.setPercentage("0%"); + } + } else { + planSubDetailDO.setPercentage("0%"); + } + } + return planSubDetailDOS; + } + + @Override + public List getList2(PlanSubDetailPageReqVO pageReqVO) { + // 1. 查询任务分派详情列表 + List dispatchDetailDOS = taskDispatchDetailMapper + .outSourceTask(pageReqVO.getProjectSubId(), "Y", null); + + if (CollectionUtils.isEmpty(dispatchDetailDOS)) { + return dispatchDetailDOS; + } + +// 2. 批量收集查询条件,避免N+1查询 + List bomDetailIds = dispatchDetailDOS.stream() + .map(TaskDispatchDetailDO::getBomDetailId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + + List procedureIds = dispatchDetailDOS.stream() + .map(TaskDispatchDetailDO::getProcedureId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + +// 3. 批量查询采购订单制作详情 + Map makeDetailMap = new HashMap<>(); + if (!bomDetailIds.isEmpty() && !procedureIds.isEmpty()) { + LambdaQueryWrapper makeWrapper = new LambdaQueryWrapper<>(); + makeWrapper.in(PurchaseOrderMakeDetailDO::getBoomDetailId, bomDetailIds); + makeWrapper.in(PurchaseOrderMakeDetailDO::getProcedureId, procedureIds); + + List makeDetails = purchaseOrderMakeDetailMapper.selectList(makeWrapper); + + // 构建复合键的映射,模拟limit 1的效果 + makeDetailMap = makeDetails.stream() + .collect(Collectors.toMap( + item -> buildKey(item.getBoomDetailId(), item.getProcedureId()), + Function.identity(), + (existing, replacement) -> existing // 如果有重复,保留第一个 + )); + } + +// 4. 批量查询采购订单号详情 + Map noDetailMap = new HashMap<>(); + if (!bomDetailIds.isEmpty() && !procedureIds.isEmpty()) { + LambdaQueryWrapper noWrapper = new LambdaQueryWrapper<>(); + noWrapper.in(PurchaseOrderNoDetailDO::getBoomDetailId, bomDetailIds); + noWrapper.in(PurchaseOrderNoDetailDO::getProcedureId, procedureIds); + + List noDetails = purchaseOrderNoDetailMapper.selectList(noWrapper); + + // 同样构建复合键的映射,模拟limit 1的效果 + noDetailMap = noDetails.stream() + .collect(Collectors.toMap( + item -> buildKey(item.getBoomDetailId(), item.getProcedureId()), + Function.identity(), + (existing, replacement) -> existing // 如果有重复,保留第一个 + )); + } + +// 5. 批量处理逻辑 + LocalDateTime now = LocalDateTime.now(); + for (TaskDispatchDetailDO dispatchDetailDO : dispatchDetailDOS) { + Long bomDetailId = dispatchDetailDO.getBomDetailId(); + Long procedureId = dispatchDetailDO.getProcedureId(); + + if (bomDetailId == null || procedureId == null) { + continue; + } + + // 构建复合键 + String key = buildKey(bomDetailId, procedureId); + + // 检查采购订单制作详情 + PurchaseOrderMakeDetailDO makeDetail = makeDetailMap.get(key); + if (makeDetail != null) { + dispatchDetailDO.setPartsProcurement("已送审"); + } + + // 检查采购订单号详情 + PurchaseOrderNoDetailDO noDetail = noDetailMap.get(key); + if (noDetail != null) { + processPurchaseOrderNoDetail(dispatchDetailDO, noDetail, now); + } else { + // 如果没有采购订单号详情,检查是否超期 + if (now.isAfter(dispatchDetailDO.getEndTime())) { + dispatchDetailDO.setReceivingFlag("1"); + } + } + } + + return dispatchDetailDOS; + } + + @Override + public List getList3(PlanSubDetailPageReqVO pageReqVO) { + // 1. 查询任务分派详情列表 + List dispatchDetailDOS = taskDispatchDetailMapper + .outSourceTask(pageReqVO.getProjectSubId(), "N", null); + + if (CollectionUtils.isEmpty(dispatchDetailDOS)) { + return dispatchDetailDOS; + } + +// 2. 收集所有dispatchDetailId,用于批量查询TaskReportDO + List dispatchDetailIds = dispatchDetailDOS.stream() + .map(TaskDispatchDetailDO::getId) + .collect(Collectors.toList()); + +// 3. 批量查询TaskReportDO,并按dispatchDetailId分组 + Map> taskReportMap = Collections.emptyMap(); + if (!dispatchDetailIds.isEmpty()) { + LambdaQueryWrapper taskReportWrapper = new LambdaQueryWrapper<>(); + taskReportWrapper.in(TaskReportDO::getDispatchDetailId, dispatchDetailIds); + taskReportWrapper.eq(TaskReportDO::getHasReport, "1"); + + List allTaskReports = taskReportMapper.selectList(taskReportWrapper); + taskReportMap = allTaskReports.stream() + .collect(Collectors.groupingBy(TaskReportDO::getDispatchDetailId)); + } + + + +// 5. 批量处理逻辑 + LocalDateTime now = LocalDateTime.now(); + for (TaskDispatchDetailDO dispatchDetailDO : dispatchDetailDOS) { + // 计算工作时间(除以8并四舍五入到2位小数) + if (dispatchDetailDO.getWorkTime() != null) { + BigDecimal workTime = dispatchDetailDO.getWorkTime() + .divide(new BigDecimal(8), 2, RoundingMode.HALF_UP); + dispatchDetailDO.setWorkTime(workTime); + } + + // 获取对应的TaskReportDO列表 + List taskReportDOS = taskReportMap.get(dispatchDetailDO.getId()); + + if (CollectionUtils.isEmpty(taskReportDOS)) { + dispatchDetailDO.setPercentage("0%"); + processReportStatus(dispatchDetailDO, null, now); + continue; + } + + // 计算已上报金额 + BigDecimal reportedAmount = calculateTotalAmount(taskReportDOS); + + // 计算百分比 + if (dispatchDetailDO.getAmount() != null) { + int percentage = calculatePercentage(reportedAmount, + new BigDecimal(dispatchDetailDO.getAmount())); + dispatchDetailDO.setPercentage(percentage + "%"); + } else { + dispatchDetailDO.setPercentage("0%"); + } + + // 计算工作小时 + BigDecimal totalReported = calculateTotalReported(taskReportDOS); + if (totalReported != null) { + BigDecimal workingHour = totalReported + .divide(new BigDecimal(8), 2, RoundingMode.HALF_UP); + dispatchDetailDO.setWorkingHour(workingHour); + } + + // 处理报工状态 + processReportStatus(dispatchDetailDO, taskReportDOS, now); + } + + return dispatchDetailDOS; + + } + + @Override + public List getList4(PlanSubDetailPageReqVO pageReqVO) { + // 1. 查询过程检派工单 + List dispatchDetailDOS = taskDispatchDetailMapper + .outSourceTask(pageReqVO.getProjectSubId(), "N", "0"); + + if (CollectionUtils.isEmpty(dispatchDetailDOS)) { + return dispatchDetailDOS; + } + +// 2. 收集所有 dispatchDetailId,用于批量查询 + List dispatchDetailIds = dispatchDetailDOS.stream() + .map(TaskDispatchDetailDO::getId) + .collect(Collectors.toList()); + +// 3. 批量查询 PgMasterLineDO,按 dispatchDetailId 分组 + Map> pgMasterLineMap = Collections.emptyMap(); + if (!dispatchDetailIds.isEmpty()) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(PgMasterLineDO::getDispatchDetailId, dispatchDetailIds); + + List pgMasterLines = pgMasterLineMapper.selectList(wrapper); + pgMasterLineMap = pgMasterLines.stream() + .collect(Collectors.groupingBy(PgMasterLineDO::getDispatchDetailId)); + } + +// 4. 收集需要查询的用户 ID + Set userIds = pgMasterLineMap.values().stream() + .flatMap(List::stream) + .filter(pg -> "END".equals(pg.getActive()) && pg.getDetilUser() != null) + .map(PgMasterLineDO::getDetilUser) + .collect(Collectors.toSet()); + +// 5. 批量查询用户信息 + Map userMap = Collections.emptyMap(); + if (!userIds.isEmpty()) { + LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); + userWrapper.in(AdminUserDO::getId, userIds); + List users = adminUserMapper.selectList(userWrapper); + userMap = users.stream() + .collect(Collectors.toMap(AdminUserDO::getId, Function.identity())); + } + +// 6. 处理数据 + for (TaskDispatchDetailDO dispatchDetailDO : dispatchDetailDOS) { + List pgMasterLines = pgMasterLineMap.get(dispatchDetailDO.getId()); + dispatchDetailDO.setOwnerName(""); + if (CollectionUtils.isEmpty(pgMasterLines)) { + dispatchDetailDO.setReport("未生成"); + continue; + } + + // 模拟 limit 1 的效果:取第一条记录 + PgMasterLineDO pgMasterLineDO = pgMasterLines.get(0); + + if ("END".equals(pgMasterLineDO.getActive())) { + dispatchDetailDO.setReport("已完成"); + + // 设置负责人姓名 + Long detailUserId = pgMasterLineDO.getDetilUser(); + if (detailUserId != null) { + AdminUserDO adminUserDO = userMap.get(detailUserId); + if (adminUserDO != null) { + dispatchDetailDO.setOwnerName(adminUserDO.getNickname()); + } + } + } else { + dispatchDetailDO.setReport("已生成"); + } + } + + return dispatchDetailDOS; + } + + @Override + public List getList5(PlanSubDetailPageReqVO pageReqVO) { + + List taskDispatchDetailDOList = taskDispatchDetailMapper + .assemblyTask(pageReqVO.getProjectSubId()); + + if (CollectionUtils.isEmpty(taskDispatchDetailDOList)) { + return taskDispatchDetailDOList; + } + List ids = taskDispatchDetailDOList.stream().map(TaskDispatchDetailDO::getDispatchId).collect(Collectors.toList()); + List taskDispatchDOS = taskDispatchMapper.selectByIds(ids); + for (TaskDispatchDO taskDispatchDO : taskDispatchDOS) { + taskDispatchService.convertAssembleProcedure(taskDispatchDO); + } + Map OwnerNameMap = taskDispatchDOS.stream() + .collect(Collectors.toMap( + TaskDispatchDO::getId, + task -> Optional.ofNullable(task.getOwnerName()).orElse("") + )); + List dispatchDetailIds = taskDispatchDetailDOList.stream().map(TaskDispatchDetailDO::getId).collect(Collectors.toList()); + + +// 6. 批量查询TaskReportDO,并按dispatchDetailId分组 + Map> taskReportMap = new HashMap<>(); + if (!dispatchDetailIds.isEmpty()) { + LambdaQueryWrapper taskReportWrapper = new LambdaQueryWrapper<>(); + taskReportWrapper.in(TaskReportDO::getDispatchDetailId, dispatchDetailIds); + taskReportWrapper.eq(TaskReportDO::getHasReport, "1"); + + List allTaskReports = taskReportMapper.selectList(taskReportWrapper); + taskReportMap = allTaskReports.stream() + .collect(Collectors.groupingBy(TaskReportDO::getDispatchDetailId)); + } + +// 7. 查询ZjPgMasterLineDO(整个循环中只需要查询一次) + ZjPgMasterLineDO zjPgMasterLineDO = null; + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ZjPgMasterLineDO::getProjectSubId, pageReqVO.getProjectSubId()); + queryWrapper.last("limit 1"); + zjPgMasterLineDO = zjPgMasterLineMapper.selectOne(queryWrapper); + +// 8. 如果ZjPgMasterLineDO存在且pgType不为1,则查询ZjBgMasterLineDO + Map> zjBgMasterLineMap = new HashMap<>(); + if (zjPgMasterLineDO != null && !"1".equals(zjPgMasterLineDO.getPgType())) { + LambdaQueryWrapper zjBgMasterLineWrapper = new LambdaQueryWrapper<>(); + zjBgMasterLineWrapper.eq(ZjBgMasterLineDO::getZjMxId, zjPgMasterLineDO.getId()); + zjBgMasterLineWrapper.isNotNull(ZjBgMasterLineDO::getEntTime); + + List zjBgMasterLineDOList = zjBgMasterLineMapper.selectList(zjBgMasterLineWrapper); + zjBgMasterLineMap = zjBgMasterLineDOList.stream() + .collect(Collectors.groupingBy(ZjBgMasterLineDO::getZjMxId)); + } + +// 9. 定义常量 + BigDecimal DIVISOR = new BigDecimal(8); + LocalDateTime now = LocalDateTime.now(); + +// 10. 处理数据 + for (TaskDispatchDetailDO taskDispatchDetailDO : taskDispatchDetailDOList) { + String ownerName= OwnerNameMap.get(taskDispatchDetailDO.getDispatchId()); + if (ObjectUtil.isNotEmpty(ownerName)) { + taskDispatchDetailDO.setOwnerName(ownerName); + } + // 10.2 计算工作时间 + if (taskDispatchDetailDO.getWorkTime() != null) { + BigDecimal workTime = taskDispatchDetailDO.getWorkTime() + .divide(DIVISOR, 2, RoundingMode.HALF_UP); + taskDispatchDetailDO.setWorkTime(workTime); + } + // 10.3 处理TaskReportDO相关逻辑 + List allTaskReports = taskReportMap.get(taskDispatchDetailDO.getId()); + if (taskDispatchDetailDO.getProcedureStatus() == 2) { + taskDispatchDetailDO.setReport("已完成"); + taskDispatchDetailDO.setPercentage("100%"); + BigDecimal totalReported = calculateTotalReported(allTaskReports); + if (totalReported != null) { + BigDecimal workingHour = totalReported.divide(DIVISOR, 2, RoundingMode.HALF_UP); + taskDispatchDetailDO.setWorkingHour(workingHour); + } + BigDecimal amount = calculateTotalAmount(allTaskReports); + taskDispatchDetailDO.setNumAmount(Integer.parseInt(amount.toString())); + if (CollectionUtils.isNotEmpty(allTaskReports)) { + LocalDateTime maxEndTime = findMaxEndTime(allTaskReports); + if (maxEndTime != null && maxEndTime.isAfter(taskDispatchDetailDO.getEndTime())) { + taskDispatchDetailDO.setReportFlag("1"); + } + } + } else { + if (CollectionUtils.isNotEmpty(allTaskReports)) { + taskDispatchDetailDO.setReport("已报工"); + // 计算工作小时 + BigDecimal totalReported = calculateTotalReported(allTaskReports); + if (totalReported != null) { + BigDecimal workingHour = totalReported.divide(DIVISOR, 2, RoundingMode.HALF_UP); + taskDispatchDetailDO.setWorkingHour(workingHour); + } + BigDecimal amount = calculateTotalAmount(allTaskReports); + taskDispatchDetailDO.setNumAmount(Integer.parseInt(amount.toString())); + } else { + taskDispatchDetailDO.setReport("未报工"); + taskDispatchDetailDO.setPercentage("0%"); + } + + if (now.isAfter(taskDispatchDetailDO.getEndTime())) { + taskDispatchDetailDO.setReportFlag("1"); + } + } + + // 10.4 处理ZjPgMasterLineDO相关逻辑 + if (zjPgMasterLineDO != null) { + if (zjPgMasterLineDO.getPgType()==1) { + taskDispatchDetailDO.setFinishedProduct("已完成"); + } else { + List zjBgMasterLineDOList = zjBgMasterLineMap.get(Long.valueOf(zjPgMasterLineDO.getId())); + if (CollectionUtils.isNotEmpty(zjBgMasterLineDOList)) { + taskDispatchDetailDO.setFinishedProduct("部分报工"); + } else { + taskDispatchDetailDO.setFinishedProduct("未报工"); + } + } + } + } + // 1. 按照 detailOwnerId 分组 + Map> groupedMap = taskDispatchDetailDOList.stream() + .collect(Collectors.groupingBy(TaskDispatchDetailDO::getDetailOwnerId)); + + // 2. 对每个分组进行合并计算,生成新的合并后的对象 + return groupedMap.entrySet().stream() + .map(entry -> mergeGroup(entry.getKey(), entry.getValue())) + .collect(Collectors.toList()); + + } + private TaskDispatchDetailDO mergeGroup(Long detailOwnerId, List groupList) { + TaskDispatchDetailDO merged = groupList.get(0); + merged.setDetailOwnerId(detailOwnerId); + + // 1. workTime 求和 + BigDecimal totalWorkTime = groupList.stream() + .map(TaskDispatchDetailDO::getWorkingHour) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + merged.setWorkingHour(totalWorkTime); + + // 2. reportFlag 进行或运算(只要有一个是1就是1) + boolean hasReportFlagOne = groupList.stream() + .anyMatch(item -> item.getReportFlag() != null && "1".equals(item.getReportFlag())); + merged.setReportFlag(hasReportFlagOne ? "1" : "0"); + + // 3. 判断 report 状态 + List allReports = groupList.stream() + .map(TaskDispatchDetailDO::getReport) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 判断是否全部是"已完成" + boolean allCompleted = !allReports.isEmpty() && + allReports.stream().allMatch("已完成"::equals); + + // 判断是否全部是"未报工" + boolean allNotReported = !allReports.isEmpty() && + allReports.stream().allMatch("未报工"::equals); + + if (allCompleted) { + merged.setReport("已完成"); + merged.setPercentage("100%"); // 100% + } else if (allNotReported) { + merged.setReport("未报工"); + merged.setPercentage("0%"); // 0% + } else { + BigDecimal totalAmount = groupList.stream() + .map(TaskDispatchDetailDO::getAmount) + .filter(Objects::nonNull) + .map(BigDecimal::new) // 将 Integer 转换为 BigDecimal + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal numAmount = groupList.stream() + .map(TaskDispatchDetailDO::getNumAmount) + .filter(Objects::nonNull) + .map(BigDecimal::new) // 将 Integer 转换为 BigDecimal + .reduce(BigDecimal.ZERO, BigDecimal::add); + + int percentage = calculatePercentage(numAmount, + totalAmount); + merged.setReport("已报工"); // 或者根据业务需要设置其他状态 + merged.setPercentage(percentage + "%"); + } + + return merged; + } + /** + * 计算TaskReportDO列表的总金额 + */ + private BigDecimal calculateTotalAmount(List taskReportDOS) { + return taskReportDOS.stream() + .map(TaskReportDO::getAmount) + .filter(Objects::nonNull) + .map(BigDecimal::new) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 计算TaskReportDO列表的总上报值 + * 注意:这里假设calculateReported方法计算的是某个字段的总和 + * 如果实际逻辑不同,请调整 + */ + private BigDecimal calculateTotalReported(List taskReportDOS) { + // 根据实际业务逻辑实现,这里假设是某个字段的求和 + return taskReportDOS.stream() + .map(TaskReportDO::getWorkTime) // 假设这个方法获取上报值 + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + + + /** + * 处理报工状态逻辑 + */ + private void processReportStatus(TaskDispatchDetailDO dispatchDetailDO, + List taskReportDOS, + LocalDateTime now) { + if (Integer.valueOf(2).equals(dispatchDetailDO.getProcedureStatus())) { + dispatchDetailDO.setReport("已报工"); + + if (taskReportDOS != null) { + LocalDateTime maxEndTime = findMaxEndTime(taskReportDOS); + if (maxEndTime != null && maxEndTime.isAfter(dispatchDetailDO.getEndTime())) { + dispatchDetailDO.setReportFlag("1"); + } + } + } else { + if (now.isAfter(dispatchDetailDO.getEndTime())) { + dispatchDetailDO.setReportFlag("1"); + } + } + } + + /** + * 查找最大结束时间 + */ + private LocalDateTime findMaxEndTime(List taskReportDOS) { + return taskReportDOS.stream() + .map(TaskReportDO::getEndTime) + .filter(Objects::nonNull) + .max(LocalDateTime::compareTo) + .orElse(null); + } + /** + * 构建复合键的方法 + */ + private String buildKey(Long bomDetailId, Long procedureId) { + return bomDetailId + "_" + procedureId; + } + + /** + * 处理采购订单号详情的逻辑 + */ + private void processPurchaseOrderNoDetail(TaskDispatchDetailDO dispatchDetailDO, + PurchaseOrderNoDetailDO purchaseOrderNoDetailDO, + LocalDateTime now) { + Integer receivingStatus = purchaseOrderNoDetailDO.getReceivingStatus(); + + if (Integer.valueOf(3).equals(receivingStatus)) { + // 已收货 + dispatchDetailDO.setReceiving("已收货"); + LocalDateTime arriveTime = purchaseOrderNoDetailDO.getArriveTime(); + dispatchDetailDO.setReceivingTime(arriveTime); + + // 检查是否超期 + if (arriveTime != null && arriveTime.isAfter(dispatchDetailDO.getEndTime())) { + dispatchDetailDO.setReceivingFlag("1"); + } + } else { + // 未收货或状态不是3,检查是否超期 + if (now.isAfter(dispatchDetailDO.getEndTime())) { + dispatchDetailDO.setReceivingFlag("1"); + } + } + } + // 6. 提取的处理方法 + private void processDesignLogic(PlanSubDetailDO planSubDetailDO, ProcessDesignDO processDesignDO, + Map> progressMap) { + List progressList = progressMap.get(processDesignDO.getId()); + + if (CollectionUtils.isEmpty(progressList)) { + planSubDetailDO.setPercentage("0%"); + } + + // 计算总工时和最大结束时间 + BigDecimal totalWorkTime = BigDecimal.ZERO; + Date maxTime = null; +if (ObjectUtil.isNotEmpty(progressList)){ + + + for (ProcessDesignProgressDO progress : progressList) { + if (progress.getWorkTime() != null) { + totalWorkTime = totalWorkTime.add(progress.getWorkTime()); + } + + if (progress.getEndTime() != null && + (maxTime == null || progress.getEndTime().after(maxTime))) { + maxTime = progress.getEndTime(); + } + } + + planSubDetailDO.setWorkHours(totalWorkTime); + planSubDetailDO.setTime(maxTime); +} + // 设计数量乘以8 + Long designNum = planSubDetailDO.getDesignNum(); + if (designNum != null) { + planSubDetailDO.setDesignNum(designNum * 8); + } + + // 根据完成状态处理 + if (Integer.valueOf(1).equals(processDesignDO.getIsOverProcess())) { + processCompletedPlan(planSubDetailDO, maxTime); + } else { + processInProgressPlan(planSubDetailDO, totalWorkTime); + } + } + + private void processCompletedPlan(PlanSubDetailDO planSubDetailDO, Date maxTime) { + planSubDetailDO.setPercentage("100%"); + + if (maxTime != null) { + LocalDateTime endLocalDateTime = maxTime.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + + if (endLocalDateTime.isAfter(planSubDetailDO.getTwoDimDate())) { + planSubDetailDO.setStatus("已延期"); + planSubDetailDO.setStatusFlag("1"); + } + } + } + + private void processInProgressPlan(PlanSubDetailDO planSubDetailDO, BigDecimal totalWorkTime) { + if (planSubDetailDO.getDesignNum() == null || planSubDetailDO.getDesignNum() == 0) { + planSubDetailDO.setPercentage("0%"); + return; + } + + Integer calculatePercentage = calculatePercentage(totalWorkTime, + new BigDecimal(planSubDetailDO.getDesignNum())); + planSubDetailDO.setPercentage(calculatePercentage + "%"); + + if (LocalDateTime.now().isAfter(planSubDetailDO.getTwoDimDate())) { + planSubDetailDO.setStatus("已延期"); + planSubDetailDO.setStatusFlag("1"); + } + } + + + private void processTime(PlanSubDetailDO outsourcedTask, + List dispatchDetailDOS, + List taskReportDOS + ) { + + // 获取已完成订单的最大arriveTime + LocalDateTime maxArriveTime = dispatchDetailDOS.stream() + .filter(Objects::nonNull) + .map(TaskDispatchDetailDO::getEndTime) + .filter(Objects::nonNull) + .max(Comparator.naturalOrder()) + .orElse(null); + + + if (maxArriveTime == null) { + return; + } + boolean allCompleted = isAllDispatchDetailsCompleted(dispatchDetailDOS); + + // 根据完成状态判断是否延迟 + if (allCompleted) { + // 获取最大的requireTime + LocalDateTime maxRequireTime = taskReportDOS.stream() + .filter(Objects::nonNull) + .map(TaskReportDO::getEndTime) + .filter(Objects::nonNull) + .max(Comparator.naturalOrder()) + .orElse(null); + + // 如果到货时间晚于要求时间,标记为延迟 + if (maxRequireTime != null && maxRequireTime.isAfter(maxArriveTime)) { + outsourcedTask.setStatusFlag("1"); + } + } else { + // 当前时间晚于最大要求时间,标记为延迟 + if (LocalDateTime.now().isAfter(maxArriveTime)) { + outsourcedTask.setStatusFlag("1"); + } + } + } + private void processInspectionTask(PlanSubDetailDO processInspection, + List dispatchDetailDOS, + List taskReportDOS) { + + if (CollectionUtils.isEmpty(taskReportDOS)||CollectionUtils.isEmpty(dispatchDetailDOS)) { + processInspection.setProductionSchedule("0"); + return; + } + + BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS); + BigDecimal reportedAmount = calculateAmount(taskReportDOS); + Integer percentage = calculatePercentage(reportedAmount, dispatchAmount); + + processInspection.setProductionSchedule(percentage.toString()); + } + /** + * 计算已过程检数量 + */ + private BigDecimal calculateAmount(List taskReportDOS) { + return Optional.ofNullable(taskReportDOS) + .orElse(Collections.emptyList()) + .stream() + .filter(Objects::nonNull) + .map(PgMasterLineDO::getAmount) + .filter(Objects::nonNull) + .map(BigDecimal::new) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + /** + * 判断两个集合大小相等且都不为空 + * @param list1 第一个集合 + * @param list2 第二个集合 + * @return true: 两个集合都不为空且大小相等 + */ + public boolean isSameSizeAndNotEmpty(Collection list1, Collection list2) { + return CollectionUtils.isNotEmpty(list1) + && CollectionUtils.isNotEmpty(list2) + && list1.size() == list2.size(); + } + /** + * 查询过程检报工数据 + */ + private List queryProcessInspectionReports(List dispatchDetailDOS) { + if (CollectionUtils.isEmpty(dispatchDetailDOS)) { + return Collections.emptyList(); + } + + List dispatchDetailIds = dispatchDetailDOS.stream() + .filter(Objects::nonNull) + .map(TaskDispatchDetailDO::getId) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(dispatchDetailIds)) { + return Collections.emptyList(); + } + + return pgMasterLineMapper.selectList( + new LambdaQueryWrapper() + .in(PgMasterLineDO::getDispatchDetailId, dispatchDetailIds) + .eq(PgMasterLineDO::getActive, "END") + ); + } + private void setProcessingPlanStatus(PlanSubDetailDO processingPlan, List dispatchDetailDOList) { + if (CollectionUtils.isEmpty(dispatchDetailDOList)) { + return; + } + + // 判断所有派工单是否已完成 + boolean allCompleted = isAllDispatchDetailsCompleted(dispatchDetailDOList); + if (allCompleted) { + processingPlan.setStatus("已完成"); + } else { + if (hasThree(dispatchDetailDOList)) { + processingPlan.setStatus("已开始"); + processingPlan.setStatusFlag("0"); + } else { + processingPlan.setStatus("未开始"); + } + } + } + public boolean hasThree(List dispatchDetailDOList) { + if (CollectionUtils.isEmpty(dispatchDetailDOList)) { + return false; + } + return dispatchDetailDOList.stream() + .filter(Objects::nonNull) + .anyMatch(detail -> detail.getProcedureStatus() == 2); + } + /** + * 处理进行中的任务状态 + */ + private void processInProgressTask(PlanSubDetailDO processingPlan, + List dispatchDetailDOS, + List taskReportDOS) { + + if (CollectionUtils.isEmpty(taskReportDOS)) { + processingPlan.setProductionSchedule("0"); + return; + } + if (CollectionUtils.isEmpty(dispatchDetailDOS)){ + processingPlan.setProductionSchedule("0"); + return; + } + + BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS); + BigDecimal reportedAmount = calculateReportedAmount(taskReportDOS); + Integer percentage = calculatePercentage(reportedAmount, dispatchAmount); + + processingPlan.setProductionSchedule(percentage.toString()); + } + /** + * 计算已报工工时 + */ + private BigDecimal calculateReported(List taskReportDOS) { + return Optional.ofNullable(taskReportDOS) + .orElse(Collections.emptyList()) + .stream() + .filter(Objects::nonNull) + .map(TaskReportDO::getWorkTime) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + /** + * 计算已报工数量 + */ + private BigDecimal calculateReportedAmount(List taskReportDOS) { + return Optional.ofNullable(taskReportDOS) + .orElse(Collections.emptyList()) + .stream() + .filter(Objects::nonNull) + .map(TaskReportDO::getAmount) + .filter(Objects::nonNull) + .map(BigDecimal::new) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + /** + * 判断所有派工单是否已完成(procedureStatus == 2) + */ + private boolean isAllDispatchDetailsCompleted(List dispatchDetailDOS) { + return CollectionUtils.isNotEmpty(dispatchDetailDOS) + && dispatchDetailDOS.stream() + .filter(Objects::nonNull) + .allMatch(item -> item.getProcedureStatus() == 2); + } + /** + * 查询报工数据 + */ + private List queryTaskReports(List dispatchDetailDOS) { + if (CollectionUtils.isEmpty(dispatchDetailDOS)) { + return Collections.emptyList(); + } + + List dispatchDetailIds = dispatchDetailDOS.stream() + .filter(Objects::nonNull) + .map(TaskDispatchDetailDO::getId) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(dispatchDetailIds)) { + return Collections.emptyList(); + } + + return taskReportMapper.selectList( + new LambdaQueryWrapper() + .in(TaskReportDO::getDispatchDetailId, dispatchDetailIds) + .eq(TaskReportDO::getHasReport, 1) + ); + } + // 处理时间相关逻辑 + private void processTimeLogic(PlanSubDetailDO outsourcedTask, + List dispatchDetailDOS, + List purchaseOrderNoDetailDOS + ) { + if (CollectionUtils.isEmpty(purchaseOrderNoDetailDOS)) { + return; + } + + // 获取最大的requireTime + LocalDateTime maxRequireTime = dispatchDetailDOS.stream() + .filter(Objects::nonNull) + .map(TaskDispatchDetailDO::getEndTime) + .filter(Objects::nonNull) + .max(Comparator.naturalOrder()) + .orElse(null); + + if (maxRequireTime == null) { + return; + } + boolean allCompleted = isAllPurchaseOrdersCompleted(purchaseOrderNoDetailDOS,dispatchDetailDOS); + + // 根据完成状态判断是否延迟 + if (allCompleted) { + // 获取已完成订单的最大arriveTime + LocalDateTime maxArriveTime = purchaseOrderNoDetailDOS.stream() + .filter(Objects::nonNull) + .filter(item -> item.getReceivingStatus() == 3) + .map(PurchaseOrderNoDetailDO::getArriveTime) + .filter(Objects::nonNull) + .max(Comparator.naturalOrder()) + .orElse(null); + + // 如果到货时间晚于要求时间,标记为延迟 + if (maxArriveTime != null && maxArriveTime.isAfter(maxRequireTime)) { + outsourcedTask.setStatusFlag("1"); + } + } else { + // 当前时间晚于最大要求时间,标记为延迟 + if (LocalDateTime.now().isAfter(maxRequireTime)) { + outsourcedTask.setStatusFlag("1"); + } + } + } + private void setOutsourcedTaskStatus(PlanSubDetailDO outsourcedTask, List orderNoDetailDOS,List dispatchDetailDOS) { + if (CollectionUtils.isEmpty(orderNoDetailDOS)||CollectionUtils.isEmpty(dispatchDetailDOS)) { + return; + } + // 判断所有采购订单是否都已收货 + boolean allCompleted = isAllPurchaseOrdersCompleted(orderNoDetailDOS,dispatchDetailDOS); + if (allCompleted) { + outsourcedTask.setStatus("已完成"); + } else { + if (hasStatusThree(orderNoDetailDOS)) { + outsourcedTask.setStatus("已开始"); + outsourcedTask.setStatusFlag("0"); + } else { + outsourcedTask.setStatus("未开始"); + } + } + } + // 计算派工数量 + private BigDecimal calculateDispatchAmount(List detailDOS) { + return Optional.ofNullable(detailDOS) + .orElse(Collections.emptyList()) + .stream() + .filter(Objects::nonNull) + .map(TaskDispatchDetailDO::getAmount) + .filter(Objects::nonNull) + .map(BigDecimal::new) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + // 计算已收货的采购数量 + private BigDecimal calculateCompletedPurchaseAmount(List purchaseOrderNoDetailDOS) { + return Optional.ofNullable(purchaseOrderNoDetailDOS) + .orElse(Collections.emptyList()) + .stream() + .filter(Objects::nonNull) + .filter(item -> item.getReceivingStatus() == 3) + .map(PurchaseOrderNoDetailDO::getPurchaseAmount) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + public boolean hasStatusThree(List orderNoDetailDOS) { + if (CollectionUtils.isEmpty(orderNoDetailDOS)) { + return false; + } + return orderNoDetailDOS.stream() + .filter(Objects::nonNull) + .anyMatch(detail -> detail.getReceivingStatus() == 3); + } + private boolean isAllPurchaseOrdersCompleted(List purchaseOrderNoDetailDOS,List dispatchDetailDOS) { + if (CollectionUtils.isEmpty(purchaseOrderNoDetailDOS)||CollectionUtils.isEmpty(dispatchDetailDOS)) { + return false; + } + + return purchaseOrderNoDetailDOS.stream() + .filter(Objects::nonNull) + .allMatch(item -> item.getReceivingStatus() == 3)&&purchaseOrderNoDetailDOS.size()==dispatchDetailDOS.size(); + } + + private List queryPurchaseOrderDetails(Long projectSubId) { + return purchaseOrderNoDetailMapper.selectList( + new LambdaQueryWrapper() + .eq(PurchaseOrderNoDetailDO::getProjectPlanSubId, projectSubId) + .isNotNull(PurchaseOrderNoDetailDO::getBoomDetailId) + ); + } + // 2. 提取日期处理逻辑 + private void setOutsourcedTaskDateFields(PlanSubDetailDO outsourcedTask, List dispatchDetailDOS) { + LocalDateTime minTime = dispatchDetailDOS.stream() + .map(TaskDispatchDetailDO::getStartTime) + .filter(Objects::nonNull) + .min(Comparator.naturalOrder()) + .orElse(null); + outsourcedTask.setStartTwoDimDate(minTime); + + LocalDateTime maxTime = dispatchDetailDOS.stream() + .map(TaskDispatchDetailDO::getEndTime) + .filter(Objects::nonNull) + .max(Comparator.naturalOrder()) + .orElse(null); + outsourcedTask.setTwoDimDate(maxTime); + } + // 1. 提取查询方法,避免重复查询 + private List getPlanSubDetailsByProjectSubId(Long projectSubId) { + if (projectSubId == null) return Collections.emptyList(); + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PlanSubDetailDO::getProjectSubId, projectSubId); + return planSubDetailMapper.selectList(lambdaQueryWrapper); + } + + // 2. 提取日期处理逻辑 + private void setDateFields(PlanSubDetailDO designTask, List planSubDetail) { + LocalDateTime minTime = planSubDetail.stream() .map(PlanSubDetailDO::getStartTwoDimDate) .filter(Objects::nonNull) .min(Comparator.naturalOrder()) .orElse(null); designTask.setStartTwoDimDate(minTime); + LocalDateTime maxTime = planSubDetail.stream() - .filter(Objects::nonNull) .map(PlanSubDetailDO::getTwoDimDate) .filter(Objects::nonNull) .max(Comparator.naturalOrder()) .orElse(null); designTask.setTwoDimDate(maxTime); - boolean AllCompleted = CollectionUtils.isNotEmpty(planSubDetail) - && planSubDetail.stream() + } + + // 3. 提取状态判断逻辑 + private void setTaskStatus(PlanSubDetailDO designTask, List planSubDetail) { + if (CollectionUtils.isEmpty(planSubDetail)) { + return; + } + + boolean allCompleted = planSubDetail.stream() .filter(Objects::nonNull) .allMatch(item -> item.getIsOverProcess() == 1); - if (AllCompleted){ + + if (allCompleted) { designTask.setStatus("已完成"); - }else { - if (ObjectUtil.isNotEmpty(planSubDetail)){ - boolean hasAtLeastOne = CollectionUtils.isNotEmpty(planSubDetail) - && planSubDetail.stream() - .filter(Objects::nonNull) - .anyMatch(item -> item.getIsOverProcess() == 1); - if (hasAtLeastOne){ - designTask.setStatus("已开始"); - designTask.setStatusFlag("0"); - }else{ - designTask.setStatus("未开始"); - } - }else{ - designTask.setStatus("未开始"); + designTask.setProductionSchedule("100"); + } else { + boolean hasStarted = planSubDetail.stream() + .filter(Objects::nonNull) + .anyMatch(item -> item.getIsOverProcess() == 1); + + designTask.setStatus(hasStarted ? "已开始" : "未开始"); + if (hasStarted) { + designTask.setStatusFlag("0"); } } - if (ObjectUtil.isNotEmpty(planSubDetail)) { - if (AllCompleted) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(ProcessDesignDO::getProjectSubId, pageReqVO.getProjectSubId()); - queryWrapper.eq(ProcessDesignDO::getIsOverProcess, "1"); - List completedDesigns = processDesignMapper.selectList(queryWrapper); - // 获取最新的工艺设计进度 - ProcessDesignProgressDO latestProgress = getLatestProcessDesignProgress( - completedDesigns.stream() - .map(ProcessDesignDO::getId) - .collect(Collectors.toList()) - ); - if (ObjectUtil.isNotEmpty(latestProgress) && ObjectUtil.isNotEmpty(maxTime)) { - boolean isOverdue = isDateAfterLocalDateTime( - latestProgress.getEndTime(), - maxTime - ); - designTask.setStatusFlag(isOverdue ? "1" : designTask.getStatusFlag()); - } - } else { - if (ObjectUtil.isNotEmpty(maxTime)){ - if (now.isAfter(maxTime)){ - designTask.setStatusFlag("1"); - } - } - } - } - - - return null; } + + // 4. 提取进度计算逻辑 + private void calculateAndSetProgress(PlanSubDetailDO designTask, Long projectSubId) { + if (projectSubId == null) return; + + // 查询工艺设计 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProcessDesignDO::getProjectSubId, projectSubId) + .in(ProcessDesignDO::getProcessDesignType, "BLUEPRINT_3D","BLUEPRINT_2D","BLUEPRINT_WORKBLANK"); + + List processDesigns = processDesignMapper.selectList(queryWrapper); + + if (CollectionUtils.isEmpty(processDesigns)) { + designTask.setProductionSchedule("0"); + return; + } + List ids = processDesigns.stream() + .map(ProcessDesignDO::getId) + .collect(Collectors.toList()); + + // 查询设计进度 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(ProcessDesignProgressDO::getProcessDesignId, ids); + List processDesignProgresses = processDesignProgressMapper.selectList(wrapper); + + BigDecimal totalWorkTime = calculateTotalWorkTime(processDesignProgresses); + + // 查询计划子项 + LambdaQueryWrapper wrapper1 = new LambdaQueryWrapper<>(); + wrapper1.eq(PlanSubDO::getProjectSubId, projectSubId); + wrapper1.last("limit 1"); + PlanSubDO subDO = planSubMapper.selectOne(wrapper1); + + BigDecimal currentTime = calculateCurrentTime(subDO).multiply(new BigDecimal("8")); + Integer percentage = calculatePercentage(totalWorkTime, currentTime); + + designTask.setProductionSchedule(percentage.toString()); + } + /** + * 查询最新的结束日期 + */ + private PlanSubDetailDO getLatestTwoDimPlan(Long projectSubId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PlanSubDetailDO::getProjectSubId, projectSubId); + queryWrapper.orderByDesc(PlanSubDetailDO::getTwoDimDate); + queryWrapper.last("limit 1"); + return planSubDetailMapper.selectOne(queryWrapper); + } + // 5. 提取逾期判断逻辑 + private void setOverdueStatus(PlanSubDetailDO designTask, List planSubDetail, + Long projectSubId, LocalDateTime now) { + if (CollectionUtils.isEmpty(planSubDetail)) return; + + boolean allCompleted = planSubDetail.stream() + .filter(Objects::nonNull) + .allMatch(item -> item.getIsOverProcess() == 1); + PlanSubDetailDO latestTwoDimPlan = getLatestTwoDimPlan(projectSubId); + LocalDateTime maxTime =latestTwoDimPlan.getTwoDimDate(); + if (allCompleted) { + // 查询已完成的工艺设计 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProcessDesignDO::getProjectSubId, projectSubId) + .in(ProcessDesignDO::getProcessDesignType, "BLUEPRINT_3D","BLUEPRINT_2D","BLUEPRINT_WORKBLANK") + .eq(ProcessDesignDO::getIsOverProcess, "1"); + List completedDesigns = processDesignMapper.selectList(queryWrapper); + + if (CollectionUtils.isNotEmpty(completedDesigns) && maxTime != null) { + List designIds = completedDesigns.stream() + .map(ProcessDesignDO::getId) + .collect(Collectors.toList()); + + ProcessDesignProgressDO latestProgress = getLatestProcessDesignProgress(designIds); + + if (latestProgress != null && latestProgress.getEndTime() != null) { + boolean isOverdue = isDateAfterLocalDateTime(latestProgress.getEndTime(), maxTime); + designTask.setStatusFlag(isOverdue ? "1" : ""); + } + } + } else if (maxTime != null && now.isAfter(maxTime)) { + designTask.setStatusFlag("1"); + } + } + /** + * 计算百分比 + */ + private Integer calculatePercentage(BigDecimal currentTime, BigDecimal totalWorkTime) { + if (totalWorkTime == null || totalWorkTime.compareTo(BigDecimal.ZERO) == 0) { + return 0; + } + + return currentTime.multiply(new BigDecimal("100")) + .divide(totalWorkTime, 0, RoundingMode.HALF_UP) + .intValue(); + } + /** + * 计算当前工时 + */ + private BigDecimal calculateTotalWorkTime(List progressList) { + return progressList.stream() + .map(ProcessDesignProgressDO::getWorkTime) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + /** + * 计算总工时(将三个数值相加) + */ + private BigDecimal calculateCurrentTime(PlanSubDO subDO) { + BigDecimal currentTime = BigDecimal.ZERO; + + if (ObjectUtil.isNotEmpty(subDO.getBlankNum())) { + currentTime = currentTime.add(new BigDecimal(subDO.getBlankNum().toString())); + } + + if (ObjectUtil.isNotEmpty(subDO.getThreeDimNum())) { + currentTime = currentTime.add(new BigDecimal(subDO.getThreeDimNum().toString())); + } + + if (ObjectUtil.isNotEmpty(subDO.getTwoDimNum())) { + currentTime = currentTime.add(new BigDecimal(subDO.getTwoDimNum().toString())); + } + + return currentTime; + } + /** * 判断 Date 是否在 LocalDateTime 之后 */ diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/taskdispatch/TaskDispatchServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/taskdispatch/TaskDispatchServiceImpl.java index f51ee6eb..d04c2343 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/taskdispatch/TaskDispatchServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/taskdispatch/TaskDispatchServiceImpl.java @@ -1054,7 +1054,7 @@ public class TaskDispatchServiceImpl implements TaskDispatchService { // bdgzsomthingMapper.updateById(bdgzsomthingDO); // } // } - if (taskDispatchDO.getDispatchType().equals("PRODUCTION") && taskDispatchDetailDO.getTestYn().equals("N")){ + if (taskDispatchDO.getDispatchType().equals("PRODUCTION") && taskDispatchDetailDO.getTestYn().equals("N")&&taskDispatchDetailDO.getCheckYn().equals("0")){ pgMasterService.insertPgList(planDO.getId(),planDO.getProjectId(),taskDispatchDO.getBomDetailId(),taskDispatchDetailDO); } // if (taskDispatchDO.getDispatchType().equals("PRODUCTION") && isBomDetailProductionOver){ diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/taskreport/TaskReportServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/taskreport/TaskReportServiceImpl.java index 677e3eae..cafaf467 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/taskreport/TaskReportServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/taskreport/TaskReportServiceImpl.java @@ -44,10 +44,10 @@ public class TaskReportServiceImpl implements TaskReportService { public CommonResult updateTaskReport(TaskReportSaveReqVO updateReqVO) { // 校验存在 validateTaskReportExists(updateReqVO.getId()); - TaskDispatchDetailDO taskDispatchDetailDO = taskDispatchDetailMapper.selectById(updateReqVO.getDispatchDetailId()); - if (ObjectUtil.isNotEmpty(taskDispatchDetailDO)){ - if (taskDispatchDetailDO.getProcedureStatus() == 2) return CommonResult.error(400,"该派工单已报工完成,不允许修改!"); - } +// TaskDispatchDetailDO taskDispatchDetailDO = taskDispatchDetailMapper.selectById(updateReqVO.getDispatchDetailId()); +// if (ObjectUtil.isNotEmpty(taskDispatchDetailDO)){ +// if (taskDispatchDetailDO.getProcedureStatus() == 2) return CommonResult.error(400,"该派工单已报工完成,不允许修改!"); +// } // 更新 TaskReportDO updateObj = BeanUtils.toBean(updateReqVO, TaskReportDO.class); taskReportMapper.updateById(updateObj); diff --git a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/service/auth/AdminAuthServiceImpl.java b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/service/auth/AdminAuthServiceImpl.java index 73d16ef8..c6757855 100644 --- a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/service/auth/AdminAuthServiceImpl.java +++ b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/service/auth/AdminAuthServiceImpl.java @@ -109,17 +109,17 @@ public class AdminAuthServiceImpl implements AdminAuthService { // 使用账号密码,进行登录 AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword()); - String openId = getOpenid(reqVO.getCode()); - //判断如果openId为空时需要获取并更新openId - if(user.getOpenId()==null){ - user.setOpenId(openId); - //更新openID - userMapper.updateById(user); - }else if(!user.getOpenId().equals(openId)){ - user.setOpenId(openId); - //更新openID - userMapper.updateById(user); - } +// String openId = getOpenid(reqVO.getCode()); +// //判断如果openId为空时需要获取并更新openId +// if(user.getOpenId()==null){ +// user.setOpenId(openId); +// //更新openID +// userMapper.updateById(user); +// }else if(!user.getOpenId().equals(openId)){ +// user.setOpenId(openId); +// //更新openID +// userMapper.updateById(user); +// } // 如果 socialType 非空,说明需要绑定社交用户 diff --git a/mes-ui/mes-ui-admin-vue3/src/api/heli/plansubdetail/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/heli/plansubdetail/index.ts index 2efb4850..592b81da 100644 --- a/mes-ui/mes-ui-admin-vue3/src/api/heli/plansubdetail/index.ts +++ b/mes-ui/mes-ui-admin-vue3/src/api/heli/plansubdetail/index.ts @@ -82,3 +82,18 @@ export const overlap = async (data: PlanSubDetailVO) => { export const getList = async (params) => { return await request.get({ url: `/heli/plan-sub-detail/getList`, params }) } +export const getList1 = async (params) => { + return await request.get({ url: `/heli/plan-sub-detail/getList1`, params }) +} +export const getList2 = async (params) => { + return await request.get({ url: `/heli/plan-sub-detail/getList2`, params }) +} +export const getList3 = async (params) => { + return await request.get({ url: `/heli/plan-sub-detail/getList3`, params }) +} +export const getList4 = async (params) => { + return await request.get({ url: `/heli/plan-sub-detail/getList4`, params }) +} +export const getList5 = async (params) => { + return await request.get({ url: `/heli/plan-sub-detail/getList5`, params }) +} diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/partprocess/detail.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/partprocess/detail.vue index 3a3b53bd..f749bf1e 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/heli/partprocess/detail.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/partprocess/detail.vue @@ -7,20 +7,25 @@ - + - - - - - + + + + + + + + @@ -31,18 +36,85 @@
工单信息 - - + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -62,8 +134,13 @@ const { query } = useRoute() const router = useRouter() const reload = inject('reload') const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 -const list = ref([]) // 设计数据 -const type = ref('sheji') +const list = ref([]) +const list1 = ref([]) // 设计数据 +const list2 = ref([]) // 外协数据 +const list3 = ref([]) // 加工数据 +const list4 = ref([]) // 过程检数据 +const list5 = ref([]) // 装配任务数据 +const type = ref('') const formData = reactive({ id:undefined, projectSubId:undefined, @@ -73,13 +150,97 @@ const formData = reactive({ onMounted(async () => { console.log(query) formData.projectSubId = query.projectSubId - }) + getList() + const queryParams = reactive({ + projectSubId:formData.projectSubId + }) + if (list.value){ + const hasDesignTask = list.value.some(item => item.subType === "设计任务"); + if (hasDesignTask){ + list1.value= await PlansubdetailApi.getList1(queryParams) + type.value='sheji' + } + } + }) +const change = (val) => { + getList() +} +/** 处理某一行的点击 */ +const rowClick = async (row) => { + console.log(row); + const queryParams = reactive({ + projectSubId:formData.projectSubId, + }) + type.value='' + if (row.subType=='设计任务'){ + list1.value= await PlansubdetailApi.getList1(queryParams) + if (list1.value.length>0){ + type.value='sheji' + } + }else if (row.subType=='外协任务'){ + list2.value= await PlansubdetailApi.getList2(queryParams) + if (list2.value.length>0){ + type.value='waixei' + } + }else if (row.subType=='加工任务'){ + list3.value= await PlansubdetailApi.getList3(queryParams) + if (list3.value.length>0){ + type.value='jiagong' + } + }else if (row.subType=='过程检任务'){ + list4.value= await PlansubdetailApi.getList4(queryParams) + if (list4.value.length>0){ + type.value='guochengjian' + } + }else{ + list5.value= await PlansubdetailApi.getList5(queryParams) + if (list5.value.length>0){ + type.value='zhuangpei' + } + } +} +const cellClassName = ({ row,column }) => { + if (column.label === '任务状态' && row.statusFlag) { + return row.statusFlag === '1' ? 'warning-row1' : row.statusFlag === '0' ?'warning-row2':""; + } + +} +const cellClassName1 = ({ row,column }) => { + if (column.label === '派工单状态' && row.receivingFlag) { + return row.receivingFlag === '1' ? 'warning-row1' :""; + } +} +const cellClassName2 = ({ row,column }) => { + if (column.label === '派工单状态' && row.reportFlag) { + return row.reportFlag === '1' ? 'warning-row1' :""; + } +} +const cellClassName3 = ({ row,column }) => { + if (column.label === '过程检状态' && row.reportFlag) { + return row.reportFlag === '1' ? 'warning-row1' :""; + } +} +const cellClassName4 = ({ row,column }) => { + if (column.label === '派工单状态' && row.reportFlag) { + return row.reportFlag === '1' ? 'warning-row1' :""; + } +} +const cellClassName5 = ({ row,column }) => { + if (column.label === '工单状态' && row.statusFlag) { + return row.statusFlag === '1' ? 'warning-row1' : row.statusFlag === '0' ?'warning-row2':""; + } + +} /** 查询设计列表 */ const getList = async () => { loading.value = true try { - const data = await PlansubdetailApi.getPartProcess(formData) + const queryParams = reactive({ + projectSubId:formData.projectSubId, + flag:formData.flag==true?"0":"1" + }) + const data = await PlansubdetailApi.getList(queryParams) list.value = data } finally { loading.value = false @@ -94,6 +255,12 @@ const getList = async () => { border: solid 1px orange; outline: solid 1px orange; } + .warning-row1 { + background-color:#F08080 !important; + } + .warning-row2 { + background-color: #1E90FF !important; /* 道奇蓝 */ + } .large-checkbox { transform: scale(1.5); /* 方法1:使用scale放大 */ /* 或者 */ diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/partprocess/index.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/partprocess/index.vue index 2acdadfe..364a395a 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/heli/partprocess/index.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/partprocess/index.vue @@ -73,9 +73,10 @@ placeholder="工艺结束日期" /> - - - + + + @@ -155,11 +156,16 @@ const formData = ref({ projectEndTime:undefined, projectProgress:undefined, craftEndDate:undefined, - processProgress:undefined + processProgress:undefined, + processFlag:undefined }) const queryFormRef = ref() // 搜索的表单 /** 查询列表 */ const getList = async () => { + if ((queryParams.projectCode==null||queryParams.projectCode=='')&&(queryParams.projectSubName==null||queryParams.projectSubName=='')&&(queryParams.projectName==null ||queryParams.projectName=='')) { + message.error("必须输入查询条件查询") + return + } loading.value = true try { const data = await PlanApi.getPartProcess(queryParams) @@ -173,22 +179,19 @@ const getList = async () => { const cellClassName = ({ row,column }) => { if (column.label === '设计任务' && row.designTaskFlag) { - return row.designTaskFlag === '1' ? 'warning-row1' : 'warning-row2'; + return row.designTaskFlag === '1' ? 'warning-row1' :row.designTaskFlag === '0' ? 'warning-row2':""; } if (column.label === '外协任务' && row.outsourcingTasksFlag) { - return row.outsourcingTasksFlag === '1' ? 'warning-row1' : 'warning-row2'; + return row.outsourcingTasksFlag === '1' ? 'warning-row1' :row.outsourcingTasksFlag === '0' ? 'warning-row2':""; } if (column.label === '加工任务' && row.processingTaskFlag) { - return row.processingTaskFlag === '1' ? 'warning-row1' : 'warning-row2'; + return row.processingTaskFlag === '1' ? 'warning-row1' : row.processingTaskFlag === '0' ?'warning-row2':""; } if (column.label === '过程检任务' && row.processInspectionFlag) { - return row.processInspectionFlag === '1' ? 'warning-row1' : 'warning-row2'; + return row.processInspectionFlag === '1' ? 'warning-row1' : row.processInspectionFlag === '0' ? 'warning-row2':""; } if (column.label === '装配任务' && row.assemblyTaskFlag) { - console.log(row.assemblyTaskFlag) - console.log(row.assemblyTaskFlag === '1') - console.log(row.assemblyTaskFlag === '1' ? 'warning-row1' : 'warning-row2') - return row.assemblyTaskFlag === '1' ? 'warning-row1' : 'warning-row2'; + return row.assemblyTaskFlag === '1' ? 'warning-row1' : row.assemblyTaskFlag === '0' ?'warning-row2':""; } // return ''; } @@ -196,7 +199,7 @@ const cellClassName = ({ row,column }) => { const handleQuery = () => { queryParams.pageNo = 1 - getList() + getList(); } /** 重置按钮操作 */ @@ -236,18 +239,16 @@ window.addEventListener('beforeunload', () => { routeParamsCache.set(routeValue.value, plainParams); }); -