src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -95,6 +95,14 @@ } /** * æ ¹æ®idæ¥è¯¢éè´ååå· */ @GetMapping("/getPurchaseNoById") public AjaxResult getPurchaseNoById(Long id) { return AjaxResult.success(purchaseLedgerService.getPurchaseNoById(id)); } /** * æ ¹æ®éè´ååå·æ¥è¯¢äº§å */ @GetMapping("/getProduct") @@ -106,7 +114,7 @@ * æ ¹æ®éè´ååå·æ¥è¯¢äº§å */ @GetMapping("/getInfo") public PurchaseLedgerDto getInfo(PurchaseLedgerDto purchaseLedgerDto){ return purchaseLedgerService.getInfo(purchaseLedgerDto); public AjaxResult getInfo(PurchaseLedgerDto purchaseLedgerDto) { return AjaxResult.success(purchaseLedgerService.getInfo(purchaseLedgerDto)); } } src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
@@ -7,7 +7,9 @@ import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.purchase.dto.TicketRegistrationDto; import com.ruoyi.purchase.pojo.ProductRecord; import com.ruoyi.purchase.pojo.TicketRegistration; import com.ruoyi.purchase.service.IProductRecordService; import com.ruoyi.purchase.service.ITicketRegistrationService; import com.ruoyi.sales.service.ICommonFileService; import lombok.AllArgsConstructor; @@ -33,12 +35,13 @@ private ICommonFileService commonFileService; private IProductRecordService productRecordService; /** * æ¥è¯¢æ¥ç¥¨ç»è®°å表 */ @GetMapping("/list") public TableDataInfo list(TicketRegistration ticketRegistration) { public TableDataInfo list(TicketRegistration ticketRegistration) { startPage(); List<TicketRegistration> list = ticketRegistrationService.selectTicketRegistrationList(ticketRegistration); return getDataTable(list); @@ -49,8 +52,7 @@ */ @Log(title = "æ¥ç¥¨ç»è®°", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, TicketRegistration ticketRegistration) { public void export(HttpServletResponse response, TicketRegistration ticketRegistration) { List<TicketRegistration> list = ticketRegistrationService.selectTicketRegistrationList(ticketRegistration); ExcelUtil<TicketRegistration> util = new ExcelUtil<TicketRegistration>(TicketRegistration.class); util.exportExcel(response, list, "æ¥ç¥¨ç»è®°æ°æ®"); @@ -78,8 +80,7 @@ */ @Log(title = "æ¥ç¥¨ç»è®°", businessType = BusinessType.DELETE) @DeleteMapping("/delRegistration") public AjaxResult delRegistration(@RequestBody Long[] ids) { public AjaxResult delRegistration(@RequestBody Long[] ids) { return toAjax(ticketRegistrationService.delRegistration(ids)); } @@ -92,4 +93,20 @@ } } /** * æ¥è¯¢äº§åä¿¡æ¯å¼ç¥¨è®°å½å表 */ @GetMapping("/productRecordList") public List<ProductRecord> productRecordList(TicketRegistrationDto ticketRegistrationDto) { List<ProductRecord> list = productRecordService.selectProductRecordList(ticketRegistrationDto); return list; } /** * æ¥è¯¢åç¥¨å· */ @GetMapping("/getTicketNo") public AjaxResult getTicketNo(TicketRegistrationDto ticketRegistrationDto) { return AjaxResult.success(ticketRegistrationService.getTicketNo(ticketRegistrationDto)); } } src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java
@@ -30,5 +30,8 @@ private BigDecimal unPaymentAmount; // ç¨ç private BigDecimal taxRate; private String taxRate; // ç»è®°äºº private String registrant; } 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; } 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 src/main/java/com/ruoyi/purchase/mapper/ProductRecordMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package com.ruoyi.purchase.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.purchase.pojo.ProductRecord; /** * éè´å°è´¦äº§åå¼ç¥¨è®°å½Mapperæ¥å£ * * @author ruoyi * @date 2025-05-23 */ public interface ProductRecordMapper extends BaseMapper<ProductRecord> { } src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java
@@ -43,7 +43,7 @@ /** * å票id */ private Long invoicePurchaseId; private Long ticketRegistrationId; /** * æ¬æ¬¡ä»æ¬¾éé¢ @@ -54,6 +54,11 @@ * 仿¬¾å½¢å¼ */ private String paymentMethod; /** * ç¨ç */ private String taxRate; /** * ç»è®°äºº @@ -70,6 +75,12 @@ private Date paymentDate; /** * ç»è®°æ¥æ */ @JsonFormat(pattern = "yyyy-MM-dd") private Date registrationtDate; /** * åå»ºæ¥æ */ @TableField(fill = FieldFill.INSERT) src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,124 @@ package com.ruoyi.purchase.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.math.BigDecimal; import java.util.Date; /** * éè´å°è´¦äº§åå¼ç¥¨è®°å½å¯¹è±¡ product_record * * @author ruoyi * @date 2025-05-23 */ @Data @TableName("product_record") public class ProductRecord { private static final long serialVersionUID = 1L; /** * 主é®id */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * æ¥ç¥¨ç»è®°id */ private Long ticketRegistrationId; /** * éè´å°è´¦id */ private Long purchaseLedgerId; /** * 产å大类 */ private String productCategory; /** * è§æ ¼åå· */ private String specificationModel; /** * åä½ */ private String unit; /** * æ°é */ private BigDecimal quantity; /** * ç¨ç */ private BigDecimal taxRate; /** * å«ç¨åä»· */ private BigDecimal taxInclusiveUnitPrice; /** * å«ç¨æ»ä»· */ private BigDecimal taxInclusiveTotalPrice; /** * ä¸å«ç¨æ»ä»· */ private BigDecimal taxExclusiveTotalPrice; /** * å票类å */ private String invoiceType; /** * 1.éå®å°è´¦ï¼2.éè´å°è´¦ */ private String type; /** * æ¬æ¬¡æ¥ç¥¨æ° */ private Long ticketsNum; /** * æ¬æ¬¡æ¥ç¥¨éé¢(å ) */ private BigDecimal ticketsAmount; /** * æªæ¥ç¥¨æ° */ private Long futureTickets; /** * æªæ¥ç¥¨éé¢(å ) */ private BigDecimal futureTicketsAmount; /** * 产åid */ private Long productId; /** * åå·id */ private Long productModelId; /** * å建æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd") private Date createdAt; } src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java
@@ -78,6 +78,12 @@ private BigDecimal invoiceAmount; /** * å¼ç¥¨äººID */ @Excel(name = "å¼ç¥¨äºº") private String issUerId; /** * å¼ç¥¨äºº */ @Excel(name = "å¼ç¥¨äºº") src/main/java/com/ruoyi/purchase/service/IProductRecordService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.purchase.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.purchase.dto.TicketRegistrationDto; import com.ruoyi.purchase.pojo.ProductRecord; import java.util.List; /** * éè´å°è´¦äº§åå¼ç¥¨è®°å½Serviceæ¥å£ * * @author ruoyi * @date 2025-05-23 */ public interface IProductRecordService extends IService<ProductRecord> { List<ProductRecord> selectProductRecordList(TicketRegistrationDto ticketRegistrationDto); } src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
@@ -29,4 +29,6 @@ PurchaseLedgerDto getInfo(PurchaseLedgerDto purchaseLedgerDto); List getPurchasesNo(); PurchaseLedgerDto getPurchaseNoById(Long id); } src/main/java/com/ruoyi/purchase/service/ITicketRegistrationService.java
@@ -22,4 +22,6 @@ int delRegistration(Long[] ids); TicketRegistrationDto getRegistrationById(TicketRegistrationDto ticketRegistrationDto); List getTicketNo(TicketRegistrationDto ticketRegistrationDto); } src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.mapper.SupplierManageMapper; import com.ruoyi.basic.pojo.SupplierManage; @@ -10,18 +11,17 @@ import com.ruoyi.framework.security.LoginUser; import com.ruoyi.purchase.dto.PaymentLedgerDto; import com.ruoyi.purchase.dto.PaymentRegistrationDto; import com.ruoyi.purchase.mapper.InvoicePurchaseMapper; import com.ruoyi.purchase.mapper.PaymentRegistrationMapper; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.InvoicePurchase; import com.ruoyi.purchase.mapper.*; import com.ruoyi.purchase.pojo.PaymentRegistration; import com.ruoyi.purchase.pojo.ProductRecord; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.pojo.TicketRegistration; import com.ruoyi.purchase.service.IPaymentRegistrationService; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import org.springframework.beans.factory.annotation.Autowired; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -37,24 +37,23 @@ * @date 2025-05-15 */ @Service @AllArgsConstructor public class PaymentRegistrationServiceImpl extends ServiceImpl<PaymentRegistrationMapper, PaymentRegistration> implements IPaymentRegistrationService { @Autowired private PaymentRegistrationMapper paymentRegistrationMapper; @Autowired private PurchaseLedgerMapper purchaseLedgerMapper; @Autowired private InvoicePurchaseMapper invoicePurchaseMapper; @Autowired private SalesLedgerMapper salesLedgerMapper; @Autowired private SupplierManageMapper supplierManageMapper; @Autowired private SalesLedgerProductMapper salesLedgerProductMapper; private TicketRegistrationMapper ticketRegistrationMapper; private ProductRecordMapper productRecordMapper; /** * æ¥è¯¢ä»æ¬¾ç»è®° @@ -78,7 +77,7 @@ List<PaymentRegistrationDto> list = paymentRegistrationMapper.selectPaymentRegistrationList(paymentRegistrationDto); for (PaymentRegistrationDto registrationDto : list) { List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>() .eq("invoice_purchase_id", registrationDto.getInvoicePurchaseId())); .eq("ticket_registration_id", registrationDto.getTicketRegistrationId())); BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add); registrationDto.setUnPaymentAmount(registrationDto.getInvoiceAmount().subtract(total)); } @@ -103,25 +102,24 @@ paymentRegistration.setSaleLedgerId(salesLedger.getId()); paymentRegistration.setSupplierId(purchaseLedger.getSupplierId()); List<InvoicePurchase> invoicePurchases = invoicePurchaseMapper.selectList(new QueryWrapper<InvoicePurchase>(). eq("purchase_contract_no", purchaseLedger.getPurchaseContractNumber())); if (invoicePurchases == null || invoicePurchases.size() == 0) { TicketRegistration tr = ticketRegistrationMapper.selectOne(new LambdaQueryWrapper<TicketRegistration>().eq(TicketRegistration::getId, paymentRegistration.getTicketRegistrationId())); if (tr == null) { throw new RuntimeException("å ³èå票ä¸åå¨"); } paymentRegistration.setInvoicePurchaseId(invoicePurchases.get(0).getId()); List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>() .eq("invoice_purchase_id", invoicePurchases.get(0).getId())); .eq("ticket_registration_id", tr.getId())); BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add); if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(invoicePurchases.get(0).getInvoiceAmount()) > 0) { if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(tr.getInvoiceAmount()) > 0) { throw new RuntimeException("仿¬¾éé¢è¶ åºå票éé¢"); } LoginUser loginUser = SecurityUtils.getLoginUser(); Integer tenantId = loginUser.getTenantId(); paymentRegistration.setTenantId(tenantId.longValue()); paymentRegistration.setRegistrantId(loginUser.getUserId()); paymentRegistration.setCreateTime(DateUtils.getNowDate()); paymentRegistration.setUpdateTime(DateUtils.getNowDate()); return paymentRegistrationMapper.insert(paymentRegistration); @@ -135,13 +133,13 @@ */ @Override public int updatePaymentRegistration(PaymentRegistration paymentRegistration) { InvoicePurchase invoicePurchase = invoicePurchaseMapper.selectById(paymentRegistration.getInvoicePurchaseId()); TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(paymentRegistration.getTicketRegistrationId()); List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>() .eq("invoice_purchase_id", paymentRegistration.getInvoicePurchaseId()).ne("id", paymentRegistration.getId())); .eq("ticket_registration_id", paymentRegistration.getTicketRegistrationId()).ne("id", paymentRegistration.getId())); BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add); if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(invoicePurchase.getInvoiceAmount()) > 0) { if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(ticketRegistration.getInvoiceAmount()) > 0) { throw new RuntimeException("仿¬¾éé¢è¶ åºå票éé¢"); } @@ -168,12 +166,11 @@ paymentRegistrationDto.setSupplierName(purchaseLedger.getSupplierName()); paymentRegistrationDto.setSupplierId(purchaseLedger.getSupplierId()); List<InvoicePurchase> invoicePurchaseList = invoicePurchaseMapper.selectList(new QueryWrapper<InvoicePurchase>() .eq("purchase_contract_no", purchaseLedger.getPurchaseContractNumber())); if (invoicePurchaseList != null && invoicePurchaseList.size() > 0) { paymentRegistrationDto.setInvoiceNumber(invoicePurchaseList.get(0).getInvoiceNumber()); paymentRegistrationDto.setInvoiceAmount(invoicePurchaseList.get(0).getInvoiceAmount()); paymentRegistrationDto.setTaxRate(invoicePurchaseList.get(0).getTaxRate()); List<TicketRegistration> ticketRegistrations = ticketRegistrationMapper.selectList(new QueryWrapper<TicketRegistration>() .eq("purchase_contract_number", purchaseLedger.getPurchaseContractNumber())); if (ticketRegistrations != null && ticketRegistrations.size() > 0) { paymentRegistrationDto.setInvoiceNumber(ticketRegistrations.get(0).getInvoiceNumber()); paymentRegistrationDto.setInvoiceAmount(ticketRegistrations.get(0).getInvoiceAmount()); } return paymentRegistrationDto; } @@ -197,18 +194,36 @@ // åºä»éé¢ BigDecimal payableAmount = BigDecimal.ZERO; List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(new QueryWrapper<SalesLedger>().eq("customer_id", supplierManage.getId())); if (salesLedgers != null && salesLedgers.size() > 0) { List<PurchaseLedger> purchaseLedgers = purchaseLedgerMapper.selectList(new QueryWrapper<PurchaseLedger>().eq("supplier_id", supplierManage.getId())); if (purchaseLedgers != null && purchaseLedgers.size() > 0) { List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>() .in("sales_ledger_id", salesLedgers.stream().map(SalesLedger::getId).collect(Collectors.toList()))); .in("sales_ledger_id", purchaseLedgers.stream().map(PurchaseLedger::getId).collect(Collectors.toList()))); // åºä»éé¢ payableAmount = salesLedgerProducts.stream().map(SalesLedgerProduct::getTaxInclusiveTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add); } // å¼ç¥¨éé¢ BigDecimal invoiceAmount = salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal invoiceAmount = BigDecimal.ZERO; List<TicketRegistration> ticketRegistrations = Collections.emptyList(); // å¢å ç©ºå¼æ£æ¥ï¼é¿å NullPointerException if (CollectionUtils.isNotEmpty(purchaseLedgers)) { Long[] ids = purchaseLedgers.stream() .map(PurchaseLedger::getId) .toArray(Long[]::new); // æ£æ¥æ°ç»æ¯å¦æå ç´ if (ids.length > 0) { ticketRegistrations = ticketRegistrationMapper.selectList( new LambdaQueryWrapper<TicketRegistration>() .in(TicketRegistration::getPurchaseLedgerId, ids) ); } } if (ticketRegistrations != null && ticketRegistrations.size() > 0) { // æ¥ç¥¨éé¢ invoiceAmount = ticketRegistrations.stream().map(TicketRegistration::getInvoiceAmount).reduce(BigDecimal.ZERO, BigDecimal::add); } // 仿¬¾éé¢ List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>() .eq("supplier_id", supplierManage.getId())); @@ -226,21 +241,25 @@ List<Map<String, Object>> details = new ArrayList<>(); for (PaymentRegistration paymentRegistration : paymentRegistrations) { Map<String, Object> detail = new HashMap<>(); detail.put("voteCount", 1); // 票æ°ï¼æªç¥æ°æ®æºï¼ææ¶ç¨1 detail.put("paymentAmount", paymentRegistration.getCurrentPaymentAmount()); // 仿¬¾éé¢ InvoicePurchase invoicePurchase = invoicePurchaseMapper.selectById(paymentRegistration.getInvoicePurchaseId()); detail.put("payableAmount", invoicePurchase.getInvoiceAmount()); // åºä»éé¢ TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(paymentRegistration.getTicketRegistrationId()); detail.put("payableAmount", ticketRegistration.getInvoiceAmount()); // åºä»éé¢ BigDecimal voteCount = productRecordMapper.selectList( new LambdaQueryWrapper<ProductRecord>() .eq(ProductRecord::getTicketRegistrationId, ticketRegistration.getId())) .stream() .map(ProductRecord::getTicketsNum) .map(BigDecimal::new) .reduce(BigDecimal.ZERO, BigDecimal::add); detail.put("voteCount", voteCount); // ç¥¨æ° SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String formattedDate = sdf.format(paymentRegistration.getPaymentDate()); detail.put("createTime", formattedDate); // åçæ¶é´ detail.put("paymentDate", formattedDate); // åçæ¶é´ details.add(detail); } res.put("details", paymentRegistrations); res.put("details", details); result.add(res); } return result; } } src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.ruoyi.purchase.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.purchase.dto.TicketRegistrationDto; import com.ruoyi.purchase.mapper.ProductRecordMapper; import com.ruoyi.purchase.pojo.ProductRecord; import com.ruoyi.purchase.service.IProductRecordService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; /** * éè´å°è´¦äº§åå¼ç¥¨è®°å½Serviceä¸å¡å±å¤ç * * @author ruoyi * @date 2025-05-23 */ @Service @AllArgsConstructor public class ProductRecordServiceImpl extends ServiceImpl<ProductRecordMapper, ProductRecord> implements IProductRecordService { private ProductRecordMapper productRecordMapper; /** * æ¥è¯¢éè´å°è´¦äº§åå¼ç¥¨è®°å½ * * @param ticketRegistrationDto éè´å°è´¦äº§åå¼ç¥¨è®°å½ä¸»é® * @return éè´å°è´¦äº§åå¼ç¥¨è®°å½ */ @Override public List<ProductRecord> selectProductRecordList(TicketRegistrationDto ticketRegistrationDto) { return productRecordMapper.selectList(new LambdaQueryWrapper<ProductRecord>().eq(ProductRecord::getTicketRegistrationId, ticketRegistrationDto.getId()) .eq(ProductRecord::getType, "2")); } } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -17,8 +17,12 @@ import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.purchase.dto.PurchaseLedgerDto; import com.ruoyi.purchase.mapper.ProductRecordMapper; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.mapper.TicketRegistrationMapper; import com.ruoyi.purchase.pojo.ProductRecord; 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 +77,10 @@ private final ProductModelMapper productModelMapper; private final TicketRegistrationMapper ticketRegistrationMapper; private final ProductRecordMapper productRecordMapper; @Value("${file.upload-dir}") private String uploadDir; @@ -118,7 +126,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 +137,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("产åä¿¡æ¯ä¸åå¨"); } // æIDåç»ï¼åºåæ°å¢åæ´æ°çè®°å½ // æåæ¶éææéè¦æ¥è¯¢ç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); @@ -248,6 +289,23 @@ @Override public int deletePurchaseLedgerByIds(Long[] ids) { if (ids == null || ids.length == 0) { throw new BaseException("请éä¸è³å°ä¸æ¡æ°æ®"); } // æ¹éå é¤å ³èçéè´å°è´¦äº§å LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids) .eq(SalesLedgerProduct::getType, "2"); salesLedgerProductMapper.delete(queryWrapper); // æ¹éå é¤å ³èçéè´å°è´¦çæ¥ç¥¨ç»è®° LambdaQueryWrapper<TicketRegistration> ticketRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>(); ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getSalesLedgerId,ids); ticketRegistrationMapper.delete(ticketRegistrationLambdaQueryWrapper); // æ¹éå é¤å ³èçéè´å°è´¦çæ¥ç¥¨ç»è®°è®°å½ LambdaQueryWrapper<ProductRecord> productRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); productRecordLambdaQueryWrapper.in(ProductRecord::getPurchaseLedgerId,ids); productRecordMapper.delete(productRecordLambdaQueryWrapper); // æ¹éå é¤éè´å°è´¦ return purchaseLedgerMapper.deleteBatchIds(Arrays.asList(ids)); } @@ -315,8 +373,13 @@ 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()); product.setTicketsNum(null); product.setTicketsAmount(null); }); resultDto.setProductData(productList); return resultDto; } @@ -336,6 +399,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; } /** * ä¸å线å½å转驼峰å½å */ src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -4,13 +4,16 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import com.ruoyi.purchase.dto.TicketRegistrationDto; import com.ruoyi.purchase.mapper.ProductRecordMapper; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.mapper.TicketRegistrationMapper; import com.ruoyi.purchase.pojo.ProductRecord; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.pojo.TicketRegistration; import com.ruoyi.purchase.service.ITicketRegistrationService; @@ -23,6 +26,7 @@ import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.math.BigDecimal; @@ -35,6 +39,7 @@ import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; @@ -59,6 +64,8 @@ private final TempFileMapper tempFileMapper; private final ProductRecordMapper productRecordMapper; @Value("${file.upload-dir}") private String uploadDir; @@ -67,38 +74,59 @@ public List<TicketRegistration> selectTicketRegistrationList(TicketRegistration ticketRegistration) { LambdaQueryWrapper<TicketRegistration> queryWrapper = new LambdaQueryWrapper<>(); if (StringUtils.isNotBlank(ticketRegistration.getPurchaseContractNumber())) { queryWrapper.like(TicketRegistration::getPurchaseContractNumber, ticketRegistration.getPurchaseContractNumber()); queryWrapper.like(TicketRegistration::getPurchaseContractNumber, ticketRegistration.getPurchaseContractNumber()) .like(TicketRegistration::getSupplierName, ticketRegistration.getSupplierName()) .eq(TicketRegistration::getIssueDate, ticketRegistration.getIssueDate()); } return ticketRegistrationMapper.selectList(queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public int addOrUpdateRegistration(TicketRegistrationDto ticketRegistrationDto) throws IOException { // 1. æ¥è¯¢éè´å°è´¦è®°å½ PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(ticketRegistrationDto.getPurchaseLedgerId()); if (purchaseLedger == null) { // å¤çéè´å°è´¦ä¸åå¨çæ åµï¼ä¾å¦æåºå¼å¸¸æè¿åé误 throw new IllegalArgumentException("éè´å°è´¦è®°å½ä¸åå¨ï¼ID: " + ticketRegistrationDto.getPurchaseLedgerId()); } // 3. åå»ºææ´æ°ç¥¨æ®ç»è®°å®ä½ TicketRegistration ticketRegistration = new TicketRegistration(); BeanUtils.copyProperties(ticketRegistrationDto, ticketRegistration); ticketRegistration.setPurchaseContractNumber(purchaseLedger.getPurchaseContractNumber()); ticketRegistration.setTenantId(purchaseLedger.getTenantId()); ticketRegistration.setContractAmount(purchaseLedger.getContractAmount()); // å¤çåè¡¨æ°æ® ticketRegistration.setSalesLedgerId(purchaseLedger.getSalesLedgerId()); // 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 = ticketRegistrationMapper.insert(ticketRegistration); // 6. å¢å éè´å°è´¦äº§åå¼ç¥¨è®°å½ List<SalesLedgerProduct> salesLedgerProducts = ticketRegistrationDto.getProductData(); if (CollectionUtils.isNotEmpty(salesLedgerProducts)){ for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) { ProductRecord productRecord = new ProductRecord(); productRecord.setTicketRegistrationId(ticketRegistration.getId()); productRecord.setPurchaseLedgerId(ticketRegistrationDto.getPurchaseLedgerId()); productRecord.setCreatedAt(DateUtils.getNowDate()); BeanUtils.copyProperties(salesLedgerProduct,productRecord); productRecord.setId(null); productRecord.setType("2"); productRecordMapper.insert(productRecord); } } // è¿ç§»ä¸´æ¶æä»¶å°æ£å¼ç®å½ if (ticketRegistrationDto.getTempFileIds() != null && !ticketRegistrationDto.getTempFileIds().isEmpty()) { migrateTempFilesToFormal(ticketRegistration.getId(), ticketRegistrationDto.getTempFileIds()); } return i; return rowsAffected; } @@ -195,8 +223,21 @@ .eq(SalesLedgerProduct::getType, 2); List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(queryWrapper); resultDto.setProductData(productList); return resultDto; } @Override public List getTicketNo(TicketRegistrationDto ticketRegistrationDto) { LambdaQueryWrapper<TicketRegistration> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.select(TicketRegistration::getId,TicketRegistration::getInvoiceNumber,TicketRegistration::getInvoiceAmount) .eq(TicketRegistration::getPurchaseLedgerId,ticketRegistrationDto.getId()); List<Map<String, Object>> result = ticketRegistrationMapper.selectMaps(queryWrapper); // å°ä¸å线å½å转æ¢ä¸ºé©¼å³°å½å return result.stream().map(map -> map.entrySet().stream() .collect(Collectors.toMap( entry -> underlineToCamel(entry.getKey()), Map.Entry::getValue)) ).collect(Collectors.toList()); } private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) { @@ -216,11 +257,57 @@ // æ¹éæ´æ°ï¼éè¦ 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.getTaxInclusiveTotalPrice() == 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.getTaxInclusiveTotalPrice() .subtract(product.getTicketsAmount()) ); product.setType(type); salesLedgerProductMapper.updateById(product); }); } } /** * ä¸å线å½å转驼峰å½å */ private String underlineToCamel(String param) { if (param == null || "".equals(param.trim())) { return ""; } int len = param.length(); StringBuilder sb = new StringBuilder(len); for (int i = 0; i < len; i++) { char c = param.charAt(i); if (c == '_') { if (++i < len) { sb.append(Character.toUpperCase(param.charAt(i))); } } else { sb.append(Character.toLowerCase(c)); } } return sb.toString(); } } src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
@@ -9,7 +9,7 @@ <result property="saleLedgerId" column="sale_ledger_id"/> <result property="purchaseLedgerId" column="purchase_ledger_id"/> <result property="supplierId" column="supplier_id"/> <result property="invoicePurchaseId" column="invoice_purchase_id"/> <result property="ticketRegistrationId" column="ticket_registration_id"/> <result property="currentPaymentAmount" column="current_payment_amount"/> <result property="paymentMethod" column="payment_method"/> <result property="registrantId" column="registrant_id"/> @@ -17,6 +17,7 @@ <result property="createTime" column="create_time"/> <result property="updateTime" column="update_time"/> <result property="tenantId" column="tenant_id"/> <result property="registrationtDate" column="registrationt_date"/> </resultMap> <resultMap type="com.ruoyi.purchase.dto.PaymentRegistrationDto" id="PaymentRegistrationDtoResult"> @@ -24,7 +25,7 @@ <result property="saleLedgerId" column="sale_ledger_id"/> <result property="purchaseLedgerId" column="purchase_ledger_id"/> <result property="supplierId" column="supplier_id"/> <result property="invoicePurchaseId" column="invoice_purchase_id"/> <result property="ticketRegistrationId" column="ticket_registration_id"/> <result property="currentPaymentAmount" column="current_payment_amount"/> <result property="paymentMethod" column="payment_method"/> <result property="registrantId" column="registrant_id"/> @@ -38,6 +39,7 @@ <result property="taxRate" column="tax_rate"/> <result property="invoiceAmount" column="invoice_amount"/> <result property="tenantId" column="tenant_id"/> <result property="registrationtDate" column="registrationt_date"/> </resultMap> <sql id="selectPaymentRegistrationVo"> @@ -45,7 +47,7 @@ pr.sale_ledger_id, pr.purchase_ledger_id, pr.supplier_id, pr.invoice_purchase_id, pr.ticket_registration_id, pr.current_payment_amount, pr.payment_method, pr.registrant_id, @@ -57,13 +59,15 @@ pl.purchase_contract_number as purchase_contract_number, sm.supplier_name as supplier_name, ip.invoice_number as invoice_number, ip.tax_rate as tax_rate, ip.invoice_amount as invoice_amount ip.invoice_amount as invoice_amount, pr.tax_rate, pr.registrationt_date, su.nick_name as registrant from payment_registration pr left join sales_ledger sl on pr.sale_ledger_id = sl.id left join purchase_ledger pl on pr.purchase_ledger_id = pl.id left join supplier_manage sm on pr.supplier_id = sm.id left join invoice_purchase ip on pr.invoice_purchase_id = ip.id left join ticket_registration ip on pr.ticket_registration_id = ip.id left join sys_user su on pr.registrant_id = su.user_id </sql>