doc/20260829_alter_sales_purchase_amount_scale_6.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,90 @@ -- éå®/éè´ç¸å ³é¡µé¢éé¢ãåä»·ãæ°éãæ»ä»·ç»ä¸ä¿ç 6 ä½å°æ° -- æ¶å页é¢ï¼é宿¥ä»·ãéå®å°è´¦ã客æ·éè´§ã客æ·å¾æ¥ãéè´å°è´¦ãä¾åºå徿¥ãéè´éè´§ãéè´æ¥è¡¨ -- ç»ä¸ä½¿ç¨ decimal(18, 6)ï¼æ´æ°ä½ä¿ç 12 ä½ï¼é¿å ç± decimal(10, 2) ç´æ¥æ¹å°æ°ä½å¯¼è´çæº¢åº -- ---------------------------- -- é宿¥ä»·ï¼sales_quotation / sales_quotation_productï¼ -- ---------------------------- ALTER TABLE `sales_quotation` MODIFY COLUMN `total_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'æ¥ä»·éé¢'; ALTER TABLE `sales_quotation_product` MODIFY COLUMN `quantity` decimal(18, 6) NULL DEFAULT NULL COMMENT 'æ°é', MODIFY COLUMN `unit_price` decimal(18, 6) NULL DEFAULT NULL COMMENT 'åä»·', MODIFY COLUMN `amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'éé¢'; -- ---------------------------- -- éå®å°è´¦ï¼sales_ledger / sales_ledger_productï¼ -- ---------------------------- ALTER TABLE `sales_ledger` MODIFY COLUMN `contract_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'ååéé¢ï¼äº§åå«ç¨æ»ä»·ï¼', MODIFY COLUMN `net_contract_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'å®é ååéé¢ï¼æ£åéè´§åï¼'; ALTER TABLE `sales_ledger_product` MODIFY COLUMN `quantity` decimal(18, 6) NOT NULL COMMENT 'æ°é', MODIFY COLUMN `min_stock` decimal(18, 6) NULL DEFAULT NULL COMMENT 'æä½åºå', MODIFY COLUMN `tax_inclusive_unit_price` decimal(18, 6) NOT NULL COMMENT 'å«ç¨åä»·', MODIFY COLUMN `tax_inclusive_total_price` decimal(18, 6) NOT NULL COMMENT 'å«ç¨æ»ä»·', MODIFY COLUMN `tax_exclusive_total_price` decimal(18, 6) NOT NULL COMMENT 'ä¸å«ç¨æ»ä»·', MODIFY COLUMN `warn_num` decimal(18, 6) NULL DEFAULT NULL COMMENT 'é¢è¦æ°é'; -- å°è´¦æ¨¡æ¿ï¼ä¿å/å¥ç¨æ¨¡æ¿æ¶ä¸äº§åè¡¨ç»æä¿æä¸è´ï¼ ALTER TABLE `sales_ledger_product_template` MODIFY COLUMN `quantity` decimal(18, 6) NULL DEFAULT NULL COMMENT 'æ°é', MODIFY COLUMN `min_stock` decimal(18, 6) NULL DEFAULT NULL COMMENT 'æä½åºå', MODIFY COLUMN `tax_inclusive_unit_price` decimal(18, 6) NULL DEFAULT NULL COMMENT 'å«ç¨åä»·', MODIFY COLUMN `tax_inclusive_total_price` decimal(18, 6) NULL DEFAULT NULL COMMENT 'å«ç¨æ»ä»·', MODIFY COLUMN `tax_exclusive_total_price` decimal(18, 6) NULL DEFAULT NULL COMMENT 'ä¸å«ç¨æ»ä»·', MODIFY COLUMN `warn_num` decimal(18, 6) NULL DEFAULT NULL COMMENT 'é¢è¦æ°é'; -- ---------------------------- -- 客æ·éè´§ï¼return_management / return_sale_product / sales_refund_amount_orderï¼ -- ---------------------------- ALTER TABLE `return_management` MODIFY COLUMN `refund_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT '鿬¾æ»é¢'; ALTER TABLE `return_sale_product` MODIFY COLUMN `num` decimal(18, 6) NOT NULL COMMENT 'éè´§äº§åæ°é', MODIFY COLUMN `price` decimal(18, 6) NULL DEFAULT NULL COMMENT 'åä»·', MODIFY COLUMN `amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'éé¢'; ALTER TABLE `sales_refund_amount_order` MODIFY COLUMN `refund_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'åºé款éé¢', MODIFY COLUMN `refunded_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT '已鿬¾éé¢', MODIFY COLUMN `not_refunded_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'æªé款éé¢'; -- ---------------------------- -- 客æ·å¾æ¥ï¼å款é颿¥æºï¼account_sales_collectionãreceipt_paymentï¼ -- ---------------------------- ALTER TABLE `account_sales_collection` MODIFY COLUMN `collection_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'æ¶æ¬¾éé¢'; ALTER TABLE `receipt_payment` MODIFY COLUMN `receipt_payment_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT '忬¾éé¢'; -- ---------------------------- -- éè´å°è´¦ï¼purchase_ledger / purchase_ledger_templateï¼ -- ---------------------------- ALTER TABLE `purchase_ledger` MODIFY COLUMN `contract_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'ååéé¢', MODIFY COLUMN `net_contract_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'å®é ååéé¢ï¼æ£åéè´§åï¼'; ALTER TABLE `purchase_ledger_template` MODIFY COLUMN `contract_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'ååéé¢'; -- ---------------------------- -- ä¾åºå徿¥ï¼ä»æ¬¾é颿¥æºï¼account_purchase_paymentï¼ -- ---------------------------- ALTER TABLE `account_purchase_payment` MODIFY COLUMN `payment_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT '仿¬¾éé¢'; -- ---------------------------- -- éè´éè´§ï¼purchase_return_orders / purchase_return_order_productsï¼ -- ---------------------------- ALTER TABLE `purchase_return_orders` MODIFY COLUMN `total_discount_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'æ´åææ£é¢', MODIFY COLUMN `total_discount_rate` decimal(18, 6) NULL DEFAULT NULL COMMENT 'æ´åææ£ç', MODIFY COLUMN `total_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT 'æäº¤éé¢'; ALTER TABLE `purchase_return_order_products` MODIFY COLUMN `return_quantity` decimal(18, 6) NOT NULL DEFAULT 0.000000 COMMENT 'éè´§æ°é'; src/main/java/com/ruoyi/account/service/impl/purchase/AccountPurchasePaymentServiceImpl.java
@@ -97,7 +97,7 @@ if (dto.getPaymentDate() == null) { throw new ServiceException("è¯·éæ©ä»æ¬¾æ¥æ"); } if (dto.getPaymentAmount() == null || dto.getPaymentAmount().compareTo(BigDecimal.valueOf(0.01)) < 0) { if (dto.getPaymentAmount() == null || dto.getPaymentAmount().compareTo(new BigDecimal("0.000001")) < 0) { throw new ServiceException("请è¾å ¥ä»æ¬¾éé¢"); } if (StringUtils.isEmpty(dto.getPurchaseContractNumber())) { src/main/java/com/ruoyi/account/service/impl/sales/AccountSalesCollectionServiceImpl.java
@@ -102,7 +102,7 @@ if (dto.getPaymentDate() == null) { throw new ServiceException("è¯·éæ©åæ¬¾æ¥æ"); } if (dto.getPaymentAmount() == null || dto.getPaymentAmount().compareTo(BigDecimal.valueOf(0.01)) < 0) { if (dto.getPaymentAmount() == null || dto.getPaymentAmount().compareTo(new BigDecimal("0.000001")) < 0) { throw new ServiceException("请è¾å ¥å款éé¢"); } if (StringUtils.isEmpty(dto.getSalesContractNo())) { src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
@@ -27,6 +27,8 @@ private String deviceModel; @Schema(description = "æ¥ä¿®æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date repairTime; @Schema(description = "æ¥ä¿®äºº") src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
@@ -116,4 +116,7 @@ @TableField(fill = FieldFill.INSERT) private Long deptId; @Schema(description = "ç¶æ 0=å¾ å·¡æ£, 1=已宿") private Integer status; } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -911,20 +911,37 @@ List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().in(SysUser::getNickName, salesLedgerImportDtoList.stream().map(PurchaseLedgerImportDto::getRecorderName).collect(Collectors.toList()))); for (PurchaseLedgerImportDto salesLedgerImportDto : salesLedgerImportDtoList) { PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>() PurchaseLedger existPurchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>() .eq(PurchaseLedger::getPurchaseContractNumber, salesLedgerImportDto.getPurchaseContractNumber()) .last("limit 1")); if(purchaseLedger != null){ // å·²å®¡æ ¸éè¿çéè´åè·³è¿ï¼ä¸åéå¤å¯¼å ¥ if (existPurchaseLedger != null && ApprovalStatusEnum.APPROVED.getCode().equals(existPurchaseLedger.getApprovalStatus())) { continue; } PurchaseLedger salesLedger = new PurchaseLedger(); BeanUtils.copyProperties(salesLedgerImportDto, salesLedger); // éè¿ä¾åºååç§°æ¥è¯¢ID salesLedger.setSupplierId(customers.stream() .filter(customer -> customer.getSupplierName().equals(salesLedger.getSupplierName())) .findFirst() .map(SupplierManage::getId) .orElse(null)); // å¾ å®¡æ ¸ç¶æçéè´åï¼å é¤è¯¥åä¸ç产å详æ å审æ¹å®ä¾ï¼éæ°å½å ¥è¯¦æ if (existPurchaseLedger != null) { salesLedgerProductMapper.delete(new LambdaQueryWrapper<SalesLedgerProduct>() .eq(SalesLedgerProduct::getSalesLedgerId, existPurchaseLedger.getId()) .eq(SalesLedgerProduct::getType, 2)); // æ¸ ç该åä¸çè´¨æ£è®°å½åè´¨æ£åæ° deleteQualityInspectByPurchaseLedger(existPurchaseLedger.getId()); ApprovalInstance existApprovalInstance = approvalInstanceService.getOne( Wrappers.<ApprovalInstance>lambdaQuery() .eq(ApprovalInstance::getBusinessId, existPurchaseLedger.getId()) .eq(ApprovalInstance::getBusinessType, 5L) .eq(ApprovalInstance::getDeleted, 0) .orderByDesc(ApprovalInstance::getId) .last("limit 1")); if (existApprovalInstance != null) { approvalInstanceService.delete(Collections.singletonList(existApprovalInstance.getId())); } salesLedger.setId(existPurchaseLedger.getId()); salesLedger.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode()); } // éè¿ä¾åºååç§°æ¥è¯¢IDï¼ä¸åå¨åèªå¨æ°å¢ salesLedger.setSupplierId(findOrCreateSupplier(salesLedger.getSupplierName(), customers)); Long aLong = sysUsers.stream() .filter(sysUser -> sysUser.getNickName().equals(salesLedger.getRecorderName())) .findFirst() @@ -964,7 +981,12 @@ String collect = ids.stream().map(Object::toString).collect(Collectors.joining(",")); salesLedger.setApproveUserIds(collect); } purchaseLedgerMapper.insert(salesLedger); if (salesLedger.getId() == null) { purchaseLedgerMapper.insert(salesLedger); } else { // å¾ å®¡æ ¸ç¶æéæ°å½å ¥æ¶ï¼æ´æ°ä¸»è¡¨ purchaseLedgerMapper.updateById(salesLedger); } for (PurchaseLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) { SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct(); @@ -972,14 +994,21 @@ salesLedgerProduct.setSalesLedgerId(salesLedger.getId()); salesLedgerProduct.setType(2); // 计ç®ä¸å«ç¨æ»ä»· salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP)); list.stream() .filter(map -> map.get("productName").equals(salesLedgerProduct.getProductCategory()) && map.get("model").equals(salesLedgerProduct.getSpecificationModel())) .findFirst() .ifPresent(map -> { salesLedgerProduct.setProductModelId(Long.parseLong(map.get("modelId").toString())); salesLedgerProduct.setProductId(Long.parseLong(map.get("id").toString())); }); salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 6, RoundingMode.HALF_UP)); // 产å大类/è§æ ¼åå·ä¸å卿¶èªå¨å建 String productName = salesLedgerProduct.getProductCategory(); if (StringUtils.isNotBlank(productName)) { // è§æ ¼åå·ä¸ºç©ºæ¶ç¨äº§å大类ä½ä¸ºè§æ ¼åå· String model = StringUtils.isNotBlank(salesLedgerProduct.getSpecificationModel()) ? salesLedgerProduct.getSpecificationModel() : productName; salesLedgerProduct.setSpecificationModel(model); Long productId = findOrCreateProduct(productName, list); Long modelId = findOrCreateProductModel(productId, productName, model, salesLedgerProduct.getUnit(), list); salesLedgerProduct.setProductId(productId); salesLedgerProduct.setProductModelId(modelId); } salesLedgerProduct.setRegister(loginUser.getNickName()); salesLedgerProduct.setRegisterDate(LocalDateTime.now()); salesLedgerProduct.setApproveStatus(0); @@ -993,8 +1022,132 @@ return AjaxResult.success("å¯¼å ¥æå"); } catch (Exception e) { e.printStackTrace(); return AjaxResult.error("å¯¼å ¥å¤±è´¥ï¼" + e.getMessage()); } return AjaxResult.success("å¯¼å ¥å¤±è´¥"); } /** * æ¥æ¾ææ°å¢ä¾åºåï¼supplier_manage 表æ supplier_name å¹é ï¼ä¸åå¨åæ°å¢ï¼ç¼ºå¤±ä¿¡æ¯é»è®¤å"/" */ private Long findOrCreateSupplier(String supplierName, List<SupplierManage> supplierList) { if (StringUtils.isBlank(supplierName)) { return null; } // å ååè¡¨ä¸æ¥æ¾ï¼æ¬æ¬¡å¯¼å ¥å·²æ°å¢çä¹å å«å¨å ï¼ for (SupplierManage supplier : supplierList) { if (supplierName.equals(supplier.getSupplierName())) { return supplier.getId(); } } // æ°æ®åºæ¥æ¾ SupplierManage existSupplier = supplierManageMapper.selectOne(new LambdaQueryWrapper<SupplierManage>() .eq(SupplierManage::getSupplierName, supplierName) .last("limit 1")); if (existSupplier != null) { supplierList.add(existSupplier); return existSupplier.getId(); } // æ°å¢ä¾åºåï¼ç¼ºå¤±ä¿¡æ¯ï¼ç¨å·ãå°åãçµè¯çï¼é»è®¤å"/" SupplierManage newSupplier = new SupplierManage(); newSupplier.setSupplierName(supplierName); newSupplier.setTaxpayerIdentificationNum("/"); newSupplier.setCompanyAddress("/"); newSupplier.setSupplierType("/"); newSupplier.setCompanyPhone("/"); newSupplier.setBankAccountName("/"); newSupplier.setBankAccountNum("/"); newSupplier.setContactUserName("/"); newSupplier.setContactUserPhone("/"); supplierManageMapper.insert(newSupplier); supplierList.add(newSupplier); return newSupplier.getId(); } /** * æ¥æ¾ææ°å¢äº§å大类ï¼product 表æ product_name å¹é ï¼ä¸åå¨åæ°å¢ï¼é»è®¤ç¶ID为278 */ private Long findOrCreateProduct(String productName, List<Map<String, Object>> productAndModelList) { // å ååè¡¨ä¸æ¥æ¾ï¼æ¬æ¬¡å¯¼å ¥å·²æ°å¢çä¹å å«å¨å ï¼ for (Map<String, Object> map : productAndModelList) { if (map.get("productName") != null && productName.equals(map.get("productName"))) { return Long.valueOf(map.get("id").toString()); } } // æ°æ®åºæ¥æ¾ï¼å·²åå¨ä½ææ è§æ ¼åå·ç产åä¸å¨å åå表ä¸ï¼ Product existProduct = productMapper.selectOne(new LambdaQueryWrapper<Product>() .eq(Product::getProductName, productName) .last("limit 1")); if (existProduct != null) { return existProduct.getId(); } // æ°å¢äº§å大类ï¼é»è®¤ç¶ID为278 Product product = new Product(); product.setProductName(productName); product.setParentId(278L); productMapper.insert(product); return product.getId(); } /** * æ¥æ¾ææ°å¢äº§åè§æ ¼åå·ï¼product_model æ 产åID+è§æ ¼åå· å¹é ï¼ä¸åå¨åæ°å¢ã * 产åç¼ç = è§æ ¼åå· + "_" + ä¸ä½æµæ°´å·ï¼è§æ ¼åå·ä¸ºç©ºæ¶ç¨äº§å大类ä½ä¸ºè§æ ¼åå·ã */ private Long findOrCreateProductModel(Long productId, String productName, String model, String unit, List<Map<String, Object>> productAndModelList) { // å ååè¡¨ä¸æ¥æ¾ for (Map<String, Object> map : productAndModelList) { if (map.get("id") != null && Long.valueOf(map.get("id").toString()).equals(productId) && model.equals(map.get("model"))) { return Long.valueOf(map.get("modelId").toString()); } } // æ°æ®åºæ¥æ¾ ProductModel existProductModel = productModelMapper.selectOne(new LambdaQueryWrapper<ProductModel>() .eq(ProductModel::getProductId, productId) .eq(ProductModel::getModel, model) .last("limit 1")); if (existProductModel != null) { return existProductModel.getId(); } // æ°å¢è§æ ¼åå·ï¼äº§åç¼ç = è§æ ¼åå· + "_" + ä¸ä½æµæ°´å·ï¼å产åä¸èªå¢ï¼ long count = productModelMapper.selectCount(new LambdaQueryWrapper<ProductModel>() .eq(ProductModel::getProductId, productId)); ProductModel productModel = new ProductModel(); productModel.setProductId(productId); productModel.setModel(model); productModel.setUnit(unit); productModel.setProductCode(model + "_" + String.format("%03d", count + 1)); productModelMapper.insert(productModel); // è®°å½å°å åå表ï¼é¿å æ¬æ¬¡å¯¼å ¥å éå¤å建 Map<String, Object> newMap = new HashMap<>(); newMap.put("id", productId); newMap.put("modelId", productModel.getId()); newMap.put("productName", productName); newMap.put("model", model); productAndModelList.add(newMap); return productModel.getId(); } /** * å é¤éè´åä¸çè´¨æ£è®°å½åè´¨æ£åæ°ï¼å·²æäº¤çæ£éªåä¸å 许å é¤ï¼ */ private void deleteQualityInspectByPurchaseLedger(Long purchaseLedgerId) { LambdaQueryWrapper<QualityInspect> inspectWrapper = new LambdaQueryWrapper<>(); inspectWrapper.eq(QualityInspect::getPurchaseLedgerId, purchaseLedgerId); List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(inspectWrapper); for (QualityInspect qualityInspect : qualityInspects) { if (ObjectUtils.isNotEmpty(qualityInspect.getInspectState()) && qualityInspect.getInspectState().equals(1)) { throw new BaseException("å·²æäº¤çæ£éªåä¸è½å é¤"); } } List<Long> inspectIds = qualityInspects.stream() .map(QualityInspect::getId) .collect(Collectors.toList()); if (!inspectIds.isEmpty()) { qualityInspectParamMapper.delete(new LambdaQueryWrapper<QualityInspectParam>() .in(QualityInspectParam::getInspectId, inspectIds)); } qualityInspectMapper.delete(inspectWrapper); } @Override src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java
@@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @@ -27,11 +28,11 @@ @Schema(description = "åä½") private String unit; @Schema(description = "åä»·") private Double unitPrice; private BigDecimal unitPrice; @Schema(description = "æ°é") private Integer quantity; private BigDecimal quantity; @Schema(description = "éé¢") private Double amount; private BigDecimal amount; @Schema(description = "å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -321,7 +321,7 @@ BigDecimal remain = stockInventory.getQualitity() .subtract(stockInventory.getLockedQuantity()) .subtract(required) .divide(BigDecimal.ONE, 2, RoundingMode.CEILING); .divide(BigDecimal.ONE, 6, RoundingMode.CEILING); if (remain.compareTo(BigDecimal.ZERO) < 0) { count++; stringBuffer.append(structure.getProductName()) src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -15,9 +15,13 @@ import com.ruoyi.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.mapper.CustomerUserMapper; import com.ruoyi.basic.mapper.ProductMapper; import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.pojo.CustomerUser; import com.ruoyi.basic.pojo.Product; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.SaleEnum; @@ -62,6 +66,8 @@ import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.web.multipart.MultipartFile; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -91,8 +97,13 @@ private static final String LOCK_PREFIX = "contract_no_lock:"; private static final long LOCK_WAIT_TIMEOUT = 10; // éçå¾ è¶ æ¶æ¶é´ï¼ç§ï¼ private static final long LOCK_EXPIRE_TIME = 30; // éèªå¨è¿ææ¶é´ï¼ç§ï¼ /** å¯¼å ¥èªå¨æ°å¢å®¢æ·æ¶ï¼é¤å®¢æ·åç§°å¤å ¶ä½ä¿¡æ¯çé»è®¤å¡«å å¼ */ private static final String IMPORT_DEFAULT_VALUE = "/"; /** å¯¼å ¥èªå¨æ°å¢äº§åå¤§ç±»æ¶æè½½ç顶级产åèç¹åç§° */ private static final String FINISHED_PRODUCT_NAME = "æå"; private final SalesLedgerMapper salesLedgerMapper; private final CustomerMapper customerMapper; private final CustomerUserMapper customerUserMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; private final SalesLedgerProductServiceImpl salesLedgerProductServiceImpl; private final CommonFileMapper commonFileMapper; @@ -334,21 +345,9 @@ // å®¢æ·æ°æ® - åè listPage æ¥è¯¢ç§æµ·å®¢æ·ï¼type = 0ï¼ // type = 0ï¼ç§æµ·å®¢æ·ï¼æè type = 1ï¼å ¬æµ·å®¢æ·ï¼ä¸å·²è¢«åé ï¼å¹¶ä¸æ¯èªå·±é¢ç¨ãèªå·±å建æè å ±äº«ç»èªå·±çå®¢æ· Long loginUserId = loginUser.getUser().getUserId(); List<Customer> customers = customerMapper.selectList(new QueryWrapper<Customer>() .in("customer_name", salesLedgerImportDtoList.stream() .map(SalesLedgerImportDto::getCustomerName).collect(Collectors.toList())) .and(wrapper -> wrapper.eq("type", 0) .or(wrapper2 -> wrapper2.eq("type", 1).eq("is_assigned", 1))) .and(wrapper -> wrapper.eq("usage_user", loginUserId) .or(wrapper2 -> wrapper2.eq("create_user", loginUserId) .or(wrapper3 -> wrapper3.exists("select 1 from customer_user cu where cu.customer_id = customer.id and cu.user_id = " + loginUserId))))); // // è§æ ¼åå·æ°æ® // List<ProductModel> productModels = productModelMapper.selectList(new LambdaQueryWrapper<ProductModel>().in(ProductModel::getModel, // salesLedgerProductImportDtoList.stream().map(SalesLedgerImportDto::getSpecificationModel).collect(Collectors.toList()))); // // 产åå¤§ç±»æ°æ® // List<Product> productList = productMapper.selectList(new LambdaQueryWrapper<Product>().in(Product::getProductName, // salesLedgerProductImportDtoList.stream().map(SalesLedgerImportDto::getProductCategory).collect(Collectors.toList()))); List<Map<String, Object>> list = productModelMapper.getProductAndModelList(); Map<String, Customer> customerCache = new HashMap<>(); // 产å大类ãè§æ ¼åå·ç¼åï¼key = 产å大类 + | + è§æ ¼åå·ï¼ä¸å卿¶èªå¨æ°å¢ Map<String, ProductModel> productModelCache = new HashMap<>(); // å½å ¥äººæ°æ® List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().in(SysUser::getNickName, salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getEntryPerson).collect(Collectors.toList()))); @@ -370,15 +369,11 @@ BeanUtils.copyProperties(salesLedgerImportDto, salesLedger); salesLedger.setExecutionDate(DateUtils.toLocalDate(salesLedgerImportDto.getExecutionDate())); salesLedger.setDeliveryDate(DateUtils.toLocalDate(salesLedgerImportDto.getDeliveryDate())); // éè¿å®¢æ·åç§°æ¥è¯¢å®¢æ·IDï¼å®¢æ·ååå· Optional<Customer> customerOptional = customers.stream() .filter(customer -> customer.getCustomerName().equals(salesLedger.getCustomerName())) .findFirst(); if (customerOptional.isEmpty()) { throw new RuntimeException("客æ·:" + salesLedger.getCustomerName() + "ä¸åå¨ï¼æè éç§æµ·ç¨æ·"); } salesLedger.setCustomerId(customerOptional.get().getId()); salesLedger.setCustomerContractNo(customerOptional.get().getTaxpayerIdentificationNumber()); // éè¿å®¢æ·åç§°æ¥è¯¢å®¢æ·IDï¼å®¢æ·ååå·ï¼å®¢æ·ä¸å卿¶èªå¨æ°å¢ Customer customer = resolveImportCustomer(salesLedger.getCustomerName(), loginUserId, loginUser.getNickName(), customerCache); salesLedger.setCustomerId(customer.getId()); salesLedger.setCustomerContractNo(customer.getTaxpayerIdentificationNumber()); Long aLong = sysUsers.stream() .filter(sysUser -> sysUser.getNickName().equals(salesLedger.getEntryPerson())) .findFirst() @@ -405,27 +400,17 @@ salesLedgerProduct.setSalesLedgerId(salesLedger.getId()); salesLedgerProduct.setType(1); // 计ç®ä¸å«ç¨æ»ä»· salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP)); // æ ¡éªäº§åè§æ ¼æ¯å¦åå¨ Optional<Map<String, Object>> productModelOptional = list.stream() .filter(map -> Objects.equals(map.get("productName"), salesLedgerProduct.getProductCategory()) && Objects.equals(map.get("model"), salesLedgerProduct.getSpecificationModel())) .findFirst(); if (productModelOptional.isEmpty()) { throw new RuntimeException("产å大类:" + salesLedgerProduct.getProductCategory() + ",è§æ ¼åå·:" + salesLedgerProduct.getSpecificationModel() + "ä¸åå¨ï¼"); salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 6, RoundingMode.HALF_UP)); // æ ¡éªäº§åè§æ ¼æ¯å¦åå¨ï¼äº§å大类ãè§æ ¼åå·ä¸å卿¶èªå¨æ°å¢ ProductModel productModel = resolveImportProductModel(salesLedgerProduct.getProductCategory(), salesLedgerProduct.getSpecificationModel(), salesLedgerProduct.getUnit(), productModelCache); salesLedgerProduct.setProductModelId(productModel.getId()); salesLedgerProduct.setProductId(productModel.getProductId()); // è§æ ¼åå·ä¸ºç©ºæ¶å产å大类ï¼åä½ä¸ºç©ºæ¶åè§æ ¼åå·ä¸çåä½ salesLedgerProduct.setSpecificationModel(productModel.getModel()); if (StringUtils.isEmpty(salesLedgerProduct.getUnit())) { salesLedgerProduct.setUnit(productModel.getUnit()); } Map<String, Object> productModelMap = productModelOptional.get(); salesLedgerProduct.setProductModelId(Long.parseLong(productModelMap.get("modelId").toString())); salesLedgerProduct.setProductId(Long.parseLong(productModelMap.get("id").toString())); // salesLedgerProduct.setProductId(productList.stream() // .filter(product -> product.getProductName().equals(salesLedgerProduct.getProductCategory())) // .findFirst() // .map(Product::getId) // .orElse(null)); // salesLedgerProduct.setProductModelId(productModels.stream() // .filter(productModel -> productModel.getModel().equals(salesLedgerProduct.getSpecificationModel())) // .findFirst() // .map(ProductModel::getId) // .orElse(null)); salesLedgerProduct.setRegister(loginUser.getNickName()); salesLedgerProduct.setRegisterDate(LocalDateTime.now()); salesLedgerProduct.setApproveStatus(0); @@ -439,10 +424,193 @@ return AjaxResult.success("å¯¼å ¥æå"); } catch (Exception e) { e.printStackTrace(); // å¯¼å ¥è¿ç¨ä¸ä¼èªå¨æ°å¢å®¢æ·ã产å大类ãè§æ ¼åå·ï¼å¤±è´¥æ¶éè¦åæ»ï¼é¿å æ®çèæ°æ® if (TransactionSynchronizationManager.isActualTransactionActive()) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } return AjaxResult.error("å¯¼å ¥å¤±è´¥ï¼" + e.getMessage()); } } /** * å¯¼å ¥æ¶è·å客æ·ï¼å®¢æ·ä¸åå¨åèªå¨æ°å¢å¹¶æå°å½åç»å½äººåä¸ * <p> * 1ãå½åç»å½äººå¯ç¨ç客æ·ï¼ç§æµ·ï¼æå ¬æµ·å·²åé ä¸èªå·±é¢ç¨/å建/å ±äº«ï¼ï¼ç´æ¥ä½¿ç¨ï¼ * 2ãååå ¬æµ·å®¢æ·æªåé ï¼é¢ç¨å°èªå·±åä¸ï¼ * 3ãååå ¬æµ·å®¢æ·å·²åé ç»å«äººï¼å ±äº«ç»èªå·±ï¼ * 4ãåå客æ·å¨å«äººç§æµ·ï¼æ¥éï¼ä¸æ°å»ºï¼ * 5ã客æ·ä¸åå¨ï¼æ°å¢ç§æµ·å®¢æ·æå°èªå·±åä¸ï¼çº³ç¨äººè¯å«å·ãçµè¯çä¿¡æ¯å¡« "/"ã */ private Customer resolveImportCustomer(String customerName, Long loginUserId, String nickName, Map<String, Customer> customerCache) { String name = StringUtils.trim(customerName); if (StringUtils.isEmpty(name)) { throw new RuntimeException("客æ·åç§°ä¸è½ä¸ºç©ºï¼"); } Customer cachedCustomer = customerCache.get(name); if (cachedCustomer != null) { return cachedCustomer; } // å½åç»å½äººå¯ç¨çå®¢æ· Customer customer = customerMapper.selectOne(new QueryWrapper<Customer>() .eq("customer_name", name) .and(wrapper -> wrapper.eq("type", 0) .or(wrapper2 -> wrapper2.eq("type", 1).eq("is_assigned", 1))) .and(wrapper -> wrapper.eq("usage_user", loginUserId) .or(wrapper2 -> wrapper2.eq("create_user", loginUserId) .or(wrapper3 -> wrapper3.exists("select 1 from customer_user cu where cu.customer_id = customer.id and cu.user_id = " + loginUserId)))) .last("limit 1")); if (customer == null) { customer = claimOrCreateImportCustomer(name, loginUserId, nickName); } customerCache.put(name, customer); return customer; } /** * åå客æ·ä¸å±äºå½åç»å½äººæ¶çå¤çï¼å ¬æµ·æªåé çé¢ç¨å°èªå·±åä¸ï¼å ¬æµ·å·²åé çå ±äº«ç»èªå·±ï¼ * å¨å«äººç§æµ·çç´æ¥æ¥éï¼é½ä¸åå¨åæ°å¢å®¢æ· */ private Customer claimOrCreateImportCustomer(String customerName, Long loginUserId, String nickName) { List<Customer> sameNameCustomers = customerMapper.selectList(new QueryWrapper<Customer>() .eq("customer_name", customerName) .orderByAsc("id")); // å ¬æµ·æªåé 客æ·ï¼é¢ç¨å°èªå·±åä¸ Optional<Customer> publicUnassigned = sameNameCustomers.stream() .filter(item -> Objects.equals(item.getType(), 1) && (item.getIsAssigned() == null || item.getIsAssigned() == 0)) .findFirst(); if (publicUnassigned.isPresent()) { Customer customer = publicUnassigned.get(); customer.setIsAssigned(1); customer.setUsageStatus(1L); customer.setUsageUser(loginUserId); customerMapper.updateById(customer); return customer; } // å ¬æµ·å·²åé ç»å«äººç客æ·ï¼å ±äº«ç»èªå·± Optional<Customer> publicAssigned = sameNameCustomers.stream() .filter(item -> Objects.equals(item.getType(), 1) && Objects.equals(item.getIsAssigned(), 1)) .findFirst(); if (publicAssigned.isPresent()) { Customer customer = publicAssigned.get(); CustomerUser customerUser = new CustomerUser(); customerUser.setCustomerId(customer.getId()); customerUser.setUserId(loginUserId); customerUserMapper.insert(customerUser); return customer; } // å©ä¸ç齿¯å«äººçç§æµ·å®¢æ· if (!sameNameCustomers.isEmpty()) { throw new RuntimeException("客æ·:" + customerName + "å·²å¨å ¶ä»äººç§æµ·ä¸ï¼æ æ³å¯¼å ¥ï¼"); } // 客æ·ä¸åå¨ï¼æ°å¢ç§æµ·å®¢æ·å¹¶æå°èªå·±åä¸ Customer customer = new Customer(); customer.setCustomerName(customerName); customer.setCustomerType(IMPORT_DEFAULT_VALUE); customer.setTaxpayerIdentificationNumber(IMPORT_DEFAULT_VALUE); customer.setCompanyAddress(IMPORT_DEFAULT_VALUE); customer.setCompanyPhone(IMPORT_DEFAULT_VALUE); customer.setContactPerson(IMPORT_DEFAULT_VALUE); customer.setContactPhone(IMPORT_DEFAULT_VALUE); customer.setBasicBankAccount(IMPORT_DEFAULT_VALUE); customer.setBankAccount(IMPORT_DEFAULT_VALUE); customer.setBankCode(IMPORT_DEFAULT_VALUE); customer.setMaintainer(nickName); customer.setMaintenanceTime(new Date()); // ç§æµ·å®¢æ·ï¼é¢ç¨äººä¸ºå½åç»å½äºº customer.setType(0); customer.setIsAssigned(0); customer.setUsageStatus(1L); customer.setUsageUser(loginUserId); customerMapper.insert(customer); return customer; } /** * å¯¼å ¥æ¶è·åè§æ ¼åå·ï¼äº§å大类ãè§æ ¼åå·ä¸åå¨åèªå¨æ°å¢ * <p> * è§æ ¼åå·ä¸ºç©ºæ¶å产å大类ä½ä¸ºè§æ ¼åå·ï¼äº§å大类ä¸å卿¶æå°é¡¶çº§"æå"èç¹ä¸ï¼ * æ°å¢è§æ ¼åå·æ¶æ"è§æ ¼åå· + è§æ ¼ID + _ + ä¸ä½æµæ°´å·"çæäº§åç¼ç */ private ProductModel resolveImportProductModel(String productCategory, String specificationModel, String unit, Map<String, ProductModel> productModelCache) { String category = StringUtils.trim(productCategory); if (StringUtils.isEmpty(category)) { throw new RuntimeException("产å大类ä¸è½ä¸ºç©ºï¼"); } // è§æ ¼åå·ä¸ºç©ºæ¶å产å大类å½äº§åè§æ ¼ String model = StringUtils.trim(specificationModel); if (StringUtils.isEmpty(model)) { model = category; } String cacheKey = category + "|" + model; ProductModel cachedProductModel = productModelCache.get(cacheKey); if (cachedProductModel != null) { return cachedProductModel; } // 产å大类ä¸åå¨åæ°å¢å°é¡¶çº§"æå"èç¹ä¸ Product product = productMapper.selectOne(new LambdaQueryWrapper<Product>() .eq(Product::getProductName, category) .orderByAsc(Product::getId) .last("limit 1")); if (product == null) { product = new Product(); product.setParentId(getFinishedProductId()); product.setProductName(category); productMapper.insert(product); } // è§æ ¼åå·ä¸åå¨åæ°å¢ ProductModel productModel = productModelMapper.selectOne(new LambdaQueryWrapper<ProductModel>() .eq(ProductModel::getProductId, product.getId()) .eq(ProductModel::getModel, model) .orderByAsc(ProductModel::getId) .last("limit 1")); if (productModel == null) { productModel = new ProductModel(); productModel.setProductId(product.getId()); productModel.setModel(model); productModel.setUnit(StringUtils.isEmpty(unit) ? IMPORT_DEFAULT_VALUE : StringUtils.trim(unit)); productModelMapper.insert(productModel); // 产åç¼ç ä¾èµèªå¢çè§æ ¼IDï¼æå ¥åååå¡« productModel.setProductCode(generateProductCode(productModel.getModel(), productModel.getId())); productModelMapper.updateById(productModel); } productModelCache.put(cacheKey, productModel); return productModel; } /** * æ¥è¯¢é¡¶çº§"æå"产åèç¹ï¼äº§åå称为æåä¸ç¶IDä¸ºç©ºï¼ */ private Long getFinishedProductId() { Product finishedProduct = productMapper.selectOne(new LambdaQueryWrapper<Product>() .eq(Product::getProductName, FINISHED_PRODUCT_NAME) .isNull(Product::getParentId) .orderByAsc(Product::getId) .last("limit 1")); if (finishedProduct == null) { throw new RuntimeException("äº§åæ¡£æ¡ä¸ä¸åå¨é¡¶çº§èç¹:" + FINISHED_PRODUCT_NAME + "ï¼æ æ³èªå¨æ°å¢äº§å大类ï¼"); } return finishedProduct.getId(); } /** * çæäº§åç¼ç ï¼è§åï¼è§æ ¼åå· + è§æ ¼ID + _ + ä¸ä½æµæ°´å·ï¼ç¼ç å·²å卿¶æµæ°´å·éå¢ */ private String generateProductCode(String model, Long productModelId) { String prefix = model + productModelId + "_"; for (int sequence = 1; sequence < 1000; sequence++) { String productCode = prefix + String.format("%03d", sequence); Long count = productModelMapper.selectCount(new LambdaQueryWrapper<ProductModel>() .eq(ProductModel::getProductCode, productCode)); if (count == null || count == 0) { return productCode; } } throw new RuntimeException("è§æ ¼åå·:" + model + "ç产åç¼ç æµæ°´å·å·²è¶ åºèå´ï¼"); } @Override public List<LossProductModelDto> getSalesLedgerWithProductsLoss(Long salesLedgerId) { src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -326,6 +326,7 @@ stockInventoryDto.setQualitity(dto.getQualifiedQuantity()); stockInventoryDto.setRemark(dto.getRemark()); stockInventoryDto.setWarnNum(dto.getWarnNum()); stockInventoryDto.setBatchNo(dto.getBatchNo()); // éªè¯åæ ¼å»ç»æ°é if (ObjectUtils.isNotEmpty(dto.getQualifiedLockedQuantity())) { @@ -348,6 +349,7 @@ stockUninventoryDto.setRecordId(0L); stockUninventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()); stockUninventoryDto.setQualitity(dto.getUnQualifiedQuantity()); stockUninventoryDto.setBatchNo(dto.getBatchNo()); stockUninventoryDto.setRemark(dto.getRemark()); // éªè¯ä¸åæ ¼å»ç»æ°é src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -151,8 +151,8 @@ SUM(slp.quantity) AS purchaseNum, SUM(slp.tax_inclusive_total_price) AS purchaseAmount, COUNT(DISTINCT slp.sales_ledger_id) AS purchaseTimes, <!-- å¹³ååä»· = æ»éè´éé¢/æ»éè´æ°éï¼ä¿ç2ä½å°æ°ï¼é¿å é¤0 --> ROUND(IF(SUM(slp.quantity) = 0, 0, SUM(slp.tax_inclusive_total_price) / SUM(slp.quantity)), 2) AS averagePrice, <!-- å¹³ååä»· = æ»éè´éé¢/æ»éè´æ°éï¼ä¿ç6ä½å°æ°ï¼é¿å é¤0 --> ROUND(IF(SUM(slp.quantity) = 0, 0, SUM(slp.tax_inclusive_total_price) / SUM(slp.quantity)), 6) AS averagePrice, <!-- 该产åå¤§ç±»ä¸æåä¸ä¸ªå½å ¥æ¥æï¼åå°è´¦ä¸»è¡¨çentry_dateï¼ --> MAX(sl.entry_date) AS entryDate, COALESCE(NULLIF(SUM(t1.return_quantity), 0), 0) AS return_quantity,