南京理工提案优化整改: 提案查询和导出新增字段,导出前确认搜索条件;

This commit is contained in:
2026-10-09 09:41:24 +08:00
parent b2fc1979fe
commit d6961ebf19
10 changed files with 535 additions and 84 deletions
@@ -32,6 +32,8 @@ import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -140,11 +142,19 @@ public class proposalExportCaseController {
@Ok("void")
@RequiresAuthentication
public void exportAllProposal(String props, PageForm page, ProposalSearch search, String stateCode, String[] proposalTypes, String[] proposalResult,
String searchName2, String searchKeyword2, HttpServletResponse response) throws Exception {
String searchName2, String searchKeyword2,
@Param("undertakeId") String undertakeId,
String[] determineTypeOptions,
String exportCondition,
String exportFileCondition,
HttpServletResponse response) throws Exception {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create(SQL);
if (StrUtil.isNotBlank(undertakeId)) {
cnd.and(Cnd.exps("zbpr.replyUnitId", "=", undertakeId).or("xbpr.replyUnitId", "=", undertakeId));
}
cnd.andEX("info.stateCode", "=", stateCode);
cnd.and("info.stateCode", ">", ProposalState.CASE);
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange", "jdhdbt01"})) {
@@ -160,6 +170,11 @@ public class proposalExportCaseController {
}
if (proposalResult != null && proposalResult.length > 0) {
cnd.and("info.resultCode", "in", proposalResult);
if (ArrayUtil.contains(proposalResult, ProposalConstant.DETERMINE)) {
if (determineTypeOptions != null && determineTypeOptions.length > 0) {
cnd.and("info.determineTypeCode", "in", determineTypeOptions);
}
}
}
cnd.asc("info.resultCode");
proposalInfoService.sortAndSearch(cnd, page, search);
@@ -189,8 +204,17 @@ public class proposalExportCaseController {
}
try {
ViTool.excelResponse(response, "提案立案汇总表.xlsx");
ExportParams exportParams = new ExportParams();
String exportTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
String fileCondition = StrUtil.blankToDefault(exportFileCondition, "全部立案提案")
.replaceAll("[\\\\/:*?\"<>|\\r\\n]+", "-")
.replaceAll("\\s+", "");
if (fileCondition.length() > 80) {
fileCondition = fileCondition.substring(0, 80);
}
ViTool.excelResponse(response, "提案立案汇总表_" + fileCondition + "_"
+ exportTime.replaceAll("[-: ]", "") + ".xlsx");
ExportParams exportParams = new ExportParams("提案立案汇总表(查询条件:"
+ StrUtil.blankToDefault(exportCondition, "无") + ";导出时间:" + exportTime + ")", "立案汇总");
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, proposalList);
workbook.write(response.getOutputStream());
@@ -11,6 +11,7 @@ import io.v.nutz.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.proposal.constants.ProposalConstant;
import io.v.nutz.proposal.constants.ProposalState;
import io.v.nutz.proposal.models.ProposalSearch;
import io.v.nutz.proposal.services.ProposalInfoService;
import io.v.nutz.util.ShiroUtil;
@@ -31,8 +32,12 @@ import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author zhf
@@ -151,12 +156,15 @@ public class proposalExportSummaryController {
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalCode,
info.proposalName,
info.brief,
info.measures,
info.createTime,
su.username,
su.loginname,
creatorUnit.`name` creatorUnitName,
state.stateName,
state.stateColor,
type.typeCode,
@@ -170,16 +178,24 @@ public class proposalExportSummaryController {
masterPu.unitCode AS pruMasterCode,
masterPr.replyContent,
masterPr.handleOpinion,
GROUP_CONCAT(slavePu.unitName) AS pruSlave,
masterPr.replyTime,
masterPr.implementState,
masterPr.leaderCheckTime,
masterPr.leaderCheckOpinion,
CASE WHEN masterPr.isReply = 1 THEN '已答复' ELSE '未答复' END replyStatus,
GROUP_CONCAT(DISTINCT slavePu.unitName) AS pruSlave,
pf.feedbackCodeByUnderTake,
pfDict.`name` feedbackResult
pfDict.`name` feedbackResult,
pf.feedbackOpinion,
pf.feedbackTime
FROM
proposal_info info
LEFT JOIN proposal_reply masterPr on masterPr.proposalId = info.id AND masterPr.undertakeType = 1
LEFT JOIN proposal_underTake masterPu on masterPu.id = masterPr.replyUnitId
LEFT JOIN proposal_reply slavePr on slavePr.proposalId = info.id AND slavePr.undertakeType = 2
LEFT JOIN proposal_underTake slavePu on slavePu.id = slavePr.replyUnitId
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN sys_unit creatorUnit ON creatorUnit.id = su.unitid
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
@@ -207,20 +223,36 @@ public class proposalExportSummaryController {
List<String> proposalResult = mapCnd.getAsList("proposalResult", String.class);
cnd.andEX("info.resultCode", "in", proposalResult);
if (proposalResult != null && proposalResult.contains(ProposalConstant.DETERMINE)) {
List<String> determineTypeOptions = mapCnd.getAsList("proposalDetermineTypes", String.class);
cnd.andEX("info.determineTypeCode", "in", determineTypeOptions);
}
cnd.andEX("info.delegationId", "=", mapCnd.getString("delegationId"));
cnd.andEX("info.stateCode", "=", mapCnd.getString("stateCode"));
if (Boolean.TRUE.equals(mapCnd.getBoolean("caseOnly"))) {
cnd.and("info.stateCode", ">", ProposalState.CASE);
}
cnd.andEX("su.unionId", "=", mapCnd.getString("unionId"));
cnd.andEX("su.unitId", "=", mapCnd.getString("unitId"));
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange", "jdhdbt01"})) {
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
cnd.asc("info.proposalCode");
cnd.groupBy("info.id");
sql.setCondition(cnd);
List<NutMap> list = proposalInfoService.listMap(sql);
fillExportDetails(list);
list.forEach(v -> {
v.put("brief", HtmlUtil.cleanHtmlTag(HtmlUtil.unescape(v.getString("brief"))));
v.put("measures", HtmlUtil.cleanHtmlTag(HtmlUtil.unescape(v.getString("measures"))));
v.put("replyContent", HtmlUtil.cleanHtmlTag(HtmlUtil.unescape(v.getString("replyContent", ""))));
v.put("leaderCheckOpinion", HtmlUtil.cleanHtmlTag(HtmlUtil.unescape(v.getString("leaderCheckOpinion", ""))));
v.put("feedbackOpinion", HtmlUtil.cleanHtmlTag(HtmlUtil.unescape(v.getString("feedbackOpinion", ""))));
});
List<ExcelExportEntity> excelExportEntities = new ArrayList<ExcelExportEntity>();
@@ -230,8 +262,22 @@ public class proposalExportSummaryController {
});
try {
ViTool.excelResponse(response, "提案表.xlsx");
ExportParams exportParams = new ExportParams();
String exportTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
String exportCondition = mapCnd.getString("exportCondition", "无").replaceAll("[\\r\\n]+", " ");
String exportFileCondition = mapCnd.getString("exportFileCondition", "")
.replaceAll("[\\\\/:*?\"<>|\\r\\n]+", "-")
.replaceAll("\\s+", "");
String exportTitle = mapCnd.getString("exportTitle", "提案汇总表")
.replaceAll("[\\\\/:*?\"<>|\\r\\n]+", "-");
if (exportFileCondition.length() > 80) {
exportFileCondition = exportFileCondition.substring(0, 80);
}
String fileName = exportTitle
+ (StrUtil.isBlank(exportFileCondition) ? "" : "_" + exportFileCondition)
+ "_" + exportTime.replaceAll("[-: ]", "") + ".xlsx";
ViTool.excelResponse(response, fileName);
ExportParams exportParams = new ExportParams(exportTitle + "(查询条件:" + exportCondition
+ ";导出时间:" + exportTime + ")", "提案汇总");
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, excelExportEntities, list);
workbook.write(response.getOutputStream());
@@ -242,4 +288,70 @@ public class proposalExportSummaryController {
}
/**
* 补充附议人和审核记录,避免数据库聚合长度限制导致导出内容不完整
*
* @param list 提案数据
*/
private void fillExportDetails(List<NutMap> list) {
if (list == null || list.isEmpty()) {
return;
}
List<String> proposalIds = new ArrayList<>();
list.forEach(v -> proposalIds.add(v.getString("id")));
Sql secondedSql = Sqls.create("""
SELECT
ps.proposalId,
su.username,
su.loginname
FROM proposal_seconded ps
LEFT JOIN sys_user su ON su.id = ps.seconderId
WHERE ps.proposalId IN (@proposalIds)
AND ps.isAgree = 1
ORDER BY ps.secondedTime
""").setParam("proposalIds", proposalIds);
Map<String, List<String>> secondedMap = new HashMap<>();
proposalInfoService.listMap(secondedSql).forEach(v -> {
String username = v.getString("username", "");
String loginname = v.getString("loginname", "");
String seconderName = username + (StrUtil.isBlank(loginname) ? "" : "(" + loginname + ")");
secondedMap.computeIfAbsent(v.getString("proposalId"), key -> new ArrayList<>()).add(seconderName);
});
Sql auditSql = Sqls.create("""
SELECT
pa.proposalId,
pa.username,
pa.flag,
pa.opinion,
pa.auditTime,
dict.`name` auditTypeName
FROM proposal_audit pa
LEFT JOIN sys_dict dict ON dict.`code` = pa.other
WHERE pa.proposalId IN (@proposalIds)
ORDER BY pa.auditTime
""").setParam("proposalIds", proposalIds);
Map<String, List<String>> auditMap = new HashMap<>();
proposalInfoService.listMap(auditSql).forEach(v -> {
Boolean flag = v.getBoolean("flag");
String auditResult = flag == null ? "" : (flag ? "通过" : "不通过");
String auditTypeName = v.getString("auditTypeName", "");
String auditTitle = StrUtil.isBlank(auditTypeName) ? auditResult
: auditTypeName + (StrUtil.isBlank(auditResult) ? "" : "/" + auditResult);
String opinion = HtmlUtil.cleanHtmlTag(HtmlUtil.unescape(v.getString("opinion", "")));
String auditRecord = v.getString("username", "")
+ (StrUtil.isBlank(auditTitle) ? "" : "【" + auditTitle + "】")
+ (StrUtil.isBlank(opinion) ? "" : ":" + opinion)
+ (StrUtil.isBlank(v.getString("auditTime")) ? "" : "(" + v.getString("auditTime") + ")");
auditMap.computeIfAbsent(v.getString("proposalId"), key -> new ArrayList<>()).add(auditRecord);
});
list.forEach(v -> {
v.put("seconderNames", String.join("、", secondedMap.getOrDefault(v.getString("id"), new ArrayList<>())));
v.put("auditRecords", String.join(";", auditMap.getOrDefault(v.getString("id"), new ArrayList<>())));
});
}
}
@@ -133,7 +133,8 @@ public class proposalExportWholeController {
@Ok("void")
@RequiresAuthentication
public void exportAllProposal(ProposalSearch search, String stateCode, String[] proposalTypes, String[] proposalResult,
String searchName2, String searchKeyword2, HttpServletResponse response) throws Exception {
String searchName2, String searchKeyword2, String exportFileCondition,
HttpServletResponse response) throws Exception {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
@@ -171,7 +172,14 @@ public class proposalExportWholeController {
response.reset();
response.setContentType("application/x-msdownload;charset=utf-8");
String fileName = "提案汇总文件夹";
String exportTime = DateFormatUtils.format(new Date(), "yyyyMMddHHmmss", Locale.CHINA);
String fileCondition = StrUtil.blankToDefault(exportFileCondition, "全部提案")
.replaceAll("[\\\\/:*?\"<>|\\r\\n]+", "-")
.replaceAll("\\s+", "");
if (fileCondition.length() > 80) {
fileCondition = fileCondition.substring(0, 80);
}
String fileName = "提案汇总文件夹_" + fileCondition + "_" + exportTime;
// 创建临时文件夹
@@ -190,6 +190,133 @@ window.proposal = {
async getProposalNextNode(stateCode) {
const {data} = await $.get("/platform/proposal/common/getProposalNextNode", {stateCode})
return data
},
/**
* 生成提案导出的查询条件说明
*/
buildExportCondition(app) {
const page = app.pageForm
const optionLabel = (options, value, valueKey, labelKey) => {
const option = (options || []).find(item => item[valueKey] === value)
return option ? option[labelKey] : value
}
const conditions = []
const fileConditions = []
if (page.meetingId) {
const meetingName = optionLabel(app.meetingOptions, page.meetingId, 'id', 'jdhallname')
conditions.push('届次:' + meetingName)
fileConditions.push(meetingName)
} else {
conditions.push('届次:全部届次')
fileConditions.push('全部届次')
}
if (page.stateCode) {
const stateName = optionLabel(app.stateOptions, page.stateCode, 'stateCode', 'stateName')
conditions.push('提案状态:' + stateName)
fileConditions.push(stateName)
}
if (page.proposalTypes.length) {
const typeNames = page.proposalTypes.map(value =>
optionLabel(app.typeOptions, value, 'id', 'typeName')).join('、')
conditions.push('提案类型:' + typeNames)
fileConditions.push(typeNames)
}
if (page.proposalResult.length) {
const resultNames = page.proposalResult.map(value =>
optionLabel(app.resultOptions, value, 'code', 'name')).join('、')
conditions.push('立案结果:' + resultNames)
fileConditions.push(resultNames)
}
if (page.proposalResult.includes('determine') && page.proposalDetermineTypes.length) {
conditions.push('是否重点:' + page.proposalDetermineTypes.map(value =>
optionLabel(app.determineTypeOptions, value, 'code', 'name')).join('、'))
}
if (page.delegationId) {
conditions.push('代表团:' + optionLabel(app.delegationOptions, page.delegationId, 'id', 'dbtname'))
}
if (page.unionId) {
conditions.push('所属工会:' + optionLabel(app.unionOptions, page.unionId, 'id', 'unionname'))
}
if (page.unitId) {
conditions.push('所属单位:' + optionLabel(app.unitOptions, page.unitId, 'id', 'name'))
}
if (page.undertakeId) {
const undertakeName = optionLabel(app.undertakeOptions, page.undertakeId, 'id', 'unitName')
conditions.push('承办单位:' + undertakeName)
fileConditions.push(undertakeName)
}
if (page.searchKeyword) {
conditions.push((page.searchName === 'proposalCode' ? '提案编号:' : '提案名称:') + page.searchKeyword)
fileConditions.push(page.searchKeyword)
}
if (page.searchKeyword2) {
conditions.push('提案人:' + page.searchKeyword2)
fileConditions.push(page.searchKeyword2)
}
return {
exportCondition: conditions.join(';'),
exportFileCondition: fileConditions.join('_')
}
},
/**
* 按当前页面查询条件导出完整提案数据
*/
exportCompleteData(app, exportOptions = {}) {
const page = app.pageForm
const {exportCondition, exportFileCondition} = this.buildExportCondition(app)
const totalCount = page.totalCount || 0
app.$confirm('将导出当前筛选条件下的全部 ' + totalCount + ' 条提案,不受当前分页影响。查询条件:'
+ exportCondition, '导出确认', {
confirmButtonText: '确认导出',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const exportForm = clone(page)
exportForm.exportCondition = exportCondition
exportForm.exportFileCondition = exportFileCondition
exportForm.exportTitle = exportOptions.title || '提案完整数据'
exportForm.caseOnly = exportOptions.caseOnly === true
const form = $('<form method="post" target="_blank"></form>')
form.attr('action', '/platform/proposal/export/summary/exportByCnd')
form.append($('<input type="hidden" name="cnd">').val(JSON.stringify(exportForm)))
form.append($('<input type="hidden" name="tableColumns">').val(JSON.stringify([
{prop: 'proposalCode', label: '提案编号'},
{prop: 'username', label: '提案人'},
{prop: 'loginname', label: '提案人工号'},
{prop: 'seconderNames', label: '附议人'},
{prop: 'creatorUnitName', label: '所属单位'},
{prop: 'proposalName', label: '提案标题'},
{prop: 'brief', label: '案由'},
{prop: 'measures', label: '建议措施'},
{prop: 'createTime', label: '提案时间'},
{prop: 'meetingName', label: '届次'},
{prop: 'delegationName', label: '代表团'},
{prop: 'typeName', label: '提案类型'},
{prop: 'mannerName', label: '提案方式'},
{prop: 'resultName', label: '立案结果'},
{prop: 'stateName', label: '办理进度'},
{prop: 'pruMaster', label: '主办单位'},
{prop: 'pruSlave', label: '协办单位'},
{prop: 'replyStatus', label: '答复状态'},
{prop: 'replyTime', label: '答复时间'},
{prop: 'replyContent', label: '答复内容'},
{prop: 'handleOpinion', label: '处理意见'},
{prop: 'implementState', label: '落实情况'},
{prop: 'leaderCheckTime', label: '分管领导审批时间'},
{prop: 'leaderCheckOpinion', label: '分管领导审批意见'},
{prop: 'feedbackCodeByUnderTake', label: '对承办单位办理态度评价'},
{prop: 'feedbackResult', label: '对办理结果评价'},
{prop: 'feedbackOpinion', label: '反馈意见'},
{prop: 'feedbackTime', label: '反馈时间'},
{prop: 'auditRecords', label: '审核记录及时间'}
])))
$('body').append(form)
form.submit()
form.remove()
}).catch(() => {})
}
}
@@ -32,7 +32,8 @@ layout("/layouts/platform.html"){
<table-tool label="提案信息" :app="this">
<template #func>
<el-button @click="exportAllProposal" type="primary" size="small">导出立案汇总表</el-button>
<el-button @click="exportCompleteData" type="primary" size="small">按条件导出完整数据</el-button>
<el-button @click="exportAllProposal" type="success" size="small">导出原立案汇总表</el-button>
</template>
</table-tool>
@@ -121,6 +122,7 @@ layout("/layouts/platform.html"){
mixins: [initTableMixins],
data() {
return {
showStateSearch: true,
resultOptions: [],
determineTypeOptions: [],
typeOptions: [],
@@ -138,6 +140,7 @@ layout("/layouts/platform.html"){
meetingId: '',
unionId: '',
unitId: '',
undertakeId: '',
delegationId: '',
proposalResult: [],
proposalTypes: [],
@@ -166,42 +169,50 @@ layout("/layouts/platform.html"){
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
exportCompleteData() {
proposal.exportCompleteData(this, {title: '立案提案完整数据', caseOnly: true})
},
exportAllProposal() {
const proposalTypes = JSON.stringify(this.pageForm.proposalTypes)
const proposalResult = JSON.stringify(this.pageForm.proposalResult)
const searchName2 = this.pageForm.searchName2
const searchKeyword2 = this.pageForm.searchKeyword2
const stateCode = this.pageForm.stateCode
const searchKeyword = this.pageForm.searchKeyword
const searchName = this.pageForm.searchName
const delegationId = this.pageForm.delegationId
const unionId = this.pageForm.unionId
const unitId = this.pageForm.unitId
const meetingId = this.pageForm.meetingId
const {exportCondition, exportFileCondition} = proposal.buildExportCondition(this)
let props = {}
this.tableColumns.forEach(v => {
props[v.prop] = v.label
})
window.open(loc() + "/exportAllProposal?proposalTypes=" + proposalTypes +
"&proposalResult=" + proposalResult +
"&searchName2=" + searchName2 +
"&searchKeyword2=" + searchKeyword2 +
"&stateCode=" + stateCode +
"&searchKeyword=" + searchKeyword +
"&searchName=" + searchName +
"&delegationId=" + delegationId +
"&unionId=" + unionId +
"&unitId=" + unitId +
"&meetingId=" + meetingId +
"&props=" + JSON.stringify(props))
this.$confirm('将按当前条件导出全部 ' + (this.pageForm.totalCount || 0)
+ ' 条立案汇总数据,不受当前分页影响。查询条件:' + exportCondition, '导出确认', {
confirmButtonText: '确认导出',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const exportForm = $('<form method="post" target="_blank"></form>')
exportForm.attr('action', loc() + '/exportAllProposal')
const params = Object.assign({}, this.pageForm, {
proposalTypes: JSON.stringify(this.pageForm.proposalTypes),
proposalResult: JSON.stringify(this.pageForm.proposalResult),
determineTypeOptions: JSON.stringify(this.pageForm.proposalDetermineTypes),
props: JSON.stringify(props),
exportCondition,
exportFileCondition
})
Object.keys(params).forEach(key => {
if (!Array.isArray(params[key])) {
exportForm.append($('<input type="hidden">').attr('name', key).val(params[key] || ''))
}
})
$('body').append(exportForm)
exportForm.submit()
exportForm.remove()
}).catch(() => {})
},
oneProposalExport(id) {
window.location.href = "/platform/proposal/statistics/summary/oneProposalExport?proposalId=" + id
},
async meetingChange(val) {
this.pageForm.delegationId = ''
this.delegationOptions = await proposal.getDelegation(val)
this.undertakeOptions = await proposal.getUndertakeByMeeting(val)
this.pageForm.undertakeId = ''
this.delegationOptions = val ? await proposal.getDelegation(val) : []
this.undertakeOptions = val ? await proposal.getUndertakeByMeeting(val)
: await proposal.getAllProposalUndertake()
this.doSearch()
},
async delegationChange(val) {
@@ -271,8 +282,9 @@ layout("/layouts/platform.html"){
async created() {
this.meetingOptions = await getAllJdh()
this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
this.meetingOptions.unshift({id: '', jdhallname: '全部届次'})
this.stateOptions = await proposal.getOpenProposalState()
this.stateOptions = await proposal.getProposalState()
this.typeOptions = await proposal.getProposalType()
this.resultOptions = await getDictOptions("proposal_result")
this.determineTypeOptions = await getDictOptions("proposal_determine_type")
@@ -287,4 +299,4 @@ layout("/layouts/platform.html"){
</script>
<!--#
}
#-->
#-->
@@ -31,7 +31,6 @@ layout("/layouts/platform.html"){
<el-card shadow="never" style="margin-top: 10px">
<table-tool :app="this" label="提案信息">
<template #func>
</template>
</table-tool>
<el-table :data="tableData" :row-key="(row)=>{row.id}" :size="tableSize" @sort-change="pageOrder"
@@ -91,7 +90,9 @@ layout("/layouts/platform.html"){
mixins: [initTableMixins],
data() {
return {
showStateSearch: true,
resultOptions: [],
determineTypeOptions: [],
typeOptions: [],
meetingOptions: [],
stateOptions: [],
@@ -106,6 +107,9 @@ layout("/layouts/platform.html"){
stateCode: '',
meetingId: '',
delegationId: '',
unionId: '',
unitId: '',
undertakeId: '',
proposalResult: [],
proposalTypes: [],
proposalDetermineTypes: []
@@ -138,8 +142,10 @@ layout("/layouts/platform.html"){
},
async meetingChange(val) {
this.pageForm.delegationId = null
this.delegationOptions = await proposal.getDelegation(val)
this.undertakeOptions = await proposal.getUndertakeByMeeting(val)
this.pageForm.undertakeId = ''
this.delegationOptions = val ? await proposal.getDelegation(val) : []
this.undertakeOptions = val ? await proposal.getUndertakeByMeeting(val)
: await proposal.getAllProposalUndertake()
this.doSearch()
},
async delegationChange(val) {
@@ -207,8 +213,9 @@ layout("/layouts/platform.html"){
async created() {
this.meetingOptions = await getAllJdh()
this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
this.meetingOptions.unshift({id: '', jdhallname: '全部届次'})
this.stateOptions = await proposal.getOpenProposalState()
this.stateOptions = await proposal.getProposalState()
this.typeOptions = await proposal.getProposalType()
this.resultOptions = await getDictOptions("proposal_result")
this.determineTypeOptions = await getDictOptions("proposal_determine_type")
@@ -223,4 +230,4 @@ layout("/layouts/platform.html"){
</script>
<!--#
}
#-->
#-->
@@ -121,7 +121,9 @@ layout("/layouts/platform.html"){
mixins: [initTableMixins],
data() {
return {
showStateSearch: true,
resultOptions: [],
determineTypeOptions: [],
typeOptions: [],
meetingOptions: [],
stateOptions: [],
@@ -136,6 +138,9 @@ layout("/layouts/platform.html"){
stateCode: '',
meetingId: '',
delegationId: '',
unionId: '',
unitId: '',
undertakeId: '',
proposalResult: [],
proposalTypes: [],
proposalDetermineTypes: []
@@ -161,6 +166,37 @@ layout("/layouts/platform.html"){
{prop: 'feedbackCodeByUnderTake', label: '对承办单位办理态度评价'},
{prop: 'feedbackResult', label: '对办理结果评价'},
],
exportColumns: [
{prop: 'proposalCode', label: '提案编号'},
{prop: 'username', label: '提案人'},
{prop: 'loginname', label: '提案人工号'},
{prop: 'seconderNames', label: '附议人'},
{prop: 'creatorUnitName', label: '所属单位'},
{prop: 'proposalName', label: '提案标题'},
{prop: 'brief', label: '案由'},
{prop: 'measures', label: '建议措施'},
{prop: 'createTime', label: '提案时间'},
{prop: 'meetingName', label: '届次'},
{prop: 'delegationName', label: '代表团'},
{prop: 'typeName', label: '提案类型'},
{prop: 'mannerName', label: '提案方式'},
{prop: 'resultName', label: '立案结果'},
{prop: 'stateName', label: '办理进度'},
{prop: 'pruMaster', label: '主办单位'},
{prop: 'pruSlave', label: '协办单位'},
{prop: 'replyStatus', label: '答复状态'},
{prop: 'replyTime', label: '答复时间'},
{prop: 'replyContent', label: '答复内容'},
{prop: 'handleOpinion', label: '处理意见'},
{prop: 'implementState', label: '落实情况'},
{prop: 'leaderCheckTime', label: '分管领导审批时间'},
{prop: 'leaderCheckOpinion', label: '分管领导审批意见'},
{prop: 'feedbackCodeByUnderTake', label: '对承办单位办理态度评价'},
{prop: 'feedbackResult', label: '对办理结果评价'},
{prop: 'feedbackOpinion', label: '反馈意见'},
{prop: 'feedbackTime', label: '反馈时间'},
{prop: 'auditRecords', label: '审核记录及时间'},
],
}
},
components: {
@@ -169,8 +205,102 @@ layout("/layouts/platform.html"){
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
getOptionLabel(options, value, valueKey, labelKey) {
const option = options.find(item => item[valueKey] === value)
return option ? option[labelKey] : value
},
getExportCondition() {
const conditions = []
const {meetingId, stateCode, proposalTypes, proposalResult, proposalDetermineTypes,
delegationId, unionId, unitId, undertakeId, searchKeyword, searchKeyword2} = this.pageForm
if (meetingId) {
conditions.push('届次:' + this.getOptionLabel(this.meetingOptions, meetingId, 'id', 'jdhallname'))
}
if (stateCode) {
conditions.push('提案状态:' + this.getOptionLabel(this.stateOptions, stateCode, 'stateCode', 'stateName'))
}
if (proposalTypes.length) {
conditions.push('提案类型:' + proposalTypes.map(value =>
this.getOptionLabel(this.typeOptions, value, 'id', 'typeName')).join('、'))
}
if (proposalResult.length) {
conditions.push('立案结果:' + proposalResult.map(value =>
this.getOptionLabel(this.resultOptions, value, 'code', 'name')).join('、'))
}
if (proposalResult.includes('determine') && proposalDetermineTypes.length) {
conditions.push('是否重点:' + proposalDetermineTypes.map(value =>
this.getOptionLabel(this.determineTypeOptions, value, 'code', 'name')).join('、'))
}
if (delegationId) {
conditions.push('代表团:' + this.getOptionLabel(this.delegationOptions, delegationId, 'id', 'dbtname'))
}
if (unionId) {
conditions.push('所属工会:' + this.getOptionLabel(this.unionOptions, unionId, 'id', 'unionname'))
}
if (unitId) {
conditions.push('所属单位:' + this.getOptionLabel(this.unitOptions, unitId, 'id', 'name'))
}
if (undertakeId) {
conditions.push('承办单位:' + this.getOptionLabel(this.undertakeOptions, undertakeId, 'id', 'unitName'))
}
if (searchKeyword) {
conditions.push((this.pageForm.searchName === 'proposalCode' ? '提案编号:' : '提案名称:') + searchKeyword)
}
if (searchKeyword2) {
conditions.push('提案人:' + searchKeyword2)
}
return conditions.length ? conditions.join(';') : '无'
},
getExportFileCondition() {
const conditions = []
const {meetingId, stateCode, proposalTypes, proposalResult, undertakeId,
searchKeyword, searchKeyword2} = this.pageForm
if (meetingId) {
conditions.push(this.getOptionLabel(this.meetingOptions, meetingId, 'id', 'jdhallname'))
}
if (stateCode) {
conditions.push(this.getOptionLabel(this.stateOptions, stateCode, 'stateCode', 'stateName'))
}
if (proposalTypes.length) {
conditions.push(proposalTypes.map(value =>
this.getOptionLabel(this.typeOptions, value, 'id', 'typeName')).join('、'))
}
if (proposalResult.length) {
conditions.push(proposalResult.map(value =>
this.getOptionLabel(this.resultOptions, value, 'code', 'name')).join('、'))
}
if (undertakeId) {
conditions.push(this.getOptionLabel(this.undertakeOptions, undertakeId, 'id', 'unitName'))
}
if (searchKeyword) {
conditions.push(searchKeyword)
}
if (searchKeyword2) {
conditions.push(searchKeyword2)
}
return conditions.join('_')
},
exportByCnd() {
window.open(loc() + '/exportByCnd?cnd=' + JSON.stringify(this.pageForm) + '&tableColumns=' + JSON.stringify(this.tableColumns))
const exportCondition = this.getExportCondition()
const totalCount = this.pageForm.totalCount || 0
this.$confirm('将导出当前筛选条件下的全部 ' + totalCount + ' 条提案,不受当前分页影响。查询条件:' + exportCondition,
'导出确认', {
confirmButtonText: '确认导出',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const exportForm = clone(this.pageForm)
exportForm.exportCondition = exportCondition
exportForm.exportFileCondition = this.getExportFileCondition()
const form = $('<form method="post" target="_blank"></form>')
form.attr('action', loc() + '/exportByCnd')
form.append($('<input type="hidden" name="cnd">').val(JSON.stringify(exportForm)))
form.append($('<input type="hidden" name="tableColumns">').val(JSON.stringify(this.exportColumns)))
$('body').append(form)
form.submit()
form.remove()
}).catch(() => {})
},
oneProposalExport(id) {
window.location.href = "/platform/proposal/statistics/summary/oneProposalExport?proposalId=" + id
@@ -247,7 +377,7 @@ layout("/layouts/platform.html"){
this.meetingOptions = await getAllJdh()
this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
this.stateOptions = await proposal.getOpenProposalState()
this.stateOptions = await proposal.getProposalState()
this.typeOptions = await proposal.getProposalType()
this.resultOptions = await getDictOptions("proposal_result")
this.determineTypeOptions = await getDictOptions("proposal_determine_type")
@@ -262,4 +392,4 @@ layout("/layouts/platform.html"){
</script>
<!--#
}
#-->
#-->
@@ -93,7 +93,9 @@ layout("/layouts/platform.html"){
mixins: [initTableMixins],
data() {
return {
showStateSearch: true,
resultOptions: [],
determineTypeOptions: [],
typeOptions: [],
meetingOptions: [],
stateOptions: [],
@@ -110,6 +112,7 @@ layout("/layouts/platform.html"){
stateCode: '',
meetingId: '',
delegationId: '',
undertakeId: '',
proposalResult: [],
proposalTypes: [],
proposalDetermineTypes: []
@@ -138,36 +141,39 @@ layout("/layouts/platform.html"){
},
methods: {
exportAllProposal() {
const proposalTypes = JSON.stringify(this.pageForm.proposalTypes)
const proposalResult = JSON.stringify(this.pageForm.proposalResult)
const searchName2 = this.pageForm.searchName2
const searchKeyword2 = this.pageForm.searchKeyword2
const stateCode = this.pageForm.stateCode
const searchKeyword = this.pageForm.searchKeyword
const searchName = this.pageForm.searchName
const delegationId = this.pageForm.delegationId
const unionId = this.pageForm.unionId
const unitId = this.pageForm.unitId
const meetingId = this.pageForm.meetingId
window.location.href = loc() + "/exportAllProposal?proposalTypes=" + proposalTypes +
"&proposalResult=" + proposalResult +
"&searchName2=" + searchName2 +
"&searchKeyword2=" + searchKeyword2 +
"&stateCode=" + stateCode +
"&searchKeyword=" + searchKeyword +
"&searchName=" + searchName +
"&delegationId=" + delegationId +
"&unionId=" + unionId +
"&unitId=" + unitId +
"&meetingId=" + meetingId
const {exportCondition, exportFileCondition} = proposal.buildExportCondition(this)
this.$confirm('将按当前筛选条件导出全部 ' + (this.pageForm.totalCount || 0)
+ ' 件提案,不受当前分页影响。查询条件:' + exportCondition, '导出确认', {
confirmButtonText: '确认导出',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const exportForm = $('<form method="post" target="_blank"></form>')
exportForm.attr('action', loc() + '/exportAllProposal')
const params = Object.assign({}, this.pageForm, {
proposalTypes: JSON.stringify(this.pageForm.proposalTypes),
proposalResult: JSON.stringify(this.pageForm.proposalResult),
exportFileCondition
})
Object.keys(params).forEach(key => {
if (!Array.isArray(params[key])) {
exportForm.append($('<input type="hidden">').attr('name', key).val(params[key] || ''))
}
})
$('body').append(exportForm)
exportForm.submit()
exportForm.remove()
}).catch(() => {})
},
oneProposalExport(id) {
window.location.href = "/platform/proposal/statistics/summary/oneProposalExport?proposalId=" + id
},
async meetingChange(val) {
this.pageForm.delegationId = null
this.delegationOptions = await getDelegation(val)
this.undertakeOptions = await proposal.getUndertakeByMeeting(val)
this.pageForm.undertakeId = ''
this.delegationOptions = val ? await proposal.getDelegation(val) : []
this.undertakeOptions = val ? await proposal.getUndertakeByMeeting(val)
: await proposal.getAllProposalUndertake()
this.doSearch()
},
async delegationChange(val) {
@@ -235,13 +241,14 @@ layout("/layouts/platform.html"){
async created() {
this.meetingOptions = await getAllJdh()
this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
this.meetingOptions.unshift({id: '', jdhallname: '全部届次'})
this.stateOptions = await getOpenProposalState()
this.stateOptions = await proposal.getProposalState()
this.typeOptions = await getProposalType()
this.resultOptions = await getDictOptions("proposal_result")
this.determineTypeOptions = await getDictOptions("proposal_determine_type")
this.delegationOptions = await getDelegation(this.pageForm.meetingId)
this.delegationOptions = await proposal.getDelegation(this.pageForm.meetingId)
this.undertakeOptions = await proposal.getUndertakeByMeeting(this.pageForm.meetingId)
this.unionOptions = await getUnions(null)
this.unitOptions = await getUnits(null)
@@ -251,4 +258,4 @@ layout("/layouts/platform.html"){
</script>
<!--#
}
#-->
#-->
@@ -146,15 +146,28 @@
<el-row class="query-row" type="flex">
<el-col class="query-row-title">承办单位:</el-col>
<el-col class="query-row-content">
<el-select @change="pageData()" clearable filterable
placeholder="请选择承办单位" v-model="pageForm.undertakeId">
<el-option
:label="item.unitName"
:value="item.id"
v-for="item in undertakeOptions">
</el-option>
</el-select>
<el-row>
<el-col :span="8">
<el-select @change="pageData()" clearable filterable
placeholder="请选择承办单位" style="width: 350px" v-model="pageForm.undertakeId">
<el-option
:label="item.unitName"
:value="item.id"
v-for="item in undertakeOptions">
</el-option>
</el-select>
</el-col>
<el-col :span="8" v-if="$data.showStateSearch">
<span>提案状态:</span>
<el-select @change="doSearch" clearable filterable placeholder="请选择提案状态"
style="width: 350px" v-model="pageForm.stateCode">
<el-option :key="item.stateCode" :label="item.stateName" :value="item.stateCode"
v-for="item in stateOptions">
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
</el-card>
</el-card>
@@ -190,6 +190,17 @@ layout("/layouts/platform.html"){
</el-option>
</el-select>
</el-col>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title">提案状态:</el-col>
<el-col class="query-row-content">
<el-select @change="doSearch" clearable filterable placeholder="请选择提案状态"
style="width: 350px" v-model="pageForm.stateCode">
<el-option :key="item.stateCode" :label="item.stateName" :value="item.stateCode"
v-for="item in stateOptions">
</el-option>
</el-select>
</el-col>
</el-row>
<!-- <el-col :span="8">-->
<!-- <span>所属工会:</span>-->
<!-- <el-select @change="unionChange" clearable filterable-->
@@ -433,7 +444,7 @@ layout("/layouts/platform.html"){
this.meetingOptions = await getAllJdh()
// this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
this.stateOptions = await proposal.getOpenProposalState()
this.stateOptions = await proposal.getProposalState()
this.typeOptions = await proposal.getProposalType()
this.resultOptions = await getDictOptions("proposal_result")
@@ -453,4 +464,4 @@ layout("/layouts/platform.html"){
</script>
<!--#
}
#-->
#-->