yys
1.销售、采购关于发票的改成不必填
2.回款类型字典改-下
3.销售台账、采购台账可能不开票直接回款
4.销售台账要直接查产品名字
5.指标维护-内控值为非必填
6.所有税率都自己填,有时候可能不含税
已添加1个文件
已修改10个文件
335 ■■■■■ 文件已修改
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hsxnyCopy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 &lt;= 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>