Kaynağa Gözat

报告、项目、合同详情中的发票添加批量导出功能

徐滕 3 hafta önce
ebeveyn
işleme
739339d680

+ 1 - 1
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/CwFinanceInvoiceMapper.java

@@ -52,7 +52,7 @@ public interface CwFinanceInvoiceMapper extends BaseMapper<CwFinanceInvoice> {
 
     public List<String> getIdByReportId(@Param("id") String id);
 
-    public List<String> getIdByContractId(@Param("id") String id);
+    public List<String> getIdByContractId(@Param("contractId") String contractId, @Param("projectIds") List<String> projectIds, @Param("reportIds") List<String> reportIds);
 
     public List<String> getIdByClientId(@Param("id") String id);
 

+ 24 - 25
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/CwFinanceInvoiceMapper.xml

@@ -471,31 +471,30 @@
     </select>
 
     <select id="getIdByContractId" resultType="string">
-        select
-        a.invoice_id
-        from
-        (select distinct
-            cw_fib.invoice_id
-        from cw_finance_invoice_base cw_fib
-        where cw_fib.del_flag = '0'
-        and cw_fib.program_id in (select cw_pr.id from cw_project_records cw_pr where cw_pr.contract_id = #{id} and cw_pr.del_flag = '0')
-        union
-        select distinct
-            fi.invoice_id
-        from cw_finance_invoice_base fi
-        where (fi.program_id is null or fi.program_id = '')
-        and fi.contract_id = #{id}
-        AND fi.del_flag = '0'
-        union
-        select distinct
-            cw_fib.invoice_id
-        from cw_finance_invoice_base cw_fib
-        where cw_fib.del_flag = '0'
-        and cw_fib.program_id in (
-            select cpr.id from cw_project_report cpr
-            where cpr.project_id in (select cw_pr.id from cw_project_records cw_pr where cw_pr.contract_id = #{id} and cw_pr.del_flag = '0')
-            and cpr.del_flag = '0'
-        )) a
+        select distinct invoice_id
+        from cw_finance_invoice_base
+        where del_flag = '0'
+          and (
+            <if test="projectIds != null and projectIds.size() > 0">
+                program_id in
+                <foreach collection="projectIds" item="pid" open="(" separator="," close=")">
+                    #{pid}
+                </foreach>
+            </if>
+            <if test="projectIds != null and projectIds.size() > 0 and reportIds != null and reportIds.size() > 0">
+                or
+            </if>
+            <if test="reportIds != null and reportIds.size() > 0">
+                program_id in
+                <foreach collection="reportIds" item="rid" open="(" separator="," close=")">
+                    #{rid}
+                </foreach>
+            </if>
+            <if test="(projectIds == null or projectIds.size() == 0) and (reportIds == null or reportIds.size() == 0)">
+                1 = 0
+            </if>
+            or (contract_id = #{contractId} and (program_id is null or program_id = ''))
+          )
     </select>
 
     <select id="getIdByClientId" resultType="string">

+ 22 - 1
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/CwFinanceInvoiceService.java

@@ -25,8 +25,10 @@ import com.jeeplus.finance.invoice.thread.ApprovalThread;
 import com.jeeplus.finance.invoice.thread.RedApprovalThread;
 import com.jeeplus.finance.invoice.util.DingTalkUtil;
 import com.jeeplus.finance.invoice.util.OMS.FileHandlingUtil;
+import com.jeeplus.finance.projectRecords.domain.CwProjectRecords;
 import com.jeeplus.finance.projectRecords.mapper.CwProjectRecordsMapper;
 import com.jeeplus.finance.projectRecords.service.dto.CwProjectRecordsDTO;
+import com.jeeplus.finance.projectReport.domain.CwProjectReport;
 import com.jeeplus.finance.projectReport.domain.CwProjectReportData;
 import com.jeeplus.finance.projectReport.mapper.CwProjectReportMapper;
 import com.jeeplus.finance.workClientInfo.domain.CwWorkClientBase;
@@ -1314,7 +1316,26 @@ public class CwFinanceInvoiceService extends ServiceImpl<CwFinanceInvoiceMapper,
 
     public List<CwFinanceInvoiceDTO> getByContractId(String contractId, CwFinanceInvoiceDTO cwFinanceInvoiceDTO) throws Exception {
         if (StringUtils.isNotBlank(contractId)) {
-            List<String> idByContractId = cwFinanceInvoiceMapper.getIdByContractId(contractId);
+            // 第1步:轻量查询,收集合同下所有项目 ID 和报告 ID
+            List<String> projectIds = cwProjectRecordsMapper.selectList(
+                new LambdaQueryWrapper<CwProjectRecords>()
+                    .select(CwProjectRecords::getId)
+                    .eq(CwProjectRecords::getContractId, contractId)
+                    .eq(CwProjectRecords::getDelFlag, "0")
+            ).stream().map(CwProjectRecords::getId).collect(Collectors.toList());
+
+            List<String> reportIds = new ArrayList<>();
+            if (CollectionUtil.isNotEmpty(projectIds)) {
+                reportIds = cwProjectReportMapper.selectList(
+                    new LambdaQueryWrapper<CwProjectReport>()
+                        .select(CwProjectReport::getId)
+                        .in(CwProjectReport::getProjectId, projectIds)
+                        .eq(CwProjectReport::getDelFlag, "0")
+                ).stream().map(CwProjectReport::getId).collect(Collectors.toList());
+            }
+
+            // 第2步:用收集到的 ID 列表一条 SQL 查发票(只扫一次 cw_finance_invoice_base)
+            List<String> idByContractId = cwFinanceInvoiceMapper.getIdByContractId(contractId, projectIds, reportIds);
             if (CollectionUtil.isNotEmpty(idByContractId)) {
                 QueryWrapper<CwFinanceInvoice> queryWrapper = QueryWrapperGenerator.buildQueryCondition(CwFinanceInvoiceWrapper.INSTANCE.toEntity(cwFinanceInvoiceDTO), CwFinanceInvoice.class);
                 queryWrapper.in("fi.id", idByContractId);