From 51ffefbe2fa3e125de6a420501cb362f878d9040 Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Sat, 29 Nov 2025 23:40:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/erp/bin/deploy.bat | 22 + modules/erp/bin/deploy.sh | 18 + modules/erp/bin/package.bat | 22 + modules/erp/bin/package.sh | 18 + modules/erp/db/erp.erm | 3590 +++++++++++++++++ modules/erp/pom.xml | 46 + .../main/resources/application-assistant.yml | 12 + .../src/main/resources/config/jeesite-erp.yml | 4 + .../main/resources/db/upgrade/erp/versions | 1 + modules/pom.xml | 77 +- web-api/pom.xml | 297 +- .../com/jeesite/modules/ApiApplication.java | 26 +- .../jeesite/modules/biz/entity/BizCities.java | 2 +- .../modules/biz/entity/BizListItem.java | 157 +- .../biz/entity/BizProjectRequirements.java | 187 +- .../biz/web/BizListItemController.java | 48 +- .../biz/web/BizProjectInfoController.java | 222 +- .../modules/erp/dao/ErpAccountDao.java | 15 + .../modules/erp/dao/ErpCategoryDao.java | 15 + .../modules/erp/dao/ErpExpenseDao.java | 15 + .../jeesite/modules/erp/dao/ErpIncomeDao.java | 15 + .../erp/dao/ErpTransactionFlowDao.java | 15 + .../modules/erp/entity/ErpAccount.java | 87 + .../modules/erp/entity/ErpCategory.java | 81 + .../modules/erp/entity/ErpExpense.java | 124 + .../jeesite/modules/erp/entity/ErpIncome.java | 124 + .../erp/entity/ErpTransactionFlow.java | 131 + .../erp/service/ErpAccountService.java | 134 + .../erp/service/ErpCategoryService.java | 134 + .../erp/service/ErpExpenseService.java | 134 + .../modules/erp/service/ErpIncomeService.java | 134 + .../service/ErpTransactionFlowService.java | 134 + .../modules/erp/web/ErpAccountController.java | 146 + .../erp/web/ErpCategoryController.java | 154 + .../modules/erp/web/ErpExpenseController.java | 146 + .../modules/erp/web/ErpIncomeController.java | 146 + .../erp/web/ErpTransactionFlowController.java | 205 + .../modules/utils/BigDecimalUtils.java | 89 + .../com/jeesite/modules/utils/IpUtils.java | 92 + .../mappings/modules/erp/ErpAccountDao.xml | 15 + .../mappings/modules/erp/ErpCategoryDao.xml | 15 + .../mappings/modules/erp/ErpExpenseDao.xml | 15 + .../mappings/modules/erp/ErpIncomeDao.xml | 15 + .../modules/erp/ErpTransactionFlowDao.xml | 15 + web-vue/package.json | 1 + web-vue/packages/assets/images/header.jpg | Bin 15664 -> 58373 bytes web-vue/packages/assets/images/logo.png | Bin 7419 -> 14057 bytes web-vue/packages/assets/svg/login-box-bg.svg | 99 +- web-vue/packages/biz/api/biz/listItem.ts | 5 + web-vue/packages/biz/api/biz/projectInfo.ts | 3 + .../packages/biz/views/biz/listItem/form.vue | 47 +- .../packages/biz/views/biz/listItem/list.vue | 45 +- .../views/biz/projectRequirements/form.vue | 4 +- .../views/biz/projectRequirements/list.vue | 54 +- .../views/biz/projectRequirements/select.ts | 226 -- .../biz/views/biz/quickLogin/form.vue | 4 +- .../biz/views/biz/quickLogin/list.vue | 16 +- .../src/selectType/erpAccountSelect.ts | 123 + .../src/selectType/erpCategorySelect.ts | 120 + .../src/selectType/erpFlowSelect.ts | 128 + .../default/header/components/notify/data.ts | 196 - .../header/components/notify/index.vue | 14 +- .../desktop/analysis/components/Data.tsx | 162 - .../analysis/components/ProjectCard.vue | 77 +- .../views/login/ForgetPasswordForm.vue | 1 - .../core/layouts/views/login/Login.vue | 36 - .../core/layouts/views/login/LoginForm.vue | 33 - web-vue/packages/erp/README.md | 22 + web-vue/packages/erp/api/erp/account.ts | 56 + web-vue/packages/erp/api/erp/category.ts | 58 + web-vue/packages/erp/api/erp/expense.ts | 54 + web-vue/packages/erp/api/erp/income.ts | 54 + .../packages/erp/api/erp/transactionFlow.ts | 61 + web-vue/packages/erp/package.json | 30 + web-vue/packages/erp/tsconfig.json | 20 + .../packages/erp/views/erp/account/form.vue | 143 + .../erp/views/erp/account/formImport.vue | 103 + .../packages/erp/views/erp/account/list.vue | 234 ++ .../packages/erp/views/erp/category/form.vue | 142 + .../erp/views/erp/category/formImport.vue | 103 + .../packages/erp/views/erp/category/list.vue | 227 ++ .../erp/views/erp/expense/formImport.vue | 103 + .../packages/erp/views/erp/expense/list.vue | 213 + .../erp/views/erp/income/formImport.vue | 103 + .../packages/erp/views/erp/income/list.vue | 213 + .../erp/views/erp/transactionFlow/form.vue | 153 + .../views/erp/transactionFlow/formImport.vue | 103 + .../erp/views/erp/transactionFlow/list.vue | 310 ++ web-vue/pnpm-lock.yaml | 15 +- web-vue/web/public/favicon.ico | Bin 0 -> 4286 bytes web-vue/web/public/favicon.png | Bin 4794 -> 4286 bytes web-vue/web/public/resource/img/logo.png | Bin 7419 -> 14057 bytes .../web/public/resource/img/pwa-192x192.png | Bin 7691 -> 54154 bytes .../web/public/resource/img/pwa-512x512.png | Bin 40792 -> 54154 bytes web/pom.xml | 6 + 95 files changed, 9692 insertions(+), 1322 deletions(-) create mode 100644 modules/erp/bin/deploy.bat create mode 100644 modules/erp/bin/deploy.sh create mode 100644 modules/erp/bin/package.bat create mode 100644 modules/erp/bin/package.sh create mode 100644 modules/erp/db/erp.erm create mode 100644 modules/erp/pom.xml create mode 100644 modules/erp/src/main/resources/application-assistant.yml create mode 100644 modules/erp/src/main/resources/config/jeesite-erp.yml create mode 100644 modules/erp/src/main/resources/db/upgrade/erp/versions create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/dao/ErpAccountDao.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/dao/ErpCategoryDao.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/dao/ErpExpenseDao.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/dao/ErpIncomeDao.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/dao/ErpTransactionFlowDao.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/entity/ErpAccount.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/entity/ErpCategory.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/entity/ErpExpense.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/entity/ErpIncome.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/entity/ErpTransactionFlow.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/service/ErpAccountService.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/service/ErpCategoryService.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/service/ErpExpenseService.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/service/ErpIncomeService.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/service/ErpTransactionFlowService.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/web/ErpAccountController.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/web/ErpCategoryController.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/web/ErpExpenseController.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/web/ErpIncomeController.java create mode 100644 web-api/src/main/java/com/jeesite/modules/erp/web/ErpTransactionFlowController.java create mode 100644 web-api/src/main/java/com/jeesite/modules/utils/BigDecimalUtils.java create mode 100644 web-api/src/main/java/com/jeesite/modules/utils/IpUtils.java create mode 100644 web-api/src/main/resources/mappings/modules/erp/ErpAccountDao.xml create mode 100644 web-api/src/main/resources/mappings/modules/erp/ErpCategoryDao.xml create mode 100644 web-api/src/main/resources/mappings/modules/erp/ErpExpenseDao.xml create mode 100644 web-api/src/main/resources/mappings/modules/erp/ErpIncomeDao.xml create mode 100644 web-api/src/main/resources/mappings/modules/erp/ErpTransactionFlowDao.xml delete mode 100644 web-vue/packages/biz/views/biz/projectRequirements/select.ts create mode 100644 web-vue/packages/core/components/ListSelect/src/selectType/erpAccountSelect.ts create mode 100644 web-vue/packages/core/components/ListSelect/src/selectType/erpCategorySelect.ts create mode 100644 web-vue/packages/core/components/ListSelect/src/selectType/erpFlowSelect.ts delete mode 100644 web-vue/packages/core/layouts/default/header/components/notify/data.ts create mode 100644 web-vue/packages/erp/README.md create mode 100644 web-vue/packages/erp/api/erp/account.ts create mode 100644 web-vue/packages/erp/api/erp/category.ts create mode 100644 web-vue/packages/erp/api/erp/expense.ts create mode 100644 web-vue/packages/erp/api/erp/income.ts create mode 100644 web-vue/packages/erp/api/erp/transactionFlow.ts create mode 100644 web-vue/packages/erp/package.json create mode 100644 web-vue/packages/erp/tsconfig.json create mode 100644 web-vue/packages/erp/views/erp/account/form.vue create mode 100644 web-vue/packages/erp/views/erp/account/formImport.vue create mode 100644 web-vue/packages/erp/views/erp/account/list.vue create mode 100644 web-vue/packages/erp/views/erp/category/form.vue create mode 100644 web-vue/packages/erp/views/erp/category/formImport.vue create mode 100644 web-vue/packages/erp/views/erp/category/list.vue create mode 100644 web-vue/packages/erp/views/erp/expense/formImport.vue create mode 100644 web-vue/packages/erp/views/erp/expense/list.vue create mode 100644 web-vue/packages/erp/views/erp/income/formImport.vue create mode 100644 web-vue/packages/erp/views/erp/income/list.vue create mode 100644 web-vue/packages/erp/views/erp/transactionFlow/form.vue create mode 100644 web-vue/packages/erp/views/erp/transactionFlow/formImport.vue create mode 100644 web-vue/packages/erp/views/erp/transactionFlow/list.vue create mode 100644 web-vue/web/public/favicon.ico diff --git a/modules/erp/bin/deploy.bat b/modules/erp/bin/deploy.bat new file mode 100644 index 00000000..ddf7d883 --- /dev/null +++ b/modules/erp/bin/deploy.bat @@ -0,0 +1,22 @@ +@echo off +rem /** +rem * Copyright (c) 2013-Now http://jeesite.com All rights reserved. +rem * No deletion without permission, or be held responsible to law. +rem * +rem * Author: ThinkGem@163.com +rem */ +echo. +echo [信息] 部署工程到Maven服务器。 +echo. + +%~d0 +cd %~dp0 + +call mvn -v +echo. + +cd .. +call mvn clean deploy -Dmaven.test.skip=true -Pdeploy + +cd bin +pause \ No newline at end of file diff --git a/modules/erp/bin/deploy.sh b/modules/erp/bin/deploy.sh new file mode 100644 index 00000000..f8696c71 --- /dev/null +++ b/modules/erp/bin/deploy.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# /** +# * Copyright (c) 2013-Now http://jeesite.com All rights reserved. +# * No deletion without permission, or be held responsible to law. +# * +# * Author: ThinkGem@163.com +# */ +echo "" +echo "[淇℃伅] 閮ㄧ讲宸ョ▼鍒癕aven鏈嶅姟鍣ㄣ" +echo "" + +mvn -v +echo "" + +cd .. +mvn clean deploy -Dmaven.test.skip=true -Pdeploy + +cd bin \ No newline at end of file diff --git a/modules/erp/bin/package.bat b/modules/erp/bin/package.bat new file mode 100644 index 00000000..09f2d0e4 --- /dev/null +++ b/modules/erp/bin/package.bat @@ -0,0 +1,22 @@ +@echo off +rem /** +rem * Copyright (c) 2013-Now http://jeesite.com All rights reserved. +rem * No deletion without permission, or be held responsible to law. +rem * +rem * Author: ThinkGem@163.com +rem */ +echo. +echo [信息] 打包安装工程,生成jar包文件。 +echo. + +%~d0 +cd %~dp0 + +call mvn -v +echo. + +cd .. +call mvn clean install -Dmaven.test.skip=true -Ppackage + +cd bin +pause \ No newline at end of file diff --git a/modules/erp/bin/package.sh b/modules/erp/bin/package.sh new file mode 100644 index 00000000..8deff508 --- /dev/null +++ b/modules/erp/bin/package.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# /** +# * Copyright (c) 2013-Now http://jeesite.com All rights reserved. +# * No deletion without permission, or be held responsible to law. +# * +# * Author: ThinkGem@163.com +# */ +echo "" +echo "[淇℃伅] 鎵撳寘瀹夎宸ョ▼锛岀敓鎴恓ar鍖呮枃浠躲" +echo "" + +mvn -v +echo "" + +cd .. +mvn clean install -Dmaven.test.skip=true -Ppackage + +cd bin \ No newline at end of file diff --git a/modules/erp/db/erp.erm b/modules/erp/db/erp.erm new file mode 100644 index 00000000..b828a6ad --- /dev/null +++ b/modules/erp/db/erp.erm @@ -0,0 +1,3590 @@ + + + + true + 100 + A4 210 x 297 mm + 30 + 30 + 30 + 30 + + 0 + 1.0 + 0 + 0 + + 128 + 128 + 192 + + + 255 + 255 + 255 + + Arial + 14 + + StandardSQL + false + + + 0 + true + 2 + 1 + 1 + false + true + false + false + + + db/erp.sql + UTF-8 + CR+LF + false + 7be191506f9daa8070b3ac14921dffd44063d2bb + null + + true + false + true + false + true + false + false + false + false + false + false + false + false + false + false + true + false + true + false + false + + + + + null + db/erp.xls + + + en + + true + true + true + + + + true + true + true + + + db/erp.png + + true + true + + + + + + + false + + + + + 0 + + + + false + false + + + + + false + + + + + + -1 + -1 + Arial + 14 + 50 + 50 + + 255 + 255 + 255 + + + + false + 2016-12-25 17:25:00 + + Project Name + + + + Model Name + + + + Version + + + + Company + + + + Author + + + + + + + + + 7be191506f9daa8070b3ac14921dffd44063d2bb + Default + + + + + + 136ca02f1b3a96a8f2e242d5dd64d48f566143ef + 64 + null + false + null + false + false + false + + false + 绉熸埛浠g爜 + 绉熸埛浠g爜 + corp_code + varchar(n) + + + f116706ac00cd3a3ee88b2a88debf7ebc3eeb12d + 100 + null + false + null + false + false + false + + false + 绉熸埛鍚嶇О + 绉熸埛鍚嶇О + corp_name + nvarchar(n) + + + 1a3b3f8bccfce8894d117d6bdb0a6b104bfb80ef + 64 + null + false + null + false + false + false + + false + + 鍒涘缓鑰 + create_by + varchar(n) + + + dba1aec0c72d79ea73ed4ebde07696cf4df174b7 + null + null + false + null + false + false + false + + false + + 鍒涘缓鏃堕棿 + create_date + datetime + + + f01926071736b56b898949cc0720149c71504324 + null + null + false + null + false + false + false + + false + + 鎵╁睍 Date 1 + extend_d1 + datetime + + + 942700093ab61c3be0bdf6b23bcba210bcc30281 + null + null + false + null + false + false + false + + false + + 鎵╁睍 Date 2 + extend_d2 + datetime + + + f221902bf89fe94dece8ccf309f59cc2c479d63f + null + null + false + null + false + false + false + + false + + 鎵╁睍 Date 3 + extend_d3 + datetime + + + c8d21e24bc69aac295703b0bae56269035b729f0 + null + null + false + null + false + false + false + + false + + 鎵╁睍 Date 4 + extend_d4 + datetime + + + 4c0cc4ae32f8774cc319f516784430204aef0bdb + 19 + 4 + false + null + false + false + false + + false + + 鎵╁睍 Float 1 + extend_f1 + decimal(p,s) + + + 2e958c528620621985af4394590198feed57cdf9 + 19 + 4 + false + null + false + false + false + + false + + 鎵╁睍 Float 2 + extend_f2 + decimal(p,s) + + + 7c25ad75662553c7d4a58fa66eb50ca7c0ffee59 + 19 + 4 + false + null + false + false + false + + false + + 鎵╁睍 Float 3 + extend_f3 + decimal(p,s) + + + 1f81990c9694963f032c302d1834b972a6f2eb74 + 19 + 4 + false + null + false + false + false + + false + + 鎵╁睍 Float 4 + extend_f4 + decimal(p,s) + + + a1d747cd40768ac9f85176518ee48cb513bae110 + 19 + null + false + null + false + false + false + + false + + 鎵╁睍 Integer 1 + extend_i1 + decimal(p) + + + a9f0e14d6691c397990abe4ef1ff21674dccf401 + 19 + null + false + null + false + false + false + + false + + 鎵╁睍 Integer 2 + extend_i2 + decimal(p) + + + 2ce06c5cf87d93bb1e3f47268dbc679be4b6dd8d + 19 + null + false + null + false + false + false + + false + + 鎵╁睍 Integer 3 + extend_i3 + decimal(p) + + + 53d8c730fcec69d341f44089817ae06eb4844278 + 19 + null + false + null + false + false + false + + false + + 鎵╁睍 Integer 4 + extend_i4 + decimal(p) + + + 80cd53da9d5a1b19676537e590e20fa2793e902c + 1000 + null + false + null + false + false + false + + false + + 鎵╁睍 JSON + extend_json + varchar(n) + + + ad6f9eff50476669df62b7601cbc3a2e0c905d36 + 500 + null + false + null + false + false + false + + false + + 鎵╁睍 String 1 + extend_s1 + nvarchar(n) + + + 3a24133d2be4831e99d1319983e5393bcf964ff9 + 500 + null + false + null + false + false + false + + false + + 鎵╁睍 String 2 + extend_s2 + nvarchar(n) + + + 40e1afbbad28d28e371dd1ab77fb56640b1cb66b + 500 + null + false + null + false + false + false + + false + + 鎵╁睍 String 3 + extend_s3 + nvarchar(n) + + + a2d6b5a494fc1a3d29360d922296521c6640856b + 500 + null + false + null + false + false + false + + false + + 鎵╁睍 String 4 + extend_s4 + nvarchar(n) + + + 29f701cc6a308fbfc5b12b80fee621ceeb231dcc + 500 + null + false + null + false + false + false + + false + + 鎵╁睍 String 5 + extend_s5 + nvarchar(n) + + + c9a37a7b6a5451930ca63e36814767f742cd1393 + 500 + null + false + null + false + false + false + + false + + 鎵╁睍 String 6 + extend_s6 + nvarchar(n) + + + 8c26203d310a4e602cf0c0fc8a7b2c818219c1dc + 500 + null + false + null + false + false + false + + false + + 鎵╁睍 String 7 + extend_s7 + nvarchar(n) + + + 54448f19b0f5d1630bf29f9f99787802c36ebddb + 500 + null + false + null + false + false + false + + false + + 鎵╁睍 String 8 + extend_s8 + nvarchar(n) + + + 869fc70cf3a4e92e8056b40814df8e03f9f9efde + 64 + null + false + null + false + false + false + + false + + 缂栧彿 + id + varchar(n) + + + b18ce64a2a72d00b26515583d8bbfea282f30ea8 + 64 + null + false + null + false + false + false + + false + + 鐖剁骇缂栧彿 + parent_code + varchar(n) + + + 5887f9db78a9ebc7b23b9a163c6f68100257c0e5 + 767 + null + false + null + false + false + false + + false + + 鎵鏈夌埗绾х紪鍙 + parent_codes + varchar(n) + + + 8f7d3761c17a1b8632d186a3c67cb08dca18c498 + 500 + null + false + null + false + false + false + + false + + 澶囨敞淇℃伅 + remarks + nvarchar(n) + + + ba0fb53af3ccc8b0e5d73baa58ec27fbb7973097 + 1 + null + false + null + false + false + false + + false + + 鐘舵侊紙0姝e父 1鍒犻櫎 2鍋滅敤 3鍐荤粨 4瀹℃牳 5椹冲洖 9鑽夌ǹ锛 + status + character(n) + + + 17718c2364a2368c2072da279c927d7ad3bfcf08 + 1 + null + false + null + false + false + false + + false + + 鐘舵侊紙0姝e父 1鍒犻櫎 2鍋滅敤锛 + status + character(n) + + + 23b25e48c87be0e4f3952f7a8330594e9d511a4e + 64 + null + false + null + false + false + false + + false + + 鍖哄煙閫夋嫨 + test_area_code + varchar(n) + + + 8bc627205b6e55931d09079fcd07bfacbbd38f41 + 100 + null + false + null + false + false + false + + false + + 鍖哄煙鍚嶇О + test_area_name + nvarchar(n) + + + cdc46f802299958a2b3140200410caf5cbeb8a27 + 200 + null + false + null + false + false + false + + false + + 澶嶉夋 + test_checkbox + varchar(n) + + + d829e707316a49d39e5a11da5f5d36030a856b86 + 64 + null + false + null + false + false + false + + false + + 鐖惰〃涓婚敭 + test_data_id + varchar(n) + + + a27ebfd109532e2f551b101a0c78b3f50a3d58dd + null + null + false + null + false + false + false + + false + + 鏃ユ湡閫夋嫨 + test_date + datetime + + + 95ec23c1b2704817cca94d169aed5e11deb0adbb + null + null + false + null + false + false + false + + false + + 鏃ユ湡鏃堕棿 + test_datetime + datetime + + + ac02f2d1fff63fa66db583735eb1c8e9b466872f + 200 + null + false + null + false + false + false + + false + + 鍗曡鏂囨湰 + test_input + varchar(n) + + + e2270df5e0974bf471fdfe36e29bc9a8aa1774cb + 64 + null + false + null + false + false + false + + false + + 鏈烘瀯閫夋嫨 + test_office_code + varchar(n) + + + 791691b791efedc2d14867a152b4de58f4567326 + 10 + null + false + null + false + false + false + + false + + 鍗曢夋 + test_radio + varchar(n) + + + 6697b12cf2f6d7135570c2a581212ee067c13206 + 10 + null + false + null + false + false + false + + false + + 涓嬫媺妗 + test_select + varchar(n) + + + 68b9381c1fb6668186fef70f52fc0c14b1bd6f1c + 200 + null + false + null + false + false + false + + false + + 涓嬫媺澶氶 + test_select_multiple + varchar(n) + + + ae103dc1fb50094552e56afd72015481271913db + null + null + false + null + false + false + false + + false + + 鎺掑簭鍙 + test_sort + integer + + + 2fed92437d28f1427e913aba1251fe0807c7b209 + 200 + null + false + null + false + false + false + + false + + 澶氳鏂囨湰 + test_textarea + nvarchar(n) + + + 2eda719a62fb7e1d3face62555046d938abddda9 + 64 + null + false + null + false + false + false + + false + + 鐢ㄦ埛閫夋嫨 + test_user_code + varchar(n) + + + 70e9482ae432d16e734a730100e366ddab33564c + 64 + null + false + null + false + false + false + + false + + 鑺傜偣缂栫爜 + tree_code + varchar(n) + + + 40b63ab3e485fd55370d6d04b063c4397483ebc1 + 1 + null + false + null + false + false + false + + false + + 鏄惁鏈鏈骇 + tree_leaf + character(n) + + + 3b9c3307b7140f27edeb47ffe307a662b2856627 + 4 + null + false + null + false + false + false + + false + + 灞傛绾у埆 + tree_level + decimal(p) + + + 5356a60d0801c47941dd2fb4565cf785bb58e2d3 + 200 + null + false + null + false + false + false + + false + + 鑺傜偣鍚嶇О + tree_name + nvarchar(n) + + + bf5e60dee567b3ed0f12e8f3ffa1f74e43012b3a + 767 + null + false + null + false + false + false + + false + + 鍏ㄨ妭鐐瑰悕 + tree_names + varchar(n) + + + 16c9c333062ea3614d2e044803b872676c8a5377 + 10 + null + false + null + false + false + false + + false + + 鎺掑簭鍙凤紙鍗囧簭锛 + tree_sort + decimal(p) + + + a886757c87fb1e04c5f84b6a802e129baaec2ca6 + 767 + null + false + null + false + false + false + + false + + 鎵鏈夋帓搴忓彿 + tree_sorts + varchar(n) + + + 2c6b290f30c6f9e100f6c77eab0cba7bb3386768 + 64 + null + false + null + false + false + false + + false + + 鏇存柊鑰 + update_by + varchar(n) + + + f0bdbc4002f4a1b7fb7c5026bc21a7689c549728 + null + null + false + null + false + false + false + + false + + 鏇存柊鏃堕棿 + update_date + datetime + + + + + + + e553474c37270813e70025e433a4cf8a64653e13 + 438 + 387 + Arial + 14 + 864 + 36 + + 128 + 128 + 192 + + + + test_tree + 娴嬭瘯鏍戣〃 + + + + + + + 70e9482ae432d16e734a730100e366ddab33564c + 7e417ee9d0dd69c767a5853922621946ed4fb2d8 + + + + + varchar(n) + + + false + false + true + true + false + + + + + + + + + + + false + false + false + + + 0 + + + a535b6c506004a7fdf4d48984c9ff2cfa59c157a + + 5356a60d0801c47941dd2fb4565cf785bb58e2d3 + 39f501890586173d229e83610cfbfaa6e3a85374 + + + + + nvarchar(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + 35ae805d1da92afdb99b2fe8c536d1649356fccd + + + + + + + + +
+ + 5435ef11ea53f170fe3491b199c113e47932e175 + 401 + 320 + Arial + 14 + 36 + 36 + + 128 + 128 + 192 + + + + test_data + 娴嬭瘯鏁版嵁 + + + + + + + 869fc70cf3a4e92e8056b40814df8e03f9f9efde + d82778c36626013cd39fd790da6f55a9762f0c76 + + + + + varchar(n) + + + false + false + true + true + false + + + + + + + + + + + false + false + false + + + 0 + + + + ac02f2d1fff63fa66db583735eb1c8e9b466872f + 3e14b40dc07c134329a40752973acfad2ffdc48b + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 2fed92437d28f1427e913aba1251fe0807c7b209 + 8050d948828b16267482e9e3716219321f206b81 + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 6697b12cf2f6d7135570c2a581212ee067c13206 + 3664605e054c39531ca8e91aa4463c955a993357 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 68b9381c1fb6668186fef70f52fc0c14b1bd6f1c + f7b189ecdc92c78bfaae9c736318ab6a5aedd396 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 791691b791efedc2d14867a152b4de58f4567326 + 6e4837ab55b592669ccc7ebfc8b1ed96a00607b3 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + cdc46f802299958a2b3140200410caf5cbeb8a27 + 9fb81bdc12ed017f62e9dd4529025e536eff7f08 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + a27ebfd109532e2f551b101a0c78b3f50a3d58dd + 9d9478798ed2766a81b0e5a8a022eb89d9c5cc34 + + + + + datetime + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 95ec23c1b2704817cca94d169aed5e11deb0adbb + c131dc5cb7ce6f1aa5e8d5f86f2002c8ae1bb8f6 + + + + + datetime + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 2eda719a62fb7e1d3face62555046d938abddda9 + cfe3c330968a9a824c2cf933b227887d3e9615ac + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + e2270df5e0974bf471fdfe36e29bc9a8aa1774cb + 23041cb30875514136904ea11043c7ea1924f048 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 23b25e48c87be0e4f3952f7a8330594e9d511a4e + b6d5dc8745c0fa484ed6f14e90a42282ca1b285d + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 8bc627205b6e55931d09079fcd07bfacbbd38f41 + d244401ff7302bb5b75092016531952d093b238b + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + 35ae805d1da92afdb99b2fe8c536d1649356fccd + + + + + + + + +
+ + 5a836e654b7b7d19f102e87336fefa079d98a2e6 + 438 + 346 + Arial + 14 + 468 + 36 + + 128 + 128 + 192 + + + + test_data_child + 娴嬭瘯鏁版嵁瀛愯〃 + + + + + + + 869fc70cf3a4e92e8056b40814df8e03f9f9efde + 34477707bcf8a7810e12e9565aff085f6fb1e0ad + + + + + varchar(n) + + + false + false + true + true + false + + + + + + + + + + + false + false + false + + + 0 + + + + ae103dc1fb50094552e56afd72015481271913db + ec8a047dffe3cf2e4d95ba3e26c3bac0382d95c9 + + + + + integer + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + d829e707316a49d39e5a11da5f5d36030a856b86 + b095c44611ed08156277676d9a3a0ce52b9b05ef + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + ac02f2d1fff63fa66db583735eb1c8e9b466872f + 78715aa66a10a9b190ad69b8ed792e9a2f4946e3 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 2fed92437d28f1427e913aba1251fe0807c7b209 + 693f8af2fe6cf45255b6f2bc7e9077f3630c3dd8 + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 6697b12cf2f6d7135570c2a581212ee067c13206 + 04216c384533b70b8e86b571fa2beef7157bab5a + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 68b9381c1fb6668186fef70f52fc0c14b1bd6f1c + 0b6f63094be90aa8674460cce26be10327827ceb + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 791691b791efedc2d14867a152b4de58f4567326 + 363e8cfcf4a6b228e656decadacba29280906555 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + cdc46f802299958a2b3140200410caf5cbeb8a27 + 7875aa5fee3d6f9587180fb8fce9343a56cdc34e + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + a27ebfd109532e2f551b101a0c78b3f50a3d58dd + 61c49a2f7807c55c8f85110c30889d5b403e4b04 + + + + + datetime + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 95ec23c1b2704817cca94d169aed5e11deb0adbb + b91171b99f3628aadb0e6986fbfa30cc547b280e + + + + + datetime + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 2eda719a62fb7e1d3face62555046d938abddda9 + 9f33d190101e56f93f5ece0fd7c5cdda3e704b4c + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + e2270df5e0974bf471fdfe36e29bc9a8aa1774cb + 16121b5aa08fc170883408ec2d0487281a132d9d + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 23b25e48c87be0e4f3952f7a8330594e9d511a4e + 1afc7f146271f5c90ea811aa24c08ce25d12552e + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 8bc627205b6e55931d09079fcd07bfacbbd38f41 + 343f0db997b913f299b0496c4306d3617ad708de + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + + + + + + + +
+
+ + + 845c82ebd869d5620b1ef2c2b6f438b11a045082 + BaseEntity + + + 869fc70cf3a4e92e8056b40814df8e03f9f9efde + 02ecedc0de5850cba25bc91919ed39d414b74111 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + ba0fb53af3ccc8b0e5d73baa58ec27fbb7973097 + 2fe6a36385238c1b21c76deae00a7afa00ff5538 + + + + + character(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + + + ea920cba2fe0eaee64a2310ece7cda4b198b37ec + BaseEntityCorp + + + 136ca02f1b3a96a8f2e242d5dd64d48f566143ef + b8ea4b73d6d32a222e5abfd453287575ae518480 + + + + + varchar(n) + + 0 + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + f116706ac00cd3a3ee88b2a88debf7ebc3eeb12d + b94f5fe344185c40739cf93d1090686001bb11e0 + + + + + nvarchar(n) + + JeeSite + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + + + 35ae805d1da92afdb99b2fe8c536d1649356fccd + DataEntity + + + 17718c2364a2368c2072da279c927d7ad3bfcf08 + f0036584bd8711715579d21994a0105935605a7e + + + + + character(n) + + 0 + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 1a3b3f8bccfce8894d117d6bdb0a6b104bfb80ef + c391a15752a8eb58bc558a39d1b431f7ee125e0e + + + + + varchar(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + dba1aec0c72d79ea73ed4ebde07696cf4df174b7 + e2e82ba86e15fd67397355e711255b1625078ae1 + + + + + datetime + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 2c6b290f30c6f9e100f6c77eab0cba7bb3386768 + fd0546fc2d4e01c35dcbc23913add68a99fabd73 + + + + + varchar(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + f0bdbc4002f4a1b7fb7c5026bc21a7689c549728 + f8ea4fc4a778a0b94398a661a1ed8608f0e8d28d + + + + + datetime + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 8f7d3761c17a1b8632d186a3c67cb08dca18c498 + 69e01b6d4f42df40a09540ef4ba10ed8e006abaa + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + + + 85024a2953cf3e3c9c1cce49b2351853ab0d125b + DataEntityNoStatus + + + 1a3b3f8bccfce8894d117d6bdb0a6b104bfb80ef + e5355faba5ec3c9128507dd4c48ea9230631cf83 + + + + + varchar(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + dba1aec0c72d79ea73ed4ebde07696cf4df174b7 + 6bed374c39d181003a4f92d76d79a4119176ba0c + + + + + datetime + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 2c6b290f30c6f9e100f6c77eab0cba7bb3386768 + f9db19bb567760bbdd554d75bbfdc891c89f9da9 + + + + + varchar(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + f0bdbc4002f4a1b7fb7c5026bc21a7689c549728 + ee78b079f7d319bf8119fd01439cd97424ff49fa + + + + + datetime + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 8f7d3761c17a1b8632d186a3c67cb08dca18c498 + f7b88ecec0ef386bb384c228842a7587432112fb + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + + + 118dab95fc1f792cd468b9f66af2d4fabd98c39b + ExtendEntity + + + ad6f9eff50476669df62b7601cbc3a2e0c905d36 + 6ccadddab6ce48441ca7abd798cda6f3debf4a0c + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 3a24133d2be4831e99d1319983e5393bcf964ff9 + 93ab0ba3b47b01934614dbd3e572358c9f99e6ea + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 40e1afbbad28d28e371dd1ab77fb56640b1cb66b + a78c7961910a5e697027d1a3530b1afaa8ea8c94 + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + a2d6b5a494fc1a3d29360d922296521c6640856b + 40085364ec7a58653e96f8659aadd258d7556bc7 + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 29f701cc6a308fbfc5b12b80fee621ceeb231dcc + 9787d7fe93ee31c5b4979fd620ff6e4b2777eccf + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + c9a37a7b6a5451930ca63e36814767f742cd1393 + 95c55b81b7e9e1a9bb01aa3d88fb90c648641c4e + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 8c26203d310a4e602cf0c0fc8a7b2c818219c1dc + 16f44dfc7964796f109293bc49afd58dcb4eec1f + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 54448f19b0f5d1630bf29f9f99787802c36ebddb + 39b1dffa083f74afc30df621845cf7f0ed71394f + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + a1d747cd40768ac9f85176518ee48cb513bae110 + 7584cc6360ae7edc99e1f619042eba5865b2c4c7 + + + + + decimal(p) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + a9f0e14d6691c397990abe4ef1ff21674dccf401 + f0b5383e05c6b3f6e5f65b33b33009826c83d014 + + + + + decimal(p) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 2ce06c5cf87d93bb1e3f47268dbc679be4b6dd8d + 260d5f31009fff18000d1e64f4f877926e621306 + + + + + decimal(p) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 53d8c730fcec69d341f44089817ae06eb4844278 + a83144f40e7ae64e46a4b4ed651379774a953b17 + + + + + decimal(p) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 4c0cc4ae32f8774cc319f516784430204aef0bdb + 2a5203a275171a250870cf6cb224a910aa9354ec + + + + + decimal(p,s) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 2e958c528620621985af4394590198feed57cdf9 + 3ef5bd65a7dcd74b9a9d8a292ec395f66b7de32b + + + + + decimal(p,s) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 7c25ad75662553c7d4a58fa66eb50ca7c0ffee59 + 01d0849bdda56a8d8f24befdadc3fc9b007ae92b + + + + + decimal(p,s) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 1f81990c9694963f032c302d1834b972a6f2eb74 + 1c8ed63d72f40f0fe2f05815675771bdf3f824f8 + + + + + decimal(p,s) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + f01926071736b56b898949cc0720149c71504324 + 2b49e875138bfb329aaa352629650b7881435123 + + + + + datetime + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 942700093ab61c3be0bdf6b23bcba210bcc30281 + 5c6ec16226d85b0411b7077cb9a6e0c7aa8d74d1 + + + + + datetime + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + f221902bf89fe94dece8ccf309f59cc2c479d63f + d92b8f7fa7a2be49c7f00c447a603b136e84261d + + + + + datetime + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + c8d21e24bc69aac295703b0bae56269035b729f0 + 095a76f07a3cd2bdc6cc442757c11012e1974f4a + + + + + datetime + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 80cd53da9d5a1b19676537e590e20fa2793e902c + 42c5d8f490f69b93e77698efa030ca23988ae696 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + + + a535b6c506004a7fdf4d48984c9ff2cfa59c157a + TreeEntity + + + b18ce64a2a72d00b26515583d8bbfea282f30ea8 + 394369b90c0a5b6efeed3cf823c642605d7a1653 + + + + + varchar(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 5887f9db78a9ebc7b23b9a163c6f68100257c0e5 + e8d877396943acfec73023dba2c1c6e3d7802d62 + + + + + varchar(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 16c9c333062ea3614d2e044803b872676c8a5377 + 23f973124aedd0244533f4e7b3b103c548b966be + + + + + decimal(p) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + a886757c87fb1e04c5f84b6a802e129baaec2ca6 + 984d5eac2b3221118a61655e4a5a49c78e0f0151 + + + + + varchar(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 40b63ab3e485fd55370d6d04b063c4397483ebc1 + b2f246a3f0ade317eaa9915e2fd539abae5a5ec8 + + + + + character(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 3b9c3307b7140f27edeb47ffe307a662b2856627 + f5a9968479420f08da2e98d21136b3ed4b6e396f + + + + + decimal(p) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + bf5e60dee567b3ed0f12e8f3ffa1f74e43012b3a + 618194ebfc8c6c42efcef3a4af0b8054f6af209b + + + + + varchar(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/modules/erp/pom.xml b/modules/erp/pom.xml new file mode 100644 index 00000000..f3a9856f --- /dev/null +++ b/modules/erp/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + + com.jeesite + jeesite-parent + 5.14.0.springboot3-SNAPSHOT + ../../parent/pom.xml + + + jeesite-module-erp + jar + + JeeSite Module 璐㈠姟绠$悊 + http://jeesite.com + 2013-Now + + + + + + com.jeesite + jeesite-module-core + ${project.parent.version} + + + + + + + thinkgem + WangZhen + thinkgem at 163.com + Project lead + +8 + + + + + JeeSite + http://jeesite.com + + + \ No newline at end of file diff --git a/modules/erp/src/main/resources/application-assistant.yml b/modules/erp/src/main/resources/application-assistant.yml new file mode 100644 index 00000000..3cb6c771 --- /dev/null +++ b/modules/erp/src/main/resources/application-assistant.yml @@ -0,0 +1,12 @@ + +## 閲嶈鎻愮ず锛圱ip锛夛細 + +## 璇峰嬁鍦ㄨ閰嶇疆鏂囦欢涓坊鍔犲叾瀹冧换浣曢厤缃紙娣诲姞涔熶笉浼氱敓鏁堬級銆 +## 璇ユ枃浠讹紝浠呬粎鏄负浜嗚 jeesite-erp.yml 鏂囦欢锛 +## 鍦 IDEA 涓湁涓涓嚜鍔ㄥ畬鎴愬強甯姪鎻愮ず锛屽苟鏃犲叾瀹冪敤鎰忋 +## 鍙傛暟閰嶇疆璇峰湪 jeesite-bpm.yml 鏂囦欢涓坊鍔犮 + +spring: + config: + import: + - classpath:config/jeesite-erp.yml \ No newline at end of file diff --git a/modules/erp/src/main/resources/config/jeesite-erp.yml b/modules/erp/src/main/resources/config/jeesite-erp.yml new file mode 100644 index 00000000..353bfe2d --- /dev/null +++ b/modules/erp/src/main/resources/config/jeesite-erp.yml @@ -0,0 +1,4 @@ +# 娓╅Θ鎻愮ず锛氫笉寤鸿鐩存帴淇敼姝ゆ枃浠讹紝涓轰簡骞冲彴鍗囩骇鏂逛究锛屽缓璁皢闇瑕佷慨鏀圭殑鍙傛暟鍊硷紝澶嶅埗鍒癮pplication.yml閲岃繘琛岃鐩栬鍙傛暟鍊笺 + +#erp: +# enabled: true \ No newline at end of file diff --git a/modules/erp/src/main/resources/db/upgrade/erp/versions b/modules/erp/src/main/resources/db/upgrade/erp/versions new file mode 100644 index 00000000..5d4f567e --- /dev/null +++ b/modules/erp/src/main/resources/db/upgrade/erp/versions @@ -0,0 +1 @@ +5.14.0 \ No newline at end of file diff --git a/modules/pom.xml b/modules/pom.xml index 66bd71ec..5ac42408 100644 --- a/modules/pom.xml +++ b/modules/pom.xml @@ -1,40 +1,43 @@ - 4.0.0 - - com.jeesite - jeesite-modules - 5.14.0.springboot3-SNAPSHOT - pom - - JeeSite Modules - http://jeesite.com - 2013-Now - - - ai - app - cms - core - static - test - biz - - - - - thinkgem - WangZhen - thinkgem at 163.com - Project lead - +8 - - - - - JeeSite - http://jeesite.com - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + com.jeesite + jeesite-modules + 5.14.0.springboot3-SNAPSHOT + pom + + JeeSite Modules + http://jeesite.com + 2013-Now + + + ai + app + cms + core + static + test + biz + erp + + + + + thinkgem + WangZhen + thinkgem at 163.com + + Project lead + + +8 + + + + + JeeSite + http://jeesite.com + + diff --git a/web-api/pom.xml b/web-api/pom.xml index 620f7565..19d1af86 100644 --- a/web-api/pom.xml +++ b/web-api/pom.xml @@ -1,167 +1,154 @@ - 4.0.0 - - - com.jeesite - jeesite-parent - 5.14.0.springboot3-SNAPSHOT - ../parent/pom.xml - - - jeesite-web-api - war - - 涓撲负鍒嗙绔彁渚涙帴鍙f湇鍔★紝鍏抽棴鍐呯疆鐧诲綍椤靛拰涓绘鏋堕〉瑙嗗浘 - - JeeSite Web Api - http://jeesite.com - 2013-Now - - - - web - com.jeesite.modules.ApiApplication + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - - 8980:8980 - - + + com.jeesite + jeesite-parent + 5.14.0.springboot3-SNAPSHOT + ../parent/pom.xml + - - - - - com.jeesite - jeesite-module-core - ${project.parent.version} - + jeesite-web-api + jar - - - com.jeesite - jeesite-module-test - ${project.parent.version} - + 涓撲负鍒嗙绔彁渚涙帴鍙f湇鍔★紝鍏抽棴鍐呯疆鐧诲綍椤靛拰涓绘鏋堕〉瑙嗗浘 - - - com.jeesite - jeesite-module-swagger - ${project.parent.version} - + JeeSite Web Api + http://jeesite.com + 2013-Now - - - com.jeesite - jeesite-module-cms - ${project.parent.version} - + - - - com.jeesite - jeesite-module-app - ${project.parent.version} - - - - - + web + com.jeesite.modules.ApiApplication - + + 8980:8980 - - - - ${finalName} - - - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - + + + + + + + com.jeesite + jeesite-module-core + ${project.parent.version} + + + + + com.jeesite + jeesite-module-test + ${project.parent.version} + + + + + com.jeesite + jeesite-module-swagger + ${project.parent.version} + + + + + com.jeesite + jeesite-module-cms + ${project.parent.version} + + + + + com.jeesite + jeesite-module-app + ${project.parent.version} + + + + + + bizWorker + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + org.apache.maven.plugins + maven-war-plugin + + ${finalName} + + + + + + org.apache.maven.plugins + maven-eclipse-plugin + + ${finalName} + + + + + + + + + thinkgem + WangZhen + thinkgem at 163.com + + Project lead + + +8 + + + + + JeeSite + http://jeesite.com + + + + + aliyun-repos + https://maven.aliyun.com/repository/public + + true + + + false + + + + jeesite-repos + https://maven.jeesite.net/repository/maven-public + + + + + aliyun-repos + https://maven.aliyun.com/repository/public + + true + + + false + + + + jeesite-repos + https://maven.jeesite.net/repository/maven-public + + - - - org.apache.maven.plugins - maven-war-plugin - - ${finalName} - - - - - - org.apache.maven.plugins - maven-eclipse-plugin - - ${finalName} - - - - - - - - - thinkgem - WangZhen - thinkgem at 163.com - Project lead - +8 - - - - - JeeSite - http://jeesite.com - - - - - aliyun-repos - https://maven.aliyun.com/repository/public - true - false - - - jeesite-repos - https://maven.jeesite.net/repository/maven-public - - - - - aliyun-repos - https://maven.aliyun.com/repository/public - true - false - - - jeesite-repos - https://maven.jeesite.net/repository/maven-public - - - diff --git a/web-api/src/main/java/com/jeesite/modules/ApiApplication.java b/web-api/src/main/java/com/jeesite/modules/ApiApplication.java index 60bec9a3..d0cf5073 100644 --- a/web-api/src/main/java/com/jeesite/modules/ApiApplication.java +++ b/web-api/src/main/java/com/jeesite/modules/ApiApplication.java @@ -4,6 +4,9 @@ */ package com.jeesite.modules; +import com.jeesite.common.config.Global; +import com.jeesite.common.io.FileUtils; +import com.jeesite.modules.utils.IpUtils; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; @@ -11,19 +14,20 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer /** * Application + * * @author ThinkGem */ @SpringBootApplication public class ApiApplication extends SpringBootServletInitializer { - - public static void main(String[] args) { - SpringApplication.run(ApiApplication.class, args); - } - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { - this.setRegisterErrorPageFilter(false); - return builder.sources(ApiApplication.class); - } - + + public static void main(String[] args) { + SpringApplication.run(ApiApplication.class, args); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + this.setRegisterErrorPageFilter(false); + return builder.sources(ApiApplication.class); + } + } \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizCities.java b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizCities.java index 2523ac88..876cb815 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizCities.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizCities.java @@ -48,7 +48,7 @@ import java.io.Serial; columns = { @Column(name = "province_name", attrName = "provinceName", label = "鐪佷唤鍚嶇О"), }), -}, orderBy = "a.id DESC" +}, orderBy = "a.create_time DESC" ) @Data public class BizCities extends DataEntity implements Serializable { diff --git a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizListItem.java b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizListItem.java index b11ca930..5493cfca 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizListItem.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizListItem.java @@ -2,9 +2,12 @@ package com.jeesite.modules.biz.entity; import java.io.Serializable; import java.util.Date; + import com.jeesite.common.mybatis.annotation.JoinTable; import com.jeesite.common.mybatis.annotation.JoinTable.Type; import com.fasterxml.jackson.annotation.JsonFormat; +import com.jeesite.modules.sys.entity.User; +import com.jeesite.modules.sys.utils.UserUtils; import jakarta.validation.constraints.Size; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -23,88 +26,94 @@ import java.io.Serial; /** * 閫氱煡鍒楄〃椤硅〃Entity + * * @author gaoxq * @version 2025-11-26 */ @EqualsAndHashCode(callSuper = true) -@Table(name="biz_list_item", alias="a", label="閫氱煡鍒楄〃椤硅〃淇℃伅", columns={ - @Column(name="create_time", attrName="createTime", label="鍒涘缓鏃堕棿", isUpdate=false, isUpdateForce=true), - @Column(name="id", attrName="id", label="鍞竴鏍囪瘑", isPK=true), - @Column(name="avatar", attrName="avatar", label="澶村儚鍥炬爣", isQuery=false), - @Column(name="title", attrName="title", label="閫氱煡鏍囬", queryType=QueryType.LIKE), - @Column(name="title_delete", attrName="titleDelete", label="鏄惁鍒犻櫎", isQuery=false), - @Column(name="datetime", attrName="datetime", label="鍙戦佹椂闂", isQuery=false), - @Column(name="type", attrName="type", label="绫诲瀷鏍囪瘑"), - @Column(name="read_flag", attrName="readFlag", label="鏄惁宸茶"), - @Column(name="description", attrName="description", label="鎻忚堪淇℃伅", isQuery=false), - @Column(name="click_close", attrName="clickClose", label="鏄惁鍏抽棴"), - @Column(name="extra", attrName="extra", label="寰呭姙鐘舵"), - @Column(name="color", attrName="color", label="棰滆壊鍊", isQuery=false), - @Column(name="update_time", attrName="updateTime", label="鏇存柊鏃堕棿", isQuery=false), - @Column(name="f_tenant_id", attrName="ftenantId", label="绉熸埛id", isUpdate=false, isQuery=false), - @Column(name="f_flow_id", attrName="fflowId", label="娴佺▼id", isUpdate=false, isQuery=false), - @Column(name="f_flow_task_id", attrName="fflowTaskId", label="娴佺▼浠诲姟涓婚敭", isUpdate=false, isQuery=false), - @Column(name="f_flow_state", attrName="fflowState", label="娴佺▼浠诲姟鐘舵", isUpdate=false, isQuery=false, isUpdateForce=true), - }, orderBy="a.create_time DESC" +@Table(name = "biz_list_item", alias = "a", label = "閫氱煡鍒楄〃椤硅〃淇℃伅", columns = { + @Column(name = "create_time", attrName = "createTime", label = "鍒涘缓鏃堕棿", isUpdate = false, isUpdateForce = true), + @Column(name = "id", attrName = "id", label = "鍞竴鏍囪瘑", isPK = true), + @Column(name = "avatar", attrName = "avatar", label = "澶村儚鍥炬爣", isUpdate = false, isUpdateForce = true), + @Column(name = "title", attrName = "title", label = "閫氱煡鏍囬", queryType = QueryType.LIKE), + @Column(name = "title_delete", attrName = "titleDelete", label = "鏄惁鍒犻櫎", isQuery = false), + @Column(name = "datetime", attrName = "datetime", label = "鍙戦佹椂闂", isQuery = false), + @Column(name = "type", attrName = "type", label = "绫诲瀷鏍囪瘑"), + @Column(name = "read_flag", attrName = "readFlag", label = "鏄惁宸茶"), + @Column(name = "description", attrName = "description", label = "鎻忚堪淇℃伅", isQuery = false), + @Column(name = "click_close", attrName = "clickClose", label = "鏄惁鍏抽棴"), + @Column(name = "extra", attrName = "extra", label = "寰呭姙鐘舵"), + @Column(name = "color", attrName = "color", label = "棰滆壊鍊", isQuery = false), + @Column(name = "update_time", attrName = "updateTime", label = "鏇存柊鏃堕棿", isQuery = false), + @Column(name = "login_user", attrName = "loginUser", label = "鎺ユ敹鐢ㄦ埛"), + @Column(name = "user_name", attrName = "userName", label = "鎺ユ敹鐢ㄦ埛"), + @Column(name = "create_user", attrName = "createUser", label = "鍒涘缓鐢ㄦ埛", isUpdate = false, isUpdateForce = true), + @Column(name = "f_tenant_id", attrName = "ftenantId", label = "绉熸埛id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_id", attrName = "fflowId", label = "娴佺▼id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_task_id", attrName = "fflowTaskId", label = "娴佺▼浠诲姟涓婚敭", isUpdate = false, isQuery = false), + @Column(name = "f_flow_state", attrName = "fflowState", label = "娴佺▼浠诲姟鐘舵", isUpdate = false, isQuery = false, isUpdateForce = true), +}, orderBy = "a.create_time DESC" ) @Data public class BizListItem extends DataEntity implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - private Date createTime; // 鍒涘缓鏃堕棿 - private String avatar; // 澶村儚鍥炬爣 - private String title; // 閫氱煡鏍囬 - private boolean titleDelete; // 鏄惁鍒犻櫎 - private String datetime; // 鍙戦佹椂闂 - private String type; // 绫诲瀷鏍囪瘑 - private boolean readFlag; // 鏄惁宸茶 - private String description; // 鎻忚堪淇℃伅 - private boolean clickClose; // 鏄惁鍏抽棴 - private String extra; // 寰呭姙鐘舵 - private String color; // 棰滆壊鍊 - private Date updateTime; // 鏇存柊鏃堕棿 - private String ftenantId; // 绉熸埛id - private String fflowId; // 娴佺▼id - private String fflowTaskId; // 娴佺▼浠诲姟涓婚敭 - private Integer fflowState; // 娴佺▼浠诲姟鐘舵 - @ExcelFields({ - @ExcelField(title="鍒涘缓鏃堕棿", attrName="createTime", align=Align.CENTER, sort=10, dataFormat="yyyy-MM-dd hh:mm"), - @ExcelField(title="鍞竴鏍囪瘑", attrName="id", align=Align.CENTER, sort=20), - @ExcelField(title="澶村儚鍥炬爣", attrName="avatar", align=Align.CENTER, sort=30), - @ExcelField(title="閫氱煡鏍囬", attrName="title", align=Align.CENTER, sort=40), - @ExcelField(title="鏄惁鍒犻櫎", attrName="titleDelete", align=Align.CENTER, sort=50), - @ExcelField(title="鍙戦佹椂闂", attrName="datetime", align=Align.CENTER, sort=60, dataFormat="yyyy-MM-dd"), - @ExcelField(title="绫诲瀷鏍囪瘑", attrName="type", align=Align.CENTER, sort=70), - @ExcelField(title="鏄惁宸茶", attrName="readFlag", align=Align.CENTER, sort=80), - @ExcelField(title="鎻忚堪淇℃伅", attrName="description", align=Align.CENTER, sort=90), - @ExcelField(title="鏄惁鍏抽棴", attrName="clickClose", align=Align.CENTER, sort=100), - @ExcelField(title="寰呭姙鐘舵", attrName="extra", align=Align.CENTER, sort=110), - @ExcelField(title="棰滆壊鍊", attrName="color", align=Align.CENTER, sort=120), - }) - public BizListItem() { - this(null); - } - - public BizListItem(String id){ - super(id); - } - - public Date getCreateTime_gte() { - return sqlMap.getWhere().getValue("create_time", QueryType.GTE); - } + @Serial + private static final long serialVersionUID = 1L; + private Date createTime; // 鍒涘缓鏃堕棿 + private String avatar; // 澶村儚鍥炬爣 + private String title; // 閫氱煡鏍囬 + private Boolean titleDelete; // 鏄惁鍒犻櫎 + private String datetime; // 鍙戦佹椂闂 + private String type; // 绫诲瀷鏍囪瘑 + private Boolean readFlag; // 鏄惁宸茶 + private String description; // 鎻忚堪淇℃伅 + private Boolean clickClose; // 鏄惁鍏抽棴 + private String extra; // 寰呭姙鐘舵 + private String color; // 棰滆壊鍊 + private Date updateTime; // 鏇存柊鏃堕棿 + private String loginUser; + private String userName; + private String createUser; + private String ftenantId; // 绉熸埛id + private String fflowId; // 娴佺▼id + private String fflowTaskId; // 娴佺▼浠诲姟涓婚敭 + private Integer fflowState; // 娴佺▼浠诲姟鐘舵 - public void setCreateTime_gte(Date createTime) { - sqlMap.getWhere().and("create_time", QueryType.GTE, createTime); - } - - public Date getCreateTime_lte() { - return sqlMap.getWhere().getValue("create_time", QueryType.LTE); - } + @ExcelFields({ + @ExcelField(title = "鍒涘缓鏃堕棿", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "鍞竴鏍囪瘑", attrName = "id", align = Align.CENTER, sort = 20), + @ExcelField(title = "澶村儚鍥炬爣", attrName = "avatar", align = Align.CENTER, sort = 30), + @ExcelField(title = "閫氱煡鏍囬", attrName = "title", align = Align.CENTER, sort = 40), + @ExcelField(title = "鏄惁鍒犻櫎", attrName = "titleDelete", align = Align.CENTER, sort = 50), + @ExcelField(title = "鍙戦佹椂闂", attrName = "datetime", align = Align.CENTER, sort = 60, dataFormat = "yyyy-MM-dd"), + @ExcelField(title = "绫诲瀷鏍囪瘑", attrName = "type", align = Align.CENTER, sort = 70), + @ExcelField(title = "鏄惁宸茶", attrName = "readFlag", align = Align.CENTER, sort = 80), + @ExcelField(title = "鎻忚堪淇℃伅", attrName = "description", align = Align.CENTER, sort = 90), + @ExcelField(title = "鏄惁鍏抽棴", attrName = "clickClose", align = Align.CENTER, sort = 100), + @ExcelField(title = "寰呭姙鐘舵", attrName = "extra", align = Align.CENTER, sort = 110), + }) + public BizListItem() { + this(null); + } + + public BizListItem(String id) { + super(id); + } + + public Date getCreateTime_gte() { + return sqlMap.getWhere().getValue("create_time", QueryType.GTE); + } + + public void setCreateTime_gte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.GTE, createTime); + } + + public Date getCreateTime_lte() { + return sqlMap.getWhere().getValue("create_time", QueryType.LTE); + } + + public void setCreateTime_lte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.LTE, createTime); + } - public void setCreateTime_lte(Date createTime) { - sqlMap.getWhere().and("create_time", QueryType.LTE, createTime); - } - } \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizProjectRequirements.java b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizProjectRequirements.java index 4bafd85e..b4b3f012 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizProjectRequirements.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizProjectRequirements.java @@ -2,6 +2,7 @@ package com.jeesite.modules.biz.entity; import java.io.Serializable; import java.util.Date; + import com.jeesite.common.mybatis.annotation.JoinTable; import com.jeesite.common.mybatis.annotation.JoinTable.Type; import com.fasterxml.jackson.annotation.JsonFormat; @@ -22,93 +23,121 @@ import java.io.Serial; /** * 闇姹備俊鎭疎ntity + * * @author gaoxq * @version 2025-11-27 */ @EqualsAndHashCode(callSuper = true) -@Table(name="biz_project_requirements", alias="a", label="闇姹備俊鎭俊鎭", columns={ - @Column(name="create_time", attrName="createTime", label="璁板綍鏃ユ湡", isUpdate=false, isUpdateForce=true), - @Column(name="requirement_id", attrName="requirementId", label="闇姹傛爣璇", isPK=true), - @Column(name="requirement_name", attrName="requirementName", label="闇姹傚悕绉", queryType=QueryType.LIKE), - @Column(name="requirement_code", attrName="requirementCode", label="闇姹傜紪鍙"), - @Column(name="area_code", attrName="areaCode", label="椤圭洰鍖哄煙"), - @Column(name="requirement_description", attrName="requirementDescription", label="闇姹傛弿杩"), - @Column(name="start_time", attrName="startTime", label="寮濮嬫椂闂", isQuery=false, isUpdateForce=true), - @Column(name="end_time", attrName="endTime", label="缁撴潫鏃堕棿", isQuery=false, isUpdateForce=true), - @Column(name="priority", attrName="priority", label="浼樺厛绾"), - @Column(name="update_time", attrName="updateTime", label="鏇存柊鏃堕棿", isQuery=false, isUpdateForce=true), - @Column(name="project_id", attrName="projectId", label="椤圭洰ID"), - @Column(name="employee_id", attrName="employeeId", label="鐢ㄦ埛ID"), - @Column(name="remark", attrName="remark", label="闇姹傚娉"), - @Column(name="requirements_status", attrName="requirementsStatus", label="鐘舵"), - @Column(name="f_tenant_id", attrName="ftenantId", label="绉熸埛id", isUpdate=false, isQuery=false), - @Column(name="f_flow_id", attrName="fflowId", label="娴佺▼id", isUpdate=false, isQuery=false), - @Column(name="f_flow_task_id", attrName="fflowTaskId", label="娴佺▼浠诲姟涓婚敭", isUpdate=false, isQuery=false), - @Column(name="f_flow_state", attrName="fflowState", label="娴佺▼浠诲姟鐘舵", isUpdate=false, isQuery=false, isUpdateForce=true), - }, orderBy="a.create_time DESC" +@Table(name = "biz_project_requirements", alias = "a", label = "闇姹備俊鎭俊鎭", columns = { + @Column(name = "create_time", attrName = "createTime", label = "璁板綍鏃ユ湡", isUpdate = false, isUpdateForce = true), + @Column(name = "requirement_id", attrName = "requirementId", label = "闇姹傛爣璇", isPK = true), + @Column(name = "requirement_name", attrName = "requirementName", label = "闇姹傚悕绉", queryType = QueryType.LIKE), + @Column(name = "requirement_code", attrName = "requirementCode", label = "闇姹傜紪鍙"), + @Column(name = "area_code", attrName = "areaCode", label = "椤圭洰鍖哄煙"), + @Column(name = "requirement_description", attrName = "requirementDescription", label = "闇姹傛弿杩"), + @Column(name = "start_time", attrName = "startTime", label = "寮濮嬫椂闂", isQuery = false, isUpdateForce = true), + @Column(name = "end_time", attrName = "endTime", label = "缁撴潫鏃堕棿", isQuery = false, isUpdateForce = true), + @Column(name = "priority", attrName = "priority", label = "浼樺厛绾"), + @Column(name = "update_time", attrName = "updateTime", label = "鏇存柊鏃堕棿", isQuery = false, isUpdateForce = true), + @Column(name = "project_id", attrName = "projectId", label = "椤圭洰ID"), + @Column(name = "employee_id", attrName = "employeeId", label = "鐢ㄦ埛ID"), + @Column(name = "remark", attrName = "remark", label = "闇姹傚娉"), + @Column(name = "requirements_status", attrName = "requirementsStatus", label = "鐘舵"), + @Column(name = "f_tenant_id", attrName = "ftenantId", label = "绉熸埛id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_id", attrName = "fflowId", label = "娴佺▼id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_task_id", attrName = "fflowTaskId", label = "娴佺▼浠诲姟涓婚敭", isUpdate = false, isQuery = false), + @Column(name = "f_flow_state", attrName = "fflowState", label = "娴佺▼浠诲姟鐘舵", isUpdate = false, isQuery = false, isUpdateForce = true), +}, joinTable = { + @JoinTable(type = Type.LEFT_JOIN, entity = BizResumeEmployee.class, attrName = "this", alias = "b", + on = "a.employee_id = b.employee_id", + columns = { + @Column(name = "employee_name", attrName = "employeeName", label = "鍛樺伐濮撳悕"), + @Column(name = "employee_code", attrName = "employeeCode", label = "鍛樺伐缂栧彿"), + }), + @JoinTable(type = Type.LEFT_JOIN, entity = BizProjectInfo.class, attrName = "this", alias = "c", + on = "a.project_id = c.project_id", + columns = { + @Column(name = "project_code", attrName = "projectCode", label = "椤圭洰缂栫爜"), + @Column(name = "project_name", attrName = "projectName", label = "椤圭洰鍚嶇О"), + }), + @JoinTable(type = Type.LEFT_JOIN, entity = BizProvince.class, attrName = "this", alias = "d", + on = "a.area_code = d.province_code", + columns = { + @Column(name = "province_name", attrName = "provinceName", label = "鐪佷唤鍚嶇О"), + }), +}, orderBy = "a.create_time DESC" ) @Data public class BizProjectRequirements extends DataEntity implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - private Date createTime; // 璁板綍鏃ユ湡 - private String requirementId; // 闇姹傛爣璇 - private String requirementName; // 闇姹傚悕绉 - private String requirementCode; // 闇姹傜紪鍙 - private String areaCode; // 椤圭洰鍖哄煙 - private String requirementDescription; // 闇姹傛弿杩 - private Date startTime; // 寮濮嬫椂闂 - private Date endTime; // 缁撴潫鏃堕棿 - private String priority; // 浼樺厛绾 - private Date updateTime; // 鏇存柊鏃堕棿 - private String projectId; // 椤圭洰ID - private String employeeId; // 鐢ㄦ埛ID - private String remark; // 闇姹傚娉 - private String requirementsStatus; // 鐘舵 - private String ftenantId; // 绉熸埛id - private String fflowId; // 娴佺▼id - private String fflowTaskId; // 娴佺▼浠诲姟涓婚敭 - private Integer fflowState; // 娴佺▼浠诲姟鐘舵 - @ExcelFields({ - @ExcelField(title="璁板綍鏃ユ湡", attrName="createTime", align=Align.CENTER, sort=10, dataFormat="yyyy-MM-dd hh:mm"), - @ExcelField(title="闇姹傛爣璇", attrName="requirementId", align=Align.CENTER, sort=20), - @ExcelField(title="闇姹傚悕绉", attrName="requirementName", align=Align.CENTER, sort=30), - @ExcelField(title="闇姹傜紪鍙", attrName="requirementCode", align=Align.CENTER, sort=40), - @ExcelField(title="椤圭洰鍖哄煙", attrName="areaCode", align=Align.CENTER, sort=50), - @ExcelField(title="闇姹傛弿杩", attrName="requirementDescription", align=Align.CENTER, sort=60), - @ExcelField(title="寮濮嬫椂闂", attrName="startTime", align=Align.CENTER, sort=70, dataFormat="yyyy-MM-dd hh:mm"), - @ExcelField(title="缁撴潫鏃堕棿", attrName="endTime", align=Align.CENTER, sort=80, dataFormat="yyyy-MM-dd hh:mm"), - @ExcelField(title="浼樺厛绾", attrName="priority", align=Align.CENTER, sort=90), - @ExcelField(title="鏇存柊鏃堕棿", attrName="updateTime", align=Align.CENTER, sort=100, dataFormat="yyyy-MM-dd hh:mm"), - @ExcelField(title="椤圭洰ID", attrName="projectId", align=Align.CENTER, sort=110), - @ExcelField(title="鐢ㄦ埛ID", attrName="employeeId", align=Align.CENTER, sort=120), - @ExcelField(title="闇姹傚娉", attrName="remark", align=Align.CENTER, sort=130), - @ExcelField(title="鐘舵", attrName="requirementsStatus", align=Align.CENTER, sort=140), - }) - public BizProjectRequirements() { - this(null); - } - - public BizProjectRequirements(String id){ - super(id); - } - - public Date getCreateTime_gte() { - return sqlMap.getWhere().getValue("create_time", QueryType.GTE); - } + @Serial + private static final long serialVersionUID = 1L; + private Date createTime; // 璁板綍鏃ユ湡 + private String requirementId; // 闇姹傛爣璇 + private String requirementName; // 闇姹傚悕绉 + private String requirementCode; // 闇姹傜紪鍙 + private String areaCode; // 椤圭洰鍖哄煙 + private String requirementDescription; // 闇姹傛弿杩 + private Date startTime; // 寮濮嬫椂闂 + private Date endTime; // 缁撴潫鏃堕棿 + private String priority; // 浼樺厛绾 + private Date updateTime; // 鏇存柊鏃堕棿 + private String projectId; // 椤圭洰ID + private String employeeId; // 鐢ㄦ埛ID + private String remark; // 闇姹傚娉 + private String requirementsStatus; // 鐘舵 + private String ftenantId; // 绉熸埛id + private String fflowId; // 娴佺▼id + private String fflowTaskId; // 娴佺▼浠诲姟涓婚敭 + private Integer fflowState; // 娴佺▼浠诲姟鐘舵 - public void setCreateTime_gte(Date createTime) { - sqlMap.getWhere().and("create_time", QueryType.GTE, createTime); - } - - public Date getCreateTime_lte() { - return sqlMap.getWhere().getValue("create_time", QueryType.LTE); - } + private String employeeName; + private String employeeCode; + private String projectCode; + private String projectName; + + private String provinceName; + + @ExcelFields({ + @ExcelField(title = "璁板綍鏃ユ湡", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "闇姹傛爣璇", attrName = "requirementId", align = Align.CENTER, sort = 20), + @ExcelField(title = "闇姹傚悕绉", attrName = "requirementName", align = Align.CENTER, sort = 30), + @ExcelField(title = "闇姹傜紪鍙", attrName = "requirementCode", align = Align.CENTER, sort = 40), + @ExcelField(title = "鍖哄煙缂栫爜", attrName = "areaCode", align = Align.CENTER, sort = 50), + @ExcelField(title = "鍖哄煙鍚嶇О", attrName = "provinceName", align = Align.CENTER, sort = 50), + @ExcelField(title = "闇姹傛弿杩", attrName = "requirementDescription", align = Align.CENTER, sort = 60), + @ExcelField(title = "寮濮嬫椂闂", attrName = "startTime", align = Align.CENTER, sort = 70, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "缁撴潫鏃堕棿", attrName = "endTime", align = Align.CENTER, sort = 80, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "浼樺厛绛夌骇", attrName = "priority", dictType = "priority", align = Align.CENTER, sort = 90), + @ExcelField(title = "鏇存柊鏃堕棿", attrName = "updateTime", align = Align.CENTER, sort = 100, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "椤圭洰缂栧彿", attrName = "projectCode", align = Align.CENTER, sort = 110), + @ExcelField(title = "椤圭洰鍚嶇О", attrName = "projectName", align = Align.CENTER, sort = 110), + @ExcelField(title = "闇姹傜敤鎴", attrName = "employeeName", align = Align.CENTER, sort = 120), + @ExcelField(title = "闇姹傚娉", attrName = "remark", align = Align.CENTER, sort = 130), + @ExcelField(title = "鐘舵", attrName = "requirementsStatus", dictType = "requirements_status", align = Align.CENTER, sort = 140), + }) + public BizProjectRequirements() { + this(null); + } + + public BizProjectRequirements(String id) { + super(id); + } + + public Date getCreateTime_gte() { + return sqlMap.getWhere().getValue("create_time", QueryType.GTE); + } + + public void setCreateTime_gte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.GTE, createTime); + } + + public Date getCreateTime_lte() { + return sqlMap.getWhere().getValue("create_time", QueryType.LTE); + } + + public void setCreateTime_lte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.LTE, createTime); + } - public void setCreateTime_lte(Date createTime) { - sqlMap.getWhere().and("create_time", QueryType.LTE, createTime); - } - } \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/biz/web/BizListItemController.java b/web-api/src/main/java/com/jeesite/modules/biz/web/BizListItemController.java index 6ba6011c..fdfc410c 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/web/BizListItemController.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/web/BizListItemController.java @@ -3,13 +3,18 @@ package com.jeesite.modules.biz.web; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import com.jeesite.modules.dao.TabItem; import com.jeesite.modules.dict.NotifyType; +import com.jeesite.modules.sys.entity.User; +import com.jeesite.modules.sys.utils.UserUtils; +import com.jeesite.modules.utils.IpUtils; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.apache.poi.ss.formula.atp.Switch; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -71,6 +76,8 @@ public class BizListItemController extends BaseController { @RequestMapping(value = "listData") @ResponseBody public Page listData(BizListItem bizListItem, HttpServletRequest request, HttpServletResponse response) { + User user = UserUtils.getUser(); + bizListItem.setCreateUser(user.getUserCode()); bizListItem.setPage(new Page<>(request, response)); Page page = bizListItemService.findPage(bizListItem); return page; @@ -93,8 +100,13 @@ public class BizListItemController extends BaseController { @PostMapping(value = "save") @ResponseBody public String save(@Validated BizListItem bizListItem) { + User user = UserUtils.getUser(); + User loginUser = UserUtils.getByLoginCode(bizListItem.getLoginUser()); + bizListItem.setUserName(loginUser.getUserName()); + bizListItem.setCreateUser(user.getLoginCode()); + bizListItem.setAvatar(IpUtils.getServerHttp() + user.getAvatar()); bizListItemService.save(bizListItem); - return renderResult(Global.TRUE, text("淇濆瓨閫氱煡鍒楄〃椤硅〃鎴愬姛锛")); + return renderResult(Global.TRUE, text("淇濆瓨閫氱煡鍒楄〃椤规垚鍔燂紒")); } /** @@ -103,9 +115,11 @@ public class BizListItemController extends BaseController { @RequiresPermissions("biz:listItem:view") @RequestMapping(value = "exportData") public void exportData(BizListItem bizListItem, HttpServletResponse response) { + User user = UserUtils.getUser(); + bizListItem.setCreateUser(user.getLoginCode()); List list = bizListItemService.findList(bizListItem); String fileName = "閫氱煡鍒楄〃椤硅〃" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; - try (ExcelExport ee = new ExcelExport("閫氱煡鍒楄〃椤硅〃", BizListItem.class)) { + try (ExcelExport ee = new ExcelExport("閫氱煡鍒楄〃椤", BizListItem.class)) { ee.setDataList(list).write(response, fileName); } } @@ -119,7 +133,7 @@ public class BizListItemController extends BaseController { BizListItem bizListItem = new BizListItem(); List list = ListUtils.newArrayList(bizListItem); String fileName = "閫氱煡鍒楄〃椤硅〃妯℃澘.xlsx"; - try (ExcelExport ee = new ExcelExport("閫氱煡鍒楄〃椤硅〃", BizListItem.class, Type.IMPORT)) { + try (ExcelExport ee = new ExcelExport("閫氱煡鍒楄〃椤", BizListItem.class, Type.IMPORT)) { ee.setDataList(list).write(response, fileName); } } @@ -147,17 +161,43 @@ public class BizListItemController extends BaseController { @ResponseBody public String delete(BizListItem bizListItem) { bizListItemService.delete(bizListItem); - return renderResult(Global.TRUE, text("鍒犻櫎閫氱煡鍒楄〃椤硅〃鎴愬姛锛")); + return renderResult(Global.TRUE, text("鍒犻櫎閫氱煡鍒楄〃椤规垚鍔燂紒")); + } + + @RequestMapping(value = "sflow") + @ResponseBody + public String sflow(BizListItem bizListItem) { + String status = Objects.requireNonNullElse(bizListItem.getExtra(), "鏈紑濮"); + switch (status) { + case "鏈紑濮" -> { + bizListItem.setColor("red"); + bizListItem.setExtra("杩涜涓"); + } + case "杩涜涓" -> { + bizListItem.setColor("green"); + bizListItem.setExtra("宸插畬鎴"); + } + case "宸插畬鎴" -> { + bizListItem.setColor("white"); + bizListItem.setReadFlag(true); + bizListItem.setClickClose(true); + } + } + bizListItemService.update(bizListItem); + return renderResult(Global.TRUE, text("鎿嶄綔閫氱煡鍒楄〃椤规垚鍔燂紒")); } @RequestMapping(value = "getTabListData") @ResponseBody public List getTabListData() { + User user = UserUtils.getUser(); return Arrays.stream(NotifyType.values()) .map(type -> { BizListItem listItem = new BizListItem(); + listItem.setReadFlag(false); listItem.setType(type.getCode()); + listItem.setLoginUser(user.getLoginCode()); List dataList = bizListItemService.findList(listItem); return new TabItem(type.getCode(), type.getName(), dataList.size(), dataList); }) diff --git a/web-api/src/main/java/com/jeesite/modules/biz/web/BizProjectInfoController.java b/web-api/src/main/java/com/jeesite/modules/biz/web/BizProjectInfoController.java index 9602c0bf..f8ab53d3 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/web/BizProjectInfoController.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/web/BizProjectInfoController.java @@ -1,6 +1,7 @@ package com.jeesite.modules.biz.web; import java.util.List; + import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -26,6 +27,7 @@ import com.jeesite.modules.biz.service.BizProjectInfoService; /** * 椤圭洰淇℃伅Controller + * * @author gaoxq * @version 2025-11-27 */ @@ -33,114 +35,120 @@ import com.jeesite.modules.biz.service.BizProjectInfoService; @RequestMapping(value = "${adminPath}/biz/projectInfo") public class BizProjectInfoController extends BaseController { - private final BizProjectInfoService bizProjectInfoService; + private final BizProjectInfoService bizProjectInfoService; - public BizProjectInfoController(BizProjectInfoService bizProjectInfoService) { - this.bizProjectInfoService = bizProjectInfoService; - } - - /** - * 鑾峰彇鏁版嵁 - */ - @ModelAttribute - public BizProjectInfo get(String projectId, boolean isNewRecord) { - return bizProjectInfoService.get(projectId, isNewRecord); - } - - /** - * 鏌ヨ鍒楄〃 - */ - @RequiresPermissions("biz:projectInfo:view") - @RequestMapping(value = {"list", ""}) - public String list(BizProjectInfo bizProjectInfo, Model model) { - model.addAttribute("bizProjectInfo", bizProjectInfo); - return "modules/biz/bizProjectInfoList"; - } - - /** - * 鏌ヨ鍒楄〃鏁版嵁 - */ - @RequiresPermissions("biz:projectInfo:view") - @RequestMapping(value = "listData") + public BizProjectInfoController(BizProjectInfoService bizProjectInfoService) { + this.bizProjectInfoService = bizProjectInfoService; + } + + /** + * 鑾峰彇鏁版嵁 + */ + @ModelAttribute + public BizProjectInfo get(String projectId, boolean isNewRecord) { + return bizProjectInfoService.get(projectId, isNewRecord); + } + + /** + * 鏌ヨ鍒楄〃 + */ + @RequiresPermissions("biz:projectInfo:view") + @RequestMapping(value = {"list", ""}) + public String list(BizProjectInfo bizProjectInfo, Model model) { + model.addAttribute("bizProjectInfo", bizProjectInfo); + return "modules/biz/bizProjectInfoList"; + } + + /** + * 鏌ヨ鍒楄〃鏁版嵁 + */ + @RequiresPermissions("biz:projectInfo:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(BizProjectInfo bizProjectInfo, HttpServletRequest request, HttpServletResponse response) { + bizProjectInfo.setPage(new Page<>(request, response)); + Page page = bizProjectInfoService.findPage(bizProjectInfo); + return page; + } + + /** + * 鏌ョ湅缂栬緫琛ㄥ崟 + */ + @RequiresPermissions("biz:projectInfo:view") + @RequestMapping(value = "form") + public String form(BizProjectInfo bizProjectInfo, Model model) { + model.addAttribute("bizProjectInfo", bizProjectInfo); + return "modules/biz/bizProjectInfoForm"; + } + + /** + * 淇濆瓨鏁版嵁 + */ + @RequiresPermissions("biz:projectInfo:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated BizProjectInfo bizProjectInfo) { + bizProjectInfoService.save(bizProjectInfo); + return renderResult(Global.TRUE, text("淇濆瓨椤圭洰淇℃伅鎴愬姛锛")); + } + + /** + * 瀵煎嚭鏁版嵁 + */ + @RequiresPermissions("biz:projectInfo:view") + @RequestMapping(value = "exportData") + public void exportData(BizProjectInfo bizProjectInfo, HttpServletResponse response) { + List list = bizProjectInfoService.findList(bizProjectInfo); + String fileName = "椤圭洰淇℃伅" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try (ExcelExport ee = new ExcelExport("椤圭洰淇℃伅", BizProjectInfo.class)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 涓嬭浇妯℃澘 + */ + @RequiresPermissions("biz:projectInfo:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + BizProjectInfo bizProjectInfo = new BizProjectInfo(); + List list = ListUtils.newArrayList(bizProjectInfo); + String fileName = "椤圭洰淇℃伅妯℃澘.xlsx"; + try (ExcelExport ee = new ExcelExport("椤圭洰淇℃伅", BizProjectInfo.class, Type.IMPORT)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 瀵煎叆鏁版嵁 + */ + @ResponseBody + @RequiresPermissions("biz:projectInfo:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file) { + try { + String message = bizProjectInfoService.importData(file); + return renderResult(Global.TRUE, "posfull:" + message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:" + ex.getMessage()); + } + } + + /** + * 鍒犻櫎鏁版嵁 + */ + @RequiresPermissions("biz:projectInfo:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(BizProjectInfo bizProjectInfo) { + bizProjectInfoService.delete(bizProjectInfo); + return renderResult(Global.TRUE, text("鍒犻櫎椤圭洰淇℃伅鎴愬姛锛")); + } + + @RequestMapping(value = "listAll") @ResponseBody - public Page listData(BizProjectInfo bizProjectInfo, HttpServletRequest request, HttpServletResponse response) { - bizProjectInfo.setPage(new Page<>(request, response)); - Page page = bizProjectInfoService.findPage(bizProjectInfo); - return page; - } + public List listAll(BizProjectInfo bizProjectInfo) { + return bizProjectInfoService.findList(bizProjectInfo); + } - /** - * 鏌ョ湅缂栬緫琛ㄥ崟 - */ - @RequiresPermissions("biz:projectInfo:view") - @RequestMapping(value = "form") - public String form(BizProjectInfo bizProjectInfo, Model model) { - model.addAttribute("bizProjectInfo", bizProjectInfo); - return "modules/biz/bizProjectInfoForm"; - } - - /** - * 淇濆瓨鏁版嵁 - */ - @RequiresPermissions("biz:projectInfo:edit") - @PostMapping(value = "save") - @ResponseBody - public String save(@Validated BizProjectInfo bizProjectInfo) { - bizProjectInfoService.save(bizProjectInfo); - return renderResult(Global.TRUE, text("淇濆瓨椤圭洰淇℃伅鎴愬姛锛")); - } - - /** - * 瀵煎嚭鏁版嵁 - */ - @RequiresPermissions("biz:projectInfo:view") - @RequestMapping(value = "exportData") - public void exportData(BizProjectInfo bizProjectInfo, HttpServletResponse response) { - List list = bizProjectInfoService.findList(bizProjectInfo); - String fileName = "椤圭洰淇℃伅" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; - try(ExcelExport ee = new ExcelExport("椤圭洰淇℃伅", BizProjectInfo.class)){ - ee.setDataList(list).write(response, fileName); - } - } - - /** - * 涓嬭浇妯℃澘 - */ - @RequiresPermissions("biz:projectInfo:view") - @RequestMapping(value = "importTemplate") - public void importTemplate(HttpServletResponse response) { - BizProjectInfo bizProjectInfo = new BizProjectInfo(); - List list = ListUtils.newArrayList(bizProjectInfo); - String fileName = "椤圭洰淇℃伅妯℃澘.xlsx"; - try(ExcelExport ee = new ExcelExport("椤圭洰淇℃伅", BizProjectInfo.class, Type.IMPORT)){ - ee.setDataList(list).write(response, fileName); - } - } - - /** - * 瀵煎叆鏁版嵁 - */ - @ResponseBody - @RequiresPermissions("biz:projectInfo:edit") - @PostMapping(value = "importData") - public String importData(MultipartFile file) { - try { - String message = bizProjectInfoService.importData(file); - return renderResult(Global.TRUE, "posfull:"+message); - } catch (Exception ex) { - return renderResult(Global.FALSE, "posfull:"+ex.getMessage()); - } - } - - /** - * 鍒犻櫎鏁版嵁 - */ - @RequiresPermissions("biz:projectInfo:edit") - @RequestMapping(value = "delete") - @ResponseBody - public String delete(BizProjectInfo bizProjectInfo) { - bizProjectInfoService.delete(bizProjectInfo); - return renderResult(Global.TRUE, text("鍒犻櫎椤圭洰淇℃伅鎴愬姛锛")); - } - } \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpAccountDao.java b/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpAccountDao.java new file mode 100644 index 00000000..00a17c81 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpAccountDao.java @@ -0,0 +1,15 @@ +package com.jeesite.modules.erp.dao; + +import com.jeesite.common.dao.CrudDao; +import com.jeesite.common.mybatis.annotation.MyBatisDao; +import com.jeesite.modules.erp.entity.ErpAccount; + +/** + * 璐︽埛淇℃伅DAO鎺ュ彛 + * @author gaoxq + * @version 2025-11-29 + */ +@MyBatisDao(dataSourceName="work") +public interface ErpAccountDao extends CrudDao { + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpCategoryDao.java b/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpCategoryDao.java new file mode 100644 index 00000000..a1e4e750 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpCategoryDao.java @@ -0,0 +1,15 @@ +package com.jeesite.modules.erp.dao; + +import com.jeesite.common.dao.CrudDao; +import com.jeesite.common.mybatis.annotation.MyBatisDao; +import com.jeesite.modules.erp.entity.ErpCategory; + +/** + * 鍒嗙被淇℃伅DAO鎺ュ彛 + * @author gaoxq + * @version 2025-11-29 + */ +@MyBatisDao(dataSourceName="work") +public interface ErpCategoryDao extends CrudDao { + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpExpenseDao.java b/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpExpenseDao.java new file mode 100644 index 00000000..69691d61 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpExpenseDao.java @@ -0,0 +1,15 @@ +package com.jeesite.modules.erp.dao; + +import com.jeesite.common.dao.CrudDao; +import com.jeesite.common.mybatis.annotation.MyBatisDao; +import com.jeesite.modules.erp.entity.ErpExpense; + +/** + * 鏀嚭淇℃伅DAO鎺ュ彛 + * @author gaoxq + * @version 2025-11-29 + */ +@MyBatisDao(dataSourceName="work") +public interface ErpExpenseDao extends CrudDao { + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpIncomeDao.java b/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpIncomeDao.java new file mode 100644 index 00000000..fc5e5c8d --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpIncomeDao.java @@ -0,0 +1,15 @@ +package com.jeesite.modules.erp.dao; + +import com.jeesite.common.dao.CrudDao; +import com.jeesite.common.mybatis.annotation.MyBatisDao; +import com.jeesite.modules.erp.entity.ErpIncome; + +/** + * 鏀跺叆淇℃伅DAO鎺ュ彛 + * @author gaoxq + * @version 2025-11-29 + */ +@MyBatisDao(dataSourceName="work") +public interface ErpIncomeDao extends CrudDao { + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpTransactionFlowDao.java b/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpTransactionFlowDao.java new file mode 100644 index 00000000..1233ec47 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/dao/ErpTransactionFlowDao.java @@ -0,0 +1,15 @@ +package com.jeesite.modules.erp.dao; + +import com.jeesite.common.dao.CrudDao; +import com.jeesite.common.mybatis.annotation.MyBatisDao; +import com.jeesite.modules.erp.entity.ErpTransactionFlow; + +/** + * 鏄庣粏淇℃伅DAO鎺ュ彛 + * @author gaoxq + * @version 2025-11-29 + */ +@MyBatisDao(dataSourceName="work") +public interface ErpTransactionFlowDao extends CrudDao { + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpAccount.java b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpAccount.java new file mode 100644 index 00000000..cc2a682b --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpAccount.java @@ -0,0 +1,87 @@ +package com.jeesite.modules.erp.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import com.jeesite.common.mybatis.annotation.JoinTable; +import com.jeesite.common.mybatis.annotation.JoinTable.Type; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; + +import com.jeesite.common.entity.DataEntity; +import com.jeesite.common.mybatis.annotation.Column; +import com.jeesite.common.mybatis.annotation.Table; +import com.jeesite.common.mybatis.mapper.query.QueryType; +import com.jeesite.common.utils.excel.annotation.ExcelField; +import com.jeesite.common.utils.excel.annotation.ExcelField.Align; +import com.jeesite.common.utils.excel.annotation.ExcelFields; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 璐︽埛淇℃伅Entity + * + * @author gaoxq + * @version 2025-11-29 + */ +@EqualsAndHashCode(callSuper = true) +@Table(name = "erp_account", alias = "a", label = "璐︽埛淇℃伅淇℃伅", columns = { + @Column(name = "create_time", attrName = "createTime", label = "璁板綍鏃堕棿", isUpdate = false, isQuery = false, isUpdateForce = true), + @Column(name = "account_id", attrName = "accountId", label = "璐︽埛鏍囪瘑", isPK = true), + @Column(name = "account_name", attrName = "accountName", label = "璐︽埛鍚嶇О", queryType = QueryType.LIKE), + @Column(name = "account_type", attrName = "accountType", label = "璐︽埛绫诲瀷"), + @Column(name = "account_code", attrName = "accountCode", label = "璐︽埛鍗″彿", isQuery = false), + @Column(name = "initial_balance", attrName = "initialBalance", label = "鍒濆浣欓", isQuery = false), + @Column(name = "current_balance", attrName = "currentBalance", label = "褰撳墠浣欓", isQuery = false), + @Column(name = "is_active", attrName = "isActive", label = "鏄惁婵娲"), + @Column(name = "update_time", attrName = "updateTime", label = "鏇存柊鏃堕棿", isQuery = false, isUpdateForce = true), + @Column(name = "f_tenant_id", attrName = "ftenantId", label = "绉熸埛id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_id", attrName = "fflowId", label = "娴佺▼id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_task_id", attrName = "fflowTaskId", label = "娴佺▼浠诲姟涓婚敭", isUpdate = false, isQuery = false), + @Column(name = "f_flow_state", attrName = "fflowState", label = "娴佺▼浠诲姟鐘舵", isUpdate = false, isQuery = false, isUpdateForce = true), +}, orderBy = "a.create_time DESC" +) +@Data +public class ErpAccount extends DataEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + private Date createTime; // 璁板綍鏃堕棿 + private String accountId; // 璐︽埛鏍囪瘑 + private String accountName; // 璐︽埛鍚嶇О + private String accountType; // 璐︽埛绫诲瀷 + private String accountCode; // 璐︽埛鍗″彿 + private BigDecimal initialBalance; // 鍒濆浣欓 + private BigDecimal currentBalance; // 褰撳墠浣欓 + private String isActive; // 鏄惁婵娲 + private Date updateTime; // 鏇存柊鏃堕棿 + private String ftenantId; // 绉熸埛id + private String fflowId; // 娴佺▼id + private String fflowTaskId; // 娴佺▼浠诲姟涓婚敭 + private Integer fflowState; // 娴佺▼浠诲姟鐘舵 + + @ExcelFields({ + @ExcelField(title = "璁板綍鏃堕棿", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "璐︽埛鏍囪瘑", attrName = "accountId", align = Align.CENTER, sort = 20), + @ExcelField(title = "璐︽埛鍚嶇О", attrName = "accountName", align = Align.CENTER, sort = 30), + @ExcelField(title = "璐︽埛绫诲瀷", attrName = "accountType", dictType = "account_type", align = Align.CENTER, sort = 40), + @ExcelField(title = "璐︽埛鍗″彿", attrName = "accountCode", align = Align.CENTER, sort = 50), + @ExcelField(title = "鍒濆浣欓", attrName = "initialBalance", align = Align.CENTER, sort = 60), + @ExcelField(title = "褰撳墠浣欓", attrName = "currentBalance", align = Align.CENTER, sort = 70), + @ExcelField(title = "鏄惁婵娲", attrName = "isActive", dictType = "is_active", align = Align.CENTER, sort = 80), + @ExcelField(title = "鏇存柊鏃堕棿", attrName = "updateTime", align = Align.CENTER, sort = 90, dataFormat = "yyyy-MM-dd hh:mm"), + }) + public ErpAccount() { + this(null); + } + + public ErpAccount(String id) { + super(id); + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpCategory.java b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpCategory.java new file mode 100644 index 00000000..f9438ad5 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpCategory.java @@ -0,0 +1,81 @@ +package com.jeesite.modules.erp.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.jeesite.common.mybatis.annotation.JoinTable; +import com.jeesite.common.mybatis.annotation.JoinTable.Type; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +import com.jeesite.common.entity.DataEntity; +import com.jeesite.common.mybatis.annotation.Column; +import com.jeesite.common.mybatis.annotation.Table; +import com.jeesite.common.mybatis.mapper.query.QueryType; +import com.jeesite.common.utils.excel.annotation.ExcelField; +import com.jeesite.common.utils.excel.annotation.ExcelField.Align; +import com.jeesite.common.utils.excel.annotation.ExcelFields; +import lombok.Data; + +import java.io.Serial; + +/** + * 鍒嗙被淇℃伅Entity + * + * @author gaoxq + * @version 2025-11-29 + */ +@Table(name = "erp_category", alias = "a", label = "鍒嗙被淇℃伅淇℃伅", columns = { + @Column(name = "create_time", attrName = "createTime", label = "璁板綍鏃堕棿", isUpdate = false, isQuery = false), + @Column(name = "category_id", attrName = "categoryId", label = "鍒嗙被鏍囪瘑", isPK = true), + @Column(name = "category_name", attrName = "categoryName", label = "鍒嗙被鍚嶇О", queryType = QueryType.LIKE), + @Column(name = "category_type", attrName = "categoryType", label = "鍒嗙被绫诲瀷"), + @Column(name = "parent_id", attrName = "parentId", label = "鐖剁骇鍒嗙被", isQuery = false), + @Column(name = "sort_order", attrName = "sortOrder", label = "鎺掑簭搴忓彿", isQuery = false), + @Column(name = "is_active", attrName = "isActive", label = "鏄惁鍚敤"), + @Column(name = "update_time", attrName = "updateTime", label = "鏇存柊鏃堕棿", isQuery = false, isUpdateForce = true), + @Column(name = "f_tenant_id", attrName = "ftenantId", label = "绉熸埛id", isInsert = false, isUpdate = false, isQuery = false), + @Column(name = "f_flow_id", attrName = "fflowId", label = "娴佺▼id", isInsert = false, isUpdate = false, isQuery = false), + @Column(name = "f_flow_task_id", attrName = "fflowTaskId", label = "娴佺▼浠诲姟涓婚敭", isInsert = false, isUpdate = false, isQuery = false), + @Column(name = "f_flow_state", attrName = "fflowState", label = "娴佺▼浠诲姟鐘舵", isInsert = false, isUpdate = false, isQuery = false, isUpdateForce = true), +}, orderBy = "a.create_time DESC" +) +@Data +public class ErpCategory extends DataEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + private Date createTime; // 璁板綍鏃堕棿 + private String categoryId; // 鍒嗙被鏍囪瘑 + private String categoryName; // 鍒嗙被鍚嶇О + private String categoryType; // 鍒嗙被绫诲瀷 + private String parentId; // 鐖剁骇鍒嗙被 + private String sortOrder; // 鎺掑簭搴忓彿 + private String isActive; // 鏄惁鍚敤 + private Date updateTime; // 鏇存柊鏃堕棿 + private String ftenantId; // 绉熸埛id + private String fflowId; // 娴佺▼id + private String fflowTaskId; // 娴佺▼浠诲姟涓婚敭 + private Integer fflowState; // 娴佺▼浠诲姟鐘舵 + + @ExcelFields({ + @ExcelField(title = "璁板綍鏃堕棿", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "鍒嗙被鏍囪瘑", attrName = "categoryId", align = Align.CENTER, sort = 20), + @ExcelField(title = "鍒嗙被鍚嶇О", attrName = "categoryName", align = Align.CENTER, sort = 30), + @ExcelField(title = "鍒嗙被绫诲瀷", attrName = "categoryType", dictType = "category_type", align = Align.CENTER, sort = 40), + @ExcelField(title = "鐖剁骇鍒嗙被", attrName = "parentId", dictType = "parent_type", align = Align.CENTER, sort = 50), + @ExcelField(title = "鎺掑簭搴忓彿", attrName = "sortOrder", align = Align.CENTER, sort = 60), + @ExcelField(title = "鏄惁鍚敤", attrName = "isActive", dictType = "is_active", align = Align.CENTER, sort = 70), + @ExcelField(title = "鏇存柊鏃堕棿", attrName = "updateTime", align = Align.CENTER, sort = 80, dataFormat = "yyyy-MM-dd hh:mm"), + }) + public ErpCategory() { + this(null); + } + + public ErpCategory(String id) { + super(id); + } + +} \ No newline at end of file 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 new file mode 100644 index 00000000..a90f2eca --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpExpense.java @@ -0,0 +1,124 @@ +package com.jeesite.modules.erp.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import com.jeesite.common.mybatis.annotation.JoinTable; +import com.jeesite.common.mybatis.annotation.JoinTable.Type; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; + +import com.jeesite.common.entity.DataEntity; +import com.jeesite.common.mybatis.annotation.Column; +import com.jeesite.common.mybatis.annotation.Table; +import com.jeesite.common.mybatis.mapper.query.QueryType; +import com.jeesite.common.utils.excel.annotation.ExcelField; +import com.jeesite.common.utils.excel.annotation.ExcelField.Align; +import com.jeesite.common.utils.excel.annotation.ExcelFields; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 鏀嚭淇℃伅Entity + * + * @author gaoxq + * @version 2025-11-29 + */ +@EqualsAndHashCode(callSuper = true) +@Table(name = "erp_expense", alias = "a", label = "鏀嚭淇℃伅淇℃伅", columns = { + @Column(name = "create_time", attrName = "createTime", label = "璁板綍鏃堕棿", isUpdate = false, isUpdateForce = true), + @Column(name = "expense_id", attrName = "expenseId", label = "鏀嚭ID", isPK = true), + @Column(name = "zflow_id", attrName = "zflowId", label = "鍏宠仈娴佹按ID", isQuery = false), + @Column(name = "account_id", attrName = "accountId", label = "鏀嚭璐︽埛ID", isQuery = false), + @Column(name = "category_id", attrName = "categoryId", label = "鏀嚭鍒嗙被ID"), + @Column(name = "amount", attrName = "amount", label = "浜ゆ槗閲戦", isQuery = false), + @Column(name = "update_time", attrName = "updateTime", label = "鏇存柊鏃堕棿", isQuery = false, isUpdateForce = true), + @Column(name = "f_tenant_id", attrName = "ftenantId", label = "绉熸埛id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_id", attrName = "fflowId", label = "娴佺▼id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_task_id", attrName = "fflowTaskId", label = "娴佺▼浠诲姟涓婚敭", isUpdate = false, isQuery = false), + @Column(name = "f_flow_state", attrName = "fflowState", label = "娴佺▼浠诲姟鐘舵", isUpdate = false, isQuery = false, isUpdateForce = true), +}, joinTable = { + @JoinTable(type = Type.LEFT_JOIN, entity = ErpAccount.class, attrName = "this", alias = "b", + on = "a.account_id = b.account_id", + columns = { + @Column(name = "account_name", attrName = "accountName", label = "璐︽埛鍚嶇О"), + }), + @JoinTable(type = Type.LEFT_JOIN, entity = ErpCategory.class, attrName = "this", alias = "c", + on = "a.category_id = c.category_id", + columns = { + @Column(name = "parent_id", attrName = "parentId", label = "鐖剁骇鍒嗙被"), + @Column(name = "category_name", attrName = "categoryName", label = "鍒嗙被鍚嶇О"), + }), + @JoinTable(type = Type.LEFT_JOIN, entity = ErpTransactionFlow.class, attrName = "this", alias = "d", + on = "a.zflow_id = d.flow_id", + columns = { + @Column(name = "flow_name", attrName = "flowName", label = "浜ゆ槗鍚嶇О"), + @Column(name = "is_finish", attrName = "isFinish", label = "鏄惁璁拌处"), + }), +}, orderBy = "a.create_time DESC" +) +@Data +public class ErpExpense extends DataEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + private Date createTime; // 璁板綍鏃堕棿 + private String expenseId; // 鏀嚭ID + private String zflowId; // 鍏宠仈娴佹按ID + private String accountId; // 鏀嚭璐︽埛ID + private String categoryId; // 鏀嚭鍒嗙被ID + private BigDecimal amount; // 浜ゆ槗閲戦 + private Date updateTime; // 鏇存柊鏃堕棿 + private String ftenantId; // 绉熸埛id + private String fflowId; // 娴佺▼id + private String fflowTaskId; // 娴佺▼浠诲姟涓婚敭 + private Integer fflowState; // 娴佺▼浠诲姟鐘舵 + + private String accountName; + + private String parentId; + + private String categoryName; + + private String flowName; + + @ExcelFields({ + @ExcelField(title = "璁板綍鏃堕棿", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "鏀嚭缂栧彿", attrName = "expenseId", align = Align.CENTER, sort = 20), + @ExcelField(title = "浜ゆ槗鍚嶇О", attrName = "flowName", align = Align.CENTER, sort = 30), + @ExcelField(title = "鏀嚭璐﹀彿", attrName = "accountName", align = Align.CENTER, sort = 40), + @ExcelField(title = "鏀嚭鍒嗙被", attrName = "categoryName", align = Align.CENTER, sort = 50), + @ExcelField(title = "鐖剁骇鍒嗙被", attrName = "parentId", dictType = "parent_type", align = Align.CENTER, sort = 50), + @ExcelField(title = "浜ゆ槗閲戦", attrName = "amount", align = Align.CENTER, sort = 60), + @ExcelField(title = "鏇存柊鏃堕棿", attrName = "updateTime", align = Align.CENTER, sort = 70, dataFormat = "yyyy-MM-dd hh:mm"), + }) + public ErpExpense() { + this(null); + } + + public ErpExpense(String id) { + super(id); + } + + public Date getCreateTime_gte() { + return sqlMap.getWhere().getValue("create_time", QueryType.GTE); + } + + public void setCreateTime_gte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.GTE, createTime); + } + + public Date getCreateTime_lte() { + return sqlMap.getWhere().getValue("create_time", QueryType.LTE); + } + + public void setCreateTime_lte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.LTE, createTime); + } + +} \ No newline at end of file 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 new file mode 100644 index 00000000..871f3808 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpIncome.java @@ -0,0 +1,124 @@ +package com.jeesite.modules.erp.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import com.jeesite.common.mybatis.annotation.JoinTable; +import com.jeesite.common.mybatis.annotation.JoinTable.Type; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; + +import com.jeesite.common.entity.DataEntity; +import com.jeesite.common.mybatis.annotation.Column; +import com.jeesite.common.mybatis.annotation.Table; +import com.jeesite.common.mybatis.mapper.query.QueryType; +import com.jeesite.common.utils.excel.annotation.ExcelField; +import com.jeesite.common.utils.excel.annotation.ExcelField.Align; +import com.jeesite.common.utils.excel.annotation.ExcelFields; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 鏀跺叆淇℃伅Entity + * + * @author gaoxq + * @version 2025-11-29 + */ +@EqualsAndHashCode(callSuper = true) +@Table(name = "erp_income", alias = "a", label = "鏀跺叆淇℃伅淇℃伅", columns = { + @Column(name = "create_time", attrName = "createTime", label = "璁板綍鏃堕棿", isUpdate = false, isUpdateForce = true), + @Column(name = "income_id", attrName = "incomeId", label = "鏀跺叆ID", isPK = true), + @Column(name = "sflow_id", attrName = "sflowId", label = "鍏宠仈娴佹按ID", isQuery = false), + @Column(name = "account_id", attrName = "accountId", label = "鏀跺叆璐︽埛ID", isQuery = false), + @Column(name = "category_id", attrName = "categoryId", label = "鏀跺叆鍒嗙被ID"), + @Column(name = "amount", attrName = "amount", label = "浜ゆ槗閲戦", comment = "浜ゆ槗閲戦锛堟鏁帮級", isQuery = false), + @Column(name = "update_time", attrName = "updateTime", label = "鏇存柊鏃堕棿", isQuery = false, isUpdateForce = true), + @Column(name = "f_tenant_id", attrName = "ftenantId", label = "绉熸埛id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_id", attrName = "fflowId", label = "娴佺▼id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_task_id", attrName = "fflowTaskId", label = "娴佺▼浠诲姟涓婚敭", isUpdate = false, isQuery = false), + @Column(name = "f_flow_state", attrName = "fflowState", label = "娴佺▼浠诲姟鐘舵", isUpdate = false, isQuery = false, isUpdateForce = true), +}, joinTable = { + @JoinTable(type = Type.LEFT_JOIN, entity = ErpAccount.class, attrName = "this", alias = "b", + on = "a.account_id = b.account_id", + columns = { + @Column(name = "account_name", attrName = "accountName", label = "璐︽埛鍚嶇О"), + }), + @JoinTable(type = Type.LEFT_JOIN, entity = ErpCategory.class, attrName = "this", alias = "c", + on = "a.category_id = c.category_id", + columns = { + @Column(name = "parent_id", attrName = "parentId", label = "鐖剁骇鍒嗙被"), + @Column(name = "category_name", attrName = "categoryName", label = "鍒嗙被鍚嶇О"), + }), + @JoinTable(type = Type.LEFT_JOIN, entity = ErpTransactionFlow.class, attrName = "this", alias = "d", + on = "a.sflow_id = d.flow_id", + columns = { + @Column(name = "flow_name", attrName = "flowName", label = "浜ゆ槗鍚嶇О"), + @Column(name = "is_finish", attrName = "isFinish", label = "鏄惁璁拌处"), + }), +}, orderBy = "a.create_time DESC" +) +@Data +public class ErpIncome extends DataEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + private Date createTime; // 璁板綍鏃堕棿 + private String incomeId; // 鏀跺叆ID + private String sflowId; // 鍏宠仈娴佹按ID + private String accountId; // 鏀跺叆璐︽埛ID + private String categoryId; // 鏀跺叆鍒嗙被ID + private BigDecimal amount; // 浜ゆ槗閲戦锛堟鏁帮級 + private Date updateTime; // 鏇存柊鏃堕棿 + private String ftenantId; // 绉熸埛id + private String fflowId; // 娴佺▼id + private String fflowTaskId; // 娴佺▼浠诲姟涓婚敭 + private Integer fflowState; // 娴佺▼浠诲姟鐘舵 + + private String accountName; + + private String parentId; + + private String categoryName; + + private String flowName; + + @ExcelFields({ + @ExcelField(title = "璁板綍鏃堕棿", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "鏀跺叆缂栧彿", attrName = "incomeId", align = Align.CENTER, sort = 20), + @ExcelField(title = "浜ゆ槗鍚嶇О", attrName = "flowName", align = Align.CENTER, sort = 30), + @ExcelField(title = "鏀跺叆璐︽埛", attrName = "accountName", align = Align.CENTER, sort = 40), + @ExcelField(title = "鏀跺叆鍒嗙被", attrName = "categoryName", align = Align.CENTER, sort = 50), + @ExcelField(title = "鐖剁骇鍒嗙被", attrName = "parentId", dictType = "parent_type", align = Align.CENTER, sort = 50), + @ExcelField(title = "浜ゆ槗閲戦", attrName = "amount", align = Align.CENTER, sort = 60), + @ExcelField(title = "鏇存柊鏃堕棿", attrName = "updateTime", align = Align.CENTER, sort = 70, dataFormat = "yyyy-MM-dd hh:mm"), + }) + public ErpIncome() { + this(null); + } + + public ErpIncome(String id) { + super(id); + } + + public Date getCreateTime_gte() { + return sqlMap.getWhere().getValue("create_time", QueryType.GTE); + } + + public void setCreateTime_gte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.GTE, createTime); + } + + public Date getCreateTime_lte() { + return sqlMap.getWhere().getValue("create_time", QueryType.LTE); + } + + public void setCreateTime_lte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.LTE, createTime); + } + +} \ No newline at end of file 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 new file mode 100644 index 00000000..9acf52b7 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/entity/ErpTransactionFlow.java @@ -0,0 +1,131 @@ +package com.jeesite.modules.erp.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import com.jeesite.common.mybatis.annotation.JoinTable; +import com.jeesite.common.mybatis.annotation.JoinTable.Type; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.jeesite.modules.biz.entity.BizProvince; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; + +import com.jeesite.common.entity.DataEntity; +import com.jeesite.common.mybatis.annotation.Column; +import com.jeesite.common.mybatis.annotation.Table; +import com.jeesite.common.mybatis.mapper.query.QueryType; +import com.jeesite.common.utils.excel.annotation.ExcelField; +import com.jeesite.common.utils.excel.annotation.ExcelField.Align; +import com.jeesite.common.utils.excel.annotation.ExcelFields; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 鏄庣粏淇℃伅Entity + * + * @author gaoxq + * @version 2025-11-29 + */ +@EqualsAndHashCode(callSuper = true) +@Table(name = "erp_transaction_flow", alias = "a", label = "鏄庣粏淇℃伅淇℃伅", columns = { + @Column(name = "create_time", attrName = "createTime", label = "璁板綍鏃堕棿", isUpdate = false, isUpdateForce = true), + @Column(name = "flow_id", attrName = "flowId", label = "娴佹按缂栧彿", isPK = true), + @Column(name = "flow_name", attrName = "flowName", label = "浜ゆ槗鍚嶇О", queryType = QueryType.LIKE), + @Column(name = "transaction_type", attrName = "transactionType", label = "浜ゆ槗绫诲瀷"), + @Column(name = "amount", attrName = "amount", label = "浜ゆ槗閲戦", isQuery = false), + @Column(name = "transaction_time", attrName = "transactionTime", label = "浜ゆ槗鏃堕棿", isQuery = false, isUpdateForce = true), + @Column(name = "account_id", attrName = "accountId", label = "浜ゆ槗璐︽埛"), + @Column(name = "category_id", attrName = "categoryId", label = "浜ゆ槗鍒嗙被"), + @Column(name = "remark", attrName = "remark", label = "浜ゆ槗澶囨敞", isQuery = false), + @Column(name = "is_finish", attrName = "isFinish", label = "鏄惁璁拌处"), + @Column(name = "update_time", attrName = "updateTime", label = "鏇存柊鏃堕棿", isQuery = false, isUpdateForce = true), + @Column(name = "f_tenant_id", attrName = "ftenantId", label = "绉熸埛id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_id", attrName = "fflowId", label = "娴佺▼id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_task_id", attrName = "fflowTaskId", label = "娴佺▼浠诲姟涓婚敭", isUpdate = false, isQuery = false), + @Column(name = "f_flow_state", attrName = "fflowState", label = "娴佺▼浠诲姟鐘舵", isUpdate = false, isQuery = false, isUpdateForce = true), +}, joinTable = { + @JoinTable(type = Type.LEFT_JOIN, entity = ErpAccount.class, attrName = "this", alias = "b", + on = "a.account_id = b.account_id", + columns = { + @Column(name = "account_name", attrName = "accountName", label = "璐︽埛鍚嶇О"), + }), + + @JoinTable(type = Type.LEFT_JOIN, entity = ErpCategory.class, attrName = "this", alias = "c", + on = "a.category_id = c.category_id", + columns = { + @Column(name = "parent_id", attrName = "parentId", label = "鐖剁骇鍒嗙被"), + @Column(name = "category_name", attrName = "categoryName", label = "鍒嗙被鍚嶇О"), + }), +}, orderBy = "a.create_time DESC" +) +@Data +public class ErpTransactionFlow extends DataEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + private Date createTime; // 璁板綍鏃堕棿 + private String flowId; // 娴佹按缂栧彿 + private String flowName; // 浜ゆ槗鍚嶇О + private String transactionType; // 浜ゆ槗绫诲瀷 + private BigDecimal amount; // 浜ゆ槗閲戦 + private Date transactionTime; // 浜ゆ槗鏃堕棿 + private String accountId; // 浜ゆ槗璐︽埛 + private String categoryId; // 浜ゆ槗鍒嗙被 + private String remark; // 浜ゆ槗澶囨敞 + private String isFinish; // 鏄惁璁拌处 + private Date updateTime; // 鏇存柊鏃堕棿 + private String ftenantId; // 绉熸埛id + private String fflowId; // 娴佺▼id + private String fflowTaskId; // 娴佺▼浠诲姟涓婚敭 + private Integer fflowState; // 娴佺▼浠诲姟鐘舵 + + private String accountName; + + private String parentId; + + private String categoryName; + + + @ExcelFields({ + @ExcelField(title = "璁板綍鏃堕棿", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "娴佹按缂栧彿", attrName = "flowId", align = Align.CENTER, sort = 20), + @ExcelField(title = "浜ゆ槗鍚嶇О", attrName = "flowName", align = Align.CENTER, sort = 30), + @ExcelField(title = "浜ゆ槗绫诲瀷", attrName = "transactionType", dictType = "transaction_type", align = Align.CENTER, sort = 40), + @ExcelField(title = "浜ゆ槗閲戦", attrName = "amount", align = Align.CENTER, sort = 50), + @ExcelField(title = "浜ゆ槗鏃堕棿", attrName = "transactionTime", align = Align.CENTER, sort = 60, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "浜ゆ槗璐︽埛", attrName = "accountName", align = Align.CENTER, sort = 70), + @ExcelField(title = "鐖剁骇鍒嗙被", attrName = "parentId", dictType = "parent_type", align = Align.CENTER, sort = 80), + @ExcelField(title = "浜ゆ槗鍒嗙被", attrName = "categoryName", align = Align.CENTER, sort = 80), + @ExcelField(title = "浜ゆ槗澶囨敞", attrName = "remark", align = Align.CENTER, sort = 90), + @ExcelField(title = "鏄惁璁拌处", attrName = "isFinish", dictType = "is_finish", align = Align.CENTER, sort = 100), + @ExcelField(title = "鏇存柊鏃堕棿", attrName = "updateTime", align = Align.CENTER, sort = 110, dataFormat = "yyyy-MM-dd hh:mm"), + }) + public ErpTransactionFlow() { + this(null); + } + + public ErpTransactionFlow(String id) { + super(id); + } + + public Date getCreateTime_gte() { + return sqlMap.getWhere().getValue("create_time", QueryType.GTE); + } + + public void setCreateTime_gte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.GTE, createTime); + } + + public Date getCreateTime_lte() { + return sqlMap.getWhere().getValue("create_time", QueryType.LTE); + } + + public void setCreateTime_lte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.LTE, createTime); + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/service/ErpAccountService.java b/web-api/src/main/java/com/jeesite/modules/erp/service/ErpAccountService.java new file mode 100644 index 00000000..e4d6fd1c --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/service/ErpAccountService.java @@ -0,0 +1,134 @@ +package com.jeesite.modules.erp.service; + +import java.util.List; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.jeesite.common.entity.Page; +import com.jeesite.common.service.CrudService; +import com.jeesite.modules.erp.entity.ErpAccount; +import com.jeesite.modules.erp.dao.ErpAccountDao; +import com.jeesite.common.service.ServiceException; +import com.jeesite.common.config.Global; +import com.jeesite.common.validator.ValidatorUtils; +import com.jeesite.common.utils.excel.ExcelImport; +import org.springframework.web.multipart.MultipartFile; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; + +/** + * 璐︽埛淇℃伅Service + * @author gaoxq + * @version 2025-11-29 + */ +@Service +public class ErpAccountService extends CrudService { + + /** + * 鑾峰彇鍗曟潯鏁版嵁 + * @param erpAccount 涓婚敭 + */ + @Override + public ErpAccount get(ErpAccount erpAccount) { + return super.get(erpAccount); + } + + /** + * 鏌ヨ鍒嗛〉鏁版嵁 + * @param erpAccount 鏌ヨ鏉′欢 + * @param erpAccount page 鍒嗛〉瀵硅薄 + */ + @Override + public Page findPage(ErpAccount erpAccount) { + return super.findPage(erpAccount); + } + + /** + * 鏌ヨ鍒楄〃鏁版嵁 + * @param erpAccount 鏌ヨ鏉′欢 + */ + @Override + public List findList(ErpAccount erpAccount) { + return super.findList(erpAccount); + } + + /** + * 淇濆瓨鏁版嵁锛堟彃鍏ユ垨鏇存柊锛 + * @param erpAccount 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void save(ErpAccount erpAccount) { + super.save(erpAccount); + } + + /** + * 瀵煎叆鏁版嵁 + * @param file 瀵煎叆鐨勬暟鎹枃浠 + */ + @Transactional + public String importData(MultipartFile file) { + if (file == null){ + throw new ServiceException(text("璇烽夋嫨瀵煎叆鐨勬暟鎹枃浠讹紒")); + } + int successNum = 0; int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + try(ExcelImport ei = new ExcelImport(file, 2, 0)){ + List list = ei.getDataList(ErpAccount.class); + for (ErpAccount erpAccount : list) { + try{ + ValidatorUtils.validateWithException(erpAccount); + this.save(erpAccount); + successNum++; + successMsg.append("
" + successNum + "銆佺紪鍙 " + erpAccount.getId() + " 瀵煎叆鎴愬姛"); + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "銆佺紪鍙 " + erpAccount.getId() + " 瀵煎叆澶辫触锛"; + if (e instanceof ConstraintViolationException){ + ConstraintViolationException cve = (ConstraintViolationException)e; + for (ConstraintViolation violation : cve.getConstraintViolations()) { + msg += Global.getText(violation.getMessage()) + " ("+violation.getPropertyPath()+")"; + } + }else{ + msg += e.getMessage(); + } + failureMsg.append(msg); + logger.error(msg, e); + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + failureMsg.append(e.getMessage()); + return failureMsg.toString(); + } + if (failureNum > 0) { + failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細"); + throw new ServiceException(failureMsg.toString()); + }else{ + successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏 " + successNum + " 鏉★紝鏁版嵁濡備笅锛"); + } + return successMsg.toString(); + } + + /** + * 鏇存柊鐘舵 + * @param erpAccount 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void updateStatus(ErpAccount erpAccount) { + super.updateStatus(erpAccount); + } + + /** + * 鍒犻櫎鏁版嵁 + * @param erpAccount 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void delete(ErpAccount erpAccount) { + super.delete(erpAccount); + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/service/ErpCategoryService.java b/web-api/src/main/java/com/jeesite/modules/erp/service/ErpCategoryService.java new file mode 100644 index 00000000..fa0339aa --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/service/ErpCategoryService.java @@ -0,0 +1,134 @@ +package com.jeesite.modules.erp.service; + +import java.util.List; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.jeesite.common.entity.Page; +import com.jeesite.common.service.CrudService; +import com.jeesite.modules.erp.entity.ErpCategory; +import com.jeesite.modules.erp.dao.ErpCategoryDao; +import com.jeesite.common.service.ServiceException; +import com.jeesite.common.config.Global; +import com.jeesite.common.validator.ValidatorUtils; +import com.jeesite.common.utils.excel.ExcelImport; +import org.springframework.web.multipart.MultipartFile; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; + +/** + * 鍒嗙被淇℃伅Service + * @author gaoxq + * @version 2025-11-29 + */ +@Service +public class ErpCategoryService extends CrudService { + + /** + * 鑾峰彇鍗曟潯鏁版嵁 + * @param erpCategory 涓婚敭 + */ + @Override + public ErpCategory get(ErpCategory erpCategory) { + return super.get(erpCategory); + } + + /** + * 鏌ヨ鍒嗛〉鏁版嵁 + * @param erpCategory 鏌ヨ鏉′欢 + * @param erpCategory page 鍒嗛〉瀵硅薄 + */ + @Override + public Page findPage(ErpCategory erpCategory) { + return super.findPage(erpCategory); + } + + /** + * 鏌ヨ鍒楄〃鏁版嵁 + * @param erpCategory 鏌ヨ鏉′欢 + */ + @Override + public List findList(ErpCategory erpCategory) { + return super.findList(erpCategory); + } + + /** + * 淇濆瓨鏁版嵁锛堟彃鍏ユ垨鏇存柊锛 + * @param erpCategory 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void save(ErpCategory erpCategory) { + super.save(erpCategory); + } + + /** + * 瀵煎叆鏁版嵁 + * @param file 瀵煎叆鐨勬暟鎹枃浠 + */ + @Transactional + public String importData(MultipartFile file) { + if (file == null){ + throw new ServiceException(text("璇烽夋嫨瀵煎叆鐨勬暟鎹枃浠讹紒")); + } + int successNum = 0; int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + try(ExcelImport ei = new ExcelImport(file, 2, 0)){ + List list = ei.getDataList(ErpCategory.class); + for (ErpCategory erpCategory : list) { + try{ + ValidatorUtils.validateWithException(erpCategory); + this.save(erpCategory); + successNum++; + successMsg.append("
" + successNum + "銆佺紪鍙 " + erpCategory.getId() + " 瀵煎叆鎴愬姛"); + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "銆佺紪鍙 " + erpCategory.getId() + " 瀵煎叆澶辫触锛"; + if (e instanceof ConstraintViolationException){ + ConstraintViolationException cve = (ConstraintViolationException)e; + for (ConstraintViolation violation : cve.getConstraintViolations()) { + msg += Global.getText(violation.getMessage()) + " ("+violation.getPropertyPath()+")"; + } + }else{ + msg += e.getMessage(); + } + failureMsg.append(msg); + logger.error(msg, e); + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + failureMsg.append(e.getMessage()); + return failureMsg.toString(); + } + if (failureNum > 0) { + failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細"); + throw new ServiceException(failureMsg.toString()); + }else{ + successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏 " + successNum + " 鏉★紝鏁版嵁濡備笅锛"); + } + return successMsg.toString(); + } + + /** + * 鏇存柊鐘舵 + * @param erpCategory 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void updateStatus(ErpCategory erpCategory) { + super.updateStatus(erpCategory); + } + + /** + * 鍒犻櫎鏁版嵁 + * @param erpCategory 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void delete(ErpCategory erpCategory) { + super.delete(erpCategory); + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/service/ErpExpenseService.java b/web-api/src/main/java/com/jeesite/modules/erp/service/ErpExpenseService.java new file mode 100644 index 00000000..06f3e980 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/service/ErpExpenseService.java @@ -0,0 +1,134 @@ +package com.jeesite.modules.erp.service; + +import java.util.List; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.jeesite.common.entity.Page; +import com.jeesite.common.service.CrudService; +import com.jeesite.modules.erp.entity.ErpExpense; +import com.jeesite.modules.erp.dao.ErpExpenseDao; +import com.jeesite.common.service.ServiceException; +import com.jeesite.common.config.Global; +import com.jeesite.common.validator.ValidatorUtils; +import com.jeesite.common.utils.excel.ExcelImport; +import org.springframework.web.multipart.MultipartFile; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; + +/** + * 鏀嚭淇℃伅Service + * @author gaoxq + * @version 2025-11-29 + */ +@Service +public class ErpExpenseService extends CrudService { + + /** + * 鑾峰彇鍗曟潯鏁版嵁 + * @param erpExpense 涓婚敭 + */ + @Override + public ErpExpense get(ErpExpense erpExpense) { + return super.get(erpExpense); + } + + /** + * 鏌ヨ鍒嗛〉鏁版嵁 + * @param erpExpense 鏌ヨ鏉′欢 + * @param erpExpense page 鍒嗛〉瀵硅薄 + */ + @Override + public Page findPage(ErpExpense erpExpense) { + return super.findPage(erpExpense); + } + + /** + * 鏌ヨ鍒楄〃鏁版嵁 + * @param erpExpense 鏌ヨ鏉′欢 + */ + @Override + public List findList(ErpExpense erpExpense) { + return super.findList(erpExpense); + } + + /** + * 淇濆瓨鏁版嵁锛堟彃鍏ユ垨鏇存柊锛 + * @param erpExpense 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void save(ErpExpense erpExpense) { + super.save(erpExpense); + } + + /** + * 瀵煎叆鏁版嵁 + * @param file 瀵煎叆鐨勬暟鎹枃浠 + */ + @Transactional + public String importData(MultipartFile file) { + if (file == null){ + throw new ServiceException(text("璇烽夋嫨瀵煎叆鐨勬暟鎹枃浠讹紒")); + } + int successNum = 0; int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + try(ExcelImport ei = new ExcelImport(file, 2, 0)){ + List list = ei.getDataList(ErpExpense.class); + for (ErpExpense erpExpense : list) { + try{ + ValidatorUtils.validateWithException(erpExpense); + this.save(erpExpense); + successNum++; + successMsg.append("
" + successNum + "銆佺紪鍙 " + erpExpense.getId() + " 瀵煎叆鎴愬姛"); + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "銆佺紪鍙 " + erpExpense.getId() + " 瀵煎叆澶辫触锛"; + if (e instanceof ConstraintViolationException){ + ConstraintViolationException cve = (ConstraintViolationException)e; + for (ConstraintViolation violation : cve.getConstraintViolations()) { + msg += Global.getText(violation.getMessage()) + " ("+violation.getPropertyPath()+")"; + } + }else{ + msg += e.getMessage(); + } + failureMsg.append(msg); + logger.error(msg, e); + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + failureMsg.append(e.getMessage()); + return failureMsg.toString(); + } + if (failureNum > 0) { + failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細"); + throw new ServiceException(failureMsg.toString()); + }else{ + successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏 " + successNum + " 鏉★紝鏁版嵁濡備笅锛"); + } + return successMsg.toString(); + } + + /** + * 鏇存柊鐘舵 + * @param erpExpense 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void updateStatus(ErpExpense erpExpense) { + super.updateStatus(erpExpense); + } + + /** + * 鍒犻櫎鏁版嵁 + * @param erpExpense 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void delete(ErpExpense erpExpense) { + super.delete(erpExpense); + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/service/ErpIncomeService.java b/web-api/src/main/java/com/jeesite/modules/erp/service/ErpIncomeService.java new file mode 100644 index 00000000..537e37d7 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/service/ErpIncomeService.java @@ -0,0 +1,134 @@ +package com.jeesite.modules.erp.service; + +import java.util.List; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.jeesite.common.entity.Page; +import com.jeesite.common.service.CrudService; +import com.jeesite.modules.erp.entity.ErpIncome; +import com.jeesite.modules.erp.dao.ErpIncomeDao; +import com.jeesite.common.service.ServiceException; +import com.jeesite.common.config.Global; +import com.jeesite.common.validator.ValidatorUtils; +import com.jeesite.common.utils.excel.ExcelImport; +import org.springframework.web.multipart.MultipartFile; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; + +/** + * 鏀跺叆淇℃伅Service + * @author gaoxq + * @version 2025-11-29 + */ +@Service +public class ErpIncomeService extends CrudService { + + /** + * 鑾峰彇鍗曟潯鏁版嵁 + * @param erpIncome 涓婚敭 + */ + @Override + public ErpIncome get(ErpIncome erpIncome) { + return super.get(erpIncome); + } + + /** + * 鏌ヨ鍒嗛〉鏁版嵁 + * @param erpIncome 鏌ヨ鏉′欢 + * @param erpIncome page 鍒嗛〉瀵硅薄 + */ + @Override + public Page findPage(ErpIncome erpIncome) { + return super.findPage(erpIncome); + } + + /** + * 鏌ヨ鍒楄〃鏁版嵁 + * @param erpIncome 鏌ヨ鏉′欢 + */ + @Override + public List findList(ErpIncome erpIncome) { + return super.findList(erpIncome); + } + + /** + * 淇濆瓨鏁版嵁锛堟彃鍏ユ垨鏇存柊锛 + * @param erpIncome 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void save(ErpIncome erpIncome) { + super.save(erpIncome); + } + + /** + * 瀵煎叆鏁版嵁 + * @param file 瀵煎叆鐨勬暟鎹枃浠 + */ + @Transactional + public String importData(MultipartFile file) { + if (file == null){ + throw new ServiceException(text("璇烽夋嫨瀵煎叆鐨勬暟鎹枃浠讹紒")); + } + int successNum = 0; int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + try(ExcelImport ei = new ExcelImport(file, 2, 0)){ + List list = ei.getDataList(ErpIncome.class); + for (ErpIncome erpIncome : list) { + try{ + ValidatorUtils.validateWithException(erpIncome); + this.save(erpIncome); + successNum++; + successMsg.append("
" + successNum + "銆佺紪鍙 " + erpIncome.getId() + " 瀵煎叆鎴愬姛"); + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "銆佺紪鍙 " + erpIncome.getId() + " 瀵煎叆澶辫触锛"; + if (e instanceof ConstraintViolationException){ + ConstraintViolationException cve = (ConstraintViolationException)e; + for (ConstraintViolation violation : cve.getConstraintViolations()) { + msg += Global.getText(violation.getMessage()) + " ("+violation.getPropertyPath()+")"; + } + }else{ + msg += e.getMessage(); + } + failureMsg.append(msg); + logger.error(msg, e); + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + failureMsg.append(e.getMessage()); + return failureMsg.toString(); + } + if (failureNum > 0) { + failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細"); + throw new ServiceException(failureMsg.toString()); + }else{ + successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏 " + successNum + " 鏉★紝鏁版嵁濡備笅锛"); + } + return successMsg.toString(); + } + + /** + * 鏇存柊鐘舵 + * @param erpIncome 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void updateStatus(ErpIncome erpIncome) { + super.updateStatus(erpIncome); + } + + /** + * 鍒犻櫎鏁版嵁 + * @param erpIncome 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void delete(ErpIncome erpIncome) { + super.delete(erpIncome); + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/service/ErpTransactionFlowService.java b/web-api/src/main/java/com/jeesite/modules/erp/service/ErpTransactionFlowService.java new file mode 100644 index 00000000..bf5ef054 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/service/ErpTransactionFlowService.java @@ -0,0 +1,134 @@ +package com.jeesite.modules.erp.service; + +import java.util.List; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.jeesite.common.entity.Page; +import com.jeesite.common.service.CrudService; +import com.jeesite.modules.erp.entity.ErpTransactionFlow; +import com.jeesite.modules.erp.dao.ErpTransactionFlowDao; +import com.jeesite.common.service.ServiceException; +import com.jeesite.common.config.Global; +import com.jeesite.common.validator.ValidatorUtils; +import com.jeesite.common.utils.excel.ExcelImport; +import org.springframework.web.multipart.MultipartFile; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; + +/** + * 鏄庣粏淇℃伅Service + * @author gaoxq + * @version 2025-11-29 + */ +@Service +public class ErpTransactionFlowService extends CrudService { + + /** + * 鑾峰彇鍗曟潯鏁版嵁 + * @param erpTransactionFlow 涓婚敭 + */ + @Override + public ErpTransactionFlow get(ErpTransactionFlow erpTransactionFlow) { + return super.get(erpTransactionFlow); + } + + /** + * 鏌ヨ鍒嗛〉鏁版嵁 + * @param erpTransactionFlow 鏌ヨ鏉′欢 + * @param erpTransactionFlow page 鍒嗛〉瀵硅薄 + */ + @Override + public Page findPage(ErpTransactionFlow erpTransactionFlow) { + return super.findPage(erpTransactionFlow); + } + + /** + * 鏌ヨ鍒楄〃鏁版嵁 + * @param erpTransactionFlow 鏌ヨ鏉′欢 + */ + @Override + public List findList(ErpTransactionFlow erpTransactionFlow) { + return super.findList(erpTransactionFlow); + } + + /** + * 淇濆瓨鏁版嵁锛堟彃鍏ユ垨鏇存柊锛 + * @param erpTransactionFlow 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void save(ErpTransactionFlow erpTransactionFlow) { + super.save(erpTransactionFlow); + } + + /** + * 瀵煎叆鏁版嵁 + * @param file 瀵煎叆鐨勬暟鎹枃浠 + */ + @Transactional + public String importData(MultipartFile file) { + if (file == null){ + throw new ServiceException(text("璇烽夋嫨瀵煎叆鐨勬暟鎹枃浠讹紒")); + } + int successNum = 0; int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + try(ExcelImport ei = new ExcelImport(file, 2, 0)){ + List list = ei.getDataList(ErpTransactionFlow.class); + for (ErpTransactionFlow erpTransactionFlow : list) { + try{ + ValidatorUtils.validateWithException(erpTransactionFlow); + this.save(erpTransactionFlow); + successNum++; + successMsg.append("
" + successNum + "銆佺紪鍙 " + erpTransactionFlow.getId() + " 瀵煎叆鎴愬姛"); + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "銆佺紪鍙 " + erpTransactionFlow.getId() + " 瀵煎叆澶辫触锛"; + if (e instanceof ConstraintViolationException){ + ConstraintViolationException cve = (ConstraintViolationException)e; + for (ConstraintViolation violation : cve.getConstraintViolations()) { + msg += Global.getText(violation.getMessage()) + " ("+violation.getPropertyPath()+")"; + } + }else{ + msg += e.getMessage(); + } + failureMsg.append(msg); + logger.error(msg, e); + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + failureMsg.append(e.getMessage()); + return failureMsg.toString(); + } + if (failureNum > 0) { + failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細"); + throw new ServiceException(failureMsg.toString()); + }else{ + successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏 " + successNum + " 鏉★紝鏁版嵁濡備笅锛"); + } + return successMsg.toString(); + } + + /** + * 鏇存柊鐘舵 + * @param erpTransactionFlow 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void updateStatus(ErpTransactionFlow erpTransactionFlow) { + super.updateStatus(erpTransactionFlow); + } + + /** + * 鍒犻櫎鏁版嵁 + * @param erpTransactionFlow 鏁版嵁瀵硅薄 + */ + @Override + @Transactional + public void delete(ErpTransactionFlow erpTransactionFlow) { + super.delete(erpTransactionFlow); + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/web/ErpAccountController.java b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpAccountController.java new file mode 100644 index 00000000..f0d9fc25 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpAccountController.java @@ -0,0 +1,146 @@ +package com.jeesite.modules.erp.web; + +import java.util.List; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +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.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.ErpAccount; +import com.jeesite.modules.erp.service.ErpAccountService; + +/** + * 璐︽埛淇℃伅Controller + * @author gaoxq + * @version 2025-11-29 + */ +@Controller +@RequestMapping(value = "${adminPath}/erp/account") +public class ErpAccountController extends BaseController { + + private final ErpAccountService erpAccountService; + + public ErpAccountController(ErpAccountService erpAccountService) { + this.erpAccountService = erpAccountService; + } + + /** + * 鑾峰彇鏁版嵁 + */ + @ModelAttribute + public ErpAccount get(String accountId, boolean isNewRecord) { + return erpAccountService.get(accountId, isNewRecord); + } + + /** + * 鏌ヨ鍒楄〃 + */ + @RequiresPermissions("erp:account:view") + @RequestMapping(value = {"list", ""}) + public String list(ErpAccount erpAccount, Model model) { + model.addAttribute("erpAccount", erpAccount); + return "modules/erp/erpAccountList"; + } + + /** + * 鏌ヨ鍒楄〃鏁版嵁 + */ + @RequiresPermissions("erp:account:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(ErpAccount erpAccount, HttpServletRequest request, HttpServletResponse response) { + erpAccount.setPage(new Page<>(request, response)); + Page page = erpAccountService.findPage(erpAccount); + return page; + } + + /** + * 鏌ョ湅缂栬緫琛ㄥ崟 + */ + @RequiresPermissions("erp:account:view") + @RequestMapping(value = "form") + public String form(ErpAccount erpAccount, Model model) { + model.addAttribute("erpAccount", erpAccount); + return "modules/erp/erpAccountForm"; + } + + /** + * 淇濆瓨鏁版嵁 + */ + @RequiresPermissions("erp:account:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated ErpAccount erpAccount) { + erpAccountService.save(erpAccount); + return renderResult(Global.TRUE, text("淇濆瓨璐︽埛淇℃伅鎴愬姛锛")); + } + + /** + * 瀵煎嚭鏁版嵁 + */ + @RequiresPermissions("erp:account:view") + @RequestMapping(value = "exportData") + public void exportData(ErpAccount erpAccount, HttpServletResponse response) { + List list = erpAccountService.findList(erpAccount); + String fileName = "璐︽埛淇℃伅" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try(ExcelExport ee = new ExcelExport("璐︽埛淇℃伅", ErpAccount.class)){ + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 涓嬭浇妯℃澘 + */ + @RequiresPermissions("erp:account:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + ErpAccount erpAccount = new ErpAccount(); + List list = ListUtils.newArrayList(erpAccount); + String fileName = "璐︽埛淇℃伅妯℃澘.xlsx"; + try(ExcelExport ee = new ExcelExport("璐︽埛淇℃伅", ErpAccount.class, Type.IMPORT)){ + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 瀵煎叆鏁版嵁 + */ + @ResponseBody + @RequiresPermissions("erp:account:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file) { + try { + String message = erpAccountService.importData(file); + return renderResult(Global.TRUE, "posfull:"+message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:"+ex.getMessage()); + } + } + + /** + * 鍒犻櫎鏁版嵁 + */ + @RequiresPermissions("erp:account:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(ErpAccount erpAccount) { + erpAccountService.delete(erpAccount); + return renderResult(Global.TRUE, text("鍒犻櫎璐︽埛淇℃伅鎴愬姛锛")); + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/web/ErpCategoryController.java b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpCategoryController.java new file mode 100644 index 00000000..f290acdf --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpCategoryController.java @@ -0,0 +1,154 @@ +package com.jeesite.modules.erp.web; + +import java.util.List; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +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.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.ErpCategory; +import com.jeesite.modules.erp.service.ErpCategoryService; + +/** + * 鍒嗙被淇℃伅Controller + * + * @author gaoxq + * @version 2025-11-29 + */ +@Controller +@RequestMapping(value = "${adminPath}/erp/category") +public class ErpCategoryController extends BaseController { + + private final ErpCategoryService erpCategoryService; + + public ErpCategoryController(ErpCategoryService erpCategoryService) { + this.erpCategoryService = erpCategoryService; + } + + /** + * 鑾峰彇鏁版嵁 + */ + @ModelAttribute + public ErpCategory get(String categoryId, boolean isNewRecord) { + return erpCategoryService.get(categoryId, isNewRecord); + } + + /** + * 鏌ヨ鍒楄〃 + */ + @RequiresPermissions("erp:category:view") + @RequestMapping(value = {"list", ""}) + public String list(ErpCategory erpCategory, Model model) { + model.addAttribute("erpCategory", erpCategory); + return "modules/erp/erpCategoryList"; + } + + /** + * 鏌ヨ鍒楄〃鏁版嵁 + */ + @RequiresPermissions("erp:category:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(ErpCategory erpCategory, HttpServletRequest request, HttpServletResponse response) { + erpCategory.setPage(new Page<>(request, response)); + Page page = erpCategoryService.findPage(erpCategory); + return page; + } + + /** + * 鏌ョ湅缂栬緫琛ㄥ崟 + */ + @RequiresPermissions("erp:category:view") + @RequestMapping(value = "form") + public String form(ErpCategory erpCategory, Model model) { + model.addAttribute("erpCategory", erpCategory); + return "modules/erp/erpCategoryForm"; + } + + /** + * 淇濆瓨鏁版嵁 + */ + @RequiresPermissions("erp:category:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated ErpCategory erpCategory) { + erpCategoryService.save(erpCategory); + return renderResult(Global.TRUE, text("淇濆瓨鍒嗙被淇℃伅鎴愬姛锛")); + } + + /** + * 瀵煎嚭鏁版嵁 + */ + @RequiresPermissions("erp:category:view") + @RequestMapping(value = "exportData") + public void exportData(ErpCategory erpCategory, HttpServletResponse response) { + List list = erpCategoryService.findList(erpCategory); + String fileName = "鍒嗙被淇℃伅" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try (ExcelExport ee = new ExcelExport("鍒嗙被淇℃伅", ErpCategory.class)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 涓嬭浇妯℃澘 + */ + @RequiresPermissions("erp:category:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + ErpCategory erpCategory = new ErpCategory(); + List list = ListUtils.newArrayList(erpCategory); + String fileName = "鍒嗙被淇℃伅妯℃澘.xlsx"; + try (ExcelExport ee = new ExcelExport("鍒嗙被淇℃伅", ErpCategory.class, Type.IMPORT)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 瀵煎叆鏁版嵁 + */ + @ResponseBody + @RequiresPermissions("erp:category:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file) { + try { + String message = erpCategoryService.importData(file); + return renderResult(Global.TRUE, "posfull:" + message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:" + ex.getMessage()); + } + } + + /** + * 鍒犻櫎鏁版嵁 + */ + @RequiresPermissions("erp:category:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(ErpCategory erpCategory) { + erpCategoryService.delete(erpCategory); + return renderResult(Global.TRUE, text("鍒犻櫎鍒嗙被淇℃伅鎴愬姛锛")); + } + + @RequestMapping(value = "listAll") + @ResponseBody + public List listAll(ErpCategory erpCategory) { + return erpCategoryService.findList(erpCategory); + } + +} \ 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 new file mode 100644 index 00000000..b9bf6777 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpExpenseController.java @@ -0,0 +1,146 @@ +package com.jeesite.modules.erp.web; + +import java.util.List; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +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.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 2025-11-29 + */ +@Controller +@RequestMapping(value = "${adminPath}/erp/expense") +public class ErpExpenseController extends BaseController { + + private final ErpExpenseService erpExpenseService; + + 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; + } + + /** + * 鏌ョ湅缂栬緫琛ㄥ崟 + */ + @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("鍒犻櫎鏀嚭淇℃伅鎴愬姛锛")); + } + +} \ 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 new file mode 100644 index 00000000..1ff9ae68 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpIncomeController.java @@ -0,0 +1,146 @@ +package com.jeesite.modules.erp.web; + +import java.util.List; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +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.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.ErpIncome; +import com.jeesite.modules.erp.service.ErpIncomeService; + +/** + * 鏀跺叆淇℃伅Controller + * @author gaoxq + * @version 2025-11-29 + */ +@Controller +@RequestMapping(value = "${adminPath}/erp/income") +public class ErpIncomeController extends BaseController { + + private final ErpIncomeService erpIncomeService; + + 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; + } + + /** + * 鏌ョ湅缂栬緫琛ㄥ崟 + */ + @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("鍒犻櫎鏀跺叆淇℃伅鎴愬姛锛")); + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/erp/web/ErpTransactionFlowController.java b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpTransactionFlowController.java new file mode 100644 index 00000000..d81b2746 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/erp/web/ErpTransactionFlowController.java @@ -0,0 +1,205 @@ +package com.jeesite.modules.erp.web; + +import java.util.Date; +import java.util.List; + +import com.jeesite.modules.erp.entity.ErpAccount; +import com.jeesite.modules.erp.entity.ErpExpense; +import com.jeesite.modules.erp.entity.ErpIncome; +import com.jeesite.modules.erp.service.ErpAccountService; +import com.jeesite.modules.erp.service.ErpExpenseService; +import com.jeesite.modules.erp.service.ErpIncomeService; +import com.jeesite.modules.utils.BigDecimalUtils; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +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.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.ErpTransactionFlow; +import com.jeesite.modules.erp.service.ErpTransactionFlowService; + +/** + * 鏄庣粏淇℃伅Controller + * + * @author gaoxq + * @version 2025-11-29 + */ +@Controller +@RequestMapping(value = "${adminPath}/erp/transactionFlow") +public class ErpTransactionFlowController extends BaseController { + + + @Resource + private ErpAccountService erpAccountService; + + @Resource + private ErpExpenseService erpExpenseService; + + @Resource + private ErpIncomeService erpIncomeService; + + private final ErpTransactionFlowService erpTransactionFlowService; + + public ErpTransactionFlowController(ErpTransactionFlowService erpTransactionFlowService) { + this.erpTransactionFlowService = erpTransactionFlowService; + } + + /** + * 鑾峰彇鏁版嵁 + */ + @ModelAttribute + public ErpTransactionFlow get(String flowId, boolean isNewRecord) { + return erpTransactionFlowService.get(flowId, isNewRecord); + } + + /** + * 鏌ヨ鍒楄〃 + */ + @RequiresPermissions("erp:transactionFlow:view") + @RequestMapping(value = {"list", ""}) + public String list(ErpTransactionFlow erpTransactionFlow, Model model) { + model.addAttribute("erpTransactionFlow", erpTransactionFlow); + return "modules/erp/erpTransactionFlowList"; + } + + /** + * 鏌ヨ鍒楄〃鏁版嵁 + */ + @RequiresPermissions("erp:transactionFlow:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(ErpTransactionFlow erpTransactionFlow, HttpServletRequest request, HttpServletResponse response) { + erpTransactionFlow.setPage(new Page<>(request, response)); + Page page = erpTransactionFlowService.findPage(erpTransactionFlow); + return page; + } + + /** + * 鏌ョ湅缂栬緫琛ㄥ崟 + */ + @RequiresPermissions("erp:transactionFlow:view") + @RequestMapping(value = "form") + public String form(ErpTransactionFlow erpTransactionFlow, Model model) { + model.addAttribute("erpTransactionFlow", erpTransactionFlow); + return "modules/erp/erpTransactionFlowForm"; + } + + /** + * 淇濆瓨鏁版嵁 + */ + @RequiresPermissions("erp:transactionFlow:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated ErpTransactionFlow erpTransactionFlow) { + erpTransactionFlowService.save(erpTransactionFlow); + return renderResult(Global.TRUE, text("淇濆瓨鏄庣粏淇℃伅鎴愬姛锛")); + } + + /** + * 瀵煎嚭鏁版嵁 + */ + @RequiresPermissions("erp:transactionFlow:view") + @RequestMapping(value = "exportData") + public void exportData(ErpTransactionFlow erpTransactionFlow, HttpServletResponse response) { + List list = erpTransactionFlowService.findList(erpTransactionFlow); + String fileName = "鏄庣粏淇℃伅" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try (ExcelExport ee = new ExcelExport("鏄庣粏淇℃伅", ErpTransactionFlow.class)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 涓嬭浇妯℃澘 + */ + @RequiresPermissions("erp:transactionFlow:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + ErpTransactionFlow erpTransactionFlow = new ErpTransactionFlow(); + List list = ListUtils.newArrayList(erpTransactionFlow); + String fileName = "鏄庣粏淇℃伅妯℃澘.xlsx"; + try (ExcelExport ee = new ExcelExport("鏄庣粏淇℃伅", ErpTransactionFlow.class, Type.IMPORT)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 瀵煎叆鏁版嵁 + */ + @ResponseBody + @RequiresPermissions("erp:transactionFlow:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file) { + try { + String message = erpTransactionFlowService.importData(file); + return renderResult(Global.TRUE, "posfull:" + message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:" + ex.getMessage()); + } + } + + /** + * 鍒犻櫎鏁版嵁 + */ + @RequiresPermissions("erp:transactionFlow:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(ErpTransactionFlow erpTransactionFlow) { + erpTransactionFlowService.delete(erpTransactionFlow); + return renderResult(Global.TRUE, text("鍒犻櫎鏄庣粏淇℃伅鎴愬姛锛")); + } + + /** + * 璁拌处鏄庣粏 + */ + @RequiresPermissions("erp:transactionFlow:edit") + @RequestMapping(value = "finish") + @ResponseBody + public String finish(ErpTransactionFlow erpTransactionFlow) { + ErpTransactionFlow flow = erpTransactionFlowService.get(erpTransactionFlow); + ErpAccount account = erpAccountService.get(flow.getAccountId()); + switch (flow.getTransactionType()) { + case "1": + ErpExpense expense = new ErpExpense(); + expense.setZflowId(flow.getFlowId()); + expense.setAccountId(flow.getAccountId()); + expense.setCategoryId(flow.getCategoryId()); + expense.setAmount(flow.getAmount()); + erpExpenseService.save(expense); + account.setCurrentBalance(BigDecimalUtils.subtract(account.getCurrentBalance(), flow.getAmount())); + break; + case "2": + ErpIncome income = new ErpIncome(); + income.setSflowId(flow.getFlowId()); + income.setAccountId(flow.getAccountId()); + income.setCategoryId(flow.getCategoryId()); + income.setAmount(flow.getAmount()); + erpIncomeService.save(income); + account.setCurrentBalance(BigDecimalUtils.add(account.getCurrentBalance(), flow.getAmount())); + break; + } + + flow.setIsFinish("1"); + flow.setTransactionTime(new Date()); + account.setUpdateTime(new Date()); + erpAccountService.save(account); + erpTransactionFlowService.save(flow); + 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 00000000..e6c3ebab --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/utils/BigDecimalUtils.java @@ -0,0 +1,89 @@ +package com.jeesite.modules.utils; + + +import java.math.BigDecimal; +import java.math.RoundingMode; +public class BigDecimalUtils { + + + /** + * 鍔犳硶杩愮畻 + * + * @param num1 绗竴涓暟 + * @param num2 绗簩涓暟 + * @return 涓ゆ暟涔嬪拰 + */ + public static BigDecimal add(BigDecimal num1, BigDecimal num2) { + // 閬垮厤绌烘寚閽堬紝榛樿绌哄间负 0 + if (num1 == null) { + num1 = BigDecimal.ZERO; + } + if (num2 == null) { + num2 = BigDecimal.ZERO; + } + return num1.add(num2); + } + + /** + * 鍑忔硶杩愮畻 + * + * @param num1 琚噺鏁 + * @param num2 鍑忔暟 + * @return 涓ゆ暟涔嬪樊锛坣um1 - num2锛 + */ + public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) { + if (num1 == null) { + num1 = BigDecimal.ZERO; + } + if (num2 == null) { + num2 = BigDecimal.ZERO; + } + return num1.subtract(num2); + } + + /** + * 涔樻硶杩愮畻 + * + * @param num1 绗竴涓暟 + * @param num2 绗簩涓暟 + * @return 涓ゆ暟涔嬬Н + */ + public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) { + if (num1 == null || num2 == null) { + return BigDecimal.ZERO; + } + return num1.multiply(num2); + } + + /** + * 闄ゆ硶杩愮畻锛堝鐞嗛櫎涓嶅敖鐨勬儏鍐碉紝榛樿淇濈暀2浣嶅皬鏁帮紝鍥涜垗浜斿叆锛 + * + * @param num1 琚櫎鏁 + * @param num2 闄ゆ暟 + * @return 涓ゆ暟涔嬪晢锛坣um1 / num2锛 + */ + public static BigDecimal divide(BigDecimal num1, BigDecimal num2) { + return divide(num1, num2, 2, RoundingMode.HALF_UP); + } + + /** + * 闄ゆ硶杩愮畻锛堣嚜瀹氫箟绮惧害鍜岃垗鍏ユā寮忥級 + * + * @param num1 琚櫎鏁 + * @param num2 闄ゆ暟 + * @param scale 淇濈暀灏忔暟浣嶆暟 + * @param roundingMode 鑸嶅叆妯″紡锛堝鍥涜垗浜斿叆銆佸悜涓婂彇鏁寸瓑锛 + * @return 涓ゆ暟涔嬪晢锛坣um1 / num2锛 + */ + public static BigDecimal divide(BigDecimal num1, BigDecimal num2, int scale, RoundingMode roundingMode) { + if (num1 == null) { + return BigDecimal.ZERO; + } + if (num2 == null || num2.compareTo(BigDecimal.ZERO) == 0) { + throw new ArithmeticException("闄ゆ暟涓嶈兘涓 null 鎴 0"); + } + // 娉ㄦ剰锛歞ivide 鏂规硶蹇呴』鎸囧畾绮惧害鍜岃垗鍏ユā寮忥紝鍚﹀垯闄や笉灏芥椂浼氭姏寮傚父 + return num1.divide(num2, scale, roundingMode); + } + +} diff --git a/web-api/src/main/java/com/jeesite/modules/utils/IpUtils.java b/web-api/src/main/java/com/jeesite/modules/utils/IpUtils.java new file mode 100644 index 00000000..ec642c18 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/utils/IpUtils.java @@ -0,0 +1,92 @@ +package com.jeesite.modules.utils; + +import com.jeesite.common.config.Global; +import com.jeesite.common.io.FileUtils; + +import java.net.*; +import java.util.Enumeration; + +/** + * 鑾峰彇褰撳墠杩愯绋嬪簭鐨処P鍦板潃宸ュ叿绫 + */ +public class IpUtils { + + /** + * 鑾峰彇鏈湴鏈夋晥IP鍦板潃锛堜紭鍏圛Pv4锛屾帓闄ゅ洖鐜/铏氭嫙缃戝崱锛 + * + * @return 鏈湴IP鍦板潃锛岃幏鍙栧け璐ヨ繑鍥瀗ull + */ + public static String getLocalIp() { + try { + // 閬嶅巻鎵鏈夌綉缁滄帴鍙 + Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); + while (interfaces.hasMoreElements()) { + NetworkInterface ni = interfaces.nextElement(); + // 璺宠繃铏氭嫙缃戝崱銆佹湭鍚敤鐨勭綉鍗 + if (ni.isLoopback() || ni.isVirtual() || !ni.isUp()) { + continue; + } + // 閬嶅巻璇ョ綉鍗′笅鐨勬墍鏈塈P鍦板潃 + Enumeration addresses = ni.getInetAddresses(); + while (addresses.hasMoreElements()) { + InetAddress addr = addresses.nextElement(); + // 浠呬繚鐣橧Pv4鍦板潃锛屼笖鎺掗櫎鍥炵幆鍦板潃 + if (addr instanceof Inet4Address && !addr.isLoopbackAddress()) { + String ip = addr.getHostAddress(); + // 杩囨护鎺塪ocker绛夎櫄鎷熺綉鍗$殑IP锛堝彲閫夛紝鏍规嵁瀹為檯鍦烘櫙璋冩暣锛 + if (!ip.startsWith("172.") && !ip.startsWith("192.168.99.")) { + return ip; + } + } + } + } + } catch (SocketException e) { + e.printStackTrace(); + } + return getLoopbackIp(); + } + + /** + * 鑾峰彇鍥炵幆鍦板潃锛127.0.0.1锛 + * + * @return 鍥炵幆IP + */ + private static String getLoopbackIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + return "127.0.0.1"; + } + } + + /** + * 鑾峰彇褰撳墠鏈哄櫒鐨勬墍鏈夌綉鍗P锛堝惈IPv4/IPv6锛 + * + * @return 鎵鏈塈P鏁扮粍 + */ + public static String[] getAllLocalIps() { + try { + java.util.List ipList = new java.util.ArrayList<>(); + Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); + while (interfaces.hasMoreElements()) { + NetworkInterface ni = interfaces.nextElement(); + if (!ni.isUp()) continue; + Enumeration addresses = ni.getInetAddresses(); + while (addresses.hasMoreElements()) { + InetAddress addr = addresses.nextElement(); + ipList.add(addr.getHostAddress()); + } + } + return ipList.toArray(new String[0]); + } catch (SocketException e) { + e.printStackTrace(); + return new String[0]; + } + } + + + public static String getServerHttp() { + return "http://" + getLocalIp() + ":" + Global.getProperty("server.port") + FileUtils.path("/" + + Global.getProperty("server.servlet.context-path")); + } +} diff --git a/web-api/src/main/resources/mappings/modules/erp/ErpAccountDao.xml b/web-api/src/main/resources/mappings/modules/erp/ErpAccountDao.xml new file mode 100644 index 00000000..91aa1d55 --- /dev/null +++ b/web-api/src/main/resources/mappings/modules/erp/ErpAccountDao.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/web-api/src/main/resources/mappings/modules/erp/ErpCategoryDao.xml b/web-api/src/main/resources/mappings/modules/erp/ErpCategoryDao.xml new file mode 100644 index 00000000..7b400284 --- /dev/null +++ b/web-api/src/main/resources/mappings/modules/erp/ErpCategoryDao.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/web-api/src/main/resources/mappings/modules/erp/ErpExpenseDao.xml b/web-api/src/main/resources/mappings/modules/erp/ErpExpenseDao.xml new file mode 100644 index 00000000..d768aba7 --- /dev/null +++ b/web-api/src/main/resources/mappings/modules/erp/ErpExpenseDao.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/web-api/src/main/resources/mappings/modules/erp/ErpIncomeDao.xml b/web-api/src/main/resources/mappings/modules/erp/ErpIncomeDao.xml new file mode 100644 index 00000000..7e313904 --- /dev/null +++ b/web-api/src/main/resources/mappings/modules/erp/ErpIncomeDao.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/web-api/src/main/resources/mappings/modules/erp/ErpTransactionFlowDao.xml b/web-api/src/main/resources/mappings/modules/erp/ErpTransactionFlowDao.xml new file mode 100644 index 00000000..26d3c312 --- /dev/null +++ b/web-api/src/main/resources/mappings/modules/erp/ErpTransactionFlowDao.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/web-vue/package.json b/web-vue/package.json index 62b1d924..2ae24117 100644 --- a/web-vue/package.json +++ b/web-vue/package.json @@ -33,6 +33,7 @@ "@jeesite/core": "workspace:*", "@jeesite/dbm": "workspace:*", "@jeesite/dfm": "workspace:*", + "@jeesite/erp": "workspace:^", "@jeesite/test": "workspace:*", "@jeesite/types": "workspace:*", "@jeesite/vite": "workspace:*", diff --git a/web-vue/packages/assets/images/header.jpg b/web-vue/packages/assets/images/header.jpg index 04863b199525ab1d22fef2df856335fa722e8d5a..b0c228a7f406fa31f662ac02ab5662b5c30dfc5b 100644 GIT binary patch literal 58373 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 BJRJZ4 literal 15664 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 ZeKP%@5!U}L_1`MTzq9<8d-}7{{{<(RUF84( diff --git a/web-vue/packages/assets/images/logo.png b/web-vue/packages/assets/images/logo.png index 3477d02af6c952288b7dcf378e121244c39474e2..0c9c06d5c05259daff298315487822fea05cdd97 100644 GIT binary patch literal 14057 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 b>Ta0I8MD!RS~AyviqGVwm8B{rOoRU~(DGtr literal 7419 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 Z&x7~c-v?SiHw7L7O*K8$O2F>T{{z#rJEH&q diff --git a/web-vue/packages/assets/svg/login-box-bg.svg b/web-vue/packages/assets/svg/login-box-bg.svg index 61fa1e98..5f81c5b2 100644 --- a/web-vue/packages/assets/svg/login-box-bg.svg +++ b/web-vue/packages/assets/svg/login-box-bg.svg @@ -1,98 +1 @@ - - - - - - - - - - - - responsive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/web-vue/packages/biz/api/biz/listItem.ts b/web-vue/packages/biz/api/biz/listItem.ts index deb09b19..f049a377 100644 --- a/web-vue/packages/biz/api/biz/listItem.ts +++ b/web-vue/packages/biz/api/biz/listItem.ts @@ -68,5 +68,10 @@ export const bizListItemImportData = ( params, ); +export const bizListItemSflow = (params?: BizListItem | any) => + defHttp.get({ url: adminPath + '/biz/listItem/sflow', params }); + export const bizListItemDelete = (params?: BizListItem | any) => defHttp.get({ url: adminPath + '/biz/listItem/delete', params }); + + diff --git a/web-vue/packages/biz/api/biz/projectInfo.ts b/web-vue/packages/biz/api/biz/projectInfo.ts index a07a5c7b..a9334c57 100644 --- a/web-vue/packages/biz/api/biz/projectInfo.ts +++ b/web-vue/packages/biz/api/biz/projectInfo.ts @@ -32,6 +32,9 @@ export interface BizProjectInfo extends BasicModel { export const bizProjectInfoList = (params?: BizProjectInfo | any) => defHttp.get({ url: adminPath + '/biz/projectInfo/list', params }); + +export const bizProjectInfoListAll = (params?: BizProjectInfo | any) => + defHttp.get({ url: adminPath + '/biz/projectInfo/listAll', params }); export const bizProjectInfoListData = (params?: BizProjectInfo | any) => defHttp.post>({ url: adminPath + '/biz/projectInfo/listData', params }); diff --git a/web-vue/packages/biz/views/biz/listItem/form.vue b/web-vue/packages/biz/views/biz/listItem/form.vue index 48516032..902d3583 100644 --- a/web-vue/packages/biz/views/biz/listItem/form.vue +++ b/web-vue/packages/biz/views/biz/listItem/form.vue @@ -50,25 +50,15 @@ maxlength: 512, }, required: true, - colProps: { md: 24, lg: 24 }, }, { - label: t('鏄惁鍒犻櫎'), - field: 'titleDelete', - component: 'Select', - componentProps: { - dictType: 'title_delete', - allowClear: true, - }, - }, - { - label: t('鍙戦佹椂闂'), + label: t('鍒版湡鏃堕棿'), field: 'datetime', component: 'DatePicker', componentProps: { - format: 'YYYY-MM-DD', - showTime: false, - }, + format: 'YYYY-MM-DD HH:mm', + showTime: { format: 'HH:mm' }, + }, }, { label: t('鎵灞炵被鍨'), @@ -81,32 +71,17 @@ required: true, }, { - label: t('鏄惁鍏抽棴'), - field: 'clickClose', - component: 'Select', + label: t('閫氱煡浜哄憳'), + field: 'loginUser', + fieldLabel: 'userName', + component: 'ListSelect', componentProps: { - dictType: 'click_close', - allowClear: true, + selectType: 'userSelect', }, + required: true, }, { - label: t('寰呭姙鐘舵'), - field: 'extra', - component: 'Input', - componentProps: { - maxlength: 64, - }, - }, - { - label: t('棰滆壊缂栫爜'), - field: 'color', - component: 'Input', - componentProps: { - maxlength: 32, - }, - }, - { - label: t('鎻忚堪淇℃伅'), + label: t('鍐呭淇℃伅'), field: 'description', component: 'InputTextArea', required: true, diff --git a/web-vue/packages/biz/views/biz/listItem/list.vue b/web-vue/packages/biz/views/biz/listItem/list.vue index 2c0f46e6..cde7250d 100644 --- a/web-vue/packages/biz/views/biz/listItem/list.vue +++ b/web-vue/packages/biz/views/biz/listItem/list.vue @@ -18,11 +18,14 @@ {{ t('鏂板') }} - - - + + @@ -28,7 +29,7 @@ import NoticeList from './NoticeList.vue'; import { useDesign } from '@jeesite/core/hooks/web/useDesign'; import { useMessage } from '@jeesite/core/hooks/web/useMessage'; - import { tabListDataAll, TabItem, BizListItem } from '@jeesite/biz/api/biz/listItem'; + import { tabListDataAll, bizListItemSflow, TabItem, BizListItem } from '@jeesite/biz/api/biz/listItem'; export default defineComponent({ components: { Popover, BellOutlined, Tabs, TabPane: Tabs.TabPane, Badge, NoticeList }, @@ -53,10 +54,11 @@ } return count; }); - - function onNoticeClick(record: BizListItem) { - createMessage.success('浣犵偣鍑讳簡' + record.title); - getDataList() + + async function onNoticeClick(record: BizListItem) { + const res = await bizListItemSflow(record); + createMessage.success(res.message); + getDataList() } onMounted(() => { diff --git a/web-vue/packages/core/layouts/views/desktop/analysis/components/Data.tsx b/web-vue/packages/core/layouts/views/desktop/analysis/components/Data.tsx index a37cdfeb..31c2be54 100644 --- a/web-vue/packages/core/layouts/views/desktop/analysis/components/Data.tsx +++ b/web-vue/packages/core/layouts/views/desktop/analysis/components/Data.tsx @@ -121,168 +121,6 @@ export const groupItems: GroupItem[] = [ group: '鍓嶇缁', date: '2021-09-01', }, - { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { - title: 'Vue', - icon: 'i-ion:logo-vue', - color: '#3fb27f', - desc: '鐜板湪鐨勪綘鍐冲畾灏嗘潵鐨勪綘銆', - group: '鍓嶇缁', - date: '2021-09-01', - }, { title: 'Html5', icon: 'i-ion:logo-html5', diff --git a/web-vue/packages/core/layouts/views/desktop/analysis/components/ProjectCard.vue b/web-vue/packages/core/layouts/views/desktop/analysis/components/ProjectCard.vue index b8361ee4..c1455732 100644 --- a/web-vue/packages/core/layouts/views/desktop/analysis/components/ProjectCard.vue +++ b/web-vue/packages/core/layouts/views/desktop/analysis/components/ProjectCard.vue @@ -3,19 +3,37 @@ - -
-