diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansub/vo/PlanSubPageReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansub/vo/PlanSubPageReqVO.java index bcd258e7..3a559f86 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansub/vo/PlanSubPageReqVO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansub/vo/PlanSubPageReqVO.java @@ -1,5 +1,8 @@ package com.chanko.yunxi.mes.module.heli.controller.admin.plansub.vo; +import cn.hutool.core.util.ObjectUtil; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansubdetail.PlanSubDetailDO; import lombok.*; import java.util.*; import io.swagger.v3.oas.annotations.media.Schema; @@ -82,5 +85,6 @@ public class PlanSubPageReqVO extends PageParam { @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; - -} \ No newline at end of file + private String projectCode; + private String projectSubName; +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansubdetail/vo/PlanSubDetailPageReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansubdetail/vo/PlanSubDetailPageReqVO.java index 49b0ad1a..a40ac6ab 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansubdetail/vo/PlanSubDetailPageReqVO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/plansubdetail/vo/PlanSubDetailPageReqVO.java @@ -69,11 +69,13 @@ public class PlanSubDetailPageReqVO extends PageParam { private String queryDate; @Schema(description = "项目编码", example = "26785") - private Long projectCode; + private String projectCode; @Schema(description = "子项目名称" ,example = "s") private String projectSubName; private String customerBrief; private String projectName; private String planNo; + + } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plansub/PlanSubDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plansub/PlanSubDO.java index 166e7353..d8161d20 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plansub/PlanSubDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plansub/PlanSubDO.java @@ -219,4 +219,8 @@ public class PlanSubDO extends BaseDO { private boolean hasSaveIn3DDetail; @TableField(exist = false) private boolean hasSaveIn2DDetail; + @TableField(exist = false) + private String projectCode; + @TableField(exist = false) + private String planNo; } 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 4ad76e4f..1e80306a 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 @@ -2,6 +2,7 @@ package com.chanko.yunxi.mes.module.heli.dal.mysql.plansub; import java.util.*; +import cn.hutool.core.util.ObjectUtil; import cn.smallbun.screw.core.util.StringUtils; import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX; @@ -11,6 +12,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.equip.EquipDO; 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.plansubdetail.PlanSubDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; @@ -43,6 +45,29 @@ public interface PlanSubMapper extends BaseMapperX { query.eq(reqVO.getProjectPlanId() != null, PlanSubDO::getProjectPlanId, reqVO.getProjectPlanId()); return selectPage(reqVO, query); } + + default PageResult getPlanList(PlanSubPageReqVO reqVO) { + MPJLambdaWrapper query = new MPJLambdaWrapper<>(); + query.selectAll(PlanSubDO.class) + .select("c.name as projectSubName") + .select("b.project_name_sim as projectNameSim") + .select("b.code as projectCode" ) + .select("a.brief as customerName") + .select("p.plan_no as planNo") + .leftJoin(PlanDO.class, "p", PlanDO::getId, PlanSubDO::getProjectPlanId) + .leftJoin(ProjectOrderDO.class, "b", ProjectOrderDO::getId, PlanSubDO::getProjectId) + .leftJoin(CustomerDO.class,"a",CustomerDO::getId,ProjectOrderDO::getCustomerId) + .leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, PlanSubDO::getProjectSubId) + .eq(ProjectOrderDO::getDeliveryStatus,1) + .disableSubLogicDel() + .orderByAsc(PlanSubDO::getId) + ; + query.like(ObjectUtil.isNotEmpty(reqVO.getProjectCode()), PlanDO::getCode, reqVO.getProjectCode()) + .like(ObjectUtil.isNotEmpty(reqVO.getProjectSubName()), PlanSubDetailDO::getName, reqVO.getProjectSubName()); + return selectPage(reqVO, query); + } + + default PlanSubDO selectById(Long id) { MPJLambdaWrapper query = new MPJLambdaWrapper<>(); query.selectAll(PlanSubDO.class) 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 679a8b77..709edc7c 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 @@ -5,14 +5,18 @@ import cn.hutool.core.util.ObjectUtil; 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.plan.PlanDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; 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.mysql.plansub.PlanSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.shopCalendar.ShopCalendarMapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -43,6 +47,7 @@ import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*; * * @author 管理员 */ +@Slf4j @Service @Validated public class PlanSubDetailServiceImpl implements PlanSubDetailService { @@ -55,7 +60,8 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { private PlanSubMapper planSubMapper; @Resource private ProcessDesignMapper processDesignMapper; - + @Resource + private ProjectOrderMapper projectOrderMapper; @Override public Long createPlanSubDetail(PlanSubDetailSaveReqVO createReqVO) { // 插入 @@ -89,9 +95,16 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(PlanSubDetailDO::getProjectSubId,planSubDetailDO.getProjectSubId()); + wrapper.eq(PlanSubDetailDO::getSubType,planSubDetailDO.getSubType()); - wrapper.gt(PlanSubDetailDO::getSeqNo,planSubDetailDO.getSeqNo()); - if (planSubDetailMapper.selectCount(wrapper)>0) return CommonResult.error(400,"请先删除序列号最大的派工时间数据 "); +// wrapper.gt(PlanSubDetailDO::getSeqNo,planSubDetailDO.getSeqNo()); + //查所有的 + List planSubDetailList = planSubDetailMapper.selectList(wrapper); + for (PlanSubDetailDO subDetailDO : planSubDetailList) { + if (subDetailDO.getSeqNo().compareTo(planSubDetailDO.getSeqNo()) > 0 ){ + return CommonResult.error(400,"请先删除序列号最大的派工时间数据 "); + } + } LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); lambdaUpdateWrapper.eq(PlanSubDO::getProjectSubId,planSubDetailDO.getProjectSubId()); if (planSubDetailDO.getSeqNo()==1){ @@ -177,8 +190,37 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { @Override public PageResult getPlanList(PlanSubDetailPageReqVO pageReqVO) { + PageResult resultPage = new PageResult<>(); + List list = new ArrayList<>(); + resultPage.setList(list); + PlanSubPageReqVO subPageReqVO = new PlanSubPageReqVO(); + subPageReqVO.setPageNo(pageReqVO.getPageNo()); + subPageReqVO.setPageSize(pageReqVO.getPageSize()); + subPageReqVO.setProjectCode(pageReqVO.getProjectCode() == null ? "" : pageReqVO.getProjectCode()); + subPageReqVO.setProjectSubName(pageReqVO.getProjectSubName() == null ?null:pageReqVO.getProjectSubName()); + PageResult planPage = planSubMapper.getPlanList(subPageReqVO); + for (PlanSubDO planSubDO : planPage.getList()) { + PlanSubDetailDO planSubDetailDO = new PlanSubDetailDO(); + planSubDetailDO.setProjectPlanId(planSubDO.getProjectPlanId()); + planSubDetailDO.setProjectId(planSubDO.getProjectId()); + planSubDetailDO.setProjectPlanSubId(planSubDO.getId()); + planSubDetailDO.setProjectSubCode(planSubDO.getProjectSubCode()); + planSubDetailDO.setTwoDimDate(planSubDO.getBlankDate()); + planSubDetailDO.setProjectSubId(planSubDO.getProjectSubId()); + planSubDetailDO.setProjectPlanId(planSubDO.getProjectPlanId()); + planSubDetailDO.setName(planSubDO.getName()); + planSubDetailDO.setCode(planSubDO.getProjectCode()); + planSubDetailDO.setCustomerBrief(planSubDO.getCustomerName()); + planSubDetailDO.setPlanNo(planSubDO.getPlanNo()); + planSubDetailDO.setProjectName(planSubDO.getProjectNameSim()); + list.add(planSubDetailDO); + } - return planSubDetailMapper.getPlanList(pageReqVO); + + + resultPage.setTotalPages(planPage.getTotalPages()); + resultPage.setTotal(planPage.getTotal()); + return resultPage; } @Override @@ -206,8 +248,9 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { if (now.compareTo(startDate)>0){ startDate = now; } - ShopCalendarDO maxShopCalendar = shopCalendarMapper.selectOne(new LambdaQueryWrapper().ge(ShopCalendarDO::getDates, startDate) + ShopCalendarDO maxShopCalendar = shopCalendarMapper.selectOne(new LambdaQueryWrapper().gt(ShopCalendarDO::getDates, startDate) .eq(ShopCalendarDO::getIfjiejiari, "false").orderByAsc(ShopCalendarDO::getDates).last("limit 1")); + if (maxShopCalendar != null){ planSubDetailDO.setMaxTime(maxShopCalendar.getDates()); }else{ @@ -229,7 +272,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { if (now.compareTo(startDate)>0){ startDate = now; } - ShopCalendarDO maxShopCalendar = shopCalendarMapper.selectOne(new LambdaQueryWrapper().ge(ShopCalendarDO::getDates, startDate) + ShopCalendarDO maxShopCalendar = shopCalendarMapper.selectOne(new LambdaQueryWrapper().gt(ShopCalendarDO::getDates, startDate) .eq(ShopCalendarDO::getIfjiejiari, "false").orderByAsc(ShopCalendarDO::getDates).last("limit 1")); if (maxShopCalendar != null){ planSubDetailDO1.setMaxTime(maxShopCalendar.getDates()); @@ -295,37 +338,40 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { // } List list = planSubDetailMapper.selectList(lambdaQueryWrapper); List noSelfList = new ArrayList<>(); - for (PlanSubDetailDO planSubDetailDO : list) { - if (!planSubDetailDO.getId().equals(updateReqVO.getId())){ - noSelfList.add(planSubDetailDO); - } - } - - if (ObjectUtil.isEmpty( noSelfList) && ((updateReqVO.getStartTwoDimDate().compareTo(noSelfList.get(0).getTwoDimDate()) <=0 )&& (updateReqVO.getTwoDimDate().compareTo(noSelfList.get(0).getStartTwoDimDate()) >= 0))){ - if (ObjectUtil.isNotEmpty(updateReqVO.getId())){ - planSubDetailMapper.delete(PlanSubDetailDO::getId,updateReqVO.getId()); - } - PlanSubDetailDO planSubDetailDO = new PlanSubDetailDO(); - planSubDetailDO.setProjectPlanId(updateReqVO.getProjectPlanId()); - planSubDetailDO.setProjectId(updateReqVO.getProjectId()); - planSubDetailDO.setProjectSubId(updateReqVO.getProjectSubId()); - planSubDetailDO.setProjectSubCode(updateReqVO.getProjectSubCode()); - planSubDetailDO.setTwoDimDate(updateReqVO.getTwoDimDate()); - planSubDetailDO.setTwoDimOwner(updateReqVO.getTwoDimOwner()); - planSubDetailDO.setStartTwoDimDate(updateReqVO.getStartTwoDimDate()); - planSubDetailDO.setSubType(updateReqVO.getSubType()); - planSubDetailDO.setIsOverProcess(0); - planSubDetailDO.setSeqNo(1L); - planSubDetailDO.setDesignNum(updateReqVO.getDesignNum()); - planSubDetailDO.setCode(updateReqVO.getCode()); - list.add(planSubDetailDO); - list.sort(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate, Comparator.nullsLast(Comparator.naturalOrder()))); - for (int i = 0; i < list.size(); i++) { - list.get(i).setSeqNo(Long.valueOf(i + 1)); // 设置顺序为 1, 2, 3 - } - planSubDetailMapper.insertOrUpdateBatch(list); - return CommonResult.success(true); - } +// if (CollUtil.isNotEmpty(list) && list.size() == 1){ +// return CommonResult.error(400,"请修改数据后再点击修改"); +// +// } +// for (PlanSubDetailDO planSubDetailDO : list) { +// if (!planSubDetailDO.getId().equals(updateReqVO.getId())){ +// noSelfList.add(planSubDetailDO); +// } +// } +// if (ObjectUtil.isEmpty( noSelfList) && ((updateReqVO.getStartTwoDimDate().compareTo(noSelfList.get(0).getTwoDimDate()) <=0 )&& (updateReqVO.getTwoDimDate().compareTo(noSelfList.get(0).getStartTwoDimDate()) >= 0))){ +// if (ObjectUtil.isNotEmpty(updateReqVO.getId())){ +// planSubDetailMapper.delete(PlanSubDetailDO::getId,updateReqVO.getId()); +// } +// PlanSubDetailDO planSubDetailDO = new PlanSubDetailDO(); +// planSubDetailDO.setProjectPlanId(updateReqVO.getProjectPlanId()); +// planSubDetailDO.setProjectId(updateReqVO.getProjectId()); +// planSubDetailDO.setProjectSubId(updateReqVO.getProjectSubId()); +// planSubDetailDO.setProjectSubCode(updateReqVO.getProjectSubCode()); +// planSubDetailDO.setTwoDimDate(updateReqVO.getTwoDimDate()); +// planSubDetailDO.setTwoDimOwner(updateReqVO.getTwoDimOwner()); +// planSubDetailDO.setStartTwoDimDate(updateReqVO.getStartTwoDimDate()); +// planSubDetailDO.setSubType(updateReqVO.getSubType()); +// planSubDetailDO.setIsOverProcess(0); +// planSubDetailDO.setSeqNo(1L); +// planSubDetailDO.setDesignNum(updateReqVO.getDesignNum()); +// planSubDetailDO.setCode(updateReqVO.getCode()); +// list.add(planSubDetailDO); +// list.sort(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate, Comparator.nullsLast(Comparator.naturalOrder()))); +// for (int i = 0; i < list.size(); i++) { +// list.get(i).setSeqNo(Long.valueOf(i + 1)); // 设置顺序为 1, 2, 3 +// } +// planSubDetailMapper.insertOrUpdateBatch(list); +// return CommonResult.success(true); +// } updateReqVO.setList( list); return CommonResult.success(updateReqVO); } @@ -360,16 +406,55 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { // 判断请求时间段是否与已有时间段有重叠 boolean hasOverlap = !(reqEnd.compareTo(existStart) < 0) && !(reqStart.compareTo(existEnd) > 0); if (hasOverlap) { - return CommonResult.error(400, "该子项目设计时间存在交叉,请确认!"); + String type1="BLUEPRINT_WORKBLANK".equals(planSubDetailDO.getSubType())?"毛坯":"BLUEPRINT_2D".equals(planSubDetailDO.getSubType())?"2D":"3D"; + String type2="BLUEPRINT_WORKBLANK".equals(subDetailDO.getSubType())?"毛坯":"BLUEPRINT_2D".equals(subDetailDO.getSubType())?"2D":"3D"; + ProjectOrderDO projectOrderDO1 = projectOrderMapper.selectById(planSubDetailDO.getProjectId()); + ProjectOrderDO projectOrderDO2 = projectOrderMapper.selectById(subDetailDO.getProjectId()); + return CommonResult.error(400, "项目:"+projectOrderDO1.getProjectName()+" 子项目:"+planSubDetailDO.getName()+"设计类型:" +type1 + +" "+existStart.toString().substring(0,10)+"至"+existEnd.toString().substring(0,10) +"与"+ + "项目:"+projectOrderDO2.getProjectName()+" 子项目:"+subDetailDO.getName()+"设计类型:" +type2 + +" "+reqStart.toString().substring(0,10)+"至"+reqEnd.toString().substring(0,10) + + +" 设计时间存在交叉,请确认!"); } } } } planSubDetailMapper.updateBatch(list); - //更新表pro_process_design + //更新表主表数据 + //先看有多少个子项目 Map> collect = list.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getProjectPlanSubId)); - + collect.forEach((subId,subList) -> { + //再根据设计类型来 + Map> collect1 = subList.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getSubType)); + //然后对里面的进行排序 + collect1.forEach((type,subTypeList) ->{ + List sortedList = subTypeList.stream() + .sorted(Comparator.comparing(PlanSubDetailDO::getSeqNo).reversed()) + .collect(Collectors.toList()); + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.eq(PlanSubDO::getProjectSubId,subId); + LocalDateTime startTwoDimDate = sortedList.get(0).getStartTwoDimDate(); + LocalDateTime twoDimDate = sortedList.get(0).getTwoDimDate(); + Long num = sortedList.get(0).getDesignNum(); + //取最大值就是第一个 + if ("BLUEPRINT_WORKBLANK".equals(type)){ + lambdaUpdateWrapper.set(PlanSubDO::getStartBlankDate,startTwoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getBlankDate,twoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getBlankNum,num); + }else if ("BLUEPRINT_2D".equals(type)){ + lambdaUpdateWrapper.set(PlanSubDO::getStartTwoDimDate,startTwoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getTwoDimDate,twoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getTwoDimNum,num); + }else { + lambdaUpdateWrapper.set(PlanSubDO::getStartThreeDimDate,startTwoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getThreeDimDate,twoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getThreeDimNum,num); + } + planSubMapper.update(lambdaUpdateWrapper); + }); + }); return CommonResult.success(true); } @@ -403,9 +488,438 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { planSubDetailMapper.deleteBatchIds(deleteId); planSubDetailMapper.insertOrUpdateBatch(list); + //更新表主表数据 + //先看有多少个子项目 + Map> groupBySubId = list.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getProjectPlanSubId)); + groupBySubId.forEach((subId,subList) -> { + //再根据设计类型来 + Map> groupByType = subList.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getSubType)); + //然后对里面的进行排序 + groupByType.forEach((type,subTypeList) ->{ + List sortedList = subTypeList.stream() + .sorted(Comparator.comparing(PlanSubDetailDO::getSeqNo).reversed()) + .collect(Collectors.toList()); + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.eq(PlanSubDO::getProjectSubId,subId); + LocalDateTime startTwoDimDate = sortedList.get(0).getStartTwoDimDate(); + LocalDateTime twoDimDate = sortedList.get(0).getTwoDimDate(); + Long num = sortedList.get(0).getDesignNum(); + //取最大值就是第一个 + if ("BLUEPRINT_WORKBLANK".equals(type)){ + lambdaUpdateWrapper.set(PlanSubDO::getStartBlankDate,startTwoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getBlankDate,twoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getBlankNum,num); + }else if ("BLUEPRINT_2D".equals(type)){ + lambdaUpdateWrapper.set(PlanSubDO::getStartTwoDimDate,startTwoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getTwoDimDate,twoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getTwoDimNum,num); + }else { + lambdaUpdateWrapper.set(PlanSubDO::getStartThreeDimDate,startTwoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getThreeDimDate,twoDimDate); + lambdaUpdateWrapper.set(PlanSubDO::getThreeDimNum,num); + } + planSubMapper.update(lambdaUpdateWrapper); + }); + }); return CommonResult.success(true); } +// @Override +// @Transactional +// public CommonResult chahuoList(PlanSubDetailSaveReqVO updateReqVO) { +// List list = updateReqVO.getList(); +// if (CollUtil.isEmpty(list)) { +// return CommonResult.error(400, "列表为空,请刷新页面后重试!"); +// } +// +// // 1. 拿到整个list最大的twoDimDate时间 +// LocalDateTime minDate = list.stream() +// .map(PlanSubDetailDO::getStartTwoDimDate) +// .min(LocalDateTime::compareTo) +// .orElse(null); +// LocalDateTime maxDate = list.stream() +// .map(PlanSubDetailDO::getTwoDimDate) +// .max(LocalDateTime::compareTo) +// .orElse(null); +// +// // 2. 查询最大时间往后90天内的节假日 +// LocalDateTime endDate = maxDate.plusDays(90); +// List shopCalendarDOList = shopCalendarMapper.selectList(new LambdaQueryWrapper().eq(ShopCalendarDO::getIfjiejiari, "true") +// .between(ShopCalendarDO::getDates, minDate, endDate).orderByAsc(ShopCalendarDO::getDates)); +// List holidayList = new ArrayList<>(); +// for (ShopCalendarDO shopCalendarDO : shopCalendarDOList) { +// holidayList.add(shopCalendarDO.getDates()); +// } +// +// // 3. 将id为空的数据拿出来进行插活 +// List insertList = list.stream() +// .filter(item -> item.getId() == null) +// .collect(Collectors.toList()); +// for (PlanSubDetailDO planSubDetailDO : insertList) { +// planSubDetailDO.setIsCha("Y"); +// } +// // 4. 将id不为空的按startTwoDimDate进行升序排序,形成baseList +// List baseList = list.stream() +// .filter(item -> item.getId() != null) +// .sorted(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate)) +// .collect(Collectors.toList()); +// +// // 5. 执行插活逻辑 +// List resultList = performInsertLogic(baseList, insertList, holidayList); +// +// Map> collect1 = resultList.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getProjectSubId)); +// collect1.forEach((id,detailList) -> { +// Map> collect2 = detailList.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getSubType)); +// collect2.forEach((type,list2) ->{ +// int i = 1; +// for (PlanSubDetailDO planSubDetailDO : list2) { +// planSubDetailDO.setSeqNo(Long.valueOf(i++)); +// } +// }); +// }); +// +// // 6. 保存结果 +// updateReqVO.setList(resultList); +// return CommonResult.success(updateReqVO); +// } +// +// /** +// * 执行插活逻辑 +// */ +// private List performInsertLogic(List baseList, +// List insertList, +// List holidayList) { +// List resultList = new ArrayList<>(); +// +// // 1. 先处理插活数据,按节假日分段 +// List processedInsertList = new ArrayList<>(); +// for (PlanSubDetailDO insertItem : insertList) { +// LocalDateTime startDate = insertItem.getStartTwoDimDate(); +// LocalDateTime endDate = insertItem.getTwoDimDate(); +// +// // 检查该时间段内是否有节假日 +// List holidaysInRange = getHolidaysInRange(startDate, endDate, holidayList); +// +// if (holidaysInRange.isEmpty()) { +// // 没有节假日,直接添加 +// processedInsertList.add(insertItem); +// } else { +// // 有节假日,需要分段处理 +// List segments = splitByHolidays(insertItem, holidaysInRange); +// processedInsertList.addAll(segments); +// } +// } +// +// // 2. 如果没有插活数据,直接返回baseList +// if (processedInsertList.isEmpty()) { +// return new ArrayList<>(baseList); +// } +// +// // 3. 获取插活数据的开始时间 +// LocalDateTime insertStartTime = processedInsertList.stream() +// .map(PlanSubDetailDO::getStartTwoDimDate) +// .min(LocalDateTime::compareTo) +// .orElse(null); +// +// // 4. 分离baseList:在插活数据之前的、被打断的、在插活数据之后的 +// List beforeInsertList = new ArrayList<>(); +// List interruptedList = new ArrayList<>(); +// List afterInsertList = new ArrayList<>(); +// List remainingBaseList = new ArrayList<>(); +// +// if (insertStartTime != null) { +// for (PlanSubDetailDO baseItem : baseList) { +// if (baseItem.getTwoDimDate().isBefore(insertStartTime)) { +// // 完全在插活数据之前 +// beforeInsertList.add(baseItem); +// } else if (baseItem.getStartTwoDimDate().isBefore(insertStartTime) && +// baseItem.getTwoDimDate().isAfter(insertStartTime.minusDays(1))) { +// // 被插活数据打断 +// interruptedList.add(baseItem); +// } else { +// // 在插活数据之后 +// afterInsertList.add(baseItem); +// } +// } +// } else { +// beforeInsertList.addAll(baseList); +// } +// +// // 5. 处理插活数据之前的baseList(保持原样) +// resultList.addAll(beforeInsertList); +// +// // 6. 处理被打断的baseList +// for (PlanSubDetailDO interruptedItem : interruptedList) { +// // 计算插活数据开始前的天数 +// long daysBeforeInsert = ChronoUnit.DAYS.between(interruptedItem.getStartTwoDimDate(), insertStartTime); +// +// if (daysBeforeInsert > 0) { +// // 创建插活前的段落 +// LocalDateTime segmentEnd = interruptedItem.getStartTwoDimDate().plusDays(daysBeforeInsert - 1); +// PlanSubDetailDO beforeSegment = createBaseItem(interruptedItem, interruptedItem.getStartTwoDimDate(), segmentEnd); +// beforeSegment.setDesignNum(daysBeforeInsert); +// resultList.add(beforeSegment); +// +// // 保存剩余的designNum +// Long remainingDesignNum = interruptedItem.getDesignNum() - daysBeforeInsert; +// if (remainingDesignNum > 0) { +// // 创建剩余的baseItem,稍后处理 +// PlanSubDetailDO remainingItem = new PlanSubDetailDO(); +// // 复制属性 +// remainingItem.setId(interruptedItem.getId()); +// remainingItem.setProjectPlanId(interruptedItem.getProjectPlanId()); +// remainingItem.setProjectId(interruptedItem.getProjectId()); +// remainingItem.setProjectPlanSubId(interruptedItem.getProjectPlanSubId()); +// remainingItem.setProjectSubCode(interruptedItem.getProjectSubCode()); +// remainingItem.setTwoDimOwner(interruptedItem.getTwoDimOwner()); +// remainingItem.setProjectSubId(interruptedItem.getProjectSubId()); +// remainingItem.setSubType(interruptedItem.getSubType()); +// remainingItem.setName(interruptedItem.getName()); +// remainingItem.setCode(interruptedItem.getCode()); +// remainingItem.setDesignNum(remainingDesignNum); +// remainingBaseList.add(remainingItem); +// } +// } else { +// // 整个被打断,全部加入剩余列表 +// remainingBaseList.add(interruptedItem); +// } +// } +// +// // 7. 添加插活数据 +// resultList.addAll(processedInsertList); +// +// // 8. 处理剩余的baseList(被打断的剩余部分 + 原本在插活数据之后的) +// List allRemainingList = new ArrayList<>(); +// allRemainingList.addAll(remainingBaseList); +// allRemainingList.addAll(afterInsertList); +// +// if (!allRemainingList.isEmpty()) { +// // 获取插活数据的最后结束时间 +// LocalDateTime lastInsertEndTime = processedInsertList.stream() +// .map(PlanSubDetailDO::getTwoDimDate) +// .max(LocalDateTime::compareTo) +// .orElse(null); +// +// // 从插活数据的下一天开始顺延 +// LocalDateTime baseStartTime = lastInsertEndTime.plusDays(1); +// +// for (PlanSubDetailDO baseItem : allRemainingList) { +// // 按照原有的designNum计算新的时间段 +// LocalDateTime newStartTime = baseStartTime; +// LocalDateTime newEndTime = newStartTime.plusDays(baseItem.getDesignNum() - 1); +// +// // 检查新的时间段内是否有节假日 +// List holidaysInRange = getHolidaysInRange(newStartTime, newEndTime, holidayList); +// +// if (holidaysInRange.isEmpty()) { +// // 没有节假日,直接添加 +// PlanSubDetailDO newBaseItem = createBaseItem(baseItem, newStartTime, newEndTime); +// resultList.add(newBaseItem); +// baseStartTime = newEndTime.plusDays(1); +// } else { +// // 有节假日,需要分段处理 +// List segments = splitBaseItemByHolidays(baseItem, newStartTime, newEndTime, holidaysInRange); +// resultList.addAll(segments); +// +// // 更新下一个baseItem的开始时间 +// LocalDateTime lastSegmentEndTime = segments.stream() +// .map(PlanSubDetailDO::getTwoDimDate) +// .max(LocalDateTime::compareTo) +// .orElse(newEndTime); +// baseStartTime = lastSegmentEndTime.plusDays(1); +// } +// } +// } +// +// // 9. 按开始时间排序 +// resultList.sort(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate)); +// +// return resultList; +// } +// +// private List splitByHolidays(PlanSubDetailDO original, List holidaysInRange) { +// List segments = new ArrayList<>(); +// LocalDateTime currentStart = original.getStartTwoDimDate(); +// LocalDateTime originalEnd = original.getTwoDimDate(); +// +// for (LocalDateTime holiday : holidaysInRange) { +// // 修复:只有当currentStart在节假日前时才创建节假日前的一段 +// if (currentStart.isBefore(holiday)) { +// LocalDateTime segmentEnd = holiday.minusDays(1); +// if (currentStart.isBefore(segmentEnd) || currentStart.isEqual(segmentEnd)) { +// // 节假日前的段落 +// PlanSubDetailDO beforeHoliday = createSegment(original, currentStart, segmentEnd); +// segments.add(beforeHoliday); +// } +// } +// // 跳过节假日,从节假日后一天开始 +// currentStart = holiday.plusDays(1); +// } +// +// // 最后一段:确保还有剩余时间 +// if (!currentStart.isAfter(originalEnd)) { +// PlanSubDetailDO lastSegment = createSegment(original, currentStart, originalEnd); +// segments.add(lastSegment); +// } +// +// return segments; +// } +// +// /** +// * 按节假日分段(带时间控制,用于插活数据) +// */ +// private List splitByHolidaysWithTime(PlanSubDetailDO original, +// LocalDateTime startTime, +// LocalDateTime endTime, +// List holidaysInRange) { +// List segments = new ArrayList<>(); +// LocalDateTime currentStart = startTime; +// +// for (LocalDateTime holiday : holidaysInRange) { +// if (currentStart.isBefore(holiday)) { +// LocalDateTime segmentEnd = holiday.minusDays(1); +// if (currentStart.isBefore(segmentEnd) || currentStart.isEqual(segmentEnd)) { +// PlanSubDetailDO beforeHoliday = createSegment(original, currentStart, segmentEnd); +// segments.add(beforeHoliday); +// } +// } +// currentStart = holiday.plusDays(1); +// } +// +// // 最后一段 +// if (!currentStart.isAfter(endTime)) { +// PlanSubDetailDO lastSegment = createSegment(original, currentStart, endTime); +// segments.add(lastSegment); +// } +// +// return segments; +// } +// +// +// +// private List splitBaseItemByHolidays(PlanSubDetailDO original, +// LocalDateTime startTime, +// LocalDateTime endTime, +// List holidaysInRange) { +// List segments = new ArrayList<>(); +// LocalDateTime currentStart = startTime; +// Long totalDesignNum = original.getDesignNum(); +// Long usedDesignNum = 0L; +// +// for (LocalDateTime holiday : holidaysInRange) { +// if (currentStart.isBefore(holiday)) { +// // 计算到节假日前一天的天数 +// long daysToHoliday = ChronoUnit.DAYS.between(currentStart, holiday); +// +// if (daysToHoliday > 0) { +// long segmentDays = Math.min(daysToHoliday, totalDesignNum - usedDesignNum); +// +// if (segmentDays > 0) { +// // 节假日前的段落 +// LocalDateTime segmentEnd = currentStart.plusDays(segmentDays - 1); +// PlanSubDetailDO beforeHoliday = createBaseItem(original, currentStart, segmentEnd); +// beforeHoliday.setDesignNum(segmentDays); // 设置实际的designNum +// segments.add(beforeHoliday); +// usedDesignNum += segmentDays; +// currentStart = holiday.plusDays(1); +// } +// } else { +// currentStart = holiday.plusDays(1); +// } +// +// // 如果已经用完了designNum,直接返回 +// if (usedDesignNum >= totalDesignNum) { +// return segments; +// } +// } else { +// currentStart = holiday.plusDays(1); +// } +// } +// +// // 最后一段 +// if (usedDesignNum < totalDesignNum) { +// long remainingDays = totalDesignNum - usedDesignNum; +// LocalDateTime lastSegmentEnd = currentStart.plusDays(remainingDays - 1); +// PlanSubDetailDO lastSegment = createBaseItem(original, currentStart, lastSegmentEnd); +// lastSegment.setDesignNum(remainingDays); // 设置实际的designNum +// segments.add(lastSegment); +// } +// +// return segments; +// } +// +// /** +// * 创建分段对象(用于插活数据) +// */ +// private PlanSubDetailDO createSegment(PlanSubDetailDO original, LocalDateTime startDate, LocalDateTime endDate) { +// PlanSubDetailDO segment = new PlanSubDetailDO(); +// segment.setId(null); // 新分段id为空 +// segment.setProjectPlanId(original.getProjectPlanId()); +// segment.setProjectId(original.getProjectId()); +// segment.setProjectPlanSubId(original.getId()); +// segment.setProjectSubCode(original.getProjectSubCode()); +// segment.setTwoDimOwner(Long.valueOf(original.getTwoDimOwner())); +// segment.setProjectSubId(original.getProjectSubId()); +// segment.setSubType(original.getSubType()); +// segment.setName(original.getName()); +// segment.setCode(original.getCode()); +// segment.setStartTwoDimDate(startDate); +// segment.setTwoDimDate(endDate); +// // 只有id为空的才重新计算designNum +// segment.setDesignNum(calculateWorkDays(startDate, endDate)); +// return segment; +// } +// +// /** +// * 创建baseItem对象(用于baseList顺延) +// */ +// private PlanSubDetailDO createBaseItem(PlanSubDetailDO original, LocalDateTime startDate, LocalDateTime endDate) { +// PlanSubDetailDO baseItem = new PlanSubDetailDO(); +// // 复制原有属性 +// baseItem.setId(original.getId()); +// baseItem.setProjectPlanId(original.getProjectPlanId()); +// baseItem.setProjectId(original.getProjectId()); +// baseItem.setProjectPlanSubId(original.getProjectPlanSubId()); +// baseItem.setProjectSubCode(original.getProjectSubCode()); +// baseItem.setTwoDimOwner(original.getTwoDimOwner()); +// baseItem.setProjectSubId(original.getProjectSubId()); +// baseItem.setSubType(original.getSubType()); +// baseItem.setName(original.getName()); +// baseItem.setCode(original.getCode()); +// baseItem.setDesignNum(calculateWorkDays(startDate, endDate)); +// baseItem.setStartTwoDimDate(startDate); +// baseItem.setTwoDimDate(endDate); +// return baseItem; +// } +// +// /** +// * 获取时间段内的节假日 +// */ +// private List getHolidaysInRange(LocalDateTime startDate, LocalDateTime endDate, +// List holidayList) { +// return holidayList.stream() +// .filter(holiday -> !holiday.isBefore(startDate) && !holiday.isAfter(endDate)) +// .sorted() +// .collect(Collectors.toList()); +// } +// +// /** +// * 计算工作天数(排除节假日) +// */ +// private Long calculateWorkDays(LocalDateTime startDate, LocalDateTime endDate) { +// long workDays = 0; +// LocalDateTime current = startDate.toLocalDate().atStartOfDay(); +// LocalDateTime end = endDate.toLocalDate().atStartOfDay(); +// +// while (!current.isAfter(end)) { +// // 检查是否是工作日 +// workDays++; +// current = current.plusDays(1); +// } +// +// return workDays; +// } + @Override @Transactional public CommonResult chahuoList(PlanSubDetailSaveReqVO updateReqVO) { @@ -449,6 +963,17 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { // 5. 执行插活逻辑 List resultList = performInsertLogic(baseList, insertList, holidayList); + Map> collect1 = resultList.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getProjectSubId)); + collect1.forEach((id,detailList) -> { + Map> collect2 = detailList.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getSubType)); + collect2.forEach((type,list2) ->{ + int i = 1; + for (PlanSubDetailDO planSubDetailDO : list2) { + planSubDetailDO.setSeqNo(Long.valueOf(i++)); + } + }); + }); + // 6. 保存结果 updateReqVO.setList(resultList); return CommonResult.success(updateReqVO); @@ -462,145 +987,77 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { List holidayList) { List resultList = new ArrayList<>(); - // 1. 先处理插活数据,按节假日分段 + // 1. 如果没有插活数据,直接返回baseList + if (CollUtil.isEmpty(insertList)) { + return new ArrayList<>(baseList); + } + + // 2. 如果baseList为空,直接返回所有插活数据 + if (CollUtil.isEmpty(baseList)) { + List processedInsertList = new ArrayList<>(); + for (PlanSubDetailDO insertItem : insertList) { + PlanSubDetailDO processedInsert = createInsertItem(insertItem, insertItem.getStartTwoDimDate(), insertItem.getTwoDimDate(), holidayList); + processedInsertList.add(processedInsert); + } + processedInsertList.sort(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate)); + return processedInsertList; + } + + // 3. 获取baseList的时间范围 + LocalDateTime baseListMinStartTime = baseList.stream() + .map(PlanSubDetailDO::getStartTwoDimDate) + .min(LocalDateTime::compareTo) + .orElse(null); + LocalDateTime baseListMaxEndTime = baseList.stream() + .map(PlanSubDetailDO::getTwoDimDate) + .max(LocalDateTime::compareTo) + .orElse(null); + + // 4. 处理插活数据,保持原有时间范围,但重新计算designNum(排除节假日) List processedInsertList = new ArrayList<>(); for (PlanSubDetailDO insertItem : insertList) { LocalDateTime startDate = insertItem.getStartTwoDimDate(); LocalDateTime endDate = insertItem.getTwoDimDate(); - // 检查该时间段内是否有节假日 - List holidaysInRange = getHolidaysInRange(startDate, endDate, holidayList); + PlanSubDetailDO processedInsert = createInsertItem(insertItem, startDate, endDate, holidayList); + processedInsertList.add(processedInsert); + } - if (holidaysInRange.isEmpty()) { - // 没有节假日,直接添加 - processedInsertList.add(insertItem); + // 5. 分离插活数据:在baseList之前的、在baseList之间的、在baseList之后的 + List beforeBaseListInserts = new ArrayList<>(); + List duringBaseListInserts = new ArrayList<>(); + List afterBaseListInserts = new ArrayList<>(); + + for (PlanSubDetailDO insertItem : processedInsertList) { + if (insertItem.getTwoDimDate().isBefore(baseListMinStartTime)) { + // 插活数据完全在baseList之前 + beforeBaseListInserts.add(insertItem); + } else if (insertItem.getStartTwoDimDate().isAfter(baseListMaxEndTime)) { + // 插活数据完全在baseList之后 + afterBaseListInserts.add(insertItem); } else { - // 有节假日,需要分段处理 - List segments = splitByHolidays(insertItem, holidaysInRange); - processedInsertList.addAll(segments); + // 插活数据与baseList有重叠或在baseList之间 + duringBaseListInserts.add(insertItem); } } - // 2. 如果没有插活数据,直接返回baseList - if (processedInsertList.isEmpty()) { - return new ArrayList<>(baseList); - } + // 6. 处理在baseList之前的插活数据:直接添加到结果列表前面 + beforeBaseListInserts.sort(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate)); + resultList.addAll(beforeBaseListInserts); - // 3. 获取插活数据的开始时间 - LocalDateTime insertStartTime = processedInsertList.stream() - .map(PlanSubDetailDO::getStartTwoDimDate) - .min(LocalDateTime::compareTo) - .orElse(null); - - // 4. 分离baseList:在插活数据之前的、被打断的、在插活数据之后的 - List beforeInsertList = new ArrayList<>(); - List interruptedList = new ArrayList<>(); - List afterInsertList = new ArrayList<>(); - List remainingBaseList = new ArrayList<>(); - - if (insertStartTime != null) { - for (PlanSubDetailDO baseItem : baseList) { - if (baseItem.getTwoDimDate().isBefore(insertStartTime)) { - // 完全在插活数据之前 - beforeInsertList.add(baseItem); - } else if (baseItem.getStartTwoDimDate().isBefore(insertStartTime) && - baseItem.getTwoDimDate().isAfter(insertStartTime.minusDays(1))) { - // 被插活数据打断 - interruptedList.add(baseItem); - } else { - // 在插活数据之后 - afterInsertList.add(baseItem); - } - } + // 7. 处理baseList和在其间的插活数据 + if (CollUtil.isEmpty(duringBaseListInserts)) { + // 没有在baseList之间的插活数据,baseList保持原样 + resultList.addAll(baseList); } else { - beforeInsertList.addAll(baseList); + // 有在baseList之间的插活数据,需要重新编排 + // 重新构建结果列表,考虑插活数据对多个baseList的影响 + resultList.addAll(rebuildListWithInserts(baseList, duringBaseListInserts, holidayList)); } - // 5. 处理插活数据之前的baseList(保持原样) - resultList.addAll(beforeInsertList); - - // 6. 处理被打断的baseList - for (PlanSubDetailDO interruptedItem : interruptedList) { - // 计算插活数据开始前的天数 - long daysBeforeInsert = ChronoUnit.DAYS.between(interruptedItem.getStartTwoDimDate(), insertStartTime); - - if (daysBeforeInsert > 0) { - // 创建插活前的段落 - LocalDateTime segmentEnd = interruptedItem.getStartTwoDimDate().plusDays(daysBeforeInsert - 1); - PlanSubDetailDO beforeSegment = createBaseItem(interruptedItem, interruptedItem.getStartTwoDimDate(), segmentEnd); - beforeSegment.setDesignNum(daysBeforeInsert); - resultList.add(beforeSegment); - - // 保存剩余的designNum - Long remainingDesignNum = interruptedItem.getDesignNum() - daysBeforeInsert; - if (remainingDesignNum > 0) { - // 创建剩余的baseItem,稍后处理 - PlanSubDetailDO remainingItem = new PlanSubDetailDO(); - // 复制属性 - remainingItem.setId(interruptedItem.getId()); - remainingItem.setProjectPlanId(interruptedItem.getProjectPlanId()); - remainingItem.setProjectId(interruptedItem.getProjectId()); - remainingItem.setProjectPlanSubId(interruptedItem.getProjectPlanSubId()); - remainingItem.setProjectSubCode(interruptedItem.getProjectSubCode()); - remainingItem.setTwoDimOwner(interruptedItem.getTwoDimOwner()); - remainingItem.setProjectSubId(interruptedItem.getProjectSubId()); - remainingItem.setSubType(interruptedItem.getSubType()); - remainingItem.setName(interruptedItem.getName()); - remainingItem.setCode(interruptedItem.getCode()); - remainingItem.setDesignNum(remainingDesignNum); - remainingBaseList.add(remainingItem); - } - } else { - // 整个被打断,全部加入剩余列表 - remainingBaseList.add(interruptedItem); - } - } - - // 7. 添加插活数据 - resultList.addAll(processedInsertList); - - // 8. 处理剩余的baseList(被打断的剩余部分 + 原本在插活数据之后的) - List allRemainingList = new ArrayList<>(); - allRemainingList.addAll(remainingBaseList); - allRemainingList.addAll(afterInsertList); - - if (!allRemainingList.isEmpty()) { - // 获取插活数据的最后结束时间 - LocalDateTime lastInsertEndTime = processedInsertList.stream() - .map(PlanSubDetailDO::getTwoDimDate) - .max(LocalDateTime::compareTo) - .orElse(null); - - // 从插活数据的下一天开始顺延 - LocalDateTime baseStartTime = lastInsertEndTime.plusDays(1); - - for (PlanSubDetailDO baseItem : allRemainingList) { - // 按照原有的designNum计算新的时间段 - LocalDateTime newStartTime = baseStartTime; - LocalDateTime newEndTime = newStartTime.plusDays(baseItem.getDesignNum() - 1); - - // 检查新的时间段内是否有节假日 - List holidaysInRange = getHolidaysInRange(newStartTime, newEndTime, holidayList); - - if (holidaysInRange.isEmpty()) { - // 没有节假日,直接添加 - PlanSubDetailDO newBaseItem = createBaseItem(baseItem, newStartTime, newEndTime); - resultList.add(newBaseItem); - baseStartTime = newEndTime.plusDays(1); - } else { - // 有节假日,需要分段处理 - List segments = splitBaseItemByHolidays(baseItem, newStartTime, newEndTime, holidaysInRange); - resultList.addAll(segments); - - // 更新下一个baseItem的开始时间 - LocalDateTime lastSegmentEndTime = segments.stream() - .map(PlanSubDetailDO::getTwoDimDate) - .max(LocalDateTime::compareTo) - .orElse(newEndTime); - baseStartTime = lastSegmentEndTime.plusDays(1); - } - } - } + // 8. 处理在baseList之后的插活数据:直接添加到baseList后面 + afterBaseListInserts.sort(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate)); + resultList.addAll(afterBaseListInserts); // 9. 按开始时间排序 resultList.sort(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate)); @@ -608,156 +1065,222 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { return resultList; } - private List splitByHolidays(PlanSubDetailDO original, List holidaysInRange) { - List segments = new ArrayList<>(); - LocalDateTime currentStart = original.getStartTwoDimDate(); - LocalDateTime originalEnd = original.getTwoDimDate(); + /** + * 重新构建包含插活数据的列表 + */ + private List rebuildListWithInserts(List baseList, + List insertItems, + List holidayList) { + List resultList = new ArrayList<>(); - for (LocalDateTime holiday : holidaysInRange) { - // 修复:只有当currentStart在节假日前时才创建节假日前的一段 - if (currentStart.isBefore(holiday)) { - LocalDateTime segmentEnd = holiday.minusDays(1); - if (currentStart.isBefore(segmentEnd) || currentStart.isEqual(segmentEnd)) { - // 节假日前的段落 - PlanSubDetailDO beforeHoliday = createSegment(original, currentStart, segmentEnd); - segments.add(beforeHoliday); - } + // 按时间排序插活数据 + insertItems.sort(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate)); + + // 处理每个baseList,考虑插活数据的影响 + for (PlanSubDetailDO baseItem : baseList) { + // 找出与这个baseItem重叠的插活数据 + List overlappingInserts = insertItems.stream() + .filter(insert -> !(insert.getTwoDimDate().isBefore(baseItem.getStartTwoDimDate()) || + insert.getStartTwoDimDate().isAfter(baseItem.getTwoDimDate()))) + .sorted(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate)) + .collect(Collectors.toList()); + + if (overlappingInserts.isEmpty()) { + // 没有重叠的插活数据,保持原样 + resultList.add(baseItem); + } else { + // 有重叠的插活数据,需要分割baseItem + List splitSegments = splitBaseItemByInserts(baseItem, overlappingInserts, holidayList); + resultList.addAll(splitSegments); } - // 跳过节假日,从节假日后一天开始 - currentStart = holiday.plusDays(1); } - // 最后一段:确保还有剩余时间 - if (!currentStart.isAfter(originalEnd)) { - PlanSubDetailDO lastSegment = createSegment(original, currentStart, originalEnd); - segments.add(lastSegment); - } + // 添加插活数据 + resultList.addAll(insertItems); - return segments; + return resultList; } /** - * 按节假日分段(带时间控制,用于插活数据) + * 根据插活数据分割baseItem */ - private List splitByHolidaysWithTime(PlanSubDetailDO original, - LocalDateTime startTime, - LocalDateTime endTime, - List holidaysInRange) { + private List splitBaseItemByInserts(PlanSubDetailDO baseItem, + List overlappingInserts, + List holidayList) { List segments = new ArrayList<>(); - LocalDateTime currentStart = startTime; + LocalDateTime baseStart = baseItem.getStartTwoDimDate(); + LocalDateTime baseEnd = baseItem.getTwoDimDate(); + Long originalDesignNum = baseItem.getDesignNum(); - for (LocalDateTime holiday : holidaysInRange) { - if (currentStart.isBefore(holiday)) { - LocalDateTime segmentEnd = holiday.minusDays(1); - if (currentStart.isBefore(segmentEnd) || currentStart.isEqual(segmentEnd)) { - PlanSubDetailDO beforeHoliday = createSegment(original, currentStart, segmentEnd); - segments.add(beforeHoliday); - } - } - currentStart = holiday.plusDays(1); - } - - // 最后一段 - if (!currentStart.isAfter(endTime)) { - PlanSubDetailDO lastSegment = createSegment(original, currentStart, endTime); - segments.add(lastSegment); - } - - return segments; - } - - - - private List splitBaseItemByHolidays(PlanSubDetailDO original, - LocalDateTime startTime, - LocalDateTime endTime, - List holidaysInRange) { - List segments = new ArrayList<>(); - LocalDateTime currentStart = startTime; - Long totalDesignNum = original.getDesignNum(); + // 处理baseItem被插活数据分割的情况 + LocalDateTime currentStart = baseStart; Long usedDesignNum = 0L; - for (LocalDateTime holiday : holidaysInRange) { - if (currentStart.isBefore(holiday)) { - // 计算到节假日前一天的天数 - long daysToHoliday = ChronoUnit.DAYS.between(currentStart, holiday); + for (PlanSubDetailDO insert : overlappingInserts) { + LocalDateTime insertStart = insert.getStartTwoDimDate(); + LocalDateTime insertEnd = insert.getTwoDimDate(); - if (daysToHoliday > 0) { - long segmentDays = Math.min(daysToHoliday, totalDesignNum - usedDesignNum); + // 如果当前开始时间在插活数据之前,创建一个segment + if (currentStart.isBefore(insertStart)) { + // 计算这个时间段内可用的工作日数 + Long availableWorkDays = calculateWorkDaysExcludingHolidays(currentStart, insertStart.minusDays(1), holidayList); + Long segmentDesignNum = Math.min(availableWorkDays, originalDesignNum - usedDesignNum); - if (segmentDays > 0) { - // 节假日前的段落 - LocalDateTime segmentEnd = currentStart.plusDays(segmentDays - 1); - PlanSubDetailDO beforeHoliday = createBaseItem(original, currentStart, segmentEnd); - beforeHoliday.setDesignNum(segmentDays); // 设置实际的designNum - segments.add(beforeHoliday); - usedDesignNum += segmentDays; - currentStart = holiday.plusDays(1); - } - } else { - currentStart = holiday.plusDays(1); + if (segmentDesignNum > 0) { + // 根据designNum计算实际的结束日期 + LocalDateTime segmentEnd = calculateEndDateByDesignNum(currentStart, segmentDesignNum, holidayList); + PlanSubDetailDO segment = createBaseItem(baseItem, currentStart, segmentEnd, holidayList); + segment.setDesignNum(segmentDesignNum); + segments.add(segment); + usedDesignNum += segmentDesignNum; + currentStart = segmentEnd.plusDays(1); } - - // 如果已经用完了designNum,直接返回 - if (usedDesignNum >= totalDesignNum) { - return segments; - } - } else { - currentStart = holiday.plusDays(1); } + + // 跳过插活数据的时间段 + currentStart = insertEnd.plusDays(1); } - // 最后一段 - if (usedDesignNum < totalDesignNum) { - long remainingDays = totalDesignNum - usedDesignNum; - LocalDateTime lastSegmentEnd = currentStart.plusDays(remainingDays - 1); - PlanSubDetailDO lastSegment = createBaseItem(original, currentStart, lastSegmentEnd); - lastSegment.setDesignNum(remainingDays); // 设置实际的designNum - segments.add(lastSegment); + // 处理最后一个插活数据之后的部分 + if (usedDesignNum < originalDesignNum) { + Long remainingDesignNum = originalDesignNum - usedDesignNum; + + // 从插活数据结束后的下一天开始,找到第一个工作日 + LocalDateTime segmentStart = findNextWorkDay(currentStart, holidayList); + + // 根据剩余的designNum计算结束日期(包含节假日,但designNum只计算工作日) + LocalDateTime segmentEnd = calculateEndDateByDesignNumWithHolidays(segmentStart, remainingDesignNum, holidayList); + + PlanSubDetailDO segment = createBaseItem(baseItem, segmentStart, segmentEnd, holidayList); + segment.setDesignNum(remainingDesignNum); + segments.add(segment); } return segments; } /** - * 创建分段对象(用于插活数据) + * 根据designNum计算结束日期(包含节假日,但designNum只计算工作日) */ - private PlanSubDetailDO createSegment(PlanSubDetailDO original, LocalDateTime startDate, LocalDateTime endDate) { - PlanSubDetailDO segment = new PlanSubDetailDO(); - segment.setId(null); // 新分段id为空 - segment.setProjectPlanId(original.getProjectPlanId()); - segment.setProjectId(original.getProjectId()); - segment.setProjectPlanSubId(original.getId()); - segment.setProjectSubCode(original.getProjectSubCode()); - segment.setTwoDimOwner(Long.valueOf(original.getTwoDimOwner())); - segment.setProjectSubId(original.getProjectSubId()); - segment.setSubType(original.getSubType()); - segment.setName(original.getName()); - segment.setCode(original.getCode()); - segment.setStartTwoDimDate(startDate); - segment.setTwoDimDate(endDate); - // 只有id为空的才重新计算designNum - segment.setDesignNum(calculateWorkDays(startDate, endDate)); - return segment; + private LocalDateTime calculateEndDateByDesignNumWithHolidays(LocalDateTime startDate, Long designNum, List holidayList) { + LocalDateTime current = startDate; + Long workDays = 0L; + + while (workDays < designNum) { + if (!isHoliday(current, holidayList)) { + workDays++; + } + if (workDays < designNum) { + current = current.plusDays(1); + } + } + + return current; + } + + /** + * 根据designNum计算结束日期(跳过节假日) + */ + private LocalDateTime calculateEndDateByDesignNum(LocalDateTime startDate, Long designNum, List holidayList) { + LocalDateTime current = startDate; + Long workDays = 0L; + + while (workDays < designNum) { + if (!isHoliday(current, holidayList)) { + workDays++; + } + if (workDays < designNum) { + current = current.plusDays(1); + } + } + + return current; + } + + /** + * 创建插活数据项(保持原有时间范围,排除节假日计算designNum) + */ + private PlanSubDetailDO createInsertItem(PlanSubDetailDO original, LocalDateTime startDate, LocalDateTime endDate, List holidayList) { + PlanSubDetailDO insertItem = new PlanSubDetailDO(); + copyBaseItemProperties(insertItem, original); + insertItem.setId(null); // 插活数据id为空 + insertItem.setIsCha("Y"); // 标记为插活 + insertItem.setStartTwoDimDate(startDate); + insertItem.setTwoDimDate(endDate); + // 计算排除节假日的工作天数 + insertItem.setDesignNum(calculateWorkDaysExcludingHolidays(startDate, endDate, holidayList)); + return insertItem; + } + + /** + * 复制baseItem属性 + */ + private void copyBaseItemProperties(PlanSubDetailDO target, PlanSubDetailDO source) { + target.setProjectPlanId(source.getProjectPlanId()); + target.setProjectId(source.getProjectId()); + target.setProjectPlanSubId(source.getProjectPlanSubId()); + target.setProjectSubCode(source.getProjectSubCode()); + target.setTwoDimOwner(source.getTwoDimOwner()); + target.setProjectSubId(source.getProjectSubId()); + target.setSubType(source.getSubType()); + target.setName(source.getName()); + target.setCode(source.getCode()); + } + + /** + * 查找下一个工作日 + */ + private LocalDateTime findNextWorkDay(LocalDateTime date, List holidayList) { + LocalDateTime current = date; + while (isHoliday(current, holidayList)) { + current = current.plusDays(1); + } + return current; + } + + /** + * 查找下一个节假日 + */ + private LocalDateTime findNextHoliday(LocalDateTime date, List holidayList) { + return holidayList.stream() + .filter(holiday -> !holiday.isBefore(date)) + .min(LocalDateTime::compareTo) + .orElse(null); + } + + /** + * 检查是否是节假日 + */ + private boolean isHoliday(LocalDateTime date, List holidayList) { + return holidayList.contains(date.toLocalDate().atStartOfDay()); + } + + /** + * 计算排除节假日的工作天数 + */ + private Long calculateWorkDaysExcludingHolidays(LocalDateTime startDate, LocalDateTime endDate, List holidayList) { + long workDays = 0; + LocalDateTime current = startDate.toLocalDate().atStartOfDay(); + LocalDateTime end = endDate.toLocalDate().atStartOfDay(); + + while (!current.isAfter(end)) { + if (!isHoliday(current, holidayList)) { + workDays++; + } + current = current.plusDays(1); + } + + return workDays; } /** * 创建baseItem对象(用于baseList顺延) */ - private PlanSubDetailDO createBaseItem(PlanSubDetailDO original, LocalDateTime startDate, LocalDateTime endDate) { + private PlanSubDetailDO createBaseItem(PlanSubDetailDO original, LocalDateTime startDate, LocalDateTime endDate, List holidayList) { PlanSubDetailDO baseItem = new PlanSubDetailDO(); - // 复制原有属性 + copyBaseItemProperties(baseItem, original); baseItem.setId(original.getId()); - baseItem.setProjectPlanId(original.getProjectPlanId()); - baseItem.setProjectId(original.getProjectId()); - baseItem.setProjectPlanSubId(original.getProjectPlanSubId()); - baseItem.setProjectSubCode(original.getProjectSubCode()); - baseItem.setTwoDimOwner(original.getTwoDimOwner()); - baseItem.setProjectSubId(original.getProjectSubId()); - baseItem.setSubType(original.getSubType()); - baseItem.setName(original.getName()); - baseItem.setCode(original.getCode()); - baseItem.setDesignNum(calculateWorkDays(startDate, endDate)); + baseItem.setDesignNum(calculateWorkDaysExcludingHolidays(startDate, endDate, holidayList)); baseItem.setStartTwoDimDate(startDate); baseItem.setTwoDimDate(endDate); return baseItem; @@ -783,7 +1306,6 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { LocalDateTime end = endDate.toLocalDate().atStartOfDay(); while (!current.isAfter(end)) { - // 检查是否是工作日 workDays++; current = current.plusDays(1); } @@ -791,20 +1313,6 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService { return workDays; } - /** - * 保存计划子明细 - */ - private void savePlanSubDetails(List resultList) { - for (PlanSubDetailDO item : resultList) { - if (item.getId() == null) { - // 新增 - planSubDetailMapper.insert(item); - } else { - // 更新 - planSubDetailMapper.updateById(item); - } - } - } @Override diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/interrupt/index.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/interrupt/index.vue index b8cc48ea..c1e3e8bd 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/heli/interrupt/index.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/interrupt/index.vue @@ -27,6 +27,8 @@ v-model="queryParams.beginTime" value-format="YYYY-MM-DD" type="date" + clearable + @change="changeBeginDate()" start-placeholder="开始日期" end-placeholder="结束日期" class="!w-280px" @@ -65,7 +67,7 @@ 搜索 - 重置 + 保存 新增 @@ -82,13 +84,18 @@ border > - - - + + + - + - + - - - + + + @@ -181,99 +186,123 @@ - -
- - -
-

{{ - dialogTitle + - '(当前:' + - formatDate(currentRow?.startTwoDimDate, 'YYYY-MM-DD') + - '至' + - formatDate(currentRow?.twoDimDate, 'YYYY-MM-DD') + - ')' - }}

+ +
+ +
+
+

{{ + '当前子项目' + + currentRow.name + + ':' + + formatDate(currentRow?.startTwoDimDate, 'YYYY-MM-DD') + + '至' + + formatDate(currentRow?.twoDimDate, 'YYYY-MM-DD') + }}

+

{{ '插活前' }}

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
- - - - - - - - - - - - - - - - - - - - - - - + +
+
+

{{ + '当前子项目' + + currentRow.name + + ':' + + formatDate(currentRow?.startTwoDimDate, 'YYYY-MM-DD') + + '至' + + formatDate(currentRow?.twoDimDate, 'YYYY-MM-DD') + }}

+ +

{{ '插活后' }}

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
@@ -370,6 +397,23 @@ const queryParams = reactive({ name: undefined }) const queryFormRef = ref() +const changeBeginDate = () => { + if (!queryParams.beginTime) { + queryParams.startTime = undefined + } +} +// 获取字典标签 +const getDictLabel = (dictType, value) => { + const options = getStrDictOptions(dictType) + const option = options.find((item) => item.value === value) + return option ? option.label : value +} + +// 根据用户ID获取昵称 +const getUserNickname = (userId) => { + const user = userInit.value.find((item) => item.id === userId) + return user ? user.nickname : '' +} //弹框新增逻辑: const addDialogVisible = ref(false) @@ -395,28 +439,28 @@ const rowClickHandle = (row) => { // multipleTableRef.value.toggleRowSelection(row, true); // } // }) - // } + // } // else { // multipleTableRef.value.toggleRowSelection(row, true); // } if (selectData && selectData.length == 1) { - const [item] = selectData; - const shouldSelect = item !== row; - multipleTableRef.value.toggleRowSelection(row, shouldSelect); + const [item] = selectData + const shouldSelect = item !== row + multipleTableRef.value.toggleRowSelection(row, shouldSelect) } else { - multipleTableRef.value.toggleRowSelection(row, true); + multipleTableRef.value.toggleRowSelection(row, true) } } // 当用户手动勾选数据行的 Checkbox 时触发的事件 -const handlerSelect = (selection, row) => { +const handlerSelect = (selection, row) => { // 清除 所有勾选项 multipleTableRef.value.clearSelection() - if(selection.length == 0) return - multipleTableRef.value.toggleRowSelection(row,true) + if (selection.length == 0) return + multipleTableRef.value.toggleRowSelection(row, true) } // 当选择项发生变化时会触发该事件 -const handleSelectionChange = (val) => { - console.log('表格的选中 可以获得当前选中的数据',val); +const handleSelectionChange = (val) => { + console.log('表格的选中 可以获得当前选中的数据', val) selectedAddRow.value = val } // 新增按钮方法 @@ -425,38 +469,38 @@ const addForm = () => { getAddList() addDialogVisible.value = true } - + // 重置新增表单 const resetAddForm = () => { addQueryParams.projectCode = '' addQueryParams.projectSubName = '' selectedAddRow.value = null } - + // 获取可选项目列表 const getAddList = async () => { try { - loading3.value = true; + loading3.value = true const params = { projectCode: addQueryParams.projectCode, projectSubName: addQueryParams.projectSubName } const res = await PlansubdetailApi.pageAddList(params) console.log(res) - addList.value = res.list; - addtotal.value = res.total; + addList.value = res.list + addtotal.value = res.total } catch (error) { message.error('获取项目列表失败:' + error.message) - }finally{ - loading3.value = false; + } finally { + loading3.value = false } } - + // 行选择处理 const handleRowSelect = (row) => { selectedAddRow.value = row } - + // 取消新增 const handleAddCancel = () => { ElMessageBox.confirm('是否退出新增?', '提示', { @@ -469,13 +513,13 @@ const handleAddCancel = () => { }) .catch(() => {}) } - + // 确认新增 const handleAddConfirm = () => { - for(var i = 0 ; i < list.value.length ; i++ ){ - var item = list.value[i]; - if(!item.id){ - message.warning('列表中存在未保存数据,请确认!'); + for (var i = 0; i < list.value.length; i++) { + var item = list.value[i] + if (!item.id) { + message.warning('列表中存在未保存数据,请确认!') return } } @@ -483,21 +527,21 @@ const handleAddConfirm = () => { message.warning('请先选择要添加的项目') return } - selectedAddRow.value[0].twoDimDate = null; - selectedAddRow.value[0].startTwoDimDate = null; - selectedAddRow.value[0].twoDimOwner = null; - selectedAddRow.value[0].subType = null; - selectedAddRow.value[0].designNum = null; - selectedAddRow.value[0].seqNo = null; - selectedAddRow.value[0].isAdd = 1; - selectedAddRow.value[0].flag = 1; - selectedAddRow.value[0].userFlag = true; - selectedAddRow.value[0].id = null; + selectedAddRow.value[0].twoDimDate = null + selectedAddRow.value[0].startTwoDimDate = null + selectedAddRow.value[0].twoDimOwner = null + selectedAddRow.value[0].subType = null + selectedAddRow.value[0].designNum = null + selectedAddRow.value[0].seqNo = null + selectedAddRow.value[0].isAdd = 1 + selectedAddRow.value[0].flag = 1 + selectedAddRow.value[0].userFlag = true + selectedAddRow.value[0].id = null list.value.push(selectedAddRow.value[0]) addDialogVisible.value = false message.success('项目添加成功') } - + // 查询按钮操作 const handleAddQuery = () => { getAddList() @@ -513,18 +557,30 @@ const saveForm = async () => { try { if (list.value) { loading.value = true - for(var i = 0 ; i < list.value.length ;i++){ + for (var i = 0; i < list.value.length; i++) { var item = list.value[i] if (item.isOverProcess) { item.isOverProcess = 1 } else { item.isOverProcess = 0 } - if(!item.id){ + if (!item.id) { console.log(item) - var type = ("BLUEPRINT_WORKBLANK" == (item.subType))?"毛坯":("BLUEPRINT_2D" == (item.subType))?"2D":("BLUEPRINT_3D" == (item.subType))?'3D':'新增数据'; + var type = + 'BLUEPRINT_WORKBLANK' == item.subType + ? '毛坯' + : 'BLUEPRINT_2D' == item.subType + ? '2D' + : 'BLUEPRINT_3D' == item.subType + ? '3D' + : '新增数据' - message.error('该子项目'+item.name+(type == '新增数据'?'新增数据':'设计类型:'+type)+' ,没有保存请确认!') + message.error( + '该子项目' + + item.name + + (type == '新增数据' ? '新增数据' : '设计类型:' + type) + + ' ,没有保存请确认!' + ) return } } @@ -539,7 +595,7 @@ const saveForm = async () => { } else { message.error('失败:当前页面无数据可供保存') } - reload() // 刷新列表 + reload() // 刷新列表 } catch (error) { message.error('失败:' + error.message) } finally { @@ -569,13 +625,14 @@ const dialogVisible = ref(false) const dialogTitle = ref('插活前') const currentRow = ref(null) const insertList = ref([]) - +const beforeList = ref([]) const modification = async (row) => { var data = row as unknown as PlansubdetailApi.PlanSubDetailVO const res = await PlansubdetailApi.modificationPlanSubDetail(data) if (res.list) { //弹框 currentRow.value = row + beforeList.value = res.list insertList.value = res.list dialogVisible.value = true dialogTitle.value = '插活前' @@ -586,37 +643,54 @@ const modification = async (row) => { // 新增行方法 const addItemRow = (row) => { - if(row.id){ + if (row.id) { + for (var i = 0; i < list.value.length; i++) { + var item = list.value[i] + if (item.isOverProcess) { + item.isOverProcess = 1 + } else { + item.isOverProcess = 0 + } + if (!item.id) { + console.log(item) + var type = + 'BLUEPRINT_WORKBLANK' == item.subType + ? '毛坯' + : 'BLUEPRINT_2D' == item.subType + ? '2D' + : 'BLUEPRINT_3D' == item.subType + ? '3D' + : '新增数据' + + message.error( + '该子项目' + + item.name + + (type == '新增数据' ? '新增数据' : '设计类型:' + type) + + ' ,没有保存请确认!' + ) + return + } + } // 创建新行数据,复制当前行的所有属性 - const newRow = { - ...row, - // 清空或重置特定字段 - id: null, // 新增行id为空 - startTwoDimDate: undefined, // 开始日期为空 - twoDimDate: undefined, // 结束日期为空 - designNum: undefined, // 设计天数为空 - seqNo: undefined, // 时间段顺序为空 - isAdd: 1, // 标记为新增行 - flag: 1, // 标记为可编辑状态 - userFlag: true - } + const newRow = { + ...row, + // 清空或重置特定字段 + id: null, // 新增行id为空 + startTwoDimDate: undefined, // 开始日期为空 + twoDimDate: undefined, // 结束日期为空 + designNum: undefined, // 设计天数为空 + seqNo: undefined, // 时间段顺序为空 + isAdd: 1, // 标记为新增行 + flag: 1, // 标记为可编辑状态 + userFlag: true + } - // 获取当前行在列表中的索引 - const currentIndex = list.value.findIndex((item) => item === row) + list.value.unshift(newRow) - // 在当前行后面插入新行 - if (currentIndex !== -1) { - list.value.splice(currentIndex + 1, 0, newRow) + //message.success('新增行成功') } else { - // 如果找不到当前行,添加到末尾 - list.value.push(newRow) + message.error('该数据未保存,请确认') } - - //message.success('新增行成功') - }else{ - message.error('该数据未保存,请确认') - } - } const getSearchRlTs = async (row, startDateTime: string, endDateTime: string) => { @@ -758,7 +832,7 @@ const change1 = async (row: any, type: number) => { } const time = type === 0 ? new Date(row.startTwoDimDate) : new Date(row.twoDimDate) - if (!time || isNaN(time.getTime())) return + if (!time || isNaN(time.getTime()) || formatDate(time, 'YYYY-MM-DD') == '1970-01-01') return const data = await PlansubdetailApi.getSearchRlTsS(formatDate(time, 'YYYY-MM-DD')) @@ -780,7 +854,7 @@ const change1 = async (row: any, type: number) => { /** 搜索按钮操作 */ const handleQuery = () => { - if (queryParams.twoDimOwner == null) { + if (!queryParams.twoDimOwner) { // 使用 setTimeout 避免渲染过程中直接调用 message.error setTimeout(() => { message.error('负责人为空,请确认') @@ -803,7 +877,7 @@ const resetQuery = () => { code: undefined, name: undefined }) - getList() + // getList() } /** 初始化 **/ @@ -811,7 +885,7 @@ onMounted(async () => { try { // 取消注释并正确初始化 userInit.value = await UserApi.getDeptName('设计部') - await getList() + // await getList() } catch (error) { console.error('初始化失败:', error) setTimeout(() => { @@ -833,8 +907,9 @@ onMounted(async () => { } .status-title { + margin-top: -7%; margin-bottom: 20px; - text-align: center; + text-align: left; } .status-title h3 { @@ -844,7 +919,7 @@ onMounted(async () => { .dialog-footer { text-align: center; - display: flex; + display: flex; justify-content: center; align-items: center; margin-top: 20px; diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/plan/edit.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/plan/edit.vue index c3cb1617..b07cffae 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/heli/plan/edit.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/plan/edit.vue @@ -643,7 +643,8 @@ row.id, 'startBlankDate', 'blankDate', - 'blankNum' + 'blankNum', + 'start' ) " /> @@ -672,7 +673,8 @@ row.id, 'startBlankDate', 'blankDate', - 'blankNum' + 'blankNum', + 'end' ) " /> @@ -731,7 +733,8 @@ row.id, 'startThreeDimDate', 'threeDimDate', - 'threeDimNum' + 'threeDimNum', + 'start' ) " /> @@ -760,7 +763,8 @@ row.id, 'startThreeDimDate', 'threeDimDate', - 'threeDimNum' + 'threeDimNum', + 'end' ) " /> @@ -818,7 +822,8 @@ row.id, 'startTwoDimDate', 'twoDimDate', - 'twoDimNum' + 'twoDimNum', + 'start' ) " /> @@ -847,7 +852,8 @@ row.id, 'startTwoDimDate', 'twoDimDate', - 'twoDimNum' + 'twoDimNum', + 'end' ) " /> @@ -1445,7 +1451,8 @@ const handleDateChange = async ( id, startField, endField, - dataNumField + dataNumField, + type ) => { var nowDa = new Date() var nowDataStr = nowDa.toLocaleDateString('en-CA') @@ -1512,8 +1519,12 @@ const handleDateChange = async ( //用户选择完成后要取数据库中检索是否存在时间冲突,存在弹出插活框 if (startBlankDate > blankDate) { message.error('开始时间必须早于结束时间,否则无法计算设计天数,请检查') - rowData[startField] = null - rowData[endField] = null + if (type == 'end') { + rowData[endField] = null + } else { + rowData[startField] = null + } + rowData[dataNumField] = null return } @@ -2396,11 +2407,11 @@ const submitForm = async () => { // } // //subData.id = subData.projectSubId // }) + reload() message.success(t('common.updateSuccess')) // 发送操作成功的事件 // emit('success') } finally { - reload() formLoading.value = false } }