tuqin
10 天以前 a2599e2fffaf6bb1d781325736f06955fa19511b
fix(芯导): 补回各系统丢失的既有文件修改(分支切换导致)

- 设备管理:DeviceMaintenance/Dto/ExeclDto 加保养周期/保养内容;检定记录加 nextDate;对应 Mapper 补列
- 生产管控:ProductionOrder 加产品名称/项目名称;派工实体/DTO 加生产要求/完成期限;派工保存与列表 SQL 同步
- 仓储物流:CustomStorage/ProcurementRecordStorage 加登记人;出库加领用数量(insert 后补写);库存预警生成采购建议/滞销提示;IgnoreTableConfig 增加 3 张表
- 采购管理:TicketRegistration 加发票金额区间查询(实体+条件);导出加登记人
- 营销管理:开票台账支持发票日期/金额区间查询(DTO+SQL);导出表头修正、NPE 修复
已修改28个文件
198 ■■■■■ 文件已修改
src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/pojo/MeasuringInstrumentLedgerRecord.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/CustomStorageWarningRecordController.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorageWarningRecord.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationProductDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/excel/InvoiceLedgerExcelDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceMaintenanceMapper.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerRecordMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java
@@ -36,5 +36,8 @@
        IGNORE_TABLES.add("gen_table");
        IGNORE_TABLES.add("gen_table_column");
        IGNORE_TABLES.add("custom_storage_warning_record");
        IGNORE_TABLES.add("stock_taking");
        IGNORE_TABLES.add("stock_time_setting");
        IGNORE_TABLES.add("env_device_command");
    }
}
src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -30,6 +30,11 @@
    @ApiModelProperty("计划保养日期")
    private LocalDateTime maintenancePlanTime;
    @ApiModelProperty("保养周期")
    private String maintenanceCycle;
    @ApiModelProperty("保养内容")
    private String maintenanceContent;
    @ApiModelProperty("实际保养人")
    private String maintenanceActuallyName;
src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java
@@ -24,6 +24,13 @@
    @Excel(name = "计划保养日期", dateFormat = "yyyy-MM-dd HH:mm:ss", width = 30)
    @ApiModelProperty("计划保养日期")
    private Date maintenancePlanTime;
    @Excel(name = "保养周期")
    @ApiModelProperty("保养周期")
    private String maintenanceCycle;
    @Excel(name = "保养内容")
    @ApiModelProperty("保养内容")
    private String maintenanceContent;
    @ApiModelProperty("实际保养人")
    @Excel(name = "实际保养人")
src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -31,6 +31,11 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime maintenancePlanTime;
    @ApiModelProperty("保养周期")
    private String maintenanceCycle;
    @ApiModelProperty("保养内容")
    private String maintenanceContent;
    @ApiModelProperty("实际保养人")
    private String maintenanceActuallyName;
src/main/java/com/ruoyi/measuringinstrumentledger/pojo/MeasuringInstrumentLedgerRecord.java
@@ -81,6 +81,11 @@
     */
    @ApiModelProperty("有效期(单位天)")
    private Integer valid;
    @ApiModelProperty("下次检定日期")
    @TableField(exist = false)
    @Excel(name = "下次检定日期", width = 30, dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date nextDate;
    /**
src/main/java/com/ruoyi/procurementrecord/controller/CustomStorageWarningRecordController.java
@@ -9,6 +9,15 @@
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.Map;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.ruoyi.procurementrecord.pojo.CustomStorageWarningRecord;
import com.ruoyi.procurementrecord.pojo.CustomStorage;
import com.ruoyi.procurementrecord.mapper.CustomStorageWarningRecordMapper;
import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -20,10 +29,65 @@
    @Autowired
    private CustomStorageWarningRecordService customStorageWarningRecordService;
    @Autowired
    private CustomStorageWarningRecordMapper warningRecordMapper;
    @Autowired
    private CustomStorageMapper customStorageMapper;
    @GetMapping("/pageList")
    @Log(title = "仓储物流-库存预警-分页查询", businessType = BusinessType.OTHER)
    public AjaxResult pageList(Page page, ProcurementPageDto dto){
        return AjaxResult.success(customStorageWarningRecordService.listPage(page,dto));
    }
}
    /**
     * 生成采购建议 / 滞销处理提示(并记录到预警事件)
     */
    @PostMapping("/generateSuggestion")
    @Log(title = "仓储物流-库存预警-生成建议", businessType = BusinessType.UPDATE)
    public AjaxResult generateSuggestion(@RequestBody Map<String, Object> body) {
        Object idObj = body.get("id");
        if (idObj == null) return AjaxResult.error("参数不能为空");
        String type = body.get("type") == null ? "采购建议" : body.get("type").toString();
        Long targetId = Long.valueOf(idObj.toString());
        CustomStorageWarningRecord record = warningRecordMapper.selectById(targetId);
        if (record == null) {
            com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<CustomStorageWarningRecord> w =
                    new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<>();
            w.eq(CustomStorageWarningRecord::getCustomStorageId, targetId.intValue()).last("limit 1");
            record = warningRecordMapper.selectOne(w);
        }
        if (record == null) {
            record = new CustomStorageWarningRecord();
            record.setCustomStorageId(targetId.intValue());
            record.setWarningStatus("已预警");
            record.setWarningTime(LocalDateTime.now());
            try {
                record.setTenantId(com.ruoyi.common.utils.SecurityUtils.getLoginUser().getTenantId());
            } catch (Exception ignored) {
            }
            warningRecordMapper.insert(record);
        }
        CustomStorage storage = record.getCustomStorageId() == null ? null : customStorageMapper.selectById(record.getCustomStorageId());
        String product = storage == null ? "未知商品"
                : (storage.getProductCategory() == null ? "" : storage.getProductCategory())
                  + (storage.getSpecificationModel() == null ? "" : " " + storage.getSpecificationModel());
        BigDecimal current = (storage == null || storage.getInboundNum() == null) ? BigDecimal.ZERO : storage.getInboundNum();
        BigDecimal warn = storage == null ? null : storage.getWarnNum();
        String content;
        if (type.contains("采购")) {
            BigDecimal suggest = (warn == null ? BigDecimal.ZERO : warn).subtract(current);
            if (suggest.compareTo(BigDecimal.ZERO) <= 0) suggest = BigDecimal.valueOf(10);
            content = String.format("【采购建议】%s 当前库存 %s,最低库存阈值 %s,建议采购 %s(建议结合近30天消耗量补货)",
                    product, current.toPlainString(), warn == null ? "-" : warn.toPlainString(), suggest.toPlainString());
        } else {
            content = String.format("【滞销处理提示】%s 当前库存 %s,周转缓慢/库存偏高,建议:①促销或内部领用 ②转作其他用途 ③与供应商协商退换货",
                    product, current.toPlainString());
        }
        record.setSuggestionType(type);
        record.setSuggestionContent(content);
        record.setSuggestionTime(LocalDateTime.now());
        warningRecordMapper.updateById(record);
        return AjaxResult.success(content);
    }}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
@@ -28,5 +28,7 @@
     * 供应商名称(退货出库-退回供应商时使用)
     */
    private String supplierName;
    /** 领用数量 */
    private String requisitionNum;
}
src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
@@ -125,6 +125,8 @@
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty(value = "登记人")
    private String registrant;
    /**
     * 预警数量
src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorageWarningRecord.java
@@ -48,5 +48,13 @@
    private LocalDateTime expectedshortagetime;
    private Long tenantId;
    /** 建议类型 */
    private String suggestionType;
    /** 建议内容 */
    private String suggestionContent;
    /** 生成时间 */
    private LocalDateTime suggestionTime;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -91,5 +91,7 @@
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /** 领用数量 */
    private java.math.BigDecimal requisitionNum;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -95,4 +95,5 @@
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    private String registrant;
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -80,7 +80,15 @@
                .createBy(sysUser.getNickName())
                .updateUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
                .updateTime(LocalDateTime.now());
        this.save(procurementRecordOut.build());
        ProcurementRecordOut saved = procurementRecordOut.build();
        this.save(saved);
        if (StringUtils.isNotEmpty(procurementRecordOutAdd.getRequisitionNum()) && saved.getId() != null) {
            ProcurementRecordOut upd = ProcurementRecordOut.builder()
                    .id(saved.getId())
                    .requisitionNum(new BigDecimal(procurementRecordOutAdd.getRequisitionNum()))
                    .build();
            procurementRecordOutMapper.updateById(upd);
        }
        return 0;
    }
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -473,6 +473,9 @@
            Long aLong = customStorageMapper.selectCount(null);
            item.setInboundBatches(aLong.equals(0L) ? "第1批次(自定义入库)" : "第"+ (aLong + 1) + "批次(自定义入库)" );
            item.setCreateBy(loginUser.getNickName());
            if (item.getRegistrant() == null || item.getRegistrant().trim().isEmpty()) {
                item.setRegistrant(loginUser.getNickName());
            }
            item.setCode(OrderUtils.countTodayByCreateTime(customStorageMapper, ""));
            customStorageMapper.insert(item);
        });
src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java
@@ -37,5 +37,10 @@
     */
    @ApiModelProperty(value = "排产日期")
    private String schedulingDate;
    /** 生产要求 */
    private String productionRequirement;
    /** 完成期限 */
    private String completionDeadline;
}
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java
@@ -105,5 +105,16 @@
    private BigDecimal successNum;
    private Long tenantId;
    /** 生产要求 */
    @Excel(name = "生产要求")
    @ApiModelProperty(value = "生产要求")
    private String productionRequirement;
    /** 完成期限 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "完成期限", width = 30, dateFormat = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "完成期限")
    private Date completionDeadline;
}
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
@@ -43,6 +43,13 @@
    @Excel(name = "产品大类")
    @ApiModelProperty(value = "产品大类")
    private String productCategory;
    @Excel(name = "产品名称")
    @ApiModelProperty(value = "产品名称")
    private String productName;
    @Excel(name = "项目名称")
    @ApiModelProperty(value = "项目名称")
    private String projectName;
    /**
     * 规格型号
src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java
@@ -56,6 +56,11 @@
     * 派工日期
     */
    private LocalDate schedulingDate;
    /** 生产要求 */
    private String productionRequirement;
    /** 完成期限 */
    private LocalDate completionDeadline;
    /**
     * 排产状态(1-待排产 2-排产中 3-已排产)
src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
@@ -106,6 +106,12 @@
                .schedulingUserName(sysUser.getNickName())
                .schedulingNum(productionDispatchAddDto.getSchedulingNum())
                .schedulingDate(LocalDate.parse(productionDispatchAddDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE))
                .productionRequirement(productionDispatchAddDto.getProductionRequirement())
                .completionDeadline(
                        productionDispatchAddDto.getCompletionDeadline() != null
                                && !productionDispatchAddDto.getCompletionDeadline().isEmpty()
                                ? LocalDate.parse(productionDispatchAddDto.getCompletionDeadline(), DateTimeFormatter.ISO_LOCAL_DATE)
                                : null)
                .status(1)
                .build();
        return salesLedgerSchedulingMapper.insert(salesLedgerScheduling);
src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java
@@ -36,6 +36,7 @@
    private String taxRate;
    // 登记人
    @Excel(name = "登记人")
    private String registrant;
    private String searchText;
src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java
@@ -197,6 +197,13 @@
    private String issueDateStart;
    @TableField(exist = false)
    private String issueDateEnd;
    @ApiModelProperty(value = "发票金额-起始(查询用)")
    @TableField(exist = false)
    private BigDecimal invoiceAmountStart;
    @ApiModelProperty(value = "发票金额-结束(查询用)")
    @TableField(exist = false)
    private BigDecimal invoiceAmountEnd;
    @TableField(exist = false)
    private String supplierNameOrContractNo;
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -382,6 +382,12 @@
        }
        queryWrapper.eq(TicketRegistration::getTenantId, SecurityUtils.getLoginUser().getTenantId())
                .eq(TicketRegistration::getDeleteFlag,0);
        if (ticketRegistration.getInvoiceAmountStart() != null) {
            queryWrapper.ge(TicketRegistration::getInvoiceAmount, ticketRegistration.getInvoiceAmountStart());
        }
        if (ticketRegistration.getInvoiceAmountEnd() != null) {
            queryWrapper.le(TicketRegistration::getInvoiceAmount, ticketRegistration.getInvoiceAmountEnd());
        }
        IPage<TicketRegistration> ticketRegistrationIPage = ticketRegistrationMapper.selectPage(page, queryWrapper);
        // 计算已付款金额
        if (CollectionUtils.isNotEmpty(ticketRegistrationIPage.getRecords())) {
src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationProductDto.java
@@ -68,6 +68,11 @@
    private String createTimeStart;
    @TableField(exist = false)
    private String createTimeEnd;
    @ApiModelProperty(value = "发票金额-开始")
    private BigDecimal invoiceAmountStart;
    @ApiModelProperty(value = "发票金额-结束")
    private BigDecimal invoiceAmountEnd;
}
src/main/java/com/ruoyi/sales/excel/InvoiceLedgerExcelDto.java
@@ -21,7 +21,7 @@
    @Excel(name = "销售合同号")
    private String salesContractNo;
    @Excel(name = "")
    @Excel(name = "客户合同号")
    private String customerContractNo;
    @Excel(name = "客户名称")
src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java
@@ -198,7 +198,7 @@
            return invoiceLedgerExcelDto;
        }).collect(Collectors.toList());
        ExcelUtil<InvoiceLedgerExcelDto> util = new ExcelUtil<InvoiceLedgerExcelDto>(InvoiceLedgerExcelDto.class);
        util.exportExcel(response, invoiceLedgerExcelDtoList, "供应商导出");
        util.exportExcel(response, invoiceLedgerExcelDtoList, "开票台账");
    }
    /**
@@ -305,7 +305,7 @@
    @Override
    public IPage<InvoiceRegistrationProductDto> registrationProductPage(Page page, InvoiceRegistrationProductDto registrationProductDto) {
        IPage<InvoiceRegistrationProductDto> invoiceRegistrationProductDtoIPage = invoiceRegistrationProductMapper.invoiceRegistrationProductPage(page, registrationProductDto);
        if (registrationProductDto.getStatus()) {
        if (Boolean.TRUE.equals(registrationProductDto.getStatus())) {
            invoiceRegistrationProductDtoIPage.getRecords().removeIf(invoiceRegistrationProduct -> !StringUtils.isEmpty(invoiceRegistrationProduct.getInvoiceNo()));
        }
        invoiceRegistrationProductDtoIPage.getRecords().forEach(invoiceRegistrationProductDto -> {
src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -9,6 +9,8 @@
        select dm.id,
        dm.device_ledger_id,
        dm.maintenance_plan_time,
        dm.maintenance_cycle,
        dm.maintenance_content,
        dm.maintenance_actually_time,
        dm.maintenance_result,
        dm.status,
@@ -47,6 +49,8 @@
        select dm.id,
               dm.device_ledger_id,
               dm.maintenance_plan_time,
               dm.maintenance_cycle,
               dm.maintenance_content,
               dm.maintenance_actually_time,
               dm.maintenance_result,
               dm.status,
src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerRecordMapper.xml
@@ -13,6 +13,7 @@
        t2.model,
        t1.valid,
        t1.record_date,
        DATE_ADD(t1.record_date, INTERVAL t1.valid DAY) AS next_date,
        t1.entry_date
        FROM
        measuring_instrument_ledger_record t1
@@ -44,6 +45,7 @@
        t2.model,
        t1.valid,
        t1.record_date,
        DATE_ADD(t1.record_date, INTERVAL t1.valid DAY) AS next_date,
        t1.entry_date
        FROM
        measuring_instrument_ledger_record t1
src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml
@@ -71,6 +71,8 @@
        T2.scheduling_user_id,
        T2.scheduling_user_name,
        T2.scheduling_date,
        T2.production_requirement,
        T2.completion_deadline,
        ifNull(T2.scheduling_num,0) AS schedulingNum,
        ifNull(T2.finished_num,0) AS successNum,
        t3.product_category,
src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml
@@ -115,6 +115,18 @@
            <if test="invoiceRegistrationProductDto.invoiceDateEnd != null and invoiceRegistrationProductDto.invoiceDateEnd != ''">
                AND T3.invoice_date &lt;= date_format(#{invoiceRegistrationProductDto.invoiceDateEnd}, '%Y-%m-%d')
            </if>
            <if test="invoiceRegistrationProductDto.invoiceDateStart != null and invoiceRegistrationProductDto.invoiceDateStart != ''">
                AND T3.invoice_date &gt;= date_format(#{invoiceRegistrationProductDto.invoiceDateStart}, '%Y-%m-%d')
            </if>
            <if test="invoiceRegistrationProductDto.invoiceDateEnd != null and invoiceRegistrationProductDto.invoiceDateEnd != ''">
                AND T3.invoice_date &lt;= date_format(#{invoiceRegistrationProductDto.invoiceDateEnd}, '%Y-%m-%d')
            </if>
            <if test="invoiceRegistrationProductDto.invoiceAmountStart != null">
                AND T3.invoice_total &gt;= #{invoiceRegistrationProductDto.invoiceAmountStart}
            </if>
            <if test="invoiceRegistrationProductDto.invoiceAmountEnd != null">
                AND T3.invoice_total &lt;= #{invoiceRegistrationProductDto.invoiceAmountEnd}
            </if>
            <if test="invoiceRegistrationProductDto.createTimeStart != null ">
                AND T1.create_time &gt;= date_format(#{invoiceRegistrationProductDto.createTimeStart}, '%Y-%m-%d %H:%i:%s')
            </if>