This commit is contained in:
@jyuhsin
2025-05-27 15:07:37 +08:00
parent f8a630d101
commit d1a95f1788
26 changed files with 1645 additions and 541 deletions
@@ -8,8 +8,8 @@ import com.alibaba.fastjson.JSONObject;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.utils.WxHttpUtil;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.fitnessWalk.utils.WeAppCloudUtil;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
@@ -22,7 +22,6 @@ import org.nutz.mvc.annotation.Param;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@IocBean
@@ -81,14 +80,13 @@ public class FitnessWalkActivityBindingRecordController {
} catch (Exception e){
return Result.error(e.getMessage());
}
}
@At
@ViReturn
@RequiresPermissions("fitnessWalk.bindingRecord")
public Object delete(String[] ids){
public Object delete(String[] ids) {
try {
String sql = "db.collection('login_record').where({_id:_.in(" + Json.toJson(ids) + ")}).remove()";
weAppCloudUtil.request(WeAppCloudUtil.CRUD.DELETE,sql);
@@ -1,26 +1,23 @@
package io.v.nutz.zhgh.fitnessWalk.controller;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import cn.wizzer.framework.page.Pagination;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.utils.WxHttpUtil;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkActivity;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkCommonService;
import io.v.nutz.zhgh.fitnessWalk.utils.WeAppCloudUtil;
import io.v.nutz.sys.models.Sys_task;
import io.v.nutz.sys.services.SysTaskService;
import io.v.nutz.sys.services.SysUserService;
import io.v.nutz.task.services.TaskPlatformService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkActivity;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkCommonService;
import io.v.nutz.zhgh.fitnessWalk.utils.WeAppCloudUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.ioc.loader.annotation.Inject;
@@ -28,8 +25,6 @@ import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.random.R;
import org.nutz.lang.tmpl.Tmpl;
import org.nutz.lang.util.NutMap;
import org.nutz.log.Log;
import org.nutz.log.Logs;
@@ -39,17 +34,11 @@ import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
import org.nutz.plugins.wkcache.annotation.CacheRemove;
import org.nutz.plugins.wkcache.annotation.CacheRemoveAll;
import org.nutz.trans.Trans;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@At("/platform/fitnessWalk/activityManage")
@Ok("json")
@IocBean
@@ -152,14 +141,6 @@ public class FitnessWalkActivityManageController {
fitnessWalkActivity.setUnionId("");
}
//判断打卡抽奖的奖品列表是否有value
if (Lang.isNotEmpty(fitnessWalkActivity.getPunchLotteryPrizes())){
fitnessWalkActivity.getPunchLotteryPrizes().forEach(v->{
if (StrUtil.isNotBlank(v.getValue())) return;
v.setValue(R.UU32());
});
}
fitnessWalkActivity.setNote(fitnessWalkActivity.getNote().replace("\"", "'"));
StringBuilder sql = new StringBuilder();
sql.append("db.collection('activity').add({data:").append(Json.toJson(fitnessWalkActivity)).append("})");
@@ -246,13 +227,7 @@ public class FitnessWalkActivityManageController {
} else {
fitnessWalkActivity.setUnionId("");
}
//判断打卡抽奖的奖品列表是否有value
if (Lang.isNotEmpty(fitnessWalkActivity.getPunchLotteryPrizes())){
fitnessWalkActivity.getPunchLotteryPrizes().forEach(v->{
if (StrUtil.isNotBlank(v.getValue())) return;
v.setValue(R.UU32());
});
}
fitnessWalkActivity.setNote(fitnessWalkActivity.getNote().replace("\"", "'"));
StringBuilder sql = new StringBuilder();
@@ -287,6 +262,7 @@ public class FitnessWalkActivityManageController {
taskPlatformService.delete(v.getId(), v.getId());
sysTaskService.delete(v.getId());
});
}
return Result.success();
} catch (Exception e) {
@@ -294,7 +270,6 @@ public class FitnessWalkActivityManageController {
}
}
/**
* 健身走健步模式通知提醒
*
@@ -0,0 +1,69 @@
package io.v.nutz.zhgh.fitnessWalk.controller;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.DateUtil;
import io.v.nutz.zhgh.question.model.Question_issue;
import io.v.nutz.zhgh.question.model.Question_reply;
import io.v.nutz.zhgh.question.service.QuestionIssueService;
import io.v.nutz.zhgh.question.service.QuestionReplyService;
import io.v.nutz.zhgh.question.service.QuestionService;
import io.v.nutz.zhgh.question.service.QuestionWorService;
import org.nutz.dao.Cnd;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.random.R;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* 健身走公共答题
*/
@IocBean
@At("/platform/fitnessWalk/common")
@Ok("json:full")
public class FitnessWalkCommonController {
@Inject
private QuestionService questionService;
@Inject
private QuestionIssueService questionIssueService;
@Inject
private QuestionWorService questionWorService;
@Inject
private QuestionReplyService questionReplyService;
@At
@ViReturn
public Object getQuestion() {
return questionService.query(Cnd.where("qflag", "=", 2));
}
@At
@ViReturn
public Object getIssueById(String id) {
List<Question_issue> questionIssues = questionIssueService.query(Cnd.where("iqid", "=", id).asc("ipxbh"));
questionIssues.forEach(issue -> {
issue.setWors(questionWorService.query(Cnd.where("wiid", "=", issue.getIid()).asc("wpxbh")));
});
return questionIssues;
}
@At
@ViReturn
public Object saveAnswer(@Param("reply") Question_reply[] replys) {
for (Question_reply reply : replys) {
reply.setSave(false);
reply.setRidentity(R.UU32());
reply.setRtime(DateUtil.getDate());
questionReplyService.insert(reply);
}
return null;
}
}
@@ -1,256 +0,0 @@
package io.v.nutz.zhgh.fitnessWalk.controller;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.sys.models.Sys_user;
import io.v.nutz.web.commons.slog.annotation.SLog;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkActivity;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkPunchLottery;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkCommonService;
import io.v.nutz.zhgh.fitnessWalk.utils.WeAppCloudUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.random.R;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
/**
* 打卡抽奖
*/
@IocBean
@Ok("json")
@At("/platform/fitnessWalk/punchLottery")
public class FitnessWalkPunchLotteryController {
private final ReentrantLock lock = new ReentrantLock(true);
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
@Inject
private WeAppCloudUtil weAppCloudUtil;
@Inject
private RedisService redisService;
@At("")
@Ok("beetl:/platform/fitnessWalk/punchLottery.html")
public void index() {
}
/**
* 打卡完成之后抽奖
*
* @param activityId 活动Id
* @param userId 用户Id
* @return
*/
@At
public Result judgeWinningToPunch(String activityId, String userId) {
try {
if (StrUtil.isBlank(activityId) && StrUtil.isBlank(userId)) {
return Result.error("参数错误");
}
lock.lock();
int winingCount = fitnessWalkCommonService.dao().count(FitnessWalkPunchLottery.class, Cnd.where("activityId", "=", activityId).and("userId", "=", userId));
if (winingCount > 0) {
return null;
}
String redisKey = this.getClass().getName() + "#judgeWinningToPunch#activityid:" + activityId + "#PRIZELIST:";
String getPrizeIndexesKey = this.getClass().getName() + "#judgeWinningToPunch#activityid:" + activityId + "#GETPRIZEINDEXES:";
// redisService.del(getPrizeIndexesKey);
List<FitnessWalkActivity.PunchLotteryPrize> punchLotteryPrizes = new ArrayList<>();
String punchLotteryPrizesJson = redisService.get(redisKey);
if (StrUtil.isNotBlank(punchLotteryPrizesJson)) {
punchLotteryPrizes = JSON.parseArray(punchLotteryPrizesJson, FitnessWalkActivity.PunchLotteryPrize.class);
} else {
JSONObject prizeJsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.QUERY, "db.collection('activity').doc('%s').field({punchLotteryPrizes: true}).get()".formatted(activityId));
List<FitnessWalkActivity.PunchLotteryPrize> prizeList = JSON.parseObject((String) prizeJsonObject.getJSONArray("data").get(0)).getJSONArray("punchLotteryPrizes").toJavaList(FitnessWalkActivity.PunchLotteryPrize.class);
redisService.set(redisKey, JSON.toJSONString(prizeList));
punchLotteryPrizes = prizeList;
}
List<Integer> winningUserIndexList = null;
//奖项,抽取多少个
int sum = punchLotteryPrizes.stream().mapToInt(v -> Integer.parseInt(v.getNum())).sum();
//判断是否有key,可以获得奖项的下标数组
if (!redisService.exists(getPrizeIndexesKey)) {
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.QUERY, "db.collection('register').where({activity_id:'%s'}).count()".formatted(activityId));
JSONObject pager = jsonObject.getJSONObject("pager");
String total = pager.getString("Total");
//报名人数的一半,从这里的人中取数(最多抽取人数)
Integer lotteryNum = (int) Math.ceil(Double.parseDouble(total) / 2);
winningUserIndexList = generateRandomNumber(1, lotteryNum, sum);
redisService.set(getPrizeIndexesKey, JSON.toJSONString(winningUserIndexList));
} else {
String data = redisService.get(getPrizeIndexesKey);
winningUserIndexList = JSONObject.parseArray(data, Integer.class);
}
List<FitnessWalkPunchLottery> punchLotteryList = fitnessWalkCommonService.dao().query(FitnessWalkPunchLottery.class, Cnd.where("activityId", "=", activityId));
Sys_user user = fitnessWalkCommonService.dao().fetch(Sys_user.class, Cnd.where("id", "=", userId));
FitnessWalkPunchLottery punchLottery = new FitnessWalkPunchLottery();
punchLottery.setId(R.UU32());
punchLottery.setActivityId(activityId);
punchLottery.setUserId(userId);
punchLottery.setLoginName(user.getLoginname());
punchLottery.setUserName(user.getUsername());
punchLottery.setWinDate(new Date());
punchLottery.setIsRead(false);
punchLottery.setIsWin(false);
punchLottery.setIsExchange(false);
if (winningUserIndexList.contains((punchLotteryList.size()))) {
//奖项map
Map<String, String> prizeMap = punchLotteryPrizes.stream().collect(Collectors.toMap(v -> v.getValue(), v -> v.getName()));
//奖项池
List<String> prizeIdList = new ArrayList<>();
punchLotteryPrizes.forEach(v -> {
for (int i = 0; i < Integer.parseInt(v.getNum()); i++) {
prizeIdList.add(v.getValue());
}
});
//已经中奖的奖项ID集合
List<String> winPrizeIdList = punchLotteryList.stream().filter(v -> v.getIsWin()).map(v -> v.getPrizeId()).collect(Collectors.toList());
winPrizeIdList.forEach(prizeId -> {
int i = prizeIdList.indexOf(prizeId);
prizeIdList.remove(i);
});
Random random = new Random();
if (prizeIdList.size() != 0) {
int index = random.nextInt(prizeIdList.size());
// 获取随机元素
String winingPrizeId = prizeIdList.get(index);
String winingPrizeName = prizeMap.get(winingPrizeId);
punchLottery.setPrizeName(winingPrizeName);
punchLottery.setPrizeId(winingPrizeId);
punchLottery.setIsWin(true);
}
}
fitnessWalkCommonService.dao().insert(punchLottery);
if (punchLottery.getIsWin()) {
return Result.success().addData(punchLottery.getPrizeId());
} else {
return Result.success().addData(null);
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (lock.isLocked()) {
lock.unlock();
}
}
}
@At
public Result getLotteryRecord(String activityId, String userId) {
List<FitnessWalkPunchLottery> list = fitnessWalkCommonService.dao().query(FitnessWalkPunchLottery.class, Cnd.where("activityId", "=", activityId)
.and("userId", "=", userId));
return Result.success(list);
}
/**
* 兑奖
*
* @param id
* @return
*/
@At
public Result doExchange(String id) {
int count = fitnessWalkCommonService.dao().count(FitnessWalkPunchLottery.class, Cnd.where("id", "=", id).and("isExchange", "=", 1));
//返回2 "该二维码已兑奖!"
if (count > 0) return Result.success(2);
int update = fitnessWalkCommonService.dao().update(FitnessWalkPunchLottery.class,
Chain.make("isExchange", 1).add("exchangeDate", new Date()),
Cnd.where("id", "=", id));
return update > 0 ? Result.success() : Result.error();
}
/**
* 改为已读
*
* @param activityId
* @param userId
* @return
*/
@At
public Result doReadLottery(String activityId, String userId) {
fitnessWalkCommonService.dao().update(FitnessWalkPunchLottery.class, Chain.make("isRead", 1),
Cnd.where("userId", "=", userId).and("activityId", "=", activityId));
return Result.success();
}
/**
* 查看获奖人员
*
* @return
*/
@At
public Result getPunchWining(String activityId) {
List<FitnessWalkPunchLottery> punchLotteryList = fitnessWalkCommonService.dao().query(FitnessWalkPunchLottery.class,
Cnd.where("isWin", "=", 1).and("activityId", "=", activityId));
return Result.success(punchLotteryList);
}
/**
* 生成随机数,该随机数为中奖人
*
* @param minNum 最小值
* @param maxNum 最多抽取多少人
* @param count 抽几个
* @return
*/
public List<Integer> generateRandomNumber(Integer minNum, Integer maxNum, Integer count) {
Set<Integer> randomNumbers = new HashSet<>();
Random rand = new Random();
//如果是 抽奖人数小于了 奖品数量,会陷入死循环
if (maxNum <= count) {
for (int i = 0; i <= maxNum; i++) {
randomNumbers.add(i + 1);
}
} else {
while (randomNumbers.size() < count) {
int randomNum = rand.nextInt(maxNum - minNum + 1) + minNum;
randomNumbers.add(randomNum);
}
}
return new ArrayList<>(randomNumbers);
}
}
@@ -3,33 +3,21 @@ package io.v.nutz.zhgh.fitnessWalk.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.wizzer.framework.base.Result;
import com.alibaba.fastjson.JSONObject;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.utils.ViTool;
import io.v.nutz.sys.models.Sys_union;
import io.v.nutz.zhgh.fitnessWalk.contants.Cascader;
import io.v.nutz.zhgh.fitnessWalk.contants.FitnessWalkMode;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkActivity;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkCommonService;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkPunchStatisticsService;
import io.v.nutz.zhgh.fitnessWalk.utils.WeAppCloudUtil;
import org.apache.commons.lang3.StringUtils;
import io.v.nutz.sys.models.Sys_union;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@@ -37,12 +25,9 @@ import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* 打卡统计
@@ -1,16 +1,11 @@
package io.v.nutz.zhgh.fitnessWalk.controller;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateBetween;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.page.Pagination;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkActivity;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkAwardUser;
@@ -35,7 +30,10 @@ import org.nutz.mvc.annotation.Ok;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@IocBean
@@ -75,8 +73,19 @@ public class FitnessWalkStepManageController {
return Result.error("上传步数失败,请重新登录后再次上传!");
}
DateTime activityStartDate = DateUtil.date(start_time);
DateTime activityEndDate = DateUtil.date(end_time);
/*DateTime activityStartDate = DateUtil.date(start_time);
DateTime activityEndDate = DateUtil.date(end_time);*/
// FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
//
// Date startDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getStartTime()), "yyyy-MM-dd"), "yyyy-MM-dd");
// Date endDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getEndTime()), "yyyy-MM-dd"), "yyyy-MM-dd");
Date startDate = DateUtil.parse("2025-04-01 00:00:00", "yyyy-MM-dd HH:mm:ss");
Date endDate = DateUtil.parse("2025-05-06 23:59:59", "yyyy-MM-dd HH:mm:ss");
if (!DateUtil.isIn(DateUtil.date(), startDate, endDate)) {
return Result.error("已过活动时间,无法上传步数");
}
List<NutMap> steps = Json.fromJsonAsList(NutMap.class, monthSteps);
@@ -195,7 +204,6 @@ public class FitnessWalkStepManageController {
// cnd.and("DATE(applyDate)",">=",DateUtil.format(startDate, "yyyy-MM-dd"));
// cnd.and("DATE(applyDate)","<=",DateUtil.format(endDate, "yyyy-MM-dd"));
// }
FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
DateTime startTime = DateUtil.date(activity.getStartTime());
DateTime endTime = DateUtil.date(activity.getEndTime());
@@ -209,7 +217,7 @@ public class FitnessWalkStepManageController {
List<FitnessWalkStep> stepList = baseService.dao().query(FitnessWalkStep.class, cnd);
return stepList.stream().map(v -> {
return Map.of("step", v.getStep(), "timestamp", v.getApplyDate().getTime()/1000);
return Map.of("step", v.getStep(), "timestamp", v.getApplyDate().getTime());
}).collect(Collectors.toList());
// userStepList.addAll(stepList.stream().map(FitnessWalkStep::getStep).collect(Collectors.toList()));
@@ -280,7 +288,6 @@ public class FitnessWalkStepManageController {
.and("activityId", "=", activityId)
.and("DATE(applyDate)", ">=", DateUtil.format(DateUtil.date(activity.getStartTime()), "yyyy-MM-dd"))
.and("DATE(applyDate)", "<=", DateUtil.format(DateUtil.date(activity.getEndTime()), "yyyy-MM-dd"))
.groupBy("applyDate")
);
List<NutMap> result = new ArrayList<>();
@@ -308,10 +315,6 @@ public class FitnessWalkStepManageController {
nutMap.put("userComplianceSumDay", partSteps.stream().filter(s -> s.getStep() > lotteryQualificationStep).count());
//总达标天数
nutMap.put("complianceSumDay", lotteryQualificationDay);
//开始时间
nutMap.put("startDate",rule.getStartDate());
//结束时间
nutMap.put("endDate",rule.getEndDate());
} else if (lotteryQualificationDay == null && lotteryQualificationStep != null) {
//总步数
nutMap.put("mode", "customLotterySumStepMode");
@@ -319,6 +322,9 @@ public class FitnessWalkStepManageController {
nutMap.put("userSumStep", partSteps.stream().mapToInt(s -> s.getStep()).sum());
//总达标步数
nutMap.put("complianceSumStep", lotteryQualificationStep);
nutMap.put("title", DateUtil.format(rule.getStartDate(), "MM月dd日") + "" + DateUtil.format(rule.getEndDate(), "MM月dd日"));
}
result.add(nutMap);
}
@@ -337,19 +343,19 @@ public class FitnessWalkStepManageController {
@At
@Ok("json:full")
public Result winningRecord(String activityId, String userId) {
/*List<FitnessWalkAwardUser> awardUsers = baseService.dao().query(FitnessWalkAwardUser.class,
Sql sql = Sqls.create("""
select awardName,startDate,endDate from fitness_walk_award_user where activityId=@activityId and userId=@userId and isRead=@isRead
""").setParam("activityId",activityId).setParam("userId", userId).setParam("isRead",true);
/* List<FitnessWalkAwardUser> awardUsers = baseService.dao().query(FitnessWalkAwardUser.class,
Cnd.where("activityId", "=", activityId)
.and("userId", "=", userId));
baseService.dao().update(FitnessWalkAwardUser.class, Chain.make("isRead", 1),
Cnd.where("activityId", "=", activityId)
.and("userId", "=", userId));*/
return Result.success(new ArrayList<>());
.and("userId", "=", userId).and("isRead", "=", true));*/
return Result.success(baseService.listMap(sql));
}
@At
@Ok("json:full")
public Result hasReadAward(String id) {
baseService.dao().update(FitnessWalkAwardUser.class, Chain.make("isRead", 1), Cnd.where("id", "=", id));
public Result hasReadAward(String activityId) {
return Result.success();
}
@@ -0,0 +1,293 @@
package io.v.nutz.zhgh.fitnessWalk.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.base.utils.ViTool;
import io.v.nutz.zhgh.fitnessWalk.contants.FitnessWalkMode;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkAwardUser;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkRaffleRules;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkRaffleUser;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkCommonService;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkStepRaffleService;
import io.v.nutz.base.query.PageForm;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.aop.interceptor.ioc.TransAop;
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.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
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.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameFitnessWalkStepRaffleController
* @Date 2024/12/27 14:43
* @注释 健步走抽奖控制器
*/
@Ok("json")
@IocBean
@At("/platform/fitnessWalk/stepRaffle")
public class FitnessWalkStepRaffleController {
@Inject
private BaseService baseService;
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
@Inject
private FitnessWalkStepRaffleService fitnessWalkStepRaffleService;
@At("")
@Ok("beetl:/platform/fitnessWalk/stepRaffle.html")
@RequiresPermissions("fitnessWalk.stepRaffle")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("fitnessWalk.stepRaffle")
public Object pageData(PageForm pageForm,
@Param(value = "activityId", required = false) String activityId,
@Param(value = "unionId", required = false) String unionId,
@Param(value = "unitId", required = false) String unitId){
Sql sql = fitnessWalkStepRaffleService.getRaffleSql(pageForm, activityId, unionId, unitId);
return baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@At
@ViReturn
@RequiresPermissions("fitnessWalk.stepRaffle")
public Object getCascadersActivity(@Param(value = "year") int year) {
return fitnessWalkCommonService.cascaderActivity(year, FitnessWalkMode.STEP_COUNT);
}
/**
* 手动抽奖规则
* @param fitnessWalkRaffleRules
* @return
*/
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("fitnessWalk.stepRaffle")
public Object saveRaffle(FitnessWalkRaffleRules fitnessWalkRaffleRules){
baseService.dao().insertOrUpdate(fitnessWalkRaffleRules);
fitnessWalkStepRaffleService.manualLottery(fitnessWalkRaffleRules.getActivityId());
return null;
}
@At
@ViReturn
@RequiresPermissions("fitnessWalk.stepRaffle")
public Object getRaffle(String activityId){
return baseService.dao().fetch(FitnessWalkRaffleRules.class, Cnd.where("activityId", "=", activityId));
}
/**
* 小程序获取奖项信息
* @param activityId
* @return
*/
@At
@ViReturn
public Object getAwardList(String activityId){
return fitnessWalkStepRaffleService.getActivityAwardList(activityId);
}
/**
* 小程序获取自己的中奖信息
* @return
*/
@At
@ViReturn
public Object getAwardInfo(String activityId, String userId){
Dao dao = fitnessWalkStepRaffleService.dao();
FitnessWalkAwardUser awardUser = dao.fetch(FitnessWalkAwardUser.class, Cnd.where("activityId", "=", activityId).and("userId", "=", userId));
FitnessWalkRaffleUser raffleUser = dao.fetch(FitnessWalkRaffleUser.class, Cnd.where("activityId", "=", activityId).and("userId", "=", userId));
NutMap map = NutMap.NEW();
if (Lang.isNotEmpty(raffleUser) && !raffleUser.getIsRaffle()) {
if (Lang.isNotEmpty(awardUser)) {
map.put("awardName", awardUser.getAwardName());
} else {
map.put("awardName", "没有中奖");
}
map.put("raffleNum", 1);
} else {
map.put("raffleNum", 0);
}
return map;
}
/**
* 小程序获取查询是否可以抽奖
* @return
*/
@At
public Object checkRaffle(String activityId, String userId){
Dao dao = fitnessWalkStepRaffleService.dao();
FitnessWalkRaffleUser raffleUser = dao.fetch(FitnessWalkRaffleUser.class,
Cnd.where("activityId", "=", activityId)
.and("userId", "=", userId));
if (Lang.isNotEmpty(raffleUser)) {
return raffleUser.getIsRaffle() ? Result.error() : Result.success();
} else {
return Result.error();
}
}
/**
* 抽奖成功后,修改数据库状态
* @param activityId
* @param userId
* @return
*/
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
public Object updateUserAward(String activityId, String userId) {
fitnessWalkStepRaffleService.dao().update(FitnessWalkAwardUser.class,
Chain.make("isRead", true).add("applyDate", DateUtil.date()),
Cnd.where("activityId", "=", activityId).and("userId", "=", userId));
fitnessWalkStepRaffleService.dao().update(FitnessWalkRaffleUser.class,
Chain.make("isRaffle", true),
Cnd.where("activityId", "=", activityId).and("userId", "=", userId));
return null;
}
@At
@ViReturn
@Ok("void")
@RequiresPermissions("fitnessWalk.stepRaffle")
public void exportAwardExcel(String searchKeyword, String activityId,
String lotteryTime, HttpServletResponse response) {
Cnd cnd = Cnd.NEW();
cnd.andEX("activityId", "=", activityId);
cnd.andEX("awardName", "=", lotteryTime);
if (StrUtil.isNotBlank(searchKeyword)) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("username", searchKeyword);
seg.orLike("loginName", searchKeyword);
cnd.and(seg);
}
cnd.and("isRead", "=", true);
List<FitnessWalkAwardUser> list = fitnessWalkCommonService.dao().query(FitnessWalkAwardUser.class, cnd);
for (FitnessWalkAwardUser awardUser : list) {
awardUser.setApplyDate2(DateUtil.formatDateTime(awardUser.getApplyDate()));
}
List<ExcelExportEntity> entityList = new ArrayList<>();
ExcelExportEntity no = new ExcelExportEntity("序号", "no", 10);
no.setFormat("isAddIndex");
entityList.add(no);
entityList.add(new ExcelExportEntity("工号", "loginName", 20));
entityList.add(new ExcelExportEntity("姓名", "username", 20));
entityList.add(new ExcelExportEntity("分工会", "unionName", 20));
entityList.add(new ExcelExportEntity("单位", "unitName", 40));
entityList.add(new ExcelExportEntity("奖项名称", "awardName", 20));
entityList.add(new ExcelExportEntity("中奖时间", "applyDate2", 20));
try {
ViTool.excelResponse(response, "健步走中奖人员名单.xlsx");
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, list);
workbook.write(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@ViReturn
@Ok("void")
@RequiresPermissions("fitnessWalk.stepRaffle")
public void exportExcel(String searchKeyword, String activityId, String unionId,
String unitId, HttpServletResponse response) {
PageForm pageForm = new PageForm();
pageForm.setSearchKeyword(searchKeyword);
Sql sql = fitnessWalkStepRaffleService.getRaffleSql(pageForm, activityId, unionId, unitId);
// Sql sql = Sqls.create("""
// SELECT
// ru.*,
// u.sex,
// u.unionname AS unionName,
// u.unitname AS unitName
// FROM
// fitness_walk_raffle_user ru left join `user` u on ru.userId = u.id
// $condition
// """);
// Cnd cnd = Cnd.NEW();
// cnd.andEX("ru.activityId", "=", activityId);
// cnd.andEX("u.unionid", "=", unionId);
// cnd.andEX("u.unitid", "=", unitId);
// if (StrUtil.isNotBlank(searchKeyword)) {
// SqlExpressionGroup seg = new SqlExpressionGroup();
// seg.orLike("ru.username", searchKeyword);
// seg.orLike("ru.loginName", searchKeyword);
// cnd.and(seg);
// }
// sql.setCondition(cnd);
List<NutMap> list = fitnessWalkStepRaffleService.listMap(sql);
List<ExcelExportEntity> entityList = new ArrayList<>();
ExcelExportEntity no = new ExcelExportEntity("序号", "no", 10);
no.setFormat("isAddIndex");
entityList.add(no);
entityList.add(new ExcelExportEntity("工号", "loginname", 20));
entityList.add(new ExcelExportEntity("姓名", "username", 20));
entityList.add(new ExcelExportEntity("分工会", "unionname", 20));
entityList.add(new ExcelExportEntity("单位", "unitname", 40));
entityList.add(new ExcelExportEntity("达标天数", "standardsDays", 20));
entityList.add(new ExcelExportEntity("步数", "total_steps", 20));
try {
ViTool.excelResponse(response, "健步走达标人员名单.xlsx");
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, list);
workbook.write(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -7,16 +7,13 @@ import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.base.utils.ViTool;
import io.v.nutz.sys.models.Sys_user;
import io.v.nutz.web.commons.slog.annotation.SLog;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.fitnessWalk.contants.FitnessWalkMode;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkActivity;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkCommonService;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.web.commons.slog.annotation.SLog;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -24,8 +21,6 @@ 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.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@@ -35,7 +30,6 @@ import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 步数排行榜
@@ -63,7 +57,6 @@ public class FitnessWalkStepRankingController {
@At
@ViReturn
@RequiresPermissions("fitnessWalk.stepRanking")
@SLog(type = "健身走", tag = "步数排行榜", msg = "获取排行榜", param = true, result = false)
public Object pageData(PageForm pageForm,
@Param(value = "activityId", required = false) String activityId,
@Param(value = "unionId", required = false) String unionId,
@@ -77,13 +70,13 @@ public class FitnessWalkStepRankingController {
* 获取所有教工 今天的步数及活动时间范围内的步数
*
* @param activityId
* @param mode day:今天 week:周 month:月 all:所有
* @param mode day:今天 all:所有
* @return {@link Object}
*/
@At
@Ok("json:full")
@ViReturn
// @SLog(type = "校工会特色活动",tag = "健身走-计步步数排行榜",msg = "小程序接口(获取今日步数及活动范围内步数)",param = true,result = true)
@SLog(type = "校工会特色活动", tag = "健身走-计步步数排行榜", msg = "小程序接口(获取今日步数及活动范围内步数)", param = true, result = true)
public Object getUserStepRanking(String activityId, String mode, Integer pageNumber, Integer pageSize) {
if (mode.equals("day")) {
Sql sql = Sqls.create("""
@@ -97,83 +90,88 @@ public class FitnessWalkStepRankingController {
WHERE
t.activityId = @activityId
AND t.applyDate = @today
GROUP BY
t.userId
ORDER BY t.step DESC,u.loginname DESC
ORDER BY t.step DESC
""");
sql.setParam("activityId", activityId);
sql.setParam("today", DateUtil.today());
return baseService.listPageMap(pageNumber, pageSize, sql);
}else if(mode.equals("week")){
} else if (mode.equals("week")) {
Date startOfWeek = DateUtil.beginOfWeek(new Date());
Date endOfWeek = DateUtil.endOfWeek(new Date());
Sql sql = Sqls.create("""
SELECT
t.userId,
sum( t.step ) AS step,
u.username
sum( t.step ) AS step,
u.username
FROM
`fitness_walk_step` t
LEFT JOIN sys_user u ON u.id = t.userId
`fitness_walk_step` t
LEFT JOIN sys_user u ON u.id = t.userId
WHERE
t.activityId = @activityId
AND t.applyDate >= @startTime
AND t.applyDate <= @endTime
GROUP BY
t.userId
t.userId
ORDER BY
step DESC
step DESC
""");
sql.setParam("activityId", activityId);
sql.setParam("startTime", startOfWeek);
sql.setParam("endTime", endOfWeek);
return baseService.listPageMap(pageNumber, pageSize, sql);
} else if(mode.equals("month")){
} else if (mode.equals("month")) {
Date firstDayOfMonth = DateUtil.beginOfMonth(new Date());
Date lastDayOfMonth = DateUtil.endOfMonth(new Date());
Sql sql = Sqls.create("""
SELECT
t.userId,
sum( t.step ) AS step,
u.username
sum( t.step ) AS step,
u.username
FROM
`fitness_walk_step` t
LEFT JOIN sys_user u ON u.id = t.userId
`fitness_walk_step` t
LEFT JOIN sys_user u ON u.id = t.userId
WHERE
t.activityId = @activityId
AND t.applyDate >= @startTime
AND t.applyDate <= @endTime
GROUP BY
t.userId
t.userId
ORDER BY
step DESC
step DESC
""");
sql.setParam("activityId", activityId);
sql.setParam("startTime", firstDayOfMonth);
sql.setParam("endTime", lastDayOfMonth);
return baseService.listPageMap(pageNumber, pageSize, sql);
}else if (mode.equals("all")) {
} else if (mode.equals("all")) {
FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
DateTime startTime = DateUtil.date(activity.getStartTime());
DateTime endTime = DateUtil.date(activity.getEndTime());
Sql sql = Sqls.create("""
SELECT
t.userId,
sum( t.step ) AS step,
u.username
FROM
`fitness_walk_step` t
LEFT JOIN sys_user u ON u.id = t.userId
WHERE
t.activityId = @activityId
AND t.applyDate >= @startTime
AND t.applyDate <= @endTime
SUM(sub.max_step) AS step,
u.username
FROM (
SELECT
userId,
activityId,
applyDate,
MAX(step) AS max_step
FROM
fitness_walk_step
WHERE
activityId = @activityId
AND applyDate >= @startTime AND applyDate <= @endTime
GROUP BY
userId,
activityId,
applyDate
) sub
left join `user` u ON u.id = sub.userId
GROUP BY
t.userId
userId
ORDER BY
step DESC
step desc
""");
sql.setParam("activityId", activityId);
sql.setParam("startTime", startTime);
@@ -187,7 +185,7 @@ public class FitnessWalkStepRankingController {
@At
@Ok("void")
@SLog(type = "校工会特色活动",tag = "健身走-计步步数排行榜",msg = "步数排行榜导出",param = true,result = true)
@SLog(type = "校工会特色活动", tag = "健身走-计步步数排行榜", msg = "步数排行榜导出", param = true, result = true)
@RequiresPermissions("fitnessWalk.stepRanking")
public void exportExcel(@Param(value = "searchName", required = false) String searchName,
@Param(value = "searchKeyword", required = false) String searchKeyword,
@@ -206,10 +204,9 @@ public class FitnessWalkStepRankingController {
entityList.add(new ExcelExportEntity("工号", "loginname", 20));
entityList.add(new ExcelExportEntity("分工会", "unionname", 20));
entityList.add(new ExcelExportEntity("单位", "unitname", 20));
entityList.add(new ExcelExportEntity("today".equals(mode) ? "今日步数" :"活动期间总步数", "total_steps", 20));
entityList.add(new ExcelExportEntity("达标天数(天)","standardsDays",20));
entityList.add(new ExcelExportEntity("today".equals(mode) ? "今日步数" : "活动期间总步数", "total_steps", 20));
try {
ViTool.excelResponse(response, ( "today".equals(mode) ? DateUtil.format(new Date(),"yyyy年MM月dd日") : "活动期间总") + "步数榜.xlsx");
ViTool.excelResponse(response, ("today".equals(mode) ? DateUtil.format(new Date(), "yyyy年MM月dd日") : "活动期间总") + "步数榜.xlsx");
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, stepRankingList);
@@ -5,23 +5,15 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.base.utils.ViTool;
import io.v.nutz.zhgh.fitnessWalk.contants.FitnessWalkMode;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkActivity;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkStep;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkCommonService;
import io.v.nutz.zhgh.fitnessWalk.utils.WeAppCloudUtil;
import io.v.nutz.base.query.PageForm;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
@@ -31,15 +23,14 @@ import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.List;
@IocBean
@Ok("json")
@@ -110,7 +101,7 @@ public class FitnessWalkStepStatisticsController {
cnd.andEX("u.unitId", "=", unitId);
cnd.desc("al.applyDate");
cnd.desc("u.unioncode");
cnd.groupBy("al.applyDate","al.userId");
cnd.groupBy("al.applyDate", "al.userId");
sql.setCondition(cnd);
return baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
@@ -141,7 +132,6 @@ public class FitnessWalkStepStatisticsController {
cnd.andEX("u.unitId", "=", unitId);
cnd.desc("al.applyDate");
cnd.desc("u.unioncode");
cnd.groupBy("al.applyDate","al.userId");
sql.setCondition(cnd);
List<NutMap> exportList = baseService.listMap(sql);
@@ -3,26 +3,21 @@ package io.v.nutz.zhgh.fitnessWalk.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.expression.Exp;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.web.commons.slog.annotation.SLog;
import io.v.nutz.zhgh.fitnessWalk.contants.FitnessWalkMode;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkActivity;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkAwardUser;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkCommonService;
import io.v.nutz.web.commons.slog.annotation.SLog;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@@ -32,9 +27,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@@ -69,7 +62,7 @@ public class FitnessWalkStepWiningController {
@At
@Ok("json:full")
@ViReturn
@SLog(type = "校工会特色活动", tag = "健身走-计步步数中奖榜", msg = "获取中奖榜", param = true, result = true)
@SLog(type = "校工会特色活动",tag = "健身走-计步步数中奖榜",msg = "获取中奖榜",param = true,result = true)
public Object getUserStepWining(String activityId) {
return fitnessWalkCommonService.getWiningRankingUserList(activityId);
}
@@ -84,9 +77,9 @@ public class FitnessWalkStepWiningController {
@At
@Ok("void")
@SLog(type = "校工会特色活动", tag = "健身走-计步步数中奖榜", msg = "导出中奖榜", param = true, result = true)
@SLog(type = "校工会特色活动",tag = "健身走-计步步数中奖榜",msg = "导出中奖榜",param = true,result = true)
@RequiresPermissions("fitnessWalk.stepWining")
public void exportUserStepWining(String activityId, HttpServletResponse response) {
public void exportUserStepWining(String activityId, HttpServletResponse response){
List<NutMap> winingRankingUserList = fitnessWalkCommonService.getWiningRankingUserList(activityId);
List<ExcelExportEntity> entityList = new ArrayList<>();
ExcelExportEntity no = new ExcelExportEntity("序号", "no", 10);
@@ -95,8 +88,9 @@ public class FitnessWalkStepWiningController {
entityList.add(new ExcelExportEntity("工号", "loginName", 20));
entityList.add(new ExcelExportEntity("姓名", "username", 20));
entityList.add(new ExcelExportEntity("分工会", "unionName", 20));
entityList.add(new ExcelExportEntity("单位", "unitName", 20));
entityList.add(new ExcelExportEntity("单位", "unitName", 40));
entityList.add(new ExcelExportEntity("奖项名称", "awardName", 20));
entityList.add(new ExcelExportEntity("步数", "awardSteps", 20));
entityList.add(new ExcelExportEntity("中奖时间", "applyDate", 20));
try {
response.setContentType("application/octet-stream");
@@ -105,8 +99,8 @@ public class FitnessWalkStepWiningController {
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
for (NutMap map : winingRankingUserList) {
List<NutMap> awardList = map.getAsList("awardList", NutMap.class);
awardList.forEach(v -> v.setv("applyDate", DateUtil.format(v.getTime("applyDate"), "yyyy-MM-dd")));
zipOutputStream.putNextEntry(new ZipEntry(map.getString("title") + ".xls"));
awardList.forEach(v->v.setv("applyDate",DateUtil.format(v.getTime("applyDate"),"yyyy-MM-dd")));
zipOutputStream.putNextEntry(new ZipEntry(map.getString("title") + ".xlsx"));
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entityList, awardList);
workbook.write(zipOutputStream);
zipOutputStream.closeEntry();
@@ -126,6 +120,7 @@ public class FitnessWalkStepWiningController {
* @return
*/
@At
@ViReturn
public Result prizeOption(String activityId) {
List<NutMap> list = fitnessWalkCommonService.prizeOption(activityId);
return Result.success(list);
@@ -133,16 +128,28 @@ public class FitnessWalkStepWiningController {
/**
* 中奖用户
*
* @param lotteryTime
* @param activityId
* @return
*/
@At
public Result prizeUsers(String lotteryTime, String activityId) {
// List<NutMap> list = fitnessWalkCommonService.prizeOption(activityId);
List<FitnessWalkAwardUser> awardUserList = fitnessWalkCommonService.dao().query(FitnessWalkAwardUser.class,
Cnd.where("activityId", "=", activityId).and("applyDate", "like", lotteryTime.substring(0, lotteryTime.length() - 3) + "%"));
public Result prizeUsers(String lotteryTime, String activityId, String searchKeyword) {
Cnd cnd = Cnd.NEW();
cnd.andEX("activityId", "=", activityId);
cnd.andEX("awardName", "=", lotteryTime);
if (StrUtil.isNotBlank(searchKeyword)) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("username", searchKeyword);
seg.orLike("loginName", searchKeyword);
cnd.and(seg);
}
cnd.and("isRead", "=", true);
List<FitnessWalkAwardUser> awardUserList = fitnessWalkCommonService.dao().query(FitnessWalkAwardUser.class, cnd);
// String lotteryDate = lotteryTime.substring(0, 10);
// List<FitnessWalkAwardUser> awardUserList = fitnessWalkCommonService.dao().query(FitnessWalkAwardUser.class,
// Cnd.where("activityId", "=", activityId).and("date(applyDate)", "=", lotteryDate));
return Result.success(awardUserList);
}
}
@@ -0,0 +1,75 @@
package io.v.nutz.zhgh.fitnessWalk.controller;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import io.v.nutz.sys.services.SysUserService;
import org.nutz.dao.Cnd;
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;
/**
* @author: Aaron
* @create: 2020-09-11 13:50
* @description: 小程序登录
**/
@At("/platform/jsz/login")
@Ok("json:full")
@IocBean
public class loginController {
@Inject
private SysUserService sysUserService;
@At("/")
public Object index(String username, String loginname) {
try {
Sql sql = Sqls.create("""
SELECT
u.id userid,
u.username,
u.loginname,
u.sex,
u.mobile,
u.birthday,
unit.`name` unitname,
u.unitid,
u.member,
unit.unionid,
un.unionname,
group_concat(sr.`code`) roles
FROM
sys_user u
LEFT JOIN sys_unit unit ON u.unitid = unit.id
LEFT JOIN sys_union un ON unit.unionid = un.id
LEFT JOIN sys_user_role sur ON sur.userId = u.id
LEFT JOIN sys_role sr ON sr.id = sur.roleId
$condition
""").setParam("loginname", loginname).setParam("username", username);
Cnd cnd = Cnd.NEW();
cnd.and("LOWER(u.loginname)", "=", loginname.trim().toLowerCase());
cnd.and("LOWER(u.username)", "=", username.trim().toLowerCase());
sql.setCondition(cnd);
sql.setCallback(Sqls.callback.map());
sysUserService.dao().execute(sql);
NutMap user = (NutMap) sql.getResult();
if (StrUtil.isBlank(user.getString("userid"))) {
return Result.error().addMsg("系统查询不到您的信息,请与工会管理员联系!");
}
// if(user.getInt("member",0)==0){
// return Result.error().addMsg("您没有权限参加本次健步行,请与工会管理员联系!");
// }
/*if (user.getInt("member", 0) != 1 && !user.getString("sex", "").equals("")) {
return Result.error().addMsg("您没有权限参加本次健步行,请与工会管理员联系!");
}*/
return Result.success().addData(user);
} catch (Exception e) {
return Result.error();
}
}
}
@@ -45,9 +45,11 @@ public class FitnessWalkActivity {
private Boolean isQuestion;
private String questionId;
private String speedControlMode;
//打卡完成之后 gift_voucher:礼品券 cert:完赛证书
//打卡完成之后 gift_voucher:礼品券 cert:完赛证书 null啥也不干
private String punchFinishAfter;
//完赛证书
@@ -62,6 +64,8 @@ public class FitnessWalkActivity {
//打卡模式奖品列表
private List<PunchLotteryPrize> punchLotteryPrizes;
private Boolean showGiftTicket;
private List<Pts> pts;
private List<Point> linePoints;
@@ -97,6 +101,17 @@ public class FitnessWalkActivity {
//是否开启距离限制
private Boolean enableDistance;
//签到几个点位算完成
private Integer finishPointNum;
// 是否自动抽奖
private Boolean isAutoLottery;
// 手动抽奖抽奖资格天数
private Integer lotteryQualificationDays;
// 手动抽奖抽奖资格步数
private Integer lotteryQualificationSteps;
@Data
public static class Point implements Serializable {
private String type;
@@ -59,6 +59,16 @@ public class FitnessWalkAwardUser extends BaseModel {
@Comment("单位id")
private String unitId;
@Column
@ColDefine(type = ColType.INT)
@Comment("达标天数")
private Integer standardsDays;
@Column
@ColDefine(type = ColType.VARCHAR, width = 20)
@Comment("中奖步数")
private String awardSteps;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("单位名称")
@@ -68,9 +78,20 @@ public class FitnessWalkAwardUser extends BaseModel {
@ColDefine(type = ColType.DATETIME)
@Comment("中奖时间")
private Date applyDate;
private String applyDate2;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否已读")
private Boolean isRead;
@Column
@ColDefine(type = ColType.DATE)
@Comment("开始时间")
private Date startDate;
@Column
@ColDefine(type = ColType.DATE)
@Comment("结束时间")
private Date endDate;
}
@@ -20,20 +20,10 @@ public class FitnessWalkPunchLottery extends BaseModel {
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动Id")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("用户Id")
private String userId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("用户工号")
private String loginName;
@Comment("活动")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@@ -46,7 +36,7 @@ public class FitnessWalkPunchLottery extends BaseModel {
private String prizeName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@ColDefine(type = ColType.VARCHAR, width = 20)
@Comment("奖品")
private String prizeId;
@@ -57,22 +47,7 @@ public class FitnessWalkPunchLottery extends BaseModel {
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("中奖时间")
@Comment("是否中奖")
private Date winDate;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否已读")
private Boolean isRead;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("兑奖时间")
private Date exchangeDate;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否兑换")
private Boolean isExchange;
}
@@ -0,0 +1,53 @@
package io.v.nutz.zhgh.fitnessWalk.model;
import io.v.nutz.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameFitenssWalkRaffleRules
* @Date 2024/12/28 10:05
* @注释
*/
@Data
@Table
@EqualsAndHashCode(callSuper = true)
public class FitnessWalkRaffleRules extends BaseModel {
@Column
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR)
@Comment("活动id")
private String activityId;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("手动抽奖规则")
private List<ManualLotteryRules> manualLotteryRules;
@Data
public static class ManualLotteryRules implements Serializable {
// 奖项名称
private String awardName;
// 抽奖人数
private Integer lotteryUserNum;
// 抽奖类型
private String raffleType;
// 排名位次
private Integer rankingPosition;
// 是否兼得
private Boolean isSimultaneously;
}
}
@@ -0,0 +1,61 @@
package io.v.nutz.zhgh.fitnessWalk.model;
import io.v.nutz.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @version 1.0
* @Author zzr
* @nameFitnessWalkRaffleUser
* @Date 2024/12/28 17:10
* @注释
*/
@Data
@Table
@EqualsAndHashCode(callSuper = true)
public class FitnessWalkRaffleUser extends BaseModel {
@Column
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动id")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("用户id")
private String userId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("用户工号")
private String loginName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("用户姓名")
private String username;
@Column
@ColDefine(type = ColType.INT)
@Comment("达标天数")
private Integer standardsDays;
@Column
@ColDefine(type = ColType.VARCHAR, width = 20)
@Comment("中奖步数")
private String awardSteps;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否已抽奖")
private Boolean isRaffle;
}
@@ -82,4 +82,5 @@ public interface FitnessWalkCommonService extends ViService {
* @return
*/
List<NutMap> prizeOption(String activityId);
}
@@ -0,0 +1,34 @@
package io.v.nutz.zhgh.fitnessWalk.service;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkRaffleRules;
import io.v.nutz.base.query.PageForm;
import org.nutz.dao.sql.Sql;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameFitnessWalkStepRaffleService
* @Date 2024/12/28 11:13
* @注释
*/
public interface FitnessWalkStepRaffleService extends BaseService<FitnessWalkRaffleRules> {
Sql getRaffleSql(PageForm pageForm, String activityId, String unionId, String unitId);
/**
* 获取活动的奖项
* @param activityId
* @return
*/
List<NutMap> getActivityAwardList(String activityId);
/**
* 手动抽奖
* @param activityId 活动id
*/
void manualLottery(String activityId);
}
@@ -2,25 +2,23 @@ package io.v.nutz.zhgh.fitnessWalk.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.db.Page;
import cn.wizzer.framework.page.Pagination;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.sys.models.Sys_task;
import io.v.nutz.sys.models.Sys_user;
import io.v.nutz.sys.services.SysTaskService;
import io.v.nutz.task.services.TaskPlatformService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.fitnessWalk.contants.Cascader;
import io.v.nutz.zhgh.fitnessWalk.contants.FitnessWalkMode;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkActivity;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkAwardUser;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkCommonService;
import io.v.nutz.zhgh.fitnessWalk.utils.WeAppCloudUtil;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.sys.models.Sys_task;
import io.v.nutz.sys.services.SysTaskService;
import io.v.nutz.task.services.TaskPlatformService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
@@ -37,7 +35,6 @@ import org.nutz.lang.util.NutMap;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@IocBean(args = {"refer:dao"})
@@ -72,6 +69,7 @@ public class FitnessWalkCommonServiceImpl extends ViServiceImpl implements Fitne
String redisKey = "FitnessWalk:" + activityId;
Boolean exists = redisService.exists("FitnessWalk:" + activityId);
FitnessWalkActivity activity = null;
exists = false;
if (exists) {
String string = redisService.get(redisKey);
activity = JSONObject.parseObject(string, FitnessWalkActivity.class);
@@ -90,7 +88,7 @@ public class FitnessWalkCommonServiceImpl extends ViServiceImpl implements Fitne
activity.setTempCover(tempUrl);
}
if (Strings.isNotBlank(activity.getCompletionCertificateCover())) {
if(Strings.isNotBlank(activity.getCompletionCertificateCover())){
String tempUrl = weAppCloudUtil.httpFile(activity.getCompletionCertificateCover());
activity.setTempCompletionCertificateCover(tempUrl);
}
@@ -114,20 +112,21 @@ public class FitnessWalkCommonServiceImpl extends ViServiceImpl implements Fitne
activity.setTempCover(tempCover);
}
if (Strings.isNotBlank(activity.getCompletionCertificateCover())) {
if(Strings.isNotBlank(activity.getCompletionCertificateCover())){
String tempUrl = weAppCloudUtil.httpFile(activity.getCompletionCertificateCover());
activity.setTempCompletionCertificateCover(tempUrl);
}
redisService.setex(redisKey, CACHE_TIME, JSONObject.toJSONString(activity));
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("获取数据异常!");
}
}
// if (ShiroUtil.hasRole("H04") && !ShiroUtil.hasAnyRoles("sysadmin,A06")) {
// return Vi.getUnionId().equals(activity.getUnionId()) ? activity : null;
// }
if (ShiroUtil.hasRole("H04") && !ShiroUtil.hasAnyRoles("sysadmin,A06")) {
return Vi.getUnionId().equals(activity.getUnionId()) ? activity : null;
}
return activity;
}
@@ -146,6 +145,7 @@ public class FitnessWalkCommonServiceImpl extends ViServiceImpl implements Fitne
.append("activityModel:true,")
.append("endTime:true,")
.append("startTime:true,")
.append("unionId:true")
.append("}).orderBy('startTime', 'desc').get()");
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.QUERY, sql.toString());
fitnessWalkActivities = jsonObject.getJSONArray("data").stream().map(v -> JSON.parseObject((String) v, FitnessWalkActivity.class)).collect(Collectors.toList());
@@ -203,13 +203,16 @@ public class FitnessWalkCommonServiceImpl extends ViServiceImpl implements Fitne
@Override
public void addLotteryTask(FitnessWalkActivity fitnessWalkActivity) {
//删除和该活动关联的定时任务
List<Sys_task> sys_tasks = sysTaskService.query(Cnd.where("note", "=", fitnessWalkActivity.get_id()));
if (sys_tasks != null) {
if (CollectionUtil.isNotEmpty(sys_tasks)) {
sys_tasks.forEach(v -> {
taskPlatformService.delete(v.getId(), v.getId());
sysTaskService.delete(v.getId());
});
}
if ("everyday".equals(fitnessWalkActivity.getLotteryMode())) {
FitnessWalkActivity.DayLotteryRule dayLotteryRule = fitnessWalkActivity.getDayLotteryRule();
if (Lang.isNotEmpty(dayLotteryRule)) {
@@ -284,7 +287,7 @@ public class FitnessWalkCommonServiceImpl extends ViServiceImpl implements Fitne
//查询结束时间
map.put("endDate", rule.getEndDate());
//抽奖天数
map.put("lotteryQualificationDay", rule.getLotteryQualificationDay().toString());
map.put("lotteryQualificationDay", rule.getLotteryQualificationDay());
//获奖名称
map.put("awardName", rule.getAwardName());
//抽奖模式
@@ -376,19 +379,31 @@ public class FitnessWalkCommonServiceImpl extends ViServiceImpl implements Fitne
@Override
public List<NutMap> prizeOption(String activityId) {
FitnessWalkActivity activity = getActivity(activityId);
if ("custom".equals(activity.getLotteryMode())) {
List<FitnessWalkActivity.CustomLotteryRule> customLotteryRules = activity.getCustomLotteryRules();
return customLotteryRules.stream().map(rule -> {
NutMap map = new NutMap();
map.put("text", DateUtil.format(DateUtil.date(rule.getStartDate()), "MM-dd") + "" + DateUtil.format(DateUtil.date(rule.getEndDate()), "MM-dd") + rule.getAwardName() + "中奖榜");
map.put("value", rule.getLotteryTime());
return map;
}).collect(Collectors.toList());
}
return null;
List<FitnessWalkAwardUser> list = dao().query(FitnessWalkAwardUser.class,
Cnd.where("activityId", "=", activityId).groupBy("awardName").asc("awardName"));
List<NutMap> collect = list.stream().map(v -> {
NutMap map = new NutMap();
map.put("text", v.getAwardName());
map.put("value", v.getAwardName());
return map;
}).collect(Collectors.toList());
// FitnessWalkActivity activity = getActivity(activityId);
// if ("custom".equals(activity.getLotteryMode())) {
// List<FitnessWalkActivity.CustomLotteryRule> customLotteryRules = activity.getCustomLotteryRules();
// return customLotteryRules.stream().map(rule -> {
// NutMap map = new NutMap();
// map.put("text", DateUtil.format(DateUtil.date(rule.getStartDate()), "MM-dd") + "" + DateUtil.format(DateUtil.date(rule.getEndDate()), "MM-dd") + rule.getAwardName() + "中奖榜");
// map.put("value", rule.getLotteryTime());
// return map;
// }).collect(Collectors.toList());
// }
return collect;
}
private Sql rankingListSql(String searchName, String searchKeyword, String activityId, String unionId, String unitId, String mode) {
FitnessWalkActivity activity = getActivity(activityId);
CndPlus cnd = CndPlus.create();
@@ -446,7 +461,6 @@ public class FitnessWalkCommonServiceImpl extends ViServiceImpl implements Fitne
// cnd.and("DATE( s.applyDate )", "<=", DateUtil.format(DateUtil.date(activity.getEndTime()), "yyyy-MM-dd"));
}
if (Strings.isNotBlank(unitId)) {
cnd.and("u.unitId", "=", unitId);
}
@@ -457,10 +471,10 @@ public class FitnessWalkCommonServiceImpl extends ViServiceImpl implements Fitne
if (Strings.isNotBlank(searchName) && Strings.isNotBlank(searchKeyword)) {
cnd.and(searchName, "LIKE", "%" + searchKeyword + "%");
}
cnd.and("u.id","in",Sqls.create("select userId from activity_user_scope where groupId = @groupId").setParam("groupId",activity.getGroupId()));
cnd.and("over3k.standardsDays","is not",null);
// cnd.and("u.id","in",Sqls.create("select userId from activity_user_scope where groupId = @groupId").setParam("groupId",activity.getGroupId()));
cnd.groupBy("u.id","u.username","u.loginname","u.unionname","u.unitname","over3k.standardsDays");
cnd.desc("total_steps");
cnd.having(Cnd.NEW().and("COALESCE(SUM(sub.step), 0)",">",0));
sql.setCondition(cnd);
return sql;
}
@@ -3,10 +3,10 @@ package io.v.nutz.zhgh.fitnessWalk.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.sys.models.Sys_union;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkPunchStatisticsService;
import io.v.nutz.zhgh.fitnessWalk.utils.WeAppCloudUtil;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.sys.models.Sys_union;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
@@ -0,0 +1,346 @@
package io.v.nutz.zhgh.fitnessWalk.service.impl;
import cn.hutool.core.date.DateUtil;
import io.v.nutz.base.service.impl.BaseServiceImpl;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkActivity;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkAwardUser;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkRaffleRules;
import io.v.nutz.zhgh.fitnessWalk.model.FitnessWalkRaffleUser;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkCommonService;
import io.v.nutz.zhgh.fitnessWalk.service.FitnessWalkStepRaffleService;
import io.v.nutz.base.query.PageForm;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.random.R;
import org.nutz.lang.util.NutMap;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @version 1.0
* @Author zzr
* @nameFitnessWalkStepRaffleServiceImpl
* @Date 2024/12/28 11:17
* @注释
*/
@IocBean(args = {"refer:dao"})
public class FitnessWalkStepRaffleServiceImpl extends BaseServiceImpl<FitnessWalkRaffleRules> implements FitnessWalkStepRaffleService {
public FitnessWalkStepRaffleServiceImpl(Dao dao) {
super(dao);
}
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
@Override
public Sql getRaffleSql(PageForm pageForm, String activityId, String unionId, String unitId) {
FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
Integer lotteryQualificationDays = activity.getLotteryQualificationDays();
Integer lotteryQualificationSteps = activity.getLotteryQualificationSteps();
Date startDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getStartTime()), "yyyy-MM-dd"), "yyyy-MM-dd");
Date endDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getEndTime()), "yyyy-MM-dd"), "yyyy-MM-dd");
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
u.id,
COALESCE(SUM(sub.step), 0) AS total_steps,
u.loginname,
u.username,
u.unionid,
u.unionname,
u.unitid,
u.unitname,
over3k.standardsDays
FROM
`user` u
LEFT JOIN (
SELECT
userId,
applyDate,
step
FROM
`fitness_walk_step`
WHERE
activityId = @activityId
AND DATE(applyDate) >= @startDate
AND DATE(applyDate) <= @endDate
$lotteryQualificationDaySql
GROUP BY
userId,
applyDate
) AS sub ON u.id = sub.userId
LEFT JOIN (
SELECT
userId,
COUNT(DISTINCT DATE(applyDate)) AS standardsDays
FROM
`fitness_walk_step`
WHERE
activityId = @activityId
AND DATE(applyDate) >= @startDate
AND DATE(applyDate) <= @endDate
$lotteryQualificationDaySql
GROUP BY
userId
) AS over3k ON u.id = over3k.userId
$condition
""");
if (lotteryQualificationDays != null) {
sql.setVar("lotteryQualificationDaySql", new Static(" AND step >= '%s' ".formatted(lotteryQualificationSteps)));
cnd.having(cnd.and(new Static(" over3k.standardsDays >= '%s' ".formatted(lotteryQualificationDays))));
// sql.setVar("stepHavingSql", new Static(" over3k.standardsDays >= '%s' ".formatted(lotteryQualificationDays)));
} else {
cnd.having(cnd.and(new Static(" COALESCE(SUM(sub.step), 0) >= '%s' ".formatted(lotteryQualificationSteps))));
// sql.setVar("stepHavingSql", new Static(" COALESCE(SUM(sub.step), 0) >= '%s' ".formatted(lotteryQualificationSteps)));
}
sql.setParam("activityId", activityId);
sql.setParam("step", lotteryQualificationSteps);
sql.setParam("startDate", startDate);
sql.setParam("endDate", endDate);
if (Strings.isNotBlank(unitId)) {
cnd.and("u.unitId", "=", unitId);
}
if (Strings.isNotBlank(unionId)) {
cnd.and("u.unionId", "=", unionId);
}
if (pageForm != null && Strings.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.loginname", pageForm.getSearchKeyword());
seg.orLike("u.username", pageForm.getSearchKeyword());
cnd.and(seg);
}
// cnd.and("u.id","in",Sqls.create("select userId from activity_user_scope where groupId = @groupId").setParam("groupId",activity.getGroupId()));
cnd.groupBy("u.id", "u.username", "u.loginname", "u.unionname", "u.unitname");
cnd.desc("total_steps");
sql.setCondition(cnd);
return sql;
}
/**
* 获取活动的奖项
* @param activityId
* @return { index: 0, name: '奖项名称', type: 0 }
*/
@Override
public List<NutMap> getActivityAwardList(String activityId) {
FitnessWalkRaffleRules rules = fetch(Cnd.where("activityId", "=", activityId));
List<FitnessWalkRaffleRules.ManualLotteryRules> manualLotteryRules = rules.getManualLotteryRules();
// 存放奖品列表
List<String> ruleList = new ArrayList<>();
// 奖品数量
int size = manualLotteryRules.size();
if (size == 1) {
String prize = manualLotteryRules.get(0).getAwardName();
for (int i = 0; i < 8; i++) {
ruleList.add(prize);
if (ruleList.size() < 8) {
ruleList.add("没有中奖");
}
}
} else if (size == 2) {
for (int i = 0; i < 8; i++) {
String prize = manualLotteryRules.get(i % size).getAwardName();
ruleList.add(prize);
if (ruleList.size() < 8) {
ruleList.add("没有中奖");
}
}
} else if (size == 3) {
for (int i = 0; i < 8; ) {
for (int j = 0; j < size && i < 8; j++) {
String prize = manualLotteryRules.get(j).getAwardName();
ruleList.add(prize);
if (ruleList.size() < 8) {
ruleList.add("没有中奖");
i += 2;
}
}
}
} else if (size == 4) {
for (int i = 0; i < 8; ) {
for (int j = 0; j < size && i < 8; j++) {
String prize = manualLotteryRules.get(j).getAwardName();
ruleList.add(prize);
if (ruleList.size() < 8) {
ruleList.add("没有中奖");
i += 2;
}
}
}
} else if (size == 5) {
ruleList = manualLotteryRules.stream().map(FitnessWalkRaffleRules.ManualLotteryRules::getAwardName).collect(Collectors.toList());
ruleList.add(2, "没有中奖");
ruleList.add(4, "没有中奖");
ruleList.add(7, "没有中奖");
} else if (size == 6) {
ruleList = manualLotteryRules.stream().map(FitnessWalkRaffleRules.ManualLotteryRules::getAwardName).collect(Collectors.toList());
ruleList.add(2, "没有中奖");
ruleList.add(6, "没有中奖");
} else {
ruleList = manualLotteryRules.stream().map(FitnessWalkRaffleRules.ManualLotteryRules::getAwardName).collect(Collectors.toList());
ruleList.add("没有中奖");
}
List<String> finalRuleList = ruleList;
List<NutMap> awardList = IntStream.range(0, ruleList.size())
.mapToObj(index -> {
String awardName = finalRuleList.get(index);
NutMap map = NutMap.NEW();
map.put("index", index);
map.put("name", awardName);
map.put("type", "没有中奖".equals(awardName) ? 1 : 0);
return map;
}).collect(Collectors.toList());
return awardList;
}
/**
* 手动抽奖
*
* @param activityId 活动id
*/
@Override
@Aop(TransAop.READ_COMMITTED)
public void manualLottery(String activityId) {
// 删除此活动下的获奖记录
dao().clear(FitnessWalkAwardUser.class, Cnd.where("activityId", "=", activityId));
dao().clear(FitnessWalkRaffleUser.class, Cnd.where("activityId", "=", activityId));
FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
Date startDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getStartTime()), "yyyy-MM-dd"), "yyyy-MM-dd");
Date endDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getEndTime()), "yyyy-MM-dd"), "yyyy-MM-dd");
// 获取达标的所有人按照步数倒序
Sql sql = getRaffleSql(null, activityId, null, null);
List<NutMap> list = listMap(sql);
List<FitnessWalkRaffleUser> raffleUserList = list.stream().map(v -> {
FitnessWalkRaffleUser raffleUser = new FitnessWalkRaffleUser();
raffleUser.setId(R.UU32());
raffleUser.setActivityId(activityId);
raffleUser.setUserId(v.getString("id"));
raffleUser.setLoginName(v.getString("loginname"));
raffleUser.setUsername(v.getString("username"));
raffleUser.setAwardSteps(v.getString("total_steps"));
raffleUser.setStandardsDays(v.getInt("standardsDays"));
raffleUser.setIsRaffle(false);
return raffleUser;
}).collect(Collectors.toList());
dao().fastInsert(raffleUserList);
Set<String> winningRankLoginNames = new HashSet<>();
// 获奖人员
List<FitnessWalkAwardUser> winningUsers = new ArrayList<>();
// 获取抽奖规则
FitnessWalkRaffleRules rules = fetch(Cnd.where("activityId", "=", activityId));
List<FitnessWalkRaffleRules.ManualLotteryRules> manualLotteryRules = rules.getManualLotteryRules();
// 找出是按照排名来颁奖的奖项
List<FitnessWalkRaffleRules.ManualLotteryRules> ranks = manualLotteryRules.stream().filter(v -> "排名".equals(v.getRaffleType()))
.sorted(Comparator.comparing(FitnessWalkRaffleRules.ManualLotteryRules::getRankingPosition)).collect(Collectors.toList());
for (FitnessWalkRaffleRules.ManualLotteryRules rank : ranks) {
String awardName = rank.getAwardName();
Integer lotteryUserNum = rank.getLotteryUserNum();
// 排除之前获奖的人再倒序排列
List<NutMap> canLotteryUsers = list.stream()
.filter(v -> !winningRankLoginNames.contains(v.getString("loginname")))
.sorted(Comparator.comparingInt((NutMap v) -> v.getInt("total_steps")).reversed())
.collect(Collectors.toList());
// 截取当前奖项的中奖人员
List<NutMap> rankNutMaps = canLotteryUsers.subList(0, lotteryUserNum);
// 收集成中奖人员存储
List<FitnessWalkAwardUser> collect = rankNutMaps.stream().map(v -> {
FitnessWalkAwardUser awardUser = new FitnessWalkAwardUser();
awardUser.setId(R.UU32());
awardUser.setActivityId(activityId);
awardUser.setUserId(v.getString("id"));
awardUser.setLoginName(v.getString("loginname"));
awardUser.setUsername(v.getString("username"));
awardUser.setAwardName(awardName);
awardUser.setStartDate(startDate);
awardUser.setEndDate(endDate);
awardUser.setUnionId(v.getString("unionid"));
awardUser.setUnionName(v.getString("unionname"));
awardUser.setUnitId(v.getString("unitid"));
awardUser.setUnitName(v.getString("unitname"));
awardUser.setStandardsDays(v.getInt("standardsDays"));
awardUser.setAwardSteps(v.getString("total_steps"));
return awardUser;
}).collect(Collectors.toList());
winningRankLoginNames.addAll(collect.stream().map(FitnessWalkAwardUser::getLoginName).collect(Collectors.toList()));
winningUsers.addAll(collect);
}
List<FitnessWalkRaffleRules.ManualLotteryRules> reachList = manualLotteryRules.stream().filter(v -> "达标".equals(v.getRaffleType()))
.sorted(Comparator.comparing(FitnessWalkRaffleRules.ManualLotteryRules::getRankingPosition)).collect(Collectors.toList());
for (FitnessWalkRaffleRules.ManualLotteryRules reach : reachList) {
List<NutMap> nutMaps;
if (reach.getIsSimultaneously() != null && reach.getIsSimultaneously()) {
// 可以兼得
nutMaps = list;
} else {
// 不可兼得
nutMaps = list.stream().filter(v -> !winningRankLoginNames.contains(v.getString("loginname"))).collect(Collectors.toList());
}
Integer lotteryUserNum = reach.getLotteryUserNum();
String awardName = reach.getAwardName();
List<NutMap> reachNutMaps = nutMaps.stream().collect(Collectors.collectingAndThen(Collectors.toList(), collected -> {
Collections.shuffle(collected);
return collected.subList(0, lotteryUserNum - 1);
}));
List<FitnessWalkAwardUser> collect = reachNutMaps.stream().map(v -> {
FitnessWalkAwardUser awardUser = new FitnessWalkAwardUser();
awardUser.setId(R.UU32());
awardUser.setActivityId(activityId);
awardUser.setUserId(v.getString("id"));
awardUser.setLoginName(v.getString("loginname"));
awardUser.setUsername(v.getString("username"));
awardUser.setAwardName(awardName);
awardUser.setStartDate(startDate);
awardUser.setEndDate(endDate);
awardUser.setUnionId(v.getString("unionid"));
awardUser.setUnionName(v.getString("unionname"));
awardUser.setUnitId(v.getString("unitid"));
awardUser.setUnitName(v.getString("unitname"));
awardUser.setStandardsDays(v.getInt("standardsDays"));
awardUser.setAwardSteps(v.getString("total_steps"));
return awardUser;
}).collect(Collectors.toList());
winningRankLoginNames.addAll(collect.stream().map(FitnessWalkAwardUser::getLoginName).collect(Collectors.toList()));
winningUsers.addAll(collect);
}
dao().fastInsert(winningUsers);
}
}
@@ -234,7 +234,7 @@ layout("/layouts/platform.html"){
<el-col :span="12">
<el-form-item label="主活动名称" prop="masterActivityName"
:rules="[{ required:true, message: '请填写主活动名称' }]">
<el-input type="text" v-model="formData.masterActivityName" maxlength="50"
<el-input type="text" v-model="formData.masterActivityName" maxlength="20"
placeholder="请填写主活动名称"></el-input>
</el-form-item>
</el-col>
@@ -308,6 +308,7 @@ layout("/layouts/platform.html"){
<el-col :span="12" v-if="formData.isQuestion">
<el-form-item label="答题试卷" prop="questionId">
<el-select v-model="formData.questionId" filterable style="width: 100%"
clearable
placeholder="选择答题试卷">
<el-option
v-for="item in questionOptions"
@@ -350,6 +351,7 @@ layout("/layouts/platform.html"){
<el-radio-group v-model="formData.punchFinishAfter">
<el-radio border label="gift_voucher">礼品券</el-radio>
<el-radio border label="cert">完赛证书</el-radio>
<el-radio border label="none"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
@@ -372,52 +374,6 @@ layout("/layouts/platform.html"){
</el-col>
</el-row>
<el-row type="flex" :gutter="20">
<el-col :span="12">
<el-form-item label="是否抽奖"
:rules="[{ required:true, message: '必填' }]">
<el-radio-group v-model="formData.isLottery">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" :gutter="20" v-if="formData.isLottery && formData.activityModel=='punch'">
<el-col :span="24">
<el-form-item label="奖品列表" prop="punchLotteryPrizes">
<el-table :data="formData.punchLotteryPrizes">
<el-table-column label="奖品名称">
<template scope="scope">
<el-input v-model="scope.row.name" max="20" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="奖品图片">
<template scope="scope">
<el-input v-model="scope.row.url" max="20" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="奖品份数">
<template scope="scope">
<el-input-number v-model="scope.row.num" clearable></el-input-number>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot="header" slot-scope="scope">
<el-button @click="formData.punchLotteryPrizes.push({})"
icon="el-icon-plus" size="mini" type="primary"></el-button>
</template>
<template scope="scope">
<el-button @click="formData.punchLotteryPrizes.splice(scope.$index,1)"
icon="el-icon-delete" size="mini" type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" gutter="20">
<el-col :span="12" v-if="formData.activityModel === 'punch'">
<el-form-item label="报名时间" prop="applyTime"
@@ -449,7 +405,82 @@ layout("/layouts/platform.html"){
</el-col>
</el-row>
<template v-if="formData.isLottery && formData.activityModel=='stepCount'">
<el-row type="flex" :gutter="20">
<el-col :span="12">
<el-form-item label="是否抽奖"
:rules="[{ required:true, message: '必填' }]">
<el-radio-group v-model="formData.isLottery" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<template v-if="formData.isLottery && formData.activityModel=='stepCount'">
<el-col :span="12">
<el-form-item label="抽奖模式" :rules="[{ required:true, message: '必填' }]">
<el-radio-group v-model="formData.isAutoLottery" size="small">
<el-radio border :label="true">系统自动抽奖</el-radio>
<el-radio border :label="false">手动抽奖</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</template>
</el-row>
<template v-if="formData.isLottery && formData.activityModel=='stepCount' && formData.isAutoLottery!=null && !formData.isAutoLottery">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="抽奖资格天数">
<el-input-number style="width: 100%" v-model="formData.lotteryQualificationDays" placeholder="请填写抽奖资格天数"></el-input-number>
<span style="color: #ac3111">如果没有天数,此项请勿填写;例如:达标80000步抽奖,请在抽奖资格步数中填写80000即可</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="抽奖资格步数" :rules="[{ required:true, message: '必填' }]">
<el-input-number style="width: 100%" v-model="formData.lotteryQualificationSteps" placeholder="请填写抽奖资格步数"></el-input-number>
</el-form-item>
</el-col>
</el-row>
</template>
<el-row type="flex" :gutter="20" v-if="formData.isLottery && formData.activityModel=='punch'">
<el-col :span="24">
<el-form-item label="奖品列表" prop="punchLotteryPrizes">
<el-table :data="formData.punchLotteryPrizes">
<el-table-column label="奖品名称">
<template scope="scope">
<el-input v-model="scope.row.name" max="20" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="奖品图片">
<template scope="scope">
<el-input v-model="scope.row.url" max="20" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="奖品份数">
<template scope="scope">
<el-input-number v-model="scope.row.num" clearable></el-input-number>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot="header" slot-scope="scope">
<el-button @click="formData.punchLotteryPrizes.push({})"
icon="el-icon-plus" size="mini" type="primary"></el-button>
</template>
<template scope="scope">
<el-button @click="formData.punchLotteryPrizes.splice(scope.$index,1)"
icon="el-icon-delete" size="mini" type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
</el-row>
<template v-if="formData.isLottery && formData.isAutoLottery && formData.activityModel=='stepCount'">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="抽奖模式"
@@ -598,6 +629,13 @@ layout("/layouts/platform.html"){
</el-radio-group>
</el-form-item>
<el-form-item label="完成点位数" prop="finishPointNum"
v-if="formData.activityModel=='punch'"
:rules="[{ required:true, message: '必填' }]">
<el-input-number v-model="formData.finishPointNum" :min="2"></el-input-number>
</el-form-item>
<el-form-item label="外链地址" prop="externalLinkAddress">
<el-input v-model="formData.externalLinkAddress"></el-input>
</el-form-item>
@@ -682,7 +720,7 @@ layout("/layouts/platform.html"){
</el-input>
</template>
</el-table-column>
<el-table-column v-if="formData.hasAnswer" label="答题题目" prop="issueIds">
<el-table-column v-if="formData.isQuestion" label="答题题目" prop="issueIds">
<template scope="scope">
<el-select v-model="scope.row.issueIds" filterable multiple
style="width: 100%" placeholder="选择答题题目" @change="issueChange">
@@ -806,27 +844,27 @@ layout("/layouts/platform.html"){
<el-row gutter="20">
<el-col :span="12" v-if="viewData.applyStartTime">
<el-col :span="12">
<el-form-item label="开始报名时间:">
{{moment(viewData.applyStartTime).format('YYYY-MM-DD HH:mm:ss')}}
{{moment(viewData.apply_start_time).format('YYYY-MM-DD HH:mm:ss')}}
</el-form-item>
</el-col>
<el-col :span="12" v-if="viewData.applyEndTime">
<el-col :span="12">
<el-form-item label="结束报名时间:">
{{moment(viewData.applyEndTime).format('YYYY-MM-DD HH:mm:ss')}}
{{moment(viewData.apply_end_time).format('YYYY-MM-DD HH:mm:ss')}}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12" v-if="viewData.startTime">
<el-col :span="12">
<el-form-item label="活动开始时间:">
{{moment(viewData.startTime).format('YYYY-MM-DD HH:mm:ss')}}
{{moment(viewData.start_time).format('YYYY-MM-DD HH:mm:ss')}}
</el-form-item>
</el-col>
<el-col :span="12" v-if="viewData.endTime">
<el-col :span="12">
<el-form-item label="活动结束时间:">
{{moment(viewData.endTime).format('YYYY-MM-DD HH:mm:ss')}}
{{moment(viewData.end_time).format('YYYY-MM-DD HH:mm:ss')}}
</el-form-item>
</el-col>
</el-row>
@@ -1553,7 +1591,7 @@ layout("/layouts/platform.html"){
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/jsz/hdMange/delete", {id: row._id}, (data) => {
$.post("/platform/fitnessWalk/activityManage/delete", {id: row._id}, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
@@ -1669,6 +1707,7 @@ layout("/layouts/platform.html"){
})
}
this.pictureList = [{url: data.tempCover}]
this.stepPictureList = []
if (data.templateRandomPics) {
@@ -1840,16 +1879,32 @@ layout("/layouts/platform.html"){
}
})
},
getQuestion(){
$.get('/platform/fitnessWalk/common/getQuestion').then(res=>{
this.questionOptions = res.data
})
},
getIssueByQuestionId(id){
$.get('/platform/fitnessWalk/common/getIssueById',{id}).then(res=>{
this.issueOptions = res.data
})
},
},
watch: {
'formData.questionId': {
async handler(newVal, oldVal) {
if (oldVal !== undefined) {
// this.issueOptions = await Jsz.getIssueById(this.formData.questionId)
if(newVal){
this.getIssueByQuestionId(newVal)
// this.formData.pts.map(v => v.issueIds = [])
}else{
this.formData.pts.map(v => v.issueIds = [])
}
},
deep: true
deep: true,
immediate:true
},
'formData.groupId': {
async handler(newVal, oldVal) {
@@ -1866,6 +1921,7 @@ layout("/layouts/platform.html"){
},
async created() {
this.getActivityGroup()
this.getQuestion()
// this.questionOptions = await Jsz.getQuestion()
this.pageForm.year = (new Date().getFullYear()).toString()
@@ -0,0 +1,390 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<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 style="width: 100%"
class="mr5"
:picker-options="pickerOptions"
v-model="pageForm.year" :clearable="false"
type="year"
value-format="yyyy" @change="getCascadersActivity"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">活动:</div>
<div class="search-item-option">
<el-cascader
style="width: 100%"
@change="doSearch()"
v-model="pageForm.activityId"
:options="activityOptions"
:props="{ checkStrictly: true,emitPath:false}"
:clearable="false"></el-cascader>
</div>
</div>
<div class="search-item">
<div class="search-item-label">姓名工号:</div>
<div class="search-item-option">
<el-input placeholder="请输入姓名或工号查询" clearable v-model="pageForm.searchKeyword"
style="width: 100%" @keyup.enter.native="doSearch">
</el-input>
</div>
</div>
<template v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')}">
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select @change="unionChange" clearable filterable style="width: 100%"
placeholder="请选择所属工会" v-model="pageForm.unionId">
<el-option
:key="item.id"
:label="item.unionname"
:value="item.id"
v-for="item in unionOptions">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select @change="doSearch" clearable filterable style="width: 100%"
placeholder="请选择所属单位" v-model="pageForm.unitId">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</div>
</div>
</template>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="达标人员列表">
<template #func>
<el-button @click="setRaffle" class="ml10" size="small" type="primary">设置抽奖条件</el-button>
<el-button @click="viewLotteryUsers" class="ml10" size="small" type="primary">查看中奖人员</el-button>
<el-button @click="exportExcel" class="ml10" size="small" type="primary">导出达标人员</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize">
<el-table-column :index="indexMethod" align="center" header-align="center" label="排名" type="index"
width="80px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<el-card shadow="never">
<h2 style="color: #0a84ff">抽奖规则</h2>
<span>排名位次指:一等奖,二等奖,三等奖;如您填写【1】,会按照达标总步数降序,取最高位次;填写【2】则排除【1】的中奖人数后再取抽奖人数的最高位次</span>
<el-form :model="formData" ref="formRef" label-width="100px">
<el-form-item>
<el-table tooltip-effect="dark" style="width: 100%" :data="formData.manualLotteryRules">
<el-table-column label="奖项名称" align="center">
<template scope="scope">
<el-input v-model="scope.row.awardName" placeholder="请输入奖项名称" max="50" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="抽奖人数" align="center">
<template scope="scope">
<el-input-number v-model="scope.row.lotteryUserNum"
style="width: 100%"></el-input-number>
</template>
</el-table-column>
<el-table-column label="抽奖类型" align="center">
<template scope="scope">
<el-select v-model="scope.row.raffleType">
<el-option
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in raffleTypeOptions">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="排名位次" align="center">
<template scope="scope">
<el-input-number v-if="scope.row.raffleType == '排名'"
v-model="scope.row.rankingPosition"
style="width: 100%"></el-input-number>
</template>
</el-table-column>
<el-table-column label="是否兼得" align="center">
<template scope="scope">
<el-radio-group v-if="scope.row.raffleType == '达标'"
v-model="scope.row.isSimultaneously" size="small">
<el-radio label="true" border></el-radio>
<el-radio label="false" border></el-radio>
</el-radio-group>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot="header" slot-scope="scope">
<el-button @click="formData.manualLotteryRules.push({})"
icon="el-icon-plus" size="mini" type="primary"></el-button>
</template>
<template scope="scope">
<el-button @click="formData.manualLotteryRules.splice(scope.$index,1)"
icon="el-icon-delete" size="mini" type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
<div style="text-align: right">
<el-button @click="$refs.guava.index()" class="ml10">返回</el-button>
<el-button @click="saveRaffle" class="ml10" type="primary">提交</el-button>
</div>
</el-card>
</template>
<template #view>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">姓名工号</div>
<div class="search-item-option">
<el-input v-model="awardPageForm.searchKeyword" placeholder="请输入姓名或工号" clearable></el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">奖项名称</div>
<div class="search-item-option">
<el-select v-model="awardPageForm.lotteryTime" style="width: 100%" clearable>
<el-option
:key="item.value"
:label="item.value"
:value="item.value"
v-for="item in awardNameOptions">
</el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="awardPageData" icon="el-icon-search" type="primary"></el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="中奖人员列表">
<template #func>
<el-button @click="exportAwardExcel" icon="el-icon-download" type="primary" size="small">导出中奖人员</el-button>
</template>
</table-tool>
<el-table :data="awardTableData">
<el-table-column :index="indexMethod" align="center" header-align="center" label="排名" type="index"
width="80px"></el-table-column>
<el-table-column align="center" header-align="center" label="工号" prop="loginName"></el-table-column>
<el-table-column align="center" header-align="center" label="姓名" prop="username"></el-table-column>
<el-table-column align="center" header-align="center" label="分工会" prop="unionName"></el-table-column>
<el-table-column align="center" header-align="center" label="单位" prop="unitName"></el-table-column>
<el-table-column align="center" header-align="center" label="奖项名称" prop="awardName"></el-table-column>
</el-table>
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins:[initTableMixins],
data() {
return {
pickerOptions: {
disabledDate(time) {
return (
time.getFullYear() > new Date().getFullYear()
);
}
},
pageForm: {
year: moment().format('YYYY'),
unionId:'',
unitId:''
},
unionOptions: [],
unitOptions: [],
activityOptions: [],
tableColumns: [
{label: '姓名', prop: 'username'},
{label: '工号', prop: 'loginname'},
{label: '分工会', prop: 'unionname', sortable: true},
{label: '单位', prop: 'unitname'},
{label: '步数', prop: 'total_steps', sortable: true},
{label: '达标天数', prop: 'standardsDays', sortable: true},
],
raffleTypeOptions: [
{ value: '排名', label: '排名' },
{ value: '达标', label: '达标' },
],
formData: {
manualLotteryRules: []
},
awardNameOptions: [],
awardPageForm: {
searchKeyword: '',
activityId: '',
lotteryTime: ''
},
awardTableData: []
}
},
methods: {
/**
* 设置抽奖条件
*/
async setRaffle(){
this.$refs.guava.edit()
// 获取该活动的抽奖条件
const resp = await $.post('/platform/fitnessWalk/stepRaffle/getRaffle', {
activityId: this.pageForm.activityId
})
if (resp.code === 0) {
if (resp.data) {
this.formData = resp.data
}
} else {
this.formData = {
manualLotteryRules: []
}
}
},
/**
* 查看中奖人员
*/
viewLotteryUsers(){
this.$refs.guava.view()
this.$nextTick(() => {
this.awardPageData()
})
},
async awardPageData() {
this.awardPageForm.activityId = this.pageForm.activityId
const resp = await $.post('/platform/fitnessWalk/stepWining/prizeUsers', this.awardPageForm)
if (resp.code === 0) {
this.awardTableData = resp.data
}
},
exportAwardExcel(){
const {searchKeyword,activityId,lotteryTime} = this.awardPageForm
window.open( loc() + '/exportAwardExcel?searchKeyword=' + searchKeyword +
'&activityId=' + activityId +'&lotteryTime=' + lotteryTime)
},
async saveRaffle() {
console.log(this.formData)
const formData = this.formData
formData.activityId = this.pageForm.activityId
formData.manualLotteryRules = JSON.stringify(this.formData.manualLotteryRules)
const resp = await $.post('/platform/fitnessWalk/stepRaffle/saveRaffle', this.formData)
if (resp.code === 0) {
this.$message.success('保存成功')
this.$refs.guava.index()
} else {
this.$message.warning(resp.msg)
}
},
exportExcel(){
const {searchKeyword,activityId,unionId,unitId} = this.pageForm
window.open( loc() + '/exportExcel?searchKeyword=' + searchKeyword +
'&activityId=' + activityId +'&unionId=' + unionId + '&unitId=' + unitId)
},
async getAllActivity() {
this.pageForm.activityId = ''
this.activityOptions = []
const {data} = await $.get('/platform/fitnessWalk/activityManage/getAllActivity', this.pageForm)
if (data == null || data.length === 0) {
this.tableData = []
return
} else {
this.activityOptions = data.filter(item => item.activityModel === 'stepCount')
}
if (this.activityOptions) {
this.pageForm.activityId = this.activityOptions[0]._id
}
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitOptions = await getUnits(val)
this.doSearch()
},
async getCascadersActivity() {
const {code, data} = await $.get(loc() + '/getCascadersActivity', {year: this.pageForm.year})
this.activityOptions = data
if (this.activityOptions && this.activityOptions.length > 0) {
this.pageForm.activityId = this.activityOptions[0].value
this.doSearch()
} else {
this.tableData = []
}
},
async getAwardUserNum(){
const resp = await $.post('/platform/fitnessWalk/stepRaffle/getAwardUserNum')
if (resp.code === 0) {
}
},
async getAwardNameOptions(){
const resp = await $.post('/platform/fitnessWalk/stepWining/prizeOption', {
activityId: this.pageForm.activityId
})
if (resp.code === 0) {
this.awardNameOptions = resp.data
}
},
},
async created() {
this.unionOptions = await getUnions(null)
this.unitOptions = await getUnits(null)
await this.getCascadersActivity()
await this.getAwardNameOptions()
}
})
</script>
<!--#
}
#-->
@@ -142,7 +142,6 @@ layout("/layouts/platform.html"){
{label: '分工会', prop: 'unionname', sortable: true},
{label: '单位', prop: 'unitname'},
{label: '步数', prop: 'total_steps', sortable: true},
{label: '达标天数', prop: 'standardsDays', sortable: true},
],
}
},
@@ -148,9 +148,9 @@ layout("/layouts/platform.html"){
activityOptions: [],
activityDatePickerOptions: {
disabledDate: time => {
return (
time <= moment(this.activityInfo.endTime) || time >= moment(this.activityInfo.startTime)
);
return (
time <= moment(this.activityInfo.endTime) || time >= moment(this.activityInfo.startTime)
);
}
},
activityInfo:{},
@@ -3,7 +3,7 @@ layout("/layouts/platform.html"){
#-->
<style>
.query-row {
height: 40px;
height: 50px;
display: flex;
justify-content: center;
align-items: center;
@@ -97,13 +97,13 @@ layout("/layouts/platform.html"){
</div>
</el-card>
<el-card class="mt10" shadow="never" style="height: 80px">
<el-card class="mt10" shadow="never" style="height: 100px">
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">奖项名称:</el-col>
<el-col class="query-row-content">
<el-radio-group v-model="changKeyItem" @change="subsectionChange(changKeyItem)" size="small">
<el-radio
style="margin-right: 10px;cursor: pointer"
style="margin-right: 10px;margin-top:5px;cursor: pointer"
border
v-for="item in subsectionList"
:key="item.value"