feat(system): 优化工艺流程与计划任务进度逻辑

- 新增 commons-io 依赖
- 移除部分任务默认进度设置,改为动态计算
- 调整计划任务查询逻辑,仅筛选未结束任务
- 新增根据项目编号查询及更新计划订单的方法
- 优化任务进度计算,支持按天数比例动态设置进度值
- 调整任务状态字段类型为字符串以支持更丰富的状态描述
This commit is contained in:
tzy 2025-06-27 09:35:42 +08:00
parent d1e67b1b4e
commit 55a2143a02
9 changed files with 74 additions and 21 deletions

View File

@ -235,6 +235,12 @@
<artifactId>knife4j-springdoc-ui</artifactId> <artifactId>knife4j-springdoc-ui</artifactId>
<version>3.0.3</version> <version>3.0.3</version>
</dependency> </dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.15.0</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -208,7 +208,7 @@ public class WorkProcedureController extends BaseController {
task.setDuration(duration); task.setDuration(duration);
task.setOpen(true); task.setOpen(true);
task.setProgress(1L); // task.setProgress(1L);
task.setStatus("yellow"); task.setStatus("yellow");
task.setParent(null); // 父任务没有parent task.setParent(null); // 父任务没有parent
@ -227,7 +227,7 @@ public class WorkProcedureController extends BaseController {
subTask.setEnd_date(subTaskItem.getString("FOperPlanFinishTime2")); subTask.setEnd_date(subTaskItem.getString("FOperPlanFinishTime2"));
subTask.setDuration(subTaskItem.getLong("1")); subTask.setDuration(subTaskItem.getLong("1"));
subTask.setOpen(true); subTask.setOpen(true);
subTask.setProgress(1L); // subTask.setProgress(1L);
subTask.setStatus("yellow"); subTask.setStatus("yellow");
subTask.setParent(task.getId()); // 设置父任务ID subTask.setParent(task.getId()); // 设置父任务ID

View File

@ -52,13 +52,11 @@ public class ProcessOrderProBo extends BaseEntity {
/** /**
* 计划结束时间 * 计划结束时间
*/ */
@NotNull(message = "计划结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date planEndTime; private Date planEndTime;
/** /**
* 计划开始时间 * 计划开始时间
*/ */
@NotNull(message = "计划开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date planStartTime; private Date planStartTime;

View File

@ -18,7 +18,7 @@ public class ProductctionPlanGatteDto {
private Integer type; private Integer type;
private Boolean open; private Boolean open;
private String toolTipsTxt; private String toolTipsTxt;
private Long progress; private String progress;
private String status; private String status;
private String level; private String level;
private String color; private String color;

View File

@ -1,6 +1,7 @@
package com.ruoyi.system.mapper; package com.ruoyi.system.mapper;
import com.ruoyi.system.domain.ProcessOrderPro; import com.ruoyi.system.domain.ProcessOrderPro;
import com.ruoyi.system.domain.bo.ProcessOrderProBo;
import com.ruoyi.system.domain.vo.ProcessOrderProVo; import com.ruoyi.system.domain.vo.ProcessOrderProVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.common.core.mapper.BaseMapperPlus;
@ -11,5 +12,15 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
* @date 2024-10-22 * @date 2024-10-22
*/ */
public interface ProcessOrderProMapper extends BaseMapperPlus<ProcessOrderProMapper, ProcessOrderPro, ProcessOrderProVo> { public interface ProcessOrderProMapper extends BaseMapperPlus<ProcessOrderProMapper, ProcessOrderPro, ProcessOrderProVo> {
/**
* 根据项目编号routeDescription查询订单信息
* @param routeDescription 项目编号
* @return ProcessOrderProBo 返回相关的订单信息
*/
ProcessOrderPro selectByProjectNumber(String routeDescription);
/**
* 根据 ProcessOrderProBo 更新记录
* @param processOrderPro 更新的订单信息
*/
void updateByBo(ProcessOrderPro processOrderPro);
} }

View File

@ -343,8 +343,10 @@ public class EleMaterialsServiceImpl implements IEleMaterialsService {
} }
newMaterialsVo.setMaterialCode(newCode); newMaterialsVo.setMaterialCode(newCode);
log.info("生成新的物料编码======================>: {}", newCode);
EleMaterials eleMaterials = BeanUtil.copyProperties(newMaterialsVo, EleMaterials.class); EleMaterials eleMaterials = BeanUtil.copyProperties(newMaterialsVo, EleMaterials.class);
eleMaterials.setMaterialValue("0"); eleMaterials.setMaterialValue("0");
baseMapper.insert(eleMaterials);
// 仅在有编码的情况下添加到插入列表和导出列表 // 仅在有编码的情况下添加到插入列表和导出列表
eleMaterialsList.add(eleMaterials); // 添加到插入列表 eleMaterialsList.add(eleMaterials); // 添加到插入列表
allMaterialsList.add(newMaterialsVo); // 添加到导出列表 allMaterialsList.add(newMaterialsVo); // 添加到导出列表

View File

@ -73,6 +73,7 @@ public class ProcessRouteServiceImpl implements IProcessRouteService {
private final MaterialBomMapper materialBomMapper; private final MaterialBomMapper materialBomMapper;
private final ProcessInfoMapper processInfoMapper; private final ProcessInfoMapper processInfoMapper;
private final ProductionRouteTwoMapper productionRouteTwoMapper; private final ProductionRouteTwoMapper productionRouteTwoMapper;
private final ProcessOrderProMapper iProcessOrderProService;
private static final Logger log = LoggerFactory.getLogger(ProcessRouteController.class); private static final Logger log = LoggerFactory.getLogger(ProcessRouteController.class);
private static final Logger logger = LoggerFactory.getLogger(IProcessRouteService.class); private static final Logger logger = LoggerFactory.getLogger(IProcessRouteService.class);
@ -571,15 +572,15 @@ public class ProcessRouteServiceImpl implements IProcessRouteService {
.max(Comparator.comparing(ProcessRoute::getXuEndTime)) .max(Comparator.comparing(ProcessRoute::getXuEndTime))
.map(ProcessRoute::getXuEndTime) .map(ProcessRoute::getXuEndTime)
.orElse(null); .orElse(null);
/* //更新至计划模块中 //更新至计划模块中
if (earliestStartTime != null && latestEndTime != null) { if (earliestStartTime != null && latestEndTime != null) {
ProcessOrderProBo processOrderPro = iProcessOrderProService.selectByProjectNumber(processRoutes.get(0).getRouteDescription()); ProcessOrderPro processOrderPro = iProcessOrderProService.selectByProjectNumber(processRoutes.get(0).getRouteDescription());
processOrderPro.setPlanStartTime(earliestStartTime); processOrderPro.setPlanStartTime(earliestStartTime);
processOrderPro.setPlanEndTime(latestEndTime); processOrderPro.setPlanEndTime(latestEndTime);
processOrderPro.setUpdateTime(new Date()); processOrderPro.setUpdateTime(new Date());
log.info("更新计划生成令号为:{},计划开始时间:{},计划结束时间:{}",processRoutes.get(0).getRouteDescription(), earliestStartTime, latestEndTime); log.info("更新计划生成令号为:{},计划开始时间:{},计划结束时间:{}",processRoutes.get(0).getRouteDescription(), earliestStartTime, latestEndTime);
iProcessOrderProService.updateByBo(processOrderPro); iProcessOrderProService.updateByBo(processOrderPro);
}*/ }
if (allEmpty && !processRoutes.isEmpty()) { if (allEmpty && !processRoutes.isEmpty()) {
List<String> duplicateWeldingMaterials = processRoutes.stream() List<String> duplicateWeldingMaterials = processRoutes.stream()

View File

@ -24,6 +24,7 @@ import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal; import java.time.temporal.Temporal;
@ -73,7 +74,7 @@ public class WorkProcedureServiceImpl implements IWorkProcedureService {
parentTask.setText(processRoute.getRouteDescription()); parentTask.setText(processRoute.getRouteDescription());
parentTask.setOpen(true); parentTask.setOpen(true);
parentTask.setToolTipsTxt(processRoute.getRouteDescription()); parentTask.setToolTipsTxt(processRoute.getRouteDescription());
parentTask.setProgress(1L); // parentTask.setProgress(1L);
parentTask.setStatus("yellow"); parentTask.setStatus("yellow");
parentTask.setParent(null); parentTask.setParent(null);
@ -168,7 +169,12 @@ public class WorkProcedureServiceImpl implements IWorkProcedureService {
// ================= 1. 查询近2个月的父任务ProcessOrderPro ================= // ================= 1. 查询近2个月的父任务ProcessOrderPro =================
LambdaQueryWrapper<ProcessOrderPro> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ProcessOrderPro> wrapper = new LambdaQueryWrapper<>();
wrapper.between(ProcessOrderPro::getCreateTime, LocalDate.now().minusMonths(2), LocalDate.now()); //只查询未完成的项目也就是 结束时间大于今天
LocalDateTime now = LocalDateTime.now();
LocalDateTime twoMonthsAgo = now.minusMonths(2);
wrapper.ge(ProcessOrderPro::getPlanEndTime, now) // 未结束结束时间 > 当前时间
.ge(ProcessOrderPro::getPlanStartTime, twoMonthsAgo); //
List<ProcessOrderPro> processOrderPros = processOrderProMapper.selectList(wrapper); List<ProcessOrderPro> processOrderPros = processOrderProMapper.selectList(wrapper);
@ -202,7 +208,7 @@ public class WorkProcedureServiceImpl implements IWorkProcedureService {
parentTask.setText(pro.getProductionOrderNo()); parentTask.setText(pro.getProductionOrderNo());
parentTask.setOpen(false); parentTask.setOpen(false);
parentTask.setToolTipsTxt(pro.getDrawingNo()); parentTask.setToolTipsTxt(pro.getDrawingNo());
parentTask.setProgress(1L); /* parentTask.setProgress(1L);*/
parentTask.setStatus("yellow"); parentTask.setStatus("yellow");
parentTask.setParent(null); parentTask.setParent(null);
parentTask.setStart_date(sdf.format(proBo.getPlanStartTime())); parentTask.setStart_date(sdf.format(proBo.getPlanStartTime()));
@ -248,20 +254,31 @@ public class WorkProcedureServiceImpl implements IWorkProcedureService {
start.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), start.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(),
end.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() end.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()
); );
// 计算当前时间与开始时间的差单位
long elapsedDays = ChronoUnit.DAYS.between(
start.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(),
LocalDate.now() // 当前日期
);
// 计算进度百分比确保不超过100%
double progress = 0;
if (duration > 0) {
progress = (double) elapsedDays / duration;
progress = Math.min(progress, 1.0); // 防止进度超过100%
}
ProductctionPlanGatteDto subTask = new ProductctionPlanGatteDto(); ProductctionPlanGatteDto subTask = new ProductctionPlanGatteDto();
subTask.setId(route.getId()); subTask.setId(route.getId());
subTask.setText( subTask.setText(
cleanProcessNo(String.valueOf(route.getProcessNo())) + " " + route.getProcessNo() + " " + route.getProcessName()+ " " +
route.getMaterialCode() + " " + route.getMaterialCode()
route.getMaterialName() + " " +
route.getProcessName()
); );
subTask.setStart_date(sdf.format(start)); subTask.setStart_date(sdf.format(start));
subTask.setEnd_date(sdf.format(end)); subTask.setEnd_date(sdf.format(end));
subTask.setDuration(duration); subTask.setDuration(duration);
subTask.setToolTipsTxt(route.getProcessName()); subTask.setToolTipsTxt(route.getProcessName());
subTask.setProgress(1L); /* subTask.setProgress(1L);*/
//计算进度计算 整体数加上 已经过了的天数百分比保留以为小数
subTask.setProgress(String.valueOf(progress));
subTask.setStatus("yellow"); subTask.setStatus("yellow");
// 工序号处理去除所有0 // 工序号处理去除所有0
@ -406,7 +423,7 @@ public class WorkProcedureServiceImpl implements IWorkProcedureService {
parentTask.setOpen(true); // 默认展开 parentTask.setOpen(true); // 默认展开
parentTask.setToolTipsTxt(plan.getFigureName()); // 设置工具提示文本 parentTask.setToolTipsTxt(plan.getFigureName()); // 设置工具提示文本
parentTask.setProgress(1L); // 设置进度 //parentTask.setProgress(1L); // 设置进度
parentTask.setStatus("yellow"); // 设置状态 parentTask.setStatus("yellow"); // 设置状态
parentTask.setParent(null); // 父任务没有parent parentTask.setParent(null); // 父任务没有parent
tasks.add(parentTask); // 添加到任务列表 tasks.add(parentTask); // 添加到任务列表
@ -467,7 +484,7 @@ public class WorkProcedureServiceImpl implements IWorkProcedureService {
} }
subTask.setToolTipsTxt(procedure.getToolTipsTxt()); // 设置工具提示文本 subTask.setToolTipsTxt(procedure.getToolTipsTxt()); // 设置工具提示文本
subTask.setProgress(1L); // 设置进度 // subTask.setProgress(1L); // 设置进度
subTask.setStatus(procedure.getStatus()); // 设置状态 subTask.setStatus(procedure.getStatus()); // 设置状态
subTask.setParent(procedure.getPlanId()); // 设置父任务ID subTask.setParent(procedure.getPlanId()); // 设置父任务ID
tasks.add(subTask); // 添加到任务列表 tasks.add(subTask); // 添加到任务列表

View File

@ -17,6 +17,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="planEndTime" column="plan_end_time"/> <result property="planEndTime" column="plan_end_time"/>
<result property="planStartTime" column="plan_start_time"/> <result property="planStartTime" column="plan_start_time"/>
</resultMap> </resultMap>
<!-- 根据项目编号查询 -->
<select id="selectByProjectNumber" resultType="com.ruoyi.system.domain.ProcessOrderPro">
SELECT id, production_order_no, production_name, drawing_no, drawing_name,
plan_end_time, plan_start_time, create_by, create_time, update_by, update_time
FROM process_order_pro
WHERE production_order_no = #{routeDescription}
</select>
<!-- 更新记录 -->
<update id="updateByBo">
UPDATE process_order_pro
SET production_order_no = #{productionOrderNo},
production_name = #{productionName},
drawing_no = #{drawingNo},
drawing_name = #{drawingName},
plan_end_time = #{planEndTime},
plan_start_time = #{planStartTime},
create_by = #{createBy},
update_by = #{updateBy}
WHERE id = #{id}
</update>
</mapper> </mapper>