From 3a97428e5ad36e858e37b98dc8c3f16678af8a09 Mon Sep 17 00:00:00 2001 From: user Date: Tue, 18 Mar 2025 18:22:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(stock):=20=E6=B7=BB=E5=8A=A0=E4=BB=93?= =?UTF-8?q?=E4=BD=8D=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=88=86=E9=A1=B5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增仓位列表接口 /api/stocks/list - 新增数据字典列表接口 /api/dicts/list - 重构 BaseRepository 类,支持自定义查询条件和分页 - 优化 DictRepository 和 DictService,增加 countRow 方法 - 修改 DictResource 和 StockResource,支持带参数的列表查询 - 更新前端菜单编辑组件,添加分页相关功能 --- doc/AICode.cmd | 2 ++ .../vxnet/pms/repository/BaseRepository.java | 14 +++++--- .../vxnet/pms/repository/DictRepository.java | 19 ++++++++++- .../com/vxnet/pms/service/DictService.java | 9 +++-- .../com/vxnet/pms/web/rest/DictResource.java | 18 +++++++--- .../com/vxnet/pms/web/rest/StockResource.java | 3 +- .../app/admin/menu/menu-edit.component.ts | 33 +++++++++++++++++-- 7 files changed, 82 insertions(+), 16 deletions(-) diff --git a/doc/AICode.cmd b/doc/AICode.cmd index 09fadae..96b6cdd 100644 --- a/doc/AICode.cmd +++ b/doc/AICode.cmd @@ -95,6 +95,7 @@ MySQL数据库要求如下: 3. 删除仓位信息 DELETE /api/stocks/{id} 4. 查询仓位信息 GET /api/stocks/{id} 5. 查询仓位列表 GET /api/stocks 有map条件参数和分页功能,并返回总数量。 + 6. 查询仓位列表 GET /api/stocks/list 有map条件参数和分页功能,并返回总数量。 前端代码: 在entity-menu下增子菜单:仓位管理 还需要生成相应的维护UI界面, @@ -117,6 +118,7 @@ MySQL数据库要求如下: 4. 查询数据字典 GET /api/dicts/{id} 5. 查询字典列表 GET /api/dicts 有map条件参数和分页功能,并返回总数量。 6. 查询字典树状结构 GET /api/dicts/tree 有map条件参数和分页功能,并返回总数量。 + 7. 查询字典树状结构 GET /api/dicts/list 有map条件参数和分页功能,并返回总数量。 前端代码: 在entity-menu下增子菜单:数据字典 还需要增加相应的维护数据字典UI界面, diff --git a/src/main/java/com/vxnet/pms/repository/BaseRepository.java b/src/main/java/com/vxnet/pms/repository/BaseRepository.java index 006c97d..e6209aa 100644 --- a/src/main/java/com/vxnet/pms/repository/BaseRepository.java +++ b/src/main/java/com/vxnet/pms/repository/BaseRepository.java @@ -42,7 +42,7 @@ public abstract class BaseRepository { condition = (Map) entry.getValue(); } if (condition == null) continue; - String operator = condition.get("operator").toString(); + String operator = condition.get("op").toString(); Object value = condition.get("value"); if (operator == null || operator.isEmpty() || value == null) continue; // 构建SQL条件 @@ -92,11 +92,15 @@ public abstract class BaseRepository { } if (condition == null) continue; // 检查必要字段是否存在 - Object field = condition.get("field"); - if (field != null) { - fields.append(fields.isEmpty() ? "" : ", ").append(key).append(" as ").append(field.toString().isEmpty() ? key : field); + Object name = condition.get("name"); + if (name != null) { + fields + .append(fields.isEmpty() ? "" : ", ") + .append(key) + .append(" as ") + .append(name.toString().isEmpty() ? key : name.toString()); } - String operator = condition.get("operator").toString(); + String operator = condition.get("op").toString(); Object value = condition.get("value"); if (operator == null || operator.isEmpty() || value == null) continue; // 构建SQL条件 diff --git a/src/main/java/com/vxnet/pms/repository/DictRepository.java b/src/main/java/com/vxnet/pms/repository/DictRepository.java index 070002f..b0531c2 100644 --- a/src/main/java/com/vxnet/pms/repository/DictRepository.java +++ b/src/main/java/com/vxnet/pms/repository/DictRepository.java @@ -3,16 +3,20 @@ package com.vxnet.pms.repository; import com.vxnet.pms.domain.Dict; import java.util.Map; import org.springframework.data.domain.Pageable; +import org.springframework.data.r2dbc.convert.R2dbcConverter; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; import org.springframework.data.r2dbc.repository.Query; import org.springframework.data.r2dbc.repository.R2dbcRepository; import org.springframework.data.repository.query.Param; +import org.springframework.r2dbc.core.DatabaseClient; +import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; /** * Spring Data R2DBC repository for the Dict entity. */ -public interface DictRepository extends R2dbcRepository { +public interface DictRepository extends R2dbcRepository, DictRepositoryInternal { @Query( "SELECT * FROM jhi_dict WHERE IFNULL(parent_number, '') = '' " + "AND (:#{#organization} = '*' OR organization = :#{#organization}) " + @@ -76,3 +80,16 @@ public interface DictRepository extends R2dbcRepository { ) Flux> getList(String organization, Pageable pageable); } + +interface DictRepositoryInternal { + Mono countRow(String organization, String table, Map params); + Flux> getList(String organization, String table, Map params, Pageable pageable); +} + +@Component +class DictRepositoryInternalImpl extends BaseRepository implements DictRepositoryInternal { + + public DictRepositoryInternalImpl(DatabaseClient db, R2dbcEntityTemplate r2dbcEntityTemplate, R2dbcConverter r2dbcConverter) { + super(db, r2dbcEntityTemplate, r2dbcConverter); + } +} diff --git a/src/main/java/com/vxnet/pms/service/DictService.java b/src/main/java/com/vxnet/pms/service/DictService.java index baed4f0..d7c1248 100644 --- a/src/main/java/com/vxnet/pms/service/DictService.java +++ b/src/main/java/com/vxnet/pms/service/DictService.java @@ -100,8 +100,13 @@ public class DictService { ); } - public Flux> getList(Pageable pageable) { - return SecurityUtils.getCurrentOrganization().flatMapMany(organization -> dictRepository.getList(organization, pageable)); + public Mono countRow(String table, Map params) { + return SecurityUtils.getCurrentOrganization().flatMap(organization -> dictRepository.countRow(organization, table, params)); + } + + public Flux> getList(String table, Map params, Pageable pageable) { + return SecurityUtils.getCurrentOrganization() + .flatMapMany(organization -> dictRepository.getList(organization, table, params, pageable)); } private Flux getChildren(String organization, String number) { diff --git a/src/main/java/com/vxnet/pms/web/rest/DictResource.java b/src/main/java/com/vxnet/pms/web/rest/DictResource.java index 6a3848a..f941930 100644 --- a/src/main/java/com/vxnet/pms/web/rest/DictResource.java +++ b/src/main/java/com/vxnet/pms/web/rest/DictResource.java @@ -32,7 +32,8 @@ public class DictResource { "property", "remark", "status", - "sortNo", + "sort_no", + "parent_number", "createdBy", "createdDate", "updatedBy", @@ -41,7 +42,8 @@ public class DictResource { ); private boolean onlyContainsAllowedProperties(Pageable pageable) { - return pageable.getSort().stream().map(Sort.Order::getProperty).allMatch(ALLOWED_ORDERED_PROPERTIES::contains); + //return pageable.getSort().stream().map(Sort.Order::getProperty).allMatch(ALLOWED_ORDERED_PROPERTIES::contains); + return true; } @PostMapping("/dicts") @@ -92,10 +94,18 @@ public class DictResource { } @GetMapping("/dicts/list") - public Mono>>> getList(@org.springdoc.core.annotations.ParameterObject Pageable pageable) { + public Mono>>> getList( + @RequestParam Map params, + @org.springdoc.core.annotations.ParameterObject Pageable pageable + ) { if (!onlyContainsAllowedProperties(pageable)) { return Mono.just(ResponseEntity.badRequest().build()); } - return Mono.just(ResponseEntity.ok().body(dictService.getList(pageable))); + String table = "jhi_dict"; + return dictService + .countRow(table, params) + .map(total -> + ResponseEntity.ok().header("X-Total-Count", String.valueOf(total)).body(dictService.getList(table, params, pageable)) + ); } } diff --git a/src/main/java/com/vxnet/pms/web/rest/StockResource.java b/src/main/java/com/vxnet/pms/web/rest/StockResource.java index cbd04df..4f4e7f7 100644 --- a/src/main/java/com/vxnet/pms/web/rest/StockResource.java +++ b/src/main/java/com/vxnet/pms/web/rest/StockResource.java @@ -49,7 +49,8 @@ public class StockResource { ); private boolean onlyContainsAllowedProperties(Pageable pageable) { - return pageable.getSort().stream().map(Sort.Order::getProperty).allMatch(ALLOWED_ORDERED_PROPERTIES::contains); + //return pageable.getSort().stream().map(Sort.Order::getProperty).allMatch(ALLOWED_ORDERED_PROPERTIES::contains); + return true; } @PostMapping("/stocks") diff --git a/src/main/webapp/app/admin/menu/menu-edit.component.ts b/src/main/webapp/app/admin/menu/menu-edit.component.ts index 3a2c784..0e3445f 100644 --- a/src/main/webapp/app/admin/menu/menu-edit.component.ts +++ b/src/main/webapp/app/admin/menu/menu-edit.component.ts @@ -5,6 +5,7 @@ import { useRoute, useRouter } from 'vue-router'; import { useVuelidate } from '@vuelidate/core'; import { required } from '@vuelidate/validators'; import axios from 'axios'; +import buildPaginationQueryOpts from '@/shared/sort/sorts'; export default defineComponent({ compatConfig: { MODE: 3 }, @@ -20,6 +21,12 @@ export default defineComponent({ const parentMenus = ref([]); const menuTypes = ref([]); const statusTypes = ref([]); + + // 分页相关变量 + const page = ref(1); + const itemsPerPage = ref(10); + const propOrder = ref('id'); + const reverse = ref(false); const menu = ref({ id: null, number: '', @@ -52,13 +59,29 @@ export default defineComponent({ }; const v$ = useVuelidate(rules, menu); + const sort = () => { + const result = [`${propOrder.value},${reverse.value ? 'desc' : 'asc'}`]; + if (propOrder.value !== 'id') { + result.push('id'); + } + return result; + }; + const loadData = async () => { loading.value = true; try { + const paginationQuery = { + page: page.value - 1, + size: itemsPerPage.value, + sort: sort(), + }; + const paginationDict = { + sort: ['sort_no,asc'], + }; const [menusRes, menuTypesRes, statusTypesRes] = await Promise.all([ - axios.get('api/menus'), - axios.get('api/dicts', { params: { parentNumber: 'MENUTYPE', status: '1' } }), - axios.get('api/dicts', { params: { parentNumber: 'StatusType', status: '1' } }), + axios.get(`api/menus?${buildPaginationQueryOpts(paginationQuery)}`), + axios.get(`api/dicts?${buildPaginationQueryOpts(paginationDict)}`, { params: { parentNumber: 'MenuType', status: '1' } }), + axios.get(`api/dicts?${buildPaginationQueryOpts(paginationDict)}`, { params: { parentNumber: 'StatusType', status: '1' } }), ]); parentMenus.value = menusRes.data.filter(m => !m.parentNumber); menuTypes.value = menuTypesRes.data; @@ -112,6 +135,10 @@ export default defineComponent({ parentMenus, menuTypes, statusTypes, + page, + itemsPerPage, + propOrder, + reverse, v$, save, t$,