From ac2f1292f0af2cc0dbef807cffd5c47499aa0f22 Mon Sep 17 00:00:00 2001 From: user Date: Wed, 19 Mar 2025 16:15:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(stock):=20=E5=A2=9E=E5=8A=A0=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E5=88=97=E8=A1=A8=E7=AD=9B=E9=80=89=E5=92=8C=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为过滤参数添加操作符选择(等于、模糊匹配、大于、小于) - 实现多条件筛选功能 - 添加每页显示条数选择 - 优化排序逻辑,固定 ID 列为第二排序条件 - 修复分页显示逻辑,适应每页显示全部的场景 - 优化 SQL 查询语句生成逻辑 --- .../vxnet/pms/repository/BaseRepository.java | 5 ++- .../app/entities/stock/stock.component.ts | 22 +++++++--- src/main/webapp/app/entities/stock/stock.vue | 44 ++++++++++++++++--- .../app/shared/composables/date-format.ts | 2 +- src/main/webapp/i18n/zh-cn/global.json | 4 +- vite.config.mts | 1 + 6 files changed, 62 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/vxnet/pms/repository/BaseRepository.java b/src/main/java/com/vxnet/pms/repository/BaseRepository.java index 771e6c2..4f3cb69 100644 --- a/src/main/java/com/vxnet/pms/repository/BaseRepository.java +++ b/src/main/java/com/vxnet/pms/repository/BaseRepository.java @@ -101,7 +101,7 @@ public abstract class BaseRepository { public Flux> getRows(String organization, String table, Map params, Pageable pageable) { params = preprocessParams(params); String orderBy = pageable.getSort().isEmpty() - ? "1" + ? "" : pageable.getSort().stream().map(order -> order.getProperty() + " " + order.getDirection()).collect(Collectors.joining(", ")); long page = pageable.getPageNumber(); long size = pageable.getPageSize(); @@ -157,7 +157,8 @@ public abstract class BaseRepository { sql.append(fields.isEmpty() ? " * " : fields.toString()); sql.append(String.format(" FROM %s ", table)); sql.append(wheres.toString()); - sql.append(String.format(" ORDER BY %s", orderBy)); + // 使用与RegionRepository和DictRepository一致的排序处理方式 + if (!orderBy.isEmpty()) sql.append(" ORDER BY ").append(orderBy); if (size > 0) sql.append(String.format(" LIMIT %d OFFSET %d", size, page * size)); DatabaseClient.GenericExecuteSpec executeSpec = db.sql(sql.toString()).bind("organization", organization); diff --git a/src/main/webapp/app/entities/stock/stock.component.ts b/src/main/webapp/app/entities/stock/stock.component.ts index 4fbf129..c1c9795 100644 --- a/src/main/webapp/app/entities/stock/stock.component.ts +++ b/src/main/webapp/app/entities/stock/stock.component.ts @@ -37,9 +37,9 @@ export default defineComponent({ // 过滤参数 const filterParams = ref({ - number: null, - name: null, - property: null, + number: { op: '=', value: null }, + name: { op: '=', value: null }, + property: { op: '=', value: null }, }); const handleFilter = () => { @@ -50,6 +50,9 @@ export default defineComponent({ const sort = () => { const result = [`${propOrder.value},${reverse.value ? 'desc' : 'asc'}`]; + if (propOrder.value !== 'id') { + result.push('id'); + } return result; }; @@ -57,9 +60,10 @@ export default defineComponent({ isFetching.value = true; try { const processedParams = showFilter.value - ? Object.entries(filterParams.value).reduce((acc, [key, value]) => { - // 将空字符串转换为null,确保查询条件不生效 - acc[key] = value === '' ? null : value; + ? Object.entries(filterParams.value).reduce((acc, [key, { op, value }]) => { + if (value !== null && value !== '') { + acc[key] = { op, value }; + } return acc; }, {}) : {}; @@ -110,6 +114,11 @@ export default defineComponent({ handleSyncList(); }; + const handlePageSizeChange = () => { + page.value = 1; // 重置页码 + handleSyncList(); + }; + handleSyncList(); return { @@ -126,6 +135,7 @@ export default defineComponent({ handleSyncList, handleFilter, handlePageChange, + handlePageSizeChange, prepareDelete, deleteStock, changeOrder, diff --git a/src/main/webapp/app/entities/stock/stock.vue b/src/main/webapp/app/entities/stock/stock.vue index 9fe1c14..dc4c557 100644 --- a/src/main/webapp/app/entities/stock/stock.vue +++ b/src/main/webapp/app/entities/stock/stock.vue @@ -28,15 +28,39 @@
- +
+ + +
- +
+ + +
- +
+ + +
@@ -98,18 +122,26 @@
-
+
+ +
+
{{ $t('global.item-count', { first: (page - 1) * itemsPerPage + 1, - second: page * itemsPerPage < totalItems ? page * itemsPerPage : totalItems, + second: itemsPerPage > 0 && page * itemsPerPage < totalItems ? page * itemsPerPage : totalItems, total: totalItems, }) }}
-
+
(date ? i18n.d(Date.parse(date), format) : null); + const formatDateI18N = (date, format = 'short') => (date ? i18n.d(dayjs(date).toDate(), format) : null); const i18nUtils = { formatDateI18N, formatDateLong: date => formatDateI18N(date, 'long'), diff --git a/src/main/webapp/i18n/zh-cn/global.json b/src/main/webapp/i18n/zh-cn/global.json index 18f6ffb..6590828 100644 --- a/src/main/webapp/i18n/zh-cn/global.json +++ b/src/main/webapp/i18n/zh-cn/global.json @@ -118,10 +118,11 @@ "ribbon": { "dev": "开发环境" }, - "item-count": "显示第 { first } - { second } 条,共 { total } 条" + "item-count": "显示第 { first } - { second } 行,共 { total } 行" }, "entity": { "action": { + "all": "全部", "actions": "操作", "addblob": "增加 BLOB", "addimage": "增加图片", @@ -150,6 +151,7 @@ "upload": "上传", "view": "查看", "tree": "树形", + "perpage": "每页{ itemsPerPage }行", "page": "分页", "show": "显示 { otherEntity }", "select": "(选择)", diff --git a/vite.config.mts b/vite.config.mts index 75832a2..f248ea8 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -44,6 +44,7 @@ const config = defineConfig({ '@': fileURLToPath(new URL('./src/main/webapp/app/', import.meta.url)), '@content': fileURLToPath(new URL('./src/main/webapp/content/', import.meta.url)), }, + extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'], }, define: { I18N_HASH: '"generated_hash"',