first commit

This commit is contained in:
2026-09-23 09:38:39 +08:00
commit 98a8b8cace
6257 changed files with 1266718 additions and 0 deletions
@@ -0,0 +1,26 @@
package io.v.nutz.welfare.constant;
/**
* 福利会员申请状态
*
* @author: 1V
* @date: 2021/2/28
* @since 1.0
*/
public interface WelfareMemberApplyState {
/**
* 待校工会审核
*/
int SCHOOL_UNION = 1000;
/**
* 校工会审核不通过
*/
int SCHOOL_UNION_FAIL = 1050;
/**
* 正式会员
*/
int NORMAL_MEMBER = 1100;
}
@@ -0,0 +1,55 @@
package io.v.nutz.welfare.controller;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.member.constant.MemberChangeApplyState;
import io.v.nutz.member.constant.MemberChangeRecordMode;
import io.v.nutz.util.ShiroUtil;
import io.v.nutz.welfare.constant.WelfareMemberApplyState;
import io.v.nutz.welfare.service.WelfareMemberService;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.nutz.dao.Sqls;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.ArrayList;
import java.util.List;
/**
* 福利待办
*
* @author: 1V
* @date: 2021/2/21
* @since 1.0
*/
@At("/platform/welfare/agenda")
@Ok("json:full")
@IocBean
@RequiresAuthentication
public class WelfareAgendaController {
@Inject
private WelfareMemberService service;
@Inject
private Vi vi;
@At
@ViReturn
public Object getAgenda() {
List<NutMap> list = new ArrayList<>();
if (!ShiroUtil.hasAnyRoles("flwyh01,sysadmin")) {
return list;
}
int welfareMemberAuditNumber = service.count(Sqls.create("SELECT count(1) from welfare_member_apply_record WHERE stateId = @state").setParam("state", WelfareMemberApplyState.SCHOOL_UNION));
list.add(new NutMap().addv("iconClass", vi.getIconByPath("/platform/welfare/member/audit/school")).addv("label", "福利会员审核").addv("number", welfareMemberAuditNumber).addv("url", "/platform/welfare/member/audit/school"));
int welfareMemberChangeAuditNumber = service.count(Sqls.create("SELECT count(1) from member_change_record WHERE recordMode = @mode and stateId = @state").setParam("mode", MemberChangeRecordMode.WELFARE_MEMBER.getCode()).setParam("state", MemberChangeApplyState.SCHOOL_UNION));
list.add(new NutMap().addv("iconClass", vi.getIconByPath("/platform/welfare/member/change/audit")).addv("label", "福利会员变更审核").addv("number", welfareMemberChangeAuditNumber).addv("url", "/platform/welfare/member/change/audit"));
return list;
}
}
@@ -0,0 +1,567 @@
package io.v.nutz.welfare.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.member.service.MemberService;
import io.v.nutz.sys.models.Sys_dict;
import io.v.nutz.sys.services.SysDictService;
import io.v.nutz.util.ViTool;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.welfare.feature.WelfareFeature;
import io.v.nutz.welfare.mode.WelfareMemberMode;
import io.v.nutz.welfare.mode.WelfareProvideMode;
import io.v.nutz.welfare.mode.WelfareUnitMode;
import io.v.nutz.welfare.model.WelfareProject;
import io.v.nutz.welfare.service.WelfareProjectService;
import lombok.Data;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* 福利公用
*
* @author: 1V
* @date: 2021/2/6
* @since 1.0
*/
@IocBean
@Ok("json:full")
@RequiresAuthentication
@At("/platform/welfare/common")
public class WelfareCommonController {
@Inject
private MemberService memberService;
/**
* @return 福利单位
*/
@At
@ViReturn
public Object welfareUnit() {
Sql sql = Sqls.create("SELECT * from welfare_unit WHERE welfareUnitMode = @mode").setParam("mode", WelfareUnitMode.getMode().name().toLowerCase());
return memberService.listMap(sql);
}
/**
* @return 福利单位的组成单位
*/
@At
@ViReturn
public Object componentUnit(String unitId) {
Sql sql = Sqls.create("SELECT * from sys_unit $condition");
CndPlus cndPlus = CndPlus.create();
if (WelfareFeature.judgmentAuthority()) {
cndPlus.andExcludeEmpty(WelfareUnitMode.getMode().getField(), "=", unitId);
} else {
String field = WelfareUnitMode.getMode().getField();
Map<String, Object> bean = BeanUtil.beanToMap(Vi.getUnit());
cndPlus.andExcludeEmpty(field, "=", bean.get(field));
}
cndPlus.asc("unitcode");
sql.setCondition(cndPlus);
return memberService.listMap(sql);
}
/**
* 将用户设置为福利会员
*
* @param userIds
* @return
*/
@At
@ViReturn
public Object joinWelfareMember(String[] userIds) {
WelfareMemberMode.joinWelfareMember(Arrays.stream(userIds).collect(Collectors.toList()));
return null;
}
/**
* 将用户从福利会员中剔除
*
* @param userIds
* @return
*/
@At
@ViReturn
public Object kickWelfareMember(String[] userIds) {
WelfareMemberMode.kickWelfareMember(Arrays.stream(userIds).collect(Collectors.toList()));
return null;
}
@Inject
private WelfareProjectService projectService;
/**
* 获取项目
*
* @return
*/
@At
@ViReturn
public Object welfareProjects() {
List<NutMap> options = new ArrayList<>();
List<WelfareProject> projects = projectService.query();
List<Integer> years = projects.stream().map(WelfareProject::getYear).distinct().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
for (Integer year : years) {
NutMap map = NutMap.NEW().addv("value", year).addv("label", year);
List<WelfareProject> projectList = projects.stream().filter(v -> v.getYear().equals(year)).sorted(Comparator.comparing(WelfareProject::getProvideTimeStart).reversed()).collect(Collectors.toList());
map.addv("children", projectList.stream().map(v -> NutMap.NEW().addv("value", v.getId()).addv("label", v.getName()).addv("v", v)).collect(Collectors.toList()));
options.add(map);
}
return options;
}
/**
* 福利汇总导出
*
* @param projectId
* @param response
* @throws IOException
*/
/* @At
public void exportWelfareListSummary(String projectId, HttpServletResponse response) throws IOException {
response.setContentType("application/octet-stream");
Sql sql = Sqls.create("""
SELECT
unit.*,
sum( 1 ) number
FROM
`welfare_unit` unit
LEFT JOIN welfare_list list ON unit.welfareUnitId = list.welfareUnitId
$condition
""");
CndPlus cnd = CndPlus.create();
cnd.and("unit.welfareUnitMode", "=", WelfareUnitMode.getMode().name());
cnd.and("list.projectId", "=", projectId);
cnd.groupBy("unit.welfareUnitId");
cnd.asc("unit.welfareUnitCode");
sql.setCondition(cnd);
List<Record> recordList = projectService.list(sql);
WelfareProject project = projectService.fetch(projectId);
String fileName = project.getName().concat("发放表");
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1") + "\".docx");
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.newBuilder().bind("list", policy).build();
Map map = new HashMap<>();
map.put("gift", project.getGift());
map.put("title", fileName);
map.put("list", recordList);
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("templates/welfare/WelfareListSummary.docx");
XWPFTemplate.compile(inputStream, config).render(map, response.getOutputStream());
inputStream.close();
}*/
@Inject
private SysDictService sysDictService;
/**
* 导出福利名单
*
* @param projectId 项目id
*/
@At
@Ok("void")
public void exportWelfareList(String projectId, String personType, HttpServletResponse response) throws IOException {
WelfareProject project = projectService.fetch(projectId);
Sql sql = Sqls.create("""
SELECT
vwl.*,
wpus.userSign
FROM
view_welfare_list vwl
LEFT JOIN welfare_project_user_selection wpus ON wpus.selectUserId = vwl.id
$condition
""");
CndPlus cnd = CndPlus.create();
cnd.and("vwl.projectId", "=", projectId);
cnd.and("vwl.unitid", "IS NOT", null);
cnd.and("vwl.realWelfareUnitId", "IS NOT", null);
if (StrUtil.isNotBlank(personType)) {
cnd.and("vwl.personType", "in", Json.fromJsonAsArray(String.class, personType));
}
cnd.groupBy("vwl.id");
cnd.asc("vwl.realWelfareUnitCode");
WelfareFeature.Condition.judgmentAuthority(cnd);
sql.setCondition(cnd);
List<NutMap> welfareList = projectService.listMap(sql);
Map v = new HashMap();
List list = new ArrayList();
Map<String, List<NutMap>> collect = welfareList.stream().collect(Collectors.groupingBy(x -> x.getString("realWelfareUnitName")));
collect.forEach((welfareUnitName, welfareUnitUsers) -> {
Map map = new HashMap<>();
map.put("projectName", project.getName());
map.put("welfareUnitName", welfareUnitName);
map.put("peopleNumber", welfareUnitUsers.size());
Map<String, List<NutMap>> unitCollect = welfareUnitUsers.stream().sorted(Comparator.comparing(x -> x.getString("unitcode"))).collect(Collectors.groupingBy(x -> x.getString("unitname")));
List units = new ArrayList();
unitCollect.forEach((unitName, unitUsers) -> {
unitUsers.forEach(user -> {
try {
user.setv("userSign", Strings.isNotBlank(user.getString("userSign")) ? Vi.getImg(user.getString("userSign")) : null);
} catch (IOException e) {
e.printStackTrace();
}
});
Map m = new HashMap<>();
m.put("projectName", project.getName());
m.put("welfareUnitName", welfareUnitName);
m.put("unitName", unitName);
m.put("peopleNumber", unitUsers.size());
m.put("users", unitUsers);
m.put("name", project.getGift());
m.put("provideTime", DateUtil.format(project.getProvideTimeStart(), "yyyy-MM-dd"));
AtomicInteger i = new AtomicInteger();
unitUsers.forEach(unitUser -> {
i.getAndIncrement();
unitUser.setv("index", i.get());
});
units.add(m);
});
map.put("units", units);
list.add(map);
});
v.put("list", list);
String fileName = project.getName() + "发放名单";
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1") + "\".docx");
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.newBuilder().bind("users", policy).build();
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("templates/welfare/WelfareList.docx");
XWPFTemplate.compile(inputStream, config).render(v, response.getOutputStream());
inputStream.close();
}
@At
@Ok("void")
public void exportWelfareListSummary(String projectId, HttpServletResponse response) throws IOException {
try {
//获取所有人员类型
Sys_dict dict = sysDictService.fetch(Cnd.where("code", "=", "UserType"));
List<Sys_dict> userTypeDictList = dict == null ? new ArrayList<>() : sysDictService.query(Cnd.where("parentId", "=", Strings.sNull(dict.getId())).and("disabled", "=", false).asc("location"));
List<String> userTypeList = userTypeDictList.stream().map(Sys_dict::getCode).collect(Collectors.toList());
Sql sql = Sqls.create("""
SELECT
unit.*,
sum( 1 ) number,
$temp_sql
FROM
welfare_unit unit
LEFT JOIN welfare_list list ON unit.welfareUnitId = list.welfareUnitId
LEFT JOIN `user` su ON su.id = list.userId
$condition
""");
StringBuffer temp_sql_str = new StringBuffer();
userTypeList.forEach(v -> {
temp_sql_str.append("COUNT( CASE WHEN ( su.personType = '%s' ) THEN 1 ELSE NULL END ) AS '%s',".formatted(v, v));
});
String totalUserType = CollUtil.join(userTypeList, ",", "'", "'");
temp_sql_str.append("COUNT( CASE WHEN ( su.personType in (%s) ) THEN 1 ELSE NULL END ) AS totalNum".formatted(totalUserType));
sql.setVar("temp_sql", temp_sql_str);
CndPlus cnd = CndPlus.create();
cnd.and("unit.welfareUnitMode", "=", WelfareUnitMode.getMode().name());
cnd.and("list.projectId", "=", projectId);
cnd.groupBy("unit.welfareUnitId");
cnd.asc("unit.welfareUnitCode");
sql.setCondition(cnd);
List<NutMap> list = projectService.listMap(sql);
List<ExcelExportEntity> exportEntityList = new ArrayList<ExcelExportEntity>();
exportEntityList.add(new ExcelExportEntity("部门工会", "welfareUnitName", 30));
userTypeDictList.forEach(v -> {
exportEntityList.add(new ExcelExportEntity(v.getName(), v.getName()));
});
exportEntityList.add(new ExcelExportEntity("合计", "totalNum"));
// List<ExportEntityWelfareList> exportEntityWelfareLists = projectService.listEntity(sql, ExportEntityWelfareList.class);
//
// ExportEntityWelfareList lastNumRowData = new ExportEntityWelfareList();
// lastNumRowData.setWelfareUnitCode("合计");
// lastNumRowData.setFaculty(String.valueOf(exportEntityWelfareLists.stream().mapToInt(v -> Integer.parseInt(v.getFaculty())).sum()));
// lastNumRowData.setWqxNum(String.valueOf(exportEntityWelfareLists.stream().mapToInt(v -> Integer.parseInt(v.getWqxNum())).sum()));
// lastNumRowData.setSchoolLaborNum(String.valueOf(exportEntityWelfareLists.stream().mapToInt(v -> Integer.parseInt(v.getSchoolLaborNum())).sum()));
// lastNumRowData.setUnitLaborNum(String.valueOf(exportEntityWelfareLists.stream().mapToInt(v -> Integer.parseInt(v.getUnitLaborNum())).sum()));
// lastNumRowData.setCompLaborNum(String.valueOf(exportEntityWelfareLists.stream().mapToInt(v -> Integer.parseInt(v.getCompLaborNum())).sum()));
// lastNumRowData.setLogisticsNum(String.valueOf(exportEntityWelfareLists.stream().mapToInt(v -> Integer.parseInt(v.getLogisticsNum())).sum()));
// lastNumRowData.setUnitSelfNum(String.valueOf(exportEntityWelfareLists.stream().mapToInt(v -> Integer.parseInt(v.getUnitSelfNum())).sum()));
// lastNumRowData.setRetireNum(String.valueOf(exportEntityWelfareLists.stream().mapToInt(v -> Integer.parseInt(v.getRetireNum())).sum()));
// lastNumRowData.setTotalNum(String.valueOf(exportEntityWelfareLists.stream().mapToInt(v -> Integer.parseInt(v.getTotalNum())).sum()));
//
// exportEntityWelfareLists.add(lastNumRowData);
//
WelfareProject project = projectService.fetch(projectId);
String fileName = project.getName().concat("发放表");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".xls").getBytes("utf-8"), "ISO8859-1"));
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(project.getName(), null), exportEntityList, list);
workbook.write(response.getOutputStream());
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Data
public static class ExportEntityWelfareList {
@Excel(name = "编码", width = 20d)
private String welfareUnitCode;
@Excel(name = "部门工会", width = 40d)
private String welfareUnitName;
@Excel(name = "教职工", width = 20d)
private String faculty;
@Excel(name = "未起薪人员", width = 20d)
private String wqxNum;
@Excel(name = "校级劳务派遣人员", width = 20d)
private String schoolLaborNum;
@Excel(name = "单位劳务派遣人员", width = 20d)
private String unitLaborNum;
@Excel(name = "劳动服务公司", width = 20d)
private String compLaborNum;
@Excel(name = "后勤聘用人员", width = 20d)
private String logisticsNum;
@Excel(name = "单位自聘人员", width = 20d)
private String unitSelfNum;
@Excel(name = "离退休人员", width = 20d)
private String retireNum;
@Excel(name = "合计", width = 20d)
private String totalNum;
}
@Data
public static class ExportEntityUser {
@Excel(name = "工号", width = 20d)
private String loginname;
@Excel(name = "姓名", width = 20d)
private String username;
@Excel(name = "人员类型", width = 20d)
private String personType;
@Excel(name = "在职状态", width = 20d)
private String userState;
@Excel(name = "所属工会", width = 20d)
private String unionName;
@Excel(name = "所属单位", width = 20d)
private String unitName;
@Excel(name = "所属校区", width = 20d)
private String campusName;
}
@At
@Ok("void")
public void doExportWelfare(String projectId, HttpServletResponse response) throws IOException {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
loginname,
username,
personType,
userState,
unionname,
unitname,
campusName
FROM
view_welfare_list $condition
""");
cnd.and("projectId", "=", projectId);
ExportParams exportParams = new ExportParams();
if (!ShiroUtil.hasAnyRoles(Lang.array("sysadmin", "A06", "H03"))) {
cnd.and("unionid", "=", Vi.getUnionId());
exportParams.setTitle(Vi.getUnion().getUnionname() + "名单");
}
cnd.asc("unionname");
cnd.asc("unitname");
sql.setCondition(cnd);
List<ExportEntityUser> exportEntityUsers = projectService.listEntity(sql, ExportEntityUser.class);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String(("福利名单.xls").getBytes("utf-8"), "ISO8859-1"));
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, ExportEntityUser.class, exportEntityUsers);
workbook.write(response.getOutputStream());
workbook.close();
}
@At
@ViReturn
public Object getPersonTypeListGroupByWelfare() {
Sql sql = Sqls.create("""
select personType from sys_user where welfareMember = 1 GROUP BY personType
""");
return memberService.listMap(sql);
}
@At
@Ok("void")
public void exportReceive(String projectId, HttpServletResponse response) {
WelfareProject welfareProject = projectService.fetch(projectId);
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
id,
loginname,
username,
personType,
userState,
unionname,
unitname,
campusName,
@gift_name AS gift_name
FROM
view_welfare_list $condition
""");
sql.setParam("gift_name", welfareProject.getGift());
cnd.and("projectId", "=", projectId);
if (!ShiroUtil.hasAnyRoles(Lang.array("sysadmin", "A06", "H03"))) {
cnd.and("unionid", "=", Vi.getUnionId());
}
cnd.asc("unionname");
cnd.asc("unitname");
sql.setCondition(cnd);
List<NutMap> list = projectService.listMap(sql);
list.forEach(v -> {
Sql sql_gift = Sqls.create("""
select wpus.id,wpso.optionName,wpus.receiveAddress from welfare_project_user_selection wpus
left join welfare_project_subject_option wpso on wpso.id = wpus.selectOptionId
where wpus.selectUserId = @uid
""");
sql_gift.setParam("uid", v.getString("id"));
List<NutMap> gift_list = projectService.listMap(sql_gift);
if (Lang.isNotEmpty(gift_list)) {
v.put("gist_list", gift_list.stream().map(x -> x.getString("optionName")).collect(Collectors.joining("、")));
v.put("receiveAddress", gift_list.stream().findFirst().get().getString("receiveAddress"));
} else {
v.put("gist_list", "");
v.put("receiveAddress", "");
}
});
List<ExcelExportEntity> entityList = new ArrayList<>();
entityList.add(new ExcelExportEntity("工号", "loginname", 20));
entityList.add(new ExcelExportEntity("姓名", "username", 20));
entityList.add(new ExcelExportEntity("人员类型", "personType", 20));
entityList.add(new ExcelExportEntity("在职状态", "userState", 20));
entityList.add(new ExcelExportEntity("所属工会", "unionname", 20));
entityList.add(new ExcelExportEntity("所属单位", "unitname", 20));
if (welfareProject.getFlexible()) {
entityList.add(new ExcelExportEntity("所选礼品", "gist_list", 60));
} else {
entityList.add(new ExcelExportEntity("所选礼品", "gift_name", 20));
}
if (welfareProject.getProvideMode().equals(WelfareProvideMode.PERSONAL.getCode())) {
entityList.add(new ExcelExportEntity("邮寄地址", "receiveAddress", 60));
}
try {
ViTool.excelResponse(response, "会员福利领取情况.xls");
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entityList, list);
workbook.write(response.getOutputStream());
} catch (Exception e) {
}
}
}
@@ -0,0 +1,155 @@
package io.v.nutz.welfare.controller;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.welfare.feature.WelfareFeature;
import io.v.nutz.welfare.model.WelfareProject;
import io.v.nutz.welfare.service.WelfareListService;
import io.v.nutz.welfare.service.WelfareProjectService;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 福利名单
*
* @author: 1V
* @date: 2021/3/1
* @since 1.0
*/
@IocBean
@RequiresAuthentication
@Ok("json")
@At("/platform/welfare/list/mange")
public class WelfareListController {
@At("")
@Ok("beetl:/platform/welfare/list/ListMange.html")
@RequiresPermissions("welfare.list.mange")
public void index() {
}
@Inject
private WelfareListService welfareListService;
@Inject
private WelfareProjectService projectService;
@At
@ViReturn
public Object pageData(PageForm pageForm, WelfareFeature.Condition.PageParam pageParam, String projectId) {
WelfareProject welfareProject = projectService.fetch(projectId);
Sql sql = Sqls.create("SELECT * from view_welfare_list list $condition");
pageForm.defaultSortAsc("list.unitCode");
CndPlus cnd = CndPlus.create();
WelfareFeature.Condition.judgmentAuthority(cnd, "list");
cnd.and("list.projectId", "=", projectId);
cnd.and(pageForm);
pageParam.participate(cnd, "list");
sql.setCondition(cnd);
Pagination pagination = welfareListService.list(pageForm, sql);
List<NutMap> list = pagination.getList();
list.forEach(v -> {
Sql sql_gift = Sqls.create("""
select
wpus.id,
( SELECT userSign FROM welfare_project_user_selection WHERE welfareId = @projectId AND selectUserId = @uid GROUP BY userSign) userSign,
wl.isReceive,
( SELECT receiveAddress FROM welfare_project_user_selection WHERE welfareId = @projectId AND selectUserId = @uid GROUP BY receiveAddress) receiveAddress
from
welfare_list wl
LEFT JOIN welfare_project_user_selection wpus ON wl.projectId = wpus.welfareId
LEFT JOIN welfare_project_subject_option wpso ON wpso.id = wpus.selectOptionId
where
wl.userId = @uid
AND wl.projectId = @projectId
GROUP BY wl.userId
""");
sql_gift.setParam("uid", v.getString("id"));
sql_gift.setParam("projectId", projectId);
List<NutMap> gift_list = welfareListService.listMap(sql_gift);
if (Lang.isNotEmpty(gift_list)) {
Sql optionNameSql = Sqls.create("""
SELECT
wpso.optionName
FROM
welfare_project_user_selection wpus
LEFT JOIN welfare_project_subject_option wpso ON wpso.id = wpus.selectOptionId
WHERE
wpus.welfareId = @projectId
AND wpus.selectUserId = @uid
ORDER BY
wpso.optionSort ASC
""").setParam("projectId", projectId).setParam("uid", v.getString("id"));
List<NutMap> optionNames = welfareListService.listMap(optionNameSql);
List<String> optionNameList = optionNames.stream().map(name -> name.getString("optionName")).collect(Collectors.toList());
v.put("gist_list", StringUtils.join(optionNameList, ","));
v.put("receiveAddress", gift_list.stream().findFirst().get().getString("receiveAddress"));
v.put("userSign", welfareProject.getSignMode() == 2 ? gift_list.stream().findFirst().get().getString("userSign") : "");
v.put("isReceive", gift_list.stream().findFirst().get().getBoolean("isReceive"));
} else {
v.put("gist_list", "");
v.put("receiveAddress", "");
v.put("userSign", "");
v.put("isReceive", 0);
}
if (!welfareProject.getFlexible()) {
v.put("gist_list", welfareProject.getGift());
v.put("receiveAddress", "");
}
});
return pagination;
}
@At
@ViReturn
public Object joinWelfareList(String[] userIds, String projectId) {
welfareListService.joinWelfareList(projectId, Arrays.asList(userIds));
return null;
}
@At
@ViReturn
public Object delete(String listId) {
welfareListService.delete(listId);
return null;
}
@At
@ViReturn
public Object editWelfareUnit(String listId, String welfareUnitId) {
welfareListService.update(Chain.make("welfareUnitId", welfareUnitId), Cnd.where("id", "=", listId));
return null;
}
@At
@ViReturn
public Object doWholeReceive(String id, String choices) {
List<String> choiceList = Json.fromJsonAsList(String.class, choices);
choiceList.forEach(v -> {
welfareListService.update(Chain.make("isReceive", true), Cnd.where("projectId", "=", id).and("userId", "=", v));
});
return null;
}
}
@@ -0,0 +1,101 @@
package io.v.nutz.welfare.controller;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.sys.services.SysDictService;
import io.v.nutz.welfare.service.WelfareListService;
import io.v.nutz.welfare.service.WelfareListSummaryService;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Dao;
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;
/**
* 发放名单汇总
*
* @author: 1V
* @date: 2021/3/3
* @since 1.0
*/
@IocBean
@RequiresAuthentication
@Ok("json")
@At("/platform/welfare/list/summary")
public class WelfareListSummaryController {
@At("")
@Ok("beetl:/platform/welfare/list/ListSummary.html")
@RequiresPermissions("welfare.list.summary")
public void index() {
}
@Inject
private WelfareListService welfareListService;
@Inject
private SysDictService sysDictService;
@Inject
private Dao dao;
@Inject
private WelfareListSummaryService welfareListSummaryService;
@At
@ViReturn
public Object pageData(PageForm pageForm, String projectId, String unionId) {
return welfareListSummaryService.togetherPageData(pageForm, projectId);
// WelfareProject welfareProject = dao.fetch(WelfareProject.class, Cnd.where("id", "=", projectId));
// ArrayList<Integer> togetherProvideMode = Lang.list(WelfareProvideMode.WELFARE_UNIT.getCode(), WelfareProvideMode.TOGETHER.getCode());
// if (togetherProvideMode.contains(welfareProject.getProvideMode())) {
// return welfareListSummaryService.togetherPageData(pageForm, projectId);
// } else {
// return welfareListSummaryService.singlePageData(pageForm, projectId, unionId);
// }
// //获取所有人员类型
// Sys_dict dict = sysDictService.fetch(Cnd.where("code", "=", "UserType"));
// List<Sys_dict> userTypeDictList = dict == null ? new ArrayList<>() : sysDictService.query(Cnd.where("parentId", "=", Strings.sNull(dict.getId())).and("disabled", "=", false).asc("location"));
// List<String> userTypeList = userTypeDictList.stream().map(Sys_dict::getCode).collect(Collectors.toList());
// List<NutMap> labelList = userTypeDictList.stream().map(v -> NutMap.NEW().addv("prop", v.getCode()).addv("label", v.getName())).collect(Collectors.toList());
// Sql sql = Sqls.create("""
// SELECT
// unit.*,
// sum( 1 ) number,
// $temp_sql
// FROM
// welfare_unit unit
// LEFT JOIN welfare_list list ON unit.welfareUnitId = list.welfareUnitId
// LEFT JOIN `user` su ON su.id = list.userId
// $condition
// """);
// StringBuffer temp_sql_str = new StringBuffer();
// userTypeList.forEach(v -> {
// temp_sql_str.append("COUNT( CASE WHEN ( su.personType = '%s' ) THEN 1 ELSE NULL END ) AS '%s',".formatted(v, v));
// });
//
// String totalUserType = CollUtil.join(userTypeList, ",", "'", "'");
//
// temp_sql_str.append("COUNT( CASE WHEN ( su.personType in (%s) ) THEN 1 ELSE NULL END ) AS totalNum".formatted(totalUserType));
// sql.setVar("temp_sql", temp_sql_str);
//
// CndPlus cnd = CndPlus.create();
// cnd.and("unit.welfareUnitMode", "=", WelfareUnitMode.getMode().name());
// pageForm.defaultSortAsc("unit.welfareUnitCode");
// cnd.and(pageForm);
// cnd.and("list.projectId", "=", projectId);
// cnd.groupBy("unit.welfareUnitId");
// sql.setCondition(cnd);
//
// labelList.add(NutMap.NEW().addv("prop", "totalNum").addv("label", "合计"));
// return Map.of("tableList", welfareListService.listMap(sql), "tableColumn", labelList);
}
}
@@ -0,0 +1,280 @@
package io.v.nutz.welfare.controller;
import com.google.common.base.Joiner;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.data.service.HistoryUserService;
import io.v.nutz.lang.Lang;
import io.v.nutz.member.MemberMode;
import io.v.nutz.member.constant.MemberChangeApplyState;
import io.v.nutz.member.constant.MemberChangeOrigin;
import io.v.nutz.member.constant.MemberChangeRecordMode;
import io.v.nutz.member.handle.MemberChangeAuditHandle;
import io.v.nutz.member.model.MemberChangeRecord;
import io.v.nutz.modules.models.Audit;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.welfare.constant.WelfareMemberApplyState;
import io.v.nutz.welfare.feature.WelfareFeature;
import io.v.nutz.welfare.handle.WelfareMemberApplyAuditHandle;
import io.v.nutz.welfare.mode.WelfareMemberMode;
import io.v.nutz.welfare.model.WelfareMemberApplyRecord;
import io.v.nutz.welfare.service.WelfareMemberService;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 福利会员调整
*
* @author: 1V
* @date: 2021/2/28
* @since 1.0
*/
@IocBean
@RequiresAuthentication
@Ok("json")
@At("/platform/welfare/member/adjustment")
public class WelfareMemberAdjustmentController {
@At("")
@Ok("beetl:/platform/welfare/member/Adjustment.html")
@RequiresPermissions("welfare.member.adjustment")
public void index() {
}
@Inject
private WelfareMemberService welfareMemberService;
@At
@ViReturn
public Object pageData(String changeDateBefore, String changeDateEnd, PageForm pageForm, WelfareFeature.Condition.PageParam pageParam, String changeDate, String changeType, Integer welfareMember, Integer member, Integer changed) {
Sql sql = Sqls.create("""
SELECT
u.*,
his.changeType,
his.changeTime,
IF
( his.id IS NULL, FALSE, TRUE ) hasHis,
TRUE AS flag,
IF(state.stateId in ($states) OR state.stateId IS NULL ,TRUE,FALSE) apply,
state.stateId,
state.stateName,
state.stateColor,
IF(mcr.stateId = @changeUnitAuditing,TRUE,FALSE) changeUnitAuditing,
IF(mcr.stateId = @changeUnitError,TRUE,FALSE) changeUnitError,
mcr_state.stateId mcrStateId,
mcr_state.stateName mcrStateName,
mcr_state.stateColor mcrStateColor
FROM
`user` u
LEFT JOIN user_history_latest his ON his.loginname = u.loginname
LEFT JOIN welfare_member_apply_record_latest wmar ON wmar.userId = u.id
LEFT JOIN member_change_record_latest mcr on mcr.userId = u.id
LEFT JOIN audit_state state ON wmar.stateId = state.stateId
LEFT JOIN audit_state mcr_state ON mcr_state.stateId = mcr.stateId
$condition
""")
.setParam("recordMode", MemberChangeRecordMode.WELFARE_MEMBER.getCode())
.setParam("changeUnitAuditing", MemberChangeApplyState.SCHOOL_UNION)
.setParam("changeUnitError", MemberChangeApplyState.SCHOOL_UNION_FAIL);
sql.setVar("states", Joiner.on(",").join(List.of(WelfareMemberApplyState.SCHOOL_UNION_FAIL)));
pageForm.defaultSortDesc("wmar.applyTime");
CndPlus cnd = CndPlus.create();
if (member != null && member != 1) {
if (2 == member) {
cnd.and("u.member", "=", MemberMode.NORMAL.getCode());
} else if (3 == member) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.or("u.member", "is", null);
group.or("u.member", "!=", MemberMode.NORMAL.getCode());
cnd.and(group);
}
}
if (changed != 0) {
if (changed == 1) {
cnd.and(new Static("his.loginname is not null"));
} else {
cnd.and(new Static("his.loginname is null"));
}
}
cnd.asc("unitid");
if (welfareMember == 1) {
cnd.and("u.welfareMember", "=", WelfareMemberMode.NORMAL.getCode());
} else if (welfareMember == 2) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.or("u.welfareMember", "=", null).or("u.welfareMember", "=", WelfareMemberMode.NONE.getCode());
cnd.and(group);
}
WelfareFeature.Condition.judgmentAuthority(cnd, "u");
cnd.and(pageForm);
cnd.desc("his.changeTime");
cnd.asc("u.userState");
pageParam.participate(cnd, "u");
if (Lang.notNull(changeDateBefore, changeDateEnd)) {
cnd.and(new Static(String.format("Date(his.changeTime) >= '%s' and Date(his.changeTime) <= '%s'", changeDateBefore, changeDateEnd)));
}
// cnd.andExcludeEmpty("Date(his.changeTime)", "=", changeDate);
cnd.andExcludeEmpty("his.changeType", "=", changeType);
sql.setCondition(cnd);
return welfareMemberService.list(pageForm, sql);
}
@At
@ViReturn
public Object getChangeNumber(String changeDateBefore, String changeDateEnd, PageForm pageForm, WelfareFeature.Condition.PageParam pageParam, String changeType, Integer welfareMember, Integer member, Integer changed) {
Sql sql = Sqls.create("""
SELECT
(
SELECT
COUNT( 1 )
FROM
`user` u
LEFT JOIN user_history_latest his ON his.loginname = u.loginname
LEFT JOIN welfare_member_apply_record_latest wmar ON wmar.userId = u.id
LEFT JOIN member_change_record_latest mcr ON mcr.userId = u.id
LEFT JOIN audit_state state ON wmar.stateId = state.stateId
LEFT JOIN audit_state mcr_state ON mcr_state.stateId = mcr.stateId
$condition
) `all`,
(
SELECT
COUNT( 1 )
FROM
`user` u
LEFT JOIN user_history_latest his ON his.loginname = u.loginname
LEFT JOIN welfare_member_apply_record_latest wmar ON wmar.userId = u.id
LEFT JOIN member_change_record_latest mcr ON mcr.userId = u.id
LEFT JOIN audit_state state ON wmar.stateId = state.stateId
LEFT JOIN audit_state mcr_state ON mcr_state.stateId = mcr.stateId
$condition
AND his.loginname IS NOT NULL
) have,
(
SELECT
COUNT( 1 )
FROM
`user` u
LEFT JOIN user_history_latest his ON his.loginname = u.loginname
LEFT JOIN welfare_member_apply_record_latest wmar ON wmar.userId = u.id
LEFT JOIN member_change_record_latest mcr ON mcr.userId = u.id
LEFT JOIN audit_state state ON wmar.stateId = state.stateId
LEFT JOIN audit_state mcr_state ON mcr_state.stateId = mcr.stateId
$condition
AND his.loginname IS NULL
) `no`
""");
CndPlus cnd = CndPlus.create();
cnd.and("1", "=", 1);
if (member != null && member != 1) {
if (2 == member) {
cnd.and("u.member", "=", MemberMode.NORMAL.getCode());
} else if (3 == member) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.or("u.member", "is", null);
group.or("u.member", "!=", MemberMode.NORMAL.getCode());
cnd.and(group);
}
}
if (welfareMember == 1) {
cnd.and("u.welfareMember", "=", WelfareMemberMode.NORMAL.getCode());
} else if (welfareMember == 2) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.or("u.welfareMember", "=", null).or("u.welfareMember", "=", WelfareMemberMode.NONE.getCode());
cnd.and(group);
}
WelfareFeature.Condition.judgmentAuthority(cnd, "u");
cnd.and(pageForm);
pageParam.participate(cnd, "u");
if (Lang.notNull(changeDateBefore, changeDateEnd)) {
cnd.and(new Static(String.format("Date(his.changeTime) >= '%s' and Date(his.changeTime) <= '%s'", changeDateBefore, changeDateEnd)));
}
cnd.andExcludeEmpty("his.changeType", "=", changeType);
sql.setCondition(cnd);
return welfareMemberService.fetch(sql);
}
@Inject
private HistoryUserService historyUserService;
@At
@ViReturn
public Object historyUsers(String loginname) {
return historyUserService.historyUsers(loginname);
}
/**
* 将用户设置为福利会员
*
* @param userIds
* @return
*/
@At
@ViReturn
public Object joinWelfareMember(String[] userIds) {
WelfareMemberApplyAuditHandle.CREATE.next(Arrays.stream(userIds).map(v -> new WelfareMemberApplyRecord().setUserId(v)).collect(Collectors.toList()), null);
return null;
}
/**
* 变更申请
*
* @param record
* @return
*/
@At
@ViReturn
public Object change(MemberChangeRecord record) {
record.setRecordMode(MemberChangeRecordMode.WELFARE_MEMBER.getCode());
if (WelfareFeature.judgmentAuthority()) {
record.setApplyOrigin(MemberChangeOrigin.SCHOOL.getCode());
record = MemberChangeAuditHandle.CREATE.next(record, null);
MemberChangeAuditHandle.SCHOOL.next(record, new Audit().setAuditPass(true));
} else {
record.setApplyOrigin(MemberChangeOrigin.UNION.getCode());
record = MemberChangeAuditHandle.CREATE.next(record, null);
MemberChangeAuditHandle.UNION.next(record, new Audit().setAuditPass(true));
}
return null;
}
}
@@ -0,0 +1,89 @@
package io.v.nutz.welfare.controller;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.modules.models.Audit;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.service.ViService;
import io.v.nutz.welfare.constant.WelfareMemberApplyState;
import io.v.nutz.welfare.feature.WelfareFeature;
import io.v.nutz.welfare.handle.WelfareMemberApplyAuditHandle;
import io.v.nutz.welfare.model.WelfareMemberApplyRecord;
import io.v.nutz.welfare.service.WelfareMemberService;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* 校工会福利会员审核
*
* @author: 1V
* @date: 2021/2/28
* @since 1.0
*/
@IocBean
@RequiresAuthentication
@Ok("json")
@At("/platform/welfare/member/audit/school")
public class WelfareMemberAuditSchoolController {
@At("")
@Ok("beetl:/platform/welfare/member/AuditSchool.html")
@RequiresPermissions("welfare.member.audit.school")
public void index() {
}
@Inject
private WelfareMemberService welfareMemberService;
@Inject("WelfareMemberApplyRecord")
private ViService<WelfareMemberApplyRecord> welfareMemberApplyRecordViService;
@At
@ViReturn
public Object pageData(PageForm pageForm, WelfareFeature.Condition.PageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
u.*,
wmar.id applyId,
state.stateName,
state.stateColor
FROM
welfare_member_apply_record wmar
LEFT JOIN `user` u ON wmar.userId = u.id
LEFT JOIN audit_state state ON wmar.stateId = state.stateId
$condition
""");
pageForm.defaultSortDesc("wmar.applyTime");
CndPlus cnd = CndPlus.create();
cnd.and("wmar.stateId", "=", WelfareMemberApplyState.SCHOOL_UNION);
cnd.and(pageForm);
pageParam.participate(cnd, "u");
sql.setCondition(cnd);
return welfareMemberService.list(pageForm, sql);
}
@At
@ViReturn
public Object audit(String[] applyIds, boolean flag) {
List<WelfareMemberApplyRecord> records = welfareMemberApplyRecordViService.query(Cnd.where("id", "in", applyIds));
Audit audit = new Audit().setAuditPass(flag);
WelfareMemberApplyAuditHandle.AUDIT_SCHOOL.next(records, audit);
return null;
}
}
@@ -0,0 +1,133 @@
package io.v.nutz.welfare.controller;
import io.v.nutz.annontation.ViRequired;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.lang.Enum;
import io.v.nutz.member.constant.MemberChangeApplyState;
import io.v.nutz.member.constant.MemberChangeRecordMode;
import io.v.nutz.member.handle.MemberChangeAuditHandle;
import io.v.nutz.member.model.MemberChangeRecord;
import io.v.nutz.modules.models.Audit;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.service.ViService;
import io.v.nutz.welfare.mode.WelfareUnitMode;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* 福利会员变更申请审核
*
* @author: 1V
* @date: 2021/1/26
* @since 1.0
*/
@At("/platform/welfare/member/change/audit")
@Ok("json:full")
@IocBean
@RequiresAuthentication
public class WelfareMemberChangeApplyAuditController {
@At("")
@Ok("beetl:/platform/welfare/member/change/audit/School.html")
@RequiresPermissions("welfare.member.change.audit.school")
public void index() {
}
@Inject("MemberChangeRecord")
private ViService<MemberChangeRecord> recordViService;
@Inject
private Vi vi;
/**
* @param pageForm 分页查询对象
* @param source 来源 2 校工会
* @return
*/
@At
@ViReturn
public Object pageData(PageForm pageForm, String unionId, Integer source, String[] date, Integer type, Boolean audit, String welfareUnit) {
Sql sql = Sqls.create("""
SELECT
mcr.*,
LEFT ( mcr.applyTime, 10 ) applyDate,
u.username,
u.loginname,
u.unitname,
u.unionname,
wun.welfareUnitId realWelfareUnitId,
wun.welfareUnitCode realWelfareUnitCode,
wun.welfareUnitName realWelfareUnitName,
u.mobile,
state.stateName,
state.stateColor,
originUnit.unitcode originUnitCode,
originUnit.`name` originUnitName,
originUnion.unioncode originUnionCode,
originUnion.unionname originUnionName,
currentUnit.unitcode currentUnitCode,
currentUnit.`name` currentUnitName,
currentUnion.unioncode currentUnionCode,
currentUnion.unionname currentUnionName,
IF(mcr.stateId = @auditState,TRUE,FALSE) audit
FROM
member_change_record mcr
LEFT JOIN `user` u ON mcr.userId = u.id
LEFT JOIN welfare_unit wun ON u.$field = wun.welfareUnitId
LEFT JOIN audit_state state ON mcr.stateId = state.stateId
LEFT JOIN sys_unit originUnit ON mcr.originUnitId = originUnit.id
LEFT JOIN sys_union originUnion ON mcr.originUnionId = originUnion.id
LEFT JOIN sys_unit currentUnit ON mcr.currentUnitId = currentUnit.id
LEFT JOIN sys_union currentUnion ON mcr.currentUnionId = currentUnion.id
$condition
""").setVar("field", WelfareUnitMode.getMode().getField());
CndPlus cnd = CndPlus.create();
pageForm.defaultSortAsc("mcr.stateId");
cnd.and(pageForm);
cnd.and("mcr.recordMode", "=", MemberChangeRecordMode.WELFARE_MEMBER.getCode());
if (date != null && date.length == 2) {
cnd.and("date(mcr.applyTime)", ">=", date[0]);
cnd.and("date(mcr.applyTime)", "<=", date[1]);
}
if (audit) {
cnd.and("mcr.stateId", "=", source == 1 ? MemberChangeApplyState.UNION : MemberChangeApplyState.SCHOOL_UNION);
}
cnd.andExcludeEmpty("u.unionid", "=", unionId);
cnd.andExcludeEmpty("mcr.type", "=", type);
cnd.andExcludeEmpty("wun.welfareUnitId", "=", welfareUnit);
cnd.and("mcr.stateId", ">=", MemberChangeApplyState.SCHOOL_UNION);
sql.setParam("auditState", MemberChangeApplyState.SCHOOL_UNION);
sql.setCondition(cnd);
return recordViService.list(pageForm, sql);
}
@At
@ViReturn
public Object doAudit(@ViRequired String recordId, Audit audit) {
MemberChangeRecord record = recordViService.fetch(recordId);
MemberChangeAuditHandle applyHandle = Enum.instance(MemberChangeAuditHandle.class, record.getStateId());
applyHandle.next(record, audit);
return null;
}
}
@@ -0,0 +1,107 @@
package io.v.nutz.welfare.controller;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.base.result.Result;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.service.AsyncService;
import io.v.nutz.sys.services.SysUserService;
import io.v.nutz.welfare.feature.WelfareFeature;
import io.v.nutz.welfare.model.template.WelfareMemberTemp;
import io.v.nutz.welfare.service.WelfareMemberService;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.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.util.NutMap;
import org.nutz.mvc.annotation.AdaptBy;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
import java.util.Arrays;
import java.util.List;
/**
* 福利会员管理
*
* @author: 1V
* @date: 2021/2/3
* @since 1.0
*/
@IocBean
@RequiresAuthentication
@Ok("json")
@At("/platform/welfare/member/mange")
public class WelfareMemberMangeController {
@At("")
@Ok("beetl:/platform/welfare/member/MemberMange.html")
@RequiresPermissions("welfare.member.mange")
public void index() {
}
@Inject
private WelfareMemberService welfareMemberService;
@Inject
private SysUserService sysUserService;
@At
@ViReturn
public Object pageData(PageForm pageForm, WelfareFeature.Condition.PageParam pageParam) {
Sql sql = Sqls.create("SELECT * from welfare_member $condition");
pageForm.defaultSortAsc("unitid");
CndPlus cnd = CndPlus.create();
pageParam.participate(cnd);
cnd.and(pageForm);
sql.setCondition(cnd);
return welfareMemberService.list(pageForm, sql);
}
@Inject
private AsyncService asyncService;
/**
* 批量修改校区
*
* @param users
* @return
*/
@At
@ViReturn
public Object batchEdit(NutMap[] users) {
welfareMemberService.transactional(() -> {
asyncService.exe2(Arrays.asList(users), user -> {
welfareMemberService.update(Chain.make("dqid", user.getString("campusId")), Cnd.where("id", "=", user.getString("id")));
});
});
return null;
}
@At
@ViReturn
@RequiresAuthentication
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
@Aop(TransAop.READ_COMMITTED)
public Object importMember(TempFile file) {
List<WelfareMemberTemp> welfare = ExcelImportUtil.importExcel(file.getFile(), WelfareMemberTemp.class, new ImportParams());
sysUserService.dao().execute(Sqls.create("update sys_user set welfareMember=0"));
for (WelfareMemberTemp welfareMemberTemp : welfare) {
sysUserService.update(Chain.make("welfareMember", 1).add("welfarePayType", welfareMemberTemp.getWelfarePayType()), Cnd.where("loginname", "=", welfareMemberTemp.getLoginName()));
}
return Result.success();
}
}
@@ -0,0 +1,130 @@
package io.v.nutz.welfare.controller;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.welfare.feature.WelfareFeature;
import io.v.nutz.welfare.model.WelfareProject;
import io.v.nutz.welfare.service.WelfareListService;
import io.v.nutz.welfare.service.WelfareProjectService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
@IocBean
@Ok("json")
@At("/platform/welfare/mine")
public class WelfareMineController {
@At("")
@Ok("beetl:/platform/welfare/mine.html")
@RequiresPermissions("welfare.mine")
public void index() {
}
@Inject
private WelfareListService welfareListService;
@Inject
private WelfareProjectService projectService;
@At
@ViReturn
public Object pageData(PageForm pageForm, WelfareFeature.Condition.PageParam pageParam, String projectId) {
// Sql sql_gift = Sqls.create("""
// select
// wpus.id,
// wpso.optionName,
// wpus.receiveAddress,
// wpus.courierNumber,
// CONCAT(wpso.optionName) as gist_list,
// wp.id as projectId,
// wp.year,
// wp.name as projectName,
// wp.name as festival,
// wp.name as provideTimeStart,
// wp.name as provideTimeEnd,
// wp.flexible,
// u.loginname as loginName,
// u.username as userName,
// u.personType,
// u.userState,
// u.unitname as unitName,
// u.unionname as unionName
// from
// welfare_project_user_selection wpus
// left join welfare_project_subject_option wpso on wpso.id = wpus.selectOptionId
// left join welfare_project wp on wp.id = wpus.welfareId
// left join `user` u on u.id = wpus.selectUserId
// $condition
// """);
// Cnd cnd = Cnd.NEW();
// cnd.and("wpus.selectUserId", "=", ShiroUtil.getPrincipalProperty("id"));
// cnd.andEX("wpus.welfareId", "=", projectId);
// cnd.and("wpus.id", "is not", null);
// sql_gift.setCondition(cnd);
// Pagination pagination = welfareListService.list(pageForm, sql_gift);
// List<NutMap> list = pagination.getList();
// for (NutMap v : list) {
// if (v.getBoolean("flexible")) {
// WelfareProject welfareProject = projectService.fetch(v.getString("projectId"));
// v.put("gist_list", welfareProject.getGift());
// v.put("receiveAddress", null);
// }
// }
// return pagination;
Sql sql = Sqls.create("""
SELECT
vwl.loginname AS loginName,
vwl.username AS userName,
vwl.personType,
vwl.userState,
vwl.unitname AS unitName,
vwl.unionname AS unionName,
vwl.id as userId,
wp.id AS projectId,
wp.`year`,
wp.`name` AS projectName,
wp.festival,
wp.provideTimeStart,
wp.provideTimeEnd,
wp.flexible,
wpso.optionName,
wpus.receiveAddress,
wpus.courierNumber,
CONCAT( wpso.optionName ) AS gist_list\s
FROM
view_welfare_list vwl
LEFT JOIN welfare_project wp ON wp.id = vwl.projectId
LEFT JOIN welfare_project_user_selection wpus ON wpus.welfareId = wp.id AND wpus.selectUserId = vwl.id
LEFT JOIN welfare_project_subject_option wpso ON wpso.id = wpus.selectOptionId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("vwl.id", "=", ShiroUtil.getPrincipalProperty("id"));
cnd.groupBy("wp.id");
sql.setCondition(cnd);
Pagination pagination = welfareListService.list(pageForm, sql);
List<NutMap> list = pagination.getList();
for (NutMap v : list) {
if (v.getBoolean("flexible")) {
WelfareProject welfareProject = projectService.fetch(v.getString("projectId"));
v.put("gist_list", welfareProject.getGift());
v.put("receiveAddress", null);
}
}
return pagination;
}
}
@@ -0,0 +1,264 @@
package io.v.nutz.welfare.controller;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.data.model.MatchConditionStructure;
import io.v.nutz.data.service.MatchConditionStructureService;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.sys.models.Sys_task;
import io.v.nutz.sys.services.SysTaskService;
import io.v.nutz.task.services.TaskPlatformService;
import io.v.nutz.welfare.model.WelfareProject;
import io.v.nutz.welfare.model.WelfareProjectSubject;
import io.v.nutz.welfare.model.WelfareProjectSubjectOption;
import io.v.nutz.welfare.service.WelfareListService;
import io.v.nutz.welfare.service.WelfareProjectService;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.random.R;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.trans.Trans;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
* 福利项目管理
*
* @author: 1V
* @date: 2021/2/3
* @since 1.0
*/
@IocBean
@RequiresAuthentication
@Ok("json")
@At("/platform/welfare/project/mange")
public class WelfareProjectMangeController {
private final String JOB_CLASS = "io.v.nutz.task.job.welfare.welfareJob"; //调用类
@At("")
@Ok("beetl:/platform/welfare/project/ProjectMange.html")
@RequiresPermissions("welfare.project.mange")
public void index() {
}
@Inject
private WelfareProjectService projectService;
@Inject
private WelfareListService listService;
@Inject
private TaskPlatformService taskPlatformService;
@Inject
private SysTaskService sysTaskService;
@Inject
private Vi vi;
@Inject
private Dao dao;
@At
@ViReturn
public Object pageData(PageForm pageForm, Integer year, String name) {
Sql sql = Sqls.create("SELECT project.*,IF((SELECT count(1) FROM welfare_list WHERE projectId = project.id)>0,TRUE,FALSE) created FROM `welfare_project` project $condition");
CndPlus cnd = CndPlus.create();
pageForm.defaultSortDesc("createdAt");
cnd.andExcludeEmpty("year", "=", year);
if (Strings.isNotBlank(name)) {
cnd.and(Cnd.likeEX("name", name));
}
cnd.and(pageForm);
sql.setCondition(cnd);
return projectService.list(pageForm, sql);
}
@Inject
private MatchConditionStructureService matchConditionStructureService;
@At
@ViReturn
public Object save(WelfareProject project) {
Trans.exec(() -> {
if (project.getConditionStructure() != null) {
project.setConditionStructureId(matchConditionStructureService.save(project.getConditionStructure()).getId());
}
if (StrUtil.isBlank(project.getId())) {
WelfareProject insertProject = dao.insertWith(project, "welfareProjectSubjects");
if (Lang.isNotEmpty(insertProject.getWelfareProjectSubjects())) {
insertProject.getWelfareProjectSubjects().forEach(v -> {
dao.insertLinks(v, "options");
});
}
long provideTimeEnd = project.getProvideTimeEnd().getTime();
long time = new Date().getTime();
if (project.getFlexible()) {
//找出福利里面有没有设置 没选系统自动分配
List<WelfareProjectSubject> welfareProjectSubjects = project.getWelfareProjectSubjects();
List<WelfareProjectSubjectOption> options = welfareProjectSubjects.get(0).getOptions();
List<WelfareProjectSubjectOption> isDefaultOption = options.stream().filter(op -> op.isDefaultOption()).collect(Collectors.toList());
if (provideTimeEnd > time && project.getFlexible() && Lang.isNotEmpty(isDefaultOption)) {
//添加任务
Sys_task sys_task = new Sys_task();
sys_task.setName(project.getName() + "活动结束自动分配");
sys_task.setNote(project.getName());
sys_task.setJobClass(JOB_CLASS);
sys_task.setCron(vi.getCron(project.getProvideTimeEnd()));
sys_task.setData(Json.toJson(new HashMap<String, Object>() {{
put("welfareId", project.getId());
}}));
sys_task.setDisabled(false);
sys_task = sysTaskService.insert(sys_task);
taskPlatformService.add(sys_task.getId(), sys_task.getId(), sys_task.getJobClass(), sys_task.getCron(), sys_task.getNote(), sys_task.getData());
project.setTaskId(sys_task.getId());
projectService.updateIgnoreNull(project);
}
}
} else {
dao.clear(WelfareProjectSubjectOption.class, Cnd.NEW().and(new Static("subjectId in (select id from welfare_project_subject where projectId = '%s')".formatted(project.getId()))));
dao.clear(WelfareProjectSubject.class, Cnd.where("projectId", "=", project.getId()));
dao.update(project);
List<WelfareProjectSubject> newSubject = project.getWelfareProjectSubjects();
if (Lang.isNotEmpty(newSubject)) {
newSubject.forEach(v -> {
if (v.getId() == null) {
v.setId(R.UU32());
v.setProjectId(project.getId());
}
Chain chain = Chain.make("id", v.getId());
chain.add("projectId", v.getProjectId());
chain.add("subjectName", v.getSubjectName());
chain.add("subjectType", v.getSubjectType());
dao.insert(WelfareProjectSubject.class, chain);
List<WelfareProjectSubjectOption> options = v.getOptions();
options.forEach(o -> {
if (o.getId() == null) {
o.setId(R.UU32());
o.setSubjectId(v.getId());
}
Chain optionChain = Chain.make("id", o.getId());
optionChain.add("subjectId", o.getSubjectId());
optionChain.add("optionName", o.getOptionName());
optionChain.add("optionNameId", o.getOptionNameId());
optionChain.add("optionType", o.getOptionType());
optionChain.add("isDefaultOption", o.isDefaultOption());
optionChain.add("isSystemDefault", o.isSystemDefault());
optionChain.add("optionSort", o.getOptionSort());
optionChain.add("imgUrl", o.getImgUrl());
optionChain.add("description", o.getDescription());
dao.insert(WelfareProjectSubjectOption.class, optionChain);
});
});
}
long provideTimeEnd = project.getProvideTimeEnd().getTime();
long time = new Date().getTime();
if (project.getFlexible()) {
//找出福利里面有没有设置 没选系统自动分配
List<WelfareProjectSubject> welfareProjectSubjects = project.getWelfareProjectSubjects();
List<WelfareProjectSubjectOption> options = welfareProjectSubjects.get(0).getOptions();
List<WelfareProjectSubjectOption> isDefaultOption = options.stream().filter(op -> op.isDefaultOption()).collect(Collectors.toList());
//先删除任务条件id不等于空代表有定时任务
if (Strings.isNotBlank(project.getTaskId())) {
taskPlatformService.delete(project.getTaskId(), project.getTaskId());
sysTaskService.delete(project.getTaskId());
}
//判断是否添加 条件是时间要大于现在时间&&是福利套餐&&福利选项里面设置了没选系统自动分配
if (provideTimeEnd > time && project.getFlexible() && Lang.isNotEmpty(isDefaultOption)) {
//添加任务
Sys_task sys_task = new Sys_task();
sys_task.setName(project.getName() + "活动结束自动分配");
sys_task.setNote(project.getName());
sys_task.setJobClass(JOB_CLASS);
sys_task.setCron(vi.getCron(project.getProvideTimeEnd()));
sys_task.setData(Json.toJson(new HashMap<String, Object>() {{
put("welfareId", project.getId());
}}));
sys_task.setDisabled(false);
sys_task = sysTaskService.insert(sys_task);
taskPlatformService.add(sys_task.getId(), sys_task.getId(), sys_task.getJobClass(), sys_task.getCron(), sys_task.getNote(), sys_task.getData());
project.setTaskId(sys_task.getId());
} else {
project.setTaskId(null);
}
}
dao.update(project);
}
});
return null;
}
@At
@ViReturn
public Object delete(String id) {
WelfareProject project = projectService.fetch(id);
if (Strings.isNotBlank(project.getConditionStructureId())) {
projectService.dao().clear("match_condition", Cnd.where("structureId", "=", project.getConditionStructureId()));
projectService.dao().delete(MatchConditionStructure.class, project.getConditionStructureId());
}
projectService.delete(id);
listService.clear(Cnd.where("projectId", "=", id));
return null;
}
/**
* 生成名单
*
* @param id
* @return
*/
@At
@ViReturn
public Object createList(String id) {
listService.createList(id);
return null;
}
@At
@ViReturn
public Object findOne(String id) {
return projectService.projectInfo(id);
}
}
@@ -0,0 +1,105 @@
package io.v.nutz.welfare.controller.check;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.base.service.SimpleService;
import io.v.nutz.member.constant.MemberChangeApplyState;
import io.v.nutz.modules.models.PageForm;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* @FileName io.v.nutz.member.controller.check.MemberCheckUnionController
* @Description: 校工会核对
* @Author zxc
* @Date 2022/10/21:10:31
* @Version V1.0
**/
@At("/platform/welfareMember/check/school")
@Ok("json:full")
@IocBean
public class WelfareMemberCheckSchoolController {
@Inject
private Dao dao;
@Inject
private SimpleService simpleService;
@At("")
@Ok("beetl:/platform/welfare/member/check/school.html")
@RequiresPermissions("welfare.member.check.school")
public void union() {
}
@At
@ViReturn
public Object pageData(PageForm pageForm, String taskId, String unionId, String unitId) {
Sql sql = Sqls.create("""
SELECT
gh.id,
gh.unioncode,
gh.unionname,
mcut.isFinish,
IF(mcut.isFinish is true,'是','否') as isFinishText,
sum( CASE WHEN u.welfareMember = 1 THEN 1 ELSE 0 END ) AS memberNum,
(
SELECT
count( 1 )\s
FROM
member_change_record mcr\s
WHERE
mcr.originUnionId = mcut.unionId\s
AND mcr.taskId = mcut.taskId\s
AND mcr.stateId = @stateId
) as notCheckNum
FROM
member_check_union_task mcut
LEFT JOIN sys_union gh ON gh.id = mcut.unionId
LEFT JOIN `user` u ON u.unionid = gh.id\s
$condition
""");
sql.setParam("stateId", MemberChangeApplyState.SCHOOL_UNION);
Cnd cnd = Cnd.NEW();
cnd.and("mcut.taskId", "=", taskId);
cnd.groupBy("gh.id");
cnd.asc("gh.unioncode");
sql.setCondition(cnd);
return simpleService.listMap(sql);
}
@At
@ViReturn
public Object getNotCheckUsers(String taskId, String unionId) {
Sql sql = Sqls.create("""
SELECT
mcr.id,
u.username AS userName,
u.loginname AS loginName,
his.changeType,
his.changeTime,
state.stateId,
state.stateName
FROM
member_change_record mcr
LEFT JOIN `user` u ON u.id = mcr.userId
LEFT JOIN audit_state state ON mcr.stateId = state.stateId
LEFT JOIN user_history_latest his ON his.loginname = u.loginname
WHERE
mcr.taskId = @taskId
AND mcr.originUnionId = @unionId
AND mcr.stateId = @stateId
""");
sql.setParam("taskId", taskId);
sql.setParam("unionId", unionId);
sql.setParam("stateId", MemberChangeApplyState.SCHOOL_UNION);
return simpleService.listMap(sql);
}
}
@@ -0,0 +1,122 @@
package io.v.nutz.welfare.controller.check;
import cn.hutool.core.lang.Assert;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.base.service.SimpleService;
import io.v.nutz.member.constant.MemberChangeRecordMode;
import io.v.nutz.member.model.MemberCheckTask;
import io.v.nutz.member.model.MemberCheckUnionTask;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.sys.models.Sys_union;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.trans.Trans;
import java.util.Calendar;
import java.util.List;
import java.util.stream.Collectors;
/**
* @FileName io.v.nutz.member.controller.check.MemberCheckTaskController
* @Description: TODO
* @Author zxc
* @Date 2022/10/21:10:33
* @Version V1.0
**/
@At("/platform/welfareMember/check/task")
@Ok("json:full")
@IocBean
public class WelfareMemberCheckTaskController {
@Inject
private Dao dao;
@Inject
private SimpleService simpleService;
@At("")
@Ok("beetl:/platform/welfare/member/check/task.html")
@RequiresPermissions("welfare.member.check.task")
public void union() {
}
@At
@ViReturn
public Object pageData(PageForm pageForm, Integer year) {
Sql sql = Sqls.create("""
select * from member_check_task $condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("taskMode", "=", MemberChangeRecordMode.WELFARE_MEMBER.getCode());
cnd.andEX("year", "=", year);
sql.setCondition(cnd);
return simpleService.list(pageForm, sql);
}
@At
@ViReturn
public Object doAdd(MemberCheckTask task) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(task.getStartTime());
List<Sys_union> sysUnions = dao.query(Sys_union.class, null);
Trans.exec(() -> {
task.setYear(calendar.get(Calendar.YEAR));
task.setTaskMode(MemberChangeRecordMode.WELFARE_MEMBER.getCode());
dao.insert(task);
List<MemberCheckUnionTask> unionTasks = sysUnions.stream().map(v -> {
MemberCheckUnionTask unionTask = new MemberCheckUnionTask();
unionTask.setTaskId(task.getId());
unionTask.setUnionId(v.getId());
unionTask.setIsFinish(false);
return unionTask;
}).collect(Collectors.toList());
dao.insert(unionTasks);
});
return null;
}
@At
@ViReturn
public Object doEdit(MemberCheckTask task) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(task.getStartTime());
task.setTaskMode(MemberChangeRecordMode.WELFARE_MEMBER.getCode());
task.setYear(calendar.get(Calendar.YEAR));
dao.updateIgnoreNull(task);
return null;
}
@At
@ViReturn
public Object doDelete(@Param("id") String id) {
Assert.notBlank(id);
Trans.exec(() -> {
dao.clear(MemberCheckTask.class, Cnd.where("id", "=", id));
dao.clear(MemberCheckUnionTask.class, Cnd.where("taskId", "=", id));
});
return null;
}
@At
@ViReturn
public Object getAllTask(Integer year) {
Cnd cnd = Cnd.NEW();
cnd.andEX("year", "=", year);
cnd.and("taskMode", "=", MemberChangeRecordMode.WELFARE_MEMBER.getCode());
cnd.desc("startTime");
return dao.query(MemberCheckTask.class, cnd);
}
}
@@ -0,0 +1,183 @@
package io.v.nutz.welfare.controller.check;
import com.google.common.base.Joiner;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.base.service.SimpleService;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.member.constant.MemberChangeApplyState;
import io.v.nutz.member.constant.MemberChangeOrigin;
import io.v.nutz.member.constant.MemberChangeRecordMode;
import io.v.nutz.member.handle.MemberChangeAuditHandle;
import io.v.nutz.member.model.MemberChangeRecord;
import io.v.nutz.member.model.MemberCheckUnionTask;
import io.v.nutz.modules.models.Audit;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.welfare.constant.WelfareMemberApplyState;
import io.v.nutz.welfare.feature.WelfareFeature;
import io.v.nutz.welfare.mode.WelfareMemberMode;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
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 org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* @FileName io.v.nutz.member.controller.check.MemberCheckUnionController
* @Description: 部门工会核对
* @Author zxc
* @Date 2022/10/21:10:31
* @Version V1.0
**/
@At("/platform/welfareMember/check/union")
@Ok("json:full")
@IocBean
public class WelfareMemberCheckUnionController {
@Inject
private Dao dao;
@Inject
private SimpleService simpleService;
@At("")
@Ok("beetl:/platform/welfare/member/check/union.html")
@RequiresPermissions("welfare.member.check.union")
public void union() {
}
@At
@ViReturn
public Object pageData(PageForm pageForm, String taskId, String unionId, String unitId,
Integer changed,
Integer isMember, WelfareFeature.Condition.PageParam pageParam,
Integer welfareMember) {
Sql sql = Sqls.create("""
SELECT
u.*,
his.changeType,
his.changeTime,
IF
( his.id IS NULL, FALSE, TRUE ) hasHis,
TRUE AS flag,
IF(state.stateId in ($states) OR state.stateId IS NULL ,TRUE,FALSE) apply,
state.stateId,
state.stateName,
state.stateColor,
IF(mcr.stateId = @changeUnitAuditing,TRUE,FALSE) changeUnitAuditing,
IF(mcr.stateId = @changeUnitError,TRUE,FALSE) changeUnitError,
mcr_state.stateId mcrStateId,
mcr_state.stateName mcrStateName,
mcr_state.stateColor mcrStateColor
FROM
`user` u
LEFT JOIN user_history_latest his ON his.loginname = u.loginname
LEFT JOIN welfare_member_apply_record_latest wmar ON wmar.userId = u.id
LEFT JOIN member_change_record_latest mcr on mcr.userId = u.id
LEFT JOIN audit_state state ON wmar.stateId = state.stateId
LEFT JOIN audit_state mcr_state ON mcr_state.stateId = mcr.stateId
$condition
""")
.setParam("recordMode", MemberChangeRecordMode.WELFARE_MEMBER.getCode())
.setParam("changeUnitAuditing", MemberChangeApplyState.SCHOOL_UNION)
.setParam("changeUnitError", MemberChangeApplyState.SCHOOL_UNION_FAIL);
sql.setVar("states", Joiner.on(",").join(List.of(WelfareMemberApplyState.SCHOOL_UNION_FAIL)));
pageForm.defaultSortDesc("wmar.applyTime");
CndPlus cnd = CndPlus.create();
if (changed != 0) {
if (changed == 1) {
cnd.and(new Static("his.loginname is not null"));
} else {
cnd.and(new Static("his.loginname is null"));
}
}
cnd.asc("unitid");
if (welfareMember == 1) {
cnd.and("u.welfareMember", "=", WelfareMemberMode.NORMAL.getCode());
} else if (welfareMember == 2) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.or("u.welfareMember", "=", null).or("u.welfareMember", "=", WelfareMemberMode.NONE.getCode());
cnd.and(group);
}
WelfareFeature.Condition.judgmentAuthority(cnd, "u");
pageParam.participate(cnd, "u");
cnd.and(pageForm);
cnd.desc("his.changeTime");
cnd.asc("u.userState");
sql.setCondition(cnd);
return simpleService.list(pageForm, sql);
}
@At
@ViReturn
@RequiresAuthentication
public Object submitCheck(@Param("taskId") String taskId) {
// if (ShiroUtil.lacksRole("H04")) {
// return Result.error("请使用部门工会管理员来提交核对");
// }
Cnd cnd = Cnd.where("taskId", "=", taskId).and("unionId", "=", Vi.getUnionId());
dao.update(MemberCheckUnionTask.class, Chain.make("isFinish", true), cnd);
return null;
}
@At
@ViReturn
@RequiresAuthentication
public Object doSubmitChangeUser(MemberChangeRecord record) {
record.setRecordMode(MemberChangeRecordMode.WELFARE_MEMBER.getCode());
record.setApplyOrigin(MemberChangeOrigin.UNION.getCode());
record = MemberChangeAuditHandle.CREATE.next(record, null);
Audit audit = new Audit();
audit.setAuditPass(true);
audit.setAuditOpinion(record.getRemark());
MemberChangeAuditHandle.UNION.next(record, audit);
return null;
}
@At
@ViReturn
public Object getUnionTaskStatus(String taskId, String unionId) {
MemberCheckUnionTask unionTask = dao.fetch(MemberCheckUnionTask.class, Cnd.where("taskId", "=", taskId).and("unionId", "=", Vi.getUnionId()));
return unionTask != null && unionTask.getIsFinish();
}
@At
@ViReturn
public Object checkAgain(String taskId) {
Cnd cnd = Cnd.where("taskId", "=", taskId).and("unionId", "=", Vi.getUnionId());
dao.update(MemberCheckUnionTask.class, Chain.make("isFinish", false), cnd);
return null;
}
}
@@ -0,0 +1,510 @@
package io.v.nutz.welfare.controller.statistics;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.export.ExcelExportService;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.sys.models.Sys_union;
import io.v.nutz.sys.models.Sys_unit;
import io.v.nutz.util.ViTool;
import io.v.nutz.welfare.mode.CourierNumberExcelMode;
import io.v.nutz.welfare.mode.WelfareUnitMode;
import io.v.nutz.welfare.model.WelfareProject;
import io.v.nutz.welfare.model.WelfareProjectSubject;
import io.v.nutz.welfare.model.WelfareProjectSubjectOption;
import io.v.nutz.welfare.model.WelfareUserSelection;
import io.v.nutz.welfare.service.WelfareSingleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.random.R;
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.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description 意向选择 邮寄到家类的统计
* @createTime 2022年01月25日 13:51:00
*/
@IocBean
@At("/platform/welfare/project/statistics/single")
@Slf4j
public class WelfareSingleController {
@Inject
private WelfareSingleService welfareSingleService;
@Inject
private MsgApi msgApi;
@Inject
private Dao dao;
@At("")
@Ok("beetl:/platform/welfare/statistics/single.html")
@RequiresPermissions("welfare.project.statistics.single")
public void index() {
}
/**
* 表格数据
*
* @param projectId
* @return
*/
@At
@ViReturn
@Ok("json")
public Object pageData(String projectId, String welfareUnitCode) {
return welfareSingleService.pageData(projectId, welfareUnitCode);
}
/**
* 福利数据
*
* @param year
* @return
*/
@At
@ViReturn
@Ok("json")
public Object welfareProjectList(Integer year) {
return welfareSingleService.welfareProjectList(year);
}
/**
* 按基层工会导出
*
* @param projectId
* @param welfareUnitCode
*/
@At
@Ok("void")
public void exportByUnion(String projectId, String welfareUnitCode, HttpServletResponse response) {
String title = "统计名单";
if (StrUtil.isNotBlank(welfareUnitCode)) {
switch (WelfareUnitMode.getMode().name()) {
case "UNION" -> {
Sys_union sysUnion = dao.fetch(Sys_union.class, Cnd.where("unioncode", "=", welfareUnitCode));
title = (Lang.isNotEmpty(sysUnion) ? sysUnion.getUnionname() : "") + "统计名单";
}
case "UNIT" -> {
Sys_unit sysUnit = dao.fetch(Sys_unit.class, Cnd.where("unitcode", "=", welfareUnitCode));
title = (Lang.isNotEmpty(sysUnit) ? sysUnit.getName() : "") + "统计名单";
}
}
// String unionname = dao.fetch(Sys_union.class, unionId).getUnionname();
// title = unionname + "统计名单";
}
NutMap dataMap = welfareSingleService.pageData(projectId, welfareUnitCode);
List<ExcelExportEntity> entityList = new ArrayList<>();
List<NutMap> labelList = dataMap.getAsList("tableColumn", NutMap.class);
labelList.add(0, NutMap.NEW().addv("label", "福利单位").addv("prop", "welfareUnitName"));
labelList.add(1, NutMap.NEW().addv("label", "福利单位编码").addv("prop", "welfareUnitCode"));
List<NutMap> list = dataMap.getAsList("tableList", NutMap.class);
labelList.forEach(v -> {
entityList.add(new ExcelExportEntity(v.getString("label"), v.getString("prop"), 20));
});
try {
ViTool.excelResponse(response, "汇总表.xls");
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(title, ""), entityList, list);
workbook.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 每个部门工会领取人员
*
* @param projectId
* @param welfareUnitCode
* @return
*/
@At
@ViReturn
@Ok("json:full")
public Object receivePageData(String projectId, String welfareUnitCode) {
List<NutMap> labelList = welfareSingleService.receivePageDataColumns(projectId);
List<NutMap> list = welfareSingleService.receivePageData(projectId, welfareUnitCode);
return NutMap.NEW().addv("list", list).addv("label", labelList);
}
/**
* 导出已选名单
*
* @param projectId
* @param welfareUnitCode 空->导出全部
*/
@At
@Ok("void")
public void exportReceiveDetail(String projectId, String welfareUnitCode, boolean flag, HttpServletResponse response) {
/* String title = "发放详细名单";
if (StrUtil.isNotBlank(welfareUnitCode)) {
switch (WelfareUnitMode.getMode().name()) {
case "UNION" -> {
Sys_union sysUnion = dao.fetch(Sys_union.class, Cnd.where("unioncode", "=", welfareUnitCode));
title = (Lang.isNotEmpty(sysUnion) ? sysUnion.getUnionname() : "") + "发放详细名单";
}
case "UNIT" -> {
Sys_unit sysUnit = dao.fetch(Sys_unit.class, Cnd.where("unitcode", "=", welfareUnitCode));
title = (Lang.isNotEmpty(sysUnit) ? sysUnit.getName() : "") + "发放详细名单";
}
}
// String unionname = dao.fetch(Sys_union.class, welfareUnitCode).getUnionname();
// title = unionname + "发放详细名单";
}*/
List<NutMap> labelList = welfareSingleService.receivePageDataColumns(projectId);
List<ExcelExportEntity> entityList = new ArrayList<>();
labelList.forEach(v -> {
entityList.add(new ExcelExportEntity(v.getString("label"), v.getString("prop"), v.getInt("width", 20)));
});
List<NutMap> list;
if (flag) {
list = welfareSingleService.receivePageData(projectId, welfareUnitCode);
} else {
list = welfareSingleService.unclaimedData(projectId, welfareUnitCode);
}
Map<String, List<NutMap>> userListMap = null;
List<NutMap> list2 = list.stream().filter(v -> Strings.isNotBlank(v.getString("unionName"))).collect(Collectors.toList());
switch (WelfareUnitMode.getMode().name()) {
case "UNION" -> {
userListMap = list2.stream().collect(Collectors.groupingBy(v -> v.getString("unionName")));
}
case "UNIT" -> {
userListMap = list2.stream().collect(Collectors.groupingBy(v -> v.getString("unitName")));
}
}
Workbook workbook = new XSSFWorkbook();
userListMap.forEach((k, v) -> {
ExcelExportService service = new ExcelExportService();
ExportParams exportParams = new ExportParams();
exportParams.setTitle(k);
exportParams.setSheetName(k);
exportParams.setType(ExcelType.XSSF);
service.createSheetForMap(workbook, exportParams, entityList, v);
});
try {
ViTool.excelResponse(response, (flag ? "已选名单" : "未选名单") + ".xlsx");
ServletOutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
outputStream.close();
/* ViTool.excelResponse(response, "领取详情.xls");
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(title, ""), entityList, list);
workbook.write(response.getOutputStream());*/
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 按商品导出
*
* @param projectId
* @param response
* @throws Exception
*/
@At
@Ok("void")
public void shopExport(String projectId, HttpServletResponse response) throws Exception {
// List<NutMap> list = welfareSingleService.receivePageData(projectId, "");
//找出所有领福利的人
Sql sql = Sqls.create("""
SELECT
u.loginname AS loginName,
u.username AS userName,
u.unitname AS unitName,
u.unionname AS unionName,
u.mobile,
wpus.receiveAddress,
wpso.optionName,
wpus.courierNumber
FROM
welfare_project_user_selection wpus
LEFT JOIN `user` u ON u.id = wpus.selectUserId
LEFT JOIN welfare_project_subject_option wpso ON wpso.id = wpus.selectOptionId
WHERE
wpus.welfareId = @welfareId
ORDER BY
u.unioncode ASC
""").setParam("welfareId", projectId);
List<NutMap> list = welfareSingleService.listMap(sql);
String fileName = "名单汇总文件夹";
response.reset();
response.setContentType("application/x-msdownload;charset=utf-8");
String tmpPath = "tmp/" + DateFormatUtils.format(new Date(), "yyyyMMddHHmmss", Locale.CHINA) + "/";
File tmpDir = new File(tmpPath);
tmpDir.mkdirs();
List<NutMap> labelList = welfareSingleService.receivePageDataColumns(projectId);
List<ExcelExportEntity> entityList = new ArrayList<>();
labelList.forEach(v -> {
entityList.add(new ExcelExportEntity(v.getString("label"), v.getString("prop"), v.getInt("width", 20)));
});
//找出有哪几种福利商品
WelfareProjectSubject welfareProjectSubject = dao.fetch(WelfareProjectSubject.class, Cnd.where("projectId", "=", projectId));
List<WelfareProjectSubjectOption> welfareProjectSubjectOptionList = dao.query(WelfareProjectSubjectOption.class, Cnd.where("subjectId", "=", welfareProjectSubject.getId()));
welfareProjectSubjectOptionList.forEach(v -> {
List<NutMap> userList = list.stream().filter(u -> u.getString("optionName").equals(v.getOptionName())).collect(Collectors.toList());
FileOutputStream outputStream = null;
try {
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
outputStream = new FileOutputStream(tmpPath + v.getOptionName() + ".xlsx");
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, userList);
workbook.write(outputStream);
workbook.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
});
String aimsDir = "zipTmp/" + R.UU32();
String aimsName = fileName + ".zip";
String aimsPath = aimsDir + "/" + aimsName;
io.v.nutz.web.commons.utils.FileUtil.compressToZip(tmpDir.getPath(), aimsDir, aimsName);
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode(aimsName, "UTF-8"));
File aimsFile = new File(aimsPath);
FileInputStream inputStream = new FileInputStream(aimsFile);
IOUtils.copy(inputStream, response.getOutputStream());
inputStream.close();
aimsFile.delete();
io.v.nutz.web.commons.utils.FileUtil.deleteDir(new File(tmpPath));
io.v.nutz.web.commons.utils.FileUtil.deleteDir(new File(aimsDir));
}
@At
@ViReturn
public Object sendMsg(String projectId) {
List<NutMap> list = welfareSingleService.unclaimedData(projectId, "");
ArrayList<Map> list2 = new ArrayList<>();
list.forEach(v -> {
list2.add(Map.of("touser", v.getString("loginName")));
});
msgApi.sendMsg("", list2, List.of(Map.of("tool", MsgApi.sendTool.wechat_enterprise.name())));
return null;
}
/**
* 某个项目某一部门工会未领取人员
*
* @param projectId
* @param welfareUnitCode
* @return
*/
@At
@ViReturn
@Ok("json")
public Object unclaimedData(String projectId, String welfareUnitCode) {
return welfareSingleService.unclaimedData(projectId, welfareUnitCode);
}
/**
* 导入快递单号
*
* @param file excel文件
*/
@At
@Ok("json")
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
public Object importCourierNumber(@Param("file") TempFile file, @Param("projectId") String projectId) {
if (Lang.isEmpty(file)) {
return Result.error("上传的文件不能为空");
}
String extName = FileUtil.extName(file.getFile());
if (!List.of("xls", "xlsx").contains(extName.toLowerCase())) {
return Result.error("请上传xls,xlsx文件");
}
List<CourierNumberExcelMode> excelList;
try {
ImportParams importParams = new ImportParams();
// importParams.setTitleRows(1);
excelList = ExcelImportUtil.importExcel(file.getFile(), CourierNumberExcelMode.class, importParams);
} catch (Exception e) {
log.error(e.getMessage());
return Result.error("读取不到数据,请检查excel文件格式");
}
if (Lang.isEmpty(excelList)) {
return Result.error("读取不到数据,请检查excel文件格式");
}
try {
if (excelList.stream().anyMatch(v -> StrUtil.isBlank(v.getLoginName())) || excelList.stream().anyMatch(v -> StrUtil.isBlank(v.getCourierNumber()))) {
return Result.error("工号和快递单号不能为空");
}
Map<String, String> loginNameCourierMap = excelList.stream().collect(Collectors.toMap(v -> v.getLoginName(), v -> v.getCourierNumber()));
List<String> loginNameList = excelList.stream().map(v -> v.getLoginName()).collect(Collectors.toList());
Sql loginNameSql = Sqls.create("select id,loginname from sys_user where loginname in (@loginNameList)");
loginNameSql.setParam("loginNameList", loginNameList);
List<NutMap> loginNameMaps = welfareSingleService.listMap(loginNameSql);
Map<String, String> kvMap = loginNameMaps.stream().collect(Collectors.toMap(v -> v.getString("id"), v -> v.getString("loginname")));
List<WelfareUserSelection> userSelectionList = welfareSingleService.dao().query(WelfareUserSelection.class, Cnd.where("welfareId", "=", projectId));
for (WelfareUserSelection us : userSelectionList) {
String loginName = kvMap.get(us.getSelectUserId());
String courierNumber = loginNameCourierMap.get(loginName);
us.setCourierNumber(courierNumber);
}
dao.update(userSelectionList);
return Result.success("导入成功");
} catch (Exception e) {
log.error(e.getMessage());
return Result.error("导入快递单号失败");
}
}
@At
@Ok("void")
public void downLoadExpressTemplate(HttpServletResponse response) {
try {
String fileName = "导入模板";
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".xlsx").getBytes("utf-8"), "ISO8859-1"));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, CourierNumberExcelMode.class, Collections.emptyList());
workbook.write(response.getOutputStream());
} catch (Exception e) {
log.error(e.getMessage());
}
}
@At
@Ok("void")
public void exportReceiveDetailByUnionIdWord(String projectId, String welfareUnitId, HttpServletResponse response) {
List<NutMap> result = new ArrayList<>();
//查询这个福利下有哪些礼品
WelfareProject welfareProject = welfareSingleService.dao().fetch(WelfareProject.class, projectId);
WelfareProjectSubject welfareProjectSubject = welfareSingleService.dao().fetch(WelfareProjectSubject.class, Cnd.where("projectId", "=", projectId));
List<WelfareProjectSubjectOption> welfareProjectSubjectOptions = welfareSingleService.dao().query(WelfareProjectSubjectOption.class, Cnd.where("subjectId", "=", welfareProjectSubject.getId()).asc("optionName"));
Sys_union sysUnion = welfareSingleService.dao().fetch(Sys_union.class, Cnd.where("id", "=", welfareUnitId));
//查询这个工会已签收的人
Sql userSql = Sqls.create("""
SELECT
su.id,
su.username,
su.unionname
FROM
`welfare_list` wl
LEFT JOIN `user` su ON wl.userId = su.id
WHERE
wl.welfareUnitId = @welfareUnitId
AND wl.projectId = @projectId
""").setParam("welfareUnitId", welfareUnitId).setParam("projectId", projectId);
List<NutMap> userMap = welfareSingleService.listMap(userSql);
userMap.forEach(us -> {
NutMap nutMap = new NutMap();
nutMap.setv("userName", us.getString("username"));
welfareProjectSubjectOptions.forEach(fl -> {
//判断这个福利用户有没有选择
WelfareUserSelection xz = welfareSingleService.dao().fetch(WelfareUserSelection.class, Cnd.where("selectOptionId", "=", fl.getId()).and("selectUserId", "=", us.getString("id")));
//找出这个福利选项是否有默认选项
if (Lang.isNotEmpty(xz)) {
nutMap.setv(fl.getOptionName(), "√");
} else {
nutMap.setv(fl.getOptionName(), "");
}
});
result.add(nutMap);
});
List<ExcelExportEntity> entityList = new ArrayList<>();
ExcelExportEntity indexEntity = new ExcelExportEntity("序号", "xh", 5);
indexEntity.setFormat("isAddIndex");
entityList.add(indexEntity);
entityList.add(new ExcelExportEntity("姓名", "userName", 15));
welfareProjectSubjectOptions.forEach(v -> {
entityList.add(new ExcelExportEntity(v.getOptionName(), v.getOptionName(), 15));
});
entityList.add(new ExcelExportEntity("实名签领", "", 15));
try {
ViTool.excelResponse(response, sysUnion.getUnionname() + welfareProject.getName() + "签收表.xls");
ExportParams exportParams = new ExportParams();
exportParams.setTitle(sysUnion.getUnionname() + welfareProject.getName() + "签收表");
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, result);
workbook.write(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,252 @@
package io.v.nutz.welfare.controller.voucher;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.welfare.mode.WelfareVoucherOrigin;
import io.v.nutz.welfare.mode.WelfareVoucherStatus;
import io.v.nutz.welfare.service.WelfareVoucherService;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.adaptor.JsonAdaptor;
import org.nutz.mvc.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 礼品券
*
* @author: 1V
* @date: 2021/3/15
* @since 1.0
*/
@IocBean
@Ok("json:full")
@At("/platform/welfare/voucher")
public class WelfareVoucherController {
@Inject
private WelfareVoucherService welfareVoucherService;
/**
* 发放礼品
*
* @param voucherId 券id
* @param userid 发放人id
* @return null
*/
@At
@POST
@ViReturn
@AdaptBy(type = JsonAdaptor.class)
public Object grantGift(@Param("voucherId") String voucherId, @Param("userid") String userid) {
return welfareVoucherService.grantGift(voucherId, userid);
}
/**
* 自己点已领取
*
* @param voucherId 券id
* @return null
*/
@At
@POST
@ViReturn
@AdaptBy(type = JsonAdaptor.class)
public Object selfReceived(@Param("voucherId") String voucherId) {
welfareVoucherService.update(Chain.make("status", WelfareVoucherStatus.USED.getCode())
.add("useTime", System.currentTimeMillis()), Cnd.where("id", "=", voucherId));
return null;
}
/**
* 观测这个礼品券是否已经被使用
*
* @param voucherId 券id
* @return 礼品券是否已经被使用
*/
@At
@GET
public boolean voucherReceived(String voucherId) {
return welfareVoucherService.count(Cnd.where("id", "=", voucherId).and("status", "=", WelfareVoucherStatus.USED.getCode())) > 0;
}
/**
* 获取礼品券详细信息
*
* @param voucherId 券id
* @return 礼品券详细信息
*/
@At
@GET
@ViReturn
public Object voucherInfo(String voucherId) {
return welfareVoucherService.voucherInfo(voucherId);
}
/**
* 获取转赠的礼品券详细信息
*
* @param voucherId 券id
* @return 礼品券详细信息
*/
@At
@GET
@ViReturn
public Object donateVoucherInfo(String voucherId) {
return welfareVoucherService.donateVoucherInfo(voucherId);
}
/**
* 转赠领取
*
* @param voucherId 券id
* @param userid 被转赠人id
* @return 领取结果
*/
@At
@POST
@ViReturn
@AdaptBy(type = JsonAdaptor.class)
public Object donateReceive(@Param("voucherId") String voucherId, @Param("userid") String userid) {
return welfareVoucherService.donateReceive(voucherId, userid).map();
}
/**
* 将礼品券的状态改为已赠但是未领
*
* @param voucherId 券Id
* @return null
*/
@At
@POST
@ViReturn
@AdaptBy(type = JsonAdaptor.class)
public Object voucherDonating(@Param("voucherId") String voucherId) {
welfareVoucherService.voucherDonating(voucherId);
return null;
}
/**
* 领取礼品券
*
* @param projectId 福利项目id
* @param userid 用户id
* @return null
*/
@At
@ViReturn
@POST
@AdaptBy(type = JsonAdaptor.class)
public Object grantVoucher(@Param("projectId") String projectId, @Param("userid") String userid) {
return welfareVoucherService.grantVoucher(projectId, userid);
}
/**
* 该用户未领取的礼品券
*
* @param userid 用户id
* @return 列表
*/
@At
@ViReturn
public Object unclaimedVoucher(String userid) {
return welfareVoucherService.unclaimedVoucher(userid);
}
/**
* 礼品券列表
*
* @param pageForm 分页对象
* @param userid 用户id
* @param status {1:待使用 2:已使用 3:已过期}
* @return 分页列表
*/
@At
@ViReturn
public Object pageData(PageForm pageForm, String userid, Integer status) {
Sql sql = Sqls.create("""
SELECT
voucher.id,
voucher.projectId,
project.`name`,
project.festival,
project.provideAddress,
project.gift,
project.flexibleGifts,
project.provideTimeStart,
project.provideTimeEnd,
voucher.grantTime,
voucher.useTime,
voucher.origin,
voucher.status,
donateUser.username donateUser
FROM
welfare_voucher voucher
LEFT JOIN welfare_project project ON voucher.projectId = project.id
LEFT JOIN sys_user donateUser ON voucher.donateUserId = donateUser.id
$condition
""");
pageForm.defaultSortDesc("voucher.grantTime");
CndPlus cnd = CndPlus.create();
cnd.and("voucher.userId", "=", userid);
if (status == 1) {
cnd.and("voucher.status", "=", WelfareVoucherStatus.NORMAL.getCode())
.and(new Static("project.provideTimeEnd >= now()"));
} else if (status == 2) {
cnd.and("voucher.status", "in", List.of(WelfareVoucherStatus.USED.getCode(), WelfareVoucherStatus.DONATING.getCode(), WelfareVoucherStatus.DONATE.getCode(), WelfareVoucherStatus.INVALID.getCode()));
} else if (status == 3) {
cnd.and("voucher.status", "=", WelfareVoucherStatus.NORMAL.getCode())
.and(new Static("project.provideTimeEnd < now()"));
} else {
cnd.and(new Static("1 != 1"));
}
sql.setCondition(cnd);
return welfareVoucherService.list(pageForm, sql);
}
/**
* @return 状态词典
*/
@At
@ViReturn
public Object statusDict() {
Map result = new HashMap();
WelfareVoucherStatus[] values = WelfareVoucherStatus.values();
for (WelfareVoucherStatus value : values) {
result.put(value.getCode(), value.getDescription());
}
return result;
}
/**
* @return 来源词典
*/
@At
@ViReturn
public Object originDict() {
Map result = new HashMap();
WelfareVoucherOrigin[] values = WelfareVoucherOrigin.values();
for (WelfareVoucherOrigin value : values) {
result.put(value.getCode(), value.getDescription());
}
return result;
}
}
@@ -0,0 +1,90 @@
package io.v.nutz.welfare.feature;
import cn.hutool.core.bean.BeanUtil;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.util.ShiroUtil;
import io.v.nutz.welfare.mode.WelfareUnitMode;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.Cnd;
import org.nutz.lang.Strings;
import java.util.Map;
/**
* 小工具
*
* @author: 1V
* @date: 2021/2/28
* @since 1.0
*/
public interface WelfareFeature {
/**
* 判断是否可以查看全部
*
* @return
*/
static boolean judgmentAuthority() {
return ShiroUtil.hasAnyRoles("sysadmin,flwyh01,A06");
}
interface Condition {
private static String getPrefix(String prefix) {
return Strings.isBlank(prefix) ? "" : prefix + ".";
}
/**
* 判断是否可以查看全部
* 部门工会只看自己工会的
*
* @param cnd
* @return
*/
static void judgmentAuthority(Cnd cnd) {
judgmentAuthority(cnd, "");
}
/**
* 判断是否可以查看全部
* 部门工会只看自己工会的
*
* @param cnd
* @param prefix
* @return
*/
static void judgmentAuthority(Cnd cnd, String prefix) {
if (!WelfareFeature.judgmentAuthority()) {
String field = WelfareUnitMode.getMode().getField();
Map<String, Object> bean = BeanUtil.beanToMap(Vi.getUnit());
cnd.and(Condition.getPrefix(prefix) + field, "=", bean.get(field));
}
}
@Data
@Accessors(chain = true)
class PageParam {
String unit;
String welfareUnit;
String campus;
String personType;
String userState;
String sex;
public void participate(CndPlus cnd) {
participate(cnd, "");
}
public void participate(CndPlus cnd, String prefix) {
cnd.andExcludeEmpty(Condition.getPrefix(prefix) + "unitid", "=", getUnit());
cnd.andExcludeEmpty(Condition.getPrefix(prefix) + WelfareUnitMode.getMode().getField(), "=", getWelfareUnit());
cnd.andExcludeEmpty(Condition.getPrefix(prefix) + "campusId", "=", getCampus());
cnd.andExcludeEmpty(Condition.getPrefix(prefix) + "personType", "=", getPersonType());
cnd.andExcludeEmpty(Condition.getPrefix(prefix) + "userState", "=", getUserState());
cnd.andExcludeEmpty(Condition.getPrefix(prefix) + "sex", "=", getSex());
}
}
}
}
@@ -0,0 +1,101 @@
package io.v.nutz.welfare.handle;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.member.constant.MemberApplyState;
import io.v.nutz.modules.models.Audit;
import io.v.nutz.modules.services.AuditService;
import io.v.nutz.sys.services.SysUserService;
import io.v.nutz.util.ViResource;
import io.v.nutz.welfare.constant.WelfareMemberApplyState;
import io.v.nutz.welfare.feature.WelfareFeature;
import io.v.nutz.welfare.mode.WelfareMemberMode;
import io.v.nutz.welfare.model.WelfareMemberApplyRecord;
import io.v.nutz.welfare.service.WelfareMemberService;
import lombok.Getter;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 福利会员申请审核
*
* @author: 1V
* @date: 2021/2/28
* @since 1.0
*/
@Getter
public enum WelfareMemberApplyAuditHandle {
/**
* 创建
*/
CREATE(null) {
@Override
public void next(WelfareMemberApplyRecord record, Audit audit) {
next(List.of(record), audit);
}
@Override
public void next(List<WelfareMemberApplyRecord> records, Audit audit) {
if (WelfareFeature.judgmentAuthority()) {
WelfareMemberMode.joinWelfareMember(records.stream().map(v -> v.getUserId()).collect(Collectors.toList()));
} else {
Date now = new Date();
for (WelfareMemberApplyRecord record : records) {
record.setApplyTime(now);
record.setStateId(WelfareMemberApplyState.SCHOOL_UNION);
}
service.dao().insert(records);
}
}
},
/**
* 校工会审核
*/
AUDIT_SCHOOL(MemberApplyState.SCHOOL_UNION) {
@Override
public void next(WelfareMemberApplyRecord record, Audit audit) {
next(List.of(record), audit);
}
@Override
public void next(List<WelfareMemberApplyRecord> records, Audit audit) {
service.transactional(() -> {
String auditId = auditService.insert(audit).getId();
for (WelfareMemberApplyRecord record : records) {
record.setStateId(audit.getAuditPass() ? WelfareMemberApplyState.NORMAL_MEMBER : WelfareMemberApplyState.SCHOOL_UNION_FAIL);
record.setSchoolAuditId(auditId);
sysUserService.deleteCache(record.getUserId());
}
service.update(records);
if (audit.getAuditPass()) {
service.update(Chain.make("welfareMember", WelfareMemberMode.NORMAL.getCode()).add("welfareMemberJoinTime", new Date()), Cnd.where("id", "in", records.stream().map(v -> v.getUserId()).collect(Collectors.toList())));
}
});
}
};
private Integer state;
WelfareMemberApplyAuditHandle(Integer state) {
this.state = state;
}
public Vi vi = ViResource.ioc.get(Vi.class);
public AuditService auditService = ViResource.ioc.getByType(AuditService.class);
public WelfareMemberService service = ViResource.ioc.getByType(WelfareMemberService.class);
public SysUserService sysUserService = ViResource.ioc.getByType(SysUserService.class);
public abstract void next(WelfareMemberApplyRecord record, Audit audit);
public abstract void next(List<WelfareMemberApplyRecord> records, Audit audit);
}
@@ -0,0 +1,15 @@
package io.v.nutz.welfare.mode;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
@Data
public class CourierNumberExcelMode {
@Excel(name = "工号")
private String loginName;
@Excel(name = "快递单号")
private String courierNumber;
}
@@ -0,0 +1,71 @@
package io.v.nutz.welfare.mode;
import io.v.nutz.util.ViResource;
import io.v.nutz.welfare.model.WelfareMemberApplyRecord;
import io.v.nutz.welfare.service.WelfareMemberService;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import java.util.Date;
import java.util.List;
/**
* 福利会员状态
*
* @author: 1V
* @date: 2021/1/25
* @since 1.0
*/
@Getter
@AllArgsConstructor
public enum WelfareMemberMode {
NONE(0, "非会员"), NORMAL(1, "正式会员"), POTENTIAL(2, "潜在会员");
private int code;
private String description;
private static WelfareMemberService getService() {
return ViResource.ioc.getByType(WelfareMemberService.class);
}
/**
* 将用户设为福利会员
*
* @param userId
*/
public static void joinWelfareMember(String userId) {
joinWelfareMember(List.of(userId));
}
/**
* 将用户设为福利会员(多个)
*
* @param userIds
*/
public static void joinWelfareMember(List<String> userIds) {
getService().update(Chain.make("welfareMember", NORMAL.getCode()).add("welfareMemberJoinTime", new Date()), Cnd.where("id", "in", userIds));
}
/**
* 取消福利会员的身份
*
* @param userId
*/
public static void kickWelfareMember(String userId) {
kickWelfareMember(List.of(userId));
}
/**
* 取消福利会员的身份(多个)
*
* @param userIds
*/
public static void kickWelfareMember(List<String> userIds) {
getService().dao().clear(WelfareMemberApplyRecord.class, Cnd.where("userId", "in", userIds));
getService().update(Chain.make("welfareMember", NONE.getCode()).add("welfareMemberJoinTime", null), Cnd.where("id", "in", userIds));
}
}
@@ -0,0 +1,23 @@
package io.v.nutz.welfare.mode;
import io.v.nutz.annontation.SelectEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 福利通知推送形式
*
* @author: 1V
* @date: 2021/2/26
* @since 1.0
*/
@Getter
@AllArgsConstructor
@SelectEnum
public enum WelfareNoticePushMode {
ENTERPRISE_WECHAT(1, "企业微信");
// , APPLET(2, "小程序");
private Integer code;
private String description;
}
@@ -0,0 +1,25 @@
package io.v.nutz.welfare.mode;
import io.v.nutz.annontation.SelectEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 福利发放形式
*
* @author: 1V
* @date: 2021/2/26
* @since 1.0
*/
@Getter
@AllArgsConstructor
@SelectEnum
public enum WelfareProvideMode {
WELFARE_UNIT(1, "部门工会/福利单位"),
PERSON_CHOICE(2, "意向选择"),
PERSONAL(3, "邮寄到家");
// TOGETHER(4, "集中发放");
private Integer code;
private String description;
}
@@ -0,0 +1,22 @@
package io.v.nutz.welfare.mode;
import io.v.nutz.annontation.SelectEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 福利签收形式
*
* @author: 1V
* @date: 2021/2/26
* @since 1.0
*/
@Getter
@AllArgsConstructor
@SelectEnum
public enum WelfareSignMode {
PAPER(1, "纸质签字"), QRCODE_SIGNATURE(2, "电子签字"), QRCODE(3, "二维码");
private Integer code;
private String description;
}
@@ -0,0 +1,48 @@
package io.v.nutz.welfare.mode;
import io.v.nutz.lang.Enum;
import io.v.nutz.sys.services.SysUnitService;
import io.v.nutz.util.ViResource;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.welfare.model.view.WelfareUnit;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.nutz.dao.Sqls;
import java.util.List;
/**
* Todo
*
* @author: 1V
* @date: 2021/2/4
* @since 1.0
*/
@Getter
@AllArgsConstructor
public enum WelfareUnitMode {
UNIT("welfareUnitId"), UNION("unionid");
private String field;
/**
* 获取当前系统参数设置的mode
*
* @return mode
*/
public static WelfareUnitMode getMode() {
return Enum.instance(WelfareUnitMode.class, Globals.MyConfig.getString("WelfareUnitMode"));
}
/**
* 获取福利单位
*
* @return
*/
public static List<WelfareUnit> getWelfareUnits() {
SysUnitService service = ViResource.ioc.getByType(SysUnitService.class);
return service.listEntity(Sqls.create("SELECT * from welfare_unit WHERE welfareUnitMode = @mode ORDER BY welfareUnitCode").setParam("mode", getMode()), WelfareUnit.class);
}
}
@@ -0,0 +1,34 @@
package io.v.nutz.welfare.mode;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 礼品卷来源
*
* @author: 1V
* @date: 2021/3/16
* @since 1.0
*/
@Getter
@AllArgsConstructor
public enum WelfareVoucherOrigin {
/**
* 正常领取
*/
RECEIVE(1, "正常领取"),
/**
* 转赠
*/
DONATE(2, "转赠");
/**
* 代码
*/
private final int code;
/**
* 描述
*/
private final String description;
}
@@ -0,0 +1,48 @@
package io.v.nutz.welfare.mode;
import io.v.nutz.annontation.SelectEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 礼品卷状态
*
* @author: 1V
* @date: 2021/3/16
* @since 1.0
*/
@Getter
@SelectEnum
@AllArgsConstructor
public enum WelfareVoucherStatus {
/**
* 待使用
*/
NORMAL(1, "待使用"),
/**
* 已使用
*/
USED(2, "已使用"),
/**
* 已转赠待领取
*/
DONATING(3, "转赠待领取"),
/**
* 已转赠
*/
DONATE(4, "已转赠"),
/**
* 作废
*/
INVALID(10, "作废");
/**
* 编码
*/
private final int code;
/**
* 描述
*/
private final String description;
}
@@ -0,0 +1,54 @@
package io.v.nutz.welfare.mode.voucher;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Map;
/**
* 发放礼品结果
*
* @author: 1V
* @date: 2021/3/17
* @since 1.0
*/
@Getter
@AllArgsConstructor
public enum WelfareGiftGrantResult {
/**
* 发放成功
*/
SUCCESS(true, "发放成功"),
/**
* 已使用
*/
GRANTED(false, "礼品券已使用"),
/**
* 为找到
*/
NotFound(false, "不存在的礼品券"),
/**
* 超时
*/
TIMEOUT(false, "不在发放时间范围内"),
/**
* 系统错误
*/
FAIL(false, "系统错误");
/**
* 是否成功
*/
private final boolean success;
/**
* 结果描述
*/
private final String description;
public Map<String, Object> map() {
return Map.of("success", this.success, "description", this.description);
}
}
@@ -0,0 +1,53 @@
package io.v.nutz.welfare.mode.voucher;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Map;
/**
* 礼品券转赠领取结果
*
* @author: 1V
* @date: 2021/3/17
* @since 1.0
*/
@Getter
@AllArgsConstructor
public enum WelfareVoucherDonateReceiveResult {
/**
* 领取成功
*/
SUCCESS(true, "领取成功"),
/**
* 已被领取
*/
DONATED(false, "该礼品券已被领取"),
/**
* 系统错误
*/
FAIL(false, "系统错误"),
/**
* 作废
*/
INVALID(false, "该礼品券已作废"),
/**
* 超时
*/
TIMEOUT(false, "该礼品券领取时间已过");
/**
* 是否成功
*/
private final boolean success;
/**
* 结果描述
*/
private final String description;
public Map<String, Object> map() {
return Map.of("success", this.success, "description", this.description);
}
}
@@ -0,0 +1,49 @@
package io.v.nutz.welfare.model;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* 福利名单
*
* @author: 1V
* @date: 2021/2/1
* @since 1.0
*/
@Table("welfare_list")
@TableIndexes({
@Index(name = "INDEX_WELFARE_LIST_USER_ID", fields = {"userId"}, unique = false),
@Index(name = "INDEX_WELFARE_LIST_WELFARE_UNIT_ID", fields = {"welfareUnitId"}, unique = false),
})
@Data
@Accessors(chain = true)
public class WelfareList {
@Name
@Column
@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 projectId;
@Column
@Comment("用户ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("福利单位ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String welfareUnitId;
@Column
@Comment("是否签收")
@ColDefine(type = ColType.BOOLEAN)
private boolean isReceive;
}
@@ -0,0 +1,69 @@
package io.v.nutz.welfare.model;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @author zxy
* @Description 福利会员地址信息
* @createTime 2022年01月14日 09:49:00
*/
@Table("welfare_member_address")
@Data
@Accessors(chain = true)
public class WelfareMemberAddress {
@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 userId;
@Column
@Comment("收货人姓名")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String userName;
@Column
@Comment("收货人手机号")
@ColDefine(type = ColType.VARCHAR, width = 11)
private String tel;
@Column
@Comment("省份")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String province;
@Column
@Comment("城市")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String city;
@Column
@Comment("区县")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String county;
@Column
@Comment("详细地址")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String addressDetail;
@Column
@Comment("地区编码")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String areaCode;
@Column
@Comment("是否为默认地址")
@ColDefine(type = ColType.BOOLEAN)
private boolean isDefault;
}
@@ -0,0 +1,55 @@
package io.v.nutz.welfare.model;
import io.v.nutz.modules.models.Audit;
import io.v.nutz.modules.models.AuditState;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
/**
* 福利会员申请记录
*
* @author: 1V
* @date: 2021/2/28
* @since 1.0
*/
@Data
@Accessors(chain = true)
@Table("welfare_member_apply_record")
public class WelfareMemberApplyRecord {
@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 userId;
@Column
@Comment("状态id")
@ColDefine(type = ColType.INT, width = 8)
private Integer stateId;
@Column
@Comment("申请时间")
private Date applyTime;
@Column
@Comment("校工会审核记录id")
@ColDefine(type = ColType.VARCHAR, width = 32)
public String schoolAuditId;
@One(field = "schoolAuditId")
public Audit schoolAudit;
@One(field = "stateId")
private AuditState auditState;
}
@@ -0,0 +1,33 @@
package io.v.nutz.welfare.model;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
/**
* 福利会员名单
* 年度 + 用户id + 福利单位
*
* @author: 1V
* @date: 2021/2/24
* @since 1.0
*/
@Data
@Accessors(chain = true)
@Table("welfare_member_record")
public class WelfareMemberRecord {
@Column
@Comment("年度")
@ColDefine(type = ColType.INT, width = 4)
private Integer year;
@Column
@Comment("用户Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("单位Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unitId;
}
@@ -0,0 +1,174 @@
package io.v.nutz.welfare.model;
import io.v.nutz.data.model.MatchConditionStructure;
import io.v.nutz.modules.models.ViBaseModel;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
import java.util.List;
/**
* 福利项目
*
* @author: 1V
* @date: 2021/2/26
* @since 1.0
*/
@Data
@Accessors(chain = true)
@Table("welfare_project")
public class WelfareProject extends ViBaseModel {
@Column
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("年度")
@ColDefine(type = ColType.INT, width = 4)
@PrevInsert(
els = {@EL("$me.nowYear()")}
)
private Integer year;
@Column
@Comment("任务id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String taskId;
@Column
@Comment("项目名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String name;
@Column
@Comment("节日")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String festival;
@Column
@Comment("发放开始时间")
@ColDefine(type = ColType.DATETIME)
private Date provideTimeStart;
@Column
@Comment("发放结束时间")
@ColDefine(type = ColType.DATETIME)
private Date provideTimeEnd;
@Column
@Comment("选择开始时间")
@ColDefine(type = ColType.DATETIME)
private Date choiceTimeStart;
@Column
@Comment("选择结束时间")
@ColDefine(type = ColType.DATETIME)
private Date choiceTimeEnd;
@Column
@Comment("发放地址")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String provideAddress;
@Column
@Comment("发放地址坐标")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String provideCoordinate;
/**
* @see io.v.nutz.welfare.mode.WelfareProvideMode
*/
@Column
@Comment("发放形式")
@ColDefine(type = ColType.INT, width = 1)
private Integer provideMode;
/**
* @see io.v.nutz.welfare.mode.WelfareSignMode
*/
@Column
@Comment("签收形式")
@ColDefine(type = ColType.INT, width = 1)
private Integer signMode;
/**
* @see io.v.nutz.welfare.mode.WelfareNoticePushMode
*/
@Column
@Comment("通知推送形式")
@ColDefine(type = ColType.INT, width = 1)
private Integer noticePushMode;
@Column
@Comment("是否弹性福利")
@ColDefine(type = ColType.BOOLEAN)
private Boolean flexible;
@Column
@Comment("是否常规")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isRoutine;
@Column
@Comment("是否弹性福利")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String isCheckBox;
@Column
@Comment("多选几个")
@ColDefine(type = ColType.INT)
private Integer multiSelectNum;
@Column
@Comment("主福利礼品")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String gift;
@Column
@Comment("弹性礼品")
@ColDefine(type = ColType.MYSQL_JSON)
private List<Gift> flexibleGifts;
/**
* 弹性礼品
*/
@Data
@Accessors(chain = true)
public static class Gift {
/**
* 礼品名称
*/
private String name;
/**
* 是否默认
*/
private Boolean isDefault;
}
@Column
@Comment("条件")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String conditionStructureId;
@One(field = "conditionStructureId")
private MatchConditionStructure conditionStructure;
@Many(field = "projectId")
private List<WelfareProjectSubject> welfareProjectSubjects;
@Column
@Comment("题目ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String subjectId;
@Column
@Comment("封面")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String cover;
}
@@ -0,0 +1,46 @@
package io.v.nutz.welfare.model;
import io.v.nutz.modules.models.ViBaseModel;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.List;
/**
* @author zxy
* @Description 福利项目题目
* @createTime 2022年01月12日 16:58:00
*/
@Data
@Accessors(chain = true)
@Table("welfare_project_subject")
public class WelfareProjectSubject extends ViBaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("所属福利")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String projectId;
@Column
@Comment("题目名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String subjectName;
@Column
@Comment("题目类型")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String subjectType;
@Many(field = "subjectId")
private List<WelfareProjectSubjectOption> options;
}
@@ -0,0 +1,68 @@
package io.v.nutz.welfare.model;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @author zxy
* @Description TODO
* @createTime 2022年01月12日 17:03:00
*/
@Data
@Accessors(chain = true)
@Table("welfare_project_subject_option")
public class WelfareProjectSubjectOption {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("所属题目")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String subjectId;
@Column
@Comment("选项类型")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String optionType;
@Column
@Comment("选项名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String optionName;
@Column
@Comment("选项名称Id")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String optionNameId;
@Column
@Comment("选项排序")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String optionSort;
@Column
@Comment("没选系统自动选")
@ColDefine(type = ColType.BOOLEAN)
private boolean isDefaultOption;
@Column
@Comment("默认选项")
@ColDefine(type = ColType.BOOLEAN)
private boolean isSystemDefault;
@Column
@Comment("图片地址")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String imgUrl;
@Column
@Comment("说明描述")
@ColDefine(type = ColType.TEXT)
private String description;
}
@@ -0,0 +1,72 @@
package io.v.nutz.welfare.model;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
/**
* @author zxy
* @Description TODO
* @createTime 2022年01月12日 17:07:00
*/
@Data
@Accessors(chain = true)
@Table("welfare_project_user_selection")
public class WelfareUserSelection {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("所属福利")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String welfareId;
@Column
@Comment("所属题目")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String subjectId;
@Column
@Comment("选择项")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String selectOptionId;
@Column
@Comment("选择用户")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String selectUserId;
@Column
@Comment("选择时间")
@ColDefine(type = ColType.DATETIME)
private Date selectTime;
@Column
@Comment("收货地址")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String receiveAddress;
@Column
@Comment("用户签字")
@ColDefine(type = ColType.TEXT)
private String userSign;
@Column
@Comment("快递单号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String courierNumber;
@Column
@Comment("是否签收")
@ColDefine(type = ColType.BOOLEAN)
private boolean isReceive;
}
@@ -0,0 +1,73 @@
package io.v.nutz.welfare.model;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* 礼品券
*
* @author: 1V
* @date: 2021/3/15
* @since 1.0
*/
@Table("welfare_voucher")
@Data
@Accessors(chain = true)
public class WelfareVoucher {
@Name
@Column
@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 projectId;
@Column
@Comment("用户ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("礼品发放员")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String issuedBy;
@Column
@Comment("领券时间")
private Long grantTime;
@Column
@Comment("使用时间")
private Long useTime;
/**
* @see io.v.nutz.welfare.mode.WelfareVoucherOrigin
*/
@Column
@Comment("来源")
private Integer origin;
/**
* @see io.v.nutz.welfare.mode.WelfareVoucherStatus
*/
@Column
@Comment("状态")
private Integer status;
@Column
@Comment("赠予人id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String donateUserId;
/**
* 采用乐观锁
*/
@Column(value = "version")
private int version;
}
@@ -0,0 +1,26 @@
package io.v.nutz.welfare.model.template;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
/**
* 福利会员导入模板
*
* @author: 1V
* @date: 2021/2/24
* @since 1.0
*/
@Data
public class WelfareMemberTemp {
@Excel(name = "工号")
private String loginName;
@Excel(name = "姓名")
private String userName;
@Excel(name = "福利发放单位")
private String welfareUnitName;
@Excel(name = "福利缴费类型")
private String welfarePayType;
}
@@ -0,0 +1,20 @@
package io.v.nutz.welfare.model.view;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 福利单位视图
*
* @author: 1V
* @date: 2021/2/24
* @since 1.0
*/
@Data
@Accessors(chain = true)
public class WelfareUnit {
private String welfareUnitId;
private String welfareUnitName;
private String welfareUnitCode;
private String welfareUnitMode;
}
@@ -0,0 +1,30 @@
package io.v.nutz.welfare.service;
import io.v.nutz.service.ViService;
import io.v.nutz.welfare.model.WelfareList;
import java.util.List;
/**
* Todo
*
* @author: 1V
* @date: 2021/1/25
* @since 1.0
*/
public interface WelfareListService extends ViService<WelfareList> {
/**
* 生成名单
*
* @param projectId
*/
void createList(String projectId);
/**
* 加入福利名单
*
* @param projectId
* @param userIds
*/
void joinWelfareList(String projectId, List<String> userIds);
}
@@ -0,0 +1,31 @@
package io.v.nutz.welfare.service;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.service.ViService;
import org.nutz.lang.util.NutMap;
/**
* 发放名单汇总
*/
public interface WelfareListSummaryService extends ViService {
/**
* 部门工会/福利单位,集中发放
*
* @param pageForm
* @param projectId
* @return
*/
NutMap togetherPageData(PageForm pageForm, String projectId);
/**
* 个人
*
* @param pageForm
* @param projectId
* @param unionId
* @return
*/
NutMap singlePageData(PageForm pageForm, String projectId, String unionId);
}
@@ -0,0 +1,14 @@
package io.v.nutz.welfare.service;
import io.v.nutz.service.ViService;
import io.v.nutz.welfare.model.WelfareMemberRecord;
/**
* Todo
*
* @author: 1V
* @date: 2021/1/25
* @since 1.0
*/
public interface WelfareMemberRecordService extends ViService<WelfareMemberRecord> {
}
@@ -0,0 +1,15 @@
package io.v.nutz.welfare.service;
import io.v.nutz.service.ViService;
import io.v.nutz.sys.models.Sys_user;
/**
* Todo
*
* @author: 1V
* @date: 2021/1/25
* @since 1.0
*/
public interface WelfareMemberService extends ViService<Sys_user> {
}
@@ -0,0 +1,23 @@
package io.v.nutz.welfare.service;
import io.v.nutz.service.ViService;
import io.v.nutz.welfare.model.WelfareProject;
/**
* Todo
*
* @author: 1V
* @date: 2021/1/25
* @since 1.0
*/
public interface WelfareProjectService extends ViService<WelfareProject> {
/**
* 获取项目的信息
*
* @param projectId
* @return
*/
WelfareProject projectInfo(String projectId);
}
@@ -0,0 +1,82 @@
package io.v.nutz.welfare.service;
import io.v.nutz.service.ViService;
import io.v.nutz.welfare.model.WelfareProject;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @author zxy
* @Description 意向选择 邮寄到家类的统计
* @createTime 2022年01月25日 13:58:00
*/
public interface WelfareSingleService extends ViService<WelfareProject> {
/**
* 某年的福利信息 (弹性)
*
* @param year
* @return
*/
List<NutMap> welfareProjectList(Integer year);
/**
* 部门工会信息
*
* @param unionId 部门工会id
* @param projectId 福利id
* @return 每个部门工会信息 及 该福利项目下部门工会的福利会员人数
*/
List<NutMap> getUnionData(String unionId, String projectId);
/**
* 获取某个福利下的题目 这个福利必然是弹性福利
*
* @return
*/
List<NutMap> getOptionByProjectId(String projectId);
/**
* 某个福利下以后选择的数据
*
* @param projectId
* @return
*/
List<NutMap> getUserSelectionByProjectId(String projectId);
/**
* 分页查询
*
* @param projectId 福利id
* @return
*/
NutMap pageData(String projectId, String welfareUnitCode);
/**
* 领取详情
*
* @param projectId 福利id
* @return
*/
List<NutMap> receivePageData(String projectId, String welfareUnitCode);
/**
* 导出发放详细表
*
* @param projectId
* @return
*/
List<NutMap> receivePageDataColumns(String projectId);
/**
* 未领取人员信息
*
* @param projectId
* @param welfareUnitCode
* @return
*/
List<NutMap> unclaimedData(String projectId, String welfareUnitCode);
}
@@ -0,0 +1,76 @@
package io.v.nutz.welfare.service;
import io.v.nutz.service.ViService;
import io.v.nutz.welfare.mode.voucher.WelfareVoucherDonateReceiveResult;
import io.v.nutz.welfare.model.WelfareVoucher;
import java.util.List;
import java.util.Map;
/**
* Todo
*
* @author: 1V
* @date: 2021/1/25
* @since 1.0
*/
public interface WelfareVoucherService extends ViService<WelfareVoucher> {
/**
* 发放礼品
*
* @param voucherId 券id
* @param userid 发放人id
* @return 持券人信息
*/
Map<String, Object> grantGift(String voucherId, String userid);
/**
* 获取礼品券详细信息
*
* @param voucherId 券id
* @return 礼品券详细信息
*/
Map<String, Object> voucherInfo(String voucherId);
/**
* 转赠领取
*
* @param voucherId 券id
* @param userid 被转赠人id
* @return 领取结果
*/
WelfareVoucherDonateReceiveResult donateReceive(String voucherId, String userid);
/**
* 获取礼品券详细信息
*
* @param voucherId 券id
* @return 礼品券详细信息
*/
Map<String, Object> donateVoucherInfo(String voucherId);
/**
* 将礼品券的状态改为已赠但是未领
*
* @param voucherId 券id
*/
void voucherDonating(String voucherId);
/**
* 领取礼品券
*
* @param projectId 项目
* @param userid 用户
* @return
*/
WelfareVoucher grantVoucher(String projectId, String userid);
/**
* 该用户待领取的礼品券
*
* @param userid
* @return
*/
List unclaimedVoucher(String userid);
}
@@ -0,0 +1,127 @@
package io.v.nutz.welfare.service.impl;
import io.v.nutz.base.utils.DateUtil;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.service.impl.ViServiceImpl;
import io.v.nutz.welfare.mode.WelfareUnitMode;
import io.v.nutz.welfare.model.*;
import io.v.nutz.welfare.service.WelfareListService;
import io.v.nutz.welfare.service.WelfareProjectService;
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.util.NutMap;
import org.nutz.plugins.wkcache.annotation.CacheDefaults;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author 1V
*/
@IocBean(args = {"refer:dao"})
@CacheDefaults(cacheName = "welfare_list")
public class WelfareListServiceImpl extends ViServiceImpl<WelfareList> implements WelfareListService {
public WelfareListServiceImpl(Dao dao) {
super(dao);
}
@Inject
private WelfareProjectService projectService;
@Override
@Aop(TransAop.READ_COMMITTED)
public void createList(String projectId) {
clear(Cnd.where("projectId", "=", projectId));
WelfareProject project = projectService.projectInfo(projectId);
CndPlus cnd = CndPlus.create();
if (project.getConditionStructure() != null) {
project.getConditionStructure().join(cnd);
}
Sql sql = Sqls.create("SELECT * from `welfare_member` $condition");
sql.setCondition(cnd);
joinWelfareList(listMap(sql), projectId);
addflUser(projectId);
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void joinWelfareList(String projectId, List<String> userIds) {
Sql sql = Sqls.create("SELECT * from `user` $condition");
CndPlus cnd = CndPlus.create();
cnd.and("id", "in", userIds);
sql.setCondition(cnd);
joinWelfareList(listMap(sql), projectId);
}
private void joinWelfareList(List<NutMap> users, String projectId) {
String field = WelfareUnitMode.getMode().getField();
List<WelfareList> lists = new ArrayList<>();
for (NutMap user : users) {
WelfareList list = new WelfareList();
list.setProjectId(projectId);
list.setUserId(user.getString("id"));
list.setWelfareUnitId(user.getString(field));
lists.add(list);
}
dao().insert(lists);
}
private void addflUser(String id) {
dao().clear(WelfareUserSelection.class, Cnd.where("welfareId", "=", id));
WelfareProject project = projectService.fetchLinks(projectService.fetch(Cnd.where("year", "=", DateUtil.getYear()).asc("createdAt")), "welfareProjectSubjects");
if (!project.getIsRoutine()) {
//首先找出今年最新一条的福利选项
List<WelfareProjectSubject> welfareProjectSubjects = project.getWelfareProjectSubjects();
List<WelfareProjectSubjectOption> options = projectService.dao().query(WelfareProjectSubjectOption.class, Cnd.where("subjectId", "=", welfareProjectSubjects.get(0).getId()));
//过滤出福利卡
List<WelfareProjectSubjectOption> subjectOptions = options.stream().filter(vi -> vi.getOptionType().equals("福利卡")).collect(Collectors.toList());
List<String> ids = subjectOptions.stream().map(vi -> vi.getId()).collect(Collectors.toList());
//找出原来选福利卡的人
List<WelfareUserSelection> userSelections = projectService.dao().query(WelfareUserSelection.class, Cnd.where("selectOptionId", "in", ids));
List<WelfareUserSelection> users = new ArrayList<>();
//新的福利选项
WelfareProjectSubject subject = projectService.dao().fetch(WelfareProjectSubject.class, Cnd.where("projectId", "=", id));
userSelections.forEach(v -> {
//原来的福利
WelfareProjectSubjectOption yld = projectService.dao().fetch(WelfareProjectSubjectOption.class, v.getSelectOptionId());
//新的
WelfareProjectSubjectOption subjectOption = projectService.dao().fetch(WelfareProjectSubjectOption.class,
Cnd.where("subjectId", "=", subject.getId())
.and("optionNameId", "=", yld.getOptionNameId()));
WelfareUserSelection userSelection = new WelfareUserSelection();
userSelection.setWelfareId(id);
userSelection.setSubjectId(subject.getId());
userSelection.setSelectOptionId(subjectOption.getId());
userSelection.setSelectUserId(v.getSelectUserId());
userSelection.setSelectTime(new Date());
users.add(userSelection);
});
projectService.insert(users);
}
}
}
@@ -0,0 +1,122 @@
package io.v.nutz.welfare.service.impl;
import cn.hutool.core.collection.CollUtil;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.modules.models.PageForm;
import io.v.nutz.service.impl.ViServiceImpl;
import io.v.nutz.sys.models.Sys_dict;
import io.v.nutz.welfare.mode.WelfareUnitMode;
import io.v.nutz.welfare.service.WelfareListSummaryService;
import io.v.nutz.welfare.service.WelfareSingleService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@IocBean(args = {"refer:dao"})
public class WelfareListSummaryServiceImpl extends ViServiceImpl implements WelfareListSummaryService {
@Inject
private WelfareSingleService welfareSingleService;
public WelfareListSummaryServiceImpl(Dao dao) {
super(dao);
}
@Override
public NutMap togetherPageData(PageForm pageForm, String projectId) {
//获取所有人员类型
Sys_dict dict = dao().fetch(Sys_dict.class, Cnd.where("code", "=", "UserType"));
List<Sys_dict> userTypeDictList = dict == null ? new ArrayList<>() : dao().query(Sys_dict.class, Cnd.where("parentId", "=", Strings.sNull(dict.getId())).and("disabled", "=", false).asc("location"));
List<String> userTypeList = userTypeDictList.stream().map(Sys_dict::getCode).collect(Collectors.toList());
List<NutMap> labelList = userTypeDictList.stream().map(v -> NutMap.NEW().addv("prop", v.getCode()).addv("label", v.getName())).collect(Collectors.toList());
Sql sql = Sqls.create("""
SELECT
unit.*,
sum( 1 ) number,
$temp_sql
FROM
welfare_unit unit
LEFT JOIN welfare_list list ON unit.welfareUnitId = list.welfareUnitId
LEFT JOIN `user` su ON su.id = list.userId
$condition
""");
StringBuffer temp_sql_str = new StringBuffer();
userTypeList.forEach(v -> {
temp_sql_str.append("COUNT( CASE WHEN ( su.personType = '%s' ) THEN 1 ELSE NULL END ) AS '%s',".formatted(v, v));
});
String totalUserType = CollUtil.join(userTypeList, ",", "'", "'");
temp_sql_str.append("COUNT( CASE WHEN ( su.personType in (%s) ) THEN 1 ELSE NULL END ) AS totalNum".formatted(totalUserType));
sql.setVar("temp_sql", temp_sql_str);
CndPlus cnd = CndPlus.create();
cnd.and("unit.welfareUnitMode", "=", WelfareUnitMode.getMode().name());
pageForm.defaultSortAsc("unit.welfareUnitCode");
cnd.and(pageForm);
cnd.and("list.projectId", "=", projectId);
cnd.groupBy("unit.welfareUnitId");
sql.setCondition(cnd);
labelList.add(NutMap.NEW().addv("prop", "totalNum").addv("label", "合计"));
return NutMap.WRAP(Map.of("tableList", listMap(sql), "tableColumn", labelList));
}
@Override
public NutMap singlePageData(PageForm pageForm, String projectId, String unionId) {
Sql welfareUnitSql = Sqls.create("""
SELECT
unit.*,
( SELECT count( 1 ) FROM view_welfare_list WHERE unioncode = unit.welfareUnitCode AND projectId = @projectId ) AS teacherSum\s
FROM
welfare_unit unit
$condition
""");
CndPlus cnd = CndPlus.create();
cnd.and("unit.welfareUnitMode", "=", WelfareUnitMode.getMode().name());
pageForm.defaultSortAsc("unit.welfareUnitCode");
cnd.and(pageForm);
cnd.groupBy("unit.welfareUnitId");
welfareUnitSql.setCondition(cnd);
welfareUnitSql.setParam("projectId", projectId);
List<NutMap> welfareUnitList = listMap(welfareUnitSql);
//选项数据
List<NutMap> optionList = welfareSingleService.getOptionByProjectId(projectId);
//选择数据
List<NutMap> userSelectionList = welfareSingleService.getUserSelectionByProjectId(projectId);
for (NutMap wUnit : welfareUnitList) {
//该部门工会选择数据
List<NutMap> thisUnionSelectionList = userSelectionList.stream().filter(x -> x.getString("unionCode").equals(wUnit.getString("welfareUnitCode")) && x.getString("welfareId").equals(projectId)).collect(Collectors.toList());
optionList.forEach(o -> {
//每一项选择的人数
long count = thisUnionSelectionList.stream().filter(z -> z.getString("selectOptionId").equals(o.getString("id"))).count();
wUnit.put(o.getString("optionName"), count);
});
//已选人数
wUnit.put("totalCount", thisUnionSelectionList.size());
//未选人数
wUnit.put("unselectedTeacherSum", wUnit.getInt("teacherSum") - wUnit.getInt("totalCount"));
}
//表格列数据
List<NutMap> labelList = new ArrayList<>();
labelList.add(NutMap.NEW().addv("label", "本次福利会员人数").addv("prop", "teacherSum"));
optionList.forEach(v -> {
labelList.add(NutMap.NEW().addv("label", v.getString("optionName")).addv("prop", v.getString("optionName")));
});
labelList.add(NutMap.NEW().addv("label", "参加人数").addv("prop", "totalCount"));
labelList.add(NutMap.NEW().addv("label", "未选人数").addv("prop", "unselectedTeacherSum"));
return NutMap.NEW().addv("tableList", welfareUnitList).addv("tableColumn", labelList);
}
}
@@ -0,0 +1,20 @@
package io.v.nutz.welfare.service.impl;
import io.v.nutz.service.impl.ViServiceImpl;
import io.v.nutz.welfare.model.WelfareMemberRecord;
import io.v.nutz.welfare.service.WelfareMemberRecordService;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.plugins.wkcache.annotation.CacheDefaults;
/**
* @author 1V
*/
@IocBean(args = {"refer:dao"})
@CacheDefaults(cacheName = "member")
public class WelfareMemberRecordServiceImpl extends ViServiceImpl<WelfareMemberRecord> implements WelfareMemberRecordService {
public WelfareMemberRecordServiceImpl(Dao dao) {
super(dao);
}
}
@@ -0,0 +1,20 @@
package io.v.nutz.welfare.service.impl;
import io.v.nutz.service.impl.ViServiceImpl;
import io.v.nutz.sys.models.Sys_user;
import io.v.nutz.welfare.service.WelfareMemberService;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.plugins.wkcache.annotation.CacheDefaults;
/**
* @author 1V
*/
@IocBean(args = {"refer:dao"})
@CacheDefaults(cacheName = "welfare_member")
public class WelfareMemberServiceImpl extends ViServiceImpl<Sys_user> implements WelfareMemberService {
public WelfareMemberServiceImpl(Dao dao) {
super(dao);
}
}
@@ -0,0 +1,68 @@
package io.v.nutz.welfare.service.impl;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.data.model.MatchConditionStructure;
import io.v.nutz.service.impl.ViServiceImpl;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.welfare.model.WelfareProject;
import io.v.nutz.welfare.model.WelfareProjectSubject;
import io.v.nutz.welfare.service.WelfareProjectService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.plugins.wkcache.annotation.CacheDefaults;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author 1V
*/
@IocBean(args = {"refer:dao"})
@CacheDefaults(cacheName = "welfare_project")
public class WelfareProjectServiceImpl extends ViServiceImpl<WelfareProject> implements WelfareProjectService {
public WelfareProjectServiceImpl(Dao dao) {
super(dao);
}
@Inject
private BaseService baseService;
@Override
public WelfareProject projectInfo(String projectId) {
// WelfareProject project = fetchLinks(projectId);
WelfareProject project = fetchLinks(dao().fetch(WelfareProject.class, Cnd.where("id", "=", projectId)), "welfareProjectSubjects");
List<WelfareProjectSubject> welfareProjectSubjects = project.getWelfareProjectSubjects();
Sql sqlo = Sqls.create("""
SELECT
optionName
FROM
welfare_project_subject_option
WHERE
id IN ( SELECT selectOptionId FROM welfare_project_user_selection WHERE selectUserId = @userid AND welfareId = @welfareId )
ORDER BY
optionSort ASC
""");
sqlo.setParam("userid", ShiroUtil.getPrincipalProperty("id"));
sqlo.setParam("welfareId", project.getId());
List<NutMap> optionNameList = baseService.listMap(sqlo);
if (Lang.isNotEmpty(optionNameList)) {
project.setGift(optionNameList.stream().map(x -> x.getString("optionName")).collect(Collectors.joining("、")));
}
if (Lang.isNotEmpty(welfareProjectSubjects)) {
fetchLinks(welfareProjectSubjects, "options", Cnd.NEW().asc("optionSort"));
}
if (Strings.isNotBlank(project.getConditionStructureId())) {
MatchConditionStructure conditionStructure = fetchLinks(dao().fetch(MatchConditionStructure.class, project.getConditionStructureId()), "conditions");
project.setConditionStructure(conditionStructure);
}
return project;
}
}
@@ -0,0 +1,362 @@
package io.v.nutz.welfare.service.impl;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.dao.CndPlus;
import io.v.nutz.service.impl.ViServiceImpl;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.welfare.mode.WelfareProvideMode;
import io.v.nutz.welfare.mode.WelfareUnitMode;
import io.v.nutz.welfare.model.WelfareProject;
import io.v.nutz.welfare.service.WelfareSingleService;
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.Strings;
import org.nutz.lang.util.NutMap;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description 意向选择 邮寄到家类的统计
* @createTime 2022年01月25日 13:58:00
*/
@IocBean(args = {"refer:dao"})
public class WelfareSingleServiceImpl extends ViServiceImpl<WelfareProject> implements WelfareSingleService {
public WelfareSingleServiceImpl(Dao dao) {
super(dao);
}
/**
* 某年的福利信息 (弹性)
*
* @param year
* @return
*/
@Override
public List<NutMap> welfareProjectList(Integer year) {
Sql sql = Sqls.create("""
SELECT
id,
`year`,
`name`,
provideMode
FROM
welfare_project
$condition
""");
Cnd cnd = Cnd.where("flexible", "=", 1);
cnd.andEX("year", "=", year);
sql.setCondition(cnd);
return listMap(sql);
}
/**
* 部门工会信息
*
* @param unionId 部门工会id
* @param projectId 福利id
* @return 每个部门工会信息 及 该福利项目下部门工会的福利会员人数
*/
@Override
public List<NutMap> getUnionData(String unionId, String projectId) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
un.id unionId,
un.unionName,
( SELECT count( 1 ) FROM view_welfare_list WHERE unionid = un.id AND projectId = @projectId ) AS teacherSum
FROM
sys_union un
$condition
""");
if (!ShiroUtil.hasAnyRoles("sysadmin,A06")) {
if (ShiroUtil.hasAnyRoles("H04")) {
cnd.and("un.id", "=", Vi.getUnionId());
}
}
sql.setParam("projectId", projectId);
if (StrUtil.isNotBlank(unionId)) {
cnd.and("un.id", "=", unionId);
}
sql.setCondition(cnd);
return listMap(sql);
}
/**
* 获取某个福利下的题目 这个福利必然是弹性福利
*
* @return
*/
@Override
public List<NutMap> getOptionByProjectId(String projectId) {
Sql sql = Sqls.create("""
SELECT
wpso.id,
wpso.optionName
FROM
welfare_project_subject_option wpso
LEFT JOIN welfare_project_subject wps ON wps.id = wpso.subjectId
WHERE
wps.projectId = @projectId
""");
sql.setParam("projectId", projectId);
return listMap(sql);
}
/**
* 某个福利下以后选择的数据
*
* @param projectId
* @return
*/
@Override
public List<NutMap> getUserSelectionByProjectId(String projectId) {
Sql sql = Sqls.create("""
SELECT
wpus.selectOptionId,
wpus.selectTime,
wpus.userSign,
wpus.receiveAddress,
wpus.welfareId,
u.unionid AS unionId,
u.unioncode AS unionCode,
u.unitcode AS unitCode
FROM
`welfare_project_user_selection` wpus
LEFT JOIN `user` u ON u.id = wpus.selectUserId
where u.unionid is not null
AND wpus.welfareId=@projectId
GROUP BY wpus.selectUserId
""").setParam("projectId", projectId);
return listMap(sql);
}
/**
* 分页查询
*
* @param projectId 福利id
* @return
*/
@Override
public NutMap pageData(String projectId, String welfareUnitCode) {
// //部门工会数据
// List<NutMap> unionData = getUnionData(unionId, projectId);
// //选项数据
// List<NutMap> optionList = getOptionByProjectId(projectId);
// //选择数据
// List<NutMap> userSelectionList = getUserSelectionByProjectId(projectId);
// unionData.forEach(v -> {
// //该部门工会选择数据
// List<NutMap> thisUnionSelectionList = userSelectionList.stream().filter(x -> x.getString("unionId").equals(v.getString("unionId")) && x.getString("welfareId").equals(projectId)).collect(Collectors.toList());
// optionList.forEach(o -> {
// //每一项选择的人数
// long count = thisUnionSelectionList.stream().filter(z -> z.getString("selectOptionId").equals(o.getString("id"))).count();
// v.put(o.getString("optionName"), count);
// });
// //已选人数
// v.put("totalCount", thisUnionSelectionList.size());
// //未选人数
// v.put("unselectedTeacherSum", v.getInt("teacherSum") - v.getInt("totalCount"));
// });
//
// //表格列数据
// List<NutMap> labelList = new ArrayList<>();
// labelList.add(NutMap.NEW().addv("label", "基层工会名称").addv("prop", "unionName"));
// labelList.add(NutMap.NEW().addv("label", "基层工会名称").addv("prop", "welfareUnitName"));
// labelList.add(NutMap.NEW().addv("label", "本次福利会员人数").addv("prop", "teacherSum"));
// optionList.forEach(v -> {
// labelList.add(NutMap.NEW().addv("label", v.getString("optionName")).addv("prop", v.getString("optionName")));
// });
// labelList.add(NutMap.NEW().addv("label", "参加人数").addv("prop", "totalCount"));
// labelList.add(NutMap.NEW().addv("label", "未选人数").addv("prop", "unselectedTeacherSum"));
//
//
// return NutMap.NEW().addv("tableList", unionData).addv("tableColumn", labelList);
Sql welfareUnitSql = Sqls.create("""
SELECT
unit.*,
( SELECT count( 1 ) FROM view_welfare_list WHERE unioncode = unit.welfareUnitCode AND projectId = @projectId ) AS teacherSum\s
FROM
welfare_unit unit
$condition
""");
CndPlus cnd = CndPlus.create();
cnd.and("unit.welfareUnitMode", "=", WelfareUnitMode.getMode().name());
cnd.asc("unit.welfareUnitCode");
cnd.andEX("unit.welfareUnitCode", "=", welfareUnitCode);
cnd.groupBy("unit.welfareUnitId");
welfareUnitSql.setCondition(cnd);
welfareUnitSql.setParam("projectId", projectId);
List<NutMap> welfareUnitList = listMap(welfareUnitSql);
//选项数据
List<NutMap> optionList = this.getOptionByProjectId(projectId);
//选择数据
List<NutMap> userSelectionList = this.getUserSelectionByProjectId(projectId);
for (NutMap wUnit : welfareUnitList) {
//该部门工会选择数据
List<NutMap> thisUnionSelectionList = userSelectionList.stream().filter(x -> x.getString("unionCode").equals(wUnit.getString("welfareUnitCode")) && x.getString("welfareId").equals(projectId)).collect(Collectors.toList());
optionList.forEach(o -> {
//每一项选择的人数
Sql optionCountSql = Sqls.create("""
SELECT
COUNT(*)
FROM
`welfare_project_user_selection` wpus
LEFT JOIN `user` u ON u.id = wpus.selectUserId
WHERE
u.unionCode = @unionCode
AND wpus.welfareId = @welfareId
AND wpus.selectOptionId = @selectOptionId
""")
.setParam("unionCode", wUnit.getString("welfareUnitCode"))
.setParam("welfareId", projectId)
.setParam("selectOptionId", o.getString("id"));
int count = count(optionCountSql);
// long count = thisUnionSelectionList.stream().filter(z -> z.getString("selectOptionId").equals(o.getString("id"))).count();
wUnit.put(o.getString("optionName"), count);
});
//已选人数
wUnit.put("totalCount", thisUnionSelectionList.size());
//未选人数
wUnit.put("unselectedTeacherSum", wUnit.getInt("teacherSum") - wUnit.getInt("totalCount"));
}
//表格列数据
List<NutMap> labelList = new ArrayList<>();
labelList.add(NutMap.NEW().addv("label", "本次福利会员人数").addv("prop", "teacherSum"));
optionList.forEach(v -> {
labelList.add(NutMap.NEW().addv("label", v.getString("optionName")).addv("prop", v.getString("optionName")));
});
labelList.add(NutMap.NEW().addv("label", "参加人数").addv("prop", "totalCount"));
labelList.add(NutMap.NEW().addv("label", "未选人数").addv("prop", "unselectedTeacherSum"));
return NutMap.NEW().addv("tableList", welfareUnitList).addv("tableColumn", labelList);
}
/**
* 领取详情
*
* @param projectId 福利id
* @return
*/
@Override
public List<NutMap> receivePageData(String projectId, String welfareUnitCode) {
Sql sql = Sqls.create("""
SELECT
u.loginname AS loginName,
u.username AS userName,
u.unitname AS unitName,
u.unionname AS unionName,
u.mobile,
wpus.receiveAddress,
(
SELECT
GROUP_CONCAT( wpso.optionName )
FROM
welfare_project_user_selection wpus
LEFT JOIN welfare_project_subject_option wpso ON wpso.id = wpus.selectOptionId
WHERE
wpus.welfareId = @welfareId
AND wpus.selectUserId = u.id
) optionName,
wpus.courierNumber
FROM
welfare_project_user_selection wpus
LEFT JOIN `user` u ON u.id = wpus.selectUserId
LEFT JOIN welfare_project_subject_option wpso ON wpso.id = wpus.selectOptionId
$condition
""").setParam("welfareId", projectId);
Cnd cnd = Cnd.NEW();
cnd.groupBy("u.loginname ");
switch (WelfareUnitMode.getMode().name()) {
case "UNION" -> {
cnd.andEX("u.unioncode", "=", welfareUnitCode);
cnd.asc("u.unioncode");
}
case "UNIT" -> {
cnd.andEX("u.unitcode", "=", welfareUnitCode);
cnd.asc("u.unitcode");
}
}
cnd.and("wpus.welfareId", "=", projectId);
sql.setCondition(cnd);
return listMap(sql);
}
/**
* 导出发放详细表
*
* @param projectId
* @return
*/
@Override
public List<NutMap> receivePageDataColumns(String projectId) {
List<NutMap> labelList = new ArrayList<>();
labelList.add(NutMap.NEW().addv("label", "工号").addv("prop", "loginName"));
labelList.add(NutMap.NEW().addv("label", "姓名").addv("prop", "userName"));
labelList.add(NutMap.NEW().addv("label", "单位").addv("prop", "unitName"));
labelList.add(NutMap.NEW().addv("label", "工会").addv("prop", "unionName"));
labelList.add(NutMap.NEW().addv("label", "所选福利").addv("prop", "optionName"));
WelfareProject project = dao().fetch(WelfareProject.class, Cnd.where("id", "=", projectId));
if (project.getProvideMode().equals(WelfareProvideMode.PERSONAL.getCode())) {
labelList.add(NutMap.NEW().addv("label", "收货信息").addv("prop", "receiveAddress").addv("width", 50));
labelList.add(NutMap.NEW().addv("label", "快递单号").addv("prop", "courierNumber").addv("width", 50));
}
return labelList;
}
/**
* 未领取人员信息
*
* @param projectId
* @param welfareUnitCode
* @return
*/
@Override
public List<NutMap> unclaimedData(String projectId, String welfareUnitCode) {
Sql sql = Sqls.create("""
SELECT
loginname loginName,
username userName,
unitname unitName,
unionname unionName,
mobile
FROM
view_welfare_list
WHERE
projectId = @projectId
AND id NOT IN
(
SELECT selectUserId FROM welfare_project_user_selection WHERE welfareId = @projectId AND selectUserId IS NOT NULL
)
$modeCnd
""");
if (Strings.isNotBlank(welfareUnitCode)) {
if ("UNION".equals(WelfareUnitMode.getMode().name())) {
sql.setVar("modeCnd", "AND unioncode = '%s'".formatted(welfareUnitCode));
} else if ("UNIT".equals(WelfareUnitMode.getMode().name())) {
sql.setVar("modeCnd", "AND unitcode = '%s'".formatted(welfareUnitCode));
}
}
// sql.setParam("unionId", welfareUnitCode);
sql.setParam("projectId", projectId);
return listMap(sql);
}
}
@@ -0,0 +1,265 @@
package io.v.nutz.welfare.service.impl;
import io.v.nutz.service.impl.ViServiceImpl;
import io.v.nutz.welfare.mode.WelfareProvideMode;
import io.v.nutz.welfare.mode.WelfareSignMode;
import io.v.nutz.welfare.mode.WelfareVoucherOrigin;
import io.v.nutz.welfare.mode.WelfareVoucherStatus;
import io.v.nutz.welfare.mode.voucher.WelfareGiftGrantResult;
import io.v.nutz.welfare.mode.voucher.WelfareVoucherDonateReceiveResult;
import io.v.nutz.welfare.model.WelfareProject;
import io.v.nutz.welfare.model.WelfareVoucher;
import io.v.nutz.welfare.service.WelfareProjectService;
import io.v.nutz.welfare.service.WelfareVoucherService;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.plugins.wkcache.annotation.CacheDefaults;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author 1V
*/
@IocBean(args = {"refer:dao"})
@CacheDefaults(cacheName = "welfare_voucher")
public class WelfareVoucherServiceImpl extends ViServiceImpl<WelfareVoucher> implements WelfareVoucherService {
public WelfareVoucherServiceImpl(Dao dao) {
super(dao);
}
@Inject
private WelfareProjectService projectService;
@Override
@Aop(TransAop.READ_COMMITTED)
public Map<String, Object> grantGift(String voucherId, String userid) {
WelfareVoucher voucher = fetch(voucherId);
if (voucher == null) {
return Map.of("result", WelfareGiftGrantResult.NotFound.map());
}
WelfareProject project = projectService.fetch(voucher.getProjectId());
Date now = new Date();
if (!(project.getProvideTimeStart().compareTo(now) < 0 && project.getProvideTimeEnd().compareTo(now) > 0)) {
return Map.of("result", WelfareGiftGrantResult.TIMEOUT.map());
}
Chain chain = Chain.make("status", WelfareVoucherStatus.USED.getCode())
.add("useTime", System.currentTimeMillis())
.add("issuedBy", userid);
boolean success = update(chain, Cnd.where("id", "=", voucherId).and("status", "=", WelfareVoucherStatus.NORMAL.getCode())) > 0;
if (success) {
Sql sql = Sqls.create("""
SELECT
`user`.username,
`user`.loginname,
`user`.unitname,
`user`.unionname
FROM
welfare_voucher voucher
LEFT JOIN `user` ON voucher.userId = `user`.id
WHERE
voucher.id = @id
""").setParam("id", voucherId);
return Map.of("user", fetch(sql), "result", WelfareGiftGrantResult.SUCCESS.map());
}
return Map.of("result", WelfareGiftGrantResult.GRANTED.map());
}
@Override
public Map<String, Object> voucherInfo(String voucherId) {
Sql sql = Sqls.create("""
SELECT
voucher.id,
voucher.`status`,
project.`id` projectId,
project.`name`,
project.festival,
project.provideAddress,
project.gift,
project.flexibleGifts,
project.provideTimeStart,
project.provideTimeEnd,
`user`.username,
`user`.loginname,
`user`.unitname,
`user`.unionname
FROM
welfare_voucher voucher
LEFT JOIN welfare_project project ON voucher.projectId = project.id
LEFT JOIN `user` ON voucher.userId = `user`.id
WHERE
voucher.id = @id
""").setParam("id", voucherId);
NutMap result = fetch(sql);
result.setv("canget", result.getInt("status") == WelfareVoucherStatus.NORMAL.getCode());
return result;
}
@Override
@Aop(TransAop.READ_COMMITTED)
public WelfareVoucherDonateReceiveResult donateReceive(String voucherId, String userid) {
WelfareVoucher voucher = fetch(voucherId);
WelfareVoucherDonateReceiveResult receiveResult = donateReceiveResult(voucher);
if (receiveResult != null) {
return receiveResult;
}
int update = update(Chain.make("status", WelfareVoucherStatus.DONATE.getCode()),
Cnd.where("id", "=", voucherId).and("status", "=", WelfareVoucherStatus.DONATING.getCode()));
if (update < 1) {
return WelfareVoucherDonateReceiveResult.FAIL;
}
WelfareVoucher welfareVoucher = new WelfareVoucher()
.setOrigin(WelfareVoucherOrigin.DONATE.getCode())
.setProjectId(voucher.getProjectId())
.setUserId(userid)
.setDonateUserId(voucher.getUserId())
.setGrantTime(System.currentTimeMillis())
.setStatus(WelfareVoucherStatus.NORMAL.getCode());
insert(welfareVoucher);
return WelfareVoucherDonateReceiveResult.SUCCESS;
}
private WelfareVoucherDonateReceiveResult donateReceiveResult(WelfareVoucher voucher) {
if (voucher == null) {
return WelfareVoucherDonateReceiveResult.FAIL;
}
WelfareProject project = projectService.fetch(voucher.getProjectId());
if (voucher.getStatus() == WelfareVoucherStatus.DONATE.getCode()) {
return WelfareVoucherDonateReceiveResult.DONATED;
}
if (voucher.getStatus() == WelfareVoucherStatus.INVALID.getCode()) {
return WelfareVoucherDonateReceiveResult.INVALID;
}
if (project.getProvideTimeStart().compareTo(new Date()) <= 0) {
return WelfareVoucherDonateReceiveResult.TIMEOUT;
}
if (voucher.getStatus() != WelfareVoucherStatus.DONATING.getCode()) {
return WelfareVoucherDonateReceiveResult.FAIL;
}
return null;
}
@Override
public Map<String, Object> donateVoucherInfo(String voucherId) {
Sql sql = Sqls.create("""
SELECT
voucher.id,
voucher.`status`,
project.`id` projectId,
project.`name`,
project.festival,
project.provideAddress,
project.gift,
project.flexibleGifts,
project.provideTimeStart,
project.provideTimeEnd,
`user`.username donors
FROM
welfare_voucher voucher
LEFT JOIN welfare_project project ON voucher.projectId = project.id
LEFT JOIN sys_user `user` ON voucher.userId = `user`.id
WHERE
voucher.id = @id
""").setParam("id", voucherId);
NutMap result = fetch(sql);
WelfareVoucherDonateReceiveResult receiveResult = donateReceiveResult(fetch(voucherId));
result.put("result", receiveResult == null ? null : receiveResult.map());
return result;
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void voucherDonating(String voucherId) {
update(Chain.make("status", WelfareVoucherStatus.DONATING.getCode()), Cnd.where("id", "=", voucherId));
}
@Override
@Aop(TransAop.READ_COMMITTED)
public WelfareVoucher grantVoucher(String projectId, String userid) {
return insert(new WelfareVoucher()
.setOrigin(WelfareVoucherOrigin.RECEIVE.getCode())
.setProjectId(projectId)
.setUserId(userid)
.setGrantTime(System.currentTimeMillis())
.setStatus(WelfareVoucherStatus.NORMAL.getCode())
);
}
@Override
public List unclaimedVoucher(String userid) {
Sql sql = Sqls.create("""
SELECT
project.`id` projectId,
project.`name`,
project.festival,
project.provideAddress,
project.gift,
project.flexibleGifts,
project.provideTimeStart,
project.provideTimeEnd
FROM
welfare_project project
LEFT JOIN welfare_list list ON project.id = list.projectId
LEFT JOIN welfare_voucher voucher ON (voucher.projectId = project.id AND voucher.userId = list.userId)
$condition
""");
Cnd cnd = Cnd.where("project.provideMode", "=", WelfareProvideMode.PERSONAL.getCode())
.and("project.signMode", "in", List.of(WelfareSignMode.QRCODE.getCode(), WelfareSignMode.QRCODE_SIGNATURE.getCode()))
.and("list.userId", "=", userid)
.and(new Static("now() < project.provideTimeStart"))
.and("voucher.id", "is", null);
cnd.desc("project.provideTimeStart");
sql.setCondition(cnd);
return listMap(sql);
}
public static void main(String[] args) throws InterruptedException {
Date date = new Date();
Thread.sleep(3000);
Date date1 = new Date();
System.err.println(date1.compareTo(date));
}
}