This commit is contained in:
@jyuhsin
2026-01-28 15:43:43 +08:00
19 changed files with 203 additions and 71 deletions
@@ -147,7 +147,7 @@ public class FlowTodoCenterController {
t.h5FormKey
FROM
wf_process_instance ins
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.taskName = 'startTask'
LEFT JOIN wf_process_define def ON def.id = ins.processDefineId
LEFT JOIN wf_process_category cat ON cat.id = def.category
$condition
@@ -42,6 +42,7 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@IocBean
@@ -195,7 +196,40 @@ public class SysHomeController {
@Ok("json")
public Result listHomeActivity() {
FieldFilter fieldFilter = FieldFilter.locked(Sys_home_activity.class, "classPath");
List<Sys_home_activity> list = Daos.ext(dao, fieldFilter).query(Sys_home_activity.class, Cnd.where("enable", "=", 1).desc("top"));
Sql activitySql = Sqls.create("""
SELECT
id, name, cover, content, url, h5Url, allowUserGroupId, allowUserSql,
enable, top, push, sortNo, startDate, endDate,
createdBy, createdAt, updatedBy, updatedAt, delFlag
FROM sys_home_activity
WHERE enable = 1
ORDER BY
-- 第一优先级:活动状态分组(进行中 → 未开始 → 已结束)
CASE
WHEN startDate <= NOW() AND NOW() <= endDate THEN 0 -- 进行中
WHEN startDate > NOW() THEN 1 -- 未开始
ELSE 2 -- 已结束
END ASC,
-- 第二优先级:置顶(如果需要置顶在各自分组内生效)
top DESC,
-- 第三优先级:每组内按时间排序
-- 进行中:按开始时间升序(越早开始的越靠前)
-- 未开始:按开始时间升序(快开始的靠前)
-- 已结束:按结束时间降序(最近结束的靠前)或开始时间降序
CASE
WHEN startDate <= NOW() AND NOW() <= endDate THEN startDate
WHEN startDate > NOW() THEN startDate
ELSE endDate
END ASC;
""");
List<NutMap> listMap = sysUserService.listMap(activitySql);
List<Sys_home_activity> list = listMap.stream()
.map(nutMap -> Lang.map2Object(nutMap, Sys_home_activity.class))
.toList();
/* List<Sys_home_activity> list = Daos.ext(dao, fieldFilter).query(Sys_home_activity.class,
Cnd.where("enable", "=", 1)
.desc("startDate")
.desc("endDate").desc("top"));*/
String userId = SecurityUtil.getUserId();
List<Sys_home_activity> allowActivityList = new ArrayList<>();
// 今天的时间
@@ -210,7 +244,7 @@ public class SysHomeController {
// }
// 只过滤结束的
if (DateUtil.compare(today, endDate) > 0) {
continue;
// continue;
}
Integer allowUserGroupId = activity.getAllowUserGroupId();
String allowUserSql = activity.getAllowUserSql();
@@ -309,7 +309,9 @@ public class SysUserServiceImpl extends BaseServiceImpl<Sys_user> implements Sys
String decodePwd = Base64Decoder.decodeStr(passowrd);
String hashedPassword = PwdUtil.getPassword(decodePwd, user.getSalt());
if (!Strings.sNull(hashedPassword).equalsIgnoreCase(user.getPassword())) {
throw new BaseException("用户名或者密码不正确");
if (Globals.sso) {
throw new BaseException("用户名或者密码不正确");
}
}
user = this.fetchLinks(user, "unit");
if (Lang.isNotEmpty(user.getUnit()) && StrUtil.isNotBlank(user.getUnit().getUnionId())) {
@@ -27,6 +27,7 @@ import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @ClassName ActivityBasicUnitController
@@ -53,41 +54,55 @@ public class ActivityBasicUnitController {
@At
@SaCheckPermission("activity.basic.unit")
public Result pageData(@Param(value = "parentId") String parentId, PageForm pageForm) {
public Result pageData(PageForm pageForm, String unitName, String unitId) {
Cnd cnd = Cnd.NEW();
if (StrUtil.isBlank(parentId)) {
cnd.and("parentId", "=", "1");
} else {
cnd.and("parentId", "=", parentId);
}
if (StrUtil.isNotBlank(pageForm.getSearchName()) && StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.and(Cnd.likeEX(pageForm.getSearchName(), pageForm.getSearchKeyword()));
}
Sql sql = Sqls.create("select id,parentId,name,unitcode,unitLevel,unionId from activity_basic_unit $condition");
// cnd.and("parentId", "is not", null).andEX("unitLevel", "=", unitLevel).asc("unitLevel").asc("unitcode");
cnd.and("parentId", "is not", null);
cnd.andEX("parentId", "=", unitId);
// cnd.and("unitTypeCode", "=", "1");
cnd.asc("unitcode");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
cnd.and(Cnd.likeEX("name", unitName));
Pagination<ActivityBasicUnit> listPage = baseService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), ActivityBasicUnit.class, cnd);
return Result.success(listPage);
}
@At
@SaCheckPermission("activity.basic.unit")
public Result tree() {
// List list = new ArrayList();
// ActivityBasicUnit parentId = dao.fetch(ActivityBasicUnit.class, Cnd.where("id", "=", "1"));
// if (parentId != null) {
// parentId.setChild(child(parentId.getId()));
// list.add(parentId);
// return Result.success().addData(list);
// }
public Result tree(@Param("pid") String pid) {
try {
Cnd cnd = Cnd.NEW();
cnd.andEX("id", "=", pid);
cnd.asc("unitcode");
List<ActivityBasicUnit> list = baseService.dao().query(ActivityBasicUnit.class,cnd);
List<ActivityBasicUnit> list = dao.query(ActivityBasicUnit.class, Cnd.NEW());
List<TreeNode<String>> nodeList = CollUtil.newArrayList();
for (int i = 0; i < list.size(); i++) {
nodeList.add(new TreeNode<>(list.get(i).getId(), list.get(i).getParentId(), list.get(i).getName(), i));
List<TreeNode<String>> nodeList = CollUtil.newArrayList();
for (int i = 0; i < list.size(); i++) {
nodeList.add(new TreeNode<>(list.get(i).getId(), list.get(i).getParentId(), list.get(i).getName(), i)
.setExtra(
Map.of(
"unitType", list.get(i).getUnitType(),
"unitTypeCode", list.get(i).getUnitTypeCode()
)
));
}
List<Tree<String>> treeList = TreeUtil.build(nodeList, StrUtil.blankToDefault(pid, "0"));
// NutMap menuMap = NutMap.NEW();
// for (Sys_unit unit : list) {
// List<Sys_unit> list1 = menuMap.getList(unit.getParentId(), Sys_unit.class);
// if (list1 == null) {
// list1 = new ArrayList<>();
// }
// list1.add(unit);
// menuMap.put(unit.getParentId(), list1);
// }
// return Result.success().addData(getTree(menuMap, null));
return Result.success(treeList);
} catch (Exception e) {
return Result.error();
}
List<Tree<String>> treeList = TreeUtil.build(nodeList, "0000");
return Result.success(treeList);
}
private List<ActivityBasicUnit> child(String parentId) {
@@ -110,9 +110,9 @@ public class ActivityCultureApplyActivityController {
}
tissue.setUserId(SecurityUtil.getUserId());
tissue.setApplyTime(DateUtil.now());
if (StrUtil.isBlank(tissue.getId())){
if (StrUtil.isBlank(tissue.getId())) {
activityCultureService.insertWith(tissue, "tissuePersonList");
}else{
} else {
tissue.getTissuePersonList().forEach(tissuePerson -> tissuePerson.setTissueId(tissue.getId()));
activityCultureService.insertOrUpdate(tissue);
activityCultureService.dao().clear(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", tissue.getId()));
@@ -141,7 +141,7 @@ public class ActivityCultureApplyActivityController {
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, tissue);
args.set("activity_type", tissue.getActivity_type());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("WHHD", tissue.getId(), SecurityUtil.getUserId(), args);
ProcessInstance instance = flowEngine.startProcessInstanceByKey(tissue.getActivity_type().equals(40002) ? "FGHWHHD" : "XHWHHD", tissue.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
@@ -103,9 +103,9 @@ public class ActivityCultureAuditActivityController {
$condition
""");
if (activity_type==40002){
cnd.and("t.taskName", "=", "12f7ed7d-9286-4453-8754-57df7d3b260b");
cnd.and("t.taskName", "=", "6eb13516-ebcc-4a58-8dac-c334aaaa9196");
}else{
cnd.and("t.taskName", "=", "76a03838-caa4-4561-ba0f-0da0d3a17c37");
cnd.and("t.taskName", "=", "6fe316aa-2232-4760-a539-7538853262cd");
}
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
@@ -8,6 +8,7 @@ import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.zhgh.activity.basic.models.ActivityBasicSettings;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureService;
@@ -109,6 +110,8 @@ public class ActivityCultureInfoManageController {
dao.execute(sql);
NutMap userMap = (NutMap)sql.getResult();
if(ObjectUtil.isNotNull(userMap)){
ActivityBasicSettings settings = dao.fetch(ActivityBasicSettings.class, Cnd.where(ActivityBasicSettings::getCode, "=", tissue.getProjectTypeCode()));
tissue.setProjectTypeName(settings.getName());
tissue.setUsername(userMap.getString("username"));
tissue.setLoginname(userMap.getString("loginname"));
}
@@ -265,6 +265,7 @@ public class ActivityTissue extends BaseModel implements Serializable, SysHomeCo
private String projectTypeName;
private String username;
private String loginname;
@@ -1,31 +1,99 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style scoped>
.custom-tree {
background: transparent;
padding: 8px;
}
/* 节点行高调整 */
.custom-tree .el-tree-node {
margin: 2px 0;
border-radius: 6px;
transition: all 0.2s ease;
}
/* 选中状态 */
.custom-tree .el-tree-node.is-current > .el-tree-node__content {
background: #e8f4ff;
border-left: 3px solid #409eff;
}
/* 节点内容区域 */
.custom-tree .el-tree-node__content {
height: 36px;
line-height: 36px;
padding: 0 8px;
border-radius: 6px;
transition: all 0.2s ease;
}
/* 自定义节点内容 */
.custom-tree-node {
display: flex;
align-items: center;
width: 100%;
gap: 8px;
}
/* 文件夹图标颜色优化 */
.el-icon-folder {
color: #909399;
}
.el-icon-folder-opened {
color: #409eff;
}
/* 展开时图标旋转动画 */
.custom-tree .el-tree-node__expand-icon {
transition: transform 0.3s ease;
}
.custom-tree .el-tree-node__expand-icon.expanded {
transform: rotate(90deg);
}
/* 节点标签 */
.node-label {
flex: 1;
font-size: 13px;
color: #303133;
font-weight: 500;
}
/* 禁用展开图标(当无子节点时) */
.custom-tree .el-tree-node__expand-icon.is-leaf {
color: transparent;
cursor: default;
}
</style>
<div id="app" v-cloak>
<el-row :gutter="10" type="flex" style="height: calc(100vh - 126px)">
<el-row type="flex" :gutter="20" style="height: calc(100vh - 126px)">
<el-col :span="5">
<el-card shadow="never" style="height: 100%" body-style="{ height: '100%' }">
<div style="max-height: calc(100vh - 160px); overflow-y: auto">
<el-card shadow="never">
<el-input placeholder="输入关键字进行查找" v-model="filterText" clearable></el-input>
<div style="max-height: calc(100vh - 200px); overflow-y: auto">
<el-tree
:data="treeData"
:default-expanded-keys="['1']"
:expand-on-click-node="false"
:props="{
children: 'child',
label: 'name'
}"
@node-click="treeNodeClick"
highlight-current
node-key="id"
ref="treeRef"
:data="treeData"
ref="treeRef"
:expand-on-click-node="false"
:props="{ children: 'children', label: 'name' }"
node-key="id"
default-expand-all
@node-click="treeNodeClick"
:filter-node-method="filterNode"
highlight-current
class="custom-tree"
>
<template slot-scope="{ node, data }">
<span class="el-tree-node__label">
<i class="el-icon-folder-opened" v-if="node.level===1"></i>
<i class="el-icon-folder" v-else></i>
{{node.label}}
</span>
<span class="custom-tree-node">
<i class="el-icon-folder-opened" v-if="node.level===1"></i>
<i class="el-icon-folder" v-else></i>
<span class="node-label">{{ node.label }}</span>
</span>
</template>
</el-tree>
</div>
@@ -42,12 +110,8 @@ layout("/layouts/platform.html"){
clearable
placeholder="请输入内容"
style="width: 100%"
v-model="pageForm.searchKeyword"
v-model="pageForm.unitName"
>
<el-select placeholder="查询类型" slot="prepend" style="width: 110px" v-model="pageForm.searchName">
<el-option label="单位名称" value="name"></el-option>
<el-option label="单位代码" value="unitcode"></el-option>
</el-select>
</el-input>
</div>
<div class="search-item">
@@ -124,7 +188,7 @@ layout("/layouts/platform.html"){
treeNodeClick(data, node) {
this.currentTreeData = data
this.currentTreeNode = node
this.pageForm.parentId = data.id
this.pageForm.unitId = data.id
this.doSearch()
},
getTreeData() {
@@ -3,7 +3,7 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
<div>
<template>
<el-card shadow="never">
<snaker-start slot="header" label="文化活动申报" define_key="WHHD"
<snaker-start slot="header" label="文化活动申报" :define_key="activity_type===40002?'FGHWHHD':'XHWHHD'"
v-if="activity_type===40002||activity_type===40003"></snaker-start>
<el-form :model="formData" :rules="formRules" label-suffix="" label-width="170px"
ref="addForm" v-loading="formLoading">
@@ -1007,8 +1007,10 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
if (!this.formData.unionUserNumberLimit) {
this.getUnionData().then((data) => {
this.$set(this.formData, "unionUserNumberLimit", data)
})
}
this.calSummaryCount()
}
},
openEdit(row) {
@@ -65,6 +65,11 @@ const ACTIVITY_CULTURE_AUDIT_ACTIVITY = {
{{$moment(row.startTime).format('YYYY-MM-DD')}} -
{{$moment(row.endTime).format('YYYY-MM-DD')}}
</template>
<template scope="{row}" v-else-if="column.prop=='tussueName'">
<span v-if="row.activity_type==40002">{{row.unionname?row.unionname:'暂无'}}</span>
<span v-if="row.activity_type==40003">{{row.clubName?row.clubName:'暂无'}}</span>
<span v-if="row.activity_type==40001">校工会</span>
</template>
<template scope="{row}" v-else-if="column.prop=='projectTypeName'">
{{row.projectTypeName}}({{row.projectTypeCode}})
@@ -17,7 +17,7 @@ const singleSignUp = {
<el-descriptions-item label="活动编号">
{{ viewData.activityCode }}
</el-descriptions-item>
<el-descriptions-item label="活动编号">
<el-descriptions-item label="活动项目类型">
{{ viewData.projectTypeName }}({{ viewData.projectTypeCode }})
</el-descriptions-item>
<el-descriptions-item label="活动类型" :span="2">
@@ -1123,6 +1123,7 @@ let ACTIVITY_SPORTS_ADD_ACTIVITY = {
this.$emit("flush")
if (!this.formData.id) formData.id = resp.data
await this.openEdit(formData, false)
this.$emit("flush")
this.$message.success(resp.msg)
} else {
this.$message.error(resp.msg)
@@ -206,7 +206,10 @@ layout("/layouts/platform.html"){
this.$refs.addActivity.openAdd()
})
},
getStatus(close, applyStartTime, applyEndTime, startTime, endTime) {
getStatus(close, applyStartTime, applyEndTime, startTime, endTime,isSave) {
if (isSave){
return `<span class="text-info">保存中</span>`
}
if (close) {
return `<span class="text-danger">活动已关闭</span>`
}
@@ -118,6 +118,7 @@ layout("/layouts/platform.html"){
{prop: 'assetNumber', label: '资产编号'},
{prop: 'assetName', label: '资产名称'},
{prop: 'categoryName', label: '类别名称'},
{prop: 'assetQuantity', label: '数量'},
{prop: 'assetStorageLocation', label: '存放地点'},
{prop: 'assetUseUserName', label: '责任人'},
{prop: 'assetAllMoney', label: '原值(元)'},
@@ -126,6 +126,7 @@ layout("/layouts/platform.html"){
{prop: 'assetNumber', label: '资产编号'},
{prop: 'assetName', label: '资产名称'},
{prop: 'categoryName', label: '类别名称'},
{prop: 'assetQuantity', label: '数量'},
{prop: 'assetStorageLocation', label: '存放地点'},
{prop: 'assetUseUserName', label: '责任人'},
{prop: 'assetRetiredAssetsDate', label: '折旧到期日期'},
@@ -141,6 +141,7 @@ layout("/layouts/platform.html"){
{prop: 'assetNumber', label: '资产编号'},
{prop: 'assetName', label: '资产名称'},
{prop: 'categoryName', label: '类别名称'},
{prop: 'assetQuantity', label: '数量'},
{prop: 'assetTypeCode', label: '资产类型'},
{prop: 'assetStorageLocation', label: '存放地点'},
{prop: 'assetUseUserName', label: '责任人'},
@@ -174,7 +174,7 @@ layout("/layouts/platform.html"){
</el-form-item>
<el-form-item label="答复内容" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<text-editor v-model="formData.tf_opinion"></text-editor>
<text-editor v-model="formData.tf_opinion" key="tf_opinion" ></text-editor>
</el-form-item>
<el-form-item label="校领导" prop="tf_nextNodeOperator"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
@@ -305,6 +305,7 @@ layout("/layouts/platform.html"){
handleTaskAction(val) {
this.$refs.formRef.validate(valid => {
console.log(valid)
if (!valid) return
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
@@ -171,15 +171,17 @@ layout("/layouts/platform_h5.html"){
<div class="info">
<div class="info-item">
<van-icon name="underway-o"></van-icon>
活动时间:
<div>{{viewData.startTime}}至{{viewData.endTime}}</div>
</div>
<div class="info-item">
<van-icon name="location-o"></van-icon>
地点:
<div>{{viewData.address}}</div>
</div>
<div class="info-item" v-if="viewData.userNumberLimit===1">
<van-icon name="location-o"></van-icon>
活动限制人数
活动限制人数
<span>{{viewData.totalUserNumberLimit}}人</span>
</div>
<div class="info-item" v-if="viewData.userNumberLimit===2">
@@ -194,7 +196,7 @@ layout("/layouts/platform_h5.html"){
<span v-if="viewData.signUpMethod===2" style="color: var(--color-primary)">组队报名</span>
<span v-if="viewData.signUpMethod===3" style="color: var(--color-primary)">分工会报名</span>
</div>
<div class="info-item" v-if="viewData.signUpMethod==3">
<div class="info-item" v-if="viewData.signUpMethod==2">
<van-icon name="location-o"></van-icon>
组队人数:
<span style="color: var(--color-primary)">{{viewData.teamNum}}</span>
@@ -280,10 +282,6 @@ layout("/layouts/platform_h5.html"){
<!-- 分工会报名-->
<div v-else-if="viewData.signUpMethod===3" class="block">
<div class="notice-title left-tag-title">选择报名人员
<span v-if="viewData.userNumberLimit===2">
,报名人数 <span style="color: red">
{{viewData.unionTeamNum}}</span>
</span>
</div>
<el-select
v-if="inApplyTime"