一、需求建立
爲了避免用戶在短時間內重複建單的操作繁瑣,隨即就衍生出了一個單據複製的功能,一件複製單據能夠有效的提升用戶的體驗,也避免了在使用報銷系統時需要重複填寫信息而造成時間上的浪費,用戶體驗不好。
二、實現
思路: 根據頭行信息,再來新建一個投行信息,但是id不能重複,數據進入到表中的唯一性不能被打破。數據進入到表中後,就可以根據對象獲取到新生成的id, 同時可以作爲另外一個表的外鍵。
public List<String> copyReport(List<Long> ids) {
//1.根據id判斷該單據類型是否爲佣金手續費報賬單
//2. 生成報賬單頭
List<ExpenseReportHeader> headers=baseMapper.selectBatchIds(ids);
List<String> documents=new ArrayList<>();
//分攤行
List<ExpenseReportDist> reportDists=new ArrayList<>();
//計劃付款行
List<ExpenseReportPaymentSchedule> reportPaymentSchedules=new ArrayList<>();
for (ExpenseReportHeader e: headers){
String requisitionNumber=commonService.getCoding(DocumentTypeEnum.PUBLIC_REPORT.getCategory(), e.getCompanyId(), null);
documents.add(requisitionNumber);
Long headerId=e.getId();
List<ExpenseReportLine> lines=expenseReportLineService.selectList(new EntityWrapper<ExpenseReportLine>().eq("exp_report_header_id",headerId));
List<ExpenseReportDist> dists=expenseReportDistService.selectList(new EntityWrapper<ExpenseReportDist>().eq("exp_report_header_id",headerId));
List<ExpenseReportPaymentSchedule> paymentSchedules=expenseReportPaymentScheduleService.selectList(new EntityWrapper<ExpenseReportPaymentSchedule>().eq("exp_report_header_id",headerId));
e.setId(null);
e.setRequisitionNumber(requisitionNumber);
e.setVersionNumber(1);
e.setStatus(DocumentOperationEnum.GENERATE.getId());
e.setDocumentOid(UUID.randomUUID().toString());
e.setRequisitionDate(ZonedDateTime.now());
e.setCreatedDate(ZonedDateTime.now());
insert(e);
//3. 生成報賬單行,最主要的是要將行表和頭表關聯起來
ExpenseReportHeader temp=selectOne(new EntityWrapper<ExpenseReportHeader>().eq("requisition_number",requisitionNumber));
Long newHeaderId=temp.getId();
for (ExpenseReportLine f: lines){
Long lineId=f.getId();
//生成費用行
f.setId(null);
f.setVersionNumber(1);
f.setExpReportHeaderId(newHeaderId);
f.setAmount(BigDecimal.ZERO);
f.setFunctionAmount(BigDecimal.ZERO);
expenseReportLineService.insert(f);
// 生成分攤行
ExpenseReportLine newLine=expenseReportLineService.selectOne(new EntityWrapper<ExpenseReportLine>().eq("exp_report_header_id",newHeaderId));
for (ExpenseReportDist g:dists){
if (lineId.equals(g.getExpReportLineId())){
g.setId(null);
g.setVersionNumber(1);
g.setExpReportHeaderId(newHeaderId);
g.setExpReportLineId(newLine.getId());
reportDists.add(g);
break;
}
}
}
//4. 生成計劃付款行
for (ExpenseReportPaymentSchedule g: paymentSchedules){
g.setId(null);
g.setVersionNumber(1);
g.setAmount(BigDecimal.ZERO);
g.setFunctionAmount(BigDecimal.ZERO);
g.setExpReportHeaderId(newHeaderId);
reportPaymentSchedules.add(g);
}
}
expenseReportPaymentScheduleService.insertBatch(reportPaymentSchedules);
expenseReportDistService.insertBatch(reportDists);
return documents;
}