Commit 213f97a6 authored by fangxinjiang's avatar fangxinjiang

权限批量导入

parent 7f973498
......@@ -532,6 +532,8 @@ public interface CommonConstants {
String SETTLE_DOMAIN_GET_ERROR = "获取结算主体信息失败!";
String SETTLE_DOMAIN_NOT_EXIST = "无对应项目信息";
/**
* c端机构节点 code
* @Author hgw
......
......@@ -90,4 +90,12 @@ public class UpmsDaprUtils {
}
return userR;
}
public R<SysUser> getSimpleUserByLoginName(String loginName) {
R<SysUser> userR = HttpDaprUtil.invokeMethodPost(daprUpmsProperties.getAppUrl(),daprUpmsProperties.getAppId(),"/user/inner/getSimpleUserByLoginName",loginName, SysUser.class, SecurityConstants.FROM_IN);
if (Common.isEmpty(userR)){
return R.failed("获取所有用户数据失败!");
}
return userR;
}
}
......@@ -19,15 +19,19 @@ package com.yifu.cloud.plus.v1.yifu.social.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.ErrorMessage;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.common.log.annotation.SysLog;
import com.yifu.cloud.plus.v1.yifu.social.entity.TSocialfundHouseRes;
import com.yifu.cloud.plus.v1.yifu.social.service.TSocialfundHouseResService;
import lombok.SneakyThrows;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
......@@ -119,4 +123,37 @@ public class TSocialfundHouseResController {
public R<Boolean> removeById(@PathVariable String id) {
return R.ok(tSocialfundHouseResService.removeById(id));
}
/**
* @Author fxj
* @Description 批量导入社保公积金审核权限
* @Date 16:59 2023/10/17
* @Param
* @return
**/
@SneakyThrows
@Operation(description = "批量新增社保公积金审核权限")
@SysLog("批量新增社保公积金审核权限")
@PostMapping("/importListAdd")
public R<List<ErrorMessage>> importListAdd(@RequestBody MultipartFile file) {
return tSocialfundHouseResService.importDiy(file.getInputStream());
}
/**
* @Author fxj
* @Description 批量新增社保|公积金办理权限
* @Date 16:59 2023/10/17
* @Param
* @return
**/
@SneakyThrows
@Operation(description = "批量新增社保|公积金办理权限")
@SysLog("批量新增社保|公积金办理权限")
@PostMapping("/importListAddAll")
public R<List<ErrorMessage>> importListAddAll(@RequestBody MultipartFile file,String type) {
if (CommonConstants.ZERO_STRING.equals(type) && CommonConstants.ONE_STRING.equals(type)){
return R.failed(CommonConstants.PARAM_INFO_ERROR);
}
return tSocialfundHouseResService.importDiyAll(file.getInputStream(),type);
}
}
......@@ -63,4 +63,7 @@ public interface TSocialfundHouseResService extends IService<TSocialfundHouseRes
**/
void deleteHandleUser(SysHouseHoldInfo holdInfo);
R<List<ErrorMessage>> importDiy(InputStream inputStream);
R<List<ErrorMessage>> importDiyAll(InputStream inputStream, String type);
}
......@@ -16,21 +16,46 @@
*/
package com.yifu.cloud.plus.v1.yifu.social.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
import com.alibaba.excel.util.ListUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yifu.cloud.plus.v1.yifu.admin.api.entity.SysUser;
import com.yifu.cloud.plus.v1.yifu.archives.vo.SocialAuthHandleImportVo;
import com.yifu.cloud.plus.v1.yifu.archives.vo.SocialAuthImportVo;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.ErrorMessage;
import com.yifu.cloud.plus.v1.yifu.common.core.util.ExcelUtil;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.common.dapr.util.UpmsDaprUtils;
import com.yifu.cloud.plus.v1.yifu.social.entity.SysBaseSetInfo;
import com.yifu.cloud.plus.v1.yifu.social.entity.SysHouseHoldInfo;
import com.yifu.cloud.plus.v1.yifu.social.entity.TSocialfundHouseRes;
import com.yifu.cloud.plus.v1.yifu.social.mapper.TSocialfundHouseResMapper;
import com.yifu.cloud.plus.v1.yifu.social.service.SysBaseSetInfoService;
import com.yifu.cloud.plus.v1.yifu.social.service.TSocialfundHouseResService;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.apache.shardingsphere.transaction.annotation.ShardingTransactionType;
import org.apache.shardingsphere.transaction.core.TransactionType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 社保公积金户权限配置表
......@@ -39,8 +64,12 @@ import java.util.List;
* @date 2022-11-02 09:13:07
*/
@Log4j2
@AllArgsConstructor
@Service
public class TSocialfundHouseResServiceImpl extends ServiceImpl<TSocialfundHouseResMapper, TSocialfundHouseRes> implements TSocialfundHouseResService {
@Autowired
private UpmsDaprUtils upmsDaprUtils;
private SysBaseSetInfoService baseSetInfoService;
/**
* 社保公积金户权限配置表简单分页查询
* @param tSocialfundHouseRes 社保公积金户权限配置表
......@@ -129,4 +158,376 @@ public class TSocialfundHouseResServiceImpl extends ServiceImpl<TSocialfundHouse
}
}
/**
* @Author fxj
* @Description 批量新增社保公积金审核权限
* @Date 16:59 2023/10/17
* @Param
* @return
**/
@Transactional(rollbackFor = Exception.class)
@ShardingTransactionType(TransactionType.BASE)
@Override
public R<List<ErrorMessage>> importDiy(InputStream inputStream) {
List<ErrorMessage> errorMessageList = new ArrayList<>();
ExcelUtil<SocialAuthImportVo> util1 = new ExcelUtil<>(SocialAuthImportVo.class);
Map<String, SysBaseSetInfo> fundBaseSetMap = null;
Map<String, SysBaseSetInfo> socialBaseSetMap = null;
// 获取社保公积金配置
List<SysBaseSetInfo> socialSet = baseSetInfoService.list(Wrappers.<SysBaseSetInfo>query().lambda()
.eq(SysBaseSetInfo::getBaseType,CommonConstants.ZERO_STRING)
.eq(SysBaseSetInfo::getDeleteFlag,CommonConstants.ZERO_STRING)
.groupBy(SysBaseSetInfo::getDepartName,SysBaseSetInfo::getProvince,SysBaseSetInfo::getCity,SysBaseSetInfo::getTown));
if (Common.isNotNull(socialSet)){
socialBaseSetMap = socialSet.stream().collect(Collectors.toMap(k->k.getDepartName(), k->k));
}
List<SysBaseSetInfo> fundSet = baseSetInfoService.list(Wrappers.<SysBaseSetInfo>query().lambda()
.eq(SysBaseSetInfo::getBaseType,CommonConstants.ONE_STRING)
.eq(SysBaseSetInfo::getDeleteFlag,CommonConstants.ZERO_STRING)
.groupBy(SysBaseSetInfo::getDepartName,SysBaseSetInfo::getProvince,SysBaseSetInfo::getCity,SysBaseSetInfo::getTown));
if (Common.isNotNull(fundSet)){
fundBaseSetMap = fundSet.stream().collect(Collectors.toMap(k->k.getDepartName(), k->k));
}
if (Common.isEmpty(socialBaseSetMap) || Common.isEmpty(fundBaseSetMap)){
return R.failed("获取社保及公积金户配置信息失败!");
}
Map<String, SysUser> userMap = new HashMap<>();
Map<String,String> existMap = new HashMap<>();
// 写法2:
// 匿名内部类 不用额外写一个DemoDataListener
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
try {
Map<String, SysBaseSetInfo> finalSocialBaseSetMap = socialBaseSetMap;
Map<String, SysBaseSetInfo> finalFundBaseSetMap = fundBaseSetMap;
EasyExcel.read(inputStream, SocialAuthImportVo.class, new ReadListener<SocialAuthImportVo>() {
/**
* 单次缓存的数据量
*/
public static final int BATCH_COUNT = CommonConstants.BATCH_COUNT;
/**
*临时存储
*/
private List<SocialAuthImportVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
@Override
public void invoke(SocialAuthImportVo data, AnalysisContext context) {
ReadRowHolder readRowHolder = context.readRowHolder();
Integer rowIndex = readRowHolder.getRowIndex();
data.setRowIndex(rowIndex+1);
ErrorMessage errorMessage = util1.checkEntity(data, data.getRowIndex());
if (Common.isNotNull(errorMessage)){
errorMessageList.add(errorMessage);
}else {
cachedDataList.add(data);
}
if (cachedDataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
saveData();
}
/**
* 加上存储数据库
*/
private void saveData() {
log.info("{}条数据,开始存储数据库!", cachedDataList.size());
importEntity(cachedDataList,errorMessageList, finalSocialBaseSetMap, finalFundBaseSetMap,userMap,existMap);
log.info("存储数据库成功!");
}
}).sheet().doRead();
}catch (Exception e){
log.error(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR,e);
return R.failed(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR);
}finally {
// 清理
socialBaseSetMap.clear();
fundBaseSetMap.clear();
}
return judgeAllMessage(errorMessageList);
}
private void importEntity(List<SocialAuthImportVo> excelVOList,
List<ErrorMessage> errorMessageList,
Map<String, SysBaseSetInfo> socialBaseSetMap,
Map<String, SysBaseSetInfo> fundBaseSetMap,
Map<String,SysUser> userMap,
Map<String,String> existMap) {
// 执行数据插入操作 组装
TSocialfundHouseRes save;
SysUser user;
R<SysUser> res;
TSocialfundHouseRes exist;
String temp;
SysBaseSetInfo baseSet = null;
for (int i = 0; i < excelVOList.size(); i++) {
SocialAuthImportVo excel = excelVOList.get(i);
// 数据合法情况
user = userMap.get(excel.getUserLoginName());
// 用户信息验证
if (Common.isEmpty(user)){
res = upmsDaprUtils.getSimpleUserByLoginName(excel.getUserLoginName());
if (Common.isNotNull(res) && Common.isNotNull(res.getData())){
user = res.getData();
userMap.put(user.getUsername(),user);
}else {
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"无有效状态的用户信息!"));
continue;
}
}
if (Common.isEmpty(user.getDeptName())){
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"对应登录账号无部门信息,请完善后导入"));
continue;
}
// 户验证
if (CommonConstants.ZERO_STRING.equals(excel.getType())){
baseSet = socialBaseSetMap.get(excel.getHouseHold());
if (Common.isEmpty(baseSet)){
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"未找到对应社保户数据!"));
continue;
}
}
if (CommonConstants.ONE_STRING.equals(excel.getType())){
baseSet = fundBaseSetMap.get(excel.getHouseHold());
if (Common.isEmpty(baseSet)){
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"未找到对应公积金户数据!"));
continue;
}
}
// 重复校验
temp = existMap.get(excel.getUserLoginName()
+CommonConstants.DOWN_LINE_STRING
+excel.getHouseHold());
if (Common.isNotNull(temp)){
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"对应账号的权限已存在,请勿重复导入"));
continue;
}else {
exist = baseMapper.selectOne(Wrappers.<TSocialfundHouseRes>query().lambda()
.eq(TSocialfundHouseRes::getFundHousehold,excel.getHouseHold())
.eq(TSocialfundHouseRes::getHouseNameType,excel.getType())
.eq(TSocialfundHouseRes::getUserId,user.getUserId())
.last(CommonConstants.LAST_ONE_SQL));
if (Common.isNotNull(exist)){
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"对应账号的权限已存在,请勿重复导入"));
continue;
}
}
// 初始化及新增数据
save = new TSocialfundHouseRes();
save.setAuthType(CommonConstants.ZERO_STRING);
save.setFundHousehold(CommonConstants.ZERO_STRING.equals(baseSet.getBaseType())?null:baseSet.getDepartName());
save.setSocialHousehold(CommonConstants.ZERO_STRING.equals(baseSet.getBaseType())?baseSet.getDepartName():null);
save.setStatus(CommonConstants.ZERO_STRING);
save.setUserId(user.getUserId());
save.setHouseNameType(baseSet.getBaseType());
save.setCreateTime(LocalDateTime.now());
save.setUserName(user.getUsername());
save.setUserDeptName(user.getDeptName());
insertExcel(save);
// 加入map 验证当前表单数据是否重复
existMap.put(excel.getUserLoginName()
+CommonConstants.DOWN_LINE_STRING
+excel.getHouseHold(),excel.getHouseHold());
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),CommonConstants.SAVE_SUCCESS,CommonConstants.GREEN));
}
}
/**
* 插入excel bad record
*/
private void insertExcel(TSocialfundHouseRes entity) {
this.save(entity);
}
/**
* @Author fxj
* @Description 判断所有返回数据,是否全部为正确的
* @Date 18:01 2023/10/18
* @Param
* @return
**/
private R<List<ErrorMessage>> judgeAllMessage(List<ErrorMessage> errorMessageList) {
if (!errorMessageList.isEmpty() && errorMessageList.stream().noneMatch(e-> e.getColor().equals(CommonConstants.RED))) {
return R.ok();
}
return R.ok(errorMessageList);
}
/**
* @Author fxj
* @Description 批量新增社保公积金审核权限
* @Date 16:59 2023/10/17
* @Param
* @return
**/
@Transactional(rollbackFor = Exception.class)
@ShardingTransactionType(TransactionType.BASE)
@Override
public R<List<ErrorMessage>> importDiyAll(InputStream inputStream,String type) {
List<ErrorMessage> errorMessageList = new ArrayList<>();
ExcelUtil<SocialAuthHandleImportVo> util1 = new ExcelUtil<>(SocialAuthHandleImportVo.class);
Map<String, SysBaseSetInfo> baseSetInfoMap= new HashMap<>();
List<SysBaseSetInfo> setInfos = baseSetInfoService.list(Wrappers.<SysBaseSetInfo>query().lambda()
.eq(SysBaseSetInfo::getBaseType,CommonConstants.ZERO_STRING)
.eq(SysBaseSetInfo::getDeleteFlag,CommonConstants.ZERO_STRING)
.groupBy(SysBaseSetInfo::getDepartName,SysBaseSetInfo::getProvince,SysBaseSetInfo::getCity,SysBaseSetInfo::getTown));
if (Common.isNotNull(setInfos)){
baseSetInfoMap = setInfos.stream().collect(Collectors.toMap(k->k.getDepartName(),k->k));
}
if (Common.isEmpty(baseSetInfoMap)){
return R.failed("获取户配置信息失败!");
}
Map<String, SysUser> userMap = new HashMap<>();
Map<String,String> existMap = new HashMap<>();
// 写法2:
// 匿名内部类 不用额外写一个DemoDataListener
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
try {
Map<String, SysBaseSetInfo> finalBaseSetInfoMap = baseSetInfoMap;
EasyExcel.read(inputStream, SocialAuthHandleImportVo.class, new ReadListener<SocialAuthHandleImportVo>() {
/**
* 单次缓存的数据量
*/
public static final int BATCH_COUNT = CommonConstants.BATCH_COUNT;
/**
*临时存储
*/
private List<SocialAuthHandleImportVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
@Override
public void invoke(SocialAuthHandleImportVo data, AnalysisContext context) {
ReadRowHolder readRowHolder = context.readRowHolder();
Integer rowIndex = readRowHolder.getRowIndex();
data.setRowIndex(rowIndex+1);
ErrorMessage errorMessage = util1.checkEntity(data, data.getRowIndex());
if (Common.isNotNull(errorMessage)){
errorMessageList.add(errorMessage);
}else {
cachedDataList.add(data);
}
if (cachedDataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
saveData();
}
/**
* 加上存储数据库
*/
private void saveData() {
log.info("{}条数据,开始存储数据库!", cachedDataList.size());
importEntity(cachedDataList,errorMessageList, finalBaseSetInfoMap,userMap,existMap,type);
log.info("存储数据库成功!");
}
}).sheet().doRead();
}catch (Exception e){
log.error(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR,e);
return R.failed(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR);
}finally {
// 清理
baseSetInfoMap.clear();
}
return judgeAllMessage(errorMessageList);
}
private void importEntity(List<SocialAuthHandleImportVo> excelVOList,
List<ErrorMessage> errorMessageList,
Map<String, SysBaseSetInfo> baseSetInfoMap,
Map<String,SysUser> userMap,
Map<String,String> existMap,
String type) {
// 执行数据插入操作 组装
TSocialfundHouseRes save;
SysUser user;
R<SysUser> res;
TSocialfundHouseRes exist;
String temp;
SysBaseSetInfo baseSet = null;
for (int i = 0; i < excelVOList.size(); i++) {
SocialAuthHandleImportVo excel = excelVOList.get(i);
// 数据合法情况
user = userMap.get(excel.getUserLoginName());
// 用户信息验证
if (Common.isEmpty(user)){
res = upmsDaprUtils.getSimpleUserByLoginName(excel.getUserLoginName());
if (Common.isNotNull(res) && Common.isNotNull(res.getData())){
user = res.getData();
userMap.put(user.getUsername(),user);
}else {
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"无有效状态的用户信息!"));
continue;
}
}
if (Common.isEmpty(user.getDeptName())){
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"对应登录账号无部门信息,请完善后导入"));
continue;
}
// 户验证
if (CommonConstants.ZERO_STRING.equals(type)){
baseSet = baseSetInfoMap.get(excel.getHouseHold());
if (Common.isEmpty(baseSet)){
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"未找到对应社保户数据!"));
continue;
}
}
if (CommonConstants.ONE_STRING.equals(type)){
baseSet = baseSetInfoMap.get(excel.getHouseHold());
if (Common.isEmpty(baseSet)){
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"未找到对应公积金户数据!"));
continue;
}
}
// 重复校验
temp = existMap.get(excel.getUserLoginName()
+CommonConstants.DOWN_LINE_STRING
+excel.getHouseHold());
if (Common.isNotNull(temp)){
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"对应账号的权限已存在,请勿重复导入"));
continue;
}else {
if (CommonConstants.ZERO_STRING.equals(type)){
exist = baseMapper.selectOne(Wrappers.<TSocialfundHouseRes>query().lambda()
.eq(TSocialfundHouseRes::getSocialHousehold,excel.getHouseHold())
.eq(TSocialfundHouseRes::getUserId,user.getUserId())
.eq(TSocialfundHouseRes::getHouseNameType,type)
.last(CommonConstants.LAST_ONE_SQL));
}else {
exist = baseMapper.selectOne(Wrappers.<TSocialfundHouseRes>query().lambda()
.eq(TSocialfundHouseRes::getFundHousehold,excel.getHouseHold())
.eq(TSocialfundHouseRes::getUserId,user.getUserId())
.eq(TSocialfundHouseRes::getHouseNameType,type)
.last(CommonConstants.LAST_ONE_SQL));
}
if (Common.isNotNull(exist)){
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),"对应账号的权限已存在,请勿重复导入"));
continue;
}
}
// 初始化及新增数据
save = new TSocialfundHouseRes();
save.setAuthType(CommonConstants.ONE_STRING);
save.setFundHousehold(CommonConstants.ZERO_STRING.equals(type)?null:baseSet.getDepartName());
save.setSocialHousehold(CommonConstants.ZERO_STRING.equals(type)?baseSet.getDepartName():null);
save.setStatus(CommonConstants.ZERO_STRING);
save.setUserId(user.getUserId());
save.setHouseNameType(type);
save.setCreateTime(LocalDateTime.now());
save.setUserName(user.getUsername());
save.setUserDeptName(user.getDeptName());
insertExcel(save);
// 加入map 验证当前表单数据是否重复
existMap.put(excel.getUserLoginName()
+CommonConstants.DOWN_LINE_STRING
+excel.getHouseHold(),excel.getUserLoginName());
errorMessageList.add(new ErrorMessage(excel.getRowIndex(),CommonConstants.SAVE_SUCCESS,CommonConstants.GREEN));
}
}
}
......@@ -415,6 +415,12 @@ public class UserController {
return userService.getById(userId);
}
@Inner
@PostMapping(value = {"/inner/getSimpleUserByLoginName"})
public SysUser getSimpleUserByLoginName(@RequestBody String loginName) {
return userService.getOne(Wrappers.<SysUser>query().lambda().eq(SysUser::getUsername,loginName).last(CommonConstants.LAST_ONE_SQL));
}
/**
* @param nickName 用户名称
* @return 上级部门用户列表
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment