1、生日祝福,采用杭医版
2、离退休做个链接图标
@@ -0,0 +1,85 @@
|
||||
package com.budwk.app.task.job.staffmanage;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.budwk.app.sys.models.Sys_msg;
|
||||
import com.budwk.app.sys.services.SysMsgService;
|
||||
import com.budwk.app.web.commons.base.Globals;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.model.UserBirthdayConfig;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayMsgLogService;
|
||||
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.Times;
|
||||
import org.nutz.lang.util.NutMap;
|
||||
import org.quartz.Job;
|
||||
import org.quartz.JobExecutionContext;
|
||||
import org.quartz.JobExecutionException;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 生日祝福定时任务,每天向当天生日的会员发送祝福消息。
|
||||
*/
|
||||
@IocBean
|
||||
public class UserBirthdayJob implements Job {
|
||||
|
||||
@Inject
|
||||
private Dao dao;
|
||||
|
||||
@Inject
|
||||
private SysMsgService sysMsgService;
|
||||
|
||||
@Inject
|
||||
private UserBirthdayMsgLogService userBirthdayMsgLogService;
|
||||
|
||||
/**
|
||||
* 查询当天生日会员并发送生日贺卡链接。
|
||||
*/
|
||||
@Override
|
||||
public void execute(JobExecutionContext context) throws JobExecutionException {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
id,
|
||||
loginname,
|
||||
username,
|
||||
unitName,
|
||||
unionName,
|
||||
mobile
|
||||
FROM
|
||||
vw_user
|
||||
WHERE
|
||||
MONTH(birthday) = MONTH(CURDATE())
|
||||
AND DAY(birthday) = DAY(CURDATE())
|
||||
AND member = 1
|
||||
AND birthday IS NOT NULL
|
||||
""");
|
||||
sql.setCallback(Sqls.callback.maps());
|
||||
dao.execute(sql);
|
||||
List<NutMap> users = sql.getList(NutMap.class);
|
||||
if (CollUtil.isEmpty(users)) {
|
||||
return;
|
||||
}
|
||||
|
||||
UserBirthdayConfig config = dao.fetch(UserBirthdayConfig.class, Cnd.NEW().desc("updatedAt"));
|
||||
String link = Globals.AppDomain + "/platform/staffManage/birthday/manage/h5?id=" + StrUtil.blankToDefault(config == null ? "" : config.getBirthdayUrl(), "");
|
||||
List<String> loginNames = users.stream().map(user -> user.getString("loginname")).distinct().toList();
|
||||
String title = "请点击查收您的生日祝福";
|
||||
String content = "校工会祝您:生日快乐,幸福安康!";
|
||||
|
||||
Sys_msg sysMsg = new Sys_msg();
|
||||
sysMsg.setTitle(title);
|
||||
sysMsg.setNote(content);
|
||||
sysMsg.setUrl(link);
|
||||
sysMsg.setType("user");
|
||||
sysMsg.setSendType("hide");
|
||||
sysMsg.setWechatEnterprise(true);
|
||||
sysMsg.setSendAt(Times.getTS());
|
||||
sysMsg.setCreatedBy("system");
|
||||
sysMsgService.saveMsg(sysMsg, loginNames.toArray(String[]::new), true);
|
||||
userBirthdayMsgLogService.insertLogs(users, title, content, "", link);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||
import com.budwk.app.base.result.Result;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayService;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.BirthdayGreetingSendVO;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.UserBirthdayPageVO;
|
||||
import io.swagger.annotations.Api;
|
||||
import org.nutz.ioc.loader.annotation.Inject;
|
||||
import org.nutz.ioc.loader.annotation.IocBean;
|
||||
import org.nutz.mvc.annotation.At;
|
||||
import org.nutz.mvc.annotation.Ok;
|
||||
|
||||
/**
|
||||
* 移动端生日祝福墙控制器,提供最近生日人员、赠礼和贺卡详情能力。
|
||||
*/
|
||||
@IocBean
|
||||
@At("/mobile/birthday/greeting")
|
||||
@Ok("json:full")
|
||||
@Api(tags = "移动端生日祝福墙")
|
||||
public class BirthdayGreetingsController {
|
||||
|
||||
@Inject
|
||||
private UserBirthdayService userBirthdayService;
|
||||
|
||||
/**
|
||||
* 最近生日人员页面。
|
||||
*/
|
||||
@At("")
|
||||
@Ok("beetl:/platform/zhghh5/birthday/greeting.html")
|
||||
@SaCheckLogin
|
||||
public void index() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 我收到的祝福页面。
|
||||
*/
|
||||
@At("/greeting_info")
|
||||
@Ok("beetl:/platform/zhghh5/birthday/greeting_info.html")
|
||||
@SaCheckLogin
|
||||
public void info() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 赠送祝福页面。
|
||||
*/
|
||||
@At("/greeting_list")
|
||||
@Ok("beetl:/platform/zhghh5/birthday/greeting_list.html")
|
||||
@SaCheckLogin
|
||||
public void list() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 贺卡详情页面。
|
||||
*/
|
||||
@At("/hk")
|
||||
@Ok("beetl:/platform/zhghh5/birthday/hk.html")
|
||||
@SaCheckLogin
|
||||
public void hk() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询最近生日人员。
|
||||
*/
|
||||
@At
|
||||
@SaCheckLogin
|
||||
public Result pageData(UserBirthdayPageVO pageForm, String searchKeyWord) {
|
||||
return Result.success(userBirthdayService.listGreetingUsers(pageForm, searchKeyWord));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询勾选的祝福对象。
|
||||
*/
|
||||
@At
|
||||
@SaCheckLogin
|
||||
public Result loadList(String greetingResult) {
|
||||
return Result.success(userBirthdayService.loadGreetingUsers(greetingResult));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询祝福礼物列表。
|
||||
*/
|
||||
@At
|
||||
@SaCheckLogin
|
||||
public Result giftList() {
|
||||
return Result.success(userBirthdayService.giftList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存赠送祝福记录。
|
||||
*/
|
||||
@At
|
||||
@SaCheckLogin
|
||||
public Result sendBlessing(BirthdayGreetingSendVO vo) {
|
||||
try {
|
||||
userBirthdayService.sendBlessing(vo);
|
||||
return Result.success();
|
||||
} catch (RuntimeException e) {
|
||||
return Result.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询当前用户收到的祝福。
|
||||
*/
|
||||
@At
|
||||
@SaCheckLogin
|
||||
public Result giftInfo(UserBirthdayPageVO pageForm, String username) {
|
||||
return Result.success(userBirthdayService.giftInfo(pageForm, username));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询单条贺卡祝福内容。
|
||||
*/
|
||||
@At
|
||||
@SaCheckLogin
|
||||
public Result findOne(String id) {
|
||||
return Result.success(userBirthdayService.findGreetingInfo(id));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import com.budwk.app.base.result.Result;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.model.UserBirthdayConfig;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayService;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.UserBirthdayPageVO;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.UserBirthdaySendMsgVO;
|
||||
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
|
||||
import io.swagger.annotations.Api;
|
||||
import org.nutz.ioc.loader.annotation.Inject;
|
||||
import org.nutz.ioc.loader.annotation.IocBean;
|
||||
import org.nutz.mvc.annotation.At;
|
||||
import org.nutz.mvc.annotation.Ok;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
/**
|
||||
* 生日祝福管理控制器,提供 PC 管理端列表、配置、发送和导出接口。
|
||||
*/
|
||||
@IocBean
|
||||
@Ok("json:full")
|
||||
@At("/platform/staffManage/birthday/manage")
|
||||
@Api(tags = "生日祝福管理")
|
||||
public class UserBirthdayManageController {
|
||||
|
||||
@Inject
|
||||
private UserBirthdayService userBirthdayService;
|
||||
|
||||
/**
|
||||
* PC 端生日祝福管理页。
|
||||
*/
|
||||
@At("")
|
||||
@Ok("beetl:/platform/zhgh/staffmanage/birthday/manage/index.html")
|
||||
@SaCheckPermission("staffManage.birthday.manage")
|
||||
public void index() {
|
||||
}
|
||||
|
||||
/**
|
||||
* H5 生日贺卡页,文件 ID 从消息链接透传给页面。
|
||||
*/
|
||||
@At("/h5")
|
||||
@Ok("beetl:/platform/zhghh5/staffmanage/birthday/index.html")
|
||||
@SaCheckLogin
|
||||
public void h5(String id, HttpServletRequest request) {
|
||||
// H5 页面需要服务端注入默认值,避免模板变量缺失时 Beetl 渲染失败。
|
||||
request.setAttribute("fileId", id == null ? "" : id);
|
||||
request.setAttribute("userName", SecurityUtil.getUserUsername());
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询生日人员分页数据。
|
||||
*/
|
||||
@At
|
||||
@SaCheckPermission("staffManage.birthday.manage")
|
||||
public Result pageData(UserBirthdayPageVO page) {
|
||||
return Result.success(userBirthdayService.pageBirthdayUsers(page));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出生日人员列表。
|
||||
*/
|
||||
@At
|
||||
@Ok("void")
|
||||
@SaCheckPermission("staffManage.birthday.manage")
|
||||
public void doExport(UserBirthdayPageVO page, HttpServletResponse response) {
|
||||
userBirthdayService.exportXlsx(page, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 按当前查询条件批量发送生日祝福。
|
||||
*/
|
||||
@At
|
||||
@SaCheckPermission("staffManage.birthday.manage")
|
||||
public Result sendMsgByQueryUsers(UserBirthdaySendMsgVO vo) {
|
||||
try {
|
||||
userBirthdayService.sendMsgByQueryUsers(vo);
|
||||
return Result.success();
|
||||
} catch (RuntimeException e) {
|
||||
return Result.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 给指定职工发送生日祝福。
|
||||
*/
|
||||
@At
|
||||
@SaCheckPermission("staffManage.birthday.manage")
|
||||
public Result sendMsgByUser(UserBirthdaySendMsgVO vo) {
|
||||
try {
|
||||
userBirthdayService.sendMsgByUser(vo);
|
||||
return Result.success();
|
||||
} catch (RuntimeException e) {
|
||||
return Result.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取生日贺卡配置,PC 管理端和 H5 展示页均会读取。
|
||||
*/
|
||||
@At
|
||||
@SaCheckLogin
|
||||
public Result getConfig() {
|
||||
return Result.success(userBirthdayService.getConfig());
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存生日贺卡配置。
|
||||
*/
|
||||
@At
|
||||
@SaCheckPermission("staffManage.birthday.manage")
|
||||
public Result saveOrModifyConfig(UserBirthdayConfig config) {
|
||||
userBirthdayService.saveOrModifyConfig(config);
|
||||
return Result.success();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import com.budwk.app.base.result.Result;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayMsgLogService;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.UserBirthdayMsgLogPageVO;
|
||||
import io.swagger.annotations.Api;
|
||||
import org.nutz.ioc.loader.annotation.Inject;
|
||||
import org.nutz.ioc.loader.annotation.IocBean;
|
||||
import org.nutz.mvc.annotation.At;
|
||||
import org.nutz.mvc.annotation.Ok;
|
||||
|
||||
/**
|
||||
* 生日祝福消息日志控制器。
|
||||
*/
|
||||
@IocBean
|
||||
@Ok("json:full")
|
||||
@At("/platform/staffManage/birthday/msgLog")
|
||||
@Api(tags = "生日祝福消息日志")
|
||||
public class UserBirthdayMsgLogController {
|
||||
|
||||
@Inject
|
||||
private UserBirthdayMsgLogService userBirthdayMsgLogService;
|
||||
|
||||
/**
|
||||
* PC 端生日祝福发送日志页。
|
||||
*/
|
||||
@At("")
|
||||
@Ok("beetl:/platform/zhgh/staffmanage/birthday/msglog/index.html")
|
||||
@SaCheckPermission("staffManage.birthday.msgLog")
|
||||
public void index() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询生日祝福发送日志分页数据。
|
||||
*/
|
||||
@At
|
||||
@SaCheckPermission("staffManage.birthday.msgLog")
|
||||
public Result pageData(UserBirthdayMsgLogPageVO page) {
|
||||
return Result.success(userBirthdayMsgLogService.pageMsgLogs(page));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.model;
|
||||
|
||||
import com.budwk.app.sys.models.Sys_file;
|
||||
import lombok.Data;
|
||||
import org.nutz.dao.entity.annotation.*;
|
||||
import org.nutz.dao.interceptor.annotation.PrevInsert;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 生日祝福墙礼物配置,用于移动端选择祝福礼物。
|
||||
*/
|
||||
@Data
|
||||
@Table("blessing_gift")
|
||||
@Comment("生日祝福墙礼物")
|
||||
public class BlessingGift {
|
||||
|
||||
@Column
|
||||
@Name
|
||||
@Comment("ID")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@PrevInsert(uu32 = true)
|
||||
private String id;
|
||||
|
||||
@Column
|
||||
@Comment("礼物名称")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String giftName;
|
||||
|
||||
@Column
|
||||
@Comment("礼物文件名称")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String fileName;
|
||||
|
||||
@Column
|
||||
@Comment("礼物图片")
|
||||
@ColDefine(type = ColType.MYSQL_JSON)
|
||||
private List<Sys_file> files;
|
||||
|
||||
@Column
|
||||
@Comment("排序字段")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 10)
|
||||
private String sortField;
|
||||
|
||||
@Column
|
||||
@Comment("创建人")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String createBy;
|
||||
|
||||
@Column
|
||||
@Comment("创建时间")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String createDate;
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.model;
|
||||
|
||||
import lombok.Data;
|
||||
import org.nutz.dao.entity.annotation.*;
|
||||
import org.nutz.dao.interceptor.annotation.PrevInsert;
|
||||
|
||||
/**
|
||||
* 生日祝福墙人员中间表,保存当期可被赠送祝福的生日人员。
|
||||
*/
|
||||
@Data
|
||||
@Table("greeting")
|
||||
@Comment("生日祝福墙人员")
|
||||
public class Greeting {
|
||||
|
||||
@Column
|
||||
@Name
|
||||
@Comment("ID")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@PrevInsert(uu32 = true)
|
||||
private String id;
|
||||
|
||||
@Column
|
||||
@Comment("生日月日,格式MMdd")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 4)
|
||||
private String birthday;
|
||||
|
||||
@Column
|
||||
@Comment("职工ID")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String userId;
|
||||
|
||||
@Column
|
||||
@Comment("职工姓名")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 100)
|
||||
private String username;
|
||||
|
||||
@Column
|
||||
@Comment("职工工号")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 120)
|
||||
private String loginname;
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.model;
|
||||
|
||||
import lombok.Data;
|
||||
import org.nutz.dao.entity.annotation.*;
|
||||
import org.nutz.dao.interceptor.annotation.PrevInsert;
|
||||
|
||||
/**
|
||||
* 生日祝福墙赠礼记录,保存赠送人与接收人的祝福内容。
|
||||
*/
|
||||
@Data
|
||||
@Table("greeting_info")
|
||||
@Comment("生日祝福墙赠礼记录")
|
||||
public class GreetingInfo {
|
||||
|
||||
@Column
|
||||
@Name
|
||||
@Comment("ID")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@PrevInsert(uu32 = true)
|
||||
private String id;
|
||||
|
||||
@Column
|
||||
@Comment("赠送人ID")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String presenter;
|
||||
|
||||
@Column
|
||||
@Comment("接收人ID")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String received;
|
||||
|
||||
@Column
|
||||
@Comment("礼物ID")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String giftId;
|
||||
|
||||
@Column
|
||||
@Comment("赠送时间")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String giftTime;
|
||||
|
||||
@Column
|
||||
@Comment("祝福语")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 255)
|
||||
private String message;
|
||||
|
||||
@Column
|
||||
@Comment("是否发送贺卡")
|
||||
@ColDefine(type = ColType.BOOLEAN)
|
||||
private Boolean isSend;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.model;
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
* 生日祝福配置,保存移动端贺卡展示图等全局配置。
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Table("user_birthday_config")
|
||||
@Comment("生日祝福配置")
|
||||
public class UserBirthdayConfig extends BaseModel {
|
||||
|
||||
@Column
|
||||
@Name
|
||||
@Comment("ID")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@PrevInsert(uu32 = true)
|
||||
private String id;
|
||||
|
||||
@Column
|
||||
@Comment("生日贺卡文件ID")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 64)
|
||||
private String birthdayUrl;
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.model;
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
* 生日祝福消息发送日志,记录每次发送到个人的消息内容和链接。
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Table("user_birthday_msg_log")
|
||||
@Comment("生日祝福消息日志")
|
||||
public class UserBirthdayMsgLog extends BaseModel {
|
||||
|
||||
@Column
|
||||
@Name
|
||||
@Comment("ID")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@PrevInsert(uu32 = true)
|
||||
private String id;
|
||||
|
||||
@Column
|
||||
@Comment("推送时间")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String pushTime;
|
||||
|
||||
@Column
|
||||
@Comment("消息标题")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 100)
|
||||
private String msgTitle;
|
||||
|
||||
@Column
|
||||
@Comment("消息内容")
|
||||
@ColDefine(type = ColType.TEXT)
|
||||
private String msgContent;
|
||||
|
||||
@Column
|
||||
@Comment("接收人")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String receiveBy;
|
||||
|
||||
@Column
|
||||
@Comment("接收人姓名")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String receiveName;
|
||||
|
||||
@Column
|
||||
@Comment("推送人")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String pushBy;
|
||||
|
||||
@Column
|
||||
@Comment("推送人姓名")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String pushByName;
|
||||
|
||||
@Column
|
||||
@Comment("推送类型")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String pushType;
|
||||
|
||||
@Column
|
||||
@Comment("卡片链接")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 500)
|
||||
private String link;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.service;
|
||||
|
||||
import com.budwk.app.base.page.Pagination;
|
||||
import com.budwk.app.base.service.BaseService;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.model.UserBirthdayMsgLog;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.UserBirthdayMsgLogPageVO;
|
||||
import org.nutz.lang.util.NutMap;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 生日祝福消息日志服务。
|
||||
*/
|
||||
public interface UserBirthdayMsgLogService extends BaseService<UserBirthdayMsgLog> {
|
||||
|
||||
/**
|
||||
* 分页查询生日祝福消息日志,并在查询层补齐页面展示所需的人员和推送字段别名。
|
||||
*
|
||||
* @param page 日志查询分页参数
|
||||
* @return 消息日志分页数据
|
||||
*/
|
||||
Pagination pageMsgLogs(UserBirthdayMsgLogPageVO page);
|
||||
|
||||
/**
|
||||
* 批量记录生日消息发送日志。
|
||||
*
|
||||
* @param users 接收人列表,至少包含 loginname 和 username
|
||||
* @param title 消息标题
|
||||
* @param content 消息内容
|
||||
* @param imageUrl 消息图片
|
||||
* @param link 跳转链接
|
||||
*/
|
||||
void insertLogs(List<NutMap> users, String title, String content, String imageUrl, String link);
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.service;
|
||||
|
||||
import com.budwk.app.base.page.Pagination;
|
||||
import com.budwk.app.base.service.BaseService;
|
||||
import com.budwk.app.sys.models.Sys_user;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.model.UserBirthdayConfig;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.BirthdayGreetingSendVO;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.UserBirthdayPageVO;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.UserBirthdaySendMsgVO;
|
||||
import org.nutz.dao.sql.Sql;
|
||||
import org.nutz.lang.util.NutMap;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 生日祝福业务服务,统一承载 PC 管理端、H5 贺卡、移动端祝福墙所需业务。
|
||||
*/
|
||||
public interface UserBirthdayService extends BaseService<Sys_user> {
|
||||
|
||||
/**
|
||||
* 构造生日人员通用查询 SQL。
|
||||
*
|
||||
* @param pageVO 查询参数
|
||||
* @return 可直接执行的 Nutz SQL
|
||||
*/
|
||||
Sql commonSql(UserBirthdayPageVO pageVO);
|
||||
|
||||
/**
|
||||
* 查询生日人员分页数据。
|
||||
*
|
||||
* @param pageVO 查询参数
|
||||
* @return 分页结果
|
||||
*/
|
||||
Pagination pageBirthdayUsers(UserBirthdayPageVO pageVO);
|
||||
|
||||
/**
|
||||
* 导出生日人员列表。
|
||||
*
|
||||
* @param pageVO 查询参数
|
||||
* @param response 下载响应
|
||||
*/
|
||||
void exportXlsx(UserBirthdayPageVO pageVO, HttpServletResponse response);
|
||||
|
||||
/**
|
||||
* 按当前筛选条件批量发送生日祝福。
|
||||
*
|
||||
* @param vo 发送参数和筛选条件
|
||||
*/
|
||||
void sendMsgByQueryUsers(UserBirthdaySendMsgVO vo);
|
||||
|
||||
/**
|
||||
* 给指定职工发送生日祝福。
|
||||
*
|
||||
* @param vo 发送参数
|
||||
*/
|
||||
void sendMsgByUser(UserBirthdaySendMsgVO vo);
|
||||
|
||||
/**
|
||||
* 获取当前生日贺卡配置,若不存在则返回空配置对象。
|
||||
*
|
||||
* @return 生日配置
|
||||
*/
|
||||
UserBirthdayConfig getConfig();
|
||||
|
||||
/**
|
||||
* 保存或更新生日贺卡配置。
|
||||
*
|
||||
* @param config 生日配置
|
||||
*/
|
||||
void saveOrModifyConfig(UserBirthdayConfig config);
|
||||
|
||||
/**
|
||||
* 查询移动端祝福墙最近生日人员。
|
||||
*
|
||||
* @param pageVO 分页参数
|
||||
* @param searchKeyword 姓名或工号关键字
|
||||
* @return 人员列表
|
||||
*/
|
||||
List<NutMap> listGreetingUsers(UserBirthdayPageVO pageVO, String searchKeyword);
|
||||
|
||||
/**
|
||||
* 查询已勾选的祝福对象。
|
||||
*
|
||||
* @param greetingResult 逗号分隔的用户 ID
|
||||
* @return 人员列表
|
||||
*/
|
||||
List<NutMap> loadGreetingUsers(String greetingResult);
|
||||
|
||||
/**
|
||||
* 查询祝福礼物列表。
|
||||
*
|
||||
* @return 礼物列表
|
||||
*/
|
||||
List<NutMap> giftList();
|
||||
|
||||
/**
|
||||
* 保存移动端祝福墙赠礼记录。
|
||||
*
|
||||
* @param vo 赠礼参数
|
||||
*/
|
||||
void sendBlessing(BirthdayGreetingSendVO vo);
|
||||
|
||||
/**
|
||||
* 查询当前用户收到的祝福礼物。
|
||||
*
|
||||
* @param pageVO 分页参数
|
||||
* @param username 赠送人姓名
|
||||
* @return 分页结果
|
||||
*/
|
||||
Pagination giftInfo(UserBirthdayPageVO pageVO, String username);
|
||||
|
||||
/**
|
||||
* 查询单条祝福记录,用于贺卡详情页展示。
|
||||
*
|
||||
* @param id 祝福记录 ID
|
||||
* @return 祝福记录
|
||||
*/
|
||||
NutMap findGreetingInfo(String id);
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.service.impl;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.budwk.app.base.service.impl.BaseServiceImpl;
|
||||
import com.budwk.app.base.page.Pagination;
|
||||
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.model.UserBirthdayMsgLog;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayMsgLogService;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.UserBirthdayMsgLogPageVO;
|
||||
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.IocBean;
|
||||
import org.nutz.lang.random.R;
|
||||
import org.nutz.lang.util.NutMap;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 生日祝福消息日志服务实现。
|
||||
*/
|
||||
@IocBean(args = {"refer:dao"})
|
||||
public class UserBirthdayMsgLogServiceImpl extends BaseServiceImpl<UserBirthdayMsgLog> implements UserBirthdayMsgLogService {
|
||||
|
||||
public UserBirthdayMsgLogServiceImpl(Dao dao) {
|
||||
super(dao);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询消息日志列表,通过 SQL 别名适配页面字段,不修改生日日志表或系统人员表结构。
|
||||
*/
|
||||
@Override
|
||||
public Pagination pageMsgLogs(UserBirthdayMsgLogPageVO page) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
l.id,
|
||||
vu.loginname AS loginname,
|
||||
IFNULL(vu.username, l.receiveName) AS username,
|
||||
vu.unionName AS unionName,
|
||||
vu.unitName AS unitName,
|
||||
l.msgTitle,
|
||||
l.msgContent,
|
||||
l.pushByName,
|
||||
l.pushTime,
|
||||
l.pushType,
|
||||
l.link
|
||||
FROM
|
||||
user_birthday_msg_log l
|
||||
LEFT JOIN vw_user vu ON vu.id = l.receiveBy
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
page.buildSearch(cnd, "l.", "vu.");
|
||||
cnd.desc("l.pushTime");
|
||||
sql.setCondition(cnd);
|
||||
return listPageMap(page.getPageNumber(), page.getPageSize(), sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量记录发送日志,便于管理端追踪生日祝福触达情况。
|
||||
*/
|
||||
@Override
|
||||
public void insertLogs(List<NutMap> users, String title, String content, String imageUrl, String link) {
|
||||
if (users == null || users.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
String pushBy;
|
||||
String pushByName;
|
||||
String pushType;
|
||||
// 根据是否存在当前登录上下文区分手动推送和系统推送,避免定时任务保存日志失败。
|
||||
try {
|
||||
pushBy = SecurityUtil.getUserId();
|
||||
pushByName = SecurityUtil.getUserUsername();
|
||||
pushType = "\u624b\u52a8\u63a8\u9001";
|
||||
} catch (Exception e) {
|
||||
pushBy = "system";
|
||||
pushByName = "\u7cfb\u7edf\u63a8\u9001";
|
||||
pushType = "\u7cfb\u7edf\u63a8\u9001";
|
||||
}
|
||||
String pushTime = DateUtil.now();
|
||||
String finalPushBy = pushBy;
|
||||
String finalPushByName = pushByName;
|
||||
String finalPushType = pushType;
|
||||
List<UserBirthdayMsgLog> logs = users.stream().map(user -> {
|
||||
UserBirthdayMsgLog msgLog = new UserBirthdayMsgLog();
|
||||
msgLog.setId(R.UU32());
|
||||
msgLog.setReceiveBy(user.getString("id"));
|
||||
msgLog.setReceiveName(user.getString("username"));
|
||||
msgLog.setMsgTitle(title);
|
||||
msgLog.setMsgContent(content);
|
||||
msgLog.setPushBy(finalPushBy);
|
||||
msgLog.setPushByName(finalPushByName);
|
||||
msgLog.setPushType(finalPushType);
|
||||
msgLog.setPushTime(pushTime);
|
||||
msgLog.setLink(link);
|
||||
return msgLog;
|
||||
}).toList();
|
||||
dao().fastInsert(logs);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,380 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.service.impl;
|
||||
|
||||
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.collection.CollUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.budwk.app.base.page.Pagination;
|
||||
import com.budwk.app.base.service.impl.BaseServiceImpl;
|
||||
import com.budwk.app.base.utils.CommonDownloadUtil;
|
||||
import com.budwk.app.sys.models.Sys_msg;
|
||||
import com.budwk.app.sys.models.Sys_user;
|
||||
import com.budwk.app.sys.services.SysMsgService;
|
||||
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
|
||||
import com.budwk.app.web.commons.base.Globals;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.model.GreetingInfo;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.model.UserBirthdayConfig;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayMsgLogService;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayService;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.BirthdayGreetingSendVO;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.UserBirthdayPageVO;
|
||||
import com.budwk.app.zhgh.staffmanage.birthday.vo.UserBirthdaySendMsgVO;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
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.Times;
|
||||
import org.nutz.lang.util.NutMap;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 生日祝福业务服务实现,适配当前项目的用户视图、消息服务和文件预览路径。
|
||||
*/
|
||||
@IocBean(args = {"refer:dao"})
|
||||
public class UserBirthdayServiceImpl extends BaseServiceImpl<Sys_user> implements UserBirthdayService {
|
||||
|
||||
public UserBirthdayServiceImpl(Dao dao) {
|
||||
super(dao);
|
||||
}
|
||||
|
||||
@Inject
|
||||
private SysMsgService sysMsgService;
|
||||
|
||||
@Inject
|
||||
private UserBirthdayMsgLogService userBirthdayMsgLogService;
|
||||
|
||||
/**
|
||||
* 构造生日人员通用 SQL,按距离下一次生日的天数升序排列。
|
||||
*/
|
||||
@Override
|
||||
public Sql commonSql(UserBirthdayPageVO page) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
u.id,
|
||||
u.loginname,
|
||||
u.username,
|
||||
u.sex,
|
||||
DATE_FORMAT(u.birthday, '%Y-%m-%d') AS birthday,
|
||||
u.mobile,
|
||||
u.unitName,
|
||||
u.unionName,
|
||||
u.userState,
|
||||
u.personType,
|
||||
u.preparedBy,
|
||||
DATEDIFF(
|
||||
CASE
|
||||
WHEN DATE_FORMAT(u.birthday, '%m-%d') >= DATE_FORMAT(NOW(), '%m-%d')
|
||||
THEN CONCAT(YEAR(NOW()), '-', DATE_FORMAT(u.birthday, '%m-%d'))
|
||||
ELSE CONCAT(YEAR(NOW()) + 1, '-', DATE_FORMAT(u.birthday, '%m-%d'))
|
||||
END,
|
||||
CURDATE()
|
||||
) AS daysUntilBirthday
|
||||
FROM
|
||||
vw_user u
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.and("u.birthday", "is not", null);
|
||||
cnd.and("u.member", "=", true);
|
||||
page.buildSearch(cnd, "u.");
|
||||
cnd.asc("daysUntilBirthday");
|
||||
sql.setCondition(cnd);
|
||||
return sql;
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行生日人员分页查询。
|
||||
*/
|
||||
@Override
|
||||
public Pagination pageBirthdayUsers(UserBirthdayPageVO pageVO) {
|
||||
return listPageMap(pageVO.getPageNumber(), pageVO.getPageSize(), commonSql(pageVO));
|
||||
}
|
||||
|
||||
/**
|
||||
* 按管理端当前筛选条件导出生日人员,强制使用 XSSF 格式。
|
||||
*/
|
||||
@Override
|
||||
public void exportXlsx(UserBirthdayPageVO pageVO, HttpServletResponse response) {
|
||||
Sql sql = commonSql(pageVO);
|
||||
List<NutMap> list = listMap(sql);
|
||||
|
||||
List<ExcelExportEntity> entities = new ArrayList<>();
|
||||
entities.add(new ExcelExportEntity("工号", "loginname", 20));
|
||||
entities.add(new ExcelExportEntity("姓名", "username", 20));
|
||||
entities.add(new ExcelExportEntity("性别", "sex", 10));
|
||||
entities.add(new ExcelExportEntity("联系方式", "mobile", 20));
|
||||
entities.add(new ExcelExportEntity("出生年月", "birthday", 20));
|
||||
entities.add(new ExcelExportEntity("生日倒计时(天)", "daysUntilBirthday", 20));
|
||||
entities.add(new ExcelExportEntity("在职状态", "userState", 20));
|
||||
entities.add(new ExcelExportEntity("人员类型", "personType", 20));
|
||||
entities.add(new ExcelExportEntity("人员性质", "preparedBy", 20));
|
||||
entities.add(new ExcelExportEntity("所属工会", "unionName", 20));
|
||||
entities.add(new ExcelExportEntity("所属单位", "unitName", 20));
|
||||
|
||||
ExportParams exportParams = new ExportParams();
|
||||
exportParams.setType(ExcelType.XSSF);
|
||||
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, list);
|
||||
CommonDownloadUtil.download("生日祝福人员.xlsx", workbook, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 按筛选条件发送生日祝福,并写入发送日志。
|
||||
*/
|
||||
@Override
|
||||
public void sendMsgByQueryUsers(UserBirthdaySendMsgVO vo) {
|
||||
validateSendParam(vo);
|
||||
List<NutMap> users = listMap(commonSql(vo));
|
||||
if (CollUtil.isEmpty(users)) {
|
||||
throw new RuntimeException("未查询到消息接收人");
|
||||
}
|
||||
sendBirthdayMessage(users, vo.getTitle(), vo.getContent());
|
||||
}
|
||||
|
||||
/**
|
||||
* 给单个用户发送生日祝福,并写入发送日志。
|
||||
*/
|
||||
@Override
|
||||
public void sendMsgByUser(UserBirthdaySendMsgVO vo) {
|
||||
validateSendParam(vo);
|
||||
if (StrUtil.isBlank(vo.getUserId())) {
|
||||
throw new RuntimeException("未获取到消息接收人");
|
||||
}
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
id,
|
||||
loginname,
|
||||
username
|
||||
FROM
|
||||
vw_user
|
||||
WHERE
|
||||
id = @id
|
||||
""").setParam("id", vo.getUserId());
|
||||
List<NutMap> users = listMap(sql);
|
||||
if (CollUtil.isEmpty(users)) {
|
||||
throw new RuntimeException("未获取到消息接收人");
|
||||
}
|
||||
sendBirthdayMessage(users, vo.getTitle(), vo.getContent());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取最新生日配置,没有配置时返回空对象,便于前端直接绑定。
|
||||
*/
|
||||
@Override
|
||||
public UserBirthdayConfig getConfig() {
|
||||
UserBirthdayConfig config = dao().fetch(UserBirthdayConfig.class, Cnd.NEW().desc("updatedAt"));
|
||||
return ObjectUtil.defaultIfNull(config, new UserBirthdayConfig());
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存生日配置,存在 ID 时更新,否则新增。
|
||||
*/
|
||||
@Override
|
||||
public void saveOrModifyConfig(UserBirthdayConfig config) {
|
||||
if (StrUtil.isBlank(config.getId())) {
|
||||
dao().insert(config);
|
||||
} else {
|
||||
dao().updateIgnoreNull(config);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询祝福墙最近生日人员,排除当前登录人,避免自己给自己送祝福。
|
||||
*/
|
||||
@Override
|
||||
public List<NutMap> listGreetingUsers(UserBirthdayPageVO pageVO, String searchKeyword) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
g.id,
|
||||
g.birthday,
|
||||
g.userId,
|
||||
g.username,
|
||||
g.loginname,
|
||||
u.unitName
|
||||
FROM
|
||||
greeting g
|
||||
LEFT JOIN vw_user u ON g.userId = u.id
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.where().and("g.userId", "!=", SecurityUtil.getUserId());
|
||||
if (StrUtil.isNotBlank(searchKeyword)) {
|
||||
SqlExpressionGroup group = new SqlExpressionGroup();
|
||||
group.orLike("g.username", searchKeyword);
|
||||
group.orLike("g.loginname", searchKeyword);
|
||||
cnd.and(group);
|
||||
}
|
||||
cnd.asc("g.birthday");
|
||||
sql.setCondition(cnd);
|
||||
return listMap(sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据移动端勾选结果查询祝福对象。
|
||||
*/
|
||||
@Override
|
||||
public List<NutMap> loadGreetingUsers(String greetingResult) {
|
||||
List<String> userIds = splitIds(greetingResult);
|
||||
if (CollUtil.isEmpty(userIds)) {
|
||||
return List.of();
|
||||
}
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
id,
|
||||
birthday,
|
||||
userId,
|
||||
username,
|
||||
loginname
|
||||
FROM
|
||||
greeting
|
||||
$condition
|
||||
""");
|
||||
sql.setCondition(Cnd.where("userId", "in", userIds));
|
||||
return listMap(sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询祝福墙礼物列表。
|
||||
*/
|
||||
@Override
|
||||
public List<NutMap> giftList() {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
bg.*
|
||||
FROM
|
||||
blessing_gift bg
|
||||
$condition
|
||||
""");
|
||||
sql.setCondition(Cnd.NEW().asc("bg.sortField"));
|
||||
return listMap(sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存移动端赠礼记录,逐个接收人生成一条祝福数据。
|
||||
*/
|
||||
@Override
|
||||
public void sendBlessing(BirthdayGreetingSendVO vo) {
|
||||
List<String> userIds = splitIds(vo.getGreetingResult());
|
||||
if (CollUtil.isEmpty(userIds)) {
|
||||
throw new RuntimeException("请选择祝福对象");
|
||||
}
|
||||
String currentUserId = SecurityUtil.getUserId();
|
||||
String today = DateUtil.formatDate(new java.util.Date());
|
||||
List<GreetingInfo> greetingInfos = userIds.stream().map(userId -> {
|
||||
GreetingInfo greetingInfo = new GreetingInfo();
|
||||
greetingInfo.setPresenter(currentUserId);
|
||||
greetingInfo.setReceived(userId);
|
||||
greetingInfo.setGiftId(vo.getGiftId());
|
||||
greetingInfo.setGiftTime(today);
|
||||
greetingInfo.setMessage(vo.getMessage());
|
||||
greetingInfo.setIsSend(Boolean.TRUE.equals(vo.getIsSend()));
|
||||
return greetingInfo;
|
||||
}).toList();
|
||||
dao().insert(greetingInfos);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询当前用户收到的祝福礼物,支持按赠送人姓名模糊筛选。
|
||||
*/
|
||||
@Override
|
||||
public Pagination giftInfo(UserBirthdayPageVO pageVO, String username) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
gi.id,
|
||||
su.username,
|
||||
bg.files,
|
||||
gi.giftTime,
|
||||
gi.message,
|
||||
su.unitName AS name,
|
||||
gi.isSend
|
||||
FROM
|
||||
greeting_info gi
|
||||
LEFT JOIN vw_user su ON gi.presenter = su.id
|
||||
LEFT JOIN blessing_gift bg ON gi.giftId = bg.id
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.where("gi.received", "=", SecurityUtil.getUserId());
|
||||
if (StrUtil.isNotBlank(username)) {
|
||||
cnd.where().andLike("su.username", username);
|
||||
}
|
||||
cnd.desc("gi.giftTime");
|
||||
sql.setCondition(cnd);
|
||||
return listPageMap(pageVO.getPageNumber(), pageVO.getPageSize(), sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询单条祝福记录,供贺卡详情页展示赠送人和祝福语。
|
||||
*/
|
||||
@Override
|
||||
public NutMap findGreetingInfo(String id) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
su.username,
|
||||
gi.message
|
||||
FROM
|
||||
greeting_info gi
|
||||
LEFT JOIN vw_user su ON gi.presenter = su.id
|
||||
WHERE
|
||||
gi.id = @id
|
||||
""").setParam("id", id);
|
||||
List<NutMap> list = listMap(sql);
|
||||
return CollUtil.isEmpty(list) ? NutMap.NEW() : list.get(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验消息标题和内容,避免生成空消息。
|
||||
*/
|
||||
private void validateSendParam(UserBirthdaySendMsgVO vo) {
|
||||
if (StrUtil.isBlank(vo.getTitle())) {
|
||||
throw new RuntimeException("请输入标题");
|
||||
}
|
||||
if (StrUtil.isBlank(vo.getContent())) {
|
||||
throw new RuntimeException("请输入发送内容");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 统一发送生日消息并记录日志,保证单人和批量发送行为一致。
|
||||
*/
|
||||
private void sendBirthdayMessage(List<NutMap> users, String title, String content) {
|
||||
UserBirthdayConfig config = getConfig();
|
||||
String link = Globals.AppDomain + "/platform/staffManage/birthday/manage/h5?id=" + StrUtil.blankToDefault(config.getBirthdayUrl(), "");
|
||||
List<String> loginNames = users.stream().map(user -> user.getString("loginname")).filter(StrUtil::isNotBlank).distinct().toList();
|
||||
if (CollUtil.isEmpty(loginNames)) {
|
||||
throw new RuntimeException("未获取到有效消息接收人");
|
||||
}
|
||||
|
||||
Sys_msg sysMsg = new Sys_msg();
|
||||
sysMsg.setTitle(title);
|
||||
sysMsg.setNote(content);
|
||||
sysMsg.setUrl(link);
|
||||
sysMsg.setType("user");
|
||||
sysMsg.setSendType("hide");
|
||||
sysMsg.setWechatEnterprise(true);
|
||||
sysMsg.setSendAt(Times.getTS());
|
||||
sysMsg.setCreatedBy(SecurityUtil.getUserId());
|
||||
sysMsgService.saveMsg(sysMsg, loginNames.toArray(String[]::new), true);
|
||||
userBirthdayMsgLogService.insertLogs(users, title, content, "", link);
|
||||
}
|
||||
|
||||
/**
|
||||
* 拆分移动端传入的逗号分隔 ID,过滤空值。
|
||||
*/
|
||||
private List<String> splitIds(String ids) {
|
||||
if (StrUtil.isBlank(ids)) {
|
||||
return List.of();
|
||||
}
|
||||
return Arrays.stream(ids.split(",")).filter(StrUtil::isNotBlank).distinct().toList();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 移动端祝福墙赠礼参数。
|
||||
*/
|
||||
@Data
|
||||
public class BirthdayGreetingSendVO {
|
||||
|
||||
/**
|
||||
* 逗号分隔的接收人 ID 列表。
|
||||
*/
|
||||
private String greetingResult;
|
||||
|
||||
/**
|
||||
* 礼物 ID、祝福语和是否同步发送贺卡。
|
||||
*/
|
||||
private String giftId;
|
||||
private String message;
|
||||
private Boolean isSend;
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.vo;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.budwk.app.base.param.PageForm;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.nutz.dao.Cnd;
|
||||
import org.nutz.dao.util.cri.SqlExpressionGroup;
|
||||
|
||||
/**
|
||||
* 生日祝福消息日志查询参数。
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class UserBirthdayMsgLogPageVO extends PageForm {
|
||||
|
||||
/**
|
||||
* 按接收人工号、姓名、标题进行模糊检索。
|
||||
*/
|
||||
private String keyword;
|
||||
private String unionId;
|
||||
private String unitId;
|
||||
|
||||
/**
|
||||
* 构造日志列表查询条件。
|
||||
*
|
||||
* @param cnd Nutz 查询条件对象
|
||||
*/
|
||||
public void buildSearch(Cnd cnd) {
|
||||
buildSearch(cnd, "", "");
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造日志列表查询条件,prefix 用于适配带表别名的 SQL 查询。
|
||||
*
|
||||
* @param cnd Nutz 查询条件对象
|
||||
* @param prefix 字段前缀,例如 l.
|
||||
*/
|
||||
public void buildSearch(Cnd cnd, String prefix) {
|
||||
buildSearch(cnd, prefix, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造日志列表查询条件,分别适配日志表别名和人员视图别名。
|
||||
*
|
||||
* @param cnd Nutz 查询条件对象
|
||||
* @param logPrefix 日志表字段前缀,例如 l.
|
||||
* @param userPrefix 人员视图字段前缀,例如 vu.
|
||||
*/
|
||||
public void buildSearch(Cnd cnd, String logPrefix, String userPrefix) {
|
||||
String alias = StrUtil.blankToDefault(logPrefix, "");
|
||||
String key = StrUtil.blankToDefault(keyword, getSearchKeyword());
|
||||
if (StrUtil.isNotBlank(key)) {
|
||||
SqlExpressionGroup group = new SqlExpressionGroup();
|
||||
group.orLike(StrUtil.blankToDefault(userPrefix, "") + "loginname", key);
|
||||
group.orLike(alias + "receiveName", key);
|
||||
group.orLike(alias + "msgTitle", key);
|
||||
cnd.and(group);
|
||||
}
|
||||
String userAlias = StrUtil.blankToDefault(userPrefix, "");
|
||||
cnd.andEX(userAlias + "unionId", "=", unionId);
|
||||
cnd.andEX(userAlias + "unitId", "=", unitId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.vo;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.budwk.app.base.param.PageForm;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.nutz.dao.Cnd;
|
||||
import org.nutz.dao.util.cri.SqlExpressionGroup;
|
||||
import org.nutz.dao.util.cri.Static;
|
||||
import org.nutz.json.Json;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 生日人员分页查询参数,统一承载 PC 列表、导出和批量发送的筛选条件。
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class UserBirthdayPageVO extends PageForm {
|
||||
|
||||
/**
|
||||
* 按工号、姓名、手机号进行模糊检索。
|
||||
*/
|
||||
private String keyword;
|
||||
|
||||
/**
|
||||
* 指定工会、单位、人员类型等筛选条件。
|
||||
*/
|
||||
private String unionId;
|
||||
private String unitId;
|
||||
private String personType;
|
||||
private String userState;
|
||||
private String sex;
|
||||
private String preparedBy;
|
||||
private String userStates;
|
||||
private String personTypes;
|
||||
private String preparedBys;
|
||||
|
||||
/**
|
||||
* 生日月份,支持一次查询多个月份。
|
||||
*/
|
||||
private List<Integer> birthMonths;
|
||||
|
||||
/**
|
||||
* 构造生日人员查询条件,prefix 用于适配不同 SQL 表别名。
|
||||
*
|
||||
* @param cnd Nutz 查询条件对象
|
||||
* @param prefix 字段前缀,例如 u.
|
||||
*/
|
||||
public void buildSearch(Cnd cnd, String prefix) {
|
||||
String alias = StrUtil.blankToDefault(prefix, "");
|
||||
String key = StrUtil.blankToDefault(keyword, getSearchKeyword());
|
||||
if (StrUtil.isNotBlank(key)) {
|
||||
SqlExpressionGroup group = new SqlExpressionGroup();
|
||||
group.orLike(alias + "loginname", key);
|
||||
group.orLike(alias + "username", key);
|
||||
group.orLike(alias + "mobile", key);
|
||||
cnd.and(group);
|
||||
}
|
||||
cnd.andEX(alias + "unionId", "=", unionId);
|
||||
cnd.andEX(alias + "unitId", "=", unitId);
|
||||
cnd.andEX(alias + "personType", "=", personType);
|
||||
cnd.andEX(alias + "personType", "in", parseMultiValues(personTypes));
|
||||
cnd.andEX(alias + "userState", "=", userState);
|
||||
cnd.andEX(alias + "userState", "in", parseMultiValues(userStates));
|
||||
cnd.andEX(alias + "sex", "=", sex);
|
||||
cnd.andEX(alias + "preparedBy", "=", preparedBy);
|
||||
cnd.andEX(alias + "preparedBy", "in", parseMultiValues(preparedBys));
|
||||
if (CollUtil.isNotEmpty(birthMonths)) {
|
||||
cnd.and(new Static("MONTH(" + alias + "birthday) IN (" + CollUtil.join(birthMonths, ",") + ")"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 将页面多选组件传入的 JSON 数组字符串转换为查询条件列表,兼容生日模块迁移后的前端字段命名。
|
||||
*/
|
||||
private List<String> parseMultiValues(String value) {
|
||||
if (StrUtil.isBlank(value)) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
List<String> values = Json.fromJsonAsList(String.class, value);
|
||||
return CollUtil.isEmpty(values) ? null : values;
|
||||
} catch (RuntimeException e) {
|
||||
List<String> values = new ArrayList<>();
|
||||
values.add(value);
|
||||
return values;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.budwk.app.zhgh.staffmanage.birthday.vo;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* 生日祝福发送参数,支持单人发送和按当前查询条件批量发送。
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class UserBirthdaySendMsgVO extends UserBirthdayPageVO {
|
||||
|
||||
/**
|
||||
* 单人发送时接收人的用户 ID。
|
||||
*/
|
||||
private String userId;
|
||||
|
||||
/**
|
||||
* 消息标题和内容。
|
||||
*/
|
||||
private String title;
|
||||
private String content;
|
||||
}
|
||||
@@ -0,0 +1,177 @@
|
||||
nutz:
|
||||
application:
|
||||
name: zhgh_jshvc
|
||||
mvc:
|
||||
ignore: ^(.+[.])(jsp|png|gif|jpg|js|css|jspx|jpeg|html|mp3|mp4|ico|svg|vue)$
|
||||
exclusions: /favicon/*,/assets/*,/druid/*,/upload/*,/components/*
|
||||
server:
|
||||
port: 80
|
||||
host: 0.0.0.0
|
||||
|
||||
jetty:
|
||||
contextPath: /
|
||||
threadpool:
|
||||
idleTimeout: 60000
|
||||
minThreads: 10
|
||||
maxThreads: 500
|
||||
page:
|
||||
403: /error/403.html
|
||||
404: /error/404.html
|
||||
500: /error/500.html
|
||||
#结合ftp使用,或用nginx代理ftp路径
|
||||
#staticPath: /Users/wizzer/temp/files
|
||||
#开发模式静态资源
|
||||
staticPathLocal: E:/projects/zhgh_jshvc/src/main/resources/static
|
||||
|
||||
security:
|
||||
tokenName: saToken
|
||||
timeout: 36000
|
||||
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
|
||||
# 允许同一账号并发登录,则系统参数 SessionOnlyOne 有效,亦可踢人下线并多了弹框提示功能
|
||||
isConcurrent: true
|
||||
# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
|
||||
isShare: false
|
||||
|
||||
wxwork:
|
||||
enable: true
|
||||
corpId: wwaca81b3016b9a58c
|
||||
corpSecret: Auc7919Su1Uds5ZErfZybBrt-8FkP5NA-dldZyQuOrM
|
||||
agentId: 1000131
|
||||
redirectUri : /platform/wxwork/oauth2/callback
|
||||
|
||||
wx:
|
||||
enable: false
|
||||
appID: wx4f65ff5f1b72e99d
|
||||
appSecret: a65cec4fb69980bd88258fc8433a3eef
|
||||
redirectUri: /platform/wx/oauth2/callback
|
||||
|
||||
cas:
|
||||
enable: false
|
||||
server-url-prefix: https://i.njupt.edu.cn/cas
|
||||
server-login-url: https://i.njupt.edu.cn/cas/login
|
||||
client-host-url: https://zhgh.njupt.edu.cn
|
||||
client-call-back-url: /platform/sso/login
|
||||
validation-type: cas
|
||||
|
||||
todo-platform:
|
||||
token-url: /accessToken
|
||||
base-url: https://gateway.jshvc.edu.cn
|
||||
save-or-update-url: /saveOrUpdate
|
||||
modify-url: /modifyInfo
|
||||
delete-task-url: /delete
|
||||
delete-instance-url: /realDelete
|
||||
app-id: XXXXXXXXXXXXXXXXXXXXXX
|
||||
app-secret: XXXXXXXXXXXXXXXXXXXXXX
|
||||
request-timeout: 5000
|
||||
|
||||
redis:
|
||||
host: 127.0.0.1
|
||||
port: 6379
|
||||
timeout: 2000
|
||||
max_redir: 10
|
||||
database: 1
|
||||
maxTotal: 500
|
||||
pool:
|
||||
maxTotal: 500
|
||||
maxIdle: 50
|
||||
minIdle: 10
|
||||
#password: test123
|
||||
mode: normal
|
||||
#cluster
|
||||
#nodes=192.168.6.31:6377,192.168.6.31:6378,192.168.6.28:6377,192.168.6.28:6378,192.168.6.34:6377,192.168.6.34:6378
|
||||
|
||||
jdbc:
|
||||
url: jdbc:mysql://192.168.21.212:3306/zhgh_jshvc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||
username: root
|
||||
password: 123456
|
||||
validationQuery: select 1
|
||||
maxActive: 1000
|
||||
testWhileIdle: true
|
||||
connectionProperties: druid.stat.slowSqlMillis=2000
|
||||
defaultAutoCommit: true
|
||||
|
||||
xsssql:
|
||||
ignore:
|
||||
urls: /platform/cms/content/article/addDo,/platform/sys/app/conf/addDo,/platform/sys/app/conf/editDo
|
||||
|
||||
beetl:
|
||||
RESOURCE:
|
||||
#本地路径,开发时设置本地路径,便于调试
|
||||
rootLocal: E:/projects/zhgh_jshvc/src/main/resources/views/
|
||||
root: views/
|
||||
DELIMITER_STATEMENT_START: "<!--#"
|
||||
DELIMITER_STATEMENT_END: "#-->"
|
||||
FT:
|
||||
#用法: ${"wizzer",escape}
|
||||
escape: com.budwk.app.web.commons.ext.beetl.HtmlEscapeFormat
|
||||
#用法: ${10241024,filesize}
|
||||
filesize: com.budwk.app.web.commons.ext.beetl.FileSizeFormat
|
||||
#用法: ${"",html2txt="100"} 截取100字符
|
||||
html2txt: com.budwk.app.web.commons.ext.beetl.Html2TxtFormat
|
||||
#用法: ${"",strlen="100"} 截取100字符
|
||||
strlen: com.budwk.app.web.commons.ext.beetl.StrlenFormat
|
||||
|
||||
#==============================================================
|
||||
#Configure Main Scheduler Properties
|
||||
#==============================================================
|
||||
#quartz延迟启动秒数
|
||||
quartz:
|
||||
startupDelay: 10
|
||||
scheduler:
|
||||
instanceName: defaultScheduler
|
||||
instanceId: AUTO
|
||||
#==============================================================
|
||||
#Skip Check Update
|
||||
#update:true
|
||||
#not update:false
|
||||
#==============================================================
|
||||
skipUpdateCheck: true
|
||||
#==============================================================
|
||||
#Configure JobStore isClustered=启用集群模式
|
||||
#==============================================================
|
||||
jobStore:
|
||||
class: org.quartz.impl.jdbcjobstore.JobStoreTX
|
||||
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
|
||||
#driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
|
||||
#driverDelegateClass: org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
|
||||
#Other delegates can see: http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-09.html
|
||||
dataSource: myDS
|
||||
tablePrefix: SYS_QRTZ_
|
||||
isClustered: false
|
||||
clusterCheckinInterval: 20000
|
||||
maxMisfiresToHandleAtATime: 120
|
||||
misfireThreshold: 120000
|
||||
txIsolationLevelSerializable: false
|
||||
|
||||
#==============================================================
|
||||
#Configure ThreadPool
|
||||
#==============================================================
|
||||
threadPool:
|
||||
class: org.quartz.simpl.SimpleThreadPool
|
||||
threadCount: 2
|
||||
threadPriority: 5
|
||||
threadsInheritContextClassLoaderOfInitializingThread: true
|
||||
|
||||
#============================================================================
|
||||
# Configure Plugins
|
||||
#============================================================================
|
||||
plugin:
|
||||
triggHistory:
|
||||
class: org.quartz.plugins.history.LoggingJobHistoryPlugin
|
||||
shutdownhook:
|
||||
class: org.quartz.plugins.management.ShutdownHookPlugin
|
||||
cleanShutdown: true
|
||||
#============================================================================
|
||||
# NutDao dataSource
|
||||
#============================================================================
|
||||
dataSource:
|
||||
myDS:
|
||||
connectionProvider:
|
||||
class: com.budwk.app.task.conn.NutConnectionProvider
|
||||
|
||||
minio:
|
||||
accessKey: minioadmin
|
||||
secretKey: minioadmin
|
||||
endPoint: http://192.168.21.214:9000
|
||||
bucket: njupt
|
||||
|
||||
|
After Width: | Height: | Size: 9.6 MiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 2.0 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 6.8 KiB |
@@ -0,0 +1,430 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="204px" height="204px" viewBox="0 0 204 204" enable-background="new 0 0 204 204" xml:space="preserve"> <image id="image0" width="204" height="204" x="0" y="0"
|
||||
href="data:image/png;base64,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" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 32 KiB |
@@ -477,10 +477,51 @@
|
||||
.v4-user-section {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 24px;
|
||||
gap: 18px;
|
||||
height: 100%;
|
||||
max-width: 355px;
|
||||
max-width: 520px;
|
||||
flex-shrink: 0;
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
.v4-retire-system-link {
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-width: 90px;
|
||||
height: 30px;
|
||||
padding: 0 14px;
|
||||
border-radius: 18px;
|
||||
color: #ffffff;
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
line-height: 1;
|
||||
text-decoration: none;
|
||||
white-space: nowrap;
|
||||
background: linear-gradient(90deg, #f5a300 0%, #ff8e00 42%, #ff4b16 100%);
|
||||
border: 1px solid rgba(255, 247, 184, 0.9);
|
||||
box-shadow: inset 0 2px 4px rgba(255, 255, 255, 0.48), 0 2px 6px rgba(141, 53, 0, 0.25);
|
||||
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
.v4-retire-system-link::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 3px;
|
||||
left: 8px;
|
||||
right: 8px;
|
||||
height: 10px;
|
||||
border-radius: 999px;
|
||||
background: linear-gradient(180deg, rgba(255, 255, 255, 0.62), rgba(255, 255, 255, 0));
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.v4-retire-system-link:hover {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
transform: translateY(-1px);
|
||||
box-shadow: inset 0 2px 4px rgba(255, 255, 255, 0.55), 0 3px 9px rgba(141, 53, 0, 0.32);
|
||||
}
|
||||
|
||||
.v4-notification {
|
||||
@@ -613,7 +654,12 @@
|
||||
}
|
||||
|
||||
.v4-user-section {
|
||||
gap: 16px;
|
||||
gap: 14px;
|
||||
}
|
||||
|
||||
.v4-retire-system-link {
|
||||
min-width: 78px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -692,6 +738,9 @@
|
||||
</div>
|
||||
|
||||
<div class="v4-user-section">
|
||||
<a class="v4-retire-system-link" href="http://192.168.73.133:8081/platform/login">
|
||||
离退休系统
|
||||
</a>
|
||||
<div class="v4-user-info">
|
||||
<span class="v4-user-name">${@auth.getPrincipalProperty('username')} (${@auth.getPrincipalProperty('loginname')})</span>
|
||||
<!-- <i class="fa fa-angle-down"></i> -->
|
||||
|
||||
@@ -0,0 +1,154 @@
|
||||
const COMMON_QUERY = {
|
||||
template: [
|
||||
'',
|
||||
' <div class="search">',
|
||||
' <div class="search-item">',
|
||||
' <div class="search-item-label">姓名/工号</div>',
|
||||
' <div class="search-item-option">',
|
||||
' <el-input placeholder="请输入姓名或工号查询" clearable v-model="pageForm.searchKeyword"></el-input>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' <div class="search-item">',
|
||||
' <div class="search-item-label">所属工会</div>',
|
||||
' <div class="search-item-option">',
|
||||
' <el-select @change="flushUnits" @clear="flushUnits" clearable filterable',
|
||||
' placeholder="请选择所属工会" style="width: 100%;" v-model="pageForm.unionId">',
|
||||
' <el-option :key="item.id" :label="item.unionname" :value="item.id"',
|
||||
' v-for="item in unions"></el-option>',
|
||||
' </el-select>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' <div class="search-item">',
|
||||
' <div class="search-item-label">所属单位</div>',
|
||||
' <div class="search-item-option">',
|
||||
' <el-select clearable filterable placeholder="请选择所属单位" style="width: 100%"',
|
||||
' v-model="pageForm.unitId">',
|
||||
' <el-option :key="item.id" :label="item.name" :value="item.id"',
|
||||
' v-for="item in units"></el-option>',
|
||||
' </el-select>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' <div class="search-item">',
|
||||
' <div class="search-item-label">在职状态</div>',
|
||||
' <div class="search-item-option">',
|
||||
' <dict-select v-model="pageForm.userStates" style="width: 100%" placeholder="在职状态" @change="doSearch"',
|
||||
' code="USER_STATE" multiple></dict-select>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' <div class="search-item">',
|
||||
' <div class="search-item-label">人员类型</div>',
|
||||
' <div class="search-item-option">',
|
||||
' <dict-select v-model="pageForm.personTypes" style="width: 100%" placeholder="人员类型" @change="doSearch"',
|
||||
' code="PERSON_TYPE" multiple></dict-select>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' <div class="search-item">',
|
||||
' <div class="search-item-label">人员性质</div>',
|
||||
' <div class="search-item-option">',
|
||||
' <dict-select v-model="pageForm.preparedBys" style="width: 100%" placeholder="人员性质" @change="doSearch"',
|
||||
' code="PREPARED_BY" multiple></dict-select>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' <div class="search-item">',
|
||||
' <div class="search-item-label">生日日期</div>',
|
||||
' <div class="search-item-option">',
|
||||
' <el-date-picker :picker-options="pickerOptions" @change="changeDateRangeChange"',
|
||||
' align="right" end-placeholder="结束日期" format="yyyy-MM-dd"',
|
||||
' range-separator="-" start-placeholder="开始日期" style="width: 100%"',
|
||||
' type="datetimerange" v-model="pageForm.changeDateRange"',
|
||||
' value-format="yyyy-MM-dd"></el-date-picker>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' <div class="search-query">',
|
||||
' <el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' '
|
||||
].join(''),
|
||||
data() {
|
||||
return {
|
||||
pickerOptions: {
|
||||
shortcuts: [
|
||||
{
|
||||
text: "未来一周",
|
||||
onClick(picker) {
|
||||
const end = new Date()
|
||||
const start = new Date()
|
||||
end.setTime(start.getTime() + 3600 * 1000 * 24 * 7)
|
||||
picker.$emit("pick", [start, end])
|
||||
}
|
||||
},
|
||||
{
|
||||
text: "未来一个月",
|
||||
onClick(picker) {
|
||||
const end = new Date()
|
||||
const start = new Date()
|
||||
end.setTime(start.getTime() + 3600 * 1000 * 24 * 30)
|
||||
picker.$emit("pick", [start, end])
|
||||
}
|
||||
},
|
||||
{
|
||||
text: "未来三个月",
|
||||
onClick(picker) {
|
||||
const end = new Date()
|
||||
const start = new Date()
|
||||
end.setTime(start.getTime() + 3600 * 1000 * 24 * 90)
|
||||
picker.$emit("pick", [start, end])
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
unions: [],
|
||||
units: [],
|
||||
pageForm: {
|
||||
searchKeyword: '',
|
||||
unionId: '',
|
||||
unitId: '',
|
||||
userStates: [],
|
||||
personTypes: [],
|
||||
preparedBys: [],
|
||||
changeDateRange: [],
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
doSearch(){
|
||||
const pageForm = clone(this.pageForm)
|
||||
pageForm.userStates = JSON.stringify(this.pageForm.userStates)
|
||||
pageForm.personTypes = JSON.stringify(this.pageForm.personTypes)
|
||||
pageForm.preparedBys = JSON.stringify(this.pageForm.preparedBys)
|
||||
this.$emit('search', pageForm)
|
||||
},
|
||||
changeDateRangeChange(val){
|
||||
if (val && val.length > 0) {
|
||||
this.pageForm.startDate = val[0]
|
||||
this.pageForm.endDate = val[1]
|
||||
} else {
|
||||
this.pageForm.startDate = null
|
||||
this.pageForm.endDate = null
|
||||
}
|
||||
this.doSearch()
|
||||
},
|
||||
async initData(){
|
||||
if (this.$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, SchoolUnionAdmin')) {
|
||||
this.unions = await getUnions(this.pageForm.unionId)
|
||||
this.units = await getUnits()
|
||||
} else {
|
||||
const user = JSON.parse(window.sessionStorage.getItem('user'))
|
||||
this.unions = await getUnions(user.union.id)
|
||||
this.units = await getUnits(user.union.id)
|
||||
}
|
||||
},
|
||||
async flushUnits(){
|
||||
this.$set(this.pageForm, "unitId", null)
|
||||
this.units = []
|
||||
if (this.pageForm.unionId) {
|
||||
this.units = await getUnits(this.pageForm.unionId)
|
||||
}
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.initData()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,296 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<el-card shadow="never">
|
||||
<common-query ref="commonQueryRef" @search="search"></common-query>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never" class="mt10">
|
||||
<table-tool label="数据列表(默认展示近15天的数据,搜索会忽略年份)">
|
||||
<el-button type="primary" size="small" @click="doExport">导出Excel</el-button>
|
||||
<el-button type="primary" size="small" @click="openSendMsgByQuery">发送通知</el-button>
|
||||
<el-button type="primary" size="small" @click="openPicSet">配置图片</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table"
|
||||
row-key="id" style="width: 100%">
|
||||
<el-table-column :index="indexMethod"
|
||||
header-align="center"
|
||||
label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column :label="column.label"
|
||||
:prop="column.prop"
|
||||
:sortable="column.sortable"
|
||||
:width="column.width"
|
||||
header-align="center"
|
||||
min-width="100px"
|
||||
show-overflow-tooltip
|
||||
v-for="column in tableColumns">
|
||||
</el-table-column>
|
||||
<el-table-column fixed="right" label="操作" width="250px">
|
||||
<template slot-scope="{row}">
|
||||
<el-button @click="openView(row)" size="mini" type="primary">人员信息</el-button>
|
||||
<el-button @click="openSendMsgByUser(row)" size="mini" type="primary">发送通知</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<template #view>
|
||||
<member-info ref="memberInfoRef"></member-info>
|
||||
</template>
|
||||
</guava>
|
||||
|
||||
<el-dialog
|
||||
:close-on-click-modal="false"
|
||||
:visible.sync="sendMsgByQueryDialogVisible"
|
||||
title="请在下方填写需要发送的内容"
|
||||
width="50%"
|
||||
>
|
||||
<el-form :model="sendMsgByQueryFormData" label-width="80px" ref="sendMsgByQueryForm">
|
||||
|
||||
<el-form-item
|
||||
:rules="[{required: true, message: '请输入发送标题', trigger: ['blur', 'change']}]"
|
||||
label="发送标题"
|
||||
prop="title">
|
||||
<el-input
|
||||
:rows="6"
|
||||
placeholder="请输入发送标题"
|
||||
v-model="sendMsgByQueryFormData.title">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item
|
||||
:rules="[{required: true, message: '请选择发送内容', trigger: ['blur', 'change']}]"
|
||||
label="发送内容"
|
||||
prop="content">
|
||||
<el-input
|
||||
:rows="6"
|
||||
placeholder="请输入内容"
|
||||
type="textarea"
|
||||
v-model="sendMsgByQueryFormData.content">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
<span class="dialog-footer" slot="footer">
|
||||
<el-button @click="sendMsgByQueryDialogVisible = false">取 消</el-button>
|
||||
<el-button @click="sendMsgByQueryUsers" type="primary">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 根据行内数据发送消息 -->
|
||||
<el-dialog
|
||||
:close-on-click-modal="false"
|
||||
:visible.sync="sendMsgByUserDialogVisible"
|
||||
title="请在下方填写需要发送的内容"
|
||||
width="50%"
|
||||
>
|
||||
<el-form :model="sendMsgByUserFormData" label-width="80px" ref="sendForm">
|
||||
<el-form-item label="发送对象" prop="userInfo">
|
||||
<el-input placeholder="请输入发送对象" readonly v-model="sendMsgByUserFormData.userInfo"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
:rules="[{required: true, message: '请输入发送标题', trigger: ['blur', 'change']}]"
|
||||
label="发送标题"
|
||||
prop="title">
|
||||
<el-input
|
||||
placeholder="请输入发送标题"
|
||||
v-model="sendMsgByUserFormData.title">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item
|
||||
:rules="[{required: true, message: '请选择发送内容', trigger: ['blur', 'change']}]"
|
||||
label="发送内容"
|
||||
prop="content">
|
||||
<el-input
|
||||
:rows="6"
|
||||
placeholder="请输入内容"
|
||||
type="textarea"
|
||||
v-model="sendMsgByUserFormData.content">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span class="dialog-footer" slot="footer">
|
||||
<el-button @click="sendMsgByUserDialogVisible = false">取 消</el-button>
|
||||
<el-button @click="sendMsgByUser" type="primary">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
|
||||
|
||||
<el-dialog
|
||||
:close-on-click-modal="false"
|
||||
:visible.sync="dialogVisible"
|
||||
title="生日贺卡图片设置"
|
||||
width="50%"
|
||||
>
|
||||
<el-form :model="formData" label-width="80px" ref="formRef">
|
||||
<el-form-item label="背景图片" prop="picUrl">
|
||||
<file-upload :upload_number="1"
|
||||
:upload_size="1024 * 1024 * 5"
|
||||
:value.sync="formData.picUrl"
|
||||
accept=".jpg,.jpeg,.png"
|
||||
upload_mode="image"
|
||||
upload_result_category="interval"
|
||||
upload_result_type="id"></file-upload>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="贺卡图片" prop="birthdayUrl">
|
||||
<file-upload :upload_number="1"
|
||||
:upload_size="1024 * 1024 * 5"
|
||||
:value.sync="formData.birthdayUrl"
|
||||
accept=".jpg,.jpeg,.png"
|
||||
upload_mode="image"
|
||||
upload_result_category="interval"
|
||||
upload_result_type="id"></file-upload>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span class="dialog-footer" slot="footer">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button @click="doSubmit" type="primary">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("commonQuery.js"){}#-->
|
||||
<!--#include("/platform/zhgh/staffmanage/member/common/info/memberInfo.js"){}#-->
|
||||
|
||||
new Vue({
|
||||
el: '#app',
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
pageForm: {},
|
||||
|
||||
tableColumns: [
|
||||
{ prop: "loginname", label: "工号", sortable: true },
|
||||
{ prop: "username", label: "姓名", sortable: true },
|
||||
{ prop: "sex", label: "性别", sortable: true },
|
||||
{ prop: "mobile", label: "联系方式", sortable: true },
|
||||
{ prop: "birthday", label: "出生年月", sortable: true },
|
||||
{ prop: "daysUntilBirthday", label: "生日倒计时(天)", sortable: true },
|
||||
{ prop: "userState", label: "在职状态", sortable: true, width: "100px" },
|
||||
{ prop: "personType", label: "人员类型", sortable: true, width: "120px" },
|
||||
{ prop: "preparedBy", label: "人员性质", sortable: true, width: "120px" },
|
||||
{ prop: "unionName", label: "所属工会", sortable: true, width: "160px" },
|
||||
{ prop: "unitName", label: "所属单位", sortable: true, width: "160px" }
|
||||
],
|
||||
|
||||
// 根据查询条件推送消息相关
|
||||
sendMsgByQueryDialogVisible: false,
|
||||
sendMsgByQueryFormData: {},
|
||||
|
||||
// 根据行内发送消息相关
|
||||
sendMsgByUserDialogVisible: false,
|
||||
sendMsgByUserFormData: {},
|
||||
|
||||
// 图片配置
|
||||
dialogVisible: false,
|
||||
formData: {
|
||||
picUrl: '',
|
||||
birthdayUrl: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
components: {
|
||||
'common-query': COMMON_QUERY,
|
||||
'member-info': MEMBER_INFO,
|
||||
},
|
||||
methods: {
|
||||
async openPicSet() {
|
||||
const resp = await $.post('/platform/staffManage/birthday/manage/getConfig')
|
||||
if (resp.code === 0) {
|
||||
this.formData = resp.data
|
||||
}
|
||||
this.dialogVisible = true
|
||||
},
|
||||
|
||||
doSubmit() {
|
||||
this.$confirm('确定要提交吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(async () => {
|
||||
const resp = await $.post('/platform/staffManage/birthday/manage/saveOrModifyConfig', this.formData)
|
||||
if (resp.code === 0) {
|
||||
this.$message.success('保存成功')
|
||||
this.dialogVisible = false
|
||||
} else {
|
||||
this.$message.error(resp.msg)
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
openSendMsgByUser(row) {
|
||||
this.sendMsgByUserFormData.userId = row.id
|
||||
this.sendMsgByUserFormData.userInfo = row.username
|
||||
this.sendMsgByUserDialogVisible = true
|
||||
},
|
||||
async sendMsgByUser() {
|
||||
const valid = await this.$refs['sendForm'].validate()
|
||||
if (!valid) return
|
||||
const confirm = await this.$confirm('您确定要向' + this.sendMsgByUserFormData.userInfo + '数据发送信息吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonTest: '取消',
|
||||
type: 'warning'
|
||||
})
|
||||
if (confirm === "confirm") {
|
||||
const resp = await $.post('/platform/staffManage/birthday/manage/sendMsgByUser',
|
||||
this.sendMsgByUserFormData
|
||||
)
|
||||
if (resp.code === 0) {
|
||||
this.sendMsgByUserDialogVisible = false
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
}
|
||||
},
|
||||
openSendMsgByQuery() {
|
||||
this.sendMsgByQueryFormData = JSON.parse(JSON.stringify(this.pageForm))
|
||||
this.sendMsgByQueryDialogVisible = true
|
||||
},
|
||||
async sendMsgByQueryUsers() {
|
||||
const valid = await this.$refs['sendMsgByQueryForm'].validate()
|
||||
if (!valid) return
|
||||
const confirm = await this.$confirm('您确定根据查询条件发送信息吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonTest: '取消',
|
||||
type: 'warning'
|
||||
})
|
||||
if (confirm === "confirm") {
|
||||
const resp = await $.post('/platform/staffManage/birthday/manage/sendMsgByQueryUsers', this.sendMsgByQueryFormData)
|
||||
if (resp.code === 0) {
|
||||
this.sendMsgByQueryDialogVisible = false
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
}
|
||||
},
|
||||
doExport() {
|
||||
this.$downLoad("/platform/staffManage/birthday/manage/doExport", this.pageForm)
|
||||
},
|
||||
openView(row) {
|
||||
this.$refs.guava.view()
|
||||
this.$nextTick(() => {
|
||||
this.$refs.memberInfoRef.onOpen(row.id)
|
||||
})
|
||||
},
|
||||
search(pageForm){
|
||||
this.pageForm = { ...this.pageForm, ...pageForm }
|
||||
this.pageData()
|
||||
},
|
||||
},
|
||||
async created() {
|
||||
this.pageData()
|
||||
},
|
||||
})
|
||||
</script>
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,74 @@
|
||||
const COMMON_QUERY = {
|
||||
template: [
|
||||
'',
|
||||
' <div class="search">',
|
||||
' <div class="search-item">',
|
||||
' <div class="search-item-label">姓名/工号</div>',
|
||||
' <div class="search-item-option">',
|
||||
' <el-input placeholder="请输入姓名或工号查询" clearable v-model="pageForm.searchKeyword"></el-input>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' <div class="search-item">',
|
||||
' <div class="search-item-label">所属工会</div>',
|
||||
' <div class="search-item-option">',
|
||||
' <el-select @change="flushUnits" @clear="flushUnits" clearable filterable',
|
||||
' placeholder="请选择所属工会" style="width: 100%;" v-model="pageForm.unionId">',
|
||||
' <el-option :key="item.id" :label="item.unionname" :value="item.id"',
|
||||
' v-for="item in unions"></el-option>',
|
||||
' </el-select>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' <div class="search-item">',
|
||||
' <div class="search-item-label">所属单位</div>',
|
||||
' <div class="search-item-option">',
|
||||
' <el-select clearable filterable placeholder="请选择所属单位" style="width: 100%"',
|
||||
' v-model="pageForm.unitId">',
|
||||
' <el-option :key="item.id" :label="item.name" :value="item.id"',
|
||||
' v-for="item in units"></el-option>',
|
||||
' </el-select>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' <div class="search-query">',
|
||||
' <el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>',
|
||||
' </div>',
|
||||
' </div>',
|
||||
' '
|
||||
].join(''),
|
||||
data() {
|
||||
return {
|
||||
|
||||
unions: [],
|
||||
units: [],
|
||||
pageForm: {
|
||||
searchKeyword: '',
|
||||
unionId: '',
|
||||
unitId: '',
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
doSearch(){
|
||||
this.$emit('search', this.pageForm)
|
||||
},
|
||||
async initData(){
|
||||
if (this.$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, SchoolUnionAdmin')) {
|
||||
this.unions = await getUnions(this.pageForm.unionId)
|
||||
this.units = await getUnits()
|
||||
} else {
|
||||
const user = JSON.parse(window.sessionStorage.getItem('user'))
|
||||
this.unions = await getUnions(user.union.id)
|
||||
this.units = await getUnits(user.union.id)
|
||||
}
|
||||
},
|
||||
async flushUnits(){
|
||||
this.$set(this.pageForm, "unitId", null)
|
||||
this.units = []
|
||||
if (this.pageForm.unionId) {
|
||||
this.units = await getUnits(this.pageForm.unionId)
|
||||
}
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.initData()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
<div id="app">
|
||||
<guava ref="guava">
|
||||
<el-card shadow="never">
|
||||
<common-query ref="commonQuery" @search="search"></common-query>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never" class="mt10">
|
||||
<table-tool :app="this" label="数据列表">
|
||||
<template #func>
|
||||
<!-- <el-button type="primary" size="small" @click="doExport">导出Excel</el-button>-->
|
||||
</template>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table"
|
||||
row-key="id" style="width: 100%">
|
||||
<el-table-column :index="indexMethod"
|
||||
header-align="center"
|
||||
label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column :label="column.label"
|
||||
:prop="column.prop"
|
||||
:sortable="column.sortable"
|
||||
:width="column.width"
|
||||
header-align="center"
|
||||
min-width="100px"
|
||||
show-overflow-tooltip
|
||||
v-for="column in tableColumns">
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("commonQuery.js"){}#-->
|
||||
|
||||
new Vue({
|
||||
el: '#app',
|
||||
mixins: [initTableMixins],
|
||||
data(){
|
||||
return{
|
||||
pageForm: {},
|
||||
|
||||
tableColumns: [
|
||||
{ prop: "loginname", label: "工号", sortable: true },
|
||||
{ prop: "username", label: "姓名", sortable: true },
|
||||
{ prop: "unionName", label: "所属工会", sortable: true, width: "160px" },
|
||||
{ prop: "unitName", label: "所属单位", sortable: true, width: "160px" },
|
||||
{ prop: "msgTitle", label: "消息标题", sortable: true },
|
||||
{ prop: "msgContent", label: "消息内容", sortable: true },
|
||||
{ prop: "pushByName", label: "推送人", sortable: true },
|
||||
{ prop: "pushTime", label: "推送时间", sortable: true },
|
||||
{ prop: "pushType", label: "推送类型", sortable: true },
|
||||
],
|
||||
}
|
||||
},
|
||||
components: {
|
||||
'common-query': COMMON_QUERY,
|
||||
},
|
||||
methods: {
|
||||
doExport(){
|
||||
|
||||
},
|
||||
search(pageForm){
|
||||
this.pageForm = { ...this.pageForm, ...pageForm }
|
||||
this.pageData()
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,132 @@
|
||||
<!--#
|
||||
layout("/layouts/platform_h5.html"){
|
||||
#-->
|
||||
|
||||
<style>
|
||||
.test{width:9em; overflow:hidden; white-space:nowrap;text-overflow: ellipsis;font-size: 10px;text-align: center;color: #a0a1a1
|
||||
}
|
||||
.test:hover{text-overflow:inherit; overflow:visible;}
|
||||
</style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<van-nav-bar title="生日祝福" left-arrow placeholder fixed
|
||||
@click-left="history.back()"></van-nav-bar>
|
||||
<div class="search-fixed">
|
||||
<van-search
|
||||
v-model="pageForm.searchKeyWord"
|
||||
shape="round"
|
||||
maxlength="10"
|
||||
@search="doSearch"
|
||||
placeholder="请输入教职工姓名或者教职工编号进行查询"
|
||||
>
|
||||
</van-search>
|
||||
|
||||
<div style="display: flex">
|
||||
<div style="width: calc(100% - 100px);background: rgb(255,255,255)">
|
||||
<h4 style="margin-left: 5%;color: rgb(122,110,96)">一份祝福拉进同事的距离~</h4>
|
||||
<h5 style="margin-left: 5%;color: rgb(122,110,96)">{{tableData.length}}同事即将生日</h5>
|
||||
</div>
|
||||
<div style="width: 100px;max-width: 100px">
|
||||
<van-image width="100px"
|
||||
height="100px"
|
||||
src="/assets/mobile/img/birthday/birthday1.png"
|
||||
></van-image>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style="margin-top: 160px;margin-bottom: 50px">
|
||||
|
||||
<div>
|
||||
<van-checkbox-group v-model="result">
|
||||
<van-grid :column-num="3" :border="false" style="background-color: white">
|
||||
<van-grid-item
|
||||
v-for="o in tableData"
|
||||
:key="o.userId" style="padding: 5px;">
|
||||
<span style="font-size: 10px">{{o.birthday.substr(0,2)}}-{{o.birthday.substr(2,4)}}</span>
|
||||
|
||||
<div style="background-image: url('/assets/mobile/img/birthday/birthday2.png');
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-size: 100% 100%;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
">
|
||||
<span style="font-size: 20px;font-weight: bold;font-family: cursive">{{o.username.substr(0,1)}}</span>
|
||||
</div>
|
||||
<span style="font-size: 10px">{{o.username}}</span>
|
||||
<div class="test">
|
||||
<span>{{o.unitName}}</span>
|
||||
</div>
|
||||
<!-- <span v-if="o.unitName.length>7" style="font-size: 10px;">{{o.unitName.substr(0,7)+"..."}}</span>-->
|
||||
<!-- <span v-else style="font-size: 10px">{{o.unitName}}</span>-->
|
||||
<van-checkbox
|
||||
style="margin-left: 80px;margin-top: -35px"
|
||||
icon-size="20px"
|
||||
:name="o.userId" ref="checkboxes">
|
||||
</van-checkbox>
|
||||
</van-grid-item>
|
||||
</van-grid>
|
||||
</van-checkbox-group>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<van-tabbar route>
|
||||
<van-tabbar-item replace @click="sendBlessings()" style="font-size: 16px;">送上祝福</van-tabbar-item>
|
||||
<van-tabbar-item replace @click="showMine()" style="font-size: 16px">我收到的</van-tabbar-item>
|
||||
</van-tabbar>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<script nonce="${cspNonce!}">
|
||||
new Vue({
|
||||
el: '#app',
|
||||
data() {
|
||||
return {
|
||||
tableData: [],
|
||||
pageForm: {},
|
||||
checked: true,
|
||||
result: [],
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
doSearch() {
|
||||
this.onLoad()
|
||||
},
|
||||
async onLoad() {
|
||||
const res = await $.post('/mobile/birthday/greeting/pageData', this.pageForm)
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data
|
||||
}
|
||||
},
|
||||
//送上祝福
|
||||
sendBlessings() {
|
||||
if(this.result.length===0){
|
||||
this.$toast.fail("请选择教职工");
|
||||
return;
|
||||
}
|
||||
localStorage.setItem("greetingResult",this.result);
|
||||
window.location.href = '/mobile/birthday/greeting/greeting_list'
|
||||
},
|
||||
toggle(index) {
|
||||
this.$refs.checkboxes[index].toggle();
|
||||
},
|
||||
showMine() {
|
||||
window.location.href = '/mobile/birthday/greeting/greeting_info'
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.onLoad();
|
||||
},
|
||||
components: {
|
||||
|
||||
},
|
||||
})
|
||||
</script>
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,134 @@
|
||||
<!--#
|
||||
layout("/layouts/platform_h5.html"){
|
||||
#-->
|
||||
|
||||
<style>
|
||||
.van-doc-card {
|
||||
margin: 14px;
|
||||
padding: 6px;
|
||||
background-color: #fff;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 8px 12px #ebedf0;
|
||||
line-height: 25px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.van-cell {
|
||||
padding: 4px 16px;
|
||||
}
|
||||
.van-cell-group--inset {
|
||||
margin: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
|
||||
<m-page-loading v-if="mLoading"></m-page-loading>
|
||||
|
||||
<van-nav-bar title="我收到的祝福" left-arrow placeholder fixed
|
||||
@click-left="history.back()"></van-nav-bar>
|
||||
|
||||
<div class="search-fixed">
|
||||
<van-search
|
||||
v-model="pageForm.username"
|
||||
shape="round"
|
||||
maxlength="10"
|
||||
@search="doSearch"
|
||||
placeholder="请输入教职工姓名进行查询"
|
||||
>
|
||||
</van-search>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 70px">
|
||||
<van-list v-model="mLoading" :finished="finished" :finished-text="giftInfo.length>0?'没有更多了':''"
|
||||
@load="onLoad">
|
||||
|
||||
<div v-for="o in giftInfo" :key="o.id" class="van-doc-card">
|
||||
<div>
|
||||
<div style="font-size: 15px;
|
||||
font-weight: bold;
|
||||
flex: 1;
|
||||
margin-left: 15px;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;">
|
||||
<span style="color: #3ea1ec">{{o.username}}</span>
|
||||
<span style="color: #3ea1ec">|</span>
|
||||
<span style="font-size: 10px;font-weight: normal;color: #a0a1a1">{{o.name}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div style="font-size: 10px">
|
||||
<van-cell-group inset >
|
||||
<van-cell :border="false" title="赠送日期">{{o.giftTime}}</van-cell>
|
||||
<van-cell :border="false" title="祝福语">
|
||||
<span v-if="o.message.length==0">无</span>
|
||||
<span v-if="o.message.length>0">{{o.message}}</span>
|
||||
</van-cell>
|
||||
<van-cell :border="false" title="生日贺卡" @click="showHk(o)"
|
||||
v-if="o.isSend==1" is-link value="点击展示"></van-cell>
|
||||
<van-cell :border="false" title="赠送礼物">
|
||||
<van-image style="width: 50px;height: 50px" :src="'/file_server/fileStreamPreview?id=' + o.files[0].id" @click="showGift('/file_server/fileStreamPreview?id=' + o.files[0].id,o.id)"></van-image>
|
||||
</van-cell>
|
||||
</van-cell-group>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</van-list>
|
||||
<van-empty
|
||||
v-if="mLoading==false&&giftInfo.length==0"
|
||||
class="custom-image"
|
||||
image="/none.svg"
|
||||
description="暂无数据"
|
||||
></van-empty>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<script nonce="${cspNonce!}">
|
||||
new Vue({
|
||||
el:'#app',
|
||||
mixins: [mobileMixins],
|
||||
data(){
|
||||
return{
|
||||
show: false,
|
||||
images:'',
|
||||
giftInfo:[],
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
doSearch(){
|
||||
this.pageForm.pageNumber = 1
|
||||
this.giftInfo = []
|
||||
this.finished = false
|
||||
this.onLoad()
|
||||
},
|
||||
async onLoad() {
|
||||
this.mLoading = true
|
||||
const res = await $.post('/mobile/birthday/greeting/giftInfo', this.pageForm)
|
||||
this.mLoading = false
|
||||
if (res.code === 0) {
|
||||
res.data.list.forEach(v => {
|
||||
if(!(typeof v.files =='object')){
|
||||
v.files = JSON.parse(v.files)
|
||||
}
|
||||
})
|
||||
this.giftInfo = this.giftInfo.concat(res.data.list)
|
||||
if (this.giftInfo.length >= res.data.totalCount) {
|
||||
this.finished = true
|
||||
} else {
|
||||
this.pageForm.pageNumber++
|
||||
}
|
||||
}
|
||||
},
|
||||
showGift(data){
|
||||
vant.ImagePreview([data])
|
||||
},
|
||||
showHk(o){
|
||||
window.location.href='/mobile/birthday/greeting/hk?id='+o.id
|
||||
},
|
||||
},
|
||||
created(){
|
||||
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,173 @@
|
||||
<!--#
|
||||
layout("/layouts/platform_h5.html"){
|
||||
#-->
|
||||
|
||||
<style>
|
||||
.sub{
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-size: 100% 100%;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="app" style="background-color: white">
|
||||
<van-nav-bar title="精选礼物" left-arrow placeholder fixed
|
||||
@click-left="history.back()"></van-nav-bar>
|
||||
<div>
|
||||
<span style="color: rgb(114,90,69);margin-left: 10px;font-size: 14px;font-weight: bold">正在为
|
||||
<span v-for="o in tableData"> {{o.username}} </span>挑选礼物
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<van-grid :column-num="6" :border="false">
|
||||
<van-grid-item
|
||||
v-for="o in tableData"
|
||||
:key="o.userId" style="padding: 5px;">
|
||||
<div style="background-color: rgb(203,200,222);
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
background-size: 100% 100%;
|
||||
border-radius: 25px;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
">
|
||||
<span style="font-size: 20px">{{o.username.substr(0,1)}}</span>
|
||||
</div>
|
||||
<span style="font-size: 10px">{{o.username}}</span>
|
||||
</van-grid-item>
|
||||
</van-grid>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div><h3 style="margin-left: 10px">精选礼物</h3></div>
|
||||
<div>
|
||||
<van-grid :column-num="3" :border="false">
|
||||
<van-grid-item
|
||||
v-for="(o,index) in listGift"
|
||||
:key="o.id" style="padding: 5px;">
|
||||
<div class="sub">
|
||||
<van-image :src="'/file_server/fileStreamPreview?id=' + o.files[0].id" @click="sendGift('/file_server/fileStreamPreview?id=' + o.files[0].id,o.id)"></van-image>
|
||||
</div>
|
||||
<span style="font-size: 10px">{{o.giftName}}</span>
|
||||
</van-grid-item>
|
||||
</van-grid>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<van-dialog v-model="show" title="送上礼物" show-cancel-button :before-close="beforeClose">
|
||||
<div>
|
||||
<img :src="images" style="display: flex;align-items: center;justify-content: center;height: 100px;margin: 0 auto"/>
|
||||
</div>
|
||||
<div style="margin-top: 10px;margin-bottom: 10px">
|
||||
<van-field
|
||||
v-model="form.message"
|
||||
rows="2"
|
||||
autosize
|
||||
label="祝福语"
|
||||
type="textarea"
|
||||
maxlength="100"
|
||||
placeholder="请输入祝福语"
|
||||
show-word-limit
|
||||
></van-field>
|
||||
</div>
|
||||
<div style="margin-top: 10px;margin-bottom: 10px">
|
||||
<van-row>
|
||||
<van-col span="16">
|
||||
<van-cell center title="是否发送贺卡">
|
||||
<template #right-icon>
|
||||
<van-switch v-model="form.isSend" @click="send" size="24"></van-switch>
|
||||
</template>
|
||||
</van-cell>
|
||||
</van-col>
|
||||
<van-col span="8">
|
||||
<van-button round type="info" @click="showHk()">贺卡展示</van-button>
|
||||
</van-col>
|
||||
</van-row>
|
||||
</div>
|
||||
</van-dialog>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<script nonce="${cspNonce!}">
|
||||
new Vue({
|
||||
el:'#app',
|
||||
data(){
|
||||
return{
|
||||
pageForm:{
|
||||
greetingResult:localStorage.getItem("greetingResult"),
|
||||
},
|
||||
tableData:[],
|
||||
listGift:[],
|
||||
show: false,
|
||||
images:'',
|
||||
form:{
|
||||
giftId:'',
|
||||
message:'',
|
||||
isSend:false,
|
||||
},
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
async loadList(){
|
||||
const res = await $.post('/mobile/birthday/greeting/loadList',this.pageForm)
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data
|
||||
}
|
||||
},
|
||||
async giftList(){
|
||||
const res = await $.get('/mobile/birthday/greeting/giftList')
|
||||
if (res.code === 0) {
|
||||
res.data.forEach(v => {
|
||||
if(!(typeof v.files =='object')){
|
||||
v.files = JSON.parse(v.files)
|
||||
}
|
||||
})
|
||||
this.listGift = res.data
|
||||
}
|
||||
},
|
||||
sendGift(data,id){
|
||||
this.show=true;
|
||||
this.images=data;
|
||||
this.form.giftId=id;
|
||||
this.form.greetingResult=this.pageForm.greetingResult;
|
||||
},
|
||||
beforeClose : async function (action, done) { // 点击事件 - 备注按钮提示框
|
||||
if (action === 'confirm') { // 确认
|
||||
const res = await $.post('/mobile/birthday/greeting/sendBlessing', this.form)
|
||||
if (res.code === 0) {
|
||||
done(); // 关闭提示框
|
||||
this.$toast.success("赠送成功")
|
||||
} else {
|
||||
done();
|
||||
this.$toast.fail("操作失败")
|
||||
}
|
||||
} else if (action === 'cancel') { // 取消
|
||||
this.show = false;
|
||||
this.images = '';
|
||||
this.form = {};
|
||||
done(); // 关闭提示框
|
||||
}
|
||||
},
|
||||
send(){
|
||||
console.log(this.form.isSend)
|
||||
},
|
||||
showHk(){
|
||||
window.location.href='/mobile/birthday/greeting/hk'
|
||||
}
|
||||
},
|
||||
created(){
|
||||
this.loadList();
|
||||
this.giftList();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||