Merge pull request 'develop' (#222) from develop into master

Reviewed-on: http://git.xdadan.loc/tanex/emis-service/pulls/222
This commit is contained in:
heyu 2025-11-07 11:38:16 +08:00
commit 248ad9048b
8 changed files with 883 additions and 345 deletions

View File

@ -290,4 +290,44 @@ public class EmisSettleInvoiceRecordController extends BaseController {
} }
return AjaxResult.success("操作成功"); return AjaxResult.success("操作成功");
} }
/**
* 批量发票延期
*/
@PreAuthorize("@ss.hasPermi('emis:emisSettleInvoiceRecord:delay')")
@Log(title = "批量发票延期", businessType = BusinessType.UPDATE)
@PostMapping("/batchDelayInvoice/{ids}")
public AjaxResult batchDelayInvoice(@PathVariable Long[] ids) {
try {
return toAjax(emisSettleInvoiceRecordService.batchDelayInvoice(ids));
} catch (Exception ex) {
ex.printStackTrace();
// 返回子定义异常
if (ex instanceof EmisBizError) {
return AjaxResult.error(ex.getMessage(), ((EmisBizError) ex).getErrorCode());
}
return AjaxResult.error("延期操作异常,联系客服");
}
}
/**
* 批量取消发票延期
*/
@PreAuthorize("@ss.hasPermi('emis:emisSettleInvoiceRecord:cancelDelay')")
@Log(title = "批量取消发票延期", businessType = BusinessType.UPDATE)
@PostMapping("/batchCancelDelayInvoice/{ids}")
public AjaxResult batchCancelDelayInvoice(@PathVariable Long[] ids) {
try {
return toAjax(emisSettleInvoiceRecordService.batchCancelDelayInvoice(ids));
} catch (Exception ex) {
ex.printStackTrace();
// 返回子定义异常
if (ex instanceof EmisBizError) {
return AjaxResult.error(ex.getMessage(), ((EmisBizError) ex).getErrorCode());
}
return AjaxResult.error("取消延期操作异常,联系客服");
}
}
} }

View File

@ -134,6 +134,17 @@ public class EmisSettleInvoiceRecord extends BaseEntity
private String openChStatusDesc; private String openChStatusDesc;
/* 使用的开票企业代码 */ /* 使用的开票企业代码 */
private String openComCode; private String openComCode;
/* 开票主体 */
private String salerCompanyName;
/* 是否延期 0-不延期 1-延期 */
private String blDelay;
/* 发票延期操作人编码 */
private String delayOpManCode;
/* 发票延期操作人名称 */
private String delayOpManName;
/* 发票延期操作时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date delayOpDate;
// 扩展信息 // 扩展信息
/* 申请 */ /* 申请 */

View File

@ -120,4 +120,21 @@ public interface EmisSettleInvoiceRecordMapper extends BaseMapper<EmisSettleInvo
public List<EmisSettleInvoiceRecord> selectSimpleInvoiceRecordList( public List<EmisSettleInvoiceRecord> selectSimpleInvoiceRecordList(
EmisSettleInvoiceRecord emisSettleInvoiceRecord); EmisSettleInvoiceRecord emisSettleInvoiceRecord);
/**
* 批量发票延期
*
* @param ids 发票记录ID数组
* @param delayOpManCode 延期操作人
* @return 结果
*/
public int batchDelayInvoice(@Param("ids") Long[] ids, @Param("delayOpManCode") String delayOpManCode);
/**
* 批量取消发票延期
*
* @param ids 发票记录ID数组
* @return 结果
*/
public int batchCancelDelayInvoice(@Param("ids") Long[] ids);
} }

View File

@ -16,6 +16,7 @@ import java.util.Map;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xdadan.erp.emis.domain.EmisSettleInvoiceRel; import com.xdadan.erp.emis.domain.EmisSettleInvoiceRel;
import com.xdadan.erp.emis.domain.EmisSettlePayRel; import com.xdadan.erp.emis.domain.EmisSettlePayRel;
import org.apache.ibatis.annotations.Param;
/** /**
* @ClassName EmisSettlePayRelMapper * @ClassName EmisSettlePayRelMapper
* @Description <p> 支付子账单关联表 Mapper 接口 </p> * @Description <p> 支付子账单关联表 Mapper 接口 </p>
@ -33,6 +34,14 @@ public interface EmisSettlePayRelMapper extends BaseMapper<EmisSettlePayRel>
public List<EmisSettlePayRel> selectHasPayListBySettleBillNo(String settleBillNo); public List<EmisSettlePayRel> selectHasPayListBySettleBillNo(String settleBillNo);
/**
* 根据账单号列表查询支付关联记录
*
* @param settleBillNoList 账单号列表
* @return 支付关联记录列表
*/
public List<EmisSettlePayRel> selectHasPayListBySettleBillNoList(@Param("settleBillNoList") List<String> settleBillNoList);
public List<Map> selectHasPayMapList(String settleBillNo); public List<Map> selectHasPayMapList(String settleBillNo);
/** /**

View File

@ -106,4 +106,22 @@ public interface IEmisSettleInvoiceRecordService {
public List<EmisSettleInvoiceRecordExportVO> selectCustomExportList( public List<EmisSettleInvoiceRecordExportVO> selectCustomExportList(
EmisSettleInvoiceRecord emisSettleInvoiceRecord); EmisSettleInvoiceRecord emisSettleInvoiceRecord);
/**
* 批量发票延期
*
* @param ids 发票记录ID数组
* @return 结果
* @throws EmisBizError
*/
public int batchDelayInvoice(Long[] ids) throws EmisBizError;
/**
* 批量取消发票延期
*
* @param ids 发票记录ID数组
* @return 结果
* @throws EmisBizError
*/
public int batchCancelDelayInvoice(Long[] ids) throws EmisBizError;
} }

View File

@ -42,6 +42,10 @@ import com.xdadan.erp.emis.mapper.EmisSettleInvoiceRecordMapper;
import com.xdadan.erp.emis.service.IEmisSettleInvoiceRecordService; import com.xdadan.erp.emis.service.IEmisSettleInvoiceRecordService;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.xdadan.erp.emis.mapper.EmisSettlePayRecordMapper; import com.xdadan.erp.emis.mapper.EmisSettlePayRecordMapper;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Qualifier;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/** /**
* 开票记录表Service业务层处理 * 开票记录表Service业务层处理
@ -83,6 +87,40 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
@Autowired @Autowired
private EmisSettlePayBillRelMapper emisSettlePayBillRelMapper; private EmisSettlePayBillRelMapper emisSettlePayBillRelMapper;
@Autowired(required = false)
@Qualifier("dataQueryExecutor")
private ThreadPoolExecutor dataQueryExecutor;
/**
* 获取或创建线程池
* 如果未注入线程池,则创建默认线程池
*/
private ThreadPoolExecutor getExecutor() {
if (dataQueryExecutor != null) {
return dataQueryExecutor;
}
// 如果未注入,创建默认线程池
int processors = Runtime.getRuntime().availableProcessors();
return new ThreadPoolExecutor(
Math.max(2, processors), // 核心线程数
processors, // 最大线程数
60L, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<>(500), // 工作队列
new ThreadFactory() {
private final AtomicInteger threadNumber = new AtomicInteger(1);
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, "invoice-export-query-" + threadNumber.getAndIncrement());
t.setDaemon(true);
return t;
}
},
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
}
/** /**
* 查询开票记录表 * 查询开票记录表
* *
@ -403,23 +441,69 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
@Override @Override
public List<EmisSettleInvoiceRecordExportVO> selectCustomExportList( public List<EmisSettleInvoiceRecordExportVO> selectCustomExportList(
EmisSettleInvoiceRecord emisSettleInvoiceRecord) { EmisSettleInvoiceRecord emisSettleInvoiceRecord) {
// 查询开票记录列表 // 分页查询开票记录列表
List<EmisSettleInvoiceRecord> invoiceRecordList = emisSettleInvoiceRecordMapper List<EmisSettleInvoiceRecord> invoiceRecordList = queryInvoiceRecordListByPage(emisSettleInvoiceRecord);
.selectSimpleInvoiceRecordList(emisSettleInvoiceRecord);
if (CollectionUtils.isEmpty(invoiceRecordList)) { if (CollectionUtils.isEmpty(invoiceRecordList)) {
return new ArrayList<>(); return new ArrayList<>();
} }
List<EmisSettleInvoiceRecordExportVO> exportList = new ArrayList<>(); // 收集所有需要批量查询的数据
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); Set<String> allSettleBillNoSet = collectSettleBillNos(invoiceRecordList);
Set<String> allPayIdSet = new HashSet<>();
Set<String> allBillNoSet = new HashSet<>();
// 第一步:收集所有需要批量查询的数据 // 查询支付关联记录并建立映射关系
Set<String> allSettleBillNoSet = new HashSet<>(); // 所有账单号 Map<String, List<EmisSettlePayRel>> settleBillNoToPayRelListMap = queryPayRelListAndBuildMapping(
Set<String> allPayIdSet = new HashSet<>(); // 所有支付ID allSettleBillNoSet, allPayIdSet, allBillNoSet, invoiceRecordList);
Set<String> allBillNoSet = new HashSet<>(); // 所有运单号
// 收集所有账单号 // 并行批量查询账单、收款记录、运单信息
QueryDataMaps queryDataMaps = parallelQueryRelatedData(allSettleBillNoSet, allPayIdSet, allBillNoSet);
// 组装导出数据
return buildExportDataList(invoiceRecordList, settleBillNoToPayRelListMap, queryDataMaps);
}
/**
* 分页查询开票记录列表,每次查询1000条
*
* @param emisSettleInvoiceRecord 查询条件
* @return 开票记录列表
*/
private List<EmisSettleInvoiceRecord> queryInvoiceRecordListByPage(
EmisSettleInvoiceRecord emisSettleInvoiceRecord) {
List<EmisSettleInvoiceRecord> invoiceRecordList = new ArrayList<>();
int pageSize = 1000;
int pageNum = 1;
boolean hasMore = true;
while (hasMore) {
PageHelper.startPage(pageNum, pageSize);
List<EmisSettleInvoiceRecord> pageList = emisSettleInvoiceRecordMapper
.selectSimpleInvoiceRecordList(emisSettleInvoiceRecord);
if (CollectionUtils.isEmpty(pageList)) {
hasMore = false;
} else {
invoiceRecordList.addAll(pageList);
// 如果查询结果少于pageSize,说明已经是最后一页
if (pageList.size() < pageSize) {
hasMore = false;
} else {
pageNum++;
}
}
}
return invoiceRecordList;
}
/**
* 收集所有账单号
*
* @param invoiceRecordList 开票记录列表
* @return 账单号集合
*/
private Set<String> collectSettleBillNos(List<EmisSettleInvoiceRecord> invoiceRecordList) {
Set<String> allSettleBillNoSet = new HashSet<>();
for (EmisSettleInvoiceRecord record : invoiceRecordList) { for (EmisSettleInvoiceRecord record : invoiceRecordList) {
if (StringUtils.isNotBlank(record.getSettleBillNo())) { if (StringUtils.isNotBlank(record.getSettleBillNo())) {
String[] settleBillNoArr = record.getSettleBillNo().split(","); String[] settleBillNoArr = record.getSettleBillNo().split(",");
@ -430,19 +514,88 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
} }
} }
} }
return allSettleBillNoSet;
}
// 批量查询所有支付关联记录(一次性查询所有settleBillNo对应的支付关联记录) /**
* 查询支付关联记录并建立映射关系
*
* @param allSettleBillNoSet 账单号集合
* @param allPayIdSet 支付ID集合(输出参数)
* @param allBillNoSet 运单号集合(输出参数)
* @param invoiceRecordList 开票记录列表
* @return 账单号到支付关联记录的映射
*/
private Map<String, List<EmisSettlePayRel>> queryPayRelListAndBuildMapping(
Set<String> allSettleBillNoSet, Set<String> allPayIdSet, Set<String> allBillNoSet,
List<EmisSettleInvoiceRecord> invoiceRecordList) {
Map<String, List<EmisSettlePayRel>> settleBillNoToPayRelListMap = new HashMap<>(); Map<String, List<EmisSettlePayRel>> settleBillNoToPayRelListMap = new HashMap<>();
// 建立 payId -> Set<settleBillNo> 的映射关系
Map<String, Set<String>> payIdToSettleBillNoSetMap = new HashMap<>(); Map<String, Set<String>> payIdToSettleBillNoSetMap = new HashMap<>();
if (!allSettleBillNoSet.isEmpty()) { if (allSettleBillNoSet.isEmpty()) {
// 一次性查询所有支付关联记录(合并所有settleBillNo) return settleBillNoToPayRelListMap;
String allSettleBillNoStr = String.join(",", allSettleBillNoSet); }
List<EmisSettlePayRel> allPayRelList = emisSettlePayRelMapper
.selectHasPayListBySettleBillNo(allSettleBillNoStr); ThreadPoolExecutor executor = null;
try {
executor = getExecutor();
// 分批并行查询所有支付关联记录
List<EmisSettlePayRel> allPayRelList = batchQueryPayRelList(executor, allSettleBillNoSet);
// 收集所有payId和billNo // 收集所有payId和billNo
collectPayIdAndBillNo(allPayRelList, allPayIdSet, allBillNoSet);
// 查询并建立 payId 到 settleBillNo 的映射关系
if (!allPayIdSet.isEmpty() && !allSettleBillNoSet.isEmpty()) {
queryPayBillRelMapping(executor, allSettleBillNoSet, allPayIdSet, payIdToSettleBillNoSetMap);
}
// 根据每个记录的settleBillNo过滤对应的payRelList
buildSettleBillNoToPayRelMap(invoiceRecordList, allPayRelList, payIdToSettleBillNoSetMap,
settleBillNoToPayRelListMap);
} finally {
// 关闭线程池
if (executor != null && executor != dataQueryExecutor) {
executor.shutdown();
}
}
return settleBillNoToPayRelListMap;
}
/**
* 分批并行查询支付关联记录
*/
private List<EmisSettlePayRel> batchQueryPayRelList(ThreadPoolExecutor executor, Set<String> allSettleBillNoSet) {
List<EmisSettlePayRel> allPayRelList = Collections.synchronizedList(new ArrayList<>());
List<String> settleBillNoList = new ArrayList<>(allSettleBillNoSet);
int batchSize = 1000;
List<Future<?>> futures = new ArrayList<>();
for (int i = 0; i < settleBillNoList.size(); i += batchSize) {
final int start = i;
final int end = Math.min(i + batchSize, settleBillNoList.size());
Future<?> future = executor.submit(() -> {
List<String> batch = settleBillNoList.subList(start, end);
List<EmisSettlePayRel> batchPayRelList = emisSettlePayRelMapper
.selectHasPayListBySettleBillNoList(batch);
if (CollectionUtils.isNotEmpty(batchPayRelList)) {
allPayRelList.addAll(batchPayRelList);
}
});
futures.add(future);
}
// 等待所有任务完成
waitForFutures(futures, "查询支付关联记录异常");
return allPayRelList;
}
/**
* 收集payId和billNo
*/
private void collectPayIdAndBillNo(List<EmisSettlePayRel> allPayRelList, Set<String> allPayIdSet,
Set<String> allBillNoSet) {
for (EmisSettlePayRel payRel : allPayRelList) { for (EmisSettlePayRel payRel : allPayRelList) {
if (StringUtils.isNotBlank(payRel.getPayId())) { if (StringUtils.isNotBlank(payRel.getPayId())) {
allPayIdSet.add(payRel.getPayId()); allPayIdSet.add(payRel.getPayId());
@ -451,15 +604,35 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
allBillNoSet.add(payRel.getBillNo()); allBillNoSet.add(payRel.getBillNo());
} }
} }
}
// 查询 payId 到 settleBillNo 的映射关系 /**
if (!allPayIdSet.isEmpty() && !allSettleBillNoSet.isEmpty()) { * 查询支付账单关联映射
// 根据allSettleBillNoSet批量查询相关的支付账单关联记录 */
List<String> settleBillNoList = new ArrayList<>(allSettleBillNoSet); private void queryPayBillRelMapping(ThreadPoolExecutor executor, Set<String> allSettleBillNoSet,
List<EmisSettlePayBillRel> payBillRelList = emisSettlePayBillRelMapper Set<String> allPayIdSet, Map<String, Set<String>> payIdToSettleBillNoSetMap) {
.selectEmisSettlePayBillRelListBySettleBillNos(settleBillNoList); List<EmisSettlePayBillRel> payBillRelList = Collections.synchronizedList(new ArrayList<>());
List<String> payBillRelSettleBillNoList = new ArrayList<>(allSettleBillNoSet);
int payBillRelBatchSize = 1000;
List<Future<?>> payBillRelFutures = new ArrayList<>();
// 建立 payId -> Set<settleBillNo> 的映射(只处理相关的payId和settleBillNo) for (int i = 0; i < payBillRelSettleBillNoList.size(); i += payBillRelBatchSize) {
final int start = i;
final int end = Math.min(i + payBillRelBatchSize, payBillRelSettleBillNoList.size());
Future<?> future = executor.submit(() -> {
List<String> batch = payBillRelSettleBillNoList.subList(start, end);
List<EmisSettlePayBillRel> batchPayBillRelList = emisSettlePayBillRelMapper
.selectEmisSettlePayBillRelListBySettleBillNos(batch);
if (CollectionUtils.isNotEmpty(batchPayBillRelList)) {
payBillRelList.addAll(batchPayBillRelList);
}
});
payBillRelFutures.add(future);
}
waitForFutures(payBillRelFutures, "查询支付账单关联记录异常");
// 建立 payId -> Set<settleBillNo> 的映射
for (EmisSettlePayBillRel payBillRel : payBillRelList) { for (EmisSettlePayBillRel payBillRel : payBillRelList) {
if (StringUtils.isNotBlank(payBillRel.getPayId()) if (StringUtils.isNotBlank(payBillRel.getPayId())
&& StringUtils.isNotBlank(payBillRel.getSettleBillNo()) && StringUtils.isNotBlank(payBillRel.getSettleBillNo())
@ -471,87 +644,207 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
} }
} }
// 根据每个记录的settleBillNo过滤对应的payRelList /**
* 建立账单号到支付关联记录的映射
*/
private void buildSettleBillNoToPayRelMap(List<EmisSettleInvoiceRecord> invoiceRecordList,
List<EmisSettlePayRel> allPayRelList, Map<String, Set<String>> payIdToSettleBillNoSetMap,
Map<String, List<EmisSettlePayRel>> settleBillNoToPayRelListMap) {
for (EmisSettleInvoiceRecord record : invoiceRecordList) { for (EmisSettleInvoiceRecord record : invoiceRecordList) {
if (StringUtils.isNotBlank(record.getSettleBillNo())) { if (StringUtils.isNotBlank(record.getSettleBillNo())) {
// 解析该记录的settleBillNo(可能是逗号分隔的多个) Set<String> recordSettleBillNoSet = parseSettleBillNos(record.getSettleBillNo());
Set<String> recordSettleBillNoSet = new HashSet<>(); List<EmisSettlePayRel> recordPayRelList = filterPayRelListBySettleBillNo(
String[] settleBillNoArr = record.getSettleBillNo().split(","); allPayRelList, recordSettleBillNoSet, payIdToSettleBillNoSetMap);
for (String settleBillNo : settleBillNoArr) {
if (StringUtils.isNotBlank(settleBillNo)) {
recordSettleBillNoSet.add(settleBillNo.trim());
}
}
// 过滤出属于该记录的payRelList
List<EmisSettlePayRel> recordPayRelList = new ArrayList<>();
for (EmisSettlePayRel payRel : allPayRelList) {
if (StringUtils.isNotBlank(payRel.getPayId())) {
Set<String> payRelSettleBillNoSet = payIdToSettleBillNoSetMap.get(payRel.getPayId());
if (payRelSettleBillNoSet != null) {
// 判断该payRel的payId关联的settleBillNo是否包含在当前记录的settleBillNo中
boolean belongsToRecord = false;
for (String settleBillNo : recordSettleBillNoSet) {
if (payRelSettleBillNoSet.contains(settleBillNo)) {
belongsToRecord = true;
break;
}
}
if (belongsToRecord) {
recordPayRelList.add(payRel);
}
}
}
}
settleBillNoToPayRelListMap.put(record.getSettleBillNo(), recordPayRelList); settleBillNoToPayRelListMap.put(record.getSettleBillNo(), recordPayRelList);
} }
} }
} }
// 第二步:批量查询所有数据 /**
// 批量查询账单 * 解析账单号字符串为集合
Map<String, EmisSettleBill> settleBillMap = new HashMap<>(); */
private Set<String> parseSettleBillNos(String settleBillNoStr) {
Set<String> recordSettleBillNoSet = new HashSet<>();
String[] settleBillNoArr = settleBillNoStr.split(",");
for (String settleBillNo : settleBillNoArr) {
if (StringUtils.isNotBlank(settleBillNo)) {
recordSettleBillNoSet.add(settleBillNo.trim());
}
}
return recordSettleBillNoSet;
}
/**
* 根据账单号过滤支付关联记录
*/
private List<EmisSettlePayRel> filterPayRelListBySettleBillNo(List<EmisSettlePayRel> allPayRelList,
Set<String> recordSettleBillNoSet, Map<String, Set<String>> payIdToSettleBillNoSetMap) {
List<EmisSettlePayRel> recordPayRelList = new ArrayList<>();
for (EmisSettlePayRel payRel : allPayRelList) {
if (StringUtils.isNotBlank(payRel.getPayId())) {
Set<String> payRelSettleBillNoSet = payIdToSettleBillNoSetMap.get(payRel.getPayId());
if (payRelSettleBillNoSet != null) {
for (String settleBillNo : recordSettleBillNoSet) {
if (payRelSettleBillNoSet.contains(settleBillNo)) {
recordPayRelList.add(payRel);
break;
}
}
}
}
}
return recordPayRelList;
}
/**
* 并行批量查询相关数据(账单、收款记录、运单信息)
*/
private QueryDataMaps parallelQueryRelatedData(Set<String> allSettleBillNoSet, Set<String> allPayIdSet,
Set<String> allBillNoSet) {
QueryDataMaps queryDataMaps = new QueryDataMaps();
ThreadPoolExecutor executor = null;
try {
executor = getExecutor();
List<Future<?>> futures = new ArrayList<>();
// 并行查询账单
if (!allSettleBillNoSet.isEmpty()) { if (!allSettleBillNoSet.isEmpty()) {
List<String> settleBillNoList = new ArrayList<>(allSettleBillNoSet); submitBatchQueryTasks(executor, futures, new ArrayList<>(allSettleBillNoSet), 1000,
List<EmisSettleBill> settleBillList = emisSettleBillMapper (batch) -> {
.selectSimpleBillsByNos(settleBillNoList); List<EmisSettleBill> batchSettleBillList = emisSettleBillMapper
for (EmisSettleBill settleBill : settleBillList) { .selectSimpleBillsByNos(batch);
if (CollectionUtils.isNotEmpty(batchSettleBillList)) {
for (EmisSettleBill settleBill : batchSettleBillList) {
if (StringUtils.isNotBlank(settleBill.getSettleBillNo())) { if (StringUtils.isNotBlank(settleBill.getSettleBillNo())) {
settleBillMap.put(settleBill.getSettleBillNo(), settleBill); queryDataMaps.settleBillMap.put(settleBill.getSettleBillNo(), settleBill);
} }
} }
} }
});
}
// 批量查询收款记录 // 并行查询收款记录
Map<String, EmisSettlePayRecord> payRecordMap = new HashMap<>();
if (!allPayIdSet.isEmpty()) { if (!allPayIdSet.isEmpty()) {
List<String> payIdList = new ArrayList<>(allPayIdSet); submitBatchQueryTasks(executor, futures, new ArrayList<>(allPayIdSet), 1000,
List<EmisSettlePayRecord> payRecordList = emisSettlePayRecordMapper (batch) -> {
.selectEmisSettlePayRecordListByPayIds(payIdList); List<EmisSettlePayRecord> batchPayRecordList = emisSettlePayRecordMapper
for (EmisSettlePayRecord payRecord : payRecordList) { .selectEmisSettlePayRecordListByPayIds(batch);
if (CollectionUtils.isNotEmpty(batchPayRecordList)) {
for (EmisSettlePayRecord payRecord : batchPayRecordList) {
if (StringUtils.isNotBlank(payRecord.getPayId())) { if (StringUtils.isNotBlank(payRecord.getPayId())) {
// 如果同一个payId有多条记录,取第一条(已按create_time desc排序) queryDataMaps.payRecordMap.putIfAbsent(payRecord.getPayId(), payRecord);
payRecordMap.putIfAbsent(payRecord.getPayId(), payRecord);
} }
} }
} }
});
}
// 批量查询运单信息 // 并行查询运单信息
Map<String, EmisWaybill> waybillMap = new HashMap<>();
if (!allBillNoSet.isEmpty()) { if (!allBillNoSet.isEmpty()) {
List<String> billNoList = new ArrayList<>(allBillNoSet); submitBatchQueryTasks(executor, futures, new ArrayList<>(allBillNoSet), 1000,
List<EmisWaybill> waybillList = emisWaybillMapper.selectWaybillsByBillCodes(billNoList); (batch) -> {
for (EmisWaybill waybill : waybillList) { List<EmisWaybill> batchWaybillList = emisWaybillMapper.selectWaybillsByBillCodes(batch);
if (CollectionUtils.isNotEmpty(batchWaybillList)) {
for (EmisWaybill waybill : batchWaybillList) {
if (StringUtils.isNotBlank(waybill.getBillCode())) { if (StringUtils.isNotBlank(waybill.getBillCode())) {
waybillMap.put(waybill.getBillCode(), waybill); queryDataMaps.waybillMap.put(waybill.getBillCode(), waybill);
}
}
}
});
}
waitForFutures(futures, "并行查询数据异常");
} finally {
// 关闭线程池
if (executor != null && executor != dataQueryExecutor) {
executor.shutdown();
}
}
return queryDataMaps;
}
/**
* 提交批量查询任务
*/
private <T> void submitBatchQueryTasks(ThreadPoolExecutor executor, List<Future<?>> futures,
List<T> dataList, int batchSize, java.util.function.Consumer<List<T>> task) {
for (int i = 0; i < dataList.size(); i += batchSize) {
final int start = i;
final int end = Math.min(i + batchSize, dataList.size());
Future<?> future = executor.submit(() -> {
List<T> batch = dataList.subList(start, end);
task.accept(batch);
});
futures.add(future);
}
}
/**
* 等待所有Future完成
*/
private void waitForFutures(List<Future<?>> futures, String errorMsg) {
for (Future<?> future : futures) {
try {
future.get();
} catch (Exception e) {
log.error(errorMsg, e);
} }
} }
} }
// 第三步:处理每个开票记录,组装导出数据 /**
* 组装导出数据列表
*/
private List<EmisSettleInvoiceRecordExportVO> buildExportDataList(
List<EmisSettleInvoiceRecord> invoiceRecordList,
Map<String, List<EmisSettlePayRel>> settleBillNoToPayRelListMap,
QueryDataMaps queryDataMaps) {
List<EmisSettleInvoiceRecordExportVO> exportList = new ArrayList<>();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
for (EmisSettleInvoiceRecord record : invoiceRecordList) { for (EmisSettleInvoiceRecord record : invoiceRecordList) {
EmisSettleInvoiceRecordExportVO exportVO = buildExportVO(record, settleBillNoToPayRelListMap,
queryDataMaps, dateFormat);
exportList.add(exportVO);
}
return exportList;
}
/**
* 构建单个导出VO对象
*/
private EmisSettleInvoiceRecordExportVO buildExportVO(EmisSettleInvoiceRecord record,
Map<String, List<EmisSettlePayRel>> settleBillNoToPayRelListMap,
QueryDataMaps queryDataMaps, SimpleDateFormat dateFormat) {
EmisSettleInvoiceRecordExportVO exportVO = new EmisSettleInvoiceRecordExportVO(); EmisSettleInvoiceRecordExportVO exportVO = new EmisSettleInvoiceRecordExportVO();
// 基础字段
// 设置基础字段
setBasicFields(exportVO, record);
// 处理账单类型
Set<String> settleTypeSet = processBillTypes(exportVO, record, queryDataMaps.settleBillMap);
// 处理支付关联记录和分组
List<String> customerNameList = new ArrayList<>();
List<String> paymentDateList = new ArrayList<>();
List<String> registerDateList = new ArrayList<>();
processPaymentGroups(record, settleBillNoToPayRelListMap, queryDataMaps, dateFormat,
customerNameList, paymentDateList, registerDateList);
// 设置分组后的数据
setGroupedFields(exportVO, customerNameList, paymentDateList, registerDateList, settleTypeSet);
return exportVO;
}
/**
* 设置基础字段
*/
private void setBasicFields(EmisSettleInvoiceRecordExportVO exportVO, EmisSettleInvoiceRecord record) {
exportVO.setApplyDate(record.getApplyDate()); exportVO.setApplyDate(record.getApplyDate());
exportVO.setApplyManName(record.getApplyManName()); exportVO.setApplyManName(record.getApplyManName());
exportVO.setApplyMoney(record.getApplyMoney()); exportVO.setApplyMoney(record.getApplyMoney());
@ -559,38 +852,47 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
exportVO.setOpManName(record.getOpManName()); exportVO.setOpManName(record.getOpManName());
exportVO.setCompanyName(record.getCompanyName()); exportVO.setCompanyName(record.getCompanyName());
exportVO.setInvoiceNo(record.getInvoiceNo()); exportVO.setInvoiceNo(record.getInvoiceNo());
exportVO.setInvoiceStatusDesc(getInvoiceStatusDesc(record.getInvoiceStatus()));
// 开票状态(0-未开票 1-开票中 2-已开票 3-开票异常)
String invoiceStatusDesc = "";
if ("0".equals(record.getInvoiceStatus())) {
invoiceStatusDesc = "未开票";
} else if ("1".equals(record.getInvoiceStatus())) {
invoiceStatusDesc = "开票中";
} else if ("2".equals(record.getInvoiceStatus())) {
invoiceStatusDesc = "已开票";
} else if ("3".equals(record.getInvoiceStatus())) {
invoiceStatusDesc = "开票异常";
}
exportVO.setInvoiceStatusDesc(invoiceStatusDesc);
exportVO.setRecedMoney(record.getRecedMoney()); exportVO.setRecedMoney(record.getRecedMoney());
exportVO.setPaymentStatusDesc(getPaymentStatusDesc(record.getPaymentStatus()));
// 收款状态描述
String paymentStatusDesc = "";
if ("0".equals(record.getPaymentStatus())) {
paymentStatusDesc = "未收款";
} else if ("1".equals(record.getPaymentStatus())) {
paymentStatusDesc = "已收款";
} else if ("2".equals(record.getPaymentStatus())) {
paymentStatusDesc = "部分收款";
} }
exportVO.setPaymentStatusDesc(paymentStatusDesc);
List<String> customerNameList = new ArrayList<>(); /**
List<String> paymentDateList = new ArrayList<>(); * 获取开票状态描述
List<String> registerDateList = new ArrayList<>(); */
Set<String> settleTypeSet = new HashSet<>(); // 使用Set去重 private String getInvoiceStatusDesc(String invoiceStatus) {
if ("0".equals(invoiceStatus)) {
return "未开票";
} else if ("1".equals(invoiceStatus)) {
return "开票中";
} else if ("2".equals(invoiceStatus)) {
return "已开票";
} else if ("3".equals(invoiceStatus)) {
return "开票异常";
}
return "";
}
// 查询账单类型(从settle_bill获取) /**
* 获取收款状态描述
*/
private String getPaymentStatusDesc(String paymentStatus) {
if ("0".equals(paymentStatus)) {
return "未收款";
} else if ("1".equals(paymentStatus)) {
return "已收款";
} else if ("2".equals(paymentStatus)) {
return "部分收款";
}
return "";
}
/**
* 处理账单类型
*/
private Set<String> processBillTypes(EmisSettleInvoiceRecordExportVO exportVO,
EmisSettleInvoiceRecord record, Map<String, EmisSettleBill> settleBillMap) {
Set<String> settleTypeSet = new HashSet<>();
if (StringUtils.isNotBlank(record.getSettleBillNo())) { if (StringUtils.isNotBlank(record.getSettleBillNo())) {
String[] settleBillNoArr = Arrays.stream(record.getSettleBillNo().split(",")).distinct() String[] settleBillNoArr = Arrays.stream(record.getSettleBillNo().split(",")).distinct()
.toArray(String[]::new); .toArray(String[]::new);
@ -608,27 +910,35 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
} }
} }
} }
return settleTypeSet;
// 根据发票对应的多个账单号查询emis_settle_pay_rel并关联emis_settle_pay_record、emis_waybill
// 按照cust_name、trade_date分组(客户付款日期)
// 按照cust_name、create_time分组(收款登记日期)
Map<String, PaymentGroup> paymentGroupMap = new HashMap<>(); // key: custName_tradeDate
Map<String, PaymentGroup> registerGroupMap = new HashMap<>(); // key: custName_createTime
// 直接使用settleBillNo(多个用逗号分隔)查询支付关联记录
if (StringUtils.isNotBlank(record.getSettleBillNo())) {
// 从缓存中获取该记录对应的支付关联记录
List<EmisSettlePayRel> payRelList = settleBillNoToPayRelListMap.get(record.getSettleBillNo());
if (CollectionUtils.isEmpty(payRelList)) {
// 如果缓存中没有,则查询(这种情况应该不会发生,但为了安全保留)
payRelList = emisSettlePayRelMapper.selectHasPayListBySettleBillNo(record.getSettleBillNo());
} }
if (!CollectionUtils.isEmpty(payRelList)) { /**
// 遍历支付关联记录,按billNo查询waybill,按cust_name和trade_date/create_time分组 * 处理支付分组
*/
private void processPaymentGroups(EmisSettleInvoiceRecord record,
Map<String, List<EmisSettlePayRel>> settleBillNoToPayRelListMap,
QueryDataMaps queryDataMaps, SimpleDateFormat dateFormat,
List<String> customerNameList, List<String> paymentDateList, List<String> registerDateList) {
if (StringUtils.isBlank(record.getSettleBillNo())) {
return;
}
List<EmisSettlePayRel> payRelList = settleBillNoToPayRelListMap.get(record.getSettleBillNo());
if (CollectionUtils.isEmpty(payRelList)) {
payRelList = emisSettlePayRelMapper.selectHasPayListBySettleBillNoList(
Collections.singletonList(record.getSettleBillNo()));
}
if (CollectionUtils.isEmpty(payRelList)) {
return;
}
Map<String, PaymentGroup> paymentGroupMap = new HashMap<>();
Map<String, PaymentGroup> registerGroupMap = new HashMap<>();
for (EmisSettlePayRel payRel : payRelList) { for (EmisSettlePayRel payRel : payRelList) {
if (payRel.getPayMoney() == null if (payRel.getPayMoney() == null || payRel.getPayMoney().compareTo(BigDecimal.ZERO) <= 0) {
|| payRel.getPayMoney().compareTo(BigDecimal.ZERO) <= 0) {
continue; continue;
} }
@ -637,68 +947,92 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
continue; continue;
} }
// 从缓存中获取waybill信息 // 获取客户名称
String custName = ""; String custName = getCustomerName(billNo, queryDataMaps.waybillMap, customerNameList);
EmisWaybill waybill = waybillMap.get(billNo);
if (waybill != null && StringUtils.isNotBlank(waybill.getCustName())) {
custName = waybill.getCustName();
// 收集客户名称
if (!customerNameList.contains(custName)) {
customerNameList.add(custName);
}
}
// 从缓存中获取对应的收款记录 // 获取收款记录
EmisSettlePayRecord payRecord = payRecordMap.get(payRel.getPayId()); EmisSettlePayRecord payRecord = queryDataMaps.payRecordMap.get(payRel.getPayId());
if (payRecord == null) { if (payRecord == null) {
continue; continue;
} }
Date tradeDate = payRecord.getTradeDate(); // 处理付款日期分组
Date createTime = payRecord.getCreateTime(); processPaymentDateGroup(payRecord.getTradeDate(), custName, payRel.getPayMoney(),
paymentGroupMap, dateFormat);
// 客户付款日期分组(按custName + tradeDate分组) // 处理登记日期分组
// 即使custName为空,也要记录付款日期 processRegisterDateGroup(payRecord.getCreateTime(), custName, payRel.getPayMoney(),
registerGroupMap, dateFormat);
}
// 格式化并排序
formatPaymentGroups(paymentGroupMap, paymentDateList, dateFormat, "付款");
formatPaymentGroups(registerGroupMap, registerDateList, dateFormat, "登记");
}
/**
* 获取客户名称
*/
private String getCustomerName(String billNo, Map<String, EmisWaybill> waybillMap,
List<String> customerNameList) {
EmisWaybill waybill = waybillMap.get(billNo);
String custName = "";
if (waybill != null && StringUtils.isNotBlank(waybill.getCustName())) {
custName = waybill.getCustName();
if (!customerNameList.contains(custName)) {
customerNameList.add(custName);
}
}
return custName;
}
/**
* 处理付款日期分组
*/
private void processPaymentDateGroup(Date tradeDate, String custName, BigDecimal payMoney,
Map<String, PaymentGroup> paymentGroupMap, SimpleDateFormat dateFormat) {
if (tradeDate != null) { if (tradeDate != null) {
String tradeDateStr = dateFormat.format(tradeDate); String tradeDateStr = dateFormat.format(tradeDate);
String paymentKey = (StringUtils.isNotBlank(custName) ? custName : "") + "_" + tradeDateStr; String paymentKey = (StringUtils.isNotBlank(custName) ? custName : "") + "_" + tradeDateStr;
PaymentGroup paymentGroup = paymentGroupMap.get(paymentKey); PaymentGroup paymentGroup = paymentGroupMap.computeIfAbsent(paymentKey, k -> {
if (paymentGroup == null) { PaymentGroup group = new PaymentGroup();
paymentGroup = new PaymentGroup(); group.custName = custName != null ? custName : "";
paymentGroup.custName = custName != null ? custName : ""; group.date = tradeDate;
paymentGroup.date = tradeDate; group.dateStr = tradeDateStr;
paymentGroup.dateStr = tradeDateStr; group.totalMoney = BigDecimal.ZERO;
paymentGroup.totalMoney = BigDecimal.ZERO; return group;
paymentGroupMap.put(paymentKey, paymentGroup); });
paymentGroup.totalMoney = paymentGroup.totalMoney.add(payMoney);
} }
paymentGroup.totalMoney = paymentGroup.totalMoney.add(payRel.getPayMoney());
} }
// 收款登记日期分组(按custName + createTime分组) /**
// 即使custName为空,也要记录登记日期 * 处理登记日期分组
*/
private void processRegisterDateGroup(Date createTime, String custName, BigDecimal payMoney,
Map<String, PaymentGroup> registerGroupMap, SimpleDateFormat dateFormat) {
if (createTime != null) { if (createTime != null) {
String createTimeStr = dateFormat.format(createTime); String createTimeStr = dateFormat.format(createTime);
String registerKey = (StringUtils.isNotBlank(custName) ? custName : "") + "_" String registerKey = (StringUtils.isNotBlank(custName) ? custName : "") + "_" + createTimeStr;
+ createTimeStr; PaymentGroup registerGroup = registerGroupMap.computeIfAbsent(registerKey, k -> {
PaymentGroup registerGroup = registerGroupMap.get(registerKey); PaymentGroup group = new PaymentGroup();
if (registerGroup == null) { group.custName = custName != null ? custName : "";
registerGroup = new PaymentGroup(); group.date = createTime;
registerGroup.custName = custName != null ? custName : ""; group.dateStr = createTimeStr;
registerGroup.date = createTime; group.totalMoney = BigDecimal.ZERO;
registerGroup.dateStr = createTimeStr; return group;
registerGroup.totalMoney = BigDecimal.ZERO; });
registerGroupMap.put(registerKey, registerGroup); registerGroup.totalMoney = registerGroup.totalMoney.add(payMoney);
}
registerGroup.totalMoney = registerGroup.totalMoney.add(payRel.getPayMoney());
}
}
} }
} }
// 格式化客户付款日期(格式:2025/10/30 付款2000元 A公司) /**
// 按日期从小到大排序 * 格式化支付分组
List<PaymentGroup> sortedPaymentGroups = new ArrayList<>(paymentGroupMap.values()); */
sortedPaymentGroups.sort((g1, g2) -> { private void formatPaymentGroups(Map<String, PaymentGroup> groupMap, List<String> dateList,
SimpleDateFormat dateFormat, String type) {
List<PaymentGroup> sortedGroups = new ArrayList<>(groupMap.values());
sortedGroups.sort((g1, g2) -> {
if (g1.date == null && g2.date == null) { if (g1.date == null && g2.date == null) {
return 0; return 0;
} }
@ -710,66 +1044,44 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
} }
return g1.date.compareTo(g2.date); return g1.date.compareTo(g2.date);
}); });
for (PaymentGroup group : sortedPaymentGroups) {
for (PaymentGroup group : sortedGroups) {
BigDecimal strippedMoney = group.totalMoney.stripTrailingZeros(); BigDecimal strippedMoney = group.totalMoney.stripTrailingZeros();
String paymentDateStr = group.dateStr + " 付款" + strippedMoney.toPlainString() + "元"; String dateStr = group.dateStr + " " + type + strippedMoney.toPlainString() + "元";
// 如果客户名称不为空,则追加客户名称
if (StringUtils.isNotBlank(group.custName)) { if (StringUtils.isNotBlank(group.custName)) {
paymentDateStr += " " + group.custName; dateStr += " " + group.custName;
}
dateList.add(dateStr);
} }
paymentDateList.add(paymentDateStr);
} }
// 格式化收款登记日期(格式:2025/10/30 登记2000元 A公司) /**
// 按日期从小到大排序 * 设置分组后的字段
List<PaymentGroup> sortedRegisterGroups = new ArrayList<>(registerGroupMap.values()); */
sortedRegisterGroups.sort((g1, g2) -> { private void setGroupedFields(EmisSettleInvoiceRecordExportVO exportVO, List<String> customerNameList,
if (g1.date == null && g2.date == null) { List<String> paymentDateList, List<String> registerDateList, Set<String> settleTypeSet) {
return 0;
}
if (g1.date == null) {
return -1;
}
if (g2.date == null) {
return 1;
}
return g1.date.compareTo(g2.date);
});
for (PaymentGroup group : sortedRegisterGroups) {
BigDecimal strippedMoney = group.totalMoney.stripTrailingZeros();
String registerDateStr = group.dateStr + " 登记" + strippedMoney.toPlainString() + "元";
// 如果客户名称不为空,则追加客户名称
if (StringUtils.isNotBlank(group.custName)) {
registerDateStr += " " + group.custName;
}
registerDateList.add(registerDateStr);
}
// 设置客户名称(多个用逗号分隔)
if (!CollectionUtils.isEmpty(customerNameList)) { if (!CollectionUtils.isEmpty(customerNameList)) {
exportVO.setCustomerNames(String.join(",", customerNameList)); exportVO.setCustomerNames(String.join(",", customerNameList));
} }
// 设置客户付款日期(多个用逗号分隔)
if (!CollectionUtils.isEmpty(paymentDateList)) { if (!CollectionUtils.isEmpty(paymentDateList)) {
exportVO.setCustomerPaymentDates(String.join(";", paymentDateList)); exportVO.setCustomerPaymentDates(String.join(";", paymentDateList));
} }
// 设置收款登记日期(多个用逗号分隔)
if (!CollectionUtils.isEmpty(registerDateList)) { if (!CollectionUtils.isEmpty(registerDateList)) {
exportVO.setCollectionRegisterDates(String.join(";", registerDateList)); exportVO.setCollectionRegisterDates(String.join(";", registerDateList));
} }
// 设置账单类型(多个用逗号分隔)
if (!settleTypeSet.isEmpty()) { if (!settleTypeSet.isEmpty()) {
List<String> settleTypeList = new ArrayList<>(settleTypeSet); List<String> settleTypeList = new ArrayList<>(settleTypeSet);
exportVO.setBillType(String.join(",", settleTypeList)); exportVO.setBillType(String.join(",", settleTypeList));
} }
exportList.add(exportVO);
} }
return exportList; /**
* 查询数据映射内部类
*/
private static class QueryDataMaps {
Map<String, EmisSettleBill> settleBillMap = new ConcurrentHashMap<>();
Map<String, EmisSettlePayRecord> payRecordMap = new ConcurrentHashMap<>();
Map<String, EmisWaybill> waybillMap = new ConcurrentHashMap<>();
} }
/** /**
@ -782,4 +1094,67 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
BigDecimal totalMoney; BigDecimal totalMoney;
} }
/**
* 批量发票延期
*
* @param ids 发票记录ID数组
* @return 结果
* @throws EmisBizError
*/
@Override
@Transactional
public int batchDelayInvoice(Long[] ids) throws EmisBizError {
if (ids == null || ids.length == 0) {
throw new EmisBizError(EmisBizErrorType.FAIL, "请选择要延期的发票记录");
}
// 验证所有记录是否都是未开票状态
for (Long id : ids) {
EmisSettleInvoiceRecord record = emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordById(id);
if (record == null) {
throw new EmisBizError(EmisBizErrorType.FAIL, "发票记录不存在,ID: " + id);
}
if (!"0".equals(record.getInvoiceStatus())) {
throw new EmisBizError(EmisBizErrorType.FAIL,
"只能对未开票状态的发票进行延期操作,申请序号: " + record.getApplySeqNo());
}
}
// 获取当前操作人
String delayOpManCode = getCurrentUser().getEmpCode();
// 执行批量延期
return emisSettleInvoiceRecordMapper.batchDelayInvoice(ids, delayOpManCode);
}
/**
* 批量取消发票延期
*
* @param ids 发票记录ID数组
* @return 结果
* @throws EmisBizError
*/
@Override
@Transactional
public int batchCancelDelayInvoice(Long[] ids) throws EmisBizError {
if (ids == null || ids.length == 0) {
throw new EmisBizError(EmisBizErrorType.FAIL, "请选择要取消延期的发票记录");
}
// 验证所有记录是否都是已延期状态
for (Long id : ids) {
EmisSettleInvoiceRecord record = emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordById(id);
if (record == null) {
throw new EmisBizError(EmisBizErrorType.FAIL, "发票记录不存在,ID: " + id);
}
if (!"1".equals(record.getBlDelay())) {
throw new EmisBizError(EmisBizErrorType.FAIL,
"只能对已延期的发票进行取消延期操作,申请序号: " + record.getApplySeqNo());
}
}
// 执行批量取消延期
return emisSettleInvoiceRecordMapper.batchCancelDelayInvoice(ids);
}
} }

View File

@ -52,6 +52,10 @@
<result property="openChStatus" column="open_ch_status" /> <result property="openChStatus" column="open_ch_status" />
<result property="openChStatusDesc" column="open_ch_status_desc" /> <result property="openChStatusDesc" column="open_ch_status_desc" />
<result property="openComCode" column="open_com_code" /> <result property="openComCode" column="open_com_code" />
<result property="blDelay" column="bl_delay" />
<result property="delayOpManCode" column="delay_op_man_code" />
<result property="delayOpDate" column="delay_op_date" />
<result property="salerCompanyName" column="saler_company_name" />
<association property="applyManName" column="apply_man_code" select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectEmpNameByCode"/> <association property="applyManName" column="apply_man_code" select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectEmpNameByCode"/>
<association property="applySiteName" column="apply_site_code" select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectSiteNameByCode"/> <association property="applySiteName" column="apply_site_code" select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectSiteNameByCode"/>
@ -62,6 +66,7 @@
<association property="opManName" column="op_man_code" select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectEmpNameByCode"/> <association property="opManName" column="op_man_code" select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectEmpNameByCode"/>
<association property="opSiteName" column="op_site_code" select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectSiteNameByCode"/> <association property="opSiteName" column="op_site_code" select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectSiteNameByCode"/>
<association property="delayOpManName" column="delay_op_man_code" select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectEmpNameByCode"/>
</resultMap> </resultMap>
@ -88,12 +93,12 @@
</resultMap> </resultMap>
<sql id="selectEmisSettleInvoiceRecordVo"> <sql id="selectEmisSettleInvoiceRecordVo">
select id, apply_seq_no, apply_date, apply_man_code, apply_site_code, customer_code, customer_name, settle_bill_no, settle_bill_name, apply_money, invoice_type, openbill_scope, company_name, company_tax_no, company_tel, company_address, invioce_remark, bank_name, bank_acc_no, contact, phone, real_tax_type, orig_open_money, add_tax_rate, add_open_money, open_money_max, open_money, invoice_no, reced_money, payment_status, invoice_status, invoice_status_desc, recieve_address, email, file_path, remark, bl_audit, audit_date, audit_man_code, audit_site_code, audit_note, op_man_code, op_date, op_site_code, open_ch_id, open_ch_status, open_ch_status_desc, open_com_code, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_settle_invoice_record select id, apply_seq_no, apply_date, apply_man_code, apply_site_code, customer_code, customer_name, settle_bill_no, settle_bill_name, apply_money, invoice_type, openbill_scope, company_name, company_tax_no, company_tel, company_address, invioce_remark, bank_name, bank_acc_no, contact, phone, real_tax_type, orig_open_money, add_tax_rate, add_open_money, open_money_max, open_money, invoice_no, reced_money, payment_status, invoice_status, invoice_status_desc, recieve_address, email, file_path, remark, bl_audit, audit_date, audit_man_code, audit_site_code, audit_note, op_man_code, op_date, op_site_code, open_ch_id, open_ch_status, open_ch_status_desc, open_com_code, bl_delay, delay_op_man_code, delay_op_date, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_settle_invoice_record
</sql> </sql>
<select id="selectEmisSettleInvoiceRecordList" parameterType="EmisSettleInvoiceRecord" resultMap="EmisSettleInvoiceRecordResult"> <select id="selectEmisSettleInvoiceRecordList" parameterType="EmisSettleInvoiceRecord" resultMap="EmisSettleInvoiceRecordResult">
select a.id, a.apply_seq_no, a.apply_date, a.apply_man_code, a.apply_site_code, a.customer_code, a.customer_name, a.settle_bill_no, a.settle_bill_name, a.apply_money, a.invoice_type, a.openbill_scope, a.company_name, a.company_tax_no, a.company_tel, a.company_address, a.invioce_remark, a.bank_name, a.bank_acc_no, a.contact, a.phone, a.real_tax_type, a.orig_open_money, a.add_tax_rate, a.add_open_money, a.open_money_max, a.open_money, ch.invoice_no, a.reced_money, a.payment_status, a.invoice_status, a.invoice_status_desc, a.recieve_address, a.email, a.file_path, a.remark, a.bl_audit, a.audit_date, a.audit_man_code, a.audit_site_code, a.audit_note, a.op_man_code, a.op_date, a.op_site_code, a.open_ch_id, a.open_ch_status, a.open_ch_status_desc, a.open_com_code, a.del_flag, a.create_by, a.create_time, a.update_by, a.update_time, a.create_site, a.update_site select a.id, a.apply_seq_no, a.apply_date, a.apply_man_code, a.apply_site_code, a.customer_code, a.customer_name, a.settle_bill_no, a.settle_bill_name, a.apply_money, a.invoice_type, a.openbill_scope, a.company_name, a.company_tax_no, a.company_tel, a.company_address, a.invioce_remark, a.bank_name, a.bank_acc_no, a.contact, a.phone, a.real_tax_type, a.orig_open_money, a.add_tax_rate, a.add_open_money, a.open_money_max, a.open_money, ch.invoice_no, a.reced_money, a.payment_status, a.invoice_status, a.invoice_status_desc, a.recieve_address, a.email, a.file_path, a.remark, a.bl_audit, a.audit_date, a.audit_man_code, a.audit_site_code, a.audit_note, a.op_man_code, a.op_date, a.op_site_code, a.open_ch_id, a.open_ch_status, a.open_ch_status_desc, a.open_com_code, a.bl_delay, a.delay_op_man_code, a.delay_op_date, ch.saler_company_name, a.del_flag, a.create_by, a.create_time, a.update_by, a.update_time, a.create_site, a.update_site
from emis_settle_invoice_record a from emis_settle_invoice_record a
left join emis_settle_invoice_ch_record ch on a.apply_seq_no = ch.apply_seq_no and ch.del_flag = '0' left join emis_settle_invoice_ch_record ch on a.apply_seq_no = ch.apply_seq_no and ch.del_flag = '0'
@ -140,6 +145,8 @@
<if test="openChStatus != null and openChStatus != ''"> and a.open_ch_status = #{openChStatus}</if> <if test="openChStatus != null and openChStatus != ''"> and a.open_ch_status = #{openChStatus}</if>
<if test="openChStatusDesc != null and openChStatusDesc != ''"> and a.open_ch_status_desc = #{openChStatusDesc}</if> <if test="openChStatusDesc != null and openChStatusDesc != ''"> and a.open_ch_status_desc = #{openChStatusDesc}</if>
<if test="openComCode != null and openComCode != ''"> and a.open_com_code = #{openComCode}</if> <if test="openComCode != null and openComCode != ''"> and a.open_com_code = #{openComCode}</if>
<if test="blDelay != null and blDelay != ''"> and a.bl_delay = #{blDelay}</if>
<if test="salerCompanyName != null and salerCompanyName != ''"> and ch.saler_company_name like concat('%', #{salerCompanyName}, '%')</if>
<if test="delFlag != null and delFlag != ''"> and a.del_flag like concat('%', #{delFlag}, '%')</if> <if test="delFlag != null and delFlag != ''"> and a.del_flag like concat('%', #{delFlag}, '%')</if>
<if test="createBy != null and createBy != ''"> and a.create_by like concat('%', #{createBy}, '%')</if> <if test="createBy != null and createBy != ''"> and a.create_by like concat('%', #{createBy}, '%')</if>
<if test="createTime != null "> and a.create_time = #{createTime}</if> <if test="createTime != null "> and a.create_time = #{createTime}</if>
@ -247,16 +254,18 @@
a.open_money_max, a.open_money, ch.invoice_no, a.reced_money, a.payment_status, a.invoice_status, a.open_money_max, a.open_money, ch.invoice_no, a.reced_money, a.payment_status, a.invoice_status,
a.invoice_status_desc, a.recieve_address, a.email, a.file_path, a.remark, a.bl_audit, a.audit_date, a.invoice_status_desc, a.recieve_address, a.email, a.file_path, a.remark, a.bl_audit, a.audit_date,
a.audit_man_code, a.audit_site_code, a.audit_note, a.op_man_code, a.op_date, a.op_site_code, a.open_ch_id, a.audit_man_code, a.audit_site_code, a.audit_note, a.op_man_code, a.op_date, a.op_site_code, a.open_ch_id,
a.open_ch_status, a.open_ch_status_desc, a.open_com_code, a.del_flag, a.create_by, a.create_time, a.update_by, a.open_ch_status, a.open_ch_status_desc, a.open_com_code, a.bl_delay, a.delay_op_man_code, a.delay_op_date, ch.saler_company_name, a.del_flag, a.create_by, a.create_time, a.update_by,
a.update_time, a.create_site, a.update_site, a.update_time, a.create_site, a.update_site,
apply_user.emp_name as apply_man_name, apply_user.emp_name as apply_man_name,
audit_user.emp_name as audit_man_name, audit_user.emp_name as audit_man_name,
op_user.emp_name as op_man_name op_user.emp_name as op_man_name,
delay_op_user.emp_name as delay_op_man_name
from emis_settle_invoice_record a from emis_settle_invoice_record a
left join emis_settle_invoice_ch_record ch on a.apply_seq_no = ch.apply_seq_no and ch.del_flag = '0' left join emis_settle_invoice_ch_record ch on a.apply_seq_no = ch.apply_seq_no and ch.del_flag = '0'
left join sys_user apply_user on a.apply_man_code = apply_user.emp_code left join sys_user apply_user on a.apply_man_code = apply_user.emp_code
left join sys_user audit_user on a.audit_man_code = audit_user.emp_code left join sys_user audit_user on a.audit_man_code = audit_user.emp_code
left join sys_user op_user on a.op_man_code = op_user.emp_code left join sys_user op_user on a.op_man_code = op_user.emp_code
left join sys_user delay_op_user on a.delay_op_man_code = delay_op_user.emp_code
<where> <where>
a.del_flag='0' a.del_flag='0'
<if test="id != null "> and a.id = #{id}</if> <if test="id != null "> and a.id = #{id}</if>
@ -299,6 +308,8 @@
<if test="openChStatus != null and openChStatus != ''"> and a.open_ch_status = #{openChStatus}</if> <if test="openChStatus != null and openChStatus != ''"> and a.open_ch_status = #{openChStatus}</if>
<if test="openChStatusDesc != null and openChStatusDesc != ''"> and a.open_ch_status_desc = #{openChStatusDesc}</if> <if test="openChStatusDesc != null and openChStatusDesc != ''"> and a.open_ch_status_desc = #{openChStatusDesc}</if>
<if test="openComCode != null and openComCode != ''"> and a.open_com_code = #{openComCode}</if> <if test="openComCode != null and openComCode != ''"> and a.open_com_code = #{openComCode}</if>
<if test="blDelay != null and blDelay != ''"> and a.bl_delay = #{blDelay}</if>
<if test="salerCompanyName != null and salerCompanyName != ''"> and ch.saler_company_name like concat('%', #{salerCompanyName}, '%')</if>
<if test="delFlag != null and delFlag != ''"> and a.del_flag like concat('%', #{delFlag}, '%')</if> <if test="delFlag != null and delFlag != ''"> and a.del_flag like concat('%', #{delFlag}, '%')</if>
<if test="createBy != null and createBy != ''"> and a.create_by like concat('%', #{createBy}, '%')</if> <if test="createBy != null and createBy != ''"> and a.create_by like concat('%', #{createBy}, '%')</if>
<if test="createTime != null "> and a.create_time = #{createTime}</if> <if test="createTime != null "> and a.create_time = #{createTime}</if>
@ -362,19 +373,19 @@
</select> </select>
<select id="selectInvoiceRecordListBySettleBillNo" parameterType="String" resultMap="EmisSettleInvoiceRecordResult"> <select id="selectInvoiceRecordListBySettleBillNo" parameterType="String" resultMap="EmisSettleInvoiceRecordResult">
select id, apply_seq_no, apply_date, apply_man_code, apply_site_code, customer_code, customer_name, settle_bill_no, settle_bill_name, apply_money, invoice_type, company_name, company_tax_no, company_tel, company_address, bank_name, bank_acc_no, contact, phone, real_tax_type, open_money_max, open_money, invoice_no, invoice_status, invoice_status_desc, recieve_address, email, file_path, remark, bl_audit, audit_date, audit_man_code, audit_site_code, audit_note, op_man_code, op_date, op_site_code, open_ch_id, open_ch_status, open_ch_status_desc, open_com_code, del_flag, create_by, create_time, update_by, update_time, create_site, update_site select id, apply_seq_no, apply_date, apply_man_code, apply_site_code, customer_code, customer_name, settle_bill_no, settle_bill_name, apply_money, invoice_type, company_name, company_tax_no, company_tel, company_address, bank_name, bank_acc_no, contact, phone, real_tax_type, open_money_max, open_money, invoice_no, invoice_status, invoice_status_desc, recieve_address, email, file_path, remark, bl_audit, audit_date, audit_man_code, audit_site_code, audit_note, op_man_code, op_date, op_site_code, open_ch_id, open_ch_status, open_ch_status_desc, open_com_code, bl_delay, delay_op_man_code, delay_op_date, del_flag, create_by, create_time, update_by, update_time, create_site, update_site
from emis_settle_invoice_record a from emis_settle_invoice_record a
where del_flag = '0' and FIND_IN_SET( a.settle_bill_no,#{settleBillNo} ) where del_flag = '0' and FIND_IN_SET( a.settle_bill_no,#{settleBillNo} )
</select> </select>
<select id="selectInvoiceRecordByApplySeqNo" parameterType="String" resultMap="EmisSettleInvoiceRecordResult"> <select id="selectInvoiceRecordByApplySeqNo" parameterType="String" resultMap="EmisSettleInvoiceRecordResult">
select id, apply_seq_no, apply_date, apply_man_code, apply_site_code, customer_code, customer_name, settle_bill_no, settle_bill_name, apply_money, invoice_type, company_name, company_tax_no, company_tel, company_address, bank_name, bank_acc_no, contact, phone, real_tax_type, open_money_max, open_money,reced_money, invoice_no, invoice_status, invoice_status_desc, recieve_address, email, file_path, remark, bl_audit, audit_date, audit_man_code, audit_site_code, audit_note, op_man_code, op_date, op_site_code, open_ch_id, open_ch_status, open_ch_status_desc, open_com_code, del_flag, create_by, create_time, update_by, update_time, create_site, update_site select id, apply_seq_no, apply_date, apply_man_code, apply_site_code, customer_code, customer_name, settle_bill_no, settle_bill_name, apply_money, invoice_type, company_name, company_tax_no, company_tel, company_address, bank_name, bank_acc_no, contact, phone, real_tax_type, open_money_max, open_money,reced_money, invoice_no, invoice_status, invoice_status_desc, recieve_address, email, file_path, remark, bl_audit, audit_date, audit_man_code, audit_site_code, audit_note, op_man_code, op_date, op_site_code, open_ch_id, open_ch_status, open_ch_status_desc, open_com_code, bl_delay, delay_op_man_code, delay_op_date, del_flag, create_by, create_time, update_by, update_time, create_site, update_site
from emis_settle_invoice_record a from emis_settle_invoice_record a
where a.apply_seq_no = #{applySeqNo} where a.apply_seq_no = #{applySeqNo}
</select> </select>
<select id="selectInvoiceRecordListByBillCodes" parameterType="java.util.List" resultMap="EmisSettleInvoiceRecordResult"> <select id="selectInvoiceRecordListByBillCodes" parameterType="java.util.List" resultMap="EmisSettleInvoiceRecordResult">
select distinct a.id, a.apply_seq_no, a.apply_date, a.apply_man_code, a.apply_site_code, a.customer_code, a.customer_name, a.settle_bill_no, a.settle_bill_name, a.apply_money, a.invoice_type, a.openbill_scope, a.company_name, a.company_tax_no, a.company_tel, a.company_address, a.invioce_remark, a.bank_name, a.bank_acc_no, a.contact, a.phone, a.real_tax_type, a.orig_open_money, a.add_tax_rate, a.add_open_money, a.open_money_max, a.open_money, ch.invoice_no, a.reced_money, a.payment_status, a.invoice_status, a.invoice_status_desc, a.recieve_address, a.email, a.file_path, a.remark, a.bl_audit, a.audit_date, a.audit_man_code, a.audit_site_code, a.audit_note, a.op_man_code, a.op_date, a.op_site_code, a.open_ch_id, a.open_ch_status, a.open_ch_status_desc, a.open_com_code, a.del_flag, a.create_by, a.create_time, a.update_by, a.update_time, a.create_site, a.update_site select distinct a.id, a.apply_seq_no, a.apply_date, a.apply_man_code, a.apply_site_code, a.customer_code, a.customer_name, a.settle_bill_no, a.settle_bill_name, a.apply_money, a.invoice_type, a.openbill_scope, a.company_name, a.company_tax_no, a.company_tel, a.company_address, a.invioce_remark, a.bank_name, a.bank_acc_no, a.contact, a.phone, a.real_tax_type, a.orig_open_money, a.add_tax_rate, a.add_open_money, a.open_money_max, a.open_money, ch.invoice_no, a.reced_money, a.payment_status, a.invoice_status, a.invoice_status_desc, a.recieve_address, a.email, a.file_path, a.remark, a.bl_audit, a.audit_date, a.audit_man_code, a.audit_site_code, a.audit_note, a.op_man_code, a.op_date, a.op_site_code, a.open_ch_id, a.open_ch_status, a.open_ch_status_desc, a.open_com_code, a.bl_delay, a.delay_op_man_code, a.delay_op_date, ch.saler_company_name, a.del_flag, a.create_by, a.create_time, a.update_by, a.update_time, a.create_site, a.update_site
from emis_settle_invoice_record a from emis_settle_invoice_record a
left join emis_settle_invoice_ch_record ch on a.apply_seq_no = ch.apply_seq_no and ch.del_flag = '0' left join emis_settle_invoice_ch_record ch on a.apply_seq_no = ch.apply_seq_no and ch.del_flag = '0'
where a.del_flag = '0' where a.del_flag = '0'
@ -459,8 +470,9 @@
</select> </select>
<select id="selectEmisSettleInvoiceRecordById" parameterType="Long" resultMap="EmisSettleInvoiceRecordResult"> <select id="selectEmisSettleInvoiceRecordById" parameterType="Long" resultMap="EmisSettleInvoiceRecordResult">
select id, apply_seq_no, apply_date, apply_man_code, apply_site_code, customer_code, customer_name, settle_bill_no, settle_bill_name, apply_money, invoice_type, openbill_scope, company_name, company_tax_no, company_tel, company_address, invioce_remark, bank_name, bank_acc_no, contact, phone, real_tax_type, orig_open_money, add_tax_rate, add_open_money, open_money_max, open_money, invoice_no, invoice_status, invoice_status_desc, recieve_address, email, file_path, remark, bl_audit, audit_date, audit_man_code, audit_site_code, audit_note, op_man_code, op_date, op_site_code, open_ch_id, open_ch_status, open_ch_status_desc, open_com_code, del_flag, create_by, create_time, update_by, update_time, create_site, update_site select a.id, a.apply_seq_no, a.apply_date, a.apply_man_code, a.apply_site_code, a.customer_code, a.customer_name, a.settle_bill_no, a.settle_bill_name, a.apply_money, a.invoice_type, a.openbill_scope, a.company_name, a.company_tax_no, a.company_tel, a.company_address, a.invioce_remark, a.bank_name, a.bank_acc_no, a.contact, a.phone, a.real_tax_type, a.orig_open_money, a.add_tax_rate, a.add_open_money, a.open_money_max, a.open_money, a.invoice_no, a.invoice_status, a.invoice_status_desc, a.recieve_address, a.email, a.file_path, a.remark, a.bl_audit, a.audit_date, a.audit_man_code, a.audit_site_code, a.audit_note, a.op_man_code, a.op_date, a.op_site_code, a.open_ch_id, a.open_ch_status, a.open_ch_status_desc, a.open_com_code, a.bl_delay, a.delay_op_man_code, a.delay_op_date, ch.saler_company_name, a.del_flag, a.create_by, a.create_time, a.update_by, a.update_time, a.create_site, a.update_site
from emis_settle_invoice_record a from emis_settle_invoice_record a
left join emis_settle_invoice_ch_record ch on a.apply_seq_no = ch.apply_seq_no and ch.del_flag = '0'
where a.id = #{id} where a.id = #{id}
</select> </select>
@ -512,6 +524,9 @@
<if test="openChStatus != null and openChStatus != ''">open_ch_status,</if> <if test="openChStatus != null and openChStatus != ''">open_ch_status,</if>
<if test="openChStatusDesc != null and openChStatusDesc != ''">open_ch_status_desc,</if> <if test="openChStatusDesc != null and openChStatusDesc != ''">open_ch_status_desc,</if>
<if test="openComCode != null and openComCode != ''">open_com_code,</if> <if test="openComCode != null and openComCode != ''">open_com_code,</if>
<if test="blDelay != null and blDelay != ''">bl_delay,</if>
<if test="delayOpManCode != null and delayOpManCode != ''">delay_op_man_code,</if>
<if test="delayOpDate != null">delay_op_date,</if>
<if test="delFlag != null and delFlag != ''">del_flag,</if> <if test="delFlag != null and delFlag != ''">del_flag,</if>
<if test="createBy != null and createBy != ''">create_by,</if> <if test="createBy != null and createBy != ''">create_by,</if>
<if test="createTime != null">create_time,</if> <if test="createTime != null">create_time,</if>
@ -568,6 +583,9 @@
<if test="openChStatus != null and openChStatus != ''">#{openChStatus},</if> <if test="openChStatus != null and openChStatus != ''">#{openChStatus},</if>
<if test="openChStatusDesc != null and openChStatusDesc != ''">#{openChStatusDesc},</if> <if test="openChStatusDesc != null and openChStatusDesc != ''">#{openChStatusDesc},</if>
<if test="openComCode != null and openComCode != ''">#{openComCode},</if> <if test="openComCode != null and openComCode != ''">#{openComCode},</if>
<if test="blDelay != null and blDelay != ''">#{blDelay},</if>
<if test="delayOpManCode != null and delayOpManCode != ''">#{delayOpManCode},</if>
<if test="delayOpDate != null">#{delayOpDate},</if>
<if test="delFlag != null and delFlag != ''">#{delFlag},</if> <if test="delFlag != null and delFlag != ''">#{delFlag},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if> <if test="createBy != null and createBy != ''">#{createBy},</if>
<if test="createTime != null">#{createTime},</if> <if test="createTime != null">#{createTime},</if>
@ -637,6 +655,9 @@
<if test="openChStatus != null and openChStatus != ''">open_ch_status = #{openChStatus},</if> <if test="openChStatus != null and openChStatus != ''">open_ch_status = #{openChStatus},</if>
<if test="openChStatusDesc != null and openChStatusDesc != ''">open_ch_status_desc = #{openChStatusDesc},</if> <if test="openChStatusDesc != null and openChStatusDesc != ''">open_ch_status_desc = #{openChStatusDesc},</if>
<if test="openComCode != null and openComCode != ''">open_com_code = #{openComCode},</if> <if test="openComCode != null and openComCode != ''">open_com_code = #{openComCode},</if>
<if test="blDelay != null and blDelay != ''">bl_delay = #{blDelay},</if>
<if test="delayOpManCode != null and delayOpManCode != ''">delay_op_man_code = #{delayOpManCode},</if>
<if test="delayOpDate != null">delay_op_date = #{delayOpDate},</if>
<if test="delFlag != null and delFlag != ''">del_flag = #{delFlag},</if> <if test="delFlag != null and delFlag != ''">del_flag = #{delFlag},</if>
<if test="createBy != null and createBy != ''">create_by = #{createBy},</if> <if test="createBy != null and createBy != ''">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if> <if test="createTime != null">create_time = #{createTime},</if>
@ -686,4 +707,31 @@
#{id} #{id}
</foreach> </foreach>
</delete> </delete>
<!-- 批量发票延期 -->
<update id="batchDelayInvoice" parameterType="map">
update emis_settle_invoice_record
set bl_delay = '1',
delay_op_man_code = #{delayOpManCode},
delay_op_date = now()
where id in
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
and invoice_status = '0'
and (bl_delay is null or bl_delay = '0')
</update>
<!-- 批量取消发票延期 -->
<update id="batchCancelDelayInvoice" parameterType="map">
update emis_settle_invoice_record
set bl_delay = '0',
delay_op_man_code = null,
delay_op_date = null
where id in
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
and bl_delay = '1'
</update>
</mapper> </mapper>

View File

@ -79,6 +79,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) )
</select> </select>
<select id="selectHasPayListBySettleBillNoList" parameterType="List" resultMap="EmisSettlePayRelWithSubBillResult">
select distinct a.id, a.pay_id, a.bill_no, a.pay_money, a.del_flag, a.create_by, a.create_time,
a.update_by, a.update_time, a.create_site, a.update_site
from emis_settle_pay_rel a
inner join emis_settle_pay_record b on a.pay_id = b.pay_id and b.del_flag = '0'
inner join emis_settle_pay_bill_rel espbr on a.pay_id = espbr.pay_id and espbr.del_flag = '0'
inner join emis_settle_sub_bill essb on a.bill_no = essb.bill_no and essb.del_flag = '0'
where a.del_flag = '0'
<if test="settleBillNoList != null and settleBillNoList.size() > 0">
and espbr.settle_bill_no in
<foreach item="settleBillNo" collection="settleBillNoList" open="(" separator="," close=")">
#{settleBillNo}
</foreach>
and essb.settle_bill_no in
<foreach item="settleBillNo" collection="settleBillNoList" open="(" separator="," close=")">
#{settleBillNo}
</foreach>
</if>
</select>
<select id="selectHasPayMapList" parameterType="String" resultType="map"> <select id="selectHasPayMapList" parameterType="String" resultType="map">
select a.bill_no as billNo, sum(a.pay_money) sumMoney select a.bill_no as billNo, sum(a.pay_money) sumMoney