Merge remote-tracking branch 'origin/main'

This commit is contained in:
2026-08-19 16:43:47 +08:00
52 changed files with 591 additions and 128 deletions
@@ -90,10 +90,12 @@ public class ClubAuditManagerController {
cnd.andEX("year(info.creatTime)", "=", pageForm.getYear());
cnd.and("t.taskName", "=", "ef81777f-22fb-4fe4-9800-909e6c681210");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (approval) {
// 已审核是全量历史,不能因历史工作流参与人不同而遗漏参考库迁移记录。
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
// 未审核只展示当前登录人实际可以处理的待办任务。
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
@@ -95,6 +95,14 @@ public class SysClubExamineRegister extends BaseModel {
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> yearActivityList;
/**
* 旧版年审表保存的年度活动明细,保留该字段用于查看迁移历史数据。
*/
@Column
@Comment("旧版年度活动明细")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> yearActivitys;
@Column
@Comment("财务收支情况统计json")
@ColDefine(type = ColType.MYSQL_JSON)
@@ -8,6 +8,7 @@ import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
@@ -33,8 +34,10 @@ import org.nutz.lang.util.NutMap;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@IocBean(args = {"refer:dao"})
@@ -119,6 +122,7 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl<SysClubExamineReg
Sql applySql = Sqls.create("""
SELECT
cu.userId,
cu.id,
cu.mode,
cu.applyDate,
cu.joinTime,
@@ -129,17 +133,25 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl<SysClubExamineReg
LEFT JOIN sys_user u ON u.id = cu.userId
WHERE cu.clubId = @clubId
AND COALESCE(cu.delFlag, 0) = 0
AND EXISTS (
SELECT 1
FROM wf_process_instance ins
WHERE ins.businessNo = cu.id
AND ins.state = @finishedState
)
ORDER BY cu.applyDate, cu.mode
""")
.setParam("clubId", clubId)
.setParam("finishedState", ProcessInstanceStateEnum.FINISHED.getCode());
.setParam("clubId", clubId);
List<NutMap> applications = listMap(applySql);
if (!applications.isEmpty()) {
// 流程状态改为按当前社团申请批量查询,避免相关子查询对流程实例表重复扫描。
List<String> applicationIds = applications.stream()
.map(application -> application.getString("id"))
.filter(StrUtil::isNotBlank)
.collect(Collectors.toList());
List<ProcessInstance> finishedInstances = applicationIds.isEmpty() ? new ArrayList<>()
: dao().query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", applicationIds)
.and(ProcessInstance::getState, "=", ProcessInstanceStateEnum.FINISHED.getCode()));
Set<String> finishedBusinessNos = finishedInstances.stream()
.map(ProcessInstance::getBusinessNo)
.filter(StrUtil::isNotBlank)
.collect(Collectors.toCollection(HashSet::new));
applications.removeIf(application -> !finishedBusinessNos.contains(application.getString("id")));
}
applications.sort(Comparator.comparing(row -> row.getTime("applyDate"), Comparator.nullsLast(Date::compareTo)));
for (NutMap application : applications) {
@@ -259,6 +271,10 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl<SysClubExamineReg
}
private String normalizeUserState(String userState) {
// 历史成员数据可能未同步人员状态,空值不参与在职、退休人数统计。
if (StrUtil.isBlank(userState)) {
return null;
}
if (List.of("在职", "在岗").contains(userState)) {
return "在职";
}
@@ -476,6 +492,8 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl<SysClubExamineReg
// 查询主表数据并关联明细数据
ClubExamineVo clubExamineVo = fetchVO(sql, ClubExamineVo.class);
if (Lang.isNotEmpty(clubExamineVo)) {
// 详情页统一使用V4字段,兼容尚未改写JSON内容的V3年审记录。
normalizeActivityData(clubExamineVo);
List<SysClubExamineRegisterDetailed> detailedList = dao().query(SysClubExamineRegisterDetailed.class,
Cnd.where("registerId", "=", id).asc("location"));
clubExamineVo.setDetailedList(detailedList);
@@ -512,6 +530,94 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl<SysClubExamineReg
return clubExamineVo;
}
/**
* 将旧版年审活动和计划字段转换为查看页统一使用的V4字段,避免历史数据在页面中显示为空。
*
* @param examineVo 年审详情
*/
private void normalizeActivityData(ClubExamineVo examineVo) {
examineVo.setSummaryFiles(normalizeSummaryFiles(examineVo.getSummaryFiles()));
List<JSONObject> yearActivitySource = examineVo.getYearActivityList();
if (yearActivitySource == null || yearActivitySource.isEmpty()) {
yearActivitySource = examineVo.getYearActivitys();
}
examineVo.setYearActivityList(yearActivitySource == null ? new ArrayList<>()
: yearActivitySource.stream()
.map(item -> normalizeActivityItem(item, true))
.collect(Collectors.toList()));
List<JSONObject> planSource = examineVo.getPlans();
examineVo.setPlans(planSource == null ? new ArrayList<>()
: planSource.stream()
.map(item -> normalizeActivityItem(item, false))
.collect(Collectors.toList()));
}
/**
* 将V3工作总结附件的文件主键包装为V4文件预览组件所需的response.data格式。
*
* @param summaryFiles 原始工作总结附件
* @return 可供文件预览组件读取的附件数据
*/
private List<JSONObject> normalizeSummaryFiles(List<JSONObject> summaryFiles) {
if (summaryFiles == null || summaryFiles.isEmpty()) {
return new ArrayList<>();
}
return summaryFiles.stream()
.filter(Objects::nonNull)
.map(file -> {
JSONObject response = file.getJSONObject("response");
if (response != null && StrUtil.isNotBlank(response.getStr("data"))) {
return file;
}
String fileId = file.getStr("id");
if (StrUtil.isBlank(fileId)) {
return null;
}
JSONObject normalizedFile = new JSONObject();
normalizedFile.set("response", new JSONObject().set("data", fileId));
return normalizedFile;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
/**
* 兼容V3活动字段(hdsj、mc、zbdw、hddd、cjrs、hjqk)和V4活动字段。
*
* @param source 原始活动或计划数据
* @param includeResult 是否包含本年度活动的参加人数和获奖情况
* @return 供查看页使用的统一字段数据
*/
private JSONObject normalizeActivityItem(JSONObject source, boolean includeResult) {
JSONObject item = new JSONObject();
item.set("activityName", getActivityValue(source, "activityName", "mc"));
item.set("activityUnit", getActivityValue(source, "activityUnit", "zbdw"));
item.set("activityAddress", getActivityValue(source, "activityAddress", "hddd"));
if (includeResult) {
item.set("activityTime", getActivityValue(source, "activityTime", "hdsj"));
item.set("joinNum", getActivityValue(source, "joinNum", "cjrs"));
item.set("prize", getActivityValue(source, "prize", "hjqk"));
}
return item;
}
/**
* 优先读取V4字段;历史记录没有该字段时回退读取对应的V3字段。
*
* @param source 原始JSON数据
* @param currentField V4字段名
* @param legacyField V3字段名
* @return 兼容后的字段值
*/
private String getActivityValue(JSONObject source, String currentField, String legacyField) {
if (source == null) {
return null;
}
String currentValue = source.getStr(currentField);
return StrUtil.isNotBlank(currentValue) ? currentValue : source.getStr(legacyField);
}
@Override
public List<NutMap> getYearActivityExportData(String id) {
ClubExamineVo examineVo = this.findOne(id);
@@ -79,21 +79,27 @@ public class HonorSummaryController {
@At
@SaCheckPermission("honor.honorLevel.Summary")
public Result honorLevelData(HonorPageForm pageForm) {
List<HonorBasicSettings> query = dao.query(HonorBasicSettings.class, Cnd.where("queryTypeCode", "in",
List.of(HonorTypeOrigin.HONOR_SCHOOL_LEVEL.name(), HonorTypeOrigin.HONOR_PROVINCIAL_LEVEL.name(), HonorTypeOrigin.HONOR_NATIONAL_LEVEL.name())));
String schoolHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_SCHOOL_LEVEL.name())).findFirst().orElse(new HonorBasicSettings()).getId();
String provincialHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_PROVINCIAL_LEVEL.name())).findFirst().orElse(new HonorBasicSettings()).getId();
String nationalHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_NATIONAL_LEVEL.name())).findFirst().orElse(new HonorBasicSettings()).getId();
HonorBasicSettings levelRoot = dao.fetch(HonorBasicSettings.class,
Cnd.where("queryTypeCode", "=", HonorTypeOrigin.HONOR_LEVEL.name()));
List<HonorBasicSettings> levelList = levelRoot == null ? List.of() : dao.query(HonorBasicSettings.class,
Cnd.where("parentId", "=", levelRoot.getId()));
String schoolHonorId = levelList.stream().filter(item -> "校内".equals(item.getName()))
.findFirst().orElse(new HonorBasicSettings()).getId();
String provincialHonorId = levelList.stream().filter(item -> "省部级".equals(item.getName()))
.findFirst().orElse(new HonorBasicSettings()).getId();
String nationalHonorId = levelList.stream().filter(item -> "国家级".equals(item.getName()))
.findFirst().orElse(new HonorBasicSettings()).getId();
Cnd cnd = Cnd.NEW();
// honor.honorLevel 直接保存荣誉等级项 ID,按“荣誉等级”下的具体等级项统计。
// 历史荣誉记录可能未保存 unionId,统计时仅在 unionId 为空时按 unionName 回退关联。
Sql sql = Sqls.create("""
SELECT
id,
name as unionname,
( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @nationalLevel AND h.unionId = un.id $cnd) nationalLevelNum,
( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @provincial AND h.unionId = un.id $cnd) provincialNum ,
( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @schoolLevel AND h.unionId = un.id $cnd) schoolLevelNum
( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @nationalLevel AND (h.unionId = un.id OR ((h.unionId IS NULL OR h.unionId = '') AND h.unionName = un.name)) $cnd) nationalLevelNum,
( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @provincial AND (h.unionId = un.id OR ((h.unionId IS NULL OR h.unionId = '') AND h.unionName = un.name)) $cnd) provincialNum ,
( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @schoolLevel AND (h.unionId = un.id OR ((h.unionId IS NULL OR h.unionId = '') AND h.unionName = un.name)) $cnd) schoolLevelNum
FROM
sys_union un $condition
""").setParam("nationalLevel", nationalHonorId).setParam("provincial", provincialHonorId).setParam("schoolLevel", schoolHonorId);
@@ -402,6 +402,10 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
keywordCondition.orLike("info.createUserName", keyword);
keywordCondition.orLike("info.createUserLoginName", keyword);
}
// 立案编号由立案环节生成,选中该搜索来源时按编号进行模糊匹配。
if (ArrayUtil.contains(pageForm.getOrigins(), "caseFilingCode")) {
keywordCondition.orLike("info.caseFilingCode", keyword);
}
if (searchAnswer) {
keywordCondition.orLike("JSON_EXTRACT(replyTask.variable,'$.tf_opinion')", keyword);
}
@@ -29,6 +29,7 @@ import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
@@ -75,6 +76,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
private static final String WORK_SUGGESTION_SECTION_MARKER = "__WORK_SUGGESTION_SECTION__";
private static final int UNDERTAKE_UNIT_EXPORT_COLUMN_COUNT = 6;
private static final int UNDERTAKE_UNIT_SECOND_TITLE_ROW_INDEX = 1;
@Inject
private ProposalCommonService proposalCommonService;
@@ -448,12 +450,12 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
*/
private Workbook buildUndertakeUnitWorkbook(String title, String unitName, List<NutMap> excelRows) {
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("立案编号", "caseFilingCode", 18));
exportEntities.add(new ExcelExportEntity("提案名称", "name", 65));
exportEntities.add(new ExcelExportEntity("提案人", "createUserName", 15));
exportEntities.add(new ExcelExportEntity("主办单位", "masterUnitNames", 28));
exportEntities.add(new ExcelExportEntity("协办单位", "slaveUnitNames", 28));
exportEntities.add(new ExcelExportEntity("工作建议送达单位", "workSuggestionUnitNames", 32));
exportEntities.add(new ExcelExportEntity("立案编号", "caseFilingCode", 11));
exportEntities.add(new ExcelExportEntity("提案名称", "name", 43));
exportEntities.add(new ExcelExportEntity("提案人", "createUserName", 13));
exportEntities.add(new ExcelExportEntity("主办单位", "masterUnitNames", 19));
exportEntities.add(new ExcelExportEntity("协办单位", "slaveUnitNames", 25));
exportEntities.add(new ExcelExportEntity("工作建议送达单位", "workSuggestionUnitNames", 17));
for (ExcelExportEntity exportEntity : exportEntities) {
exportEntity.setWrap(true);
}
@@ -467,9 +469,54 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
exportParams.setHeight((short) 13);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, excelRows);
mergeWorkSuggestionSection(workbook);
applyUndertakeUnitWorkbookStyle(workbook);
return workbook;
}
/**
* 为承办单位表的全部有效单元格设置细实线边框,并保证第二行承办单位名称加粗且水平、垂直居中。
* 相同原始样式复用同一个克隆样式,避免按单元格重复创建样式导致工作簿样式数量过多。
*/
private void applyUndertakeUnitWorkbookStyle(Workbook workbook) {
Sheet sheet = workbook.getSheetAt(0);
Map<String, CellStyle> borderedStyles = new HashMap<>();
Font unitNameFont = workbook.createFont();
unitNameFont.setFontName("宋体");
unitNameFont.setFontHeightInPoints((short) 11);
unitNameFont.setBold(true);
for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
Row row = sheet.getRow(rowIndex);
if (row == null) {
continue;
}
boolean centerUnitName = rowIndex == UNDERTAKE_UNIT_SECOND_TITLE_ROW_INDEX;
for (int columnIndex = 0; columnIndex < UNDERTAKE_UNIT_EXPORT_COLUMN_COUNT; columnIndex++) {
Cell cell = row.getCell(columnIndex);
if (cell == null) {
cell = row.createCell(columnIndex);
}
CellStyle sourceStyle = cell.getCellStyle();
String styleKey = sourceStyle.getIndex() + ":" + centerUnitName;
CellStyle borderedStyle = borderedStyles.get(styleKey);
if (borderedStyle == null) {
borderedStyle = workbook.createCellStyle();
borderedStyle.cloneStyleFrom(sourceStyle);
borderedStyle.setBorderTop(BorderStyle.THIN);
borderedStyle.setBorderRight(BorderStyle.THIN);
borderedStyle.setBorderBottom(BorderStyle.THIN);
borderedStyle.setBorderLeft(BorderStyle.THIN);
if (centerUnitName) {
borderedStyle.setAlignment(HorizontalAlignment.CENTER);
borderedStyle.setVerticalAlignment(VerticalAlignment.CENTER);
borderedStyle.setFont(unitNameFont);
}
borderedStyles.put(styleKey, borderedStyle);
}
cell.setCellStyle(borderedStyle);
}
}
}
/**
* 查找工作建议标记行,将承办单位表的全部单元格合并并设置为居中的分组标题。
*/
@@ -65,22 +65,10 @@ module.exports = {
let ids = []
if (this.complete_result) {
if (Array.isArray(val)) {
ids = val.map((item) => {
if (item.response.data.includes("=")) {
return item?.response?.data.substring(item?.response?.data.lastIndexOf("=") + 1)
} else {
return item?.response?.data
}
})
ids = val.map((item) => this.resolveFileId(item)).filter((id) => id)
} else {
try {
ids = JSON.parse(val).map((item) => {
if (item.response.data.includes("=")) {
return item?.response?.data.substring(item?.response?.data.lastIndexOf("=") + 1)
} else {
return item?.response?.data
}
})
ids = JSON.parse(val).map((item) => this.resolveFileId(item)).filter((id) => id)
} catch (err) {
this.fileList = []
}
@@ -100,6 +88,18 @@ module.exports = {
this.requestFullFile(ids)
},
// 新版上传组件保存 response.data,迁移的历史附件保留原文件主键 id。
resolveFileId(item) {
if (!item) {
return ""
}
const fileValue = item.response && item.response.data ? item.response.data : item.id
if (typeof fileValue !== "string" || !fileValue) {
return ""
}
return fileValue.includes("=") ? fileValue.substring(fileValue.lastIndexOf("=") + 1) : fileValue
},
requestFullFile(ids) {
this.$axios.post("/platform/sys/file/previewFileData", {ids: JSON.stringify(ids)}).then((res) => {
if (res.code === 0) {
@@ -65,22 +65,10 @@ module.exports = {
let ids = []
if (this.complete_result) {
if (Array.isArray(val)) {
ids = val.map((item) => {
if (item.response.data.includes("=")) {
return item?.response?.data.substring(item?.response?.data.lastIndexOf("=") + 1)
} else {
return item?.response?.data
}
})
ids = val.map((item) => this.resolveFileId(item)).filter((id) => id)
} else {
try {
ids = JSON.parse(val).map((item) => {
if (item.response.data.includes("=")) {
return item?.response?.data.substring(item?.response?.data.lastIndexOf("=") + 1)
} else {
return item?.response?.data
}
})
ids = JSON.parse(val).map((item) => this.resolveFileId(item)).filter((id) => id)
} catch (err) {
this.fileList = []
}
@@ -100,6 +88,18 @@ module.exports = {
this.requestFullFile(ids)
},
// 新版上传组件保存 response.data,迁移的历史附件保留原文件主键 id。
resolveFileId(item) {
if (!item) {
return ""
}
const fileValue = item.response && item.response.data ? item.response.data : item.id
if (typeof fileValue !== "string" || !fileValue) {
return ""
}
return fileValue.includes("=") ? fileValue.substring(fileValue.lastIndexOf("=") + 1) : fileValue
},
requestFullFile(ids) {
this.$axios.post("/platform/sys/file/previewFileData", { ids: JSON.stringify(ids) }).then((res) => {
if (res.code === 0) {
@@ -198,7 +198,8 @@ const branchUnionUserManage = {
initJSearch() {
const optionTask = this.jOptions.length ? $.Deferred().resolve().promise() : this.loadJOptions()
$.when(optionTask, this.loadUsedJCodes()).then(() => {
this.pageForm.j = this.getHighestUsedJ()
// 页面初始化时不限定届次,默认展示该分工会所有届次的干部。
this.pageForm.j = ""
this.pageData()
})
},
@@ -225,6 +226,8 @@ const branchUnionUserManage = {
}).then((res) => {
if (res.code === 0) {
this.$set(this, "partySecretaryUnitOptions", res.data || [])
// 新增二级党委书记时,默认授权当前分工会下的全部二级单位。
this.$set(this.formData, "unitIds", this.partySecretaryUnitOptions.map(item => item.id))
}
})
},
@@ -105,8 +105,8 @@
</el-descriptions>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
}}({{task.taskFormData.loginName}})
<el-descriptions-item label="办理用户">{{ getTaskFormValue(task, "userName", "tf_userName")
}}({{ getTaskFormValue(task, "loginName", "tf_loginName") }})
</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
@@ -114,7 +114,7 @@
:value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode">{{
task.taskFormData.opinion }}
getTaskFormValue(task, "opinion", "tf_opinion") }}
</el-descriptions-item>
</el-descriptions>
</div>
@@ -125,7 +125,7 @@
<el-descriptions border class="flow-task-form" :column="3">
<el-descriptions-item label="办理用户">{{ record.userName }}({{ record.loginName }})</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ record.auditTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">{{ record.auditPass ? "审核通过" : "审核不通过" }}</el-descriptions-item>
<el-descriptions-item label="办理结果">{{ getLegacyAuditResult(record) }}</el-descriptions-item>
<el-descriptions-item label="办理意见" span="3">{{ record.auditOpinion }}</el-descriptions-item>
</el-descriptions>
</div>
@@ -140,7 +140,14 @@
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
viewData: {},
viewData: {
changeUserNum: [],
detailedList: [],
incomeCensus: [],
jgUser: [],
plans: [],
yearActivityList: []
},
activeName: "1",
row: {},
doneTasks: [],
@@ -165,37 +172,99 @@
getAuditDisplayName(displayName) {
return displayName === "协会审核" ? "会长审核" : displayName
},
// 历史流程任务使用tf_前缀保存表单字段,正常流程继续优先读取标准字段。
getTaskFormValue(task, fieldName, legacyFieldName) {
const formData = task.taskFormData || {}
return formData[fieldName] || formData[legacyFieldName] || "—"
},
// 旧审核表的auditPass可能为空,不能按false错误展示为审核不通过。
getLegacyAuditResult(record) {
if (record.auditPass === true || record.auditPass === 1) {
return "审核通过"
}
if (record.auditPass === false || record.auditPass === 0) {
return "审核不通过"
}
return "—"
},
async onOpen(row) {
this.row = row
const resp = await this.$axios.post("/platform/club/examine/common/findOne", { id: row.id })
if (resp.code === 0) {
this.viewData = resp.data
this.$set(this, "legacyAuditRecords", resp.data.legacyAuditRecords || [])
await this.getClubUserNum(resp.data.clubId)
await this.getJgUser(resp.data.clubId)
this.$set(this, "row", row)
this.$set(this, "doneTasks", [])
this.$set(this, "legacyAuditRecords", [])
try {
const resp = await this.$axios.post("/platform/club/examine/common/findOne", { id: row.id })
if (resp.code !== 0) {
this.$message.error(resp.msg || "查询年审详情失败")
return
}
const viewData = resp.data || {}
this.$set(this, "viewData", viewData)
this.$set(this, "legacyAuditRecords", viewData.legacyAuditRecords || [])
// 三类补充数据独立加载,成员变化统计失败不能阻断成员和审核记录显示。
await Promise.all([
this.getClubUserNum(viewData.clubId),
this.getJgUser(viewData.clubId),
this.getDoneTasks()
])
} catch (error) {
this.$message.error("查询年审详情失败")
}
this.getDoneTasks()
},
async getClubUserNum(clubId) {
const resp = await this.$axios.post("/platform/club/examine/apply/getClubUserNum", {
clubId: clubId,
year: this.row.year
})
this.$set(this.viewData, "changeUserNum", resp.data)
if (!clubId) {
this.$set(this.viewData, "changeUserNum", [])
return
}
try {
const resp = await this.$axios.post("/platform/club/examine/apply/getClubUserNum", {
clubId: clubId,
year: this.row.year
})
if (resp.code === 0) {
this.$set(this.viewData, "changeUserNum", resp.data || [])
} else {
this.$set(this.viewData, "changeUserNum", [])
this.$message.warning(resp.msg || "查询社团成员变化情况失败")
}
} catch (error) {
this.$set(this.viewData, "changeUserNum", [])
this.$message.warning("查询社团成员变化情况失败")
}
},
async getJgUser(clubId) {
const respUser = await this.$axios.post("/platform/club/examine/apply/getJgUser", {
clubId: clubId
})
this.$set(this.viewData, "jgUser", respUser.data)
if (!clubId) {
this.$set(this.viewData, "jgUser", [])
return
}
try {
const respUser = await this.$axios.post("/platform/club/examine/apply/getJgUser", {
clubId: clubId
})
if (respUser.code === 0) {
this.$set(this.viewData, "jgUser", respUser.data || [])
} else {
this.$set(this.viewData, "jgUser", [])
this.$message.warning(respUser.msg || "查询社团成员失败")
}
} catch (error) {
this.$set(this.viewData, "jgUser", [])
this.$message.warning("查询社团成员失败")
}
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
async getDoneTasks() {
try {
const res = await this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id})
if (res.code === 0) {
this.$set(this, "doneTasks", res.data || [])
} else {
this.$set(this, "doneTasks", [])
this.$message.warning(res.msg || "查询审核记录失败")
}
})
} catch (error) {
this.$set(this, "doneTasks", [])
this.$message.warning("查询审核记录失败")
}
},
// 查看流程图
openChart(){
@@ -56,7 +56,7 @@ const PROPOSAL_INFO = {
<div class="process-title">
并案信息
</div>
<el-table :data="viewData.merges" size="medium">
<el-table v-loading="tableLoading" :data="viewData.merges" size="medium">
<el-table-column label="序号" type="index" width="100px"></el-table-column>
<el-table-column label="提案编号" prop="code" sortable></el-table-column>
<el-table-column label="提案名称" prop="name" show-overflow-tooltip></el-table-column>
@@ -76,7 +76,7 @@ const PROPOSAL_INFO = {
<div class="process-title">
委员会成员意见
</div>
<el-table :data="viewData.commissionerOpinions" size="medium">
<el-table v-loading="tableLoading" :data="viewData.commissionerOpinions" size="medium">
<el-table-column label="序号" type="index" width="100px"></el-table-column>
<el-table-column label="委员" prop="commissionerName">
<template slot-scope="{row}">
@@ -145,7 +145,7 @@ const PROPOSAL_INFO = {
</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 :data="task?.taskFormData?.seconder">
<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>
@@ -230,6 +230,7 @@ const PROPOSAL_INFO = {
},
data() {
return {
tableLoading: false,
viewData: {},
doneTasks: [],
activeTaskIds: [],
@@ -238,20 +239,41 @@ const PROPOSAL_INFO = {
}
},
methods: {
// 打开
onOpen(row) {
/**
* 加载提案详情和已办审核记录,两个请求都结束后执行完成回调。
*
* @param row 当前提案列表行,必须包含提案 id 及流程实例信息
* @param loadComplete 可选完成回调;未传入时由组件自动创建并关闭全屏加载遮罩
* @return 无返回值;详情通过 viewData、doneTasks 回显,并通过 done-tasks 事件通知审核页面
*/
onOpen(row, loadComplete) {
// 公共详情组件统一管理加载提示,保证所有查看和审核入口使用相同交互。
const loading = loadComplete ? null : createLoading("数据加载中")
const handleLoadComplete = loadComplete || (() => {
loading.close()
})
this.row = row
this.visible = true
// 详情中的表格与详情、审核记录请求共用加载状态,两个请求全部完成后再关闭。
this.$set(this, "tableLoading", true)
// 切换提案时先清空上一条提案的审核记录和展开状态,避免异步加载期间展示旧数据。
this.doneTasks = []
this.activeTaskIds = []
this.getInfo()
this.getDoneTasks()
let pendingRequestCount = 2
const handleRequestComplete = () => {
pendingRequestCount--
if (pendingRequestCount === 0) {
this.$set(this, "tableLoading", false)
handleLoadComplete()
}
}
this.getInfo().finally(handleRequestComplete)
this.getDoneTasks().finally(handleRequestComplete)
},
// 获取申请信息
getInfo() {
this.$axios.post("/platform/proposal/common/proposalInfo", {id: this.row.id}).then((res) => {
return this.$axios.post("/platform/proposal/common/proposalInfo", {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
@@ -268,7 +290,7 @@ const PROPOSAL_INFO = {
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
return this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
const tasks = res.data || []
this.doneTasks = tasks
@@ -15,7 +15,7 @@ layout("/layouts/platform.html"){
<table-tool>
<el-button type="primary" size="mini" icon="el-icon-plus" @click="openAdd">新增</el-button>
</table-tool>
<el-table :data="tableData" border stripe @sort-change="pageOrder">
<el-table v-loading="tableLoading" :data="tableData" border stripe @sort-change="pageOrder">
<el-table-column label="序号" type="index" :index="indexMethod" width="50px"></el-table-column>
<el-table-column prop="name" label="名称" sortable="custom"></el-table-column>
<el-table-column prop="code" label="编码" sortable="custom"></el-table-column>
@@ -4,7 +4,7 @@ const BASIC_XC_FORM_COMPONENT = {
<table-tool>
<el-button type="primary" size="small" icon="el-icon-plus" @click="openAdd()">新建机构</el-button>
</table-tool>
<el-table key="1" :data="tableData" ref="tableRef">
<el-table v-loading="tableLoading" key="1" :data="tableData" ref="tableRef">
<el-table-column label="序号" type="index" :index="indexMethod"></el-table-column>
<el-table-column prop="name" label="机构名称"></el-table-column>
<el-table-column prop="name" label="机构编码"></el-table-column>
@@ -23,7 +23,7 @@ layout("/layouts/platform.html"){
<table-tool>
<el-button type="primary" size="small" icon="el-icon-refresh" @click="syncSysUnit">同步系统单位</el-button>
</table-tool>
<el-table :data="tableData" border ref="tableRef" height="100%" @sort-change="pageOrder">
<el-table v-loading="tableLoading" :data="tableData" border ref="tableRef" height="100%" @sort-change="pageOrder">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column prop="name" label="单位名称" sortable="custom" show-overflow-tooltip></el-table-column>
<el-table-column prop="code" label="单位编码" sortable="custom" width="150px"></el-table-column>
@@ -194,7 +194,7 @@ layout("/layouts/platform.html"){
<div slot="header" class="clearfix">
<span class="nodes-title">{{ tableCardTitle }}</span>
</div>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
<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"></el-table-column>
<el-table-column label="提案编号" prop="code" sortable="custom" width="100px" show-overflow-tooltip></el-table-column>
<el-table-column label="提案名称" prop="name" sortable="custom" show-overflow-tooltip></el-table-column>
@@ -107,7 +107,7 @@ layout("/layouts/platform.html"){
<!-- <el-button type="primary" size="small" @click="exportProposalRegisterSummaryAsExcel">导出立案汇总表-->
<el-button type="primary" size="small" @click="exportCustomAsExcel">自定义导出</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
<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>
<el-table-column
@@ -364,6 +364,8 @@ layout("/layouts/platform.html"){
this.$businessTool.listUnit(this.pageForm.unionId).then((res) => (this.unitOptions = res))
},
pageData() {
// 自定义查询覆盖了公共 mixin,请求期间手动维护表格加载状态。
this.$set(this, "tableLoading", true)
this.$axios
.post(loc() + "/pageData", {
pageForm: JSON.stringify(this.pageForm)
@@ -378,6 +380,9 @@ layout("/layouts/platform.html"){
this.pageForm.totalCount = res.data.totalCount
}
})
.finally(() => {
this.$set(this, "tableLoading", false)
})
}
},
created() {
@@ -24,7 +24,7 @@ layout("/layouts/platform.html"){
<el-card shadow="never">
<table-tool :columns.sync="tableColumns"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
<el-table-column
:label="column.label"
@@ -164,6 +164,8 @@ layout("/layouts/platform.html"){
this.exportDialogVisible = false
},
pageData() {
// 自定义查询覆盖了公共 mixin,请求期间手动维护表格加载状态。
this.$set(this, "tableLoading", true)
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
@@ -171,6 +173,8 @@ layout("/layouts/platform.html"){
this.pageSize = res.data.pageSize
this.pageNumber = res.data.pageNumber
}
}).finally(() => {
this.$set(this, "tableLoading", false)
})
}
}
@@ -75,7 +75,7 @@ layout("/layouts/platform.html"){
<table-tool :columns="tableColumns" @update:columns="handleTableColumnsChange">
<el-button type="primary" size="small" @click="exportCustomAsExcel">自定义导出</el-button>
</table-tool>
<el-table :data="tableData" :key="tableKey" ref="tableRef" @sort-change="pageOrder"
<el-table v-loading="tableLoading" :data="tableData" :key="tableKey" ref="tableRef" @sort-change="pageOrder"
header-align="center" style="width: 100%" row-key="id">
<el-table-column label="序号" width="50" type="index" :index="indexMethod"></el-table-column>
<el-table-column
@@ -225,6 +225,8 @@ layout("/layouts/platform.html"){
this.$businessTool.listUnit(this.pageForm.unionId).then((res) => (this.unitOptions = res))
},
pageData() {
// 自定义查询覆盖了公共 mixin,请求期间手动维护表格加载状态。
this.$set(this, "tableLoading", true)
this.$axios
.post(loc() + "/pageData", {
pageForm: JSON.stringify(this.pageForm)
@@ -235,6 +237,9 @@ layout("/layouts/platform.html"){
this.pageForm.totalCount = res.data.totalCount
}
})
.finally(() => {
this.$set(this, "tableLoading", false)
})
}
},
created() {
@@ -157,7 +157,7 @@ layout("/layouts/platform.html"){
</el-tag>
</div>
</div>
<div class="filter-row">
<!-- <div class="filter-row">
<div class="filter-label">立案类型</div>
<div class="filter-tags">
<el-tag
@@ -169,7 +169,7 @@ layout("/layouts/platform.html"){
{{ item.label }}
</el-tag>
</div>
</div>
</div>-->
<search @search="doSearch" class="mt10">
<search-item label="代表团">
@@ -308,6 +308,10 @@ layout("/layouts/platform.html"){
{
label: '提案人',
value: 'createUserName'
},
{
label: '立案编号',
value: 'caseFilingCode'
}
]
}
@@ -16,7 +16,7 @@ layout("/layouts/platform.html"){
<table-tool label="代表团列表" :columns="tableColumns" @update:columns="handleTableColumnsChange">
<el-button type="primary" size="small" @click="exportCustomAsExcel">自定义导出</el-button>
</table-tool>
<el-table :data="tableData" :key="tableKey" ref="tableRef" header-align="center" style="width: 100%" row-key="id"
<el-table v-loading="tableLoading" :data="tableData" :key="tableKey" ref="tableRef" header-align="center" style="width: 100%" row-key="id"
show-summary @sort-change="pageOrder">
<el-table-column
:index="indexMethod"
@@ -69,7 +69,7 @@ layout("/layouts/platform.html"){
<!-- 提案明细组件模板独立放在页面中,避免在JavaScript中使用模板字符串。 -->
<script type="text/x-template" id="proposal-table-template" nonce="${cspNonce!}">
<div>
<el-table :data="tableData" ref="tableRef" header-align="center" style="width: 100%" row-key="id"
<el-table v-loading="tableLoading" :data="tableData" ref="tableRef" header-align="center" style="width: 100%" row-key="id"
@sort-change="pageOrder">
<el-table-column label="序号" width="50px" type="index" :index="indexMethod"></el-table-column>
<el-table-column label="提案编号" prop="code" sortable="custom" width="200px"></el-table-column>
@@ -179,6 +179,8 @@ layout("/layouts/platform.html"){
})
},
pageData() {
// 代表团统计为自定义查询,请求结束后统一关闭表格加载状态。
this.$set(this, "tableLoading", true)
this.$axios
.post(loc() + "/pageData", {
sessionId: this.sessionId,
@@ -190,6 +192,9 @@ layout("/layouts/platform.html"){
this.tableData = res.data
}
})
.finally(() => {
this.$set(this, "tableLoading", false)
})
}
},
created() {
@@ -21,11 +21,15 @@ const PROPOSAL_TABLE = {
pageData() {
this.pageForm.sessionId = this.sessionId
this.pageForm.delegationId = this.delegationId
// 弹窗明细表使用组件自身的加载状态,不影响外层代表团统计表。
this.$set(this, "tableLoading", true)
this.$axios.post("/platform/proposal/query/delegation/getProposalsByDelegation", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
}).finally(() => {
this.$set(this, "tableLoading", false)
})
}
}
@@ -92,7 +92,7 @@ layout("/layouts/platform.html"){
</el-card>
<el-card shadow="never">
<table-tool></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
<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"></el-table-column>
<el-table-column label="提案编号" prop="code" width="120px" sortable="custom"></el-table-column>
<el-table-column label="提案名称" prop="name" sortable="custom" show-overflow-tooltip></el-table-column>
@@ -262,6 +262,8 @@ layout("/layouts/platform.html"){
this.$businessTool.listUnit(this.pageForm.unionId).then((res) => (this.unitOptions = res))
},
pageData() {
// 自定义查询覆盖了公共 mixin,请求期间手动维护表格加载状态。
this.$set(this, "tableLoading", true)
this.$axios
.post(loc() + "/pageData", {
pageForm: JSON.stringify(this.pageForm)
@@ -272,6 +274,9 @@ layout("/layouts/platform.html"){
this.pageForm.totalCount = res.data.totalCount
}
})
.finally(() => {
this.$set(this, "tableLoading", false)
})
}
},
created() {
@@ -27,7 +27,7 @@ layout("/layouts/platform.html"){
<table-tool :columns="tableColumns" @update:columns="handleTableColumnsChange">
<el-button type="primary" size="small" @click="exportCustomAsExcel">自定义导出</el-button>
</table-tool>
<el-table :data="tableData" :key="tableKey" ref="tableRef" @sort-change="pageOrder">
<el-table v-loading="tableLoading" :data="tableData" :key="tableKey" ref="tableRef" @sort-change="pageOrder">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column v-for="column in normalTableColumns" :key="column.prop" :label="column.label"
:prop="column.prop" :width="column.width" sortable="custom"
@@ -141,12 +141,16 @@ layout("/layouts/platform.html"){
})
},
pageData() {
// 自定义统计查询执行期间显示表格加载动画,异常时也能正常关闭。
this.$set(this, "tableLoading", true)
this.$axios.post(loc() + "/data", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.tableData
this.$set(this, "slaveNeedReply", res.data.slaveNeedReply)
this.syncSlaveReplyColumns(res.data.slaveNeedReply)
}
}).finally(() => {
this.$set(this, "tableLoading", false)
})
}
},
@@ -25,7 +25,7 @@ layout("/layouts/platform.html"){
<table-tool :columns="tableColumns" @update:columns="handleTableColumnsChange">
<el-button type="primary" size="small" @click="exportCustomAsExcel">自定义导出</el-button>
</table-tool>
<el-table :data="tableData" :key="tableKey" ref="tableRef" @sort-change="pageOrder">
<el-table v-loading="tableLoading" :data="tableData" :key="tableKey" ref="tableRef" @sort-change="pageOrder">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column v-for="column in tableColumns" v-if="column.visible !== false" :key="column.prop"
:label="column.label" :prop="column.prop" :width="column.width"
@@ -113,10 +113,14 @@ layout("/layouts/platform.html"){
})
},
pageData() {
// 自定义统计查询执行期间显示表格加载动画,异常时也能正常关闭。
this.$set(this, "tableLoading", true)
this.$axios.post(loc() + "/data", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data
}
}).finally(() => {
this.$set(this, "tableLoading", false)
})
}
},
@@ -67,7 +67,7 @@ layout("/layouts/platform.html"){
<table-tool>
<el-button type="primary" size="small" @click="exportYearReport">导出提案报告</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
<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"></el-table-column>
<el-table-column label="提案编号" prop="code" sortable="custom" width="100px" show-overflow-tooltip></el-table-column>
<el-table-column label="立案编号" prop="caseFilingCode" sortable="custom" width="100px" show-overflow-tooltip></el-table-column>
@@ -232,6 +232,8 @@ layout("/layouts/platform.html"){
this.$businessTool.listUnit(this.pageForm.unionId).then((res) => (this.unitOptions = res))
},
pageData() {
// 自定义查询覆盖了公共 mixin,请求期间手动维护表格加载状态。
this.$set(this, "tableLoading", true)
this.$axios
.post(loc() + "/pageData", {
pageForm: JSON.stringify(this.pageForm)
@@ -242,6 +244,9 @@ layout("/layouts/platform.html"){
this.pageForm.totalCount = res.data.totalCount
}
})
.finally(() => {
this.$set(this, "tableLoading", false)
})
}
},
created() {
@@ -52,7 +52,7 @@ layout("/layouts/platform.html"){
</el-card>
<el-card shadow="never">
<table-tool></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
<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"></el-table-column>
<el-table-column label="提案编号" prop="code" sortable="custom" width="100px" show-overflow-tooltip></el-table-column>
<el-table-column label="立案编号" prop="caseFilingCode" width="100px" show-overflow-tooltip></el-table-column>
@@ -46,7 +46,7 @@ layout("/layouts/platform.html"){
</el-card>
<el-card shadow="never">
<table-tool></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
<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"></el-table-column>
<el-table-column label="提案编号" prop="code" sortable="custom" width="100px" show-overflow-tooltip></el-table-column>
<el-table-column label="立案编号" prop="caseFilingCode" sortable="custom" width="100px" show-overflow-tooltip></el-table-column>
@@ -37,7 +37,7 @@ layout("/layouts/platform.html"){
批量催办
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%"
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%"
@selection-change="handleSelectionChange" row-key="id">
<el-table-column type="selection" reserve-selection width="55"></el-table-column>
<el-table-column label="序号" width="50" type="index" :index="indexMethod"></el-table-column>
@@ -76,7 +76,7 @@ layout("/layouts/platform.html"){
<template #edit>
<div class="process-title">所选提案列表</div>
<el-table :data="chooseTableData" style="width: 100%" max-height="600">
<el-table v-loading="tableLoading" :data="chooseTableData" style="width: 100%" max-height="600">
<el-table-column label="序号" width="50" type="index" :index="indexMethod"></el-table-column>
<el-table-column
:label="column.label"
@@ -52,7 +52,7 @@ layout("/layouts/platform.html"){
</el-card>
<el-card shadow="never">
<table-tool></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
<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"></el-table-column>
<el-table-column label="提案编号" prop="code" sortable="custom" width="100px" show-overflow-tooltip></el-table-column>
<el-table-column label="立案编号" prop="caseFilingCode" sortable="custom" width="100px" show-overflow-tooltip></el-table-column>
@@ -235,6 +235,8 @@ layout("/layouts/platform.html"){
},
pageData() {
// 自定义查询覆盖了公共 mixin,请求期间手动维护表格加载状态。
this.$set(this, "tableLoading", true)
this.$axios
.post(loc() + "/pageData", {
pageForm: JSON.stringify(this.pageForm)
@@ -245,6 +247,9 @@ layout("/layouts/platform.html"){
this.pageForm.totalCount = res.data.totalCount
}
})
.finally(() => {
this.$set(this, "tableLoading", false)
})
}
},
@@ -46,7 +46,7 @@ layout("/layouts/platform.html"){
</el-card>
<el-card shadow="never">
<table-tool></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
<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"></el-table-column>
<el-table-column label="提案编号" prop="code" sortable="custom" width="100px" show-overflow-tooltip></el-table-column>
<el-table-column label="立案编号" prop="caseFilingCode" sortable="custom" width="100px" show-overflow-tooltip></el-table-column>
@@ -25,7 +25,7 @@ layout("/layouts/platform.html"){
<el-card shadow="never">
<table-tool :columns.sync="tableColumns">
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod"
fixed="left"></el-table-column>
<el-table-column
@@ -41,7 +41,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
<el-table-column
:label="column.label"
@@ -35,7 +35,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" ref="tableRef" row-key="id" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" ref="tableRef" row-key="id" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod"
fixed="left"></el-table-column>
<el-table-column
@@ -139,6 +139,7 @@ layout("/layouts/platform.html"){
prop="tf_masterUnitIds"
>
<el-select v-model="formData.tf_masterUnitIds" filterable clearable multiple
@change="updateFilingOpinion"
style="width: 100%">
<el-option
v-for="item in underTakeOptions"
@@ -154,6 +155,7 @@ layout("/layouts/platform.html"){
prop="tf_slaveUnitIds"
>
<el-select v-model="formData.tf_slaveUnitIds" filterable clearable multiple
@change="updateFilingOpinion"
style="width: 100%">
<el-option
v-for="item in underTakeOptions"
@@ -259,12 +261,50 @@ layout("/layouts/platform.html"){
}
if (caseFilingResult === "SUGGESTION") {
this.$set(this.formData, "tf_slaveUnitIds", [])
this.updateFilingOpinion()
return
}
if (caseFilingResult !== "CONFIRM_FILING") {
this.$set(this.formData, "tf_masterUnitIds", [])
this.$set(this.formData, "tf_slaveUnitIds", [])
}
this.updateFilingOpinion()
},
/**
* 确定立案时根据主办、协办单位生成标准审核意见;
* 工作建议根据办理单位自动补充“此提案建议由XX办理”。
*/
updateFilingOpinion() {
const caseFilingResult = this.formData.tf_caseFilingResult
if (!["CONFIRM_FILING", "SUGGESTION"].includes(caseFilingResult)) {
return
}
const masterUnitIds = this.formData.tf_masterUnitIds || []
const slaveUnitIds = this.formData.tf_slaveUnitIds || []
const masterUnitNames = masterUnitIds.map((unitId) => {
const unit = this.underTakeOptions.find((item) => item.id === unitId)
return unit ? unit.name : ""
}).filter((unitName) => unitName)
const slaveUnitNames = slaveUnitIds.map((unitId) => {
const unit = this.underTakeOptions.find((item) => item.id === unitId)
return unit ? unit.name : ""
}).filter((unitName) => unitName)
if (caseFilingResult === "SUGGESTION") {
let suggestionOpinion = "经提案委员会审理,该提案作为意见建议。"
if (masterUnitNames.length) {
suggestionOpinion = "经提案委员会审理,该提案作为意见建议,此提案建议由"
+ masterUnitNames.join("、") + "办理。"
}
this.$set(this.formData, "tf_opinion", suggestionOpinion)
return
}
let opinion = "经提案工作委员会研究,符合提案立案条件,予以立案。"
if (masterUnitNames.length) {
opinion = "经提案工作委员会研究,符合提案立案条件,予以立案,此提案建议由"
+ masterUnitNames.join("、") + "办理,"
+ (slaveUnitNames.length ? "由" + slaveUnitNames.join("、") + "协办。" : "暂无协办。")
}
this.$set(this.formData, "tf_opinion", opinion)
},
openView(row) {
this.$refs.guava.edit(() => {
@@ -448,6 +488,7 @@ layout("/layouts/platform.html"){
this.$axios.post("/platform/proposal/common/listUnderTake").then((res) => {
if (res.code === 0) {
this.underTakeOptions = res.data
this.updateFilingOpinion()
}
})
}
@@ -4,7 +4,7 @@ const merge = {
<div class="process-title">
预选并案提案
</div>
<el-table :data="selection" ref="tableRef" row-key="id" style="width: 100%">
<el-table v-loading="tableLoading" :data="selection" ref="tableRef" row-key="id" style="width: 100%">
<el-table-column label="序号" width="50" type="index"></el-table-column>
<el-table-column label="提案编号" prop="code"></el-table-column>
<el-table-column label="提案名称" prop="name" show-overflow-tooltip></el-table-column>
@@ -47,7 +47,8 @@ const merge = {
:rules="[{required:['CONFIRM_FILING','SUGGESTION'].includes(formData.tf_caseFilingResult),message:formData.tf_caseFilingResult === 'SUGGESTION' ? '请选择办理单位' : '请选择主办单位',trigger:['change','blur']}]"
prop="tf_masterUnitIds"
>
<el-select v-model="formData.tf_masterUnitIds" filterable clearable multiple style="width: 100%">
<el-select v-model="formData.tf_masterUnitIds" filterable clearable multiple
@change="updateFilingOpinion" style="width: 100%">
<el-option
v-for="item in underTakeOptions"
:label="item.name"
@@ -62,6 +63,7 @@ const merge = {
prop="tf_slaveUnitIds"
>
<el-select v-model="formData.tf_slaveUnitIds" filterable clearable multiple
@change="updateFilingOpinion"
style="width: 100%">
<el-option
v-for="item in underTakeOptions"
@@ -89,6 +91,7 @@ const merge = {
dicts: ["PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE"],
data() {
return {
tableLoading: false,
selection: [],
formData: {
tf_masterUnitIds: [],
@@ -122,12 +125,49 @@ const merge = {
}
if (caseFilingResult === "SUGGESTION") {
this.$set(this.formData, "tf_slaveUnitIds", [])
this.updateFilingOpinion()
return
}
if (caseFilingResult !== "CONFIRM_FILING") {
this.$set(this.formData, "tf_masterUnitIds", [])
this.$set(this.formData, "tf_slaveUnitIds", [])
}
this.updateFilingOpinion()
},
/**
* 并案审核根据确定立案的主协办单位或工作建议的办理单位生成标准审核意见。
*/
updateFilingOpinion() {
const caseFilingResult = this.formData.tf_caseFilingResult
if (!["CONFIRM_FILING", "SUGGESTION"].includes(caseFilingResult)) {
return
}
const masterUnitIds = this.formData.tf_masterUnitIds || []
const slaveUnitIds = this.formData.tf_slaveUnitIds || []
const masterUnitNames = masterUnitIds.map((unitId) => {
const unit = this.underTakeOptions.find((item) => item.id === unitId)
return unit ? unit.name : ""
}).filter((unitName) => unitName)
const slaveUnitNames = slaveUnitIds.map((unitId) => {
const unit = this.underTakeOptions.find((item) => item.id === unitId)
return unit ? unit.name : ""
}).filter((unitName) => unitName)
if (caseFilingResult === "SUGGESTION") {
let suggestionOpinion = "经提案委员会审理,该提案作为意见建议。"
if (masterUnitNames.length) {
suggestionOpinion = "经提案委员会审理,该提案作为意见建议,此提案建议由"
+ masterUnitNames.join("、") + "办理。"
}
this.$set(this.formData, "tf_opinion", suggestionOpinion)
return
}
let opinion = "经提案工作委员会研究,符合提案立案条件,予以立案。"
if (masterUnitNames.length) {
opinion = "经提案工作委员会研究,符合提案立案条件,予以立案,此提案建议由"
+ masterUnitNames.join("、") + "办理,"
+ (slaveUnitNames.length ? "由" + slaveUnitNames.join("、") + "协办。" : "暂无协办。")
}
this.$set(this.formData, "tf_opinion", opinion)
},
onOpen(selection, formData) {
this.selection = selection
@@ -144,10 +184,15 @@ const merge = {
},
// 查询办理单位
listUnderTake() {
// 并案弹窗初始化期间同步遮罩预选提案表格,避免辅助数据未就绪时继续操作。
this.$set(this, "tableLoading", true)
this.$axios.post("/platform/proposal/common/listUnderTake").then((res) => {
if (res.code === 0) {
this.underTakeOptions = res.data
this.updateFilingOpinion()
}
}).finally(() => {
this.$set(this, "tableLoading", false)
})
},
handleTaskAction(val) {
@@ -67,7 +67,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" ref="tableRef" row-key="id" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" ref="tableRef" row-key="id" style="width: 100%">
<el-table-column type="selection" width="50" fixed="left" v-if="!pageForm.approval"></el-table-column>
<el-table-column label="序号" width="50" type="index" :index="indexMethod"
fixed="left"></el-table-column>
@@ -139,6 +139,7 @@ layout("/layouts/platform.html"){
prop="tf_masterUnitIds"
>
<el-select v-model="formData.tf_masterUnitIds" filterable clearable multiple
@change="updateFilingOpinion"
style="width: 100%">
<el-option
v-for="item in underTakeOptions"
@@ -154,6 +155,7 @@ layout("/layouts/platform.html"){
prop="tf_slaveUnitIds"
>
<el-select v-model="formData.tf_slaveUnitIds" filterable clearable multiple
@change="updateFilingOpinion"
style="width: 100%">
<el-option
v-for="item in underTakeOptions"
@@ -252,12 +254,50 @@ layout("/layouts/platform.html"){
}
if (caseFilingResult === "SUGGESTION") {
this.$set(this.formData, "tf_slaveUnitIds", [])
this.updateFilingOpinion()
return
}
if (caseFilingResult !== "CONFIRM_FILING") {
this.$set(this.formData, "tf_masterUnitIds", [])
this.$set(this.formData, "tf_slaveUnitIds", [])
}
this.updateFilingOpinion()
},
/**
* 确认承办单位时,根据确定立案的主协办单位或工作建议的办理单位生成审核意见。
* 单位数据尚未加载完成时保留默认意见,加载完成后再次补充实际单位名称。
*/
updateFilingOpinion() {
const caseFilingResult = this.formData.tf_caseFilingResult
if (!["CONFIRM_FILING", "SUGGESTION"].includes(caseFilingResult)) {
return
}
const masterUnitIds = this.formData.tf_masterUnitIds || []
const slaveUnitIds = this.formData.tf_slaveUnitIds || []
const masterUnitNames = masterUnitIds.map((unitId) => {
const unit = this.underTakeOptions.find((item) => item.id === unitId)
return unit ? unit.name : ""
}).filter((unitName) => unitName)
const slaveUnitNames = slaveUnitIds.map((unitId) => {
const unit = this.underTakeOptions.find((item) => item.id === unitId)
return unit ? unit.name : ""
}).filter((unitName) => unitName)
if (caseFilingResult === "SUGGESTION") {
let suggestionOpinion = "经提案委员会审理,该提案作为意见建议。"
if (masterUnitNames.length) {
suggestionOpinion = "经提案委员会审理,该提案作为意见建议,此提案建议由"
+ masterUnitNames.join("、") + "办理。"
}
this.$set(this.formData, "tf_opinion", suggestionOpinion)
return
}
let opinion = "经提案工作委员会研究,符合提案立案条件,予以立案。"
if (masterUnitNames.length) {
opinion = "经提案工作委员会研究,符合提案立案条件,予以立案,此提案建议由"
+ masterUnitNames.join("、") + "办理,"
+ (slaveUnitNames.length ? "由" + slaveUnitNames.join("、") + "协办。" : "暂无协办。")
}
this.$set(this.formData, "tf_opinion", opinion)
},
doUpData(){
this.$.axios.post(loc()+"/doUpData")
@@ -471,6 +511,7 @@ layout("/layouts/platform.html"){
this.$axios.post("/platform/proposal/common/listUnderTake").then((res) => {
if (res.code === 0) {
this.underTakeOptions = res.data
this.updateFilingOpinion()
}
})
}
@@ -28,7 +28,7 @@ layout("/layouts/platform.html"){
<el-card shadow="never">
<table-tool :columns.sync="tableColumns"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
<el-table-column
:label="column.label"
@@ -30,7 +30,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
<el-table-column
:label="column.label"
@@ -31,7 +31,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未反馈</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod"></el-table-column>
<el-table-column
:label="column.label"
@@ -21,6 +21,7 @@
</el-radio-group>
</table-tool>
<el-table
v-loading="tableLoading"
:data="tableData"
ref="tableRef"
@sort-change="pageOrder"
@@ -71,6 +72,8 @@
// 数据查询
pageData() {
// 邀请人员查询为组件自定义逻辑,请求结束后统一关闭表格加载状态。
this.$set(this, "tableLoading", true)
this.$axios
.post("/platform/proposal/invite/listSeconder", {
...this.pageForm,
@@ -83,6 +86,9 @@
this.pageForm.totalCount = res.data.totalCount
}
})
.finally(() => {
this.$set(this, "tableLoading", false)
})
},
//查询代表团
@@ -22,7 +22,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod"></el-table-column>
<el-table-column label="提案编号" prop="code" sortable="custom"></el-table-column>
<el-table-column label="提案名称" prop="name" sortable="custom" show-overflow-tooltip></el-table-column>
@@ -27,7 +27,7 @@ layout("/layouts/platform.html"){
@click="openImport">导入提案
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
<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>
<el-table-column
:label="column.label"
@@ -175,7 +175,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">可邀请</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" ref="tableRef" @sort-change="pageOrder" header-align="center"
<el-table v-loading="tableLoading" :data="tableData" ref="tableRef" @sort-change="pageOrder" header-align="center"
style="width: 100%" :row-key="getRowKey">
<el-table-column type="selection" reserve-selection
v-if="!pageForm.isInvite"></el-table-column>
@@ -196,7 +196,7 @@ layout("/layouts/platform.html"){
<el-divider class="mt10 mb10"></el-divider>
<div v-if="$refs.tableRef">
<table-tool label="当前已选择"></table-tool>
<el-table :data="$refs.tableRef.selection">
<el-table v-loading="tableLoading" :data="$refs.tableRef.selection">
<el-table-column label="序号" width="50px" type="index"></el-table-column>
<el-table-column label="工号" prop="loginName" sortable></el-table-column>
<el-table-column label="姓名" prop="userName" sortable></el-table-column>
@@ -76,6 +76,8 @@ const PROPOSAL_INVITE_SECONDER_COMPONENT = {
})
},
pageData() {
// 附议人弹窗使用组件自己的加载状态,避免主列表与弹窗同时转圈。
this.$set(this, "tableLoading", true)
this.$axios.post("/platform/proposal/mine/listSeconder", {
...this.pageForm,
sessionId: this.record.sessionId,
@@ -85,6 +87,8 @@ const PROPOSAL_INVITE_SECONDER_COMPONENT = {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
}).finally(() => {
this.$set(this, "tableLoading", false)
})
},
@@ -42,7 +42,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
<el-table-column
:label="column.label"
@@ -65,7 +65,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
<el-table-column
:label="column.label"
@@ -27,7 +27,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未附议</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod"
fixed="left"></el-table-column>
<el-table-column
@@ -102,7 +102,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未反馈</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
<el-table-column
:label="column.label"
@@ -37,7 +37,7 @@ layout("/layouts/platform.html"){
</el-card>
<el-card shadow="never">
<table-tool label="提案列表" :columns.sync="tableColumns"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
<el-table-column
:label="column.label"
@@ -47,6 +47,7 @@ layout("/layouts/platform.html"){
<!-- </el-radio-group>-->
</table-tool>
<el-table
v-loading="tableLoading"
:data="tableData"
@sort-change="pageOrder"
header-align="center"
@@ -102,7 +102,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未答复</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
<el-table-column
:label="column.label"
@@ -30,7 +30,7 @@ layout("/layouts/platform.html"){
<!-- <el-radio-button :label="false">未审核</el-radio-button>-->
<!-- </el-radio-group>-->
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column
:label="column.label"
:prop="column.prop"
@@ -103,6 +103,7 @@ layout("/layouts/platform_h5.html"){
<van-button
type="primary"
block
:class="answerRecord.isFinish ? 'vote-finished-button' : ''"
:disabled="answerRecord.isFinish || isEnd"
@click="onSubmit">
<i :class="answerRecord.isFinish ? 'fa fa-check-circle' : 'fa fa-paper-plane'"></i>
@@ -1980,6 +1981,13 @@ layout("/layouts/platform_h5.html"){
font-size: 14px;
}
/* 已完成投票状态使用浅蓝色,与投票结束状态保持区分。 */
.vote-bottom .van-button.vote-finished-button,
.vote-bottom .van-button.vote-finished-button.van-button--disabled {
color: #ffffff;
background: #86a8f7;
}
.vote-bottom .van-button .fa {
display: none;
}