src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java
@@ -5,6 +5,7 @@ import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.productionPlan.dto.ProductionPlanDto; import com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto; import com.ruoyi.productionPlan.service.ProductionPlanService; import com.ruoyi.staff.dto.StaffLeaveDto; import io.swagger.annotations.Api; @@ -38,6 +39,7 @@ } @GetMapping("/loadProdData") @ApiOperation("æåéå®ç产计å") @Log(title = "æåéå®ç产计å", businessType = BusinessType.INSERT) public AjaxResult loadProdData() { productionPlanService.loadProdData(); @@ -49,4 +51,12 @@ public AjaxResult combine(@RequestBody ProductionPlanDto productionPlanDto) { return AjaxResult.success(productionPlanService.combine(productionPlanDto)); } @GetMapping("/summaryByProductType") @ApiOperation("æç §äº§åç±»å«æ±æ»ç»è®¡éæ±é") @Log(title = "æç §äº§åç±»å«æ±æ»ç»è®¡éæ±é", businessType = BusinessType.OTHER) public AjaxResult summaryByProductType(ProductionPlanSummaryDto query) { List<ProductionPlanSummaryDto> list = productionPlanService.summaryByProductType(query); return AjaxResult.success(list); } } src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanSummaryDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,70 @@ package com.ruoyi.productionPlan.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * <br> * éå®çäº§éæ± - 产åç±»åæ±æ»DTO * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 10:24 */ @Data @ApiModel("çäº§éæ±äº§åæ±æ»") public class ProductionPlanSummaryDto { /** * ç©æç¼ç */ @ApiModelProperty("ç©æç¼ç ") private String materialCode; /** * 产ååç§° */ @ApiModelProperty("产ååç§°") private String productName; /** * 产åè§æ ¼ */ @ApiModelProperty("产åè§æ ¼") private String productSpec; /** * 产åé¿åº¦ */ @ApiModelProperty("产åé¿åº¦") private Integer length; /** * 产å宽度 */ @ApiModelProperty("产å宽度") private Integer width; /** * 产åé«åº¦ */ @ApiModelProperty("产åé«åº¦") private Integer height; /** * æ±æ»åæ° */ @ApiModelProperty("æ±æ»åæ°") private Integer quantity; /** * æ±æ»æ¹æ° */ @ApiModelProperty("æ±æ»æ¹æ°") private BigDecimal volume; } src/main/java/com/ruoyi/productionPlan/mapper/ProductionPlanMapper.java
@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.productionPlan.dto.ProductionPlanDto; import com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto; import com.ruoyi.productionPlan.pojo.ProductionPlan; import com.ruoyi.staff.dto.StaffLeaveDto; import org.apache.ibatis.annotations.Param; import java.util.List; /** * <br> @@ -19,4 +21,7 @@ */ public interface ProductionPlanMapper extends BaseMapper<ProductionPlan> { IPage<ProductionPlanDto> listPage(Page page, @Param("c") ProductionPlanDto productionPlanDto); List<ProductionPlanSummaryDto> selectSummaryByProductType(ProductionPlanSummaryDto query); } src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.productionPlan.dto.ProductionPlanDto; import com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto; import com.ruoyi.productionPlan.pojo.ProductionPlan; import java.util.List; @@ -34,4 +35,9 @@ * åå¹¶ç产计å */ boolean combine(ProductionPlanDto productionPlanDto); /** * æç §äº§åç±»å«æ±æ»ç»è®¡éæ±é */ List<ProductionPlanSummaryDto> summaryByProductType(ProductionPlanSummaryDto query); } src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -14,6 +14,7 @@ import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.productionPlan.dto.ProductionPlanDto; import com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto; import com.ruoyi.productionPlan.mapper.ProductionPlanMapper; import com.ruoyi.productionPlan.pojo.ProductionPlan; import com.ruoyi.productionPlan.service.ProductionPlanService; @@ -30,9 +31,9 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.List; import java.util.*; import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; /** * <br> @@ -186,8 +187,8 @@ List<ProductionPlan> list = parseProductionPlans(dataArr, dataSyncType, totalCount); if (!list.isEmpty()) { // å¤çæ´æ°ææ°å¢ processSaveOrUpdate(list); totalSynced += list.size(); int affected = processSaveOrUpdate(list); totalSynced += affected; } // 夿æ¯å¦è¿æä¸ä¸é¡µ @@ -330,19 +331,48 @@ return list; } private void processSaveOrUpdate(List<ProductionPlan> list) { private int processSaveOrUpdate(List<ProductionPlan> list) { if (list == null || list.isEmpty()) { return 0; } int affected = 0; // å»é formInstanceId Set<String> formIds = list.stream() .map(ProductionPlan::getFormInstanceId) .collect(Collectors.toSet()); // æ¥è¯¢æ°æ®åºå·²ææ°æ® List<ProductionPlan> existList = this.list(new LambdaQueryWrapper<ProductionPlan>().in(ProductionPlan::getFormInstanceId, formIds)); // Map (formInstanceId + materialCode) Map<String, ProductionPlan> existMap = new HashMap<>(); for (ProductionPlan p : existList) { String key = p.getFormInstanceId() + "_" + p.getMaterialCode(); existMap.put(key, p); } // éååæ¥æ°æ® for (ProductionPlan plan : list) { LambdaQueryWrapper<ProductionPlan> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ProductionPlan::getFormInstanceId, plan.getFormInstanceId()) .eq(ProductionPlan::getMaterialCode, plan.getMaterialCode()); ProductionPlan existing = this.getOne(queryWrapper); if (existing != null) { plan.setId(existing.getId()); this.updateById(plan); } else { String key = plan.getFormInstanceId() + "_" + plan.getMaterialCode(); ProductionPlan exist = existMap.get(key); if (exist == null) { // æ°å¢ this.save(plan); affected++; log.info("æ°å¢æ°æ® formInstanceId={}, materialCode={}", plan.getFormInstanceId(), plan.getMaterialCode()); } else { // 夿æ¯å¦éè¦æ´æ° if (exist.getFormModifiedTime() == null || !exist.getFormModifiedTime().equals(plan.getFormModifiedTime())) { plan.setId(exist.getId()); plan.setCreateTime(exist.getCreateTime()); this.updateById(plan); affected++; log.info("æ´æ°æ°æ® formInstanceId={}, materialCode={}", plan.getFormInstanceId(), plan.getMaterialCode()); } } } return affected; } private LocalDateTime parseUtcTime(String utcString) { @@ -357,4 +387,9 @@ return null; } } @Override public List<ProductionPlanSummaryDto> summaryByProductType(ProductionPlanSummaryDto query) { return baseMapper.selectSummaryByProductType(query); } } src/main/resources/mapper/productionPlan/ProductionPlanMapper.xml
@@ -44,4 +44,33 @@ WHERE 1 = 1 </select> <select id="selectSummaryByProductType" resultType="com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto"> SELECT material_code, product_name, product_spec, length, width, height, COALESCE(SUM(quantity),0) AS quantity, COALESCE(SUM(volume),0) AS volume FROM production_plan <where> <if test="materialCode != null and materialCode != ''"> AND material_code LIKE CONCAT('%', #{materialCode}, '%') </if> <if test="productName != null and productName != ''"> AND product_name LIKE CONCAT('%', #{productName}, '%') </if> </where> GROUP BY material_code, product_name, product_spec, length, width, height </select> </mapper>