From 3ec3a07cd315636f1bc2ccf75e6ec6cfcf368c0b Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Sun, 22 Mar 2026 22:09:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/apps/Service/erpFlowService.java | 162 ++++++++++++ .../modules/erp/entity/ErpBudgets.java | 15 +- .../modules/erp/entity/ErpDebtRecords.java | 32 ++- .../jeesite/modules/erp/entity/ErpDebts.java | 2 + .../modules/erp/entity/ErpExpense.java | 4 + .../jeesite/modules/erp/entity/ErpIncome.java | 4 + .../erp/entity/ErpTransactionFlow.java | 4 + .../erp/web/ErpAccountTransferController.java | 232 ++++++++++-------- .../erp/web/ErpDebtRecordsController.java | 22 +- .../modules/erp/web/ErpExpenseController.java | 232 ++++++++++-------- .../modules/erp/web/ErpIncomeController.java | 227 +++++++++-------- .../modules/utils/BigDecimalUtils.java | 54 ++++ .../com/jeesite/modules/utils/DateUtils.java | 20 +- .../src/selectType/erpDebtSelect.ts} | 48 ++-- .../packages/erp/api/erp/accountTransfer.ts | 4 + web-vue/packages/erp/api/erp/debtRecords.ts | 5 + web-vue/packages/erp/api/erp/debts.ts | 3 +- web-vue/packages/erp/api/erp/expense.ts | 4 + web-vue/packages/erp/api/erp/income.ts | 4 + .../packages/erp/views/erp/account/list.vue | 1 + .../erp/views/erp/accountTransfer/list.vue | 22 +- .../packages/erp/views/erp/budgets/form.vue | 149 ----------- .../packages/erp/views/erp/budgets/list.vue | 82 +++---- .../packages/erp/views/erp/category/list.vue | 1 + .../erp/views/erp/debtRecords/form.vue | 75 +++--- .../erp/views/erp/debtRecords/list.vue | 103 ++++++-- web-vue/packages/erp/views/erp/debts/form.vue | 70 +++--- web-vue/packages/erp/views/erp/debts/list.vue | 46 ++-- .../packages/erp/views/erp/expense/form.vue | 6 + .../packages/erp/views/erp/expense/list.vue | 40 ++- .../packages/erp/views/erp/income/form.vue | 6 + .../packages/erp/views/erp/income/list.vue | 39 ++- .../erp/views/erp/transactionFlow/list.vue | 16 ++ 33 files changed, 1087 insertions(+), 647 deletions(-) create mode 100644 web-api/src/main/java/com/jeesite/modules/apps/Service/erpFlowService.java create mode 100644 web-api/src/main/java/com/jeesite/modules/utils/BigDecimalUtils.java rename web-vue/packages/{erp/views/erp/debts/select.ts => core/components/ListSelect/src/selectType/erpDebtSelect.ts} (74%) delete mode 100644 web-vue/packages/erp/views/erp/budgets/form.vue diff --git a/web-api/src/main/java/com/jeesite/modules/apps/Service/erpFlowService.java b/web-api/src/main/java/com/jeesite/modules/apps/Service/erpFlowService.java new file mode 100644 index 0000000..bfe4395 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/apps/Service/erpFlowService.java @@ -0,0 +1,162 @@ +package com.jeesite.modules.apps.Service; + +import com.jeesite.modules.erp.entity.*; +import com.jeesite.modules.erp.service.ErpAccountService; +import com.jeesite.modules.erp.service.ErpCategoryService; +import com.jeesite.modules.erp.service.ErpDebtsService; +import com.jeesite.modules.erp.service.ErpTransactionFlowService; +import com.jeesite.modules.utils.BigDecimalUtils; +import com.jeesite.modules.utils.DateUtils; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Date; + +@Service +public class erpFlowService { + + + @Resource + private ErpDebtsService erpDebtsService; + + @Resource + private ErpAccountService erpAccountService; + + @Resource + private ErpCategoryService erpCategoryService; + + @Resource + private ErpTransactionFlowService erpTransactionFlowService; + + + /** + * 支出新增 + */ + public void addExpense(ErpExpense erpExpense) { + ErpAccount account = erpAccountService.get(erpExpense.getAccountId()); + ErpCategory category = erpCategoryService.get(erpExpense.getCategoryId()); + account.setUpdateTime(new Date()); + account.setCurrentBalance(BigDecimalUtils.subtract(account.getCurrentBalance(), erpExpense.getAmount())); + erpAccountService.save(account); + addFlow( + erpExpense.getExpenseName(), // 交易名称 + category.getCategoryType(), // 交易类型 + erpExpense.getAmount(), // 交易金额 + erpExpense.getAccountId(), // 账户ID + erpExpense.getCategoryId(), // 分类ID + erpExpense.getRemark(), // 备注 + erpExpense.getExpenseId(), // 业务ID + DateUtils.getCurrentYear(), // 年份 + DateUtils.getCurrentMonth() // 月份 + ); + } + + + /** + * 收入新增 + */ + public void addIncome(ErpIncome erpIncome) { + ErpAccount account = erpAccountService.get(erpIncome.getAccountId()); + ErpCategory category = erpCategoryService.get(erpIncome.getCategoryId()); + account.setUpdateTime(new Date()); + account.setCurrentBalance(BigDecimalUtils.add(account.getCurrentBalance(), erpIncome.getAmount())); + erpAccountService.save(account); + addFlow( + erpIncome.getIncomeName(), // 流水名称 + category.getCategoryType(), // 流水类型 + erpIncome.getAmount(), // 金额 + erpIncome.getAccountId(), // 账户ID + erpIncome.getCategoryId(), // 分类ID + erpIncome.getRemark(), // 备注 + erpIncome.getIncomeId(), // 业务ID + com.jeesite.modules.utils.DateUtils.getCurrentYear(), // 年 + com.jeesite.modules.utils.DateUtils.getCurrentMonth() // 月 + ); + } + + /** + * 还款支出 + */ + public void addDebt(ErpDebtRecords erpDebtRecords) { + ErpDebts debts = erpDebtsService.get(erpDebtRecords.getDebtId()); + ErpAccount account = erpAccountService.get(erpDebtRecords.getAccountId()); + ErpCategory category = erpCategoryService.get(erpDebtRecords.getCategoryId()); + debts.setRemaining(BigDecimalUtils.add(debts.getRemaining(),erpDebtRecords.getRepayAmount())); + erpDebtsService.save(debts); + + account.setUpdateTime(new Date()); + account.setCurrentBalance(BigDecimalUtils.subtract(account.getCurrentBalance(), erpDebtRecords.getRepayAmount())); + erpAccountService.save(account); + addFlow( + erpDebtRecords.getDebtName(), // 交易名称 + category.getCategoryType(), // 交易类型 + erpDebtRecords.getRepayAmount(), // 交易金额 + erpDebtRecords.getAccountId(), // 账户ID + erpDebtRecords.getCategoryId(), // 分类ID + erpDebtRecords.getRemark(), // 备注 + erpDebtRecords.getDebtId(), // 业务ID + DateUtils.getCurrentYear(), // 年份 + DateUtils.getCurrentMonth() // 月份 + ); + } + + /** + * 账户转账 + */ + public void accountTran(ErpAccountTransfer erpAccountTransfer) { + // 转入 + ErpAccount inAccount = erpAccountService.get(erpAccountTransfer.getInAccountId()); + inAccount.setCurrentBalance(BigDecimalUtils.add(inAccount.getCurrentBalance(), erpAccountTransfer.getTransferAmount())); + erpAccountService.save(inAccount); + //转出 + ErpAccount outAccount = erpAccountService.get(erpAccountTransfer.getOutAccountId()); + outAccount.setCurrentBalance(BigDecimalUtils.subtract(outAccount.getCurrentBalance(), erpAccountTransfer.getTransferAmount())); + erpAccountService.save(outAccount); + //分类 + ErpCategory category = erpCategoryService.get(erpAccountTransfer.getCategoryId()); + addFlow( + erpAccountTransfer.getTransferName(), + category.getCategoryType(), + erpAccountTransfer.getTransferAmount(), + erpAccountTransfer.getInAccountId(), + erpAccountTransfer.getCategoryId(), + erpAccountTransfer.getRemark(), + erpAccountTransfer.getTransferId(), + DateUtils.getCurrentYear(), + DateUtils.getCurrentMonth() + ); + + addFlow( + erpAccountTransfer.getTransferName(), + category.getCategoryType(), + erpAccountTransfer.getTransferAmount(), + erpAccountTransfer.getOutAccountId(), + erpAccountTransfer.getCategoryId(), + erpAccountTransfer.getRemark(), + erpAccountTransfer.getTransferId(), + DateUtils.getCurrentYear(), + DateUtils.getCurrentMonth() + ); + } + + /** + * 流水新增 + */ + public void addFlow(String flowName, String flowType, BigDecimal amount, + String accountId, String categoryId, String remark, String businessId, String yearDate, String monthDate) { + ErpTransactionFlow flow = new ErpTransactionFlow(); + flow.setFlowName(flowName); // 交易名称 + flow.setFlowType(flowType); // 交易类型 + flow.setAmount(amount); // 交易金额 + flow.setTradeTime(new Date()); // 交易时间 + flow.setAccountId(accountId); // 交易账户 + flow.setCategoryId(categoryId); // 交易分类 + flow.setRemark(remark); // 交易备注 + flow.setUpdateTime(new Date()); // 更新时间 + flow.setBusinessId(businessId); // 业务标识 + flow.setYearDate(yearDate); // 年份 + flow.setMonthDate(monthDate); // 月份 + erpTransactionFlowService.save(flow); + } +} diff --git a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpBudgets.java b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpBudgets.java index 84d87eb..9e6094e 100644 --- a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpBudgets.java +++ b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpBudgets.java @@ -38,6 +38,13 @@ import java.io.Serial; @Column(name = "used_ratio", attrName = "usedRatio", label = "预算占比", isQuery = false), @Column(name = "over_amount", attrName = "overAmount", label = "超支金额", isQuery = false), @Column(name = "update_time", attrName = "updateTime", label = "更新时间", isQuery = false, isUpdateForce = true), +}, joinTable = { + @JoinTable(type = Type.LEFT_JOIN, entity = ErpCategory.class, alias = "b", + on = "a.category_id = b.category_id", attrName = "this", + columns = { + @Column(name = "parent_name", attrName = "parentName", label = "父级名称"), + @Column(name = "category_name", attrName = "categoryName", label = "分类名称"), + }), }, orderBy = "a.budget_id DESC" ) @Data @@ -55,10 +62,16 @@ public class ErpBudgets extends DataEntity implements Serializable { private Double overAmount; // 超支金额 private Date updateTime; // 更新时间 + private String parentName; + + private String categoryName; + + @ExcelFields({ @ExcelField(title = "记录时间", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), @ExcelField(title = "唯一主键", attrName = "budgetId", align = Align.CENTER, sort = 20), - @ExcelField(title = "分类标识", attrName = "categoryId", align = Align.CENTER, sort = 30), + @ExcelField(title = "父级分类", attrName = "parentName", align = Align.CENTER, sort = 30), + @ExcelField(title = "分类名称", attrName = "categoryName", align = Align.CENTER, sort = 35), @ExcelField(title = "预算年月", attrName = "budgetMonth", align = Align.CENTER, sort = 40), @ExcelField(title = "预算金额", attrName = "budgetAmount", align = Align.CENTER, sort = 50), @ExcelField(title = "使用金额", attrName = "usedAmount", align = Align.CENTER, sort = 60), diff --git a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpDebtRecords.java b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpDebtRecords.java index 0250ff2..110da91 100644 --- a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpDebtRecords.java +++ b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpDebtRecords.java @@ -37,7 +37,26 @@ import java.io.Serial; @Column(name = "account_id", attrName = "accountId", label = "账户标识"), @Column(name = "repay_amount", attrName = "repayAmount", label = "还款金额", isQuery = false), @Column(name = "repay_time", attrName = "repayTime", label = "还款时间", isQuery = false, isUpdateForce = true), + @Column(name = "category_id", attrName = "categoryId", label = "分类标识"), @Column(name = "remark", attrName = "remark", label = "备注说明", queryType = QueryType.LIKE), + @Column(name = "is_recorded", attrName = "isRecorded", label = "是否记账"), +}, joinTable = { + @JoinTable(type = Type.LEFT_JOIN, entity = ErpAccount.class, alias = "b", + on = "a.account_id = b.account_id", attrName = "this", + columns = { + @Column(name = "account_name", attrName = "accountName", label = "账户名称"), + }), + @JoinTable(type = Type.LEFT_JOIN, entity = ErpDebts.class, alias = "c", + on = "a.debt_id = c.debt_id", attrName = "this", + columns = { + @Column(name = "debt_name", attrName = "debtName", label = "对方名称"), + }), + @JoinTable(type = Type.LEFT_JOIN, entity = ErpCategory.class, alias = "d", + on = "a.category_id = d.category_id", attrName = "this", + columns = { + @Column(name = "parent_name", attrName = "parentName", label = "父级名称"), + @Column(name = "category_name", attrName = "categoryName", label = "分类名称"), + }), }, orderBy = "a.record_id DESC" ) @Data @@ -51,13 +70,22 @@ public class ErpDebtRecords extends DataEntity implements Serial private String accountId; // 账户标识 private BigDecimal repayAmount; // 还款金额 private Date repayTime; // 还款时间 + private String categoryId; private String remark; // 备注说明 + private String isRecorded; + + private String accountName; + private String debtName; + + private String parentName; + + private String categoryName; @ExcelFields({ @ExcelField(title = "记录时间", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), @ExcelField(title = "唯一标识", attrName = "recordId", align = Align.CENTER, sort = 20), - @ExcelField(title = "负债标识", attrName = "debtId", align = Align.CENTER, sort = 30), - @ExcelField(title = "账户标识", attrName = "accountId", align = Align.CENTER, sort = 40), + @ExcelField(title = "负债名称", attrName = "debtName", align = Align.CENTER, sort = 30), + @ExcelField(title = "账户名称", attrName = "accountName", align = Align.CENTER, sort = 40), @ExcelField(title = "还款金额", attrName = "repayAmount", align = Align.CENTER, sort = 50), @ExcelField(title = "还款时间", attrName = "repayTime", align = Align.CENTER, sort = 60, dataFormat = "yyyy-MM-dd hh:mm"), @ExcelField(title = "备注说明", attrName = "remark", align = Align.CENTER, sort = 70), diff --git a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpDebts.java b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpDebts.java index 00ef3d1..1370cdc 100644 --- a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpDebts.java +++ b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpDebts.java @@ -39,6 +39,7 @@ import java.io.Serial; @Column(name = "remaining", attrName = "remaining", label = "未还金额", isQuery = false, isUpdateForce = true), @Column(name = "end_time", attrName = "endTime", label = "结清时间", isQuery = false, isUpdateForce = true), @Column(name = "ustatus", attrName = "ustatus", label = "状态"), + @Column(name = "remark", attrName = "remark", label = "交易备注", isQuery = false), }, orderBy = "a.create_time DESC" ) @Data @@ -54,6 +55,7 @@ public class ErpDebts extends DataEntity implements Serializable { private BigDecimal remaining; // 未还金额 private Date endTime; // 结清时间 private String ustatus; // 状态 + private String remark; @ExcelFields({ @ExcelField(title = "记录时间", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), diff --git a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpExpense.java b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpExpense.java index 19ea5b1..86ea523 100644 --- a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpExpense.java +++ b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpExpense.java @@ -34,6 +34,8 @@ import java.io.Serial; @Column(name = "category_id", attrName = "categoryId", label = "支出分类"), @Column(name = "amount", attrName = "amount", label = "交易金额", isQuery = false), @Column(name = "update_time", attrName = "updateTime", label = "更新时间", isQuery = false, isUpdateForce = true), + @Column(name = "is_recorded", attrName = "isRecorded", label = "是否记账"), + @Column(name = "remark", attrName = "remark", label = "交易备注", isQuery = false), }, joinTable = { @JoinTable(type = Type.LEFT_JOIN, entity = ErpAccount.class, alias = "b", on = "a.account_id = b.account_id", attrName = "this", @@ -60,6 +62,8 @@ public class ErpExpense extends DataEntity implements Serializable { private String categoryId; // 支出分类 private BigDecimal amount; // 交易金额 private Date updateTime; // 更新时间 + private String isRecorded; + private String remark; private String accountName; diff --git a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpIncome.java b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpIncome.java index 1434bae..f89de25 100644 --- a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpIncome.java +++ b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpIncome.java @@ -39,6 +39,8 @@ import java.io.Serial; @Column(name = "category_id", attrName = "categoryId", label = "收入分类"), @Column(name = "amount", attrName = "amount", label = "交易金额", isQuery = false), @Column(name = "update_time", attrName = "updateTime", label = "更新时间", isQuery = false, isUpdateForce = true), + @Column(name = "is_recorded", attrName = "isRecorded", label = "是否记账"), + @Column(name = "remark", attrName = "remark", label = "交易备注", isQuery = false), }, joinTable = { @JoinTable(type = Type.LEFT_JOIN, entity = ErpAccount.class, alias = "b", on = "a.account_id = b.account_id", attrName = "this", @@ -65,6 +67,8 @@ public class ErpIncome extends DataEntity implements Serializable { private String categoryId; // 收入分类 private BigDecimal amount; // 交易金额 private Date updateTime; // 更新时间 + private String isRecorded; + private String remark; private String accountName; diff --git a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpTransactionFlow.java b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpTransactionFlow.java index 2602cee..48015a8 100644 --- a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpTransactionFlow.java +++ b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpTransactionFlow.java @@ -42,6 +42,8 @@ import java.io.Serial; @Column(name = "remark", attrName = "remark", label = "交易备注", isQuery = false), @Column(name = "update_time", attrName = "updateTime", label = "更新时间", isQuery = false, isUpdateForce = true), @Column(name = "business_id", attrName = "businessId", label = "业务标识"), + @Column(name = "year_date", attrName = "yearDate", label = "业务标识"), + @Column(name = "month_date", attrName = "monthDate", label = "业务标识"), }, joinTable = { @JoinTable(type = Type.LEFT_JOIN, entity = ErpAccount.class, alias = "b", on = "a.account_id = b.account_id", attrName = "this", @@ -72,6 +74,8 @@ public class ErpTransactionFlow extends DataEntity implement private String remark; // 交易备注 private Date updateTime; // 更新时间 private String businessId; // 业务标识 + private String yearDate; + private String monthDate; private String accountName; diff --git a/web-api/src/main/java/com/jeesite/modules/erp/web/ErpAccountTransferController.java b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpAccountTransferController.java index f069c4d..ac73dbc 100644 --- a/web-api/src/main/java/com/jeesite/modules/erp/web/ErpAccountTransferController.java +++ b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpAccountTransferController.java @@ -1,6 +1,11 @@ package com.jeesite.modules.erp.web; + import java.util.List; + +import com.jeesite.modules.apps.Service.erpFlowService; +import com.jeesite.modules.erp.entity.*; +import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -21,11 +26,11 @@ import com.jeesite.common.utils.excel.ExcelExport; import com.jeesite.common.utils.excel.annotation.ExcelField.Type; import org.springframework.web.multipart.MultipartFile; import com.jeesite.common.web.BaseController; -import com.jeesite.modules.erp.entity.ErpAccountTransfer; import com.jeesite.modules.erp.service.ErpAccountTransferService; /** * 转账明细表 Controller + * * @author gaoxq * @version 2026-03-22 */ @@ -33,114 +38,131 @@ import com.jeesite.modules.erp.service.ErpAccountTransferService; @RequestMapping(value = "${adminPath}/erp/accountTransfer") public class ErpAccountTransferController extends BaseController { - private final ErpAccountTransferService erpAccountTransferService; + @Resource + private erpFlowService flowService; - public ErpAccountTransferController(ErpAccountTransferService erpAccountTransferService) { - this.erpAccountTransferService = erpAccountTransferService; - } - - /** - * 获取数据 - */ - @ModelAttribute - public ErpAccountTransfer get(String transferId, boolean isNewRecord) { - return erpAccountTransferService.get(transferId, isNewRecord); - } - - /** - * 查询列表 - */ - @RequiresPermissions("erp:accountTransfer:view") - @RequestMapping(value = {"list", ""}) - public String list(ErpAccountTransfer erpAccountTransfer, Model model) { - model.addAttribute("erpAccountTransfer", erpAccountTransfer); - return "modules/erp/erpAccountTransferList"; - } - - /** - * 查询列表数据 - */ - @RequiresPermissions("erp:accountTransfer:view") - @RequestMapping(value = "listData") - @ResponseBody - public Page listData(ErpAccountTransfer erpAccountTransfer, HttpServletRequest request, HttpServletResponse response) { - erpAccountTransfer.setPage(new Page<>(request, response)); - Page page = erpAccountTransferService.findPage(erpAccountTransfer); - return page; - } + private final ErpAccountTransferService erpAccountTransferService; - /** - * 查看编辑表单 - */ - @RequiresPermissions("erp:accountTransfer:view") - @RequestMapping(value = "form") - public String form(ErpAccountTransfer erpAccountTransfer, Model model) { - model.addAttribute("erpAccountTransfer", erpAccountTransfer); - return "modules/erp/erpAccountTransferForm"; - } + public ErpAccountTransferController(ErpAccountTransferService erpAccountTransferService) { + this.erpAccountTransferService = erpAccountTransferService; + } - /** - * 保存数据 - */ - @RequiresPermissions("erp:accountTransfer:edit") - @PostMapping(value = "save") - @ResponseBody - public String save(@Validated ErpAccountTransfer erpAccountTransfer) { - erpAccountTransferService.save(erpAccountTransfer); - return renderResult(Global.TRUE, text("保存转账成功!")); - } + /** + * 获取数据 + */ + @ModelAttribute + public ErpAccountTransfer get(String transferId, boolean isNewRecord) { + return erpAccountTransferService.get(transferId, isNewRecord); + } - /** - * 导出数据 - */ - @RequiresPermissions("erp:accountTransfer:view") - @RequestMapping(value = "exportData") - public void exportData(ErpAccountTransfer erpAccountTransfer, HttpServletResponse response) { - List list = erpAccountTransferService.findList(erpAccountTransfer); - String fileName = "转账" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; - try(ExcelExport ee = new ExcelExport("转账", ErpAccountTransfer.class)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 查询列表 + */ + @RequiresPermissions("erp:accountTransfer:view") + @RequestMapping(value = {"list", ""}) + public String list(ErpAccountTransfer erpAccountTransfer, Model model) { + model.addAttribute("erpAccountTransfer", erpAccountTransfer); + return "modules/erp/erpAccountTransferList"; + } - /** - * 下载模板 - */ - @RequiresPermissions("erp:accountTransfer:view") - @RequestMapping(value = "importTemplate") - public void importTemplate(HttpServletResponse response) { - ErpAccountTransfer erpAccountTransfer = new ErpAccountTransfer(); - List list = ListUtils.newArrayList(erpAccountTransfer); - String fileName = "转账模板.xlsx"; - try(ExcelExport ee = new ExcelExport("转账", ErpAccountTransfer.class, Type.IMPORT)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 查询列表数据 + */ + @RequiresPermissions("erp:accountTransfer:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(ErpAccountTransfer erpAccountTransfer, HttpServletRequest request, HttpServletResponse response) { + erpAccountTransfer.setPage(new Page<>(request, response)); + Page page = erpAccountTransferService.findPage(erpAccountTransfer); + return page; + } + + /** + * 查看编辑表单 + */ + @RequiresPermissions("erp:accountTransfer:view") + @RequestMapping(value = "form") + public String form(ErpAccountTransfer erpAccountTransfer, Model model) { + model.addAttribute("erpAccountTransfer", erpAccountTransfer); + return "modules/erp/erpAccountTransferForm"; + } + + /** + * 保存数据 + */ + @RequiresPermissions("erp:accountTransfer:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated ErpAccountTransfer erpAccountTransfer) { + erpAccountTransferService.save(erpAccountTransfer); + return renderResult(Global.TRUE, text("保存转账成功!")); + } + + /** + * 导出数据 + */ + @RequiresPermissions("erp:accountTransfer:view") + @RequestMapping(value = "exportData") + public void exportData(ErpAccountTransfer erpAccountTransfer, HttpServletResponse response) { + List list = erpAccountTransferService.findList(erpAccountTransfer); + String fileName = "转账" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try (ExcelExport ee = new ExcelExport("转账", ErpAccountTransfer.class)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 下载模板 + */ + @RequiresPermissions("erp:accountTransfer:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + ErpAccountTransfer erpAccountTransfer = new ErpAccountTransfer(); + List list = ListUtils.newArrayList(erpAccountTransfer); + String fileName = "转账模板.xlsx"; + try (ExcelExport ee = new ExcelExport("转账", ErpAccountTransfer.class, Type.IMPORT)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 导入数据 + */ + @ResponseBody + @RequiresPermissions("erp:accountTransfer:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file) { + try { + String message = erpAccountTransferService.importData(file); + return renderResult(Global.TRUE, "posfull:" + message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:" + ex.getMessage()); + } + } + + /** + * 删除数据 + */ + @RequiresPermissions("erp:accountTransfer:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(ErpAccountTransfer erpAccountTransfer) { + erpAccountTransferService.delete(erpAccountTransfer); + return renderResult(Global.TRUE, text("删除转账成功!")); + } + + + /** + * 记账数据 + */ + @RequestMapping(value = "recorded") + @ResponseBody + public String recorded(ErpAccountTransfer erpAccountTransfer) { + ErpAccountTransfer accountTransfer = erpAccountTransferService.get(erpAccountTransfer); + accountTransfer.setTransferStatus("1"); + erpAccountTransferService.save(accountTransfer); + flowService.accountTran(accountTransfer); + return renderResult(Global.TRUE, text("记账转账成功!")); + } - /** - * 导入数据 - */ - @ResponseBody - @RequiresPermissions("erp:accountTransfer:edit") - @PostMapping(value = "importData") - public String importData(MultipartFile file) { - try { - String message = erpAccountTransferService.importData(file); - return renderResult(Global.TRUE, "posfull:"+message); - } catch (Exception ex) { - return renderResult(Global.FALSE, "posfull:"+ex.getMessage()); - } - } - - /** - * 删除数据 - */ - @RequiresPermissions("erp:accountTransfer:edit") - @RequestMapping(value = "delete") - @ResponseBody - public String delete(ErpAccountTransfer erpAccountTransfer) { - erpAccountTransferService.delete(erpAccountTransfer); - return renderResult(Global.TRUE, text("删除转账成功!")); - } - } \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/web/ErpDebtRecordsController.java b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpDebtRecordsController.java index 6cfd348..c00eefd 100644 --- a/web-api/src/main/java/com/jeesite/modules/erp/web/ErpDebtRecordsController.java +++ b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpDebtRecordsController.java @@ -1,6 +1,10 @@ package com.jeesite.modules.erp.web; import java.util.List; + +import com.jeesite.modules.apps.Service.erpFlowService; +import com.jeesite.modules.erp.entity.ErpExpense; +import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -33,6 +37,9 @@ import com.jeesite.modules.erp.service.ErpDebtRecordsService; @RequestMapping(value = "${adminPath}/erp/debtRecords") public class ErpDebtRecordsController extends BaseController { + @Resource + private erpFlowService flowService; + private final ErpDebtRecordsService erpDebtRecordsService; public ErpDebtRecordsController(ErpDebtRecordsService erpDebtRecordsService) { @@ -142,5 +149,18 @@ public class ErpDebtRecordsController extends BaseController { erpDebtRecordsService.delete(erpDebtRecords); return renderResult(Global.TRUE, text("删除借贷明细成功!")); } - + + + /** + * 记账数据 + */ + @RequestMapping(value = "recorded") + @ResponseBody + public String recorded(ErpDebtRecords erpDebtRecords) { + ErpDebtRecords debtRecords = erpDebtRecordsService.get(erpDebtRecords); + debtRecords.setIsRecorded("1"); + erpDebtRecordsService.save(debtRecords); + flowService.addDebt(debtRecords); + return renderResult(Global.TRUE, text("记账支出成功!")); + } } \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/web/ErpExpenseController.java b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpExpenseController.java index 25e8733..cca13e5 100644 --- a/web-api/src/main/java/com/jeesite/modules/erp/web/ErpExpenseController.java +++ b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpExpenseController.java @@ -1,6 +1,11 @@ package com.jeesite.modules.erp.web; import java.util.List; + + +import com.jeesite.modules.apps.Service.erpFlowService; +import com.jeesite.modules.erp.entity.*; +import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -15,17 +20,17 @@ import org.springframework.web.bind.annotation.ResponseBody; import com.jeesite.common.config.Global; import com.jeesite.common.collect.ListUtils; -import com.jeesite.common.entity.Page; import com.jeesite.common.lang.DateUtils; +import com.jeesite.common.entity.Page; import com.jeesite.common.utils.excel.ExcelExport; import com.jeesite.common.utils.excel.annotation.ExcelField.Type; import org.springframework.web.multipart.MultipartFile; import com.jeesite.common.web.BaseController; -import com.jeesite.modules.erp.entity.ErpExpense; import com.jeesite.modules.erp.service.ErpExpenseService; /** * 支出明细表 Controller + * * @author gaoxq * @version 2026-03-22 */ @@ -33,114 +38,129 @@ import com.jeesite.modules.erp.service.ErpExpenseService; @RequestMapping(value = "${adminPath}/erp/expense") public class ErpExpenseController extends BaseController { - private final ErpExpenseService erpExpenseService; + @Resource + private erpFlowService flowService; - public ErpExpenseController(ErpExpenseService erpExpenseService) { - this.erpExpenseService = erpExpenseService; - } - - /** - * 获取数据 - */ - @ModelAttribute - public ErpExpense get(String expenseId, boolean isNewRecord) { - return erpExpenseService.get(expenseId, isNewRecord); - } - - /** - * 查询列表 - */ - @RequiresPermissions("erp:expense:view") - @RequestMapping(value = {"list", ""}) - public String list(ErpExpense erpExpense, Model model) { - model.addAttribute("erpExpense", erpExpense); - return "modules/erp/erpExpenseList"; - } - - /** - * 查询列表数据 - */ - @RequiresPermissions("erp:expense:view") - @RequestMapping(value = "listData") - @ResponseBody - public Page listData(ErpExpense erpExpense, HttpServletRequest request, HttpServletResponse response) { - erpExpense.setPage(new Page<>(request, response)); - Page page = erpExpenseService.findPage(erpExpense); - return page; - } + private final ErpExpenseService erpExpenseService; - /** - * 查看编辑表单 - */ - @RequiresPermissions("erp:expense:view") - @RequestMapping(value = "form") - public String form(ErpExpense erpExpense, Model model) { - model.addAttribute("erpExpense", erpExpense); - return "modules/erp/erpExpenseForm"; - } + public ErpExpenseController(ErpExpenseService erpExpenseService) { + this.erpExpenseService = erpExpenseService; + } - /** - * 保存数据 - */ - @RequiresPermissions("erp:expense:edit") - @PostMapping(value = "save") - @ResponseBody - public String save(@Validated ErpExpense erpExpense) { - erpExpenseService.save(erpExpense); - return renderResult(Global.TRUE, text("保存支出成功!")); - } + /** + * 获取数据 + */ + @ModelAttribute + public ErpExpense get(String expenseId, boolean isNewRecord) { + return erpExpenseService.get(expenseId, isNewRecord); + } - /** - * 导出数据 - */ - @RequiresPermissions("erp:expense:view") - @RequestMapping(value = "exportData") - public void exportData(ErpExpense erpExpense, HttpServletResponse response) { - List list = erpExpenseService.findList(erpExpense); - String fileName = "支出" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; - try(ExcelExport ee = new ExcelExport("支出", ErpExpense.class)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 查询列表 + */ + @RequiresPermissions("erp:expense:view") + @RequestMapping(value = {"list", ""}) + public String list(ErpExpense erpExpense, Model model) { + model.addAttribute("erpExpense", erpExpense); + return "modules/erp/erpExpenseList"; + } - /** - * 下载模板 - */ - @RequiresPermissions("erp:expense:view") - @RequestMapping(value = "importTemplate") - public void importTemplate(HttpServletResponse response) { - ErpExpense erpExpense = new ErpExpense(); - List list = ListUtils.newArrayList(erpExpense); - String fileName = "支出模板.xlsx"; - try(ExcelExport ee = new ExcelExport("支出", ErpExpense.class, Type.IMPORT)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 查询列表数据 + */ + @RequiresPermissions("erp:expense:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(ErpExpense erpExpense, HttpServletRequest request, HttpServletResponse response) { + erpExpense.setPage(new Page<>(request, response)); + Page page = erpExpenseService.findPage(erpExpense); + return page; + } - /** - * 导入数据 - */ - @ResponseBody - @RequiresPermissions("erp:expense:edit") - @PostMapping(value = "importData") - public String importData(MultipartFile file) { - try { - String message = erpExpenseService.importData(file); - return renderResult(Global.TRUE, "posfull:"+message); - } catch (Exception ex) { - return renderResult(Global.FALSE, "posfull:"+ex.getMessage()); - } - } - - /** - * 删除数据 - */ - @RequiresPermissions("erp:expense:edit") - @RequestMapping(value = "delete") - @ResponseBody - public String delete(ErpExpense erpExpense) { - erpExpenseService.delete(erpExpense); - return renderResult(Global.TRUE, text("删除支出成功!")); - } - + /** + * 查看编辑表单 + */ + @RequiresPermissions("erp:expense:view") + @RequestMapping(value = "form") + public String form(ErpExpense erpExpense, Model model) { + model.addAttribute("erpExpense", erpExpense); + return "modules/erp/erpExpenseForm"; + } + + /** + * 保存数据 + */ + @RequiresPermissions("erp:expense:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated ErpExpense erpExpense) { + erpExpenseService.save(erpExpense); + return renderResult(Global.TRUE, text("保存支出成功!")); + } + + /** + * 导出数据 + */ + @RequiresPermissions("erp:expense:view") + @RequestMapping(value = "exportData") + public void exportData(ErpExpense erpExpense, HttpServletResponse response) { + List list = erpExpenseService.findList(erpExpense); + String fileName = "支出" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try (ExcelExport ee = new ExcelExport("支出", ErpExpense.class)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 下载模板 + */ + @RequiresPermissions("erp:expense:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + ErpExpense erpExpense = new ErpExpense(); + List list = ListUtils.newArrayList(erpExpense); + String fileName = "支出模板.xlsx"; + try (ExcelExport ee = new ExcelExport("支出", ErpExpense.class, Type.IMPORT)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 导入数据 + */ + @ResponseBody + @RequiresPermissions("erp:expense:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file) { + try { + String message = erpExpenseService.importData(file); + return renderResult(Global.TRUE, "posfull:" + message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:" + ex.getMessage()); + } + } + + /** + * 删除数据 + */ + @RequiresPermissions("erp:expense:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(ErpExpense erpExpense) { + erpExpenseService.delete(erpExpense); + return renderResult(Global.TRUE, text("删除支出成功!")); + } + + /** + * 记账数据 + */ + @RequestMapping(value = "recorded") + @ResponseBody + public String recorded(ErpExpense erpExpense) { + ErpExpense expense = erpExpenseService.get(erpExpense); + expense.setIsRecorded("1"); + erpExpenseService.save(expense); + flowService.addExpense(expense); + return renderResult(Global.TRUE, text("记账支出成功!")); + } } \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/web/ErpIncomeController.java b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpIncomeController.java index ea77e5c..6dd03ab 100644 --- a/web-api/src/main/java/com/jeesite/modules/erp/web/ErpIncomeController.java +++ b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpIncomeController.java @@ -1,6 +1,9 @@ package com.jeesite.modules.erp.web; import java.util.List; + +import com.jeesite.modules.apps.Service.erpFlowService; +import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -26,6 +29,7 @@ import com.jeesite.modules.erp.service.ErpIncomeService; /** * 收入明细表 Controller + * * @author gaoxq * @version 2026-03-22 */ @@ -33,114 +37,129 @@ import com.jeesite.modules.erp.service.ErpIncomeService; @RequestMapping(value = "${adminPath}/erp/income") public class ErpIncomeController extends BaseController { - private final ErpIncomeService erpIncomeService; + @Resource + private erpFlowService flowService; - public ErpIncomeController(ErpIncomeService erpIncomeService) { - this.erpIncomeService = erpIncomeService; - } - - /** - * 获取数据 - */ - @ModelAttribute - public ErpIncome get(String incomeId, boolean isNewRecord) { - return erpIncomeService.get(incomeId, isNewRecord); - } - - /** - * 查询列表 - */ - @RequiresPermissions("erp:income:view") - @RequestMapping(value = {"list", ""}) - public String list(ErpIncome erpIncome, Model model) { - model.addAttribute("erpIncome", erpIncome); - return "modules/erp/erpIncomeList"; - } - - /** - * 查询列表数据 - */ - @RequiresPermissions("erp:income:view") - @RequestMapping(value = "listData") - @ResponseBody - public Page listData(ErpIncome erpIncome, HttpServletRequest request, HttpServletResponse response) { - erpIncome.setPage(new Page<>(request, response)); - Page page = erpIncomeService.findPage(erpIncome); - return page; - } + private final ErpIncomeService erpIncomeService; - /** - * 查看编辑表单 - */ - @RequiresPermissions("erp:income:view") - @RequestMapping(value = "form") - public String form(ErpIncome erpIncome, Model model) { - model.addAttribute("erpIncome", erpIncome); - return "modules/erp/erpIncomeForm"; - } + public ErpIncomeController(ErpIncomeService erpIncomeService) { + this.erpIncomeService = erpIncomeService; + } - /** - * 保存数据 - */ - @RequiresPermissions("erp:income:edit") - @PostMapping(value = "save") - @ResponseBody - public String save(@Validated ErpIncome erpIncome) { - erpIncomeService.save(erpIncome); - return renderResult(Global.TRUE, text("保存收入成功!")); - } + /** + * 获取数据 + */ + @ModelAttribute + public ErpIncome get(String incomeId, boolean isNewRecord) { + return erpIncomeService.get(incomeId, isNewRecord); + } - /** - * 导出数据 - */ - @RequiresPermissions("erp:income:view") - @RequestMapping(value = "exportData") - public void exportData(ErpIncome erpIncome, HttpServletResponse response) { - List list = erpIncomeService.findList(erpIncome); - String fileName = "收入" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; - try(ExcelExport ee = new ExcelExport("收入", ErpIncome.class)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 查询列表 + */ + @RequiresPermissions("erp:income:view") + @RequestMapping(value = {"list", ""}) + public String list(ErpIncome erpIncome, Model model) { + model.addAttribute("erpIncome", erpIncome); + return "modules/erp/erpIncomeList"; + } - /** - * 下载模板 - */ - @RequiresPermissions("erp:income:view") - @RequestMapping(value = "importTemplate") - public void importTemplate(HttpServletResponse response) { - ErpIncome erpIncome = new ErpIncome(); - List list = ListUtils.newArrayList(erpIncome); - String fileName = "收入模板.xlsx"; - try(ExcelExport ee = new ExcelExport("收入", ErpIncome.class, Type.IMPORT)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 查询列表数据 + */ + @RequiresPermissions("erp:income:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(ErpIncome erpIncome, HttpServletRequest request, HttpServletResponse response) { + erpIncome.setPage(new Page<>(request, response)); + Page page = erpIncomeService.findPage(erpIncome); + return page; + } - /** - * 导入数据 - */ - @ResponseBody - @RequiresPermissions("erp:income:edit") - @PostMapping(value = "importData") - public String importData(MultipartFile file) { - try { - String message = erpIncomeService.importData(file); - return renderResult(Global.TRUE, "posfull:"+message); - } catch (Exception ex) { - return renderResult(Global.FALSE, "posfull:"+ex.getMessage()); - } - } - - /** - * 删除数据 - */ - @RequiresPermissions("erp:income:edit") - @RequestMapping(value = "delete") - @ResponseBody - public String delete(ErpIncome erpIncome) { - erpIncomeService.delete(erpIncome); - return renderResult(Global.TRUE, text("删除收入成功!")); - } - + /** + * 查看编辑表单 + */ + @RequiresPermissions("erp:income:view") + @RequestMapping(value = "form") + public String form(ErpIncome erpIncome, Model model) { + model.addAttribute("erpIncome", erpIncome); + return "modules/erp/erpIncomeForm"; + } + + /** + * 保存数据 + */ + @RequiresPermissions("erp:income:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated ErpIncome erpIncome) { + erpIncomeService.save(erpIncome); + return renderResult(Global.TRUE, text("保存收入成功!")); + } + + /** + * 导出数据 + */ + @RequiresPermissions("erp:income:view") + @RequestMapping(value = "exportData") + public void exportData(ErpIncome erpIncome, HttpServletResponse response) { + List list = erpIncomeService.findList(erpIncome); + String fileName = "收入" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try (ExcelExport ee = new ExcelExport("收入", ErpIncome.class)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 下载模板 + */ + @RequiresPermissions("erp:income:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + ErpIncome erpIncome = new ErpIncome(); + List list = ListUtils.newArrayList(erpIncome); + String fileName = "收入模板.xlsx"; + try (ExcelExport ee = new ExcelExport("收入", ErpIncome.class, Type.IMPORT)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 导入数据 + */ + @ResponseBody + @RequiresPermissions("erp:income:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file) { + try { + String message = erpIncomeService.importData(file); + return renderResult(Global.TRUE, "posfull:" + message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:" + ex.getMessage()); + } + } + + /** + * 删除数据 + */ + @RequiresPermissions("erp:income:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(ErpIncome erpIncome) { + erpIncomeService.delete(erpIncome); + return renderResult(Global.TRUE, text("删除收入成功!")); + } + + /** + * 记账数据 + */ + @RequestMapping(value = "recorded") + @ResponseBody + public String recorded(ErpIncome erpIncome) { + ErpIncome income = erpIncomeService.get(erpIncome); + income.setIsRecorded("1"); + erpIncomeService.save(income); + flowService.addIncome(income); + return renderResult(Global.TRUE, text("记账收入成功!")); + } } \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/utils/BigDecimalUtils.java b/web-api/src/main/java/com/jeesite/modules/utils/BigDecimalUtils.java new file mode 100644 index 0000000..14eca71 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/utils/BigDecimalUtils.java @@ -0,0 +1,54 @@ +package com.jeesite.modules.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class BigDecimalUtils { + + private static final int SCALE = 2; + private static final RoundingMode ROUND_MODE = RoundingMode.HALF_UP; + + /** + * 加 + */ + public static BigDecimal add(BigDecimal num1, BigDecimal num2) { + num1 = defaultIfNull(num1); + num2 = defaultIfNull(num2); + return num1.add(num2); + } + + /** + * 减 + */ + public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) { + num1 = defaultIfNull(num1); + num2 = defaultIfNull(num2); + return num1.subtract(num2); + } + + /** + * 乘 + */ + public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) { + num1 = defaultIfNull(num1); + num2 = defaultIfNull(num2); + return num1.multiply(num2).setScale(SCALE, ROUND_MODE); + } + + /** + * 除 + */ + public static BigDecimal divide(BigDecimal num1, BigDecimal num2) { + num1 = defaultIfNull(num1); + num2 = defaultIfNull(num2); + + if (num2.compareTo(BigDecimal.ZERO) == 0) { + return BigDecimal.ZERO; + } + return num1.divide(num2, SCALE, ROUND_MODE); + } + + private static BigDecimal defaultIfNull(BigDecimal num) { + return num == null ? BigDecimal.ZERO : num; + } +} diff --git a/web-api/src/main/java/com/jeesite/modules/utils/DateUtils.java b/web-api/src/main/java/com/jeesite/modules/utils/DateUtils.java index 30376ec..77ab03c 100644 --- a/web-api/src/main/java/com/jeesite/modules/utils/DateUtils.java +++ b/web-api/src/main/java/com/jeesite/modules/utils/DateUtils.java @@ -1,7 +1,10 @@ package com.jeesite.modules.utils; +import java.text.SimpleDateFormat; import java.time.LocalDate; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.Date; public class DateUtils { private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("MM"); @@ -12,7 +15,6 @@ public class DateUtils { private static final DateTimeFormatter SHORT_YEAR_MONTH_CN_FORMATTER = DateTimeFormatter.ofPattern("yy年MM月"); - public static String dsValue() { LocalDate currentDate = LocalDate.now(); return currentDate.format(DATE_FORMATTER); @@ -50,4 +52,20 @@ public class DateUtils { public static String getMonth(LocalDate date) { return date.format(MONTH_FORMATTER); } + + public static String getYear(Date date) { + return getYear(dateToLocalDate(date)); + } + + public static String getMonth(Date date) { + return getMonth(dateToLocalDate(date)); + } + + public static String getDate(String pattern) { + return new SimpleDateFormat(pattern).format(new Date()); + } + + public static LocalDate dateToLocalDate(Date date) { + return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + } } \ No newline at end of file diff --git a/web-vue/packages/erp/views/erp/debts/select.ts b/web-vue/packages/core/components/ListSelect/src/selectType/erpDebtSelect.ts similarity index 74% rename from web-vue/packages/erp/views/erp/debts/select.ts rename to web-vue/packages/core/components/ListSelect/src/selectType/erpDebtSelect.ts index 5e35460..cb26b6a 100644 --- a/web-vue/packages/erp/views/erp/debts/select.ts +++ b/web-vue/packages/core/components/ListSelect/src/selectType/erpDebtSelect.ts @@ -1,6 +1,6 @@ import { useI18n } from '@jeesite/core/hooks/web/useI18n'; import { BasicColumn, BasicTableProps, FormProps } from '@jeesite/core/components/Table'; -import { erpDebtsListData } from '@jeesite/erp/api/erp/debts'; +import { ErpDebts, erpDebtsListData } from '@jeesite/erp/api/erp/debts'; const { t } = useI18n('erp.debts'); @@ -12,20 +12,28 @@ const searchForm: FormProps = { baseColProps: { md: 8, lg: 6 }, labelWidth: 90, schemas: [ + { + label: t('借贷名称'), + field: 'debtName', + component: 'Input', + }, { label: t('负债类型'), field: 'debtType', - component: 'Input', + component: 'Select', + componentProps: { + dictType: 'debt_type', + allowClear: true, + }, }, { - label: t('对方名称'), - field: 'debtName', - component: 'Input', - }, - { - label: t('状态'), + label: t('借贷状态'), field: 'ustatus', - component: 'Input', + component: 'Select', + componentProps: { + dictType: 'debt_status', + allowClear: true, + }, }, ], }; @@ -36,9 +44,9 @@ const tableColumns: BasicColumn[] = [ dataIndex: 'createTime', key: 'a.create_time', sorter: true, - width: 230, - align: 'left', - slot: 'firstColumn', + width: 150, + align: 'center', + fixed: 'left', }, { title: t('负债类型'), @@ -47,9 +55,10 @@ const tableColumns: BasicColumn[] = [ sorter: true, width: 130, align: 'left', + dictType: 'debt_type', }, { - title: t('对方名称'), + title: t('借贷名称'), dataIndex: 'debtName', key: 'a.debt_name', sorter: true, @@ -72,14 +81,6 @@ const tableColumns: BasicColumn[] = [ width: 130, align: 'right', }, - { - title: t('结清时间'), - dataIndex: 'endTime', - key: 'a.end_time', - sorter: true, - width: 130, - align: 'center', - }, { title: t('状态'), dataIndex: 'ustatus', @@ -87,6 +88,7 @@ const tableColumns: BasicColumn[] = [ sorter: true, width: 130, align: 'left', + dictType: 'debt_status', }, ]; @@ -105,6 +107,6 @@ export default { modalProps, tableProps, itemCode: 'debtId', - itemName: 'debtId', - isShowCode: false, + itemName: 'debtName', + isShowCode: true, }; diff --git a/web-vue/packages/erp/api/erp/accountTransfer.ts b/web-vue/packages/erp/api/erp/accountTransfer.ts index 8950d66..95788ea 100644 --- a/web-vue/packages/erp/api/erp/accountTransfer.ts +++ b/web-vue/packages/erp/api/erp/accountTransfer.ts @@ -50,3 +50,7 @@ export const erpAccountTransferImportData = ( export const erpAccountTransferDelete = (params?: ErpAccountTransfer | any) => defHttp.get({ url: adminPath + '/erp/accountTransfer/delete', params }); + +export const erpAccountTransferRecorded = (params?: ErpAccountTransfer | any) => + defHttp.get({ url: adminPath + '/erp/accountTransfer/recorded', params }); + diff --git a/web-vue/packages/erp/api/erp/debtRecords.ts b/web-vue/packages/erp/api/erp/debtRecords.ts index 66b6129..1dd062a 100644 --- a/web-vue/packages/erp/api/erp/debtRecords.ts +++ b/web-vue/packages/erp/api/erp/debtRecords.ts @@ -19,6 +19,7 @@ export interface ErpDebtRecords extends BasicModel { accountId: string; // 账户标识 repayAmount: number; // 还款金额 repayTime?: string; // 还款时间 + categoryId?: string; // 分类标识 remark?: string; // 备注说明 } @@ -48,3 +49,7 @@ export const erpDebtRecordsImportData = ( export const erpDebtRecordsDelete = (params?: ErpDebtRecords | any) => defHttp.get({ url: adminPath + '/erp/debtRecords/delete', params }); + +export const erpDebtRecordsRecorded = (params?: ErpDebtRecords | any) => + defHttp.get({ url: adminPath + '/erp/debtRecords/recorded', params }); + diff --git a/web-vue/packages/erp/api/erp/debts.ts b/web-vue/packages/erp/api/erp/debts.ts index bf656bf..7e932d2 100644 --- a/web-vue/packages/erp/api/erp/debts.ts +++ b/web-vue/packages/erp/api/erp/debts.ts @@ -18,9 +18,10 @@ export interface ErpDebts extends BasicModel { debtType: string; // 负债类型 debtName: string; // 对方名称 debtAmount: number; // 借贷金额 - remaining?: number; // 未还金额 + remaining?: number; // 已还金额 endTime?: string; // 结清时间 ustatus: string; // 状态 + remark?: string; // 交易备注 } export const erpDebtsList = (params?: ErpDebts | any) => diff --git a/web-vue/packages/erp/api/erp/expense.ts b/web-vue/packages/erp/api/erp/expense.ts index cef9b49..532f920 100644 --- a/web-vue/packages/erp/api/erp/expense.ts +++ b/web-vue/packages/erp/api/erp/expense.ts @@ -20,6 +20,7 @@ export interface ErpExpense extends BasicModel { categoryId: string; // 支出分类 amount: number; // 交易金额 updateTime?: string; // 更新时间 + remark?: string; // 交易备注 } export const erpExpenseList = (params?: ErpExpense | any) => @@ -48,3 +49,6 @@ export const erpExpenseImportData = ( export const erpExpenseDelete = (params?: ErpExpense | any) => defHttp.get({ url: adminPath + '/erp/expense/delete', params }); + +export const erpExpenseRecorded = (params?: ErpExpense | any) => + defHttp.get({ url: adminPath + '/erp/expense/recorded', params }); \ No newline at end of file diff --git a/web-vue/packages/erp/api/erp/income.ts b/web-vue/packages/erp/api/erp/income.ts index 434e396..28d03d0 100644 --- a/web-vue/packages/erp/api/erp/income.ts +++ b/web-vue/packages/erp/api/erp/income.ts @@ -20,6 +20,7 @@ export interface ErpIncome extends BasicModel { categoryId: string; // 收入分类 amount: number; // 交易金额 updateTime?: string; // 更新时间 + remark?: string; // 交易备注 } export const erpIncomeList = (params?: ErpIncome | any) => @@ -48,3 +49,6 @@ export const erpIncomeImportData = ( export const erpIncomeDelete = (params?: ErpIncome | any) => defHttp.get({ url: adminPath + '/erp/income/delete', params }); + +export const erpIncomeRecorded = (params?: ErpIncome | any) => + defHttp.get({ url: adminPath + '/erp/income/recorded', params }); diff --git a/web-vue/packages/erp/views/erp/account/list.vue b/web-vue/packages/erp/views/erp/account/list.vue index 0fd8028..9658bdc 100644 --- a/web-vue/packages/erp/views/erp/account/list.vue +++ b/web-vue/packages/erp/views/erp/account/list.vue @@ -178,6 +178,7 @@ confirm: handleDelete.bind(this, record), }, auth: 'erp:account:edit', + ifShow: record.isActive == '0' }, ], }; diff --git a/web-vue/packages/erp/views/erp/accountTransfer/list.vue b/web-vue/packages/erp/views/erp/accountTransfer/list.vue index 2775d7d..5eb2d35 100644 --- a/web-vue/packages/erp/views/erp/accountTransfer/list.vue +++ b/web-vue/packages/erp/views/erp/accountTransfer/list.vue @@ -38,7 +38,7 @@ import { BasicTable, BasicColumn, useTable } from '@jeesite/core/components/Table'; import { ErpCategory, erpCategoryListAll } from '@jeesite/erp/api/erp/category'; import { ErpAccountTransfer, erpAccountTransferList } from '@jeesite/erp/api/erp/accountTransfer'; - import { erpAccountTransferDelete, erpAccountTransferListData } from '@jeesite/erp/api/erp/accountTransfer'; + import { erpAccountTransferDelete, erpAccountTransferRecorded, erpAccountTransferListData } from '@jeesite/erp/api/erp/accountTransfer'; import { useModal } from '@jeesite/core/components/Modal'; import { FormProps } from '@jeesite/core/components/Form'; import InputForm from './form.vue'; @@ -206,6 +206,7 @@ title: t('编辑'), onClick: handleForm.bind(this, { transferId: record.transferId }), auth: 'erp:accountTransfer:edit', + ifShow: record.transferStatus == '0' }, { icon: 'i-ant-design:delete-outlined', @@ -216,7 +217,19 @@ confirm: handleDelete.bind(this, record), }, auth: 'erp:accountTransfer:edit', + ifShow: record.transferStatus == '0' }, + { + icon: 'ant-design:check-outlined', + color: 'warning', + title: t('记账'), + popConfirm: { + title: t('是否确认记账?'), + confirm: handleRecorded.bind(this, record), + }, + auth: 'erp:income:edit', + ifShow: record.transferStatus == '0' + }, ], }; @@ -261,6 +274,13 @@ showMessage(res.message); await handleSuccess(record); } + + async function handleRecorded(record: Recordable) { + const params = { transferId: record.transferId }; + const res = await erpAccountTransferRecorded(params); + showMessage(res.message); + await handleSuccess(record); + } async function handleSuccess(record: Recordable) { await reload({ record }); diff --git a/web-vue/packages/erp/views/erp/budgets/form.vue b/web-vue/packages/erp/views/erp/budgets/form.vue deleted file mode 100644 index e76458b..0000000 --- a/web-vue/packages/erp/views/erp/budgets/form.vue +++ /dev/null @@ -1,149 +0,0 @@ - - - diff --git a/web-vue/packages/erp/views/erp/budgets/list.vue b/web-vue/packages/erp/views/erp/budgets/list.vue index 2a45094..70e31a7 100644 --- a/web-vue/packages/erp/views/erp/budgets/list.vue +++ b/web-vue/packages/erp/views/erp/budgets/list.vue @@ -14,17 +14,9 @@ {{ t('导出') }} - - {{ t('新增') }} - - - - + diff --git a/web-vue/packages/erp/views/erp/debtRecords/list.vue b/web-vue/packages/erp/views/erp/debtRecords/list.vue index 8a67dee..d8f3156 100644 --- a/web-vue/packages/erp/views/erp/debtRecords/list.vue +++ b/web-vue/packages/erp/views/erp/debtRecords/list.vue @@ -24,7 +24,7 @@ - + diff --git a/web-vue/packages/erp/views/erp/debts/list.vue b/web-vue/packages/erp/views/erp/debts/list.vue index c96c304..5414d47 100644 --- a/web-vue/packages/erp/views/erp/debts/list.vue +++ b/web-vue/packages/erp/views/erp/debts/list.vue @@ -24,7 +24,7 @@ - +