From 9c0f77a63226589b86e43ae105c0002b667b4847 Mon Sep 17 00:00:00 2001 From: liding <756868258@qq.com> Date: 星期三, 21 五月 2025 15:55:55 +0800 Subject: [PATCH] 来票登记逻辑更改 --- src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java | 9 ++ src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java | 62 ++++++++++++--- src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java | 2 src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java | 18 ++++ src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java | 79 ++++++++++++++++--- src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java | 12 ++ src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java | 6 + 7 files changed, 161 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java index 33926e8..70809d8 100644 --- a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java +++ b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java @@ -95,10 +95,18 @@ } /** + * 鏍规嵁id鏌ヨ閲囪喘鍚堝悓鍙� + */ + @GetMapping("/getPurchaseNoById") + public PurchaseLedgerDto getPurchaseNoById(Long id) { + return purchaseLedgerService.getPurchaseNoById(id); + } + + /** * 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇骇鍝� */ @GetMapping("/getProduct") - public List getProduct(PurchaseLedgerDto purchaseLedgerDto){ + public List getProduct(PurchaseLedgerDto purchaseLedgerDto) { return purchaseLedgerService.getProduct(purchaseLedgerDto); } @@ -106,7 +114,7 @@ * 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇骇鍝� */ @GetMapping("/getInfo") - public PurchaseLedgerDto getInfo(PurchaseLedgerDto purchaseLedgerDto){ + public PurchaseLedgerDto getInfo(PurchaseLedgerDto purchaseLedgerDto) { return purchaseLedgerService.getInfo(purchaseLedgerDto); } } diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java index dcc8b06..71c56e2 100644 --- a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java +++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java @@ -5,6 +5,7 @@ import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -116,4 +117,21 @@ * 浜у搧瑙勬牸id */ private Long productModelId; + + /** + * 鍙戠エ鍙� + */ + private String invoiceNumber; + + /** + * 鍙戠エ閲戦锛堝厓锛� + */ + private BigDecimal invoiceAmount; + + /** + * 鏉ョエ鐧昏id + */ + private Long ticketRegistrationId; + + } diff --git a/src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java b/src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java index 3676003..1f5bf55 100644 --- a/src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java +++ b/src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java @@ -1,13 +1,20 @@ package com.ruoyi.purchase.dto; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.purchase.pojo.TicketRegistration; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.Data; import java.util.List; +/** + * 鏉ョエ鐧昏琛� + */ + @Data -public class TicketRegistrationDto { +@TableName("ticket_registration") +public class TicketRegistrationDto extends TicketRegistration { /** * 涓婚敭ID diff --git a/src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java b/src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java index 41d6171..a297f3f 100644 --- a/src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java +++ b/src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java @@ -78,6 +78,12 @@ private BigDecimal invoiceAmount; /** + * 寮�绁ㄤ汉ID + */ + @Excel(name = "寮�绁ㄤ汉") + private String issUerId; + + /** * 寮�绁ㄤ汉 */ @Excel(name = "寮�绁ㄤ汉") diff --git a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java index 1607cb6..428ec82 100644 --- a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java +++ b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java @@ -29,4 +29,6 @@ PurchaseLedgerDto getInfo(PurchaseLedgerDto purchaseLedgerDto); List getPurchasesNo(); + + PurchaseLedgerDto getPurchaseNoById(Long id); } diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java index af2171e..c2bef5b 100644 --- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java +++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java @@ -18,7 +18,9 @@ import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.purchase.dto.PurchaseLedgerDto; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; +import com.ruoyi.purchase.mapper.TicketRegistrationMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; +import com.ruoyi.purchase.pojo.TicketRegistration; import com.ruoyi.purchase.service.IPurchaseLedgerService; import com.ruoyi.sales.mapper.CommonFileMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; @@ -73,6 +75,8 @@ private final ProductModelMapper productModelMapper; + private final TicketRegistrationMapper ticketRegistrationMapper; + @Value("${file.upload-dir}") private String uploadDir; @@ -118,7 +122,7 @@ // 4. 澶勭悊瀛愯〃鏁版嵁 List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData(); if (productList != null && !productList.isEmpty()) { - handleSalesLedgerProducts(purchaseLedger.getId(), purchaseLedgerDto.getProductId(), purchaseLedgerDto.getProductModelId(), productList, purchaseLedgerDto.getType()); + handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType()); } // 5. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰� @@ -129,19 +133,52 @@ return 1; } - private void handleSalesLedgerProducts(Long salesLedgerId, Long productId, Long productModelId, List<SalesLedgerProduct> products, Integer type) { - Product pro = productMapper.selectById(productId); - ProductModel productModel = productModelMapper.selectById(productModelId); + private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) { + if (products == null || products.isEmpty()) { + throw new BaseException("浜у搧淇℃伅涓嶅瓨鍦�"); + } - // 鎸塈D鍒嗙粍锛屽尯鍒嗘柊澧炲拰鏇存柊鐨勮褰� + // 鎻愬墠鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑ID + Set<Long> productIds = products.stream() + .map(SalesLedgerProduct::getProductId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + Set<Long> modelIds = products.stream() + .map(SalesLedgerProduct::getProductModelId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + // 涓�娆℃�ф煡璇骇鍝佸拰鍨嬪彿淇℃伅 + Map<Long, String> productMap = new HashMap<>(); + if (!productIds.isEmpty()) { + List<Product> productList = productMapper.selectBatchIds(productIds); + productList.forEach(p -> productMap.put(p.getId(), p.getProductName())); + } + + Map<Long, String> modelMap = new HashMap<>(); + if (!modelIds.isEmpty()) { + List<ProductModel> modelList = productModelMapper.selectBatchIds(modelIds); + modelList.forEach(m -> modelMap.put(m.getId(), m.getModel())); + } + + // 璁剧疆瀛楁 + for (SalesLedgerProduct product : products) { + product.setSalesLedgerId(salesLedgerId); + + Long productId = product.getProductId(); + if (productId != null && productMap.containsKey(productId)) { + product.setProductCategory(productMap.get(productId)); + } + + Long productModelId = product.getProductModelId(); + if (productModelId != null && modelMap.containsKey(productModelId)) { + product.setSpecificationModel(modelMap.get(productModelId)); + } + } + + // 鍒嗙粍澶勭悊 Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream() - .peek(p -> { - p.setSalesLedgerId(salesLedgerId); - p.setProductId(productId); - p.setProductCategory(pro.getProductName()); - p.setProductModelId(productModelId); - p.setSpecificationModel(productModel.getModel()); - }) .collect(Collectors.partitioningBy(p -> p.getId() != null)); List<SalesLedgerProduct> updateList = partitionedProducts.get(true); @@ -315,6 +352,10 @@ queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId()) .eq(SalesLedgerProduct::getType, 2); List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(queryWrapper); + productList.forEach(product -> { + product.setFutureTickets(product.getFutureTickets() != null ? product.getFutureTickets() : product.getQuantity().longValue()); + product.setFutureTicketsAmount(product.getFutureTicketsAmount() != null ? product.getFutureTicketsAmount() : product.getTaxInclusiveTotalPrice()); + }); resultDto.setProductData(productList); return resultDto; @@ -336,6 +377,20 @@ ).collect(Collectors.toList()); } + @Override + public PurchaseLedgerDto getPurchaseNoById(Long id) { + PurchaseLedgerDto purchaseLedgerDto = new PurchaseLedgerDto(); + PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id); + BeanUtils.copyProperties(purchaseLedger,purchaseLedgerDto); + TicketRegistration ticketRegistration = ticketRegistrationMapper.selectOne(new LambdaQueryWrapper<TicketRegistration>().eq(TicketRegistration::getPurchaseLedgerId, id)); + if (ticketRegistration != null) { + purchaseLedgerDto.setInvoiceNumber(ticketRegistration.getInvoiceNumber()); + purchaseLedgerDto.setInvoiceAmount(ticketRegistration.getInvoiceAmount()); + purchaseLedgerDto.setTicketRegistrationId(ticketRegistration.getId()); + } + return purchaseLedgerDto; + } + /** * 涓嬪垝绾垮懡鍚嶈浆椹煎嘲鍛藉悕 */ diff --git a/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java index ef4d278..dee106e 100644 --- a/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java +++ b/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java @@ -74,31 +74,45 @@ @Override public int addOrUpdateRegistration(TicketRegistrationDto ticketRegistrationDto) throws IOException { + // 1. 鏌ヨ閲囪喘鍙拌处璁板綍 PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(ticketRegistrationDto.getPurchaseLedgerId()); + if (purchaseLedger == null) { + // 澶勭悊閲囪喘鍙拌处涓嶅瓨鍦ㄧ殑鎯呭喌锛屼緥濡傛姏鍑哄紓甯告垨杩斿洖閿欒 + throw new IllegalArgumentException("閲囪喘鍙拌处璁板綍涓嶅瓨鍦紝ID: " + ticketRegistrationDto.getPurchaseLedgerId()); + } + + // 2. 鏌ヨ鏄惁宸插瓨鍦ㄧエ鎹櫥璁拌褰� + TicketRegistration existingRecord = ticketRegistrationMapper.selectOne( + new LambdaQueryWrapper<TicketRegistration>() + .eq(TicketRegistration::getPurchaseLedgerId, ticketRegistrationDto.getPurchaseLedgerId()) + ); + + // 3. 鍒涘缓鎴栨洿鏂扮エ鎹櫥璁板疄浣� TicketRegistration ticketRegistration = new TicketRegistration(); BeanUtils.copyProperties(ticketRegistrationDto, ticketRegistration); + if (existingRecord != null){ + ticketRegistration.setId(existingRecord.getId()); + } ticketRegistration.setPurchaseContractNumber(purchaseLedger.getPurchaseContractNumber()); ticketRegistration.setTenantId(purchaseLedger.getTenantId()); ticketRegistration.setContractAmount(purchaseLedger.getContractAmount()); - // 澶勭悊瀛愯〃鏁版嵁 + + // 4. 澶勭悊瀛愯〃鏁版嵁 List<SalesLedgerProduct> productData = ticketRegistrationDto.getProductData(); - if (productData != null && !productData.isEmpty()) { + if (CollectionUtils.isNotEmpty(productData)) { handleSalesLedgerProducts(purchaseLedger.getId(), productData, 2); } - // 鎵ц鎻掑叆鎴栨洿鏂版搷浣� - int i; - if (ticketRegistrationDto.getId() == null) { - i = ticketRegistrationMapper.insert(ticketRegistration); - } else { - i = ticketRegistrationMapper.updateById(ticketRegistration); - } + // 5. 鎵ц鎻掑叆鎴栨洿鏂版搷浣� + int rowsAffected = existingRecord != null + ? ticketRegistrationMapper.updateById(ticketRegistration) + : ticketRegistrationMapper.insert(ticketRegistration); // 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰� if (ticketRegistrationDto.getTempFileIds() != null && !ticketRegistrationDto.getTempFileIds().isEmpty()) { migrateTempFilesToFormal(ticketRegistration.getId(), ticketRegistrationDto.getTempFileIds()); } - return i; + return rowsAffected; } @@ -216,8 +230,32 @@ // 鎵归噺鏇存柊锛堥渶瑕� MyBatis 鎻愪緵鎵归噺鏇存柊鏂规硶锛� if (!updateList.isEmpty()) { updateList.forEach(product -> { - product.setFutureTickets(product.getQuantity().subtract(new BigDecimal(product.getTicketsNum())).longValue()); - product.setFutureTicketsAmount(product.getTaxExclusiveTotalPrice().subtract(product.getTicketsAmount())); + // 闈炵┖鏍¢獙锛屼换涓�瀛楁涓虹┖鍒欐姏鍑哄紓甯� + if (product.getQuantity() == null) { + throw new BaseException("鏁伴噺涓嶈兘涓虹┖"); + } + if (product.getTicketsNum() == null) { + throw new BaseException("宸插紑绁ㄦ暟閲忎笉鑳戒负绌�"); + } + if (product.getTaxExclusiveTotalPrice() == null) { + throw new BaseException("涓嶅惈绋庢�讳环涓嶈兘涓虹┖"); + } + if (product.getTicketsAmount() == null) { + throw new BaseException("鏈鏉ョエ閲戦(鍏�)涓嶈兘涓虹┖"); + } + + // 璁$畻 futureTickets锛堢洿鎺ヤ娇鐢� BigDecimal 璁$畻锛岄伩鍏嶇簿搴︿涪澶憋級 + product.setFutureTickets( + product.getQuantity() + .subtract(BigDecimal.valueOf(product.getTicketsNum())) + .longValueExact() // 浣跨敤 exact 鏂规硶纭繚鏃犲皬鏁伴儴鍒� + ); + + // 璁$畻 futureTicketsAmount + product.setFutureTicketsAmount( + product.getTaxExclusiveTotalPrice() + .subtract(product.getTicketsAmount()) + ); product.setType(type); salesLedgerProductMapper.updateById(product); }); -- Gitblit v1.9.3