健身卡

This commit is contained in:
=
2025-10-14 17:04:38 +08:00
parent e7b24d3afb
commit f3a8598e91
15 changed files with 1174 additions and 12 deletions
@@ -0,0 +1,116 @@
package com.budwk.app.zhgh.dayofficework.exerciseCard.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.exerciseCard.model.ExerciseCard;
import com.budwk.app.zhgh.dayofficework.exerciseCard.service.ExerciseCardService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
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.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.Date;
/**
* @author : hongqiwei
* @description :
* @createDate : 2025/10/13 15:00
*/
@IocBean
@At("/platform/exerciseCard/apply")
@Api("健身卡-信息填报")
@Ok("json:full")
@Slf4j
public class ExerciseCardApplyController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private ExerciseCardService exerciseCardService;
@At("/index")
@Ok("beetl:/platform/zhgh/dayofficework/exerciseCard/apply/index.html")
@SaCheckPermission("exerciseCard.apply")
public void index() {
}
@At
@ApiOperation("保存申请")
@SaCheckPermission(value = {"exerciseCard.apply", "h5.exerciseCard.apply"}, mode = SaMode.OR)
@SLog(tag = "健身卡-信息填报", msg = "保存信息填报")
public Result save(@Param("data") ExerciseCard exerciseCard) {
if (StrUtil.isBlank(exerciseCard.getId())) exerciseCard.setApplyTime(new Date());
dao.insertOrUpdate(exerciseCard);
return Result.success();
}
@At
@SaCheckLogin
public Result findOne(String id) {
return Result.success(baseService.dao().fetch(ExerciseCard.class, id));
}
@At
@ApiOperation("获取受助人")
@SaCheckPermission("exerciseCard.apply")
public Result queryUsers(String key){
Sql sql = Sqls.create("""
SELECT
id,
loginname,
username,
birthday,
mobile,
sex,
unitName,
unionName,
unionId,
unitId
FROM
`vw_user`
$condition
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_ADMIN.name(), RoleConstant.BRANCH_UNION_OPERATOR.name())) {
cnd.and("unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.and("id", "=", SecurityUtil.getUserId());
}
}
if (Strings.isNotBlank(key)) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("username", key);
group.orLike("loginname", key);
cnd.and(group);
}
sql.setCondition(cnd);
Pagination pagination = exerciseCardService.listPageMap(1, 10, sql);
return Result.success().addData(pagination.getList());
}
}
@@ -0,0 +1,145 @@
package com.budwk.app.zhgh.dayofficework.exerciseCard.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.dayofficework.exerciseCard.service.ExerciseCardService;
import com.budwk.app.zhgh.dayofficework.exerciseCard.vo.ExercisePeopleImportVo;
import com.budwk.app.zhgh.staffbenefit.maternityLeave.service.MaternityLeaveService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberImportVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
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.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.AdaptBy;
import org.nutz.mvc.annotation.At;
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 javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.ArrayList;
/**
* @author : hongqiwei
* @description :
* @createDate : 2025/10/13 15:11
*/
@IocBean
@At("/platform/exerciseCard/query")
@Api("查询条件")
@Ok("json:full")
@Slf4j
public class ExerciseCardQueryController {
@Inject
private Dao dao;
@Inject
private ExerciseCardService exerciseCardService;
@At("/index")
@Ok("beetl:/platform/zhgh/dayofficework/exerciseCard/query/index.html")
@SaCheckPermission("exerciseCard.query")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission(value = {"exerciseCard.query", "h5.exerciseCard.query"}, mode = SaMode.OR)
public Result pageData(PageForm pageForm,
Integer year,
String unionId,
String unitId,
String searchKeyword,
String sex) {
Cnd cnd = Cnd.NEW();
// 年度查询条件
cnd.andEX("year(applyTime)", "=", year);
// 姓名和工号查询条件
if (StrUtil.isNotBlank(searchKeyword)) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("userName", "%" + searchKeyword + "%");
seg.orLike("loginName", "%" + searchKeyword + "%");
cnd.and(seg);
}
// 工会、单位名称查询条件
cnd.andEX("unionId", "=", unionId);
cnd.andEX("unitId", "=", unitId);
// 性别查询条件
cnd.andEX("sex", "=", sex);
cnd.desc("applyTime");
Pagination pagination = exerciseCardService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
return Result.success(pagination);
}
@At
@ApiOperation("删除")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"exerciseCard.query", "h5.exerciseCard.query"}, mode = SaMode.OR)
@SLog( tag = "删除工会报销", msg = "删除工会报销")
public Result delete(@Param("id") String id) {
exerciseCardService.delete(id);
return Result.success();
}
@At
@Ok("void")
@ApiOperation("导入模板下载")
@SaCheckPermission("exerciseCard.query")
public void downloadTemplate(HttpServletResponse response) {
try {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("人员导入模版", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), ExercisePeopleImportVo.class)
.sheet("人员导入模版")
.doWrite(ArrayList::new);
} catch (Exception e) {
throw new RuntimeException("导出失败");
}
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("导入人员")
@SaCheckPermission("exerciseCard.query")
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
public Result importData(TempFile file, Boolean isFlag) {
try {
System.out.println(isFlag);
NutMap nutMap = exerciseCardService.handlingMemberImport(file, isFlag);
if (Lang.isNotEmpty(nutMap)) {
return Result.success(nutMap);
}
return Result.success("导入成功");
} catch (Exception e) {
e.printStackTrace();
return Result.error();
}
}
}
@@ -0,0 +1,99 @@
package com.budwk.app.zhgh.dayofficework.exerciseCard.model;
import cn.hutool.json.JSONObject;
import com.budwk.app.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.Date;
import java.util.List;
/**
* @author : hongqiwei
* @description :
* @createDate : 2025/10/13 14:39
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Table("exercise_card")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("健身卡")
public class ExerciseCard extends BaseModel implements Serializable {
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR,width = 32)
@Comment("userId")
private String userId;
@Column
@ColDefine(type = ColType.VARCHAR,width = 32)
@Comment("姓名")
private String userName;
@Column
@ColDefine(type = ColType.VARCHAR,width = 32)
@Comment("性别")
private String sex;
@Column
@ColDefine(type = ColType.DATE)
@Comment("出生年月")
private Date birthday;
@Column
@ColDefine(type = ColType.VARCHAR,width = 32)
@Comment("工号")
private String loginName;
@Column
@ColDefine(type = ColType.VARCHAR,width = 32)
@Comment("所在工会Id")
private String unionId;
@Column
@ColDefine(type = ColType.VARCHAR,width = 50)
@Comment("所在工会")
private String unionName;
@Column
@ColDefine(type = ColType.VARCHAR,width = 32)
@Comment("所在单位Id")
private String unitId;
@Column
@ColDefine(type = ColType.VARCHAR,width = 50)
@Comment("所在单位")
private String unitName;
@Column
@Comment("初始额度")
@ColDefine(type = ColType.FLOAT, width = 10, precision = 2)
private Double initMoney;
@Column
@Comment("当前额度")
@ColDefine(type = ColType.FLOAT, width = 10, precision = 2)
private Double money;
@Column
@Comment("健身卡使用情况记录")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> usages;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("录入时间")
private Date applyTime;
}
@@ -0,0 +1,16 @@
package com.budwk.app.zhgh.dayofficework.exerciseCard.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.exerciseCard.model.ExerciseCard;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.upload.TempFile;
public interface ExerciseCardService extends BaseService<ExerciseCard> {
/**
* 导入会员数据处理
* @param file 文件
* @param isFlag 是否清空更新
*/
NutMap handlingMemberImport(TempFile file, Boolean isFlag);
}
@@ -0,0 +1,178 @@
package com.budwk.app.zhgh.dayofficework.exerciseCard.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.EasyExcelUtil;
import com.budwk.app.base.utils.ManyAddOrRenewUtil;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.zhgh.dayofficework.exerciseCard.model.ExerciseCard;
import com.budwk.app.zhgh.dayofficework.exerciseCard.service.ExerciseCardService;
import com.budwk.app.zhgh.dayofficework.exerciseCard.vo.ExercisePeopleImportVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
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.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.random.R;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.upload.TempFile;
import org.nutz.dao.entity.Record;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author : hongqiwei
* @description :
* @createDate : 2025/10/13 15:19
*/
@Slf4j
@IocBean(args = {"refer:dao"})
public class ExerciseCardServiceImpl extends BaseServiceImpl<ExerciseCard> implements ExerciseCardService {
@Inject
private ManyAddOrRenewUtil manyAddOrRenewUtil;
public ExerciseCardServiceImpl(Dao dao) {super(dao);}
@Aop(TransAop.READ_COMMITTED)
@Override
public NutMap handlingMemberImport(TempFile file, Boolean isFlag) {
List<T> ts = EasyExcelUtil.syncReadModel(file.getFile(), ExercisePeopleImportVo.class, 0, 1);
List<ExercisePeopleImportVo> list = JSONUtil.parseArray(JSONUtil.toJsonStr(ts)).toList(ExercisePeopleImportVo.class);
// 获取系统用户
Cnd cnd = Cnd.NEW();
List<Sys_user> dataUserList = dao().query(Sys_user.class, cnd);
Map<String, Sys_user> userMap = dataUserList.stream().collect(Collectors.toMap(Sys_user::getLoginname, v -> v));
Sql vwUserSql = Sqls.create("""
SELECT
id,
loginname,
username,
birthday,
mobile,
sex,
unitName,
unionName,
unionId,
unitId
FROM
`vw_user`
""");
vwUserSql.setCallback(Sqls.callback.records());
dao().execute(vwUserSql);
List<Record> vwUserList = vwUserSql.getList(Record.class);
Map<String, Record> vwUserMap = vwUserList.stream().collect(Collectors.toMap(r -> r.getString("loginname"), r -> r));
List<ExerciseCard> exerciseCardList = new ArrayList<>();
List<Sys_user> insertOrUpdateUserList = new ArrayList<>();
//返回错误记录
List<ExercisePeopleImportVo> errorInfos = new ArrayList<>();
for (ExercisePeopleImportVo v : list) {
if (StrUtil.isNotBlank(v.getLoginName())) {
v.setLoginName(v.getLoginName().trim());
} else {
v.setErrorInfo("工号不能为空!");
errorInfos.add(v);
continue;
}
//判断是否在系统中
Sys_user user = userMap.get(v.getLoginName());
if (user == null) {
v.setErrorInfo("该人员没有录入系统中!");
errorInfos.add(v);
continue;
}
//设置excel列的数据
user.setUsername(v.getUsername());
if (StrUtil.isNotBlank(v.getSex())) {
user.setSex(v.getSex());
}
insertOrUpdateUserList.add(user);
// 创建运动卡记录并设置用户详细信息
ExerciseCard exerciseCard = new ExerciseCard();
exerciseCard.setId(R.UU32());
// 根据工号查询vw_user视图,设置人员信息
Record vwUser = vwUserMap.get(v.getLoginName());
if (vwUser != null) {
exerciseCard.setUserId(vwUser.getString("id"));
exerciseCard.setBirthday(DateUtil.parse(vwUser.getString("birthday"), "yyyy-MM-dd"));
exerciseCard.setUnionId(vwUser.getString("unionId"));
exerciseCard.setUnitId(vwUser.getString("unitId"));
exerciseCard.setSex(vwUser.getString("sex"));
exerciseCard.setUnionName(vwUser.getString("unionName"));
exerciseCard.setUnitName(vwUser.getString("unitName"));
}
// 设置其他基本信息
exerciseCard.setLoginName(v.getLoginName());
exerciseCard.setUserName(v.getUsername());
exerciseCard.setApplyTime(new Date()); // 设置当前时间为申请时间
// 设置额度信息
if (v.getInitMoney() != null) {
try {
exerciseCard.setInitMoney(Double.valueOf(v.getInitMoney()));
} catch (NumberFormatException e) {
v.setErrorInfo("初始额度格式错误!");
errorInfos.add(v);
continue;
}
}
if (v.getMoney() != null) {
try {
exerciseCard.setMoney(Double.valueOf(v.getMoney()));
} catch (NumberFormatException e) {
v.setErrorInfo("当前额度格式错误!");
errorInfos.add(v);
continue;
}
}
exerciseCardList.add(exerciseCard);
}
if (Lang.isNotEmpty(insertOrUpdateUserList)) {
manyAddOrRenewUtil.asyncExecuteInsertOrUpdate(insertOrUpdateUserList,200);
// 批量保存运动卡记录
if (Lang.isNotEmpty(exerciseCardList)) {
manyAddOrRenewUtil.asyncExecuteInsert(exerciseCardList,200);
}
}
//如果有错误数据就返回给前端
if (Lang.isNotEmpty(errorInfos)) {
NutMap nutMap = NutMap.NEW();
nutMap.setv("totalCount", list.size());
nutMap.setv("successCount", Math.max(list.size() - errorInfos.size(), 0));
nutMap.setv("errorCount", errorInfos.size());
nutMap.setv("errorList", errorInfos.stream().map(v -> {
return NutMap.NEW().addv("工号", v.getLoginName()).addv("姓名", v.getUsername()).addv("错误原因", v.getErrorInfo());
}).collect(Collectors.toList()));
return nutMap;
}
return null;
}
}
@@ -0,0 +1,50 @@
package com.budwk.app.zhgh.dayofficework.exerciseCard.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @version 1.0
* @Author hongqiwei
* @nameExercisePeopleImportVo
* @Date 2025/10/14 10:04
* @注释
*/
@Data
@EqualsAndHashCode
@ContentRowHeight(20) // 内容行高
@HeadRowHeight(20) // 表头行高
@ColumnWidth(25) //列宽
public class ExercisePeopleImportVo {
@ExcelProperty("工号")
private String loginName;
@ExcelProperty("姓名")
private String username;
@ExcelProperty("性别")
private String sex;
@ExcelProperty("工会")
private String unionName;
@ExcelProperty("单位")
private String unitName;
@ExcelProperty("初始额度")
private Double initMoney;
@ExcelProperty("当前额度")
private Double money;
@ExcelIgnore
private String errorInfo;
}
@@ -67,7 +67,7 @@ public class MaternityLeaveCollectController {
@At
@ApiOperation("分页查询")
@SaCheckPermission(value = {"unionReimburse.collect", "h5.unionReimburse.collect"}, mode = SaMode.OR)
@SaCheckPermission(value = {"maternityLeave.collect", "h5.maternityLeave.collect"}, mode = SaMode.OR)
public Result pageData(PageForm pageForm,
Integer year,
String unionId,