docs/´óÂÞËØ.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,7 @@ alter table stock_inventory add warehouse varchar(255) null comment 'ä»åº'; alter table stock_uninventory add warehouse varchar(255) null comment 'ä»åº'; alter table stock_in_record add warehouse varchar(255) null comment 'ä»åº'; 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); } /** 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 = "æ£æµæ¥æï¼æ ¼å¼ï¼YYYY-MM-DD") private String checkTime; @Schema(description = "æ£éªåæ°å表") private List<QualityInspectParam> paramList; } 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); } 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)); // è§£ææ£æµæ¥æ 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, src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
@@ -22,6 +22,8 @@ @Excel(name = "æ¹å·") private String batchNo; @Excel(name = "ä»åº") private String warehouse; @Excel(name = "åæ ¼åºåæ°é") private BigDecimal qualifiedQuantity; src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -73,4 +73,7 @@ @TableField(fill = FieldFill.INSERT) private Long deptId; @Schema(description = "ä»åº") private String warehouse; } src/main/java/com/ruoyi/stock/pojo/StockInventory.java
@@ -72,4 +72,7 @@ @TableField(fill = FieldFill.INSERT) private Long deptId; @Schema(description = "ä»åº") private String warehouse; } src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
@@ -68,4 +68,7 @@ @TableField(fill = FieldFill.INSERT) private Long deptId; @Schema(description = "ä»åº") private String warehouse; } src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -247,6 +247,7 @@ setBatchNo(stockInRecord.getBatchNo()); setRemark(stockInRecord.getRemark()); setWarnNum(stockInRecord.getWarnNum()); setWarehouse(stockInRecord.getWarehouse()); setVersion(1); }}); } else { @@ -266,6 +267,7 @@ setQualitity(stockInRecord.getStockInNum()); setBatchNo(stockInRecord.getBatchNo()); setRemark(stockInRecord.getRemark()); setWarehouse(stockInRecord.getWarehouse()); setVersion(1); }}); } else { src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -14,6 +14,7 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.R; import com.ruoyi.project.system.service.ISysDictDataService; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.stock.dto.StockInRecordDto; @@ -60,6 +61,7 @@ private final StockUninventoryService stockUninventoryService; private final SalesLedgerProductMapper salesLedgerProductMapper; private final ProductModelMapper productModelMapper; private final ISysDictDataService sysDictDataService; @Override public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) { @@ -171,6 +173,7 @@ stockInRecordDto.setRemark(stockInventoryDto.getRemark()); stockInRecordDto.setWarnNum(stockInventoryDto.getWarnNum()); stockInRecordDto.setCreateTime(stockInventoryDto.getCreateTime()); stockInRecordDto.setWarehouse(stockInventoryDto.getWarehouse()); stockInRecordService.add(stockInRecordDto); return true; } @@ -316,6 +319,14 @@ int successCount = 0; for (StockInventoryExportData dto : list) { // éªè¯ä»åºæ¯å¦åå¨äºåå ¸ä¸ if (StringUtils.isNotEmpty(dto.getWarehouse())) { String warehouseLabel = sysDictDataService.selectDictLabel("warehouse", dto.getWarehouse()); if (StringUtils.isEmpty(warehouseLabel)) { throw new RuntimeException("ä»åºå¼ " + dto.getWarehouse() + " ä¸åå¨äºåå ¸ä¸"); } } // æå»ºæ¥æ¾é® String key = dto.getProductName() + "|" + dto.getModel(); SalesLedgerProduct matchedProduct = productMap.get(key); @@ -329,6 +340,7 @@ stockInventoryDto.setQualitity(dto.getQualifiedQuantity()); stockInventoryDto.setRemark(dto.getRemark()); stockInventoryDto.setWarnNum(dto.getWarnNum()); stockInventoryDto.setWarehouse(dto.getWarehouse()); // éªè¯åæ ¼å»ç»æ°é if (ObjectUtils.isNotEmpty(dto.getQualifiedLockedQuantity())) { @@ -352,6 +364,7 @@ stockUninventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()); stockUninventoryDto.setQualitity(dto.getUnQualifiedQuantity()); stockUninventoryDto.setRemark(dto.getRemark()); stockUninventoryDto.setWarehouse(dto.getWarehouse()); // éªè¯ä¸åæ ¼å»ç»æ°é if (ObjectUtils.isNotEmpty(dto.getUnQualifiedLockedQuantity())) { 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> src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -31,6 +31,9 @@ <if test="ew.lockedQuantity != null and ew.lockedQuantity !=''"> locked_quantity = locked_quantity + #{ew.lockedQuantity}, </if> <if test="ew.warehouse != null and ew.warehouse !=''"> warehouse = #{ew.warehouse}, </if> update_time = now() </set> where product_model_id = #{ew.productModelId} @@ -65,6 +68,7 @@ </update> <select id="pagestockInventory" resultType="com.ruoyi.stock.dto.StockInventoryDto"> select si.id, si.warehouse, si.qualitity, COALESCE(si.locked_quantity, 0) as locked_quantity, si.product_model_id, @@ -120,6 +124,7 @@ unit, product_name, product_id, MAX(warehouse) as warehouse, 'combined' as stockType from ( select @@ -142,6 +147,7 @@ pm.unit, p.product_name, p.id as product_id, si.warehouse, ( select IFNULL(SUM(sor.stock_out_num), 0) from stock_out_record sor @@ -180,6 +186,7 @@ pm.unit, p.product_name, p.id as product_id, su.warehouse, 0 as qualifiedPendingOut, ( select IFNULL(SUM(sor.stock_out_num), 0) @@ -221,8 +228,9 @@ model, unit, product_name, product_id order by combined.create_time desc product_id, warehouse order by create_time desc </select> <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData"> @@ -259,6 +267,7 @@ unit, product_name, product_id, MAX(warehouse) as warehouse, 'combined' as stockType from ( select @@ -281,6 +290,7 @@ pm.unit, p.product_name, p.id as product_id, si.warehouse, ( select IFNULL(SUM(sor.stock_out_num), 0) from stock_out_record sor @@ -316,6 +326,7 @@ pm.unit, p.product_name, p.id as product_id, su.warehouse, 0 as qualifiedPendingOut, ( select IFNULL(SUM(sor.stock_out_num), 0) @@ -342,7 +353,7 @@ and combined.product_id in (select id from product_tree) </if> </where> group by batch_no, product_model_id, model, unit, product_name, product_id group by batch_no, product_model_id, model, unit, product_name, product_id, warehouse </select> <select id="stockInventoryPage" resultType="com.ruoyi.stock.dto.StockInRecordDto"> select sir.*,si.qualitity as current_stock, @@ -562,6 +573,7 @@ unit, product_name, product_id, MAX(warehouse) as warehouse, MAX(create_time) as create_time, MAX(update_time) as update_time, @@ -593,6 +605,7 @@ COALESCE(si.warn_num, 0) as warn_num, si.version, si.remark, si.warehouse, ( select IFNULL(SUM(sor.stock_out_num), 0) @@ -635,6 +648,7 @@ 0 as warn_num, su.version, su.remark, su.warehouse, 0 as qualifiedPendingOut, @@ -668,7 +682,8 @@ model, unit, product_name, product_id product_id, warehouse order by batch_no </select> src/main/resources/mapper/stock/StockUninventoryMapper.xml
@@ -50,6 +50,9 @@ <if test="ew.remark != null and ew.remark !=''"> remark = #{ew.remark}, </if> <if test="ew.warehouse != null and ew.warehouse !=''"> warehouse = #{ew.warehouse}, </if> update_time = now() </set> where product_model_id = #{ew.productModelId}