diff --git a/src/main/java/com/budwk/app/sys/controller/v4/SysV4ServController.java b/src/main/java/com/budwk/app/sys/controller/v4/SysV4ServController.java index 7f3e393..c920b80 100644 --- a/src/main/java/com/budwk/app/sys/controller/v4/SysV4ServController.java +++ b/src/main/java/com/budwk/app/sys/controller/v4/SysV4ServController.java @@ -57,6 +57,8 @@ public class SysV4ServController { $condition """); Cnd cnd = Cnd.NEW(); + // 先取每个流程的最新定义,再判断是否启用,避免最新版本停用后回退展示旧版本。 + cnd.and("t.state", "=", 1); if (StrUtil.isNotBlank(keyword)) { cnd.where().andLike("t.disPlayName", keyword); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java index 6a6b238..eb5dce6 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java @@ -620,6 +620,27 @@ public class ActivitySportsApplyUserServiceImpl extends BaseServiceImpl { entities.add(new ExcelExportEntity(option.getOptionName(), option.getOptionName(), 20)); }); + // 签字列先按空白文本导出,图片另行写入,避开 EasyPOI 对 Map 图片字段的反射。 ExcelExportEntity userSignEntity = new ExcelExportEntity("签字", "userSign", 20); - userSignEntity.setType(2); - userSignEntity.setExportImageType(2); entities.add(userSignEntity); // 导出 - Workbook workbook = new HSSFWorkbook(); + Workbook workbook = new XSSFWorkbook(); listMap.forEach((k, v) -> { + List signatures = new ArrayList<>(); + v.forEach(row -> { + Object signature = row.remove("userSign"); + signatures.add(signature instanceof byte[] ? (byte[]) signature : null); + }); ExcelExportService service = new ExcelExportService(); ExportParams exportParams = new ExportParams(); exportParams.setSheetName(k); - exportParams.setType(ExcelType.HSSF); + exportParams.setType(ExcelType.XSSF); + int firstSheet = workbook.getNumberOfSheets(); service.createSheetForMap(workbook, exportParams, entities, v); + // 无标题、单层列头的数据从第二行开始;按新增 Sheet 顺序兼容 EasyPOI 自动拆表。 + int signatureIndex = 0; + for (int sheetIndex = firstSheet; sheetIndex < workbook.getNumberOfSheets(); sheetIndex++) { + Sheet sheet = workbook.getSheetAt(sheetIndex); + Drawing drawing = sheet.createDrawingPatriarch(); + for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum() && signatureIndex < signatures.size(); rowIndex++) { + byte[] signature = signatures.get(signatureIndex++); + if (signature != null && signature.length > 0) { + insertReceiveSignature(workbook, sheet, drawing, rowIndex, entities.size() - 1, signature); + } + } + } }); - CommonDownloadUtil.download("领取表.xls", workbook, response); + CommonDownloadUtil.download("领取表.xlsx", workbook, response); + } + + /** + * 将签字字节数组写入领取表指定单元格。行列索引从 0 开始,图片统一转为 PNG; + * 无法解码的图片仅记录日志并保留空白签字格,不中断其他人员的导出。 + */ + private void insertReceiveSignature(Workbook workbook, Sheet sheet, Drawing drawing, + int rowIndex, int columnIndex, byte[] signature) { + try (ByteArrayInputStream input = new ByteArrayInputStream(signature); + ByteArrayOutputStream output = new ByteArrayOutputStream()) { + BufferedImage image = ImageIO.read(input); + if (image == null) { + log.warn("领取表签字图片无法识别,Sheet={},行={}", sheet.getSheetName(), rowIndex + 1); + return; + } + ImageIO.write(image, "png", output); + Row row = sheet.getRow(rowIndex); + row.setHeightInPoints(Math.max(row.getHeightInPoints(), 50)); + ClientAnchor anchor = workbook.getCreationHelper().createClientAnchor(); + anchor.setCol1(columnIndex); + anchor.setCol2(columnIndex + 1); + anchor.setRow1(rowIndex); + anchor.setRow2(rowIndex + 1); + anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE); + drawing.createPicture(anchor, workbook.addPicture(output.toByteArray(), Workbook.PICTURE_TYPE_PNG)); + } catch (Exception e) { + log.error("领取表签字图片写入失败,Sheet={},行={}", sheet.getSheetName(), rowIndex + 1, e); + } } } diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 69e540c..aae0e19 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -5,7 +5,7 @@ nutz: ignore: ^(.+[.])(jsp|png|gif|jpg|js|css|jspx|jpeg|html|mp3|mp4|ico|svg|vue)$ exclusions: /favicon/*,/assets/*,/druid/*,/upload/*,/components/* server: - port: 8081 + port: 80 host: 0.0.0.0 jetty: @@ -21,7 +21,7 @@ jetty: #结合ftp使用,或用nginx代理ftp路径 #staticPath: /Users/wizzer/temp/files #开发模式静态资源 - staticPathLocal: D:/myProject/zhgh_cqgmy/src/main/resources/static + staticPathLocal: E:/projects/zhgh_cqgmy/src/main/resources/static security: tokenName: saToken @@ -87,7 +87,7 @@ xsssql: beetl: RESOURCE: #本地路径,开发时设置本地路径,便于调试 - rootLocal: D:/myProject/zhgh_cqgmy/src/main/resources/views/ + rootLocal: E:/projects/zhgh_cqgmy/src/main/resources/views/ root: views/ DELIMITER_STATEMENT_START: "" diff --git a/src/main/resources/static/assets/platform/css/home-portal.css b/src/main/resources/static/assets/platform/css/home-portal.css index 1f9174f..a558c20 100644 --- a/src/main/resources/static/assets/platform/css/home-portal.css +++ b/src/main/resources/static/assets/platform/css/home-portal.css @@ -124,7 +124,10 @@ #v4-home-app .todo-center .el-tabs__nav { display: flex; width: 100%; border-color: #e9eff6; border-radius: 6px 6px 0 0; } #v4-home-app .todo-center .el-tabs__item { flex: 1; min-width: 0; padding: 0 7px; font-size: 12px; height: 36px; line-height: 36px; text-align: center; } #v4-home-app .todo-center .el-tabs__item.is-active { border-bottom: 2px solid #1687f5; color: #1687f5; } -#v4-home-app .portal-task-list { display: flex; flex-direction: column; justify-content: space-evenly; flex: 1; min-height: 180px; } +/* 任务从标签栏下方依次排列,避免单条记录被剩余高度推到中间。 */ +#v4-home-app .portal-task-list { display: flex; flex-direction: column; justify-content: flex-start; flex: 1; min-height: 180px; } +/* 空数据提示独立占满列表区域,保留居中展示。 */ +#v4-home-app .portal-task-list > .portal-empty { flex: 1; } #v4-home-app .portal-task-row { display: flex; gap: 10px; align-items: center; padding: 8px 6px; border-bottom: 1px solid #eef3f8; } #v4-home-app .portal-task-row:last-child { border-bottom: 0; } #v4-home-app .portal-task-row:hover { background: #f7fbff; } diff --git a/src/main/resources/views/layouts/v4/home/index.html b/src/main/resources/views/layouts/v4/home/index.html index 34aaa19..eb141cc 100644 --- a/src/main/resources/views/layouts/v4/home/index.html +++ b/src/main/resources/views/layouts/v4/home/index.html @@ -181,7 +181,7 @@ layout("/layouts/v4/baseLayout.html"){ - + - - - - {{ task.ext.initiatorName - }}({{task.ext.initiatorAccount}}) - - {{ task.finishTime }} - - - - - - - {{ task.taskFormData.userName - }}({{task.taskFormData.loginName}}) - - {{ task.finishTime }} - - - - - - - - - - - - - - - - {{ task.taskFormData.userName - }}({{task.taskFormData.loginName}}) - - {{ task.finishTime }} - -
- - - - -
-
- @@ -243,7 +270,7 @@ const PROPOSAL_INFO = { `, - dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE", "PROCESS_TASK_SUBMIT_TYPE", "PROPOSAL_FEEDBACK"], + dicts: ["PROPOSAL_TYPE", "PROPOSAL_SOURCE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE", "PROCESS_TASK_SUBMIT_TYPE", "PROPOSAL_FEEDBACK"], props: { hide_slave: false }, diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/user.js b/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/user.js index 4f09af2..d19b264 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/user.js +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/user.js @@ -60,7 +60,10 @@ const USER_COMPONENT = { }, filterUnit(query, item) { - return item.username.indexOf(query) > -1 + // 按姓名或工号筛选人员,字段为空时按空字符串处理。 + const username = item.username || "" + const loginname = item.loginname || "" + return username.indexOf(query) > -1 || loginname.indexOf(query) > -1 } } } diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/mine/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/mine/index.html index bd241d3..7084acb 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/mine/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/mine/index.html @@ -23,9 +23,9 @@ layout("/layouts/platform.html"){ - 导入提案 - + --> diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/write/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/write/index.html index 9c4746e..675718b 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/write/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/write/index.html @@ -8,7 +8,7 @@ layout("/layouts/platform.html"){ diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/statistics/comprehensive/index.html b/src/main/resources/views/platform/zhgh/staffmanage/member/statistics/comprehensive/index.html index 2d9e866..a0c7024 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/statistics/comprehensive/index.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/statistics/comprehensive/index.html @@ -82,6 +82,7 @@ layout("/layouts/platform.html"){ @@ -268,6 +269,16 @@ layout("/layouts/platform.html"){ this.checkedFields = all.filter(p => !this.checkedFields.includes(p)); } }, + watch: { + checkedFields() { + // 可见列更新后重新计算列宽,保证右侧固定操作列与表头、数据行对齐。 + this.$nextTick(() => { + if (this.$refs.memberTableRef) { + this.$refs.memberTableRef.doLayout() + } + }) + } + }, computed: { showColumns() { return this.tableColumns.filter(c => this.checkedFields.includes(c.prop)); diff --git a/src/main/resources/views/platform/zhghh5/democratic/proposal/common/info.js b/src/main/resources/views/platform/zhghh5/democratic/proposal/common/info.js index 2bd5b68..5c53263 100644 --- a/src/main/resources/views/platform/zhghh5/democratic/proposal/common/info.js +++ b/src/main/resources/views/platform/zhghh5/democratic/proposal/common/info.js @@ -9,26 +9,30 @@ const PROPOSAL_INFO = { {{ viewData.code || '--' }} {{ viewData.name || '--' }} - - - - - - - {{ viewData.typeName || '--' }} + + {{ viewData.typeName || '--' }} {{ getDictText(dict.type.PROPOSAL_SOURCE, viewData.source) }} - {{ viewData.createUserName || '--' }} - {{ viewData.sessionName || viewData.fullName || '--' }} - + {{ viewData.createUserName || '--' }} + {{ viewData.sessionName || viewData.fullName || '--' }} + {{ viewData.committeeName || viewData.delegationName || '--' }} - {{ viewData.unitName || '--' }} + {{ viewData.unitName || '--' }} {{ viewData.mobile || '--' }} {{ viewData.createTime || '--' }} - + + + + -- + + + + -- + +
@@ -48,7 +52,7 @@ const PROPOSAL_INFO = { :key="merge.id" class="proposal-view-merge-cell" :title="(index + 1) + '. ' + merge.name" - :label="'提案编号:' + merge.code + '|提案人:' + merge.createUserName + '|类别:' + merge.typeName + '|代表团:' + merge.delegationName" + :label="'提案编号:' + merge.code + '|提案人:' + merge.createUserName + '|提案类别:' + merge.typeName + '|代表团:' + merge.delegationName" is-link @click="openView(merge)"> @@ -66,13 +70,16 @@ const PROPOSAL_INFO = {
+ - + -- - - + + --
{{ opinion.opinionText }}
@@ -158,13 +165,18 @@ const PROPOSAL_INFO = { || '--' }})
{{ selectedTask.finishTime || '--' }} + - + -- - - + + --