This commit is contained in:
Paidax
2025-04-29 16:51:22 +08:00
13 changed files with 687 additions and 217 deletions
@@ -4,15 +4,21 @@ import cn.dev33.satoken.annotation.SaCheckLogin;
import com.budwk.app.base.result.Result;
import com.budwk.app.client.module.activity.service.ClientActivityService;
import com.budwk.app.module.activity.models.ActGroup;
import com.budwk.app.module.activity.models.ActGroupUser;
import com.budwk.app.module.activity.models.ActUser;
import com.budwk.app.module.activity.models.ActivityItem;
import com.budwk.app.web.commons.auth.satoken.StpClientUtil;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.adaptor.JsonAdaptor;
import org.nutz.mvc.annotation.AdaptBy;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@@ -37,11 +43,12 @@ public class ClientGroupController {
/**
* 查询我的活动
*
* @return
*/
@At("/list-act")
@SaCheckLogin(type = StpClientUtil.TYPE)
public Result listAct(){
public Result listAct() {
Sql sql = Sqls.create("""
SELECT
t1.id,
@@ -64,19 +71,60 @@ public class ClientGroupController {
@At("/info/?")
@SaCheckLogin(type = StpClientUtil.TYPE)
public Result info(Long activityId){
ActGroup group = dao.fetch(ActGroup.class, Cnd.where(ActGroup::getActivityId, "=", activityId));
public Result info(Long activityId) {
Sql sql = Sqls.create("select * from act_group where activityId=@activityId").setParam("activityId", activityId);
sql.setCallback(Sqls.callback.map());
NutMap map = (NutMap) dao.execute(sql).getResult();
Sql sqlGroupUser = Sqls.create("""
SELECT
t1.*,
t2.userName,
t2.unitName,
t2.sex
FROM
`act_group_user` t1
LEFT JOIN act_user t2 ON t1.userId = t2.userId
WHERE t1.groupId=@groupId
""").setParam("groupId", map.getString("id"));
List<NutMap> groupUsers = clientActivityService.listMap(sqlGroupUser);
map.put("groupUsers", groupUsers);
NutMap leader = groupUsers.stream().filter(nutMap -> nutMap.getBoolean("isLeader")).findFirst().orElse(null);
map.put("isSelfLeader", "");
if (Lang.isNotEmpty(leader)) {
map.put("isSelfLeader", leader.getString("userId").equals(StpClientUtil.STP.getLoginIdAsString()));
}
return Result.success(map);
}
@At("/apply-leader/?")
@AdaptBy(type = JsonAdaptor.class)
@SaCheckLogin(type = StpClientUtil.TYPE)
public Result applyLeader(Long groupId) {
clientActivityService.dao().update(ActGroupUser.class,
Chain.make("isLeader", true),
Cnd.where(ActGroupUser::getGroupId, "=", groupId)
.and(ActGroupUser::getUserId, "=", StpClientUtil.STP.getLoginIdAsLong()));
return Result.success();
}
/**
* 查询团队成员
*/
@At("/list-team-user/?")
@At("/list-team/?")
@SaCheckLogin(type = StpClientUtil.TYPE)
public Result listTeamUser(Long activityId){
List<ActUser> list = dao.query(ActUser.class, Cnd.where(ActUser::getActivityId, "=", activityId).and(ActUser::getIsSignIn, "=", 1));
public Result listTeam(Long activityId){
Sql sql = Sqls.create("""
SELECT
t1.*,
COUNT( t2.id ) isSignUp
FROM
activity_item t1
LEFT JOIN act_item_user t2 ON t1.id = t2.itemId
WHERE
t1.activityId = @activityId
GROUP BY
t1.id
""").setParam("activityId",activityId);
List<NutMap> list = clientActivityService.listMap(sql);
return Result.success(list);
}
}
@@ -5,14 +5,18 @@ import com.budwk.app.base.result.Result;
import com.budwk.app.client.module.activity.service.ClientItemService;
import com.budwk.app.client.module.activity.vo.ClientActivitySignVO;
import com.budwk.app.client.module.activity.vo.ClientItemSignUpVO;
import com.budwk.app.module.activity.models.ActGroup;
import com.budwk.app.module.activity.models.ActUser;
import com.budwk.app.module.activity.models.ActivityItem;
import com.budwk.app.module.activity.models.ActivityItemUser;
import com.budwk.app.web.commons.auth.satoken.StpClientUtil;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.adaptor.JsonAdaptor;
import org.nutz.mvc.annotation.AdaptBy;
import org.nutz.mvc.annotation.At;
@@ -41,6 +45,19 @@ public class ClientItemController {
return Result.success();
}
/**
* 查询出这个活动所有报名的人
* @param activityId
* @return
*/
@At("/list-apply-user/?")
@SaCheckLogin(type = StpClientUtil.TYPE)
public Result listApplyUser(String activityId){
List<ActivityItemUser> userList = dao.query(ActivityItemUser.class, Cnd.where(ActivityItemUser::getActivityId, "=", activityId));
return Result.success(userList);
}
/**
* 获取项目列表
*/
@@ -56,8 +73,23 @@ public class ClientItemController {
*/
@At("/list-team-user/?")
@SaCheckLogin(type = StpClientUtil.TYPE)
public Result listTeamUser(Long activityId){
List<ActUser> list = dao.query(ActUser.class, Cnd.where(ActUser::getActivityId, "=", activityId).and(ActUser::getIsSignIn, "=", 1));
public Result listTeamUser(Long activityId) {
Sql sql = Sqls.create("""
SELECT
t1.groupId,
t1.userId,
t2.activityId,
t3.userName,
t3.unitName,
t3.sex
FROM
`act_group_user` t1
LEFT JOIN act_group t2 ON t2.id = t1.groupId
LEFT JOIN act_user t3 ON t3.userId = t1.userId
WHERE
t2.activityId = @activityId
""").setParam("activityId", activityId);
List<NutMap> list = clientItemService.listMap(sql);
return Result.success(list);
}
@@ -66,7 +98,7 @@ public class ClientItemController {
*/
@At("/list-signup-user")
@SaCheckLogin
public Result listSignUpUser(Long activityId,Long itemId) {
public Result listSignUpUser(Long activityId, Long itemId) {
List<ActivityItemUser> itemUsers = dao.query(ActivityItemUser.class, Cnd.where(ActivityItemUser::getActivityId, "=", activityId).and(ActivityItemUser::getItemId, "=", itemId));
return Result.success(itemUsers);
}
@@ -3,6 +3,7 @@ package com.budwk.app.client.module.activity.service.impl;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.client.module.activity.service.ClientItemService;
import com.budwk.app.client.module.activity.vo.ClientItemSignUpVO;
import com.budwk.app.module.activity.models.Activity;
import com.budwk.app.module.activity.models.ActivityItemUser;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
@@ -10,6 +11,8 @@ import org.nutz.dao.Dao;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.IocBean;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@IocBean(args = {"refer:dao"})
@@ -21,17 +24,24 @@ public class ClientItemServiceImpl extends BaseServiceImpl<ActivityItemUser> imp
@Override
@Aop(TransAop.READ_COMMITTED)
public void signUp(ClientItemSignUpVO signVO) {
Activity activity = dao().fetch(Activity.class, Cnd.where(Activity::getId, "=", signVO.getActivityId()));
if (activity.getItemEndTime().isBefore(LocalDateTime.now())){
throw new RuntimeException("项目报名已结束!");
}
// 删除掉之前的
clear(Cnd.where(ActivityItemUser::getActivityId, "=", signVO.getActivityId())
.and(ActivityItemUser::getGroupId, "=", signVO.getGroupId())
.and(ActivityItemUser::getItemId, "=", signVO.getItemId())
);
List<ActivityItemUser> userList = signVO.getUserList();
for (ActivityItemUser itemUser : userList) {
List<ActivityItemUser> userList = new ArrayList<>();
for (Long userId : signVO.getUserList()) {
ActivityItemUser itemUser = new ActivityItemUser();
itemUser.setActivityId(signVO.getActivityId());
itemUser.setItemId(signVO.getItemId());
itemUser.setGroupId(signVO.getGroupId());
itemUser.setUserId(userId);
userList.add(itemUser);
}
insert(userList);
}
@@ -14,6 +14,6 @@ public class ClientItemSignUpVO {
private Long groupId;
private List<ActivityItemUser> userList;
private List<Long> userList;
}
@@ -0,0 +1,81 @@
package com.budwk.app.module.activity.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.result.Result;
import com.budwk.app.module.activity.models.ActGroup;
import com.budwk.app.module.activity.models.Activity;
import com.budwk.app.module.activity.service.ActivityManageService;
import com.budwk.app.module.activity.vo.page.ActScoreEnterPageForm;
import com.budwk.app.module.activity.vo.page.ActSignInUserPageForm;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @author zhf
* @date 2025/4/29 15:56
* @description 成绩录入
*/
@IocBean
@At("/platform/activity/scoreEnter")
@Ok("json:full")
public class ActScoreEnterController {
@Inject
private Dao dao;
@Inject
private ActivityManageService activityService;
@At("")
@SaCheckPermission("activity.scoreEnter")
@Ok("beetl:/platform/activity/scoreEnter/index.html")
public void index() {
}
@At()
@SaCheckPermission("activity.scoreEnter")
public Result getActivityOptions(Integer year) {
return Result.success(activityService.dao().query(Activity.class, Cnd.NEW().andEX("YEAR(startTime)", "=", year)));
}
@At()
@SaCheckPermission("activity.scoreEnter")
public Result pageData(ActScoreEnterPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
t1.*
FROM
`activity_item` t1
WHERE t1.activityId=@id
ORDER BY t1.sort asc
""").setParam("id", pageForm.getActivityId());
return Result.success(activityService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(),sql));
}
/**
* 获取分组列表
* @param activityId
* @return
*/
@At()
@SaCheckPermission("activity.scoreEnter")
public Result getGroupList(Long activityId){
List<ActGroup> groupList = activityService.dao().query(ActGroup.class, Cnd.where(ActGroup::getActivityId, "=", activityId));
return Result.success(groupList);
}
}
@@ -50,6 +50,16 @@ public class Activity extends BaseModel {
@ColDefine(type = ColType.DATETIME)
private LocalDateTime signEndTime;
@Comment("项目报名开始时间")
@Column
@ColDefine(type = ColType.DATETIME)
private LocalDateTime itemStartTime;
@Comment("项目报名结束时间")
@Column
@ColDefine(type = ColType.DATETIME)
private LocalDateTime itemEndTime;
@Comment("主办单位")
@Column
@ColDefine(type = ColType.VARCHAR, width = 255)
@@ -0,0 +1,30 @@
package com.budwk.app.module.activity.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
/**
* @author zhf
* @date 2025/4/29 16:41
* @description 活动成绩
*/
@EqualsAndHashCode(callSuper = true)
@Table("activity_item")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("活动成绩")
@Data
public class ActivityItemScore extends BaseModel {
@Id
@Comment("ID")
private Long id;
@Column
@Comment("活动ID")
@ColDefine(type = ColType.INT)
private Long activityId;
}
@@ -0,0 +1,19 @@
package com.budwk.app.module.activity.vo.page;
import com.budwk.app.base.page.PageForm;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author zhf
* @date 2025/4/29 16:08
* @description
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ActScoreEnterPageForm extends PageForm {
// 活动ID
private Long activityId;
}
@@ -6,7 +6,7 @@ const addOrUpdate = {
<!-- <el-step title="项目信息" icon="el-icon-upload"></el-step>-->
<!-- </el-steps>-->
<!-- class="mt-3"-->
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form ref="form" :model="form" :rules="rules" label-width="140px">
<el-form-item label="标题" prop="title">
<el-input v-model="form.title" placeholder="请输入标题"></el-input>
</el-form-item>
@@ -43,6 +43,22 @@ const addOrUpdate = {
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" :gutter="20">
<el-col :span="12">
<el-form-item label="项目报名开始时间" prop="itemStartTime">
<el-date-picker v-model="form.itemStartTime" type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择项目报名开始时间"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目报名结束时间" prop="itemEndTime">
<el-date-picker v-model="form.itemEndTime" type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择项目报名结束时间"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="主办单位" prop="hostUnit">
<el-input v-model="form.hostUnit" placeholder="请输入主办单位"></el-input>
</el-form-item>
@@ -95,6 +111,12 @@ const addOrUpdate = {
signEndTime: [
{required: true, message: '请选择报名结束时间', trigger: ['blur', 'change']}
],
itemStartTime: [
{required: true, message: '请选择项目报名开始时间', trigger: ['blur', 'change']}
],
itemEndTime: [
{required: true, message: '请选择项目报名结束时间', trigger: ['blur', 'change']}
],
hostUnit: [{required: true, message: '请输入主办单位', trigger: ['blur', 'change']}],
coHostUnit: [{required: true, message: '请输入承办单位', trigger: ['blur', 'change']}],
contact: [{required: true, message: '请输入联系人', trigger: ['blur', 'change']}],
@@ -0,0 +1,79 @@
const addOrUpdate = {
template: /*language=HTML*/ `
<el-dialog title="录入成绩" :visible.sync="visible" width="70%">
<el-table show-overflow-tooltip :data="tableData" height="500">
<el-table-column label="序号" type="index" header-align="center" align="center"
width="50"></el-table-column>
<el-table-column label="团队名称" prop="groupId">
<template slot-scope="scope">
<el-select v-model="scope.row.groupId" placeholder="请选择" style="width: 100%">
<el-option v-for="item in groupList" :key="item.id" :label="item.groupName"
:value="item.id"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="成绩" prop="score">
<template slot-scope="scope">
<el-input-number v-model="scope.row.score"></el-input-number>
</template>
</el-table-column>
<el-table-column label="得分" prop="fraction">
<template slot-scope="scope">
<el-input-number v-model="scope.row.fraction"></el-input-number>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="150">
<template slot="header" slot-scope="scope">
<el-button type="primary" size="mini" @click="tableData.push({})">添加</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="onSubmit">确定</el-button>
</template>
</el-dialog>
`,
data() {
return {
title: '',
visible: false,
infoData: {},
tableData: [],
groupList: []
}
},
methods: {
onOpen(row) {
this.infoData = row
this.getGroupList()
this.visible = true
},
getGroupList() {
$.get('/platform/activity/scoreEnter/getGroupList', {activityId: this.infoData.activityId}).then(res => {
if (res.code === 0) {
this.groupList = res.data
}
})
},
onSubmit() {
$.post('/platform/activity/scoreEnter/addOrUpdate', {
activityId: this.infoData.activityId,
itemId: this.infoData.id,
scores: JSON.stringify(this.tableData)
}).then(res => {
if (res.code === 0) {
this.$message.success('保存成功')
this.visible = false
} else {
this.$message.error(res.msg)
}
})
}
}
}
@@ -0,0 +1,110 @@
<!--#
layout("/layouts/platform_1.html"){
#-->
<div id="app">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度</div>
<div class="search-item-option">
<el-date-picker
:clearable="false"
placeholder="选择年"
style="width: 100%"
@change="getActivityOptions"
type="year"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属活动</div>
<div class="search-item-option">
<el-select v-model="pageForm.activityId" placeholder="请选择活动">
<el-option
v-for="item in activityOptions"
:key="item.id"
:label="item.title"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt-3">
<el-table v-loading="tableLoading" show-overflow-tooltip :data="tableData">
<el-table-column label="序号" prop="index" header-align="center" align="center" width="50">
<template slot-scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="项目名称" prop="name"></el-table-column>
<el-table-column label="操作" width="200">
<template slot-scope="{row}">
<el-button type="text" @click="$refs.addOrUpdateRef.onOpen(row)">录入成绩</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<add-or-update ref="addOrUpdateRef" @refresh="doSearch"></add-or-update>
</div>
<script>
<!--#include('addOrUpdate.js'){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"add-or-update": addOrUpdate,
},
data() {
return {
pageForm: {
year: new Date().getFullYear() + ""
},
activityOptions: []
}
},
methods: {
getActivityOptions() {
$.post("/platform/activity/scoreEnter/getActivityOptions", {year: this.pageForm.year}).then(res => {
if (res.code === 0) {
if (res.data && res.data.length > 0) {
this.$set(this.pageForm, "activityId", res.data[0].id)
} else {
this.$set(this.pageForm, "activityId", "")
}
this.activityOptions = res.data;
this.doSearch()
} else {
this.$message.error(res.msg);
}
})
},
},
created() {
this.getActivityOptions()
}
})
</script>
<!--#
}
#-->