diff --git a/code/fms/demo.html b/code/fms/demo.html new file mode 100644 index 00000000..7df17562 --- /dev/null +++ b/code/fms/demo.html @@ -0,0 +1,1567 @@ +```html + + + + + +FMS ERP 查询原型 + + + + + + +
+ + + + + + +
+ + +
+ +
+ ☰ + 上海分公司 +
+ +
+ ◌ + ⚙ + 帮助 +
张
+
+ +
+ + + +
+ +
+ 订舱单 +
+ +
+ 船期 +
+ +
+ 客户档案 +
+ +
+ + + +
+ + + + + + +
+ +
+ +
+ 关键词 + +
+ +
+ 客户 + +
+ +
+ 状态 + +
+ +
+ ETD + +
+ +
+ + +
+ +
+ + + +
+ + + 我的查询 + + +
+ 全部 +
+ +
+ 我的待处理 +
+ +
+ 本月待审核 +
+ +
+ 华东客户 +
+ +
+ + 保存当前条件 +
+ +
+ +
+ + + +
+ +
+ 全部 + 326 +
+ +
+ 待提交 + 18 +
+ +
+ 待审核 + 32 +
+ +
+ 已审核 + 241 +
+ +
+ 已取消 + 35 +
+ +
+ + + +
+ +
+ +
+ 共 326 条 +
+ +
+ 列设置 + 刷新 + 密度 +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + 订舱单号客户船公司船名 / 航次ETDETA业务员状态
+ + 上海 XX 国际物流MAERSKMSC MIA / 023W2026-09-302026-10-25张三 + 待审核 +
+ + 宁波 XX 供应链MSCMSC LISA / 118E2026-10-022026-10-28李四 + 已审核 +
+ + 杭州 XX 贸易CMACMA CGM / 086W2026-10-042026-10-29王五 + 草稿 +
+ + 上海 XX 实业EVERGREENEVER ALPHA / 062W2026-10-062026-11-01张三 + 已审核 +
+ + 苏州 XX 科技ONEONE HARMONY / 031W2026-10-082026-11-02赵六 + 待提交 +
+ +
+ +
+ +
+ +
+ + + + +
+ + + +
+ + + + + + + + + + + +``` diff --git a/code/fms/fms-api/start.cmd b/code/fms/fms-api/start.cmd index 4aa82069..80536163 100644 --- a/code/fms/fms-api/start.cmd +++ b/code/fms/fms-api/start.cmd @@ -1,6 +1,6 @@ @echo off -set "JAVA_HOME=D:\devtool\jdk\jdk21" -set "MAVEN_HOME=D:\devtool\maven" +set "JAVA_HOME=D:\devtool\jdk\jdk-21" +set "MAVEN_HOME=D:\devtool\maven\apache-maven-3.8.9" set "PATH=%JAVA_HOME%\bin;%MAVEN_HOME%\bin;%PATH%" cd /d "%~dp0" diff --git a/code/fms/fms-api/start.err.log b/code/fms/fms-api/start.err.log new file mode 100644 index 00000000..e69de29b diff --git a/code/fms/fms-api/start.log b/code/fms/fms-api/start.log new file mode 100644 index 00000000..627f46a6 --- /dev/null +++ b/code/fms/fms-api/start.log @@ -0,0 +1,54 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] -------------------------< cn.g3soft:fms-api >-------------------------- +[INFO] Building fms-api 0.0.1-SNAPSHOT +[INFO] from pom.xml +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:4.1.0:run (default-cli) > test-compile @ fms-api >>> +[INFO] +[INFO] --- maven-resources-plugin:3.5.0:resources (default-resources) @ fms-api --- +[INFO] Copying 1 resource from src\main\resources to target\classes +[INFO] Copying 0 resource from src\main\resources to target\classes +[INFO] +[INFO] --- maven-compiler-plugin:3.15.0:compile (default-compile) @ fms-api --- +[INFO] Nothing to compile - all classes are up to date. +[INFO] +[INFO] --- maven-resources-plugin:3.5.0:testResources (default-testResources) @ fms-api --- +[INFO] skip non existing resourceDirectory D:\workspace\code\fms\fms-api\src\test\resources +[INFO] +[INFO] --- maven-compiler-plugin:3.15.0:testCompile (default-testCompile) @ fms-api --- +[INFO] Nothing to compile - all classes are up to date. +[INFO] +[INFO] <<< spring-boot-maven-plugin:4.1.0:run (default-cli) < test-compile @ fms-api <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:4.1.0:run (default-cli) @ fms-api --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + + :: Spring Boot :: (v4.1.0) + +2026-09-29T08:30:17.346+08:00 INFO 12408 --- [fms-api] [ restartedMain] cn.g3soft.fmsapi.FmsApiApplication : Starting FmsApiApplication using Java 21 with PID 12408 (D:\workspace\code\fms\fms-api\target\classes started by Administrator in D:\workspace\code\fms\fms-api) +2026-09-29T08:30:17.356+08:00 INFO 12408 --- [fms-api] [ restartedMain] cn.g3soft.fmsapi.FmsApiApplication : No active profile set, falling back to 1 default profile: "default" +2026-09-29T08:30:17.440+08:00 INFO 12408 --- [fms-api] [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2026-09-29T08:30:17.440+08:00 INFO 12408 --- [fms-api] [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2026-09-29T08:30:19.863+08:00 INFO 12408 --- [fms-api] [ restartedMain] o.s.boot.tomcat.TomcatWebServer : Tomcat initialized with port 8088 (http) +2026-09-29T08:30:19.910+08:00 INFO 12408 --- [fms-api] [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-09-29T08:30:19.911+08:00 INFO 12408 --- [fms-api] [ restartedMain] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/11.0.22] +2026-09-29T08:30:20.005+08:00 INFO 12408 --- [fms-api] [ restartedMain] b.w.c.s.WebApplicationContextInitializer : Root WebApplicationContext: initialization completed in 2562 ms +2026-09-29T08:30:20.821+08:00 INFO 12408 --- [fms-api] [ restartedMain] c.g3soft.fmsapi.utils.IpRegionSearcher : ip2region Searcher 初始化完成,数据大小 11114380 字节 +2026-09-29T08:30:21.243+08:00 INFO 12408 --- [fms-api] [ restartedMain] c.g.f.database.OrgDatabaseConfigWatcher : 已启动机构配置目录监听: D:\workspace\code\fms\fms-api\config\dbconfigs +2026-09-29T08:30:21.781+08:00 INFO 12408 --- [fms-api] [ restartedMain] o.s.boot.tomcat.TomcatWebServer : Tomcat started on port 8088 (http) with context path '/api' +2026-09-29T08:30:21.791+08:00 INFO 12408 --- [fms-api] [ restartedMain] cn.g3soft.fmsapi.FmsApiApplication : Started FmsApiApplication in 5.29 seconds (process running for 7.111) +2026-09-29T08:39:25.507+08:00 INFO 12408 --- [fms-api] [nio-8088-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-09-29T08:39:25.508+08:00 INFO 12408 --- [fms-api] [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-09-29T08:39:25.511+08:00 INFO 12408 --- [fms-api] [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2026-09-29T08:39:25.854+08:00 WARN 12408 --- [fms-api] [nio-8088-exec-1] com.alibaba.druid.pool.DruidDataSource : removeAbandoned is true, not use in production. +2026-09-29T08:39:26.354+08:00 INFO 12408 --- [fms-api] [nio-8088-exec-1] com.alibaba.druid.pool.DruidDataSource : {dataSource-1,G3HD} inited diff --git a/code/fms/fms-vue/src/components/fms-module-list/FmsModuleListPage.vue b/code/fms/fms-vue/src/components/fms-module-list/FmsModuleListPage.vue index 1fecde9c..056f82e4 100644 --- a/code/fms/fms-vue/src/components/fms-module-list/FmsModuleListPage.vue +++ b/code/fms/fms-vue/src/components/fms-module-list/FmsModuleListPage.vue @@ -1602,6 +1602,7 @@ defineExpose({ v-if="views.length || keywordConfig || quickItems.length" class="fms-module-card query-card" > + - - + +
+ + +
+ + diff --git a/code/fms/fms-vue/tests/fms-table-virtual.spec.js b/code/fms/fms-vue/tests/fms-table-virtual.spec.js index a05d4cda..d9356989 100644 --- a/code/fms/fms-vue/tests/fms-table-virtual.spec.js +++ b/code/fms/fms-vue/tests/fms-table-virtual.spec.js @@ -181,7 +181,12 @@ describe('fms-table 虚拟滚动验证', () => { await nextTick() await new Promise((r) => setTimeout(r, 100)) const stkTable = wrapper.findComponent(StkTable) - expect(stkTable.props('colResizable')).toBe(true) + // 开启时统一传 { disabled } 回调(库只支持这种按列控制方式):普通列可拖, + // 列上显式写 resizable: false 的(操作列 / 展开列)不拖 + const colResizable = stkTable.props('colResizable') + expect(colResizable).toMatchObject({ disabled: expect.any(Function) }) + expect(colResizable.disabled({ dataIndex: 'c0', width: 120 })).toBe(false) + expect(colResizable.disabled({ dataIndex: '__actions__', resizable: false })).toBe(true) expect(stkTable.props('headerDrag')).toBeTruthy() wrapper.unmount() }) @@ -199,7 +204,9 @@ describe('fms-table 虚拟滚动验证', () => { await nextTick() expect(wrapper.find('.fms-table').classes()).not.toContain('fms-table--auto-fit-width') - expect(wrapper.findComponent(StkTable).props('colResizable')).toBe(true) + expect(wrapper.findComponent(StkTable).props('colResizable')).toMatchObject({ + disabled: expect.any(Function), + }) wrapper.unmount() }) diff --git a/code/fms/fms-vue/tests/unit/module-list-components.spec.js b/code/fms/fms-vue/tests/unit/module-list-components.spec.js index 0f03d762..6b24608d 100644 --- a/code/fms/fms-vue/tests/unit/module-list-components.spec.js +++ b/code/fms/fms-vue/tests/unit/module-list-components.spec.js @@ -63,13 +63,15 @@ describe('fms-module-list components', () => { en.unmount() }) - it('快捷筛选网格列数按条件数收缩(只有一个条件时不占 4 列宽)', () => { + it('快捷筛选列数按条件占用收缩(普通条件 200px 一列,区间/日期跨两列)', () => { const one = mount(FmsQuickFilters, { props: { items: [queryItem('b_name')], modelValue: {} }, }) expect(one.find('.quick-grid').element.style.gridTemplateColumns).toBe( - 'repeat(1, minmax(0, 288px))', + 'repeat(1, minmax(0, 200px))', ) + // 普通单值控件只占一列,不跨列 + expect(one.find('.quick-field').element.style.gridColumn).toBe('') one.unmount() const four = mount(FmsQuickFilters, { @@ -79,9 +81,21 @@ describe('fms-module-list components', () => { }, }) expect(four.find('.quick-grid').element.style.gridTemplateColumns).toBe( - 'repeat(4, minmax(0, 288px))', + 'repeat(4, minmax(0, 200px))', ) four.unmount() + + // 日期区间(预设下拉 + 两端)跨两列:列数按占用列求和,宽控件不会被挤到下一行 + const mixed = mount(FmsQuickFilters, { + props: { items: [rangeQueryItem('date'), queryItem('b_canuse')], modelValue: {} }, + }) + expect(mixed.find('.quick-grid').element.style.gridTemplateColumns).toBe( + 'repeat(3, minmax(0, 200px))', + ) + const [wide, narrow] = mixed.findAll('.quick-field') + expect(wide.element.style.gridColumn).toBe('span 2') + expect(narrow.element.style.gridColumn).toBe('') + mixed.unmount() }) it('快捷筛选「查询」提交草稿、「重置」交给页面处理', async () => { diff --git a/code/fms/fms-vue/tests/unit/module-power-panel.spec.js b/code/fms/fms-vue/tests/unit/module-power-panel.spec.js index cc4baf26..0d480505 100644 --- a/code/fms/fms-vue/tests/unit/module-power-panel.spec.js +++ b/code/fms/fms-vue/tests/unit/module-power-panel.spec.js @@ -216,7 +216,7 @@ describe('模块权限面板:权限点表(定宽 / 密集)', () => { // colResizable + v-model:columns:表格按列宽定宽,拖过的列宽可回写 const powerTable = wrapper.findAllComponents({ name: 'FmsTable' })[0] - expect(powerTable.props('colResizable')).toBe(true) + expect(powerTable.props('colResizable')).toMatchObject({ disabled: expect.any(Function) }) }) }) diff --git a/code/fms/fms-vue/tests/views/module-bind-panel.spec.js b/code/fms/fms-vue/tests/views/module-bind-panel.spec.js index 2d15b736..bb047ceb 100644 --- a/code/fms/fms-vue/tests/views/module-bind-panel.spec.js +++ b/code/fms/fms-vue/tests/views/module-bind-panel.spec.js @@ -444,7 +444,7 @@ describe('绑定模块面板:权限区表头与表宽', () => { // colResizable + v-model:columns:表格按列宽定宽(不自铺满整栏),拖过的列宽可回写 const powerTable = wrapper.findAllComponents({ name: 'FmsTable' })[0] - expect(powerTable.props('colResizable')).toBe(true) + expect(powerTable.props('colResizable')).toMatchObject({ disabled: expect.any(Function) }) }) }) diff --git a/code/test/form-js b/code/test/form-js index 39406918..d00e32ab 160000 --- a/code/test/form-js +++ b/code/test/form-js @@ -1 +1 @@ -Subproject commit 39406918f6d8b1b600e84c60fb67e15b5a65a513 +Subproject commit d00e32ab9237404e54f4897b19342fe7c7ed0efd diff --git a/code/test/vue-vben-admin b/code/test/vue-vben-admin index edbc42ca..2d708760 160000 --- a/code/test/vue-vben-admin +++ b/code/test/vue-vben-admin @@ -1 +1 @@ -Subproject commit edbc42caaaa5b33fe61349063cc94cd36a1c5f30 +Subproject commit 2d7087602b732e6c23c7696ee8430eb1e8221b56