零件进程管理

This commit is contained in:
z 2026-01-07 09:35:49 +08:00
parent c60a522230
commit 605dbfd5ca
18 changed files with 1767 additions and 171 deletions

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.plansubdetail;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.heli.service.plansub.PlanSubService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@ -159,4 +160,29 @@ public class PlanSubDetailController {
public CommonResult<List<PlanSubDetailDO>> getList(@Valid PlanSubDetailPageReqVO pageReqVO) {
return success( planSubDetailService.getList(pageReqVO));
}
@GetMapping("/getList1")
@PreAuthorize("@ss.hasPermission('heli:plan-sub-detail:query')")
public CommonResult<List<PlanSubDetailDO>> getList1(@Valid PlanSubDetailPageReqVO pageReqVO) {
return success( planSubDetailService.getList1(pageReqVO));
}
@GetMapping("/getList2")
@PreAuthorize("@ss.hasPermission('heli:plan-sub-detail:query')")
public CommonResult<List<TaskDispatchDetailDO>> getList2(@Valid PlanSubDetailPageReqVO pageReqVO) {
return success( planSubDetailService.getList2(pageReqVO));
}
@GetMapping("/getList3")
@PreAuthorize("@ss.hasPermission('heli:plan-sub-detail:query')")
public CommonResult<List<TaskDispatchDetailDO>> getList3(@Valid PlanSubDetailPageReqVO pageReqVO) {
return success( planSubDetailService.getList3(pageReqVO));
}
@GetMapping("/getList4")
@PreAuthorize("@ss.hasPermission('heli:plan-sub-detail:query')")
public CommonResult<List<TaskDispatchDetailDO>> getList4(@Valid PlanSubDetailPageReqVO pageReqVO) {
return success( planSubDetailService.getList4(pageReqVO));
}
@GetMapping("/getList5")
@PreAuthorize("@ss.hasPermission('heli:plan-sub-detail:query')")
public CommonResult<List<TaskDispatchDetailDO>> getList5(@Valid PlanSubDetailPageReqVO pageReqVO) {
return success( planSubDetailService.getList5(pageReqVO));
}
}

View File

@ -122,11 +122,13 @@ public class ProjectOrderController {
}
}
}
Set<String> nameSimSet = new HashSet<>();
for (ProjectOrderSubDO projectOrderSub : operateReqVO.getProjectOrderSubs()) {
String nameSim = projectOrderSub.getNameSim();
if (!nameSimSet.add(nameSim)) {
return CommonResult.error(400,"该项目下子项目简码不能重复,请确认!");
if (ObjectUtil.isNotEmpty(operateReqVO.getProjectOrderSubs())){
Set<String> nameSimSet = new HashSet<>();
for (ProjectOrderSubDO projectOrderSub : operateReqVO.getProjectOrderSubs()) {
String nameSim = projectOrderSub.getNameSim();
if (!nameSimSet.add(nameSim)) {
return CommonResult.error(400,"该项目下子项目简码不能重复,请确认!");
}
}
}
projectOrderService.operateProjectOrder(operateReqVO);
@ -146,7 +148,7 @@ public class ProjectOrderController {
orderYsService.createOrUpdate(operateReqVO);
// 订单批准时创建或者更新生产计划数据
crossOrderManager.generatePlan(operateReqVO.getId());
// projectOrderService.createProjectOrderSnapshot(operateReqVO);
// projectOrderService.createProjectOrderSnapshot(operateReqVO);
break;
case TERMINATE:
orderYsService.delete(operateReqVO);

View File

@ -1,6 +1,8 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.plansubdetail;
import lombok.*;
import java.math.BigDecimal;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
@ -115,6 +117,14 @@ public class PlanSubDetailDO extends BaseDO {
//生产进度
@TableField(exist = false)
private String productionSchedule;
@TableField(exist = false)
private String type;
@TableField(exist = false)
private BigDecimal workHours;
@TableField(exist = false)
private String percentage;
@TableField(exist = false)
private String PercentageFlag;
@TableField(exist = false)
private Date time;
}

View File

@ -3,6 +3,7 @@ package com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch;
import com.baomidou.mybatisplus.annotation.*;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
import io.swagger.v3.oas.models.security.SecurityScheme;
import kotlin.jvm.internal.Lambda;
import lombok.*;
import org.apache.poi.hpsf.Date;
@ -261,4 +262,20 @@ public class TaskDispatchDetailDO extends BaseDO {
private Integer receivingStatus;
@TableField(exist = false)
private Integer mplanStatus;
@TableField(exist = false)
private String partsProcurement;
@TableField(exist = false)
private String receiving;
@TableField(exist = false)
private String receivingFlag;
@TableField(exist = false)
private LocalDateTime receivingTime;
@TableField(exist = false)
private String percentage;
@TableField(exist = false)
private String report;
@TableField(exist = false)
private String reportFlag;
@TableField(exist = false)
private String finishedProduct;
}

View File

@ -316,10 +316,10 @@ public interface PlanSubMapper extends BaseMapperX<PlanSubDO> {
query.eq(ProjectOrderSubDO::getDeleted,0);
query.eq(CustomerDO::getDeleted,0);
query.eq(PlanDO::getDeleted,0);
query.eq(ObjectUtil.isNotEmpty(pageReqVO.getProjectCode()), ProjectOrderDO::getCode, pageReqVO.getProjectCode());
query.eq(ObjectUtil.isNotEmpty(pageReqVO.getProjectName()), ProjectOrderDO::getProjectName, pageReqVO.getProjectName());
query.eq(ObjectUtil.isNotEmpty(pageReqVO.getProjectSubName()), ProjectOrderSubDO::getName, pageReqVO.getProjectSubName());
query.eq(ObjectUtil.isNotEmpty(pageReqVO.getCustomerName()), CustomerDO::getName, pageReqVO.getCustomerName());
query.like(ObjectUtil.isNotEmpty(pageReqVO.getProjectCode()), ProjectOrderDO::getCode, pageReqVO.getProjectCode());
query.like(ObjectUtil.isNotEmpty(pageReqVO.getProjectName()), ProjectOrderDO::getProjectName, pageReqVO.getProjectName());
query.like(ObjectUtil.isNotEmpty(pageReqVO.getProjectSubName()), ProjectOrderSubDO::getName, pageReqVO.getProjectSubName());
query.like(ObjectUtil.isNotEmpty(pageReqVO.getCustomerName()), CustomerDO::getName, pageReqVO.getCustomerName());
query.orderByAsc(ProjectOrderDO::getCode);
return selectPage(pageReqVO, query);
}

View File

@ -18,9 +18,11 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
/**
* 工艺设计 Mapper
@ -395,4 +397,11 @@ public interface ProcessDesignMapper extends BaseMapperX<ProcessDesignDO> {
}
@Delete("delete from pro_process_design where project_id = #{id}")
void deleteOrderId(@Param("id") Long id);
@Select("SELECT pd.* FROM pro_process_design pd " +
"INNER JOIN project_plan_sub_detail psd ON psd.project_sub_id = pd.project_sub_id " +
"AND psd.sub_type = pd.process_design_type " +
"WHERE pd.project_sub_id = #{projectSubId} " +
"AND pd.process_design_type IN ('BLUEPRINT_3D', 'BLUEPRINT_2D', 'BLUEPRINT_WORKBLANK')")
List<ProcessDesignDO> selectWithDetailExists(@Param("projectSubId") Long projectSubId);
}

View File

@ -904,7 +904,15 @@ public interface TaskDispatchDetailMapper extends BaseMapperX<TaskDispatchDetail
MPJLambdaWrapper<TaskDispatchDetailDO> query = new MPJLambdaWrapper<>();
query.selectAll(TaskDispatchDetailDO.class)
.select("a.bom_detail_id as bomDetailId")
.leftJoin(TaskDispatchDO.class,"a",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId);
.select("b.material_name as materialName","c.name as projectSubName")
.select("d.name as procedureName","u.nickname as ownerName")
.leftJoin(TaskDispatchDO.class,"a",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId)
.leftJoin(ProcessBomDetailDO.class,"b",ProcessBomDetailDO::getId,TaskDispatchDO::getBomDetailId)
.leftJoin(ProjectOrderSubDO.class,"c",ProjectOrderSubDO::getId,TaskDispatchDO::getProjectSubId)
.leftJoin(ProcedureDO.class,"d",ProcedureDO::getId,TaskDispatchDetailDO::getProcedureId)
.leftJoin(AdminUserDO.class,"u",AdminUserDO::getId,TaskDispatchDetailDO::getOwner)
.orderByAsc(ProcessBomDetailDO::getMaterialName)
.orderByAsc(TaskDispatchDO::getCode);
query.eq(TaskDispatchDO::getProjectSubId,projectSubId);
query.eq(TaskDispatchDO::getDispatchType,"PRODUCTION");
query.eq(ObjectUtil.isNotEmpty(checkYn),TaskDispatchDetailDO::getCheckYn,checkYn);
@ -916,7 +924,13 @@ public interface TaskDispatchDetailMapper extends BaseMapperX<TaskDispatchDetail
MPJLambdaWrapper<TaskDispatchDetailDO> query = new MPJLambdaWrapper<>();
query.selectAll(TaskDispatchDetailDO.class)
.select("a.bom_detail_id as bomDetailId")
.leftJoin(TaskDispatchDO.class,"a",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId);
.select("d.name as procedureName","c.name as projectSubName")
.leftJoin(TaskDispatchDO.class,"a",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId)
.leftJoin(ProjectOrderSubDO.class,"c",ProjectOrderSubDO::getId,TaskDispatchDO::getProjectSubId)
.leftJoin(ProcedureDO.class,"d",ProcedureDO::getId,TaskDispatchDetailDO::getProcedureId)
.groupBy(TaskDispatchDetailDO::getId)
.orderByAsc(ProjectOrderSubDO::getName)
.orderByAsc(ProcedureDO::getName);
query.eq(TaskDispatchDO::getProjectSubId,projectSubId);
query.eq(TaskDispatchDO::getDispatchType,"ASSEMBLE");
return selectList(query);

View File

@ -230,4 +230,13 @@ public interface TaskDispatchMapper extends BaseMapperX<TaskDispatchDO> {
@Delete("delete from pro_task_dispatch where project_id=#{id}")
void deleteOrderId(@Param("id") Long id);
default List<TaskDispatchDO> selectByIds(List<Long> ids){
MPJLambdaWrapper<TaskDispatchDO> query = new MPJLambdaWrapper<>();
query.selectAll(TaskDispatchDO.class)
.select("a.craft_content as craftContent")
.leftJoin(PlanDO.class, "a", PlanDO::getId, TaskDispatchDO::getPlanId)
.in(TaskDispatchDO::getId, ids);
return selectList(query);
}
}

View File

@ -54,6 +54,7 @@ import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
@ -385,6 +386,7 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
}
@Override
@Transactional
public Boolean approval(Long id) {
PurchaseOrderMakeDO orderMakeDO = purchaseOrderMakeMapper.selectById(id);
if (orderMakeDO.getStatus() != 1) throw exception(new ErrorCode(400, "该单据状态非待审核,请刷新界面!"));
@ -402,7 +404,7 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
materialPlanBoom.setMplanStatus(2);
materialPlanBoomMapper.updateById(materialPlanBoom);
});
List<PurchaseOrderMakeDetailDO> list = purchaseOrderMakeDetailMapper.selectList("project_purchase_order_make_id", id);
List<PurchaseOrderMakeDetailDO> list = purchaseOrderMakeDetailMapper.selectList("purchase_order_id", id);
List<Long> ids = list.stream().map(PurchaseOrderMakeDetailDO::getId).collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(ids)){
LambdaUpdateWrapper<PurchaseOrderMakeDetailDO> updateWrapper = new LambdaUpdateWrapper<>();
@ -656,6 +658,15 @@ if (ObjectUtil.isNotEmpty(materialDO)){
public Boolean approvals(List<PurchaseOrderMakeDetailDO> list) {
if (ObjectUtil.isNotEmpty( list)){
List<Long> ids = list.stream().map(PurchaseOrderMakeDetailDO::getId).collect(Collectors.toList());
List<Long> orderIds = list.stream().map(PurchaseOrderMakeDetailDO::getPurchaseOrderId).collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(orderIds)){
LambdaUpdateWrapper<PurchaseOrderMakeDO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(PurchaseOrderMakeDO::getId, orderIds);
updateWrapper.set(PurchaseOrderMakeDO::getStatus,2);
updateWrapper.set(PurchaseOrderMakeDO::getAuditTime, LocalDateTime.now());
updateWrapper.set(PurchaseOrderMakeDO::getAuditor, getLoginUser().getId());
purchaseOrderMakeMapper.update(updateWrapper);
}
LambdaQueryWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(PurchaseOrderMakeDetailDO::getId, ids);
wrapper.ne(PurchaseOrderMakeDetailDO::getStatus,1);

View File

@ -3,6 +3,7 @@ package com.chanko.yunxi.mes.module.heli.service.plan;
import cn.hutool.core.util.ObjectUtil;
import cn.smallbun.screw.core.util.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.chanko.yunxi.mes.framework.common.exception.ErrorCode;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
@ -74,6 +75,7 @@ import java.util.stream.Collectors;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PROJECT_PLAN;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PROJECT_PLAN_TASK;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.OWNER_NOT_EXISTS;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.PLAN_NOT_EXISTS;
/**
@ -436,18 +438,22 @@ public class PlanServiceImpl implements PlanService {
LocalDateTime dateAsLocalDateTime = processDesignProgressDO.getEndTime().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
if (dateAsLocalDateTime.isAfter(processDesignDO.getCraftEndDate())) {
if (ObjectUtil.isNotEmpty(planSubDO.getCraftEndDate())){
if (dateAsLocalDateTime.isAfter(planSubDO.getCraftEndDate())) {
planDO.setProcessFlag("1");
} else {
planDO.setProcessFlag("0");
}
}
}
} else {
if (now.isAfter(processDesignDO.getCraftEndDate())) {
if (ObjectUtil.isNotEmpty(planSubDO.getCraftEndDate())){
if (now.isAfter(planSubDO.getCraftEndDate())) {
planDO.setProcessFlag("1");
} else {
planDO.setProcessFlag("0");
}
}
Long l = processDesignProgressMapper.selectCount(new LambdaQueryWrapper<ProcessDesignProgressDO>().eq(ProcessDesignProgressDO::getProcessDesignId, processDesignDO.getId()));
if (l > 0) {
planDO.setProcessProgress("执行中");
@ -482,7 +488,7 @@ public class PlanServiceImpl implements PlanService {
List<PurchaseOrderMakeDetailDO> purchaseOrderMakeDetailDOS = queryPurchaseOrderMakeDetails(subDO);
// 判断所有采购订单是否都已完成
boolean allCompleted = isAllPurchaseOrdersCompleted(purchaseOrderNoDetailDOS);
boolean allCompleted = isAllPurchaseOrdersCompleted(purchaseOrderNoDetailDOS,detailDOS);
if (allCompleted) {
subDO.setOutsourcingTasks(TASK_COMPLETED);
@ -529,7 +535,7 @@ public class PlanServiceImpl implements PlanService {
List<TaskDispatchDetailDO> dispatchDetailDOList = taskDispatchDetailMapper
.outSourceTask(subDO.getProjectSubId(), "N","0");
//2.查询过程检报工信息
List<PgMasterLineDO> processInspectionReports = queryProcessInspectionReports(dispatchDetailDOS);
List<PgMasterLineDO> processInspectionReports = queryProcessInspectionReports(dispatchDetailDOList);
boolean isSameSizeAndNotEmpty = isSameSizeAndNotEmpty(dispatchDetailDOList, processInspectionReports);
if (isSameSizeAndNotEmpty){
subDO.setProcessInspection(TASK_COMPLETED);
@ -570,16 +576,14 @@ public class PlanServiceImpl implements PlanService {
if (CollectionUtils.isEmpty(taskReportDOS)) {
if (CollectionUtils.isNotEmpty(dispatchDetailDOS)){
subDO.setAssemblyTask(TASK_NOT_STARTED);
return;
}
}else {
BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS);
BigDecimal reportedAmount = calculateReportedAmount(taskReportDOS);
int percentage = calculatePercentage(reportedAmount, dispatchAmount);
subDO.setAssemblyTask(String.format(TASK_STARTED_FORMAT, percentage));
subDO.setAssemblyTaskFlag(TASK_FLAG_NORMAL);
}
BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS);
BigDecimal reportedAmount = calculateReportedAmount(taskReportDOS);
int percentage = calculatePercentage(reportedAmount, dispatchAmount);
subDO.setAssemblyTask(String.format(TASK_STARTED_FORMAT, percentage));
subDO.setAssemblyTaskFlag(TASK_FLAG_NORMAL);
}
/**
* 处理进行中的任务状态
@ -590,17 +594,17 @@ public class PlanServiceImpl implements PlanService {
if (CollectionUtils.isEmpty(taskReportDOS)) {
if (CollectionUtils.isNotEmpty(dispatchDetailDOS)){
subDO.setProcessingTask(TASK_NOT_STARTED);
return;
subDO.setProcessInspection(TASK_NOT_STARTED);
}
}else {
BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS);
BigDecimal reportedAmount = calculateAmount(taskReportDOS);
int percentage = calculatePercentage(reportedAmount, dispatchAmount);
subDO.setProcessInspection(String.format(TASK_STARTED_FORMAT, percentage));
subDO.setProcessInspectionFlag(TASK_FLAG_NORMAL);
}
BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS);
BigDecimal reportedAmount = calculateAmount(taskReportDOS);
int percentage = calculatePercentage(reportedAmount, dispatchAmount);
subDO.setProcessingTask(String.format(TASK_STARTED_FORMAT, percentage));
subDO.setProcessingTaskFlag(TASK_FLAG_NORMAL);
}
/**
* 判断两个集合大小相等且都不为空
@ -680,16 +684,15 @@ public boolean isSameSizeAndNotEmpty(Collection<?> list1, Collection<?> list2)
if (CollectionUtils.isEmpty(taskReportDOS)) {
if (CollectionUtils.isNotEmpty(dispatchDetailDOS)){
subDO.setProcessingTask(TASK_NOT_STARTED);
return;
}
}else {
BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS);
BigDecimal reportedAmount = calculateReportedAmount(taskReportDOS);
int percentage = calculatePercentage(reportedAmount, dispatchAmount);
subDO.setProcessingTask(String.format(TASK_STARTED_FORMAT, percentage));
subDO.setProcessingTaskFlag(TASK_FLAG_NORMAL);
}
BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS);
BigDecimal reportedAmount = calculateReportedAmount(taskReportDOS);
int percentage = calculatePercentage(reportedAmount, dispatchAmount);
subDO.setProcessingTask(String.format(TASK_STARTED_FORMAT, percentage));
subDO.setProcessingTaskFlag(TASK_FLAG_NORMAL);
}
/**
* 处理装配任务时间逻辑
@ -830,13 +833,13 @@ private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(PlanSubDO subDO)
}
// 判断所有采购订单是否完成
private boolean isAllPurchaseOrdersCompleted(List<PurchaseOrderNoDetailDO> purchaseOrderNoDetailDOS) {
private boolean isAllPurchaseOrdersCompleted(List<PurchaseOrderNoDetailDO> purchaseOrderNoDetailDOS,List<TaskDispatchDetailDO> taskDispatchDetailDOS) {
if (CollectionUtils.isEmpty(purchaseOrderNoDetailDOS)) {
return false;
}
return purchaseOrderNoDetailDOS.stream()
.filter(Objects::nonNull)
.allMatch(item -> item.getReceivingStatus() == 3);
.allMatch(item -> item.getReceivingStatus() == 3) && taskDispatchDetailDOS.size()==purchaseOrderNoDetailDOS.size();
}
// 计算已收货的采购数量
@ -910,11 +913,7 @@ private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(PlanSubDO subDO)
* 查询已完成的工艺设计
*/
private List<ProcessDesignDO> getCompletedProcessDesigns(Long projectSubId) {
LambdaQueryWrapper<ProcessDesignDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessDesignDO::getProjectSubId, projectSubId);
queryWrapper.in(ProcessDesignDO::getProcessDesignType, "BLUEPRINT_3D","BLUEPRINT_2D","BLUEPRINT_WORKBLANK");
queryWrapper.eq(ProcessDesignDO::getIsOverProcess, "1");
return processDesignMapper.selectList(queryWrapper);
return processDesignMapper.selectWithDetailExists(projectSubId);
}
/**
@ -929,10 +928,15 @@ private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(PlanSubDO subDO)
}
/**
* 检查是否有足够的已完成设计>=3
* 检查设计是否完成
*/
private boolean hasEnoughCompletedDesigns(List<ProcessDesignDO> processDesigns) {
return ObjectUtil.isNotEmpty(processDesigns) && processDesigns.size() >= 3;
if (CollectionUtils.isEmpty(processDesigns)) {
return false;
}
return processDesigns.stream()
.filter(Objects::nonNull)
.allMatch(item -> item.getIsOverProcess() ==1);
}
/**
@ -967,8 +971,8 @@ private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(PlanSubDO subDO)
PlanSubDetailDO latestTwoDimPlan,
LocalDateTime now) {
if (ObjectUtil.isEmpty(processDesigns)) {
subDO.setDesignTask("未开始");
return;
subDO.setDesignTask("");
}
List<Long> processDesignIds = processDesigns.stream()
@ -978,31 +982,30 @@ private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(PlanSubDO subDO)
// 获取工艺设计进度列表
List<ProcessDesignProgressDO> progressList = getProcessDesignProgressList(processDesignIds);
if (ObjectUtil.isEmpty(progressList)) {
if (ObjectUtil.isEmpty(progressList)&&ObjectUtil.isNotEmpty(latestTwoDimPlan)) {
subDO.setDesignTask("未开始");
return;
}
if (ObjectUtil.isNotEmpty(progressList)) {
// 计算总工时和当前工时
BigDecimal totalWorkTime = calculateTotalWorkTime(progressList);
BigDecimal currentTime = calculateCurrentTime(subDO);
currentTime = currentTime.multiply(new BigDecimal("8"));
currentTime = currentTime.multiply(new BigDecimal("8"));
// 计算完成百分比
Integer percentage = calculatePercentage( totalWorkTime,currentTime);
Integer percentage = calculatePercentage(totalWorkTime, currentTime);
// 设置设计任务状态
subDO.setDesignTask(String.format("已开始(%d%%)", percentage));
subDO.setDesignTaskFlag("0");
}
// 检查是否超期
ProcessDesignProgressDO latestProgress = getLatestProgress(processDesignIds);
if (ObjectUtil.isNotEmpty(latestProgress) &&
if (
ObjectUtil.isNotEmpty(latestTwoDimPlan) &&
now.isAfter(latestTwoDimPlan.getTwoDimDate())) {
subDO.setDesignTaskFlag("1");
}
}
/**
* 获取最新的工艺设计进度
*/

View File

@ -8,6 +8,7 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.plansubdetail.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansubdetail.PlanSubDetailDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
/**
* 生产计划子项目设计时间明细 Service 接口
@ -70,4 +71,14 @@ public interface PlanSubDetailService {
CommonResult overlap(PlanSubDetailSaveReqVO updateReqVO);
List<PlanSubDetailDO> getList(PlanSubDetailPageReqVO pageReqVO);
List<PlanSubDetailDO> getList1(PlanSubDetailPageReqVO pageReqVO);
List<TaskDispatchDetailDO> getList2(PlanSubDetailPageReqVO pageReqVO);
List<TaskDispatchDetailDO> getList3(PlanSubDetailPageReqVO pageReqVO);
List<TaskDispatchDetailDO> getList4(PlanSubDetailPageReqVO pageReqVO);
List<TaskDispatchDetailDO> getList5(PlanSubDetailPageReqVO pageReqVO);
}

View File

@ -1054,7 +1054,7 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
// bdgzsomthingMapper.updateById(bdgzsomthingDO);
// }
// }
if (taskDispatchDO.getDispatchType().equals("PRODUCTION") && taskDispatchDetailDO.getTestYn().equals("N")){
if (taskDispatchDO.getDispatchType().equals("PRODUCTION") && taskDispatchDetailDO.getTestYn().equals("N")&&taskDispatchDetailDO.getCheckYn().equals("0")){
pgMasterService.insertPgList(planDO.getId(),planDO.getProjectId(),taskDispatchDO.getBomDetailId(),taskDispatchDetailDO);
}
// if (taskDispatchDO.getDispatchType().equals("PRODUCTION") && isBomDetailProductionOver){

View File

@ -44,10 +44,10 @@ public class TaskReportServiceImpl implements TaskReportService {
public CommonResult<Boolean> updateTaskReport(TaskReportSaveReqVO updateReqVO) {
// 校验存在
validateTaskReportExists(updateReqVO.getId());
TaskDispatchDetailDO taskDispatchDetailDO = taskDispatchDetailMapper.selectById(updateReqVO.getDispatchDetailId());
if (ObjectUtil.isNotEmpty(taskDispatchDetailDO)){
if (taskDispatchDetailDO.getProcedureStatus() == 2) return CommonResult.error(400,"该派工单已报工完成,不允许修改!");
}
// TaskDispatchDetailDO taskDispatchDetailDO = taskDispatchDetailMapper.selectById(updateReqVO.getDispatchDetailId());
// if (ObjectUtil.isNotEmpty(taskDispatchDetailDO)){
// if (taskDispatchDetailDO.getProcedureStatus() == 2) return CommonResult.error(400,"该派工单已报工完成,不允许修改!");
// }
// 更新
TaskReportDO updateObj = BeanUtils.toBean(updateReqVO, TaskReportDO.class);
taskReportMapper.updateById(updateObj);

View File

@ -109,17 +109,17 @@ public class AdminAuthServiceImpl implements AdminAuthService {
// 使用账号密码进行登录
AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword());
String openId = getOpenid(reqVO.getCode());
//判断如果openId为空时需要获取并更新openId
if(user.getOpenId()==null){
user.setOpenId(openId);
//更新openID
userMapper.updateById(user);
}else if(!user.getOpenId().equals(openId)){
user.setOpenId(openId);
//更新openID
userMapper.updateById(user);
}
// String openId = getOpenid(reqVO.getCode());
// //判断如果openId为空时需要获取并更新openId
// if(user.getOpenId()==null){
// user.setOpenId(openId);
// //更新openID
// userMapper.updateById(user);
// }else if(!user.getOpenId().equals(openId)){
// user.setOpenId(openId);
// //更新openID
// userMapper.updateById(user);
// }
// 如果 socialType 非空说明需要绑定社交用户

View File

@ -82,3 +82,18 @@ export const overlap = async (data: PlanSubDetailVO) => {
export const getList = async (params) => {
return await request.get({ url: `/heli/plan-sub-detail/getList`, params })
}
export const getList1 = async (params) => {
return await request.get({ url: `/heli/plan-sub-detail/getList1`, params })
}
export const getList2 = async (params) => {
return await request.get({ url: `/heli/plan-sub-detail/getList2`, params })
}
export const getList3 = async (params) => {
return await request.get({ url: `/heli/plan-sub-detail/getList3`, params })
}
export const getList4 = async (params) => {
return await request.get({ url: `/heli/plan-sub-detail/getList4`, params })
}
export const getList5 = async (params) => {
return await request.get({ url: `/heli/plan-sub-detail/getList5`, params })
}

View File

@ -7,20 +7,25 @@
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">子项目信息</span>
<label style="display: inline-flex; align-items: center; margin-left: 40px;">
<el-checkbox class="large-checkbox" v-model="formData.flag" style="order: 1;" />
<el-checkbox class="large-checkbox" v-model="formData.flag" style="order: 1;" @change="change"/>
<span style="order: 2; margin-left: 10px;">不显示已完成</span>
</label>
</template>
</el-card>
<ContentWrap>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" height="300" border :cell-class-name="cellClassName">
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" height="250" border @row-click="rowClick" :cell-class-name="cellClassName5">
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" />
<el-table-column label="任务" align="center" prop="designTask" />
<el-table-column label="预计开始时间" align="center" prop="outsourcingTasks" :formatter="dateFormatter2" />
<el-table-column label="预计结束时间" align="center" prop="processingTask" :formatter="dateFormatter2" />
<el-table-column label="工单状态" align="center" prop="processInspection" />
<el-table-column label="生产进度" align="center" prop="assemblyTask" />
<el-table-column label="任务" align="center" prop="subType" />
<el-table-column label="预计开始时间" align="center" prop="startTwoDimDate" :formatter="dateFormatter2" />
<el-table-column label="预计结束时间" align="center" prop="twoDimDate" :formatter="dateFormatter2" />
<el-table-column label="工单状态" align="center" prop="status" />
<el-table-column label="生产进度" align="center" prop="productionSchedule" >
<template #default="scope">
<el-progress :percentage="scope.row.productionSchedule" />
</template>
</el-table-column>
</el-table>
</ContentWrap>
@ -31,18 +36,85 @@
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">工单信息</span>
</template>
</el-card>
<ContentWrap v-if="type=='设计'">
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" height="500" border :cell-class-name="cellClassName">
<ContentWrap v-if="type=='sheji'">
<el-table :data="list1" :show-overflow-tooltip="true" class="hl-table" height="500" border :cell-class-name="cellClassName">
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" />
<el-table-column label="任务" align="center" prop="designTask" />
<el-table-column label="预计开始时间" align="center" prop="outsourcingTasks" />
<el-table-column label="预计结束时间" align="center" prop="processingTask" />
<el-table-column label="工单状态" align="center" prop="processInspection" />
<el-table-column label="生产进度" align="center" prop="assemblyTask" />
<el-table-column label="子项目名称" align="center" prop="name" />
<el-table-column label="工艺设计" align="center" prop="type" />
<el-table-column label="预计开始时间" align="center" prop="startTwoDimDate" :formatter="dateFormatter2"/>
<el-table-column label="预计结束时间" align="center" prop="twoDimDate" :formatter="dateFormatter2"/>
<el-table-column label="预计工时(H)" align="center" prop="designNum" />
<el-table-column label="实际工时(H)" align="center" prop="workHours" />
<el-table-column label="负责人" align="center" prop="twoDimOwnerName" />
<el-table-column label="最后报工时间" align="center" prop="time" :formatter="dateFormatter2"/>
<el-table-column label="完工" align="center" prop="percentage" />
<el-table-column label="任务状态" align="center" prop="status" />
</el-table>
</ContentWrap>
<ContentWrap v-if="type=='waixei'">
<el-table :data="list2" :show-overflow-tooltip="true" class="hl-table" height="500" border :cell-class-name="cellClassName1">
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" />
<el-table-column label="零件名称" align="center" prop="materialName" />
<el-table-column label="工序" align="center" prop="procedureName" />
<el-table-column label="要求完成日期" align="center" prop="endTime" :formatter="dateFormatter2"/>
<el-table-column label="负责人" align="center" prop="ownerName" />
<el-table-column label="收货日期" align="center" prop="receivingTime" :formatter="dateFormatter2"/>
<el-table-column label="零件采购" align="center" prop="partsProcurement" />
<el-table-column label="派工单状态" align="center" prop="receiving" />
</el-table>
</ContentWrap>
<ContentWrap v-if="type=='jiagong'">
<el-table :data="list3" :show-overflow-tooltip="true" class="hl-table" height="500" border :cell-class-name="cellClassName2">
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" />
<el-table-column label="零件名称" align="center" prop="materialName" />
<el-table-column label="工序" align="center" prop="procedureName" />
<el-table-column label="预计开始时间" align="center" prop="startTime" :formatter="dateFormatter2"/>
<el-table-column label="预计结束时间" align="center" prop="endTime" :formatter="dateFormatter2"/>
<el-table-column label="负责人" align="center" prop="ownerName" />
<el-table-column label="预计工时(天)" align="center" prop="workTime" />
<el-table-column label="实际工时(天)" align="center" prop="workingHour" />
<el-table-column label="报工进度(%)" align="center" prop="percentage" />
<el-table-column label="派工单状态" align="center" prop="report" />
<el-table-column label="是否过程检" align="center" prop="checkYn" >
<template #default="scope">
{{scope.row.checkYn=='0'?"是":"否"}}
</template>
</el-table-column>
</el-table>
</ContentWrap>
<ContentWrap v-if="type=='guochengjian'">
<el-table :data="list4" :show-overflow-tooltip="true" class="hl-table" height="500" border :cell-class-name="cellClassName3">
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" />
<el-table-column label="零件名称" align="center" prop="materialName" />
<el-table-column label="工序" align="center" prop="procedureName" />
<el-table-column label="是否过程检" align="center" prop="checkYn" >
<template #default="scope">
{{scope.row.checkYn=='0'?"是":"否"}}
</template>
</el-table-column>
<el-table-column label="过程检状态" align="center" prop="report" />
<el-table-column label="负责人" align="center" prop="ownerName" />
</el-table>
</ContentWrap>
<ContentWrap v-if="type=='zhuangpei'">
<el-table :data="list5" :show-overflow-tooltip="true" class="hl-table" height="500" border :cell-class-name="cellClassName4">
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" />
<el-table-column label="工序" align="center" prop="procedureName" />
<el-table-column label="预计开始时间" align="center" prop="startTime" :formatter="dateFormatter2"/>
<el-table-column label="预计结束时间" align="center" prop="endTime" :formatter="dateFormatter2"/>
<el-table-column label="负责人" align="center" prop="ownerName" />
<el-table-column label="预计工时(天)" align="center" prop="workTime" />
<el-table-column label="实际工时(天)" align="center" prop="workingHour" />
<el-table-column label="报工进度(%)" align="center" prop="percentage" />
<el-table-column label="派工单状态" align="center" prop="report" />
<el-table-column label="成品检" align="center" prop="finishedProduct" />
</el-table>
</ContentWrap>
<div class="text-center hl-footer">
<el-button @click="() => router.back()" size="large"> </el-button>
</div>
@ -62,8 +134,13 @@ const { query } = useRoute()
const router = useRouter()
const reload = inject('reload')
const formLoading = ref(false) // 12
const list = ref([]) //
const type = ref('sheji')
const list = ref([])
const list1 = ref([]) //
const list2 = ref([]) //
const list3 = ref([]) //
const list4 = ref([]) //
const list5 = ref([]) //
const type = ref('')
const formData = reactive({
id:undefined,
projectSubId:undefined,
@ -73,13 +150,97 @@ const formData = reactive({
onMounted(async () => {
console.log(query)
formData.projectSubId = query.projectSubId
})
getList()
const queryParams = reactive({
projectSubId:formData.projectSubId
})
if (list.value){
const hasDesignTask = list.value.some(item => item.subType === "设计任务");
if (hasDesignTask){
list1.value= await PlansubdetailApi.getList1(queryParams)
type.value='sheji'
}
}
})
const change = (val) => {
getList()
}
/** 处理某一行的点击 */
const rowClick = async (row) => {
console.log(row);
const queryParams = reactive({
projectSubId:formData.projectSubId,
})
type.value=''
if (row.subType=='设计任务'){
list1.value= await PlansubdetailApi.getList1(queryParams)
if (list1.value.length>0){
type.value='sheji'
}
}else if (row.subType=='外协任务'){
list2.value= await PlansubdetailApi.getList2(queryParams)
if (list2.value.length>0){
type.value='waixei'
}
}else if (row.subType=='加工任务'){
list3.value= await PlansubdetailApi.getList3(queryParams)
if (list3.value.length>0){
type.value='jiagong'
}
}else if (row.subType=='过程检任务'){
list4.value= await PlansubdetailApi.getList4(queryParams)
if (list4.value.length>0){
type.value='guochengjian'
}
}else{
list5.value= await PlansubdetailApi.getList5(queryParams)
if (list5.value.length>0){
type.value='zhuangpei'
}
}
}
const cellClassName = ({ row,column }) => {
if (column.label === '任务状态' && row.statusFlag) {
return row.statusFlag === '1' ? 'warning-row1' : row.statusFlag === '0' ?'warning-row2':"";
}
}
const cellClassName1 = ({ row,column }) => {
if (column.label === '派工单状态' && row.receivingFlag) {
return row.receivingFlag === '1' ? 'warning-row1' :"";
}
}
const cellClassName2 = ({ row,column }) => {
if (column.label === '派工单状态' && row.reportFlag) {
return row.reportFlag === '1' ? 'warning-row1' :"";
}
}
const cellClassName3 = ({ row,column }) => {
if (column.label === '过程检状态' && row.reportFlag) {
return row.reportFlag === '1' ? 'warning-row1' :"";
}
}
const cellClassName4 = ({ row,column }) => {
if (column.label === '派工单状态' && row.reportFlag) {
return row.reportFlag === '1' ? 'warning-row1' :"";
}
}
const cellClassName5 = ({ row,column }) => {
if (column.label === '工单状态' && row.statusFlag) {
return row.statusFlag === '1' ? 'warning-row1' : row.statusFlag === '0' ?'warning-row2':"";
}
}
/** 查询设计列表 */
const getList = async () => {
loading.value = true
try {
const data = await PlansubdetailApi.getPartProcess(formData)
const queryParams = reactive({
projectSubId:formData.projectSubId,
flag:formData.flag==true?"0":"1"
})
const data = await PlansubdetailApi.getList(queryParams)
list.value = data
} finally {
loading.value = false
@ -94,6 +255,12 @@ const getList = async () => {
border: solid 1px orange;
outline: solid 1px orange;
}
.warning-row1 {
background-color:#F08080 !important;
}
.warning-row2 {
background-color: #1E90FF !important; /* 道奇蓝 */
}
.large-checkbox {
transform: scale(1.5); /* 方法1使用scale放大 */
/* 或者 */

View File

@ -73,9 +73,10 @@
placeholder="工艺结束日期" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工艺进度" prop="processProgress">
<el-input class="!w-265px" placeholder="工艺进度" v-model="formData.processProgress" disabled />
<el-col :span="8" >
<el-form-item label="工艺进度" prop="processProgress" >
<el-input class=" !w-265px" :class="{ 'red-background': formData.processFlag == '1' }" placeholder="工艺进度" v-model="formData.processProgress" disabled
/>
</el-form-item>
</el-col>
</el-row>
@ -155,11 +156,16 @@ const formData = ref({
projectEndTime:undefined,
projectProgress:undefined,
craftEndDate:undefined,
processProgress:undefined
processProgress:undefined,
processFlag:undefined
})
const queryFormRef = ref() //
/** 查询列表 */
const getList = async () => {
if ((queryParams.projectCode==null||queryParams.projectCode=='')&&(queryParams.projectSubName==null||queryParams.projectSubName=='')&&(queryParams.projectName==null ||queryParams.projectName=='')) {
message.error("必须输入查询条件查询")
return
}
loading.value = true
try {
const data = await PlanApi.getPartProcess(queryParams)
@ -173,22 +179,19 @@ const getList = async () => {
const cellClassName = ({ row,column }) => {
if (column.label === '设计任务' && row.designTaskFlag) {
return row.designTaskFlag === '1' ? 'warning-row1' : 'warning-row2';
return row.designTaskFlag === '1' ? 'warning-row1' :row.designTaskFlag === '0' ? 'warning-row2':"";
}
if (column.label === '外协任务' && row.outsourcingTasksFlag) {
return row.outsourcingTasksFlag === '1' ? 'warning-row1' : 'warning-row2';
return row.outsourcingTasksFlag === '1' ? 'warning-row1' :row.outsourcingTasksFlag === '0' ? 'warning-row2':"";
}
if (column.label === '加工任务' && row.processingTaskFlag) {
return row.processingTaskFlag === '1' ? 'warning-row1' : 'warning-row2';
return row.processingTaskFlag === '1' ? 'warning-row1' : row.processingTaskFlag === '0' ?'warning-row2':"";
}
if (column.label === '过程检任务' && row.processInspectionFlag) {
return row.processInspectionFlag === '1' ? 'warning-row1' : 'warning-row2';
return row.processInspectionFlag === '1' ? 'warning-row1' : row.processInspectionFlag === '0' ? 'warning-row2':"";
}
if (column.label === '装配任务' && row.assemblyTaskFlag) {
console.log(row.assemblyTaskFlag)
console.log(row.assemblyTaskFlag === '1')
console.log(row.assemblyTaskFlag === '1' ? 'warning-row1' : 'warning-row2')
return row.assemblyTaskFlag === '1' ? 'warning-row1' : 'warning-row2';
return row.assemblyTaskFlag === '1' ? 'warning-row1' : row.assemblyTaskFlag === '0' ?'warning-row2':"";
}
// return '';
}
@ -196,7 +199,7 @@ const cellClassName = ({ row,column }) => {
const handleQuery = () => {
queryParams.pageNo = 1
getList()
getList();
}
/** 重置按钮操作 */
@ -236,18 +239,16 @@ window.addEventListener('beforeunload', () => {
routeParamsCache.set(routeValue.value, plainParams);
});
</script>
<style >
.el-dropdown-link {
cursor: pointer;
margin: 5px;
color: var(--el-color-primary);
display: flex;
align-items: center;
}
.warning-row1 {
<style scoped>
:deep(.warning-row1) {
background-color:#F08080 !important;
}
.warning-row2 {
:deep(.warning-row2) {
background-color: #1E90FF !important; /* 道奇蓝 */
}
.red-background :deep(.el-input__wrapper) {
background-color: #F08080 !important;
}
</style>