src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -20,6 +20,11 @@ private String entryDateStart; private String entryDateEnd; /** * æ¯å¦å¼ç¥¨ 1-æ¯ 2-å¦ */ private Integer isInvoice; private Long id; /** src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -27,6 +27,11 @@ private Long id; /** * æ¯å¦å¼ç¥¨ 1-æ¯ 2-å¦ */ private Integer isInvoice; /** * éè´ååå· */ @Excel(name = "éè´ååå·") src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -27,6 +27,7 @@ import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.purchase.dto.PurchaseLedgerDto; import com.ruoyi.purchase.dto.TicketRegistrationDto; import com.ruoyi.purchase.mapper.ProductRecordMapper; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.mapper.TicketRegistrationMapper; @@ -34,6 +35,7 @@ import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.pojo.TicketRegistration; import com.ruoyi.purchase.service.IPurchaseLedgerService; import com.ruoyi.purchase.service.ITicketRegistrationService; import com.ruoyi.sales.mapper.*; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; @@ -172,7 +174,7 @@ // 4. å¤çåè¡¨æ°æ® List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData(); if (productList != null && !productList.isEmpty()) { handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType()); handleSalesLedgerProducts(purchaseLedgerDto,purchaseLedger.getId(), productList, purchaseLedgerDto.getType()); } // 5. è¿ç§»ä¸´æ¶æä»¶å°æ£å¼ç®å½ @@ -183,7 +185,9 @@ return 1; } private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) { private final ITicketRegistrationService ticketRegistrationService; private void handleSalesLedgerProducts(PurchaseLedgerDto purchaseLedgerDto,Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) throws IOException { if (products == null || products.isEmpty()) { throw new BaseException("产åä¿¡æ¯ä¸åå¨"); } @@ -252,6 +256,26 @@ salesLedgerProduct.setRegisterDate(localDateTime); salesLedgerProductMapper.insert(salesLedgerProduct); } if (purchaseLedgerDto.getIsInvoice().equals(2)) { // æ éå¼ç¥¨ï¼æç¤ºç³»ç»çæå票 for (SalesLedgerProduct productDatum : insertList) { productDatum.setTicketsAmount(productDatum.getTaxInclusiveTotalPrice()); productDatum.setTicketsNum(productDatum.getQuantity()); } BigDecimal invoiceAmount = insertList.stream() .map(SalesLedgerProduct::getTicketsAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); TicketRegistrationDto ticketRegistrationDto = new TicketRegistrationDto(); BeanUtils.copyProperties(purchaseLedgerDto, ticketRegistrationDto); ticketRegistrationDto.setInvoiceAmount(invoiceAmount); ticketRegistrationDto.setProductData(insertList); ticketRegistrationDto.setPurchaseLedgerId(salesLedgerId); ticketRegistrationDto.setIssUer("ç³»ç»èªå¨çæ"); ticketRegistrationDto.setIssueDate(LocalDate.now()); ticketRegistrationDto.setInvoiceNumber("æ¤å°è´¦æ éæå¨å¼ç¥¨ï¼ç³»ç»å°ææäº§åèªå¨çææ¥ç¥¨å°è´¦"); ticketRegistrationService.addOrUpdateRegistration(ticketRegistrationDto); } } // è®¡ç®æ»å«ç¨éé¢ src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; @@ -15,23 +16,19 @@ import com.ruoyi.sales.mapper.InvoiceLedgerMapper; import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper; import com.ruoyi.sales.mapper.ReceiptPaymentMapper; import com.ruoyi.sales.pojo.InvoiceLedger; import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; import com.ruoyi.sales.pojo.ReceiptPayment; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.*; import com.ruoyi.sales.service.ICommonFileService; import com.ruoyi.sales.service.ISalesLedgerProductService; import com.ruoyi.sales.service.ISalesLedgerService; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.*; import java.util.stream.Collectors; /** @@ -46,6 +43,9 @@ public class SalesLedgerController extends BaseController { private ISalesLedgerService salesLedgerService; @Autowired private ISalesLedgerProductService salesLedgerProductService; private ICommonFileService commonFileService; @@ -198,6 +198,18 @@ */ @GetMapping("/listPage") public IPage<SalesLedger> listPage(Page page, SalesLedgerDto salesLedgerDto) { Set<Long> ids = new HashSet<>(); if(!StringUtils.isEmpty(salesLedgerDto.getProductCategory())){ List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductService.getBaseMapper().selectList(new LambdaQueryWrapper<SalesLedgerProduct>() .eq(SalesLedgerProduct::getType, 1) .like(SalesLedgerProduct::getProductCategory, salesLedgerDto.getProductCategory()) .select(SalesLedgerProduct::getSalesLedgerId)); ids = salesLedgerProducts.stream().map(SalesLedgerProduct::getSalesLedgerId).collect(Collectors.toSet()); if(CollectionUtils.isEmpty(ids)){ throw new BaseException("ææ æ¥å°æ¤äº§åå¤§ç±»ææ¤äº§å大类æ é宿°æ®ï¼è¯·ä»ç»æ£æ¥ï¼"); } } salesLedgerDto.setIds(ids); IPage<SalesLedger> iPage = salesLedgerService.selectSalesLedgerListPage(page,salesLedgerDto); // 计ç®å·²å¼ç¥¨éé¢/æªå¼ç¥¨éé¢(已填åå票éé¢ä¸ºå) if(CollectionUtils.isEmpty(iPage.getRecords())){ src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -9,7 +9,9 @@ import java.time.LocalDate; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; @Data public class SalesLedgerDto { @@ -17,6 +19,12 @@ private String salesContractNo; private String customerContractNo; private String projectName; private String productCategory; private Set<Long> ids; // /** * æ¯å¦å¼ç¥¨ 1-å¦ 2-æ¯ */ private Integer isInvoice; @JsonFormat(pattern = "yyyy-MM-dd") private Date entryDate; @@ -46,7 +54,7 @@ private List<String> tempFileIds; private List<CommonFile> SalesLedgerFiles; private Integer Type; private Integer type; @ApiModelProperty(value = "ç¾è®¢æ¥æ") private LocalDate executionDate; src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -35,6 +35,11 @@ private String salesContractNo; /** * æ¯å¦å¼ç¥¨ 1-æ¯ 2-å¦ */ private Integer isInvoice; /** * 客æ·ååå· */ @Excel(name = "客æ·ååå·") src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1,5 +1,6 @@ package com.ruoyi.sales.service.impl; import com.alibaba.druid.util.DaemonThreadFactory; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -28,6 +29,7 @@ import com.ruoyi.sales.mapper.*; import com.ruoyi.sales.pojo.*; import com.ruoyi.sales.service.ISalesLedgerService; import com.ruoyi.sales.service.InvoiceRegistrationService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; @@ -365,6 +367,9 @@ return salesLedgerMapper.deleteBatchIds(idList); } @Autowired private InvoiceRegistrationService invoiceRegistrationService; @Override @Transactional(rollbackFor = Exception.class) public int addOrUpdateSalesLedger(SalesLedgerDto salesLedgerDto) { @@ -417,7 +422,7 @@ // 4. å¤çåè¡¨æ°æ® List<SalesLedgerProduct> productList = salesLedgerDto.getProductData(); if (productList != null && !productList.isEmpty()) { handleSalesLedgerProducts(salesLedger.getId(), productList, salesLedgerDto.getType()); handleSalesLedgerProducts(salesLedgerDto,salesLedger.getId(), productList, salesLedgerDto.getType()); updateMainContractAmount( salesLedger.getId(), productList, @@ -515,7 +520,7 @@ } private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) { private void handleSalesLedgerProducts(SalesLedgerDto salesLedgerDto,Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) { // æIDåç»ï¼åºåæ°å¢åæ´æ°çè®°å½ Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream() .peek(p -> p.setSalesLedgerId(salesLedgerId)) @@ -539,6 +544,18 @@ salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProductMapper.insert(salesLedgerProduct); } if (salesLedgerDto.getIsInvoice().equals(2)) { // æ éå¼ç¥¨ï¼æç¤ºç³»ç»çæå票 for (SalesLedgerProduct productDatum : insertList) { productDatum.setCurrentInvoiceAmount(productDatum.getTaxInclusiveTotalPrice()); productDatum.setCurrentInvoiceNum(productDatum.getQuantity()); } salesLedgerDto.setId(salesLedgerId); salesLedgerDto.setIssueDate(LocalDate.now()); salesLedgerDto.setInvoiceNo("æ¤å°è´¦æ éæå¨å¼ç¥¨ï¼ç³»ç»å°ææäº§åèªå¨çæå¼ç¥¨å°è´¦"); salesLedgerDto.setCreateUser(SecurityUtils.getLoginUser().getNickName()); invoiceRegistrationService.invoiceRegistrationSave(salesLedgerDto); } } } src/main/resources/application-hsxnyCopy.yml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,219 @@ # 项ç®ç¸å ³é ç½® ruoyi: # åç§° name: RuoYi # çæ¬ version: 3.8.9 # çæå¹´ä»½ copyrightYear: 2025 # æä»¶è·¯å¾ 示ä¾ï¼ Windowsé ç½®D:/ruoyi/uploadPathï¼Linuxé ç½® /home/ruoyi/uploadPathï¼ profile: /javaWork/product-inventory-management/file # è·åipå°åå¼å ³ addressEnabled: false # éªè¯ç ç±»å math æ°åè®¡ç® char å符éªè¯ captchaType: math # å¼åç¯å¢é ç½® server: # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 port: 8080 servlet: # åºç¨ç访é®è·¯å¾ context-path: / tomcat: # tomcatçURIç¼ç uri-encoding: UTF-8 # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 accept-count: 1000 threads: # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 max: 800 # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 min-spare: 100 # æ¥å¿é ç½® logging: level: com.ruoyi: warn org.springframework: warn minio: endpoint: http://114.132.189.42/ port: 7019 secure: false accessKey: admin secretKey: 12345678 preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ default-bucket: uploadPath # ç¨æ·é ç½® user: password: # å¯ç æå¤§éè¯¯æ¬¡æ° maxRetryCount: 5 # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ lockTime: 10 # Springé ç½® spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # ä¸»åºæ°æ®æº master: url: jdbc:mysql://localhost:3306/product-inventory-management-hsxny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 # ä»åºæ°æ®æº slave: # 仿°æ®æºå¼å ³/é»è®¤å ³é enabled: false url: username: password: # åå§è¿æ¥æ° initialSize: 5 # æå°è¿æ¥æ± æ°é minIdle: 10 # æå¤§è¿æ¥æ± æ°é maxActive: 20 # é ç½®è·åè¿æ¥çå¾ è¶ æ¶çæ¶é´ maxWait: 60000 # é ç½®è¿æ¥è¶ æ¶æ¶é´ connectTimeout: 30000 # é ç½®ç½ç»è¶ æ¶æ¶é´ socketTimeout: 60000 # é ç½®é´éå¤ä¹ æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å ³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ timeBetweenEvictionRunsMillis: 60000 # é ç½®ä¸ä¸ªè¿æ¥å¨æ± 䏿å°çåçæ¶é´ï¼å使¯æ¯«ç§ minEvictableIdleTimeMillis: 300000 # é ç½®ä¸ä¸ªè¿æ¥å¨æ± 䏿大çåçæ¶é´ï¼å使¯æ¯«ç§ maxEvictableIdleTimeMillis: 900000 # é ç½®æ£æµè¿æ¥æ¯å¦ææ validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置ç½ååï¼ä¸å¡«åå 许ææè®¿é® allow: url-pattern: /druid/* # æ§å¶å°ç®¡çç¨æ·ååå¯ç login-username: ruoyi login-password: 123456 filter: stat: enabled: true # æ ¢SQLè®°å½ log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true # èµæºä¿¡æ¯ messages: # å½é åèµæºæä»¶è·¯å¾ basename: i18n/messages # æä»¶ä¸ä¼ servlet: multipart: # å个æä»¶å¤§å° max-file-size: 1GB # 设置æ»ä¸ä¼ çæä»¶å¤§å° max-request-size: 2GB # æå¡æ¨¡å devtools: restart: # çé¨ç½²å¼å ³ enabled: false # redis é ç½® redis: # å°å # host: 127.0.0.1 host: 192.168.1.185 # 端å£ï¼é»è®¤ä¸º6379 port: 6379 # æ°æ®åºç´¢å¼ database: 12 # å¯ç # password: root2022! password: # è¿æ¥è¶ æ¶æ¶é´ timeout: 10s lettuce: pool: # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ min-idle: 0 # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ max-idle: 8 # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° max-active: 8 # #è¿æ¥æ± æå¤§é»å¡çå¾ æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ max-wait: -1ms # tokené ç½® token: # 令çèªå®ä¹æ è¯ header: Authorization # 令çå¯é¥ secret: abcdefghijklmnopqrstuvwxyz # ä»¤çæææï¼é»è®¤30åéï¼ expireTime: 450 # MyBatis Plusé ç½® mybatis-plus: # æç´¢æå®å å«å æ ¹æ®èªå·±çé¡¹ç®æ¥ typeAliasesPackage: com.ruoyi.**.pojo # é ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ mapperLocations: classpath*:mapper/**/*Mapper.xml # å è½½å ¨å±çé ç½®æä»¶ configLocation: classpath:mybatis/mybatis-config.xml global-config: enable-sql-runner: true db-config: id-type: auto # PageHelperå页æä»¶ pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swaggeré ç½® swagger: # æ¯å¦å¼å¯swagger enabled: true # 请æ±åç¼ pathMapping: /dev-api # 鲿¢XSSæ»å» xss: # è¿æ»¤å¼å ³ enabled: true # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ excludes: /system/notice # å¹é 龿¥ urlPatterns: /system/*,/monitor/*,/tool/* # 代ç çæ gen: # ä½è author: ruoyi # é»è®¤çæå è·¯å¾ system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool packageName: com.ruoyi.project.system # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true autoRemovePre: false # 表åç¼ï¼çæç±»åä¸ä¼å å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ tablePrefix: sys_ # æ¯å¦å è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å 许 allowOverwrite: false file: temp-dir: /javaWork/product-inventory-management/file/temp/uploads upload-dir: /javaWork/product-inventory-management/file/prod/uploads src/main/resources/application.yml
@@ -1,4 +1,4 @@ # Springé ç½® spring: profiles: active: demo active: hsxnyCopy src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -26,6 +26,9 @@ left join product_record pr on pl.id = pr.purchase_ledger_id <where> 1 = 1 <if test="c.isInvoice != null and c.isInvoice != '' "> AND pl.is_invoice = #{c.isInvoice} </if> <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''"> and pl.purchase_contract_number like concat('%',#{c.purchaseContractNumber},'%') </if> src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -63,6 +63,9 @@ sales_ledger T1 LEFT JOIN sys_user T2 ON T1.entry_person = T2.user_id <where> <if test="salesLedgerDto.isInvoice != null and salesLedgerDto.isInvoice != '' "> AND T1.is_invoice = #{salesLedgerDto.isInvoice} </if> <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' "> AND T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%') </if> @@ -81,6 +84,12 @@ <if test="salesLedgerDto.entryDateEnd != null and salesLedgerDto.entryDateEnd != '' "> AND T1.entry_date <= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d') </if> <if test="salesLedgerDto.ids != null and salesLedgerDto.ids.size() > 0"> AND T1.id IN <foreach item="item" collection="salesLedgerDto.ids" separator="," open="(" close=")"> #{item} </foreach> </if> </where> </select> </mapper>