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.Sqls;
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.IocBean;
import org.nutz.lang.util.NutMap;
@@ -81,9 +82,11 @@ public class FundMemberBranchUnionApprovalController {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isNotBlank(searchKeyword)) {
cnd.where().andLike("info.title", searchKeyword);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("info.loginName", pageForm.getSearchKeyword());
seg.orLike("info.userName", pageForm.getSearchKeyword());
cnd.and(seg);
}
cnd.groupBy("t.id");
@@ -74,6 +74,7 @@ public class FundMemberMineController {
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(info.submitTime)", "=", year);
cnd.and("info.createdBy", "=", SecurityUtil.getUserId());
sql.setCondition(cnd);
Pagination<NutMap> pagination = fundMemberService.listPageMap(pageNumber, pageSize, sql);
@@ -74,7 +74,7 @@ public class FundMemberQueryController {
u.userState,
u.unitName,
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
vw_user u
$condition
@@ -14,6 +14,7 @@ import io.swagger.annotations.Api;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
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.IocBean;
import org.nutz.lang.util.NutMap;
@@ -40,7 +41,7 @@ public class FundMemberSchoolUnionApprovalController {
@At
@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("""
SELECT
info.*,
@@ -71,7 +72,7 @@ public class FundMemberSchoolUnionApprovalController {
""");
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "xgh");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
}
@@ -81,10 +82,14 @@ public class FundMemberSchoolUnionApprovalController {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isNotBlank(searchKeyword)) {
cnd.where().andLike("info.title", searchKeyword);
cnd.andEX("YEAR(info.submitTime)", "=", year);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
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.desc("t.createdAt");
@@ -69,6 +69,7 @@ public class FundMemberWriteController {
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
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);
// 自动完成第一个申请任务
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
@@ -23,6 +24,7 @@ import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.Arrays;
@IocBean
@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_task t ON t.processInstanceId = ins.id AND t.taskState = 10
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
""");
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())){
}
@@ -20,6 +20,8 @@ public class ProposalQueryComprehensiveParam extends PageForm {
private String code;
@ApiModelProperty(name = "教代会ID")
private String sessionId;
@ApiModelProperty(name = "教代会ID")
private String[] sessionIds;
@ApiModelProperty(name = "代表团ID")
private String delegationId;
@ApiModelProperty(name = "提案人姓名")
@@ -50,10 +52,14 @@ public class ProposalQueryComprehensiveParam extends PageForm {
@ApiModelProperty(name = "征集进度状态")
private Integer[] collectIds;
@ApiModelProperty(name = "提案来源")
private String[] origins;
@ApiModelProperty(name = "通用关键字")
private String commonKeyword;
/**
* 构建通用查询参数
*
@@ -9,9 +9,6 @@ layout("/layouts/platform.html"){
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="年度"
style="width: 100%"></el-date-picker>
</search-item>
<search-item label="标题">
<el-input v-model="pageForm.searchKeyword" placeholder="标题" clearable></el-input>
</search-item>
</search>
</el-card>
<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="年度"
style="width: 100%"></el-date-picker>
</search-item>
<search-item label="标题">
<el-input v-model="pageForm.searchKeyword" placeholder="标题" clearable></el-input>
<search-item label="工号/姓名">
<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>
</el-card>
@@ -93,7 +104,8 @@ layout("/layouts/platform.html"){
approval: false
},
formData: {},
showApprovalForm: false
showApprovalForm: false,
unionOptions: []
}
},
methods: {
@@ -154,6 +166,8 @@ layout("/layouts/platform.html"){
},
},
created() {
//工会查询
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
this.pageData()
}
})
@@ -79,10 +79,6 @@ layout("/layouts/platform.html"){
</el-col>
</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-col :span="12">
<el-form-item label="手机号码" prop="mobile">
@@ -145,7 +141,7 @@ layout("/layouts/platform.html"){
],
address: [{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'},
{
pattern: /^1[3456789]\d{9}$/,
@@ -219,7 +215,7 @@ layout("/layouts/platform.html"){
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/suggestionBox/mine')
commonUtil.pjaxPush('/platform/fundMember/mine')
}
})
})
@@ -235,7 +231,7 @@ layout("/layouts/platform.html"){
}
})
} 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 = {
userName: username,
loginName: loginname,
@@ -243,7 +239,9 @@ layout("/layouts/platform.html"){
birthday: birthday,
mobile: mobile,
unionId: union?.id,
unionName: union?.name
unionName: union?.name,
userState: userState,
idCard: idCard
}
}
}
@@ -6,61 +6,174 @@ layout("/layouts/platform.html"){
.el-tag {
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>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="教代会">
<el-select @change="meetingChange" clearable filterable placeholder="所属教代会"
v-model="pageForm.sessionId">
<el-option :key="item.id" :label="item.fullName" :value="item.id"
v-for="item in sessionOptions"></el-option>
</el-select>
</search-item>
<search-item label="提案名称">
<el-input
@keyup.enter.native="doSearch"
clearable
placeholder="请输入提案名称"
v-model="pageForm.name"
style="width: 100%"
></el-input>
</search-item>
<search-item label="提案编码">
<el-input
@keyup.enter.native="doSearch"
clearable
placeholder="请输入提案编码"
v-model="pageForm.code"
style="width: 100%"
></el-input>
</search-item>
<search-item label="姓名/工号:">
<el-input placeholder="请输入提案人姓名或工号查询" clearable
v-model="pageForm.createUserKeyword"></el-input>
</search-item>
<!-- <search-item label="提案人姓名">-->
<!-- <el-input-->
<!-- @keyup.enter.native="doSearch"-->
<!-- clearable-->
<!-- placeholder="请输入提案人姓名"-->
<!-- v-model="pageForm.createUserName"-->
<!-- style="width: 100%"-->
<!-- ></el-input>-->
<!-- </search-item>-->
<!-- <search-item label="提案人工号">-->
<!-- <el-input-->
<!-- @keyup.enter.native="doSearch"-->
<!-- clearable-->
<!-- placeholder="请输入提案人工号"-->
<!-- v-model="pageForm.createUserLoginName"-->
<!-- style="width: 100%"-->
<!-- ></el-input>-->
<!-- </search-item>-->
<!-- 万能搜索框 -->
<div class="search-container">
<div class="search-label">万能搜索</div>
<div class="search-content">
<div class="custom-search-box">
<input
type="text"
v-model="pageForm.commonKeyword"
placeholder="请输入关键词进行搜索"
class="search-input"
@keyup.enter="doSearch"
/>
</div>
</div>
</div>
<div class="filter-row">
<div class="filter-label">搜索来源</div>
<div class="filter-tags">
<el-tag
v-for="item in origins"
:key="item.value"
:effect="pageForm.origins && pageForm.origins.includes(item.value) ? 'dark':'plain'"
@click="tagToggle('origins',item.value)"
>
{{ 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 sessionOptions"
:key="item.id"
:effect="pageForm.sessionIds && pageForm.sessionIds.includes(item.id) ? 'dark':'plain'"
@click="tagToggle('sessionIds',item.id)"
>
{{ item.fullName }}
</el-tag>
</div>
</div>
<div class="filter-row">
<div class="filter-label">提案类别</div>
<div class="filter-tags">
<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="代表团">
<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"
v-for="item in delegationOptions"></el-option>
</el-select>
@@ -78,28 +191,9 @@ layout("/layouts/platform.html"){
v-for="item in unitOptions"></el-option>
</el-select>
</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>
</el-card>
<el-card shadow="never">
<table-tool></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" ref="tableRef"
@@ -177,12 +271,32 @@ layout("/layouts/platform.html"){
unionOptions: [],
unitOptions: [],
pageForm: {
origins: [],
sessionIds: [],
typeIds: [],
caseFilingResults: [],
caseFilingTypes: [],
unionId: null,
unitId: null
}
},
origins: [
{
label: '提案名称',
value: 'name'
},
{
label: '案由',
value: 'brief'
},
{
label: '答复内容',
value: 'answer'
},
{
label: '提案人',
value: 'createUserName'
}
]
}
},
methods: {