first commit

This commit is contained in:
2026-09-08 20:09:15 +08:00
commit c7e76e98ab
1647 changed files with 210480 additions and 0 deletions
+137
View File
@@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi-modules</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.6.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-modules-member</artifactId>
<dependencies>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringBoot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Swagger UI -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.fox.version}</version>
</dependency>
<!-- Mysql Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- RuoYi Common DataSource -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-datasource</artifactId>
</dependency>
<!-- RuoYi Common DataScope -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-datascope</artifactId>
</dependency>
<!-- RuoYi Common Log -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-log</artifactId>
</dependency>
<!-- RuoYi Common Swagger -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-swagger</artifactId>
</dependency>
<!-- nutz -->
<dependency>
<groupId>org.nutz</groupId>
<artifactId>nutz-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-api-system</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-api-staffService</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-api-member</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>15</source>
<target>15</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,24 @@
package com.ruoyi;
import com.ruoyi.common.security.annotation.EnableCustomConfig;
import com.ruoyi.common.security.annotation.EnableRyFeignClients;
import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @ClassName RuoYiMemberApplication
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/13 16:54
* @Version 1.0
*/
@EnableCustomConfig
@EnableCustomSwagger2
@EnableRyFeignClients
@SpringBootApplication
public class RuoYiMemberApplication {
public static void main(String[] args) {
SpringApplication.run(RuoYiMemberApplication.class, args);
}
}
@@ -0,0 +1,28 @@
package com.ruoyi.member.config;
import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName TomcatConfig
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/19 13:46
* @Version 1.0
*/
@Configuration
public class TomcatConfig {
@Bean
public TomcatServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers((Connector connector) -> {
connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
});
return factory;
}
}
@@ -0,0 +1,21 @@
package com.ruoyi.member.constant;
import lombok.Getter;
/**
* 数据源
*
* @author jug
* @date 2022/12/30
*/
@Getter
public enum Ds {
/**
* 主库
*/
STAFFSERVICE,
/**
* 系统
*/
SYSTEM,
}
@@ -0,0 +1,53 @@
package com.ruoyi.member.controller.apply;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberApplyRecord;
import com.ruoyi.member.api.domain.dto.MemberAuditPageForm;
import com.ruoyi.member.handle.MemberApplyAuditHandle;
import com.ruoyi.member.service.MemberApplyRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @ClassName MemberApplyAuditController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/15 13:58
* @Version 1.0
*/
@RequestMapping("/applyBranchAudit")
@RestController
public class MemberApplyBranchUnionAuditController {
@Autowired
private MemberApplyRecordService memberApplyRecordService;
@PostMapping("/pageData")
@RequiresPermissions("member:apply:branchUnionAudit:list")
public AjaxResult pageData(@RequestBody MemberAuditPageForm memberAuditPageForm) {
return AjaxResult.success(memberApplyRecordService.branchUnionAuditPageData(memberAuditPageForm));
}
@PostMapping("/doAudit")
@RequiresPermissions("member:apply:branchUnionAudit:list")
public AjaxResult doAudit(@RequestBody Audit audit, @RequestParam String id, @RequestParam boolean flag) {
if (!AuthUtil.hasAnyRoles("admin, A06, H04, gh01")) {
return AjaxResult.error("您没有权限进行此操作");
}
audit.setAuditPass(flag);
MemberApplyRecord memberApplyRecord = memberApplyRecordService.fetch(id);
MemberApplyAuditHandle.AUDIT_UNION.next(memberApplyRecord, audit);
return AjaxResult.success();
}
@GetMapping("/doDelete")
@RequiresPermissions("member:apply:branchUnionAudit:list")
public AjaxResult doDelete(@RequestParam String id){
memberApplyRecordService.delete(id);
return AjaxResult.success();
}
}
@@ -0,0 +1,170 @@
package com.ruoyi.member.controller.apply;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.Logical;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.domain.MemberApplyRecord;
import com.ruoyi.member.service.MemberApplyRecordService;
import com.ruoyi.system.api.domain.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Dao;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* @ClassName MemberApplyController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/14 16:28
* @Version 1.0
*/
@RestController
@RequestMapping("/apply")
@Slf4j
public class MemberApplyController {
@Autowired
private MemberApplyRecordService memberApplyRecordService;
@Autowired
private Dao dao;
/**
* 分工会信息
*/
@RequestMapping("/applyInfo")
@RequiresPermissions("member:apply")
public AjaxResult applyInfo() {
NutMap applyInfo = memberApplyRecordService.applyInfo();
return AjaxResult.success(applyInfo);
}
@RequestMapping("/currentStatus")
@RequiresPermissions("member:apply")
public AjaxResult currentStatus() {
// NutMap result = NutMap.NEW();
//
// Long userId = SecurityUtils.getUserId();
//// SysUser sysUser = Daos.ext(dao, FieldFilter.create(SysUser.class, "member")).fetch(SysUser.class, userId);
// SysUser sysUser = dao.fetch(SysUser.class, userId);
// int member = sysUser.getMember() == null ? 0 : sysUser.getMember();
// result.setv("isMember", member == 1);
// if (member == 0) {
// //查询是不是在申请中
// MemberApplyRecord applyRecord = dao.fetch(MemberApplyRecord.class, Cnd.where("userId", "=", userId).desc("applyTime"));
// dao.fetchLinks(applyRecord, "auditState");
//
//
// if (applyRecord != null && MemberApplyState.NORMAL_MEMBER != applyRecord.getStateId()) {
// result.setv("stateCode", applyRecord.getStateId());
// result.setv("text", applyRecord.getAuditState().getStateName());
// result.setv("status", "ING");
// if (applyRecord.getStateId() == MemberApplyState.UNION_FAIL || applyRecord.getStateId() == MemberApplyState.SCHOOL_UNION_FAIL) {
// result.setv("applyAgain", true);
// result.setv("text", "(" + applyRecord.getAuditState().getStateName() + ")重新申请");
// } else {
// result.setv("applyAgain", false);
// }
// } else {
// result.setv("status", "START");
// result.setv("text", "申请加入");
// result.setv("apply", true);
// }
// } else {
// result.setv("status", "END");
// result.setv("text", "正式会员");
// result.setv("apply", false);
// }
//
return AjaxResult.success();
}
/**
* 申请
*
* @param sysUser 系统用户
* @return {@link AjaxResult}
*/
@PostMapping("/doApply")
@RequiresPermissions("member:apply")
public AjaxResult doApply(@RequestBody SysUser sysUser) {
memberApplyRecordService.doApply(sysUser);
return AjaxResult.success();
}
@PostMapping("/doCancel")
@RequiresPermissions("member:apply")
public AjaxResult doCancel(@RequestParam String recordId) {
memberApplyRecordService.delete(recordId);
return AjaxResult.success();
}
/**
* 历史申请记录
*/
@GetMapping("/history/{id}")
@RequiresPermissions("member:apply")
public AjaxResult history(@PathVariable Long id) {
List<NutMap> history = memberApplyRecordService.history(id);
return AjaxResult.success(history);
}
/**
* 单条变更的详细信息
*
* @param id
* @return
*/
@GetMapping("/historyOne/{id}")
@RequiresPermissions(value = {"member:apply", "member:apply:branchUnionAudit:list"}, logical = Logical.OR)
public AjaxResult historyOne(@PathVariable String id) {
MemberApplyRecord applyRecord = memberApplyRecordService.fetch(id);
memberApplyRecordService.fetchLinks(applyRecord, null);
return AjaxResult.success(applyRecord);
}
/**
* 单条申请记录
*/
@GetMapping("/applyProcessInfo/{id}")
@RequiresPermissions("member:apply:branchUnionAudit:list")
public AjaxResult applyProcessInfo(@PathVariable String id) {
MemberApplyRecord applyRecord = memberApplyRecordService.applyProcessInfo(id);
return AjaxResult.success(applyRecord);
}
/**
* 打印
*
* @return {@link AjaxResult}
*/
@PostMapping("/printForm")
@RequiresPermissions("member:apply:branchUnionAudit:list")
public void printForm(HttpServletResponse response) {
try (ServletOutputStream outputStream = response.getOutputStream();
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("docTemplate/memberApply.docx");) {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=%s".formatted(URLEncoder.encode("会员申请表.docx", StandardCharsets.UTF_8)));
Long userId = SecurityUtils.getUserId();
NutMap dataMap = memberApplyRecordService.printFormData(userId);
assert inputStream != null;
XWPFTemplate.compile(inputStream, Configure.builder().build()).render(dataMap, outputStream);
} catch (Exception e) {
log.error("提案汇总导出失败{}", e.getMessage());
}
}
}
@@ -0,0 +1,129 @@
package com.ruoyi.member.controller.apply;
import cn.hutool.core.date.DateUtil;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberApplyRecord;
import com.ruoyi.member.api.domain.dto.MemberAuditPageForm;
import com.ruoyi.member.handle.MemberApplyAuditHandle;
import com.ruoyi.member.service.MemberApplyRecordService;
import com.ruoyi.staffService.api.RemoteWelfareService;
import com.ruoyi.staffService.api.constant.welfare.WelfareMemberMode;
import com.ruoyi.staffService.api.domain.welfare.WelfareList;
import com.ruoyi.staffService.api.domain.welfare.WelfareProject;
import com.ruoyi.system.api.RemoteSysLocalProcessService;
import com.ruoyi.system.api.domain.SysUser;
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.ioc.aop.Aop;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName MemberApplyAuditController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/15 13:58
* @Version 1.0
*/
@RequestMapping("/applyMasterAudit")
@RestController
public class MemberApplyMasterUnionAuditController {
@Autowired
private Dao dao;
@Autowired
private RemoteWelfareService remoteWelfareService;
@Autowired
private RemoteSysLocalProcessService localProcessService;
@Autowired
private MemberApplyRecordService memberApplyRecordService;
/**
* 分页数据
*/
@PostMapping("/pageData")
@RequiresPermissions("member:apply:masterUnionAudit:list")
public AjaxResult pageData(@RequestBody MemberAuditPageForm memberAuditPageForm) {
return AjaxResult.success(memberApplyRecordService.masterUnionAuditPageData(memberAuditPageForm));
}
/**
* 审核
*/
@PostMapping("/doAudit")
@RequiresPermissions("member:apply:masterUnionAudit:list")
@Transactional(rollbackFor = Exception.class)
@DSTransactional
public AjaxResult doAudit(@RequestBody Audit audit, @RequestParam String id,
@RequestParam boolean flag, @RequestParam boolean insertWelfareList,
@RequestParam(value = "projectId", required = false) String projectId) {
if (!AuthUtil.hasAnyRoles("admin, A06")) {
return AjaxResult.error("您没有权限进行此操作");
}
audit.setAuditPass(flag);
MemberApplyRecord memberApplyRecord = memberApplyRecordService.fetch(id);
MemberApplyAuditHandle.AUDIT_SCHOOL.next(memberApplyRecord, audit);
Sql sql = Sqls.create("select * from `user` where userId = @userId and member = 1").setParam("userId", memberApplyRecord.getUserId());
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap user = (NutMap) sql.getResult();
if (Lang.isNotEmpty(user) && insertWelfareList) {
// 新会员,将其添加到福利项目中
WelfareList welfareList = new WelfareList();
welfareList.setProjectId(projectId);
welfareList.setUserId(String.valueOf(memberApplyRecord.getUserId()));
welfareList.setLoginName(user.getString("loginName"));
welfareList.setUserName(user.getString("userName"));
welfareList.setSex(user.getString("sex"));
welfareList.setUserState(user.getString("userState"));
welfareList.setPersonType(user.getString("personType"));
welfareList.setMobile(user.getString("mobile"));
welfareList.setUnionId(user.getString("unionId"));
welfareList.setUnionName(user.getString("unionName"));
welfareList.setUnitId(user.getString("deptId"));
welfareList.setUnitName(user.getString("deptName"));
welfareList.setThreeUnitId(user.getString("threeUnitId"));
welfareList.setThreeUnitName(user.getString("threeUnitName"));
welfareList.setUnionGroupId(user.getString("unionGroupId"));
welfareList.setUnionGroupName(user.getString("unionGroupName"));
remoteWelfareService.insertWelfareList(List.of(welfareList));
dao.update(SysUser.class, Chain.make("welfareMember", WelfareMemberMode.NORMAL.getCode())
.add("welfareMemberJoinTime", DateUtil.now()),Cnd.where("userId","=",user.getString("userId")));
}
return AjaxResult.success();
}
@GetMapping("/doDelete")
@RequiresPermissions("member:apply:masterUnionAudit:list")
public AjaxResult doDelete(@RequestParam String id) {
memberApplyRecordService.delete(id);
localProcessService.deleteProcessInstance("MEMBER_APPLY@" + id, SecurityConstants.INNER);
return AjaxResult.success();
}
@GetMapping("/getWelfareProjectList")
@RequiresPermissions("member:apply:masterUnionAudit:list")
public AjaxResult getWelfareProjectList() {
R<List<WelfareProject>> listR = remoteWelfareService.listAfootWelfare(null);
return AjaxResult.success(listR.getData());
}
}
@@ -0,0 +1,49 @@
package com.ruoyi.member.controller.change;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.api.domain.dto.MemberAuditPageForm;
import com.ruoyi.member.handle.MemberChangeAuditHandle;
import com.ruoyi.member.service.MemberChangeRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @ClassName MemberApplyAuditController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/15 13:58
* @Version 1.0
*/
@RequestMapping("/changeBranchAudit")
@RestController
public class MemberChangeBranchUnionAuditController {
@Autowired
private MemberChangeRecordService memberChangeRecordService;
@PostMapping("/pageData")
@RequiresPermissions("member:change:branchUnionAudit:list")
public AjaxResult pageData(@RequestBody MemberAuditPageForm memberAuditPageForm) {
return AjaxResult.success(memberChangeRecordService.branchUnionAuditPageData(memberAuditPageForm));
}
@PostMapping("/doAudit")
@RequiresPermissions("member:change:branchUnionAudit:list")
public AjaxResult doAudit(@RequestBody Audit audit, @RequestParam String id, @RequestParam boolean flag) {
audit.setAuditPass(flag);
MemberChangeRecord memberChangeRecord = memberChangeRecordService.fetch(id);
MemberChangeAuditHandle.UNION.next(memberChangeRecord, audit);
return AjaxResult.success();
}
@GetMapping("/doDelete")
@RequiresPermissions("member:change:branchUnionAudit:list")
public AjaxResult doDelete(@RequestParam String id){
memberChangeRecordService.delete(id);
return AjaxResult.success();
}
}
@@ -0,0 +1,172 @@
package com.ruoyi.member.controller.change;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.MemberChangeApplyState;
import com.ruoyi.member.api.constant.MemberChangeOrigin;
import com.ruoyi.member.api.constant.MemberChangeRecordMode;
import com.ruoyi.member.api.constant.UserChangeType;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.api.dto.MemberChangeDto;
import com.ruoyi.member.handle.MemberChangeAuditHandle;
import com.ruoyi.member.service.MemberChangeRecordService;
import com.ruoyi.system.api.RemoteSysLocalProcessService;
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.Daos;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
/**
* @ClassName MemberChangeController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/16 9:40
* @Version 1.0
*/
@RestController
@RequestMapping("/change")
public class MemberChangeController {
@Autowired
private Dao dao;
@Autowired
private RemoteSysLocalProcessService localProcessService;
@Autowired
private MemberChangeRecordService memberChangeRecordService;
/**
* 申请信息
*/
@RequestMapping("/applyInfo")
@RequiresPermissions("member:change")
public AjaxResult applyInfo() {
return AjaxResult.success(memberChangeRecordService.applyInfo());
}
/**
* 当前状态
*/
@RequestMapping("/currentStatus")
@RequiresPermissions("member:change")
public AjaxResult currentStatus() {
NutMap result = NutMap.NEW();
Long userId = SecurityUtils.getUserId();
Sql sql = Sqls.create("select member from sys_user where user_id = @id");
sql.setParam("id", userId);
NutMap userMap = (NutMap) Daos.query(dao, sql.toString(), Sqls.callback.map());
int member = userMap.getInt("member", 0);
boolean isMember = member == 1;
MemberChangeRecord changeRecord = memberChangeRecordService.fetch(Cnd.where("userId", "=", userId).desc("applyTime"));
dao.fetchLinks(changeRecord, "auditState");
if (changeRecord != null) {
if (changeRecord.getStateId() == MemberChangeApplyState.UNION_FAIL
|| changeRecord.getStateId() == MemberChangeApplyState.SCHOOL_UNION_FAIL) {
result.setv("reApply", true);
result.setv("text", "(" + changeRecord.getAuditState().getStateName() + ")重新申请");
} else if (changeRecord.getStateId() == MemberChangeApplyState.SUCCESS && isMember) {
result.setv("apply", true);
} else {
result.setv("text", changeRecord.getAuditState().getStateName());
}
result.setv("changeRecord", changeRecord);
} else {
result.setv("apply", isMember);
}
result.setv("isMember", isMember);
return AjaxResult.success(result);
}
/**
* 申请变更
*/
@PostMapping("/doChangeByAdmin")
@RequiresPermissions("member:change")
public AjaxResult doChangeByAdmin(@RequestBody MemberChangeRecord memberChangeRecord) {
if (memberChangeRecord.getType() == UserChangeType.NEW.getCode()) {
return AjaxResult.warn("您已经入职!");
}
if (memberChangeRecord.getType() == UserChangeType.UNIT_CHANGE.getCode()) {
if (memberChangeRecord.getCurrentUnitId().equals(memberChangeRecord.getOriginUnitId())) {
return AjaxResult.warn("请选择不同的单位!");
}
}
if (memberChangeRecord.getType() != UserChangeType.UNIT_CHANGE.getCode()) {
memberChangeRecord.setCurrentUnitId(null);
memberChangeRecord.setCurrentUnionId(null);
}
memberChangeRecord.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
memberChangeRecord.setApplyOrigin(MemberChangeOrigin.PERSONAL.getCode());
MemberChangeAuditHandle.CREATE.next(memberChangeRecord, null);
return AjaxResult.success();
}
/**
* 申请变更
*/
@PostMapping("/doChange")
@RequiresPermissions("member:change")
public AjaxResult doChange(@RequestBody MemberChangeDto memberChangeDto) {
MemberChangeRecord memberChangeRecord = memberChangeDto.getMemberChangeRecord();
// if (Objects.equals(memberChangeRecord.getType(), UserChangeType.NEW.getCode())) {
// return AjaxResult.warn("您已经入职!");
// }
if (Objects.equals(memberChangeRecord.getType(), UserChangeType.UNIT_CHANGE.getCode())) {
if (memberChangeRecord.getCurrentUnitId().equals(memberChangeRecord.getOriginUnitId())) {
return AjaxResult.warn("请选择不同的单位!");
}
}
memberChangeRecordService.doApply(memberChangeRecord, memberChangeDto.getSysUser());
return AjaxResult.success();
}
/**
* 取消
*
* @param recordId 记录id
* @return {@link AjaxResult}
*/
@PostMapping("/doCancel")
@RequiresPermissions("member:change")
public AjaxResult doCancel(@RequestParam String recordId) {
memberChangeRecordService.delete(recordId);
localProcessService.deleteProcessInstance("MEMBER_CHANGE@" + recordId, SecurityConstants.INNER);
return AjaxResult.success();
}
/**
* 历史变更记录
*/
@GetMapping("/history/{id}")
@RequiresPermissions("member:change")
public AjaxResult history(@PathVariable Long id) {
List<NutMap> history = memberChangeRecordService.history(id);
return AjaxResult.success(history);
}
/**
* 单条变更的详细信息
*
* @param id
* @return
*/
@GetMapping("/historyOne/{id}")
@RequiresPermissions("member:change")
public AjaxResult historyOne(@PathVariable String id) {
MemberChangeRecord changeRecord = memberChangeRecordService.fetch(id);
memberChangeRecordService.fetchLinks(changeRecord, null);
return AjaxResult.success(changeRecord);
}
}
@@ -0,0 +1,54 @@
package com.ruoyi.member.controller.change;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.api.domain.dto.MemberAuditPageForm;
import com.ruoyi.member.handle.MemberChangeAuditHandle;
import com.ruoyi.member.service.MemberChangeRecordService;
import com.ruoyi.system.api.RemoteSysLocalProcessService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @ClassName MemberApplyAuditController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/15 13:58
* @Version 1.0
*/
@RequestMapping("/changeMasterAudit")
@RestController
public class MemberChangeMasterUnionAuditController {
@Autowired
private RemoteSysLocalProcessService localProcessService;
@Autowired
private MemberChangeRecordService memberChangeRecordService;
@PostMapping("/pageData")
@RequiresPermissions("member:change:masterUnionAudit:list")
public AjaxResult pageData(@RequestBody MemberAuditPageForm memberAuditPageForm) {
return AjaxResult.success(memberChangeRecordService.masterUnionAuditPageData(memberAuditPageForm));
}
@PostMapping("/doAudit")
@RequiresPermissions("member:change:masterUnionAudit:list")
public AjaxResult doAudit(@RequestBody Audit audit, @RequestParam String id, @RequestParam boolean flag) {
audit.setAuditPass(flag);
MemberChangeRecord memberChangeRecord = memberChangeRecordService.fetch(id);
MemberChangeAuditHandle.SCHOOL.next(memberChangeRecord, audit);
return AjaxResult.success();
}
@GetMapping("/doDelete")
@RequiresPermissions("member:change:masterUnionAudit:list")
public AjaxResult doDelete(@RequestParam String id){
memberChangeRecordService.delete(id);
localProcessService.deleteProcessInstance("MEMBER_CHANGE@" + id, SecurityConstants.INNER);
return AjaxResult.success();
}
}
@@ -0,0 +1,100 @@
package com.ruoyi.member.controller.change;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.MemberChangeRecordMode;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.service.MemberChangeRecordService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @ClassName MemberChangeRecordController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/19 10:01
* @Version 1.0
*/
@RestController
@RequestMapping("/changeRecords")
public class MemberChangeRecordController {
@Autowired
private MemberChangeRecordService memberChangeRecordService;
@Autowired
private Dao dao;
@PostMapping("/pageData")
@RequiresPermissions("member:change:changeRecords:list")
public AjaxResult pageData(@RequestBody PageForm pageForm,
@RequestParam(required = false) Integer year,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) String unitId,
@RequestParam(required = false) String campus,
@RequestParam(required = false) String sex,
@RequestParam(required = false) String userType,
@RequestParam(required = false) String userState,
@RequestParam(required = false) Integer changeType,
@RequestParam(required = false) Integer applyOrigin
) {
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(mcr.applyTime)", "=", year);
if (StrUtil.isAllBlank(pageForm.getPageOrderBy(), pageForm.getPageOrderName())) {
cnd.desc("mcr.applyTime");
} else {
cnd.orderBy(pageForm.getPageOrderName(), SqlUtil.getOrderBy(pageForm.getPageOrderBy()));
}
cnd.and("mcr.recordMode", "=", MemberChangeRecordMode.MEMBER.getCode());
cnd.andEX("u.unionId", "=", unionId);
cnd.andEX("u.deptId", "=", unitId);
cnd.andEX("u.personType", "=", userType);
cnd.andEX("mcr.type", "=", changeType);
cnd.andEX("mcr.applyOrigin", "=", applyOrigin);
if (!AuthUtil.hasAnyRoles("admin,A06")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
cnd.and("unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
}
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword());
seg.orLike("u.loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), pageForm.getPageOrderBy());
} else {
cnd.asc("u.loginName");
cnd.asc("u.userState");
}
Pagination pagination = memberChangeRecordService.history(pageForm, cnd);
List<NutMap> list = pagination.getList();
list.forEach(v -> {
v.setv("unionAudit", dao.fetch(Audit.class, Cnd.where("id", "=", v.getString("unionAuditId"))));
v.setv("schoolAudit", dao.fetch(Audit.class, Cnd.where("id", "=", v.getString("schoolAuditId"))));
});
return AjaxResult.success(pagination);
}
}
@@ -0,0 +1,337 @@
package com.ruoyi.member.controller.change;
import cn.hutool.core.util.StrUtil;
import com.google.common.base.Joiner;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.*;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.handle.MemberChangeAuditHandle;
import com.ruoyi.member.service.MemberChangeRecordService;
import com.ruoyi.system.api.domain.SysConfig;
import com.ruoyi.system.api.domain.SysUser;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
* @ClassName MemberChangeSeniorManageController
* @Description 高级管理
* @Author zhaoxinyu
* @Date 2022/12/16 16:35
* @Version 1.0
*/
@RestController
@RequestMapping("/changeSeniorManage")
public class MemberChangeSeniorManageController {
@Autowired
private MemberChangeRecordService memberChangeRecordService;
@PostMapping("/pageData")
@RequiresPermissions("member:change:seniorManage:list")
public AjaxResult pageData(@RequestBody PageForm pageForm,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) String unitId,
@RequestParam(required = false) String unionGroupId,
@RequestParam(required = false) Long threeUnitId,
@RequestParam(required = false) String campus,
@RequestParam(required = false) String sex,
@RequestParam(required = false) String userType,
@RequestParam(required = false) String userState,
@RequestParam(required = false) String changeType,
@RequestParam(required = false) Integer changed,
@RequestParam(required = false) String isMember,
@RequestParam(value = "retireTime", required = false) String retireTime,
@RequestParam(required = false, name = "changeDateRange[]") String[] changeDateRange
) {
Sql sql = Sqls.create("""
SELECT
u.*,
his.changeType,
his.changeTime,
IF
( his.id IS NULL, FALSE, TRUE ) hasHis,
state.stateId,
state.stateName,
state.stateColor,
IF
( mcr.userId IS NULL OR mcr.stateId = @success, TRUE, FALSE ) apply,
IF
( mcr.stateId IN ( $failStates ), TRUE, FALSE ) reApply
FROM
`user` u
LEFT JOIN user_history_latest his ON his.user_name = u.loginname
LEFT JOIN member_change_record_latest mcr ON mcr.userId = u.userId
LEFT JOIN audit_state state ON mcr.stateId = state.stateId
$condition
""")
.setParam("recordMode", MemberChangeRecordMode.MEMBER.getCode())
.setParam("changeUnitAuditing", MemberChangeApplyState.SCHOOL_UNION)
.setParam("changeUnitError", MemberChangeApplyState.SCHOOL_UNION_FAIL)
.setParam("success", MemberChangeApplyState.SUCCESS)
.setVar("failStates", Joiner.on(",").join(List.of(MemberChangeApplyState.UNION_FAIL, MemberChangeApplyState.SCHOOL_UNION_FAIL)));
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(isMember)) {
if ("1".equals(isMember)) {
cnd.and("u.member", "=", 1);
} else {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("u.member", "is", null);
seg.or("u.member", "=", "");
seg.or("u.member", "=", 0);
cnd.and(seg);
}
}
if (StrUtil.isNotBlank(retireTime)) {
cnd.and("DATE_FORMAT(u.retireTime, '%Y-%m')", "=", retireTime);
}
if (!AuthUtil.hasAnyRole("admin,A06")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
seg.or("unionGroupId", "is", null);
cnd.and(seg);
}
}
cnd.andEX("u.unionId", "=", unionId);
cnd.andEX("u.deptId", "=", unitId);
cnd.andEX("u.unionGroupId", "=", unionGroupId);
cnd.andEX("u.threeUnitId", "=", threeUnitId);
cnd.andEX("u.campus", "=", campus);
cnd.andEX("u.sex", "=", sex);
cnd.andEX("u.personType", "=", userType);
cnd.andEX("u.userState", "=", userState);
if (Lang.isNotEmpty(changeDateRange)) {
String startTime = changeDateRange[0];
String endTime = changeDateRange[1];
cnd.and(new Static(String.format("Date(his.changeTime) >= '%s' and Date(his.changeTime) <= '%s'", startTime, endTime)));
}
cnd.andEX("his.changeType", "=", changeType);
if (changed != null) {
cnd.and(new Static(changed == 1 ? "his.user_name is not null" : "his.user_name is null"));
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword());
seg.orLike("u.loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), SqlUtil.getOrderBy(pageForm.getPageOrderBy()));
}
cnd.desc("his.changeTime");
cnd.groupBy("u.userId");
sql.setCondition(cnd);
Pagination pagination = memberChangeRecordService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> list = pagination.getList();
for (NutMap nutMap : list) {
if (!SecurityUtils.isAdmin()) {
nutMap.put("idcard", "******");
}
}
pagination.setList(list);
return AjaxResult.success(pagination);
}
@PostMapping("/doChange")
@RequiresPermissions("member:change:seniorManage:list")
public AjaxResult doChange(@RequestBody MemberChangeRecord memberChangeRecord) {
// if (Objects.equals(memberChangeRecord.getType(), UserChangeType.NEW.getCode())) {
// return AjaxResult.warn("您已经入职!");
// }
if (Objects.equals(memberChangeRecord.getType(), UserChangeType.UNIT_CHANGE.getCode())) {
boolean unionGroupEnable = Optional.ofNullable(memberChangeRecordService.dao().fetch(SysConfig.class, Cnd.where("configKey", "=", "sys.unionGroup"))).map(v -> v.getConfigValue()).orElse("false").equals("true");
if (unionGroupEnable && memberChangeRecord.getCurrentThreeUnitId().equals(memberChangeRecord.getOriginThreeUnitId())) {
return AjaxResult.warn("请选择不同的单位!");
} else if (!unionGroupEnable && memberChangeRecord.getCurrentUnitId().equals(memberChangeRecord.getOriginUnitId())) {
return AjaxResult.warn("请选择不同的单位!");
}
}
// if (!Objects.equals(memberChangeRecord.getType(), UserChangeType.UNIT_CHANGE.getCode())) {
// memberChangeRecord.setCurrentUnitId(null);
// memberChangeRecord.setCurrentUnionId(null);
// }
Audit audit = new Audit();
audit.setAuditPass(true);
memberChangeRecord.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
if (AuthUtil.hasRole("admin, A06")) {
memberChangeRecord.setApplyOrigin(MemberChangeOrigin.SCHOOL.getCode());
memberChangeRecord = MemberChangeAuditHandle.CREATE.next(memberChangeRecord, null);
MemberChangeAuditHandle.SCHOOL.next(memberChangeRecord, audit);
} else {
memberChangeRecord.setApplyOrigin(MemberChangeOrigin.UNION.getCode());
memberChangeRecord = MemberChangeAuditHandle.CREATE.next(memberChangeRecord, null);
MemberChangeAuditHandle.UNION.next(memberChangeRecord, audit);
}
return AjaxResult.success();
}
/**
* 批量修改校区
*
* @param sysUsers 系统用户
* @return {@link AjaxResult}
*/
@PostMapping("/batchModifyCampus")
@RequiresPermissions("member:change:seniorManage:list")
public AjaxResult batchModifyCampus(@RequestBody List<SysUser> sysUsers) {
memberChangeRecordService.dao().update(sysUsers, "campus");
return AjaxResult.success();
}
/**
* 用户单位调整
*
* @param changeRecords 更改记录
* @return {@link AjaxResult}
*/
@PostMapping("/userUnitMove")
@RequiresPermissions("member:change:seniorManage:list")
public AjaxResult userUnitMove(@RequestBody List<MemberChangeRecord> changeRecords) {
memberChangeRecordService.userUnitMove(changeRecords);
return AjaxResult.success();
}
@PostMapping("/getButtonNum")
@RequiresPermissions("member:change:seniorManage:list")
public AjaxResult getButtonNum(@RequestBody MemberPageForm pageForm,
@RequestParam(required = false) String isMember,
@RequestParam(value = "retireTime", required = false) String retireTime,
@RequestParam(required = false) Integer changed,
@RequestParam(required = false) Integer changeType) {
Sql sql = Sqls.create("""
SELECT
SUM(changeTypeNotNull) AS 'changeNum',
SUM(changeTypeNull) AS 'notChangeNum',
COUNT(DISTINCT userId) AS 'userSumNum',
SUM(memberEqual1) AS 'memberNum',
SUM(memberNotEqual1) AS 'notMemberNum'
FROM
(
SELECT
u.userId,
CASE WHEN his.changeType IS NOT NULL THEN 1 ELSE 0 END AS changeTypeNotNull,
CASE WHEN his.changeType IS NULL THEN 1 ELSE 0 END AS changeTypeNull,
CASE WHEN u.member = 1 THEN 1 ELSE 0 END AS memberEqual1,
CASE WHEN u.member != 1 THEN 1 ELSE 0 END AS memberNotEqual1
FROM
`user` u
LEFT JOIN user_history_latest his ON his.user_name = u.loginName
LEFT JOIN member_change_record_latest mcr ON mcr.userId = u.userId
LEFT JOIN audit_state state ON mcr.stateId = state.stateId
$condition
) AS subquery
""")
.setParam("recordMode", MemberChangeRecordMode.MEMBER.getCode())
.setParam("changeUnitAuditing", MemberChangeApplyState.SCHOOL_UNION)
.setParam("changeUnitError", MemberChangeApplyState.SCHOOL_UNION_FAIL)
.setParam("success", MemberChangeApplyState.SUCCESS)
.setVar("failStates", Joiner.on(",").join(List.of(MemberChangeApplyState.UNION_FAIL, MemberChangeApplyState.SCHOOL_UNION_FAIL)));
Cnd cnd = Cnd.NEW();
// cnd.andEX("u.member", "=", isMember);
if (StrUtil.isNotBlank(isMember)) {
if ("1".equals(isMember)) {
cnd.and("u.member", "=", 1);
} else {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("u.member", "is", null);
seg.or("u.member", "=", "");
seg.or("u.member", "=", 0);
cnd.and(seg);
}
}
if (StrUtil.isNotBlank(retireTime)) {
cnd.and("DATE_FORMAT(u.retireTime, '%Y-%m')", "=", retireTime);
}
cnd.groupBy("u.userId");
cnd.andEX("u.personType", "=", pageForm.getPersonType());
cnd.andEX("u.personType", "=", pageForm.getUserType());
cnd.andEX("u.userState", "=", pageForm.getUserState());
cnd.andEX("u.sex", "=", pageForm.getSex());
cnd.andEX("u.unionId", "=", pageForm.getUnionId());
cnd.andEX("u.deptId", "=", pageForm.getUnitId());
cnd.andEX("u.unionGroupId", "=", pageForm.getUnionGroupId());
cnd.andEX("u.threeUnitId", "=", pageForm.getThreeUnitId());
cnd.andEX("u.campus", "=", pageForm.getCampus());
if (!AuthUtil.hasAnyRoles("admin,A06")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("u.unionId", "=", SecurityUtils.getUnionId());
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("u.unionId", "=", SecurityUtils.getUnionId());
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("u.unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
seg.or("u.unionGroupId", "is", null);
cnd.and(seg);
}
}
cnd.andEX("his.changeType", "=", changeType);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword());
seg.orLike("u.loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
if ("changeTime".equals(pageForm.getPageOrderName()) || "changeType".equals(pageForm.getPageOrderName())) {
cnd.orderBy("his." + pageForm.getPageOrderName(), pageForm.getPageOrderBy());
} else {
cnd.orderBy("u." + pageForm.getPageOrderName(), pageForm.getPageOrderBy());
}
} else {
cnd.asc("u.loginName");
cnd.desc("his.changeTime");
cnd.asc("u.userState");
}
sql.setCondition(cnd);
NutMap numMap = memberChangeRecordService.fetch(sql);
return AjaxResult.success(numMap);
}
@GetMapping("/doDelete")
public AjaxResult doDelete(@RequestParam Long userId) {
UserMode.removeMemberRole(userId);
return AjaxResult.success();
}
}
@@ -0,0 +1,351 @@
package com.ruoyi.member.controller.checkTask;
import cn.hutool.core.util.StrUtil;
import com.google.common.base.Joiner;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.*;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.api.domain.MemberCheckUnionTask;
import com.ruoyi.member.handle.MemberChangeAuditHandle;
import com.ruoyi.member.service.MemberService;
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.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 工会小组审核
*
* @author jug
* @date 2023/05/30
*/
@RestController
@RequestMapping("/checkTask/branchUnionCheck")
public class MemberBranchUnionCheckTaskController {
@Autowired
private MemberService memberService;
@Autowired
private Dao dao;
@PostMapping("/pageData")
@RequiresPermissions("member:checkTask:branchUnionCheck")
public AjaxResult pageData(@RequestBody MemberPageForm pageForm, @RequestParam(required = false) Integer isMember, @RequestParam(required = false) Integer changed, @RequestParam(required = false) Integer changeType) {
Sql sql = Sqls.create("""
SELECT
u.*,
his.id as hisId,
his.changeType,
his.changeTime,
IF
( his.id IS NULL, FALSE, TRUE ) hasHis,
TRUE AS flag,
mcr.type,
mcr_state.stateId stateId,
mcr_state.stateName stateName,
mcr_state.stateColor stateColor,
IF(mcr.stateId = @changeUnitAuditing,TRUE,FALSE) changeUnitAuditing,
IF(mcr.stateId = @changeUnitError,TRUE,FALSE) changeUnitError
FROM
`user` u
LEFT JOIN (select * from member_change_record where (userId,applyTime) in (SELECT userId, MAX( applyTime ) FROM member_change_record GROUP BY userId)) mcr ON mcr.userId = u.userId
LEFT JOIN user_history_latest his ON his.user_name = u.loginName
LEFT JOIN audit_state mcr_state ON mcr_state.stateId = mcr.stateId
$condition
""").setParam("changeUnitAuditing", MemberChangeApplyState.SCHOOL_UNION).setParam("changeUnitError", MemberChangeApplyState.SCHOOL_UNION_FAIL);
//查询出是在审核中还是审核拒绝了
// LEFT JOIN member_change_record_latest mcr ON mcr.userId = u.userId
sql.setVar("states", Joiner.on(",").join(List.of(MemberApplyState.SCHOOL_UNION_FAIL)));
Cnd cnd = Cnd.NEW();
cnd.andEX("u.member", "=", isMember);
cnd.andEX("u.personType", "=", pageForm.getPersonType());
cnd.andEX("u.userState", "=", pageForm.getUserState());
cnd.andEX("u.sex", "=", pageForm.getSex());
cnd.andEX("u.unionId", "=", pageForm.getUnionId());
cnd.andEX("u.deptId", "=", pageForm.getUnitId());
cnd.andEX("u.unionGroupId", "=", pageForm.getUnionGroupId());
cnd.andEX("u.threeUnitId", "=", pageForm.getThreeUnitId());
cnd.andEX("u.campus", "=", pageForm.getCampus());
if (!AuthUtil.hasAnyRoles("admin,A06")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("u.unionId", "=", SecurityUtils.getUnionId());
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("u.unionId", "=", SecurityUtils.getUnionId());
cnd.and("u.unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
}
}
if (changed != null) {
if (changed == 1) {
cnd.and(new Static("his.user_name is not null"));
} else {
cnd.and(new Static("his.user_name is null"));
}
}
cnd.andEX("his.changeType", "=", changeType);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword());
seg.orLike("u.loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), SqlUtil.getOrderBy(pageForm.getPageOrderBy()));
} else {
cnd.asc("u.userState");
cnd.asc("u.loginName");
cnd.asc("u.unionId");
cnd.desc("his.changeTime");
}
cnd.groupBy("u.userId");
sql.setCondition(cnd);
return AjaxResult.success(memberService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql));
}
@PostMapping("/getButtonNum")
@RequiresPermissions("member:checkTask:branchUnionCheck")
public AjaxResult getButtonNum(@RequestBody MemberPageForm pageForm, @RequestParam(required = false) Integer isMember, @RequestParam(required = false) Integer changed, @RequestParam(required = false) Integer changeType) {
Sql sql = Sqls.create("""
SELECT
SUM(changeTypeNotNull) AS 'changeNum',
SUM(changeTypeNull) AS 'notChangeNum',
COUNT(DISTINCT userId) AS 'userSumNum',
SUM(memberEqual1) AS 'memberNum',
SUM(memberNotEqual1) AS 'notMemberNum'
FROM
(
SELECT
u.userId,
CASE WHEN his.changeType IS NOT NULL THEN 1 ELSE 0 END AS changeTypeNotNull,
CASE WHEN his.changeType IS NULL THEN 1 ELSE 0 END AS changeTypeNull,
CASE WHEN u.member = 1 THEN 1 ELSE 0 END AS memberEqual1,
CASE WHEN u.member != 1 THEN 1 ELSE 0 END AS memberNotEqual1
FROM
`user` u
LEFT JOIN user_history_latest his ON his.user_name = u.loginName
LEFT JOIN member_change_record_latest mcr ON mcr.userId = u.userId
LEFT JOIN audit_state state ON mcr.stateId = state.stateId
$condition
) AS subquery
""")
.setParam("recordMode", MemberChangeRecordMode.MEMBER.getCode())
.setParam("changeUnitAuditing", MemberChangeApplyState.SCHOOL_UNION)
.setParam("changeUnitError", MemberChangeApplyState.SCHOOL_UNION_FAIL)
.setParam("success", MemberChangeApplyState.SUCCESS)
.setVar("failStates", Joiner.on(",").join(List.of(MemberChangeApplyState.UNION_FAIL, MemberChangeApplyState.SCHOOL_UNION_FAIL)));
Cnd cnd = Cnd.NEW();
cnd.andEX("u.member", "=", isMember);
cnd.groupBy("u.userId");
cnd.andEX("u.personType", "=", pageForm.getPersonType());
cnd.andEX("u.userState", "=", pageForm.getUserState());
cnd.andEX("u.sex", "=", pageForm.getSex());
cnd.andEX("u.unionId", "=", pageForm.getUnionId());
cnd.andEX("u.deptId", "=", pageForm.getUnitId());
cnd.andEX("u.unionGroupId", "=", pageForm.getUnionGroupId());
cnd.andEX("u.threeUnitId", "=", pageForm.getThreeUnitId());
cnd.andEX("u.campus", "=", pageForm.getCampus());
if (!AuthUtil.hasAnyRoles("admin,A06")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("u.unionId", "=", SecurityUtils.getUnionId());
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("u.unionId", "=", SecurityUtils.getUnionId());
cnd.and("u.unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
}
}
cnd.andEX("his.changeType", "=", changeType);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword());
seg.orLike("u.loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
cnd.desc("his.changeTime");
cnd.asc("u.userState");
sql.setCondition(cnd);
NutMap numMap = memberService.fetch(sql);
return AjaxResult.success(numMap);
}
/**
* 提交核对任务至校工会
*
* @param taskId 任务id
* @param unionGroupId 工会小组id
* @return {@link AjaxResult}
*/
@PostMapping("/submitCheck")
@RequiresPermissions("member:checkTask:branchUnionCheck")
public AjaxResult submitCheck(@RequestParam String taskId, @RequestParam(required = false) String unionGroupId) {
Cnd cnd = Cnd.where("taskId", "=", taskId);
cnd.andEX("unionGroupId", "=", unionGroupId);
if (StrUtil.isBlank(unionGroupId) && AuthUtil.hasRole("unionGroupLeader")) {
cnd.andEX("unionGroupId", "=", SecurityUtils.getUnionGroupId());
}
dao.update(MemberCheckUnionTask.class, Chain.make("isFinish", true), cnd);
return AjaxResult.success();
}
/**
* 提交变更人员
*
* @param record 记录
* @return {@link AjaxResult}
*/
@PostMapping("/doSubmitChangeUser")
@RequiresPermissions("member:checkTask:branchUnionCheck")
public AjaxResult doSubmitChangeUser(@RequestBody MemberChangeRecord record) {
record.setApplyOrigin(MemberChangeOrigin.UNION_GROUP.getCode());
record.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
record = MemberChangeAuditHandle.CREATE.next(record, null);
Audit audit = new Audit();
audit.setAuditPass(true);
audit.setAuditOpinion(record.getRemark());
MemberChangeAuditHandle.UNION.next(record, audit);
return AjaxResult.success();
}
/**
* 分工会核对任务状态
*
* @param taskId 任务id
* @param unionGroupId 工会小组id
* @return {@link AjaxResult}
*/
@GetMapping("/getUnionTaskStatus")
@RequiresPermissions("member:checkTask:branchUnionCheck")
public AjaxResult getUnionTaskStatus(@RequestParam String taskId, @RequestParam(required = false) String unionGroupId) {
Cnd cnd = Cnd.where("taskId", "=", taskId);
cnd.andEX("unionGroupId", "=", unionGroupId);
if (StrUtil.isBlank(unionGroupId) && AuthUtil.hasRole("unionGroupLeader")) {
cnd.andEX("unionGroupId", "=", SecurityUtils.getUnionGroupId());
}
MemberCheckUnionTask unionTask = dao.fetch(MemberCheckUnionTask.class, cnd);
boolean status = unionTask != null && unionTask.getIsFinish();
return AjaxResult.success(status);
}
/**
* 重新核对
*
* @param taskId 任务id
* @return {@link AjaxResult}
*/
@PostMapping("/checkAgain")
@RequiresPermissions("member:checkTask:branchUnionCheck")
public AjaxResult checkAgain(@RequestParam String taskId, @RequestParam(required = false) String unionGroupId) {
Cnd cnd = Cnd.where("taskId", "=", taskId);
cnd.andEX("unionGroupId", "=", unionGroupId);
if (StrUtil.isBlank(unionGroupId) && AuthUtil.hasRole("unionGroupLeader")) {
cnd.andEX("unionGroupId", "=", SecurityUtils.getUnionGroupId());
}
dao.update(MemberCheckUnionTask.class, Chain.make("isFinish", false), cnd);
return AjaxResult.success();
}
@PostMapping("/getChangeNumber")
@RequiresPermissions("member:checkTask:branchUnionCheck")
public AjaxResult getChangeNumber(@RequestBody MemberPageForm pageForm, @RequestParam(required = false) Integer member, @RequestParam(required = false) Boolean changed, @RequestParam(required = false) Integer welfareMember, @RequestParam(required = false) Integer changeType) {
Sql sql = Sqls.create("""
SELECT
(
SELECT
COUNT( DISTINCT u.userId )
FROM
`user` u
LEFT JOIN user_history_latest his ON his.user_name = u.loginname
LEFT JOIN member_change_record_latest mcr ON mcr.userId = u.userId
LEFT JOIN audit_state mcr_state ON mcr_state.stateId = mcr.stateId
$condition
) `all`,
(
SELECT
COUNT( DISTINCT u.userId )
FROM
`user` u
LEFT JOIN user_history_latest his ON his.user_name = u.loginname
LEFT JOIN member_change_record_latest mcr ON mcr.userId = u.userId
LEFT JOIN audit_state mcr_state ON mcr_state.stateId = mcr.stateId
$condition
AND his.user_name IS NOT NULL
) have,
(
SELECT
COUNT( DISTINCT u.userId )
FROM
`user` u
LEFT JOIN user_history_latest his ON his.user_name = u.loginname
LEFT JOIN member_change_record_latest mcr ON mcr.userId = u.userId
LEFT JOIN audit_state mcr_state ON mcr_state.stateId = mcr.stateId
$condition
AND his.user_name IS NULL
) `no`
""");
Cnd cnd = Cnd.NEW();
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);
}
}
cnd.andEX("u.personType", "=", pageForm.getPersonType());
cnd.andEX("u.userState", "=", pageForm.getUserState());
cnd.andEX("u.sex", "=", pageForm.getSex());
cnd.andEX("u.unionId", "=", pageForm.getUnionId());
cnd.andEX("u.deptId", "=", pageForm.getUnitId());
cnd.andEX("u.unionGroupId", "=", pageForm.getUnionGroupId());
cnd.andEX("u.threeUnitId", "=", pageForm.getThreeUnitId());
if (!AuthUtil.hasAnyRoles("admin,A06")) {
cnd.and("u.unionGroupId", "=", SecurityUtils.getUnionGroupId());
}
cnd.andEX("his.changeType", "=", changeType);
sql.setCondition(cnd);
NutMap nutMap = memberService.fetch(sql);
return AjaxResult.success(nutMap);
}
public void doExportByUnion() {
}
}
@@ -0,0 +1,106 @@
package com.ruoyi.member.controller.checkTask;
import cn.hutool.core.lang.Assert;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.api.domain.MemberCheckTask;
import com.ruoyi.member.api.domain.MemberCheckUnionTask;
import com.ruoyi.member.service.MemberService;
import com.ruoyi.system.api.domain.SysUnionGroup;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.Calendar;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/checkTask/taskManage")
public class MemberCheckTaskController {
@Autowired
private MemberService memberService;
@Autowired
private Dao dao;
@PostMapping("/pageData")
@RequiresPermissions("member:checkTask:taskManage")
public AjaxResult pageData(@RequestBody PageForm pageForm, @RequestParam(required = false) Integer year) {
Sql sql = Sqls.create("""
select * from member_check_task $condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("year", "=", year);
sql.setCondition(cnd);
return AjaxResult.success(memberService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql));
}
/**
* 做添加
*
* @param task 任务
* @return {@link AjaxResult}
*/
@PostMapping("/doAdd")
@RequiresPermissions("member:checkTask:taskManage")
public AjaxResult doAdd(@RequestBody MemberCheckTask task) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(task.getStartTime());
List<SysUnionGroup> unionGroups = dao.query(SysUnionGroup.class, null);
dao.fetchLinks(unionGroups, null);
task.setYear(calendar.get(Calendar.YEAR));
dao.insert(task);
List<MemberCheckUnionTask> unionTasks = unionGroups.stream().map(v -> {
MemberCheckUnionTask unionTask = new MemberCheckUnionTask();
unionTask.setTaskId(task.getId());
unionTask.setUnionId(v.getId());
unionTask.setUnionGroupId(v.getId());
unionTask.setUnionId(v.getUnionId());
unionTask.setUnionName(v.getSysUnion().getUnionName());
unionTask.setUnionCode(v.getSysUnion().getUnionCode());
unionTask.setIsFinish(false);
return unionTask;
}).collect(Collectors.toList());
dao.insert(unionTasks);
return AjaxResult.success();
}
@PostMapping("/doEdit")
@RequiresPermissions("member:checkTask:taskManage")
public AjaxResult doEdit(@RequestBody MemberCheckTask task) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(task.getStartTime());
task.setYear(calendar.get(Calendar.YEAR));
dao.updateIgnoreNull(task);
return null;
}
@PostMapping("/doDelete")
@RequiresPermissions("member:checkTask:taskManage")
@Transactional(rollbackFor = Exception.class)
public AjaxResult doDelete(@RequestParam String id) {
Assert.notBlank(id);
dao.clear(MemberCheckTask.class, Cnd.where("id", "=", id));
dao.clear(MemberCheckUnionTask.class, Cnd.where("taskId", "=", id));
dao.clear(MemberChangeRecord.class, Cnd.where("taskId", "=", id));
return AjaxResult.success();
}
@PostMapping("/getAllTask")
public AjaxResult getAllTask(@RequestParam(required = false) Integer year) {
Cnd cnd = Cnd.NEW();
cnd.andEX("year", "=", year);
return AjaxResult.success(dao.query(MemberCheckTask.class, cnd));
}
}
@@ -0,0 +1,158 @@
package com.ruoyi.member.controller.checkTask;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.member.api.constant.MemberChangeApplyState;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.handle.MemberChangeAuditHandle;
import com.ruoyi.member.service.MemberService;
import com.ruoyi.system.api.domain.SysDept;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/checkTask/schoolUnionCheck")
public class MemberSchoolUnionCheckTaskController {
@Autowired
private MemberService memberService;
@Autowired
private Dao dao;
@PostMapping("/pageData")
@RequiresPermissions("member:checkTask:schoolUnionCheck")
public AjaxResult pageData(@RequestBody PageForm pageForm,
@RequestParam String taskId,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) String unitId) {
Sql sql = Sqls.create("""
SELECT
mcut.unionId,
mcut.unionName,
mcut.unionCode,
mcut.isFinish,
IF(mcut.isFinish is true,'是','否') as isFinishText,
sum( CASE WHEN u.member = 1 THEN 1 ELSE 0 END ) AS memberNum,
(SELECT count( 1 ) FROM member_change_record mcr WHERE mcr.originUnionId = mcut.unionId AND mcr.taskId = mcut.taskId AND mcr.stateId = @stateId) as notCheckNum,
(SELECT COUNT( 1 ) FROM member_check_union_task WHERE unionid = gh.id and taskId = @taskId ) unionGroupNum,
(SELECT COUNT( 1 ) FROM member_check_union_task WHERE isFinish = 1 AND unionid = gh.id and taskId = @taskId ) hasCheckUnionGroupNum,
(SELECT COUNT( 1 ) FROM member_check_union_task WHERE isFinish = 0 AND unionid = gh.id and taskId = @taskId ) notCheckUnionGroupNum
FROM
member_check_union_task mcut
LEFT JOIN `user` u ON u.unionId = mcut.unionId
LEFT JOIN (select distinct unionId as id from member_check_union_task where taskId = @taskId) gh on gh.id = mcut.unionId
$condition
""");
sql.setParam("stateId", MemberChangeApplyState.SCHOOL_UNION);
sql.setParam("taskId", taskId);
Cnd cnd = Cnd.NEW();
cnd.andEX("mcut.unionId", "=", unionId);
cnd.and("mcut.taskId", "=", taskId);
cnd.groupBy("mcut.unionId");
cnd.asc("mcut.unionCode");
sql.setCondition(cnd);
return AjaxResult.success(memberService.listMap(sql));
}
/**
* 小组核对情况
*
* @param taskId 任务id
* @param unionId 工会id
* @return {@link AjaxResult}
*/
@RequestMapping("/unionGroupCheckDesc")
@RequiresPermissions("member:checkTask:schoolUnionCheck")
public AjaxResult pageData(@RequestParam String taskId, @RequestParam String unionId) {
Sql sql = Sqls.create("""
SELECT
sug.id,
sug.groupName,
sug.groupCode,
mcut.isFinish,
u.user_name as loginName,
u.nick_name as userName,
u.mobile\s
FROM
member_check_union_task mcut
LEFT JOIN sys_union_group sug ON mcut.unionGroupId = sug.id
LEFT JOIN sys_user_role sur ON sur.unionGroupId = sug.id\s
AND sur.role_id = 112
LEFT JOIN sys_user u ON u.user_id = sur.user_id
WHERE mcut.unionId = @unionId AND mcut.taskId = @taskId
ORDER BY mcut.isFinish ASC,sug.groupCode ASC
""");
sql.setParam("unionId", unionId);
sql.setParam("taskId", taskId);
List list = memberService.listMap(sql);
return AjaxResult.success(list);
}
@PostMapping("/getNotCheckUsers")
@RequiresPermissions("member:checkTask:schoolUnionCheck")
public AjaxResult getNotCheckUsers(@RequestParam String taskId, @RequestParam String unionId) {
Sql sql = Sqls.create("""
SELECT
mcr.id,
mcr.type,
mcr.userId,
mcr.originUnitId,
mcr.currentUnitId,
mcr.originThreeUnitId,
mcr.currentThreeUnitId,
u.username AS userName,
u.loginname AS loginName,
u.member,
u.welfareMember,
his.changeType,
his.changeTime,
state.stateId,
state.stateName
FROM
member_change_record mcr
LEFT JOIN `user` u ON u.userId = mcr.userId
LEFT JOIN audit_state state ON mcr.stateId = state.stateId
LEFT JOIN user_history_latest his ON his.user_name = 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);
List<NutMap> userList = memberService.listMap(sql);
List<SysDept> units = dao.query(SysDept.class, Cnd.NEW());
for (NutMap user : userList) {
user.put("originUnitName", units.stream().filter(v -> v.getDeptId() == user.getLong("originUnitId")).findFirst().map(v -> v.getDeptName()).orElse("无单位"));
user.put("currentUnitName", units.stream().filter(v -> v.getDeptId() == user.getLong("currentUnitId")).findFirst().map(v -> v.getDeptName()).orElse("无单位"));
user.put("originThreeUnitName", units.stream().filter(v -> v.getDeptId() == user.getLong("originThreeUnitId")).findFirst().map(v -> v.getDeptName()).orElse("无单位"));
user.put("currentThreeUnitName", units.stream().filter(v -> v.getDeptId() == user.getLong("currentThreeUnitId")).findFirst().map(v -> v.getDeptName()).orElse("无单位"));
}
return AjaxResult.success(userList);
}
@PostMapping("/doAudit")
@RequiresPermissions("member:checkTask:schoolUnionCheck")
public AjaxResult doAudit(@RequestBody MemberChangeRecord record, @RequestParam(required = false) String auditOpinion, @RequestParam boolean flag) {
Audit audit = new Audit();
audit.setAuditOpinion(auditOpinion);
audit.setAuditPass(flag);
MemberChangeAuditHandle.SCHOOL.next(dao.fetch(MemberChangeRecord.class, record.getId()), audit);
return AjaxResult.success();
}
}
@@ -0,0 +1,174 @@
package com.ruoyi.member.controller.common;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.service.MemberService;
import com.ruoyi.system.api.domain.SysUser;
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.Daos;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName MemberCommonController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/16 10:42
* @Version 1.0
*/
@RestController
@RequestMapping("/common")
public class MemberCommonController {
@Autowired
private Dao dao;
@Autowired
private MemberService memberService;
@RequestMapping("getEnumSelect")
public AjaxResult getEnumSelect(String enumName) {
try {
String enumPackage = "com.ruoyi.member.api.constant";
Class<Enum> clazz = (Class<Enum>) Class.forName(enumPackage + "." + enumName);
Enum[] objs = clazz.getEnumConstants();
List<NutMap> ls = new ArrayList<>();
for (Enum obj : objs) {
String name = obj.name();
NutMap nutMap = Lang.obj2nutmap(obj);
nutMap.put("name", name);
ls.add(nutMap);
}
return AjaxResult.success(ls);
} catch (Exception e) {
return AjaxResult.error();
}
}
/**
* 成员信息
*
* @param id id
* @return {@link AjaxResult}
*/
@RequestMapping("/memberInfo/{id}")
public AjaxResult memberInfo(@PathVariable Long id) {
if (!AuthUtil.hasAnyRole("admin,A06,H04,unionGroupLeader") && !SecurityUtils.getUserId().equals(id)) {
return AjaxResult.warn("没有权限");
}
Sql sql = Sqls.create("select * from user where userId = @id");
sql.setParam("id", id);
NutMap userMap = (NutMap) Daos.query(dao, sql.toString(), Sqls.callback.map());
return AjaxResult.success(userMap);
}
/**
* 用户信息
*
* @param id id
* @return {@link AjaxResult}
*/
@RequestMapping("/userInfo/{id}")
public AjaxResult userInfo(@PathVariable Long id) {
if (!AuthUtil.hasAnyRole("admin,A06,H04,unionGroupLeader") && !SecurityUtils.getUserId().equals(id)) {
return AjaxResult.warn("没有权限");
}
SysUser user = dao.fetch(SysUser.class, Cnd.where("userId", "=", id));
user.setPassword(null);
return AjaxResult.success(user);
}
/**
* 用户信息2
*
* @param id id
* @return {@link AjaxResult}
*/
@RequestMapping("/userInfo2/{id}")
public AjaxResult userInfo2(@PathVariable Long id) {
if (!AuthUtil.hasAnyRole("admin,A06,H04,unionGroupLeader") && !SecurityUtils.getUserId().equals(id)) {
return AjaxResult.warn("没有权限");
}
Sql sql = Sqls.create("select * from user where userId = @userId");
sql.setParam("userId", id);
Object user = Daos.query(dao, sql.toString(), Sqls.callback.map());
return AjaxResult.success(user);
}
/**
* 更新成员
*
* @param user 用户
* @return {@link AjaxResult}
*/
@PostMapping("/updateMember")
public AjaxResult updateMember(@RequestBody SysUser user) {
if (!AuthUtil.hasAnyRole("admin,A06,H04,unionGroupLeader") && !SecurityUtils.getUserId().equals(user.getUserId())) {
return AjaxResult.warn("没有权限");
}
dao.updateIgnoreNull(user);
return AjaxResult.success();
}
/**
* 补充成员
*
* @param user 用户
* @return {@link AjaxResult}
*/
@PostMapping("/supplementMember")
@RequiresPermissions("member:info:supplement")
public AjaxResult supplementMember(@RequestBody SysUser user) {
if (dao.count(SysUser.class, Cnd.where("userName", "=", user.getUserName())) > 0) {
return AjaxResult.warn("用户名已存在");
}
memberService.supplementMember(user);
return AjaxResult.success();
}
@PostMapping("/hyPageData")
public AjaxResult hyPageData(@RequestParam(required = false) String unitid,
@RequestParam(required = false) String unionid,
@RequestBody PageForm page){
try {
Sql sql = Sqls.create("SELECT u.userId,u.userName,u.loginName,u.sex,u.deptName,u.mobile from member u $condition");
Cnd cnd = Cnd.NEW();
cnd.andEX("u.unionId", "=", unionid);
if (Strings.isNotBlank(unitid)) {
cnd.and("u.deptId", "=", unitid);
}
if (Strings.isNotBlank(page.getSearchName()) && Strings.isNotBlank(page.getSearchKeyword())) {
cnd.where().andLike(page.getSearchName(), page.getSearchKeyword());
}
if (StrUtil.isNotBlank(page.getPageOrderName()) && StrUtil.isNotBlank(page.getPageOrderBy())) {
cnd.orderBy(page.getPageOrderName(), page.getPageOrderBy().equalsIgnoreCase("ascending") ? "ASC" : "DESC");
} else {
cnd.asc("u.deptId");
}
sql.setCondition(cnd);
return AjaxResult.success(memberService.listPage(page.getPageNumber(), page.getPageSize(), sql));
}catch (Exception e){
e.printStackTrace();
return AjaxResult.error();
}
}
}
@@ -0,0 +1,168 @@
package com.ruoyi.member.controller.dashBoard;
import cn.hutool.core.util.NumberUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.member.api.constant.MemberMode;
import com.ruoyi.member.service.MemberHistoryService;
import com.ruoyi.system.api.domain.SysUser;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
/**
* @ClassName MemberDashBoardController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/20 15:10
* @Version 1.0
*/
@RestController
@RequestMapping("/dashBoard")
public class MemberDashBoardController {
@Autowired
private MemberHistoryService memberHistoryService;
@Autowired
private Dao dao;
/**
* 今年和去年的会员数
*
* @return
*/
@RequestMapping("/memberNumber")
@RequiresPermissions("member:dashBoard:list")
public AjaxResult memberNumber() {
List<SysUser> member = dao.query(SysUser.class, Cnd.where("member", "=", MemberMode.NORMAL.getCode()));
long maleCount = member.stream().filter(v -> null != v.getSex() && v.getSex().equals("0")).count();
long femaleCount = member.stream().filter(v -> null != v.getSex() && v.getSex().equals("1")).count();
int year = Calendar.getInstance().get(Calendar.YEAR);
int lastYearMemberNum = dao.count("member_his", Cnd.where("year", "=", year - 1));
Map<String, Integer> map = Map.of("memberNum", member.size(), "lastYearMemberNum", lastYearMemberNum,
"maleCount", (int) maleCount, "femaleCount", (int) femaleCount);
return AjaxResult.success(map);
}
/**
* 会员增长趋势
*
* @return
*/
@RequestMapping("/growthTrend")
@RequiresPermissions("member:dashBoard:list")
public AjaxResult growthTrend() {
List<Map> result = new ArrayList<>();
int year = Calendar.getInstance().get(Calendar.YEAR);
for (int i = year - 5; i < year; i++) {
int count = memberHistoryService.count(Sqls.create("select * from member_his where year = @year ").setParam("year", year));
result.add(Map.of("label", i, "value", count));
}
result.add(Map.of("label", year, "value", memberHistoryService.count(Sqls.create("select count(1) from member"))));
return AjaxResult.success(result);
}
/**
* 会员占比
*
* @return
*/
@RequestMapping("/memberPercentage")
@RequiresPermissions("member:dashBoard:list")
public Object memberPercentage() {
int member = memberHistoryService.count(Sqls.create("select count(1) from member"));
int user = memberHistoryService.count(Sqls.create("select count(1) from sys_user"));
return AjaxResult.success(NumberUtil.div(member, user, 2));
}
/**
* 男女占比
*
* @return
*/
@RequestMapping("/memberSexPercentage")
@RequiresPermissions("member:dashBoard:list")
public AjaxResult memberSexPercentage() {
int men = memberHistoryService.count(Sqls.create("select count(1) from member where sex = '0' "));
int women = memberHistoryService.count(Sqls.create("select count(1) from member where sex = '1' "));
return AjaxResult.success(List.of(Map.of("type", "", "value", men), Map.of("type", "", "value", women)));
}
/**
* 各工会会员数
*
* @return
*/
@RequestMapping("/unionMember")
@RequiresPermissions("member:dashBoard:list")
public AjaxResult unionMember() {
Sql sql = Sqls.create("""
SELECT
gh.unionName,
gh.unionCode,
( SELECT count( 1 ) FROM member WHERE unionId = gh.id ) AS `value`\s
FROM
sys_union gh\s
ORDER BY
gh.unionCode
""");
List<NutMap> list = memberHistoryService.listMap(sql);
return AjaxResult.success(list);
}
/**
* 根据人员类型查找会员数
*
* @return
*/
@RequestMapping("/personTypeMember")
@RequiresPermissions("member:dashBoard:list")
public AjaxResult personTypeMember() {
Sql sql = Sqls.create("""
SELECT
dict.dict_label as label,
( SELECT count( 1 ) FROM member WHERE personType = dict.dict_value ) as `value`
FROM
sys_dict_data dict\s
WHERE
dict.dict_type = 'user_type'\s
ORDER BY
dict.dict_sort
""");
return AjaxResult.success(memberHistoryService.list(sql));
}
/**
* 根据在职状态查找会员数
*
* @return
*/
@RequestMapping("/userStateMember")
@RequiresPermissions("member:dashBoard:list")
public AjaxResult userStateMember() {
Sql sql = Sqls.create("""
SELECT
dict.dict_label as `label`,
( SELECT count( 1 ) FROM member WHERE personType = dict.dict_value ) as `value`
FROM
sys_dict_data dict\s
WHERE
dict.dict_type = 'user_type'\s
ORDER BY
dict.dict_sort
""");
return AjaxResult.success(memberHistoryService.list(sql));
}
}
@@ -0,0 +1,343 @@
package com.ruoyi.member.controller.info;
import cn.hutool.core.util.StrUtil;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.*;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.service.MemberHistoryService;
import com.ruoyi.system.api.domain.SysUser;
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.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName MemberDataManageController
* @Description TODO
* @Author zhf
* @Date 2023/8/24 10:55
*/
@RestController
@RequestMapping("/info/dataManage")
public class MemberDataManageController {
@Autowired
private MemberHistoryService memberHistoryService;
@Autowired
private Dao dao;
@PostMapping("/pageData")
@RequiresPermissions("member:info:dataManage")
public AjaxResult pageData(@RequestBody PageForm pageForm,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) String unitId,
@RequestParam(required = false) String threeUnitId,
@RequestParam(required = false) String unionGroupId,
@RequestParam(required = false) String personType,
@RequestParam(required = false) String userState,
@RequestParam(required = false) String campus,
@RequestParam(required = false) String startLoginNames,
@RequestParam(required = false) String endLoginNames,
@RequestParam(name = "personTypes[]", required = false) String[] personTypes,
@RequestParam(name = "userStates[]", required = false) String[] userStates
) {
Sql sql = Sqls.create("""
SELECT
userId,
loginName,
userName,
sex,
member,
welfareMember,
personType,
userState,
unionCode,
unionName,
unionId,
deptName,
deptCode,
deptId,
threeDeptName,
threeDeptCode,
unionGroupName,
mobile,
birthday
from
`user`
$condition
""");
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("userName", pageForm.getSearchKeyword());
seg.orLike("loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), SqlUtil.getOrderBy(pageForm.getPageOrderBy()));
} else {
cnd.desc("member");
}
cnd.andEX("unionId", "=", unionId);
cnd.andEX("deptId", "=", unitId);
cnd.andEX("threeDeptId", "=", threeUnitId);
cnd.andEX("unionGroupId", "=", unionGroupId);
cnd.andEX("personType", "=", personType);
cnd.andEX("userState", "=", userState);
cnd.andEX("personType", "in", personTypes);
cnd.andEX("userState", "in", userStates);
if (StrUtil.isNotBlank(startLoginNames)) {
String[] loginNames = startLoginNames.split(",");
SqlExpressionGroup seg = new SqlExpressionGroup();
for (String loginName : loginNames) {
seg.orLikeL("loginName", loginName);
}
cnd.and(seg);
}
if (StrUtil.isNotBlank(endLoginNames)) {
String[] loginNames = endLoginNames.split(",");
SqlExpressionGroup seg = new SqlExpressionGroup();
for (String loginName : loginNames) {
seg.orLikeR("loginName", loginName);
}
cnd.and(seg);
}
if (!AuthUtil.hasAnyRoles("admin,A06,H03")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
} else {
cnd.and("unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
}
}
sql.setCondition(cnd);
return AjaxResult.success(memberHistoryService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql));
}
@Transactional
@PostMapping("/setBirthdayByIdCard")
@RequiresPermissions("member:info:dataManage")
public AjaxResult setBirthdayByIdCard() {
dao.update(Sqls.create("""
UPDATE sys_user
SET birthday = STR_TO_DATE(SUBSTRING(idcard, 7, 8), '%Y%m%d')
WHERE (birthday IS NULL OR birthday = '') AND length(idCard)=18
"""));
return AjaxResult.success();
}
@DSTransactional
@PostMapping("/setMemberByCnd")
@RequiresPermissions("member:info:dataManage")
public AjaxResult setMemberByCnd(@RequestBody PageForm pageForm,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) String unitId,
@RequestParam(required = false) String threeUnitId,
@RequestParam(required = false) String unionGroupId,
@RequestParam(required = false) String personType,
@RequestParam(required = false) String userState,
@RequestParam(required = false) String campus,
@RequestParam(required = false) String startLoginNames,
@RequestParam(required = false) String endLoginNames,
@RequestParam(name = "personTypes[]", required = false) String[] personTypes,
@RequestParam(name = "userStates[]", required = false) String[] userStates) {
Sql sql = Sqls.create("SELECT userId from `user` $condition");
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("userName", pageForm.getSearchKeyword());
seg.orLike("loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
cnd.andEX("unionId", "=", unionId);
cnd.andEX("DeptId", "=", unitId);
cnd.andEX("threeDeptId", "=", threeUnitId);
cnd.andEX("unionGroupId", "=", unionGroupId);
cnd.andEX("personType", "=", personType);
cnd.andEX("userState", "=", userState);
cnd.andEX("personType", "in", personTypes);
cnd.andEX("userState", "in", userStates);
if (StrUtil.isNotBlank(startLoginNames)) {
String[] loginNames = startLoginNames.split(",");
SqlExpressionGroup seg = new SqlExpressionGroup();
for (String loginName : loginNames) {
seg.orLikeL("loginName", loginName);
}
cnd.and(seg);
}
if (StrUtil.isNotBlank(endLoginNames)) {
String[] loginNames = endLoginNames.split(",");
SqlExpressionGroup seg = new SqlExpressionGroup();
for (String loginName : loginNames) {
seg.orLikeR("loginName", loginName);
}
cnd.and(seg);
}
if (!AuthUtil.hasAnyRoles("admin,A06,H03")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("unionid", "=", SecurityUtils.getUnionId());
} else {
cnd.and("unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
}
}
cnd.and(Cnd.exps("member", "=", MemberMode.NONE.getCode()).or("member", "is", null));
sql.setCondition(cnd);
List<NutMap> mapList = memberHistoryService.listMap(sql);
List<Long> userList = mapList.stream().map(v -> v.getLong("userId")).collect(Collectors.toList());
Long[] userIds = userList.toArray(new Long[0]);
//批量设置会员
UserMode.addMemberRole(userIds);
Audit audit = new Audit();
audit.setAuditPass(true);
audit.setAuditOpinion("数据管理工具" + MemberOrigin.BATCH.getDescription());
dao.insert(audit);
List<MemberChangeRecord> insertMemberChangeRecords = Arrays.stream(userIds).map(v -> {
MemberChangeRecord record = new MemberChangeRecord();
record.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
record.setType(UserChangeType.RESTORE.getCode());
record.setUserId(v);
record.setApplyTime(new Date());
record.setApplyOrigin(MemberChangeOrigin.SCHOOL.getCode());
record.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
record.setStateId(MemberChangeApplyState.SUCCESS);
record.setSchoolAuditId(audit.getId());
return record;
}).collect(Collectors.toList());
dao.insert(insertMemberChangeRecords);
return AjaxResult.success();
}
@DSTransactional
@PostMapping("/setWelfareMemberByCnd")
@RequiresPermissions("member:info:dataManage")
public AjaxResult setWelfareMemberByCnd(@RequestBody PageForm pageForm,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) String unitId,
@RequestParam(required = false) String threeUnitId,
@RequestParam(required = false) String unionGroupId,
@RequestParam(required = false) String personType,
@RequestParam(required = false) String userState,
@RequestParam(required = false) String campus,
@RequestParam(required = false) String startLoginNames,
@RequestParam(required = false) String endLoginNames,
@RequestParam(name = "personTypes[]", required = false) String[] personTypes,
@RequestParam(name = "userStates[]", required = false) String[] userStates) {
Sql sql = Sqls.create("SELECT userId from `user` $condition");
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("userName", pageForm.getSearchKeyword());
seg.orLike("loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
cnd.andEX("unionId", "=", unionId);
cnd.andEX("DeptId", "=", unitId);
cnd.andEX("threeDeptId", "=", threeUnitId);
cnd.andEX("unionGroupId", "=", unionGroupId);
cnd.andEX("personType", "=", personType);
cnd.andEX("userState", "=", userState);
cnd.andEX("personType", "in", personTypes);
cnd.andEX("userState", "in", userStates);
if (StrUtil.isNotBlank(startLoginNames)) {
String[] loginNames = startLoginNames.split(",");
SqlExpressionGroup seg = new SqlExpressionGroup();
for (String loginName : loginNames) {
seg.orLikeL("loginName", loginName);
}
cnd.and(seg);
}
if (StrUtil.isNotBlank(endLoginNames)) {
String[] loginNames = endLoginNames.split(",");
SqlExpressionGroup seg = new SqlExpressionGroup();
for (String loginName : loginNames) {
seg.orLikeR("loginName", loginName);
}
cnd.and(seg);
}
if (!AuthUtil.hasAnyRoles("admin,A06,H03")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("unionid", "=", SecurityUtils.getUnionId());
} else {
cnd.and("unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
}
}
cnd.and(Cnd.exps("welfareMember", "=", MemberMode.NONE.getCode()).or("welfareMember", "is", null));
sql.setCondition(cnd);
List<NutMap> mapList = memberHistoryService.listMap(sql);
List<Long> userList = mapList.stream().map(v -> v.getLong("userId")).collect(Collectors.toList());
Long[] userIds = userList.toArray(new Long[0]);
dao.update(SysUser.class, Chain.make("welfareMember", MemberMode.NORMAL.getCode())
.add("welfareMemberJoinTime", new Date()),
Cnd.where("userId", "in", userIds).and("welfareMember", "is not", null).and("welfareMember", "!=", 1));
Audit audit = new Audit();
audit.setAuditPass(true);
audit.setAuditOpinion("数据管理工具" + MemberOrigin.BATCH.getDescription());
dao.insert(audit);
List<MemberChangeRecord> insertMemberChangeRecords = Arrays.stream(userIds).map(v -> {
MemberChangeRecord record = new MemberChangeRecord();
record.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
record.setType(UserChangeType.RESTORE.getCode());
record.setUserId(v);
record.setApplyTime(new Date());
record.setApplyOrigin(MemberChangeOrigin.SCHOOL.getCode());
record.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
record.setStateId(MemberChangeApplyState.SUCCESS);
record.setSchoolAuditId(audit.getId());
return record;
}).collect(Collectors.toList());
dao.insert(insertMemberChangeRecords);
return AjaxResult.success();
}
}
@@ -0,0 +1,651 @@
package com.ruoyi.member.controller.info;
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.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.IdcardUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.constant.Roles;
import com.ruoyi.common.core.domain.TableColumn;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.security.annotation.Logical;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.annotation.RequiresRoles;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.MemberComparisonTemp;
import com.ruoyi.member.api.constant.MemberMode;
import com.ruoyi.member.api.constant.MemberPageForm;
import com.ruoyi.member.api.constant.UserMode;
import com.ruoyi.member.service.MemberHistoryService;
import com.ruoyi.member.service.MemberService;
import com.ruoyi.member.service.MemberStatisticQueryService;
import com.ruoyi.system.api.RemoteDictService;
import com.ruoyi.system.api.domain.SysDept;
import com.ruoyi.system.api.domain.SysDictData;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.domain.SysUserRole;
import com.ruoyi.system.api.domain.data.UserSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.*;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.Daos;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.AdaptBy;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* @ClassName MemberInfoArchivesController
* @Description 会员档案管理
* @Author zhaoxinyu
* @Date 2022/12/19 10:53
* @Version 1.0
*/
@RestController
@RequestMapping("/info/archives")
@Slf4j
public class MemberInfoArchivesController {
@Autowired
private MemberHistoryService memberHistoryService;
@Autowired
private MemberStatisticQueryService memberStatisticQueryService;
@Autowired
private MemberService memberService;
@Autowired
private RemoteDictService remoteDictService;
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
/**
* year年是否备份过
*/
@GetMapping("/getMemberHistoryNum/{year}")
@RequiresPermissions("member:info:archives")
public AjaxResult getMemberHistoryNum(@PathVariable("year") Integer year) {
return AjaxResult.success(memberHistoryService.count(Cnd.where("year", "=", year)));
}
/**
* 存档
*/
@PostMapping("/doArchive")
@RequiresPermissions("member:info:archives")
@Log(title = "会员-高级管理-备份会员", businessType = BusinessType.INSERT)
public AjaxResult doArchive(@RequestParam Integer year) {
memberHistoryService.archive(year);
return AjaxResult.success();
}
@PostMapping("/pageData")
@RequiresPermissions("member:info:archives")
public AjaxResult pageData(@RequestBody MemberPageForm pageForm) {
Sql sql = Sqls.create("SELECT * from `user` $condition");
Cnd cnd = Cnd.NEW();
cnd.andEX("unionId", "=", pageForm.getUnionId());
cnd.andEX("deptId", "=", pageForm.getUnitId());
cnd.andEX("unionGroupId", "=", pageForm.getUnionGroupId());
cnd.andEX("threeUnitId", "=", pageForm.getThreeUnitId());
cnd.andEX("sex", "=", pageForm.getSex());
cnd.andEX("personType", "in", pageForm.getPersonTypes());
cnd.andEX("userState", "in", pageForm.getUserStates());
cnd.andEX("member", "=", MemberMode.NORMAL.getCode());
if (!AuthUtil.hasAnyRoles("admin,A06")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
cnd.and("unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
}
}
if (StrUtil.isNotBlank(pageForm.getRetireTime())) {
cnd.and("DATE_FORMAT(retireTime, '%Y-%m')", "=", pageForm.getRetireTime());
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), SqlUtil.getOrderBy(pageForm.getPageOrderBy()));
} else {
cnd.asc("unionId");
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("userName", pageForm.getSearchKeyword());
seg.orLike("loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), pageForm.getPageOrderBy());
} else {
cnd.asc("loginName");
cnd.asc("userState");
}
sql.setCondition(cnd);
Pagination pagination = memberHistoryService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> list = pagination.getList();
for (NutMap nutMap : list) {
if(!SecurityUtils.isAdmin()) {
nutMap.put("idcard", "******");
}
}
pagination.setList(list);
return AjaxResult.success(pagination);
}
/**
* 更新身份证生日
*
* @return {@link AjaxResult}
*/
@RequestMapping("updateBirthdayByIdCard")
@RequiresPermissions("member:info:archives")
public AjaxResult updateBirthdayByIdCard() {
FieldFilter fieldFilter = FieldFilter.create(SysUser.class, "userId|idcard|birthday");
Dao extDao = Daos.ext(memberStatisticQueryService.dao(), fieldFilter);
List<SysUser> users = extDao.query(SysUser.class, Cnd.where("idcard", "is not", null).and("idcard", "!=", ""));
users.forEach(u -> {
DateTime birthDate = IdcardUtil.getBirthDate(u.getIdcard());
u.setBirthday(birthDate);
});
List<List<SysUser>> avgList = ListUtil.splitAvg(users, 10);
avgList.forEach(a -> {
threadPoolTaskExecutor.execute(() -> extDao.update(a, fieldFilter));
});
return AjaxResult.success();
}
@PostMapping("/exportMember")
@RequiresPermissions("member:info:archives")
public void exportMember(HttpServletResponse response, @RequestBody MemberPageForm pageForm) {
try (ServletOutputStream outputStream = response.getOutputStream()) {
List<NutMap> memberList = memberStatisticQueryService.exportList(pageForm);
List<ExcelExportEntity> entityList = new ArrayList<>();
List<SysDictData> dictDataList = memberStatisticQueryService.dao().query(SysDictData.class, Cnd.where("dictType", "in", new String[]{"sys_user_sex", "user_type", "user_state"}));
String[] sys_user_sexes = dictDataList.stream().filter(v -> v.getDictType().equals("sys_user_sex")).map(v -> v.getDictLabel() + "_" + v.getDictValue()).toArray(String[]::new);
String[] user_types = dictDataList.stream().filter(v -> v.getDictType().equals("user_type")).map(v -> v.getDictLabel() + "_" + v.getDictValue()).toArray(String[]::new);
String[] user_states = dictDataList.stream().filter(v -> v.getDictType().equals("user_state")).map(v -> v.getDictLabel() + "_" + v.getDictValue()).toArray(String[]::new);
for (TableColumn prop : pageForm.getProps()) {
if(!SecurityUtils.isAdmin() && "idcard".equals(prop.getProp())) {
continue;
}
ExcelExportEntity excelExportEntity = new ExcelExportEntity(prop.getLabel(), prop.getProp(), 20);
switch (prop.getProp()) {
case "sex" -> {
excelExportEntity.setAddressList(true);
excelExportEntity.setReplace(ArrayUtil.append(sys_user_sexes, "_null"));
}
case "personType" -> {
excelExportEntity.setAddressList(true);
excelExportEntity.setReplace(ArrayUtil.append(user_types, "_null"));
}
case "userState" -> {
excelExportEntity.setAddressList(true);
excelExportEntity.setReplace(ArrayUtil.append(user_states, "_null"));
}
default -> {
}
}
entityList.add(excelExportEntity);
}
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, memberList);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=%s".formatted(URLEncoder.encode("会员信息.xlsx", StandardCharsets.UTF_8)));
workbook.write(outputStream);
workbook.close();
} catch (Exception e) {
e.printStackTrace();
log.error("会员存档固定格式导出失败{}", e.getMessage());
}
}
/**
* 下载模板
*
* @param response 响应
* @return {@link AjaxResult}
*/
@PostMapping("/downLoadTemplate")
@RequiresPermissions("member:info:archives")
public void downLoadTemplate(HttpServletResponse response) {
try (ServletOutputStream outputStream = response.getOutputStream()) {
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
List<ExcelExportEntity> entityList = new ArrayList<>();
entityList.add(new ExcelExportEntity("工号", "userName", 20));
entityList.add(new ExcelExportEntity("姓名", "nickName", 20));
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, new ArrayList<>());
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=%s".formatted(URLEncoder.encode("会员比对导入模板.xlsx", StandardCharsets.UTF_8)));
workbook.write(outputStream);
workbook.close();
} catch (Exception e) {
log.error("下载模板失败{}", e.getMessage());
}
}
@PostMapping("/importComparison")
@RequiresPermissions("member:info:archives")
@RequiresRoles(value = {"admin", "A06"}, logical = Logical.OR)
public AjaxResult importComparison(@RequestParam MultipartFile file) {
try {
//获取文件数据
List<MemberComparisonTemp> memberImportList = ExcelImportUtil.importExcel(file.getInputStream(), MemberComparisonTemp.class, new ImportParams());
//工号为空,错误记录
List<MemberComparisonTemp> loginNameNullList = memberImportList.stream().filter(v -> Strings.isBlank(v.getUserName())).collect(Collectors.toList());
//工号不为空的人员
List<String> hasLoginNameList = memberImportList.stream().filter(member -> StrUtil.isNotBlank(member.getUserName())).map(member -> member.getUserName().trim()).collect(Collectors.toList());
List<MemberComparisonTemp> memberTempList = memberImportList.stream().filter(v -> Strings.isNotBlank(v.getUserName())).collect(Collectors.toList());
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasAnyRole("admin,A06")) {
if (AuthUtil.hasAnyRoles("H04,gh01")) {
cnd.and("dept_id", "in", Sqls.create("select dept_id from sys_dept where union_id = @unionId").setParam("unionId", SecurityUtils.getUnionId()));
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("threeUnitId", "in", Sqls.create("select dept_id from sys_dept where union_group_id = @union_group_id").setParam("union_group_id", SecurityUtils.getUnionGroupId()));
}
}
List<SysUser> userList = memberHistoryService.dao().query(SysUser.class, cnd);
//系统用户,判断是否存在
// Map<String, Sys_user> userMap = userList.stream().collect(Collectors.toMap(Sys_user::getLoginname, v -> v));
List<String> userLoginNameList = userList.stream().map(SysUser::getUserName).collect(Collectors.toList());
//错误记录
loginNameNullList.forEach(v -> {
v.setErrorInfo("工号为空,查询不到此用户!");
});
List<MemberComparisonTemp> errorInfos = new ArrayList<>(loginNameNullList);
//查会员
List<SysUser> memberUserList = userList.stream().filter(v -> Lang.isNotEmpty(v.getMember()) && v.getMember() == 1).collect(Collectors.toList());
//系统中为会员,导入名单中不存在
List<SysUser> users = memberUserList.stream().filter(v -> !hasLoginNameList.contains(v.getUserName())).collect(Collectors.toList());
users.forEach(v -> {
MemberComparisonTemp memberTemp = new MemberComparisonTemp();
memberTemp.setUserName(v.getUserName());
memberTemp.setNickName(v.getNickName());
memberTemp.setErrorInfo("系统中为会员,导入名单中不存在");
errorInfos.add(memberTemp);
});
//查非会员
List<SysUser> unMemberList = userList.stream().filter(v -> v.getMember() == null || v.getMember() != 1).collect(Collectors.toList());
List<String> unMemberLoginNameList = unMemberList.stream().map(SysUser::getUserName).collect(Collectors.toList());
memberTempList.forEach(v -> {
if (userLoginNameList.contains(v.getUserName().trim())) {
if (!unMemberLoginNameList.contains(v.getUserName().trim())) {
v.setErrorInfo("名单中是会员,系统中不是会员");
}
} else {
//获取不到该工号
v.setErrorInfo("系统中不存在此用户");
}
});
if (Lang.isNotEmpty(errorInfos)) {
NutMap nutMap = NutMap.NEW();
nutMap.setv("totalCount", memberImportList.size());
nutMap.setv("errorCount", errorInfos.size());
nutMap.setv("errorList", errorInfos.stream().map(v -> {
return NutMap.NEW().addv("工号", v.getUserName()).addv("姓名", v.getNickName()).addv("错误原因", v.getErrorInfo());
}).collect(Collectors.toList()));
return AjaxResult.success("比对成功", nutMap);
}
return AjaxResult.success();
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error();
}
}
/**
* 下载模板
*
* @param response 响应
* @return {@link AjaxResult}
*/
@PostMapping("/downLoadMemberTemplate")
@RequiresPermissions("member:info:archives")
public void downLoadMemberTemplate(HttpServletResponse response) {
try (ServletOutputStream outputStream = response.getOutputStream()) {
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
List<ExcelExportEntity> entityList = new ArrayList<>();
entityList.add(new ExcelExportEntity("工号", "userName", 20));
entityList.add(new ExcelExportEntity("姓名", "nickName", 20));
entityList.add(new ExcelExportEntity("性别", "sex", 10));
entityList.add(new ExcelExportEntity("联系方式", "mobile", 10));
entityList.add(new ExcelExportEntity("身份证号", "idCard", 30));
entityList.add(new ExcelExportEntity("在职状态", "userState", 20));
entityList.add(new ExcelExportEntity("人员类型", "personType", 20));
entityList.add(new ExcelExportEntity("单位编号", "deptCode", 20));
entityList.add(new ExcelExportEntity("单位名称", "deptName", 20));
entityList.add(new ExcelExportEntity("科室编号", "threeUnitCode", 20));
entityList.add(new ExcelExportEntity("科室名称", "threeUnitName", 20));
entityList.add(new ExcelExportEntity("是否会员", "isMember", 20));
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, new ArrayList<>());
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=%s".formatted(URLEncoder.encode("会员导入模板.xlsx", StandardCharsets.UTF_8)));
workbook.write(outputStream);
workbook.close();
} catch (Exception e) {
log.error("下载模板失败{}", e.getMessage());
}
}
@PostMapping("/importMember")
@RequiresPermissions("member:info:archives")
@RequiresRoles(value = {"admin", "A06"}, logical = Logical.OR)
@Aop(TransAop.READ_COMMITTED)
public AjaxResult importMember(@RequestParam MultipartFile file, @RequestParam boolean isFlag) {
try {
List<MemberComparisonTemp> memberImportList = ExcelImportUtil.importExcel(file.getInputStream(), MemberComparisonTemp.class, new ImportParams());
//获取系统用户
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasAnyRole("admin,A06")) {
if (AuthUtil.hasAnyRoles("H04,gh01")) {
cnd.and("dept_id", "in", Sqls.create("select dept_id from sys_dept where union_id = @unionId").setParam("unionId", SecurityUtils.getUnionId()));
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("threeUnitId", "in", Sqls.create("select dept_id from sys_dept where union_group_id = @union_group_id").setParam("union_group_id", SecurityUtils.getUnionGroupId()));
}
}
List<SysUser> dataUserList = memberHistoryService.dao().query(SysUser.class, cnd);
Map<String, SysUser> userMap = dataUserList.stream().collect(Collectors.toMap(SysUser::getUserName, v -> v));
List<SysDept> unitList = memberHistoryService.dao().query(SysDept.class, Cnd.where("unit_level", "is not", null).and("unit_level", "!=", ""));
//单位名称,单位Id
Map<String, Long> unitNameLevelTwoMap = unitList.stream().filter(v -> v.getUnitLevel() == 2).collect(Collectors.toMap(SysDept::getDeptName, SysDept::getDeptId));
//单位编号,单位Id
Map<String, Long> unitCodeMap = unitList.stream().collect(Collectors.toMap(SysDept::getDeptCode, SysDept::getDeptId));
//性别
Map<String, String> sexMap = remoteDictService.dictType("sys_user_sex").getData().stream().collect(Collectors.toMap(v -> v.getDictLabel(), v -> v.getDictValue()));
//在职状态
Map<String, String> userStateMap = remoteDictService.dictType("user_state").getData().stream().collect(Collectors.toMap(v -> v.getDictLabel(), v -> v.getDictValue()));
//人员类型
Map<String, String> personTypeMap = remoteDictService.dictType("user_type").getData().stream().collect(Collectors.toMap(v -> v.getDictLabel(), v -> v.getDictValue()));
//系统中有此用户,修改
List<Long> needUpdateUserIds = new ArrayList<>();
//系统中没有,新增
List<String> needInsertUser = new ArrayList<>();
//赋予角色
List<SysUserRole> userRoles = new ArrayList<>();
//返回错误记录
List<MemberComparisonTemp> errorInfos = new ArrayList<>();
List<SysUser> insertOrUpdateUserList = new ArrayList<>();
//需要删除掉会员角色的用户id集合
List<Long> removeMemberUserIds = new ArrayList<>();
for (MemberComparisonTemp v : memberImportList) {
if (StrUtil.isNotBlank(v.getUserName())) {
v.setUserName(v.getUserName().trim());
} else {
v.setErrorInfo("工号不能为空!");
continue;
}
Long deptId = memberService.getDeptId(unitCodeMap, unitNameLevelTwoMap, v.getDeptCode(), v.getDeptName());
if (deptId == null) {
v.setErrorInfo("单位编号或单位名称有误,请确保其准确!");
errorInfos.add(v);
continue;
}
//判断在职状态合法
if (StrUtil.isNotBlank(v.getUserState()) && !userStateMap.containsKey(v.getUserState())) {
Set<String> userStateKeys = userStateMap.keySet();
v.setErrorInfo("在职状态有误,请确保其准确!【" + String.join(",", userStateKeys) + "");
errorInfos.add(v);
continue;
}
//判断人员类型合法
if (StrUtil.isNotBlank(v.getPersonType()) && !personTypeMap.containsKey(v.getPersonType())) {
Set<String> personTypeKeys = personTypeMap.keySet();
v.setErrorInfo("人员类型有误,请确保其准确!【" + String.join(",", personTypeKeys) + "");
errorInfos.add(v);
continue;
}
Map<String, Long> unitNameLevelThreeMap = unitList.stream().filter(item -> item.getParentId().equals(deptId) && item.getUnitLevel() == 3).collect(Collectors.toMap(SysDept::getDeptName, SysDept::getDeptId));
// 获取三级单位ID
Long threeUnitId = memberService.getDeptId(unitCodeMap, unitNameLevelThreeMap, v.getThreeUnitCode(), v.getThreeUnitName());
if (threeUnitId == null) {
String threeUnitNames = unitList.stream().filter(x -> x.getParentId().equals(deptId)).map(SysDept::getDeptName).collect(Collectors.joining(";"));
v.setErrorInfo("科室编号或科室名称有误,请确保其准确!【" + threeUnitNames + "");
errorInfos.add(v);
continue;
}
if (v.getIsMember() == null) {
v.setErrorInfo("是否会员不能为空,请填写是或否");
errorInfos.add(v);
continue;
}
//判断是否在系统中
SysUser user = userMap.get(v.getUserName());
//初始化用户
if (user == null) {
user = new SysUser();
UserMode.initUser(user);
needInsertUser.add(user.getUserName());
}
//设置excel列的数据
user.setNickName(v.getNickName());
if(StrUtil.isNotBlank(v.getSex())) user.setSex(StrUtil.blankToDefault(sexMap.get(v.getSex()), "2"));
if (StrUtil.isNotBlank(v.getMobile())) user.setMobile(v.getMobile());
if (StrUtil.isNotBlank(v.getIdCard())) user.setIdcard(v.getIdCard());
if (StrUtil.isNotBlank(v.getPersonType())) user.setPersonType(personTypeMap.get(v.getPersonType()));
if (StrUtil.isNotBlank(v.getUserState())) user.setUserState(userStateMap.get(v.getUserState()));
user.setDeptId(deptId);
user.setThreeUnitId(threeUnitId);
user.setMember("".equals(v.getIsMember()) ? 1 : 0);
insertOrUpdateUserList.add(user);
}
List<List<SysUser>> splitInsertOrUpdateUserList = ListUtil.split(insertOrUpdateUserList, 500);
AtomicInteger count = new AtomicInteger(splitInsertOrUpdateUserList.size());
CountDownLatch latch = new CountDownLatch(count.get());
for (List<SysUser> splitUserSource : splitInsertOrUpdateUserList) {
threadPoolTaskExecutor.execute(() -> {
try {
memberService.dao().insertOrUpdate(splitUserSource);
} catch (Exception e) {
log.error("Error inserting user sources", e);
} finally {
latch.countDown();
}
});
}
try {
latch.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
//删除会员角色
memberService.dao().clear(SysUserRole.class, Cnd.where("roleId", "=", Roles.MEMBER));
//新增用户赋值普通角色
if (Lang.isNotEmpty(needInsertUser)) {
Sql newUserSql = Sqls.create("select user_id from sys_user where username in (@needInsertUser)");
newUserSql.setParam("needInsertUser", needInsertUser);
newUserSql.setCallback(Sqls.callback.maps());
memberService.dao().execute(newUserSql);
List<NutMap> newUserSqlList = newUserSql.getList(NutMap.class);
List<Long> newUserIds = newUserSqlList.stream().map(user -> user.getLong("user_id")).collect(Collectors.toList());
List<SysUserRole> newUserRoles = newUserIds.stream().map(userId -> {
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(userId);
sysUserRole.setRoleId(Roles.COMMON);
return sysUserRole;
}).collect(Collectors.toList());
memberService.dao().insert(newUserRoles);
}
//根据用户表的member添加会员角色
Sql memberUserSql = Sqls.create("select user_id from sys_user where member = 1");
memberUserSql.setCallback(Sqls.callback.maps());
memberService.dao().execute(memberUserSql);
List<NutMap> memberUserSqlList = memberUserSql.getList(NutMap.class);
List<Long> memberUserIds = memberUserSqlList.stream().map(user -> user.getLong("user_id")).collect(Collectors.toList());
List<SysUserRole> memberUserRoles = memberUserIds.stream().map(userId -> {
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(userId);
sysUserRole.setRoleId(Roles.MEMBER);
return sysUserRole;
}).collect(Collectors.toList());
// memberService.dao().insert(memberUserRoles);
List<List<SysUserRole>> splitMemberUserRoles = ListUtil.split(memberUserRoles, 500);
for (List<SysUserRole> memberUserRole : splitMemberUserRoles) {
threadPoolTaskExecutor.execute(() -> {
memberService.dao().insert(memberUserRole);
});
}
// //需要删除角色的用户ID
// List<Long> doCleanRoleUsers = needInsertUser.stream().map(SysUser::getUserId).collect(Collectors.toList());
// doCleanRoleUsers.addAll(needUpdateUserIds);
// memberHistoryService.dao().clear(SysUserRole.class, Cnd.where("userId", "in", doCleanRoleUsers).and("roleId", "=", Roles.MEMBER));
// //新增会员或者普通角色
// if (userRoles.size() >= 500) {
// memberService.largeQuantitiesInsert(userRoles, 1, false);
// } else {
// memberService.dao().insert(userRoles);
// }
//
// //系统中存在就修改
// memberService.dao().update(SysUser.class, Chain.make("member", 1), Cnd.where("user_id", "in", needUpdateUserIds));
// //系统中不存在就新增
// List<SysUser> insert = memberService.dao().insert(needInsertUser);
//
// //初始化没有userId,在此新增会员角色
// if (Lang.isNotEmpty(insert)) {
// List<SysUserRole> collect = insert.stream().map(v -> {
// SysUserRole sysUserRole = new SysUserRole();
// sysUserRole.setUserId(v.getUserId());
// sysUserRole.setRoleId(Roles.MEMBER);
// return sysUserRole;
// }).collect(Collectors.toList());
// memberService.dao().insert(collect);
// }
//
// if (needUpdateUser.size() > 500) {
// memberService.largeQuantitiesInsert(needInsertUser, 2, true);
// } else {
// memberService.dao().updateIgnoreNull(needUpdateUser);
// }
//
//
// if (isFlag) {
// List<String> importMemberLoginNames = memberImportList.stream().filter(member -> StrUtil.isNotBlank(member.getUserName())).map(member -> member.getUserName().trim()).collect(Collectors.toList());
// memberService.dao().update(SysUser.class, Chain.make("member", 0), Cnd.where(SysUser::getUserName, "not in", importMemberLoginNames));
// Sql deleteMemberRoleSql = Sqls.create("select user_id from sys_user where user_name not in (@importMemberLoginNames)");
// deleteMemberRoleSql.setParam("importMemberLoginNames", importMemberLoginNames);
// deleteMemberRoleSql.setCallback(Sqls.callback.maps());
// memberService.dao().execute(deleteMemberRoleSql);
// List<NutMap> memberRoleSqlList = deleteMemberRoleSql.getList(NutMap.class);
// Long[] deleteMemberRoleUserIds = memberRoleSqlList.stream().map(v -> v.getLong("user_id")).toArray(Long[]::new);
// UserMode.removeMemberRole(deleteMemberRoleUserIds);
// }
//如果有错误数据就返回给前端
if (org.nutz.lang.Lang.isNotEmpty(errorInfos)) {
NutMap nutMap = NutMap.NEW();
nutMap.setv("totalCount", memberImportList.size());
nutMap.setv("successCount", Math.max(memberImportList.size() - errorInfos.size(), 0));
nutMap.setv("errorCount", errorInfos.size());
nutMap.setv("errorList", errorInfos.stream().map(v -> {
return NutMap.NEW().addv("工号", v.getUserName()).addv("姓名", v.getNickName()).addv("错误原因", v.getErrorInfo());
}).collect(Collectors.toList()));
return AjaxResult.success(nutMap);
}
return AjaxResult.success("导入成功");
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
return AjaxResult.error();
}
}
}
@@ -0,0 +1,95 @@
package com.ruoyi.member.controller.info;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.MemberMode;
import com.ruoyi.member.service.MemberInfoBatchMakeService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @ClassName MemberInfoBatchMakeController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/19 14:45
* @Version 1.0
*/
@RestController
@RequestMapping("/info/batchMake")
public class MemberInfoBatchMakeController {
@Autowired
private MemberInfoBatchMakeService memberInfoBatchMakeService;
@PostMapping("/pageData")
@RequiresPermissions("member:info:batchMake")
public Object pageData(@RequestBody PageForm pageForm,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) Long unitId,
@RequestParam(required = false) String unionGroupId,
@RequestParam(required = false) Long threeUnitId,
@RequestParam(required = false) String personType,
@RequestParam(required = false) String userState,
@RequestParam(required = false) String campus) {
Sql sql = Sqls.create("SELECT * from `user` $condition");
Cnd cnd = Cnd.NEW();
cnd.and(Cnd.exps("member", "=", MemberMode.NONE.getCode()).or("member", "is", null));
cnd.andEX("unionId", "=", unionId);
cnd.andEX("deptId", "=", unitId);
cnd.andEX("unionGroupId", "=", unionGroupId);
cnd.andEX("threeUnitId", "=", threeUnitId);
cnd.andEX("personType", "=", personType);
cnd.andEX("userState", "=", userState);
cnd.andEX("campus", "=", campus);
if (!AuthUtil.hasAnyRoles("admin,A06")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
cnd.and("unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
}
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), SqlUtil.getOrderBy(pageForm.getPageOrderBy()));
} else {
cnd.asc("loginName");
cnd.asc("unionId");
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("userName", pageForm.getSearchKeyword());
seg.orLike("loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
sql.setCondition(cnd);
Pagination pagination = memberInfoBatchMakeService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return AjaxResult.success(pagination);
}
/**
* 批量设置会员
*
* @param userIds 用户ids
* @return
*/
@PostMapping("/joinMemberFamily")
@RequiresPermissions("member:info:batchMake")
public AjaxResult joinMemberFamily(@RequestBody Long[] userIds) {
memberInfoBatchMakeService.joinMemberFamily(userIds);
return AjaxResult.success();
}
}
@@ -0,0 +1,96 @@
package com.ruoyi.member.controller.info;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.service.MemberHistoryService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @ClassName MemberInfoHistoryController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/19 15:41
* @Version 1.0
*/
@RestController
@RequestMapping("/info/history")
public class MemberInfoHistoryController {
@Autowired
private MemberHistoryService memberHistoryService;
@PostMapping("/pageData")
@RequiresPermissions("member:info:history")
public Object pageData(@RequestBody PageForm pageForm,
@RequestParam Integer year,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) Long unitId,
@RequestParam(required = false) String unionGroupId,
@RequestParam(required = false) Long threeUnitId,
@RequestParam(required = false) String personType,
@RequestParam(required = false) String userState,
@RequestParam(required = false) String campus) {
Sql sql = Sqls.create("""
SELECT
u.userId,
u.loginName,
u.userName,
u.sex,
u.mobile,
u.personType,
u.userState,
u.deptName,
u.deptCode,
u.unionName,
u.unionCode
FROM
`member_his` u
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("u.year", "=", year);
cnd.andEX("u.deptId", "=", unitId);
cnd.andEX("u.unionId", "=", unionId);
cnd.andEX("u.unionGroupId", "=", unionGroupId);
cnd.andEX("u.threeUnitId", "=", threeUnitId);
cnd.andEX("u.personType", "=", personType);
cnd.andEX("u.userState", "=", userState);
if (!AuthUtil.hasAnyRoles("admin,A06")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
cnd.and("unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
}
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword());
seg.orLike("u.loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), SqlUtil.getOrderBy(pageForm.getPageOrderBy()));
} else {
cnd.asc("u.loginName");
cnd.asc("u.unionCode");
}
sql.setCondition(cnd);
Pagination pagination = memberHistoryService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return AjaxResult.success(pagination);
}
}
@@ -0,0 +1,98 @@
package com.ruoyi.member.controller.info;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.MemberOrigin;
import com.ruoyi.member.service.MemberHistoryService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @ClassName MemberInfoSupplementController
* @Description 会员补录
* @Author zhaoxinyu
* @Date 2022/12/21 10:44
* @Version 1.0
*/
@RestController
@RequestMapping("/info/supplement")
public class MemberInfoSupplementController {
@Autowired
private MemberHistoryService memberHistoryService;
@PostMapping("/pageData")
@RequiresPermissions("member:info:supplement")
public Object pageData(@RequestBody PageForm pageForm,
@RequestParam(required = false) Integer year,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) Long unitId,
@RequestParam(required = false) String unionGroupId,
@RequestParam(required = false) Long threeUnitId,
@RequestParam(required = false) String personType,
@RequestParam(required = false) String userState,
@RequestParam(required = false) String campus) {
Sql sql = Sqls.create("""
SELECT
u.userId,
u.loginName,
u.userName,
u.sex,
u.mobile,
u.personType,
u.userState,
u.deptName,
u.deptCode,
u.unionName,
u.unionCode
FROM
`user` u
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("u.memberOrigin", "=", MemberOrigin.MAKE.getCode());
cnd.andEX("u.deptId", "=", unitId);
cnd.andEX("u.unionId", "=", unionId);
cnd.andEX("u.unionGroupId", "=", unionGroupId);
cnd.andEX("u.threeUnitId", "=", threeUnitId);
cnd.andEX("u.personType", "=", personType);
cnd.andEX("u.userState", "=", userState);
if (!AuthUtil.hasAnyRoles("admin,A06")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("u.unionId", "=", SecurityUtils.getUnionId());
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("u.unionId", "=", SecurityUtils.getUnionId());
cnd.and("u.unionGroupId", "in", SecurityUtils.getManageUnionGroupIds());
}
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword());
seg.orLike("u.loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), SqlUtil.getOrderBy(pageForm.getPageOrderBy()));
} else {
cnd.asc("u.loginName");
cnd.asc("u.unionId");
}
sql.setCondition(cnd);
Pagination pagination = memberHistoryService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return AjaxResult.success(pagination);
}
}
@@ -0,0 +1,169 @@
package com.ruoyi.member.controller.statistic;
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.ArrayUtil;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.utils.DictUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.MemberMode;
import com.ruoyi.member.api.constant.MemberPageForm;
import com.ruoyi.member.service.MemberStatisticQueryService;
import com.ruoyi.system.api.domain.SysDictData;
import com.ruoyi.system.api.domain.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.entity.annotation.ColType;
import org.nutz.dao.entity.annotation.Column;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
/**
* @ClassName MemberStatisticQueryController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/20 9:04
* @Version 1.0
*/
@RestController
@RequestMapping("/statisticQuery")
@Slf4j
public class MemberStatisticQueryController {
@Autowired
private MemberStatisticQueryService memberStatisticQueryService;
@PostMapping("/pageData")
@RequiresPermissions("member:statistic:query:list")
public Object pageData(@RequestBody PageForm pageForm, @RequestParam(required = false) Integer year,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) Long unitId,
@RequestParam(required = false) String unionGroupId,
@RequestParam(required = false) Long threeUnitId,
@RequestParam(required = false, name = "personTypes[]") List<String> personTypes,
@RequestParam(required = false, name = "userStates[]") List<String> userStates,
@RequestParam(required = false, name = "memberStatus[]") List<String> memberStatus,
@RequestParam(required = false, name = "sexs[]") List<String> sexs,
@RequestParam(required = false, name = "age[]") List<Integer> age,
@RequestParam(required = false) String field, @RequestParam(required = false) String fieldInputValue,
@RequestParam(required = false, name = "fieldSelectValues[]") Object[] fieldSelectValues,
@RequestParam(required = false) String fieldDateValue,
@RequestParam(required = false) String campus,
@RequestParam(value = "retireTime",required = false) String retireTime) {
Pagination pagination = memberStatisticQueryService.pageData(pageForm, year, unionId, unitId, unionGroupId, threeUnitId, personTypes, userStates, memberStatus, sexs, age, field, fieldInputValue, fieldSelectValues, fieldDateValue,retireTime);
return AjaxResult.success(pagination);
}
@RequestMapping("/exportMember")
@RequiresPermissions("member:statistic:query:list")
public void exportMember(HttpServletResponse response, @RequestParam String props, @RequestBody MemberPageForm pageForm) {
try {
List<NutMap> memberList = memberStatisticQueryService.exportList(pageForm);
List<ExcelExportEntity> entityList = new ArrayList<>();
Map<String, String> propMap = Json.fromJson(Map.class, props);
List<SysDictData> dictDataList = memberStatisticQueryService.dao().query(SysDictData.class, Cnd.where("dictType", "in", new String[]{"sys_user_sex", "user_type", "user_state"}));
String[] sys_user_sexes = dictDataList.stream().filter(v -> v.getDictType().equals("sys_user_sex")).map(v -> v.getDictLabel() + "_" + v.getDictValue()).toArray(String[]::new);
String[] user_types = dictDataList.stream().filter(v -> v.getDictType().equals("user_type")).map(v -> v.getDictLabel() + "_" + v.getDictValue()).toArray(String[]::new);
String[] user_states = dictDataList.stream().filter(v -> v.getDictType().equals("user_state")).map(v -> v.getDictLabel() + "_" + v.getDictValue()).toArray(String[]::new);
for (String k : propMap.keySet()) {
String v = propMap.get(k);
if(!SecurityUtils.isAdmin() && "idcard".equals(k)) {
continue;
}
ExcelExportEntity excelExportEntity = new ExcelExportEntity(v, k, 20);
switch (k) {
case "sex" -> {
excelExportEntity.setAddressList(true);
excelExportEntity.setReplace(ArrayUtil.append(sys_user_sexes, "_null"));
}
case "personType" -> {
excelExportEntity.setAddressList(true);
excelExportEntity.setReplace(ArrayUtil.append(user_types, "_null"));
}
case "userState" -> {
excelExportEntity.setAddressList(true);
excelExportEntity.setReplace(ArrayUtil.append(user_states, "_null"));
}
default -> {
}
}
entityList.add(excelExportEntity);
}
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, memberList);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=%s".formatted(URLEncoder.encode("会员信息.xlsx", StandardCharsets.UTF_8)));
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
e.printStackTrace();
log.error("导出会员信息失败{}", e.getMessage());
}
}
/**
* 全部设置福利成员
*
* @return {@link AjaxResult}
*/
@PostMapping("/setWelfareMember")
@RequiresPermissions("member:statistic:query:list")
public AjaxResult setWelfareMember() {
Dao dao = memberStatisticQueryService.dao();
dao.update(SysUser.class, Chain.make("welfareMember", 1).add("welfareMemberJoinTime", new Date()), Cnd.where("member", "=", MemberMode.NORMAL.getCode()));
return AjaxResult.success();
}
@RequestMapping("/userFields")
@RequiresPermissions("member:statistic:query:list")
public AjaxResult userFields() {
List<NutMap> fields = new ArrayList<>();
fields.add(NutMap.NEW().addv("name", "工号").addv("key", "userName").addv("type", ColType.VARCHAR));
fields.add(NutMap.NEW().addv("name", "姓名").addv("key", "nickName").addv("type", ColType.VARCHAR));
fields.add(NutMap.NEW().addv("name", "用户邮箱").addv("key", "email").addv("type", ColType.VARCHAR));
fields.add(NutMap.NEW().addv("name", "性别").addv("key", "sex").addv("type", ColType.VARCHAR).addv("ui_type", "select").addv("selectValues", DictUtils.getDictCache("sys_user_sex")));
fields.add(NutMap.NEW().addv("name", "出生日期").addv("key", "birthday").addv("type", ColType.DATE).addv("ui_type", "date"));
fields.add(NutMap.NEW().addv("name", "人员类型").addv("key", "personType").addv("type", ColType.VARCHAR).addv("ui_type", "select").addv("selectValues", DictUtils.getDictCache("user_type")));
fields.add(NutMap.NEW().addv("name", "在职状态").addv("key", "userState").addv("type", ColType.VARCHAR).addv("ui_type", "select").addv("selectValues", DictUtils.getDictCache("user_state")));
fields.add(NutMap.NEW().addv("name", "出生地点").addv("key", "birthPlace").addv("type", ColType.VARCHAR));
fields.add(NutMap.NEW().addv("name", "职务").addv("key", "position").addv("type", ColType.VARCHAR));
fields.add(NutMap.NEW().addv("name", "职称").addv("key", "jobTitle").addv("type", ColType.VARCHAR));
fields.add(NutMap.NEW().addv("name", "籍贯").addv("key", "hometown").addv("type", ColType.VARCHAR));
fields.add(NutMap.NEW().addv("name", "民族").addv("key", "nation").addv("type", ColType.VARCHAR).addv("ui_type", "select").addv("selectValues", DictUtils.getDictCache("user_state")));
fields.add(NutMap.NEW().addv("name", "手机号码").addv("key", "mobile").addv("type", ColType.VARCHAR));
fields.add(NutMap.NEW().addv("name", "学历").addv("key", "education").addv("type", ColType.VARCHAR).addv("ui_type", "select").addv("selectValues", DictUtils.getDictCache("sys_user_education")));
fields.add(NutMap.NEW().addv("name", "政治面貌").addv("key", "political").addv("type", ColType.VARCHAR).addv("ui_type", "select").addv("selectValues", DictUtils.getDictCache("political_status")));
fields.add(NutMap.NEW().addv("name", "入校时间").addv("key", "schoolTime").addv("type", ColType.DATE));
fields.add(NutMap.NEW().addv("name", "身份证").addv("key", "idcard").addv("type", ColType.VARCHAR));
return AjaxResult.success(fields.stream().peek(v -> {
if (v.getString("ui_type") == null) {
v.put("ui_type", "input");
}
}).collect(Collectors.toList()));
}
}
@@ -0,0 +1,88 @@
package com.ruoyi.member.controller.statistic;
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 com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.member.service.MemberStatisticSexAgeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName MemberStatisticSexAgeController
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/21 9:26
* @Version 1.0
*/
@RestController
@RequestMapping("/statisticSexAge")
@Slf4j
public class MemberStatisticSexAgeController {
@Autowired
private MemberStatisticSexAgeService memberStatisticSexAgeService;
@GetMapping("/list")
@RequiresPermissions("member:statistic:sexAge:list")
public AjaxResult list(@RequestParam int searchType,
@RequestParam int year,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) Long unitId,
@RequestParam(required = false, name = "userTypes[]") List<String> userTypes) {
return AjaxResult.success(memberStatisticSexAgeService.list(searchType, year, unionId, unitId, userTypes));
}
@PostMapping("/exportMember")
@RequiresPermissions("member:statistic:sexAge:list")
public void exportMember(@RequestParam int searchType,
@RequestParam int year,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) Long unitId,
HttpServletResponse response) {
NutMap nutMap = memberStatisticSexAgeService.list(searchType, year, unionId, unitId, null);
List<NutMap> labelList = nutMap.getList("labelList", NutMap.class);
List<NutMap> dataList = nutMap.getList("dataList", NutMap.class);
//合计
dataList.add(new NutMap() {{
put("unionName", "合计");
put("unionCode", null);
put("总人数", dataList.stream().mapToInt(v -> v.getInt("总人数")).reduce(Integer::sum).orElse(0));
put("男会员", dataList.stream().mapToInt(v -> v.getInt("男会员")).reduce(Integer::sum).orElse(0));
put("女会员", dataList.stream().mapToInt(v -> v.getInt("女会员")).reduce(Integer::sum).orElse(0));
put("小于等于40岁会员", dataList.stream().mapToInt(v -> v.getInt("小于等于40岁会员")).reduce(Integer::sum).orElse(0));
put("40~50", dataList.stream().mapToInt(v -> v.getInt("40~50")).reduce(Integer::sum).orElse(0));
put("50~55", dataList.stream().mapToInt(v -> v.getInt("50~55")).reduce(Integer::sum).orElse(0));
put("大于55", dataList.stream().mapToInt(v -> v.getInt("大于55")).reduce(Integer::sum).orElse(0));
}});
List<ExcelExportEntity> entityList = new ArrayList<>();
for (NutMap label : labelList) {
entityList.add(new ExcelExportEntity(label.getString("label"), label.getString("prop"), 20));
}
try {
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, dataList);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=%s".formatted(URLEncoder.encode("会员信息.xlsx", StandardCharsets.UTF_8)));
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
log.error("导出会员信息失败{}", e.getMessage());
}
}
}
@@ -0,0 +1,101 @@
package com.ruoyi.member.controller.statistic;
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 com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.member.service.MemberStatisticUserTypeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @ClassName MemberStatisticUserTypeController
* @Description 会员人员类型统计
* @Author zhaoxinyu
* @Date 2022/12/20 11:30
* @Version 1.0
*/
@RestController
@RequestMapping("/statisticUserType")
@Slf4j
public class MemberStatisticUserTypeController {
@Autowired
private MemberStatisticUserTypeService memberStatisticUserTypeService;
@GetMapping("/list")
@RequiresPermissions("member:statistic:userType:list")
public AjaxResult list(@RequestParam(required = false) String unionId, @RequestParam(required = false) String unitId, @RequestParam int searchType) {
if (searchType == 1) {
return AjaxResult.success(memberStatisticUserTypeService.listByUnion(unionId, unitId));
} else {
return AjaxResult.success(memberStatisticUserTypeService.listByUnit(unitId));
}
}
@PostMapping("/exportMember")
@RequiresPermissions("member:statistic:sexAge:list")
public void exportMember(@RequestParam(required = false) String unionId,
@RequestParam(required = false) String unitId,
@RequestParam int searchType,
HttpServletResponse response) {
NutMap dataMap = NutMap.NEW();
if (searchType == 1) {
dataMap.putAll(memberStatisticUserTypeService.listByUnion(unionId, unitId));
} else {
dataMap.putAll(memberStatisticUserTypeService.listByUnit(unitId));
}
List<NutMap> labelList = dataMap.getList("labelList", NutMap.class);
List<NutMap> dataList = dataMap.getList("dataList", NutMap.class);
List<String> labelList2 = labelList.stream()
.filter(v -> !v.getString("prop").equals("unionName") && !v.getString("prop").equals("unionCode"))
.map(x -> x.getString("prop"))
.collect(Collectors.toList());
//合计
dataList.add(new NutMap() {{
put("unionName", "合计");
put("unionCode", null);
for (String key : labelList2) {
put(key, dataList.stream().mapToInt(v -> v.getInt(key)).reduce(Integer::sum).orElse(0));
}
}});
List<ExcelExportEntity> entityList = new ArrayList<>();
for (NutMap label : labelList) {
entityList.add(new ExcelExportEntity(label.getString("label"), label.getString("prop"), 20));
}
try {
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, dataList);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=%s".formatted(URLEncoder.encode("会员信息.xlsx", StandardCharsets.UTF_8)));
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
log.error("导出会员信息失败{}", e.getMessage());
}
}
}
@@ -0,0 +1,174 @@
package com.ruoyi.member.handle;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.ruoyi.common.core.constant.Roles;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.SpringUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.MemberApplyState;
import com.ruoyi.member.api.constant.MemberChangeOrigin;
import com.ruoyi.member.api.constant.UserMode;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberApplyRecord;
import com.ruoyi.member.api.domain.UserHistory;
import com.ruoyi.member.service.MemberApplyRecordService;
import com.ruoyi.system.api.RemoteSysLocalProcessService;
import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.domain.Sys_local_process_instance;
import com.ruoyi.system.api.domain.Sys_local_process_instance_task;
import lombok.Getter;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
/**
* 会员申请审核
*
* @author: 1V
* @date: 2021/1/25
* @since 1.0
*/
@Getter
public enum MemberApplyAuditHandle {
/**
* 创建
*/
CREATE(null) {
@Override
public MemberApplyRecord next(MemberApplyRecord record, Audit audit) {
record.setUserId(SecurityUtils.getUserId());
record.setStateId(MemberApplyState.UNION);
record.setUnionId(SecurityUtils.getLoginUser().getSysUser().getDept().getUnionId());
record.setApplyTime(new Date());
MemberApplyRecord insert = memberApplyRecordService.insert(record);
String processUniqueId = "MEMBER_APPLY@" + record.getId();
// 创建实例
localProcessService.initCreateInstance(
processUniqueId,
record.getId(),
"[会员申请]" + SecurityUtils.getNickName(),
"/member/apply/applyIndex",
null,
SecurityConstants.INNER
);
// 获取负责人
R<List<String>> assignments = localProcessService.getAssignments(SecurityUtils.getUnionId(), null, Roles.FGH_ADMIN, SecurityConstants.INNER);
List<String> loginNameList = assignments.getData();
localProcessService.initCreateTask(
processUniqueId,
String.valueOf(MemberApplyState.UNION),
"分工会审核",
loginNameList,
"/member/apply/applyBranchUnionAudit",
null,
SecurityConstants.INNER
);
// sysUserService.sendSms(SecurityConstants.INNER)
return insert;
}
},
/**
* 院级工会审核
*/
AUDIT_UNION(MemberApplyState.UNION) {
@Override
@Transactional(rollbackFor = Exception.class)
public MemberApplyRecord next(MemberApplyRecord record, Audit audit) {
record.setStateId(audit.getAuditPass() ? MemberApplyState.SCHOOL_UNION : MemberApplyState.UNION_FAIL);
record.setUnionAuditId(dao.insert(audit).getId());
memberApplyRecordService.update(record);
if (!audit.getAuditPass()) {
refuseToUpdateSourceUser(record.getId());
}
String processUniqueId = "MEMBER_APPLY@" + record.getId();
// 先完成当前节点的任务
localProcessService.completeTask(processUniqueId, String.valueOf(MemberApplyState.UNION), audit.getAuditPass() ? "分工会通过" : "分工会拒绝", SecurityConstants.INNER);
if (audit.getAuditPass()) {
// 审核通过,往下走流程
R<List<String>> assignments = localProcessService.getAssignments(null, null, Roles.SCHOOL_ADMIN, SecurityConstants.INNER);
List<String> loginNameList = assignments.getData();
localProcessService.initCreateTask(
processUniqueId,
String.valueOf(MemberApplyState.SCHOOL_UNION),
"校工会审核",
loginNameList,
"/member/apply/applyMasterUnionAudit",
null,
SecurityConstants.INNER
);
} else {
// 审核不通过,流程结束
localProcessService.completeProcess(processUniqueId, true, SecurityConstants.INNER);
}
return record;
}
},
/**
* 校工会审核
*/
AUDIT_SCHOOL(MemberApplyState.SCHOOL_UNION) {
@Override
@Transactional(rollbackFor = Exception.class)
public MemberApplyRecord next(MemberApplyRecord record, Audit audit) {
record.setStateId(audit.getAuditPass() ? MemberApplyState.NORMAL_MEMBER : MemberApplyState.SCHOOL_UNION_FAIL);
record.setSchoolAuditId(dao.insert(audit).getId());
memberApplyRecordService.update(record);
if (audit.getAuditPass()) {
UserMode.addMemberRole(record.getUserId(), MemberChangeOrigin.PERSONAL.getCode());
} else {
refuseToUpdateSourceUser(record.getId());
}
String processUniqueId = "MEMBER_APPLY@" + record.getId();
// 先完成当前节点的任务
localProcessService.completeTask(processUniqueId, String.valueOf(MemberApplyState.SCHOOL_UNION), audit.getAuditPass() ? "校工会通过" : "校工会拒绝", SecurityConstants.INNER);
// 这一步,不管是通过还是拒绝,流程都结束
localProcessService.completeProcess(processUniqueId, !audit.getAuditPass(), SecurityConstants.INNER);
return record;
}
};
private static void refuseToUpdateSourceUser(String id) {
UserHistory history = dao.fetch(UserHistory.class, Cnd.where("memberApplyRecordId", "=", id));
SysUser sysUser = BeanUtil.copyProperties(history, SysUser.class);
dao.update(sysUser);
dao.clear(UserHistory.class, Cnd.where("memberApplyRecordId", "=", id));
}
public static Dao dao = SpringUtils.getBean(Dao.class);
public MemberApplyRecordService memberApplyRecordService = SpringUtils.getBean(MemberApplyRecordService.class);
public RemoteUserService sysUserService = SpringUtils.getBean(RemoteUserService.class);
public RemoteSysLocalProcessService localProcessService = SpringUtils.getBean(RemoteSysLocalProcessService.class);
private Integer state;
MemberApplyAuditHandle(Integer state) {
this.state = state;
}
public abstract MemberApplyRecord next(MemberApplyRecord record, Audit audit);
}
@@ -0,0 +1,168 @@
package com.ruoyi.member.handle;
import cn.hutool.core.util.EnumUtil;
import com.ruoyi.common.core.constant.Roles;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.SpringUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.MemberApplyState;
import com.ruoyi.member.api.constant.MemberChangeApplyState;
import com.ruoyi.member.api.constant.MemberChangeOrigin;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.system.api.RemoteSysLocalProcessService;
import com.ruoyi.system.api.domain.SysUser;
import lombok.Getter;
import org.nutz.dao.Dao;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@Getter
public enum MemberChangeAuditHandle {
/**
* 创建
*/
CREATE(null) {
@Override
@Transactional(rollbackFor = Exception.class)
public MemberChangeRecord next(MemberChangeRecord record, Audit audit) {
record.setApplyTime(new Date());
if (record.getApplyOrigin() == MemberChangeOrigin.PERSONAL.getCode()) {
record.setUserId(SecurityUtils.getUserId());
record.setOriginUnitId(SecurityUtils.getDeptId());
record.setOriginUnionId(SecurityUtils.getUnionId());
record.setStateId(MemberChangeApplyState.UNION);
} else if (record.getApplyOrigin() == MemberChangeOrigin.UNION.getCode()) {
record.setStateId(MemberChangeApplyState.SCHOOL_UNION);
} else if (record.getApplyOrigin() == MemberChangeOrigin.SCHOOL.getCode()) {
record.setStateId(MemberChangeApplyState.SUCCESS);
}
MemberChangeRecord insert = dao.insert(record);
// 被变更人
SysUser user = dao.fetch(SysUser.class, record.getUserId());
String processUniqueId = "MEMBER_CHANGE@" + record.getId();
// 创建实例
localProcessService.initCreateInstance(
processUniqueId,
record.getId(),
"[会员变更]" + user.getNickName(),
"/member/change/changeIndex",
null,
SecurityConstants.INNER
);
if (record.getApplyOrigin() == MemberChangeOrigin.PERSONAL.getCode()) {
// 个人申请,创建分工会任务
R<List<String>> assignments = localProcessService.getAssignments(SecurityUtils.getUnionId(), null, Roles.FGH_ADMIN, SecurityConstants.INNER);
List<String> loginNameList = assignments.getData();
localProcessService.initCreateTask(
processUniqueId,
String.valueOf(MemberChangeApplyState.UNION),
"分工会审核",
loginNameList,
"/member/change/changeBranchUnionAudit",
null,
SecurityConstants.INNER
);
} else if (record.getApplyOrigin() == MemberChangeOrigin.UNION.getCode()) {
// 院级工会申请,创建校工会任务
R<List<String>> assignments = localProcessService.getAssignments(null, null, Roles.SCHOOL_ADMIN, SecurityConstants.INNER);
List<String> loginNameList = assignments.getData();
localProcessService.initCreateTask(
processUniqueId,
String.valueOf(MemberChangeApplyState.SCHOOL_UNION),
"校工会审核",
loginNameList,
"/member/change/changeMasterUnionAudit",
null,
SecurityConstants.INNER
);
} else if (record.getApplyOrigin() == MemberChangeOrigin.SCHOOL.getCode()) {
// 校级工会申请,直接审核通过
localProcessService.completeProcess(processUniqueId, false, SecurityConstants.INNER);
}
return insert;
}
},
/**
* 院级工会审核
*/
UNION(MemberChangeApplyState.UNION) {
@Override
@Transactional(rollbackFor = Exception.class)
public MemberChangeRecord next(MemberChangeRecord record, Audit audit) {
record.setStateId(audit.getAuditPass() ? MemberChangeApplyState.SCHOOL_UNION : MemberChangeApplyState.UNION_FAIL);
record.setUnionAuditId(dao.insert(audit).getId());
dao.update(record);
String processUniqueId = "MEMBER_CHANGE@" + record.getId();
// 分工会审核,先完成任务,根据审核情况是否创建校工会任务
localProcessService.completeTask(processUniqueId, String.valueOf(MemberChangeApplyState.UNION), audit.getAuditPass() ? "分工会通过" : "分工会不通过", SecurityConstants.INNER);
if (audit.getAuditPass()) {
// 创建校工会任务
R<List<String>> assignments = localProcessService.getAssignments(null, null, Roles.SCHOOL_ADMIN, SecurityConstants.INNER);
List<String> loginNameList = assignments.getData();
localProcessService.initCreateTask(
processUniqueId,
String.valueOf(MemberChangeApplyState.SCHOOL_UNION),
"校工会审核",
loginNameList,
"/member/change/changeMasterUnionAudit",
null,
SecurityConstants.INNER
);
} else {
localProcessService.completeProcess(processUniqueId, true, SecurityConstants.INNER);
}
return record;
}
},
/**
* 校工会审核
*/
SCHOOL(MemberChangeApplyState.SCHOOL_UNION) {
@Override
@Transactional(rollbackFor = Exception.class)
public MemberChangeRecord next(MemberChangeRecord record, Audit audit) {
record.setStateId(audit.getAuditPass() ? MemberChangeApplyState.SUCCESS : MemberChangeApplyState.SCHOOL_UNION_FAIL);
record.setSchoolAuditId(dao.insert(audit).getId());
if (record.getStateId() == MemberChangeApplyState.SUCCESS) {
MemberChangeHandle changeHandle = EnumUtil.getBy(MemberChangeHandle.class, v -> Objects.equals(v.getChangeType(), record.getType()));
changeHandle.change(record);
}
dao.update(record);
String processUniqueId = "MEMBER_CHANGE@" + record.getId();
// 先完成当前节点的任务
localProcessService.completeTask(processUniqueId, String.valueOf(MemberChangeApplyState.SCHOOL_UNION), audit.getAuditPass() ? "校工会通过" : "校工会不通过", SecurityConstants.INNER);
// 这一步,不管是通过还是拒绝,流程都结束
localProcessService.completeProcess(processUniqueId, record.getStateId() == MemberChangeApplyState.SCHOOL_UNION_FAIL, SecurityConstants.INNER);
return record;
}
};
public Dao dao = SpringUtils.getBean(Dao.class);
private Integer state;
public RemoteSysLocalProcessService localProcessService = SpringUtils.getBean(RemoteSysLocalProcessService.class);
MemberChangeAuditHandle(Integer state) {
this.state = state;
}
public abstract MemberChangeRecord next(MemberChangeRecord record, Audit audit);
}
@@ -0,0 +1,231 @@
package com.ruoyi.member.handle;
import cn.hutool.core.date.DateUtil;
import com.ruoyi.common.core.utils.SpringUtils;
import com.ruoyi.member.api.constant.MemberStatus;
import com.ruoyi.member.api.constant.UserChangeType;
import com.ruoyi.member.api.constant.UserMode;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.api.domain.UserHistory;
import com.ruoyi.system.api.domain.SysUser;
import lombok.Getter;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.FieldMatcher;
import org.nutz.lang.Strings;
import org.nutz.lang.random.R;
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
/**
* 会员变更Handle
*
* @author: 1V
* @date: 2021/1/27
* @see UserChangeType
* @since 1.0
*/
@Getter
public enum MemberChangeHandle {
//单位异动
UNIT_CHANGE(UserChangeType.UNIT_CHANGE.getCode()) {
@Override
@Transactional(rollbackFor = Exception.class)
public void change(MemberChangeRecord record) {
archive(record.getUserId(), UserChangeType.UNIT_CHANGE);
Chain chain = Chain.make("deptId", record.getCurrentUnitId());
chain.add("threeUnitId", record.getCurrentThreeUnitId());
dao.update(SysUser.class, chain, Cnd.where("userId", "=", record.getUserId()));
}
},
//新入职
NEW(UserChangeType.NEW.getCode()) {
@Override
@Transactional(rollbackFor = Exception.class)
public void change(MemberChangeRecord record) {
archive(record.getUserId(), UserChangeType.NEW);
if (null != record.getInsertMember() && record.getInsertMember()) {
UserMode.addMemberRole(record.getUserId(), record.getApplyOrigin());
}
if (null != record.getUpdateWelfareMember() && record.getUpdateWelfareMember()) {
dao.update(SysUser.class, Chain.make("welfareMember", 1), Cnd.where("userId", "=", record.getUserId()));
}
}
},
//离职
RESIGN(UserChangeType.RESIGN.getCode()) {
@Override
@Transactional(rollbackFor = Exception.class)
public void change(MemberChangeRecord record) {
archive(record.getUserId(), UserChangeType.RESIGN);
updateMember(record);
updateWelfareMember(record);
updateUserStateAndPersonType(record);
}
},
//去世
DIE(UserChangeType.DIE.getCode()) {
@Override
@Transactional(rollbackFor = Exception.class)
public void change(MemberChangeRecord record) {
archive(record.getUserId(), UserChangeType.DIE);
updateMember(record);
updateWelfareMember(record);
updateUserStateAndPersonType(record);
}
},
//退休
RETIREMENT(UserChangeType.RETIREMENT.getCode()) {
@Override
@Transactional(rollbackFor = Exception.class)
public void change(MemberChangeRecord record) {
archive(record.getUserId(), UserChangeType.RETIREMENT);
updateMember(record);
updateWelfareMember(record);
updateUserStateAndPersonType(record);
if (record.getRetireTime() != null) {
dao.update(SysUser.class, Chain.make("retireTime", record.getRetireTime())
, Cnd.where("userId", "=", record.getUserId()));
}
}
},
//开除
EXPELLED(UserChangeType.EXPELLED.getCode()) {
@Override
@Transactional(rollbackFor = Exception.class)
public void change(MemberChangeRecord record) {
archive(record.getUserId(), UserChangeType.EXPELLED);
updateMember(record);
updateWelfareMember(record);
updateUserStateAndPersonType(record);
}
},
//恢复
RESTORE(UserChangeType.RESTORE.getCode()) {
@Override
@Transactional(rollbackFor = Exception.class)
public void change(MemberChangeRecord record) {
archive(record.getUserId(), UserChangeType.RESTORE);
UserMode.addMemberRole(record.getUserId(), record.getApplyOrigin());
updateMemberStatus(MemberStatus.RESTORE, record.getUserId());
updateWelfareMember(record);
dao.update(SysUser.class,Chain.make("retireTime",null),Cnd.where("userId", "=", record.getUserId()));
}
},
//退会
WITHDRAWAL(UserChangeType.WITHDRAWAL.getCode()) {
@Override
@Transactional(rollbackFor = Exception.class)
public void change(MemberChangeRecord record) {
archive(record.getUserId(), UserChangeType.WITHDRAWAL);
updateMember(record);
updateWelfareMember(record);
updateUserStateAndPersonType(record);
// UserMode.removeMemberRole(record.getUserId());
// updateMemberStatus(MemberStatus.WITHDRAWAL, record.getUserId());
}
};
public static Dao dao = SpringUtils.getBean(Dao.class);
/**
* 变更类型
*/
private final String changeType;
MemberChangeHandle(String changeType) {
this.changeType = changeType;
}
/**
* 存档
*
* @param userId
* @param changeType
*/
private static void archive(Long userId, UserChangeType changeType) {
SysUser user = dao.fetch(SysUser.class, userId);
UserHistory history = new UserHistory();
BeanUtils.copyProperties(user, history);
history.setChangeTime(new Date());
history.setChangeType(changeType.getCode());
history.setId(R.UU32());
dao.fastInsert(history);
}
/**
* 在职状态和人员类别变更
* zzr 2024-03-10 新增在职状态及人员类别的变更
*
* @param record 变更记录
*/
public static void updateUserStateAndPersonType(MemberChangeRecord record) {
// Chain chain = null;
if (Strings.isNotBlank(record.getUserState()) && Strings.isNotBlank(record.getPersonType())) {
Chain chain = Chain.make("userState", record.getUserState()).add("personType", record.getPersonType());
dao.update(SysUser.class, chain, Cnd.where("userId", "=", record.getUserId()));
} else if (Strings.isNotBlank(record.getUserState()) && Strings.isBlank(record.getPersonType())) {
Chain chain = Chain.make("userState", record.getUserState());
dao.update(SysUser.class, chain, Cnd.where("userId", "=", record.getUserId()));
} else if (Strings.isBlank(record.getUserState()) && Strings.isNotBlank(record.getPersonType())) {
Chain chain = Chain.make("personType", record.getPersonType());
dao.update(SysUser.class, chain, Cnd.where("userId", "=", record.getUserId()));
}
// if (chain != null) {
// dao.update(SysUser.class, chain, Cnd.where("userId", "=", record.getUserId()));
// }
}
/**
* 根据record的updateMember改变会员状态
*
* @param record
*/
public static void updateMember(MemberChangeRecord record) {
if (null != record.getUpdateMember() && record.getUpdateMember()) {
UserMode.removeMemberRole(record.getUserId());
}
}
/**
* 更新福利会员
*
* @param record 变更记录
*/
public static void updateWelfareMember(MemberChangeRecord record) {
//record.getUpdateWelfareMember() true:增加福利会员 false:取消福利会员);针对入会(恢复)
if (null != record.getUpdateWelfareMember() && record.getUpdateWelfareMember()) {
dao.update(SysUser.class, Chain.make("welfareMember", 1), Cnd.where("userId", "=", record.getUserId()));
}
//record.getUpdateWelfare() true:取消 false:不取消);针对(退休、离职、退会、去世)
if (null != record.getUpdateWelfare() && record.getUpdateWelfare()) {
dao.update(SysUser.class, Chain.make("welfareMember", 0), Cnd.where("userId", "=", record.getUserId()));
}
}
/**
* 更新会员状态
*
* @param status 会员状态
* @param userId 用户id
*/
public static void updateMemberStatus(MemberStatus status, Long userId) {
dao.update(SysUser.class, Chain.make("memberStatus", status.getCode()), Cnd.where("userId", "=", userId));
}
public abstract void change(MemberChangeRecord record);
}
@@ -0,0 +1,74 @@
package com.ruoyi.member.service;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.service.BaseService;
import com.ruoyi.member.api.domain.MemberApplyRecord;
import com.ruoyi.member.api.domain.dto.MemberAuditPageForm;
import com.ruoyi.system.api.domain.SysUser;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @ClassName MemberService
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/13 17:35
* @Version 1.0
*/
public interface MemberApplyRecordService extends BaseService<MemberApplyRecord> {
/**
* 申请
*
* @param sysUser 系统用户
*/
void doApply(SysUser sysUser);
/***
* 申请信息
* @description
* @author zhaoxinyu
* @date 2022/12/15 13:47
* @param userId 用户id
* @return org.nutz.lang.util.NutMap
*/
NutMap applyInfo();
/***
* 历史申请记录
* @description
* @author zhaoxinyu
* @date 2022/12/15 13:46
* @param userId 用户id
* @return java.util.List<org.nutz.lang.util.NutMap>
*/
List<NutMap> history(Long userId);
/**
* 分工会 审核分页数据
*/
Pagination branchUnionAuditPageData(MemberAuditPageForm pageFormDTO);
/**
* 校工会 审核分页数据
*/
Pagination masterUnionAuditPageData(MemberAuditPageForm pageFormDTO);
/**
* 审核信息
* @param id 申请id
* @return
*/
MemberApplyRecord applyProcessInfo(String id);
/**
* 打印表单数据
*
* @param userId 用户id
* @return {@link NutMap}
*/
NutMap printFormData(Long userId);
}
@@ -0,0 +1,78 @@
package com.ruoyi.member.service;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.service.BaseService;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.api.domain.dto.MemberAuditPageForm;
import com.ruoyi.system.api.domain.SysUser;
import org.nutz.dao.Cnd;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @ClassName MemberChangeRecordService
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/16 9:41
* @Version 1.0
*/
public interface MemberChangeRecordService extends BaseService<MemberChangeRecord> {
/**
* 做应用
*
* @param memberChangeRecord 成员变更记录
* @param sysUser 系统用户
*/
void doApply(MemberChangeRecord memberChangeRecord, SysUser sysUser);
/***
* 申请信息
* @description
* @author zhaoxinyu
* @date 2022/12/15 13:47
* @return org.nutz.lang.util.NutMap
*/
NutMap applyInfo();
/***
* 历史变更记录
* @description
* @author zhaoxinyu
* @date 2022/12/15 13:46
* @param userId 用户id
* @return java.util.List<org.nutz.lang.util.NutMap>
*/
List<NutMap> history(Long userId);
/***
* 历史变更记录
* @description
* @author zhaoxinyu
* @date 2022/12/19 10:05
* @param pageForm
* @param cnd
* @return com.ruoyi.common.core.page.Pagination
*/
Pagination history(PageForm pageForm, Cnd cnd);
/**
* 分工会 审核分页数据
*/
Pagination branchUnionAuditPageData(MemberAuditPageForm pageForm);
/**
* 校工会 审核分页数据
*/
Pagination masterUnionAuditPageData(MemberAuditPageForm pageForm);
/**
* 用户单位调整
*
* @param changeRecords 更改记录
*/
void userUnitMove(List<MemberChangeRecord> changeRecords);
}
@@ -0,0 +1,20 @@
package com.ruoyi.member.service;
import com.ruoyi.common.core.service.BaseService;
import com.ruoyi.member.api.domain.MemberHistory;
/**
* @ClassName MemberHistoryService
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/19 11:16
* @Version 1.0
*/
public interface MemberHistoryService extends BaseService<MemberHistory> {
/**
* 存档
*/
void archive(Integer year);
}
@@ -0,0 +1,20 @@
package com.ruoyi.member.service;
import com.ruoyi.common.core.service.BaseService;
/**
* @ClassName MemberInfoBatchMakeService
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/19 15:27
* @Version 1.0
*/
public interface MemberInfoBatchMakeService extends BaseService {
/**
* 批量设置会员
* @param userIds
*/
void joinMemberFamily(Long[] userIds);
}
@@ -0,0 +1,37 @@
package com.ruoyi.member.service;
import com.ruoyi.common.core.service.BaseService;
import com.ruoyi.system.api.domain.SysUser;
import org.apache.poi.ss.formula.functions.T;
import org.nutz.dao.entity.Entity;
import java.util.List;
import java.util.Map;
/**
* @ClassName MemberService
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/21 17:15
* @Version 1.0
*/
public interface MemberService extends BaseService {
/**
* 补充成员
*
* @param user 用户
*/
void supplementMember(SysUser user);
Long getDeptId(Map<String, Long> codeMap, Map<String, Long> nameMap, String code, String name);
/**
* 大批量插入或修改
* @param list 插入集合
* @param mode 1:新增,2:修改
* @throws InterruptedException
*/
<T> void largeQuantitiesInsert(List<T> list, Integer mode, Boolean isFastInsert);
}
@@ -0,0 +1,59 @@
package com.ruoyi.member.service;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.service.BaseService;
import com.ruoyi.member.api.constant.MemberPageForm;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @ClassName MemberStatisticQueryService
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/20 10:39
* @Version 1.0
*/
public interface MemberStatisticQueryService extends BaseService {
/**
* 分页数据
*
* @param pageForm
* @param year
* @param unionId
* @param unitId
* @param unionGroupId
* @param threeUnitId
* @param personTypes
* @param userStates
* @param memberStatus
* @return
*/
Pagination pageData(PageForm pageForm,
Integer year,
String unionId,
Long unitId,
String unionGroupId,
Long threeUnitId,
List<String> personTypes,
List<String> userStates,
List<String> memberStatus,
List<String> sexs,
List<Integer> age,
String field,
String fieldInputValue,
Object[] fieldSelectValues,
String fieldDateValue,
String retireTime);
/**
* excel导出数据
*
* @param pageForm
* @return
*/
List<NutMap> exportList(MemberPageForm pageForm);
}
@@ -0,0 +1,29 @@
package com.ruoyi.member.service;
import com.ruoyi.common.core.service.BaseService;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @ClassName MemberStatisticSexAgeService
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/21 9:28
* @Version 1.0
*/
public interface MemberStatisticSexAgeService extends BaseService {
/**
* 性别 年龄统计
*
* @param searchType 1分工会 2单位
* @param year 年度
* @param unionId 工会id
* @param deptId 单位id
* @param userTypes 人员类型
* @return
*/
NutMap list(int searchType, int year, String unionId, Long deptId, List<String> userTypes);
}
@@ -0,0 +1,19 @@
package com.ruoyi.member.service;
import com.ruoyi.common.core.service.BaseService;
import org.nutz.lang.util.NutMap;
/**
* @ClassName MemberStatisticUserTypeService
* @Description 人员类型
* @Author zhaoxinyu
* @Date 2022/12/20 14:27
* @Version 1.0
*/
public interface MemberStatisticUserTypeService extends BaseService {
NutMap listByUnion(String unionId, String unitId);
NutMap listByUnit(String unitId);
}
@@ -0,0 +1,322 @@
package com.ruoyi.member.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.service.BaseServiceImpl;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.DictUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.MemberApplyState;
import com.ruoyi.member.api.constant.MemberChangeOrigin;
import com.ruoyi.member.api.constant.MemberStatus;
import com.ruoyi.member.api.constant.UserChangeType;
import com.ruoyi.member.api.domain.MemberApplyRecord;
import com.ruoyi.member.api.domain.UserHistory;
import com.ruoyi.member.api.domain.dto.MemberAuditPageForm;
import com.ruoyi.member.handle.MemberApplyAuditHandle;
import com.ruoyi.member.service.MemberApplyRecordService;
import com.ruoyi.system.api.RemoteUnionService;
import com.ruoyi.system.api.domain.SysConfig;
import com.ruoyi.system.api.domain.SysDictData;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.domain.Sys_local_process_instance;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.Record;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Optional;
/**
* @ClassName MemberServiceImpl
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/13 17:36
* @Version 1.0
*/
@Service
public class MemberApplyRecordServiceImpl extends BaseServiceImpl<MemberApplyRecord> implements MemberApplyRecordService {
public MemberApplyRecordServiceImpl(Dao dao) {
super(dao);
}
@Autowired
private RemoteUnionService remoteUnionService;
@Override
@Transactional(rollbackFor = Exception.class)
public void doApply(SysUser sysUser) {
MemberApplyRecord memberApplyRecord = new MemberApplyRecord().setMemberStates(MemberStatus.NORMAL.getCode());
MemberApplyRecord next = MemberApplyAuditHandle.CREATE.next(memberApplyRecord, null);
dao().updateIgnoreNull(sysUser);
SysUser sourceUser = dao().fetch(SysUser.class, Cnd.where("userName", "=", sysUser.getUserName()));
UserHistory userHistory = BeanUtil.copyProperties(sourceUser, UserHistory.class);
userHistory.setChangeType(UserChangeType.RESTORE.getCode());
userHistory.setChangeTime(DateUtil.date());
userHistory.setMemberApplyRecordId(next.getId());
dao().insert(userHistory);
dao().updateIgnoreNull(sysUser);
}
@Override
public NutMap applyInfo() {
Long userId = SecurityUtils.getUserId();
SysUser sysUser = dao().fetch(SysUser.class, userId);
Record user = dao().fetch("`user`", Cnd.where("userId", "=", userId));
NutMap nutMap = Lang.obj2nutmap(sysUser);
nutMap.setv("unionName",user.getString("unionname"));
nutMap.setv("unitName",user.getString("deptname"));
nutMap.setv("threeUnitName",user.getString("threedeptname"));
nutMap.setv("unionGroupName",user.getString("uniongroupname"));
MemberApplyRecord record = dao().fetch(MemberApplyRecord.class, Cnd.where("userId", "=", userId).desc("applyTime"));
dao().fetchLinks(record, null);
NutMap recordMap = Lang.obj2nutmap(record);
if (Lang.isNotEmpty(record)) {
if (Lang.isNotEmpty(record.getAuditState())) {
recordMap.setv("stateName", record.getAuditState().getStateName());
}
if (MemberApplyState.AUDIT_PASS_STATES.contains(record.getStateId())) {
recordMap.setv("status", "PASS");
} else if (MemberApplyState.AUDIT_REJECTED_STATES.contains(record.getStateId())) {
recordMap.setv("status", "REJECTED");
} else {
recordMap.setv("status", "AUDIT_ING");
}
} else {
recordMap.setv("status", "NEVER_APPLY");
}
return NutMap.NEW().addv("user", nutMap).addv("record", recordMap);
}
@Override
public List<NutMap> history(Long userId) {
Sql sql = Sqls.create("""
SELECT
mar.*,
u.userName,
u.loginName,
gh.unionName,
gh.unionCode,
state.stateName\s
FROM
`member_apply_record` mar
LEFT JOIN `user` u ON u.userId = mar.userId
LEFT JOIN sys_union gh ON gh.id = mar.unionId
LEFT JOIN audit_state state ON state.stateId = mar.stateId
WHERE mar.userId = @userId
ORDER BY mar.applyTime DESC
""");
sql.setParam("userId", userId);
return listMap(sql);
}
@Override
public Pagination branchUnionAuditPageData(MemberAuditPageForm pageFormDTO) {
Sql sql = Sqls.create("""
SELECT
mar.*,
u.sex,
u.mobile,
u.userName,
u.loginName,
u.deptName,
u.deptCode,
u.threeDeptName,
u.threeDeptCode,
u.unionGroupName,
u.unionGroupCode,
u.personType,
gh.unionName,
gh.unionCode,
state.stateName,
IF(mar.stateId = @auditState,TRUE,FALSE) canAudit
FROM
`member_apply_record` mar
LEFT JOIN `user` u ON u.userId = mar.userId
LEFT JOIN sys_union gh ON gh.id = mar.unionId
LEFT JOIN audit_state state ON state.stateId = mar.stateId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.asc("mar.stateId");
String[] dateRange = pageFormDTO.getDateRange();
if (Lang.isNotEmpty(dateRange)) {
cnd.and("date(mar.applyTime)", ">=", dateRange[0]);
cnd.and("date(mar.applyTime)", "<=", dateRange[1]);
}
if (pageFormDTO.getYear() != null) {
cnd.and("year(mar.applyTime)", "=", pageFormDTO.getYear());
}
if (!AuthUtil.hasRole("admin")) {
cnd.and("mar.unionId", "=", SecurityUtils.getUnionId());
}
switch (pageFormDTO.getAudit()) {
case 1 -> cnd.and("mar.stateId", ">", MemberApplyState.UNION);
case 2 -> cnd.and("mar.stateId", "=", MemberApplyState.UNION);
}
if (StrUtil.isNotBlank(pageFormDTO.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageFormDTO.getSearchKeyword());
seg.orLike("u.loginName", pageFormDTO.getSearchKeyword());
cnd.and(seg);
}
sql.setParam("auditState", MemberApplyState.UNION);
sql.setCondition(cnd);
return listPageMap(pageFormDTO.getPageNumber(), pageFormDTO.getPageSize(), sql);
}
/**
* 校工会 审核分页数据
*
* @param pageFormDTO
*/
@Override
public Pagination masterUnionAuditPageData(MemberAuditPageForm pageFormDTO) {
Sql sql = Sqls.create("""
SELECT
mar.*,
u.sex,
u.mobile,
u.userName,
u.loginName,
u.deptName,
u.deptCode,
u.threeDeptName,
u.threeDeptCode,
u.unionGroupName,
u.unionGroupCode,
u.personType,
gh.unionName,
gh.unionCode,
state.stateName,
IF(mar.stateId = @auditState,TRUE,FALSE) canAudit
FROM
`member_apply_record` mar
LEFT JOIN `user` u ON u.userId = mar.userId
LEFT JOIN sys_union gh ON gh.id = mar.unionId
LEFT JOIN audit_state state ON state.stateId = mar.stateId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.asc("mar.stateId");
String[] dateRange = pageFormDTO.getDateRange();
if (Lang.isNotEmpty(dateRange)) {
cnd.and("date(mar.applyTime)", ">=", dateRange[0]);
cnd.and("date(mar.applyTime)", "<=", dateRange[1]);
}
cnd.andEX("mar.unionId", "=", pageFormDTO.getUnionId());
switch (pageFormDTO.getAudit()) {
case 0 -> cnd.and("mar.stateId", ">=", MemberApplyState.SCHOOL_UNION);
case 1 -> cnd.and("mar.stateId", ">", MemberApplyState.SCHOOL_UNION);
case 2 -> cnd.and("mar.stateId", "=", MemberApplyState.SCHOOL_UNION);
}
if (StrUtil.isNotBlank(pageFormDTO.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageFormDTO.getSearchKeyword());
seg.orLike("u.loginName", pageFormDTO.getSearchKeyword());
cnd.and(seg);
}
sql.setParam("auditState", MemberApplyState.SCHOOL_UNION);
sql.setCondition(cnd);
return listPageMap(pageFormDTO.getPageNumber(), pageFormDTO.getPageSize(), sql);
}
/**
* 审核信息
*
* @param id 申请id
* @return
*/
@Override
public MemberApplyRecord applyProcessInfo(String id) {
MemberApplyRecord applyRecord = fetch(id);
fetchLinks(applyRecord, "unionAudit|schoolAudit");
return applyRecord;
}
@Override
public NutMap printFormData(Long userId) {
Sql sql = Sqls.create("""
SELECT
userName,
sex,
nation,
education,
academicDegree,
political,
idcard,
mobile,
hometown,
vita\s
FROM
`user`
WHERE userId = @userId
""");
sql.setParam("userId", userId);
NutMap userDataMap = fetch(sql);
List<SysDictData> sys_user_sex = DictUtils.getDictCache("sys_user_sex");
List<SysDictData> sys_nation = DictUtils.getDictCache("sys_nation");
List<SysDictData> sys_user_education = DictUtils.getDictCache("sys_user_education");
List<SysDictData> sys_user_academicdegree = DictUtils.getDictCache("sys_user_academicdegree");
assert sys_user_sex != null;
userDataMap.put("sex", sys_user_sex.stream().filter(v -> v.getDictValue().equals(userDataMap.getString("sex"))).findFirst().map(SysDictData::getDictLabel).orElse(null));
assert sys_nation != null;
userDataMap.put("nation", sys_nation.stream().filter(v -> v.getDictValue().equals(userDataMap.getString("nation"))).findFirst().map(SysDictData::getDictLabel).orElse(null));
assert sys_user_education != null;
userDataMap.put("education", sys_user_education.stream().filter(v -> v.getDictValue().equals(userDataMap.getString("education"))).findFirst().map(SysDictData::getDictLabel).orElse(null));
assert sys_user_academicdegree != null;
userDataMap.put("academicDegree", sys_user_academicdegree.stream().filter(v -> v.getDictValue().equals(userDataMap.getString("academicDegree"))).findFirst().map(SysDictData::getDictLabel).orElse(null));
String schoolName = Optional.ofNullable(dao().fetch(SysConfig.class, Cnd.where("configKey", "=", "sys.schoolName"))).map(v -> v.getConfigValue()).orElse(null);
userDataMap.put("schoolName", schoolName);
MemberApplyRecord applyRecord = dao().fetch(MemberApplyRecord.class, Cnd.where("userId", "=", userId).desc("applyTime"));
Date date = Optional.ofNullable(applyRecord).map(MemberApplyRecord::getApplyTime).orElse(null);
if (date != null) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
userDataMap.put("year", year);
userDataMap.put("month", month);
userDataMap.put("day", day);
}
return userDataMap;
}
}
@@ -0,0 +1,341 @@
package com.ruoyi.member.service.impl;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.service.BaseServiceImpl;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.*;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.api.domain.dto.MemberAuditPageForm;
import com.ruoyi.member.handle.MemberChangeAuditHandle;
import com.ruoyi.member.service.MemberChangeRecordService;
import com.ruoyi.system.api.domain.SysUser;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.Record;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* @ClassName MemberChangeRecordServiceImpl
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/16 9:42
* @Version 1.0
*/
@Service
public class MemberChangeRecordServiceImpl extends BaseServiceImpl<MemberChangeRecord> implements MemberChangeRecordService {
public MemberChangeRecordServiceImpl(Dao dao) {
super(dao);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void doApply(MemberChangeRecord memberChangeRecord, SysUser sysUser) {
if (!Objects.equals(memberChangeRecord.getType(), UserChangeType.UNIT_CHANGE.getCode())) {
memberChangeRecord.setCurrentUnitId(null);
memberChangeRecord.setCurrentUnionId(null);
}
Sql sql = Sqls.create("select deptId,threeUnitId,unionId from `user` where userId = @userId");
sql.setParam("userId", sysUser.getUserId());
NutMap userMap = fetch(sql);
memberChangeRecord.setOriginThreeUnitId((Long) userMap.get("threeUnitId", null));
memberChangeRecord.setOriginUnitId((Long) userMap.get("deptId", null));
memberChangeRecord.setOriginUnionId(userMap.getString("unionId"));
memberChangeRecord.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
memberChangeRecord.setApplyOrigin(MemberChangeOrigin.PERSONAL.getCode());
MemberChangeAuditHandle.CREATE.next(memberChangeRecord, null);
dao().updateIgnoreNull(sysUser);
}
@Override
public NutMap applyInfo() {
Long userId = SecurityUtils.getUserId();
SysUser sysUser = dao().fetch(SysUser.class, userId);
Record user = dao().fetch("`user`", Cnd.where("userId", "=", userId));
NutMap nutMap = Lang.obj2nutmap(sysUser);
nutMap.setv("unionName",user.getString("unionname"));
nutMap.setv("unitName",user.getString("deptname"));
nutMap.setv("threeUnitName",user.getString("threedeptname"));
nutMap.setv("unionGroupName",user.getString("uniongroupname"));
MemberChangeRecord record = dao().fetch(MemberChangeRecord.class, Cnd.where("userId", "=", userId).desc("applyTime"));
dao().fetchLinks(record, null);
NutMap recordMap = Lang.obj2nutmap(record);
if (Lang.isNotEmpty(record)) {
if (Lang.isNotEmpty(record.getAuditState())) {
recordMap.setv("stateName", record.getAuditState().getStateName());
}
if (MemberChangeApplyState.SUCCESS == record.getStateId()) {
recordMap.setv("status", "PASS");
} else if (List.of(MemberChangeApplyState.UNION_FAIL, MemberChangeApplyState.SCHOOL_UNION_FAIL).contains(record.getStateId())) {
recordMap.setv("status", "REJECTED");
} else {
recordMap.setv("status", "AUDIT_ING");
}
} else {
recordMap.setv("status", "NEVER_APPLY");
}
return NutMap.NEW().addv("user", nutMap).addv("record", recordMap);
}
@Override
public List<NutMap> history(Long userId) {
Sql sql = Sqls.create("""
SELECT
mcr.*,
LEFT ( mcr.applyTime, 10 ) applyDate,
u.username as userName,
u.loginname as loginName,
u.deptName,
u.deptCode,
u.unionName,
u.unionCode,
state.stateName,
state.stateColor,
originUnit.dept_code originUnitCode,
originUnit.dept_name originUnitName,
originUnion.unionCode originUnionCode,
originUnion.unionName originUnionName,
originThreeUnit.dept_code originThreeUnitCode,
originThreeUnit.dept_name originThreeUnitName,
currentUnit.dept_code currentUnitCode,
currentUnit.dept_name currentUnitName,
currentUnion.unionCode currentUnionCode,
currentUnion.unionName currentUnionName,
currentThreeUnit.dept_code currentThreeUnitCode,
currentThreeUnit.dept_name currentThreeUnitName
FROM
member_change_record mcr
LEFT JOIN `user` u ON mcr.userId = u.userId
LEFT JOIN audit_state state ON mcr.stateId = state.stateId
LEFT JOIN sys_dept originUnit ON mcr.originUnitId = originUnit.dept_id
LEFT JOIN sys_union originUnion ON mcr.originUnionId = originUnion.id
LEFT JOIN sys_dept originThreeUnit ON mcr.originThreeUnitId = originThreeUnit.dept_id
LEFT JOIN sys_dept currentUnit ON mcr.currentUnitId = currentUnit.dept_id
LEFT JOIN sys_union currentUnion ON mcr.currentUnionId = currentUnion.id
LEFT JOIN sys_dept currentThreeUnit ON mcr.currentThreeUnitId = currentThreeUnit.dept_id
WHERE mcr.userId = @userId
ORDER BY mcr.applyTime DESC
""");
sql.setParam("userId", userId);
return listMap(sql);
}
/***
* 历史变更记录
* @description
* @author zhaoxinyu
* @date 2022/12/19 10:05
* @param pageForm
* @param cnd
* @return com.ruoyi.common.core.page.Pagination
*/
@Override
public Pagination history(PageForm pageForm, Cnd cnd) {
Sql sql = Sqls.create("""
SELECT
mcr.*,
LEFT ( mcr.applyTime, 10 ) applyDate,
u.userName,
u.loginName,
u.deptName,
u.deptCode,
u.unionName,
u.unionCode,
state.stateName,
state.stateColor,
originUnit.dept_code originUnitCode,
originUnit.dept_name originUnitName,
originUnion.unionCode originUnionCode,
originUnion.unionName originUnionName,
currentUnit.dept_code currentUnitCode,
currentUnit.dept_name currentUnitName,
currentUnion.unionCode currentUnionCode,
currentUnion.unionName currentUnionName
FROM
member_change_record mcr
LEFT JOIN `user` u ON mcr.userId = u.userId
LEFT JOIN audit_state state ON mcr.stateId = state.stateId
LEFT JOIN sys_dept originUnit ON mcr.originUnitId = originUnit.dept_id
LEFT JOIN sys_union originUnion ON mcr.originUnionId = originUnion.id
LEFT JOIN sys_dept currentUnit ON mcr.currentUnitId = currentUnit.dept_id
LEFT JOIN sys_union currentUnion ON mcr.currentUnionId = currentUnion.id
$condition
""");
sql.setCondition(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
/**
* 分工会 审核分页数据
*
* @param pageForm
*/
@Override
public Pagination branchUnionAuditPageData(MemberAuditPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
mcr.*,
u.sex,
u.mobile,
u.userName,
u.loginName,
u.deptName,
u.deptCode,
u.unionName,
u.unionCode,
state.stateName,
IF(mcr.stateId = @auditState,TRUE,FALSE) canAudit
FROM
`member_change_record` mcr
LEFT JOIN `user` u ON u.userId = mcr.userId
LEFT JOIN audit_state state ON state.stateId = mcr.stateId
$condition
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRole("admin")) {
cnd.and("u.unionId", "=", SecurityUtils.getUnionId());
}
cnd.asc("mcr.stateId");
String[] dateRange = pageForm.getDateRange();
if (Lang.isNotEmpty(dateRange)) {
cnd.and("date(mcr.applyTime)", ">=", dateRange[0]);
cnd.and("date(mcr.applyTime)", "<=", dateRange[1]);
}
switch (pageForm.getAudit()) {
case 0 -> cnd.and("mcr.stateId", ">=", MemberChangeApplyState.UNION);
case 1 -> cnd.and("mcr.stateId", ">", MemberChangeApplyState.UNION);
case 2 -> cnd.and("mcr.stateId", "=", MemberChangeApplyState.UNION);
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword());
seg.orLike("u.loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
sql.setParam("auditState", MemberChangeApplyState.UNION);
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), pageForm.getPageOrderBy());
} else {
cnd.asc("u.loginName");
}
sql.setCondition(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
/**
* 校工会 审核分页数据
*
* @param pageForm
*/
@Override
public Pagination masterUnionAuditPageData(MemberAuditPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
mcr.*,
u.sex,
u.mobile,
u.userName,
u.loginName,
u.deptName,
u.deptCode,
u.unionName,
u.unionCode,
state.stateName,
IF(mcr.stateId = @auditState,TRUE,FALSE) canAudit
FROM
`member_change_record` mcr
LEFT JOIN `user` u ON u.userId = mcr.userId
LEFT JOIN audit_state state ON state.stateId = mcr.stateId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.desc("mcr.applyTime");
cnd.asc("mcr.stateId");
String[] dateRange = pageForm.getDateRange();
if (Lang.isNotEmpty(dateRange)) {
cnd.and("date(mcr.applyTime)", ">=", dateRange[0]);
cnd.and("date(mcr.applyTime)", "<=", dateRange[1]);
}
// cnd.andEX("mcr.originUnionId", "=", pageForm.getUnionId());
cnd.andEX("u.unionId", "=", pageForm.getUnionId());
switch (pageForm.getAudit()) {
case 0 -> cnd.and("mcr.stateId", ">=", MemberChangeApplyState.SCHOOL_UNION);
case 1 -> cnd.and("mcr.stateId", ">", MemberChangeApplyState.SCHOOL_UNION);
case 2 -> cnd.and("mcr.stateId", "=", MemberChangeApplyState.SCHOOL_UNION);
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword());
seg.orLike("u.loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
sql.setParam("auditState", MemberChangeApplyState.SCHOOL_UNION);
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), pageForm.getPageOrderBy());
} else {
cnd.asc("u.loginName");
}
sql.setCondition(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void userUnitMove(List<MemberChangeRecord> changeRecords) {
Date date = new Date();
Audit audit = new Audit();
audit.setAuditPass(true);
audit.setAuditOpinion(MemberOrigin.BATCH.getDescription());
dao().insert(audit);
for (MemberChangeRecord record : changeRecords) {
record.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
record.setType(UserChangeType.UNIT_CHANGE.getCode());
record.setApplyTime(date);
record.setApplyOrigin(MemberChangeOrigin.SCHOOL.getCode());
record.setStateId(MemberChangeApplyState.SUCCESS);
record.setSchoolAuditId(audit.getId());
Chain chain = Chain.make("deptId", record.getCurrentUnitId()).add("threeUnitId", record.getCurrentThreeUnitId());
dao().update(SysUser.class, chain, Cnd.where("userId", "=", record.getUserId()));
}
dao().insert(changeRecords);
}
}
@@ -0,0 +1,130 @@
package com.ruoyi.member.service.impl;
import cn.hutool.core.collection.ListUtil;
import com.ruoyi.common.core.service.BaseServiceImpl;
import com.ruoyi.member.api.constant.MemberMode;
import com.ruoyi.member.api.domain.MemberHistory;
import com.ruoyi.member.service.MemberHistoryService;
import com.ruoyi.system.api.domain.SysDept;
import com.ruoyi.system.api.domain.SysUnionGroup;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.lang.Lang;
import org.nutz.lang.random.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/**
* @ClassName MemberHistoryServiceImpl
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/19 11:18
* @Version 1.0
*/
@Service
public class MemberHistoryServiceImpl extends BaseServiceImpl<MemberHistory> implements MemberHistoryService {
public MemberHistoryServiceImpl(Dao dao) {
super(dao);
}
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Resource
private DataSourceTransactionManager dataSourceTransactionManager;
@Resource
private TransactionDefinition transactionDefinition;
/**
* 存档
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void archive(Integer year) {
List<MemberHistory> members = listEntity(Sqls.create("SELECT * from sys_user where member = @memberType").setParam("memberType", MemberMode.NORMAL.getCode()));
//工会小组id
List<SysUnionGroup> unionGroups = dao().query(SysUnionGroup.class, Cnd.NEW());
Map<String, SysUnionGroup> unionGroupMap = unionGroups.stream().collect(Collectors.toMap(SysUnionGroup::getId, v -> v));
List<SysDept> depts = dao().query(SysDept.class, Cnd.where("unitLevel", "=", 2));
Map<Long, SysDept> deptMap = depts.stream().collect(Collectors.toMap(v -> v.getDeptId(), v -> v));
int memberHistoryNum = count(Cnd.where("year", "=", year));
if (memberHistoryNum > 0) {
clear(Cnd.where("year", "=", year));
}
for (MemberHistory member : members) {
member.setId(R.UU32());
member.setYear(year);
SysDept sysDept = deptMap.get(member.getDeptId());
if (Lang.isNotEmpty(sysDept)) {
SysUnionGroup sysUnionGroup = unionGroupMap.get(sysDept.getUnionGroupId());
if (Lang.isNotEmpty(sysUnionGroup)) {
member.setUnionGroupId(sysUnionGroup.getId());
member.setUnionGroupName(sysUnionGroup.getGroupName());
member.setUnionGroupCode(sysUnionGroup.getGroupCode());
}
}
}
List<List<MemberHistory>> memberSplits = ListUtil.split(members, 1000);
CountDownLatch countDownLatch = new CountDownLatch(memberSplits.size());
for (List<MemberHistory> splitUsers : memberSplits) {
new Thread(() -> {
dao().fastInsert(splitUsers);
countDownLatch.countDown();
}).start();
}
try {
countDownLatch.await();
} catch (Exception e) {
}
}
public void doSave(List<MemberHistory> memberHistories, CountDownLatch memberCountDownLatch, AtomicBoolean hasError, CountDownLatch mainLatch) {
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
try {
dao().insert(memberHistories);
} catch (Throwable throwable) {
throwable.printStackTrace();
hasError.set(true);
} finally {
memberCountDownLatch.countDown();
}
try {
mainLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
hasError.set(true);
}
//事务操作
if (hasError.get()) {
dataSourceTransactionManager.rollback(transactionStatus);
} else {
dataSourceTransactionManager.commit(transactionStatus);
}
}
}
@@ -0,0 +1,51 @@
package com.ruoyi.member.service.impl;
import com.ruoyi.common.core.service.BaseServiceImpl;
import com.ruoyi.member.api.constant.*;
import com.ruoyi.member.api.domain.Audit;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.service.MemberInfoBatchMakeService;
import org.nutz.dao.Dao;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName MemberInfoBatchMakeServiceImpl
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/19 15:27
* @Version 1.0
*/
@Service
public class MemberInfoBatchMakeServiceImpl extends BaseServiceImpl implements MemberInfoBatchMakeService {
public MemberInfoBatchMakeServiceImpl(Dao dao) {
super(dao);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void joinMemberFamily(Long[] userIds) {
UserMode.addMemberRole(userIds);
Audit audit = new Audit();
audit.setAuditPass(true);
audit.setAuditOpinion(MemberOrigin.BATCH.getDescription());
dao().insert(audit);
List<MemberChangeRecord> changeRecords = Arrays.stream(userIds).map(v -> {
MemberChangeRecord record = new MemberChangeRecord();
record.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
record.setType(UserChangeType.RESTORE.getCode());
record.setUserId(v);
record.setApplyTime(new Date());
record.setApplyOrigin(MemberChangeOrigin.SCHOOL.getCode());
record.setStateId(MemberChangeApplyState.SUCCESS);
record.setSchoolAuditId(audit.getId());
return record;
}).collect(Collectors.toList());
dao().insert(changeRecords);
}
}
@@ -0,0 +1,138 @@
package com.ruoyi.member.service.impl;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.constant.UserConstants;
import com.ruoyi.common.core.service.BaseServiceImpl;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.*;
import com.ruoyi.member.api.domain.MemberChangeRecord;
import com.ruoyi.member.api.domain.UserHistory;
import com.ruoyi.member.service.MemberService;
import com.ruoyi.system.api.domain.SysUser;
import org.apache.poi.ss.formula.functions.T;
import org.nutz.dao.Dao;
import org.nutz.dao.entity.Entity;
import org.nutz.lang.Lang;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* @ClassName MemberServiceImpl
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/21 17:16
* @Version 1.0
*/
@Service
public class MemberServiceImpl extends BaseServiceImpl implements MemberService {
private static final Logger log = LoggerFactory.getLogger(MemberServiceImpl.class);
public MemberServiceImpl(Dao dao) {
super(dao);
}
static final Long COMMON_USER_ROLE = 2L;
/**
* 补充成员
*
* @param user 用户
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void
supplementMember(SysUser user) {
user.setCreateBy(SecurityUtils.getUsername());
user.setPassword(SecurityUtils.encryptPassword(UserConstants.DEFAULT_PASSWORD));
user.setMemberOrigin(MemberOrigin.MAKE.getCode());
dao().insert(user);
UserMode.addMemberRole(user.getUserId(), user.getMemberOrigin());
//添加到用户历史表
SysUser new_user = dao().fetch(SysUser.class, user.getUserId());
dao().fetchLinks(new_user, "dept");
UserHistory userHistory = new UserHistory();
BeanUtils.copyProperties(new_user, userHistory);
userHistory.setChangeTime(new Date());
userHistory.setChangeType(UserChangeType.NEW.getCode());
//添加到会员变更表
MemberChangeRecord record = new MemberChangeRecord();
record.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
record.setType(UserChangeType.NEW.getCode());
record.setUserId(new_user.getUserId());
record.setCurrentUnitId(new_user.getDeptId());
record.setCurrentUnionId(new_user.getDept().getUnionId());
record.setApplyTime(new Date());
if (AuthUtil.hasAnyRoles("admin,A06")) {
record.setApplyOrigin(MemberChangeOrigin.SCHOOL.getCode());
} else {
record.setApplyOrigin(MemberChangeOrigin.UNION.getCode());
}
record.setRecordMode(MemberChangeRecordMode.MEMBER.getCode());
record.setStateId(MemberChangeApplyState.SUCCESS);
dao().insert(record);
}
@Override
public Long getDeptId(Map<String, Long> codeMap, Map<String, Long> nameMap, String code, String name) {
if (StrUtil.isNotBlank(code) && StrUtil.isNotBlank(name) || (StrUtil.isNotBlank(code) && StrUtil.isBlank(name))) {
return codeMap.get(code);
} else if (StrUtil.isBlank(code) && StrUtil.isNotBlank(name)) {
return nameMap.get(name);
} else {
return null;
}
}
@Override
public <T> void largeQuantitiesInsert(List<T> list, Integer mode, Boolean isFastInsert) {
if (Lang.isEmpty(list)) return;
try {
// 创建一个固定大小的线程池
int numberOfThreads = 10; // 可以根据服务器性能调整线程池大小
ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads);
// 将sources分成若干批
int batchSize = 200; // 每批处理的数据量,可以根据实际情况调整
for (int i = 0; i < list.size(); i += batchSize) {
final int end = Math.min(i + batchSize, list.size());
List<T> batch = list.subList(i, end);
executorService.submit(() -> {
if (mode == 1) {
if (isFastInsert) {
dao().fastInsert(batch);
} else {
dao().insert(batch);
}
} else {
dao().updateIgnoreNull(batch);
}
});
}
executorService.shutdown();
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
log.error(e.getMessage());
}
}
}
@@ -0,0 +1,179 @@
package com.ruoyi.member.service.impl;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.service.BaseServiceImpl;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.api.constant.MemberMode;
import com.ruoyi.member.api.constant.MemberPageForm;
import com.ruoyi.member.api.constant.MemberStatus;
import com.ruoyi.member.service.MemberStatisticQueryService;
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.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/**
* @ClassName MemberStatisticQueryServiceImpl
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/20 10:40
* @Version 1.0
*/
@Service
public class MemberStatisticQueryServiceImpl extends BaseServiceImpl implements MemberStatisticQueryService {
public MemberStatisticQueryServiceImpl(Dao dao) {
super(dao);
}
@Override
public Pagination pageData(PageForm pageForm, Integer year, String unionId, Long unitId, String unionGroupId, Long threeUnitId, List<String> personTypes, List<String> userStates, List<String> memberStatus,
List<String> sexs,
List<Integer> age,
String field,
String fieldInputValue,
Object[] fieldSelectValues,
String fieldDateValue,
String retireTime) {
int yyyy = Calendar.getInstance().get(Calendar.YEAR);
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("SELECT * from $table $condition");
if (year == yyyy) {
sql.setVar("table", "user");
} else {
sql.setVar("table", "member_his");
cnd.andEX("year", "=", year);
}
cnd.andEX("unionId", "=", unionId);
cnd.andEX("deptId", "=", unitId);
cnd.andEX("unionGroupId", "=", unionGroupId);
cnd.andEX("threeUnitId", "=", threeUnitId);
cnd.andEX("personType", "in", personTypes);
cnd.andEX("userState", "in", userStates);
if (memberStatus != null && memberStatus.size() > 0) {
cnd.andEX("memberStatus", "in", memberStatus);
} else {
cnd.and("member", "=", MemberMode.NORMAL.getCode());
SqlExpressionGroup group = new SqlExpressionGroup();
List<Integer> status = new ArrayList<>();
status.add(MemberStatus.NORMAL.getCode());
status.add(MemberStatus.TURN_IN.getCode());
status.add(MemberStatus.RESTORE.getCode());
group.and("memberStatus", "in", status);
group.or("memberStatus", "IS", null);
cnd.and(group);
}
if (StrUtil.isNotBlank(retireTime)){
cnd.and("DATE_FORMAT(retireTime, '%Y-%m')","=",retireTime);
}
if (sexs != null && sexs.size() > 0) {
cnd.andEX("sex", "in", sexs);
}
if (age != null && age.size() > 0 && age.get(1) != 0) {
cnd.andEX("age", "between", age);
}
// if (StrUtil.isNotBlank(field) && Lang.isNotEmpty(fieldValue)) {
// System.out.println(1);
// }
if (!AuthUtil.hasAnyRole("admin,A06")) {
if (AuthUtil.hasRole("H04")) {
cnd.and("unionId", "=", SecurityUtils.getUnionId());
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.and("unionGroupId", "=", SecurityUtils.getUnionGroupId());
}
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), SqlUtil.getOrderBy(pageForm.getPageOrderBy()));
} else {
cnd.asc("unionId");
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("userName", pageForm.getSearchKeyword());
seg.orLike("loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
sql.setCondition(cnd);
Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> list = pagination.getList();
for (NutMap nutMap : list) {
if(!SecurityUtils.isAdmin()) {
nutMap.put("idcard", "******");
}
}
pagination.setList(list);
return pagination;
}
/**
* excel导出数据
*
* @param pageForm
* @return
*/
@Override
public List<NutMap> exportList(MemberPageForm pageForm) {
int yyyy = Calendar.getInstance().get(Calendar.YEAR);
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("SELECT * from $table $condition");
if (pageForm.getYear() != null) {
if (pageForm.getYear() == yyyy) {
sql.setVar("table", "user");
} else {
sql.setVar("table", "member_his");
cnd.andEX("year", "=", pageForm.getYear());
}
} else {
sql.setVar("table", "user");
}
if(pageForm.getIsMember()!=null){
cnd.and("member", "=", pageForm.getIsMember());
}else{
cnd.and("member", "=", MemberMode.NORMAL.getCode());
}
if (AuthUtil.hasAnyRole("admin,A06")) {
cnd.andEX("unionId", "=", pageForm.getUnionId());
} else if (AuthUtil.hasRole("H04")) {
cnd.andEX("unionId", "=", SecurityUtils.getUnionId());
} else if (AuthUtil.hasRole("unionGroupLeader")) {
cnd.andEX("unionId", "=", SecurityUtils.getUnionId());
cnd.andEX("unionGroupId", "=", SecurityUtils.getUnionGroupId());
}
cnd.andEX("deptId", "=", pageForm.getUnitId());
cnd.andEX("unionGroupId", "=", pageForm.getUnionGroupId());
cnd.andEX("threeUnitId", "=", pageForm.getThreeUnitId());
cnd.andEX("personType", "in", pageForm.getPersonTypes());
cnd.andEX("userState", "in", pageForm.getUserStates());
if (StrUtil.isNotBlank(pageForm.getRetireTime())){
cnd.and("DATE_FORMAT(retireTime, '%Y-%m')","=",pageForm.getRetireTime());
}
sql.setCondition(cnd);
return listMap(sql);
}
}
@@ -0,0 +1,155 @@
package com.ruoyi.member.service.impl;
import com.ruoyi.common.core.service.BaseServiceImpl;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.service.MemberStatisticSexAgeService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.lang.util.NutMap;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/**
* @ClassName MemberStatisticSexAgeServiceImpl
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/21 9:28
* @Version 1.0
*/
@Service
public class MemberStatisticSexAgeServiceImpl extends BaseServiceImpl implements MemberStatisticSexAgeService {
public MemberStatisticSexAgeServiceImpl(Dao dao) {
super(dao);
}
public static final List<NutMap> commonLabelList = new ArrayList<>() {{
add(NutMap.NEW().addv("prop", "总人数").addv("label", "总人数"));
add(NutMap.NEW().addv("prop", "男会员").addv("label", "男会员"));
add(NutMap.NEW().addv("prop", "女会员").addv("label", "女会员"));
add(NutMap.NEW().addv("prop", "小于等于40岁会员").addv("label", "小于等于40岁会员"));
add(NutMap.NEW().addv("prop", "40~50").addv("label", "40~50"));
add(NutMap.NEW().addv("prop", "50~55").addv("label", "50~55"));
add(NutMap.NEW().addv("prop", "大于55").addv("label", "大于55"));
}};
/**
* 性别 年龄统计
*
* @param searchType 1分工会 2单位
* @param year 年度
* @param unionId 工会id
* @param deptId 单位id
* @param userTypes 人员类型
* @return
*/
@Override
public NutMap list(int searchType, int year, String unionId, Long deptId, List<String> userTypes) {
Cnd cnd = Cnd.NEW();
if (searchType == 1) {
Sql sql = Sqls.create("""
SELECT
gh.id,
gh.unionName,
gh.unionCode,
$totalSql,
count( CASE WHEN m.sex = '0' $yearCnd THEN 1 ELSE NULL END ) AS '男会员',
count( CASE WHEN m.sex = '1' $yearCnd THEN 1 ELSE NULL END ) AS '女会员',
count( CASE WHEN TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())<= 40 $yearCnd THEN 1 ELSE NULL END) AS '小于等于40岁会员',
count( CASE WHEN TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())> 40
AND TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())<= 50
$yearCnd
THEN 1 ELSE NULL END) AS '40~50',
count( CASE WHEN TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())> 50
AND TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())<= 55
$yearCnd
THEN 1 ELSE NULL END) AS '50~55',
count( CASE WHEN TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())> 55
$yearCnd
THEN 1 ELSE NULL END) AS '大于55'\s
FROM
sys_union gh
LEFT JOIN $memberTable m ON m.unionId = gh.id\s
$condition
""");
if (year == Calendar.getInstance().get(Calendar.YEAR)) {
sql.setVar("memberTable", "member");
sql.setVar("totalSql", "count( m.userId ) AS '总人数'");
} else {
sql.setVar("memberTable", "member_his");
sql.setVar("yearCnd", "AND m.`year` = %d".formatted(year));
sql.setVar("totalSql", "count( CASE WHEN m.`year` = %d THEN 1 ELSE NULL END ) AS '总人数'".formatted(year));
}
cnd.groupBy("gh.id");
cnd.asc("gh.unionCode");
cnd.andEX("gh.id", "=", unionId);
if (!AuthUtil.hasAnyRole("admin,A06")) {
cnd.andEX("gh.id", "=", SecurityUtils.getUnionId());
}
sql.setCondition(cnd);
List dataList = listMap(sql);
List<NutMap> labelList = new ArrayList<>(commonLabelList);
labelList.add(0, NutMap.NEW().addv("prop", "unionName").addv("label", "分工会"));
labelList.add(1, NutMap.NEW().addv("prop", "unionCode").addv("label", "分工会编码"));
return NutMap.NEW().addv("labelList", labelList).addv("dataList", dataList);
} else {
Sql sql = Sqls.create("""
SELECT
dw.dept_id as deptId,
dw.dept_name as deptName,
dw.dept_code as deptCode,
$totalSql,
count( CASE WHEN m.sex = '0' $yearCnd THEN 1 ELSE NULL END ) AS '男会员',
count( CASE WHEN m.sex = '1' $yearCnd THEN 1 ELSE NULL END ) AS '女会员',
count( CASE WHEN TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())<= 40 $yearCnd THEN 1 ELSE NULL END) AS '小于等于40岁会员',
count( CASE WHEN TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())> 40
AND TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())<= 50
$yearCnd
THEN 1 ELSE NULL END) AS '40~50',
count( CASE WHEN TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())> 50
AND TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())<= 55
$yearCnd
THEN 1 ELSE NULL END) AS '50~55',
count( CASE WHEN TIMESTAMPDIFF ( YEAR, m.birthday, CURDATE())> 55
$yearCnd
THEN 1 ELSE NULL END) AS '大于55'\s
FROM
sys_dept dw
LEFT JOIN $memberTable m ON m.deptId = dw.dept_id\s
$condition
""");
if (year == Calendar.getInstance().get(Calendar.YEAR)) {
sql.setVar("memberTable", "member");
sql.setVar("totalSql", "count( m.userId ) AS '总人数'");
} else {
sql.setVar("memberTable", "member_his");
sql.setVar("yearCnd", "AND m.`year` = %d".formatted(year));
sql.setVar("totalSql", "count( CASE WHEN m.`year` = %d THEN 1 ELSE NULL END ) AS '总人数'".formatted(year));
}
cnd.groupBy("dw.dept_id");
cnd.asc("dw.dept_code");
cnd.and("dw.parent_id", "=", 1);
cnd.andEX("dw.dept_id", "=", deptId);
if (!AuthUtil.hasAnyRole("admin,A06")) {
cnd.andEX("dw.union_id", "=", SecurityUtils.getUnionId());
}
sql.setCondition(cnd);
List dataList = listMap(sql);
List<NutMap> labelList = new ArrayList<>(commonLabelList);
labelList.add(0, NutMap.NEW().addv("prop", "deptName").addv("label", "单位"));
labelList.add(1, NutMap.NEW().addv("prop", "deptCode").addv("label", "单位编码"));
return NutMap.NEW().addv("labelList", labelList).addv("dataList", dataList);
}
}
}
@@ -0,0 +1,130 @@
package com.ruoyi.member.service.impl;
import com.ruoyi.common.core.service.BaseServiceImpl;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.service.MemberStatisticUserTypeService;
import com.ruoyi.system.api.domain.SysDictData;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.lang.util.NutMap;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName MemberStatisticUserTypeServiceImpl
* @Description TODO
* @Author zhaoxinyu
* @Date 2022/12/20 14:27
* @Version 1.0
*/
@Service
public class MemberStatisticUserTypeServiceImpl extends BaseServiceImpl implements MemberStatisticUserTypeService {
public MemberStatisticUserTypeServiceImpl(Dao dao) {
super(dao);
}
@Override
public NutMap listByUnion(String unionId, String unitId) {
List<SysDictData> userTypeDictDataList = dao().query(SysDictData.class, Cnd.where("dictType", "=", "user_type"));
List<NutMap> labelList = new ArrayList<>();
StringBuilder userTypeSqlStr = new StringBuilder();
labelList.add(NutMap.NEW().addv("label", "分工会").addv("prop", "unionName"));
labelList.add(NutMap.NEW().addv("label", "分工会编码").addv("prop", "unionCode"));
Sql sql = Sqls.create("""
SELECT
gh.id AS unionId,
gh.unionName,
gh.unionCode,
count( CASE WHEN u.member = 1 THEN 1 ELSE NULL END ) AS '小计',
$userTypeSql
FROM
sys_union gh
LEFT JOIN `user` u ON u.unionid = gh.id\s
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.groupBy("gh.id");
cnd.asc("gh.unionCode");
cnd.andEX("gh.id", "=", unionId);
if (!AuthUtil.hasAnyRole(List.of("admin", "A06"))) {
cnd.and("gh.id", "=", SecurityUtils.getUnionId());
}
sql.setCondition(cnd);
for (int i = 0; i < userTypeDictDataList.size(); i++) {
SysDictData dictData = userTypeDictDataList.get(i);
userTypeSqlStr.append("count( CASE WHEN u.personType = '%s' and u.member = 1 THEN 1 ELSE NULL END ) AS '%s'".formatted(dictData.getDictValue(), dictData.getDictLabel()));
if (i != userTypeDictDataList.size() - 1) {
userTypeSqlStr.append(",");
}
labelList.add(NutMap.NEW().addv("label", dictData.getDictLabel()).addv("prop", dictData.getDictLabel()));
}
labelList.add(NutMap.NEW().addv("label", "小计").addv("prop", "小计"));
sql.setVar("userTypeSql", userTypeSqlStr.toString());
List<NutMap> dataList = listMap(sql);
return NutMap.NEW().addv("labelList", labelList).addv("dataList", dataList);
}
@Override
public NutMap listByUnit(String unitId) {
List<SysDictData> userTypeDictDataList = dao().query(SysDictData.class, Cnd.where("dictType", "=", "user_type"));
List<NutMap> labelList = new ArrayList<>();
StringBuilder userTypeSqlStr = new StringBuilder();
labelList.add(NutMap.NEW().addv("label", "单位").addv("prop", "deptName"));
labelList.add(NutMap.NEW().addv("label", "单位编码").addv("prop", "deptCode"));
labelList.add(NutMap.NEW().addv("label", "分工会").addv("prop", "unionName"));
labelList.add(NutMap.NEW().addv("label", "分工会编码").addv("prop", "unionCode"));
Sql sql = Sqls.create("""
SELECT
dw.dept_id AS deptId,
dw.dept_name AS deptName,
dw.dept_code AS deptCode,
gh.unionName,
gh.unionCode,
count( CASE WHEN u.member = 1 THEN 1 ELSE NULL END ) AS '小计',
$userTypeSql
FROM
sys_dept dw
LEFT JOIN `user` u ON u.deptId = dw.dept_id
LEFT JOIN sys_union gh ON gh.id = dw.union_id
$condition
""");
Cnd cnd = Cnd.NEW();
// cnd.and("dw.parent_id", "=", 100);
cnd.andEX("dw.unit_level", "=", 2);
cnd.andEX("dw.dept_id", "=", unitId);
cnd.groupBy("dw.dept_id");
cnd.asc("dw.dept_code");
if (!AuthUtil.hasAnyRole(List.of("admin", "A06"))) {
cnd.and("dw.union_id", "=", SecurityUtils.getUnionId());
}
sql.setCondition(cnd);
for (int i = 0; i < userTypeDictDataList.size(); i++) {
SysDictData dictData = userTypeDictDataList.get(i);
userTypeSqlStr.append("count( CASE WHEN u.personType = '%s' and u.member = 1 THEN 1 ELSE NULL END ) AS '%s'".formatted(dictData.getDictValue(), dictData.getDictLabel()));
if (i != userTypeDictDataList.size() - 1) {
userTypeSqlStr.append(",");
}
labelList.add(NutMap.NEW().addv("label", dictData.getDictLabel()).addv("prop", dictData.getDictLabel()));
}
labelList.add(NutMap.NEW().addv("label", "小计").addv("prop", "小计"));
sql.setVar("userTypeSql", userTypeSqlStr.toString());
List<NutMap> dataList = listMap(sql);
return NutMap.NEW().addv("labelList", labelList).addv("dataList", dataList);
}
}
@@ -0,0 +1,58 @@
package com.ruoyi.member.util;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.ruoyi.member.constant.Ds;
import lombok.Getter;
import java.util.function.Supplier;
/**
* 数据源执行
*
* @author jug
* @date 2022/12/30
*/
@Getter
public class ProModuleDS {
/**
* 执行某个数据源下的业务代码 有返回值 不需要就返回null
*
* @param ds
* @param supplier
* @param <T>
* @return
*/
public static <T> T exec(Ds ds, Supplier<T> supplier) {
DynamicDataSourceContextHolder.clear();
switch (ds) {
case STAFFSERVICE -> DynamicDataSourceContextHolder.push("master");
case SYSTEM -> DynamicDataSourceContextHolder.push("system");
}
T t;
try {
t = supplier.get();
DynamicDataSourceContextHolder.clear();
return t;
} catch (Exception e) {
DynamicDataSourceContextHolder.clear();
throw new RuntimeException(e.getMessage());
}
}
public static void execVoid(Ds ds, Runnable runnable) {
DynamicDataSourceContextHolder.clear();
switch (ds) {
case STAFFSERVICE -> DynamicDataSourceContextHolder.push("master");
case SYSTEM -> DynamicDataSourceContextHolder.push("system");
}
try {
runnable.run();
DynamicDataSourceContextHolder.clear();
} catch (Exception e) {
DynamicDataSourceContextHolder.clear();
throw new RuntimeException(e.getMessage());
}
}
}
@@ -0,0 +1,89 @@
package com.ruoyi.memberPayment.controller;
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.hutool.core.date.DateUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.member.api.domain.MemberPayMent;
import com.ruoyi.memberPayment.service.MemberPayMentService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 会员会费记录导入
*/
@RestController
@RequestMapping("/memberPaymentImport")
@Slf4j
public class MemberPayMentImportController {
@Autowired
private MemberPayMentService memberPayMentService;
/**
* 模板下载
*
* @param response
*/
@GetMapping(value = "/downLoadExcelTemplate")
public void downLoadExcelTemplate(HttpServletResponse response) {
try {
List<MemberPayMent> dataList = new ArrayList<>() {{
add(new MemberPayMent()
.setLoginName("100001")
.setUserName("张三")
.setIsPay(true)
.setStartDate(new Date())
.setEndDate(DateUtil.offsetMonth(new Date(), 3))
.setMoney(new BigDecimal("100")));
}};
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, MemberPayMent.class, dataList);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=%s".formatted(URLEncoder.encode("模板.xlsx", StandardCharsets.UTF_8)));
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
log.error("导出会员信息失败{}", e.getMessage());
}
}
/**
* 读取excel
*
* @param multipartFile 多部分文件
* @return {@link AjaxResult}
*/
@PostMapping("/readExcel")
public AjaxResult readExcel(@RequestParam(name = "file") MultipartFile multipartFile) {
try {
ImportParams importParams = new ImportParams();
List<MemberPayMent> list = ExcelImportUtil.importExcel(multipartFile.getInputStream(), MemberPayMent.class, importParams);
return AjaxResult.success(memberPayMentService.checkData(list));
} catch (Exception e) {
return AjaxResult.warn(e.getMessage());
}
}
@PostMapping("/importData")
public AjaxResult importData(@RequestBody List<MemberPayMent> memberPayMents) {
memberPayMentService.insert(memberPayMents);
return AjaxResult.success();
}
}
@@ -0,0 +1,135 @@
package com.ruoyi.memberPayment.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.util.ArrayUtil;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.page.Pagination;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.memberPayment.service.MemberPayMentService;
import com.ruoyi.system.api.domain.SysDictData;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/memberPaymentRecords")
@Slf4j
public class MemberPayMentRecordsController {
@Autowired
private MemberPayMentService memberPayMentService;
@PostMapping("/pageData")
public AjaxResult pageData(@RequestBody PageForm pageForm,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) String unitId,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate
) {
Sql sql = memberPayMentService.recordSql(pageForm, unionId, unitId, startDate, endDate);
Pagination pagination = memberPayMentService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return AjaxResult.success(pagination);
}
/**
* 支付时间
*
* @return {@link AjaxResult}
*/
@GetMapping("/payTimes")
public AjaxResult payTimes() {
Sql sql = Sqls.create("""
SELECT id,startDate,endDate FROM `member_payment`
GROUP BY startDate,endDate
ORDER BY startDate ASC
""");
List<NutMap> list = memberPayMentService.listMap(sql);
return AjaxResult.success(list);
}
@DeleteMapping("/doDelete")
public AjaxResult doDelete(@RequestParam(required = false) String id) {
memberPayMentService.delete(id);
return AjaxResult.success();
}
@RequestMapping("/exportExcel")
public void exportExcel(HttpServletResponse response,
@RequestBody PageForm pageForm,
@RequestParam(required = false) String unionId,
@RequestParam(required = false) String unitId,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate,
@RequestParam String props) {
try {
Sql sql = memberPayMentService.recordSql(pageForm, unionId, unitId, startDate, endDate);
List<NutMap> dataList = memberPayMentService.listMap(sql);
List<SysDictData> dictDataList = memberPayMentService.dao().query(SysDictData.class, Cnd.where("dictType", "in", new String[]{"sys_user_sex", "user_type", "user_state"}));
String[] sys_user_sexes = dictDataList.stream().filter(v -> v.getDictType().equals("sys_user_sex")).map(v -> v.getDictLabel() + "_" + v.getDictValue()).toArray(String[]::new);
String[] user_types = dictDataList.stream().filter(v -> v.getDictType().equals("user_type")).map(v -> v.getDictLabel() + "_" + v.getDictValue()).toArray(String[]::new);
String[] user_states = dictDataList.stream().filter(v -> v.getDictType().equals("user_state")).map(v -> v.getDictLabel() + "_" + v.getDictValue()).toArray(String[]::new);
Map<String, String> propMap = Json.fromJson(Map.class, props);
List<ExcelExportEntity> entityList = new ArrayList<ExcelExportEntity>();
propMap.forEach((k, v) -> {
ExcelExportEntity excelExportEntity = new ExcelExportEntity(v, k, 20);
switch (k) {
case "sex" -> {
excelExportEntity.setAddressList(true);
excelExportEntity.setReplace(ArrayUtil.append(sys_user_sexes, "_null"));
}
case "personType" -> {
excelExportEntity.setAddressList(true);
excelExportEntity.setReplace(ArrayUtil.append(user_types, "_null"));
}
case "userState" -> {
excelExportEntity.setAddressList(true);
excelExportEntity.setReplace(ArrayUtil.append(user_states, "_null"));
}
case "isPay" -> {
excelExportEntity.setAddressList(true);
excelExportEntity.setReplace(new String[]{"是_true", "否_false"});
}
default -> {
}
}
entityList.add(excelExportEntity);
});
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, dataList);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String(("会员缴费记录.xlsx").getBytes(StandardCharsets.UTF_8), "ISO8859-1"));
workbook.write(response.getOutputStream());
workbook.close();
} catch (IOException e) {
log.error("导出会员缴费记录失败{}", e.getMessage());
}
}
}
@@ -0,0 +1,54 @@
package com.ruoyi.memberPayment.controller;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.memberPayment.service.MemberPayMentService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.lang.util.NutMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.List;
@RestController
@RequestMapping("/memberPaymentStatistics")
public class MemberPayMentStatisticsController {
@Autowired
private MemberPayMentService memberPayMentService;
@PostMapping("/unionStatistics")
public AjaxResult unionStatistics(@RequestParam(required = false) String unionId,
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) {
Sql sql = Sqls.create("""
SELECT
gh.id,
gh.unionName,
gh.unionCode,
count( DISTINCT mp.userId ) AS userTotal,
sum( CASE WHEN mp.isPay =1 THEN 1 ELSE 0 END ) payed,
sum( CASE WHEN mp.isPay =0 THEN 1 ELSE 0 END ) notPayed
FROM
sys_union gh
LEFT JOIN member_payment mp ON gh.id = mp.unionId AND mp.startDate = @startDate AND mp.endDate = @endDate
$condition
""");
sql.setParam("startDate", startDate);
sql.setParam("endDate", endDate);
Cnd cnd = Cnd.NEW();
cnd.andEX("gh.id", "=", unionId);
cnd.groupBy("gh.id");
cnd.asc("gh.unionCode");
sql.setCondition(cnd);
List<NutMap> list = memberPayMentService.listMap(sql);
return AjaxResult.success(list);
}
}
@@ -0,0 +1,44 @@
package com.ruoyi.memberPayment.service;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.service.BaseService;
import com.ruoyi.member.api.domain.MemberPayMent;
import org.nutz.dao.sql.Sql;
import java.util.Date;
import java.util.List;
public interface MemberPayMentService extends BaseService<MemberPayMent> {
/**
* 检验数据合法性
*
* @param list
* @return
*/
List<MemberPayMent> checkData(List<MemberPayMent> list);
/**
* 导入数据
*
* @param list
*/
void importData(List<MemberPayMent> list);
/**
* 记录sql
*
* @param pageForm 页面形式
* @param unionId 工会id
* @param unitId 单位标识
* @param startDate 开始日期
* @param endDate 结束日期
* @return {@link Sql}
*/
Sql recordSql(PageForm pageForm,
String unionId,
String unitId,
Date startDate,
Date endDate);
}
@@ -0,0 +1,107 @@
package com.ruoyi.memberPayment.service.impl;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.domain.PageForm;
import com.ruoyi.common.core.service.BaseServiceImpl;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.member.api.constant.MemberMode;
import com.ruoyi.member.api.domain.MemberPayMent;
import com.ruoyi.memberPayment.service.MemberPayMentService;
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.lang.util.NutMap;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service
public class MemberPayMentServiceImpl extends BaseServiceImpl<MemberPayMent> implements MemberPayMentService {
public MemberPayMentServiceImpl(Dao dao) {
super(dao);
}
@Override
public List<MemberPayMent> checkData(List<MemberPayMent> list) {
for (MemberPayMent memberPayMent : list) {
Sql sql = Sqls.create("select userId,deptId,unionId,member from `user` where loginName = @loginName and userName = @userName");
sql.setParam("userName", memberPayMent.getUserName());
sql.setParam("loginName", memberPayMent.getLoginName());
// SysUser user = dao().fetch(SysUser.class, Cnd.where("userName", "=", memberPayMent.getLoginName()).and("nickName", "=", memberPayMent.getUserName()));
NutMap userMap = fetch(sql);
if (userMap == null) {
memberPayMent.setErrMsg("用户信息不存在,请检查工号和姓名是否匹配!");
break;
}
if (userMap.getInt("member", 0) != MemberMode.NORMAL.getCode()) {
memberPayMent.setErrMsg("该用户不是会员");
break;
}
if (userMap.get("deptId") == null) {
memberPayMent.setErrMsg("该用户没有单位信息");
break;
}
if (userMap.get("unionId") == null) {
memberPayMent.setErrMsg("该用户没有分工会信息");
break;
}
memberPayMent.setUserId((Long) userMap.get("userId"));
memberPayMent.setDeptId((Long) userMap.get("userId"));
memberPayMent.setUnionId(userMap.getString("unionId"));
}
return list;
}
@Override
public void importData(List<MemberPayMent> list) {
}
@Override
public Sql recordSql(PageForm pageForm, String unionId, String unitId, Date startDate, Date endDate) {
Sql sql = Sqls.create("""
SELECT
mp.id,
mp.money,
mp.isPay,
DATE_FORMAT(mp.startDate,'%Y-%m-%d') as startDate,
DATE_FORMAT(mp.endDate,'%Y-%m-%d') as endDate,
u.userId,
u.userName,
u.loginName,
u.sex,
u.deptName,
u.deptCode,
u.unionName,
u.unionCode,
u.personType,
u.userState
FROM
`member_payment` mp
LEFT JOIN `user` u ON u.userId = mp.userId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("mp.startDate", "=", startDate);
cnd.andEX("mp.endDate", "=", endDate);
cnd.andEX("u.unionId", "=", unionId);
cnd.andEX("u.deptId", "=", unitId);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword());
seg.orLike("u.loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), SqlUtil.getOrderBy(pageForm.getPageOrderBy()));
}
sql.setCondition(cnd);
return sql;
}
}
@@ -0,0 +1,61 @@
# Tomcat
server:
port: 9210
# Spring
spring:
application:
# 应用名称
name: ruoyi-member
profiles:
# 环境配置
active: prod
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
nutz:
dao:
runtime:
#是否自动建表 默认true
create: true
#是否自动变更 建议不要打开 会出问题
migration: true
# 是否添加列 默认true
add-column: true
# 是否删除列 默认true
delete-column: false
# 是否删表重建,注意此功能会删除全部表及数据,一般应用于demo或测试 默认false
foce-create: false
# 是否检查索引 默认true
check-index: true
# 相关实体所在包
basepackage:
- com.ruoyi.member.api.domain
sql-manager:
#自定义sql管理模式 file和xml
mode: file
# 自定义sql文件路径
paths:
- sqls
json:
auto-unicode: true
quote-name: true
ignore-null: false
null-as-emtry: true
enabled: true
mode: compact
logging:
file:
name: logs/${spring.application.name}/info.log
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/ruoyi-member" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.ruoyi" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
</configuration>