This commit is contained in:
那些花儿
2025-10-17 08:54:14 +08:00
parent fbcee4d894
commit 901db5224f
11 changed files with 272 additions and 93 deletions
@@ -14,6 +14,7 @@ import io.swagger.annotations.Api;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls; import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql; import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap; import org.nutz.lang.util.NutMap;
@@ -81,9 +82,11 @@ public class FundMemberBranchUnionApprovalController {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
} }
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
if (StrUtil.isNotBlank(searchKeyword)) { SqlExpressionGroup seg = new SqlExpressionGroup();
cnd.where().andLike("info.title", searchKeyword); seg.orLike("info.loginName", pageForm.getSearchKeyword());
seg.orLike("info.userName", pageForm.getSearchKeyword());
cnd.and(seg);
} }
cnd.groupBy("t.id"); cnd.groupBy("t.id");
@@ -74,6 +74,7 @@ public class FundMemberMineController {
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(info.submitTime)", "=", year);
cnd.and("info.createdBy", "=", SecurityUtil.getUserId()); cnd.and("info.createdBy", "=", SecurityUtil.getUserId());
sql.setCondition(cnd); sql.setCondition(cnd);
Pagination<NutMap> pagination = fundMemberService.listPageMap(pageNumber, pageSize, sql); Pagination<NutMap> pagination = fundMemberService.listPageMap(pageNumber, pageSize, sql);
@@ -74,7 +74,7 @@ public class FundMemberQueryController {
u.userState, u.userState,
u.unitName, u.unitName,
u.unionName, u.unionName,
(SELECT changeTime FROM fund_member_change_record WHERE loginName = u.loginName AND isJoin = 1 ORDER BY changeTime DESC) joinTime (SELECT changeTime FROM fund_member_change_record WHERE loginName = u.loginName AND isJoin = 1 ORDER BY changeTime DESC limit 1) joinTime
FROM FROM
vw_user u vw_user u
$condition $condition
@@ -14,6 +14,7 @@ import io.swagger.annotations.Api;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls; import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql; import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap; import org.nutz.lang.util.NutMap;
@@ -40,7 +41,7 @@ public class FundMemberSchoolUnionApprovalController {
@At @At
@SaCheckPermission("fundMember.schoolUnionApproval") @SaCheckPermission("fundMember.schoolUnionApproval")
public Result pageData(PageForm pageForm, String taskId, String searchKeyword, Integer year, boolean approval) { public Result pageData(PageForm pageForm, String unionId, Integer year, boolean approval) {
Sql sql = Sqls.create(""" Sql sql = Sqls.create("""
SELECT SELECT
info.*, info.*,
@@ -81,10 +82,14 @@ public class FundMemberSchoolUnionApprovalController {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
} }
cnd.andEX("YEAR(info.submitTime)", "=", year);
if (StrUtil.isNotBlank(searchKeyword)) { if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.where().andLike("info.title", searchKeyword); SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("info.loginName", pageForm.getSearchKeyword());
seg.orLike("info.userName", pageForm.getSearchKeyword());
cnd.and(seg);
} }
cnd.andEX("info.unionId", "=", unionId);
cnd.groupBy("t.id"); cnd.groupBy("t.id");
cnd.desc("t.createdAt"); cnd.desc("t.createdAt");
@@ -69,6 +69,7 @@ public class FundMemberWriteController {
Dict args = Dict.create(); Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, fundMember); args.set(FlowConst.FORM_DATA, fundMember);
args.set(FlowConst.TASK_FORM_DATA_PREFIX + "userState", fundMember.getUserState());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("FUND_MEMBER", fundMember.getId(), SecurityUtil.getUserId(), args); ProcessInstance instance = flowEngine.startProcessInstanceByKey("FUND_MEMBER", fundMember.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务 // 自动完成第一个申请任务
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.democratic.proposal.controller.query; package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination; import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
@@ -23,6 +24,7 @@ import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.Arrays;
@IocBean @IocBean
@At("/platform/proposal/query/comprehensive") @At("/platform/proposal/query/comprehensive")
@@ -71,9 +73,47 @@ public class ProposalQueryComprehensiveController {
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id
LEFT JOIN wf_process_task replyTask on replyTask.processInstanceId = ins.id AND replyTask.taskState = 20 AND replyTask.taskName in ('master_reply','slave_reply','opinion_master_reply')
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
if(ArrayUtil.isNotEmpty(pageForm.getOrigins())){
SqlExpressionGroup seg = new SqlExpressionGroup();
// 案名
if(ArrayUtil.contains(pageForm.getOrigins(),"name")){
for (String keyword : pageForm.getCommonKeyword().split(" ")) {
seg.orLike("info.name", keyword);
}
}
// 案由
if(ArrayUtil.contains(pageForm.getOrigins(),"brief")){
for (String keyword : pageForm.getCommonKeyword().split(" ")) {
seg.orLike("info.brief", keyword);
}
}
// 提案人
if(ArrayUtil.contains(pageForm.getOrigins(),"createUserName")){
for (String keyword : pageForm.getCommonKeyword().split(" ")) {
seg.orLike("info.createUserName", keyword);
seg.orLike("info.createUserLoginName", keyword);
}
}
// 答复内容
if(ArrayUtil.contains(pageForm.getOrigins(),"answer")){
for (String keyword : pageForm.getCommonKeyword().split(" ")) {
seg.orLike("JSON_EXTRACT(replyTask.variable,'$.tf_opinion')", keyword);
}
}
if(!seg.isEmpty()){
cnd.and(seg);
}
}
if(StrUtil.isNotBlank(pageForm.getUndertakeUnitId())){ if(StrUtil.isNotBlank(pageForm.getUndertakeUnitId())){
} }
@@ -20,6 +20,8 @@ public class ProposalQueryComprehensiveParam extends PageForm {
private String code; private String code;
@ApiModelProperty(name = "教代会ID") @ApiModelProperty(name = "教代会ID")
private String sessionId; private String sessionId;
@ApiModelProperty(name = "教代会ID")
private String[] sessionIds;
@ApiModelProperty(name = "代表团ID") @ApiModelProperty(name = "代表团ID")
private String delegationId; private String delegationId;
@ApiModelProperty(name = "提案人姓名") @ApiModelProperty(name = "提案人姓名")
@@ -50,10 +52,14 @@ public class ProposalQueryComprehensiveParam extends PageForm {
@ApiModelProperty(name = "征集进度状态") @ApiModelProperty(name = "征集进度状态")
private Integer[] collectIds; private Integer[] collectIds;
@ApiModelProperty(name = "提案来源")
private String[] origins;
@ApiModelProperty(name = "通用关键字") @ApiModelProperty(name = "通用关键字")
private String commonKeyword; private String commonKeyword;
/** /**
* 构建通用查询参数 * 构建通用查询参数
* *
@@ -9,9 +9,6 @@ layout("/layouts/platform.html"){
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="年度" <el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="年度"
style="width: 100%"></el-date-picker> style="width: 100%"></el-date-picker>
</search-item> </search-item>
<search-item label="标题">
<el-input v-model="pageForm.searchKeyword" placeholder="标题" clearable></el-input>
</search-item>
</search> </search>
</el-card> </el-card>
<el-card shadow="never"> <el-card shadow="never">
@@ -9,8 +9,19 @@ layout("/layouts/platform.html"){
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="年度" <el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="年度"
style="width: 100%"></el-date-picker> style="width: 100%"></el-date-picker>
</search-item> </search-item>
<search-item label="标题"> <search-item label="工号/姓名">
<el-input v-model="pageForm.searchKeyword" placeholder="标题" clearable></el-input> <el-input v-model="pageForm.searchKeyword" placeholder="请输入工号或者姓名查询"
clearable></el-input>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
placeholder="请选择所属工会" clearable>
<el-option v-for="item in unionOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item> </search-item>
</search> </search>
</el-card> </el-card>
@@ -93,7 +104,8 @@ layout("/layouts/platform.html"){
approval: false approval: false
}, },
formData: {}, formData: {},
showApprovalForm: false showApprovalForm: false,
unionOptions: []
} }
}, },
methods: { methods: {
@@ -154,6 +166,8 @@ layout("/layouts/platform.html"){
}, },
}, },
created() { created() {
//工会查询
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
this.pageData() this.pageData()
} }
}) })
@@ -79,10 +79,6 @@ layout("/layouts/platform.html"){
</el-col> </el-col>
</el-row> </el-row>
<el-form-item label="家庭住址" prop="address">
<el-input v-model="formData.address" placeholder="请输入家庭住址"></el-input>
</el-form-item>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="手机号码" prop="mobile"> <el-form-item label="手机号码" prop="mobile">
@@ -145,7 +141,7 @@ layout("/layouts/platform.html"){
], ],
address: [{required: true, message: '请输入家庭住址', trigger: 'blur'}], address: [{required: true, message: '请输入家庭住址', trigger: 'blur'}],
joinWorkTime: [{required: true, message: '请选择参加工作时间', trigger: 'blur'}], joinWorkTime: [{required: true, message: '请选择参加工作时间', trigger: 'blur'}],
retireTime: [{required: true, message: '请选择退休时间', trigger: 'blur'}], retireTime: [{required: false, message: '请选择退休时间', trigger: 'blur'}],
mobile: [{required: true, message: '请输入手机号码', trigger: 'blur'}, mobile: [{required: true, message: '请输入手机号码', trigger: 'blur'},
{ {
pattern: /^1[3456789]\d{9}$/, pattern: /^1[3456789]\d{9}$/,
@@ -219,7 +215,7 @@ layout("/layouts/platform.html"){
}).then(res => { }).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.$message.success("提交成功") this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/suggestionBox/mine') commonUtil.pjaxPush('/platform/fundMember/mine')
} }
}) })
}) })
@@ -235,7 +231,7 @@ layout("/layouts/platform.html"){
} }
}) })
} else { } else {
const {username, loginname, sex, birthday, mobile, union} = this.$store.state.user const {username, loginname, sex, birthday, mobile, union, userState, idCard} = this.$store.state.user
this.formData = { this.formData = {
userName: username, userName: username,
loginName: loginname, loginName: loginname,
@@ -243,7 +239,9 @@ layout("/layouts/platform.html"){
birthday: birthday, birthday: birthday,
mobile: mobile, mobile: mobile,
unionId: union?.id, unionId: union?.id,
unionName: union?.name unionName: union?.name,
userState: userState,
idCard: idCard
} }
} }
} }
@@ -6,61 +6,174 @@ layout("/layouts/platform.html"){
.el-tag { .el-tag {
cursor: pointer; cursor: pointer;
} }
.search-container {
display: flex;
align-items: center;
min-height: 50px;
border-bottom: 1px solid #ddd;
padding: 12px 0;
margin-bottom: 0;
}
.search-label {
width: 90px;
margin-right: 10px;
font-weight: normal;
color: #333;
font-size: 14px;
}
.search-content {
flex: 1;
display: flex;
gap: 5px;
}
.custom-search-box {
display: flex;
align-items: center;
width: 100%;
background: #ffffff;
border: 1px solid #ccc;
border-radius: 3px;
}
.custom-search-box:hover {
border-color: #999;
}
.custom-search-box:focus-within {
border-color: #4a90e2;
box-shadow: 0 0 3px rgba(74, 144, 226, 0.3);
}
.search-input {
flex: 1;
height: 35px;
padding: 0 10px;
border: none;
outline: none;
font-size: 14px;
color: #333;
background: transparent;
font-family: inherit;
width: 100%;
}
.search-input::placeholder {
color: #999;
}
.filter-row {
display: flex;
align-items: center;
min-height: 50px;
border-bottom: 1px dashed rgb(230, 230, 230);
}
.filter-label {
width: 90px;
margin-right: 10px;
}
.filter-tags {
flex: 1;
display: flex;
gap: 5px;
}
</style> </style>
<div id="app" v-cloak> <div id="app" v-cloak>
<guava ref="guava"> <guava ref="guava">
<el-card shadow="never"> <el-card shadow="never">
<search @search="doSearch">
<search-item label="教代会"> <!-- 万能搜索框 -->
<el-select @change="meetingChange" clearable filterable placeholder="所属教代会" <div class="search-container">
v-model="pageForm.sessionId"> <div class="search-label">万能搜索</div>
<el-option :key="item.id" :label="item.fullName" :value="item.id" <div class="search-content">
v-for="item in sessionOptions"></el-option> <div class="custom-search-box">
</el-select> <input
</search-item> type="text"
<search-item label="提案名称"> v-model="pageForm.commonKeyword"
<el-input placeholder="请输入关键词进行搜索"
@keyup.enter.native="doSearch" class="search-input"
clearable @keyup.enter="doSearch"
placeholder="请输入提案名称" />
v-model="pageForm.name" </div>
style="width: 100%" </div>
></el-input> </div>
</search-item>
<search-item label="提案编码"> <div class="filter-row">
<el-input <div class="filter-label">搜索来源</div>
@keyup.enter.native="doSearch" <div class="filter-tags">
clearable <el-tag
placeholder="请输入提案编码" v-for="item in origins"
v-model="pageForm.code" :key="item.value"
style="width: 100%" :effect="pageForm.origins && pageForm.origins.includes(item.value) ? 'dark':'plain'"
></el-input> @click="tagToggle('origins',item.value)"
</search-item> >
<search-item label="姓名/工号:"> {{ item.label }}
<el-input placeholder="请输入提案人姓名或工号查询" clearable </el-tag>
v-model="pageForm.createUserKeyword"></el-input> </div>
</search-item> </div>
<!-- <search-item label="提案人姓名">-->
<!-- <el-input--> <div class="filter-row">
<!-- @keyup.enter.native="doSearch"--> <div class="filter-label">届次</div>
<!-- clearable--> <div class="filter-tags">
<!-- placeholder="请输入提案人姓名"--> <el-tag
<!-- v-model="pageForm.createUserName"--> v-for="item in sessionOptions"
<!-- style="width: 100%"--> :key="item.id"
<!-- ></el-input>--> :effect="pageForm.sessionIds && pageForm.sessionIds.includes(item.id) ? 'dark':'plain'"
<!-- </search-item>--> @click="tagToggle('sessionIds',item.id)"
<!-- <search-item label="提案人工号">--> >
<!-- <el-input--> {{ item.fullName }}
<!-- @keyup.enter.native="doSearch"--> </el-tag>
<!-- clearable--> </div>
<!-- placeholder="请输入提案人工号"--> </div>
<!-- v-model="pageForm.createUserLoginName"--> <div class="filter-row">
<!-- style="width: 100%"--> <div class="filter-label">提案类别</div>
<!-- ></el-input>--> <div class="filter-tags">
<!-- </search-item>--> <el-tag
v-for="item in typeOptions"
:key="item.code"
:effect="pageForm.typeIds && pageForm.typeIds.includes(item.id) ? 'dark':'plain'"
@click="tagToggle('typeIds',item.id)"
>
{{ item.name }}
</el-tag>
</div>
</div>
<div class="filter-row">
<div class="filter-label">立案结果</div>
<div class="filter-tags">
<el-tag
v-for="item in dict.type.PROPOSAL_CASE_FILING_RESULT"
:key="item.code"
:effect="pageForm.caseFilingResults && pageForm.caseFilingResults.includes(item.code) ? 'dark':'plain'"
@click="tagToggle('caseFilingResults',item.code)"
>
{{ item.label }}
</el-tag>
</div>
</div>
<div class="filter-row">
<div class="filter-label">立案类型</div>
<div class="filter-tags">
<el-tag
v-for="item in dict.type.PROPOSAL_CASE_FILING_TYPE"
:key="item.code"
:effect="pageForm.caseFilingTypes && pageForm.caseFilingTypes.includes(item.code) ? 'dark':'plain'"
@click="tagToggle('caseFilingTypes',item.code)"
>
{{ item.label }}
</el-tag>
</div>
</div>
<search @search="doSearch" class="mt10">
<search-item label="代表团"> <search-item label="代表团">
<el-select clearable filterable placeholder="所属代表团" v-model="pageForm.delegationId"> <el-select clearable filterable placeholder="请选择所属代表团" v-model="pageForm.delegationId">
<el-option :key="item.id" :label="item.name" :value="item.id" <el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in delegationOptions"></el-option> v-for="item in delegationOptions"></el-option>
</el-select> </el-select>
@@ -78,28 +191,9 @@ layout("/layouts/platform.html"){
v-for="item in unitOptions"></el-option> v-for="item in unitOptions"></el-option>
</el-select> </el-select>
</search-item> </search-item>
<search-item label="提案类别">
<el-select clearable filterable multiple placeholder="提案类别" v-model="pageForm.typeIds">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in typeOptions"></el-option>
</el-select>
</search-item>
<search-item label="立案结果">
<el-select clearable filterable multiple placeholder="立案结果" v-model="pageForm.caseFilingResults">
<el-option :key="item.code" :label="item.label" :value="item.code" v-for="item in dict.type.PROPOSAL_CASE_FILING_RESULT"></el-option>
</el-select>
</search-item>
<search-item label="立案类型">
<el-select clearable filterable multiple placeholder="立案类型" v-model="pageForm.caseFilingTypes">
<el-option :key="item.code" :label="item.label" :value="item.code" v-for="item in dict.type.PROPOSAL_CASE_FILING_TYPE"></el-option>
</el-select>
</search-item>
<!-- <search-item label="承办单位">-->
<!-- <el-select clearable filterable placeholder="承办单位" v-model="pageForm.undertakeUnitId">-->
<!-- <el-option :key="item.code" :label="item.name" :value="item.id" v-for="item in underTakeOptions"></el-option>-->
<!-- </el-select>-->
<!-- </search-item>-->
</search> </search>
</el-card> </el-card>
<el-card shadow="never"> <el-card shadow="never">
<table-tool></table-tool> <table-tool></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" ref="tableRef" <el-table :data="tableData" @sort-change="pageOrder" header-align="center" ref="tableRef"
@@ -177,12 +271,32 @@ layout("/layouts/platform.html"){
unionOptions: [], unionOptions: [],
unitOptions: [], unitOptions: [],
pageForm: { pageForm: {
origins: [],
sessionIds: [],
typeIds: [], typeIds: [],
caseFilingResults: [], caseFilingResults: [],
caseFilingTypes: [], caseFilingTypes: [],
unionId: null, unionId: null,
unitId: null unitId: null
},
origins: [
{
label: '提案名称',
value: 'name'
},
{
label: '案由',
value: 'brief'
},
{
label: '答复内容',
value: 'answer'
},
{
label: '提案人',
value: 'createUserName'
} }
]
} }
}, },
methods: { methods: {