From 0c9ee949b6a7ea8ce2bbc42cbbd2c64fb977e509 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期一, 01 六月 2026 14:58:39 +0800
Subject: [PATCH] Merge branch 'dev_新疆马铃薯pro' of http://114.132.189.42:9002/r/product-inventory-management-after into dev_新疆马铃薯pro
---
src/main/java/com/ruoyi/home/dto/HomeBusinessDto.java | 6
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java | 155 ++++++++++++++++++++-
src/main/java/com/ruoyi/quality/dto/BatchQuickInspectRequest.java | 42 ++++++
src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java | 3
src/main/java/com/ruoyi/quality/service/IQualityInspectService.java | 6
src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java | 7
src/main/resources/mapper/sales/ShippingInfoMapper.xml | 1
src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java | 3
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java | 15 ++
src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java | 4
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java | 28 ++++
src/main/resources/mapper/quality/QualityInspectMapper.xml | 4
doc/20260601_home_business_上月数据_前端联调文档.md | 101 ++++++++++++++
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java | 7
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java | 23 ++
src/main/java/com/ruoyi/approve/bean/dto/ApprovalInstanceDto.java | 5
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java | 1
17 files changed, 382 insertions(+), 29 deletions(-)
diff --git "a/doc/20260601_home_business_\344\270\212\346\234\210\346\225\260\346\215\256_\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md" "b/doc/20260601_home_business_\344\270\212\346\234\210\346\225\260\346\215\256_\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..19c4f60
--- /dev/null
+++ "b/doc/20260601_home_business_\344\270\212\346\234\210\346\225\260\346\215\256_\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
@@ -0,0 +1,101 @@
+# /home/business 鎺ュ彛鏂板涓婃湀鏁版嵁 鈥� 鍓嶇鑱旇皟鏂囨。
+
+## 鍙樻洿姒傝堪
+
+`GET /home/business` 鎺ュ彛鍦ㄥ師鏈夊瓧娈靛熀纭�涓婃柊澧� **涓婃湀閿�鍞噾棰�** 鍜� **涓婃湀閲囪喘閲戦** 涓や釜瀛楁锛屽墠绔彲鐩存帴鐢ㄤ簬灞曠ず鐜瘮瓒嬪娍銆�
+
+---
+
+## 鎺ュ彛淇℃伅
+
+| 椤圭洰 | 鍐呭 |
+|------|------|
+| 鎺ュ彛鍦板潃 | `/home/business` |
+| 璇锋眰鏂瑰紡 | `GET` |
+| 鏄惁璁よ瘉 | 鏄� |
+
+---
+
+## 鍝嶅簲鍙傛暟
+
+### 鏂板瀛楁
+
+| 瀛楁鍚� | 绫诲瀷 | 璇存槑 |
+|--------|------|------|
+| `lastMonthSaleMoney` | `String` | 涓婃湀閿�鍞悎鍚岄噾棰濓紙鍏冿級锛屼繚鐣欎袱浣嶅皬鏁帮紝濡� `"150000.00"` |
+| `lastMonthPurchaseMoney` | `String` | 涓婃湀閲囪喘鍚堝悓閲戦锛堝厓锛夛紝淇濈暀涓や綅灏忔暟锛屽 `"80000.00"` |
+
+### 瀹屾暣鍝嶅簲
+
+```json
+{
+ "code": 200,
+ "msg": "鎿嶄綔鎴愬姛",
+ "data": {
+ "monthSaleMoney": "200000.00",
+ "lastMonthSaleMoney": "150000.00",
+ "monthSaleHaveMoney": "0.00",
+ "monthPurchaseMoney": "100000.00",
+ "lastMonthPurchaseMoney": "80000.00",
+ "monthPurchaseHaveMoney": "0.00",
+ "inventoryNum": "5000.00",
+ "todayInventoryNum": "120.00"
+ }
+}
+```
+
+### 鎵�鏈夊瓧娈典竴瑙�
+
+| 瀛楁鍚� | 绫诲瀷 | 璇存槑 |
+|--------|------|------|
+| `monthSaleMoney` | `String` | 鏈湀閿�鍞噾棰� |
+| `lastMonthSaleMoney` | **`String`锛堟柊澧烇級** | 涓婃湀閿�鍞噾棰� |
+| `monthSaleHaveMoney` | `String` | 鏈湀閿�鍞湭寮�绁ㄩ噾棰濓紙褰撳墠鍥哄畾 `0.00`锛� |
+| `monthPurchaseMoney` | `String` | 鏈湀閲囪喘閲戦 |
+| `lastMonthPurchaseMoney` | **`String`锛堟柊澧烇級** | 涓婃湀閲囪喘閲戦 |
+| `monthPurchaseHaveMoney` | `String` | 鏈湀閲囪喘鏈紑绁ㄩ噾棰濓紙褰撳墠鍥哄畾 `0.00`锛� |
+| `inventoryNum` | `String` | 褰撳墠搴撳瓨鎬婚噺 |
+| `todayInventoryNum` | `String` | 浠婃棩鍏ュ簱鏁伴噺 |
+
+---
+
+## 鏁版嵁鍙e緞
+
+| 瀛楁 | 鏁版嵁鏉ユ簮 | 缁熻鍙e緞 |
+|------|---------|---------|
+| `monthSaleMoney` | `sales_ledger` 琛� | `entry_date` 鍦ㄦ湰鏈�1鏃涓嬫湀1鏃ヤ箣闂寸殑 `contract_amount` 鍚堣 |
+| `lastMonthSaleMoney` | `sales_ledger` 琛� | `entry_date` 鍦ㄤ笂鏈�1鏃鏈湀1鏃ヤ箣闂寸殑 `contract_amount` 鍚堣 |
+| `monthPurchaseMoney` | `purchase_ledger` 琛� | `entry_date` 鍦ㄦ湰鏈�1鏃涓嬫湀1鏃ヤ箣闂寸殑 `contract_amount` 鍚堣 |
+| `lastMonthPurchaseMoney` | `purchase_ledger` 琛� | `entry_date` 鍦ㄤ笂鏈�1鏃鏈湀1鏃ヤ箣闂寸殑 `contract_amount` 鍚堣 |
+
+---
+
+## 鍓嶇浣跨敤寤鸿
+
+### 鐜瘮灞曠ず
+
+```javascript
+// 璁$畻鐜瘮鍙樺寲
+const saleGrowth = lastMonthSaleMoney > 0
+ ? ((monthSaleMoney - lastMonthSaleMoney) / lastMonthSaleMoney * 100).toFixed(1)
+ : 100;
+
+const purchaseGrowth = lastMonthPurchaseMoney > 0
+ ? ((monthPurchaseMoney - lastMonthPurchaseMoney) / lastMonthPurchaseMoney * 100).toFixed(1)
+ : 100;
+```
+
+### 瓒嬪娍绠ご
+
+- `saleGrowth > 0` 鈫� 绾㈣壊鍚戜笂绠ご (鈫�)
+- `saleGrowth < 0` 鈫� 缁胯壊鍚戜笅绠ご (鈫�)
+- `saleGrowth === 0` 鈫� 鐏拌壊鎸佸钩 (鈫�)
+
+---
+
+## 娉ㄦ剰浜嬮」
+
+1. **绫诲瀷涓� String**锛氶噾棰濆瓧娈靛潎涓哄瓧绗︿覆锛屼繚鐣欎袱浣嶅皬鏁帮紝璁$畻鐜瘮鏃堕渶鐢� `parseFloat()` 杞崲
+2. **榛樿鍊�**锛氭棤鏁版嵁鏃惰繑鍥� `"0.00"`锛屼笉浼氳繑鍥� `null`
+3. **鏈紑绁ㄥ瓧娈�**锛歚monthSaleHaveMoney` 鍜� `monthPurchaseHaveMoney` 褰撳墠鍥哄畾杩斿洖 `"0.00"`锛屽悗缁凯浠d細鎺ュ叆瀹為檯鏁版嵁
+4. **鍚戝悗鍏煎**锛氫粎鏂板瀛楁锛屽師鏈夊瓧娈典笉鍙橈紝宸叉湁鍓嶇鍔熻兘涓嶅彈褰卞搷
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/approve/bean/dto/ApprovalInstanceDto.java b/src/main/java/com/ruoyi/approve/bean/dto/ApprovalInstanceDto.java
index a2df482..b535e69 100644
--- a/src/main/java/com/ruoyi/approve/bean/dto/ApprovalInstanceDto.java
+++ b/src/main/java/com/ruoyi/approve/bean/dto/ApprovalInstanceDto.java
@@ -2,6 +2,8 @@
import com.ruoyi.approve.pojo.ApprovalInstance;
import com.ruoyi.basic.dto.StorageBlobDTO;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@@ -18,4 +20,7 @@
private String createTimeStart;
private List<StorageBlobDTO> storageBlobDTOs;
+
+ @Schema(description = "鍑哄簱鎵瑰彿")
+ private String outboundBatches;
}
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
index 5ef52dd..fbfef90 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -690,8 +690,7 @@
private void handleShippingApprovalFinished(ApprovalInstance instance, String status) {
ShippingInfo shippingInfo = shippingInfoMapper.selectOne(
new LambdaQueryWrapper<ShippingInfo>()
- .eq(ShippingInfo::getId, instance.getTitle())
- .orderByDesc(ShippingInfo::getCreateTime)
+ .eq(ShippingInfo::getId, instance.getBusinessId())
.last("limit 1")
);
if (shippingInfo == null) {
diff --git a/src/main/java/com/ruoyi/home/dto/HomeBusinessDto.java b/src/main/java/com/ruoyi/home/dto/HomeBusinessDto.java
index 6e968a0..19346b2 100644
--- a/src/main/java/com/ruoyi/home/dto/HomeBusinessDto.java
+++ b/src/main/java/com/ruoyi/home/dto/HomeBusinessDto.java
@@ -16,12 +16,18 @@
@Schema(description = "鏈湀閿�鍞噾棰�")
private String monthSaleMoney = "0.00";
+ @Schema(description = "涓婃湀閿�鍞噾棰�")
+ private String lastMonthSaleMoney = "0.00";
+
@Schema(description = "鏈湀閿�鍞湭寮�绁ㄩ噾棰�")
private String monthSaleHaveMoney = "0.00";
@Schema(description = "鏈湀閲囪喘閲戦")
private String monthPurchaseMoney = "0.00";
+ @Schema(description = "涓婃湀閲囪喘閲戦")
+ private String lastMonthPurchaseMoney = "0.00";
+
@Schema(description = "鏈湀閲囪喘鏈紑绁ㄩ噾棰�")
private String monthPurchaseHaveMoney = "0.00";
diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index d3c21a2..affc030 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -179,6 +179,34 @@
homeBusinessDto.setMonthPurchaseMoney(receiveAmount.setScale(2, RoundingMode.HALF_UP).toString());
homeBusinessDto.setMonthPurchaseHaveMoney(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP).toString());
}
+
+ // 涓婃湀閿�鍞噾棰�
+ YearMonth lastMonth = currentMonth.minusMonths(1);
+ LambdaQueryWrapper<SalesLedger> lastMonthSalesWrapper = new LambdaQueryWrapper<>();
+ lastMonthSalesWrapper.ge(SalesLedger::getEntryDate, lastMonth.atDay(1).atStartOfDay())
+ .lt(SalesLedger::getEntryDate, lastMonth.plusMonths(1).atDay(1).atStartOfDay());
+ List<SalesLedger> lastMonthSalesLedgers = salesLedgerMapper.selectList(lastMonthSalesWrapper);
+ if (!CollectionUtils.isEmpty(lastMonthSalesLedgers)) {
+ BigDecimal lastMonthContractAmount = lastMonthSalesLedgers.stream()
+ .map(SalesLedger::getContractAmount)
+ .filter(Objects::nonNull)
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+ homeBusinessDto.setLastMonthSaleMoney(lastMonthContractAmount.setScale(2, RoundingMode.HALF_UP).toString());
+ }
+
+ // 涓婃湀閲囪喘閲戦
+ LambdaQueryWrapper<PurchaseLedger> lastMonthPurchaseWrapper = new LambdaQueryWrapper<>();
+ lastMonthPurchaseWrapper.ge(PurchaseLedger::getEntryDate, lastMonth.atDay(1).atStartOfDay())
+ .lt(PurchaseLedger::getEntryDate, lastMonth.plusMonths(1).atDay(1).atStartOfDay());
+ List<PurchaseLedger> lastMonthPurchaseLedgers = purchaseLedgerMapper.selectList(lastMonthPurchaseWrapper);
+ if (!CollectionUtils.isEmpty(lastMonthPurchaseLedgers)) {
+ BigDecimal lastMonthPurchaseAmount = lastMonthPurchaseLedgers.stream()
+ .map(PurchaseLedger::getContractAmount)
+ .filter(Objects::nonNull)
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+ homeBusinessDto.setLastMonthPurchaseMoney(lastMonthPurchaseAmount.setScale(2, RoundingMode.HALF_UP).toString());
+ }
+
// 缁熻搴撳瓨
BigDecimal stockQuantityTotal = stockInventoryMapper.selectTotal();
homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 5fc752a..e30b978 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -154,12 +154,27 @@
* @param recordId
*/
public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
+ substractStock(productModelId, quantity, recordType, recordId, batchNo, null);
+ }
+
+ /**
+ * 鍚堟牸鍑哄簱锛堝甫鍑哄簱鎵瑰彿锛�
+ *
+ * @param productModelId
+ * @param quantity
+ * @param recordType
+ * @param recordId
+ * @param batchNo
+ * @param outboundBatches 鍑哄簱鎵瑰彿锛屽鏋滀负绌哄垯鑷姩鐢熸垚
+ */
+ public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo, String outboundBatches) {
StockInventoryDto stockInventoryDto = new StockInventoryDto();
stockInventoryDto.setRecordId(recordId);
stockInventoryDto.setRecordType(String.valueOf(recordType));
stockInventoryDto.setQualitity(quantity);
stockInventoryDto.setProductModelId(productModelId);
stockInventoryDto.setBatchNo(batchNo);
+ stockInventoryDto.setOutboundBatches(outboundBatches);
stockInventoryService.addStockOutRecordOnly(stockInventoryDto);
}
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
index 88f0576..676c915 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -5,6 +5,7 @@
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.quality.dto.BatchQuickInspectRequest;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectFile;
@@ -143,13 +144,13 @@
}
/**
- * 鎵归噺蹇�熸楠岋細涓�閿�氳繃骞舵彁浜�
+ * 鎵归噺蹇�熸楠岋細鏀寔鍘熸潗鏂欐楠屻�佽繃绋嬫楠屻�佸嚭鍘傛楠�
*/
@PostMapping("/batchQuickInspect")
@Operation(summary = "鎵归噺蹇�熸楠�")
@Log(title = "鎵归噺蹇�熸楠�", businessType = BusinessType.OTHER)
- public R<?> batchQuickInspect(@RequestBody List<Long> ids) {
- return qualityInspectService.batchQuickInspect(ids);
+ public R<?> batchQuickInspect(@RequestBody BatchQuickInspectRequest request) {
+ return qualityInspectService.batchQuickInspect(request);
}
/**
diff --git a/src/main/java/com/ruoyi/quality/dto/BatchQuickInspectRequest.java b/src/main/java/com/ruoyi/quality/dto/BatchQuickInspectRequest.java
new file mode 100644
index 0000000..6342539
--- /dev/null
+++ b/src/main/java/com/ruoyi/quality/dto/BatchQuickInspectRequest.java
@@ -0,0 +1,42 @@
+package com.ruoyi.quality.dto;
+
+import com.ruoyi.quality.pojo.QualityInspectParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class BatchQuickInspectRequest {
+
+ @Schema(description = "妫�楠屽崟ID鍒楄〃")
+ private List<Long> ids;
+
+ @Schema(description = "妫�娴嬬粨鏋滐細鍚堟牸/涓嶅悎鏍�/閮ㄥ垎鍚堟牸")
+ private String checkResult;
+
+ @Schema(description = "鎸囨爣鏍囧噯ID")
+ private Long testStandardId;
+
+ @Schema(description = "鎬绘暟閲�")
+ private BigDecimal quantity;
+
+ @Schema(description = "鍚堟牸鏁伴噺")
+ private BigDecimal qualifiedQuantity;
+
+ @Schema(description = "涓嶅悎鏍兼暟閲�")
+ private BigDecimal unqualifiedQuantity;
+
+ @Schema(description = "妫�娴嬪崟浣�")
+ private String checkCompany;
+
+ @Schema(description = "妫�楠屽憳濮撳悕")
+ private String checkName;
+
+ @Schema(description = "妫�娴嬫棩鏈燂紝鏍煎紡锛歒YYY-MM-DD")
+ private String checkTime;
+
+ @Schema(description = "妫�楠屽弬鏁板垪琛�")
+ private List<QualityInspectParam> paramList;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
index ee27be0..2562995 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
+++ b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -4,11 +4,11 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.quality.dto.BatchQuickInspectRequest;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.pojo.QualityInspect;
import jakarta.servlet.http.HttpServletResponse;
-import java.util.List;
public interface IQualityInspectService extends IService<QualityInspect> {
@@ -28,9 +28,9 @@
R autoSubmit(Long id);
/**
- * 鎵归噺蹇�熸楠岋細涓�閿�氳繃骞舵彁浜�
+ * 鎵归噺蹇�熸楠�
*/
- R batchQuickInspect(List<Long> ids);
+ R batchQuickInspect(BatchQuickInspectRequest request);
void down(HttpServletResponse response, QualityInspect qualityInspect);
}
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 6b38c30..590700d 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -17,6 +17,7 @@
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.quality.dto.BatchQuickInspectRequest;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityTestStandardMapper;
@@ -35,14 +36,17 @@
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URLEncoder;
+import java.sql.Date;
import java.time.LocalDate;
import java.time.LocalDateTime;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -187,21 +191,150 @@
}
@Override
- public R batchQuickInspect(List<Long> ids) {
- if (ids == null || ids.isEmpty()) {
+ public R batchQuickInspect(BatchQuickInspectRequest request) {
+ // 1. 鏁版嵁鏍¢獙
+ if (request.getIds() == null || request.getIds().isEmpty()) {
return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃楠屽崟");
}
- int success = 0;
- int fail = 0;
- for (Long id : ids) {
- R result = autoSubmit(id);
- if (R.isSuccess(result)) {
- success++;
- } else {
- fail++;
+ List<String> validResults = Arrays.asList("鍚堟牸", "涓嶅悎鏍�", "閮ㄥ垎鍚堟牸");
+ if (!validResults.contains(request.getCheckResult())) {
+ return R.fail("妫�娴嬬粨鏋滃繀椤讳负锛氬悎鏍笺�佷笉鍚堟牸銆侀儴鍒嗗悎鏍�");
+ }
+ if (request.getQuantity() == null || request.getQuantity().compareTo(BigDecimal.ZERO) <= 0) {
+ return R.fail("鎬绘暟閲忓繀椤诲ぇ浜�0");
+ }
+ if (request.getTestStandardId() == null) {
+ return R.fail("鎸囨爣鏍囧噯ID涓嶈兘涓虹┖");
+ }
+ // quantity = qualifiedQuantity + unqualifiedQuantity
+ BigDecimal qty = request.getQuantity();
+ BigDecimal qualified = request.getQualifiedQuantity() != null ? request.getQualifiedQuantity() : BigDecimal.ZERO;
+ BigDecimal unqualified = request.getUnqualifiedQuantity() != null ? request.getUnqualifiedQuantity() : BigDecimal.ZERO;
+ if (qty.compareTo(qualified.add(unqualified)) != 0) {
+ return R.fail("鎬绘暟閲忓繀椤荤瓑浜庡悎鏍兼暟閲忓姞涓嶅悎鏍兼暟閲�");
+ }
+ String checkResult = request.getCheckResult();
+ if ("鍚堟牸".equals(checkResult)) {
+ if (qualified.compareTo(qty) != 0 || unqualified.compareTo(BigDecimal.ZERO) != 0) {
+ return R.fail("妫�楠岀粨鏋滀负鍚堟牸鏃讹紝鍚堟牸鏁伴噺搴旂瓑浜庢�绘暟閲忥紝涓嶅悎鏍兼暟閲忓簲涓�0");
+ }
+ } else if ("涓嶅悎鏍�".equals(checkResult)) {
+ if (qualified.compareTo(BigDecimal.ZERO) != 0 || unqualified.compareTo(qty) != 0) {
+ return R.fail("妫�楠岀粨鏋滀负涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忓簲涓�0锛屼笉鍚堟牸鏁伴噺搴旂瓑浜庢�绘暟閲�");
+ }
+ } else {
+ if (qualified.compareTo(BigDecimal.ZERO) <= 0 || unqualified.compareTo(BigDecimal.ZERO) <= 0) {
+ return R.fail("妫�楠岀粨鏋滀负閮ㄥ垎鍚堟牸鏃讹紝鍚堟牸鏁伴噺鍜屼笉鍚堟牸鏁伴噺閮藉繀椤诲ぇ浜�0");
}
}
- return R.ok(String.format("蹇�熸楠屽畬鎴愶細鎴愬姛 %d 鏉★紝澶辫触 %d 鏉�", success, fail));
+
+ // 瑙f瀽妫�娴嬫棩鏈�
+ Date checkTimeDate = null;
+ if (request.getCheckTime() != null && !request.getCheckTime().isEmpty()) {
+ checkTimeDate = Date.valueOf(LocalDate.parse(request.getCheckTime()));
+ }
+
+ int success = 0;
+ List<String> errors = new ArrayList<>();
+
+ for (Long id : request.getIds()) {
+ try {
+ // 浣跨敤鐙珛浜嬪姟澶勭悊姣忎釜妫�楠屽崟锛岄伩鍏嶅崟涓け璐ュ奖鍝嶆暣浣撲簨鍔�
+ processSingleInspect(id, request, checkResult, qty, qualified, unqualified, checkTimeDate);
+ success++;
+ } catch (Exception e) {
+ errors.add("妫�楠屽崟 " + id + " 澶勭悊澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ if (!errors.isEmpty()) {
+ return R.ok(String.format("蹇�熸楠屽畬鎴愶細鎴愬姛 %d 鏉★紝澶辫触 %d 鏉°�傚け璐ュ師鍥狅細%s",
+ success, errors.size(), String.join("锛�", errors)));
+ }
+ return R.ok(String.format("蹇�熸楠屽畬鎴愶細鎴愬姛 %d 鏉�", success));
+ }
+
+ /**
+ * 鍦ㄧ嫭绔嬩簨鍔′腑澶勭悊鍗曚釜妫�楠屽崟
+ */
+ @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+ public void processSingleInspect(Long id, BatchQuickInspectRequest request,
+ String checkResult, BigDecimal qty,
+ BigDecimal qualified, BigDecimal unqualified,
+ Date checkTimeDate) {
+ QualityInspect qualityInspect = qualityInspectMapper.selectById(id);
+ if (qualityInspect == null) {
+ throw new RuntimeException("妫�楠屽崟涓嶅瓨鍦�");
+ }
+ if (Integer.valueOf(1).equals(qualityInspect.getInspectState())) {
+ throw new RuntimeException("妫�楠屽崟宸叉彁浜�");
+ }
+
+ // 2. 鏇存柊妫�楠屽崟瀛楁
+ qualityInspect.setCheckResult(checkResult);
+ qualityInspect.setTestStandardId(request.getTestStandardId());
+ qualityInspect.setQuantity(qty);
+ qualityInspect.setQualifiedQuantity(qualified);
+ qualityInspect.setUnqualifiedQuantity(unqualified);
+ if (request.getCheckCompany() != null) {
+ qualityInspect.setCheckCompany(request.getCheckCompany());
+ }
+ if (request.getCheckName() != null) {
+ qualityInspect.setCheckName(request.getCheckName());
+ }
+ if (checkTimeDate != null) {
+ qualityInspect.setCheckTime(checkTimeDate);
+ }
+ qualityInspect.setInspectState(1);
+
+ // 3. 淇濆瓨妫�楠屽弬鏁�
+ if (request.getParamList() != null && !request.getParamList().isEmpty()) {
+ qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery()
+ .eq(QualityInspectParam::getInspectId, id));
+ for (QualityInspectParam param : request.getParamList()) {
+ param.setInspectId(id);
+ param.setId(null);
+ }
+ qualityInspectParamService.saveBatch(request.getParamList());
+ }
+
+ // 4. 鏇存柊妫�楠屽崟
+ qualityInspectMapper.updateById(qualityInspect);
+
+ // 5. 鍚堟牸鍏ュ簱澶勭悊
+ if (qualified.compareTo(BigDecimal.ZERO) > 0) {
+ StockInventoryDto stockInventoryDto = new StockInventoryDto();
+ stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()));
+ if (ObjectUtils.isNotEmpty(qualityInspect.getPurchaseLedgerId())) {
+ stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
+ }
+ stockInventoryDto.setRecordId(qualityInspect.getId());
+ stockInventoryDto.setProductModelId(qualityInspect.getProductModelId());
+ stockInventoryDto.setQualitity(qualified);
+ if (qualityInspect.getCheckTime() != null) {
+ LocalDate stockCreateDate = DateUtils.toLocalDate(qualityInspect.getCheckTime()).plusDays(1);
+ stockInventoryDto.setCreateTime(LocalDateTime.of(stockCreateDate, java.time.LocalTime.MIDNIGHT));
+ }
+ stockInventoryDto.setBatchNo(resolveProductionBatchNo(
+ qualityInspect.getProductMainId(),
+ qualityInspect.getId(),
+ qualityInspect.getProductModelId()));
+ stockInventoryService.addStockInRecordOnly(stockInventoryDto);
+ }
+
+ // 6. 涓嶅悎鏍煎鐞�
+ if (unqualified.compareTo(BigDecimal.ZERO) > 0) {
+ QualityUnqualified qualityUnqualified = new QualityUnqualified();
+ BeanUtils.copyProperties(qualityInspect, qualityUnqualified);
+ qualityUnqualified.setInspectState(0);
+ qualityUnqualified.setQuantity(unqualified);
+ List<QualityInspectParam> inspectParams = qualityInspectParamService.list(
+ Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, id));
+ String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(","));
+ qualityUnqualified.setDefectivePhenomena(text + "杩欎簺鎸囨爣涓瓨鍦ㄤ笉鍚堟牸");
+ qualityUnqualified.setInspectId(id);
+ qualityUnqualifiedMapper.insert(qualityUnqualified);
+ }
}
private String resolveProductionBatchNo(Long productionProductMainId,
diff --git a/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java b/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
index a5616d8..3e06782 100644
--- a/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
+++ b/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
@@ -71,6 +71,10 @@
@Excel(name = "鍙戣揣杞︾墝鍙�")
private String shippingCarNumber;
+ @Schema(description = "鍑哄簱鎵瑰彿")
+ @Excel(name = "鍑哄簱鎵瑰彿")
+ private String outboundBatches;
+
@Schema(description = "鍒涘缓鏃堕棿")
private LocalDateTime createTime;
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
index 4e6ff58..dfa4a3a 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -142,11 +142,19 @@
@Override
public boolean add(ShippingInfoDto req) {
+ // 鏍¢獙outboundBatches鍞竴鎬�
+ if (req.getOutboundBatches() != null && !req.getOutboundBatches().isEmpty()) {
+ long count = this.count(new LambdaQueryWrapper<ShippingInfo>()
+ .eq(ShippingInfo::getOutboundBatches, req.getOutboundBatches()));
+ if (count > 0) {
+ throw new RuntimeException("鍑哄簱鎵瑰彿宸插瓨鍦紝璇烽噸鏂拌緭鍏�");
+ }
+ }
this.save(req);
req.getBatchNoDetailList().forEach(item -> item.setShippingInfoId(req.getId()));
shippingProductDetailMapper.insert(req.getBatchNoDetailList());
for (ShippingProductDetail shippingProductDetail : req.getBatchNoDetailList()) {
- stockUtils.substractStock(shippingProductDetail.getProductModelId(), shippingProductDetail.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(), shippingProductDetail.getBatchNo());
+ stockUtils.substractStock(shippingProductDetail.getProductModelId(), shippingProductDetail.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(), shippingProductDetail.getBatchNo(), req.getOutboundBatches());
}
// 淇濆瓨鏂囦欢
fileUtil.saveStorageAttachment(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, req.getId(), req.getStorageBlobDTOs());
@@ -172,20 +180,23 @@
@Override
public boolean addReq(ShippingInfoDto req) {
- LoginUser loginUser = SecurityUtils.getLoginUser();
- String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH","shipping_no",req.getCreateTime());
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ // 璁剧疆鍒涘缓鏃堕棿涓哄綋鍓嶆椂闂达紝纭繚缂栧彿鏌ヨ姝g‘
+ LocalDateTime now = LocalDateTime.now();
+ req.setCreateTime(now);
+ String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH", "shipping_no", now);
// 鍏堜繚瀛樺彂璐у崟锛屽啀鍙戣捣瀹℃壒锛涙棤瀹℃牳浜鸿嚜鍔ㄩ�氳繃鏃堕渶瑕佹寜鍙戣揣缂栧彿鍥炲啓鍙戣揣鐘舵�併��
req.setShippingNo(sh);
req.setStatus("寰呭鏍�");
boolean save = this.add(req);
// 鍙戣揣瀹℃壒
ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto();
- approvalInstance.setTemplateId(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,7L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getId());
- approvalInstance.setTemplateName(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,7L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getTemplateName());
+ approvalInstance.setTemplateId(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType, 7L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getId());
+ approvalInstance.setTemplateName(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType, 7L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getTemplateName());
approvalInstance.setBusinessId(req.getId());
approvalInstance.setBusinessType(7L);
approvalInstance.setCurrentLevel(1);
- approvalInstance.setTitle(sh+"瀹℃壒");
+ approvalInstance.setTitle(sh + "瀹℃壒");
approvalInstance.setApplicantId(loginUser.getUserId());
approvalInstance.setApplicantName(loginUser.getNickName());
approvalInstance.setApplyTime(LocalDateTime.now());
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
index 33b7599..756d28e 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -80,4 +80,7 @@
@Schema(description = "浜у搧id")
private Long productId;
+
+ @Schema(description = "鍑哄簱鎵瑰彿")
+ private String outboundBatches;
}
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index fa76bc7..5dc8d4a 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -292,6 +292,7 @@
stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
stockOutRecordDto.setType("0");
stockOutRecordDto.setRemark(stockInventoryDto.getRemark());
+ stockOutRecordDto.setOutboundBatches(stockInventoryDto.getOutboundBatches());
stockOutRecordService.add(stockOutRecordDto);
return true;
}
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
index 26f0c2d..c5d1109 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -60,8 +60,11 @@
@Override
public int add(StockOutRecordDto stockOutRecordDto) {
- String no = OrderUtils.countTodayByCreateTime(stockOutRecordMapper, "CK","outbound_batches", stockOutRecordDto.getCreateTime() != null ? stockOutRecordDto.getCreateTime() : LocalDateTime.now());
- stockOutRecordDto.setOutboundBatches(no);
+ // 濡傛灉浼犲叆浜唎utboundBatches鍒欎娇鐢紝鍚﹀垯鑷姩鐢熸垚
+ if (stockOutRecordDto.getOutboundBatches() == null || stockOutRecordDto.getOutboundBatches().isEmpty()) {
+ String no = OrderUtils.countTodayByCreateTime(stockOutRecordMapper, "CK","outbound_batches", stockOutRecordDto.getCreateTime() != null ? stockOutRecordDto.getCreateTime() : LocalDateTime.now());
+ stockOutRecordDto.setOutboundBatches(no);
+ }
if (StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode().equals(stockOutRecordDto.getRecordType())){
stockOutRecordDto.setApprovalStatus(3);
}
diff --git a/src/main/resources/mapper/quality/QualityInspectMapper.xml b/src/main/resources/mapper/quality/QualityInspectMapper.xml
index 6086121..74b3e98 100644
--- a/src/main/resources/mapper/quality/QualityInspectMapper.xml
+++ b/src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -5,7 +5,7 @@
SELECT
qi.*,
<choose>
- <when test="qualityInspect.inspectType == 0">
+ <when test="qualityInspect.inspectType != 2">
pl.purchase_contract_number as purchase_contract_no
</when>
<otherwise>
@@ -16,7 +16,7 @@
FROM
quality_inspect qi
<choose>
- <when test="qualityInspect.inspectType == 0 ">
+ <when test="qualityInspect.inspectType != 2 ">
LEFT JOIN purchase_ledger pl ON pl.id = qi.purchase_ledger_id
</when>
<otherwise>
diff --git a/src/main/resources/mapper/sales/ShippingInfoMapper.xml b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
index 9021eb4..161b384 100644
--- a/src/main/resources/mapper/sales/ShippingInfoMapper.xml
+++ b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
@@ -19,6 +19,7 @@
s.update_user,
s.tenant_id,
sl.sales_contract_no,
+ s.outbound_batches,
pm.model as specification_model,
pm.unit,
p.product_name,
--
Gitblit v1.9.3