【需求】完善工艺设计与订单交互

pull/4/head
zengchenxi 8 months ago
parent d117014c9b
commit 0d6fe35ead

@ -28,4 +28,15 @@ public interface OperateLogFrameworkService {
* @param content * @param content
*/ */
void createOperateLog(HttpServletRequest request, LocalDateTime startTime, String businessType, Long businessId, Integer type, String content); void createOperateLog(HttpServletRequest request, LocalDateTime startTime, String businessType, Long businessId, Integer type, String content);
/**
*
*
* @param startTime
* @param businessType
* @param businessId
* @param type
* @param content
*/
void createOperateLog(LocalDateTime startTime, String businessType, Long businessId, Integer type, String content);
} }

@ -58,4 +58,28 @@ public class OperateLogFrameworkServiceImpl implements OperateLogFrameworkServic
operateLogApi.createOperateLog(reqDTO); operateLogApi.createOperateLog(reqDTO);
} }
@Override
public void createOperateLog(LocalDateTime startTime, String businessType, Long businessId, Integer type, String content) {
OperateLog operateLogObj = new OperateLog();
operateLogObj.setTraceId(TracerUtils.getTraceId());
operateLogObj.setStartTime(startTime);
operateLogObj.setBusinessType(businessType);
operateLogObj.setBusinessId(businessId);
operateLogObj.setUserId(WebFrameworkUtils.getLoginUserId());
operateLogObj.setUserType(WebFrameworkUtils.getLoginUserType());
operateLogObj.setModule("ignore");
operateLogObj.setName("ignore");
operateLogObj.setType(type);
operateLogObj.setContent(content);
operateLogObj.setRequestMethod("system");
operateLogObj.setRequestUrl("system");
operateLogObj.setUserIp("127.0.0.1");
operateLogObj.setUserAgent("system");
operateLogObj.setJavaMethod("system");
operateLogObj.setDuration((int) (LocalDateTimeUtil.between(startTime, LocalDateTime.now()).toMillis()));
operateLogObj.setResultCode(SUCCESS.getCode());
OperateLogCreateReqDTO reqDTO = BeanUtil.toBean(operateLogObj, OperateLogCreateReqDTO.class);
operateLogApi.createOperateLog(reqDTO);
}
} }

@ -0,0 +1,22 @@
package com.chanko.yunxi.mes.module.heli.enums;
import lombok.Getter;
/**
*
* @author chenxi
* @date 2024-02-27 10:28
*/
@Getter
public enum ValidStatusEnum {
VALID(1, "有效"),
INVALID(2, "无效");
private int code;
private String description;
ValidStatusEnum(int code, String description) {
this.code = code;
this.description = description;
}
}

@ -14,8 +14,7 @@ public class ProcessBomSaveReqVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED, example = "18511") @Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED, example = "18511")
private Long id; private Long id;
@Schema(description = "编号,唯一", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "编号")
@NotEmpty(message = "编号,唯一不能为空")
private String code; private String code;
@Schema(description = "生产计划id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19403") @Schema(description = "生产计划id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19403")

@ -14,8 +14,7 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.Project
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum; import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
import com.chanko.yunxi.mes.module.heli.service.plan.PlanService; import com.chanko.yunxi.mes.module.heli.manager.CrossOrderManager;
import com.chanko.yunxi.mes.module.heli.service.plansub.PlanSubService;
import com.chanko.yunxi.mes.module.heli.service.projectorder.ProjectOrderService; import com.chanko.yunxi.mes.module.heli.service.projectorder.ProjectOrderService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@ -45,19 +44,15 @@ public class ProjectOrderController {
@Resource @Resource
private ProjectOrderService projectOrderService; private ProjectOrderService projectOrderService;
@Resource
private PlanService planService;
@Resource
private PlanSubService planSubService;
@Resource @Resource
private OperateLogFrameworkService operateLogFrameworkService; private OperateLogFrameworkService operateLogFrameworkService;
@Resource @Resource
private HttpServletRequest request; private HttpServletRequest request;
@Resource
private CrossOrderManager crossOrderManager;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建项目订单") @Operation(summary = "创建项目订单")
@PreAuthorize("@ss.hasPermission('heli:project-order:create')") @PreAuthorize("@ss.hasPermission('heli:project-order:create')")
@ -94,12 +89,12 @@ public class ProjectOrderController {
switch (OperateTypeEnum.valueOf(operateReqVO.getActive())){ switch (OperateTypeEnum.valueOf(operateReqVO.getActive())){
case APPROVE: case APPROVE:
// 订单批准时创建或者更新生产计划数据 // 订单批准时创建或者更新生产计划数据
planService.generatePlanByProjectId(operateReqVO.getId()); crossOrderManager.generatePlan(operateReqVO.getId());
projectOrderService.createProjectOrderSnapshot(operateReqVO); projectOrderService.createProjectOrderSnapshot(operateReqVO);
break; break;
case TERMINATE: case TERMINATE:
// 订单终止时更新生产计划状态 // 订单终止时更新生产计划状态
planService.updatePlanStatusToTerminateByProjectId(operateReqVO.getId()); crossOrderManager.updatePlanStatusToTerminate(operateReqVO.getId());
projectOrderService.createProjectOrderSnapshot(operateReqVO); projectOrderService.createProjectOrderSnapshot(operateReqVO);
break; break;
} }

@ -1,14 +1,11 @@
package com.chanko.yunxi.mes.module.heli.dal.mysql.processbom; package com.chanko.yunxi.mes.module.heli.dal.mysql.processbom;
import java.util.*;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/** /**
* bom Mapper * bom Mapper
* *

@ -5,7 +5,9 @@ import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO; 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.processbom.ProcessBomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesign.ProcessDesignDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
@ -23,9 +25,11 @@ public interface ProcessBomMapper extends BaseMapperX<ProcessBomDO> {
default PageResult<ProcessBomDO> selectPage(ProcessBomPageReqVO reqVO) { default PageResult<ProcessBomDO> selectPage(ProcessBomPageReqVO reqVO) {
MPJLambdaWrapper<ProcessBomDO> query = new MPJLambdaWrapper<>(); MPJLambdaWrapper<ProcessBomDO> query = new MPJLambdaWrapper<>();
query.selectAll(ProcessBomDO.class) query.selectAll(ProcessBomDO.class)
.select("concat('BOM-', e.project_sub_code) as code")
.select("a.plan_no as planCode", "b.code as projectCode", "c.name as customerName", "b.project_name as projectName") .select("a.plan_no as planCode", "b.code as projectCode", "c.name as customerName", "b.project_name as projectName")
.select("d.name as projectSubName") .select("d.name as projectSubName")
.leftJoin(PlanDO.class, "a", PlanDO::getId, ProcessBomDO::getPlanId) .leftJoin(PlanDO.class, "a", PlanDO::getId, ProcessBomDO::getPlanId)
.leftJoin(PlanSubDO.class, "e", PlanSubDO::getProjectSubId, ProcessBomDO::getProjectSubId)
.leftJoin(ProjectOrderDO.class, "b", ProjectOrderDO::getId, ProcessBomDO::getProjectId) .leftJoin(ProjectOrderDO.class, "b", ProjectOrderDO::getId, ProcessBomDO::getProjectId)
.leftJoin(CustomerDO.class, "c", CustomerDO::getId, ProjectOrderDO::getCustomerId) .leftJoin(CustomerDO.class, "c", CustomerDO::getId, ProjectOrderDO::getCustomerId)
.leftJoin(ProjectOrderSubDO.class, "d", ProjectOrderSubDO::getId, ProcessBomDO::getProjectSubId) .leftJoin(ProjectOrderSubDO.class, "d", ProjectOrderSubDO::getId, ProcessBomDO::getProjectSubId)
@ -45,4 +49,22 @@ public interface ProcessBomMapper extends BaseMapperX<ProcessBomDO> {
return selectPage(reqVO, query); return selectPage(reqVO, query);
} }
default ProcessBomDO selectById(Long id) {
MPJLambdaWrapper<ProcessBomDO> query = new MPJLambdaWrapper<>();
query.selectAll(ProcessBomDO.class)
.select("concat('BOM-', e.project_sub_code) as code")
.select("a.plan_no as planCode", "b.code as projectCode", "c.name as customerName", "b.project_name as projectName")
.select("d.name as projectSubName")
.leftJoin(PlanDO.class, "a", PlanDO::getId, ProcessBomDO::getPlanId)
.leftJoin(PlanSubDO.class, "e", PlanSubDO::getProjectSubId, ProcessBomDO::getProjectSubId)
.leftJoin(ProjectOrderDO.class, "b", ProjectOrderDO::getId, ProcessBomDO::getProjectId)
.leftJoin(CustomerDO.class, "c", CustomerDO::getId, ProjectOrderDO::getCustomerId)
.leftJoin(ProjectOrderSubDO.class, "d", ProjectOrderSubDO::getId, ProcessBomDO::getProjectSubId)
.eq(ProcessBomDO::getId, id)
.last("LIMIT 1")
.disableSubLogicDel()
;
return selectOne(query);
}
} }

@ -3,10 +3,16 @@ package com.chanko.yunxi.mes.module.heli.manager;
import cn.hutool.core.lang.UUID; import cn.hutool.core.lang.UUID;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService;
import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderSaveReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderSaveReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomSaveReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.processdesign.vo.ProcessDesignSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesign.ProcessDesignDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO;
@ -14,25 +20,31 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderSubMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.material.MaterialMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.material.MaterialMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomMapper;
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.projectorder.ProjectOrderMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storage.StorageMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.storage.StorageMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagemat.StorageMatMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.storagemat.StorageMatMapper;
import com.chanko.yunxi.mes.module.heli.enums.*; import com.chanko.yunxi.mes.module.heli.enums.*;
import com.chanko.yunxi.mes.module.heli.service.plan.PlanService;
import com.chanko.yunxi.mes.module.heli.service.processbom.ProcessBomService;
import com.chanko.yunxi.mes.module.heli.service.processdesign.ProcessDesignService;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.STOCK_IN; import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.STOCK_IN;
/** /**
* *
* *
* @author chenxi * @author chenxi
* @date 2024-01-31 10:03 * @date 2024-01-31 10:03
@ -54,6 +66,18 @@ public class CrossOrderManager {
private StorageLogMapper storageLogMapper; private StorageLogMapper storageLogMapper;
@Resource @Resource
private MaterialMapper materialMapper; private MaterialMapper materialMapper;
@Resource
private PlanService planService;
@Resource
private ProcessDesignService processDesignService;
@Resource
private ProcessDesignMapper processDesignMapper;
@Resource
private ProcessBomService processBomService;
@Resource
private OperateLogFrameworkService operateLogFrameworkService;
@Resource
private ProcessBomMapper processBomMapper;
/** /**
* *
@ -191,4 +215,126 @@ public class CrossOrderManager {
} }
}); });
} }
/**
*
* @param projectId
*/
@Transactional(rollbackFor = Exception.class)
public void generatePlan(Long projectId) {
// 锁定该订单
projectOrderMapper.selectOne(new LambdaQueryWrapper<ProjectOrderDO>() {{
eq(ProjectOrderDO::getId, projectId);
last("LIMIT 1 FOR UPDATE");
}});
Long planId = planService.generatePlanByProjectId(projectId);
// 同时生成工艺设计
generateProcessDesign(projectId, planId);
}
/**
*
* @param projectId
* @param planId
*/
@Transactional(rollbackFor = Exception.class)
public void generateProcessDesign(Long projectId, Long planId){
// 判断是否已经生成
List<ProjectOrderSubDO> projectSubList = projectOrderSubMapper.selectListByProjectOrderId(projectId);
if(projectSubList != null){
List<Long> projectSubIdList = projectSubList.stream().map(ProjectOrderSubDO::getId).collect(Collectors.toList());
List<ProcessDesignDO> processDesignDOList = processDesignMapper.selectList(new LambdaQueryWrapper<ProcessDesignDO>() {{
in(ProcessDesignDO::getProjectSubId, projectSubIdList);
}});
// 只考虑增加情况
if( projectSubIdList.size() > processDesignDOList.size()){
List<Long> existProjectSubIdList = processDesignDOList.stream().map(ProcessDesignDO::getProjectSubId).collect(Collectors.toList());
List<Long> needSavedProjectSubIdList = projectSubIdList.stream().filter(projectSubId -> !existProjectSubIdList.contains(projectSubId)).collect(Collectors.toList());
// 如未插入过 则生成铸造工艺
if(existProjectSubIdList.isEmpty()){
ProcessDesignSaveReqVO saveReqVO = new ProcessDesignSaveReqVO();
saveReqVO.setPlanId(planId)
.setProcessDesignType(ProcessDesignTypeEnum.BLUEPRINT_FOUNDRY_TECHNOLOGY.name())
.setStatus(ValidStatusEnum.VALID.getCode())
.setProjectId(projectId);
processDesignService.createProcessDesign(saveReqVO);
}
// 按每个子项目生成工艺设计
if(!needSavedProjectSubIdList.isEmpty()){
LocalDateTime startTime = LocalDateTime.now();
needSavedProjectSubIdList.forEach(projectSubId -> {
ProcessDesignSaveReqVO threeD = new ProcessDesignSaveReqVO();
threeD.setPlanId(planId)
.setProcessDesignType(ProcessDesignTypeEnum.BLUEPRINT_3D.name())
.setStatus(ValidStatusEnum.VALID.getCode())
.setProjectSubId(projectSubId)
.setProjectId(projectId);
processDesignService.createProcessDesign(threeD);
ProcessDesignSaveReqVO twoD = new ProcessDesignSaveReqVO();
twoD.setPlanId(planId)
.setProcessDesignType(ProcessDesignTypeEnum.BLUEPRINT_2D.name())
.setStatus(ValidStatusEnum.VALID.getCode())
.setProjectSubId(projectSubId)
.setProjectId(projectId);
processDesignService.createProcessDesign(twoD);
ProcessDesignSaveReqVO blank = new ProcessDesignSaveReqVO();
blank.setPlanId(planId)
.setProcessDesignType(ProcessDesignTypeEnum.BLUEPRINT_WORKBLANK.name())
.setStatus(ValidStatusEnum.VALID.getCode())
.setProjectSubId(projectSubId)
.setProjectId(projectId);
processDesignService.createProcessDesign(blank);
ProcessBomSaveReqVO bomSaveReqVO = new ProcessBomSaveReqVO();
bomSaveReqVO.setPlanId(planId)
.setProjectId(projectId)
.setProjectSubId(projectSubId)
.setVersion(0)
.setBomStatus(ProcessBomStatusEnum.SAVE.getCode())
.setStatus(ValidStatusEnum.VALID.getCode())
.setActive(OperateTypeEnum.CREATE.name());
processBomService.operateProcessBom(bomSaveReqVO);
// 手动记录日志
operateLogFrameworkService.createOperateLog(startTime,
BusinesTypeEnum.PROCESS_BOM.name(),
bomSaveReqVO.getId(),
OperateTypeEnum.CREATE.getType(),
bomSaveReqVO.getActiveOpinion());
});
}
}
}
}
/**
*
* @param projectId
*/
@Transactional(rollbackFor = Exception.class)
public void updatePlanStatusToTerminate(Long projectId) {
planService.updatePlanStatusToTerminateByProjectId(projectId);
// 同时更新工艺设计状态
updateProcessDesignStatusToTerminate(projectId);
}
/**
*
* @param projectId
*/
public void updateProcessDesignStatusToTerminate(Long projectId){
List<ProcessBomDO> processBomDOList = processBomMapper.selectList(new LambdaQueryWrapper<ProcessBomDO>() {{
eq(ProcessBomDO::getProjectId, projectId);
}});
if(!processBomDOList.isEmpty()){
processBomDOList.forEach(processBomDO -> {
processBomDO.setBomStatus(ProcessBomStatusEnum.TERMINATE.getCode());
});
processBomMapper.updateBatch(processBomDOList);
}
}
} }

@ -1,11 +1,11 @@
package com.chanko.yunxi.mes.module.heli.service.plan; package com.chanko.yunxi.mes.module.heli.service.plan;
import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; 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.controller.admin.plan.vo.PlanPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import javax.validation.Valid;
/** /**
* Service * Service
@ -54,6 +54,7 @@ public interface PlanService {
PageResult<PlanDO> getPlanPageByStatus(PlanPageReqVO pageReqVO); PageResult<PlanDO> getPlanPageByStatus(PlanPageReqVO pageReqVO);
void generatePlanByProjectId(Long projectId); Long generatePlanByProjectId(Long projectId);
void updatePlanStatusToTerminateByProjectId(Long projectId); void updatePlanStatusToTerminateByProjectId(Long projectId);
} }

@ -1,39 +1,33 @@
package com.chanko.yunxi.mes.module.heli.service.plan; package com.chanko.yunxi.mes.module.heli.service.plan;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanSaveReqVO;
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.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper;
import com.chanko.yunxi.mes.module.heli.enums.CodeEnum;
import com.chanko.yunxi.mes.module.heli.enums.ProjectPlanStatusEnum; import com.chanko.yunxi.mes.module.heli.enums.ProjectPlanStatusEnum;
import com.chanko.yunxi.mes.module.heli.service.projectorder.ProjectOrderService; import com.chanko.yunxi.mes.module.heli.service.projectorder.ProjectOrderService;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import com.github.dadiyang.equator.FieldInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.Date;
import java.util.stream.Collectors; import java.util.List;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; 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;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.STOCK_IN; import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.PLAN_NOT_EXISTS;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
/** /**
* Service * Service
@ -115,7 +109,9 @@ public class PlanServiceImpl implements PlanService {
} }
@Override @Override
public void generatePlanByProjectId(Long projectId){ @Transactional(rollbackFor = Exception.class)
public Long generatePlanByProjectId(Long projectId){
Long id = null;
// 查询最近归档历史并对比变化字段 // 查询最近归档历史并对比变化字段
try { try {
PlanDO planDO = planMapper.selectOne(new LambdaQueryWrapper<PlanDO>() {{ PlanDO planDO = planMapper.selectOne(new LambdaQueryWrapper<PlanDO>() {{
@ -160,9 +156,11 @@ public class PlanServiceImpl implements PlanService {
planSubMapper.insert(planSubDO); planSubMapper.insert(planSubDO);
} }
} }
id = planDO.getId();
}catch (Exception e){ }catch (Exception e){
log.error("base projectId to generate planDo error, id: {}, exception: {}", projectId, e.getMessage(), e); log.error("base projectId to generate planDo error, id: {}, exception: {}", projectId, e.getMessage(), e);
} }
return id;
} }
@Override @Override
public void updatePlanStatusToTerminateByProjectId(Long projectId){ public void updatePlanStatusToTerminateByProjectId(Long projectId){

@ -7,8 +7,8 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBo
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomSaveReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO; 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.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomMapper;
import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum; import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -43,6 +43,7 @@ public class ProcessBomServiceImpl implements ProcessBomService {
// 插入子表 // 插入子表
if(createReqVO.getProcessBomDetails() != null && !createReqVO.getProcessBomDetails().isEmpty()) createProcessBomDetailList(processBom.getId(), createReqVO.getProcessBomDetails()); if(createReqVO.getProcessBomDetails() != null && !createReqVO.getProcessBomDetails().isEmpty()) createProcessBomDetailList(processBom.getId(), createReqVO.getProcessBomDetails());
createReqVO.setId(processBom.getId());
// 返回 // 返回
return processBom.getId(); return processBom.getId();
} }

@ -1,23 +1,17 @@
package com.chanko.yunxi.mes.module.heli.service.processdesign; package com.chanko.yunxi.mes.module.heli.service.processdesign;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils; import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils;
import com.chanko.yunxi.mes.module.heli.controller.admin.processdesign.vo.ProcessDesignPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.processdesign.vo.ProcessDesignPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.processdesign.vo.ProcessDesignSaveReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.processdesign.vo.ProcessDesignSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesign.ProcessDesignDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesign.ProcessDesignDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesignprogress.ProcessDesignProgressDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesignprogress.ProcessDesignProgressDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignProgressMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignProgressMapper;
import com.chanko.yunxi.mes.module.heli.enums.ProcessDesignTypeEnum; import com.chanko.yunxi.mes.module.heli.enums.ProcessDesignTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.WarningEnum; import com.chanko.yunxi.mes.module.heli.enums.WarningEnum;
import com.chanko.yunxi.mes.module.heli.vo.WarningMessageVO; import com.chanko.yunxi.mes.module.heli.vo.WarningMessageVO;
import com.github.yulichang.query.MPJLambdaQueryWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -27,7 +21,6 @@ import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date;
import java.util.List; import java.util.List;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -55,7 +48,10 @@ public class ProcessDesignServiceImpl implements ProcessDesignService {
processDesignMapper.insert(processDesign); processDesignMapper.insert(processDesign);
// 插入子表 // 插入子表
if(createReqVO.getProcessDesignProgressList() != null && !createReqVO.getProcessDesignProgressList().isEmpty()) {
createProcessDesignProgressList(processDesign.getId(), createReqVO.getProcessDesignProgressList()); createProcessDesignProgressList(processDesign.getId(), createReqVO.getProcessDesignProgressList());
}
// 返回 // 返回
return processDesign.getId(); return processDesign.getId();
} }

@ -72,7 +72,7 @@
<el-table-column label="毛坯计划截止日期" align="center" prop="blankDate" :formatter="dateFormatter2" width="180"/> <el-table-column label="毛坯计划截止日期" align="center" prop="blankDate" :formatter="dateFormatter2" width="180"/>
<el-table-column label="毛坯是否延期" align="center" prop="blankDeferred" width="140"> <el-table-column label="毛坯是否延期" align="center" prop="blankDeferred" width="140">
<template #default="scope"> <template #default="scope">
<span v-if="(new Date().getTime() - scope.row.blankDate >= 0 && (!scope.row.progressBlank || parseFloat(scope.row.progressBlank) < 100))" style="color: red;"></span> <span v-if="scope.row.blankDate && (new Date().getTime() - scope.row.blankDate >= 0 && (!scope.row.progressBlank || parseFloat(scope.row.progressBlank) < 100))" style="color: red;"></span>
<span v-else></span> <span v-else></span>
</template> </template>
</el-table-column> </el-table-column>
@ -85,7 +85,7 @@
<el-table-column label="3D计划截止日期" align="center" prop="threeDimDate" :formatter="dateFormatter2" width="180"/> <el-table-column label="3D计划截止日期" align="center" prop="threeDimDate" :formatter="dateFormatter2" width="180"/>
<el-table-column label="3D是否延期" align="center" prop="3dDeferred" width="140"> <el-table-column label="3D是否延期" align="center" prop="3dDeferred" width="140">
<template #default="scope"> <template #default="scope">
<span v-if="(new Date().getTime() - scope.row.threeDimDate >= 0 && (!scope.row.progress3d || parseFloat(scope.row.progress3d) < 100))" style="color: red;"></span> <span v-if="scope.row.threeDimDate && (new Date().getTime() - scope.row.threeDimDate >= 0 && (!scope.row.progress3d || parseFloat(scope.row.progress3d) < 100))" style="color: red;"></span>
<span v-else></span> <span v-else></span>
</template> </template>
</el-table-column> </el-table-column>
@ -98,7 +98,7 @@
<el-table-column label="2D计划截止日期" align="center" prop="twoDimDate" :formatter="dateFormatter2" width="180"/> <el-table-column label="2D计划截止日期" align="center" prop="twoDimDate" :formatter="dateFormatter2" width="180"/>
<el-table-column label="2D是否延期" align="center" prop="2dDeferred" width="140"> <el-table-column label="2D是否延期" align="center" prop="2dDeferred" width="140">
<template #default="scope"> <template #default="scope">
<span v-if="(new Date().getTime() - scope.row.twoDimDate >= 0 && (!scope.row.progress2d || parseFloat(scope.row.progress2d) < 100))" style="color: red;"></span> <span v-if="scope.row.twoDimDate && (new Date().getTime() - scope.row.twoDimDate >= 0 && (!scope.row.progress2d || parseFloat(scope.row.progress2d) < 100))" style="color: red;"></span>
<span v-else></span> <span v-else></span>
</template> </template>
</el-table-column> </el-table-column>

@ -666,16 +666,6 @@ const queryData = async (type: string, id?: number) => {
customerList.value = customerData.list customerList.value = customerData.list
customerSelectList.value = customerData.list customerSelectList.value = customerData.list
//
let compositionParams = {
pageNo: 1,
pageSize: 10,
status: '1'
}
const compositionData = await CompositionApi.getCompositionPage(compositionParams)
compositionList.value = compositionData.list
compositionSelectList.value = compositionData.list
// //
if (!formData.value.businessMan) { if (!formData.value.businessMan) {
formData.value.businessMan = useUserStore().getUser.id // formData.value.businessMan = useUserStore().getUser.id //

@ -193,7 +193,7 @@ DROP TABLE IF EXISTS `pro_plan`;
DROP TABLE IF EXISTS `pro_process_bom`; DROP TABLE IF EXISTS `pro_process_bom`;
CREATE TABLE `pro_process_bom` ( CREATE TABLE `pro_process_bom` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增字段,唯一', `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增字段,唯一',
`code` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '编号,唯一', `code` varchar(255) COMMENT '编号,唯一',
`plan_id` BIGINT(20) NOT NULL COMMENT '生产计划id', `plan_id` BIGINT(20) NOT NULL COMMENT '生产计划id',
`project_id` BIGINT(20) NOT NULL COMMENT '项目id', `project_id` BIGINT(20) NOT NULL COMMENT '项目id',
`project_sub_id` bigint(20) NOT NULL COMMENT '子项目id', `project_sub_id` bigint(20) NOT NULL COMMENT '子项目id',
@ -208,7 +208,6 @@ CREATE TABLE `pro_process_bom` (
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE, PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_code`(`code`) USING BTREE,
INDEX `idx_plan`(`plan_id`) USING BTREE, INDEX `idx_plan`(`plan_id`) USING BTREE,
INDEX `idx_project`(`project_id`) USING BTREE INDEX `idx_project`(`project_id`) USING BTREE
) ENGINE=InnoDB COMMENT='工艺bom表'; ) ENGINE=InnoDB COMMENT='工艺bom表';

Loading…
Cancel
Save