From 4ca675870d4555dc63e281c5e39e858581905ae2 Mon Sep 17 00:00:00 2001 From: "SGK\\17962" <1796293269@qq.com> Date: Wed, 16 Jul 2025 16:11:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/locales/langs/en-us.ts | 1 + .../src/locales/langs/zh-cn.ts | 4 +- .../src/router/elegant/imports.ts | 1 + .../src/router/elegant/routes.ts | 9 + .../src/router/elegant/transform.ts | 1 + .../src/service/api/business/businessType.ts | 36 +++ cds-fontend-2025.V1/src/typings/api/api.d.ts | 24 ++ .../src/typings/api/business.api.d.ts | 54 ++++ cds-fontend-2025.V1/src/typings/app.d.ts | 15 + .../src/typings/components.d.ts | 2 + .../src/typings/elegant-router.d.ts | 3 + .../src/views/subcategory/index.vue | 285 ++++++++++++++++++ .../subcategory/modules/operate-drawer.vue | 158 ++++++++++ .../src/views/subcategory/modules/search.vue | 79 +++++ .../src/main/resources/application-dev.yml | 2 +- .../BusinessSubcategoryController.java | 134 ++++++++ .../business/domain/BusinessSubcategory.java | 56 ++++ .../domain/bo/BusinessSubcategoryBo.java | 57 ++++ .../vo/BusinessSubcategoryImportVo.java | 64 ++++ .../domain/vo/BusinessSubcategoryVo.java | 68 +++++ .../BusinessSubcategoryImportListener.java | 118 ++++++++ .../mapper/BusinessSubcategoryMapper.java | 36 +++ .../service/IBusinessSubcategoryService.java | 68 +++++ .../impl/BusinessSubcategoryServiceImpl.java | 136 +++++++++ .../business/BusinessSubcategoryMapper.xml | 7 + cds-platform-2025.V1/script/sql/business.sql | 27 ++ 26 files changed, 1443 insertions(+), 2 deletions(-) create mode 100644 cds-fontend-2025.V1/src/service/api/business/businessType.ts create mode 100644 cds-fontend-2025.V1/src/typings/api/business.api.d.ts create mode 100644 cds-fontend-2025.V1/src/views/subcategory/index.vue create mode 100644 cds-fontend-2025.V1/src/views/subcategory/modules/operate-drawer.vue create mode 100644 cds-fontend-2025.V1/src/views/subcategory/modules/search.vue create mode 100644 cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/BusinessSubcategoryController.java create mode 100644 cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/BusinessSubcategory.java create mode 100644 cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/BusinessSubcategoryBo.java create mode 100644 cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/BusinessSubcategoryImportVo.java create mode 100644 cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/BusinessSubcategoryVo.java create mode 100644 cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/listener/BusinessSubcategoryImportListener.java create mode 100644 cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/BusinessSubcategoryMapper.java create mode 100644 cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IBusinessSubcategoryService.java create mode 100644 cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/BusinessSubcategoryServiceImpl.java create mode 100644 cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/BusinessSubcategoryMapper.xml create mode 100644 cds-platform-2025.V1/script/sql/business.sql diff --git a/cds-fontend-2025.V1/src/locales/langs/en-us.ts b/cds-fontend-2025.V1/src/locales/langs/en-us.ts index e09a8e5..8f6ca85 100644 --- a/cds-fontend-2025.V1/src/locales/langs/en-us.ts +++ b/cds-fontend-2025.V1/src/locales/langs/en-us.ts @@ -219,6 +219,7 @@ const local: App.I18n.Schema = { tool_gen: 'Code Generation', system_user: 'User Management', system_dict: 'Dict Management', + system_busitype: 'Business Type Management', system_tenant: 'Tenant Management', 'system_tenant-package': 'Tenant Package Management', system_config: 'Config Management', diff --git a/cds-fontend-2025.V1/src/locales/langs/zh-cn.ts b/cds-fontend-2025.V1/src/locales/langs/zh-cn.ts index 7ffc1cb..2e3dd66 100644 --- a/cds-fontend-2025.V1/src/locales/langs/zh-cn.ts +++ b/cds-fontend-2025.V1/src/locales/langs/zh-cn.ts @@ -13,7 +13,8 @@ const local: App.I18n.Schema = { updateTitle: '系统版本更新通知', updateContent: '检测到系统有新版本发布,是否立即刷新页面?', updateConfirm: '立即刷新', - updateCancel: '稍后再说' + updateCancel: '稍后再说', + // businessType: '业务类型' }, common: { action: '操作', @@ -219,6 +220,7 @@ const local: App.I18n.Schema = { tool_gen: '代码生成', system_user: '用户管理', system_dict: '字典管理', + system_busitype: '业务类型管理', system_tenant: '租户管理', 'system_tenant-package': '租户套餐', system_config: '参数设置', diff --git a/cds-fontend-2025.V1/src/router/elegant/imports.ts b/cds-fontend-2025.V1/src/router/elegant/imports.ts index 8ae613b..8e02bd0 100644 --- a/cds-fontend-2025.V1/src/router/elegant/imports.ts +++ b/cds-fontend-2025.V1/src/router/elegant/imports.ts @@ -31,6 +31,7 @@ export const views: Record Promise import("@/views/monitor/operlog/index.vue"), "mps_private-ebank-new": () => import("@/views/mps/private-ebank-new/index.vue"), "mps_private-test": () => import("@/views/mps/private-test/index.vue"), + subcategory: () => import("@/views/subcategory/index.vue"), system_client: () => import("@/views/system/client/index.vue"), system_config: () => import("@/views/system/config/index.vue"), system_dept: () => import("@/views/system/dept/index.vue"), diff --git a/cds-fontend-2025.V1/src/router/elegant/routes.ts b/cds-fontend-2025.V1/src/router/elegant/routes.ts index c26c4db..bd307d1 100644 --- a/cds-fontend-2025.V1/src/router/elegant/routes.ts +++ b/cds-fontend-2025.V1/src/router/elegant/routes.ts @@ -191,6 +191,15 @@ export const generatedRoutes: GeneratedRoute[] = [ hideInMenu: true } }, + { + name: 'subcategory', + path: '/subcategory', + component: 'layout.base$view.subcategory', + meta: { + title: 'subcategory', + i18nKey: 'route.subcategory' + } + }, { name: 'system', path: '/system', diff --git a/cds-fontend-2025.V1/src/router/elegant/transform.ts b/cds-fontend-2025.V1/src/router/elegant/transform.ts index 94b263a..06814a2 100644 --- a/cds-fontend-2025.V1/src/router/elegant/transform.ts +++ b/cds-fontend-2025.V1/src/router/elegant/transform.ts @@ -185,6 +185,7 @@ const routeMap: RouteMap = { "mps_private-ebank-new": "/mps/private-ebank-new", "mps_private-test": "/mps/private-test", "social-callback": "/social-callback", + "subcategory": "/subcategory", "system": "/system", "system_client": "/system/client", "system_config": "/system/config", diff --git a/cds-fontend-2025.V1/src/service/api/business/businessType.ts b/cds-fontend-2025.V1/src/service/api/business/businessType.ts new file mode 100644 index 0000000..c7eb410 --- /dev/null +++ b/cds-fontend-2025.V1/src/service/api/business/businessType.ts @@ -0,0 +1,36 @@ +import { request } from '@/service/request'; + +/** 获取业务子类列表 */ +export function fetchGetSubcategoryList (params?: Api.Business.SubcategorySearchParams) { + return request({ + url: '/system/subcategory/list', + method: 'get', + params + }); +} + +/** 新增业务子类 */ +export function fetchCreateSubcategory (data: Api.Business.SubcategoryOperateParams) { + return request({ + url: '/system/subcategory', + method: 'post', + data + }); +} + +/** 修改业务子类 */ +export function fetchUpdateSubcategory (data: Api.Business.SubcategoryOperateParams) { + return request({ + url: '/system/subcategory', + method: 'put', + data + }); +} + +/** 批量删除业务子类 */ +export function fetchBatchDeleteSubcategory (ids: CommonType.IdType[]) { + return request({ + url: `/system/subcategory/${ids.join(',')}`, + method: 'delete' + }); +} diff --git a/cds-fontend-2025.V1/src/typings/api/api.d.ts b/cds-fontend-2025.V1/src/typings/api/api.d.ts index 4c35524..9a2f12b 100644 --- a/cds-fontend-2025.V1/src/typings/api/api.d.ts +++ b/cds-fontend-2025.V1/src/typings/api/api.d.ts @@ -212,4 +212,28 @@ declare namespace Api { home: import('@elegant-router/types').LastLevelRouteKey; } } + namespace System { + import PaginatingQueryRecord = Api.Common.PaginatingQueryRecord; + + /** Business Type */ + interface BusinessType { + id: number; + typeName: string; + // 其他字段... + } + + type BusinessTypeList = PaginatingQueryRecord + + interface BusinessTypeSearchParams extends Common.CommonSearchParams { + typeName?: string; + } + + interface BusinessTypeOperateParams { + [id: string]: any; + typeName: string; + businessType?: string; + // 其他操作参数... + } + } + } diff --git a/cds-fontend-2025.V1/src/typings/api/business.api.d.ts b/cds-fontend-2025.V1/src/typings/api/business.api.d.ts new file mode 100644 index 0000000..ce1b400 --- /dev/null +++ b/cds-fontend-2025.V1/src/typings/api/business.api.d.ts @@ -0,0 +1,54 @@ +/** + * namespace System + * + * backend api module: "System" + */ +declare namespace Api { + namespace Business { + /** subcategory */ + type Subcategory = Common.CommonRecord<{ + /** 主键ID */ + id: CommonType.IdType; + /** 所属大类ID */ + categoryId: CommonType.IdType; + /** 业务类型ID */ + typeId: CommonType.IdType; + /** 业务子类名称 */ + name: string; + /** 关联部门ID */ + deptId: CommonType.IdType; + /** 计价规则说明 */ + pricingRule: string; + }>; + + /** subcategory search params */ + type SubcategorySearchParams = CommonType.RecordNullable< + Pick< + Api.Business.Subcategory, + | 'categoryId' + | 'typeId' + | 'name' + | 'deptId' + | 'pricingRule' + > & + Api.Common.CommonSearchParams + >; + + /** subcategory operate params */ + type SubcategoryOperateParams = CommonType.RecordNullable< + Pick< + Api.Business.Subcategory, + | 'id' + | 'categoryId' + | 'typeId' + | 'name' + | 'deptId' + | 'pricingRule' + > + >; + + /** subcategory list */ + type SubcategoryList = Api.Common.PaginatingQueryRecord; + } +} + diff --git a/cds-fontend-2025.V1/src/typings/app.d.ts b/cds-fontend-2025.V1/src/typings/app.d.ts index d05303b..63c39c2 100644 --- a/cds-fontend-2025.V1/src/typings/app.d.ts +++ b/cds-fontend-2025.V1/src/typings/app.d.ts @@ -643,6 +643,21 @@ declare namespace App { addDept: string; editDept: string; }; + busitype: { + title: string; + busiTypeName: string; + busiTypeCode: string; + status: string; + remark: string; + createTime: string; + form: { + busiTypeId: FormMsg; + busiTypeName: FormMsg; + busiTypeCode: FormMsg; + }; + addBusiType: string; + editBusiType: string; + }; dict: { title: string; dictTypeTitle: string; diff --git a/cds-fontend-2025.V1/src/typings/components.d.ts b/cds-fontend-2025.V1/src/typings/components.d.ts index 675dd47..5edeedd 100644 --- a/cds-fontend-2025.V1/src/typings/components.d.ts +++ b/cds-fontend-2025.V1/src/typings/components.d.ts @@ -11,6 +11,8 @@ declare module 'vue' { AppProvider: typeof import('./../components/common/app-provider.vue')['default'] BetterScroll: typeof import('./../components/custom/better-scroll.vue')['default'] BooleanTag: typeof import('./../components/custom/boolean-tag.vue')['default'] + BusinessTypeList: typeof import('@/views/subcategory/index.vue')['default'] + BusinessTypeOperateDrawer: typeof import('@/views/subcategory/modules/operate-drawer.vue')['default'] ButtonIcon: typeof import('./../components/custom/button-icon.vue')['default'] CountTo: typeof import('./../components/custom/count-to.vue')['default'] DarkModeContainer: typeof import('./../components/common/dark-mode-container.vue')['default'] diff --git a/cds-fontend-2025.V1/src/typings/elegant-router.d.ts b/cds-fontend-2025.V1/src/typings/elegant-router.d.ts index 083520e..4fb4084 100644 --- a/cds-fontend-2025.V1/src/typings/elegant-router.d.ts +++ b/cds-fontend-2025.V1/src/typings/elegant-router.d.ts @@ -39,6 +39,7 @@ declare module "@elegant-router/types" { "mps_private-ebank-new": "/mps/private-ebank-new"; "mps_private-test": "/mps/private-test"; "social-callback": "/social-callback"; + "subcategory": "/subcategory"; "system": "/system"; "system_client": "/system/client"; "system_config": "/system/config"; @@ -102,6 +103,7 @@ declare module "@elegant-router/types" { | "monitor" | "mps" | "social-callback" + | "subcategory" | "system" | "tool" | "user-center" @@ -138,6 +140,7 @@ declare module "@elegant-router/types" { | "monitor_operlog" | "mps_private-ebank-new" | "mps_private-test" + | "subcategory" | "system_client" | "system_config" | "system_dept" diff --git a/cds-fontend-2025.V1/src/views/subcategory/index.vue b/cds-fontend-2025.V1/src/views/subcategory/index.vue new file mode 100644 index 0000000..aaf3f15 --- /dev/null +++ b/cds-fontend-2025.V1/src/views/subcategory/index.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/cds-fontend-2025.V1/src/views/subcategory/modules/operate-drawer.vue b/cds-fontend-2025.V1/src/views/subcategory/modules/operate-drawer.vue new file mode 100644 index 0000000..2701933 --- /dev/null +++ b/cds-fontend-2025.V1/src/views/subcategory/modules/operate-drawer.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/cds-fontend-2025.V1/src/views/subcategory/modules/search.vue b/cds-fontend-2025.V1/src/views/subcategory/modules/search.vue new file mode 100644 index 0000000..3fec698 --- /dev/null +++ b/cds-fontend-2025.V1/src/views/subcategory/modules/search.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/cds-platform-2025.V1/ruoyi-admin/src/main/resources/application-dev.yml b/cds-platform-2025.V1/ruoyi-admin/src/main/resources/application-dev.yml index 54cab14..657ab3d 100644 --- a/cds-platform-2025.V1/ruoyi-admin/src/main/resources/application-dev.yml +++ b/cds-platform-2025.V1/ruoyi-admin/src/main/resources/application-dev.yml @@ -105,7 +105,7 @@ spring.data: # 数据库索引 database: 0 # redis 密码必须配置 - password: 123456 +# password: 123456 # 连接超时时间 timeout: 10s # 是否开启ssl diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/BusinessSubcategoryController.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/BusinessSubcategoryController.java new file mode 100644 index 0000000..76eb683 --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/BusinessSubcategoryController.java @@ -0,0 +1,134 @@ +package org.dromara.business.controller; + +import java.util.List; +import java.util.ArrayList; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.business.domain.vo.BusinessSubcategoryImportVo; +import org.springframework.http.MediaType; +import org.springframework.web.multipart.MultipartFile; +import org.dromara.common.excel.core.ExcelResult; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.business.domain.vo.BusinessSubcategoryVo; +import org.dromara.business.domain.bo.BusinessSubcategoryBo; +import org.dromara.business.service.IBusinessSubcategoryService; +//import org.dromara.business.domain.vo.BusinessSubcategoryImportVo; +import org.dromara.business.listener.BusinessSubcategoryImportListener; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 业务子类 + * + * @author Lion Li + * @date 2025-07-15 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/subcategory") +public class BusinessSubcategoryController extends BaseController { + + private final IBusinessSubcategoryService businessSubcategoryService; + + /** + * 查询业务子类列表 + */ + @SaCheckPermission("system:subcategory:list") + @GetMapping("/list") + public TableDataInfo list(BusinessSubcategoryBo bo, PageQuery pageQuery) { + return businessSubcategoryService.queryPageList(bo, pageQuery); + } + + /** + * 导出业务子类列表 + */ + @SaCheckPermission("system:subcategory:export") + @Log(title = "业务子类", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusinessSubcategoryBo bo, HttpServletResponse response) { + List list = businessSubcategoryService.queryList(bo); + ExcelUtil.exportExcel(list, "业务子类", BusinessSubcategoryVo.class, response); + } + + /** + * 获取导入模板 + */ + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "业务子类", BusinessSubcategoryImportVo.class, response); + } + + /** + * 导入数据 + * + * @param file 导入文件 + * @param updateSupport 是否更新已存在数据 + */ + @Log(title = "业务子类", businessType = BusinessType.IMPORT) + @SaCheckPermission("system:subcategory:import") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { + ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), BusinessSubcategoryImportVo.class, new BusinessSubcategoryImportListener(updateSupport)); + return R.ok(result.getAnalysis()); + } + + /** + * 获取业务子类详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:subcategory:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(businessSubcategoryService.queryById(id)); + } + + /** + * 新增业务子类 + */ + @SaCheckPermission("system:subcategory:add") + @Log(title = "业务子类", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusinessSubcategoryBo bo) { + return toAjax(businessSubcategoryService.insertByBo(bo)); + } + + /** + * 修改业务子类 + */ + @SaCheckPermission("system:subcategory:edit") + @Log(title = "业务子类", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusinessSubcategoryBo bo) { + return toAjax(businessSubcategoryService.updateByBo(bo)); + } + + /** + * 删除业务子类 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:subcategory:remove") + @Log(title = "业务子类", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(businessSubcategoryService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/BusinessSubcategory.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/BusinessSubcategory.java new file mode 100644 index 0000000..5361545 --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/BusinessSubcategory.java @@ -0,0 +1,56 @@ +package org.dromara.business.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 业务子类对象 business_subcategory + * + * @author Lion Li + * @date 2025-07-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("business_subcategory") +public class BusinessSubcategory extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 所属大类ID + */ + private Long categoryId; + + /** + * 业务类型ID + */ + private Long typeId; + + /** + * 业务子类名称 + */ + private String name; + + /** + * 关联部门ID + */ + private Long deptId; + + /** + * 计价规则说明 + */ + private String pricingRule; + + +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/BusinessSubcategoryBo.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/BusinessSubcategoryBo.java new file mode 100644 index 0000000..6272fc2 --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/BusinessSubcategoryBo.java @@ -0,0 +1,57 @@ +package org.dromara.business.domain.bo; + +import org.dromara.business.domain.BusinessSubcategory; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 业务子类业务对象 business_subcategory + * + * @author Lion Li + * @date 2025-07-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusinessSubcategory.class, reverseConvertGenerate = false) +public class BusinessSubcategoryBo extends BaseEntity { + + /** + * 主键ID + */ + private Long id; + + /** + * 所属大类ID + */ + private Long categoryId; + + /** + * 业务类型ID + */ + @NotNull(message = "业务类型ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long typeId; + + /** + * 业务子类名称 + */ + private String name; + + /** + * 关联部门ID + */ + @NotNull(message = "关联部门ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long deptId; + + /** + * 计价规则说明 + */ + @NotBlank(message = "计价规则说明不能为空", groups = { AddGroup.class, EditGroup.class }) + private String pricingRule; + + +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/BusinessSubcategoryImportVo.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/BusinessSubcategoryImportVo.java new file mode 100644 index 0000000..fe1e8d9 --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/BusinessSubcategoryImportVo.java @@ -0,0 +1,64 @@ +package org.dromara.business.domain.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.business.domain.BusinessSubcategory; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 业务子类视图对象 business_subcategory + * + * @author Lion Li + * @date 2025-07-15 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusinessSubcategory.class) +public class BusinessSubcategoryImportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 所属大类ID + */ + @ExcelProperty(value = "所属大类ID") + private Long categoryId; + + /** + * 业务类型ID + */ + @ExcelProperty(value = "业务类型ID") + private Long typeId; + + /** + * 业务子类名称 + */ + @ExcelProperty(value = "业务子类名称") + private String name; + + /** + * 关联部门ID + */ + @ExcelProperty(value = "关联部门ID") + private Long deptId; + + /** + * 计价规则说明 + */ + @ExcelProperty(value = "计价规则说明") + private String pricingRule; + + +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/BusinessSubcategoryVo.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/BusinessSubcategoryVo.java new file mode 100644 index 0000000..8037deb --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/BusinessSubcategoryVo.java @@ -0,0 +1,68 @@ +package org.dromara.business.domain.vo; + +import org.dromara.business.domain.BusinessSubcategory; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 业务子类视图对象 business_subcategory + * + * @author Lion Li + * @date 2025-07-15 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusinessSubcategory.class) +public class BusinessSubcategoryVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 所属大类ID + */ + @ExcelProperty(value = "所属大类ID") + private Long categoryId; + + /** + * 业务类型ID + */ + @ExcelProperty(value = "业务类型ID") + private Long typeId; + + /** + * 业务子类名称 + */ + @ExcelProperty(value = "业务子类名称") + private String name; + + /** + * 关联部门ID + */ + @ExcelProperty(value = "关联部门ID") + private Long deptId; + + /** + * 计价规则说明 + */ + @ExcelProperty(value = "计价规则说明") + private String pricingRule; + + +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/listener/BusinessSubcategoryImportListener.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/listener/BusinessSubcategoryImportListener.java new file mode 100644 index 0000000..c3d7f27 --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/listener/BusinessSubcategoryImportListener.java @@ -0,0 +1,118 @@ +package org.dromara.business.listener; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.http.HtmlUtil; +import cn.idev.excel.context.AnalysisContext; +import cn.idev.excel.event.AnalysisEventListener; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import lombok.extern.slf4j.Slf4j; +import org.dromara.business.domain.bo.BusinessSubcategoryBo; +import org.dromara.business.domain.vo.BusinessSubcategoryImportVo; +import org.dromara.business.service.IBusinessSubcategoryService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.excel.core.ExcelListener; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.satoken.utils.LoginHelper; + + +import java.util.List; + +/** + * 系统用户自定义导入 + * + * @author Lion Li + */ +@Slf4j +public class BusinessSubcategoryImportListener extends AnalysisEventListener implements ExcelListener { + + private final IBusinessSubcategoryService mpsPrivateEbankNewService; + + private final Boolean isUpdateSupport; + + private final Long operUserId; + + private int successNum = 0; + private int failureNum = 0; + private final StringBuilder successMsg = new StringBuilder(); + private final StringBuilder failureMsg = new StringBuilder(); + + public BusinessSubcategoryImportListener(Boolean isUpdateSupport) { + this.mpsPrivateEbankNewService = SpringUtils.getBean(IBusinessSubcategoryService.class); + this.isUpdateSupport = isUpdateSupport; + this.operUserId = LoginHelper.getUserId(); + } + + @Override + public void invoke(BusinessSubcategoryImportVo BusinessSubcategoryImportVo, AnalysisContext context) { + //TODO 自行实现验重逻辑 + //MpsPrivateEbankNewVo mpsPrivateEbankNewVo1 = this.mpsPrivateEbankNewService.queryById(mpsPrivateEbankNewVo.getDataId()); + try { + // TODO 验证是否存在(业务去重),模板默认不存在自行调整 + if (true) { + BusinessSubcategoryBo BusinessSubcategoryBo = BeanUtil.toBean(BusinessSubcategoryImportVo, BusinessSubcategoryBo.class); + ValidatorUtils.validate(BusinessSubcategoryBo); + + this.mpsPrivateEbankNewService.insertByBo(BusinessSubcategoryBo); + + successNum++; + successMsg.append("
").append(successNum).append("、数据 ").append(BusinessSubcategoryBo.getId()).append(" 导入成功"); + } else if (isUpdateSupport) { //存在时是否更新,mps暂定不允许更新,各业务模块自行调整 + BusinessSubcategoryBo BusinessSubcategoryBo = BeanUtil.toBean(BusinessSubcategoryImportVo, BusinessSubcategoryBo.class); + ValidatorUtils.validate(BusinessSubcategoryBo); + + this.mpsPrivateEbankNewService.insertByBo(BusinessSubcategoryBo); + + successNum++; + successMsg.append("
").append(successNum).append("、数据 ").append(BusinessSubcategoryBo.getId()).append(" 更新成功"); + } else { + failureNum++; + failureMsg.append("
").append(failureNum).append("、数据 ").append(BusinessSubcategoryImportVo.getName()).append(" 重复"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、数据 " + HtmlUtil.cleanHtmlTag((BusinessSubcategoryImportVo.getName())) + " 导入失败:"; + String message = e.getMessage(); + if (e instanceof ConstraintViolationException cvException) { + message = StreamUtils.join(cvException.getConstraintViolations(), ConstraintViolation::getMessage, ", "); + } + failureMsg.append(msg).append(message); + log.error(msg, e); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + @Override + public ExcelResult getExcelResult() { + return new ExcelResult<>() { + + @Override + public String getAnalysis() { + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public List getList() { + return null; + } + + @Override + public List getErrorList() { + return null; + } + }; + } +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/BusinessSubcategoryMapper.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/BusinessSubcategoryMapper.java new file mode 100644 index 0000000..4c4b5d2 --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/BusinessSubcategoryMapper.java @@ -0,0 +1,36 @@ +package org.dromara.business.mapper; + +import org.dromara.business.domain.BusinessSubcategory; +import org.dromara.business.domain.vo.BusinessSubcategoryVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; + +/** + * 业务子类Mapper接口 + * + * @author Lion Li + * @date 2025-07-15 + */ +public interface BusinessSubcategoryMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "create_dept"), + @DataColumn(key = "userName", value = "create_by") + }) + default Page selectPageBusinessSubcategoryList(Page page, Wrapper queryWrapper) { + return this.selectVoPage(page, queryWrapper); + } + + + //@DataPermission({ + // @DataColumn(key = "deptName", value = "create_dept"), + // @DataColumn(key = "userName", value = "create_by") + //}) + // List selectBusinessSubcategoryExportList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IBusinessSubcategoryService.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IBusinessSubcategoryService.java new file mode 100644 index 0000000..db05c72 --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IBusinessSubcategoryService.java @@ -0,0 +1,68 @@ +package org.dromara.business.service; + +import org.dromara.business.domain.vo.BusinessSubcategoryVo; +import org.dromara.business.domain.bo.BusinessSubcategoryBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 业务子类Service接口 + * + * @author Lion Li + * @date 2025-07-15 + */ +public interface IBusinessSubcategoryService { + + /** + * 查询业务子类 + * + * @param id 主键 + * @return 业务子类 + */ + BusinessSubcategoryVo queryById(Long id); + + /** + * 分页查询业务子类列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 业务子类分页列表 + */ + TableDataInfo queryPageList(BusinessSubcategoryBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的业务子类列表 + * + * @param bo 查询条件 + * @return 业务子类列表 + */ + List queryList(BusinessSubcategoryBo bo); + + /** + * 新增业务子类 + * + * @param bo 业务子类 + * @return 是否新增成功 + */ + Boolean insertByBo(BusinessSubcategoryBo bo); + + /** + * 修改业务子类 + * + * @param bo 业务子类 + * @return 是否修改成功 + */ + Boolean updateByBo(BusinessSubcategoryBo bo); + + /** + * 校验并批量删除业务子类信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/BusinessSubcategoryServiceImpl.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/BusinessSubcategoryServiceImpl.java new file mode 100644 index 0000000..0747203 --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/BusinessSubcategoryServiceImpl.java @@ -0,0 +1,136 @@ +package org.dromara.business.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.dromara.business.domain.bo.BusinessSubcategoryBo; +import org.dromara.business.domain.vo.BusinessSubcategoryVo; +import org.dromara.business.domain.BusinessSubcategory; +import org.dromara.business.mapper.BusinessSubcategoryMapper; +import org.dromara.business.service.IBusinessSubcategoryService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 业务子类Service业务层处理 + * + * @author Lion Li + * @date 2025-07-15 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class BusinessSubcategoryServiceImpl implements IBusinessSubcategoryService { + + private final BusinessSubcategoryMapper baseMapper; + + /** + * 查询业务子类 + * + * @param id 主键 + * @return 业务子类 + */ + @Override + public BusinessSubcategoryVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询业务子类列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 业务子类分页列表 + */ + @Override + public TableDataInfo queryPageList(BusinessSubcategoryBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectPageBusinessSubcategoryList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的业务子类列表 + * + * @param bo 查询条件 + * @return 业务子类列表 + */ + @Override + public List queryList(BusinessSubcategoryBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusinessSubcategoryBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(BusinessSubcategory::getId); + lqw.eq(bo.getCategoryId() != null, BusinessSubcategory::getCategoryId, bo.getCategoryId()); + lqw.eq(bo.getTypeId() != null, BusinessSubcategory::getTypeId, bo.getTypeId()); + lqw.like(StringUtils.isNotBlank(bo.getName()), BusinessSubcategory::getName, bo.getName()); + lqw.eq(bo.getDeptId() != null, BusinessSubcategory::getDeptId, bo.getDeptId()); + lqw.eq(StringUtils.isNotBlank(bo.getPricingRule()), BusinessSubcategory::getPricingRule, bo.getPricingRule()); + return lqw; + } + + /** + * 新增业务子类 + * + * @param bo 业务子类 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(BusinessSubcategoryBo bo) { + BusinessSubcategory add = MapstructUtils.convert(bo, BusinessSubcategory.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改业务子类 + * + * @param bo 业务子类 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BusinessSubcategoryBo bo) { + BusinessSubcategory update = MapstructUtils.convert(bo, BusinessSubcategory.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusinessSubcategory entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除业务子类信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/BusinessSubcategoryMapper.xml b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/BusinessSubcategoryMapper.xml new file mode 100644 index 0000000..e32e503 --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/BusinessSubcategoryMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/cds-platform-2025.V1/script/sql/business.sql b/cds-platform-2025.V1/script/sql/business.sql new file mode 100644 index 0000000..aa16cb7 --- /dev/null +++ b/cds-platform-2025.V1/script/sql/business.sql @@ -0,0 +1,27 @@ +-- 业务大类表 +CREATE TABLE `business_category` ( + `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` VARCHAR(100) NOT NULL COMMENT '业务类型名称', + `create_dept` VARCHAR(50) DEFAULT NULL COMMENT '创建部门', + `create_by` VARCHAR(50) DEFAULT NULL COMMENT '创建人', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` VARCHAR(50) DEFAULT NULL COMMENT '更新人', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务大类表'; + +-- 业务子类表 +CREATE TABLE `business_subcategory` ( + `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `category_id` INT(11) NOT NULL COMMENT '所属大类ID', + `type_id` INT(11) DEFAULT NULL COMMENT '业务类型ID', + `name` VARCHAR(100) NOT NULL COMMENT '业务子类名称', + `dept_id` INT(11) DEFAULT NULL COMMENT '关联部门ID', + `pricing_rule` TEXT COMMENT '计价规则说明', + `create_dept` VARCHAR(50) DEFAULT NULL COMMENT '创建部门', + `create_by` VARCHAR(50) DEFAULT NULL COMMENT '创建人', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` VARCHAR(50) DEFAULT NULL COMMENT '更新人', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务子类表';