src/main/java/com/ruoyi/production/bean/vo/ProductionOrderRoutingOperationVo.java
@@ -20,4 +20,7 @@ @Schema(description = "基础工序ID") private Long technologyOperationId; @Schema(description = "基础工序ID") private Long productionOrderRoutingOperationId; } src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java
@@ -4,12 +4,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto; import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamSyncDto; import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo; import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam; import com.ruoyi.production.service.ProductionOrderRoutingOperationParamService; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -51,7 +50,7 @@ @PutMapping @Operation(summary = "修改生产订单工艺路线工序参数") public R<Boolean> edit(@RequestBody ProductionOrderRoutingOperationParam item) { return R.ok(productionOrderRoutingOperationParamService.saveProductionOrderRoutingOperationParam(item)); return R.ok(productionOrderRoutingOperationParamService.updateById(item)); } @DeleteMapping("/{id}") @@ -60,9 +59,4 @@ return R.ok(productionOrderRoutingOperationParamService.removeProductionOrderRoutingOperationParam(id)); } @PostMapping("/sync") @Operation(summary = "按订单工艺路线工序同步工序参数") public R<Integer> sync(@RequestBody ProductionOrderRoutingOperationParamSyncDto syncDto) { return R.ok(productionOrderRoutingOperationParamService.syncProductionOrderRoutingOperationParam(syncDto)); } } src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java
@@ -28,7 +28,7 @@ @Schema(description = "生产订单id") private Long productionOrderId; @Schema(description = "工艺路线工序表id") @Schema(description = "工艺路线工序表id(额外新增的时候这个字段是空的)") private Long technologyRoutingOperationId; @Schema(description = "生产订单工艺路线id") @@ -64,4 +64,7 @@ @Schema(description = "工序名称") private String operationName; @Schema(description = "工序表id") private Long technologyOperationId; } src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperationParam.java
@@ -3,8 +3,6 @@ import com.baomidou.mybatisplus.annotation.*; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.Getter; import lombok.Setter; import java.io.Serializable; import java.time.LocalDateTime; @@ -84,9 +82,9 @@ @Schema(description = "工序参数ID") private Long technologyOperationParamId; @Schema(description = "工艺路线工序ID") private Long technologyRoutingOperationId; @Schema(description = "标准值") private String standardValue; @Schema(description = "生产订单工艺路线工序ID") private Long productionOrderRoutingOperationId; } src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -26,12 +26,6 @@ @Schema(description = "报工人员") private String userName; @Schema(description = "生产项目id") private Long productProcessRouteItemId; @Schema(description = "工单id") private Long workOrderId; @Schema(description = "生产工序工单id") private Long productionOperationTaskId; @@ -51,9 +45,6 @@ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; @Schema(description = "租户ID") @TableField(fill = FieldFill.INSERT) private Long tenantId; @Schema(description = "创建用户") @TableField(fill = FieldFill.INSERT) private Integer createUser; src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationParamService.java
@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto; import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamSyncDto; import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo; import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam; @@ -31,5 +30,4 @@ boolean removeProductionOrderRoutingOperationParam(Long id); int syncProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParamSyncDto syncDto); } src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java
@@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto; import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamSyncDto; import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo; import com.ruoyi.production.mapper.ProductionOrderMapper; import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper; @@ -17,7 +16,9 @@ import com.ruoyi.production.pojo.ProductionOrderRoutingOperation; import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam; import com.ruoyi.production.service.ProductionOrderRoutingOperationParamService; import com.ruoyi.technology.mapper.TechnologyParamMapper; import com.ruoyi.technology.mapper.TechnologyRoutingOperationParamMapper; import com.ruoyi.technology.pojo.TechnologyParam; import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -34,6 +35,7 @@ private final ProductionOrderRoutingOperationParamMapper productionOrderRoutingOperationParamMapper; private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper; private final ProductionOrderMapper productionOrderMapper; private final TechnologyParamMapper technologyParamMapper; private final TechnologyRoutingOperationParamMapper technologyRoutingOperationParamMapper; @Override @@ -57,7 +59,7 @@ @Override public boolean saveProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParam item) { ProductionOrderRoutingOperation routingOperation = getRoutingOperation(item.getTechnologyRoutingOperationId()); ProductionOrderRoutingOperation routingOperation = getRoutingOperation(item.getProductionOrderRoutingOperationId()); fillFromSourceParam(item, routingOperation); validateManualFields(item); checkDuplicate(item); @@ -69,62 +71,12 @@ return this.removeById(id); } @Override public int syncProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParamSyncDto syncDto) { if (syncDto == null || syncDto.getProductionOrderRoutingOperationId() == null) { throw new ServiceException("productionOrderRoutingOperationId is required"); } ProductionOrderRoutingOperation routingOperation = getRoutingOperation(syncDto.getProductionOrderRoutingOperationId()); List<TechnologyRoutingOperationParam> sourceParamList = technologyRoutingOperationParamMapper.selectList( Wrappers.<TechnologyRoutingOperationParam>lambdaQuery() .eq(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getTechnologyRoutingOperationId()) .orderByAsc(TechnologyRoutingOperationParam::getId) ); boolean replaceExisting = syncDto.getReplaceExisting() == null || syncDto.getReplaceExisting(); if (replaceExisting) { productionOrderRoutingOperationParamMapper.delete( Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery() .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getId()) ); } int successCount = 0; for (TechnologyRoutingOperationParam sourceParam : sourceParamList) { boolean exists = productionOrderRoutingOperationParamMapper.selectCount( Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery() .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getId()) .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationParamId, sourceParam.getId()) ) > 0; if (!replaceExisting && exists) { continue; } ProductionOrderRoutingOperationParam target = new ProductionOrderRoutingOperationParam(); target.setTechnologyRoutingOperationId(routingOperation.getId()); target.setTechnologyRoutingOperationParamId(sourceParam.getId()); target.setProductionOrderId(routingOperation.getProductionOrderId()); target.setTechnologyOperationId(sourceParam.getTechnologyOperationId()); target.setTechnologyOperationParamId(sourceParam.getTechnologyOperationParamId()); target.setParamId(sourceParam.getParamId()); target.setParamCode(sourceParam.getParamCode()); target.setParamName(sourceParam.getParamName()); target.setParamType(sourceParam.getParamType()); target.setParamFormat(sourceParam.getParamFormat()); target.setUnit(sourceParam.getUnit()); target.setIsRequired(sourceParam.getIsRequired()); target.setRemark(sourceParam.getRemark()); target.setStandardValue(sourceParam.getStandardValue()); productionOrderRoutingOperationParamMapper.insert(target); successCount++; } return successCount; } private LambdaQueryWrapper<ProductionOrderRoutingOperationParam> buildQueryWrapper(ProductionOrderRoutingOperationParamDto dto) { ProductionOrderRoutingOperationParam query = dto == null ? new ProductionOrderRoutingOperationParam() : dto; return Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery() .eq(query.getId() != null, ProductionOrderRoutingOperationParam::getId, query.getId()) .eq(query.getProductionOrderId() != null, ProductionOrderRoutingOperationParam::getProductionOrderId, query.getProductionOrderId()) .eq(query.getTechnologyRoutingOperationId() != null, ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, query.getTechnologyRoutingOperationId()) .eq(query.getProductionOrderRoutingOperationId() != null, ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId, query.getProductionOrderRoutingOperationId()) .eq(query.getTechnologyOperationId() != null, ProductionOrderRoutingOperationParam::getTechnologyOperationId, query.getTechnologyOperationId()) .eq(query.getTechnologyRoutingOperationParamId() != null, @@ -135,7 +87,7 @@ ProductionOrderRoutingOperationParam::getParamCode, query.getParamCode()) .like(query.getParamName() != null && !query.getParamName().trim().isEmpty(), ProductionOrderRoutingOperationParam::getParamName, query.getParamName()) .orderByAsc(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId) .orderByAsc(ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId) .orderByAsc(ProductionOrderRoutingOperationParam::getId); } @@ -151,25 +103,28 @@ } private void fillFromSourceParam(ProductionOrderRoutingOperationParam item, ProductionOrderRoutingOperation routingOperation) { item.setTechnologyRoutingOperationId(routingOperation.getId()); item.setProductionOrderId(routingOperation.getProductionOrderId()); item.setProductionOrderRoutingOperationId(routingOperation.getId()); ProductionOrder productionOrder = productionOrderMapper.selectById(routingOperation.getProductionOrderId()); if (productionOrder == null) { throw new ServiceException("Production order not found"); } if (item.getTechnologyRoutingOperationParamId() == null) { if (item.getParamId() == null) { return; } TechnologyRoutingOperationParam sourceParam = technologyRoutingOperationParamMapper.selectById(item.getTechnologyRoutingOperationParamId()); TechnologyParam sourceParam = technologyParamMapper.selectById(item.getParamId()); if (sourceParam == null) { throw new ServiceException("Technology routing operation param not found"); throw new ServiceException("Technology param not found"); } if (!routingOperation.getTechnologyRoutingOperationId().equals(sourceParam.getTechnologyRoutingOperationId())) { throw new ServiceException("Source param does not belong to routing operation"); if (item.getTechnologyOperationParamId() != null) { TechnologyRoutingOperationParam sourceRoutingOperationParam = technologyRoutingOperationParamMapper.selectById(item.getTechnologyOperationParamId()); item.setTechnologyOperationId(sourceRoutingOperationParam.getTechnologyOperationId()); item.setTechnologyOperationParamId(sourceRoutingOperationParam.getTechnologyOperationParamId()); if (item.getStandardValue() == null) { item.setStandardValue(sourceRoutingOperationParam.getStandardValue()); } } item.setTechnologyOperationId(sourceParam.getTechnologyOperationId()); item.setTechnologyOperationParamId(sourceParam.getTechnologyOperationParamId()); item.setParamId(sourceParam.getParamId()); item.setParamId(sourceParam.getId()); item.setParamCode(sourceParam.getParamCode()); item.setParamName(sourceParam.getParamName()); item.setParamType(sourceParam.getParamType()); @@ -178,9 +133,6 @@ item.setIsRequired(sourceParam.getIsRequired()); if (item.getRemark() == null || item.getRemark().trim().isEmpty()) { item.setRemark(sourceParam.getRemark()); } if (item.getStandardValue() == null) { item.setStandardValue(sourceParam.getStandardValue()); } } @@ -196,7 +148,7 @@ private void checkDuplicate(ProductionOrderRoutingOperationParam item) { boolean duplicate = productionOrderRoutingOperationParamMapper.selectCount( Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery() .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, item.getTechnologyRoutingOperationId()) .eq(ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId, item.getProductionOrderRoutingOperationId()) .eq(item.getTechnologyRoutingOperationParamId() != null, ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationParamId, item.getTechnologyRoutingOperationParamId()) .eq(item.getTechnologyRoutingOperationParamId() == null && item.getParamCode() != null, src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java
@@ -1,17 +1,24 @@ package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.mapper.ProductionOperationTaskMapper; import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper; import com.ruoyi.production.mapper.ProductionOrderRoutingOperationParamMapper; import com.ruoyi.production.mapper.ProductionProductMainMapper; import com.ruoyi.production.pojo.ProductionOperationTask; import com.ruoyi.production.pojo.ProductionOrderRoutingOperation; import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam; import com.ruoyi.production.pojo.ProductionProductMain; import com.ruoyi.production.service.ProductionOrderRoutingOperationService; import com.ruoyi.production.service.ProductionProductMainService; import com.ruoyi.technology.mapper.TechnologyOperationParamMapper; import com.ruoyi.technology.mapper.TechnologyParamMapper; import com.ruoyi.technology.pojo.TechnologyOperationParam; import com.ruoyi.technology.pojo.TechnologyParam; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,6 +26,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @Service @@ -31,10 +39,36 @@ private final ProductionOperationTaskMapper productionOperationTaskMapper; private final ProductionProductMainMapper productionProductMainMapper; private final ProductionProductMainService productionProductMainService; private final TechnologyOperationParamMapper technologyOperationParamMapper; private final TechnologyParamMapper technologyParamMapper; private final ProductionOrderRoutingOperationParamMapper productionOrderRoutingOperationParamMapper; @Override public R addRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation) { int insert = productionOrderRoutingOperationMapper.insert(productionOrderRoutingOperation); //工序关联的参数需要同步新增 List<TechnologyOperationParam> technologyOperationParams = technologyOperationParamMapper.selectList(Wrappers.<TechnologyOperationParam>lambdaQuery() .eq(TechnologyOperationParam::getTechnologyOperationId, productionOrderRoutingOperation.getTechnologyOperationId())); if (CollectionUtils.isNotEmpty(technologyOperationParams)){ ArrayList<ProductionOrderRoutingOperationParam> productionOrderRoutingOperationParams = new ArrayList<>(); for (TechnologyOperationParam technologyOperationParam : technologyOperationParams) { TechnologyParam technologyParam = technologyParamMapper.selectById(technologyOperationParam.getTechnologyParamId()); ProductionOrderRoutingOperationParam productionOrderRoutingOperationParam = new ProductionOrderRoutingOperationParam(); productionOrderRoutingOperationParam.setProductionOrderId(productionOrderRoutingOperation.getProductionOrderId()); productionOrderRoutingOperationParam.setProductionOrderRoutingOperationId(productionOrderRoutingOperation.getId()); productionOrderRoutingOperationParam.setParamCode(technologyParam.getParamCode()); productionOrderRoutingOperationParam.setParamName(technologyParam.getParamName()); productionOrderRoutingOperationParam.setParamType(technologyParam.getParamType()); productionOrderRoutingOperationParam.setParamFormat(technologyParam.getParamFormat()); productionOrderRoutingOperationParam.setUnit(technologyParam.getUnit()); productionOrderRoutingOperationParam.setIsRequired(technologyParam.getIsRequired()); productionOrderRoutingOperationParam.setRemark(technologyParam.getRemark()); productionOrderRoutingOperationParam.setParamId(technologyParam.getId()); productionOrderRoutingOperationParam.setTechnologyOperationId(productionOrderRoutingOperation.getTechnologyOperationId()); productionOrderRoutingOperationParams.add(productionOrderRoutingOperationParam); } productionOrderRoutingOperationParamMapper.insert(productionOrderRoutingOperationParams); } String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); if (insert > 0) { ProductionOperationTask lastTask = productionOperationTaskMapper.selectOne( src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -237,6 +237,7 @@ targetOperation.setDragSort(sourceOperation.getDragSort()); targetOperation.setIsQuality(sourceOperation.getIsQuality()); targetOperation.setOperationName(operationNameMap.get(sourceOperation.getTechnologyOperationId())); targetOperation.setTechnologyOperationId(sourceOperation.getTechnologyOperationId()); productionOrderRoutingOperationMapper.insert(targetOperation); ProductionOperationTask task = new ProductionOperationTask(); @@ -256,7 +257,7 @@ // 工序执行参数同样做快照,避免工艺参数调整影响已下达订单。 ProductionOrderRoutingOperationParam targetParam = new ProductionOrderRoutingOperationParam(); targetParam.setProductionOrderId(productionOrder.getId()); targetParam.setTechnologyRoutingOperationId(targetOperation.getId()); targetParam.setProductionOrderRoutingOperationId(targetOperation.getId()); targetParam.setTechnologyRoutingOperationParamId(sourceParam.getId()); targetParam.setParamId(sourceParam.getParamId()); targetParam.setTechnologyOperationId(sourceParam.getTechnologyOperationId()); @@ -312,7 +313,7 @@ target.setProductModelId(source.getProductModelId()); target.setTechnologyOperationId(source.getOperationId()); target.setUnitQuantity(source.getUnitQuantity()); target.setDemandedQuantity(resolveBomDemandQuantity(source, orderQuantity)); target.setDemandedQuantity(source.getUnitQuantity().multiply(orderQuantity)); target.setUnit(source.getUnit()); productionBomStructureMapper.insert(target); idMap.put(source.getId(), target.getId()); @@ -571,16 +572,6 @@ } else { productionOrderPickMapper.updateById(orderPick); } } private BigDecimal resolveBomDemandQuantity(TechnologyBomStructure source, BigDecimal orderQuantity) { // 工艺 BOM 中的需求量按“单件需求 * 订单数量”展开成订单级需求。 BigDecimal baseQuantity = source.getDemandedQuantity() != null ? source.getDemandedQuantity() : source.getUnitQuantity(); baseQuantity = baseQuantity == null ? BigDecimal.ZERO : baseQuantity; if (baseQuantity.compareTo(BigDecimal.ZERO) <= 0) { return BigDecimal.ZERO; } return baseQuantity.multiply(orderQuantity); } private List<Long> parsePlanIds(String productionPlanIds) { src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -136,7 +136,6 @@ productionProductMain.setUserId(dto.getUserId()); productionProductMain.setUserName(dto.getUserName()); productionProductMain.setProductionOperationTaskId(productionOperationTask.getId()); productionProductMain.setWorkOrderId(productionOperationTask.getId()); productionProductMain.setStatus(0); productionProductMainMapper.insert(productionProductMain); src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
@@ -66,4 +66,6 @@ public R remove(@RequestBody List<Long> ids) { return R.ok(technologyRoutingService.removeTechnologyRouting(ids)); } //TODO 增加工艺路线附件上传 @陈海杰 } src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml
@@ -7,7 +7,7 @@ <id column="id" property="id" /> <result column="production_order_id" property="productionOrderId" /> <result column="technology_routing_operation_id" property="technologyRoutingOperationId" /> <result column="technology_routing_id" property="technologyRoutingId" /> <result column="order_routing_id" property="orderRoutingId" /> <result column="product_model_id" property="productModelId" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> @@ -19,6 +19,7 @@ <resultMap id="OperationVoResultMap" type="com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationVo" extends="BaseResultMap"> <result column="technologyOperationId" property="technologyOperationId" /> <result column="productionOrderRoutingOperationId" property="productionOrderRoutingOperationId" /> <result column="productName" property="productName" /> <result column="model" property="model" /> <result column="unit" property="unit" /> @@ -26,13 +27,14 @@ <select id="selectVoListByOrderId" resultMap="OperationVoResultMap"> SELECT poro.id AS productionOrderRoutingOperationId, poro.*, tro.technology_operation_id AS technologyOperationId, too.id AS technologyOperationId, p.product_name AS productName, pm.model AS model, pm.unit AS unit FROM production_order_routing_operation poro LEFT JOIN technology_routing_operation tro ON poro.technology_routing_operation_id = tro.id LEFT JOIN technology_operation too ON poro.technology_operation_id = too.id LEFT JOIN product_model pm ON poro.product_model_id = pm.id LEFT JOIN product p ON pm.product_id = p.id WHERE poro.production_order_id = #{orderId}