From ec7d3b867e7b7f5073dda1684a8720424b9da5ad Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期二, 24 三月 2026 15:38:00 +0800
Subject: [PATCH] feat: 生产报工的详情、修改、删除接口
---
src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java | 5
src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java | 21 ++
src/main/java/com/ruoyi/production/service/impl/ProductMaterialServiceImpl.java | 10
src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java | 402 +++++++++++++++++++++++++++++++++++++++++++-
src/main/java/com/ruoyi/production/service/ProductionRecordService.java | 6
src/main/java/com/ruoyi/production/service/ProductMaterialService.java | 4
doc/宁夏-中盛建材.sql | 5
src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java | 1
src/main/java/com/ruoyi/production/mapper/ProductMaterialMapper.java | 4
src/main/java/com/ruoyi/production/controller/ProductionRecordController.java | 26 ++
src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java | 6
src/main/resources/mapper/production/ProductionProductMainMapper.xml | 3
src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemDto.java | 6
src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml | 2
src/main/resources/mapper/production/ProductMaterialMapper.xml | 33 +++
15 files changed, 508 insertions(+), 26 deletions(-)
diff --git "a/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql" "b/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql"
index f91a888..f16e44e 100644
--- "a/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql"
+++ "b/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql"
@@ -414,4 +414,7 @@
DROP TABLE IF EXISTS process_route_item_instance;
DROP TABLE IF EXISTS process_route_item_param_instance;
-DROP TABLE IF EXISTS product_structure_instance;
\ No newline at end of file
+DROP TABLE IF EXISTS product_structure_instance;
+
+ALTER TABLE `product-inventory-management-zsjc`.`production_product_route_item_param`
+ MODIFY COLUMN `order_item_param_id` bigint NULL DEFAULT NULL COMMENT '鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛↖D' AFTER `production_product_route_item_id`;
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionRecordController.java b/src/main/java/com/ruoyi/production/controller/ProductionRecordController.java
index dd77ee0..dff868e 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionRecordController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionRecordController.java
@@ -8,10 +8,6 @@
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.util.ArrayList;
-import java.util.List;
/**
* <br>
@@ -37,7 +33,6 @@
return AjaxResult.success(vo);
}
-
@PostMapping("/add")
@ApiOperation("鐢熶骇鎶ュ伐-鏂板")
public AjaxResult addProductionRecordService(@RequestBody ProductionRecordDto dto) {
@@ -45,4 +40,25 @@
return AjaxResult.success();
}
+ @DeleteMapping("/{productMainId}")
+ @ApiOperation("鐢熶骇鎶ュ伐-鍒犻櫎")
+ public AjaxResult deleteProductMain(@PathVariable Long productMainId) {
+ productionRecordService.deleteProductMain(productMainId);
+ return AjaxResult.success();
+ }
+
+ @GetMapping("/detail/{productMainId}")
+ @ApiOperation("鐢熶骇鎶ュ伐-璇︽儏")
+ public AjaxResult detailProductMain(@PathVariable Long productMainId) {
+ ProductionRecordDto dto = productionRecordService.detailProductMain(productMainId);
+ return AjaxResult.success(dto);
+ }
+
+ @PostMapping("/edit")
+ @ApiOperation("鐢熶骇鎶ュ伐-缂栬緫")
+ public AjaxResult editProductMain(@RequestBody ProductionRecordDto dto) {
+ productionRecordService.editProductMain(dto);
+ return AjaxResult.success();
+ }
+
}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemDto.java
index 10dc1b7..aa3927e 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemDto.java
@@ -26,4 +26,10 @@
@ApiModelProperty("宸ュ簭涓存椂闄勪欢ID")
private List<String> files;
+ @ApiModelProperty("宸ュ簭闄勪欢璇︽儏鍒楄〃")
+ private List<ProductionProductRouteItemFileDto> fileList;
+
+ @ApiModelProperty("鍒犻櫎宸ュ簭闄勪欢ID闆嗗悎")
+ private List<Long> delFileIds;
+
}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java
index 0070d90..d7a7478 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java
@@ -1,6 +1,7 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductionProductRouteItemParam;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -16,4 +17,8 @@
@Data
@EqualsAndHashCode(callSuper = false)
public class ProductionProductRouteItemParamDto extends ProductionProductRouteItemParam {
+
+ @ApiModelProperty("浜у搧鍚嶇О")
+ private String productName;
+
}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java b/src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java
index dd3d900..f0381b5 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java
@@ -21,11 +21,26 @@
@ApiModel(value = "ProductionRecordDto", description = "鐢熶骇鎶ュ伐璁板綍Dto")
public class ProductionRecordDto {
+ @ApiModelProperty("鎶ュ伐涓昏〃ID")
+ private Long productMainId;
+
@ApiModelProperty("鐢熶骇璁㈠崟ID")
private Long productOrderId;
+ @ApiModelProperty("鐢熶骇璁㈠崟鍙�")
+ private String npsNo;
+
@ApiModelProperty("浜у搧ID")
private Long productId;
+
+ @ApiModelProperty("浜у搧缂栫爜")
+ private String materialCode;
+
+ @ApiModelProperty("浜у搧鍚嶇О")
+ private String productName;
+
+ @ApiModelProperty("瑙勬牸")
+ private String model;
@ApiModelProperty(value = "宀椾綅浜哄憳")
private String postName;
@@ -36,6 +51,12 @@
@ApiModelProperty(value = "鐝鏃ユ湡")
private LocalDateTime reportingTime;
+ @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "鏇存柊鏃堕棿")
+ private LocalDateTime updateTime;
+
@ApiModelProperty("鍚堟牸鏁伴噺")
private BigDecimal qualifiedQuantity;
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductMaterialMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductMaterialMapper.java
index 1c5a682..52cefbb 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductMaterialMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductMaterialMapper.java
@@ -1,6 +1,7 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.production.dto.ProductMaterialSkuDto;
import com.ruoyi.production.pojo.ProductMaterial;
/**
@@ -14,6 +15,7 @@
*/
public interface ProductMaterialMapper extends BaseMapper<ProductMaterial> {
- String selectProductModelIdByName(Long productModelId);
+ ProductMaterialSkuDto selectProductByModelId(Long productModelId);
+ ProductMaterialSkuDto selectProductByProductMainId(Long productOrderId);
}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
index 2761bc8..2de4c8e 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -62,7 +62,6 @@
private String schedule;
@ApiModelProperty(value = "鐝鏃ユ湡")
- @TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime reportingTime;
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java
index 938c9d2..7d9d12b 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java
@@ -37,6 +37,9 @@
@ApiModelProperty(value = "鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忚〃ID")
private Long productionProductRouteItemId;
+ @ApiModelProperty(value = "鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛↖D")
+ private Long orderItemParamId;
+
@ApiModelProperty(value = "鍙傛暟鍚嶇О")
private String paramName;
@@ -58,6 +61,9 @@
@ApiModelProperty(value = "鏈�澶у��")
private BigDecimal maxValue;
+ @ApiModelProperty(value = "鍙傛暟鍊�")
+ private String paramValue;
+
@ApiModelProperty(value = "浜у搧ID")
private Long productId;
diff --git a/src/main/java/com/ruoyi/production/service/ProductMaterialService.java b/src/main/java/com/ruoyi/production/service/ProductMaterialService.java
index b2c451b..0b9bd71 100644
--- a/src/main/java/com/ruoyi/production/service/ProductMaterialService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductMaterialService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.dto.ProductMaterialGroupDto;
+import com.ruoyi.production.dto.ProductMaterialSkuDto;
import com.ruoyi.production.pojo.ProductMaterial;
import java.util.List;
@@ -31,6 +32,7 @@
List<ProductMaterialGroupDto> productMaterialListByQuery(String materialName, Integer materialTypeId);
- String selectProductModelIdByName(Long productId);
+ ProductMaterialSkuDto selectProductByModelId(Long productModelId);
+ ProductMaterialSkuDto selectProductByProductMainId(Long productOrderId);
}
diff --git a/src/main/java/com/ruoyi/production/service/ProductionRecordService.java b/src/main/java/com/ruoyi/production/service/ProductionRecordService.java
index 0e520af..d995984 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionRecordService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionRecordService.java
@@ -18,4 +18,10 @@
void addProductionRecordService(ProductionRecordDto dto);
+ void deleteProductMain(Long productMainId);
+
+ ProductionRecordDto detailProductMain(Long productMainId);
+
+ void editProductMain(ProductionRecordDto dto);
+
}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductMaterialServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductMaterialServiceImpl.java
index d8ad015..33d4399 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductMaterialServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductMaterialServiceImpl.java
@@ -11,6 +11,7 @@
import com.ruoyi.framework.util.AliDingUtils;
import com.ruoyi.production.dto.ProductMaterialDto;
import com.ruoyi.production.dto.ProductMaterialGroupDto;
+import com.ruoyi.production.dto.ProductMaterialSkuDto;
import com.ruoyi.production.enums.MaterialConfigTypeEnum;
import com.ruoyi.production.mapper.ProductMaterialMapper;
import com.ruoyi.production.pojo.ProductMaterial;
@@ -410,8 +411,13 @@
}
@Override
- public String selectProductModelIdByName(Long productId) {
- return baseMapper.selectProductModelIdByName(productId);
+ public ProductMaterialSkuDto selectProductByModelId(Long productModelId) {
+ return baseMapper.selectProductByModelId(productModelId);
+ }
+
+ @Override
+ public ProductMaterialSkuDto selectProductByProductMainId(Long productOrderId) {
+ return baseMapper.selectProductByProductMainId(productOrderId);
}
private void validateProductMaterial(ProductMaterial productMaterial, boolean requireId) {
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java
index 58126be..0a0d5ff 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java
@@ -7,9 +7,7 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.other.mapper.TempFileMapper;
import com.ruoyi.other.pojo.TempFile;
-import com.ruoyi.production.dto.ProductionProductRouteItemDto;
-import com.ruoyi.production.dto.ProductionProductRouteItemParamDto;
-import com.ruoyi.production.dto.ProductionRecordDto;
+import com.ruoyi.production.dto.*;
import com.ruoyi.production.enums.ProductOrderStatusEnum;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.*;
@@ -197,21 +195,21 @@
throw new ServiceException("鎶ュ伐澶辫触,鐢熶骇璁㈠崟涓嶅瓨鍦�");
}
- // 褰撳墠鎶ュ伐鍚堟牸鏁伴噺
+ // 褰撳墠鎶ュ伐鍚堟牸鏁伴噺锛堝墠绔凡淇濊瘉 = 鎶曞叆鏁伴噺 - 涓嶅悎鏍兼暟閲忥紝鐩存帴浣跨敤锛�
BigDecimal qualifiedQty = dto.getQualifiedQuantity() == null ? BigDecimal.ZERO : dto.getQualifiedQuantity();
- // 宸插畬鎴愭暟閲�
+ // 璁㈠崟宸插畬鎴愭暟閲忥紙鍘嗗彶绱锛�
BigDecimal completeQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity();
- // 绱姞(鍙畻鍚堟牸)
- BigDecimal newCompleteQty = completeQty.add(qualifiedQty);
- productOrder.setCompleteQuantity(newCompleteQty);
// 闇�姹傛暟閲�
BigDecimal totalQty = productOrder.getQuantity() == null ? BigDecimal.ZERO : productOrder.getQuantity();
- // 鍓╀綑鍙姤宸ユ暟閲�
+ // 鍓╀綑鍙姤宸ユ暟閲�
BigDecimal remainQty = totalQty.subtract(completeQty);
- // 鏈鎶ュ伐涓嶈兘瓒呰繃鍓╀綑鏁伴噺
+ // 鏈鎶ュ伐鍚堟牸鏁伴噺涓嶈兘瓒呰繃鍓╀綑鏁伴噺锛堟牎楠屽繀椤诲湪绱姞鍓嶆墽琛岋級
if (qualifiedQty.compareTo(remainQty) > 0) {
- throw new ServiceException("鎶ュ伐澶辫触锛屾湰娆℃姤宸ユ暟閲忎笉鑳藉ぇ浜庡墿浣欏彲鎶ュ伐鏁伴噺");
+ throw new ServiceException("鎶ュ伐澶辫触锛屾湰娆℃姤宸ユ暟閲忎笉鑳藉ぇ浜庡墿浣欏彲鎶ュ伐鏁伴噺锛屽墿浣欐姤宸ユ暟閲�:[" + remainQty + "]");
}
+ // 鍘嗗彶宸插畬鎴� + 鏈鍚堟牸鏁伴噺
+ BigDecimal newCompleteQty = completeQty.add(qualifiedQty);
+ productOrder.setCompleteQuantity(newCompleteQty);
// 璁剧疆寮�濮嬫椂闂达紙绗竴娆℃姤宸ワ級
if (productOrder.getStartTime() == null) {
productOrder.setStartTime(LocalDateTime.now());
@@ -230,9 +228,11 @@
// 瀹屾垚鎶ュ伐涓昏〃-鎶曞叆琛�-浜у嚭琛ㄦ暟鎹�
ProductionProductMain productionProductMain = new ProductionProductMain();
- productionProductMain.setProductNo("BG" + UUID.randomUUID());
+ productionProductMain.setProductNo(productionProductMainService.generateProductNo());
productionProductMain.setProductOrderId(dto.getProductOrderId());
productionProductMain.setSchedule(dto.getSchedule());
+ productionProductMain.setPostName(dto.getPostName());
+ productionProductMain.setReportingTime(LocalDateTime.now());
boolean result = productionProductMainService.save(productionProductMain);
if (!result) {
throw new ServiceException("鎶ュ伐澶辫触,鏁版嵁瀛樺偍澶辫触");
@@ -276,6 +276,7 @@
ProductionProductRouteItemParam paramEntity = new ProductionProductRouteItemParam();
BeanUtils.copyProperties(productRouteItemParamDto, paramEntity, "id");
paramEntity.setProductionProductRouteItemId(productRouteItemEntity.getId());
+ paramEntity.setOrderItemParamId(productRouteItemParamDto.getId());
if (paramEntity.getProductId() == null) {
ProductionOrderRouteItemParam productionOrderRouteItemParam = productionOrderRouteItemParamService.getById(productRouteItemParamDto.getId());
paramEntity.setParamName(productionOrderRouteItemParam.getParamName());
@@ -344,4 +345,381 @@
}
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deleteProductMain(Long productMainId) {
+ if (productMainId == null) {
+ throw new ServiceException("鍒犻櫎澶辫触锛屾姤宸D涓嶈兘涓虹┖");
+ }
+
+ // 鏍¢獙鎶ュ伐涓昏〃鏄惁瀛樺湪
+ ProductionProductMain productMain = productionProductMainService.getById(productMainId);
+ if (productMain == null) {
+ throw new ServiceException("鍒犻櫎澶辫触锛屾姤宸ヨ褰曚笉瀛樺湪");
+ }
+
+ // 鏌ヨ璇ユ姤宸ヤ笅鎵�鏈夊伐搴忚褰�
+ List<ProductionProductRouteItem> routeItemList = productionProductRouteItemService.list(new LambdaQueryWrapper<ProductionProductRouteItem>()
+ .eq(ProductionProductRouteItem::getProductMainId, productMainId));
+
+ if (routeItemList != null && !routeItemList.isEmpty()) {
+ List<Long> routeItemIds = routeItemList.stream()
+ .map(ProductionProductRouteItem::getId)
+ .collect(Collectors.toList());
+
+ // 鏌ヨ骞跺垹闄ゆ瘡涓伐搴忎笅鐨勯檮浠�
+ List<ProductionProductRouteItemFile> fileList = productionProductRouteItemFileService.list(new LambdaQueryWrapper<ProductionProductRouteItemFile>()
+ .in(ProductionProductRouteItemFile::getProductionProductRouteItemId, routeItemIds));
+
+ if (fileList != null && !fileList.isEmpty()) {
+ for (ProductionProductRouteItemFile file : fileList) {
+ if (StringUtils.hasText(file.getFileUrl())) {
+ try {
+ Files.deleteIfExists(Paths.get(file.getFileUrl()));
+ } catch (IOException e) {
+ log.warn("鍒犻櫎闄勪欢鏂囦欢澶辫触: {}", file.getFileUrl(), e);
+ }
+ }
+ }
+ productionProductRouteItemFileService.remove(new LambdaQueryWrapper<ProductionProductRouteItemFile>()
+ .in(ProductionProductRouteItemFile::getProductionProductRouteItemId, routeItemIds));
+ }
+
+ // 鍒犻櫎宸ュ簭鍙傛暟
+ productionProductRouteItemParamService.remove(new LambdaQueryWrapper<ProductionProductRouteItemParam>()
+ .in(ProductionProductRouteItemParam::getProductionProductRouteItemId, routeItemIds));
+
+ // 鍒犻櫎宸ュ簭璁板綍
+ productionProductRouteItemService.remove(new LambdaQueryWrapper<ProductionProductRouteItem>()
+ .eq(ProductionProductRouteItem::getProductMainId, productMainId));
+ }
+
+ // 鍒犻櫎鎶曞叆琛�
+ productionProductInputService.remove(new LambdaQueryWrapper<ProductionProductInput>()
+ .eq(ProductionProductInput::getProductMainId, productMainId));
+
+ // 鍥炴粴鐢熶骇璁㈠崟瀹屾垚鏁伴噺
+ ProductionProductOutput output = productionProductOutputService.getOne(new LambdaQueryWrapper<ProductionProductOutput>()
+ .eq(ProductionProductOutput::getProductMainId, productMainId)
+ .last("LIMIT 1"));
+
+ ProductOrder productOrder = productOrderService.getById(productMain.getProductOrderId());
+ if (productOrder == null) {
+ throw new ServiceException("鍒犻櫎澶辫触锛屽叧鑱旂殑鐢熶骇璁㈠崟涓嶅瓨鍦�");
+ }
+
+ BigDecimal qualifiedQty = (output != null && output.getQuantity() != null)
+ ? output.getQuantity() : BigDecimal.ZERO;
+ BigDecimal currentCompleteQty = productOrder.getCompleteQuantity() == null
+ ? BigDecimal.ZERO : productOrder.getCompleteQuantity();
+ BigDecimal totalQty = productOrder.getQuantity() == null ? BigDecimal.ZERO : productOrder.getQuantity();
+
+ // 鎵e噺鏈潯鎶ュ伐璐$尞鐨勫悎鏍兼暟閲忥紝涓嶅厑璁稿嚭鐜拌礋鏁�
+ BigDecimal updatedCompleteQty = currentCompleteQty.subtract(qualifiedQty).max(BigDecimal.ZERO);
+ productOrder.setCompleteQuantity(updatedCompleteQty);
+
+ // 閲嶆柊鍒ゆ柇璁㈠崟鐘舵��
+ if (updatedCompleteQty.compareTo(totalQty) >= 0 && totalQty.compareTo(BigDecimal.ZERO) > 0) {
+ // 瀹屾垚鏁� >= 闇�姹傛暟 鈫� 宸插畬鎴�
+ productOrder.setStatus(ProductOrderStatusEnum.FINISHED.getCode());
+ } else if (updatedCompleteQty.compareTo(BigDecimal.ZERO) == 0) {
+ // 瀹屾垚鏁板綊闆� 鈫� 鍥炲埌寰呭紑濮嬶紝娓呯┖寮�濮�/缁撴潫鏃堕棿
+ productOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode());
+ productOrder.setStartTime(null);
+ productOrder.setEndTime(null);
+ } else {
+ // 瀹屾垚鏁颁粙浜� 0 ~ 闇�姹傛暟涔嬮棿 鈫� 杩涜涓�
+ productOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
+ productOrder.setEndTime(null);
+ }
+ productOrderService.updateById(productOrder);
+
+ // 鍒犻櫎浜у嚭琛�
+ productionProductOutputService.remove(new LambdaQueryWrapper<ProductionProductOutput>()
+ .eq(ProductionProductOutput::getProductMainId, productMainId));
+
+ // 鍒犻櫎鎶ュ伐涓昏〃
+ productionProductMainService.removeById(productMainId);
+ log.info("鎶ュ伐璁板綍鍒犻櫎鎴愬姛锛宲roductMainId={}", productMainId);
+ }
+
+ @Override
+ public ProductionRecordDto detailProductMain(Long productMainId) {
+ if (productMainId == null) {
+ throw new ServiceException("鏌ヨ澶辫触锛屾姤宸D涓嶈兘涓虹┖");
+ }
+
+ // 鏌ヨ鎶ュ伐涓昏〃
+ ProductionProductMain productMain = productionProductMainService.getById(productMainId);
+ if (productMain == null) {
+ throw new ServiceException("鏌ヨ澶辫触锛屾姤宸ヨ褰曚笉瀛樺湪");
+ }
+
+ ProductionRecordDto dto = new ProductionRecordDto();
+ dto.setProductMainId(productMainId);
+ dto.setProductOrderId(productMain.getProductOrderId());
+ dto.setPostName(productMain.getPostName());
+ dto.setSchedule(productMain.getSchedule());
+ dto.setReportingTime(productMain.getReportingTime());
+ dto.setCreateTime(productMain.getCreateTime());
+ dto.setUpdateTime(productMain.getUpdateTime());
+
+ // 鐢熶骇璁㈠崟淇℃伅
+ ProductOrder productOrder = productOrderService.getById(productMain.getProductOrderId());
+ if (productOrder == null) {
+ throw new ServiceException("鏌ヨ澶辫触,鏈煡璇㈠埌鐢熶骇璁㈠崟淇℃伅");
+ }
+ dto.setNpsNo(productOrder.getNpsNo());
+
+ /// 浜у搧淇℃伅
+ ProductMaterialSkuDto productMaterialSkuDto = productMaterialService.selectProductByProductMainId(productOrder.getId());
+ dto.setProductName(productMaterialSkuDto.getProductName());
+ dto.setMaterialCode(productMaterialSkuDto.getMaterialCode());
+ dto.setModel(productMaterialSkuDto.getModel());
+
+ // 鏌ヨ鎶曞叆琛紙鑾峰彇浜у搧ID鍜屾姇鍏ユ暟閲忥級
+ ProductionProductInput input = productionProductInputService.getOne(
+ new LambdaQueryWrapper<ProductionProductInput>()
+ .eq(ProductionProductInput::getProductMainId, productMainId)
+ .last("LIMIT 1"));
+ if (input != null) {
+ dto.setProductId(input.getProductModelId());
+ dto.setQuantity(input.getQuantity());
+ }
+
+ // 鏌ヨ浜у嚭琛紙鑾峰彇鍚堟牸/涓嶅悎鏍兼暟閲忥級
+ ProductionProductOutput output = productionProductOutputService.getOne(
+ new LambdaQueryWrapper<ProductionProductOutput>()
+ .eq(ProductionProductOutput::getProductMainId, productMainId)
+ .last("LIMIT 1"));
+ if (output != null) {
+ dto.setQualifiedQuantity(output.getQuantity());
+ dto.setUnqualifiedQuantity(output.getScrapQty());
+ }
+
+ // 鏌ヨ宸ュ簭鍒楄〃
+ List<ProductionProductRouteItem> routeItemList = productionProductRouteItemService.list(
+ new LambdaQueryWrapper<ProductionProductRouteItem>()
+ .eq(ProductionProductRouteItem::getProductMainId, productMainId));
+
+ if (routeItemList != null && !routeItemList.isEmpty()) {
+ List<ProductionProductRouteItemDto> routeItemDtoList = routeItemList.stream().map(routeItem -> {
+ ProductionProductRouteItemDto routeItemDto = new ProductionProductRouteItemDto();
+ BeanUtils.copyProperties(routeItem, routeItemDto);
+
+ // 鏌ヨ宸ュ簭鍙傛暟
+ List<ProductionProductRouteItemParam> paramList = productionProductRouteItemParamService.list(
+ new LambdaQueryWrapper<ProductionProductRouteItemParam>()
+ .eq(ProductionProductRouteItemParam::getProductionProductRouteItemId, routeItem.getId()));
+ if (paramList != null && !paramList.isEmpty()) {
+ List<ProductionProductRouteItemParamDto> paramDtoList = paramList.stream().map(param -> {
+ ProductionProductRouteItemParamDto paramDto = new ProductionProductRouteItemParamDto();
+ BeanUtils.copyProperties(param, paramDto);
+ if (paramDto.getProductId() != null) {
+ ProductMaterialSkuDto materialSkuDto = productMaterialService.selectProductByModelId(paramDto.getProductId());
+ productMaterialService.selectProductByModelId(paramDto.getProductId());
+ paramDto.setParamName(materialSkuDto.getProductName());
+ }
+ return paramDto;
+ }).collect(Collectors.toList());
+ routeItemDto.setProductionProductRouteItemParamDtoList(paramDtoList);
+ }
+
+ // 鏌ヨ宸ュ簭闄勪欢
+ List<ProductionProductRouteItemFile> fileRecordList = productionProductRouteItemFileService.list(
+ new LambdaQueryWrapper<ProductionProductRouteItemFile>()
+ .eq(ProductionProductRouteItemFile::getProductionProductRouteItemId, routeItem.getId()));
+ if (fileRecordList != null && !fileRecordList.isEmpty()) {
+ List<ProductionProductRouteItemFileDto> fileDtoList = fileRecordList.stream().map(file -> {
+ ProductionProductRouteItemFileDto fileDto = new ProductionProductRouteItemFileDto();
+ BeanUtils.copyProperties(file, fileDto);
+ return fileDto;
+ }).collect(Collectors.toList());
+ routeItemDto.setFileList(fileDtoList);
+ }
+
+ return routeItemDto;
+ }).collect(Collectors.toList());
+
+ dto.setProductionProductRouteItemDtoList(routeItemDtoList);
+ }
+
+ return dto;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void editProductMain(ProductionRecordDto dto) {
+ if (dto == null || dto.getProductMainId() == null) {
+ throw new ServiceException("缂栬緫澶辫触锛屾姤宸D涓嶈兘涓虹┖");
+ }
+ if (dto.getProductId() == null) {
+ throw new ServiceException("缂栬緫澶辫触锛屼骇鍝佷俊鎭笉鑳戒负绌�");
+ }
+ if (StringUtils.isEmpty(dto.getPostName()) || StringUtils.isEmpty(dto.getSchedule())) {
+ throw new ServiceException("缂栬緫澶辫触锛屽矖浣嶄汉鍛�/鐝淇℃伅涓嶈兘涓虹┖");
+ }
+
+ Long productMainId = dto.getProductMainId();
+
+ // 鏌ヨ鎶ュ伐涓昏〃鏄惁瀛樺湪
+ ProductionProductMain productMain = productionProductMainService.getById(productMainId);
+ if (productMain == null) {
+ throw new ServiceException("缂栬緫澶辫触锛屾姤宸ヨ褰曚笉瀛樺湪");
+ }
+
+ // 鍥炴粴鐢熶骇璁㈠崟鐨勫悎鏍兼暟閲�
+ ProductionProductOutput oldOutput = productionProductOutputService.getOne(new LambdaQueryWrapper<ProductionProductOutput>()
+ .eq(ProductionProductOutput::getProductMainId, productMainId)
+ .last("LIMIT 1"));
+
+ ProductOrder productOrder = productOrderService.getById(productMain.getProductOrderId());
+ if (productOrder == null) {
+ throw new ServiceException("缂栬緫澶辫触锛屽叧鑱旂殑鐢熶骇璁㈠崟涓嶅瓨鍦�");
+ }
+
+ BigDecimal oldQualifiedQty = (oldOutput != null && oldOutput.getQuantity() != null)
+ ? oldOutput.getQuantity() : BigDecimal.ZERO;
+ BigDecimal newQualifiedQty = dto.getQualifiedQuantity() == null ? BigDecimal.ZERO : dto.getQualifiedQuantity();
+ BigDecimal currentCompleteQty = productOrder.getCompleteQuantity() == null
+ ? BigDecimal.ZERO : productOrder.getCompleteQuantity();
+ BigDecimal totalQty = productOrder.getQuantity() == null ? BigDecimal.ZERO : productOrder.getQuantity();
+
+ // 鍥炴粴鏃у�硷紝璁$畻鏈缂栬緫鍚庣殑鏂板畬鎴愭暟閲�
+ BigDecimal baseQty = currentCompleteQty.subtract(oldQualifiedQty);
+ BigDecimal updatedCompleteQty = baseQty.add(newQualifiedQty);
+
+ // 鏂扮殑鍚堟牸鏁伴噺涓嶈兘瓒呰繃锛堥渶姹傛暟閲� - 鎶ュ伐鎬诲畬鎴愭暟閲忥級
+ if (newQualifiedQty.compareTo(totalQty.subtract(baseQty)) > 0) {
+ throw new ServiceException("缂栬緫澶辫触锛屾湰娆℃姤宸ュ悎鏍兼暟閲忎笉鑳藉ぇ浜庡墿浣欏彲鎶ュ伐鏁伴噺");
+ }
+
+ // 閲嶆柊鍒ゆ柇鐢熶骇璁㈠崟鐘舵��
+ productOrder.setCompleteQuantity(updatedCompleteQty);
+ if (updatedCompleteQty.compareTo(totalQty) >= 0 && totalQty.compareTo(BigDecimal.ZERO) > 0) {
+ productOrder.setStatus(ProductOrderStatusEnum.FINISHED.getCode());
+ productOrder.setEndTime(LocalDateTime.now());
+ } else {
+ productOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
+ productOrder.setEndTime(null);
+ }
+ productOrderService.updateById(productOrder);
+
+ // 鏇存柊鎶ュ伐涓昏〃
+ productMain.setPostName(dto.getPostName());
+ productMain.setSchedule(dto.getSchedule());
+ productMain.setReportingTime(dto.getReportingTime());
+ productionProductMainService.updateById(productMain);
+
+ // 鏇存柊鎶曞叆琛�
+ ProductionProductInput input = productionProductInputService.getOne(new LambdaQueryWrapper<ProductionProductInput>()
+ .eq(ProductionProductInput::getProductMainId, productMainId)
+ .last("LIMIT 1"));
+ if (input != null) {
+ input.setProductModelId(dto.getProductId());
+ input.setQuantity(dto.getQuantity());
+ productionProductInputService.updateById(input);
+ }
+
+ // 鏇存柊浜у嚭琛�
+ if (oldOutput != null) {
+ oldOutput.setProductModelId(dto.getProductId());
+ oldOutput.setQuantity(dto.getQualifiedQuantity());
+ oldOutput.setScrapQty(dto.getUnqualifiedQuantity());
+ productionProductOutputService.updateById(oldOutput);
+ }
+
+ // 澶勭悊宸ュ簭鍒楄〃
+ List<ProductionProductRouteItemDto> routeItemDtoList = dto.getProductionProductRouteItemDtoList();
+ if (routeItemDtoList == null || routeItemDtoList.isEmpty()) {
+ throw new ServiceException("缂栬緫澶辫触锛屽伐搴忓弬鏁颁笉鑳戒负绌�");
+ }
+
+ for (ProductionProductRouteItemDto routeItemDto : routeItemDtoList) {
+ // 鏇存柊宸叉湁宸ュ簭
+ ProductionProductRouteItem routeItemEntity = productionProductRouteItemService.getById(routeItemDto.getId());
+ if (routeItemEntity == null) {
+ log.error("缂栬緫澶辫触,宸ュ簭璁板綍涓嶅瓨鍦�,ID={}", routeItemDto.getId());
+ throw new ServiceException("缂栬緫澶辫触锛屽伐搴忚褰曚笉瀛樺湪");
+ }
+ BeanUtils.copyProperties(routeItemDto, routeItemEntity, "id", "productMainId", "createTime", "tenantId");
+ productionProductRouteItemService.updateById(routeItemEntity);
+
+ final Long routeItemId = routeItemEntity.getId();
+
+ // 澶勭悊宸ュ簭鍙傛暟: 鍏堝垹闄よ宸ュ簭涓嬫墍鏈夋棫鍙傛暟锛屽啀閲嶆柊鎻掑叆浼犲叆鐨勫弬鏁�
+ productionProductRouteItemParamService.remove(new LambdaQueryWrapper<ProductionProductRouteItemParam>()
+ .eq(ProductionProductRouteItemParam::getProductionProductRouteItemId, routeItemId));
+
+ List<ProductionProductRouteItemParamDto> paramDtoList = routeItemDto.getProductionProductRouteItemParamDtoList();
+ if (paramDtoList != null && !paramDtoList.isEmpty()) {
+ for (ProductionProductRouteItemParamDto paramDto : paramDtoList) {
+ ProductionProductRouteItemParam paramEntity = new ProductionProductRouteItemParam();
+ BeanUtils.copyProperties(paramDto, paramEntity, "id");
+ paramEntity.setProductionProductRouteItemId(routeItemId);
+ if (paramEntity.getProductId() == null && paramDto.getId() != null) {
+ ProductionOrderRouteItemParam orderParam = productionOrderRouteItemParamService.getById(paramDto.getId());
+ if (orderParam != null) {
+ paramEntity.setOrderItemParamId(orderParam.getId());
+ paramEntity.setParamName(orderParam.getParamName());
+ paramEntity.setParamType(orderParam.getParamType());
+ paramEntity.setParamFormat(orderParam.getParamFormat());
+ paramEntity.setValueMode(orderParam.getValueMode());
+ }
+ }
+ productionProductRouteItemParamService.save(paramEntity);
+ }
+ }
+
+ // 澶勭悊鏂颁笂浼犵殑涓存椂闄勪欢
+ List<String> newFiles = routeItemDto.getFiles();
+ if (newFiles != null && !newFiles.isEmpty()) {
+ for (String tempId : newFiles) {
+ TempFile tempFile = tempFileMapper.selectById(tempId);
+ if (tempFile == null) {
+ log.warn("鏈壘鍒颁复鏃舵枃浠惰褰�: {}", tempId);
+ continue;
+ }
+ try {
+ String formalDir = uploadDir + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
+ Path formalDirPath = Paths.get(formalDir);
+ if (!Files.exists(formalDirPath)) {
+ Files.createDirectories(formalDirPath);
+ }
+ String originalFilename = tempFile.getOriginalName();
+ String fileExtension = FilenameUtils.getExtension(originalFilename);
+ String formalFilename = routeItemId + "_"
+ + System.currentTimeMillis() + "_"
+ + UUID.randomUUID().toString().substring(0, 8)
+ + (StringUtils.hasText(fileExtension) ? "." + fileExtension : "");
+ Path formalFilePath = formalDirPath.resolve(formalFilename);
+
+ Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
+ Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
+
+ ProductionProductRouteItemFile fileEntity = new ProductionProductRouteItemFile();
+ fileEntity.setProductionProductRouteItemId(routeItemId);
+ fileEntity.setFileName(originalFilename);
+ fileEntity.setFileUrl(formalFilePath.toString());
+ fileEntity.setFileSuffix(fileExtension);
+ fileEntity.setFileSize(Files.size(formalFilePath));
+ fileEntity.setCreateTime(LocalDateTime.now());
+ fileEntity.setTenantId(SecurityUtils.getLoginUser().getTenantId());
+ productionProductRouteItemFileService.save(fileEntity);
+
+ tempFileMapper.deleteById(tempId);
+ log.info("缂栬緫-宸ュ簭闄勪欢杩佺Щ鎴愬姛: {} -> {}", tempFile.getTempPath(), formalFilePath);
+ } catch (IOException e) {
+ log.error("缂栬緫-宸ュ簭闄勪欢杩佺Щ澶辫触: {}", tempFile.getTempPath(), e);
+ throw new ServiceException("宸ュ簭闄勪欢澶勭悊寮傚父: " + e.getMessage());
+ }
+ }
+ }
+ List<Long> delFileIds = routeItemDto.getDelFileIds();
+ if (delFileIds != null && !delFileIds.isEmpty()) {
+ delFileIds.forEach(productionProductRouteItemFileService::deleteFile);
+ }
+ }
+ log.info("鎶ュ伐璁板綍缂栬緫鎴愬姛锛宲roductMainId={}", productMainId);
+ }
}
diff --git a/src/main/resources/mapper/production/ProductMaterialMapper.xml b/src/main/resources/mapper/production/ProductMaterialMapper.xml
index 7e014c9..6281790 100644
--- a/src/main/resources/mapper/production/ProductMaterialMapper.xml
+++ b/src/main/resources/mapper/production/ProductMaterialMapper.xml
@@ -16,8 +16,12 @@
<result property="updateTime" column="update_time"/>
</resultMap>
- <select id="selectProductModelIdByName" resultType="java.lang.String" parameterType="java.lang.Long">
- select pm.product_name
+ <select id="selectProductByModelId" resultType="com.ruoyi.production.dto.ProductMaterialSkuDto"
+ parameterType="java.lang.Long">
+ select pm.product_name as productName,
+ pm.unit,
+ pms.material_code as materialCode,
+ pms.model
from product_material pm
left join product_material_sku pms on pms.product_id = pm.id
<where>
@@ -32,4 +36,29 @@
</where>
</select>
+ <select id="selectProductByProductMainId" resultType="com.ruoyi.production.dto.ProductMaterialSkuDto"
+ parameterType="java.lang.Long">
+ select
+ pm.product_name as productName,
+ pm.unit,
+ pms.material_code as materialCode,
+ pms.model
+ from product_order po
+ left join product_order_plan pop on po.id = pop.product_order_id
+ left join production_plan pp on pp.id = pop.production_plan_id
+ left join product_material_sku pms on pms.id = pop.production_plan_id
+ left join product_material pm on pm.id = pms.product_id
+ <where>
+ <choose>
+ <when test="productOrderId != null">
+ po.id = #{productOrderId}
+ </when>
+ <otherwise>
+ 1 = 0
+ </otherwise>
+ </choose>
+ </where>
+ </select>
+
+
</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/production/ProductionProductMainMapper.xml b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
index 4bebe89..d9cd9e4 100644
--- a/src/main/resources/mapper/production/ProductionProductMainMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -17,11 +17,12 @@
<select id="listPageProductionProductMainDto" resultType="com.ruoyi.production.dto.ProductionProductMainDto">
select ppm.*,
+ ppm.post_name as postName,
po.nps_no as npsNo,
pms.material_code as materialCode,
pm.product_name as productName,
pms.model as productModelName,
- IFNULL(ppo.quantity, 0) as totalQuantity,
+ IFNULL(ppi.quantity, 0) as totalQuantity,
IFNULL(ppo.scrap_qty, 0) as scrapQty,
IFNULL(ppo.quantity, 0) as quantity
from
diff --git a/src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml b/src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml
index 51578df..81c99d0 100644
--- a/src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml
@@ -5,6 +5,7 @@
<resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionProductRouteItemParam">
<id column="id" property="id"/>
<result column="production_product_route_item_id" property="productionProductRouteItemId"/>
+ <result column="order_item_param_id" property="orderItemParamId"/>
<result column="param_name" property="paramName"/>
<result column="param_type" property="paramType"/>
<result column="param_format" property="paramFormat"/>
@@ -12,6 +13,7 @@
<result column="standard_value" property="standardValue"/>
<result column="min_value" property="minValue"/>
<result column="max_value" property="maxValue"/>
+ <result column="param_value" property="paramValue"/>
<result column="product_id" property="productId"/>
<result column="bom_id" property="bomId"/>
<result column="product_value" property="productValue"/>
--
Gitblit v1.9.3