插活
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 com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import com.chanko.yunxi.mes.module.heli.controller.admin.plansubdetail.vo.*;
|
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.apache.poi.ss.formula.functions.T;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
@ -39,6 +40,8 @@ public interface PlanSubDetailMapper extends BaseMapperX<PlanSubDetailDO> {
|
|||||||
|
|
||||||
return selectPage(reqVO, query);
|
return selectPage(reqVO, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int deletedSubById(@Param("id")Long id);
|
||||||
default PageResult<PlanSubDetailDO> selectPage(PlanSubDetailPageReqVO reqVO) {
|
default PageResult<PlanSubDetailDO> selectPage(PlanSubDetailPageReqVO reqVO) {
|
||||||
MPJLambdaWrapper<PlanSubDetailDO> query = new MPJLambdaWrapper<>();
|
MPJLambdaWrapper<PlanSubDetailDO> query = new MPJLambdaWrapper<>();
|
||||||
|
|
||||||
|
@ -125,10 +125,10 @@ public class PlanSubServiceImpl implements PlanSubService {
|
|||||||
in2DDO.setTwoDimDate(planSubSaveReqVO.getTwoDimDate());
|
in2DDO.setTwoDimDate(planSubSaveReqVO.getTwoDimDate());
|
||||||
in2DDO.setProjectPlanId(planSubSaveReqVO.getProjectPlanId());
|
in2DDO.setProjectPlanId(planSubSaveReqVO.getProjectPlanId());
|
||||||
in2DDO.setStartTwoDimDate(planSubSaveReqVO.getStartTwoDimDate());
|
in2DDO.setStartTwoDimDate(planSubSaveReqVO.getStartTwoDimDate());
|
||||||
in2DDO.setTwoDimOwner(Long.valueOf(planSubSaveReqVO.getBlankOwner()));
|
in2DDO.setTwoDimOwner(Long.valueOf(planSubSaveReqVO.getTwoDimOwner()));
|
||||||
in2DDO.setSubType("BLUEPRINT_2D");
|
in2DDO.setSubType("BLUEPRINT_2D");
|
||||||
in2DDO.setSeqNo(1L);
|
in2DDO.setSeqNo(1L);
|
||||||
in2DDO.setDesignNum(Long.valueOf(planSubSaveReqVO.getBlankNum()));
|
in2DDO.setDesignNum(Long.valueOf(planSubSaveReqVO.getTwoDimNum()));
|
||||||
in2DDO.setName(planSubSaveReqVO.getName());
|
in2DDO.setName(planSubSaveReqVO.getName());
|
||||||
in2DDO.setCode(projectOrderDO.getCode());
|
in2DDO.setCode(projectOrderDO.getCode());
|
||||||
details.add(in2DDO);
|
details.add(in2DDO);
|
||||||
@ -144,10 +144,10 @@ public class PlanSubServiceImpl implements PlanSubService {
|
|||||||
in3DDO.setProjectSubCode(planSubSaveReqVO.getProjectSubCode());
|
in3DDO.setProjectSubCode(planSubSaveReqVO.getProjectSubCode());
|
||||||
in3DDO.setTwoDimDate(planSubSaveReqVO.getThreeDimDate());
|
in3DDO.setTwoDimDate(planSubSaveReqVO.getThreeDimDate());
|
||||||
in3DDO.setStartTwoDimDate(planSubSaveReqVO.getStartThreeDimDate());
|
in3DDO.setStartTwoDimDate(planSubSaveReqVO.getStartThreeDimDate());
|
||||||
in3DDO.setTwoDimOwner(Long.valueOf(planSubSaveReqVO.getBlankOwner()));
|
in3DDO.setTwoDimOwner(Long.valueOf(planSubSaveReqVO.getThreeDimOwner()));
|
||||||
in3DDO.setSubType("BLUEPRINT_3D");
|
in3DDO.setSubType("BLUEPRINT_3D");
|
||||||
in3DDO.setSeqNo(1L);
|
in3DDO.setSeqNo(1L);
|
||||||
in3DDO.setDesignNum(Long.valueOf(planSubSaveReqVO.getBlankNum()));
|
in3DDO.setDesignNum(Long.valueOf(planSubSaveReqVO.getThreeDimNum()));
|
||||||
in3DDO.setName(planSubSaveReqVO.getName());
|
in3DDO.setName(planSubSaveReqVO.getName());
|
||||||
in3DDO.setCode(projectOrderDO.getCode());
|
in3DDO.setCode(projectOrderDO.getCode());
|
||||||
details.add(in3DDO);
|
details.add(in3DDO);
|
||||||
|
@ -87,8 +87,9 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
|||||||
PlanSubDetailDO planSubDetailDO = planSubDetailMapper.selectById(id);
|
PlanSubDetailDO planSubDetailDO = planSubDetailMapper.selectById(id);
|
||||||
// 获取当前日期时间
|
// 获取当前日期时间
|
||||||
LocalDateTime now = LocalDateTime.now();
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
LocalDateTime startDate = now.with(LocalTime.MIN);
|
||||||
// 判断 当前时间是否在startTwoDimDate之后
|
// 判断 当前时间是否在startTwoDimDate之后
|
||||||
boolean isGreaterThanCurrent = now.isAfter(planSubDetailDO.getStartTwoDimDate());
|
boolean isGreaterThanCurrent = startDate.compareTo(planSubDetailDO.getStartTwoDimDate()) > 0;
|
||||||
if (isGreaterThanCurrent) return CommonResult.error(400,"当前日期>开始日期,不允许删除");
|
if (isGreaterThanCurrent) return CommonResult.error(400,"当前日期>开始日期,不允许删除");
|
||||||
if (ObjectUtil.isNotEmpty(planSubDetailDO.getIsOverProcess()) && planSubDetailDO.getIsOverProcess() == 2 && planSubDetailDO.getSeqNo()==1){
|
if (ObjectUtil.isNotEmpty(planSubDetailDO.getIsOverProcess()) && planSubDetailDO.getIsOverProcess() == 2 && planSubDetailDO.getSeqNo()==1){
|
||||||
return CommonResult.error(400,"该设计已报工,不允许删除");
|
return CommonResult.error(400,"该设计已报工,不允许删除");
|
||||||
@ -155,7 +156,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
planSubMapper.update(lambdaUpdateWrapper);
|
planSubMapper.update(lambdaUpdateWrapper);
|
||||||
planSubDetailMapper.delete(new LambdaUpdateWrapper<PlanSubDetailDO>().eq(PlanSubDetailDO::getId,id));
|
planSubDetailMapper.deletedSubById(id);
|
||||||
return CommonResult.success(true);
|
return CommonResult.success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,9 +302,9 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
|||||||
wrapper.gt(PlanSubDetailDO::getSeqNo,updateReqVO.getSeqNo());
|
wrapper.gt(PlanSubDetailDO::getSeqNo,updateReqVO.getSeqNo());
|
||||||
if (planSubDetailMapper.selectCount(wrapper)>0) return CommonResult.error(400,"该子项目存在多时间段派工,不允许从中间修改!");
|
if (planSubDetailMapper.selectCount(wrapper)>0) return CommonResult.error(400,"该子项目存在多时间段派工,不允许从中间修改!");
|
||||||
LambdaQueryWrapper<PlanSubDetailDO> queryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<PlanSubDetailDO> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
// queryWrapper.eq(PlanSubDetailDO::getProjectSubId,updateReqVO.getProjectSubId());
|
queryWrapper.eq(PlanSubDetailDO::getProjectSubId,updateReqVO.getProjectSubId());
|
||||||
queryWrapper.eq(PlanSubDetailDO::getTwoDimOwner,updateReqVO.getTwoDimOwner());
|
// queryWrapper.eq(PlanSubDetailDO::getTwoDimOwner,updateReqVO.getTwoDimOwner());
|
||||||
// queryWrapper.eq(PlanSubDetailDO::getSubType,updateReqVO.getSubType());
|
queryWrapper.eq(PlanSubDetailDO::getSubType,updateReqVO.getSubType());
|
||||||
if (ObjectUtil.isNotEmpty(updateReqVO.getId())){
|
if (ObjectUtil.isNotEmpty(updateReqVO.getId())){
|
||||||
queryWrapper.ne(PlanSubDetailDO::getId,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<>();
|
List<PlanSubDetailDO> newList = new ArrayList<>();
|
||||||
newList.addAll(list);
|
newList.addAll(list);
|
||||||
if (ObjectUtil.isNotEmpty(updateReqVO.getId())){
|
if (ObjectUtil.isNotEmpty(updateReqVO.getId())){
|
||||||
@ -390,13 +391,25 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
|||||||
planSubDetailDO.setDesignNum(updateReqVO.getDesignNum());
|
planSubDetailDO.setDesignNum(updateReqVO.getDesignNum());
|
||||||
planSubDetailDO.setCode(updateReqVO.getCode());
|
planSubDetailDO.setCode(updateReqVO.getCode());
|
||||||
newList.add(planSubDetailDO);
|
newList.add(planSubDetailDO);
|
||||||
newList.sort(Comparator.comparing(PlanSubDetailDO::getStartTwoDimDate, Comparator.nullsLast(Comparator.naturalOrder())));
|
// 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
|
|
||||||
}
|
|
||||||
planSubDetailMapper.insertOrUpdateBatch(newList);
|
planSubDetailMapper.insertOrUpdateBatch(newList);
|
||||||
|
LambdaQueryWrapper<PlanSubDetailDO> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
|
||||||
Map<Long, List<PlanSubDetailDO>> collect = newList.stream().collect(Collectors.groupingBy(PlanSubDetailDO::getProjectSubId));
|
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()) {
|
for (Map.Entry<Long, List<PlanSubDetailDO>> entry : collect.entrySet()) {
|
||||||
Long subId = entry.getKey();
|
Long subId = entry.getKey();
|
||||||
List<PlanSubDetailDO> subList = entry.getValue();
|
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);
|
planSubDetailMapper.updateBatch(list);
|
||||||
//更新表主表数据
|
//更新表主表数据
|
||||||
//先看有多少个子项目
|
//先看有多少个子项目
|
||||||
@ -1064,6 +1087,9 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
|||||||
return CommonResult.success(updateReqVO);
|
return CommonResult.success(updateReqVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行插活逻辑
|
||||||
|
*/
|
||||||
private List<PlanSubDetailDO> performInsertLogic(List<PlanSubDetailDO> baseList,
|
private List<PlanSubDetailDO> performInsertLogic(List<PlanSubDetailDO> baseList,
|
||||||
List<PlanSubDetailDO> insertList,
|
List<PlanSubDetailDO> insertList,
|
||||||
List<LocalDateTime> holidayList) {
|
List<LocalDateTime> holidayList) {
|
||||||
@ -1245,7 +1271,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
|||||||
remainingItem.setProjectPlanSubId(interruptedItem.getProjectPlanSubId());
|
remainingItem.setProjectPlanSubId(interruptedItem.getProjectPlanSubId());
|
||||||
remainingItem.setProjectSubCode(interruptedItem.getProjectSubCode());
|
remainingItem.setProjectSubCode(interruptedItem.getProjectSubCode());
|
||||||
remainingItem.setTwoDimOwner(interruptedItem.getTwoDimOwner());
|
remainingItem.setTwoDimOwner(interruptedItem.getTwoDimOwner());
|
||||||
remainingItem.setProjectSubId(interruptedItem.getProjectPlanSubId());
|
remainingItem.setProjectSubId(interruptedItem.getProjectSubId());
|
||||||
remainingItem.setSubType(interruptedItem.getSubType());
|
remainingItem.setSubType(interruptedItem.getSubType());
|
||||||
remainingItem.setName(interruptedItem.getName());
|
remainingItem.setName(interruptedItem.getName());
|
||||||
remainingItem.setCode(interruptedItem.getCode());
|
remainingItem.setCode(interruptedItem.getCode());
|
||||||
@ -1260,8 +1286,12 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
|||||||
// 12. 添加剩余的插活数据(未被合并的)
|
// 12. 添加剩余的插活数据(未被合并的)
|
||||||
resultList.addAll(remainingInsertList);
|
resultList.addAll(remainingInsertList);
|
||||||
|
|
||||||
// 13. 处理剩余的baseList
|
// 13. 处理剩余的baseList(被打断的剩余部分 + 原本在插活数据之后的)
|
||||||
if (!remainingBaseList.isEmpty() || !afterInsertList.isEmpty()) {
|
List<PlanSubDetailDO> allRemainingList = new ArrayList<>();
|
||||||
|
allRemainingList.addAll(remainingBaseList);
|
||||||
|
allRemainingList.addAll(afterInsertList);
|
||||||
|
|
||||||
|
if (!allRemainingList.isEmpty()) {
|
||||||
// 获取插活数据的最后结束时间
|
// 获取插活数据的最后结束时间
|
||||||
final LocalDateTime lastInsertEndTime;
|
final LocalDateTime lastInsertEndTime;
|
||||||
if (mergedBaseItem != null) {
|
if (mergedBaseItem != null) {
|
||||||
@ -1273,21 +1303,23 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
|||||||
.orElse(null);
|
.orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理被打断的剩余部分
|
// 从插活数据的下一天开始顺延
|
||||||
for (PlanSubDetailDO baseItem : remainingBaseList) {
|
LocalDateTime baseStartTime = lastInsertEndTime.plusDays(1);
|
||||||
// 从插活数据的下一天开始计算
|
|
||||||
LocalDateTime newStartTime = lastInsertEndTime.plusDays(1);
|
for (PlanSubDetailDO baseItem : allRemainingList) {
|
||||||
// 如果遇到节假日,继续跳过
|
// 找到下一个非节假日开始时间
|
||||||
newStartTime = findNextNonHoliday(newStartTime, holidayList);
|
LocalDateTime newStartTime = findNextNonHoliday(baseStartTime, holidayList);
|
||||||
|
|
||||||
|
// 根据designNum计算结束日期(包含节假日)
|
||||||
LocalDateTime newEndTime = calculateEndDateByWorkDays(newStartTime, baseItem.getDesignNum(), holidayList);
|
LocalDateTime newEndTime = calculateEndDateByWorkDays(newStartTime, baseItem.getDesignNum(), holidayList);
|
||||||
|
|
||||||
PlanSubDetailDO newBaseItem = createBaseItem(baseItem, newStartTime, newEndTime);
|
PlanSubDetailDO newBaseItem = createBaseItem(baseItem, newStartTime, newEndTime);
|
||||||
newBaseItem.setDesignNum(baseItem.getDesignNum()); // 保持原始designNum
|
newBaseItem.setDesignNum(baseItem.getDesignNum()); // 保持原始designNum
|
||||||
resultList.add(newBaseItem);
|
resultList.add(newBaseItem);
|
||||||
}
|
|
||||||
|
|
||||||
// 处理原本在插活数据之后的baseList(保持原样)
|
// 更新下一个baseItem的开始时间
|
||||||
resultList.addAll(afterInsertList);
|
baseStartTime = newEndTime.plusDays(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 14. 按开始时间排序
|
// 14. 按开始时间排序
|
||||||
@ -1295,7 +1327,6 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
|||||||
|
|
||||||
return resultList;
|
return resultList;
|
||||||
}
|
}
|
||||||
|
|
||||||
private LocalDateTime findNextNonHoliday(LocalDateTime startDate, List<LocalDateTime> holidayList) {
|
private LocalDateTime findNextNonHoliday(LocalDateTime startDate, List<LocalDateTime> holidayList) {
|
||||||
LocalDateTime current = startDate;
|
LocalDateTime current = startDate;
|
||||||
while (holidayList.contains(current)) {
|
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()
|
getList()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
message.error('失败:' + error.message)
|
// message.error('失败:' + error.message)
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false
|
loading.value = false
|
||||||
}
|
}
|
||||||
@ -632,12 +632,14 @@ const modification = async (row) => {
|
|||||||
if (res.list) {
|
if (res.list) {
|
||||||
//弹框
|
//弹框
|
||||||
currentRow.value = row
|
currentRow.value = row
|
||||||
beforeList.value = res.list
|
res.list.forEach(item =>{
|
||||||
|
beforeList.value.push(item)
|
||||||
|
})
|
||||||
insertList.value = res.list
|
insertList.value = res.list
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
dialogTitle.value = '插活前'
|
dialogTitle.value = '插活前'
|
||||||
} else {
|
} else {
|
||||||
await getList()
|
getList()
|
||||||
message.success('修改成功')
|
message.success('修改成功')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user