diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java index da908ddf6..a99c56d42 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java @@ -536,7 +536,12 @@ public interface WlhyServiceFeign { */ @PostMapping("/feign/order/add") public AjaxResult add(@RequestBody TmsOrderAddDTO tmsOrderAddDTO); - + /** + * 修改运单(OMS调整业务单后同步修改TMS订单) + * @param tmsOrderAddDTO 需携带 TMS 订单 id 定位 + */ + @PostMapping("/feign/order/update") + public AjaxResult update(@RequestBody TmsOrderAddDTO tmsOrderAddDTO); @GetMapping("/feign/order/cancelIssueDocuments") public AjaxResult cancelIssueDocuments(@RequestParam(name="executeOrderId") String executeOrderId); diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java index 7b401a6ad..9c3a362a2 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java @@ -546,6 +546,11 @@ public class RemoteWlhyFallbackFactory implements FallbackFactory formMap = BeanUtil.beanToMap(addReq); HttpResponse response = HttpRequest.post(url) - .header("Cookie", cookie) + .header("Authorization", cookie) .form(formMap) .execute(); int status = response.getStatus(); log.info("[XxlJob] addJob status:{}", status); // 新增成功200重定向到列表页 - return status == 200; + return status == 200 || status == 302; } catch (Exception e) { log.error("[XxlJob] addJob异常", e); return false; @@ -128,10 +128,10 @@ public class XxlJobOpenApiUtil { String url = adminUrl + "/jobinfo/pause"; try { HttpResponse response = HttpRequest.post(url) - .header("Cookie", cookie) + .header("Authorization", cookie) .form("id", jobId) .execute(); - return response.getStatus() == 200; + return response.getStatus() == 200 || response.getStatus() == 302; } catch (Exception e) { log.error("[XxlJob] pauseJob jobId:{}异常", jobId, e); return false; @@ -150,10 +150,10 @@ public class XxlJobOpenApiUtil { String url = adminUrl + "/jobinfo/start"; try { HttpResponse response = HttpRequest.post(url) - .header("Cookie", cookie) + .header("Authorization", cookie) .form("id", jobId) .execute(); - return response.getStatus() == 200; + return response.getStatus() == 200 || response.getStatus() == 302; } catch (Exception e) { log.error("[XxlJob] startJob jobId:{}异常", jobId, e); return false; @@ -172,10 +172,10 @@ public class XxlJobOpenApiUtil { String url = adminUrl + "/jobinfo/remove"; try { HttpResponse response = HttpRequest.post(url) - .header("Cookie", cookie) + .header("Authorization", cookie) .form("id", jobId) .execute(); - return response.getStatus() == 200; + return response.getStatus() == 200 || response.getStatus() == 302; } catch (Exception e) { log.error("[XxlJob] removeJob jobId:{}异常", jobId, e); return false; diff --git a/mhd_bms/src/main/java/com/mhd/bms/application/server/billManage/BillManageApplicationService.java b/mhd_bms/src/main/java/com/mhd/bms/application/server/billManage/BillManageApplicationService.java index f44c3a311..229e5dec5 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/application/server/billManage/BillManageApplicationService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/application/server/billManage/BillManageApplicationService.java @@ -33,6 +33,7 @@ import com.mhd.bms.infrastructure.constant.BillLogsConstants; import com.mhd.bms.interfaces.assembler.billManage.BillManageAssembler; import com.mhd.bms.interfaces.dto.billManage.BillDetailDTO; import com.mhd.bms.interfaces.dto.billManage.BillManageDTO; +import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO; import com.mhd.bms.interfaces.dto.billingStatement.BillingStatementDTO; import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException; @@ -138,6 +139,74 @@ public class BillManageApplicationService { String billNumber = billManagePO.getBillNumber(); // 获取账单编号 // 原有 - 前端列表用,不变 List billDetails = billDetailMapper.selectList(new LambdaQueryWrapper().eq(BillDetail::getBillNumber, billNumber)); + BigDecimal totalTaxAmount = billDetails.stream().map(BillDetail::getTaxAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalTaxFreeFee = billDetails.stream().map(BillDetail::getTaxFreeFee).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + billManagePO.setTaxAmount(totalTaxAmount); + billManagePO.setTaxFreeFee(totalTaxFreeFee); + billManagePO.setBillDetailList(billDetails); + // 新增 - 导出用,LEFT JOIN billing_statement 拿到费用科目 + List billDetailPOs = billDetailMapper.getDetailsByBillManageId(billManagePO.getBillManageId()); + billManagePO.setBillDetailPOList(billDetailPOs); + } + return billManagePOS; + } + + public List customerMonthlyReport(BillManageDO billManageDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long userOrganizationId = loginUser.getUserPo().getOrganizationId(); + Long frontendOrganizationId = billManageDO.getOrganizationId(); // 前端传递的 organizationId + + // 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己 + if (userOrganizationId != null && userOrganizationId == 2827L) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + billManageDO.setOrganizationId(frontendOrganizationId); + billManageDO.setTopOrganizationId(null); // 明确设置为 null,避免使用 topOrganizationId 条件 + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + billManageDO.setOrganizationId(null); + billManageDO.setTopOrganizationId(null); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + // 如果前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (frontendOrganizationId != null && userOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (!frontendOrganizationId.equals(userOrganizationId)) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + billManageDO.setOrganizationId(userOrganizationId); + } + // 如果前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值 + } else { + // 前端没有传递 organizationId,使用当前登录用户的组织ID + if (userOrganizationId != null) { + billManageDO.setOrganizationId(userOrganizationId); + } + } + // 如果 organizationId 不为 null,则优先使用 organizationId,不使用 topOrganizationId + if (billManageDO.getOrganizationId() == null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + billManageDO.setTopOrganizationId(topOrganizationId); + } + } else { + // 对于非2827组织,必须设置 topOrganizationId=2827 + billManageDO.setTopOrganizationId(2827L); + } + } + } + List billManagePOS = billManageDomainService.customerMonthlyReport(billManageDO); + for (BillManagePO billManagePO : billManagePOS) { + String billNumber = billManagePO.getBillNumber(); // 获取账单编号 + // 原有 - 前端列表用,不变 + List billDetails = billDetailMapper.selectList(new LambdaQueryWrapper().eq(BillDetail::getBillNumber, billNumber)); + BigDecimal totalTaxAmount = billDetails.stream().map(BillDetail::getTaxAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalTaxFreeFee = billDetails.stream().map(BillDetail::getTaxFreeFee).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + billManagePO.setTaxAmount(totalTaxAmount); + billManagePO.setTaxFreeFee(totalTaxFreeFee); + billManagePO.setBillDetailList(billDetails); // 新增 - 导出用,LEFT JOIN billing_statement 拿到费用科目 List billDetailPOs = billDetailMapper.getDetailsByBillManageId(billManagePO.getBillManageId()); @@ -184,6 +253,10 @@ public class BillManageApplicationService { return billManageDomainService.save(billingStatementDTO); } + public Boolean saveBillJob(BillingStatementDTO billingStatementDTO) { + return billManageDomainService.saveJob(billingStatementDTO); + } + /** * 批量删除账单管理 */ @@ -287,6 +360,28 @@ public class BillManageApplicationService { return billManageDomainService.confirmBilling(billManageDO); } + @Transactional + public Boolean confirmBillingJob(BillManageDTO billManageDTO) { + //确认账单:未收款状态之前都可以进行确认账单,跳过核账流程,直接到未收款状态 + if(!StringUtils.isNotEmpty(billManageDTO.getBillManageIds())){ + throw new ServiceException("账单管理ids不能为空"); + } + //校验 + Set billManageIds = Stream.of(billManageDTO.getBillManageIds().split(",")).collect(Collectors.toSet()); + BillManageDO billManageDO = new BillManageDO(); + billManageDO.setBillManageIdSet(billManageIds); + List billManageList = billManageDomainService.queryList(billManageDO); + for (BillManagePO billManage : billManageList) { + if(billManage.getBillState() > 2){ + throw new ServiceException("选中数据"+ billManage.getBillNumber() + "状态不可操作确认账单"); + } + } + billManageDO.setOrganizationId(billManageDTO.getOrganizationId()); + billManageDO.setOrganizationName(billManageDTO.getOrganizationName()); + billManageDO.setTopOrganizationId(billManageDTO.getTopOrganizationId()); + return billManageDomainService.confirmBillingJob(billManageDO); + } + public int editIsInvoice(String billNumber, Integer isInvoice, String invoiceId, String invoiceMakeTime,String applyNumber) { @@ -621,6 +716,22 @@ public class BillManageApplicationService { return originalBill; } + + /** + * 应收账单-红冲 + */ + @Transactional + public Boolean redFlushBill(BillManageDTO billManageDTO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + if (StringUtils.isEmpty(billManageDTO.getBillManageIds())) { + throw new ServiceException("账单id不能为空"); + } + return billManageDomainService.redFlushBill(billManageDTO); + } + /** * 应收账单-客户确认 */ @@ -872,5 +983,66 @@ public class BillManageApplicationService { return flag && flagTwo; } + /** + * 客户每月账单分组查询 + */ + public List queryCustomerMonthBillList(BillManageDO billManageDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long userOrganizationId = loginUser.getUserPo().getOrganizationId(); + Long frontendOrganizationId = billManageDO.getOrganizationId(); + if (userOrganizationId != null && userOrganizationId == 2827L) { + if (frontendOrganizationId != null) { + billManageDO.setOrganizationId(frontendOrganizationId); + billManageDO.setTopOrganizationId(null); + } else { + billManageDO.setOrganizationId(null); + billManageDO.setTopOrganizationId(null); + } + } else { + if (frontendOrganizationId != null && userOrganizationId != null) { + if (!frontendOrganizationId.equals(userOrganizationId)) { + billManageDO.setOrganizationId(userOrganizationId); + } + } else { + if (userOrganizationId != null) { + billManageDO.setOrganizationId(userOrganizationId); + } + } + if (billManageDO.getOrganizationId() == null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + billManageDO.setTopOrganizationId(topOrganizationId); + } + } else { + billManageDO.setTopOrganizationId(2827L); + } + } + } + + List list = billManageDomainService.queryCustomerMonthBillList(billManageDO); + + // 计算付款状态 + for (CustomerMonthBillVO vo : list) { + BigDecimal totalAmount = vo.getTotalBillAmount() != null ? vo.getTotalBillAmount() : BigDecimal.ZERO; + BigDecimal settledAmount = vo.getTotalSettledAmount() != null ? vo.getTotalSettledAmount() : BigDecimal.ZERO; + + if (totalAmount.compareTo(BigDecimal.ZERO) == 0) { + vo.setPaymentStatus(3); + vo.setPaymentStatusName("已付款"); + } else if (settledAmount.compareTo(BigDecimal.ZERO) == 0) { + vo.setPaymentStatus(1); + vo.setPaymentStatusName("未付款"); + } else if (settledAmount.compareTo(totalAmount) >= 0) { + vo.setPaymentStatus(3); + vo.setPaymentStatusName("已付款"); + } else { + vo.setPaymentStatus(2); + vo.setPaymentStatusName("部分付款"); + } + } + + return list; + } } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/application/server/billingStatement/BillingStatementApplicationService.java b/mhd_bms/src/main/java/com/mhd/bms/application/server/billingStatement/BillingStatementApplicationService.java index e31712d19..36976bb93 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/application/server/billingStatement/BillingStatementApplicationService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/application/server/billingStatement/BillingStatementApplicationService.java @@ -5,6 +5,10 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.mhd.bms.application.server.billManage.BillManageApplicationService; +import com.mhd.bms.domain.billManage.entity.BillDetail; +import com.mhd.bms.domain.billManage.entity.BillManage; +import com.mhd.bms.domain.billManage.repository.facade.IBillDetailService; +import com.mhd.bms.domain.billManage.repository.facade.IBillManageService; import com.mhd.bms.domain.billManage.repository.po.BillManagePO; import com.mhd.bms.domain.billManage.service.BillManageDomainService; import com.mhd.bms.domain.billingStatement.entity.BillingStatement; @@ -16,6 +20,10 @@ import com.mhd.bms.domain.billingStatement.repository.po.BillingStatementPO; import com.mhd.bms.domain.billingStatement.repository.todo.BillingStatementCollectDO; import com.mhd.bms.domain.billingStatement.repository.todo.BillingStatementDO; import com.mhd.bms.domain.billingStatement.service.BillingStatementDomainService; +import com.mhd.bms.domain.bmsInvoiceList.repository.facade.IBmsInvoiceListService; +import com.mhd.bms.domain.bmsInvoiceList.repository.todo.BmsInvoiceListAddDTO; +import com.mhd.bms.domain.bmsMakeOutInvoice.entity.BmsMakeOutInvoice; +import com.mhd.bms.domain.bmsMakeOutInvoiceItem.entity.BmsMakeOutInvoiceItem; import com.mhd.bms.domain.businessDocument.entity.BusinessDocument; import com.mhd.bms.domain.businessDocument.repository.facade.IBusinessDocumentService; import com.mhd.bms.domain.businessDocument.repository.po.BusinessDocumentPO; @@ -27,6 +35,7 @@ import com.mhd.bms.domain.settlementCustomersParameters.repository.mapper.Settle import com.mhd.bms.infrastructure.feign.vo.ContractManagePO; import com.mhd.bms.infrastructure.feign.vo.ExpenseAccountPO; import com.mhd.bms.interfaces.assembler.billingStatement.BillingStatementAssembler; +import com.mhd.bms.interfaces.dto.billManage.BillManageDTO; import com.mhd.bms.interfaces.dto.billingStatement.BillingStatementDTO; import com.mhd.common.core.domain.po.OrganizationPo; import com.mhd.common.core.domain.po.SysDictDataVo; @@ -85,7 +94,12 @@ public class BillingStatementApplicationService { private SettlementCustomersMapper settlementCustomersMapper; @Autowired private SettlementCustomersParametersMapper settlementCustomersParametersMapper; - + @Autowired + private IBmsInvoiceListService bmsInvoiceListService; + @Autowired + private IBillManageService billManageService; + @Autowired + private IBillDetailService billDetailService; /** * 分页查询计费流水列表 @@ -398,7 +412,15 @@ public class BillingStatementApplicationService { if (!StringUtils.isNotEmpty(billingStatementDTO.getBillingStatementIds())) { throw new ServiceException("所选审核对象不能为空"); } - billingStatementDomainService.reviewBilling(billingStatementDTO); + billingStatementDomainService.reviewBillingJob(billingStatementDTO); + } + + @Transactional + public void reviewBillingJob(BillingStatementDTO billingStatementDTO) { + if (!StringUtils.isNotEmpty(billingStatementDTO.getBillingStatementIds())) { + throw new ServiceException("所选审核对象不能为空"); + } + billingStatementDomainService.reviewBillingJob(billingStatementDTO); } @@ -444,6 +466,32 @@ public class BillingStatementApplicationService { } + @Transactional + public Boolean generateBillsJob(BillingStatementDTO billingStatementDTO) { + //获取当前登录用户信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { +// throw new DigitalLogisticsException(UserError.TIMEOUT); + } + /* + 首先对账单主体、来源系统、账单类型、组织进行唯一校验 + 对要生成账单的流水加锁 + 然后判断流水状态是否满足生成账单需求 + 最后生成账单 + */ + billingStatementDomainService.checkUniqueEntity(billingStatementDTO.getBillingStatementIds()); + //校验完成后,生成账单 + Boolean flag1 = billManageApplicationService.saveBillJob(billingStatementDTO); + //修改流水状态 + billingStatementDTO.setBillingState(3); + Boolean flag2 = billingStatementDomainService.updateBillingStateJob(billingStatementDTO); + if (flag1 && flag2) { + return true; + } else { + throw new ServiceException("生成账单失败"); + } + } + /** * 批量流水作废 */ @@ -663,7 +711,7 @@ public class BillingStatementApplicationService { } Long settlementCustomersId = settlementCustomers.getSettlementCustomersId(); SettlementCustomersParameters settlementCustomersParameters = settlementCustomersParametersMapper.selectOne(new LambdaQueryWrapper() - .eq(SettlementCustomersParameters::getSettlementEntityId, settlementCustomersId) + .eq(SettlementCustomersParameters::getSettlementCustomersId, settlementCustomersId) .eq(SettlementCustomersParameters::getParametersName, "干仓计费配置")); if (ObjectUtil.isNull(settlementCustomersParameters)) { //结算对象未配置参数 @@ -676,7 +724,11 @@ public class BillingStatementApplicationService { //附加费用开票策略 String fjfykpcl = (String) contentMap.get("fjfykpcl"); //合并开票 - Integer hbcp = (Integer) contentMap.get("hbcp"); + Integer hbcp = null; + Object val = contentMap.get("hbcp"); + if(val != null){ + hbcp = val instanceof Integer ? (Integer) val : Integer.valueOf(((String)val).trim()); + } Boolean isMerge = false; if (hbcp == 1) { //判断是否合并开票 @@ -703,13 +755,67 @@ public class BillingStatementApplicationService { } } } + public void pushBillManageDC(String shipperId) { + SettlementCustomers settlementCustomers = settlementCustomersMapper.selectOne(new LambdaQueryWrapper() + .eq(SettlementCustomers::getSettlementEntityId, shipperId) + .eq(SettlementCustomers::getDelFlag, 1)); + if (ObjectUtil.isNull(settlementCustomers)) { + //未找到结算对象 + return; + } + Long settlementCustomersId = settlementCustomers.getSettlementCustomersId(); + SettlementCustomersParameters settlementCustomersParameters = settlementCustomersParametersMapper.selectOne(new LambdaQueryWrapper() + .eq(SettlementCustomersParameters::getSettlementCustomersId, settlementCustomersId) + .eq(SettlementCustomersParameters::getParametersName, "冻仓计费配置")); + if (ObjectUtil.isNull(settlementCustomersParameters)) { + //结算对象未配置参数 + return; + } + String content = settlementCustomersParameters.getContent(); + Map contentMap = JSON.parseObject(content, Map.class); + //主费用开票策略 + String zfycl = (String) contentMap.get("zfycl"); + //附加费用开票策略 + String fjfykpcl = (String) contentMap.get("fjfykpcl"); + //合并开票 + Integer hbcp = null; + Object val = contentMap.get("hbcp"); + if(val != null){ + hbcp = val instanceof Integer ? (Integer) val : Integer.valueOf(((String)val).trim()); + } + Boolean isMerge = false; + if (hbcp == 1) { + //判断是否合并开票 + isMerge = true; + } + + if (!isMerge) { + //按入仓单和收费事项分开计费 + if ("warehouse_receipt".equals(zfycl) && "fee_item".equals(fjfykpcl)) { + calcReceiptAndItemSeparatelyDC(settlementCustomersId); + } + //按合同和收费事项分开计费 + else if ("project_monthly".equals(zfycl) && "fee_item".equals(fjfykpcl)) { + calcContractAndItemSeparatelyDC(settlementCustomersId); + } + } else { + //按入仓单和收费事项合并计费 + if ("warehouse_receipt".equals(zfycl) && "fee_item".equals(fjfykpcl)) { + mergeCalcByReceiptAndItemDC(settlementCustomersId); + } + //按合同和收费事项合并计费 + else if ("project_monthly".equals(zfycl) && "fee_item".equals(fjfykpcl)) { + mergeCalcByContractAndItemDC(settlementCustomersId); + } + } + } /* * 按入仓单和收费事项分开计费 * */ public void calcReceiptAndItemSeparately(Long settlementCustomersId) { List list = businessDocumentService.list(new LambdaQueryWrapper() - .eq(BusinessDocument::getBelongModuleCode, "干仓") + .eq(BusinessDocument::getWarehouseType, "干仓") .eq(BusinessDocument::getSettlementCustomersId, settlementCustomersId) .eq(BusinessDocument::getBusinessState, 3) .eq(BusinessDocument::getDelFlag, 1)); @@ -732,22 +838,28 @@ public class BillingStatementApplicationService { BigDecimal allAmount = BigDecimal.ZERO; BigDecimal allFreeFee = BigDecimal.ZERO; String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; for (BillingStatement billingStatement : billingStatements) { settlementCurrency = billingStatement.getSettlementCurrency(); String firstSubjectCode = billingStatement.getFirstSubjectCode(); String firstSubjectName = billingStatement.getFirstSubjectName(); - Long organizationId = billingStatement.getOrganizationId(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); if (taxRateMap == null) continue; - Double taxRate = (Double) taxRateMap.get("taxRate"); + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); Long billingStatementId = billingStatement.getBillingStatementId(); BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); billingStatementDTO.setAuditOperation(1); - reviewBilling(billingStatementDTO); + reviewBillingJob(billingStatementDTO); BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); - BigDecimal amount = billingStatementDTO.getBillingAmount(); + BigDecimal amount = billingStatement.getBillingAmount(); BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal taxFreeFee = amount.subtract(taxAmount); allAmount.add(amount); @@ -759,6 +871,7 @@ public class BillingStatementApplicationService { billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); billingStatementADDVOS.add(billingStatementADDVO); billingStatementIdList.add(String.valueOf(billingStatementId)); @@ -772,7 +885,53 @@ public class BillingStatementApplicationService { billingStatementDTO1.setTaxFreeFee(allFreeFee); billingStatementDTO1.setSettlementCurrency(settlementCurrency); billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); - generateBills(billingStatementDTO1); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } } } } else { @@ -788,22 +947,28 @@ public class BillingStatementApplicationService { BigDecimal allAmount = BigDecimal.ZERO; BigDecimal allFreeFee = BigDecimal.ZERO; String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; for (BillingStatement billingStatement : billingStatementList) { settlementCurrency = billingStatement.getSettlementCurrency(); String firstSubjectCode = billingStatement.getFirstSubjectCode(); String firstSubjectName = billingStatement.getFirstSubjectName(); - Long organizationId = billingStatement.getOrganizationId(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); if (taxRateMap == null) continue; - Double taxRate = (Double) taxRateMap.get("taxRate"); + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); Long billingStatementId = billingStatement.getBillingStatementId(); BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); billingStatementDTO.setAuditOperation(1); - reviewBilling(billingStatementDTO); + reviewBillingJob(billingStatementDTO); BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); - BigDecimal amount = billingStatementDTO.getBillingAmount(); + BigDecimal amount = billingStatement.getBillingAmount(); BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal taxFreeFee = amount.subtract(taxAmount); allAmount.add(amount); @@ -815,6 +980,7 @@ public class BillingStatementApplicationService { billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); billingStatementADDVOS.add(billingStatementADDVO); billingStatementIdList.add(String.valueOf(billingStatementId)); @@ -828,7 +994,53 @@ public class BillingStatementApplicationService { billingStatementDTO1.setTaxFreeFee(allFreeFee); billingStatementDTO1.setSettlementCurrency(settlementCurrency); billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); - generateBills(billingStatementDTO1); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } } } } @@ -839,7 +1051,7 @@ public class BillingStatementApplicationService { * */ public void mergeCalcByReceiptAndItem(Long settlementCustomersId) { List list = businessDocumentService.list(new LambdaQueryWrapper() - .eq(BusinessDocument::getBelongModuleCode, "干仓") + .eq(BusinessDocument::getWarehouseType, "干仓") .eq(BusinessDocument::getSettlementCustomersId, settlementCustomersId) .eq(BusinessDocument::getBusinessState, 3) .eq(BusinessDocument::getDelFlag, 1)); @@ -859,22 +1071,28 @@ public class BillingStatementApplicationService { BigDecimal allAmount = BigDecimal.ZERO; BigDecimal allFreeFee = BigDecimal.ZERO; String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; for (BillingStatement billingStatement : billingStatementList) { settlementCurrency = billingStatement.getSettlementCurrency(); String firstSubjectCode = billingStatement.getFirstSubjectCode(); String firstSubjectName = billingStatement.getFirstSubjectName(); - Long organizationId = billingStatement.getOrganizationId(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); if (taxRateMap == null) continue; - Double taxRate = (Double) taxRateMap.get("taxRate"); + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); Long billingStatementId = billingStatement.getBillingStatementId(); BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); billingStatementDTO.setAuditOperation(1); - reviewBilling(billingStatementDTO); + reviewBillingJob(billingStatementDTO); BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); - BigDecimal amount = billingStatementDTO.getBillingAmount(); + BigDecimal amount = billingStatement.getBillingAmount(); BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal taxFreeFee = amount.subtract(taxAmount); allAmount.add(amount); @@ -886,6 +1104,7 @@ public class BillingStatementApplicationService { billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); billingStatementADDVOS.add(billingStatementADDVO); billingStatementIdList.add(String.valueOf(billingStatementId)); @@ -899,7 +1118,53 @@ public class BillingStatementApplicationService { billingStatementDTO1.setTaxFreeFee(allFreeFee); billingStatementDTO1.setSettlementCurrency(settlementCurrency); billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); - generateBills(billingStatementDTO1); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } } } } @@ -909,7 +1174,7 @@ public class BillingStatementApplicationService { * */ public void calcContractAndItemSeparately(Long settlementCustomersId) { List list = businessDocumentService.list(new LambdaQueryWrapper() - .eq(BusinessDocument::getBelongModuleCode, "干仓") + .eq(BusinessDocument::getWarehouseType, "干仓") .eq(BusinessDocument::getSettlementCustomersId, settlementCustomersId) .eq(BusinessDocument::getBusinessState, 3) .eq(BusinessDocument::getDelFlag, 1)); @@ -938,22 +1203,28 @@ public class BillingStatementApplicationService { BigDecimal allAmount = BigDecimal.ZERO; BigDecimal allFreeFee = BigDecimal.ZERO; String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; for (BillingStatement billingStatement : billingContractStatementList) { settlementCurrency = billingStatement.getSettlementCurrency(); String firstSubjectCode = billingStatement.getFirstSubjectCode(); String firstSubjectName = billingStatement.getFirstSubjectName(); - Long organizationId = billingStatement.getOrganizationId(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); if (taxRateMap == null) continue; - Double taxRate = (Double) taxRateMap.get("taxRate"); + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); Long billingStatementId = billingStatement.getBillingStatementId(); BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); billingStatementDTO.setAuditOperation(1); - reviewBilling(billingStatementDTO); + reviewBillingJob(billingStatementDTO); BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); - BigDecimal amount = billingStatementDTO.getBillingAmount(); + BigDecimal amount = billingStatement.getBillingAmount(); BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal taxFreeFee = amount.subtract(taxAmount); allAmount.add(amount); @@ -965,6 +1236,7 @@ public class BillingStatementApplicationService { billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); billingStatementADDVOS.add(billingStatementADDVO); billingStatementIdList.add(String.valueOf(billingStatementId)); @@ -977,7 +1249,53 @@ public class BillingStatementApplicationService { billingStatementDTO1.setTaxFreeFee(allFreeFee); billingStatementDTO1.setSettlementCurrency(settlementCurrency); billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); - generateBills(billingStatementDTO1); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } } } } else { @@ -993,22 +1311,28 @@ public class BillingStatementApplicationService { BigDecimal allAmount = BigDecimal.ZERO; BigDecimal allFreeFee = BigDecimal.ZERO; String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; for (BillingStatement billingStatement : billingStatementList) { settlementCurrency = billingStatement.getSettlementCurrency(); String firstSubjectCode = billingStatement.getFirstSubjectCode(); String firstSubjectName = billingStatement.getFirstSubjectName(); - Long organizationId = billingStatement.getOrganizationId(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); if (taxRateMap == null) continue; - Double taxRate = (Double) taxRateMap.get("taxRate"); + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); Long billingStatementId = billingStatement.getBillingStatementId(); BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); billingStatementDTO.setAuditOperation(1); - reviewBilling(billingStatementDTO); + reviewBillingJob(billingStatementDTO); BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); - BigDecimal amount = billingStatementDTO.getBillingAmount(); + BigDecimal amount = billingStatement.getBillingAmount(); BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal taxFreeFee = amount.subtract(taxAmount); allAmount.add(amount); @@ -1020,6 +1344,7 @@ public class BillingStatementApplicationService { billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); billingStatementADDVOS.add(billingStatementADDVO); billingStatementIdList.add(String.valueOf(billingStatementId)); @@ -1033,7 +1358,53 @@ public class BillingStatementApplicationService { billingStatementDTO1.setTaxFreeFee(allFreeFee); billingStatementDTO1.setSettlementCurrency(settlementCurrency); billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); - generateBills(billingStatementDTO1); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } } } } @@ -1044,7 +1415,7 @@ public class BillingStatementApplicationService { * */ public void mergeCalcByContractAndItem(Long settlementCustomersId) { List list = businessDocumentService.list(new LambdaQueryWrapper() - .eq(BusinessDocument::getBelongModuleCode, "干仓") + .eq(BusinessDocument::getWarehouseType, "干仓") .eq(BusinessDocument::getSettlementCustomersId, settlementCustomersId) .eq(BusinessDocument::getBusinessState, 3) .eq(BusinessDocument::getDelFlag, 1)); @@ -1064,22 +1435,28 @@ public class BillingStatementApplicationService { BigDecimal allAmount = BigDecimal.ZERO; BigDecimal allFreeFee = BigDecimal.ZERO; String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; for (BillingStatement billingStatement : billingStatementList) { settlementCurrency = billingStatement.getSettlementCurrency(); String firstSubjectCode = billingStatement.getFirstSubjectCode(); String firstSubjectName = billingStatement.getFirstSubjectName(); - Long organizationId = billingStatement.getOrganizationId(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); if (taxRateMap == null) continue; - Double taxRate = (Double) taxRateMap.get("taxRate"); + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); Long billingStatementId = billingStatement.getBillingStatementId(); BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); billingStatementDTO.setAuditOperation(1); - reviewBilling(billingStatementDTO); + reviewBillingJob(billingStatementDTO); BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); - BigDecimal amount = billingStatementDTO.getBillingAmount(); + BigDecimal amount = billingStatement.getBillingAmount(); BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal taxFreeFee = amount.subtract(taxAmount); allAmount.add(amount); @@ -1091,6 +1468,7 @@ public class BillingStatementApplicationService { billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); billingStatementADDVOS.add(billingStatementADDVO); billingStatementIdList.add(String.valueOf(billingStatementId)); @@ -1104,7 +1482,782 @@ public class BillingStatementApplicationService { billingStatementDTO1.setTaxFreeFee(allFreeFee); billingStatementDTO1.setSettlementCurrency(settlementCurrency); billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); - generateBills(billingStatementDTO1); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } + } + } + } + + /* + * 按入仓单和收费事项分开计费(冻仓) + * */ + public void calcReceiptAndItemSeparatelyDC(Long settlementCustomersId) { + List list = businessDocumentService.list(new LambdaQueryWrapper() + .eq(BusinessDocument::getWarehouseType, "冻仓") + .eq(BusinessDocument::getSettlementCustomersId, settlementCustomersId) + .eq(BusinessDocument::getBusinessState, 3) + .eq(BusinessDocument::getDelFlag, 1)); + Map> groupedMap = list.stream() + .collect(Collectors.groupingBy(BusinessDocument::getFirstSubjectCode)); + for (Map.Entry> entry : groupedMap.entrySet()) { + List groupList = entry.getValue(); + String firstSubject = entry.getKey(); + if ("0D01".equals(firstSubject)) { + //主费用 + for (BusinessDocument businessDocument : groupList) { + String businessFlow = businessDocument.getBusinessFlow(); + List billingStatements = billingStatementService.list(new LambdaQueryWrapper() + .eq(BillingStatement::getBusinessFlow, businessFlow) + .eq(BillingStatement::getBillingState, 1) + .eq(BillingStatement::getDelFlag, 1)); + if (billingStatements != null && billingStatements.size() > 0) { + List billingStatementADDVOS = new ArrayList<>(); + List billingStatementIdList = new ArrayList<>(); + BigDecimal allAmount = BigDecimal.ZERO; + BigDecimal allFreeFee = BigDecimal.ZERO; + String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; + for (BillingStatement billingStatement : billingStatements) { + settlementCurrency = billingStatement.getSettlementCurrency(); + String firstSubjectCode = billingStatement.getFirstSubjectCode(); + String firstSubjectName = billingStatement.getFirstSubjectName(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); + Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); + if (taxRateMap == null) continue; + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); + Long billingStatementId = billingStatement.getBillingStatementId(); + BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); + billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); + billingStatementDTO.setAuditOperation(1); + reviewBillingJob(billingStatementDTO); + + BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); + BigDecimal amount = billingStatement.getBillingAmount(); + BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); + BigDecimal taxFreeFee = amount.subtract(taxAmount); + allAmount.add(amount); + allFreeFee.add(taxFreeFee); + billingStatementADDVO.setBillingStatementId(String.valueOf(billingStatementId)); + billingStatementADDVO.setTaxRate(taxRate); + billingStatementADDVO.setTaxAmount(taxAmount); + billingStatementADDVO.setTaxFreeFee(taxFreeFee); + billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); + billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); + billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); + billingStatementADDVO.setBillingAmount(amount); + billingStatementADDVOS.add(billingStatementADDVO); + + billingStatementIdList.add(String.valueOf(billingStatementId)); + } + String ids = String.join(",", billingStatementIdList); + BillingStatementDTO billingStatementDTO1 = new BillingStatementDTO(); + billingStatementDTO1.setBillingStatementIds(ids); + billingStatementDTO1.setBelongModuleCode("wms"); + billingStatementDTO1.setTaxAmount(allAmount); + billingStatementDTO1.setBillingAmount(allAmount); + billingStatementDTO1.setTaxFreeFee(allFreeFee); + billingStatementDTO1.setSettlementCurrency(settlementCurrency); + billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + params.setOrganizationId(organizationId); + params.setTopOrganizationId(topOrganizationId); + params.setOrganizationName(organizationName); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + tmsInvoiceListAddDTO.setOrganizationId(organizationId); + tmsInvoiceListAddDTO.setTopOrganizationId(topOrganizationId); + tmsInvoiceListAddDTO.setOrganizationName(organizationName); + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } + } + } + } else { + //附加费用 + List businessFlowList = groupList.stream().map(BusinessDocument::getBusinessFlow).collect(Collectors.toList()); + List billingStatementList = billingStatementService.list(new LambdaQueryWrapper() + .in(BillingStatement::getBusinessFlow, businessFlowList) + .eq(BillingStatement::getBillingState, 1) + .eq(BillingStatement::getDelFlag, 1)); + if (billingStatementList != null && billingStatementList.size() > 0) { + List billingStatementADDVOS = new ArrayList<>(); + List billingStatementIdList = new ArrayList<>(); + BigDecimal allAmount = BigDecimal.ZERO; + BigDecimal allFreeFee = BigDecimal.ZERO; + String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; + for (BillingStatement billingStatement : billingStatementList) { + settlementCurrency = billingStatement.getSettlementCurrency(); + String firstSubjectCode = billingStatement.getFirstSubjectCode(); + String firstSubjectName = billingStatement.getFirstSubjectName(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); + Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); + if (taxRateMap == null) continue; + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); + Long billingStatementId = billingStatement.getBillingStatementId(); + BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); + billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); + billingStatementDTO.setAuditOperation(1); + reviewBillingJob(billingStatementDTO); + + BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); + BigDecimal amount = billingStatementDTO.getBillingAmount(); + BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); + BigDecimal taxFreeFee = amount.subtract(taxAmount); + allAmount.add(amount); + allFreeFee.add(taxFreeFee); + billingStatementADDVO.setBillingStatementId(String.valueOf(billingStatementId)); + billingStatementADDVO.setTaxRate(taxRate); + billingStatementADDVO.setTaxAmount(taxAmount); + billingStatementADDVO.setTaxFreeFee(taxFreeFee); + billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); + billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); + billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); + billingStatementADDVOS.add(billingStatementADDVO); + + billingStatementIdList.add(String.valueOf(billingStatementId)); + } + String ids = String.join(",", billingStatementIdList); + BillingStatementDTO billingStatementDTO1 = new BillingStatementDTO(); + billingStatementDTO1.setBillingStatementIds(ids); + billingStatementDTO1.setBelongModuleCode("wms"); + billingStatementDTO1.setTaxAmount(allAmount); + billingStatementDTO1.setBillingAmount(allAmount); + billingStatementDTO1.setTaxFreeFee(allFreeFee); + billingStatementDTO1.setSettlementCurrency(settlementCurrency); + billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } + } + } + } + } + + /* + * 按入仓单和收费事项合并计费(冻仓) + * */ + public void mergeCalcByReceiptAndItemDC(Long settlementCustomersId) { + List list = businessDocumentService.list(new LambdaQueryWrapper() + .eq(BusinessDocument::getWarehouseType, "冻仓") + .eq(BusinessDocument::getSettlementCustomersId, settlementCustomersId) + .eq(BusinessDocument::getBusinessState, 3) + .eq(BusinessDocument::getDelFlag, 1)); + Map> groupedMap = list.stream() + .collect(Collectors.groupingBy(BusinessDocument::getOriginalBusinessNum)); + for (Map.Entry> entry : groupedMap.entrySet()) { + List groupList = entry.getValue(); + String originalBusinessNum = entry.getKey(); + List businessFlowList = groupList.stream().map(BusinessDocument::getBusinessFlow).collect(Collectors.toList()); + List billingStatementList = billingStatementService.list(new LambdaQueryWrapper() + .in(BillingStatement::getBusinessFlow, businessFlowList) + .eq(BillingStatement::getBillingState, 1) + .eq(BillingStatement::getDelFlag, 1)); + if (billingStatementList != null && billingStatementList.size() > 0) { + List billingStatementADDVOS = new ArrayList<>(); + List billingStatementIdList = new ArrayList<>(); + BigDecimal allAmount = BigDecimal.ZERO; + BigDecimal allFreeFee = BigDecimal.ZERO; + String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; + for (BillingStatement billingStatement : billingStatementList) { + settlementCurrency = billingStatement.getSettlementCurrency(); + String firstSubjectCode = billingStatement.getFirstSubjectCode(); + String firstSubjectName = billingStatement.getFirstSubjectName(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); + Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); + if (taxRateMap == null) continue; + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); + Long billingStatementId = billingStatement.getBillingStatementId(); + BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); + billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); + billingStatementDTO.setAuditOperation(1); + reviewBillingJob(billingStatementDTO); + + BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); + BigDecimal amount = billingStatement.getBillingAmount(); + BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); + BigDecimal taxFreeFee = amount.subtract(taxAmount); + allAmount.add(amount); + allFreeFee.add(taxFreeFee); + billingStatementADDVO.setBillingStatementId(String.valueOf(billingStatementId)); + billingStatementADDVO.setTaxRate(taxRate); + billingStatementADDVO.setTaxAmount(taxAmount); + billingStatementADDVO.setTaxFreeFee(taxFreeFee); + billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); + billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); + billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); + billingStatementADDVOS.add(billingStatementADDVO); + + billingStatementIdList.add(String.valueOf(billingStatementId)); + } + String ids = String.join(",", billingStatementIdList); + BillingStatementDTO billingStatementDTO1 = new BillingStatementDTO(); + billingStatementDTO1.setBillingStatementIds(ids); + billingStatementDTO1.setBelongModuleCode("wms"); + billingStatementDTO1.setTaxAmount(allAmount); + billingStatementDTO1.setBillingAmount(allAmount); + billingStatementDTO1.setTaxFreeFee(allFreeFee); + billingStatementDTO1.setSettlementCurrency(settlementCurrency); + billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } + } + } + } + + /* + * 按合同和收费事项分开计费(冻仓) + * */ + public void calcContractAndItemSeparatelyDC(Long settlementCustomersId) { + List list = businessDocumentService.list(new LambdaQueryWrapper() + .eq(BusinessDocument::getWarehouseType, "冻仓") + .eq(BusinessDocument::getSettlementCustomersId, settlementCustomersId) + .eq(BusinessDocument::getBusinessState, 3) + .eq(BusinessDocument::getDelFlag, 1)); + Map> groupedMap = list.stream() + .collect(Collectors.groupingBy(BusinessDocument::getFirstSubjectCode)); + for (Map.Entry> entry : groupedMap.entrySet()) { + List groupList = entry.getValue(); + String firstSubject = entry.getKey(); + if ("0D01".equals(firstSubject)) { + //主费用 + List businessFlowList = groupList.stream().map(BusinessDocument::getBusinessFlow).collect(Collectors.toList()); + List billingStatementList = billingStatementService.list(new LambdaQueryWrapper() + .in(BillingStatement::getBusinessFlow, businessFlowList) + .eq(BillingStatement::getBillingState, 1) + .eq(BillingStatement::getDelFlag, 1)); + if (billingStatementList != null && billingStatementList.size() > 0) { + Map> contractManageIdMap = billingStatementList.stream() + .collect(Collectors.groupingBy(BillingStatement::getContractManageId)); + for (Map.Entry> contractManageIdEntry : contractManageIdMap.entrySet()) { + Long contractManageId = contractManageIdEntry.getKey(); + List billingContractStatementList = contractManageIdEntry.getValue(); + + List billingStatementADDVOS = new ArrayList<>(); + BillingStatementDTO billingStatementDTO1 = new BillingStatementDTO(); + List billingStatementIdList = new ArrayList<>(); + BigDecimal allAmount = BigDecimal.ZERO; + BigDecimal allFreeFee = BigDecimal.ZERO; + String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; + for (BillingStatement billingStatement : billingContractStatementList) { + settlementCurrency = billingStatement.getSettlementCurrency(); + String firstSubjectCode = billingStatement.getFirstSubjectCode(); + String firstSubjectName = billingStatement.getFirstSubjectName(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); + Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); + if (taxRateMap == null) continue; + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); + Long billingStatementId = billingStatement.getBillingStatementId(); + BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); + billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); + billingStatementDTO.setAuditOperation(1); + reviewBillingJob(billingStatementDTO); + + BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); + BigDecimal amount = billingStatement.getBillingAmount(); + BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); + BigDecimal taxFreeFee = amount.subtract(taxAmount); + allAmount.add(amount); + allFreeFee.add(taxFreeFee); + billingStatementADDVO.setBillingStatementId(String.valueOf(billingStatementId)); + billingStatementADDVO.setTaxRate(taxRate); + billingStatementADDVO.setTaxAmount(taxAmount); + billingStatementADDVO.setTaxFreeFee(taxFreeFee); + billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); + billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); + billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); + billingStatementADDVOS.add(billingStatementADDVO); + + billingStatementIdList.add(String.valueOf(billingStatementId)); + } + String ids = String.join(",", billingStatementIdList); + billingStatementDTO1.setBillingStatementIds(ids); + billingStatementDTO1.setBelongModuleCode("wms"); + billingStatementDTO1.setTaxAmount(allAmount); + billingStatementDTO1.setBillingAmount(allAmount); + billingStatementDTO1.setTaxFreeFee(allFreeFee); + billingStatementDTO1.setSettlementCurrency(settlementCurrency); + billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } + } + } + } else { + //附加费用 + List businessFlowList = groupList.stream().map(BusinessDocument::getBusinessFlow).collect(Collectors.toList()); + List billingStatementList = billingStatementService.list(new LambdaQueryWrapper() + .in(BillingStatement::getBusinessFlow, businessFlowList) + .eq(BillingStatement::getBillingState, 1) + .eq(BillingStatement::getDelFlag, 1)); + if (billingStatementList != null && billingStatementList.size() > 0) { + List billingStatementADDVOS = new ArrayList<>(); + List billingStatementIdList = new ArrayList<>(); + BigDecimal allAmount = BigDecimal.ZERO; + BigDecimal allFreeFee = BigDecimal.ZERO; + String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; + for (BillingStatement billingStatement : billingStatementList) { + settlementCurrency = billingStatement.getSettlementCurrency(); + String firstSubjectCode = billingStatement.getFirstSubjectCode(); + String firstSubjectName = billingStatement.getFirstSubjectName(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); + Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); + if (taxRateMap == null) continue; + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); + Long billingStatementId = billingStatement.getBillingStatementId(); + BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); + billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); + billingStatementDTO.setAuditOperation(1); + reviewBillingJob(billingStatementDTO); + + BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); + BigDecimal amount = billingStatement.getBillingAmount(); + BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); + BigDecimal taxFreeFee = amount.subtract(taxAmount); + allAmount.add(amount); + allFreeFee.add(taxFreeFee); + billingStatementADDVO.setBillingStatementId(String.valueOf(billingStatementId)); + billingStatementADDVO.setTaxRate(taxRate); + billingStatementADDVO.setTaxAmount(taxAmount); + billingStatementADDVO.setTaxFreeFee(taxFreeFee); + billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); + billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); + billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); + billingStatementADDVOS.add(billingStatementADDVO); + + billingStatementIdList.add(String.valueOf(billingStatementId)); + } + String ids = String.join(",", billingStatementIdList); + BillingStatementDTO billingStatementDTO1 = new BillingStatementDTO(); + billingStatementDTO1.setBillingStatementIds(ids); + billingStatementDTO1.setBelongModuleCode("wms"); + billingStatementDTO1.setTaxAmount(allAmount); + billingStatementDTO1.setBillingAmount(allAmount); + billingStatementDTO1.setTaxFreeFee(allFreeFee); + billingStatementDTO1.setSettlementCurrency(settlementCurrency); + billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } + } + } + } + } + + /* + * 按合同和收费事项合并计费(冻仓) + * */ + public void mergeCalcByContractAndItemDC(Long settlementCustomersId) { + List list = businessDocumentService.list(new LambdaQueryWrapper() + .eq(BusinessDocument::getWarehouseType, "冻仓") + .eq(BusinessDocument::getSettlementCustomersId, settlementCustomersId) + .eq(BusinessDocument::getBusinessState, 3) + .eq(BusinessDocument::getDelFlag, 1)); + Map> groupedMap = list.stream() + .collect(Collectors.groupingBy(BusinessDocument::getContractManageId)); + for (Map.Entry> entry : groupedMap.entrySet()) { + List groupList = entry.getValue(); + Long contractManageId = entry.getKey(); + List businessFlowList = groupList.stream().map(BusinessDocument::getBusinessFlow).collect(Collectors.toList()); + List billingStatementList = billingStatementService.list(new LambdaQueryWrapper() + .in(BillingStatement::getBusinessFlow, businessFlowList) + .eq(BillingStatement::getBillingState, 1) + .eq(BillingStatement::getDelFlag, 1)); + if (billingStatementList != null && billingStatementList.size() > 0) { + List billingStatementADDVOS = new ArrayList<>(); + List billingStatementIdList = new ArrayList<>(); + BigDecimal allAmount = BigDecimal.ZERO; + BigDecimal allFreeFee = BigDecimal.ZERO; + String settlementCurrency = "CNY"; + Long organizationId = null; + Long topOrganizationId = null; + String organizationName = null; + for (BillingStatement billingStatement : billingStatementList) { + settlementCurrency = billingStatement.getSettlementCurrency(); + String firstSubjectCode = billingStatement.getFirstSubjectCode(); + String firstSubjectName = billingStatement.getFirstSubjectName(); + organizationId = billingStatement.getOrganizationId(); + topOrganizationId = billingStatement.getTopOrganizationId(); + organizationName = billingStatement.getOrganizationName(); + Map taxRateMap = billingStatementMapper.getTaxRate(organizationId, firstSubjectCode, firstSubjectName); + if (taxRateMap == null) continue; + BigDecimal taxRateBigDecimal = (BigDecimal) taxRateMap.get("taxRate"); + Double taxRate = taxRateBigDecimal.doubleValue(); + Long billingStatementId = billingStatement.getBillingStatementId(); + BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); + billingStatementDTO.setBillingStatementIds(String.valueOf(billingStatementId)); + billingStatementDTO.setAuditOperation(1); + reviewBillingJob(billingStatementDTO); + + BillingStatementADDVO billingStatementADDVO = new BillingStatementADDVO(); + BigDecimal amount = billingStatement.getBillingAmount(); + BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))), 10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); + BigDecimal taxFreeFee = amount.subtract(taxAmount); + allAmount.add(amount); + allFreeFee.add(taxFreeFee); + billingStatementADDVO.setBillingStatementId(String.valueOf(billingStatementId)); + billingStatementADDVO.setTaxRate(taxRate); + billingStatementADDVO.setTaxAmount(taxAmount); + billingStatementADDVO.setTaxFreeFee(taxFreeFee); + billingStatementADDVO.setFeeType(billingStatement.getServiceItemsName()); + billingStatementADDVO.setInvoiceItem(billingStatement.getFirstSubjectCode()); + billingStatementADDVO.setInvoiceItemName(billingStatement.getFirstSubjectName()); + billingStatementADDVO.setBillingAmount(amount); + billingStatementADDVOS.add(billingStatementADDVO); + + billingStatementIdList.add(String.valueOf(billingStatementId)); + } + String ids = String.join(",", billingStatementIdList); + BillingStatementDTO billingStatementDTO1 = new BillingStatementDTO(); + billingStatementDTO1.setBillingStatementIds(ids); + billingStatementDTO1.setBelongModuleCode("wms"); + billingStatementDTO1.setTaxAmount(allAmount); + billingStatementDTO1.setBillingAmount(allAmount); + billingStatementDTO1.setTaxFreeFee(allFreeFee); + billingStatementDTO1.setSettlementCurrency(settlementCurrency); + billingStatementDTO1.setBillingStatementList(billingStatementADDVOS); + billingStatementDTO1.setOrganizationId(organizationId); + billingStatementDTO1.setTopOrganizationId(topOrganizationId); + billingStatementDTO1.setOrganizationName(organizationName); + generateBillsJob(billingStatementDTO1); + Long billManageId = billingStatementDTO1.getBillManageId(); + if (ObjectUtil.isNotNull(billManageId)) { + //确认账单 + BillManageDTO params = new BillManageDTO(); + params.setBillManageIds(String.valueOf(billManageId)); + billManageApplicationService.confirmBillingJob(params); + //申请发票 + BillManage billManage = billManageService.getById(billManageId); + List billDetails = billDetailService.list(new LambdaQueryWrapper() + .eq(BillDetail::getBillManageId, billManageId) + .eq(BillDetail::getDelFlag, 1)); + BmsInvoiceListAddDTO tmsInvoiceListAddDTO = new BmsInvoiceListAddDTO(); + tmsInvoiceListAddDTO.setBillManageId(billManageId); + + if (ObjectUtil.isNotNull(billManage)) { + tmsInvoiceListAddDTO.setSettlementCurrency(billManage.getSettlementCurrency()); + tmsInvoiceListAddDTO.setBillAmount(billManage.getBillAmount()); + tmsInvoiceListAddDTO.setSettlementEntity(billManage.getSettlementEntity()); + } + List bmsMakeOutInvoices = new ArrayList<>(); + BmsMakeOutInvoice bmsMakeOutInvoice = new BmsMakeOutInvoice(); + bmsMakeOutInvoice.setActualInvoiceCustomerId(String.valueOf(billManage.getSettlementCustomersId())); + bmsMakeOutInvoice.setActualInvoiceCustomerName(billManage.getSettlementEntity()); + + + List bmsMakeOutInvoiceItems = new ArrayList<>(); + for (BillDetail billDetail : billDetails) { + BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem = new BmsMakeOutInvoiceItem(); + bmsMakeOutInvoiceItem.setInvoiceItem(billDetail.getInvoiceItem()); + bmsMakeOutInvoiceItem.setFeeType(billDetail.getFeeType()); + bmsMakeOutInvoiceItem.setInvoiceValue(billDetail.getBillingAmount()); + bmsMakeOutInvoiceItem.setTaxAmount(billDetail.getTaxAmount()); + bmsMakeOutInvoiceItem.setTaxFreeFee(billDetail.getTaxFreeFee()); + bmsMakeOutInvoiceItem.setTaxRate(billDetail.getTaxRate()); + bmsMakeOutInvoiceItem.setRemark("系统定时生成发票"); + bmsMakeOutInvoiceItems.add(bmsMakeOutInvoiceItem); + } + bmsMakeOutInvoice.setBmsMakeOutInvoiceItems(bmsMakeOutInvoiceItems); + bmsMakeOutInvoices.add(bmsMakeOutInvoice); + tmsInvoiceListAddDTO.setBmsMakeOutInvoices(bmsMakeOutInvoices); + + bmsInvoiceListService.addReceivableBillJob(tmsInvoiceListAddDTO); + } } } } diff --git a/mhd_bms/src/main/java/com/mhd/bms/application/server/receiptManage/ReceiptManageApplicationService.java b/mhd_bms/src/main/java/com/mhd/bms/application/server/receiptManage/ReceiptManageApplicationService.java index 550eec895..b098b3443 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/application/server/receiptManage/ReceiptManageApplicationService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/application/server/receiptManage/ReceiptManageApplicationService.java @@ -147,6 +147,25 @@ public class ReceiptManageApplicationService { } + /** + * 撤销收款 + */ + @Transactional + public Boolean cancelCollection(ReceiptManageDO receiptManageDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + return receiptManageDomainService.cancelCollection(receiptManageDO); + } + + /** + * 撤销收款-查询账单涉及的收款单id(用于加锁,防止并发撤销时收款单金额重算冲突) + */ + public Set queryCancelCollectionReceiptManageIds(String billManageIds) { + return receiptManageDomainService.queryReceiptManageIdsByBillManageIds(billManageIds); + } + /** * 退款 */ diff --git a/mhd_bms/src/main/java/com/mhd/bms/application/server/reportForm/ReportFormApplicationService.java b/mhd_bms/src/main/java/com/mhd/bms/application/server/reportForm/ReportFormApplicationService.java index a70cc7510..fab3417de 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/application/server/reportForm/ReportFormApplicationService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/application/server/reportForm/ReportFormApplicationService.java @@ -575,6 +575,8 @@ public class ReportFormApplicationService { //收款单 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("top_organization_id", loginUser.getUserPo().getTopOrganizationId()); + //过滤已撤销(逻辑删除)的收款单 + queryWrapper.eq("del_flag", 1); for (int i = 0; i < formQueryParamsList.size(); i++) { FormQueryParams formQueryParams = formQueryParamsList.get(i); FormQueryParams beforeFormQueryParams = null; diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/entity/BillManage.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/entity/BillManage.java index a54201841..9e976a3ab 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/entity/BillManage.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/entity/BillManage.java @@ -47,8 +47,8 @@ public class BillManage extends BaseVOEntity{ @Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付") private Integer billType; - @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款)") - @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款") + @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲)") + @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲") private Integer billState; @ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)") diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/facade/IBillManageService.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/facade/IBillManageService.java index 74dc98eae..32ce20c2c 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/facade/IBillManageService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/facade/IBillManageService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.mhd.bms.domain.billManage.entity.BillManage; import com.mhd.bms.domain.billManage.repository.po.BillManagePO; import com.mhd.bms.domain.billManage.repository.todo.BillManageDO; +import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO; import java.util.List; @@ -20,6 +21,14 @@ public interface IBillManageService extends IService */ public List queryList(BillManageDO billManageDO); + + public List customerMonthlyReport(BillManageDO billManageDO); + + /** + * 客户每月账单分组查询 + */ + public List queryCustomerMonthBillList(BillManageDO billManageDO); + /** * 新增账单管理 */ diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/mapper/BillManageMapper.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/mapper/BillManageMapper.java index 04608dd9a..1391b12a7 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/mapper/BillManageMapper.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/mapper/BillManageMapper.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mhd.bms.domain.billManage.entity.BillManage; import com.mhd.bms.domain.billManage.repository.po.BillManagePO; import com.mhd.bms.domain.billManage.repository.todo.BillManageDO; +import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO; import org.apache.ibatis.annotations.Param; /** * 账单管理Mapper接口 @@ -19,6 +20,13 @@ public interface BillManageMapper extends BaseMapper */ public List queryList(@Param("billManageDO") BillManageDO billManageDO); + public List customerMonthlyReport(@Param("billManageDO") BillManageDO billManageDO); + + /** + * 客户每月账单分组查询 + */ + public List queryCustomerMonthBillList(@Param("billManageDO") BillManageDO billManageDO); + String getInvoiceItemName(@Param("invoiceItemId") String invoiceItemId); String getInvoiceItemNcCode(@Param("invoiceItemId") String invoiceItemId); diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/persistence/BillManageImpl.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/persistence/BillManageImpl.java index e9148ca7c..daf5be1c1 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/persistence/BillManageImpl.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/persistence/BillManageImpl.java @@ -31,6 +31,7 @@ import com.mhd.bms.domain.settlementCustomers.entity.SettlementCustomers; import com.mhd.bms.domain.settlementCustomers.repository.facade.ISettlementCustomersService; import com.mhd.bms.interfaces.dto.billManage.BillDetailDTO; import com.mhd.bms.interfaces.dto.billManage.BillManageDTO; +import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO; import com.mhd.common.core.domain.dto.ReconciliationDTO; import com.mhd.common.core.domain.dto.nc.*; import com.mhd.common.core.domain.entity.R; @@ -126,6 +127,14 @@ public class BillManageImpl extends ServiceImpl im return billManageMapper.queryList(billManageDO); } + @Override + public List customerMonthlyReport(BillManageDO billManageDO) + { + return billManageMapper.customerMonthlyReport(billManageDO); + } + + + /** * 新增账单管理 */ @@ -1504,4 +1513,9 @@ public class BillManageImpl extends ServiceImpl im return 0; } + + @Override + public List queryCustomerMonthBillList(BillManageDO billManageDO) { + return billManageMapper.queryCustomerMonthBillList(billManageDO); + } } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillManagePO.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillManagePO.java index 9a3225e96..919bf3abd 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillManagePO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillManagePO.java @@ -2,6 +2,7 @@ package com.mhd.bms.domain.billManage.repository.po; import com.mhd.bms.domain.billManage.entity.BillDetail; import com.mhd.bms.domain.billingStatement.repository.po.BillingStatementPO; +import com.mhd.bms.domain.receiptManage.entity.ReceiptDetail; import com.mhd.common.core.annotation.Excel; import lombok.Data; import java.util.Date; @@ -52,8 +53,8 @@ public class BillManagePO extends BaseVOEntity{ @Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付") private Integer billType; - @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款)") - @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款") + @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲)") + @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲") private Integer billState; @ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)") @@ -262,9 +263,12 @@ public class BillManagePO extends BaseVOEntity{ @ApiModelProperty("收款帐户名称") private String paymentAccountName; private List billDetailList; + private List receiptDetailList; @ApiModelProperty("最近收款时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Excel(name = "最近收款时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date collectionTime; + @ApiModelProperty("合同编码") + private String contractNumbers; } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/todo/BillManageDO.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/todo/BillManageDO.java index cfb053614..8ce1ce70f 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/todo/BillManageDO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/todo/BillManageDO.java @@ -47,8 +47,8 @@ public class BillManageDO extends BaseVOEntity{ @Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付") private Integer billType; - @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款)") - @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款") + @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲)") + @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲") private Integer billState; @ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)") @@ -266,4 +266,7 @@ public class BillManageDO extends BaseVOEntity{ private String paymentAccountName; @ApiModelProperty("业务员ID") private String salesmanId; + + @ApiModelProperty("账单月份(yyyy-MM,按创建时间月份筛选,用于客户月账单分组查询)") + private String billMonth; } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/service/BillManageDomainService.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/service/BillManageDomainService.java index 1cfadfa0b..5955c4e63 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/service/BillManageDomainService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/service/BillManageDomainService.java @@ -12,7 +12,9 @@ import com.mhd.bms.domain.billManage.repository.facade.IBillManageService; import com.mhd.bms.domain.billManage.repository.po.BillManagePO; import com.mhd.bms.domain.billManage.repository.todo.BillDetailDO; import com.mhd.bms.domain.billManage.repository.todo.BillManageDO; +import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO; import com.mhd.bms.domain.billOperationLog.entity.BillOperationLog; +import com.mhd.bms.domain.billOperationLog.repository.po.BillOperationLogPO; import com.mhd.bms.domain.billOperationLog.repository.todo.BillOperationLogDO; import com.mhd.bms.domain.billOperationLog.service.BillOperationLogDomainService; import com.mhd.bms.domain.billingStatement.entity.BillingStatement; @@ -44,6 +46,7 @@ import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.SystemServiceFeign; import com.mhd.system.api.model.LoginUser; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -85,6 +88,10 @@ public class BillManageDomainService { return billManageService.queryList(billManageDO); } + public List customerMonthlyReport(BillManageDO billManageDO) { + return billManageService.customerMonthlyReport(billManageDO); + } + /** * 新增账单管理 @@ -233,6 +240,124 @@ public class BillManageDomainService { return flag && flagTwo && three; } + public Boolean saveBillJob(List billingStatementPOS,String billingRemark,Date billCreateTime,BillingStatementDTO billingStatementDTO) { +// LoginUser loginUser = SecurityUtils.getLoginUser(); +// if (ObjectUtil.isNull(loginUser)) { +//// throw new DigitalLogisticsException(UserError.TIMEOUT); +// } + BigDecimal taxAmount = billingStatementDTO.getTaxAmount(); // 获取税额 + Double taxRate = billingStatementDTO.getTaxRate(); // 获取税率 + BigDecimal taxFreeFee = billingStatementDTO.getTaxFreeFee(); // 获取税免金额 + String settlementCurrency = billingStatementDTO.getSettlementCurrency(); // 获取结算币种 + BillManage billManage = new BillManage(); + billManage.setTaxAmount(taxAmount); + billManage.setTaxRate(taxRate); + billManage.setTaxFreeFee(taxFreeFee); + billManage.setSettlementCurrency(settlementCurrency); +// billManage.setCreateBy(loginUser.getUserPo().getUserId()); +// billManage.setCreateByName(loginUser.getUserPo().getUserName()); + billManage.setCreateTime(billCreateTime==null ? new Date():billCreateTime); + billManage.setDelFlag(1); + billManage.setBillNumber(OrderSequence.getOrderCode("ZD")); + billManage.setTopOrganizationId(billingStatementDTO.getTopOrganizationId()); + billManage.setOrganizationId(billingStatementDTO.getOrganizationId()); + billManage.setOrganizationName(billingStatementDTO.getOrganizationName()); + billManage.setBillType(billingStatementPOS.get(0).getAccountExpenseType()); + billManage.setBelongModule(billingStatementPOS.get(0).getBelongModule()); + billManage.setBelongModuleCode(billingStatementPOS.get(0).getBelongModuleCode()); + billManage.setSettlementCustomersId(billingStatementPOS.get(0).getSettlementCustomersId()); + billManage.setSettlementEntity(billingStatementPOS.get(0).getSettlementEntity()); + billManage.setSettlementCustomersCode(billingStatementPOS.get(0).getSettlementCustomersCode()); + billManage.setSalesmanId(billingStatementPOS.get(0).getSalesmanId()); + billManage.setSalesmanName(billingStatementPOS.get(0).getSalesmanName()); + billManage.setPaymentAccountId(billingStatementPOS.get(0).getPaymentAccountId()); + billManage.setPaymentAccountName(billingStatementPOS.get(0).getPaymentAccountName()); + billManage.setBillRemark(billingRemark); + //查询结算对象信息 + SettlementCustomersPO settlementCustomersPO = settlementCustomersDomainService.getInfo(billingStatementPOS.get(0).getSettlementCustomersId()); + if(null == settlementCustomersPO){ + throw new ServiceException("结算对象信息未找到"); + } + billManage.setSettlementMethod(settlementCustomersPO.getSettlementMethod()); + billManage.setSettlementMethodCode(settlementCustomersPO.getSettlementMethodCode()); +// if(settlementCustomersPO.getMainRole()==1){ +// billManage.setBillType(1); +// }else { +// billManage.setBillType(2); +// } + //计算所有流水列表中的最早周期开始时间和晚周期结束时间 + List cycleBeginTimeSet = billingStatementPOS.stream().map(BillingStatementPO::getCycleBeginTime).collect(Collectors.toList()); + List cycleEndTimeSet = billingStatementPOS.stream().map(BillingStatementPO::getCycleEndTime).collect(Collectors.toList()); + cycleBeginTimeSet.removeIf(Objects::isNull); + cycleEndTimeSet.removeIf(Objects::isNull); + if(cycleBeginTimeSet.size()>0){ + billManage.setCycleBeginTime(Collections.min(cycleBeginTimeSet)); + } + if(cycleEndTimeSet.size()>0){ + billManage.setCycleEndTime(Collections.max(cycleEndTimeSet)); + } + //将所有的流水金额相加 + billManage.setBillTotalAmount(billingStatementPOS.stream().map(BillingStatementPO::getBillingAmount).reduce(BigDecimal.ZERO, BigDecimal::add)); + billManage.setBillAmount(billManage.getBillTotalAmount()); + billManage.setBillAmountUnsettled(billManage.getBillTotalAmount()); + boolean flag = billManageService.save(billManage); + billingStatementDTO.setBillManageId(billManage.getBillManageId()); + List billDetailList = new ArrayList<>(); + for (BillingStatementPO billingStatementPO : billingStatementPOS) { + //生成对账单详情 + BillDetail billDetail = new BillDetail(); + billDetail.setTopOrganizationId(billingStatementPO.getTopOrganizationId()); + billDetail.setOrganizationId(billingStatementPO.getOrganizationId()); + billDetail.setOrganizationName(billingStatementPO.getOrganizationName()); + billDetail.setCreateBy(billManage.getCreateBy()); + billDetail.setCreateByName(billManage.getCreateByName()); + billDetail.setCreateTime(billManage.getCreateTime()); + billDetail.setBillManageId(billManage.getBillManageId()); + billDetail.setBillNumber(billManage.getBillNumber()); + billDetail.setBillingStatementId(billingStatementPO.getBillingStatementId()); + billDetail.setBillingFlow(billingStatementPO.getBillingFlow()); + billDetail.setBillingTotalAmount(billingStatementPO.getBillingAmount()); + billDetail.setBillingAmount(billingStatementPO.getBillingAmount()); + billDetail.setBillType(billingStatementPO.getAccountExpenseType()); + billDetail.setTaxAmount(billingStatementPO.getTaxAmount()); + billDetail.setTaxRate(billingStatementPO.getTaxRate()); + billDetail.setTaxFreeFee(billingStatementPO.getTaxFreeFee()); + billDetail.setSettlementCurrency(billingStatementPO.getSettlementCurrency()); + billDetail.setFeeType(billingStatementPO.getFeeType()); + billDetail.setInvoiceItem(billingStatementPO.getInvoiceItem()); + billDetail.setInvoiceItemName(billingStatementPO.getInvoiceItemName()); + billDetailList.add(billDetail); + } + boolean flagTwo = billDetailDomainService.insertBatch(billDetailList); + //保存账单操作记录 + BillOperationLogDO billOperationLogDO = new BillOperationLogDO(); + billOperationLogDO.setBillManageId(billManage.getBillManageId()); + billOperationLogDO.setOperationInfo(StringUtils.format(BillLogsConstants.create_bill_text, billManage.getBillNumber(), billManage.getBillTotalAmount())); + billOperationLogDO.setOperationType(1); + billOperationLogDO.setCreateByName(billManage.getCreateByName()); + billOperationLogDO.setUpdateByName(billManage.getUpdateByName()); + billOperationLogDO.setCreateTime(new Date()); + billOperationLogDO.setUpdateTime(new Date()); + billOperationLogDO.setDelFlag(1); + billOperationLogDO.setCreateBy(billManage.getCreateBy()); + billOperationLogDO.setUpdateBy(billManage.getUpdateBy()); + billOperationLogDO.setTopOrganizationId(billManage.getTopOrganizationId()); + billOperationLogDO.setOrganizationId(billManage.getOrganizationId()); + billOperationLogDO.setOrganizationName(billManage.getOrganizationName()); + + boolean three = billOperationLogDomainService.saveBillOperationLogJob(billOperationLogDO); + //修改流水记录 + /*billingStatementDTO.getBillingStatementList().forEach(billingStatementADDVO -> { + billingStatementMapper.update(null, + new LambdaUpdateWrapper().set(BillingStatement::getTaxAmount,billingStatementADDVO.getTaxAmount()) + .set(BillingStatement::getTaxRate,billingStatementADDVO.getTaxRate()) + .set(BillingStatement::getTaxFreeFee,billingStatementADDVO.getTaxFreeFee()) + .set(BillingStatement::getSettlementCurrency,billingStatementADDVO.getSettlementCurrency()) + .eq(BillingStatement::getBillingStatementId,billingStatementADDVO.getBillingStatementId())); + });*/ + return flag && flagTwo && three; + } + /** * 保存账单 * @param billingStatementDTO @@ -296,6 +421,64 @@ public class BillManageDomainService { return saveBill(distinctList,billingStatementDTO.getBillingRemark(),billingStatementDTO.getBillCreateTime(),billingStatementDTO); } + public Boolean saveJob(BillingStatementDTO billingStatementDTO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { +// throw new DigitalLogisticsException(UserError.TIMEOUT); + } + //根据前端传的流水id,查询计费流水信息列表 + Set billingSet = Stream.of(billingStatementDTO.getBillingStatementIds().split(",")).collect(Collectors.toSet()); + BillingStatementDO billingStatementDO = new BillingStatementDO(); + billingStatementDO.setBillingStatementIdSet(billingSet); + List billingStatementPOS = billingStatementDomainService.queryList(billingStatementDO); + + //获取最新一条的业务员信息 + String salesmanId = null; + String salesmanName = null; + if (billingStatementPOS != null && !billingStatementPOS.isEmpty()) { + billingStatementPOS.sort((a, b) -> { + if (a.getCreateTime() == null && b.getCreateTime() == null) return 0; + if (a.getCreateTime() == null) return 1; + if (b.getCreateTime() == null) return -1; + return b.getCreateTime().compareTo(a.getCreateTime()); + }); + salesmanId = billingStatementPOS.get(0).getSalesmanId(); + salesmanName = billingStatementPOS.get(0).getSalesmanName(); + } + + List billingStatementList = billingStatementDTO.getBillingStatementList(); + for (BillingStatementPO billingStatementPO : billingStatementPOS) { + String billingStatementId = billingStatementPO.getBillingStatementId() == null ? "" : String.valueOf(billingStatementPO.getBillingStatementId()); + BillingStatementADDVO billingStatementADDVO = billingStatementList.stream().filter(billingStatementADDVO1 -> billingStatementADDVO1.getBillingStatementId().contains(billingStatementId)).findFirst().orElse(null); + billingStatementPO.setTaxAmount(billingStatementADDVO.getTaxAmount()); // 设置税额 + billingStatementPO.setTaxRate(billingStatementADDVO.getTaxRate()); // 设置税率 + billingStatementPO.setTaxFreeFee(billingStatementADDVO.getTaxFreeFee()); // 设置税免金额 + billingStatementPO.setSettlementCurrency(billingStatementADDVO.getSettlementCurrency());//设置结算币种 + billingStatementPO.setFeeType(billingStatementADDVO.getFeeType()); + billingStatementPO.setInvoiceItem(billingStatementADDVO.getInvoiceItem()); + billingStatementPO.setInvoiceItemName(billingStatementADDVO.getInvoiceItemName()); + billingStatementPO.setBillingAmount(billingStatementADDVO.getBillingAmount()); + billingStatementPO.setBillingStatementIdStr(billingStatementADDVO.getBillingStatementId()); + if (salesmanName != null && !salesmanName.isEmpty() && salesmanId != null && !salesmanId.isEmpty()) { + billingStatementPO.setSalesmanId(salesmanId); + billingStatementPO.setSalesmanName(salesmanName); + } + } + List distinctList = billingStatementPOS.stream() + .filter(Objects::nonNull) + .collect(Collectors.toMap( + BillingStatementPO::getBillingStatementIdStr, // key:去重字段 + po -> po, // value:对象本身 + (existing, replacement) -> existing // 重复时保留第一个 + )) + .values() + .stream().collect(Collectors.toList()); + if(billingStatementPOS==null || billingStatementPOS.size()==0){ + throw new ServiceException("所选流水信息未找到"); + } + return saveBillJob(distinctList,billingStatementDTO.getBillingRemark(),billingStatementDTO.getBillCreateTime(),billingStatementDTO); + } + public List queryListLambda(LambdaQueryWrapper queryWrapper) { return billManageService.list(queryWrapper); @@ -378,6 +561,32 @@ public class BillManageDomainService { return flag && three; } + public Boolean confirmBillingJob(BillManageDO billManageDO) { + //直接修改状态到未收款3状态 +// LoginUser loginUser = SecurityUtils.getLoginUser(); +// if (ObjectUtil.isNull(loginUser)) { +// throw new DigitalLogisticsException(UserError.TIMEOUT); +// } + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(BillManage::getBillManageId,billManageDO.getBillManageIdSet()) + .set(BillManage::getBillStep,4) + .set(BillManage::getBillState,3) +// .set(BillManage::getUpdateBy,loginUser.getUserPo().getUserId()) +// .set(BillManage::getUpdateByName,loginUser.getUserPo().getUserName()) + .set(BillManage::getUpdateTime,new Date()); + boolean flag = billManageService.update(updateWrapper); + //保存账单操作记录 + BillOperationLogDO billOperationLogDO = new BillOperationLogDO(); + billOperationLogDO.setBillManageIdSet(billManageDO.getBillManageIdSet()); + billOperationLogDO.setOperationInfo(BillLogsConstants.confirm_bill_text); + billOperationLogDO.setOperationType(3); + billOperationLogDO.setOrganizationId(billManageDO.getOrganizationId()); + billOperationLogDO.setOrganizationName(billManageDO.getOrganizationName()); + billOperationLogDO.setTopOrganizationId(billManageDO.getTopOrganizationId()); + boolean three = billOperationLogDomainService.saveBillOperationLogBatchJob(billOperationLogDO); + return flag && three; + } + public int editIsInvoice(String billNumber, Integer isInvoice, String invoiceId, String invoiceMakeTime,String applyNumber) { @@ -504,6 +713,261 @@ public class BillManageDomainService { } + /** + * 撤销收款:账单恢复为收款为0状态并保存撤销收款操作日志 + */ + public Boolean cancelCollectionInfo(List receiptDetails) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + //按账单分组收款明细(一个账单可能对应多个收款单) + Map> billDetailMap = receiptDetails.stream().collect(Collectors.groupingBy(ReceiptDetail::getBillManageId)); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(BillManage::getBillManageId,billDetailMap.keySet()); + List billManageList = billManageService.list(queryWrapper); + if(billManageList == null || billManageList.size()==0){ + throw new ServiceException("账单信息未找到"); + } + List billManageListSave = new ArrayList<>(); + List billOperationLogSave = new ArrayList<>(); + for (BillManage billManage : billManageList) { + List receiptDetailList = billDetailMap.get(billManage.getBillManageId()); + if(null == receiptDetailList || receiptDetailList.size() == 0){ + continue; + } + BillManage billManageSave = new BillManage(); + billManageSave.setBillManageId(billManage.getBillManageId()); + //账单恢复为收款为0状态 + billManageSave.setBillAmountSettlement(BigDecimal.ZERO); + billManageSave.setBillAmountUnsettled(billManage.getBillAmount()); + billManageSave.setActualReceivedAmount(BigDecimal.ZERO); + billManageSave.setSettlementDiscountsAmount(BigDecimal.ZERO); + billManageSave.setBillState(3); + billManageSave.setUpdateBy(loginUser.getUserPo().getUserId()); + billManageSave.setUpdateByName(loginUser.getUserPo().getUserName()); + billManageSave.setUpdateTime(new Date()); + billManageListSave.add(billManageSave); + //汇总该账单本次撤销的收款金额与收款单号 + BigDecimal collectedDiscount = receiptDetailList.stream().map(info -> info.getCollectedDiscount() == null ? BigDecimal.ZERO : info.getCollectedDiscount()).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal collectedAmount = receiptDetailList.stream().map(info -> info.getCollectedAmount() == null ? BigDecimal.ZERO : info.getCollectedAmount()).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal all = collectedAmount.add(collectedDiscount); + String collectionNums = receiptDetailList.stream().map(ReceiptDetail::getCollectionNum).filter(StringUtils::isNotEmpty).distinct().collect(Collectors.joining(",")); + //保存账单操作记录 + BillOperationLog billOperationLog = new BillOperationLog(); + billOperationLog.setBillManageId(billManage.getBillManageId()); + billOperationLog.setOperationInfo(StringUtils.format(BillLogsConstants.cancel_collection_bill_text,collectionNums,all,collectedAmount,collectedDiscount)); + billOperationLog.setOperationType(12); + billOperationLog.setDelFlag(1); + billOperationLogSave.add(billOperationLog); + } + Boolean three = billOperationLogDomainService.insertBatch(billOperationLogSave); + Boolean flag = billManageService.updateBatchById(billManageListSave); + return flag && three; + } + + + /** + * 应收账单红冲:生成金额为负数的红冲账单对冲原账单,不操作收款单等数据(支持批量) + */ + public Boolean redFlushBill(BillManageDTO billManageDTO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + if (StringUtils.isEmpty(billManageDTO.getBillManageIds())) { + throw new ServiceException("账单id不能为空"); + } + Set billManageIdSet = Stream.of(billManageDTO.getBillManageIds().split(",")).filter(StringUtils::isNotEmpty).map(String::trim).map(Long::valueOf).collect(Collectors.toSet()); + if (billManageIdSet.size() == 0) { + throw new ServiceException("账单id不能为空"); + } + //查询账单信息 + LambdaQueryWrapper queryWrapperBill = new LambdaQueryWrapper<>(); + queryWrapperBill.in(BillManage::getBillManageId, billManageIdSet); + queryWrapperBill.eq(BillManage::getDelFlag, 1); + List billManageList = billManageService.list(queryWrapperBill); + if (null == billManageList || billManageList.size() == 0) { + throw new ServiceException("账单信息未找到"); + } + if (billManageList.size() != billManageIdSet.size()) { + throw new ServiceException("部分账单信息未找到,请刷新后重试"); + } + //逐个账单红冲,任一账单校验不通过时事务整体回滚 + Boolean flag = true; + for (BillManage originalBill : billManageList) { + flag = redFlushSingleBill(originalBill, billManageDTO.getRedFlushRemark(), loginUser) && flag; + } + return flag; + } + + /** + * 红冲单个账单:生成金额为负数的红冲账单对冲原账单,同步镜像计费流水与账单明细 + */ + private Boolean redFlushSingleBill(BillManage originalBill, String redFlushRemark, LoginUser loginUser) { + if (ObjectUtil.equal(originalBill.getBillType(), 2)) { + throw new ServiceException("账单" + originalBill.getBillNumber() + "为付款账单,仅支持应收账单红冲"); + } + if (!ObjectUtil.equal(originalBill.getBillState(), 5)) { + throw new ServiceException("账单" + originalBill.getBillNumber() + "不是已收款状态,仅已收款状态的账单可以红冲,请刷新后重试"); + } + //校验账单是否已红冲,避免重复生成红冲账单 + BillOperationLogDO redFlushLogQuery = new BillOperationLogDO(); + redFlushLogQuery.setBillManageId(originalBill.getBillManageId()); + redFlushLogQuery.setOperationType(13); + List redFlushLogList = billOperationLogDomainService.queryList(redFlushLogQuery); + if (null != redFlushLogList && redFlushLogList.stream().anyMatch(info -> ObjectUtil.equal(info.getDelFlag(), 1))) { + throw new ServiceException("账单" + originalBill.getBillNumber() + "已红冲,不能重复红冲"); + } + //生成红冲账单编号 + String billNumber = OrderSequence.getOrderCode("ZD"); + BigDecimal redFlushAmount = negateAmount(originalBill.getBillAmount()); + //构建红冲账单,金额全部取负对冲原账单 + BillManage redBill = new BillManage(); + BeanUtils.copyProperties(originalBill, redBill); + redBill.setBillManageId(null); + redBill.setBillNumber(billNumber); + redBill.setBillAmount(redFlushAmount); + redBill.setBillTotalAmount(negateAmount(originalBill.getBillTotalAmount())); + redBill.setBillDiscountAmount(negateAmount(originalBill.getBillDiscountAmount())); + redBill.setBillAmountSettlement(negateAmount(originalBill.getBillAmountSettlement())); + redBill.setBillAmountUnsettled(BigDecimal.ZERO); + redBill.setActualReceivedAmount(negateAmount(originalBill.getActualReceivedAmount())); + redBill.setSettlementDiscountsAmount(negateAmount(originalBill.getSettlementDiscountsAmount())); + redBill.setTaxAmount(negateAmount(originalBill.getTaxAmount())); + redBill.setTaxFreeFee(negateAmount(originalBill.getTaxFreeFee())); + //红冲账单状态为红冲、已核对无误 + redBill.setBillState(8); + redBill.setBillStep(4); + redBill.setReconciliationStatus(4); + redBill.setSettlementTime(new Date()); + //重置对账、审核、开票、同步等状态,红冲账单不需要再走这些流程 + redBill.setBillExpectedAmount(null); + redBill.setReconciliationOpinion(null); + redBill.setVoucherAddress(null); + redBill.setFinancialReviewFlag(null); + redBill.setFinancialReviewOpinion(null); + redBill.setIsInvoice(0); + redBill.setInvoiceId(null); + redBill.setInvoiceMakeTime(null); + redBill.setApplyNumber(null); + redBill.setSynchronousStatus(0); + redBill.setSynchronousTime(null); + redBill.setNcId(null); + redBill.setSkSynchronousStatus(0); + redBill.setSkSynchronousTime(null); + redBill.setSkNcId(null); + //红冲原因写入账单备注 + String billRemark = "红冲原账单编号:" + originalBill.getBillNumber(); + if (StringUtils.isNotEmpty(redFlushRemark)) { + billRemark = billRemark + ",红冲原因:" + redFlushRemark; + } + redBill.setBillRemark(billRemark); + redBill.setDelFlag(1); + redBill.setCreateBy(loginUser.getUserid()); + redBill.setCreateByName(loginUser.getUserPo().getUserName()); + redBill.setCreateTime(new Date()); + redBill.setUpdateBy(loginUser.getUserid()); + redBill.setUpdateByName(loginUser.getUserPo().getUserName()); + redBill.setUpdateTime(new Date()); + Boolean flag = billManageService.save(redBill); + if (!flag || null == redBill.getBillManageId()) { + throw new ServiceException("生成红冲账单失败"); + } + //镜像红冲计费流水(金额取负),并记录原流水id与新流水的映射 + Map statementMapping = new HashMap<>(); + List originalStatementList = billingStatementDomainService.getDetailsByManageId(originalBill.getBillManageId()); + if (null != originalStatementList && originalStatementList.size() > 0) { + for (BillingStatementPO originalStatement : originalStatementList) { + BillingStatementDO redStatement = new BillingStatementDO(); + BeanUtils.copyProperties(originalStatement, redStatement); + redStatement.setBillingStatementId(null); + redStatement.setBillManageId(redBill.getBillManageId()); + redStatement.setBillingFlow(OrderSequence.getOrderCode("JFLS")); + redStatement.setBillingAmount(negateAmount(originalStatement.getBillingAmount())); + redStatement.setTaxAmount(negateAmount(originalStatement.getTaxAmount())); + redStatement.setTaxFreeFee(negateAmount(originalStatement.getTaxFreeFee())); + redStatement.setBillingState(3); + redStatement.setRedFlushState(1); + redStatement.setRedFlushRemark("红冲自计费流水:" + originalStatement.getBillingFlow()); + redStatement.setReviewRemarks(null); + redStatement.setBusinessDocumentId(null); + redStatement.setDelFlag(1); + redStatement.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + redStatement.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + redStatement.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + redStatement.setCreateBy(loginUser.getUserid()); + redStatement.setCreateByName(loginUser.getUserPo().getUserName()); + redStatement.setCreateTime(new Date()); + redStatement.setUpdateBy(loginUser.getUserid()); + redStatement.setUpdateByName(loginUser.getUserPo().getUserName()); + redStatement.setUpdateTime(new Date()); + redStatement.setBillingStatementId(billingStatementDomainService.insertAndReturnId(redStatement)); + statementMapping.put(originalStatement.getBillingStatementId(), redStatement); + } + } + //镜像红冲账单明细(金额取负),并关联新计费流水 + Boolean flagTwo = true; + LambdaQueryWrapper detailQueryWrapper = new LambdaQueryWrapper<>(); + detailQueryWrapper.eq(BillDetail::getBillManageId, originalBill.getBillManageId()); + detailQueryWrapper.eq(BillDetail::getDelFlag, 1); + List originalDetailList = billDetailDomainService.queryByLambda(detailQueryWrapper); + if (null != originalDetailList && originalDetailList.size() > 0) { + List redDetailList = new ArrayList<>(); + for (BillDetail originalDetail : originalDetailList) { + BillDetail redDetail = new BillDetail(); + BeanUtils.copyProperties(originalDetail, redDetail); + redDetail.setBillDetailId(null); + redDetail.setBillManageId(redBill.getBillManageId()); + redDetail.setBillNumber(billNumber); + redDetail.setBillingTotalAmount(negateAmount(originalDetail.getBillingTotalAmount())); + redDetail.setBillingAmount(negateAmount(originalDetail.getBillingAmount())); + redDetail.setBillingDiscountAmount(negateAmount(originalDetail.getBillingDiscountAmount())); + redDetail.setTaxAmount(negateAmount(originalDetail.getTaxAmount())); + redDetail.setTaxFreeFee(negateAmount(originalDetail.getTaxFreeFee())); + redDetail.setBillingExpectedAmount(null); + BillingStatementDO redStatement = statementMapping.get(originalDetail.getBillingStatementId()); + if (null != redStatement) { + redDetail.setBillingStatementId(redStatement.getBillingStatementId()); + redDetail.setBillingFlow(redStatement.getBillingFlow()); + } else { + redDetail.setBillingStatementId(null); + redDetail.setBillingFlow(null); + } + redDetail.setDelFlag(1); + redDetail.setCreateBy(loginUser.getUserid()); + redDetail.setCreateByName(loginUser.getUserPo().getUserName()); + redDetail.setCreateTime(new Date()); + redDetail.setUpdateBy(loginUser.getUserid()); + redDetail.setUpdateByName(loginUser.getUserPo().getUserName()); + redDetail.setUpdateTime(new Date()); + redDetailList.add(redDetail); + } + flagTwo = billDetailDomainService.insertBatch(redDetailList); + } + //红冲账单保存创建账单操作日志 + BillOperationLogDO redBillLog = new BillOperationLogDO(); + redBillLog.setBillManageId(redBill.getBillManageId()); + redBillLog.setOperationInfo(StringUtils.format(BillLogsConstants.create_bill_text, billNumber, redFlushAmount)); + redBillLog.setOperationType(1); + Boolean flagThree = billOperationLogDomainService.saveBillOperationLog(redBillLog); + //原账单保存红冲操作日志 + BillOperationLogDO originalBillLog = new BillOperationLogDO(); + originalBillLog.setBillManageId(originalBill.getBillManageId()); + originalBillLog.setOperationInfo(StringUtils.format(BillLogsConstants.red_flush_bill_text, billNumber, null == redFlushAmount ? BigDecimal.ZERO : redFlushAmount.abs())); + originalBillLog.setOperationType(13); + Boolean flagFour = billOperationLogDomainService.saveBillOperationLog(originalBillLog); + return flag && flagTwo && flagThree && flagFour; + } + + + /** + * 金额取负(空值返回null) + */ + private BigDecimal negateAmount(BigDecimal amount) { + return null == amount ? null : amount.negate(); + } + /** * 更改账单状态(付款) */ @@ -600,4 +1064,11 @@ public class BillManageDomainService { { return billManageService.synchronousNcSK(businessDocumentDetaliIds); } + + /** + * 客户每月账单分组查询 + */ + public List queryCustomerMonthBillList(BillManageDO billManageDO) { + return billManageService.queryCustomerMonthBillList(billManageDO); + } } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/entity/BillOperationLog.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/entity/BillOperationLog.java index 3a653b8f6..66100c285 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/entity/BillOperationLog.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/entity/BillOperationLog.java @@ -42,8 +42,8 @@ public class BillOperationLog extends BaseVOEntity{ @Excel(name = "账单管理id") private Long billManageId; - @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款)") - @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款") + @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲)") + @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲") private Integer operationType; @ApiModelProperty("操作信息") diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/repository/po/BillOperationLogPO.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/repository/po/BillOperationLogPO.java index 602f7370b..91f097ea5 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/repository/po/BillOperationLogPO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/repository/po/BillOperationLogPO.java @@ -41,8 +41,8 @@ public class BillOperationLogPO extends BaseVOEntity{ @Excel(name = "账单管理id") private Long billManageId; - @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款)") - @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款") + @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲)") + @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲") private Integer operationType; @ApiModelProperty("操作信息") diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/repository/todo/BillOperationLogDO.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/repository/todo/BillOperationLogDO.java index 3780e833e..876c0bbe3 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/repository/todo/BillOperationLogDO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/repository/todo/BillOperationLogDO.java @@ -42,8 +42,8 @@ public class BillOperationLogDO extends BaseVOEntity{ @Excel(name = "账单管理id") private Long billManageId; - @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款)") - @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款") + @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲)") + @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲") private Integer operationType; @ApiModelProperty("操作信息") diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/service/BillOperationLogDomainService.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/service/BillOperationLogDomainService.java index f998836f1..3dac710a7 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/service/BillOperationLogDomainService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billOperationLog/service/BillOperationLogDomainService.java @@ -95,6 +95,12 @@ public class BillOperationLogDomainService { return billOperationLogService.insert(billOperationLogDO); } + public Boolean saveBillOperationLogJob(BillOperationLogDO billOperationLogDO) { + + billOperationLogDO.setDelFlag(1); + return billOperationLogService.insert(billOperationLogDO); + } + /** * 批量保存操作日志 @@ -133,6 +139,40 @@ public class BillOperationLogDomainService { return billOperationLogService.saveBatch(saveList); } + public Boolean saveBillOperationLogBatchJob(BillOperationLogDO billOperationLogDO) { +// LoginUser loginUser = SecurityUtils.getLoginUser(); +// if (ObjectUtil.isNull(loginUser)) { +// throw new DigitalLogisticsException(UserError.TIMEOUT); +// } + if(billOperationLogDO.getBillManageIdSet()==null || billOperationLogDO.getBillManageIdSet().size()==0){ + throw new ServiceException("账单集合不能为空"); + } +// String userName = loginUser.getUserPo().getUserName(); +// // 获取登录人id +// Long userId = loginUser.getUserid(); + BillOperationLogDO common = new BillOperationLogDO(); +// common.setCreateByName(userName); +// common.setUpdateByName(userName); + common.setCreateTime(new Date()); + common.setUpdateTime(new Date()); + common.setDelFlag(1); +// common.setCreateBy(userId); +// common.setUpdateBy(userId); +// common.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); +// common.setOrganizationId(loginUser.getUserPo().getOrganizationId()); +// common.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + common.setOperationType(billOperationLogDO.getOperationType()); + common.setOperationInfo(billOperationLogDO.getOperationInfo()); + List saveList = new ArrayList<>(); + for (String billManageId : billOperationLogDO.getBillManageIdSet()) { + BillOperationLog save = new BillOperationLog(); + BeanUtils.copyProperties(common, save); + save.setBillManageId(Long.valueOf(billManageId)); + saveList.add(save); + } + return billOperationLogService.saveBatch(saveList); + } + /** * 批量保存数据 @@ -161,4 +201,4 @@ public class BillOperationLogDomainService { public List getDetailsById(Long billManageId) { return billOperationLogService.getDetailsById(billManageId); } -} +} \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billingStatement/service/BillingStatementDomainService.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billingStatement/service/BillingStatementDomainService.java index 4f517b8da..5b570249d 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billingStatement/service/BillingStatementDomainService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billingStatement/service/BillingStatementDomainService.java @@ -171,6 +171,48 @@ public class BillingStatementDomainService { return billingStatementService.updateBatchById(billingStatements); } + public Boolean reviewBillingJob(BillingStatementDTO billingStatementDTO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { +// throw new DigitalLogisticsException(UserError.TIMEOUT); + } + List billingStatements = new ArrayList<>(); + Set billingSet = Stream.of(billingStatementDTO.getBillingStatementIds().split(",")).collect(Collectors.toSet()); + for (String billingId : billingSet) { + Long billingStatementId = Long.valueOf(billingId); + BillingStatementPO billingStatementPO = billingStatementService.getInfo(billingStatementId); + if(null == billingStatementPO){ + throw new ServiceException("流水不存在"); + } + if(billingStatementPO.getBillingState()!=1){ + throw new ServiceException("该计费流水状态不为待审核,不能进行审核"); + } + if(billingStatementPO.getRedFlushState()==2){ + throw new ServiceException("计费流水"+ billingStatementPO.getBillingFlow() +"已红冲,不能进行审核"); + } + BillingStatement billingStatement = new BillingStatement(); + billingStatement.setBillingStatementId(billingStatementId); + billingStatement.setReviewRemarks(billingStatementDTO.getReviewRemarks()); + if(billingStatementDTO.getAuditOperation()==1){ + //审核通过 + billingStatement.setBillingState(2); + }else { + //审核不通过 + billingStatement.setBillingState(4); + //计费流水审核不通过时,修改业务单据中的状态到已生效 + BusinessDocumentDO businessDocumentDO = new BusinessDocumentDO(); + businessDocumentDO.setBusinessDocumentId(billingStatementPO.getBusinessDocumentId()); + businessDocumentDO.setBusinessState(2); + businessDocumentService.update(businessDocumentDO); + } + billingStatement.setUpdateTime(new Date()); +// billingStatement.setUpdateBy(loginUser.getUserPo().getUserId()); +// billingStatement.setUpdateByName(loginUser.getUserPo().getUserName()); + billingStatements.add(billingStatement); + } + return billingStatementService.updateBatchById(billingStatements); + } + /** * 批量红冲 @@ -299,6 +341,45 @@ public class BillingStatementDomainService { return update; } + public Boolean updateBillingStateJob(BillingStatementDTO billingStatementDTO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { +// throw new DigitalLogisticsException(UserError.TIMEOUT); + } + Set billingSet = Stream.of(billingStatementDTO.getBillingStatementIds().split(",")).collect(Collectors.toSet()); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(BillingStatement::getBillingStatementId,billingSet); + + updateWrapper.set(BillingStatement::getBillingState,billingStatementDTO.getBillingState()); +// updateWrapper.set(BillingStatement::getUpdateBy,loginUser.getUserPo().getUserId()); + updateWrapper.set(BillingStatement::getUpdateTime,new Date()); +// updateWrapper.set(BillingStatement::getUpdateByName,loginUser.getUserPo().getUserName()); + updateWrapper.set(BillingStatement::getBillManageId,billingStatementDTO.getBillManageId()); + boolean update = billingStatementService.update(updateWrapper); + List billingStatementList = billingStatementDTO.getBillingStatementList(); + for (BillingStatementADDVO billingStatementADDVO : billingStatementList) { + String billingStatementIds = billingStatementADDVO.getBillingStatementId(); + Set billings = Stream.of(billingStatementIds.split(",")).collect(Collectors.toSet()); + if (billings != null && billings.size() > 0) { + for (String billing : billings) { + Long billingStatementId = Long.valueOf(billing); + Double taxRate = billingStatementADDVO.getTaxRate(); + BillingStatement billingStatement = billingStatementService.getById(billingStatementId); + if (billingStatement != null) { + BigDecimal billingAmount = billingStatement.getBillingAmount(); + BigDecimal taxAmount = billingAmount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))),10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); + BigDecimal taxFreeFee = billingAmount.subtract(taxAmount); + billingStatement.setTaxAmount(taxAmount); + billingStatement.setTaxFreeFee(taxFreeFee); + billingStatement.setTaxRate(taxRate); + billingStatementService.updateById(billingStatement); + } + } + } + } + return update; + } + public Boolean nullifyByIds(BillingStatementDTO billingStatementDTO) { LoginUser loginUser = SecurityUtils.getLoginUser(); diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/bmsInvoiceList/repository/facade/IBmsInvoiceListService.java b/mhd_bms/src/main/java/com/mhd/bms/domain/bmsInvoiceList/repository/facade/IBmsInvoiceListService.java index 3918d6fa6..f4ac9ca67 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/bmsInvoiceList/repository/facade/IBmsInvoiceListService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/bmsInvoiceList/repository/facade/IBmsInvoiceListService.java @@ -26,6 +26,8 @@ public interface IBmsInvoiceListService extends IService { void addReceivableBill(BmsInvoiceListAddDTO tmsInvoiceListAddDTO); + void addReceivableBillJob(BmsInvoiceListAddDTO tmsInvoiceListAddDTO); + void update(BmsInvoiceListDTO tmsInvoiceListDTO); int delete(List ids); diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/bmsInvoiceList/repository/persistence/BmsInvoiceListServiceImpl.java b/mhd_bms/src/main/java/com/mhd/bms/domain/bmsInvoiceList/repository/persistence/BmsInvoiceListServiceImpl.java index 9f2015bdb..ddcaef106 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/bmsInvoiceList/repository/persistence/BmsInvoiceListServiceImpl.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/bmsInvoiceList/repository/persistence/BmsInvoiceListServiceImpl.java @@ -216,6 +216,76 @@ public class BmsInvoiceListServiceImpl extends ServiceImpl bmsMakeOutInvoices = bmsInvoiceListAddDTO.getBmsMakeOutInvoices(); + if (ObjectUtil.isNotNull(bmsMakeOutInvoices) && bmsMakeOutInvoices.size() > 0) { + for (BmsMakeOutInvoice bmsMakeOutInvoice : bmsMakeOutInvoices) { + bmsMakeOutInvoice.setInvoiceId(listId); + //bmsMakeOutInvoice.setCreateBy(sysUser.getId()); + bmsMakeOutInvoice.setCreateTime(new Date()); + bmsMakeOutInvoiceMapper.insert(bmsMakeOutInvoice); + for (BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem : bmsMakeOutInvoice.getBmsMakeOutInvoiceItems()) { + bmsMakeOutInvoiceItem.setMakeId(bmsMakeOutInvoice.getId()); + //bmsMakeOutInvoiceItem.setCreateBy(sysUser.getId()); + bmsMakeOutInvoiceItem.setCreateTime(new Date()); + bmsMakeOutInvoiceItemMapper.insert(bmsMakeOutInvoiceItem); + } + } + } + } + +// BillManage billManage = billManageMapper.selectById(bmsInvoiceListAddDTO.getBillManageId()); +// if (billManage != null) { +// billManage.setIsInvoice(1); +// billManage.setInvoiceId(bmsInvoiceList.getId().toString()); +// billManage.setApplyNumber(bmsInvoiceList.getApplyNumber()); +// billManageMapper.updateById(billManage); +// } + List billManageIds = bmsInvoiceListAddDTO.getBillManageIds(); + if (billManageIds != null && billManageIds.size() > 0){ + } else { + billManageIds = new ArrayList<>(); + billManageIds.add(bmsInvoiceListAddDTO.getBillManageId()); + } + List billManages = billManageMapper.selectList(new LambdaQueryWrapper().in(BillManage::getBillManageId, billManageIds)); + if (billManages != null && billManages.size() > 0) { + for (BillManage billManage : billManages) { + billManage.setIsInvoice(1); + billManage.setInvoiceId(bmsInvoiceList.getId().toString()); + billManage.setApplyNumber(bmsInvoiceList.getApplyNumber()); + billManageMapper.updateById(billManage); + } + } + /*AjaxResult ajaxResult = financeServiceFeign.editIsInvoice(transportationId,1,bmsInvoiceList.getId(),"",bmsInvoiceList.getApplyNumber()); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new com.mhd.common.core.exception.ServiceException(ajaxResult.get("msg").toString()); + }*/ + } + @Override public BmsSettlementPartyInvoice selectSettlementPartyInfoByName(String settlementPartyName) { return null; @@ -932,4 +1002,43 @@ public class BmsInvoiceListServiceImpl extends ServiceImpl billManageIds; + /**组织ID*/ + @ApiModelProperty(value = "组织ID") + @Excel(name = "组织ID", width = 15) + private Long organizationId; + + /**组织名称*/ + @ApiModelProperty(value = "组织名称") + @Excel(name = "组织名称", width = 15) + private String organizationName; + + /**一级组织ID*/ + @ApiModelProperty(value = "一级组织ID") + @Excel(name = "一级组织ID", width = 15) + private Long topOrganizationId; } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptDetailDomainService.java b/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptDetailDomainService.java index 7b6d93988..817cb217c 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptDetailDomainService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptDetailDomainService.java @@ -1,16 +1,22 @@ package com.mhd.bms.domain.receiptManage.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import cn.hutool.core.util.ObjectUtil; import com.mhd.bms.domain.receiptManage.entity.ReceiptDetail; import com.mhd.bms.domain.receiptManage.repository.facade.IReceiptDetailService; import com.mhd.bms.domain.receiptManage.repository.po.ReceiptDetailPO; import com.mhd.bms.domain.receiptManage.repository.todo.ReceiptDetailDO; +import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException; +import com.mhd.common.core.exception.digitalLogisticsException.UserError; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Set; @@ -95,6 +101,28 @@ public class ReceiptDetailDomainService { public List queryListByIdSet(Set orderIdSet) { LambdaQueryWrapper queryWrapperDetail = new LambdaQueryWrapper<>(); queryWrapperDetail.in(ReceiptDetail::getReceiptManageId, orderIdSet); + queryWrapperDetail.eq(ReceiptDetail::getDelFlag, 1); return receiptDetailService.list(queryWrapperDetail); } + + /** + * 撤销收款:批量逻辑删除收款明细 + */ + public Boolean cancelCollectionDetails(List receiptDetails) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + List receiptDetailSaveList = new ArrayList<>(); + for (ReceiptDetail receiptDetail : receiptDetails) { + ReceiptDetail receiptDetailSave = new ReceiptDetail(); + receiptDetailSave.setReceiptDetailId(receiptDetail.getReceiptDetailId()); + receiptDetailSave.setDelFlag(2); + receiptDetailSave.setUpdateBy(loginUser.getUserPo().getUserId()); + receiptDetailSave.setUpdateByName(loginUser.getUserPo().getUserName()); + receiptDetailSave.setUpdateTime(new Date()); + receiptDetailSaveList.add(receiptDetailSave); + } + return receiptDetailService.updateBatchById(receiptDetailSaveList); + } } diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptManageDomainService.java b/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptManageDomainService.java index c22c5f92d..80a695289 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptManageDomainService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptManageDomainService.java @@ -42,7 +42,9 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -300,6 +302,132 @@ public class ReceiptManageDomainService { return flag && flagTwo && flagThree; } + /** + * 撤销收款 + */ + public Boolean cancelCollection(ReceiptManageDO receiptManageDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + if (StringUtils.isEmpty(receiptManageDO.getBillManageIds())) { + throw new ServiceException("撤销账单不能为空"); + } + Set billManageIdSet = Stream.of(receiptManageDO.getBillManageIds().split(",")).filter(StringUtils::isNotEmpty).map(String::trim).map(Long::valueOf).collect(Collectors.toSet()); + if (billManageIdSet.size() == 0) { + throw new ServiceException("撤销账单不能为空"); + } + //查询账单信息 + LambdaQueryWrapper queryWrapperBill = new LambdaQueryWrapper<>(); + queryWrapperBill.in(BillManage::getBillManageId, billManageIdSet); + queryWrapperBill.eq(BillManage::getDelFlag, 1); + List billManageList = billManageDomainService.queryListLambda(queryWrapperBill); + if (null == billManageList || billManageList.size() == 0) { + throw new ServiceException("账单信息未找到"); + } + if (billManageList.size() != billManageIdSet.size()) { + throw new ServiceException("部分账单信息未找到,请刷新后重试"); + } + //查询账单的全部有效收款明细(一个账单可能对应多个收款单) + LambdaQueryWrapper queryWrapperDetail = new LambdaQueryWrapper<>(); + queryWrapperDetail.in(ReceiptDetail::getBillManageId, billManageIdSet); + queryWrapperDetail.eq(ReceiptDetail::getDelFlag, 1); + List receiptDetails = receiptDetailDomainService.queryListByLambda(queryWrapperDetail); + if (null == receiptDetails || receiptDetails.size() == 0) { + throw new ServiceException("账单收款记录不存在或已撤销,请刷新后重试"); + } + //校验每个账单都有收款记录 + Map> billDetailMap = receiptDetails.stream().collect(Collectors.groupingBy(ReceiptDetail::getBillManageId)); + for (BillManage billManage : billManageList) { + if (!billDetailMap.containsKey(billManage.getBillManageId())) { + throw new ServiceException("账单" + billManage.getBillNumber() + "收款记录不存在或已撤销,请刷新后重试"); + } + } + //校验收款单退款状态,已退款的收款单不能撤销收款 + Set receiptManageIdSet = receiptDetails.stream().map(ReceiptDetail::getReceiptManageId).collect(Collectors.toSet()); + LambdaQueryWrapper queryWrapperManage = new LambdaQueryWrapper<>(); + queryWrapperManage.in(ReceiptManage::getReceiptManageId, receiptManageIdSet); + List receiptManageList = receiptManageService.list(queryWrapperManage); + if (null != receiptManageList) { + ReceiptManage refundManage = receiptManageList.stream().filter(info -> ObjectUtil.equal(info.getPaymentStatus(), 2)).findAny().orElse(null); + if (null != refundManage) { + throw new ServiceException("收款单" + refundManage.getCollectionNum() + "已退款,无法撤销收款"); + } + } + //账单恢复为收款为0状态并保存撤销收款操作日志 + Boolean flagTwo = billManageDomainService.cancelCollectionInfo(receiptDetails); + //逻辑删除收款明细 + Boolean flag = receiptDetailDomainService.cancelCollectionDetails(receiptDetails); + //按剩余明细重新计算涉及的收款单金额,明细已全部撤销时逻辑删除收款单 + Boolean flagThree = true; + for (Long receiptManageId : receiptManageIdSet) { + flagThree = updateReceiptManageByCancel(receiptManageId) && flagThree; + } + return flag && flagTwo && flagThree; + } + + /** + * 撤销收款后重新计算收款单信息,收款明细已全部撤销时逻辑删除收款单 + */ + private Boolean updateReceiptManageByCancel(Long receiptManageId) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + //查询收款单下剩余未撤销的收款明细 + LambdaQueryWrapper queryWrapperDetail = new LambdaQueryWrapper<>(); + queryWrapperDetail.eq(ReceiptDetail::getReceiptManageId, receiptManageId); + queryWrapperDetail.eq(ReceiptDetail::getDelFlag, 1); + List receiptDetailList = receiptDetailDomainService.queryListByLambda(queryWrapperDetail); + ReceiptManage receiptManageSave = new ReceiptManage(); + receiptManageSave.setReceiptManageId(receiptManageId); + receiptManageSave.setUpdateBy(loginUser.getUserPo().getUserId()); + receiptManageSave.setUpdateByName(loginUser.getUserPo().getUserName()); + receiptManageSave.setUpdateTime(new Date()); + if (null == receiptDetailList || receiptDetailList.size() == 0) { + //收款明细已全部撤销,逻辑删除收款单 + receiptManageSave.setDelFlag(2); + return receiptManageService.updateById(receiptManageSave); + } + //按剩余明细重新计算收款单金额 + BigDecimal billAmount = receiptDetailList.stream().map(ReceiptDetail::getBillAmount).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal collectedDiscount = receiptDetailList.stream().map(ReceiptDetail::getCollectedDiscount).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal collectedAmount = receiptDetailList.stream().map(ReceiptDetail::getCollectedAmount).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal uncollectedAmount = receiptDetailList.stream().map(ReceiptDetail::getBillAmountUnsettledResidue).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal billAmountUnsettled = receiptDetailList.stream().map(ReceiptDetail::getBillAmountUnsettled).reduce(BigDecimal.ZERO, BigDecimal::add); + receiptManageSave.setBillAmount(billAmount); + receiptManageSave.setCollectedDiscount(collectedDiscount); + receiptManageSave.setCollectedAmount(collectedAmount); + receiptManageSave.setUncollectedAmount(uncollectedAmount); + receiptManageSave.setBillAmountUnsettled(billAmountUnsettled); + //账单金额 = 已收金额 + 剩余未收金额 + 收款优惠金额 + 收款金额 + receiptManageSave.setBillAmountSettlement(billAmount.subtract(uncollectedAmount).subtract(collectedDiscount).subtract(collectedAmount)); + return receiptManageService.updateById(receiptManageSave); + } + + /** + * 撤销收款-查询账单涉及的收款单id(用于加锁,防止并发撤销时收款单金额重算冲突) + */ + public Set queryReceiptManageIdsByBillManageIds(String billManageIds) { + Set receiptManageIdSet = new HashSet<>(); + if (StringUtils.isEmpty(billManageIds)) { + return receiptManageIdSet; + } + Set billManageIdSet = Stream.of(billManageIds.split(",")).filter(StringUtils::isNotEmpty).map(String::trim).map(Long::valueOf).collect(Collectors.toSet()); + if (billManageIdSet.size() == 0) { + return receiptManageIdSet; + } + LambdaQueryWrapper queryWrapperDetail = new LambdaQueryWrapper<>(); + queryWrapperDetail.in(ReceiptDetail::getBillManageId, billManageIdSet); + queryWrapperDetail.eq(ReceiptDetail::getDelFlag, 1); + List receiptDetails = receiptDetailDomainService.queryListByLambda(queryWrapperDetail); + if (null == receiptDetails || receiptDetails.size() == 0) { + return receiptManageIdSet; + } + receiptDetails.forEach(receiptDetail -> receiptManageIdSet.add(receiptDetail.getReceiptManageId())); + return receiptManageIdSet; + } + /** * 查询收款单详情 */ diff --git a/mhd_bms/src/main/java/com/mhd/bms/infrastructure/constant/BillLogsConstants.java b/mhd_bms/src/main/java/com/mhd/bms/infrastructure/constant/BillLogsConstants.java index 4c1eb32ba..f63bb1fca 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/infrastructure/constant/BillLogsConstants.java +++ b/mhd_bms/src/main/java/com/mhd/bms/infrastructure/constant/BillLogsConstants.java @@ -88,6 +88,14 @@ public class BillLogsConstants public static final String refund_bill_text = "退款单号:{},退款金额:{}元"; + /** + * 撤销收款 + * 收款单号:{},撤销收款金额:{}元(实收{}元,优惠{}元) + */ + public static final String cancel_collection_bill_title = "撤销收款"; + public static final String cancel_collection_bill_text = "收款单号:{},撤销收款金额:{}元(实收{}元,优惠{}元)"; + + /** * 付款 * 付款单号:{},付款金额:{}元 @@ -104,4 +112,11 @@ public class BillLogsConstants public static final String copy_bill_text = "原账单编号:{},新账单编号:{}"; + /** + * 红冲账单 + * 红冲账单编号:{},红冲金额:{}元 + */ + public static final String red_flush_bill_title = "红冲账单"; + public static final String red_flush_bill_text = "红冲账单编号:{},红冲金额:{}元"; + } diff --git a/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillManageDTO.java b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillManageDTO.java index 225e23588..253b83485 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillManageDTO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillManageDTO.java @@ -47,8 +47,8 @@ public class BillManageDTO extends BaseVOEntity{ @Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付") private Integer billType; - @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款)") - @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款") + @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲)") + @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲") private Integer billState; @ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)") @@ -276,4 +276,11 @@ public class BillManageDTO extends BaseVOEntity{ private String paymentAccountId; @ApiModelProperty("收款帐户名称") private String paymentAccountName; + + @ApiModelProperty("账单月份(yyyy-MM,按创建时间月份筛选,用于客户月账单分组查询)") + private String billMonth; + + @ApiModelProperty("红冲原因") + @Excel(name = "红冲原因") + private String redFlushRemark; } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillManageExportVO.java b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillManageExportVO.java index e7ce56b74..a0ae318ec 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillManageExportVO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillManageExportVO.java @@ -28,7 +28,7 @@ public class BillManageExportVO { @Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付") private Integer billType; - @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款") + @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲") private Integer billState; @Excel(name = "账单流程节点", readConverterExp = "1=-发起对账,2-客户确认,3-财务审核,4-收款/付款") diff --git a/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/CustomerMonthBillVO.java b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/CustomerMonthBillVO.java new file mode 100644 index 000000000..39b18a239 --- /dev/null +++ b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/CustomerMonthBillVO.java @@ -0,0 +1,65 @@ +package com.mhd.bms.interfaces.dto.billManage; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "客户月账单VO", description = "客户每月账单分组统计信息") +public class CustomerMonthBillVO implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("结算对象id") + private Long settlementCustomersId; + + @ApiModelProperty("结算对象code") + private String settlementCustomersCode; + + @ApiModelProperty("结算对象/客户名称") + private String settlementEntity; + + @ApiModelProperty("结算主体id") + private Long settlementEntityId; + + @ApiModelProperty("结算主体") + private String settlementEntityName; + + @ApiModelProperty("组织ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + private String organizationName; + + @ApiModelProperty("账单月份(yyyy-MM)") + private String billMonth; + + @ApiModelProperty("账单总金额合计") + private BigDecimal totalBillAmount; + + @ApiModelProperty("已收金额合计") + private BigDecimal totalSettledAmount; + + @ApiModelProperty("未收金额合计") + private BigDecimal totalUnsettledAmount; + + @ApiModelProperty("账单数量") + private Integer billCount; + + @ApiModelProperty("付款状态(1-未付款,2-部分付款,3-已付款)") + private Integer paymentStatus; + + @ApiModelProperty("付款状态名称") + private String paymentStatusName; + + @ApiModelProperty("应收账单id列表(逗号拼接)") + private String billManageIds; + + @ApiModelProperty("结算方式") + private String settlementMethod; + + @ApiModelProperty("默认结算币种") + private String settlementCurrency; +} \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billOperationLog/BillOperationLogDTO.java b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billOperationLog/BillOperationLogDTO.java index 14d064baf..2dbad9cec 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billOperationLog/BillOperationLogDTO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billOperationLog/BillOperationLogDTO.java @@ -40,8 +40,8 @@ public class BillOperationLogDTO extends BaseVOEntity{ @Excel(name = "账单管理id") private Long billManageId; - @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款)") - @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款") + @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲)") + @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲") private Integer operationType; @ApiModelProperty("操作信息") diff --git a/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BillManageApi.java b/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BillManageApi.java index f2816b63e..2c831cc93 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BillManageApi.java +++ b/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BillManageApi.java @@ -3,6 +3,7 @@ package com.mhd.bms.interfaces.facadeApi; import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.math.BigDecimal; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -17,6 +18,7 @@ import com.mhd.bms.infrastructure.utils.UniqueKeyUtil; import com.mhd.bms.interfaces.dto.billingStatement.BillingStatementDTO; import com.mhd.bms.interfaces.dto.billManage.BillManageExportVO; import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.utils.StringUtils; import com.mhd.common.core.utils.poi.ExcelUtil; import com.mhd.common.log.annotation.Log; import com.mhd.common.log.enums.BusinessType; @@ -31,9 +33,17 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.*; import com.mhd.bms.interfaces.dto.billManage.BillManageDTO; +import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO; import com.mhd.bms.domain.billManage.repository.todo.BillManageDO; import com.mhd.bms.domain.billManage.repository.po.BillManagePO; import com.mhd.bms.interfaces.assembler.billManage.BillManageAssembler; +import com.mhd.bms.domain.receiptManage.service.ReceiptDetailDomainService; +import com.mhd.bms.domain.receiptManage.entity.ReceiptDetail; +import com.mhd.bms.domain.receiptManage.entity.ReceiptManage; +import com.mhd.bms.domain.receiptManage.repository.facade.IReceiptManageService; +import com.mhd.bms.domain.receiptManage.repository.po.ReceiptManagePO; +import com.mhd.bms.domain.receiptManage.repository.po.ReceiptDetailPO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import com.mhd.common.core.web.controller.BaseController; @@ -54,6 +64,10 @@ public class BillManageApi extends BaseController{ private BillManageApplicationService billManageApplicationService; @Autowired private RedisLock redisLock; + @Autowired + private ReceiptDetailDomainService receiptDetailDomainService; + @Autowired + private IReceiptManageService receiptManageService; /** * 分页查询账单管理列表 @@ -84,6 +98,171 @@ public class BillManageApi extends BaseController{ return AjaxResult.success(billManageApplicationService.listCount(billManageDO)); } + /** + * 客户每月账单分组列表(应收) + */ + @ApiOperation("客户每月账单分组列表") + @GetMapping("/receivableCustomerMonthList") + public TableDataInfo receivableCustomerMonthList(BillManageDTO billManageDTO) + { + BillManageDO billManageDO = new BillManageDO(); + BeanUtils.copyProperties(billManageDTO, billManageDO); + billManageDO.setBillType(1); + startPage(); + List list = billManageApplicationService.queryCustomerMonthBillList(billManageDO); + return getDataTable(list); + } + + /** + * 客户每月账单分组列表统计(应收) + */ + @ApiOperation("客户每月账单分组列表统计") + @GetMapping(value = "/receivableCustomerMonthListCount") + public AjaxResult receivableCustomerMonthListCount(BillManageDTO billManageDTO) + { + BillManageDO billManageDO = new BillManageDO(); + BeanUtils.copyProperties(billManageDTO, billManageDO); + billManageDO.setBillType(1); + List list = billManageApplicationService.queryCustomerMonthBillList(billManageDO); + BigDecimal totalBillAmount = list.stream() + .map(CustomerMonthBillVO::getTotalBillAmount) + .filter(java.util.Objects::nonNull) + .reduce(java.math.BigDecimal.ZERO, java.math.BigDecimal::add); + BigDecimal totalSettledAmount = list.stream() + .map(CustomerMonthBillVO::getTotalSettledAmount) + .filter(java.util.Objects::nonNull) + .reduce(java.math.BigDecimal.ZERO, java.math.BigDecimal::add); + BigDecimal totalUnsettledAmount = list.stream() + .map(CustomerMonthBillVO::getTotalUnsettledAmount) + .filter(java.util.Objects::nonNull) + .reduce(java.math.BigDecimal.ZERO, java.math.BigDecimal::add); + java.util.Map resultMap = new java.util.HashMap<>(); + resultMap.put("totalBillAmount", totalBillAmount); + resultMap.put("totalSettledAmount", totalSettledAmount); + resultMap.put("totalUnsettledAmount", totalUnsettledAmount); + resultMap.put("totalCount", list.size()); + return AjaxResult.success(resultMap); + } + + /** + * 根据账单ID列表查询应收账单详情(客户月账单点击账单数量回显) + */ + @ApiOperation("根据账单ID列表查询应收账单详情") + @GetMapping("/receivableDetailByMonth") + public TableDataInfo receivableDetailByMonth(BillManageDTO billManageDTO) + { + if (billManageDTO.getBillManageIds() != null && !billManageDTO.getBillManageIds().isEmpty()) { + Set idSet = java.util.Arrays.stream(billManageDTO.getBillManageIds().split(",")) + .collect(java.util.stream.Collectors.toSet()); + billManageDTO.setBillManageIdSet(idSet); + } + BillManageDO billManageDO = new BillManageDO(); + BeanUtils.copyProperties(billManageDTO, billManageDO); + billManageDO.setBillType(1); + startPage(); + List list = billManageApplicationService.queryList(billManageDO); + return getDataTable(list); + } + + @ApiOperation("根据账单ID列表查询应收账单汇总") + @GetMapping("/receivableSumByMonth") + public AjaxResult receivableSumByMonth(BillManageDTO billManageDTO) + { + if (billManageDTO.getBillManageIds() != null && !billManageDTO.getBillManageIds().isEmpty()) { + Set idSet = java.util.Arrays.stream(billManageDTO.getBillManageIds().split(",")) + .collect(java.util.stream.Collectors.toSet()); + billManageDTO.setBillManageIdSet(idSet); + } + BillManageDO billManageDO = new BillManageDO(); + BeanUtils.copyProperties(billManageDTO, billManageDO); + billManageDO.setBillType(1); + List list = billManageApplicationService.queryList(billManageDO); + + Set billManageIdSet = list.stream() + .map(BillManagePO::getBillManageId) + .filter(java.util.Objects::nonNull) + .collect(java.util.stream.Collectors.toSet()); + + List allReceiptDetails = new ArrayList<>(); + Set receiptManageIdSet = new java.util.HashSet<>(); + List receiptManageList = new ArrayList<>(); + + if (!billManageIdSet.isEmpty()) { + allReceiptDetails = receiptDetailDomainService.queryListByLambda( + new LambdaQueryWrapper() + .in(ReceiptDetail::getBillManageId, billManageIdSet) + .eq(ReceiptDetail::getDelFlag, 1)); + + java.util.Map> detailByBillId = allReceiptDetails.stream() + .collect(java.util.stream.Collectors.groupingBy(ReceiptDetail::getBillManageId)); + for (BillManagePO bill : list) { + bill.setReceiptDetailList(detailByBillId.getOrDefault(bill.getBillManageId(), new ArrayList<>())); + } + + receiptManageIdSet = allReceiptDetails.stream() + .map(ReceiptDetail::getReceiptManageId) + .filter(java.util.Objects::nonNull) + .collect(java.util.stream.Collectors.toSet()); + + if (!receiptManageIdSet.isEmpty()) { + List manages = receiptManageService.list( + new LambdaQueryWrapper() + .in(ReceiptManage::getReceiptManageId, receiptManageIdSet) + .eq(ReceiptManage::getDelFlag, 1)); + + java.util.Map> detailPOByManageId = allReceiptDetails.stream() + .map(d -> { + ReceiptDetailPO po = new ReceiptDetailPO(); + BeanUtils.copyProperties(d, po); + return po; + }) + .collect(java.util.stream.Collectors.groupingBy(ReceiptDetailPO::getReceiptManageId)); + + for (ReceiptManage m : manages) { + ReceiptManagePO po = new ReceiptManagePO(); + BeanUtils.copyProperties(m, po); + po.setReceiptDetailPOList(detailPOByManageId.getOrDefault(m.getReceiptManageId(), new ArrayList<>())); + receiptManageList.add(po); + } + } + } + + BigDecimal totalBillAmount = list.stream() + .map(BillManagePO::getBillAmount) + .filter(java.util.Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalSettledAmount = list.stream() + .map(BillManagePO::getBillAmountSettlement) + .filter(java.util.Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalUnsettledAmount = list.stream() + .map(BillManagePO::getBillAmountUnsettled) + .filter(java.util.Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + int billCount = list.size(); + + String collectionStatus; + if (billCount == 0) { + collectionStatus = "无数据"; + } else if (totalUnsettledAmount.compareTo(BigDecimal.ZERO) == 0) { + collectionStatus = "已收款"; + } else if (totalSettledAmount.compareTo(BigDecimal.ZERO) == 0) { + collectionStatus = "未收款"; + } else { + collectionStatus = "部分收款"; + } + + java.util.Map resultMap = new java.util.HashMap<>(); + resultMap.put("totalBillAmount", totalBillAmount); + resultMap.put("totalSettledAmount", totalSettledAmount); + resultMap.put("totalUnsettledAmount", totalUnsettledAmount); + resultMap.put("billCount", billCount); + resultMap.put("collectionStatus", collectionStatus); + resultMap.put("billList", list); + resultMap.put("receiptManageList", receiptManageList); + return AjaxResult.success(resultMap); + } + @ApiOperation("导出应收账单") @GetMapping(value = "/exportReceivableList", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") public void exportReceivableList(BillManageDTO billManageDTO, HttpServletResponse response) throws IOException @@ -328,6 +507,46 @@ public class BillManageApi extends BaseController{ } + @ApiOperation("应收账单-红冲") + @PostMapping("/redFlushBill") + public AjaxResult redFlushBill(@RequestBody BillManageDTO billManageDTO) + { + if(!StringUtils.isNotEmpty(billManageDTO.getBillManageIds())){ + throw new ServiceException("账单id不能为空"); + } + //批量加锁 + RedissonMultiLock redissonMultiLock = null; + boolean lockFlag = false; + try { + RedisLockTypeEnum redisLockTypeEnum = RedisLockTypeEnum.BMS; + List locks = new ArrayList<>(); + Set billIdSet = Stream.of(billManageDTO.getBillManageIds().split(",")).filter(StringUtils::isNotEmpty).map(String::trim).collect(Collectors.toSet()); + billIdSet.forEach(x -> { + //获取唯一key值 + String key = redisLockTypeEnum.getUniqueKey(UniqueKeyUtil.getBillingKey(x)); + locks.add(redisLock.getRLock(key)); + }); + redissonMultiLock = new RedissonMultiLock(locks.toArray(new RLock[billIdSet.size()])); + //尝试获取锁 不等待 持有锁10分钟 + lockFlag = redissonMultiLock.tryLock(-1, 10, TimeUnit.MINUTES); + if (!lockFlag) { + redissonMultiLock = null; + throw new ServiceException("账单正在操作中,请稍后重试"); + } + log.info("红冲账单加锁成功"); + billManageApplicationService.redFlushBill(billManageDTO); + return AjaxResult.success("操作成功"); + }catch (Exception e){ + return AjaxResult.error("红冲账单失败:"+e.getMessage()); + } finally { + if (redissonMultiLock != null && lockFlag){ + redissonMultiLock.unlock(); + log.info("红冲账单释放锁成功"); + } + } + } + + @ApiOperation("应收账单-客户确认") @PostMapping("/customerConfirmation") public AjaxResult customerConfirmation(@RequestBody BillManageDTO billManageDTO) @@ -438,6 +657,21 @@ public class BillManageApi extends BaseController{ } + /** + * 客户月结报表 + */ + @ApiOperation("客户月结报表") + @GetMapping("/customerMonthlyReport") + public TableDataInfo customerMonthlyReport(BillManageDTO billManageDTO) + { + //转换实体 + BillManageDO billManageDO = new BillManageDO(); + BeanUtils.copyProperties(billManageDTO,billManageDO); + startPage(); + billManageDO.setBillType(1); + List list = billManageApplicationService.customerMonthlyReport(billManageDO); + return getDataTable(list); + } diff --git a/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BillingStatementApi.java b/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BillingStatementApi.java index c1f898c9b..8fce2f5e5 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BillingStatementApi.java +++ b/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BillingStatementApi.java @@ -339,7 +339,10 @@ public class BillingStatementApi extends BaseController { String shipperId = XxlJobHelper.getJobParam(); logger.info("XXL-JOB 开始入库业务单推送bms计费流水,货主id参数:{}", shipperId); try { + //干仓 billingStatementApplicationService.pushBillManage(shipperId); + //冻仓 + billingStatementApplicationService.pushBillManageDC(shipperId); // 设置任务执行结果 XxlJobHelper.handleSuccess("入库业务单推送bms计费流水执行成功"); } catch (Exception e) { diff --git a/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/ReceiptManageApi.java b/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/ReceiptManageApi.java index 7aa97686c..c733bde13 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/ReceiptManageApi.java +++ b/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/ReceiptManageApi.java @@ -1,6 +1,7 @@ package com.mhd.bms.interfaces.facadeApi; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -114,6 +115,57 @@ public class ReceiptManageApi extends BaseController{ } } + /** + * 撤销收款 + */ + @ApiOperation("撤销收款") + @RepeatSubmit + @PostMapping("/cancelCollection") + public AjaxResult cancelCollection(@RequestBody ReceiptManageDTO receiptManageDTO) + { + if(!StringUtils.isNotEmpty(receiptManageDTO.getBillManageIds())){ + throw new ServiceException("撤销账单不能为空"); + } + RedissonMultiLock redissonMultiLock = null; + boolean payInfoDetailLock = false; + try { + RedisLockTypeEnum redisLockTypeEnum = RedisLockTypeEnum.BMS; + List locks = new ArrayList<>(); + //账单id与涉及的收款单id去重后加锁,避免同一把锁重复加锁 + Set lockKeySet = new LinkedHashSet<>(); + lockKeySet.addAll(Stream.of(receiptManageDTO.getBillManageIds().split(",")).filter(StringUtils::isNotEmpty).map(String::trim).collect(Collectors.toSet())); + //查询账单涉及的收款单,一并加锁,避免并发撤销时收款单金额重算冲突 + Set receiptManageIdSet = receiptManageApplicationService.queryCancelCollectionReceiptManageIds(receiptManageDTO.getBillManageIds()); + if (null != receiptManageIdSet) { + receiptManageIdSet.forEach(x -> lockKeySet.add(String.valueOf(x))); + } + lockKeySet.forEach(x -> { + //获取唯一key值 + String key = redisLockTypeEnum.getUniqueKey(UniqueKeyUtil.getBillingKey(x)); + locks.add(redisLock.getRLock(key)); + }); + redissonMultiLock = new RedissonMultiLock(locks.toArray(new RLock[lockKeySet.size()])); + //尝试获取锁 不等待 持有锁10分钟 + payInfoDetailLock = redissonMultiLock.tryLock(-1, 10, TimeUnit.MINUTES); + if (!payInfoDetailLock) { + redissonMultiLock = null; + return AjaxResult.error("收款单正在处理,请稍后再试"); + } + log.info("撤销收款加锁成功"); + //转换实体 + ReceiptManageDO receiptManageDO = new ReceiptManageDO(); + BeanUtils.copyProperties(receiptManageDTO,receiptManageDO); + return toAjax(receiptManageApplicationService.cancelCollection(receiptManageDO)); + }catch (Exception e){ + return AjaxResult.error("撤销收款失败:" + e.getMessage()); + }finally { + if (redissonMultiLock != null && payInfoDetailLock) { + redissonMultiLock.unlock(); + log.info("撤销收款释放了锁"); + } + } + } + /** * 批量删除收款单管理 */ diff --git a/mhd_bms/src/main/resources/mapper/BillManageMapper.xml b/mhd_bms/src/main/resources/mapper/BillManageMapper.xml index 3666da832..3289382d4 100644 --- a/mhd_bms/src/main/resources/mapper/BillManageMapper.xml +++ b/mhd_bms/src/main/resources/mapper/BillManageMapper.xml @@ -22,7 +22,56 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ORDER BY a.create_time DESC + + + + + + AND TO_CHAR(a.CREATE_TIME, 'YYYY-MM') = #{billManageDO.billMonth} + AND date_format(a.create_time,'%Y-%m-%d') =]]> #{billManageDO.createTimeStart} diff --git a/mhd_bms/src/main/resources/mapper/BillOperationLogMapper.xml b/mhd_bms/src/main/resources/mapper/BillOperationLogMapper.xml index 7098fe232..1a55a853e 100644 --- a/mhd_bms/src/main/resources/mapper/BillOperationLogMapper.xml +++ b/mhd_bms/src/main/resources/mapper/BillOperationLogMapper.xml @@ -12,39 +12,39 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - and create_by_name like concat('%', #{createByName}, '%') + + and create_by_name like concat('%', #{billOperationLogDO.createByName}, '%') - - and update_by_name like concat('%', #{updateByName}, '%') + + and update_by_name like concat('%', #{billOperationLogDO.updateByName}, '%') - - and top_organization_id = #{topOrganizationId} + + and top_organization_id = #{billOperationLogDO.topOrganizationId} - - and organization_id = #{organizationId} + + and organization_id = #{billOperationLogDO.organizationId} - - and organization_name like concat('%', #{organizationName}, '%') + + and organization_name like concat('%', #{billOperationLogDO.organizationName}, '%') - - and bill_manage_id = #{billManageId} + + and bill_manage_id = #{billOperationLogDO.billManageId} - - and bill_number = #{billNumber} + + + + + and operation_type = #{billOperationLogDO.operationType} - - and operation_type = #{operationType} - - - and operation_info = #{operationInfo} - - - and operator = #{operator} - - - and operation_time = #{operationTime} + + and operation_info = #{billOperationLogDO.operationInfo} + + + + + + @@ -64,4 +64,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND bill_manage_id = #{billManageIds} ORDER BY create_time ASC - + \ No newline at end of file diff --git a/mhd_bms/src/main/resources/mapper/BillingStatementMapper.xml b/mhd_bms/src/main/resources/mapper/BillingStatementMapper.xml index 82ebab40d..83d62254d 100644 --- a/mhd_bms/src/main/resources/mapper/BillingStatementMapper.xml +++ b/mhd_bms/src/main/resources/mapper/BillingStatementMapper.xml @@ -275,7 +275,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT RATE as "taxRate" FROM - EXPENSE_ACCOUNT + NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT WHERE SUBJECT_CODE = #{subjectCode} AND SUBJECT_NAME = #{subjectName} diff --git a/mhd_bms/src/main/resources/mapper/ReceiptManageMapper.xml b/mhd_bms/src/main/resources/mapper/ReceiptManageMapper.xml index 951e90838..3242d96cb 100644 --- a/mhd_bms/src/main/resources/mapper/ReceiptManageMapper.xml +++ b/mhd_bms/src/main/resources/mapper/ReceiptManageMapper.xml @@ -13,7 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WM_CONCAT(b.bill_number) AS billNumbers FROM receipt_manage a - LEFT JOIN receipt_detail b ON a.receipt_manage_id = b.receipt_manage_id + LEFT JOIN receipt_detail b ON a.receipt_manage_id = b.receipt_manage_id AND b.del_flag = 1 WHERE a.del_flag = 1 @@ -101,6 +101,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" left join PAYMENT_WALLET c on b.payment_card_id = c.PAYMENT_WALLET_ID WHERE a.bill_manage_id = #{billManageId} + AND a.del_flag = 1 \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderAdjustService.java b/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderAdjustService.java index 44ce3ebbe..1411518ec 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderAdjustService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderAdjustService.java @@ -7,9 +7,16 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.mhd.common.core.domain.dto.wlhy.TmsAddressMultiDTO; +import com.mhd.common.core.domain.dto.wlhy.TmsCargoInfoDTO; +import com.mhd.common.core.domain.dto.wlhy.TmsOrderAccount; import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.domain.businessDocumentAddressMulti.entity.BusinessDocumentAddressMulti; +import com.mhd.oms.domain.businessDocumentAddressMulti.repository.mapper.BusinessDocumentAddressMultiMapper; +import com.mhd.oms.domain.businessDocumentCargoMulti.entity.BusinessDocumentCargoMulti; +import com.mhd.oms.domain.businessDocumentCargoMulti.repository.mapper.BusinessDocumentCargoMultiMapper; import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder; import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper; import com.mhd.oms.domain.businessDocumentOrderAdjust.entity.BusinessDocumentOrderAdjust; @@ -20,11 +27,13 @@ import com.mhd.oms.domain.businessOrderAccount.BusinessOrderAccount; import com.mhd.oms.domain.businessOrderAccount.repository.mapper.BusinessOrderAccountMapper; import com.mhd.oms.domain.executeOrder.entity.ExecuteOrder; import com.mhd.oms.domain.executeOrder.repository.mapper.ExecuteOrderMapper; +import com.mhd.oms.interfaces.dto.businessDocumentAddressMulti.BusinessDocumentAddressMultiDTO; import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustAuditDTO; import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustDTO; import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustQueryDTO; import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustRecordDTO; import com.mhd.system.api.WlhyServiceFeign; +import com.mhd.system.api.domain.TmsOrderAddDTO; import com.mhd.system.api.model.LoginUser; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -36,6 +45,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -46,16 +56,23 @@ import java.util.stream.Collectors; * 2. 费用数据源 = 前端回传的费用明细 business_order_account(feeDetailList); * 主表金额 deliveryFreight 为其 amount 合计(冗余汇总,后端自动算)。 * 3. 是否需审核:一旦任一「金额」发生变化 - * = feeDetailList 明细 amount 变化,或主表金额列变化 -> 走业务主管审核; + * = feeDetailList 明细 amount 变化,或主表金额/费用列变化 -> 走业务主管审核; * 否则(仅改非金额字段) -> 直通。 + * 「金额/费用」字段涵盖: deliveryFreight / collectedFreight / uncollectedFreight / + * collectLessFreight / transportationUnitPrice / infoFee / freightUnitPrice / + * cargoInsuranceAmount / freightCharges / freightFee / unloadingFee / customsFee / + * shortageFee / miscellaneousFee / otherFee / detentionFee,以及 settlementCurrency / + * paymentAccountId / accountName / accountInformation(结算币种+收款账户任一变化即视为费用变更)。 + * 判定口径: 以后端兜底比对为准(主表金额/费用列 + 明细 amount 合计), + * 前端 amountChanged 仅作提示;后端比对结果与前端 OR 运算,避免前端误传 false 绕过审核。 * 4. 涉及金额提交 -> 仅把业务单 review_status 置为「调整待审核(3)」;主记录 AUDIT_STATUS=0(待审核); * 不更新业务单数据,不影响其它状态(order_status / execute_status 不动)。 * 5. 审核通过 -> 覆盖业务单(金额) + 替换费用明细;review_status 一律置为 1(已审核), * 不影响 order_status / execute_status。 - * 审核驳回 -> 不更新业务单数据,review_status 还原为调整前值(主记录 before_review_status),可再次调整。 + * 审核驳回 -> 不更新业务单数据,review_status 置为「调整驳回(4)」,不影响 order_status/execute_status, + * 可再次调整提交审核。 * 6. 直通(未改金额) -> 覆盖业务单可编辑字段 + deliveryFreight(明细合计),并替换 business_order_account * (逻辑删旧 is_delete=1 + 插新 is_delete=0);不改动任何审核/执行状态。 - * 7. 前端以 amountChanged 告知是否改金额(默认前端判定);未传时后端兜底比对。 * * 说明:review_status 原枚举 0未审/1通过/2驳回,新增 3=调整待审核;不改变原有用例。 * @@ -70,12 +87,22 @@ public class BusinessDocumentOrderAdjustService { private static final Integer AUDIT_PASS = 1; // 调整记录:审核通过 private static final Integer AUDIT_REJECT = 2; // 调整记录:驳回 - /** 主表金额(费用)字段,任一变化触发审核 */ + /** 业务单 review_status:调整待审核(提交涉及金额时置) */ + private static final Long REVIEW_ADJUST_WAIT = 3L; + /** 业务单 review_status:调整驳回(审核驳回时置,与普通驳回 2 区分) */ + private static final Long REVIEW_ADJUST_REJECT = 4L; + + /** 主表金额(费用)字段,任一变化触发审核 + * 含: 运费相关 8 项 + 其他费用 8 项 + 结算币种 + 收款账户(3 字段) + * 任意一项变化即需要审核(对应前端"费用合计 / 运费 / 装卸费 / 仓租及柜租(走明细) / + * 保险 / 压车(走明细) / 运输处理费(走明细) / 报关费 / 其他 / 费用合计 / 结算币种 / 收款账户") */ private static final List FEE_FIELDS = Arrays.asList( "deliveryFreight", "collectedFreight", "uncollectedFreight", "collectLessFreight", "transportationUnitPrice", "infoFee", "freightUnitPrice", "cargoInsuranceAmount", "freightCharges", "freightFee", "unloadingFee", "customsFee", "shortageFee", - "miscellaneousFee", "otherFee", "detentionFee"); + "miscellaneousFee", "otherFee", "detentionFee", + // 结算币种 + 收款账户 任一变化也视为费用变更,需审核 + "settlementCurrency", "paymentAccountId", "accountName", "accountInformation"); /** 不允许被前端调整覆盖的系统字段 */ private static final List PROTECTED_FIELDS = Arrays.asList( @@ -83,7 +110,7 @@ public class BusinessDocumentOrderAdjustService { "orderStatus", "reviewStatus", "reviewId", "review", "reviewTime", "reviewOpinion", "salesManager", "auditStatus", "auditBy", "auditTime", "executeStatus", "executeId", "executeTime", "executor", - "executeOrderId", "executeOrderNumber", "adjustStatus", + "executeOrderId", "executeOrderNumber", "isDelete", "delFlag", "createBy", "createByName", "createTime", "updateBy", "updateByName", "updateTime", "pushStatus", "pushTime", "pushBy", "pushByName", @@ -112,6 +139,12 @@ public class BusinessDocumentOrderAdjustService { @Autowired private ExecuteOrderMapper executeOrderMapper; + @Autowired + private BusinessDocumentCargoMultiMapper businessDocumentCargoMultiMapper; + + @Autowired + private BusinessDocumentAddressMultiMapper businessDocumentAddressMultiMapper; + @Autowired private WlhyServiceFeign wlhyServiceFeign; @@ -136,12 +169,20 @@ public class BusinessDocumentOrderAdjustService { .eq(BusinessOrderAccount::getOrderId, dbOrder.getId()) .eq(BusinessOrderAccount::getIsDelete, 0)); - // 2. 调整后的费用明细(前端);为 null 则视为保持库中不变 + // 2. 调整后的费用明细(前端);为 null 则视为保持库中不变。 + // 兼容前端两种传法:顶层 feeDetailList,或整单回传 order.businessOrderAccountList List newFeeList = dto.getFeeDetailList(); + if ((newFeeList == null || newFeeList.isEmpty()) && front.getBusinessOrderAccountList() != null) { + newFeeList = front.getBusinessOrderAccountList(); + } // 3. 生成"调整后"业务单对象:DB原值 + 前端可编辑字段覆盖(忽略null) BusinessDocumentOrder afterOrder = buildAfterOrder(dbOrder, front); + // 3.1 地址兼容:前端把地址放在 shipment/receipt 或 loadingAddressList/unloadAddressList, + // 映射到 loading*/unload* 扁平字段(与下单主流程 BusinessDocumentOrderDomainService 一致口径) + applyAddressMapping(afterOrder, front); + // 4. 若提供了费用明细,则 deliveryFreight(合计)=明细 amount 之和,并联动到 afterOrder boolean hasFeeDetail = newFeeList != null && !newFeeList.isEmpty(); if (hasFeeDetail) { @@ -149,14 +190,10 @@ public class BusinessDocumentOrderAdjustService { afterOrder.setDeliveryFreight(sum); } - // 5. 判定是否修改了金额:以前端 amountChanged 为准(前端整单回传已自行判定); - // 若前端未传则后端兜底比对(主表金额列 或 明细 amount 变化) - boolean amountChanged; - if (dto.getAmountChanged() != null) { - amountChanged = dto.getAmountChanged(); - } else { - amountChanged = isAmountChanged(dbOrder, front, hasFeeDetail, dbFeeList, newFeeList); - } + // 5. 判定是否修改了金额:以后端兜底比对为准,避免前端误传 false 绕过审核; + // 前端传 true 也尊重;后端比对结果与前端 OR 运算(任一为真则需审核)。 + boolean backendChanged = isAmountChanged(dbOrder, front, hasFeeDetail, dbFeeList, newFeeList); + boolean amountChanged = backendChanged || Boolean.TRUE.equals(dto.getAmountChanged()); // 6. 写主记录 LoginUser loginUser = SecurityUtils.getLoginUser(); @@ -188,7 +225,7 @@ public class BusinessDocumentOrderAdjustService { // 8b. 涉及金额:仅把业务单 review_status 置为"调整待审核(3)",其余状态(exec/orderStatus)不动,不更新业务单数据 BusinessDocumentOrder statusOnly = new BusinessDocumentOrder(); statusOnly.setId(dbOrder.getId()); - statusOnly.setReviewStatus(3L); // 调整待审核 + statusOnly.setReviewStatus(REVIEW_ADJUST_WAIT); // 调整待审核 businessDocumentOrderMapper.updateById(statusOnly); } @@ -250,11 +287,27 @@ public class BusinessDocumentOrderAdjustService { /** * 按业务单查询调整记录(供订单详情页"调整记录"Tab用) + * 每条记录同时带出调整后明细快照(detail),前端可自包含展示,无需再单独调详情接口 */ public List listAdjustRecordByOrder(Long orderId) { BusinessDocumentOrderAdjustQueryDTO query = new BusinessDocumentOrderAdjustQueryDTO(); query.setOrderId(orderId); - return listAdjustRecord(query); + List list = listAdjustRecord(query); + if (list == null || list.isEmpty()) { + return list; + } + // 批量取明细快照按 adjust_id 一次性拼上,避免 N+1 + List adjustIds = list.stream() + .map(BusinessDocumentOrderAdjustRecordDTO::getId) + .collect(Collectors.toList()); + List details = adjustDetailMapper.selectList( + new LambdaQueryWrapper() + .in(BusinessDocumentOrderAdjustDetail::getAdjustId, adjustIds) + .eq(BusinessDocumentOrderAdjustDetail::getDelFlag, 1)); + Map detailMap = details.stream() + .collect(Collectors.toMap(BusinessDocumentOrderAdjustDetail::getAdjustId, d -> d, (a, b) -> a)); + list.forEach(vo -> vo.setDetail(detailMap.get(vo.getId()))); + return list; } /** @@ -353,6 +406,7 @@ public class BusinessDocumentOrderAdjustService { syncTmsAsync(order.getGoodsNumber(), toSave); } else { adjust.setAuditStatus(AUDIT_REJECT); + adjust.setIsAudit(1); // 走到审核即说明该调整需要审核,保持 is_audit 与 audit_status 语义一致 adjust.setAuditBy(auditBy); adjust.setAuditByName(auditByName); adjust.setAuditTime(now); @@ -361,10 +415,11 @@ public class BusinessDocumentOrderAdjustService { adjust.setUpdateTime(now); adjustMapper.updateById(adjust); - // 驳回:不更新业务单数据,仅把 review_status 还原为调整前值(不影响其它状态) + // 驳回:不更新业务单数据,仅把 review_status 置为「调整驳回(4)」; + // 不影响 order_status / execute_status 等其它单据状态;可再次调整提交审核 BusinessDocumentOrder statusOnly = new BusinessDocumentOrder(); statusOnly.setId(adjust.getOrderId()); - statusOnly.setReviewStatus(adjust.getBeforeReviewStatus() == null ? 0L : adjust.getBeforeReviewStatus()); + statusOnly.setReviewStatus(REVIEW_ADJUST_REJECT); businessDocumentOrderMapper.updateById(statusOnly); } return AjaxResult.success(); @@ -383,6 +438,50 @@ public class BusinessDocumentOrderAdjustService { return after; } + /** + * 地址兼容映射:前端整单回传时地址在 shipment/receipt 或 loadingAddressList/unloadAddressList, + * 这里统一映射到 business_document_order 的 loading 与 unload 系列扁平字段。 + * 口径与 BusinessDocumentOrderDomainService 下单主流程保持一致: + * 装货取第一条地址,卸货取最后一条地址。 + */ + private void applyAddressMapping(BusinessDocumentOrder after, BusinessDocumentOrder front) { + BusinessDocumentAddressMultiDTO loading = null; + BusinessDocumentAddressMultiDTO unloading = null; + + // 优先取 shipment/receipt 单对象,其次取 loadingAddressList/unloadAddressList 集合 + if (front.getShipment() != null) { + loading = front.getShipment(); + } else if (front.getLoadingAddressList() != null && !front.getLoadingAddressList().isEmpty()) { + loading = front.getLoadingAddressList().get(0); + } + if (front.getReceipt() != null) { + unloading = front.getReceipt(); + } else if (front.getUnloadAddressList() != null && !front.getUnloadAddressList().isEmpty()) { + unloading = front.getUnloadAddressList().get(front.getUnloadAddressList().size() - 1); + } + + if (loading != null) { + after.setLoadingAreaId(loading.getAreaCode()); + after.setLoadingName(loading.getAreaName() != null ? loading.getAreaName() : loading.getAreaCode()); + after.setLoadingAddress(loading.getAddress()); + after.setLoadingLongitude(loading.getLongitude()); + after.setLoadingLatitude(loading.getLatitude()); + after.setFreighterName(loading.getContactName()); + after.setLoadingPhone(loading.getContactPhone()); + after.setLoadingDate(loading.getLayDate()); + } + if (unloading != null) { + after.setUnloadAreaId(unloading.getAreaCode()); + after.setUnloadName(unloading.getAreaName() != null ? unloading.getAreaName() : unloading.getAreaCode()); + after.setUnloadAddress(unloading.getAddress()); + after.setUnloadLongitude(unloading.getLongitude()); + after.setUnloadLatitude(unloading.getLatitude()); + after.setDischargerName(unloading.getContactName()); + after.setUnloadPhone(unloading.getContactPhone()); + after.setUnloadingData(unloading.getLayDate()); + } + } + private BusinessDocumentOrderAdjust buildAdjust(BusinessDocumentOrder dbOrder, LoginUser u, Date now, boolean amountChanged, String reason) { BusinessDocumentOrderAdjust adjust = new BusinessDocumentOrderAdjust(); @@ -421,21 +520,25 @@ public class BusinessDocumentOrderAdjustService { } /** - * 是否修改了金额:主表金额列变化 或 明细 amount 变化 + * 是否修改了金额:主表金额/费用列变化 或 明细 amount 变化 */ private boolean isAmountChanged(BusinessDocumentOrder dbOrder, BusinessDocumentOrder front, boolean hasFeeDetail, List dbFeeList, List newFeeList) { - // a) 主表金额列比对 + // a) 主表金额/费用列比对(金额列用 BigDecimal 比对,字符串列用 equals 比对) boolean mainChanged = FEE_FIELDS.stream().anyMatch(field -> { Object newVal = BeanUtil.getFieldValue(front, field); if (newVal == null) { return false; } Object oldVal = BeanUtil.getFieldValue(dbOrder, field); - BigDecimal old = oldVal == null ? BigDecimal.ZERO : (BigDecimal) oldVal; - BigDecimal now = (BigDecimal) newVal; - return old.compareTo(now) != 0; + if (newVal instanceof BigDecimal || oldVal instanceof BigDecimal) { + BigDecimal old = oldVal == null ? BigDecimal.ZERO : new BigDecimal(oldVal.toString()); + BigDecimal now = new BigDecimal(newVal.toString()); + return old.compareTo(now) != 0; + } + // 字符串字段(结算币种/收款账户等) + return !newVal.toString().equals(oldVal == null ? "" : oldVal.toString()); }); if (mainChanged) { return true; @@ -505,6 +608,74 @@ public class BusinessDocumentOrderAdjustService { businessOrderAccountMapper.insert(acc); } } + + // 同步地址明细表(business_document_address_multi):逻辑删旧 + 按调整后扁平字段插新 + syncAddressDetail(orderId, toSave, loginUser, now); + } + + /** + * 同步地址明细表:把「调整后业务单」的装/卸货扁平字段写回 business_document_address_multi。 + * 与 applyAddressMapping 口径一致(装货取第一条、卸货取最后一条),此处各保留一条。 + */ + private void syncAddressDetail(Long orderId, BusinessDocumentOrder toSave, LoginUser loginUser, Date now) { + // 逻辑删旧 + List oldList = businessDocumentAddressMultiMapper.selectList( + new LambdaQueryWrapper() + .eq(BusinessDocumentAddressMulti::getOrderId, String.valueOf(orderId)) + .eq(BusinessDocumentAddressMulti::getDelFlag, 1)); + if (oldList != null) { + for (BusinessDocumentAddressMulti old : oldList) { + old.setDelFlag(0); + old.setUpdateBy(loginUser != null ? loginUser.getUserid() : null); + old.setUpdateTime(now); + businessDocumentAddressMultiMapper.updateById(old); + } + } + + Long userId = loginUser != null ? loginUser.getUserid() : null; + // 装货 + BusinessDocumentAddressMulti loading = new BusinessDocumentAddressMulti(); + loading.setOrderId(String.valueOf(orderId)); + loading.setAreaCode(toSave.getLoadingAreaId()); + loading.setAreaName(toSave.getLoadingName()); + loading.setAddress(toSave.getLoadingAddress()); + loading.setLongitude(toSave.getLoadingLongitude()); + loading.setLatitude(toSave.getLoadingLatitude()); + loading.setContactName(toSave.getFreighterName()); + loading.setContactPhone(toSave.getLoadingPhone()); + loading.setLayDate(toSave.getLoadingDate()); + loading.setLayType(1L); + loading.setDelFlag(1); + loading.setOrganizationId(toSave.getOrganizationId()); + loading.setOrganizationName(toSave.getOrganizationName()); + loading.setTopOrganizationId(toSave.getTopOrganizationId()); + loading.setCreateBy(userId); + loading.setCreateTime(now); + loading.setUpdateBy(userId); + loading.setUpdateTime(now); + businessDocumentAddressMultiMapper.insert(loading); + + // 卸货 + BusinessDocumentAddressMulti unload = new BusinessDocumentAddressMulti(); + unload.setOrderId(String.valueOf(orderId)); + unload.setAreaCode(toSave.getUnloadAreaId()); + unload.setAreaName(toSave.getUnloadName()); + unload.setAddress(toSave.getUnloadAddress()); + unload.setLongitude(toSave.getUnloadLongitude()); + unload.setLatitude(toSave.getUnloadLatitude()); + unload.setContactName(toSave.getDischargerName()); + unload.setContactPhone(toSave.getUnloadPhone()); + unload.setLayDate(toSave.getUnloadingData()); + unload.setLayType(2L); + unload.setDelFlag(1); + unload.setOrganizationId(toSave.getOrganizationId()); + unload.setOrganizationName(toSave.getOrganizationName()); + unload.setTopOrganizationId(toSave.getTopOrganizationId()); + unload.setCreateBy(userId); + unload.setCreateTime(now); + unload.setUpdateBy(userId); + unload.setUpdateTime(now); + businessDocumentAddressMultiMapper.insert(unload); } private void copySnapshot(BusinessDocumentOrder order, BusinessDocumentOrderAdjustDetail detail) { @@ -545,10 +716,111 @@ public class BusinessDocumentOrderAdjustService { if (executeOrders == null || executeOrders.isEmpty()) { return; } - log.info("业务单[{}]调整完成,关联执行单[{}]。如需回写TMS请接入TMS改费Feign。", goodsNumber, - executeOrders.stream().map(ExecuteOrder::getGoodsNumber).collect(Collectors.toList())); + for (ExecuteOrder executeOrder : executeOrders) { + // 仅已下发 TMS(存在 TMS 单号)的执行单需要同步修改 + if (StrUtil.isBlank(executeOrder.getTmsOrderNumber())) { + continue; + } + syncTmsOrder(executeOrder, after); + } } catch (Exception e) { log.error("同步TMS失败,不影响主流程", e); } } + + /** + * 同步修改单个 TMS 订单:按调整后业务单重新组装 TmsOrderAddDTO, + * 带 executeOrderNumber 定位 TMS 订单,调用 TMS /feign/order/update 接口。 + */ + private void syncTmsOrder(ExecuteOrder executeOrder, BusinessDocumentOrder after) { + TmsOrderAddDTO tmsOrderAddDTO = new TmsOrderAddDTO(); + BeanUtil.copyProperties(after, tmsOrderAddDTO); + // id 传 OMS 业务单主键:TMS 侧用作 tms_order_account.order_id 口径; + // TMS 的 update 在覆盖前会保留 tms_order 真实主键,不会被污染 + tmsOrderAddDTO.setId(String.valueOf(after.getId())); + // TMS 侧按执行单号定位订单 + tmsOrderAddDTO.setExecuteOrderId(String.valueOf(executeOrder.getId())); + tmsOrderAddDTO.setExecuteOrderNumber(executeOrder.getGoodsNumber()); + tmsOrderAddDTO.setGoodsNumber(after.getGoodsNumber()); + tmsOrderAddDTO.setOrderSource("0"); + + // TMS 侧 update 按 appointShipperId(业务单货主) 定位货主,需显式带上,口径与下单一致 + if (StrUtil.isNotBlank(after.getAppointShipperId())) { + tmsOrderAddDTO.setAppointShipperId(after.getAppointShipperId()); + } + if (after.getAppointShipper() != null) { + tmsOrderAddDTO.setAppointShipper(after.getAppointShipper()); + } + if (after.getSzwlUserId() != null) { + tmsOrderAddDTO.setSzwlUserId(after.getSzwlUserId()); + } + + // 货物信息 + List cargoList = businessDocumentCargoMultiMapper.selectList( + new LambdaQueryWrapper() + .eq(BusinessDocumentCargoMulti::getOrderId, String.valueOf(after.getId())) + .eq(BusinessDocumentCargoMulti::getDelFlag, 1)); + List cargoInfoList = new ArrayList<>(); + if (cargoList != null) { + for (BusinessDocumentCargoMulti cargo : cargoList) { + TmsCargoInfoDTO dto = new TmsCargoInfoDTO(); + BeanUtil.copyProperties(cargo, dto); + cargoInfoList.add(dto); + } + } + tmsOrderAddDTO.setCargoInfoList(cargoInfoList); + + // 装货地址:统一以「调整后业务单」的扁平字段为准,避免明细表(business_document_address_multi)旧值覆盖 + TmsAddressMultiDTO loadingDto = new TmsAddressMultiDTO(); + loadingDto.setAreaCode(after.getLoadingAreaId()); + loadingDto.setAreaName(after.getLoadingName()); + loadingDto.setAddress(after.getLoadingAddress()); + loadingDto.setLongitude(after.getLoadingLongitude()); + loadingDto.setLatitude(after.getLoadingLatitude()); + loadingDto.setContactName(after.getFreighterName()); + loadingDto.setContactPhone(after.getLoadingPhone()); + loadingDto.setLayDate(after.getLoadingDate()); + loadingDto.setLayType(1); + List loadingAddressList = new ArrayList<>(); + loadingAddressList.add(loadingDto); + tmsOrderAddDTO.setLoadingAddressList(loadingAddressList); + + // 卸货地址:同样以「调整后业务单」的扁平字段为准 + TmsAddressMultiDTO unloadDto = new TmsAddressMultiDTO(); + unloadDto.setAreaCode(after.getUnloadAreaId()); + unloadDto.setAreaName(after.getUnloadName()); + unloadDto.setAddress(after.getUnloadAddress()); + unloadDto.setLongitude(after.getUnloadLongitude()); + unloadDto.setLatitude(after.getUnloadLatitude()); + unloadDto.setContactName(after.getDischargerName()); + unloadDto.setContactPhone(after.getUnloadPhone()); + unloadDto.setLayDate(after.getUnloadingData()); + unloadDto.setLayType(2); + List unloadAddressList = new ArrayList<>(); + unloadAddressList.add(unloadDto); + tmsOrderAddDTO.setUnloadAddressList(unloadAddressList); + + // 费用明细 + List accountList = businessOrderAccountMapper.selectList( + new LambdaQueryWrapper() + .eq(BusinessOrderAccount::getOrderId, after.getId()) + .eq(BusinessOrderAccount::getIsDelete, 0)); + List tmsOrderAccountList = new ArrayList<>(); + if (accountList != null) { + for (BusinessOrderAccount acc : accountList) { + TmsOrderAccount dto = new TmsOrderAccount(); + BeanUtil.copyProperties(acc, dto); + tmsOrderAccountList.add(dto); + } + } + tmsOrderAddDTO.setTmsOrderAccountList(tmsOrderAccountList); + + AjaxResult result = wlhyServiceFeign.update(tmsOrderAddDTO); + if (result != null && "200".equals(String.valueOf(result.get("code")))) { + log.info("调整后同步修改TMS订单成功,执行单[{}],业务单[{}]", executeOrder.getGoodsNumber(), after.getGoodsNumber()); + } else { + log.error("调整后同步修改TMS订单失败,执行单[{}],返回: {}", executeOrder.getGoodsNumber(), + result == null ? "null" : result.get("msg")); + } + } } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/entity/BusinessDocumentOrder.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/entity/BusinessDocumentOrder.java index 823941199..e0b2a1bc0 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/entity/BusinessDocumentOrder.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/entity/BusinessDocumentOrder.java @@ -8,6 +8,7 @@ import com.mhd.common.core.web.domain.BaseVOEntity; import java.math.BigDecimal; import lombok.Data; import java.util.Date; +import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; @@ -659,7 +660,7 @@ public class BusinessDocumentOrder extends BaseVOEntity{ @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private Date documentDate; - @ApiModelProperty( "审核状态 0-未审核 1-审核通过 2-已驳回 3-调整待审核") + @ApiModelProperty( "审核状态 0-未审核 1-审核通过 2-已驳回 3-调整待审核 4-调整驳回") private Long reviewStatus; @ApiModelProperty("审核时间") @@ -826,6 +827,34 @@ public class BusinessDocumentOrder extends BaseVOEntity{ @Excel(name = "车次") private String shuttleNo; - @ApiModelProperty("业务单调整状态 0-无 1-调整待审核 2-调整驳回 3-调整已通过") - private Integer adjustStatus; + /** + * 前端整单回传时携带的费用明细(business_order_account),非表字段,仅用于「订单调整」入参接收。 + * 与顶层 feeDetailList 二选一,后端在 adjust() 中做回退兼容。 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private List businessOrderAccountList; + + /** + * 前端整单回传时的装货地址(单个),非表字段,仅用于「订单调整」入参接收与映射到 loading* 扁平字段。 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private com.mhd.oms.interfaces.dto.businessDocumentAddressMulti.BusinessDocumentAddressMultiDTO shipment; + + /** + * 前端整单回传时的卸货地址(单个),非表字段,仅用于「订单调整」入参接收与映射到 unload* 扁平字段。 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private com.mhd.oms.interfaces.dto.businessDocumentAddressMulti.BusinessDocumentAddressMultiDTO receipt; + + /** + * 前端整单回传时的装货地址集合,非表字段,仅用于「订单调整」入参接收与映射。 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private List loadingAddressList; + + /** + * 前端整单回传时的卸货地址集合,非表字段,仅用于「订单调整」入参接收与映射。 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private List unloadAddressList; } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrderAdjust/entity/BusinessDocumentOrderAdjust.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrderAdjust/entity/BusinessDocumentOrderAdjust.java index d84a978e3..4ea7691f8 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrderAdjust/entity/BusinessDocumentOrderAdjust.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrderAdjust/entity/BusinessDocumentOrderAdjust.java @@ -3,8 +3,10 @@ package com.mhd.oms.domain.businessDocumentOrderAdjust.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; @@ -38,6 +40,8 @@ public class BusinessDocumentOrderAdjust implements Serializable { private String adjustByName; @ApiModelProperty("调整时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date adjustTime; @ApiModelProperty("调整原因") @@ -59,6 +63,8 @@ public class BusinessDocumentOrderAdjust implements Serializable { private String auditByName; @ApiModelProperty("审核时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date auditTime; @ApiModelProperty("审核/驳回意见") @@ -77,6 +83,8 @@ public class BusinessDocumentOrderAdjust implements Serializable { private String createName; @ApiModelProperty("创建时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; @ApiModelProperty("更新人") @@ -86,6 +94,8 @@ public class BusinessDocumentOrderAdjust implements Serializable { private String updateName; @ApiModelProperty("更新时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; @ApiModelProperty("删除标记 1-正常 0-删除") diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrderAdjustDetail/entity/BusinessDocumentOrderAdjustDetail.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrderAdjustDetail/entity/BusinessDocumentOrderAdjustDetail.java index 178d53c4b..3aff8a13f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrderAdjustDetail/entity/BusinessDocumentOrderAdjustDetail.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrderAdjustDetail/entity/BusinessDocumentOrderAdjustDetail.java @@ -3,8 +3,12 @@ package com.mhd.oms.domain.businessDocumentOrderAdjustDetail.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; @@ -24,9 +28,11 @@ public class BusinessDocumentOrderAdjustDetail implements Serializable { @ApiModelProperty("主键") @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) private Long id; @ApiModelProperty("关联调整主记录ID") + @JsonSerialize(using = ToStringSerializer.class) private Long adjustId; @ApiModelProperty("业务单ID") @@ -51,6 +57,8 @@ public class BusinessDocumentOrderAdjustDetail implements Serializable { private String loadingAddress; @ApiModelProperty("装货时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date loadingDate; @ApiModelProperty("卸货地") @@ -60,6 +68,8 @@ public class BusinessDocumentOrderAdjustDetail implements Serializable { private String unloadAddress; @ApiModelProperty("卸货时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date unloadingData; @ApiModelProperty("发货人") @@ -81,6 +91,8 @@ public class BusinessDocumentOrderAdjustDetail implements Serializable { private String route; @ApiModelProperty("单据日期") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date documentDate; @ApiModelProperty("组织ID") @@ -154,12 +166,16 @@ public class BusinessDocumentOrderAdjustDetail implements Serializable { private String createName; @ApiModelProperty("创建时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; @ApiModelProperty("更新人") private String updateBy; @ApiModelProperty("更新时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; @ApiModelProperty("删除标记 1-正常 0-删除") diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationOrder/service/OmsAddressMultiService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationOrder/service/OmsAddressMultiService.java index 3ddce8ecd..70652f315 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationOrder/service/OmsAddressMultiService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationOrder/service/OmsAddressMultiService.java @@ -610,6 +610,12 @@ public class OmsAddressMultiService implements IOmsAddressMultiService { List tmsOrderAccountList = tmsOrderAddDTO.getTmsOrderAccountList(); if (ObjectUtil.isNotNull(tmsOrderAccountList) && tmsOrderAccountList.size() > 0) { for (OmsOrderAccount tmsOrderAccount : tmsOrderAccountList) { + // 防御:account_id 为空或<=0 时跳过(避免唯一约束撞库 + 插入脏数据) + if (tmsOrderAccount.getAccountId() == null || tmsOrderAccount.getAccountId() <= 0) { + log.warn("订单费用科目 accountId 为空,已跳过该条, orderId={}, subjectName={}", + resevationOrder.getId(), tmsOrderAccount.getSubjectName()); + continue; + } tmsOrderAccount.setIsDelete(0); tmsOrderAccount.setOrderId(String.valueOf(resevationOrder.getId())); tmsOrderAccount.setCreateBy(String.valueOf(userPo.getUserId())); @@ -1116,14 +1122,20 @@ public class OmsAddressMultiService implements IOmsAddressMultiService { if (ObjectUtil.isNotNull(tmsOrderAccountList) && tmsOrderAccountList.size() > 0) { // 先删除旧的费用科目信息 tmsOrderAccountMapper.delete(new LambdaQueryWrapper().eq(OmsOrderAccount::getOrderId, String.valueOf(resevationOrder.getId()))); - + // 插入新的费用科目信息 for (OmsOrderAccount tmsOrderAccount : tmsOrderAccountList) { + // 防御:account_id 为空或<=0 时跳过 + if (tmsOrderAccount.getAccountId() == null || tmsOrderAccount.getAccountId() <= 0) { + log.warn("订单费用科目 accountId 为空,已跳过该条, orderId={}, subjectName={}", + resevationOrder.getId(), tmsOrderAccount.getSubjectName()); + continue; + } tmsOrderAccount.setIsDelete(0); tmsOrderAccount.setOrderId(String.valueOf(resevationOrder.getId())); tmsOrderAccount.setCreateBy(String.valueOf(userPo.getUserId())); tmsOrderAccount.setCreateTime(new Date()); - + // 设置组织信息 if (tmsOrderAddDTO.getOrganizationId() != null) { tmsOrderAccount.setOrganizationId(tmsOrderAddDTO.getOrganizationId()); @@ -1134,7 +1146,7 @@ public class OmsAddressMultiService implements IOmsAddressMultiService { if (tmsOrderAddDTO.getTopOrganizationId() != null) { tmsOrderAccount.setTopOrganizationId(tmsOrderAddDTO.getTopOrganizationId()); } - + tmsOrderAccountMapper.insert(tmsOrderAccount); } } diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/businessDocumentOrderAdjust/BusinessDocumentOrderAdjustRecordDTO.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/businessDocumentOrderAdjust/BusinessDocumentOrderAdjustRecordDTO.java index 1a5a73888..ebdacbe4c 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/businessDocumentOrderAdjust/BusinessDocumentOrderAdjustRecordDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/businessDocumentOrderAdjust/BusinessDocumentOrderAdjustRecordDTO.java @@ -1,8 +1,12 @@ package com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.mhd.oms.domain.businessDocumentOrderAdjustDetail.entity.BusinessDocumentOrderAdjustDetail; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; @@ -16,6 +20,7 @@ public class BusinessDocumentOrderAdjustRecordDTO implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty("主记录ID") + @JsonSerialize(using = ToStringSerializer.class) private Long id; @ApiModelProperty("业务单ID") @@ -31,6 +36,8 @@ public class BusinessDocumentOrderAdjustRecordDTO implements Serializable { private String adjustByName; @ApiModelProperty("调整时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date adjustTime; @ApiModelProperty("调整原因") @@ -49,6 +56,8 @@ public class BusinessDocumentOrderAdjustRecordDTO implements Serializable { private String auditByName; @ApiModelProperty("审核时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date auditTime; @ApiModelProperty("审核/驳回意见") diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 8751e75da..542b6bce7 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.31:6848 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.31:6848 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java index d60d29f84..919e08505 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java @@ -218,9 +218,9 @@ public class HandoverTaskOrderApplicationService { public Boolean completeHandover(HandoverTaskOrderDO handoverTaskOrderDO){ Boolean result = handoverTaskOrderDomainService.completeHandover(handoverTaskOrderDO); List clearoutParamDOs = handoverTaskOrderDomainService.getLastClearoutParamDOs(); -// for (MaterialInventoryParamDO paramDO : clearoutParamDOs) { -// materialInventoryApplicationService.pushBillingRecordClearout(paramDO.getMaterialInventoryId(), paramDO.getQuantity()); -// } + for (MaterialInventoryParamDO paramDO : clearoutParamDOs) { + materialInventoryApplicationService.pushBillingRecordClearout(paramDO.getMaterialInventoryId(), paramDO.getQuantity()); + } return result; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/util/XxlJobConfig.java b/mhd_wms/src/main/java/com/mhd/wms/util/XxlJobConfig.java index e17d38a46..9627d0e7b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/util/XxlJobConfig.java +++ b/mhd_wms/src/main/java/com/mhd/wms/util/XxlJobConfig.java @@ -9,46 +9,46 @@ import org.springframework.context.annotation.Configuration; /** * XXL-JOB 配置类 */ -//@Configuration +@Configuration public class XxlJobConfig { -// private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); -// -// @Value("${xxl.job.admin.addresses}") -// private String adminAddresses; -// -// @Value("${xxl.job.accessToken}") -// private String accessToken; -// -// @Value("${xxl.job.executor.appname}") -// private String appname; -// -// @Value("${xxl.job.executor.address}") -// private String address; -// -// @Value("${xxl.job.executor.ip}") -// private String ip; -// -// @Value("${xxl.job.executor.port}") -// private int port; -// -// @Value("${xxl.job.executor.logpath}") -// private String logPath; -// -// @Value("${xxl.job.executor.logretentiondays}") -// private int logRetentionDays; -// -// @Bean -// public XxlJobSpringExecutor xxlJobExecutor() { -// logger.info(">>>>>>>>>>> xxl-job config init."); -// XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); -// xxlJobSpringExecutor.setAdminAddresses(adminAddresses); -// xxlJobSpringExecutor.setAppname(appname); -// xxlJobSpringExecutor.setAddress(address); -// xxlJobSpringExecutor.setIp(ip); -// xxlJobSpringExecutor.setPort(port); -// xxlJobSpringExecutor.setAccessToken(accessToken); -// xxlJobSpringExecutor.setLogPath(logPath); -// xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); -// return xxlJobSpringExecutor; -// } + private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${xxl.job.admin.addresses}") + private String adminAddresses; + + @Value("${xxl.job.accessToken}") + private String accessToken; + + @Value("${xxl.job.executor.appname}") + private String appname; + + @Value("${xxl.job.executor.address}") + private String address; + + @Value("${xxl.job.executor.ip}") + private String ip; + + @Value("${xxl.job.executor.port}") + private int port; + + @Value("${xxl.job.executor.logpath}") + private String logPath; + + @Value("${xxl.job.executor.logretentiondays}") + private int logRetentionDays; + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname); + xxlJobSpringExecutor.setAddress(address); + xxlJobSpringExecutor.setIp(ip); + xxlJobSpringExecutor.setPort(port); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); + return xxlJobSpringExecutor; + } } \ No newline at end of file diff --git a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml index 8004d7413..3f5e19f8d 100644 --- a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml +++ b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml @@ -1864,7 +1864,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" LEFT JOIN NGWL_TEST_BMS.SETTLEMENT_CUSTOMERS bms ON sys.SETTLEMENT_CUSTOMERS_ID = bms.SETTLEMENT_CUSTOMERS_ID WHERE 1 = 1 - AND CONTRACT_MANAGE_ID = #{contractManageId} AND DEL_FLAG = 1 + AND sys.CONTRACT_MANAGE_ID = #{contractManageId} AND sys.DEL_FLAG = 1