diff --git a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java index 31e260b..2a3b73b 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java @@ -297,59 +297,44 @@ public class SysHomeController { @ApiOperation("获取新闻") @Ok("json") public Result getNews() { - //获取是否有缓存 - String news = redisService.get("gonghui_news"); - if (StrUtil.isNotBlank(news)) { - List result = Json.fromJsonAsList(NutMap.class, news); - return Result.success(result); - } else { - // 定义要爬取的URL - String url = "https://gonghui.njupt.edu.cn/"; - try { - // 使用Jsoup连接到URL并获取页面内容 - Document document = Jsoup.connect(url).get(); - Elements paragraphs = document.select("div.mbox"); - List results = new ArrayList<>(); - for (Element element : paragraphs) { - NutMap map = new NutMap(); - Elements title = element.select(".title"); - Elements ulEle = element.select(".notice-list, .notice-list2"); - Elements liEle = ulEle.select("li"); - List mapList = new ArrayList<>(); - liEle.forEach(el -> { - NutMap m = new NutMap(); - Elements a = el.select("a"); - m.put("text", a.text()); - m.put("href", a.attr("href")); - Elements div = el.select("div"); - m.put("time", div.text()); - mapList.add(m); - }); - map.put("label", title.text()); - mapList.sort((o1, o2) -> { - // 解析日期字符串 - LocalDate date1 = (StrUtil.isNotBlank(o1.getString("time"))) ? LocalDate.parse(o1.getString("time"), DateTimeFormatter.ISO_LOCAL_DATE) : null; - LocalDate date2 = (StrUtil.isNotBlank(o2.getString("time"))) ? LocalDate.parse(o2.getString("time"), DateTimeFormatter.ISO_LOCAL_DATE) : null; + // 定义要爬取的URL + String domain = "https://nsdgh.njnu.edu.cn"; + try { + // 使用Jsoup连接到URL并获取页面内容 + Document document = Jsoup.connect(domain).get(); + List results = new ArrayList<>(); - // 检查是否为null,并进行降序排序 - if (date1 == null && date2 == null) { - return 0; // 两者都为null,视为相等 - } else if (date1 == null) { - return 1; // o1为null,视为较大 - } else if (date2 == null) { - return -1; // o2为null,视为较小 - } else { - return date2.compareTo(date1); // 正常比较,降序 - } - }); - map.put("value", mapList); - results.add(map); - } - redisService.setex("gonghui_news", 60 * 60 * 6, Json.toJson(results)); - return Result.success(results); - } catch (IOException ignored) { + // 最新新闻 + Element newsElement = document.getElementById("news"); + // 获取所有li元素下的a标签 + Elements links = newsElement.select("li a"); + List list = links.stream().map(a -> { + NutMap map = new NutMap(); + map.put("href", domain + "/" + a.attr("href")); + map.put("text", a.text()); + return map; + }).toList(); + results.add(NutMap.NEW().addv("label", "最新新闻").addv("value", list)); + + + // 通知公告 + Elements newsSections = document.select("div.news1"); + for (Element section : newsSections) { + String category = section.selectFirst("h6").ownText(); // 获取"通知公告"或"分工会" + Elements items = section.select("li a"); + List list1 = items.stream().map(a -> { + NutMap map = new NutMap(); + map.put("href", domain + "/" + a.attr("href")); + map.put("text", a.text()); + return map; + }).toList(); + results.add(NutMap.NEW().addv("label", category).addv("value", list1)); } - return Result.success(); + + return Result.success(results); + } catch (Exception e) { + log.error(e); + return Result.error(); } } } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareCommonController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareCommonController.java index f4c1ba5..8127585 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareCommonController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareCommonController.java @@ -23,10 +23,17 @@ public class WelfareCommonController { private WelfareListService welfareListService; + @At + @SaCheckPermission("welfare") + @ApiOperation("获取项目列表") + public Result list(Integer year) { + return Result.success(projectService.getWelfareList(year)); + } + @At @SaCheckPermission("welfare") @ApiOperation("获取项目信息") - public Result projectInfo(@Valid String id){ + public Result projectInfo(@Valid String id) { return Result.success(projectService.projectInfo(id)); } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java index 7c513ee..9ff1da3 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java @@ -25,6 +25,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.poi.ss.formula.functions.T; 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; @@ -71,7 +72,6 @@ public class WelfareListController { public void index() { } - @At @SaCheckPermission("welfare.list.mange") @Ok("json:{dateFormat:'yyyy-MM-dd'}") @@ -92,23 +92,30 @@ public class WelfareListController { return Result.success(); } - @At @SaCheckPermission("welfare.list.mange") @ApiOperation("分页查询非福利会员") @Ok("json:{dateFormat:'yyyy-MM-dd'}") - public Result notWelfareUserPageData(@Valid @Param("pageForm") WelfareFilterUserPageForm pageForm){ + public Result notWelfareUserPageData(@Valid @Param("pageForm") WelfareFilterUserPageForm pageForm) { return Result.success(welfareListService.notWelfareUserPageData(pageForm)); } @At @SaCheckPermission("welfare.list.mange") @ApiOperation("添加用户到福利名单") - public Result addWelfareUser(@Valid @Param("pageForm") WelfareFilterUserPageForm pageForm){ + public Result addWelfareUser(@Valid @Param("pageForm") WelfareFilterUserPageForm pageForm) { welfareListService.addWelfareUser(pageForm); return Result.success(); } + @At + @SaCheckPermission("welfare.list.mange") + @ApiOperation("编辑备注") + public Result updateRemark(@Param("remark") String remark, @Param("id") @Valid String id) { + welfareListService.update(Chain.make("remark", remark), Cnd.where("id", "=", id)); + return Result.success(); + } + @At @Ok("void") @SaCheckPermission("welfare.list.mange") diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareSelectionSituationController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareSelectionSituationController.java new file mode 100644 index 0000000..e664413 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareSelectionSituationController.java @@ -0,0 +1,118 @@ +package com.budwk.app.zhgh.welfare.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.result.Result; +import com.budwk.app.base.utils.PageUtil; +import com.budwk.app.zhgh.welfare.param.WelfareSelectionSituationPageForm; +import com.budwk.app.zhgh.welfare.service.WelfareListService; +import com.budwk.app.zhgh.welfare.service.WelfareSelectionSituationService; +import com.budwk.app.zhgh.welfare.service.WelfareSingleService; +import com.budwk.app.zhgh.welfare.service.WelfareStatisticsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.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 javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Collections; + +@IocBean +@Ok("json:full") +@At("/platform/welfare/selection/situation") +@Slf4j +@Api(tags = "选择情况") +public class WelfareSelectionSituationController { + + @Inject + private Dao dao; + @Inject + private WelfareListService welfareListService; + @Inject + private WelfareStatisticsService welfareStatisticsService; + @Inject + private WelfareSelectionSituationService situationService; + + @At("") + @Ok("beetl:/platform/zhgh/welfare/selectionSituation/index.html") + @SaCheckPermission("welfare.selection.situation") + public void index() { + } + + @At + @SaCheckPermission("welfare.selection.situation") + @ApiOperation("分页查询") + public Result pageData(@Valid @Param("pageForm") WelfareSelectionSituationPageForm pageForm) { + if (StrUtil.isBlank(pageForm.getProjectId())) { + return Result.success(new Pagination<>(1, 10, 0, Collections.emptyList())); + } + + Sql sql = Sqls.create(""" + SELECT + t1.id, + t1.welfareUnionName, + t1.welfareUnitName, + GROUP_CONCAT(DISTINCT t3.optionName) AS selectedOptions, + GROUP_CONCAT(DISTINCT t2.mobile) AS mobile, + t4.username AS userName, + t4.loginname AS loginName, + t4.sex + FROM + welfare_list t1 + LEFT JOIN welfare_project_user_selection t2 ON t2.welfareId = t1.projectId AND t2.selectUserId = t1.userId + LEFT JOIN welfare_project_subject_option t3 ON t3.id = t2.selectOptionId + LEFT JOIN sys_user t4 ON t4.id = t1.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("t1.projectId", "=", pageForm.getProjectId()); + + if (StrUtil.isNotBlank(pageForm.getUserName())) { + cnd.where().andLike("t4.username", pageForm.getUserName()); + } + if (StrUtil.isNotBlank(pageForm.getLoginName())) { + cnd.where().andLike("t4.loginname", pageForm.getLoginName()); + } + cnd.andEX("t1.welfareUnitId", "in", pageForm.getUnitIds()); + cnd.andEX("t1.welfareUnionId", "=", pageForm.getUnionId()); + + if (pageForm.getIsSelect() != null) { + if (pageForm.getIsSelect()) { + cnd.and("t2.id", "IS NOT", null); + } else { + cnd.and("t2.id", "IS", null); + } + } + + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.asc("welfareUnionName"); + cnd.asc("welfareUnitName"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + + cnd.groupBy("t1.id"); + sql.setCondition(cnd); + Pagination pagination = welfareListService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + @At + @SaCheckPermission("welfare.selection.situation") + @Ok("void") + @ApiOperation("导出Excel") + public void exportXlsx(@Valid @Param("pageForm") WelfareSelectionSituationPageForm pageForm, HttpServletResponse response) { + situationService.exportXlsx(pageForm, response); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareStatisticsController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareStatisticsController.java index 3835349..40e8835 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareStatisticsController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareStatisticsController.java @@ -72,7 +72,8 @@ public class WelfareStatisticsController { @At @SaCheckPermission("welfare.statistics") public Result pageData(String projectId, String unionId) { - return Result.success(welfareSingleService.pageData(projectId, unionId)); + NutMap data = welfareStatisticsService.pageData(projectId, unionId); + return Result.success(data); } @@ -89,7 +90,7 @@ public class WelfareStatisticsController { @SaCheckPermission("welfare.statistics") @ApiOperation("导出某分工会已选择人员") public void exportSelectedUnionUser(String projectId, String unionId, HttpServletResponse response) { - welfareStatisticsService.exportSelectedUnionUser(projectId,unionId,response); + welfareStatisticsService.exportSelectedUnionUser(projectId, unionId, response); } @At @@ -105,7 +106,7 @@ public class WelfareStatisticsController { @SaCheckPermission("welfare.statistics") @ApiOperation("导出某分工会未选择人员") public void exportUnSelectedUnionUser(String projectId, String unionId, HttpServletResponse response) { - welfareStatisticsService.exportUnSelectedUnionUser(projectId,unionId,response); + welfareStatisticsService.exportUnSelectedUnionUser(projectId, unionId, response); } @At @@ -113,7 +114,7 @@ public class WelfareStatisticsController { @SaCheckPermission("welfare.statistics") @ApiOperation("导出各分工会选择情况") public void exportUnionExcel(String projectId, HttpServletResponse response) { - welfareStatisticsService.exportUnionExcel(projectId,response); + welfareStatisticsService.exportUnionExcel(projectId, response); } @@ -121,12 +122,17 @@ public class WelfareStatisticsController { @Ok("void") @SaCheckPermission("welfare.statistics") @ApiOperation("按福利选项导出") - public void exportByWelfareOptions(String projectId,HttpServletResponse response){ - welfareStatisticsService.exportByWelfareOptions(projectId,response); + public void exportByWelfareOptions(String projectId, HttpServletResponse response) { + welfareStatisticsService.exportByWelfareOptions(projectId, response); } - - + @At + @Ok("void") + @SaCheckPermission("welfare.statistics") + @ApiOperation("导出汇总表") + public void exportSummary(String projectId, HttpServletResponse response) { + welfareStatisticsService.exportSummary(projectId, response); + } /** diff --git a/src/main/java/com/budwk/app/zhgh/welfare/model/WelfareList.java b/src/main/java/com/budwk/app/zhgh/welfare/model/WelfareList.java index 75a9bdd..2eaf930 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/model/WelfareList.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/model/WelfareList.java @@ -93,4 +93,9 @@ public class WelfareList extends BaseModel{ @ColDefine(type = ColType.BOOLEAN) private Boolean isAutoSelect; + @Column + @Comment("备注") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String remark; + } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareSelectionSituationPageForm.java b/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareSelectionSituationPageForm.java new file mode 100644 index 0000000..5a29d32 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareSelectionSituationPageForm.java @@ -0,0 +1,32 @@ +package com.budwk.app.zhgh.welfare.param; + +import com.budwk.app.base.param.PageForm; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +@ApiModel("选择统计分页参数") +public class WelfareSelectionSituationPageForm extends PageForm { + + @ApiModelProperty("福利项目id") + private String projectId; + + @ApiModelProperty("姓名") + private String userName; + + @ApiModelProperty("工号") + private String loginName; + + @ApiModelProperty("工会id") + private String unionId; + + @ApiModelProperty("单位id") + private String[] unitIds; + + @ApiModelProperty("是否已选择") + private Boolean isSelect; +} diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareSelectionSituationService.java b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareSelectionSituationService.java new file mode 100644 index 0000000..591f3b7 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareSelectionSituationService.java @@ -0,0 +1,13 @@ +package com.budwk.app.zhgh.welfare.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.welfare.model.WelfareList; +import com.budwk.app.zhgh.welfare.param.WelfareSelectionSituationPageForm; + +import javax.servlet.http.HttpServletResponse; + +public interface WelfareSelectionSituationService extends BaseService { + + void exportXlsx(WelfareSelectionSituationPageForm pageForm, HttpServletResponse response); + +} diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareStatisticsService.java b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareStatisticsService.java index 0bc9fb2..1217d76 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareStatisticsService.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareStatisticsService.java @@ -4,11 +4,20 @@ import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.service.BaseService; import com.budwk.app.zhgh.welfare.model.WelfareProject; +import org.nutz.lang.util.NutMap; import javax.servlet.http.HttpServletResponse; public interface WelfareStatisticsService extends BaseService { + /** + * 分页查询 + * @param projectId + * @param unionId + * @return + */ + NutMap pageData(String projectId, String unionId); + /** * 查询某分工会已选择人员 * @param pageForm @@ -54,4 +63,10 @@ public interface WelfareStatisticsService extends BaseService { * @param response */ void exportByWelfareOptions(String projectId, HttpServletResponse response); + + /** + * 导出汇总表 + */ + void exportSummary(String projectId, HttpServletResponse response); + } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java new file mode 100644 index 0000000..9812dda --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java @@ -0,0 +1,105 @@ +package com.budwk.app.zhgh.welfare.service.impl; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.base.utils.CommonDownloadUtil; +import com.budwk.app.base.utils.PageUtil; +import com.budwk.app.zhgh.welfare.model.WelfareList; +import com.budwk.app.zhgh.welfare.param.WelfareSelectionSituationPageForm; +import com.budwk.app.zhgh.welfare.service.WelfareSelectionSituationService; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Workbook; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; + +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +@IocBean(args = {"refer:dao"}) +@Slf4j +public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl implements WelfareSelectionSituationService { + public WelfareSelectionSituationServiceImpl(Dao dao) { + super(dao); + } + + @Override + public void exportXlsx(WelfareSelectionSituationPageForm pageForm, HttpServletResponse response) { + Sql sql = Sqls.create(""" + SELECT + t1.id, + t1.welfareUnionName, + t1.welfareUnitName, + GROUP_CONCAT(DISTINCT t3.optionName) AS selectedOptions, + GROUP_CONCAT(DISTINCT t2.mobile) AS mobile, + t4.username AS userName, + t4.loginname AS loginName, + t4.sex + FROM + welfare_list t1 + LEFT JOIN welfare_project_user_selection t2 ON t2.welfareId = t1.projectId AND t2.selectUserId = t1.userId + LEFT JOIN welfare_project_subject_option t3 ON t3.id = t2.selectOptionId + LEFT JOIN sys_user t4 ON t4.id = t1.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("t1.projectId", "=", pageForm.getProjectId()); + + if (StrUtil.isNotBlank(pageForm.getUserName())) { + cnd.where().andLike("t4.username", pageForm.getUserName()); + } + if (StrUtil.isNotBlank(pageForm.getLoginName())) { + cnd.where().andLike("t4.loginname", pageForm.getLoginName()); + } + cnd.andEX("t1.welfareUnitId", "in", pageForm.getUnitIds()); + cnd.andEX("t1.welfareUnionId", "=", pageForm.getUnionId()); + + if (pageForm.getIsSelect() != null) { + if (pageForm.getIsSelect()) { + cnd.and("t2.id", "IS NOT", null); + } else { + cnd.and("t2.id", "IS", null); + } + } + + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.asc("welfareUnionName"); + cnd.asc("welfareUnitName"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + + cnd.groupBy("t1.id"); + sql.setCondition(cnd); + List list = listMap(sql); + + + // excel列 + List entities = new ArrayList<>(); + entities.add(new ExcelExportEntity("工号", "loginName", 20)); + entities.add(new ExcelExportEntity("姓名", "userName", 20)); + entities.add(new ExcelExportEntity("性别", "sex", 20)); + entities.add(new ExcelExportEntity("所属单位", "welfareUnitName", 20)); + entities.add(new ExcelExportEntity("所属工会", "welfareUnionName", 20)); + entities.add(new ExcelExportEntity("所选福利", "selectedOptions", 20)); + entities.add(new ExcelExportEntity("联系电话", "mobile", 20)); + + // 设置导出参数 + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + // 导出Excel并下载 + try (Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, list)) { + CommonDownloadUtil.download("选择情况.xlsx", workbook, response); + } catch (Exception e) { + log.error("导出Excel失败", e); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareStatisticsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareStatisticsServiceImpl.java index 2870c8e..a2c3e64 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareStatisticsServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareStatisticsServiceImpl.java @@ -4,17 +4,22 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.afterturn.easypoi.excel.export.ExcelExportService; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.sys.models.Sys_union; +import com.budwk.app.zhgh.welfare.model.WelfareList; import com.budwk.app.zhgh.welfare.model.WelfareProject; import com.budwk.app.zhgh.welfare.model.WelfareProjectSubjectOption; +import com.budwk.app.zhgh.welfare.model.WelfareUserSelection; import com.budwk.app.zhgh.welfare.service.WelfareStatisticsService; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.FieldFilter; @@ -26,9 +31,8 @@ import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; +import java.util.stream.Collectors; @IocBean(args = {"refer:dao"}) @Slf4j @@ -37,6 +41,82 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl unions = dao().query(Sys_union.class, Cnd.NEW().andEX(Sys_union::getId, "=", unionId).asc(Sys_union::getUnionCode)); + List mapUnions = BeanUtil.copyToList(unions, NutMap.class); + + // 表格动态列数据 + List dynamicTableColumns = new ArrayList<>() {{ + add(NutMap.NEW().addv("label", "分工会").addv("prop", "name")); + add(NutMap.NEW().addv("label", "本次福利会员人数").addv("prop", "teacherSum")); + add(NutMap.NEW().addv("label", "已选人数").addv("prop", "selectedNum")); + add(NutMap.NEW().addv("label", "未选人数").addv("prop", "unSelectedNum")); + }}; + + // 选项数据 + List welfareOptions = dao().query(WelfareProjectSubjectOption.class, Cnd.where(WelfareProjectSubjectOption::getWelfareId, "=", projectId)); + + for (WelfareProjectSubjectOption welfareOption : welfareOptions) { + dynamicTableColumns.add(NutMap.NEW().addv("label", welfareOption.getOptionName()).addv("prop", welfareOption.getId())); + } + + // 查询福利名单以及查询出选项数据 + Sql sql = Sqls.create(""" + SELECT + t1.*, + t2.id IS NOT NULL AS has_selected + FROM + `welfare_list` t1 + LEFT JOIN welfare_project_user_selection t2 ON t2.selectUserId = t1.userId + AND t2.welfareId = t1.projectId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("t1.projectId", "=", projectId); + cnd.andEX("t1.welfareUnionId", "=", unionId); + sql.setCondition(cnd); + List welfareSelectionList = listMap(sql); + + Sql sql2 = Sqls.create(""" + SELECT + t1.*, + t2.welfareUnionId + FROM + `welfare_project_user_selection` t1 + LEFT JOIN welfare_list t2 ON t2.projectId = t1.welfareId + AND t1.selectUserId = t2.userId + $condition + """); + Cnd cnd2 = Cnd.NEW(); + cnd2.and("t1.welfareId", "=", projectId); + sql2.setCondition(cnd2); + List userSelections = listMap(sql2); + + for (NutMap union : mapUnions) { + // 福利人数 + long teacherSum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id"))).count(); + union.put("teacherSum", teacherSum); + + // 已选人数 + long selectedNum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id")) && v.getBoolean("has_selected")).count(); + union.put("selectedNum", selectedNum); + + // 未选人数 + union.put("unSelectedNum", teacherSum - selectedNum); + + // 各选项的选择人数 + for (WelfareProjectSubjectOption option : welfareOptions) { + long count = userSelections.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id")) && v.getString("selectOptionId").equals(option.getId())) + .map(v -> v.getString("selectUserId")).distinct().count(); + union.put(option.getId(), count); + } + } + + return NutMap.NEW().addv("tableList", mapUnions).addv("tableColumn", dynamicTableColumns); + } + @Override public Pagination selectedUnionUserPageData(PageForm pageForm, String projectId, String unionId) { Sql sql = Sqls.create(""" @@ -240,9 +320,143 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl exportEntities = new ArrayList<>(); + exportEntities.add(new ExcelExportEntity("工号", "loginName", 20)); + exportEntities.add(new ExcelExportEntity("姓名", "userName", 20)); + exportEntities.add(new ExcelExportEntity("电话号码", "mobile", 20)); + exportEntities.add(new ExcelExportEntity("所在分工会", "welfareUnionName", 20)); + exportEntities.add(new ExcelExportEntity("所在单位", "welfareUnitName", 20)); + exportEntities.add(new ExcelExportEntity("所在福利", "optionName", 50)); + + Sql sql = Sqls.create(""" + SELECT + u.loginname AS loginName, + u.username AS userName, + wl.welfareUnitName, + wl.welfareUnionName, + wpus.mobile, + wpus.selectOptionId, + wpso.optionName, + GROUP_CONCAT(DISTINCT wpso.optionName, '(', wpus.selectNum, '份)') selectOptionName + FROM + welfare_project_user_selection wpus + LEFT JOIN welfare_list wl ON wl.userId = wpus.selectUserId + AND wl.projectId = wpus.welfareId + LEFT JOIN sys_user u ON u.id = wpus.selectUserId + LEFT JOIN welfare_project_subject_option wpso ON wpso.id = wpus.selectOptionId + WHERE + wpus.welfareId = @projectId + GROUP BY + u.loginname + ORDER BY + wl.welfareUnionName DESC, + wl.welfareUnitName DESC, + wpus.selectOptionId DESC + """); + sql.setParam("projectId", projectId); + List list = listMap(sql); + + List options = dao().query(WelfareProjectSubjectOption.class, Cnd.where(WelfareProjectSubjectOption::getWelfareId, "=", projectId)); + for (WelfareProjectSubjectOption option : options) { + ExcelExportService service = new ExcelExportService(); + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + exportParams.setTitle(option.getOptionName() + "选择情况"); + exportParams.setSheetName(option.getOptionName()); + + List v = list.stream().filter(w -> w.getString("selectOptionId").equals(option.getId())).collect(Collectors.toList()); + service.createSheetForMap(workbook, exportParams, exportEntities, v); + } + + try { + CommonDownloadUtil.download("按选项导出选择情况表.xlsx", workbook, response); + } catch (Exception e) { + log.error("导出Excel失败", e); + } + } + @Override + public void exportSummary(String projectId, HttpServletResponse response) { + // 分工会数据 + List unions = dao().query(Sys_union.class, Cnd.NEW().asc(Sys_union::getUnionCode)); + List mapUnions = BeanUtil.copyToList(unions, NutMap.class); + + List entities = new ArrayList<>(); + entities.add(new ExcelExportEntity("分工会", "name", 20)); + entities.add(new ExcelExportEntity("本次福利会员人数", "teacherSum", 20)); + entities.add(new ExcelExportEntity("已选人数", "selectedNum", 20)); + entities.add(new ExcelExportEntity("未选人数", "unSelectedNum", 20)); + + // 选项数据 + List welfareOptions = dao().query(WelfareProjectSubjectOption.class, Cnd.where(WelfareProjectSubjectOption::getWelfareId, "=", projectId)); + for (WelfareProjectSubjectOption welfareOption : welfareOptions) { + entities.add(new ExcelExportEntity(welfareOption.getOptionName(), welfareOption.getId(), 20)); + } + + // 查询福利名单以及查询出选项数据 + Sql sql = Sqls.create(""" + SELECT + t1.*, + t2.id IS NOT NULL AS has_selected + FROM + `welfare_list` t1 + LEFT JOIN welfare_project_user_selection t2 ON t2.selectUserId = t1.userId + AND t2.welfareId = t1.projectId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("t1.projectId", "=", projectId); + sql.setCondition(cnd); + List welfareSelectionList = listMap(sql); + + Sql sql2 = Sqls.create(""" + SELECT + t1.*, + t2.welfareUnionId + FROM + `welfare_project_user_selection` t1 + LEFT JOIN welfare_list t2 ON t2.projectId = t1.welfareId + AND t1.selectUserId = t2.userId + $condition + """); + Cnd cnd2 = Cnd.NEW(); + cnd2.and("t1.welfareId", "=", projectId); + sql2.setCondition(cnd2); + List userSelections = listMap(sql2); + + for (NutMap union : mapUnions) { + // 福利人数 + long teacherSum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id"))).count(); + union.put("teacherSum", teacherSum); + + // 已选人数 + long selectedNum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id")) && v.getBoolean("has_selected")).count(); + union.put("selectedNum", selectedNum); + + // 未选人数 + union.put("unSelectedNum", teacherSum - selectedNum); + + // 各选项的选择人数 + for (WelfareProjectSubjectOption option : welfareOptions) { + long count = userSelections.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id")) && v.getString("selectOptionId").equals(option.getId())) + .map(v -> v.getString("selectUserId")).distinct().count(); + union.put(option.getId(), count); + } + } + + // 设置导出参数 + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + // 导出Excel并下载 + try (Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, mapUnions)) { + CommonDownloadUtil.download("汇总表.xlsx", workbook, response); + } catch (Exception e) { + log.error("导出Excel失败", e); + } } } diff --git a/src/main/resources/views/platform/sys/home/news.js b/src/main/resources/views/platform/sys/home/news.js index 146eaba..cfe340c 100644 --- a/src/main/resources/views/platform/sys/home/news.js +++ b/src/main/resources/views/platform/sys/home/news.js @@ -1,14 +1,14 @@ const news = { template: /*language=HTML*/ `
- - - - - - - - + + +
+ {{ n.time }} + {{ n.text }} +
+
+
`, data() { diff --git a/src/main/resources/views/platform/sys/home/quickEntry.js b/src/main/resources/views/platform/sys/home/quickEntry.js index ae2271d..30c36c7 100644 --- a/src/main/resources/views/platform/sys/home/quickEntry.js +++ b/src/main/resources/views/platform/sys/home/quickEntry.js @@ -6,7 +6,7 @@ const quickEntry = {
- {{item.name}} + {{item.name}}
diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/statistics/comprehensive/index.html b/src/main/resources/views/platform/zhgh/staffmanage/member/statistics/comprehensive/index.html index 3d6aa75..10ff109 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/statistics/comprehensive/index.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/statistics/comprehensive/index.html @@ -1,109 +1,87 @@ - +