插活
This commit is contained in:
parent
630c2dec38
commit
0c167b4e0a
@ -18,6 +18,7 @@ import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
|
||||
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import com.chanko.yunxi.mes.module.heli.controller.admin.plansubdetail.vo.*;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.poi.ss.formula.functions.T;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
@ -39,6 +40,8 @@ public interface PlanSubDetailMapper extends BaseMapperX<PlanSubDetailDO> {
|
||||
|
||||
return selectPage(reqVO, query);
|
||||
}
|
||||
|
||||
int deletedSubById(@Param("id")Long id);
|
||||
default PageResult<PlanSubDetailDO> selectPage(PlanSubDetailPageReqVO reqVO) {
|
||||
MPJLambdaWrapper<PlanSubDetailDO> query = new MPJLambdaWrapper<>();
|
||||
|
||||
|
@ -125,10 +125,10 @@ public class PlanSubServiceImpl implements PlanSubService {
|
||||
in2DDO.setTwoDimDate(planSubSaveReqVO.getTwoDimDate());
|
||||
in2DDO.setProjectPlanId(planSubSaveReqVO.getProjectPlanId());
|
||||
in2DDO.setStartTwoDimDate(planSubSaveReqVO.getStartTwoDimDate());
|
||||
in2DDO.setTwoDimOwner(Long.valueOf(planSubSaveReqVO.getBlankOwner()));
|
||||
in2DDO.setTwoDimOwner(Long.valueOf(planSubSaveReqVO.getTwoDimOwner()));
|
||||
in2DDO.setSubType("BLUEPRINT_2D");
|
||||
in2DDO.setSeqNo(1L);
|
||||
in2DDO.setDesignNum(Long.valueOf(planSubSaveReqVO.getBlankNum()));
|
||||
in2DDO.setDesignNum(Long.valueOf(planSubSaveReqVO.getTwoDimNum()));
|
||||
in2DDO.setName(planSubSaveReqVO.getName());
|
||||
in2DDO.setCode(projectOrderDO.getCode());
|
||||
details.add(in2DDO);
|
||||
@ -144,10 +144,10 @@ public class PlanSubServiceImpl implements PlanSubService {
|
||||
in3DDO.setProjectSubCode(planSubSaveReqVO.getProjectSubCode());
|
||||
in3DDO.setTwoDimDate(planSubSaveReqVO.getThreeDimDate());
|
||||
in3DDO.setStartTwoDimDate(planSubSaveReqVO.getStartThreeDimDate());
|
||||
in3DDO.setTwoDimOwner(Long.valueOf(planSubSaveReqVO.getBlankOwner()));
|
||||
in3DDO.setTwoDimOwner(Long.valueOf(planSubSaveReqVO.getThreeDimOwner()));
|
||||
in3DDO.setSubType("BLUEPRINT_3D");
|
||||
in3DDO.setSeqNo(1L);
|
||||
in3DDO.setDesignNum(Long.valueOf(planSubSaveReqVO.getBlankNum()));
|
||||
in3DDO.setDesignNum(Long.valueOf(planSubSaveReqVO.getThreeDimNum()));
|
||||
in3DDO.setName(planSubSaveReqVO.getName());
|
||||
in3DDO.setCode(projectOrderDO.getCode());
|
||||
details.add(in3DDO);
|
||||
|
@ -87,8 +87,9 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
PlanSubDetailDO planSubDetailDO = planSubDetailMapper.selectById(id);
|
||||
// 获取当前日期时间
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
LocalDateTime startDate = now.with(LocalTime.MIN);
|
||||
// 判断 当前时间是否在startTwoDimDate之后
|
||||
boolean isGreaterThanCurrent = now.isAfter(planSubDetailDO.getStartTwoDimDate());
|
||||
boolean isGreaterThanCurrent = startDate.compareTo(planSubDetailDO.getStartTwoDimDate()) > 0;
|
||||
if (isGreaterThanCurrent) return CommonResult.error(400,"当前日期>开始日期,不允许删除");
|
||||
if (ObjectUtil.isNotEmpty(planSubDetailDO.getIsOverProcess()) && planSubDetailDO.getIsOverProcess() == 2 && planSubDetailDO.getSeqNo()==1){
|
||||
return CommonResult.error(400,"该设计已报工,不允许删除");
|
||||
@ -155,7 +156,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
}
|
||||
}
|
||||
planSubMapper.update(lambdaUpdateWrapper);
|
||||
planSubDetailMapper.delete(new LambdaUpdateWrapper<PlanSubDetailDO>().eq(PlanSubDetailDO::getId,id));
|
||||
planSubDetailMapper.deletedSubById(id);
|
||||
return CommonResult.success(true);
|
||||
}
|
||||
|
||||
@ -301,9 +302,9 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
wrapper.gt(PlanSubDetailDO::getSeqNo,updateReqVO.getSeqNo());
|
||||
if (planSubDetailMapper.selectCount(wrapper)>0) return CommonResult.error(400,"该子项目存在多时间段派工,不允许从中间修改!");
|
||||
LambdaQueryWrapper<PlanSubDetailDO> queryWrapper = new LambdaQueryWrapper<>();
|
||||
// queryWrapper.eq(PlanSubDetailDO::getProjectSubId,updateReqVO.getProjectSubId());
|
||||
queryWrapper.eq(PlanSubDetailDO::getTwoDimOwner,updateReqVO.getTwoDimOwner());
|
||||
// queryWrapper.eq(PlanSubDetailDO::getSubType,updateReqVO.getSubType());
|
||||
queryWrapper.eq(PlanSubDetailDO::getProjectSubId,updateReqVO.getProjectSubId());
|
||||
// queryWrapper.eq(PlanSubDetailDO::getTwoDimOwner,updateReqVO.getTwoDimOwner());
|
||||
queryWrapper.eq(PlanSubDetailDO::getSubType,updateReqVO.getSubType());
|
||||
if (ObjectUtil.isNotEmpty(updateReqVO.getId())){
|
||||
queryWrapper.ne(PlanSubDetailDO::getId,updateReqVO.getId());
|
||||
}
|
||||
@ -362,7 +363,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (change || ObjectUtil.isEmpty(list) || (list.get(0).getStartTwoDimDate().compareTo(updateReqVO.getTwoDimDate()) > 0 )){
|
||||
if (change || ObjectUtil.isEmpty(list) ||(CollUtil.isNotEmpty(noSelfList)&& (noSelfList.get(0).getStartTwoDimDate().compareTo(updateReqVO.getTwoDimDate()) > 0 ))){
|
||||
List<PlanSubDetailDO> newList = new ArrayList<>();
|
||||
newList.addAll(list);
|
||||
if (ObjectUtil.isNotEmpty(updateReqVO.getId())){
|
||||
@ -390,13 +391,25 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
planSubDetailDO.setDesignNum(updateReqVO.getDesignNum());
|
||||
planSubDetailDO.setCode(updateReqVO.getCode());
|
||||
newList.add(planSubDetailDO);
|
||||
newList.sort(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate, Comparator.nullsLast(Comparator.naturalOrder())));
|
||||
for (int i = 0; i < newList.size(); i++) {
|
||||
newList.get(i).setSeqNo(Long.valueOf(i + 1)); // 设置顺序为 1, 2, 3
|
||||
}
|
||||
// newList.sort(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate, Comparator.nullsLast(Comparator.naturalOrder())));
|
||||
planSubDetailMapper.insertOrUpdateBatch(newList);
|
||||
|
||||
Map<Long, List<PlanSubDetailDO>> collect = newList.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getProjectSubId));
|
||||
LambdaQueryWrapper<PlanSubDetailDO> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
|
||||
lambdaQueryWrapper1.eq(PlanSubDetailDO::getProjectSubId,updateReqVO.getProjectSubId());
|
||||
lambdaQueryWrapper1.ge(PlanSubDetailDO::getSubType,updateReqVO.getSubType());
|
||||
lambdaQueryWrapper1.eq(PlanSubDetailDO::getTwoDimOwner,updateReqVO.getTwoDimOwner());
|
||||
lambdaQueryWrapper1.orderByAsc(PlanSubDetailDO::getStartTwoDimDate);
|
||||
List<PlanSubDetailDO> planSubDetailDOS1 = planSubDetailMapper.selectList(lambdaQueryWrapper1);
|
||||
Map<Long, List<PlanSubDetailDO>> collect = planSubDetailDOS1.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getProjectSubId));
|
||||
collect.forEach((id,detailList) -> {
|
||||
Map<String, List<PlanSubDetailDO>> collect2 = detailList.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getSubType));
|
||||
collect2.forEach((type,list2) ->{
|
||||
int i = 1;
|
||||
for (PlanSubDetailDO planSubDetailDO1 : list2) {
|
||||
planSubDetailDO1.setSeqNo(Long.valueOf(i++));
|
||||
}
|
||||
});
|
||||
});
|
||||
planSubDetailMapper.updateBatch(planSubDetailDOS1);
|
||||
for (Map.Entry<Long, List<PlanSubDetailDO>> entry : collect.entrySet()) {
|
||||
Long subId = entry.getKey();
|
||||
List<PlanSubDetailDO> subList = entry.getValue();
|
||||
@ -485,6 +498,16 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
|
||||
}
|
||||
}
|
||||
Map<Long, List<PlanSubDetailDO>> groupBySubId = list.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getProjectSubId));
|
||||
groupBySubId.forEach((id,detailList) -> {
|
||||
Map<String, List<PlanSubDetailDO>> collect2 = detailList.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getSubType));
|
||||
collect2.forEach((type,list2) ->{
|
||||
int i = 1;
|
||||
for (PlanSubDetailDO planSubDetailDO : list2) {
|
||||
planSubDetailDO.setSeqNo(Long.valueOf(i++));
|
||||
}
|
||||
});
|
||||
});
|
||||
planSubDetailMapper.updateBatch(list);
|
||||
//更新表主表数据
|
||||
//先看有多少个子项目
|
||||
@ -1064,6 +1087,9 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
return CommonResult.success(updateReqVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行插活逻辑
|
||||
*/
|
||||
private List<PlanSubDetailDO> performInsertLogic(List<PlanSubDetailDO> baseList,
|
||||
List<PlanSubDetailDO> insertList,
|
||||
List<LocalDateTime> holidayList) {
|
||||
@ -1245,7 +1271,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
remainingItem.setProjectPlanSubId(interruptedItem.getProjectPlanSubId());
|
||||
remainingItem.setProjectSubCode(interruptedItem.getProjectSubCode());
|
||||
remainingItem.setTwoDimOwner(interruptedItem.getTwoDimOwner());
|
||||
remainingItem.setProjectSubId(interruptedItem.getProjectPlanSubId());
|
||||
remainingItem.setProjectSubId(interruptedItem.getProjectSubId());
|
||||
remainingItem.setSubType(interruptedItem.getSubType());
|
||||
remainingItem.setName(interruptedItem.getName());
|
||||
remainingItem.setCode(interruptedItem.getCode());
|
||||
@ -1260,8 +1286,12 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
// 12. 添加剩余的插活数据(未被合并的)
|
||||
resultList.addAll(remainingInsertList);
|
||||
|
||||
// 13. 处理剩余的baseList
|
||||
if (!remainingBaseList.isEmpty() || !afterInsertList.isEmpty()) {
|
||||
// 13. 处理剩余的baseList(被打断的剩余部分 + 原本在插活数据之后的)
|
||||
List<PlanSubDetailDO> allRemainingList = new ArrayList<>();
|
||||
allRemainingList.addAll(remainingBaseList);
|
||||
allRemainingList.addAll(afterInsertList);
|
||||
|
||||
if (!allRemainingList.isEmpty()) {
|
||||
// 获取插活数据的最后结束时间
|
||||
final LocalDateTime lastInsertEndTime;
|
||||
if (mergedBaseItem != null) {
|
||||
@ -1273,21 +1303,23 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
// 处理被打断的剩余部分
|
||||
for (PlanSubDetailDO baseItem : remainingBaseList) {
|
||||
// 从插活数据的下一天开始计算
|
||||
LocalDateTime newStartTime = lastInsertEndTime.plusDays(1);
|
||||
// 如果遇到节假日,继续跳过
|
||||
newStartTime = findNextNonHoliday(newStartTime, holidayList);
|
||||
// 从插活数据的下一天开始顺延
|
||||
LocalDateTime baseStartTime = lastInsertEndTime.plusDays(1);
|
||||
|
||||
for (PlanSubDetailDO baseItem : allRemainingList) {
|
||||
// 找到下一个非节假日开始时间
|
||||
LocalDateTime newStartTime = findNextNonHoliday(baseStartTime, holidayList);
|
||||
|
||||
// 根据designNum计算结束日期(包含节假日)
|
||||
LocalDateTime newEndTime = calculateEndDateByWorkDays(newStartTime, baseItem.getDesignNum(), holidayList);
|
||||
|
||||
PlanSubDetailDO newBaseItem = createBaseItem(baseItem, newStartTime, newEndTime);
|
||||
newBaseItem.setDesignNum(baseItem.getDesignNum()); // 保持原始designNum
|
||||
resultList.add(newBaseItem);
|
||||
}
|
||||
|
||||
// 处理原本在插活数据之后的baseList(保持原样)
|
||||
resultList.addAll(afterInsertList);
|
||||
// 更新下一个baseItem的开始时间
|
||||
baseStartTime = newEndTime.plusDays(1);
|
||||
}
|
||||
}
|
||||
|
||||
// 14. 按开始时间排序
|
||||
@ -1295,7 +1327,6 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
|
||||
return resultList;
|
||||
}
|
||||
|
||||
private LocalDateTime findNextNonHoliday(LocalDateTime startDate, List<LocalDateTime> holidayList) {
|
||||
LocalDateTime current = startDate;
|
||||
while (holidayList.contains(current)) {
|
||||
|
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.chanko.yunxi.mes.module.heli.dal.mysql.plansubdetail.PlanSubDetailMapper">
|
||||
|
||||
<!--
|
||||
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
|
||||
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
|
||||
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
|
||||
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
|
||||
-->
|
||||
<delete id="deletedSubById" parameterType="java.lang.Long">
|
||||
delete from project_plan_sub_detail where id = #{id}
|
||||
</delete>
|
||||
</mapper>
|
@ -597,7 +597,7 @@ const saveForm = async () => {
|
||||
}
|
||||
getList()
|
||||
} catch (error) {
|
||||
message.error('失败:' + error.message)
|
||||
// message.error('失败:' + error.message)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
@ -632,12 +632,14 @@ const modification = async (row) => {
|
||||
if (res.list) {
|
||||
//弹框
|
||||
currentRow.value = row
|
||||
beforeList.value = res.list
|
||||
res.list.forEach(item =>{
|
||||
beforeList.value.push(item)
|
||||
})
|
||||
insertList.value = res.list
|
||||
dialogVisible.value = true
|
||||
dialogTitle.value = '插活前'
|
||||
} else {
|
||||
await getList()
|
||||
getList()
|
||||
message.success('修改成功')
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user