文件审核需求代码提交

master
yqy 2 years ago
parent 05d78e1a0d
commit 4f6f92a8c7

@ -150,6 +150,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers( "/api/roll/cdrUrl").permitAll()
.antMatchers( "/api/report/turnOn").permitAll()
.antMatchers( "/api/users/info/findById").permitAll()
.antMatchers( "/api/users/info/findIsReview").permitAll()
// 支付回调
.antMatchers( "/pay/aliPay/pay-notify").permitAll()
// 自定义匿名访问所有url放行允许匿名和带Token访问细腻化到每个 Request 类型

@ -225,9 +225,9 @@ public class UserController {
}
/**
*
*
*
* @return
* @return
*/
@PostMapping("/info/findById")
@ApiOperation("用户id查询")
@ -235,6 +235,17 @@ public class UserController {
return userService.queryName(userIds);
}
/**
*
*
* @return
*/
@GetMapping("/info/findIsReview")
@ApiOperation("用户id查询")
public Boolean findIsReview(@RequestParam("userId") Long userId) {
return userService.findIsReview(userId);
}
@Inner
@PostMapping("/info/deptIds")
@ApiOperation("查找部门")

@ -213,9 +213,16 @@ public interface UserService {
List<User> findUserByExpirationTime(DateTime date, Boolean flag);
/**
*
*
* @param userIds
* @return
*/
Map<Long, String> queryName(Set<Long> userIds);
/**
*
* @param userId
* @return
*/
Boolean findIsReview(Long userId);
}

@ -30,7 +30,6 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.*;
import java.util.stream.Collectors;
@ -57,7 +56,6 @@ public class OrganizeServiceImpl implements OrganizeService {
private final ExtensionNumberService extensionNumberService;
private final CompanyRepository companyRepository;
private final LabelOrganizeService labelOrganizeService;
private final LabelRepository labelRepository;
private final LabelService labelService;
private final MessageNotificationRepository messageNotificationRepository;

@ -243,6 +243,16 @@ public class UserServiceImpl implements UserService {
return map;
}
@Override
public Boolean findIsReview(Long userId) {
Boolean isReview = null;
User user = userRepository.findById(userId).orElseGet(User::new);
if (!Objects.isNull(user)){
isReview = user.getIsReview();
}
return isReview;
}
@Override
public Object queryAll(UserQueryCriteria criteria, Pageable pageable) {

@ -3,8 +3,10 @@ package com.baiye.feign;
import com.baiye.feign.fallback.UserClientFallback;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
import java.util.Set;
@ -22,4 +24,13 @@ public interface UserClient {
@PostMapping(PAY_PREFIX + "/info/findById")
@ApiOperation("用户id查询")
Map<Long, String> findById(@RequestBody Set<Long> userIds);
/**
*
*
* @return
*/
@GetMapping(PAY_PREFIX + "/info/findIsReview")
@ApiOperation("用户id查询")
Boolean findIsReview(@RequestParam("userId") Long userId);
}

@ -12,4 +12,9 @@ public class UserClientFallback implements UserClient {
public Map<Long, String> findById(Set<Long> clueIds) {
return null;
}
@Override
public Boolean findIsReview(Long userId) {
return null;
}
}

@ -0,0 +1,36 @@
package com.baiye.module.controller;
import com.baiye.http.CommonResponse;
import com.baiye.module.service.ClueRecordService;
import com.baiye.module.service.dto.ClueRecordQueryCriteria;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RequiredArgsConstructor
@RestController
@Api(tags = "文件上传管理")
@RequestMapping("/source/clueRecord")
@Slf4j
public class ClueRecordController {
private final ClueRecordService clueRecordService;
@ApiOperation("查询个人未审核信息")
@PostMapping("/queryNotApproved")
public CommonResponse<Object> queryNotApproved(@RequestBody ClueRecordQueryCriteria clueRecordQueryCriteria){
return CommonResponse.createBySuccess(clueRecordService.queryNotApproved(clueRecordQueryCriteria));
}
@ApiOperation("审核文件")
@PostMapping("/audit")
public CommonResponse<Object> auditFile(@RequestBody ClueRecordQueryCriteria clueRecordQueryCriteria){
clueRecordService.auditFile(clueRecordQueryCriteria);
return CommonResponse.createBySuccess();
}
}

@ -10,10 +10,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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 org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;

@ -29,4 +29,17 @@ public interface ClueRecordRepository extends JpaRepository<ClueRecord, Long>, J
@Modifying
@Query(value = " update tb_clue_record set status = 0 where task_id = ?1 ", nativeQuery = true)
void updateType(Long taskId);
/**
* id
* @param taskIds
* @param isPass
*/
@Modifying
@Query(value = " update tb_clue_record set is_pass = ?2 where task_id in ?1 ", nativeQuery = true)
void updateIsPassByTaskIdIn(Set<Long> taskIds, Integer isPass);
List<ClueRecord> findByIsPassAndCreateByIn(Integer isPass,Set<Long> createByList);
List<ClueRecord> findByTaskIdIn(Set<Long> taskIdList);
}

@ -45,6 +45,7 @@ public class ClueRecord implements Serializable {
@ApiModelProperty(value = "任务id")
@Column(name = "task_id")
@JsonSerialize(using = ToStringSerializer.class)
private Long taskId;
@ApiModelProperty(value = "上传文件名")
@ -55,6 +56,10 @@ public class ClueRecord implements Serializable {
@Column(name = "new_file_url")
private String newFileUrl;
@ApiModelProperty(value = "文件是否审核通过 0通过 1待审核 2已拒绝")
@Column(name = "is_pass")
private Integer isPass;
@ApiModelProperty(value = "创建人")
@Column(name = "create_by")
private Long createBy;
@ -67,4 +72,7 @@ public class ClueRecord implements Serializable {
@ApiModelProperty(value = "备注")
@Column(name = "remark")
private String remark;
@Transient
private Boolean flag;
}

@ -0,0 +1,20 @@
package com.baiye.module.service;
import com.baiye.module.service.dto.ClueRecordQueryCriteria;
public interface ClueRecordService {
/**
*
* @param clueRecordQueryCriteria
* @return
*/
Object queryNotApproved(ClueRecordQueryCriteria clueRecordQueryCriteria);
/**
*
* @param clueRecordQueryCriteria
* @return
*/
Object auditFile(ClueRecordQueryCriteria clueRecordQueryCriteria);
}

@ -54,4 +54,8 @@ public class ClueRecordDto implements Serializable {
@ApiModelProperty(value = "备注")
@ExcelIgnore
private String remark;
@ApiModelProperty(value = "文件是否审核通过 0通过 1待审核 2已拒绝")
@ExcelIgnore
private Integer isPass;
}

@ -0,0 +1,28 @@
package com.baiye.module.service.dto;
import com.baiye.annotation.Query;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Set;
/**
*
*/
@Data
public class ClueRecordQueryCriteria {
@Query
private Long createBy;
@Query
private Long id;
@Query
@ApiModelProperty(value = "文件是否审核通过 0通过 1待审核 2已拒绝")
private Integer isPass;
private Set<Long> taskIdList;
private Set<Long> createByList;
}

@ -0,0 +1,105 @@
package com.baiye.module.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.feign.UserClient;
import com.baiye.http.CommonResponse;
import com.baiye.module.dao.ClueRecordRepository;
import com.baiye.module.entity.ClueRecord;
import com.baiye.module.service.ClueRecordService;
import com.baiye.module.service.dto.ClueRecordDto;
import com.baiye.module.service.dto.ClueRecordQueryCriteria;
import com.baiye.module.service.mapstruct.ClueRecordMapper;
import com.baiye.task.FileAnalysisTask;
import com.baiye.util.QueryHelp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
@Service
@Slf4j
@RequiredArgsConstructor
public class ClueRecordServiceImpl implements ClueRecordService {
@Resource
private FileAnalysisTask fileAnalysisTask;
private final UserClient userClient;
private final ClueRecordRepository clueRecordRepository;
@Value("${storage.download-auditing-file}")
private String auditingFileUrl;
@Override
public Object queryNotApproved(ClueRecordQueryCriteria clueRecordQueryCriteria) {
List<Map<String, Object>> list = new ArrayList<>();
Set<Long> createByList = clueRecordQueryCriteria.getCreateByList();
clueRecordQueryCriteria.setIsPass(DefaultNumberConstants.ONE_NUMBER);
if (CollUtil.isNotEmpty(createByList)) {
List<ClueRecord> clueRecordDtos = clueRecordRepository.findByIsPassAndCreateByIn(DefaultNumberConstants.ONE_NUMBER, createByList);
if (CollUtil.isNotEmpty(clueRecordDtos)) {
for (ClueRecord clueRecordDto : clueRecordDtos) {
String newFileUrl = clueRecordDto.getNewFileUrl();
String str = newFileUrl.substring(newFileUrl.lastIndexOf("/"));
// 初始化一些参数
clueRecordDto.setNewFileUrl(auditingFileUrl + str);
}
Map<Long, List<ClueRecord>> userGroup = clueRecordDtos.stream().collect(Collectors.groupingBy(ClueRecord::getCreateBy));
Set<Long> userIds = userGroup.keySet();
Map<Long, String> userNameList = userClient.findById(userIds);
for (Long userId : userIds) {
Map<String, Object> map = new HashMap<>();
List<Map<String, Object>> listMap = new ArrayList<>();
List<ClueRecord> clueRecordList = userGroup.get(userId);
Map<Long, List<ClueRecord>> taskIdGroup = clueRecordList.stream().collect(Collectors.groupingBy(ClueRecord::getTaskId));
Set<Long> taskIdList = taskIdGroup.keySet();
for (Long taskId : taskIdList) {
Map<String, Object> taskMap = new HashMap<>();
// 转换字符串防止js渲染Long类型太长精度丢失与原来ID不相同
taskMap.put("taskId", taskId.toString());
taskMap.put("fileRecords", taskIdGroup.get(taskId));
listMap.add(taskMap);
}
String userName = userNameList.get(userId);
map.put("userName", userName);
map.put("list", listMap);
list.add(map);
}
return list;
}
}
return CommonResponse.createBySuccess();
}
/**
*
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Object auditFile(ClueRecordQueryCriteria clueRecordQueryCriteria) {
Set<Long> taskIdList = clueRecordQueryCriteria.getTaskIdList();
Integer isPass = clueRecordQueryCriteria.getIsPass();
if (CollUtil.isNotEmpty(taskIdList)) {
if (isPass == 0) {
for (Long taskId : taskIdList) {
List<ClueRecord> clueRecords = clueRecordRepository.findByTaskId(taskId);
// 异步读取文件并更新任务
if (CollUtil.isNotEmpty(clueRecords)) {
fileAnalysisTask.runFileAnalysisTask(clueRecords, clueRecords.get(0).getOldFile());
}
}
clueRecordRepository.updateIsPassByTaskIdIn(taskIdList, DefaultNumberConstants.ZERO_NUMBER);
} else if (isPass == 2){
// 拒绝更新上传记录
clueRecordRepository.updateIsPassByTaskIdIn(taskIdList, DefaultNumberConstants.TWO_NUMBER);
}
}
return null;
}
}

@ -11,15 +11,14 @@ import com.baiye.module.service.mapstruct.ConductRecordMapper;
import com.baiye.util.QueryHelp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
@Service
@Slf4j
@ -30,6 +29,7 @@ public class ConductRecordServiceImpl implements ConductRecordService {
private final ConductRecordMapper conductRecordMapper;
private final UserClient userClient;
@Override
public void saveRecord(ConductRecord conductRecord) {
//查询创建人的用户名称
@ -51,7 +51,7 @@ public class ConductRecordServiceImpl implements ConductRecordService {
@Override
public Object query(ConductRecordQueryCriteria conductRecordQueryCriteria) {
List<ConductRecordDto> conductRecordDtoList = conductRecordMapper.toDto(conductRecordRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, conductRecordQueryCriteria, criteriaBuilder)));
return conductRecordDtoList;
return conductRecordMapper.toDto(conductRecordRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, conductRecordQueryCriteria, criteriaBuilder)));
}
}

@ -9,8 +9,9 @@ import cn.hutool.core.text.csv.CsvUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.exceptions.POIException;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.feign.UserClient;
import com.baiye.http.CommonResponse;
import com.baiye.http.ResponseCode;
import com.baiye.module.dao.ClueRecordRepository;
@ -44,9 +45,13 @@ public class UploadFileServiceImpl implements UploadFileService {
private FileAnalysisTask fileAnalysisTask;
@Resource
private ClueRecordRepository clueRecordRepository;
@Resource
private UserClient userClient;
@Value(value = "${storage.url}")
private String URL;
@Value(value = "${storage.auditingUrl}")
private String auditingUrl;
@Value(value = "${storage.de_symbol}")
private String DE_SYMBOL;
@Value("${snowflake.workerId}")
@ -75,6 +80,8 @@ public class UploadFileServiceImpl implements UploadFileService {
List<ClueRecord> clueRecordList = new ArrayList<>();
String oneFileName = files[0].getOriginalFilename();
Long taskId = IdUtil.getSnowflake(workerId, datacenterId).nextId();
// 文件是否需要审核,需要审核的不入库
Boolean flag = userClient.findIsReview(userId);
//处理文件数据
for (MultipartFile file : files) {
String name = file.getOriginalFilename();
@ -86,27 +93,14 @@ public class UploadFileServiceImpl implements UploadFileService {
if (nameStr.equals(".xlsx") || nameStr.equals(".xls")) {
testingExcel(file, uploadType);
}
//存入本地
String currentDate = timeTwo.format(new Date());
String newRealPath = URL + currentDate;
File newRealPathFile = new File(newRealPath);
if (!newRealPathFile.exists()) {
newRealPathFile.mkdir();
}
String newName = randomFileName(name);
File newFile = new File(newRealPathFile, newName);
file.transferTo(newFile);
//检测csv文件
if (nameStr.equals(".csv")) {
testingCsv(newFile, uploadType);
}
//保存上传记录信息
String newFileUrl = newRealPath + DE_SYMBOL + newName;
ClueRecord clueRecord = saveClueRecord(name, newFileUrl, uploadType, userId, taskId);
//存入本地,保存上传记录
ClueRecord clueRecord = saveFileUtil(name, file, uploadType, userId, taskId, flag);
clueRecordList.add(clueRecord);
}
//异步读取文件并创建任务
fileAnalysisTask.runFileAnalysisTask(clueRecordList, oneFileName);
if (!flag) {
//异步读取文件并创建任务
fileAnalysisTask.runFileAnalysisTask(clueRecordList, oneFileName);
}
return new ResponseEntity<>(CommonResponse.createBySuccess(ResponseCode.SUCCESS), HttpStatus.OK);
}
@ -119,6 +113,8 @@ public class UploadFileServiceImpl implements UploadFileService {
public ResponseEntity<Object> taskFileUpload(MultipartFile[] files, Integer uploadType, Long userId, Long taskId) {
List<ClueRecord> clueRecordList = new ArrayList<>();
String oneFileName = files[0].getOriginalFilename();
// 文件是否需要审核,需要审核的不入库
Boolean flag = userClient.findIsReview(userId);
for (MultipartFile file : files) {
String originalFilename = file.getOriginalFilename();
int lastIndexOf = originalFilename.lastIndexOf(".");
@ -129,31 +125,21 @@ public class UploadFileServiceImpl implements UploadFileService {
// 检测内容和行数
testingExcel(file, uploadType);
//存入本地
String currentDate = timeTwo.format(new Date());
String newRealPath = URL + currentDate;
File newRealPathFile = new File(newRealPath);
if (!newRealPathFile.exists()) {
newRealPathFile.mkdir();
}
String newName = randomFileName(originalFilename);
File newFile = new File(newRealPathFile, newName);
file.transferTo(newFile);
//保存上传记录信息
String newFileUrl = newRealPath + DE_SYMBOL + newName;
ClueRecord clueRecord = saveClueRecord(originalFilename, newFileUrl, uploadType, userId, taskId);
ClueRecord clueRecord = saveFileUtil(originalFilename, file, uploadType, userId, taskId, flag);
clueRecordList.add(clueRecord);
}
//异步读取文件并更新任务
fileAnalysisTask.runFileAnalysisTask(clueRecordList, oneFileName);
if (!flag) {
//异步读取文件并更新任务
fileAnalysisTask.runFileAnalysisTask(clueRecordList, oneFileName);
}
return new ResponseEntity<>(CommonResponse.createBySuccess(ResponseCode.SUCCESS), HttpStatus.OK);
}
/**
*
*
*/
@Transactional(rollbackFor = Exception.class)
public ClueRecord saveClueRecord(String originalFilename, String newFileUrl, Integer uploadType, Long userId, Long taskId) {
public ClueRecord saveClueRecord(String originalFilename, String newFileUrl, Integer uploadType, Long userId, Long taskId, Boolean flag) {
long clueRecordId = IdUtil.getSnowflake(workerId, datacenterId).nextId();
ClueRecord clueRecord = new ClueRecord();
clueRecord.setId(clueRecordId);
@ -163,6 +149,11 @@ public class UploadFileServiceImpl implements UploadFileService {
clueRecord.setUploadType(uploadType);
clueRecord.setCreateBy(userId);
clueRecord.setTaskId(taskId);
if (flag) {
clueRecord.setIsPass(DefaultNumberConstants.ONE_NUMBER);
} else {
clueRecord.setIsPass(DefaultNumberConstants.ZERO_NUMBER);
}
clueRecordRepository.save(clueRecord);
return clueRecord;
}
@ -193,13 +184,13 @@ public class UploadFileServiceImpl implements UploadFileService {
* @param file
* @param uploadType 线(UC..)
*/
public void testingExcel(MultipartFile file, Integer uploadType){
public void testingExcel(MultipartFile file, Integer uploadType) {
InputStream inputStream = null;
ExcelReader reader = null;
try{
try {
inputStream = file.getInputStream();
reader = ExcelUtil.getReader(inputStream);
}catch (Exception e){
} catch (Exception e) {
throw new BadRequestException("文件读取错误,请检查文件");
}
//检验excel内容格式(表头信息)
@ -288,4 +279,45 @@ public class UploadFileServiceImpl implements UploadFileService {
// 4.时间 + _ + 随机数 + 后缀名 返回一个新的文件名
return format + "_" + num + suffix;
}
/**
*
*
* @param name
* @param file
* @param uploadType
* @param userId
* @param taskId
* @return
*/
@SneakyThrows
private ClueRecord saveFileUtil(String name, MultipartFile file, Integer uploadType, Long userId, Long taskId, Boolean flag) {
String currentDate = timeTwo.format(new Date());
String newRealPath = URL + currentDate;
if (flag) {
newRealPath = auditingUrl;
}
//存入本地
File newRealPathFile = new File(newRealPath);
if (!newRealPathFile.exists()) {
newRealPathFile.mkdir();
}
String newName = randomFileName(name);
File newFile = new File(newRealPathFile, newName);
file.transferTo(newFile);
if (uploadType == FileConstant.FIVE_NUMBER) {
//检测csv文件,这个是保存到本地后读取的本地文件读取操作
int lastIndexOf = name.lastIndexOf(".");
String nameStr = name.substring(lastIndexOf);
if (nameStr.equals(".csv")) {
testingCsv(newFile, uploadType);
}
}
//保存上传记录信息
String newFileUrl = newRealPath + DE_SYMBOL + newName;
ClueRecord clueRecord = saveClueRecord(name, newFileUrl, uploadType, userId, taskId, flag);
clueRecord.setFlag(flag);
return clueRecord;
}
}

@ -55,7 +55,6 @@ public class FileAnalysisTask {
*/
@Transactional(rollbackFor = Exception.class)
@Async(value = "SendBigDataTaskExecutor")
//@SneakyThrows
public void runFileAnalysisTask(List<ClueRecord> clueRecords, String oneFileName){
try {
for (ClueRecord clueRecord : clueRecords) {

@ -62,9 +62,11 @@ spring:
# 文件存储
storage:
url: /usr/local/webapp/source/files/
auditingUrl: /usr/local/webapp/source/auditingFiles/
de_symbol: /
download-template: https://baiyee.vip/source/download/1/custom.xlsx
download-template-move: https://baiyee.vip/source/download/1/dynamictemplate.xlsx
download-auditing-file: https://baiyee.vip/source/auditingFiles/
# 线程池配置

@ -62,9 +62,11 @@ spring:
# 文件存储
storage:
url: /usr/local/webapp/platform/source/files/
auditingUrl: /usr/local/webapp/platform/source/auditingFiles/
de_symbol: /
download-template: http://8.130.96.163:8001/source/download/1/custom.xlsx
download-template-move: http://8.130.96.163:8001/source/download/1/dynamictemplate.xlsx
download-auditing-file: http://8.130.96.163:8001/source/auditingFiles/
# 线程池配置
save:

Loading…
Cancel
Save