From a354c3ed8983a5c4e064f7790bea0e091575ca2c Mon Sep 17 00:00:00 2001 From: wangsai <1534599297@qq.com> Date: Thu, 25 Sep 2025 11:10:09 +0800 Subject: [PATCH] =?UTF-8?q?app=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClassificationController.java | 28 ++++- .../vo/ClassificationRespVO.java | 3 + .../admin/inout/vo/InoutPageReqVO.java | 6 + .../AppClassificationController.java | 71 +++++++++++ .../app/inout/AppInoutController.java | 116 ++++++++++++++++++ .../book/dal/mysql/inout/InoutMapper.java | 1 + .../book/service/inout/InoutService.java | 2 + .../book/service/inout/InoutServiceImpl.java | 5 + .../resources/mapper/inout/InoutMapper.xml | 36 ++++++ yudao-server/pom.xml | 10 +- .../src/main/resources/application-local.yaml | 6 +- .../src/api/book/classification/index.ts | 2 +- .../classification/ClassificationForm.vue | 19 ++- .../src/views/book/classification/index.vue | 7 +- 14 files changed, 294 insertions(+), 18 deletions(-) create mode 100644 yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/app/classification/AppClassificationController.java create mode 100644 yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/app/inout/AppInoutController.java diff --git a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/classification/ClassificationController.java b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/classification/ClassificationController.java index c917f96..74e3233 100644 --- a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/classification/ClassificationController.java +++ b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/classification/ClassificationController.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.book.controller.admin.classification; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import org.apache.commons.collections4.comparators.ComparatorChain; import org.checkerframework.checker.units.qual.C; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -10,6 +11,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; +import javax.annotation.security.PermitAll; import javax.validation.constraints.*; import javax.validation.*; import javax.servlet.http.*; @@ -27,6 +29,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import cn.iocoder.yudao.module.book.controller.admin.classification.vo.*; import cn.iocoder.yudao.module.book.dal.dataobject.classification.ClassificationDO; @@ -92,19 +95,42 @@ public class ClassificationController { return success(BeanUtils.toBean(pageResult, ClassificationRespVO.class)); } + @GetMapping("/one-page") + @Operation(summary = "获得记账分类分页") + @PreAuthorize("@ss.hasPermission('book:classification:query')") + public CommonResult> getClassificationOnePage(@Valid ClassificationPageReqVO pageReqVO) { + List list = classificationService.selectList(pageReqVO); + pageReqVO.setLevel(1); + PageResult pageResult = classificationService.getClassificationPage(pageReqVO); + PageResult pageResult1 = BeanUtils.toBean(pageResult, ClassificationRespVO.class); + List list1 = pageResult1.getList(); + for (ClassificationRespVO po : list1) { + ArrayList arrayList = new ArrayList<>(); + for (ClassificationDO aDo : list) { + if(po.getId()==aDo.getParentId()){ + arrayList.add(aDo); + } + } + po.setChildren(arrayList); + } + return success(pageResult1); + } + @GetMapping({"/list-all-simple", "simple-list"}) @Operation(summary = "获取菜单精简信息列表", description = "只包含被开启的菜单,用于【角色分配菜单】功能的选项。在多租户的场景下,会只返回租户所在套餐有的菜单") public CommonResult> getSimpleMenuList(ClassificationPageReqVO pageReqVO) { List list = classificationService.selectList(pageReqVO); - list.sort(Comparator.comparing(ClassificationDO::getSn)); + list.sort(Comparator.comparing(ClassificationDO::getSn,Comparator.nullsLast(Comparator.naturalOrder()))); return success(list); } @GetMapping({"/oneTwoLevelList"}) @Operation(summary = "获取菜单精简信息列表", description = "只包含被开启的菜单,用于【角色分配菜单】功能的选项。在多租户的场景下,会只返回租户所在套餐有的菜单") + @PermitAll public CommonResult>> oneTwoLevelList(ClassificationPageReqVO pageReqVO) { + System.out.println("用户名:"+getLoginUserId()); List list = classificationService.selectList(pageReqVO); // list.sort(Comparator.comparing(ClassificationDO::getSn)); List list1 = list.stream().filter(item -> { diff --git a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/classification/vo/ClassificationRespVO.java b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/classification/vo/ClassificationRespVO.java index aa8759c..0dadafb 100644 --- a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/classification/vo/ClassificationRespVO.java +++ b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/classification/vo/ClassificationRespVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.book.controller.admin.classification.vo; +import cn.iocoder.yudao.module.book.dal.dataobject.classification.ClassificationDO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -40,4 +41,6 @@ public class ClassificationRespVO { @ExcelProperty("父级节点") private Integer parentId; + private List children; + } \ No newline at end of file diff --git a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/inout/vo/InoutPageReqVO.java b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/inout/vo/InoutPageReqVO.java index ae832ce..dc6163d 100644 --- a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/inout/vo/InoutPageReqVO.java +++ b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/admin/inout/vo/InoutPageReqVO.java @@ -25,6 +25,10 @@ public class InoutPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDate[] useDate; + private String useDateStart; + + private String useDateEnd; + @Schema(description = "金额") private Long money; @@ -35,4 +39,6 @@ public class InoutPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + private String type; + } \ No newline at end of file diff --git a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/app/classification/AppClassificationController.java b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/app/classification/AppClassificationController.java new file mode 100644 index 0000000..f729879 --- /dev/null +++ b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/app/classification/AppClassificationController.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.book.controller.app.classification; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.book.controller.admin.classification.vo.ClassificationPageReqVO; +import cn.iocoder.yudao.module.book.controller.admin.classification.vo.ClassificationRespVO; +import cn.iocoder.yudao.module.book.controller.admin.classification.vo.ClassificationSaveReqVO; +import cn.iocoder.yudao.module.book.dal.dataobject.classification.ClassificationDO; +import cn.iocoder.yudao.module.book.service.classification.ClassificationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 记账分类") +@RestController +@RequestMapping("/book/classification") +@Validated +public class AppClassificationController { + + @Resource + private ClassificationService classificationService; + + @GetMapping({"/oneTwoLevelList"}) + @Operation(summary = "获取菜单精简信息列表", + description = "只包含被开启的菜单,用于【角色分配菜单】功能的选项。在多租户的场景下,会只返回租户所在套餐有的菜单") + @PermitAll + public CommonResult>> oneTwoLevelList(ClassificationPageReqVO pageReqVO) { + System.out.println("用户名:"+getLoginUserId()); + List list = classificationService.selectList(pageReqVO); + list.sort(Comparator.comparing(ClassificationDO::getSn,Comparator.nullsLast(Comparator.naturalOrder()))); + List list1 = list.stream().filter(item -> { + return "out".equals(item.getType()); + }).collect(Collectors.toList()); + List list11 = list1.stream().filter(item -> { + return item.getLevel()!=null&& item.getLevel()== 1; + }).collect(Collectors.toList()); + List list12 = list1.stream().filter(item -> { + return item.getLevel()!=null&& item.getLevel()== 2; + }).collect(Collectors.toList()); + List list2 = list.stream().filter(item -> { + return "in".equals(item.getType()); + }).collect(Collectors.toList()); + HashMap> map = new HashMap<>(); + map.put("outOne",list11); + map.put("outTwo",list12); + map.put("inOne",list2); + return success(map); + } + +} \ No newline at end of file diff --git a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/app/inout/AppInoutController.java b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/app/inout/AppInoutController.java new file mode 100644 index 0000000..dae0bd2 --- /dev/null +++ b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/controller/app/inout/AppInoutController.java @@ -0,0 +1,116 @@ +package cn.iocoder.yudao.module.book.controller.app.inout; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.book.controller.admin.inout.vo.InoutPageReqVO; +import cn.iocoder.yudao.module.book.controller.admin.inout.vo.InoutRespVO; +import cn.iocoder.yudao.module.book.controller.admin.inout.vo.InoutSaveReqVO; +import cn.iocoder.yudao.module.book.dal.dataobject.inout.InoutDO; +import cn.iocoder.yudao.module.book.service.inout.InoutService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 个人记账") +@RestController +@RequestMapping("/book/inout") +@Validated +public class AppInoutController { + + @Resource + private InoutService inoutService; + + @PostMapping("/create") + @Operation(summary = "创建个人记账") + @PermitAll + public CommonResult createInout(@Valid @RequestBody InoutSaveReqVO createReqVO) { + return success(inoutService.createInout(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新个人记账") + @PreAuthorize("@ss.hasPermission('book:inout:update')") + public CommonResult updateInout(@Valid @RequestBody InoutSaveReqVO updateReqVO) { + inoutService.updateInout(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除个人记账") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('book:inout:delete')") + public CommonResult deleteInout(@RequestParam("id") Integer id) { + inoutService.deleteInout(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得个人记账") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('book:inout:query')") + public CommonResult getInout(@RequestParam("id") Integer id) { + InoutDO inout = inoutService.getInout(id); + return success(BeanUtils.toBean(inout, InoutRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得个人记账分页") + @PreAuthorize("@ss.hasPermission('book:inout:query')") + public CommonResult> getInoutPage(@Valid InoutPageReqVO pageReqVO) { + PageResult pageResult = inoutService.getInoutPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, InoutRespVO.class)); + } + + @GetMapping("/myList") + @Operation(summary = "获得个人记账分页") + @PermitAll + public CommonResult> myList(@Valid InoutPageReqVO pageReqVO) { + Long loginUserId = getLoginUserId(); + pageReqVO.setUserId(loginUserId); + PageResult pageResult = inoutService.myList(pageReqVO); + return success(pageResult); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出个人记账 Excel") + @PreAuthorize("@ss.hasPermission('book:inout:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportInoutExcel(@Valid InoutPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = inoutService.getInoutPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "个人记账.xls", "数据", InoutRespVO.class, + BeanUtils.toBean(list, InoutRespVO.class)); + } + + //统计个人某段时间的支出或收入 + @GetMapping("/myList-tol") + @Operation(summary = "获得个人记账分页") + @PermitAll + public CommonResult myListTol(@Valid InoutPageReqVO pageReqVO) { + Long loginUserId = getLoginUserId(); + pageReqVO.setUserId(loginUserId); + Double tol= inoutService.myListTol(pageReqVO); + return success(tol); + } + +} \ No newline at end of file diff --git a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/dal/mysql/inout/InoutMapper.java b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/dal/mysql/inout/InoutMapper.java index 42de2cb..5cefc95 100644 --- a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/dal/mysql/inout/InoutMapper.java +++ b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/dal/mysql/inout/InoutMapper.java @@ -36,4 +36,5 @@ public interface InoutMapper extends BaseMapperX { IPage myList(IPage page,@Param("query") InoutPageReqVO pageReqVO); + Double myListTol(@Param("query") InoutPageReqVO pageReqVO); } \ No newline at end of file diff --git a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/service/inout/InoutService.java b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/service/inout/InoutService.java index 35418d1..7f01245 100644 --- a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/service/inout/InoutService.java +++ b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/service/inout/InoutService.java @@ -60,4 +60,6 @@ public interface InoutService { PageResult getInoutPage(InoutPageReqVO pageReqVO); PageResult myList(InoutPageReqVO pageReqVO); + + Double myListTol(InoutPageReqVO pageReqVO); } \ No newline at end of file diff --git a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/service/inout/InoutServiceImpl.java b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/service/inout/InoutServiceImpl.java index b0f79a0..7210c1e 100644 --- a/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/service/inout/InoutServiceImpl.java +++ b/yudao-module-book/src/main/java/cn/iocoder/yudao/module/book/service/inout/InoutServiceImpl.java @@ -92,4 +92,9 @@ public class InoutServiceImpl implements InoutService { return new PageResult<>(pageResult.getRecords(), pageResult.getTotal()); } + @Override + public Double myListTol(InoutPageReqVO pageReqVO) { + return inoutMapper.myListTol(pageReqVO); + } + } \ No newline at end of file diff --git a/yudao-module-book/src/main/resources/mapper/inout/InoutMapper.xml b/yudao-module-book/src/main/resources/mapper/inout/InoutMapper.xml index 9699e95..1e78433 100644 --- a/yudao-module-book/src/main/resources/mapper/inout/InoutMapper.xml +++ b/yudao-module-book/src/main/resources/mapper/inout/InoutMapper.xml @@ -18,8 +18,44 @@ INNER JOIN book_classification c ON i.class_id = c.id WHERE i.deleted = 0 + + + and i.creator = #{query.userId} + + + and c.type = #{query.type} + + ORDER BY i.use_date DESC, i.create_time desc + + + \ No newline at end of file diff --git a/yudao-server/pom.xml b/yudao-server/pom.xml index a6d7e43..7b10106 100644 --- a/yudao-server/pom.xml +++ b/yudao-server/pom.xml @@ -37,11 +37,11 @@ ${revision} - - - - - + + cn.iocoder.boot + yudao-module-member + ${revision} + diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 27fc2c5..d717e07 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -210,10 +210,12 @@ wx: # secret: 333ae72f41552af1e998fe1f54e1584a # appid: wx63c280fe3248a3e7 # wenhualian的接口测试号 # secret: 6f270509224a7ae1296bbf1c8cb97aed - appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的) - secret: 4a1a04e07f6a4a0751b39c3064a92c8b +# appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的) +# secret: 4a1a04e07f6a4a0751b39c3064a92c8b # appid: wx66186af0759f47c9 # 测试号(puhui 提供的) # secret: 3218bcbd112cbc614c7264ceb20144ac + appid: wx8002cc7a350eb380 # 我的测试号 + secret: d60cfbb7b934e494f10ba7fe42beb0f6 config-storage: type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 key-prefix: wa # Redis Key 的前缀 diff --git a/yudao-ui/yudao-ui-admin-vue3/src/api/book/classification/index.ts b/yudao-ui/yudao-ui-admin-vue3/src/api/book/classification/index.ts index 416ea22..6fa62ac 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/api/book/classification/index.ts +++ b/yudao-ui/yudao-ui-admin-vue3/src/api/book/classification/index.ts @@ -14,7 +14,7 @@ export interface Classification { export const ClassificationApi = { // 查询记账分类分页 getClassificationPage: async (params: any) => { - return await request.get({ url: `/book/classification/page`, params }) + return await request.get({ url: `/book/classification/one-page`, params }) }, // 查询记账分类分页 getSimpleMenusList: async (params: any) => { diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/book/classification/ClassificationForm.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/book/classification/ClassificationForm.vue index 8062c04..a8c127a 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/book/classification/ClassificationForm.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/book/classification/ClassificationForm.vue @@ -15,14 +15,12 @@ :props="defaultProps" check-strictly node-key="id" + @change="changeOne" /> - - - @@ -111,11 +109,12 @@ const submitForm = async () => { /** 获取下拉框[上级菜单]的数据 */ const menuTree = ref([]) // 树形结构 +let allMenuList=[] const getTree = async () => { menuTree.value = [] - const res = await ClassificationApi.getSimpleMenusList() + allMenuList = await ClassificationApi.getSimpleMenusList({}) let menu: Tree = { id: 0, name: '主分类', children: [] } - const ress = res.map(node => { + const ress = allMenuList.map(node => { node.name = node.classificationName; return node; }); @@ -134,4 +133,14 @@ const resetForm = () => { } formRef.value?.resetFields() } +const changeOne=(value)=>{ + console.log("value:",value) + const selectedObject = allMenuList.find(item => item.id === value) + console.log('选中的完整对象:', selectedObject) + formData.value.level=selectedObject!=null?selectedObject.level+1:1 + if(selectedObject!=null){ + formData.value.type=selectedObject.type + } + console.log('选中的完整对象2:', formData) +} diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/book/classification/index.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/book/classification/index.vue index bb8b99f..5f745e2 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/book/classification/index.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/book/classification/index.vue @@ -91,8 +91,9 @@ - + - + - -