src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java
@@ -1,10 +1,12 @@ package com.ruoyi.production.bean.dto; import com.ruoyi.production.pojo.ProductionOrder; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) @Data @Schema(name = "ProductionOrderDto", description = "生产订单查询对象") public class ProductionOrderDto extends ProductionOrder { } src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java
@@ -31,6 +31,13 @@ private String productName; /** * 客户名称 */ @Schema(description = "客户名称") @Excel(name = "客户名称") private String customerName; /** * 产品规格 */ @Schema(description = "产品规格") src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
@@ -2,21 +2,29 @@ import com.ruoyi.basic.dto.StorageBlobVO; import com.ruoyi.production.pojo.ProductionOrder; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.List; @Data @Schema(name = "ProductionOrderVo", description = "生产订单返回对象") public class ProductionOrderVo extends ProductionOrder { @Schema(description = "销售合同号") private String salesContractNo; @Schema(description = "客户名称") private String customerName; @Schema(description = "产品名称") private String productName; @Schema(description = "规格型号") private String model; @Schema(description = "工艺路线编码") private String processRouteCode; @Schema(description = "产品图片") private List<StorageBlobVO> productImages; } src/main/java/com/ruoyi/production/bean/vo/ProductionPlanVo.java
@@ -1,10 +1,26 @@ package com.ruoyi.production.bean.vo; import com.ruoyi.production.pojo.ProductionPlan; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) @Data @Schema(name = "ProductionPlanVo", description = "生产计划返回对象") public class ProductionPlanVo extends ProductionPlan { @Schema(description = "物料编码") private String materialCode; @Schema(description = "产品名称") private String productName; @Schema(description = "规格型号") private String model; @Schema(description = "单位") private String unit; @Schema(description = "关联产品物料ID") private Long productMaterialId; } src/main/java/com/ruoyi/production/mapper/ProductionPlanMapper.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.production.bean.dto.ProductionPlanDto; import com.ruoyi.production.bean.vo.ProductionPlanVo; import com.ruoyi.production.pojo.ProductionPlan; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -21,7 +22,7 @@ @Mapper public interface ProductionPlanMapper extends BaseMapper<ProductionPlan> { IPage<ProductionPlanDto> listPage(Page page, @Param("c") ProductionPlanDto productionPlanDto); IPage<ProductionPlanVo> listPage(Page<ProductionPlanDto> page, @Param("c") ProductionPlanDto productionPlanDto); List<ProductionPlanDto> selectWithMaterialByIds(@Param("ids") List<Long> ids); src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
@@ -75,7 +75,7 @@ @TableField(fill = FieldFill.INSERT) private Long deptId; @Schema(description = "计划完成时间。选填;按生产计划生成订单时,系统会优先自动带出交期。") @Schema(description = "计划完成时间") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate planCompleteTime; src/main/java/com/ruoyi/production/pojo/ProductionPlan.java
@@ -1,13 +1,13 @@ package com.ruoyi.production.pojo; import com.baomidou.mybatisplus.annotation.*; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; /** @@ -34,7 +34,7 @@ private String mpsNo; @Schema(description = "需求日期") private LocalDateTime requiredDate; private LocalDate requiredDate; @Schema(description = "备注") private String remark; @@ -61,10 +61,6 @@ @Schema(description = "需求数量") private BigDecimal qtyRequired; @Schema(description = "状态") @TableLogic private String state; @Schema(description = "是否下发制造订单") private Boolean issued; @@ -75,7 +71,7 @@ private String isAudit; @Schema(description = "承诺日期") private LocalDateTime promisedDeliveryDate; private LocalDate promisedDeliveryDate; @Schema(description = "申请单编号") private String applyNo; src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -15,60 +15,24 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.production.bean.dto.ProductionOrderDto; import com.ruoyi.production.bean.vo.ProductionOrderVo; import com.ruoyi.production.mapper.ProductionBomStructureMapper; import com.ruoyi.production.mapper.ProductionOperationTaskMapper; import com.ruoyi.production.mapper.ProductionOrderBomMapper; import com.ruoyi.production.mapper.ProductionOrderMapper; import com.ruoyi.production.mapper.ProductionOrderPickMapper; import com.ruoyi.production.mapper.ProductionOrderPickRecordMapper; import com.ruoyi.production.mapper.ProductionOrderRoutingMapper; import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper; import com.ruoyi.production.mapper.ProductionOrderRoutingOperationParamMapper; import com.ruoyi.production.mapper.ProductionPlanMapper; import com.ruoyi.production.mapper.ProductionProductMainMapper; import com.ruoyi.production.pojo.ProductionOrderPick; import com.ruoyi.production.pojo.ProductionOrderPickRecord; import com.ruoyi.production.pojo.ProductionBomStructure; import com.ruoyi.production.pojo.ProductionOperationTask; import com.ruoyi.production.pojo.ProductionOrder; import com.ruoyi.production.pojo.ProductionOrderBom; import com.ruoyi.production.pojo.ProductionOrderRouting; import com.ruoyi.production.pojo.ProductionOrderRoutingOperation; import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam; import com.ruoyi.production.pojo.ProductionPlan; import com.ruoyi.production.pojo.ProductionProductMain; import com.ruoyi.production.enums.ProductOrderStatusEnum; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductionOrderService; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.production.service.ProductionOrderService; import com.ruoyi.technology.mapper.TechnologyBomMapper; import com.ruoyi.technology.mapper.TechnologyBomStructureMapper; import com.ruoyi.technology.mapper.TechnologyRoutingMapper; import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper; import com.ruoyi.technology.mapper.TechnologyRoutingOperationParamMapper; import com.ruoyi.technology.pojo.TechnologyBom; import com.ruoyi.technology.pojo.TechnologyBomStructure; import com.ruoyi.technology.pojo.TechnologyRouting; import com.ruoyi.technology.pojo.TechnologyRoutingOperation; import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam; import com.ruoyi.technology.mapper.*; import com.ruoyi.technology.pojo.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.*; import java.util.stream.Collectors; @Service @@ -591,10 +555,10 @@ return null; } if (productionPlan.getPromisedDeliveryDate() != null) { return productionPlan.getPromisedDeliveryDate().toLocalDate(); return productionPlan.getPromisedDeliveryDate(); } if (productionPlan.getRequiredDate() != null) { return productionPlan.getRequiredDate().toLocalDate(); return productionPlan.getRequiredDate(); } return null; } src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java
@@ -13,7 +13,6 @@ import com.ruoyi.production.bean.dto.ProductionPlanDto; import com.ruoyi.production.bean.dto.ProductionPlanImportDto; import com.ruoyi.production.bean.vo.ProductionPlanVo; import com.ruoyi.production.enums.ProductOrderStatusEnum; import com.ruoyi.production.mapper.ProductionOrderMapper; import com.ruoyi.production.mapper.ProductionPlanMapper; import com.ruoyi.production.pojo.ProductionOrder; @@ -42,14 +41,7 @@ @Override public IPage<ProductionPlanVo> listPage(Page<ProductionPlanDto> page, ProductionPlanDto productionPlanDto) { IPage<ProductionPlanVo> planVoIPage = productionPlanMapper.listPage(page, productionPlanDto) .convert(dto -> { ProductionPlanVo vo = new ProductionPlanVo(); BeanUtils.copyProperties(dto, vo); return vo; }); return planVoIPage; return productionPlanMapper.listPage(page, productionPlanDto); } /** @@ -85,7 +77,89 @@ ProductionOrder productionOrder = new ProductionOrder(); productionOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity()); productionOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime()); productionOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode()); // // 叠加剩余方数 // BigDecimal totalRemainingVolume = plans.stream() // .map(ProductionPlan::getRemainingVolume) // .filter(Objects::nonNull) // .reduce(BigDecimal.ZERO, BigDecimal::add); // // 判断下发数量是否大于等于剩余方数 // if (productionPlanDto.getTotalAssignedQuantity().compareTo(totalRemainingVolume) > 0) { // throw new BaseException("操作失败,下发数量不能大于剩余方数"); // } // // // 创建生产订单 // ProductOrder productOrder = new ProductOrder(); // productOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity()); // productOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime()); // productOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode()); // productOrder.setStrength(productionPlanDto.getStrength()); // productOrder.setProductMaterialSkuId(plans.get(0).getProductMaterialSkuId()); // // Long orderId = productOrderService.insertProductOrder(productOrder); // // // 当下发的产品为砌块或板材,就拉取BOM子集与工艺路线子集数据存入到附表中 // if ("砌块".equals(productionPlanDto.getProductName())) { // productOrder.setRouteId(productionOrderAppendixService.populateBlocks(orderId, productionPlanDto)); // } // if ("板材".equals(productionPlanDto.getProductName())) { // productOrder.setRouteId(productionOrderAppendixService.populatePlates(orderId, productionPlanDto)); // } // // 更新绑定的工艺路线 // productOrderService.updateById(productOrder); // // // 根据下发数量,从第一个生产计划开始分配方数 // BigDecimal assignedVolume = BigDecimal.ZERO; // for (ProductionPlan plan : plans) { // BigDecimal volume = plan.getVolume(); // if (volume == null) { // continue; // } // // 计算剩余方数 // BigDecimal remainingVolume = plan.getRemainingVolume(); // if (remainingVolume.compareTo(BigDecimal.ZERO) <= 0) { // continue; // } // // ProductOrderPlan productOrderPlan = new ProductOrderPlan(); // productOrderPlan.setProductOrderId(productOrder.getId()); // productOrderPlan.setProductionPlanId(plan.getId()); // // if (assignedVolume.add(remainingVolume).compareTo(productionPlanDto.getTotalAssignedQuantity()) >= 0) { // // 最后一个计划,分配剩余方数 // BigDecimal lastRemainingVolume = productionPlanDto.getTotalAssignedQuantity().subtract(assignedVolume); // BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO).add(lastRemainingVolume); // plan.setAssignedQuantity(assignedQuantity); // plan.setStatus(assignedQuantity.compareTo(plan.getVolume()) >= 0 ? 2 : 1); // productOrderPlan.setAssignedQuantity(lastRemainingVolume); // productionPlanMapper.updateById(plan); // productOrderPlanMapper.insert(productOrderPlan); // break; // } // // // 分配当前计划方数 // BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO).add(remainingVolume); // plan.setAssignedQuantity(assignedQuantity); // plan.setStatus(assignedQuantity.compareTo(plan.getVolume()) >= 0 ? 2 : 1); // productOrderPlan.setAssignedQuantity(remainingVolume); // // 更新生产计划 // productionPlanMapper.updateById(plan); // // 创建关联关系 // productOrderPlanMapper.insert(productOrderPlan); // assignedVolume = assignedVolume.add(remainingVolume); // } // // for (ProductionPlan plan : plans) { // BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO); // BigDecimal volume = Optional.ofNullable(plan.getVolume()).orElse(BigDecimal.ZERO); // if (assignedQuantity.compareTo(BigDecimal.ZERO) <= 0) { // plan.setStatus(0); // } else if (assignedQuantity.compareTo(volume) >= 0) { // plan.setStatus(2); // } else { // plan.setStatus(1); // } // productionPlanMapper.updateById(plan); // } return true; } src/main/resources/mapper/production/ProductionOrderMapper.xml
@@ -19,8 +19,121 @@ <result column="sale_ledger_product_id" property="saleLedgerProductId" /> <result column="create_user" property="createUser" /> <result column="dept_id" property="deptId" /> <result column="plan_complete_time" property="planCompleteTime" /> <result column="status" property="status" /> </resultMap> <resultMap id="ProductionOrderVoResultMap" type="com.ruoyi.production.bean.vo.ProductionOrderVo" extends="BaseResultMap"> <result column="salesContractNo" property="salesContractNo" /> <result column="customerName" property="customerName" /> <result column="productName" property="productName" /> <result column="model" property="model" /> <result column="processRouteCode" property="processRouteCode" /> </resultMap> <sql id="ProductionOrderVoColumns"> po.id, po.sales_ledger_id, po.production_plan_ids, po.product_model_id, po.nps_no, po.create_time, po.update_time, po.technology_routing_id, po.quantity, po.complete_quantity, po.start_time, po.end_time, po.sale_ledger_product_id, po.create_user, po.dept_id, po.plan_complete_time, po.status, sl.sales_contract_no as salesContractNo, sl.customer_name as customerName, p.product_name as productName, pm.model as model, tr.process_route_code as processRouteCode </sql> <sql id="ProductionOrderVoFrom"> from production_order po left join sales_ledger sl on po.sales_ledger_id = sl.id left join product_model pm on po.product_model_id = pm.id left join product p on pm.product_id = p.id left join technology_routing tr on po.technology_routing_id = tr.id </sql> <sql id="ProductionOrderWhere"> <where> <if test="c != null"> <if test="c.id != null"> and po.id = #{c.id} </if> <if test="c.salesLedgerId != null"> and po.sales_ledger_id = #{c.salesLedgerId} </if> <if test="c.productModelId != null"> and po.product_model_id = #{c.productModelId} </if> <if test="c.technologyRoutingId != null"> and po.technology_routing_id = #{c.technologyRoutingId} </if> <if test="c.saleLedgerProductId != null"> and po.sale_ledger_product_id = #{c.saleLedgerProductId} </if> <if test="c.status != null"> and po.status = #{c.status} </if> <if test="c.createUser != null"> and po.create_user = #{c.createUser} </if> <if test="c.deptId != null"> and po.dept_id = #{c.deptId} </if> <if test="c.npsNo != null and c.npsNo != ''"> and po.nps_no like concat('%', #{c.npsNo}, '%') </if> <if test="c.productionPlanIds != null and c.productionPlanIds != ''"> and po.production_plan_ids like concat('%', #{c.productionPlanIds}, '%') </if> <if test="c.planCompleteTime != null"> and po.plan_complete_time = #{c.planCompleteTime} </if> <if test="c.startTime != null"> and po.start_time >= #{c.startTime} </if> <if test="c.endTime != null"> and po.end_time <= #{c.endTime} </if> </if> </where> </sql> <select id="pageProductionOrder" resultMap="ProductionOrderVoResultMap"> select <include refid="ProductionOrderVoColumns" /> <include refid="ProductionOrderVoFrom" /> <include refid="ProductionOrderWhere" /> order by po.id desc </select> <select id="listProductionOrder" resultMap="ProductionOrderVoResultMap"> select <include refid="ProductionOrderVoColumns" /> <include refid="ProductionOrderVoFrom" /> <include refid="ProductionOrderWhere" /> order by po.id desc </select> <select id="getProductionOrderInfo" resultMap="ProductionOrderVoResultMap"> select <include refid="ProductionOrderVoColumns" /> <include refid="ProductionOrderVoFrom" /> where po.id = #{id} limit 1 </select> <select id="selectProgressOrders" resultType="com.ruoyi.home.dto.ProductionProgressOrderDto"> select po.nps_no, sl.sales_contract_no, src/main/resources/mapper/production/ProductionPlanMapper.xml
@@ -14,49 +14,25 @@ <result column="update_user" property="updateUser"/> <result column="product_model_id" property="productModelId"/> <result column="qty_required" property="qtyRequired"/> <result column="state" property="state"/> <result column="issued" property="issued"/> <result column="source" property="source"/> <result column="is_audit" property="isAudit"/> <result column="promised_delivery_date" property="promisedDeliveryDate"/> </resultMap> <select id="listPage" resultType="com.ruoyi.production.bean.dto.ProductionPlanDto"> <select id="listPage" resultType="com.ruoyi.production.bean.vo.ProductionPlanVo"> SELECT pp.*, pms.material_code AS materialCode, pms.model, pmdl.model, pms.product_id AS productMaterialId, pm.product_name AS productName, pm.unit p.product_name AS productName, pmdl.unit FROM production_plan pp left join product_material_sku pms on pp.product_material_sku_id = pms.id left join product_material pm on pms.product_id = pm.id WHERE 1 = 1 <if test="c.customerName != null and c.customerName != '' "> AND pp.customer_name LIKE CONCAT('%',#{c.customerName},'%') </if> <if test="c.productName != null and c.productName != '' "> AND pm.product_name LIKE CONCAT('%',#{c.productName},'%') </if> <if test="c.materialCode != null and c.materialCode != '' "> AND pms.material_code LIKE CONCAT('%',#{c.materialCode},'%') </if> <if test="c.model != null and c.model != '' "> AND pms.model LIKE CONCAT('%',#{c.model},'%') </if> <if test="c.status != null"> AND pp.status =#{c.status} </if> <if test="c.applyNo != null and c.applyNo != '' "> AND pp.apply_no LIKE CONCAT('%',#{c.applyNo},'%') </if> <if test="c.startDate != null"> AND pp.start_date >= DATE_FORMAT(#{c.startDate},'%Y-%m-%d') </if> <if test="c.endDate != null"> AND pp.end_date <= DATE_FORMAT(#{c.endDate},'%Y-%m-%d') </if> left join product_model pmdl on pp.product_model_id = pmdl.id left join product p on pmdl.product_id = p.id ORDER BY COALESCE(pp.form_modified_time, pp.id) DESC </select> @@ -64,12 +40,14 @@ SELECT pp.*, pms.material_code AS materialCode, pms.model, pm.product_name AS productName, pm.unit pmdl.model, p.product_name AS productName, pmdl.unit, pms.product_id AS productMaterialId FROM production_plan pp LEFT JOIN product_material_sku pms ON pp.product_material_sku_id = pms.id LEFT JOIN product_material pm ON pms.product_id = pm.id LEFT JOIN product_model pmdl ON pp.product_model_id = pmdl.id LEFT JOIN product p ON pmdl.product_id = p.id WHERE pp.id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} @@ -80,13 +58,14 @@ SELECT pp.*, pms.material_code AS materialCode, pms.model, pmdl.model, pms.product_id AS productMaterialId, pm.product_name AS productName, pm.unit p.product_name AS productName, pmdl.unit FROM production_plan pp left join product_material_sku pms on pp.product_material_sku_id = pms.id left join product_material pm on pms.product_id = pm.id left join product_model pmdl on pp.product_model_id = pmdl.id left join product p on pmdl.product_id = p.id WHERE pp.id = #{productionPlanId} </select> </mapper>