Merge branch 'release_20261030问题整改' of http://gitea.dd3skj.com/c-hongqw1/zhgh_cqgmy into release_20261030问题整改
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
+21
@@ -620,6 +620,27 @@ public class ActivitySportsApplyUserServiceImpl extends BaseServiceImpl<Activity
|
||||
continue;
|
||||
}
|
||||
|
||||
// 以系统人员档案为准校验男女分组,不能用 Excel 性别绕过限制;校验失败时保留已有报名。
|
||||
Integer isMenWomen = activityEvent.getIsMenWomen();
|
||||
if (Integer.valueOf(1).equals(isMenWomen) || Integer.valueOf(2).equals(isMenWomen)) {
|
||||
String sex = normalizeText(sysUser.getSex());
|
||||
boolean male = "男".equals(sex) || "男性".equals(sex);
|
||||
boolean female = "女".equals(sex) || "女性".equals(sex);
|
||||
String errorMessage = null;
|
||||
if (!male && !female) {
|
||||
errorMessage = "系统人员档案性别为空或无法识别,请维护后重新导入";
|
||||
} else if (Integer.valueOf(1).equals(isMenWomen) && !male) {
|
||||
errorMessage = "该项目为男子组,系统人员档案性别为女,不能报名";
|
||||
} else if (Integer.valueOf(2).equals(isMenWomen) && !female) {
|
||||
errorMessage = "该项目为女子组,系统人员档案性别为男,不能报名";
|
||||
}
|
||||
if (errorMessage != null) {
|
||||
importTemp.setNotes(errorMessage);
|
||||
errorList.add(importTemp);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
activitySchoolApply.setEventId(schoolEvent.getEventId());
|
||||
activitySchoolApply.setAwardsMode(activityEvent.getProjectType());
|
||||
if ("2".equals(activityEvent.getProjectType())) {
|
||||
|
||||
+2
-2
@@ -101,7 +101,7 @@ public class TeacherCongressInstitutionUserServiceImpl extends BaseServiceImpl<T
|
||||
if (identity.equals("主任")) {
|
||||
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_DIRECTOR);
|
||||
|
||||
} else if (identity.equals("成员")) {
|
||||
} else if (identity.equals("委员")) {
|
||||
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_MEMBER);
|
||||
}
|
||||
if (sysRole == null) {
|
||||
@@ -148,7 +148,7 @@ public class TeacherCongressInstitutionUserServiceImpl extends BaseServiceImpl<T
|
||||
if (institutionUser.getIdentity().equals("主任")) {
|
||||
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_DIRECTOR);
|
||||
|
||||
} else if (institutionUser.getIdentity().equals("成员")) {
|
||||
} else if (institutionUser.getIdentity().equals("委员")) {
|
||||
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_MEMBER);
|
||||
}
|
||||
if (sysRole == null) {
|
||||
|
||||
+57
-8
@@ -1,6 +1,5 @@
|
||||
package com.budwk.app.zhgh.welfare.service.impl;
|
||||
|
||||
import cn.afterturn.easypoi.entity.ImageEntity;
|
||||
import cn.afterturn.easypoi.excel.ExcelExportUtil;
|
||||
import cn.afterturn.easypoi.excel.entity.ExportParams;
|
||||
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
|
||||
@@ -23,8 +22,12 @@ import com.budwk.app.zhgh.welfare.model.WelfareProjectSubjectOption;
|
||||
import com.budwk.app.zhgh.welfare.param.WelfareSelectionSituationPageForm;
|
||||
import com.budwk.app.zhgh.welfare.service.WelfareSelectionSituationService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||
import org.apache.poi.ss.usermodel.ClientAnchor;
|
||||
import org.apache.poi.ss.usermodel.Drawing;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.nutz.dao.Cnd;
|
||||
import org.nutz.dao.Dao;
|
||||
import org.nutz.dao.Sqls;
|
||||
@@ -246,7 +249,8 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl<Welfar
|
||||
byte[] userSignBytes = SysFileMinIoUtil.getFileBytes(file.getBucket(), file.getStoragePath());
|
||||
map.put("userSign", userSignBytes);
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
// 下载失败时不把原文件地址写入签字单元格。
|
||||
map.put("userSign", null);
|
||||
log.error("下载图片失败", e);
|
||||
}
|
||||
}
|
||||
@@ -268,21 +272,66 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl<Welfar
|
||||
optionList.forEach(option -> {
|
||||
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<byte[]> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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: "<!--#"
|
||||
DELIMITER_STATEMENT_END: "#-->"
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -181,7 +181,7 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
|
||||
</style>
|
||||
|
||||
<link rel="stylesheet" href="${base!}/assets/platform/css/home-portal.css?v=20261030-1" />
|
||||
<link rel="stylesheet" href="${base!}/assets/platform/css/home-portal.css?v=20261102-1" />
|
||||
|
||||
<!-- 登录资料仅在 HTML 属性中输出并转义;放在 Vue 挂载区域外,避免名称被当作模板表达式解析。 -->
|
||||
<div id="v4-home-profile-data" hidden
|
||||
|
||||
@@ -21,14 +21,29 @@ const PROPOSAL_INFO = {
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="提案类别">
|
||||
{{viewData.typeName}}
|
||||
</el-descriptions-item><!--
|
||||
</el-descriptions-item>
|
||||
<!-- 提案方式和联系电话来自提案详情,未填写时显示占位符。 -->
|
||||
<el-descriptions-item label="提案方式">
|
||||
<dict-tag v-if="viewData.source" :options="dict.type.PROPOSAL_SOURCE"
|
||||
:value="viewData.source"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="联系电话">{{ viewData.mobile || '--' }}</el-descriptions-item><!--
|
||||
<el-descriptions-item label="建议承办单位">
|
||||
{{viewData.suggestUnits}}
|
||||
</el-descriptions-item>-->
|
||||
<el-descriptions-item label="立案结果" :span="2">
|
||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
<!-- 立案结果和类型尚未填写时仍显示字段,并以双横线表示空值。 -->
|
||||
<el-descriptions-item label="立案结果">
|
||||
<dict-tag v-if="viewData.caseFilingResult" :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
:value="viewData.caseFilingResult"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="立案类型">
|
||||
<dict-tag v-if="viewData.caseFilingType" :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||
:value="viewData.caseFilingType"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item></el-descriptions-item>
|
||||
<!--<el-descriptions-item label="调研情况" :span="3">
|
||||
<div class="text-left">{{viewData.researchFindings}}</div>
|
||||
</el-descriptions-item>-->
|
||||
@@ -82,18 +97,22 @@ const PROPOSAL_INFO = {
|
||||
{{row.commissionerName}}({{row.commissionerLoginName}})
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="立案结果" prop="caseFilingType">
|
||||
<!-- 委员意见分别展示立案结果和类型,未填写时显示双横线。 -->
|
||||
<el-table-column label="立案结果" prop="caseFilingResult">
|
||||
<template slot-scope="{row}">
|
||||
<div style="display: flex;justify-content: center">
|
||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
<dict-tag v-if="row.caseFilingResult" :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
:value="row.caseFilingResult"></dict-tag>
|
||||
<!-- 普通提案/重点提案暂不展示,历史数据仍保留。 -->
|
||||
<template v-if="false">
|
||||
(
|
||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||
:value="row.caseFilingType"></dict-tag>
|
||||
)
|
||||
</template>
|
||||
<span v-else>--</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="立案类型" prop="caseFilingType">
|
||||
<template slot-scope="{row}">
|
||||
<div style="display: flex;justify-content: center">
|
||||
<dict-tag v-if="row.caseFilingType" :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||
:value="row.caseFilingType"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -124,117 +143,125 @@ const PROPOSAL_INFO = {
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
<!--同一提案可能存在多个承办单位答复任务,查看时合并为一个流程节点,节点内保留每条答复。-->
|
||||
<template v-if="task.replyTasks">
|
||||
<el-descriptions v-for="replyTask in task.replyTasks" border class="flow-task-form"
|
||||
:column="3" :key="replyTask.id">
|
||||
<el-descriptions-item label="承办单位" :span="3">
|
||||
{{replyTask.ext.underTakeName}}
|
||||
<!--同一提案可能存在多个承办单位答复任务,查看时合并为一个流程节点,节点内保留每条答复。-->
|
||||
<template v-if="task.replyTasks">
|
||||
<el-descriptions v-for="replyTask in task.replyTasks" border class="flow-task-form"
|
||||
:column="3" :key="replyTask.id">
|
||||
<el-descriptions-item label="承办单位" :span="3">
|
||||
{{replyTask.ext.underTakeName}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理用户">
|
||||
{{replyTask.taskFormData.userName}}({{replyTask.taskFormData.loginName}})
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理时间">{{replyTask.finishTime}}</el-descriptions-item>
|
||||
<el-descriptions-item label="办理结果">
|
||||
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
|
||||
:value="replyTask.ext.submitType"></dict-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理意见" :span="3">
|
||||
<div v-html="replyTask.taskFormData.tf_opinion"></div>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</template>
|
||||
<el-descriptions border class="flow-task-form" :column="3" :key="task.id"
|
||||
v-else-if="task.ext.isFirstTaskNode">
|
||||
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName
|
||||
}}({{task.ext.initiatorAccount}})
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理用户">
|
||||
{{replyTask.taskFormData.userName}}({{replyTask.taskFormData.loginName}})
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理时间">{{replyTask.finishTime}}</el-descriptions-item>
|
||||
<el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="办理结果">
|
||||
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
|
||||
:value="replyTask.ext.submitType"></dict-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理意见" :span="3">
|
||||
<div v-html="replyTask.taskFormData.tf_opinion"></div>
|
||||
:value="task.ext.submitType"></dict-tag>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</template>
|
||||
<el-descriptions border class="flow-task-form" :column="3" :key="task.id"
|
||||
v-else-if="task.ext.isFirstTaskNode">
|
||||
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName
|
||||
}}({{task.ext.initiatorAccount}})
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="办理结果">
|
||||
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
|
||||
:value="task.ext.submitType"></dict-tag>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
|
||||
<!--邀请附议人-->
|
||||
<el-descriptions border class="flow-task-form" :column="3" :key="task.id"
|
||||
v-else-if="task.taskName === 'invite'">
|
||||
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
|
||||
}}({{task.taskFormData.loginName}})
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理时间" :span="2">{{ task.finishTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="附议人" :span="3" v-if="task.taskName === 'invite'">
|
||||
<el-table v-loading="tableLoading" :data="task?.taskFormData?.seconder">
|
||||
<el-table-column label="姓名" prop="userName"></el-table-column>
|
||||
<el-table-column label="工号" prop="loginName"></el-table-column>
|
||||
<el-table-column label="性别" prop="sex"></el-table-column>
|
||||
<el-table-column label="联系方式" prop="mobile"></el-table-column>
|
||||
<el-table-column label="单位" prop="unitName"></el-table-column>
|
||||
<el-table-column label="分工会" prop="unionName"></el-table-column>
|
||||
<el-table-column label="代表团" prop="delegationName"></el-table-column>
|
||||
</el-table>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
|
||||
<!--提案委员会立案-->
|
||||
<el-descriptions border class="flow-task-form" :column="3" :key="task.id"
|
||||
v-else-if="task.taskName === 'committee'||task.taskName === 'committeeFilingUnit'">
|
||||
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
|
||||
}}({{task.taskFormData.loginName}})
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="立案结果">
|
||||
<div style="display: flex;justify-content: center">
|
||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
:value="task.ext.tf_caseFilingResult"></dict-tag>
|
||||
|
||||
<!-- 普通提案/重点提案暂不展示,历史流程变量仍保留。 -->
|
||||
<template v-if="false">
|
||||
(
|
||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||
:value="task.ext.tf_caseFilingType"></dict-tag>
|
||||
)
|
||||
</template>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
<template v-if="['CONFIRM_FILING','SUGGESTION'].includes(task.ext.tf_caseFilingResult)">
|
||||
<el-descriptions-item v-if="task.ext.tf_caseFilingResult === 'SUGGESTION'" label="承办单位" :span="3">{{task?.ext?.tf_masterUnitNameStr || task?.ext?.tf_slaveUnitNameStr}}
|
||||
<!--邀请附议人-->
|
||||
<el-descriptions border class="flow-task-form" :column="3" :key="task.id"
|
||||
v-else-if="task.taskName === 'invite'">
|
||||
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
|
||||
}}({{task.taskFormData.loginName}})
|
||||
</el-descriptions-item>
|
||||
<template v-else>
|
||||
<el-descriptions-item label="主办单位" :span="3">{{task?.ext?.tf_masterUnitNameStr}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="协办单位" :span="3">{{task?.ext?.tf_slaveUnitNameStr}}
|
||||
<el-descriptions-item label="办理时间" :span="2">{{ task.finishTime }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="附议人" :span="3" v-if="task.taskName === 'invite'">
|
||||
<el-table v-loading="tableLoading" :data="task?.taskFormData?.seconder">
|
||||
<el-table-column label="姓名" prop="userName"></el-table-column>
|
||||
<el-table-column label="工号" prop="loginName"></el-table-column>
|
||||
<el-table-column label="性别" prop="sex"></el-table-column>
|
||||
<el-table-column label="联系方式" prop="mobile"></el-table-column>
|
||||
<el-table-column label="单位" prop="unitName"></el-table-column>
|
||||
<el-table-column label="分工会" prop="unionName"></el-table-column>
|
||||
<el-table-column label="代表团" prop="delegationName"></el-table-column>
|
||||
</el-table>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
|
||||
<!--提案委员会立案-->
|
||||
<el-descriptions border class="flow-task-form" :column="3" :key="task.id"
|
||||
v-else-if="task.taskName === 'committee'||task.taskName === 'committeeFilingUnit'">
|
||||
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
|
||||
}}({{task.taskFormData.loginName}})
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
|
||||
<!-- 立案节点分别展示流程记录中的结果与类型,空值显示双横线。 -->
|
||||
<el-descriptions-item label="立案结果">
|
||||
<div style="display: flex;justify-content: center">
|
||||
<dict-tag v-if="task.ext.tf_caseFilingResult"
|
||||
:options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
:value="task.ext.tf_caseFilingResult"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="立案类型">
|
||||
<div style="display: flex;justify-content: center">
|
||||
<dict-tag v-if="task.ext.tf_caseFilingType"
|
||||
:options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||
:value="task.ext.tf_caseFilingType"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
<template v-if="['CONFIRM_FILING','SUGGESTION'].includes(task.ext.tf_caseFilingResult)">
|
||||
<el-descriptions-item v-if="task.ext.tf_caseFilingResult === 'SUGGESTION'"
|
||||
label="承办单位" :span="3">{{task?.ext?.tf_masterUnitNameStr ||
|
||||
task?.ext?.tf_slaveUnitNameStr}}
|
||||
</el-descriptions-item>
|
||||
<template v-else>
|
||||
<el-descriptions-item label="主办单位" :span="3">{{task?.ext?.tf_masterUnitNameStr}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="协办单位" :span="3">{{task?.ext?.tf_slaveUnitNameStr}}
|
||||
</el-descriptions-item>
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
<el-descriptions-item label="办理意见" :span="3">
|
||||
<div v-html="task.taskFormData.tf_opinion"></div>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-descriptions-item label="办理意见" :span="3">
|
||||
<div v-html="task.taskFormData.tf_opinion"></div>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
|
||||
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
|
||||
<el-descriptions-item label="承办单位"
|
||||
v-if="['opinion_unit_reply','unit_reply','two_unit_reply','opinion_master_reply','master_reply','slave_reply'].includes(task.taskName)" :span="3">
|
||||
{{task.ext.underTakeName}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
|
||||
<el-descriptions-item label="承办单位"
|
||||
v-if="['opinion_unit_reply','unit_reply','two_unit_reply','opinion_master_reply','master_reply','slave_reply'].includes(task.taskName)"
|
||||
:span="3">
|
||||
{{task.ext.underTakeName}}
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
|
||||
}}({{task.taskFormData.loginName}})
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
|
||||
}}({{task.taskFormData.loginName}})
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="办理评价" v-if="['feedback'].includes(task.taskName)" :span="3">
|
||||
<dict-tag :options="dict.type.PROPOSAL_FEEDBACK"
|
||||
:value="task.ext.tf_feedback"></dict-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理结果" v-else>
|
||||
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
|
||||
:value="task.ext.submitType"></dict-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理意见" :span="3" v-if="!task.ext.isFirstTaskNode">
|
||||
<div v-html="task.taskFormData.tf_opinion"></div>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-descriptions-item label="办理评价" v-if="['feedback'].includes(task.taskName)"
|
||||
:span="3">
|
||||
<dict-tag :options="dict.type.PROPOSAL_FEEDBACK"
|
||||
:value="task.ext.tf_feedback"></dict-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理结果" v-else>
|
||||
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
|
||||
:value="task.ext.submitType"></dict-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理意见" :span="3" v-if="!task.ext.isFirstTaskNode">
|
||||
<div v-html="task.taskFormData.tf_opinion"></div>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</el-collapse-item>
|
||||
</el-collapse>
|
||||
</template>
|
||||
@@ -243,7 +270,7 @@ const PROPOSAL_INFO = {
|
||||
<snaker-chart ref="snakerChartRef"></snaker-chart>
|
||||
</div>
|
||||
`,
|
||||
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
|
||||
},
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,9 +23,9 @@ layout("/layouts/platform.html"){
|
||||
</el-card>
|
||||
<el-card shadow="never">
|
||||
<table-tool :columns.sync="tableColumns">
|
||||
<el-button class="ml5" icon="el-icon-upload2" type="primary" size="small"
|
||||
<!-- <el-button class="ml5" icon="el-icon-upload2" type="primary" size="small"
|
||||
@click="openImport">导入提案
|
||||
</el-button>
|
||||
</el-button>-->
|
||||
</table-tool>
|
||||
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
|
||||
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ layout("/layouts/platform.html"){
|
||||
<custom-card>
|
||||
<snaker-start slot="header" label="撰写提案" define_key="JDHTA_NC">
|
||||
<template slot="header-right-label">
|
||||
<el-link type="primary" @click="openImport" v-if="!formData.id" style="margin-right: 15px">导入提案</el-link>
|
||||
<!-- <el-link type="primary" @click="openImport" v-if="!formData.id" style="margin-right: 15px">导入提案</el-link>-->
|
||||
</template>
|
||||
</snaker-start>
|
||||
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
|
||||
|
||||
+14
-3
@@ -82,6 +82,7 @@ layout("/layouts/platform.html"){
|
||||
</el-popover>
|
||||
</table-tool>
|
||||
<el-table
|
||||
ref="memberTableRef"
|
||||
:data="tableData"
|
||||
style="width: 100%"
|
||||
stripe
|
||||
@@ -102,12 +103,12 @@ layout("/layouts/platform.html"){
|
||||
<el-table-column
|
||||
align="center"
|
||||
header-align="center"
|
||||
v-for="column in tableColumns"
|
||||
v-for="column in showColumns"
|
||||
:key="column.prop"
|
||||
show-overflow-tooltip
|
||||
v-if="checkedFields.includes(column.prop)"
|
||||
:label="column.label"
|
||||
:prop="column.prop"
|
||||
:width="column.width"
|
||||
:min-width="column.width || 120"
|
||||
:fixed="column.fixed"
|
||||
:sortable="column.sortable"
|
||||
>
|
||||
@@ -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));
|
||||
|
||||
@@ -9,26 +9,30 @@ const PROPOSAL_INFO = {
|
||||
<van-cell-group :border="false">
|
||||
<van-cell title="提案编号">{{ viewData.code || '--' }}</van-cell>
|
||||
<van-cell title="提案名称">{{ viewData.name || '--' }}</van-cell>
|
||||
<van-cell title="立案结果" v-if="viewData.caseFilingResult">
|
||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
:value="viewData.caseFilingResult"></dict-tag>
|
||||
</van-cell>
|
||||
<van-cell title="立案类型" v-if="viewData.caseFilingType">
|
||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||
:value="viewData.caseFilingType"></dict-tag>
|
||||
</van-cell>
|
||||
<van-cell title="提案类型">{{ viewData.typeName || '--' }}</van-cell>
|
||||
|
||||
<van-cell title="提案类别">{{ viewData.typeName || '--' }}</van-cell>
|
||||
<van-cell title="提案方式">{{ getDictText(dict.type.PROPOSAL_SOURCE, viewData.source) }}
|
||||
</van-cell>
|
||||
<van-cell title="代表姓名">{{ viewData.createUserName || '--' }}</van-cell>
|
||||
<van-cell title="所属教代会">{{ viewData.sessionName || viewData.fullName || '--' }}</van-cell>
|
||||
<van-cell :title="viewData.committeeName ? '所属委员会' : '所属代表团'">
|
||||
<van-cell title="提案人">{{ viewData.createUserName || '--' }}</van-cell>
|
||||
<van-cell title="教代会届次">{{ viewData.sessionName || viewData.fullName || '--' }}</van-cell>
|
||||
<van-cell :title="viewData.committeeName ? '委员会名称' : '代表团名称'">
|
||||
{{ viewData.committeeName || viewData.delegationName || '--' }}
|
||||
</van-cell>
|
||||
<van-cell title="单位">{{ viewData.unitName || '--' }}</van-cell>
|
||||
<van-cell title="提案人单位">{{ viewData.unitName || '--' }}</van-cell>
|
||||
<van-cell title="联系电话">{{ viewData.mobile || '--' }}</van-cell>
|
||||
<van-cell title="提案时间">{{ viewData.createTime || '--' }}</van-cell>
|
||||
<van-cell title="案由" class="proposal-view-long-cell">
|
||||
<!-- 立案结果和类型尚未填写时仍显示字段,并以双横线表示空值。 -->
|
||||
<van-cell title="立案结果">
|
||||
<dict-tag v-if="viewData.caseFilingResult" :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
:value="viewData.caseFilingResult"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</van-cell>
|
||||
<van-cell title="立案类型">
|
||||
<dict-tag v-if="viewData.caseFilingType" :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||
:value="viewData.caseFilingType"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</van-cell>
|
||||
<van-cell title="提案案由" class="proposal-view-long-cell">
|
||||
<div class="proposal-view-rich-value" v-html="viewData.brief || '--'"></div>
|
||||
</van-cell>
|
||||
<van-cell title="建议措施" class="proposal-view-long-cell">
|
||||
@@ -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)">
|
||||
</van-cell>
|
||||
@@ -66,13 +70,16 @@ const PROPOSAL_INFO = {
|
||||
<template v-if="opinion.commissionerLoginName">({{ opinion.commissionerLoginName }})
|
||||
</template>
|
||||
</van-cell>
|
||||
<!-- 委员意见分别展示立案结果和类型,未填写时显示双横线。 -->
|
||||
<van-cell title="立案结果">
|
||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
<dict-tag v-if="opinion.caseFilingResult" :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
:value="opinion.caseFilingResult"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</van-cell>
|
||||
<van-cell title="立案类型" v-if="opinion.caseFilingType">
|
||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||
<van-cell title="立案类型">
|
||||
<dict-tag v-if="opinion.caseFilingType" :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||
:value="opinion.caseFilingType"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</van-cell>
|
||||
<van-cell title="意见" v-if="opinion.opinionText" class="proposal-view-long-cell">
|
||||
<div class="proposal-view-rich-value">{{ opinion.opinionText }}</div>
|
||||
@@ -158,13 +165,18 @@ const PROPOSAL_INFO = {
|
||||
|| '--' }})
|
||||
</van-cell>
|
||||
<van-cell title="办理时间">{{ selectedTask.finishTime || '--' }}</van-cell>
|
||||
<!-- 立案节点分别展示流程记录中的结果与类型,空值显示双横线。 -->
|
||||
<van-cell title="立案结果">
|
||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
<dict-tag v-if="selectedTask.ext.tf_caseFilingResult"
|
||||
:options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||
:value="selectedTask.ext.tf_caseFilingResult"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</van-cell>
|
||||
<van-cell title="立案类型" v-if="selectedTask.ext.tf_caseFilingType">
|
||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||
<van-cell title="立案类型">
|
||||
<dict-tag v-if="selectedTask.ext.tf_caseFilingType"
|
||||
:options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||
:value="selectedTask.ext.tf_caseFilingType"></dict-tag>
|
||||
<span v-else>--</span>
|
||||
</van-cell>
|
||||
<template
|
||||
v-if="['CONFIRM_FILING', 'SUGGESTION'].includes(selectedTask.ext.tf_caseFilingResult)">
|
||||
@@ -187,7 +199,7 @@ const PROPOSAL_INFO = {
|
||||
</template>
|
||||
|
||||
<template v-else>
|
||||
<van-cell title="办理单位"
|
||||
<van-cell title="承办单位"
|
||||
v-if="['opinion_unit_reply', 'unit_reply', 'two_unit_reply', 'opinion_master_reply', 'master_reply', 'slave_reply'].includes(selectedTask.taskName)">
|
||||
{{ selectedTask.ext.underTakeName || '--' }}
|
||||
</van-cell>
|
||||
|
||||
Reference in New Issue
Block a user