From fba9f2cf5c7b80dcb8a78960f02e3ecbfb28e73a Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 16:21:41 +0800 Subject: [PATCH 01/17] new: add advance charge export data business object --- .../wansenai/bo/AdvanceChargeDataExportBO.kt | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 core/domain/src/main/kotlin/com/wansenai/bo/AdvanceChargeDataExportBO.kt diff --git a/core/domain/src/main/kotlin/com/wansenai/bo/AdvanceChargeDataExportBO.kt b/core/domain/src/main/kotlin/com/wansenai/bo/AdvanceChargeDataExportBO.kt new file mode 100644 index 00000000..beac4fe0 --- /dev/null +++ b/core/domain/src/main/kotlin/com/wansenai/bo/AdvanceChargeDataExportBO.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2023-2033 WanSen AI Team, Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://opensource.wansenai.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.wansenai.bo + +import com.wansenai.NoArg +import com.wansenai.utils.excel.ExcelExport +import lombok.Data +import java.math.BigDecimal + +@NoArg +@Data +data class AdvanceChargeDataExportBO( + + @ExcelExport(value = "会员") + val memberName: String, + + @ExcelExport(value = "预付款单据编号") + val receiptNumber: String, + + @ExcelExport(value = "账户名称") + val accountName: String, + + @ExcelExport(value = "金额") + val amount : BigDecimal, + + @ExcelExport(value = "备注") + val remark : String? = null, +) \ No newline at end of file From e2507e3c9886398e1bdd6f58d78a4e20a1afde1e Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 16:22:13 +0800 Subject: [PATCH 02/17] new: add advance charge export api --- .../api/financial/AdvanceChargeController.kt | 23 +++++--- .../service/financial/AdvanceChargeService.kt | 3 + .../impl/AdvanceChargeServiceImpl.kt | 56 +++++++++++++++++-- 3 files changed, 69 insertions(+), 13 deletions(-) diff --git a/core/api/src/main/kotlin/com/wansenai/api/financial/AdvanceChargeController.kt b/core/api/src/main/kotlin/com/wansenai/api/financial/AdvanceChargeController.kt index bc0c08d0..ee16b21b 100644 --- a/core/api/src/main/kotlin/com/wansenai/api/financial/AdvanceChargeController.kt +++ b/core/api/src/main/kotlin/com/wansenai/api/financial/AdvanceChargeController.kt @@ -12,6 +12,15 @@ */ package com.wansenai.api.financial +import org.springframework.web.bind.annotation.RestController +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PutMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.ModelAttribute import com.baomidou.mybatisplus.extension.plugins.pagination.Page import com.wansenai.dto.financial.AddOrUpdateAdvanceChargeDTO import com.wansenai.dto.financial.QueryAdvanceChargeDTO @@ -19,14 +28,7 @@ import com.wansenai.service.financial.AdvanceChargeService import com.wansenai.utils.response.Response import com.wansenai.vo.financial.AdvanceChargeDetailVO import com.wansenai.vo.financial.AdvanceChargeVO -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.PutMapping -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RequestParam -import org.springframework.web.bind.annotation.RestController +import jakarta.servlet.http.HttpServletResponse @RestController @RequestMapping("/financial/advance-charge") @@ -56,4 +58,9 @@ class AdvanceChargeController(private val advanceChargeService: AdvanceChargeSer fun updateStatus(@RequestParam("ids") ids: List, @RequestParam("status") status: Int) : Response { return advanceChargeService.updateAdvanceChargeStatusById(ids, status) } + + @GetMapping("export") + fun export(@ModelAttribute advanceChargeDTO: QueryAdvanceChargeDTO, response: HttpServletResponse) { + advanceChargeService.exportAdvanceCharge(advanceChargeDTO, response) + } } \ No newline at end of file diff --git a/core/service/src/main/kotlin/com/wansenai/service/financial/AdvanceChargeService.kt b/core/service/src/main/kotlin/com/wansenai/service/financial/AdvanceChargeService.kt index b3b68923..e2c37c30 100644 --- a/core/service/src/main/kotlin/com/wansenai/service/financial/AdvanceChargeService.kt +++ b/core/service/src/main/kotlin/com/wansenai/service/financial/AdvanceChargeService.kt @@ -20,6 +20,7 @@ import com.wansenai.entities.financial.FinancialMain import com.wansenai.utils.response.Response import com.wansenai.vo.financial.AdvanceChargeDetailVO import com.wansenai.vo.financial.AdvanceChargeVO +import jakarta.servlet.http.HttpServletResponse interface AdvanceChargeService : IService{ @@ -32,4 +33,6 @@ interface AdvanceChargeService : IService{ fun deleteAdvanceChargeById(ids: List): Response fun updateAdvanceChargeStatusById(ids: List, status: Int): Response + + fun exportAdvanceCharge(advanceChargeDTO: QueryAdvanceChargeDTO, response: HttpServletResponse) } \ No newline at end of file diff --git a/core/service/src/main/kotlin/com/wansenai/service/financial/impl/AdvanceChargeServiceImpl.kt b/core/service/src/main/kotlin/com/wansenai/service/financial/impl/AdvanceChargeServiceImpl.kt index 5e9577c1..1b3e18d4 100644 --- a/core/service/src/main/kotlin/com/wansenai/service/financial/impl/AdvanceChargeServiceImpl.kt +++ b/core/service/src/main/kotlin/com/wansenai/service/financial/impl/AdvanceChargeServiceImpl.kt @@ -15,10 +15,10 @@ package com.wansenai.service.financial.impl import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper import com.baomidou.mybatisplus.extension.plugins.pagination.Page import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl -import com.wansenai.entities.SysDepartment import com.wansenai.entities.financial.FinancialMain import com.wansenai.entities.financial.FinancialSub import com.wansenai.bo.AdvanceChargeDataBO +import com.wansenai.bo.AdvanceChargeDataExportBO import com.wansenai.bo.FileDataBO import com.wansenai.dto.financial.AddOrUpdateAdvanceChargeDTO import com.wansenai.dto.financial.QueryAdvanceChargeDTO @@ -32,29 +32,29 @@ import com.wansenai.service.basic.IOperatorService import com.wansenai.service.basic.MemberService import com.wansenai.service.financial.AdvanceChargeService import com.wansenai.service.financial.IFinancialAccountService -import com.wansenai.service.system.SysDepartmentService import com.wansenai.service.user.ISysUserService import com.wansenai.utils.SnowflakeIdUtil import com.wansenai.utils.TimeUtil import com.wansenai.utils.constants.CommonConstants import com.wansenai.utils.enums.BaseCodeEnum import com.wansenai.utils.enums.FinancialCodeEnum +import com.wansenai.utils.excel.ExcelUtils import com.wansenai.utils.response.Response import com.wansenai.vo.financial.AdvanceChargeDetailVO import com.wansenai.vo.financial.AdvanceChargeVO +import jakarta.servlet.http.HttpServletResponse import lombok.extern.slf4j.Slf4j import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Propagation import org.springframework.transaction.annotation.Transactional import java.math.BigDecimal import java.time.LocalDateTime +import java.util.concurrent.ConcurrentHashMap @Service @Slf4j open class AdvanceChargeServiceImpl( private val baseService: com.wansenai.service.BaseService, - private val userDeptRelService: com.wansenai.service.user.ISysUserDeptRelService, - private val departmentService: SysDepartmentService, private val financialSubService: com.wansenai.service.financial.FinancialSubService, private val financialMainMapper: FinancialMainMapper, private val memberService: MemberService, @@ -198,7 +198,7 @@ open class AdvanceChargeServiceImpl( receiptDate = this.receiptDate, operator = operator.name, financialPersonnel = financialPerson?.name ?: "", - memberName = member?.memberName, + memberName = member?.memberName ?: "", totalAmount = this.totalAmount, collectedAmount = this.changeAmount ?: BigDecimal.ZERO, status = this.status, @@ -206,6 +206,29 @@ open class AdvanceChargeServiceImpl( ) } + private fun getAdvanceChargeList(advanceChargeDTO: QueryAdvanceChargeDTO?): List { + val wrapper = LambdaQueryWrapper().apply { + advanceChargeDTO?.financialPersonnelId?.let { eq(FinancialMain::getOperatorId, it) } + advanceChargeDTO?.receiptNumber?.let { eq(FinancialMain::getReceiptNumber, it) } + advanceChargeDTO?.status?.let { eq(FinancialMain::getStatus, it) } + advanceChargeDTO?.operatorId?.let { eq(FinancialMain::getCreateBy, it) } + advanceChargeDTO?.remark?.let { like(FinancialMain::getRemark, it) } + advanceChargeDTO?.startDate?.let { ge(FinancialMain::getCreateTime, it) } + advanceChargeDTO?.endDate?.let { le(FinancialMain::getCreateTime, it) } + eq(FinancialMain::getType, "收预付款") + eq(FinancialMain::getDeleteFlag, CommonConstants.NOT_DELETED) + } + + val result = financialMainMapper.selectList(wrapper) + return result.map { financialMain -> + val member = memberService.getMemberById(financialMain.relatedPersonId) + val operator = userService.getById(financialMain.createBy) + val financialPerson = operatorService.getOperatorById(financialMain.operatorId) + + financialMain.toAdvanceChargeVO(member, operator, financialPerson) + } + } + // Extension function, converting List to Page private fun List.toPage(total: Long, pages: Long, size: Long): Page { return Page().apply { @@ -314,4 +337,27 @@ open class AdvanceChargeServiceImpl( } return Response.responseMsg(FinancialCodeEnum.UPDATE_ADVANCE_ERROR) } + + override fun exportAdvanceCharge(advanceChargeDTO: QueryAdvanceChargeDTO, response: HttpServletResponse) { + val exportMap = ConcurrentHashMap>>() + val mainData = getAdvanceChargeList(advanceChargeDTO) + if (mainData.isNotEmpty()) { + exportMap["收预付款"] = ExcelUtils.getSheetData(mainData) + if (advanceChargeDTO.isExportDetail == true) { + val subData = mainData.flatMap { advanceChargeVO -> + advanceChargeVO.id?.let { getAdvanceChargeDetailById(it) }?.data?.tableData?.map { item -> + AdvanceChargeDataExportBO( + memberName = advanceChargeVO.memberName, + receiptNumber = advanceChargeVO.receiptNumber, + accountName = item.accountName, + amount = item.amount, + remark = item.remark + ) + } ?: emptyList() + } + exportMap["收预付款单据明细"] = ExcelUtils.getSheetData(subData) + } + ExcelUtils.exportManySheet(response, "收预付款", exportMap) + } + } } \ No newline at end of file From 28049321b8cd37e6f18838f3d2f707b87e817c30 Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 16:23:00 +0800 Subject: [PATCH 03/17] fetch: update advance charge view object add export annotate and add isExportDetail filed --- .../dto/financial/QueryAdvanceChargeDTO.kt | 2 ++ .../wansenai/vo/financial/AdvanceChargeVO.kt | 22 ++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/core/domain/src/main/kotlin/com/wansenai/dto/financial/QueryAdvanceChargeDTO.kt b/core/domain/src/main/kotlin/com/wansenai/dto/financial/QueryAdvanceChargeDTO.kt index 18b11884..99089205 100644 --- a/core/domain/src/main/kotlin/com/wansenai/dto/financial/QueryAdvanceChargeDTO.kt +++ b/core/domain/src/main/kotlin/com/wansenai/dto/financial/QueryAdvanceChargeDTO.kt @@ -36,4 +36,6 @@ data class QueryAdvanceChargeDTO ( val startDate: String?, val endDate: String?, + + val isExportDetail: Boolean?, ) diff --git a/core/domain/src/main/kotlin/com/wansenai/vo/financial/AdvanceChargeVO.kt b/core/domain/src/main/kotlin/com/wansenai/vo/financial/AdvanceChargeVO.kt index ac986b9f..35a072b6 100644 --- a/core/domain/src/main/kotlin/com/wansenai/vo/financial/AdvanceChargeVO.kt +++ b/core/domain/src/main/kotlin/com/wansenai/vo/financial/AdvanceChargeVO.kt @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonFormat import com.fasterxml.jackson.databind.annotation.JsonSerialize import com.wansenai.NoArg import com.wansenai.bo.BigDecimalSerializerBO +import com.wansenai.utils.excel.ExcelExport import lombok.Data import java.math.BigDecimal import java.time.LocalDateTime @@ -27,24 +28,33 @@ data class AdvanceChargeVO ( @JsonFormat(shape = JsonFormat.Shape.STRING) var id: Long? = null, - var memberName: String? = null, + @ExcelExport(value = "会员") + var memberName: String, + @ExcelExport(value = "单据编号") var receiptNumber: String, @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ExcelExport(value = "单据日期") var receiptDate: LocalDateTime, - var operator: String, - - var financialPersonnel: String, + @JsonSerialize(using = BigDecimalSerializerBO::class) + @ExcelExport(value = "收款金额") + var collectedAmount : BigDecimal, @JsonSerialize(using = BigDecimalSerializerBO::class) + @ExcelExport(value = "合计金额") var totalAmount : BigDecimal, - @JsonSerialize(using = BigDecimalSerializerBO::class) - var collectedAmount : BigDecimal, + @ExcelExport(value = "财务人员") + var financialPersonnel: String, + + @ExcelExport(value = "操作员") + var operator: String, + @ExcelExport(value = "备注") var remark: String? = null, + @ExcelExport(value = "状态", kv = "0:未审核;1:已审核") var status: Int, ) From 4eb85409148bda2b43fd21dacf3a59762550af0d Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 16:23:25 +0800 Subject: [PATCH 04/17] fetch: Add handle export function and api --- web/src/api/financial/advance.ts | 11 ++++ .../views/financial/advance-charge/index.vue | 66 +++++++++++++++++-- 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/web/src/api/financial/advance.ts b/web/src/api/financial/advance.ts index 4a789e87..7d6bcb9f 100644 --- a/web/src/api/financial/advance.ts +++ b/web/src/api/financial/advance.ts @@ -13,6 +13,7 @@ enum API { DeleteBatch = '/financial/advance-charge/deleteByIds', UpdateStatus = '/financial/advance-charge/updateStatusByIds', GetDetail = '/financial/advance-charge/getDetailById', + Export = '/financial/advance-charge/export', } export function getAdvancePageList(params: QueryAdvanceReq, errorMode: ErrorMessageMode = 'message') { @@ -72,4 +73,14 @@ export function getAdvanceDetail(id: number | string, mode: ErrorMessageMode = ' errorMessageMode: mode, }, ); +} + +export function exportAdvance(params: QueryAdvanceReq) { + return defHttp.get>( + { + url: `${API.Export}`, + params, + responseType: "blob" + } + ); } \ No newline at end of file diff --git a/web/src/views/financial/advance-charge/index.vue b/web/src/views/financial/advance-charge/index.vue index e7e13199..b14307bc 100644 --- a/web/src/views/financial/advance-charge/index.vue +++ b/web/src/views/financial/advance-charge/index.vue @@ -4,6 +4,7 @@ @@ -39,6 +40,14 @@ + +
+

即将导出{{dataSum}}条数据,请耐心等待。

+

如需导出明细数据(可能耗时较长),请勾选下方复选框。

+ 需要导出明细数据 +
+
@@ -52,19 +61,23 @@ import {BasicTable, TableAction, useTable} from "@/components/Table"; import {useModal} from "@/components/Modal"; import {useMessage} from "@/hooks/web/useMessage"; import {columns, searchFormSchema} from "@/views/financial/advance-charge/advance.data"; -import {getAdvancePageList, deleteBatchAdvance, updateAdvanceStatus} from "@/api/financial/advance"; +import {getAdvancePageList, deleteBatchAdvance, updateAdvanceStatus, exportAdvance} from "@/api/financial/advance"; import AdvanceChargeModal from "@/views/financial/advance-charge/components/AdvanceChargeModal.vue"; import ViewAdvanceChargeModal from "@/views/financial/advance-charge/components/ViewAdvanceChargeModal.vue"; -import {Tag} from "ant-design-vue"; - +import {Checkbox, Modal, Tag} from "ant-design-vue"; +import {getTimestamp} from "@/utils/dateUtil"; export default defineComponent({ name: 'advanceCharge', - components: {Tag, TableAction, BasicTable, AdvanceChargeModal, ViewAdvanceChargeModal}, + components: {'a-modal': Modal, 'a-checkbox': Checkbox, Tag, TableAction, BasicTable, AdvanceChargeModal, ViewAdvanceChargeModal}, setup() { const [viewAdvanceChargeModalRef, {openModal: openAdvanceChargeModal}] = useModal(); const { createMessage } = useMessage(); const advanceChargeModalRef = ref(null); - const [registerTable, { reload, getSelectRows }] = useTable({ + const exportDetailData = ref(false); + const openExportData = ref(false); + const confirmLoading = ref(false); + const dataSum = ref(0); + const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({ title: '收预付款列表', api: getAdvancePageList, rowKey: 'id', @@ -151,6 +164,40 @@ export default defineComponent({ }); } + async function handleExport() { + dataSum.value = getDataSource().length; + if (dataSum.value === 0) { + createMessage.warn('当前查询条件下无数据可导出'); + return; + } + openExportData.value = true; + } + + const handleExportCancel = () => { + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; + }; + + const handleExportOk = async () => { + confirmLoading.value = true; + const data: any = getForm().getFieldsValue(); + data.isExportDetail = exportDetailData.value; + const file: any = await exportAdvance(data) + if (file.size > 0) { + const blob = new Blob([file]); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + const timestamp = getTimestamp(new Date()); + link.download = "收预付款单数据" + timestamp + ".xlsx"; + link.target = "_blank"; + link.click(); + } + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; + } + return { registerTable, handleCreate, @@ -162,7 +209,14 @@ export default defineComponent({ handleOnStatus, handleCancel, advanceChargeModalRef, - viewAdvanceChargeModalRef + viewAdvanceChargeModalRef, + handleExport, + openExportData, + confirmLoading, + exportDetailData, + dataSum, + handleExportOk, + handleExportCancel } } }) From 474c7aa863e4d363a12162cfeaff644725923813 Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 16:43:44 +0800 Subject: [PATCH 05/17] fetch: update exportMap var move to after the for loop --- .../impl/ReceiptPurchaseServiceImpl.java | 6 +++--- .../receipt/impl/ReceiptSaleServiceImpl.java | 6 +++--- desktop/Cargo.lock | 20 +++++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptPurchaseServiceImpl.java b/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptPurchaseServiceImpl.java index 7f12e2d2..696acaaa 100644 --- a/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptPurchaseServiceImpl.java +++ b/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptPurchaseServiceImpl.java @@ -1350,8 +1350,8 @@ public void exportPurchaseOrderExcel(QueryPurchaseOrderDTO queryPurchaseOrderDTO subData.add(purchaseDataBo); }); } - exportMap.put("采购订单明细", ExcelUtils.getSheetData(subData)); } + exportMap.put("采购订单明细", ExcelUtils.getSheetData(subData)); } exportMap.put("采购订单", ExcelUtils.getSheetData(mainData)); ExcelUtils.exportManySheet(response, "采购订单", exportMap); @@ -1391,8 +1391,8 @@ public void exportPurchaseStorageExcel(QueryPurchaseStorageDTO queryPurchaseStor subData.add(purchaseDataBo); }); } - exportMap.put("采购入库明细", ExcelUtils.getSheetData(subData)); } + exportMap.put("采购入库明细", ExcelUtils.getSheetData(subData)); } exportMap.put("采购入库", ExcelUtils.getSheetData(mainData)); ExcelUtils.exportManySheet(response, "采购入库", exportMap); @@ -1432,8 +1432,8 @@ public void exportPurchaseRefundExcel(QueryPurchaseRefundDTO queryPurchaseRefund subData.add(purchaseDataBo); }); } - exportMap.put("采购退货明细", ExcelUtils.getSheetData(subData)); } + exportMap.put("采购退货明细", ExcelUtils.getSheetData(subData)); } exportMap.put("采购退货", ExcelUtils.getSheetData(mainData)); ExcelUtils.exportManySheet(response, "采购退货", exportMap); diff --git a/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptSaleServiceImpl.java b/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptSaleServiceImpl.java index fd3b16f0..30356ad3 100644 --- a/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptSaleServiceImpl.java +++ b/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptSaleServiceImpl.java @@ -1355,8 +1355,8 @@ public void exportSaleOrderExcel(QuerySaleOrderDTO querySaleOrderDTO, HttpServle subData.add(saleDataBo); }); } - exportMap.put("销售订单明细", ExcelUtils.getSheetData(subData)); } + exportMap.put("销售订单明细", ExcelUtils.getSheetData(subData)); } exportMap.put("销售订单", ExcelUtils.getSheetData(mainData)); ExcelUtils.exportManySheet(response, "销售订单", exportMap); @@ -1397,8 +1397,8 @@ public void exportSaleShipmentsExcel(QuerySaleShipmentsDTO querySaleShipmentsDTO subData.add(saleDataBo); }); } - exportMap.put("销售出库明细", ExcelUtils.getSheetData(subData)); } + exportMap.put("销售出库明细", ExcelUtils.getSheetData(subData)); } exportMap.put("销售出库", ExcelUtils.getSheetData(mainData)); ExcelUtils.exportManySheet(response, "销售出库", exportMap); @@ -1439,8 +1439,8 @@ public void exportSaleRefundExcel(QuerySaleRefundDTO querySaleRefundDTO, HttpSer subData.add(saleDataBo); }); } - exportMap.put("销售退货明细", ExcelUtils.getSheetData(subData)); } + exportMap.put("销售退货明细", ExcelUtils.getSheetData(subData)); } exportMap.put("销售退货", ExcelUtils.getSheetData(mainData)); ExcelUtils.exportManySheet(response, "销售退货", exportMap); diff --git a/desktop/Cargo.lock b/desktop/Cargo.lock index ab446070..4968d4f5 100644 --- a/desktop/Cargo.lock +++ b/desktop/Cargo.lock @@ -62,16 +62,6 @@ version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" -[[package]] -name = "app" -version = "0.1.0" -dependencies = [ - "serde", - "serde_json", - "tauri", - "tauri-build", -] - [[package]] name = "atk" version = "0.15.1" @@ -601,6 +591,16 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +[[package]] +name = "eairp-desktop" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-build", +] + [[package]] name = "embed-resource" version = "2.4.0" From b6870f7cceda3129dc6f923c11ef61c113c5b667 Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 16:47:09 +0800 Subject: [PATCH 06/17] fetch: new add income and expense data export object --- .../bo/IncomeExpenseDataExportBO.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 core/domain/src/main/java/com/wansenai/bo/IncomeExpenseDataExportBO.java diff --git a/core/domain/src/main/java/com/wansenai/bo/IncomeExpenseDataExportBO.java b/core/domain/src/main/java/com/wansenai/bo/IncomeExpenseDataExportBO.java new file mode 100644 index 00000000..b20e714c --- /dev/null +++ b/core/domain/src/main/java/com/wansenai/bo/IncomeExpenseDataExportBO.java @@ -0,0 +1,39 @@ +/* + * Copyright 2023-2033 WanSen AI Team, Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://opensource.wansenai.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.wansenai.bo; + +import com.wansenai.utils.excel.ExcelExport; +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Builder +public class IncomeExpenseDataExportBO { + + @ExcelExport(value = "单据编号") + private String receiptNumber; + + @ExcelExport(value = "往来单位/人员") + private String relatedPerson; + + @ExcelExport(value = "收入/支出项目") + private String incomeExpenseName; + + @ExcelExport(value = "金额") + private BigDecimal incomeExpenseAmount; + + @ExcelExport(value = "备注") + private String remark; +} From 51e4a3519dcbb1f04bd282fc58708d978a47aba0 Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 16:47:25 +0800 Subject: [PATCH 07/17] fetch: update income receipt add export api --- .../financial/IncomeReceiptController.java | 7 ++ .../dto/financial/QueryIncomeDTO.java | 2 + .../financial/IncomeReceiptService.java | 3 + .../impl/IncomeReceiptServiceImpl.java | 66 +++++++++++++++++++ 4 files changed, 78 insertions(+) diff --git a/core/api/src/main/java/com/wansenai/api/financial/IncomeReceiptController.java b/core/api/src/main/java/com/wansenai/api/financial/IncomeReceiptController.java index 7df1e7df..b6c7e70e 100644 --- a/core/api/src/main/java/com/wansenai/api/financial/IncomeReceiptController.java +++ b/core/api/src/main/java/com/wansenai/api/financial/IncomeReceiptController.java @@ -19,6 +19,7 @@ import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.IncomeDetailVO; import com.wansenai.vo.financial.IncomeVO; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -27,6 +28,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import java.util.List; @@ -64,4 +66,9 @@ public Response deleteIncomeReceiptByIds(@RequestParam("ids") List public Response updateIncomeReceiptStatusByIds(@RequestParam("ids") List ids, @RequestParam("status") Integer status) { return incomeReceiptService.updateIncomeReceiptStatus(ids, status); } + + @GetMapping("export") + public void exportIncomeReceipt(@ModelAttribute QueryIncomeDTO queryIncomeDTO, HttpServletResponse response) { + incomeReceiptService.exportIncomeReceipt(queryIncomeDTO, response); + } } diff --git a/core/domain/src/main/java/com/wansenai/dto/financial/QueryIncomeDTO.java b/core/domain/src/main/java/com/wansenai/dto/financial/QueryIncomeDTO.java index 1203dc1c..6dd95479 100644 --- a/core/domain/src/main/java/com/wansenai/dto/financial/QueryIncomeDTO.java +++ b/core/domain/src/main/java/com/wansenai/dto/financial/QueryIncomeDTO.java @@ -36,4 +36,6 @@ public class QueryIncomeDTO { private Integer page; private Integer pageSize; + + private Boolean isExportDetail; } diff --git a/core/service/src/main/java/com/wansenai/service/financial/IncomeReceiptService.java b/core/service/src/main/java/com/wansenai/service/financial/IncomeReceiptService.java index ff11c566..f156b7f0 100644 --- a/core/service/src/main/java/com/wansenai/service/financial/IncomeReceiptService.java +++ b/core/service/src/main/java/com/wansenai/service/financial/IncomeReceiptService.java @@ -20,6 +20,7 @@ import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.IncomeDetailVO; import com.wansenai.vo.financial.IncomeVO; +import jakarta.servlet.http.HttpServletResponse; import java.util.List; @@ -34,4 +35,6 @@ public interface IncomeReceiptService extends IService { Response deleteBatchIncomeReceipt(List ids); Response updateIncomeReceiptStatus(List ids, Integer status); + + void exportIncomeReceipt(QueryIncomeDTO queryIncomeDTO, HttpServletResponse response); } diff --git a/core/service/src/main/java/com/wansenai/service/financial/impl/IncomeReceiptServiceImpl.java b/core/service/src/main/java/com/wansenai/service/financial/impl/IncomeReceiptServiceImpl.java index 0d5b85c1..70e66349 100644 --- a/core/service/src/main/java/com/wansenai/service/financial/impl/IncomeReceiptServiceImpl.java +++ b/core/service/src/main/java/com/wansenai/service/financial/impl/IncomeReceiptServiceImpl.java @@ -16,6 +16,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.wansenai.bo.FileDataBO; import com.wansenai.bo.IncomeExpenseBO; +import com.wansenai.bo.IncomeExpenseDataExportBO; import com.wansenai.dto.financial.AddOrUpdateIncomeDTO; import com.wansenai.dto.financial.QueryIncomeDTO; import com.wansenai.entities.financial.FinancialMain; @@ -34,9 +35,11 @@ import com.wansenai.utils.constants.CommonConstants; import com.wansenai.utils.enums.BaseCodeEnum; import com.wansenai.utils.enums.IncomeExpenseCodeEnum; +import com.wansenai.utils.excel.ExcelUtils; import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.IncomeDetailVO; import com.wansenai.vo.financial.IncomeVO; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -45,6 +48,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @Service @@ -139,6 +143,39 @@ public Response> getIncomeReceiptPageList(QueryIncomeDTO queryInc return Response.responseData(result); } + private List getIncomeReceiptList(QueryIncomeDTO queryIncomeDTO) { + var financialMainList = lambdaQuery() + .eq(queryIncomeDTO.getRelatedPersonId() != null, FinancialMain::getRelatedPersonId, queryIncomeDTO.getRelatedPersonId()) + .eq(queryIncomeDTO.getFinancialPersonId() != null, FinancialMain::getOperatorId, queryIncomeDTO.getFinancialPersonId()) + .eq(queryIncomeDTO.getAccountId() != null, FinancialMain::getAccountId, queryIncomeDTO.getAccountId()) + .eq(StringUtils.hasLength(queryIncomeDTO.getReceiptNumber()), FinancialMain::getReceiptNumber, queryIncomeDTO.getReceiptNumber()) + .eq(queryIncomeDTO.getStatus() != null, FinancialMain::getStatus, queryIncomeDTO.getStatus()) + .like(StringUtils.hasLength(queryIncomeDTO.getRemark()), FinancialMain::getRemark, queryIncomeDTO.getRemark()) + .ge(StringUtils.hasLength(queryIncomeDTO.getStartDate()), FinancialMain::getReceiptDate, queryIncomeDTO.getStartDate()) + .le(StringUtils.hasLength(queryIncomeDTO.getEndDate()), FinancialMain::getReceiptDate, queryIncomeDTO.getEndDate()) + .eq(FinancialMain::getType, "收入") + .eq(FinancialMain::getDeleteFlag, CommonConstants.NOT_DELETED) + .list(); + + var incomeVOList = new ArrayList(financialMainList.size() + 1); + financialMainList.forEach(item -> { + var incomeVO = IncomeVO.builder() + .id(item.getId()) + .receiptNumber(item.getReceiptNumber()) + .name(commonService.getRelatedPersonName(item.getRelatedPersonId())) + .receiptDate(item.getReceiptDate()) + .financialPerson(commonService.getOperatorName(item.getOperatorId())) + .incomeAccountName(commonService.getAccountName(item.getAccountId())) + .incomeAmount(item.getTotalAmount()) + .status(item.getStatus()) + .remark(item.getRemark()) + .build(); + + incomeVOList.add(incomeVO); + }); + return incomeVOList; + } + @Override public Response getIncomeReceiptDetail(Long id) { if (id == null) { @@ -334,4 +371,33 @@ public Response updateIncomeReceiptStatus(List ids, Integer status } return Response.responseMsg(IncomeExpenseCodeEnum.UPDATE_INCOME_RECEIPT_SUCCESS); } + + @Override + public void exportIncomeReceipt(QueryIncomeDTO queryIncomeDTO, HttpServletResponse response) { + var exportMap = new ConcurrentHashMap>>(); + var mainData = getIncomeReceiptList(queryIncomeDTO); + if (!mainData.isEmpty()) { + exportMap.put("收入单", ExcelUtils.getSheetData(mainData)); + if (queryIncomeDTO.getIsExportDetail()) { + var subData = new ArrayList(); + for (IncomeVO incomeVO : mainData) { + var detail = getIncomeReceiptDetail(incomeVO.getId()).getData().getTableData(); + if (!detail.isEmpty()) { + detail.forEach(item -> { + var data = IncomeExpenseDataExportBO.builder() + .receiptNumber(incomeVO.getReceiptNumber()) + .relatedPerson(incomeVO.getName()) + .incomeExpenseName(item.getIncomeExpenseName()) + .incomeExpenseAmount(item.getIncomeExpenseAmount()) + .remark(item.getRemark()) + .build(); + subData.add(data); + }); + } + } + exportMap.put("收入单明细", ExcelUtils.getSheetData(subData)); + } + ExcelUtils.exportManySheet(response, "收入单", exportMap); + } + } } From 789c34e24ee114b5310ac1de4a2164b915d254be Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 17:40:50 +0800 Subject: [PATCH 08/17] new: add collection export data object --- .../wansenai/bo/CollectionDataExportBO.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 core/domain/src/main/java/com/wansenai/bo/CollectionDataExportBO.java diff --git a/core/domain/src/main/java/com/wansenai/bo/CollectionDataExportBO.java b/core/domain/src/main/java/com/wansenai/bo/CollectionDataExportBO.java new file mode 100644 index 00000000..47ffddf7 --- /dev/null +++ b/core/domain/src/main/java/com/wansenai/bo/CollectionDataExportBO.java @@ -0,0 +1,45 @@ +/* + * Copyright 2023-2033 WanSen AI Team, Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://opensource.wansenai.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.wansenai.bo; + +import com.wansenai.utils.excel.ExcelExport; +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Builder +public class CollectionDataExportBO { + + @ExcelExport(value = "客户") + private String customerName; + + @ExcelExport(value = "收款单号") + private String receiptNumber; + + @ExcelExport(value = "销售单据编号") + private String saleReceiptNumber; + + @ExcelExport(value = "应收欠款") + private BigDecimal receivableArrears; + + @ExcelExport(value = "已收欠款") + private BigDecimal receivedArrears; + + @ExcelExport(value = "本次收款") + private BigDecimal thisCollectionAmount; + + @ExcelExport(value = "备注") + private String remark; +} From f2423edece011134bed94a94d6900ca6cddc83a0 Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 17:40:56 +0800 Subject: [PATCH 09/17] new: add payment export data object --- .../com/wansenai/bo/PaymentDataExportBO.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 core/domain/src/main/java/com/wansenai/bo/PaymentDataExportBO.java diff --git a/core/domain/src/main/java/com/wansenai/bo/PaymentDataExportBO.java b/core/domain/src/main/java/com/wansenai/bo/PaymentDataExportBO.java new file mode 100644 index 00000000..95ea1502 --- /dev/null +++ b/core/domain/src/main/java/com/wansenai/bo/PaymentDataExportBO.java @@ -0,0 +1,45 @@ +/* + * Copyright 2023-2033 WanSen AI Team, Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://opensource.wansenai.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.wansenai.bo; + +import com.wansenai.utils.excel.ExcelExport; +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Builder +public class PaymentDataExportBO { + + @ExcelExport(value = "供应商") + private String supplierName; + + @ExcelExport(value = "付款单号") + private String receiptNumber; + + @ExcelExport(value = "采购单据编号") + private String purchaseReceiptNumber; + + @ExcelExport(value = "应付欠款") + private BigDecimal paymentArrears; + + @ExcelExport(value = "已付欠款") + private BigDecimal prepaidArrears; + + @ExcelExport(value = "本次付款") + private BigDecimal thisPaymentAmount; + + @ExcelExport(value = "备注") + private String remark; +} From 1ea74216a18dafbd18b7a206a92ff93aae53441f Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 17:41:02 +0800 Subject: [PATCH 10/17] new: add transfer export data object --- .../bo/TransferAccountDataExportBO.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 core/domain/src/main/java/com/wansenai/bo/TransferAccountDataExportBO.java diff --git a/core/domain/src/main/java/com/wansenai/bo/TransferAccountDataExportBO.java b/core/domain/src/main/java/com/wansenai/bo/TransferAccountDataExportBO.java new file mode 100644 index 00000000..3158ae16 --- /dev/null +++ b/core/domain/src/main/java/com/wansenai/bo/TransferAccountDataExportBO.java @@ -0,0 +1,36 @@ +/* + * Copyright 2023-2033 WanSen AI Team, Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://opensource.wansenai.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.wansenai.bo; + +import com.wansenai.utils.excel.ExcelExport; +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Builder +public class TransferAccountDataExportBO { + + @ExcelExport(value = "单据编号") + private String receiptNumber; + + @ExcelExport(value = "账户名称") + private String accountName; + + @ExcelExport(value = "转账金额") + private BigDecimal transferAmount; + + @ExcelExport(value = "备注") + private String remark; +} From 6ac955f8bf50169e9e91db222569469641682003 Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 17:41:46 +0800 Subject: [PATCH 11/17] fetch: add transfer export data object and api and views --- .../financial/TransferReceiptController.java | 7 ++ .../dto/financial/QueryTransferDTO.java | 2 + .../com/wansenai/vo/financial/TransferVO.java | 8 +++ .../financial/TransferReceiptService.java | 3 + .../impl/TransferReceiptServiceImpl.java | 64 +++++++++++++++++- web/src/api/financial/transfer.ts | 11 ++++ web/src/views/financial/transfer/index.vue | 65 +++++++++++++++---- 7 files changed, 146 insertions(+), 14 deletions(-) diff --git a/core/api/src/main/java/com/wansenai/api/financial/TransferReceiptController.java b/core/api/src/main/java/com/wansenai/api/financial/TransferReceiptController.java index cfd48947..9ee4b8f6 100644 --- a/core/api/src/main/java/com/wansenai/api/financial/TransferReceiptController.java +++ b/core/api/src/main/java/com/wansenai/api/financial/TransferReceiptController.java @@ -19,6 +19,7 @@ import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.TransferDetailVO; import com.wansenai.vo.financial.TransferVO; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -27,6 +28,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import java.util.List; @@ -64,4 +66,9 @@ public Response deleteTransferReceiptByIds(@RequestParam("ids") List updateTransferReceiptStatusByIds(@RequestParam("ids") List ids, @RequestParam("status") Integer status) { return transferReceiptService.updateTransferReceiptStatus(ids, status); } + + @GetMapping("export") + public void exportTransferReceipt(@ModelAttribute QueryTransferDTO queryTransferDTO, HttpServletResponse response) { + transferReceiptService.exportTransferReceipt(queryTransferDTO, response); + } } diff --git a/core/domain/src/main/java/com/wansenai/dto/financial/QueryTransferDTO.java b/core/domain/src/main/java/com/wansenai/dto/financial/QueryTransferDTO.java index 685e4071..0d3819cb 100644 --- a/core/domain/src/main/java/com/wansenai/dto/financial/QueryTransferDTO.java +++ b/core/domain/src/main/java/com/wansenai/dto/financial/QueryTransferDTO.java @@ -34,4 +34,6 @@ public class QueryTransferDTO { private Integer page; private Integer pageSize; + + private Boolean isExportDetail; } diff --git a/core/domain/src/main/java/com/wansenai/vo/financial/TransferVO.java b/core/domain/src/main/java/com/wansenai/vo/financial/TransferVO.java index 85ab21b8..97a3df00 100644 --- a/core/domain/src/main/java/com/wansenai/vo/financial/TransferVO.java +++ b/core/domain/src/main/java/com/wansenai/vo/financial/TransferVO.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.wansenai.bo.BigDecimalSerializerBO; +import com.wansenai.utils.excel.ExcelExport; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -32,19 +33,26 @@ public class TransferVO { @JsonFormat(shape = JsonFormat.Shape.STRING) private Long id; + @ExcelExport(value = "单据编号") private String receiptNumber; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ExcelExport(value = "单据日期") private LocalDateTime receiptDate; + @ExcelExport(value = "财务人员") private String financialPerson; + @ExcelExport(value = "付款账户") private String paymentAccountName; @JsonSerialize(using = BigDecimalSerializerBO.class) + @ExcelExport(value = "付款金额") private BigDecimal paymentAmount; + @ExcelExport(value = "备注") private String remark; + @ExcelExport(value = "状态", kv = "0:未审核;1:已审核") private Integer status; } diff --git a/core/service/src/main/java/com/wansenai/service/financial/TransferReceiptService.java b/core/service/src/main/java/com/wansenai/service/financial/TransferReceiptService.java index cb6f5f1a..930fc616 100644 --- a/core/service/src/main/java/com/wansenai/service/financial/TransferReceiptService.java +++ b/core/service/src/main/java/com/wansenai/service/financial/TransferReceiptService.java @@ -20,6 +20,7 @@ import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.TransferDetailVO; import com.wansenai.vo.financial.TransferVO; +import jakarta.servlet.http.HttpServletResponse; import java.util.List; @@ -34,4 +35,6 @@ public interface TransferReceiptService extends IService { Response deleteBatchTransferReceipt(List ids); Response updateTransferReceiptStatus(List ids, Integer status); + + void exportTransferReceipt(QueryTransferDTO queryTransferDTO, HttpServletResponse response); } diff --git a/core/service/src/main/java/com/wansenai/service/financial/impl/TransferReceiptServiceImpl.java b/core/service/src/main/java/com/wansenai/service/financial/impl/TransferReceiptServiceImpl.java index 58bfafd2..66fa61d6 100644 --- a/core/service/src/main/java/com/wansenai/service/financial/impl/TransferReceiptServiceImpl.java +++ b/core/service/src/main/java/com/wansenai/service/financial/impl/TransferReceiptServiceImpl.java @@ -15,7 +15,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.wansenai.bo.FileDataBO; +import com.wansenai.bo.IncomeExpenseDataExportBO; import com.wansenai.bo.TransferAccountBO; +import com.wansenai.bo.TransferAccountDataExportBO; import com.wansenai.dto.financial.AddOrUpdateTransferDTO; import com.wansenai.dto.financial.QueryTransferDTO; import com.wansenai.entities.financial.FinancialMain; @@ -32,11 +34,12 @@ import com.wansenai.utils.TimeUtil; import com.wansenai.utils.constants.CommonConstants; import com.wansenai.utils.enums.BaseCodeEnum; -import com.wansenai.utils.enums.IncomeExpenseCodeEnum; import com.wansenai.utils.enums.TransferAccountCodeEnum; +import com.wansenai.utils.excel.ExcelUtils; import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.TransferDetailVO; import com.wansenai.vo.financial.TransferVO; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -45,6 +48,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @Service @@ -133,6 +137,36 @@ public Response> getTransferReceiptPageList(QueryTransferDTO qu return Response.responseData(result); } + private List getTransferReceiptList(QueryTransferDTO queryTransferDTO) { + var financialMainList = lambdaQuery() + .eq(queryTransferDTO.getFinancialPersonId() != null, FinancialMain::getOperatorId, queryTransferDTO.getFinancialPersonId()) + .eq(queryTransferDTO.getAccountId() != null, FinancialMain::getAccountId, queryTransferDTO.getAccountId()) + .eq(StringUtils.hasLength(queryTransferDTO.getReceiptNumber()), FinancialMain::getReceiptNumber, queryTransferDTO.getReceiptNumber()) + .eq(queryTransferDTO.getStatus() != null, FinancialMain::getStatus, queryTransferDTO.getStatus()) + .like(StringUtils.hasLength(queryTransferDTO.getRemark()), FinancialMain::getRemark, queryTransferDTO.getRemark()) + .ge(StringUtils.hasLength(queryTransferDTO.getStartDate()), FinancialMain::getReceiptDate, queryTransferDTO.getStartDate()) + .le(StringUtils.hasLength(queryTransferDTO.getEndDate()), FinancialMain::getReceiptDate, queryTransferDTO.getEndDate()) + .eq(FinancialMain::getType, "转账") + .list(); + + var transferVOList = new ArrayList(financialMainList.size() + 1); + financialMainList.forEach(item -> { + var transferVO = TransferVO.builder() + .id(item.getId()) + .receiptNumber(item.getReceiptNumber()) + .receiptDate(item.getReceiptDate()) + .financialPerson(commonService.getOperatorName(item.getOperatorId())) + .paymentAmount(item.getTotalAmount()) + .paymentAccountName(commonService.getAccountName(item.getAccountId())) + .status(item.getStatus()) + .remark(item.getRemark()) + .build(); + + transferVOList.add(transferVO); + }); + return transferVOList; + } + @Override public Response getTransferReceiptDetail(Long id) { if (id == null) { @@ -352,4 +386,32 @@ public Response updateTransferReceiptStatus(List ids, Integer stat } return Response.responseMsg(TransferAccountCodeEnum.UPDATE_TRANSFER_ACCOUNT_RECEIPT_SUCCESS); } + + @Override + public void exportTransferReceipt(QueryTransferDTO queryTransferDTO, HttpServletResponse response) { + var exportMap = new ConcurrentHashMap>>(); + var mainData = getTransferReceiptList(queryTransferDTO); + if (!mainData.isEmpty()) { + exportMap.put("转账单", ExcelUtils.getSheetData(mainData)); + if (queryTransferDTO.getIsExportDetail()) { + var subData = new ArrayList(); + for (TransferVO transferVO : mainData) { + var detail = getTransferReceiptDetail(transferVO.getId()).getData().getTableData(); + if (!detail.isEmpty()) { + detail.forEach(item -> { + var data = TransferAccountDataExportBO.builder() + .receiptNumber(transferVO.getReceiptNumber()) + .accountName(item.getAccountName()) + .transferAmount(item.getTransferAmount()) + .remark(item.getRemark()) + .build(); + subData.add(data); + }); + } + } + exportMap.put("转账单明细", ExcelUtils.getSheetData(subData)); + } + ExcelUtils.exportManySheet(response, "转账单", exportMap); + } + } } diff --git a/web/src/api/financial/transfer.ts b/web/src/api/financial/transfer.ts index c8362eaf..b99a81f2 100644 --- a/web/src/api/financial/transfer.ts +++ b/web/src/api/financial/transfer.ts @@ -14,6 +14,7 @@ enum API { DeleteBatch = '/financial/transfer/deleteByIds', UpdateStatus = '/financial/transfer/updateStatusByIds', GetDetail = '/financial/transfer/getDetailById', + Export = '/financial/transfer/export', } export function getTransferPageList(params: QueryTransferReq, mode: ErrorMessageMode = 'notice') { @@ -65,4 +66,14 @@ export function getTransferDetailById(id: number) { url: `${API.GetDetail}/${id}` }, ); +} + +export function exportTransfer(params: QueryTransferReq) { + return defHttp.get>( + { + url: `${API.Export}`, + params, + responseType: "blob" + } + ); } \ No newline at end of file diff --git a/web/src/views/financial/transfer/index.vue b/web/src/views/financial/transfer/index.vue index c6af3964..9b014a69 100644 --- a/web/src/views/financial/transfer/index.vue +++ b/web/src/views/financial/transfer/index.vue @@ -40,6 +40,14 @@ + +
+

即将导出{{dataSum}}条数据,请耐心等待。

+

如需导出明细数据(可能耗时较长),请勾选下方复选框。

+ 需要导出明细数据 +
+
@@ -52,22 +60,25 @@ import {defineComponent, ref} from "vue"; import {BasicTable, TableAction, useTable} from "@/components/Table"; import {useMessage} from "@/hooks/web/useMessage"; import {columns, searchFormSchema} from "@/views/financial/transfer/transfer.data"; -import {exportXlsx} from "@/api/basic/common"; import {useI18n} from "vue-i18n"; -import {getTransferPageList, deleteBatchTransfer, updateTransferStatus} from "@/api/financial/transfer"; -import {Tag} from "ant-design-vue"; +import {getTransferPageList, deleteBatchTransfer, updateTransferStatus, exportTransfer} from "@/api/financial/transfer"; +import {Checkbox, Modal, Tag} from "ant-design-vue"; import {useModal} from "@/components/Modal"; import ViewTransferModal from "@/views/financial/transfer/components/ViewTransferModal.vue"; import AddEditTransferModal from "@/views/financial/transfer/components/AddEditTransferModal.vue" export default defineComponent({ name: 'TransferReceipt', - components: {ViewTransferModal, Tag, TableAction, BasicTable, AddEditTransferModal}, + components: {'a-modal': Modal, 'a-checkbox': Checkbox, ViewTransferModal, Tag, TableAction, BasicTable, AddEditTransferModal}, setup() { const { t } = useI18n(); const { createMessage } = useMessage(); const addEditModalRef = ref(null); + const exportDetailData = ref(false); + const openExportData = ref(false); + const confirmLoading = ref(false); + const dataSum = ref(0); const [receiptViewModal, {openModal: openReceiptViewModal}] = useModal(); - const [registerTable, { reload, getSelectRows }] = useTable({ + const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({ title: '转账单列表', rowKey: 'id', api: getTransferPageList, @@ -169,16 +180,38 @@ export default defineComponent({ } async function handleExport() { - const file = await exportXlsx("转账单列表") - const blob = new Blob([file]); - const link = document.createElement("a"); - link.href = URL.createObjectURL(blob); - const timestamp = getTimestamp(new Date()); - link.download = "转账单数据" + timestamp + ".xlsx"; - link.target = "_blank"; - link.click(); + dataSum.value = getDataSource().length; + if (dataSum.value === 0) { + createMessage.warn('当前查询条件下无数据可导出'); + return; + } + openExportData.value = true; } + const handleExportCancel = () => { + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; + }; + + const handleExportOk = async () => { + confirmLoading.value = true; + const data: any = getForm().getFieldsValue(); + data.isExportDetail = exportDetailData.value; + const file: any = await exportTransfer(data) + if (file.size > 0) { + const blob = new Blob([file]); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + const timestamp = getTimestamp(new Date()); + link.download = "转账单数据" + timestamp + ".xlsx"; + link.target = "_blank"; + link.click(); + } + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; + } return { t, @@ -195,6 +228,12 @@ export default defineComponent({ handleView, handleOk, handleExport, + openExportData, + confirmLoading, + exportDetailData, + dataSum, + handleExportOk, + handleExportCancel } } }) From 9e34c3982f849c8770db5fabb195330fdae330bf Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 17:42:18 +0800 Subject: [PATCH 12/17] fetch: add payment export data object and api and views #245 --- .../financial/PaymentReceiptController.java | 16 +++- .../dto/financial/QueryPaymentDTO.java | 2 + .../com/wansenai/vo/financial/PaymentVO.java | 11 +++ .../financial/PaymentReceiptService.java | 3 + .../impl/PaymentReceiptServiceImpl.java | 73 ++++++++++++++++++- web/src/api/financial/payment.ts | 11 +++ web/src/views/financial/payment/index.vue | 65 +++++++++++++---- 7 files changed, 164 insertions(+), 17 deletions(-) diff --git a/core/api/src/main/java/com/wansenai/api/financial/PaymentReceiptController.java b/core/api/src/main/java/com/wansenai/api/financial/PaymentReceiptController.java index 273f05bb..1b34584f 100644 --- a/core/api/src/main/java/com/wansenai/api/financial/PaymentReceiptController.java +++ b/core/api/src/main/java/com/wansenai/api/financial/PaymentReceiptController.java @@ -19,7 +19,16 @@ import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.PaymentDetailVO; import com.wansenai.vo.financial.PaymentVO; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import java.util.List; @@ -57,4 +66,9 @@ public Response deletePaymentReceiptByIds(@RequestParam("ids") List updatePaymentReceiptStatusByIds(@RequestParam("ids") List ids, @RequestParam("status") Integer status) { return paymentReceiptService.updatePaymentReceiptStatus(ids, status); } + + @GetMapping("export") + public void exportPaymentReceipt(@ModelAttribute QueryPaymentDTO queryPaymentDTO, HttpServletResponse response) { + paymentReceiptService.exportPaymentReceipt(queryPaymentDTO, response); + } } diff --git a/core/domain/src/main/java/com/wansenai/dto/financial/QueryPaymentDTO.java b/core/domain/src/main/java/com/wansenai/dto/financial/QueryPaymentDTO.java index 7ddcf608..849a3e04 100644 --- a/core/domain/src/main/java/com/wansenai/dto/financial/QueryPaymentDTO.java +++ b/core/domain/src/main/java/com/wansenai/dto/financial/QueryPaymentDTO.java @@ -38,4 +38,6 @@ public class QueryPaymentDTO { private Integer page; private Integer pageSize; + + private Boolean isExportDetail; } diff --git a/core/domain/src/main/java/com/wansenai/vo/financial/PaymentVO.java b/core/domain/src/main/java/com/wansenai/vo/financial/PaymentVO.java index 8d57bf08..b7ab064b 100644 --- a/core/domain/src/main/java/com/wansenai/vo/financial/PaymentVO.java +++ b/core/domain/src/main/java/com/wansenai/vo/financial/PaymentVO.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.wansenai.bo.BigDecimalSerializerBO; +import com.wansenai.utils.excel.ExcelExport; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -32,27 +33,37 @@ public class PaymentVO { @JsonFormat(shape = JsonFormat.Shape.STRING) private Long id; + @ExcelExport(value = "供应商") private String supplierName; + @ExcelExport(value = "单据编号") private String receiptNumber; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ExcelExport(value = "单据日期") private LocalDateTime receiptDate; + @ExcelExport(value = "财务人员") private String financialPerson; + @ExcelExport(value = "付款账户") private String paymentAccountName; @JsonSerialize(using = BigDecimalSerializerBO.class) + @ExcelExport(value = "合计付款") private BigDecimal totalPaymentAmount; @JsonSerialize(using = BigDecimalSerializerBO.class) + @ExcelExport(value = "优惠金额") private BigDecimal discountAmount; @JsonSerialize(using = BigDecimalSerializerBO.class) + @ExcelExport(value = "实际付款") private BigDecimal actualPaymentAmount; + @ExcelExport(value = "备注") private String remark; + @ExcelExport(value = "状态", kv = "0:未审核;1:已审核") private Integer status; } diff --git a/core/service/src/main/java/com/wansenai/service/financial/PaymentReceiptService.java b/core/service/src/main/java/com/wansenai/service/financial/PaymentReceiptService.java index 8b6da33e..1a2a4174 100644 --- a/core/service/src/main/java/com/wansenai/service/financial/PaymentReceiptService.java +++ b/core/service/src/main/java/com/wansenai/service/financial/PaymentReceiptService.java @@ -20,6 +20,7 @@ import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.PaymentDetailVO; import com.wansenai.vo.financial.PaymentVO; +import jakarta.servlet.http.HttpServletResponse; import java.util.List; @@ -34,4 +35,6 @@ public interface PaymentReceiptService extends IService { Response deleteBatchPaymentReceipt(List ids); Response updatePaymentReceiptStatus(List ids, Integer status); + + void exportPaymentReceipt(QueryPaymentDTO queryPaymentDTO, HttpServletResponse response); } diff --git a/core/service/src/main/java/com/wansenai/service/financial/impl/PaymentReceiptServiceImpl.java b/core/service/src/main/java/com/wansenai/service/financial/impl/PaymentReceiptServiceImpl.java index 10656b91..d43c43b1 100644 --- a/core/service/src/main/java/com/wansenai/service/financial/impl/PaymentReceiptServiceImpl.java +++ b/core/service/src/main/java/com/wansenai/service/financial/impl/PaymentReceiptServiceImpl.java @@ -14,9 +14,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.wansenai.bo.CollectionBO; import com.wansenai.bo.FileDataBO; import com.wansenai.bo.PaymentBO; +import com.wansenai.bo.PaymentDataExportBO; import com.wansenai.dto.financial.AddOrUpdatePaymentDTO; import com.wansenai.dto.financial.QueryPaymentDTO; import com.wansenai.entities.financial.FinancialMain; @@ -34,11 +34,11 @@ import com.wansenai.utils.constants.CommonConstants; import com.wansenai.utils.enums.BaseCodeEnum; import com.wansenai.utils.enums.CollectionPaymentCodeEnum; +import com.wansenai.utils.excel.ExcelUtils; import com.wansenai.utils.response.Response; -import com.wansenai.vo.financial.CollectionDetailVO; -import com.wansenai.vo.financial.CollectionVO; import com.wansenai.vo.financial.PaymentDetailVO; import com.wansenai.vo.financial.PaymentVO; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -48,6 +48,7 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @Service @@ -141,6 +142,41 @@ public Response> getPaymentReceiptPageList(QueryPaymentDTO query return Response.responseData(result); } + private List getPaymentReceiptList(QueryPaymentDTO queryPaymentDTO) { + var financialMainList = lambdaQuery() + .eq(queryPaymentDTO.getFinancialPersonId() != null, FinancialMain::getOperatorId, queryPaymentDTO.getFinancialPersonId()) + .eq(queryPaymentDTO.getAccountId() != null, FinancialMain::getAccountId, queryPaymentDTO.getAccountId()) + .eq(queryPaymentDTO.getStatus() != null, FinancialMain::getStatus, queryPaymentDTO.getStatus()) + .eq(queryPaymentDTO.getSupplierId() != null, FinancialMain::getRelatedPersonId, queryPaymentDTO.getSupplierId()) + .eq(StringUtils.hasLength(queryPaymentDTO.getReceiptNumber()), FinancialMain::getReceiptNumber, queryPaymentDTO.getReceiptNumber()) + .like(StringUtils.hasLength(queryPaymentDTO.getRemark()), FinancialMain::getRemark, queryPaymentDTO.getRemark()) + .ge(StringUtils.hasLength(queryPaymentDTO.getStartDate()), FinancialMain::getReceiptDate, queryPaymentDTO.getStartDate()) + .le(StringUtils.hasLength(queryPaymentDTO.getEndDate()), FinancialMain::getReceiptDate, queryPaymentDTO.getEndDate()) + .eq(FinancialMain::getType, "付款") + .eq(FinancialMain::getDeleteFlag, CommonConstants.NOT_DELETED) + .list(); + + var paymentVOList = new ArrayList(financialMainList.size() + 1); + financialMainList.forEach(item -> { + var paymentVo = PaymentVO.builder() + .id(item.getId()) + .receiptNumber(item.getReceiptNumber()) + .supplierName(commonService.getSupplierName(item.getRelatedPersonId())) + .receiptDate(item.getReceiptDate()) + .financialPerson(commonService.getOperatorName(item.getOperatorId())) + .paymentAccountName(commonService.getAccountName(item.getAccountId())) + .totalPaymentAmount(item.getTotalAmount()) + .discountAmount(item.getDiscountAmount()) + .actualPaymentAmount(item.getChangeAmount()) + .status(item.getStatus()) + .remark(item.getRemark()) + .build(); + + paymentVOList.add(paymentVo); + }); + return paymentVOList; + } + @Override public Response getPaymentReceiptDetail(Long id) { if (id == null) { @@ -354,4 +390,35 @@ public Response updatePaymentReceiptStatus(List ids, Integer statu } return Response.responseMsg(CollectionPaymentCodeEnum.UPDATE_PAYMENT_RECEIPT_SUCCESS); } + + @Override + public void exportPaymentReceipt(QueryPaymentDTO queryPaymentDTO, HttpServletResponse response) { + var exportMap = new ConcurrentHashMap>>(); + var mainData = getPaymentReceiptList(queryPaymentDTO); + if (!mainData.isEmpty()) { + exportMap.put("付款单", ExcelUtils.getSheetData(mainData)); + if (queryPaymentDTO.getIsExportDetail()) { + var subData = new ArrayList(); + for (PaymentVO paymentVO : mainData) { + var detail = getPaymentReceiptDetail(paymentVO.getId()).getData().getTableData(); + if (!detail.isEmpty()) { + detail.forEach(item -> { + var data = PaymentDataExportBO.builder() + .supplierName(paymentVO.getSupplierName()) + .receiptNumber(paymentVO.getReceiptNumber()) + .purchaseReceiptNumber(item.getPurchaseReceiptNumber()) + .paymentArrears(item.getPaymentArrears()) + .prepaidArrears(item.getPrepaidArrears()) + .thisPaymentAmount(item.getThisPaymentAmount()) + .remark(item.getRemark()) + .build(); + subData.add(data); + }); + } + } + exportMap.put("付款单明细", ExcelUtils.getSheetData(subData)); + } + ExcelUtils.exportManySheet(response, "付款单", exportMap); + } + } } diff --git a/web/src/api/financial/payment.ts b/web/src/api/financial/payment.ts index 631fa224..b64f0808 100644 --- a/web/src/api/financial/payment.ts +++ b/web/src/api/financial/payment.ts @@ -17,6 +17,7 @@ enum API { UpdateStatus = '/financial/payment/updateStatusByIds', GetDetail = '/financial/payment/getDetailById', GetArrearsPage = '/purchase/arrears/pageList', + Export = '/financial/payment/export', } export function getPaymentPageList(params: QueryPaymentReq) { @@ -77,4 +78,14 @@ export function getArrearsPageList(params: QueryPaymentArrearsReq) { params, } ); +} + +export function exportPayment(params: QueryPaymentReq) { + return defHttp.get>( + { + url: `${API.Export}`, + params, + responseType: "blob" + } + ); } \ No newline at end of file diff --git a/web/src/views/financial/payment/index.vue b/web/src/views/financial/payment/index.vue index d9c02371..cdc87bd1 100644 --- a/web/src/views/financial/payment/index.vue +++ b/web/src/views/financial/payment/index.vue @@ -40,6 +40,14 @@ + +
+

即将导出{{dataSum}}条数据,请耐心等待。

+

如需导出明细数据(可能耗时较长),请勾选下方复选框。

+ 需要导出明细数据 +
+
@@ -52,22 +60,25 @@ import {defineComponent, ref} from "vue"; import {BasicTable, TableAction, useTable} from "@/components/Table"; import {useMessage} from "@/hooks/web/useMessage"; import {columns, searchFormSchema} from "@/views/financial/payment/payment.data"; -import {exportXlsx} from "@/api/basic/common"; import {useI18n} from "vue-i18n"; -import {getPaymentPageList, deleteBatchPayment, updatePaymentStatus} from "@/api/financial/payment"; -import {Tag} from "ant-design-vue"; +import {getPaymentPageList, deleteBatchPayment, updatePaymentStatus, exportPayment} from "@/api/financial/payment"; +import {Checkbox, Modal, Tag} from "ant-design-vue"; import {useModal} from "@/components/Modal"; import ViewPaymentModal from "@/views/financial/payment/components/ViewPaymentModal.vue"; import AddEditPaymentModal from "@/views/financial/payment/components/AddEditPaymentModal.vue"; export default defineComponent({ name: 'PaymentReceipt', - components: {ViewPaymentModal, Tag, TableAction, BasicTable, AddEditPaymentModal}, + components: {'a-modal': Modal, 'a-checkbox': Checkbox, ViewPaymentModal, Tag, TableAction, BasicTable, AddEditPaymentModal}, setup() { const { t } = useI18n(); const { createMessage } = useMessage(); const addEditModalRef = ref(null); + const exportDetailData = ref(false); + const openExportData = ref(false); + const confirmLoading = ref(false); + const dataSum = ref(0); const [receiptViewModal, {openModal: openReceiptViewModal}] = useModal(); - const [registerTable, { reload, getSelectRows }] = useTable({ + const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({ title: '付款单列表', rowKey: 'id', api: getPaymentPageList, @@ -169,16 +180,38 @@ export default defineComponent({ } async function handleExport() { - const file = await exportXlsx("付款单列表") - const blob = new Blob([file]); - const link = document.createElement("a"); - link.href = URL.createObjectURL(blob); - const timestamp = getTimestamp(new Date()); - link.download = "付款单数据" + timestamp + ".xlsx"; - link.target = "_blank"; - link.click(); + dataSum.value = getDataSource().length; + if (dataSum.value === 0) { + createMessage.warn('当前查询条件下无数据可导出'); + return; + } + openExportData.value = true; } + const handleExportCancel = () => { + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; + }; + + const handleExportOk = async () => { + confirmLoading.value = true; + const data: any = getForm().getFieldsValue(); + data.isExportDetail = exportDetailData.value; + const file: any = await exportPayment(data) + if (file.size > 0) { + const blob = new Blob([file]); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + const timestamp = getTimestamp(new Date()); + link.download = "付款单数据" + timestamp + ".xlsx"; + link.target = "_blank"; + link.click(); + } + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; + } return { t, @@ -195,6 +228,12 @@ export default defineComponent({ handleView, handleOk, handleExport, + openExportData, + confirmLoading, + exportDetailData, + dataSum, + handleExportOk, + handleExportCancel } } }) From 25ab7bdc05d57bd0b0013f514b4093c07ea1aa5f Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 17:42:39 +0800 Subject: [PATCH 13/17] fetch: add expense export data object and api and views #245 --- .../financial/ExpenseReceiptController.java | 15 +++-- .../dto/financial/QueryExpenseDTO.java | 2 + .../com/wansenai/vo/financial/ExpenseVO.java | 9 +++ .../financial/ExpenseReceiptService.java | 3 + .../impl/ExpenseReceiptServiceImpl.java | 67 ++++++++++++++++++- web/src/api/financial/expense.ts | 11 +++ 6 files changed, 101 insertions(+), 6 deletions(-) diff --git a/core/api/src/main/java/com/wansenai/api/financial/ExpenseReceiptController.java b/core/api/src/main/java/com/wansenai/api/financial/ExpenseReceiptController.java index 6980a72a..dd50ddc8 100644 --- a/core/api/src/main/java/com/wansenai/api/financial/ExpenseReceiptController.java +++ b/core/api/src/main/java/com/wansenai/api/financial/ExpenseReceiptController.java @@ -19,14 +19,16 @@ import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.ExpenseDetailVO; import com.wansenai.vo.financial.ExpenseVO; -import org.springframework.web.bind.annotation.PostMapping; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import java.util.List; @@ -64,4 +66,9 @@ public Response deleteExpenseReceiptByIds(@RequestParam("ids") List updateExpenseReceiptStatusByIds(@RequestParam("ids") List ids, @RequestParam("status") Integer status) { return expenseReceiptService.updateExpenseReceiptStatus(ids, status); } + + @GetMapping("export") + public void exportExpenseReceipt(@ModelAttribute QueryExpenseDTO queryExpenseDTO, HttpServletResponse response) { + expenseReceiptService.exportExpenseReceipt(queryExpenseDTO, response); + } } diff --git a/core/domain/src/main/java/com/wansenai/dto/financial/QueryExpenseDTO.java b/core/domain/src/main/java/com/wansenai/dto/financial/QueryExpenseDTO.java index 94d0ca62..3d8703cc 100644 --- a/core/domain/src/main/java/com/wansenai/dto/financial/QueryExpenseDTO.java +++ b/core/domain/src/main/java/com/wansenai/dto/financial/QueryExpenseDTO.java @@ -36,4 +36,6 @@ public class QueryExpenseDTO { private Integer page; private Integer pageSize; + + private Boolean isExportDetail; } diff --git a/core/domain/src/main/java/com/wansenai/vo/financial/ExpenseVO.java b/core/domain/src/main/java/com/wansenai/vo/financial/ExpenseVO.java index 51a50a99..e45a9b9c 100644 --- a/core/domain/src/main/java/com/wansenai/vo/financial/ExpenseVO.java +++ b/core/domain/src/main/java/com/wansenai/vo/financial/ExpenseVO.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.wansenai.bo.BigDecimalSerializerBO; +import com.wansenai.utils.excel.ExcelExport; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -33,21 +34,29 @@ public class ExpenseVO { private Long id; // supplier or customer or member + @ExcelExport(value = "往来单位/人员") private String name; + @ExcelExport(value = "单据编号") private String receiptNumber; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ExcelExport(value = "单据日期") private LocalDateTime receiptDate; + @ExcelExport(value = "财务人员") private String financialPerson; + @ExcelExport(value = "支出账户") private String expenseAccountName; @JsonSerialize(using = BigDecimalSerializerBO.class) + @ExcelExport(value = "支出金额") private BigDecimal expenseAmount; + @ExcelExport(value = "备注") private String remark; + @ExcelExport(value = "状态", kv = "0-未审核;1-已审核") private Integer status; } diff --git a/core/service/src/main/java/com/wansenai/service/financial/ExpenseReceiptService.java b/core/service/src/main/java/com/wansenai/service/financial/ExpenseReceiptService.java index 52e5a8f9..d62a03f9 100644 --- a/core/service/src/main/java/com/wansenai/service/financial/ExpenseReceiptService.java +++ b/core/service/src/main/java/com/wansenai/service/financial/ExpenseReceiptService.java @@ -20,6 +20,7 @@ import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.ExpenseDetailVO; import com.wansenai.vo.financial.ExpenseVO; +import jakarta.servlet.http.HttpServletResponse; import java.util.List; @@ -34,4 +35,6 @@ public interface ExpenseReceiptService extends IService { Response deleteBatchExpenseReceipt(List ids); Response updateExpenseReceiptStatus(List ids, Integer status); + + void exportExpenseReceipt(QueryExpenseDTO queryExpenseDTO, HttpServletResponse response); } diff --git a/core/service/src/main/java/com/wansenai/service/financial/impl/ExpenseReceiptServiceImpl.java b/core/service/src/main/java/com/wansenai/service/financial/impl/ExpenseReceiptServiceImpl.java index 2a178509..34664909 100644 --- a/core/service/src/main/java/com/wansenai/service/financial/impl/ExpenseReceiptServiceImpl.java +++ b/core/service/src/main/java/com/wansenai/service/financial/impl/ExpenseReceiptServiceImpl.java @@ -16,6 +16,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.wansenai.bo.FileDataBO; import com.wansenai.bo.IncomeExpenseBO; +import com.wansenai.bo.IncomeExpenseDataExportBO; import com.wansenai.dto.financial.AddOrUpdateExpenseDTO; import com.wansenai.dto.financial.QueryExpenseDTO; import com.wansenai.entities.financial.FinancialMain; @@ -34,11 +35,11 @@ import com.wansenai.utils.constants.CommonConstants; import com.wansenai.utils.enums.BaseCodeEnum; import com.wansenai.utils.enums.IncomeExpenseCodeEnum; +import com.wansenai.utils.excel.ExcelUtils; import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.ExpenseDetailVO; import com.wansenai.vo.financial.ExpenseVO; -import com.wansenai.vo.financial.IncomeDetailVO; -import com.wansenai.vo.financial.IncomeVO; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -47,6 +48,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @Service @@ -140,6 +142,38 @@ public Response> getExpenseReceiptPageList(QueryExpenseDTO query return Response.responseData(result); } + public List getExpenseReceiptList(QueryExpenseDTO queryExpenseDTO) { + var financialMainList = lambdaQuery() + .eq(queryExpenseDTO.getRelatedPersonId() != null, FinancialMain::getRelatedPersonId, queryExpenseDTO.getRelatedPersonId()) + .eq(queryExpenseDTO.getFinancialPersonId() != null, FinancialMain::getOperatorId, queryExpenseDTO.getFinancialPersonId()) + .eq(queryExpenseDTO.getAccountId() != null, FinancialMain::getAccountId, queryExpenseDTO.getAccountId()) + .eq(StringUtils.hasLength(queryExpenseDTO.getReceiptNumber()), FinancialMain::getReceiptNumber, queryExpenseDTO.getReceiptNumber()) + .eq(queryExpenseDTO.getStatus() != null, FinancialMain::getStatus, queryExpenseDTO.getStatus()) + .like(StringUtils.hasLength(queryExpenseDTO.getRemark()), FinancialMain::getRemark, queryExpenseDTO.getRemark()) + .ge(StringUtils.hasLength(queryExpenseDTO.getStartDate()), FinancialMain::getReceiptDate, queryExpenseDTO.getStartDate()) + .le(StringUtils.hasLength(queryExpenseDTO.getEndDate()), FinancialMain::getReceiptDate, queryExpenseDTO.getEndDate()) + .eq(FinancialMain::getType, "支出") + .list(); + + var expenseVOList = new ArrayList(financialMainList.size() + 1); + financialMainList.forEach(item -> { + var expenseVO = ExpenseVO.builder() + .id(item.getId()) + .receiptNumber(item.getReceiptNumber()) + .name(commonService.getRelatedPersonName(item.getRelatedPersonId())) + .receiptDate(item.getReceiptDate()) + .financialPerson(commonService.getOperatorName(item.getOperatorId())) + .expenseAccountName(commonService.getAccountName(item.getAccountId())) + .expenseAmount(item.getTotalAmount()) + .status(item.getStatus()) + .remark(item.getRemark()) + .build(); + + expenseVOList.add(expenseVO); + }); + return expenseVOList; + } + @Override public Response getExpenseReceiptDetail(Long id) { if (id == null) { @@ -335,4 +369,33 @@ public Response updateExpenseReceiptStatus(List ids, Integer statu } return Response.responseMsg(IncomeExpenseCodeEnum.UPDATE_EXPENSE_RECEIPT_SUCCESS); } + + @Override + public void exportExpenseReceipt(QueryExpenseDTO queryExpenseDTO, HttpServletResponse response) { + var exportMap = new ConcurrentHashMap>>(); + var mainData = getExpenseReceiptList(queryExpenseDTO); + if (!mainData.isEmpty()) { + exportMap.put("支出单", ExcelUtils.getSheetData(mainData)); + if (queryExpenseDTO.getIsExportDetail()) { + var subData = new ArrayList(); + for (ExpenseVO expenseVO : mainData) { + var detail = getExpenseReceiptDetail(expenseVO.getId()).getData().getTableData(); + if (!detail.isEmpty()) { + detail.forEach(item -> { + var data = IncomeExpenseDataExportBO.builder() + .receiptNumber(expenseVO.getReceiptNumber()) + .relatedPerson(expenseVO.getName()) + .incomeExpenseName(item.getIncomeExpenseName()) + .incomeExpenseAmount(item.getIncomeExpenseAmount()) + .remark(item.getRemark()) + .build(); + subData.add(data); + }); + } + } + exportMap.put("支出单明细", ExcelUtils.getSheetData(subData)); + } + ExcelUtils.exportManySheet(response, "支出单", exportMap); + } + } } diff --git a/web/src/api/financial/expense.ts b/web/src/api/financial/expense.ts index 95529b09..f533a6e9 100644 --- a/web/src/api/financial/expense.ts +++ b/web/src/api/financial/expense.ts @@ -14,6 +14,7 @@ enum API { DeleteBatch = '/financial/expense/deleteByIds', UpdateStatus = '/financial/expense/updateStatusByIds', GetDetail = '/financial/expense/getDetailById', + Export = '/financial/expense/export', } export function getExpensePageList(params: QueryExpenseReq) { @@ -65,4 +66,14 @@ export function getExpenseDetailById(id: number) { url: `${API.GetDetail}/${id}` }, ); +} + +export function exportExpense(params: QueryExpenseReq) { + return defHttp.get>( + { + url: `${API.Export}`, + params, + responseType: "blob" + } + ); } \ No newline at end of file From 0e158685ba5e5fbd7b56d8288ce14b0bf2b9fbf4 Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 17:42:50 +0800 Subject: [PATCH 14/17] fetch: add collection export data object and api and views #245 --- .../CollectionReceiptController.java | 7 ++ .../dto/financial/QueryCollectionDTO.java | 2 + .../wansenai/vo/financial/CollectionVO.java | 11 +++ .../financial/CollectionReceiptService.java | 3 + .../impl/CollectionReceiptServiceImpl.java | 71 ++++++++++++++++++- web/src/api/financial/collection.ts | 11 +++ 6 files changed, 104 insertions(+), 1 deletion(-) diff --git a/core/api/src/main/java/com/wansenai/api/financial/CollectionReceiptController.java b/core/api/src/main/java/com/wansenai/api/financial/CollectionReceiptController.java index 7dae5b09..9d431ebf 100644 --- a/core/api/src/main/java/com/wansenai/api/financial/CollectionReceiptController.java +++ b/core/api/src/main/java/com/wansenai/api/financial/CollectionReceiptController.java @@ -19,6 +19,7 @@ import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.CollectionDetailVO; import com.wansenai.vo.financial.CollectionVO; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -27,6 +28,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import java.util.List; @@ -64,4 +66,9 @@ public Response deleteCollectionReceiptByIds(@RequestParam("ids") List updateCollectionReceiptStatusByIds(@RequestParam("ids") List ids, @RequestParam("status") Integer status) { return collectionReceiptService.updateCollectionReceiptStatus(ids, status); } + + @GetMapping("export") + public void exportCollectionReceipt(@ModelAttribute QueryCollectionDTO queryCollectionDTO, HttpServletResponse response) { + collectionReceiptService.exportCollectionReceipt(queryCollectionDTO, response); + } } diff --git a/core/domain/src/main/java/com/wansenai/dto/financial/QueryCollectionDTO.java b/core/domain/src/main/java/com/wansenai/dto/financial/QueryCollectionDTO.java index 29f79c7a..3fbca222 100644 --- a/core/domain/src/main/java/com/wansenai/dto/financial/QueryCollectionDTO.java +++ b/core/domain/src/main/java/com/wansenai/dto/financial/QueryCollectionDTO.java @@ -38,4 +38,6 @@ public class QueryCollectionDTO { private Integer page; private Integer pageSize; + + private Boolean isExportDetail; } diff --git a/core/domain/src/main/java/com/wansenai/vo/financial/CollectionVO.java b/core/domain/src/main/java/com/wansenai/vo/financial/CollectionVO.java index 331ca412..989fcf25 100644 --- a/core/domain/src/main/java/com/wansenai/vo/financial/CollectionVO.java +++ b/core/domain/src/main/java/com/wansenai/vo/financial/CollectionVO.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.wansenai.bo.BigDecimalSerializerBO; +import com.wansenai.utils.excel.ExcelExport; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -32,27 +33,37 @@ public class CollectionVO { @JsonFormat(shape = JsonFormat.Shape.STRING) private Long id; + @ExcelExport(value = "客户") private String customerName; + @ExcelExport(value = "单据编号") private String receiptNumber; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ExcelExport(value = "单据日期") private LocalDateTime receiptDate; + @ExcelExport(value = "财务人员") private String financialPerson; + @ExcelExport(value = "收款账户") private String collectionAccountName; @JsonSerialize(using = BigDecimalSerializerBO.class) + @ExcelExport(value = "合计收款") private BigDecimal totalCollectionAmount; @JsonSerialize(using = BigDecimalSerializerBO.class) + @ExcelExport(value = "优惠金额") private BigDecimal discountAmount; @JsonSerialize(using = BigDecimalSerializerBO.class) + @ExcelExport(value = "实际收款") private BigDecimal actualCollectionAmount; + @ExcelExport(value = "备注") private String remark; + @ExcelExport(value = "状态", kv = "0:未审核;1:已审核") private Integer status; } diff --git a/core/service/src/main/java/com/wansenai/service/financial/CollectionReceiptService.java b/core/service/src/main/java/com/wansenai/service/financial/CollectionReceiptService.java index 32dac4eb..4c968e48 100644 --- a/core/service/src/main/java/com/wansenai/service/financial/CollectionReceiptService.java +++ b/core/service/src/main/java/com/wansenai/service/financial/CollectionReceiptService.java @@ -20,6 +20,7 @@ import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.CollectionDetailVO; import com.wansenai.vo.financial.CollectionVO; +import jakarta.servlet.http.HttpServletResponse; import java.util.List; @@ -34,4 +35,6 @@ public interface CollectionReceiptService extends IService { Response deleteBatchCollectionReceipt(List ids); Response updateCollectionReceiptStatus(List ids, Integer status); + + void exportCollectionReceipt(QueryCollectionDTO queryCollectionDTO, HttpServletResponse response); } diff --git a/core/service/src/main/java/com/wansenai/service/financial/impl/CollectionReceiptServiceImpl.java b/core/service/src/main/java/com/wansenai/service/financial/impl/CollectionReceiptServiceImpl.java index caa39d8d..253983a6 100644 --- a/core/service/src/main/java/com/wansenai/service/financial/impl/CollectionReceiptServiceImpl.java +++ b/core/service/src/main/java/com/wansenai/service/financial/impl/CollectionReceiptServiceImpl.java @@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.wansenai.bo.CollectionBO; +import com.wansenai.bo.CollectionDataExportBO; import com.wansenai.bo.FileDataBO; import com.wansenai.dto.financial.AddOrUpdateCollectionDTO; import com.wansenai.dto.financial.QueryCollectionDTO; @@ -33,10 +34,11 @@ import com.wansenai.utils.constants.CommonConstants; import com.wansenai.utils.enums.BaseCodeEnum; import com.wansenai.utils.enums.CollectionPaymentCodeEnum; -import com.wansenai.utils.enums.IncomeExpenseCodeEnum; +import com.wansenai.utils.excel.ExcelUtils; import com.wansenai.utils.response.Response; import com.wansenai.vo.financial.CollectionDetailVO; import com.wansenai.vo.financial.CollectionVO; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -46,6 +48,7 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @Service @@ -139,6 +142,41 @@ public Response> getCollectionReceiptPageList(QueryCollection return Response.responseData(result); } + private List getCollectionReceiptList(QueryCollectionDTO queryCollectionDTO) { + var financialMainList = lambdaQuery() + .eq(queryCollectionDTO.getFinancialPersonId() != null, FinancialMain::getOperatorId, queryCollectionDTO.getFinancialPersonId()) + .eq(queryCollectionDTO.getAccountId() != null, FinancialMain::getAccountId, queryCollectionDTO.getAccountId()) + .eq(queryCollectionDTO.getStatus() != null, FinancialMain::getStatus, queryCollectionDTO.getStatus()) + .eq(queryCollectionDTO.getCustomerId() != null, FinancialMain::getRelatedPersonId, queryCollectionDTO.getCustomerId()) + .eq(StringUtils.hasLength(queryCollectionDTO.getReceiptNumber()), FinancialMain::getReceiptNumber, queryCollectionDTO.getReceiptNumber()) + .like(StringUtils.hasLength(queryCollectionDTO.getRemark()), FinancialMain::getRemark, queryCollectionDTO.getRemark()) + .ge(StringUtils.hasLength(queryCollectionDTO.getStartDate()), FinancialMain::getReceiptDate, queryCollectionDTO.getStartDate()) + .le(StringUtils.hasLength(queryCollectionDTO.getEndDate()), FinancialMain::getReceiptDate, queryCollectionDTO.getEndDate()) + .eq(FinancialMain::getType, "收款") + .eq(FinancialMain::getDeleteFlag, CommonConstants.NOT_DELETED) + .list(); + + var collectionVOList = new ArrayList(financialMainList.size() + 1); + financialMainList.forEach(item -> { + var collectionVo = CollectionVO.builder() + .id(item.getId()) + .receiptNumber(item.getReceiptNumber()) + .customerName(commonService.getCustomerName(item.getRelatedPersonId())) + .receiptDate(item.getReceiptDate()) + .financialPerson(commonService.getOperatorName(item.getOperatorId())) + .collectionAccountName(commonService.getAccountName(item.getAccountId())) + .totalCollectionAmount(item.getTotalAmount()) + .discountAmount(item.getDiscountAmount()) + .actualCollectionAmount(item.getChangeAmount()) + .status(item.getStatus()) + .remark(item.getRemark()) + .build(); + + collectionVOList.add(collectionVo); + }); + return collectionVOList; + } + @Override public Response getCollectionReceiptDetail(Long id) { if (id == null) { @@ -352,4 +390,35 @@ public Response updateCollectionReceiptStatus(List ids, Integer st } return Response.responseMsg(CollectionPaymentCodeEnum.UPDATE_COLLECTION_RECEIPT_SUCCESS); } + + @Override + public void exportCollectionReceipt(QueryCollectionDTO queryCollectionDTO, HttpServletResponse response) { + var exportMap = new ConcurrentHashMap>>(); + var mainData = getCollectionReceiptList(queryCollectionDTO); + if (!mainData.isEmpty()) { + exportMap.put("收款单", ExcelUtils.getSheetData(mainData)); + if (queryCollectionDTO.getIsExportDetail()) { + var subData = new ArrayList(); + for (CollectionVO collectionVO : mainData) { + var detail = getCollectionReceiptDetail(collectionVO.getId()).getData().getTableData(); + if (!detail.isEmpty()) { + detail.forEach(item -> { + var data = CollectionDataExportBO.builder() + .customerName(collectionVO.getCustomerName()) + .receiptNumber(collectionVO.getReceiptNumber()) + .saleReceiptNumber(item.getSaleReceiptNumber()) + .receivableArrears(item.getReceivableArrears()) + .receivedArrears(item.getReceivedArrears()) + .thisCollectionAmount(item.getThisCollectionAmount()) + .remark(item.getRemark()) + .build(); + subData.add(data); + }); + } + } + exportMap.put("收款单明细", ExcelUtils.getSheetData(subData)); + } + ExcelUtils.exportManySheet(response, "收款单", exportMap); + } + } } diff --git a/web/src/api/financial/collection.ts b/web/src/api/financial/collection.ts index 97927452..6c15e4a0 100644 --- a/web/src/api/financial/collection.ts +++ b/web/src/api/financial/collection.ts @@ -15,6 +15,7 @@ enum API { UpdateStatus = '/financial/collection/updateStatusByIds', GetDetail = '/financial/collection/getDetailById', GetArrearsPage = '/sale/arrears/pageList', + Export = '/financial/collection/export', } export function getCollectionPageList(params: QueryCollectionReq) { @@ -75,4 +76,14 @@ export function getArrearsPageList(params: QuerySaleArrearsReq) { params, } ); +} + +export function exportCollection(params: QueryCollectionReq) { + return defHttp.get>( + { + url: `${API.Export}`, + params, + responseType: "blob" + } + ); } \ No newline at end of file From 80cdf9e829e0afe2492ac42be31867a0570c520a Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 17:43:14 +0800 Subject: [PATCH 15/17] fetch: add income export data object --- .../main/java/com/wansenai/vo/financial/IncomeVO.java | 9 +++++++++ web/src/api/financial/income.ts | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/core/domain/src/main/java/com/wansenai/vo/financial/IncomeVO.java b/core/domain/src/main/java/com/wansenai/vo/financial/IncomeVO.java index b838077b..b86215b2 100644 --- a/core/domain/src/main/java/com/wansenai/vo/financial/IncomeVO.java +++ b/core/domain/src/main/java/com/wansenai/vo/financial/IncomeVO.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.wansenai.bo.BigDecimalSerializerBO; +import com.wansenai.utils.excel.ExcelExport; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -33,21 +34,29 @@ public class IncomeVO { private Long id; // supplier or customer or member + @ExcelExport(value = "往来单位/人员") private String name; + @ExcelExport(value = "单据编号") private String receiptNumber; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ExcelExport(value = "单据日期") private LocalDateTime receiptDate; + @ExcelExport(value = "财务人员") private String financialPerson; + @ExcelExport(value = "收入账户") private String incomeAccountName; @JsonSerialize(using = BigDecimalSerializerBO.class) + @ExcelExport(value = "收入金额") private BigDecimal incomeAmount; + @ExcelExport(value = "备注") private String remark; + @ExcelExport(value = "状态", kv = "0-未审核;1-已审核") private Integer status; } diff --git a/web/src/api/financial/income.ts b/web/src/api/financial/income.ts index 46289141..4114bcfc 100644 --- a/web/src/api/financial/income.ts +++ b/web/src/api/financial/income.ts @@ -13,6 +13,7 @@ enum API { DeleteBatch = '/financial/income/deleteByIds', UpdateStatus = '/financial/income/updateStatusByIds', GetDetail = '/financial/income/getDetailById', + Export = '/financial/income/export', } export function getIncomePageList(params: QueryIncomeReq, mode: ErrorMessageMode = 'notice') { @@ -64,4 +65,14 @@ export function getIncomeDetailById(id: number) { url: `${API.GetDetail}/${id}` }, ); +} + +export function exportIncome(params: QueryIncomeReq) { + return defHttp.get>( + { + url: `${API.Export}`, + params, + responseType: "blob" + } + ); } \ No newline at end of file From 4c4ea62754d03a5b1262ae3ded0c315886b42783 Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 17:43:43 +0800 Subject: [PATCH 16/17] fetch: change export function in collection, expense, income views --- web/src/views/financial/collection/index.vue | 67 ++++++++++++++++---- web/src/views/financial/expense/index.vue | 66 +++++++++++++++---- web/src/views/financial/income/index.vue | 65 +++++++++++++++---- 3 files changed, 159 insertions(+), 39 deletions(-) diff --git a/web/src/views/financial/collection/index.vue b/web/src/views/financial/collection/index.vue index 1264bdb1..3a6b0e8a 100644 --- a/web/src/views/financial/collection/index.vue +++ b/web/src/views/financial/collection/index.vue @@ -40,6 +40,14 @@ + +
+

即将导出{{dataSum}}条数据,请耐心等待。

+

如需导出明细数据(可能耗时较长),请勾选下方复选框。

+ 需要导出明细数据 +
+
@@ -52,22 +60,26 @@ import {defineComponent, ref} from "vue"; import {BasicTable, TableAction, useTable} from "@/components/Table"; import {useMessage} from "@/hooks/web/useMessage"; import {columns, searchFormSchema} from "@/views/financial/collection/collection.data"; -import {exportXlsx} from "@/api/basic/common"; import {useI18n} from "vue-i18n"; -import {getCollectionPageList, deleteBatchCollection, updateCollectionStatus} from "@/api/financial/collection"; -import {Tag} from "ant-design-vue"; +import {getCollectionPageList, deleteBatchCollection, updateCollectionStatus, exportCollection} from "@/api/financial/collection"; +import {Checkbox, Modal, Tag} from "ant-design-vue"; import {useModal} from "@/components/Modal"; import ViewCollectionModal from "@/views/financial/collection/components/ViewCollectionModal.vue"; import AddEditCollectionModal from "@/views/financial/collection/components/AddEditCollectionModal.vue"; +import {getTimestamp} from "@/utils/dateUtil"; export default defineComponent({ name: 'CollectionReceipt', - components: {ViewCollectionModal, Tag, TableAction, BasicTable, AddEditCollectionModal}, + components: {'a-modal': Modal, 'a-checkbox': Checkbox, ViewCollectionModal, Tag, TableAction, BasicTable, AddEditCollectionModal}, setup() { const { t } = useI18n(); const { createMessage } = useMessage(); const addEditModalRef = ref(null); + const exportDetailData = ref(false); + const openExportData = ref(false); + const confirmLoading = ref(false); + const dataSum = ref(0); const [receiptViewModal, {openModal: openReceiptViewModal}] = useModal(); - const [registerTable, { reload, getSelectRows }] = useTable({ + const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({ title: '收款单列表', rowKey: 'id', api: getCollectionPageList, @@ -169,14 +181,37 @@ export default defineComponent({ } async function handleExport() { - const file = await exportXlsx("收款单列表") - const blob = new Blob([file]); - const link = document.createElement("a"); - link.href = URL.createObjectURL(blob); - const timestamp = getTimestamp(new Date()); - link.download = "收款单数据" + timestamp + ".xlsx"; - link.target = "_blank"; - link.click(); + dataSum.value = getDataSource().length; + if (dataSum.value === 0) { + createMessage.warn('当前查询条件下无数据可导出'); + return; + } + openExportData.value = true; + } + + const handleExportCancel = () => { + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; + }; + + const handleExportOk = async () => { + confirmLoading.value = true; + const data: any = getForm().getFieldsValue(); + data.isExportDetail = exportDetailData.value; + const file: any = await exportCollection(data) + if (file.size > 0) { + const blob = new Blob([file]); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + const timestamp = getTimestamp(new Date()); + link.download = "收款单数据" + timestamp + ".xlsx"; + link.target = "_blank"; + link.click(); + } + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; } @@ -195,6 +230,12 @@ export default defineComponent({ handleView, handleOk, handleExport, + openExportData, + confirmLoading, + exportDetailData, + dataSum, + handleExportOk, + handleExportCancel } } }) diff --git a/web/src/views/financial/expense/index.vue b/web/src/views/financial/expense/index.vue index 3e9dc4ff..694924a6 100644 --- a/web/src/views/financial/expense/index.vue +++ b/web/src/views/financial/expense/index.vue @@ -40,6 +40,14 @@ + +
+

即将导出{{dataSum}}条数据,请耐心等待。

+

如需导出明细数据(可能耗时较长),请勾选下方复选框。

+ 需要导出明细数据 +
+
@@ -52,22 +60,25 @@ import {defineComponent, ref} from "vue"; import {BasicTable, TableAction, useTable} from "@/components/Table"; import {useMessage} from "@/hooks/web/useMessage"; import {columns, searchFormSchema} from "@/views/financial/expense/expense.data"; -import {exportXlsx} from "@/api/basic/common"; import {useI18n} from "vue-i18n"; -import {getExpensePageList, deleteBatchExpense, updateExpenseStatus} from "@/api/financial/expense"; +import {getExpensePageList, deleteBatchExpense, updateExpenseStatus, exportExpense} from "@/api/financial/expense"; import AddEditExpenseModal from "@/views/financial/expense/components/AddEditExpenseModal.vue" -import {Tag} from "ant-design-vue"; +import {Checkbox, Modal, Tag} from "ant-design-vue"; import {useModal} from "@/components/Modal"; import ViewExpenseModal from "@/views/financial/expense/components/ViewExpenseModal.vue"; export default defineComponent({ name: 'ExpenseReceipt', - components: {ViewExpenseModal, Tag, TableAction, BasicTable, AddEditExpenseModal}, + components: {'a-modal': Modal, 'a-checkbox': Checkbox, ViewExpenseModal, Tag, TableAction, BasicTable, AddEditExpenseModal}, setup() { const { t } = useI18n(); const { createMessage } = useMessage(); const addEditModalRef = ref(null); + const exportDetailData = ref(false); + const openExportData = ref(false); + const confirmLoading = ref(false); + const dataSum = ref(0); const [receiptViewModal, {openModal: openReceiptViewModal}] = useModal(); - const [registerTable, { reload, getSelectRows }] = useTable({ + const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({ title: '支出单列表', rowKey: 'id', api: getExpensePageList, @@ -169,14 +180,37 @@ export default defineComponent({ } async function handleExport() { - const file = await exportXlsx("支出单列表") - const blob = new Blob([file]); - const link = document.createElement("a"); - link.href = URL.createObjectURL(blob); - const timestamp = getTimestamp(new Date()); - link.download = "支出单数据" + timestamp + ".xlsx"; - link.target = "_blank"; - link.click(); + dataSum.value = getDataSource().length; + if (dataSum.value === 0) { + createMessage.warn('当前查询条件下无数据可导出'); + return; + } + openExportData.value = true; + } + + const handleExportCancel = () => { + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; + }; + + const handleExportOk = async () => { + confirmLoading.value = true; + const data: any = getForm().getFieldsValue(); + data.isExportDetail = exportDetailData.value; + const file: any = await exportExpense(data) + if (file.size > 0) { + const blob = new Blob([file]); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + const timestamp = getTimestamp(new Date()); + link.download = "支出单数据" + timestamp + ".xlsx"; + link.target = "_blank"; + link.click(); + } + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; } @@ -195,6 +229,12 @@ export default defineComponent({ handleView, handleOk, handleExport, + openExportData, + confirmLoading, + exportDetailData, + dataSum, + handleExportOk, + handleExportCancel } } }) diff --git a/web/src/views/financial/income/index.vue b/web/src/views/financial/income/index.vue index 0ec031c6..57db71d1 100644 --- a/web/src/views/financial/income/index.vue +++ b/web/src/views/financial/income/index.vue @@ -40,6 +40,14 @@ + +
+

即将导出{{dataSum}}条数据,请耐心等待。

+

如需导出明细数据(可能耗时较长),请勾选下方复选框。

+ 需要导出明细数据 +
+
@@ -52,22 +60,25 @@ import {defineComponent, ref} from "vue"; import {BasicTable, TableAction, useTable} from "@/components/Table"; import {useMessage} from "@/hooks/web/useMessage"; import {columns, searchFormSchema} from "@/views/financial/income/income.data"; -import {exportXlsx} from "@/api/basic/common"; import {useI18n} from "vue-i18n"; -import {getIncomePageList, deleteBatchIncome, updateIncomeStatus} from "@/api/financial/income"; +import {getIncomePageList, deleteBatchIncome, updateIncomeStatus, exportIncome} from "@/api/financial/income"; import AddEditIncomeModal from "@/views/financial/income/components/AddEditIncomeModal.vue" -import {Tag} from "ant-design-vue"; +import {Checkbox, Modal, Tag} from "ant-design-vue"; import {useModal} from "@/components/Modal"; import ViewIncomeModal from "@/views/financial/income/components/ViewIncomeModal.vue"; export default defineComponent({ name: 'IncomeReceipt', - components: {ViewIncomeModal, Tag, TableAction, BasicTable, AddEditIncomeModal}, + components: {'a-modal': Modal, 'a-checkbox': Checkbox, ViewIncomeModal, Tag, TableAction, BasicTable, AddEditIncomeModal}, setup() { const { t } = useI18n(); const { createMessage } = useMessage(); const addEditModalRef = ref(null); + const exportDetailData = ref(false); + const openExportData = ref(false); + const confirmLoading = ref(false); + const dataSum = ref(0); const [receiptViewModal, {openModal: openReceiptViewModal}] = useModal(); - const [registerTable, { reload, getSelectRows }] = useTable({ + const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({ title: '收入单列表', rowKey: 'id', api: getIncomePageList, @@ -169,16 +180,38 @@ export default defineComponent({ } async function handleExport() { - const file = await exportXlsx("收入单列表") - const blob = new Blob([file]); - const link = document.createElement("a"); - link.href = URL.createObjectURL(blob); - const timestamp = getTimestamp(new Date()); - link.download = "收入单数据" + timestamp + ".xlsx"; - link.target = "_blank"; - link.click(); + dataSum.value = getDataSource().length; + if (dataSum.value === 0) { + createMessage.warn('当前查询条件下无数据可导出'); + return; + } + openExportData.value = true; } + const handleExportCancel = () => { + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; + }; + + const handleExportOk = async () => { + confirmLoading.value = true; + const data: any = getForm().getFieldsValue(); + data.isExportDetail = exportDetailData.value; + const file: any = await exportIncome(data) + if (file.size > 0) { + const blob = new Blob([file]); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + const timestamp = getTimestamp(new Date()); + link.download = "收入单数据" + timestamp + ".xlsx"; + link.target = "_blank"; + link.click(); + } + confirmLoading.value = false; + openExportData.value = false; + exportDetailData.value = false; + } return { t, @@ -195,6 +228,12 @@ export default defineComponent({ handleView, handleOk, handleExport, + openExportData, + confirmLoading, + exportDetailData, + dataSum, + handleExportOk, + handleExportCancel } } }) From 4855899da713bf98a995e670dfd2443cc1a48751 Mon Sep 17 00:00:00 2001 From: jameszow Date: Sun, 3 Dec 2023 17:44:09 +0800 Subject: [PATCH 17/17] fix: fix payments columns title customer -> supplier --- web/src/views/financial/payment/payment.data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/views/financial/payment/payment.data.ts b/web/src/views/financial/payment/payment.data.ts index 52178612..d932d73d 100644 --- a/web/src/views/financial/payment/payment.data.ts +++ b/web/src/views/financial/payment/payment.data.ts @@ -6,7 +6,7 @@ import {getOperatorList} from "@/api/basic/operator"; export const columns: BasicColumn[] = [ { - title: '客户', + title: '供应商', dataIndex: 'supplierName', width: 120, },