Kaynağa Gözat

Merge branch 'pre'

dzx 1 yıl önce
ebeveyn
işleme
babeb1487b

+ 8 - 3
src/main/java/com/xjrsoft/module/banding/controller/BandingTaskClassController.java

@@ -22,6 +22,7 @@ import com.xjrsoft.module.banding.entity.BandingTaskClass;
 import com.xjrsoft.module.banding.entity.BandingTaskClassStudent;
 import com.xjrsoft.module.banding.service.IBandingTaskClassService;
 import com.xjrsoft.module.banding.service.IBandingTaskClassStudentService;
+import com.xjrsoft.module.banding.service.IBandingTaskService;
 import com.xjrsoft.module.banding.vo.BandingTaskClassExcelVo;
 import com.xjrsoft.module.banding.vo.BandingTaskClassPageVo;
 import com.xjrsoft.module.banding.vo.BandingTaskClassStudentListVo;
@@ -62,7 +63,7 @@ import java.util.Map;
 @AllArgsConstructor
 public class BandingTaskClassController {
 
-
+    private final IBandingTaskService taskService;
     private final IBandingTaskClassService bandingTaskClassService;
     private final IBandingTaskClassStudentService classStudentService;
 
@@ -109,7 +110,9 @@ public class BandingTaskClassController {
     public RT<Boolean> add(@Valid @RequestBody List<AddBandingTaskClassDto> dtoList){
         List<BandingTaskClass> dataList = new ArrayList<>();
         List<String> errorList = new ArrayList<>();
+
         for (AddBandingTaskClassDto dto : dtoList) {
+            BandingTask task = taskService.getById(dto.getBandingTaskId());
             if(dto.getSortCode() != null){
                 List<BandingTaskClass> list = bandingTaskClassService.list(
                         new QueryWrapper<BandingTaskClass>().lambda()
@@ -121,8 +124,10 @@ public class BandingTaskClassController {
                 }
             }
 
-            BandingTaskClass bandingTask = BeanUtil.toBean(dto, BandingTaskClass.class);
-            bandingTask.setCreateDate(new Date());
+            BandingTaskClass bandingTaskClass = BeanUtil.toBean(dto, BandingTaskClass.class);
+            bandingTaskClass.setCreateDate(new Date());
+            bandingTaskClass.setStatus(task.getStatus());
+            dataList.add(bandingTaskClass);
         }
         if(!errorList.isEmpty()){
             return RT.error(errorList.toString().replace("[", "").replace("]", "") + ",分班排序重复");

+ 2 - 0
src/main/java/com/xjrsoft/module/base/mapper/WhitelistManagementMapper.java

@@ -41,5 +41,7 @@ public interface WhitelistManagementMapper extends MPJBaseMapper<WhitelistManage
 
     @Select("SELECT id, name FROM base_class WHERE grade_id = #{gradeId}")
     List<WhiteBaseClass> getClassesByGradeId(@Param("gradeId") String gradeId);
+
+    List<WhitelistManagement> getCachesList();
 }
 

+ 2 - 0
src/main/java/com/xjrsoft/module/base/service/IWhitelistManagementService.java

@@ -40,4 +40,6 @@ public interface IWhitelistManagementService extends MPJBaseService<WhitelistMan
     List<Map<Integer, Object>> importData(List<Map<Integer, Object>> savedDataList);
 
     List<Map<Integer, Object>> activateImport(List<Map<Integer, Object>> savedDataList);
+
+    List<WhitelistManagement> getCachesList();
 }

+ 17 - 11
src/main/java/com/xjrsoft/module/base/service/impl/WhitelistManagementServiceImpl.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.base.service.impl;
 
 import cn.dev33.satoken.secure.BCrypt;
 import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -43,11 +44,11 @@ import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 /**
@@ -60,7 +61,7 @@ import java.util.stream.Collectors;
 @Service
 @AllArgsConstructor
 public class WhitelistManagementServiceImpl extends MPJBaseServiceImpl<WhitelistManagementMapper, WhitelistManagement> implements IWhitelistManagementService {
-    private final WhitelistManagementMapper whitelistManagementMapper;
+    private final WhitelistManagementMapper managementMapper;
 
     private RedisUtil redisUtil;
 
@@ -72,37 +73,37 @@ public class WhitelistManagementServiceImpl extends MPJBaseServiceImpl<Whitelist
     private final IUserRoleRelationService roleRelationService;
     @Override
     public Page<WhitelistManagementPageVo> getPage(Page<Object> objectPage, WhitelistManagementPageDto dto) {
-        return whitelistManagementMapper.getPage(objectPage, dto);
+        return managementMapper.getPage(objectPage, dto);
     }
 
     @Override
     public String GetName(String name) {
-        return whitelistManagementMapper.getName(name);
+        return managementMapper.getName(name);
     }
 
     @Override
     public String GetCredentialNumber(String credentialNumber) {
-        return whitelistManagementMapper.getCredentialNumber(credentialNumber);
+        return managementMapper.getCredentialNumber(credentialNumber);
     }
 
     @Override
     public String GetPhone(String phone) {
-        return whitelistManagementMapper.getPhone(phone);
+        return managementMapper.getPhone(phone);
     }
 
     @Override
     public Long getUserId(String credentialNumber) {
-        return whitelistManagementMapper.getUserId(credentialNumber);
+        return managementMapper.getUserId(credentialNumber);
     }
 
     @Override
     public boolean checkExist(String credentialNumber) {
-        return whitelistManagementMapper.checkExits(credentialNumber);
+        return managementMapper.checkExits(credentialNumber);
     }
 
     @Override
     public List<TreeNode> getTreeStructure() {
-        List<WhiteBaseGrade> grades = whitelistManagementMapper.getAllGrades();
+        List<WhiteBaseGrade> grades = managementMapper.getAllGrades();
         List<TreeNode> treeNodes = new ArrayList<>();
 
         for (WhiteBaseGrade grade : grades) {
@@ -110,7 +111,7 @@ public class WhitelistManagementServiceImpl extends MPJBaseServiceImpl<Whitelist
             gradeNode.setId(grade.getId());
             gradeNode.setName(grade.getName());
 
-            List<WhiteBaseClass> classes = whitelistManagementMapper.getClassesByGradeId(grade.getId());
+            List<WhiteBaseClass> classes = managementMapper.getClassesByGradeId(grade.getId());
             List<TreeNode> classNodes = new ArrayList<>();
 
             for (WhiteBaseClass clazz : classes) {
@@ -133,7 +134,7 @@ public class WhitelistManagementServiceImpl extends MPJBaseServiceImpl<Whitelist
     @Async
     public void loadCaches() {
         log.info("XJRSOFT: 加载所有学生电信开卡用户缓存开始");
-        List<WhitelistManagement> list = whitelistManagementMapper.selectList(Wrappers.<WhitelistManagement>query().lambda().select(WhitelistManagement::getUserId));
+        List<WhitelistManagement> list = managementMapper.getCachesList();
 
         Map<Long, Long> map = list.stream().collect(Collectors.toMap(WhitelistManagement::getUserId, WhitelistManagement::getUserId));
         redisUtil.set(GlobalConstant.WHITE_MANAGEMENT_CACHE_KEY, map);
@@ -373,4 +374,9 @@ public class WhitelistManagementServiceImpl extends MPJBaseServiceImpl<Whitelist
 
         return errorList;
     }
+
+    @Override
+    public List<WhitelistManagement> getCachesList() {
+        return this.baseMapper.getCachesList();
+    }
 }

+ 70 - 2
src/main/java/com/xjrsoft/module/databoard/controller/DataboardController.java

@@ -19,6 +19,7 @@ import com.xjrsoft.module.databoard.vo.HealthStatisticsVo;
 import com.xjrsoft.module.databoard.vo.MeetingStatisticsVo;
 import com.xjrsoft.module.databoard.vo.PersonStatisticsVo;
 import com.xjrsoft.module.databoard.vo.ProcessStatisticsVo;
+import com.xjrsoft.module.databoard.vo.ReimbursementStatisticsVo;
 import com.xjrsoft.module.databoard.vo.VisitorStatisticsVo;
 import com.xjrsoft.module.outint.entity.VisitorOutInRecord;
 import com.xjrsoft.module.outint.service.IVisitorOutInRecordService;
@@ -46,6 +47,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Comparator;
@@ -133,8 +135,24 @@ public class DataboardController {
     @GetMapping(value = "/meeting-statistics")
     @ApiOperation(value="会议统计")
     @SaCheckPermission("databoard:detail")
-    public RT<MeetingStatisticsVo> meetingStatistics(@Valid StatisticsDto dto){
-        String sql = "SELECT id, (SELECT COUNT(*) FROM xjr_user WHERE FIND_IN_SET(id, meeting_apply_participants)) AS person_count FROM wf_meeting_apply";
+    public RT<MeetingStatisticsVo> meetingStatistics(@Valid StatisticsDetailDto dto){
+        LocalDateTime startTime = null;
+        LocalDateTime endTime = null;
+        if(dto.getStartDate() != null){
+            startTime = dto.getStartDate().atStartOfDay();
+        }
+        if(dto.getEndDate() != null){
+            endTime = dto.getEndDate().atStartOfDay().plusDays(1).plusNanos(-1);
+        }
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        String sql = "SELECT id, (SELECT COUNT(*) FROM xjr_user WHERE FIND_IN_SET(id, meeting_apply_participants)) AS person_count FROM wf_meeting_apply where 1 = 1";
+        if(startTime != null && endTime != null){
+            sql += " and meeting_apply_date between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
+        }
+        if(dto.getUserId() != null){
+            sql += " and FIND_IN_SET(" + dto.getUserId() +", meeting_apply_participants)";
+        }
         List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
         MeetingStatisticsVo result = new MeetingStatisticsVo();
         result.setAllCount(list.size());
@@ -345,5 +363,55 @@ public class DataboardController {
         return RT.ok(result);
     }
 
+    @GetMapping(value = "/reimbursement-statistics")
+    @ApiOperation(value="会议统计")
+    @SaCheckPermission("databoard:detail")
+    public RT<ReimbursementStatisticsVo> reimbursementStatistics(@Valid StatisticsDetailDto dto){
+        LocalDateTime startTime = null;
+        LocalDateTime endTime = null;
+        if(dto.getStartDate() != null){
+            startTime = dto.getStartDate().atStartOfDay();
+        }
+        if(dto.getEndDate() != null){
+            endTime = dto.getEndDate().atStartOfDay().plusDays(1).plusNanos(-1);
+        }
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        String sql = "SELECT * FROM billing_reimbursement where 1 = 1";
+        if(startTime != null && endTime != null){
+            sql += " and aply_time between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
+        }
+        if(dto.getUserId() != null){
+            sql += " and applicant_id = " + dto.getUserId();
+        }
+        List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
+        ReimbursementStatisticsVo result = new ReimbursementStatisticsVo();
+        result.setAllCount(list.size());
+        int completeCount = 0;
+        int uncompleteCount = 0;
+
+        int cityIn = 0;
+        int cityOut = 0;
+        for (Map<String, Object> objectMap : list) {
+            Object statusObj = objectMap.get("status");
+            if(statusObj == null){
+                uncompleteCount ++;
+            }else{
+                completeCount ++;
+            }
+
+            Object cityInObj = objectMap.get("city_in");
+            if(cityInObj != null && Integer.parseInt(cityInObj.toString()) == 1){
+
+            }
+        }
+        result.setCompleteCount(completeCount);
+        result.setUncompleteCount(uncompleteCount);
+
+
+
+
+        return RT.ok(result);
+    }
 
 }

+ 30 - 0
src/main/java/com/xjrsoft/module/databoard/vo/ReimbursementStatisticsVo.java

@@ -0,0 +1,30 @@
+package com.xjrsoft.module.databoard.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+* @title: 数据看板-差旅费报销申请统计出参
+* @Author dzx
+* @Date: 2024年9月2日
+* @Version 1.0
+*/
+@Data
+public class ReimbursementStatisticsVo {
+
+
+    @ApiModelProperty("申请总次数")
+    private Integer allCount;
+
+    @ApiModelProperty("完成总数")
+    private Integer completeCount;
+
+    @ApiModelProperty("未完成总数")
+    private Integer uncompleteCount;
+
+    @ApiModelProperty("申请")
+    private List<ItemCountVo> amountList;
+
+}

+ 46 - 0
src/main/java/com/xjrsoft/module/job/WhitelistTask.java

@@ -0,0 +1,46 @@
+package com.xjrsoft.module.job;
+
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.utils.RedisUtil;
+import com.xjrsoft.module.base.entity.WhitelistManagement;
+import com.xjrsoft.module.base.service.IWhitelistManagementService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author dzx
+ * @date 2024/9/2
+ */
+@Component
+@Slf4j
+public class WhitelistTask {
+
+    @Autowired
+    private IWhitelistManagementService whitelistService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Scheduled(cron = "0 */15 * * * ?")
+    public void execute() {
+        doExecute();
+    }
+
+    public void doExecute(){
+        List<WhitelistManagement> list = whitelistService.getCachesList();
+
+        Map map = redisUtil.get(GlobalConstant.WHITE_MANAGEMENT_CACHE_KEY, Map.class);
+        if(map.size() != list.size()){
+            Map<Long, Long> newMap = list.stream().collect(Collectors.toMap(WhitelistManagement::getUserId, WhitelistManagement::getUserId));
+            redisUtil.set(GlobalConstant.WHITE_MANAGEMENT_CACHE_KEY, newMap);
+        }
+    }
+
+}
+

+ 13 - 6
src/main/java/com/xjrsoft/module/material/controller/MaterialTaskController.java

@@ -19,7 +19,6 @@ import com.xjrsoft.module.form.dto.FormExecuteInfoDto;
 import com.xjrsoft.module.form.service.IFormExecuteService;
 import com.xjrsoft.module.material.dto.*;
 import com.xjrsoft.module.material.entity.MaterialTask;
-import com.xjrsoft.module.material.entity.MaterialTaskAppendix;
 import com.xjrsoft.module.material.entity.MaterialTaskAssign;
 import com.xjrsoft.module.material.entity.MaterialType;
 import com.xjrsoft.module.material.entity.MaterialTypeAssign;
@@ -50,7 +49,8 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.ArrayList;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 /**
@@ -182,10 +182,10 @@ public class MaterialTaskController {
         return RT.ok(result);
     }
 
-    @GetMapping("/export")
+    @PostMapping("/export-query")
     @ApiOperation(value = "导出")
-    public ResponseEntity<byte[]> exportData(@Valid MaterialTaskPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
-        List<MaterialTaskPageVo> customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput<MaterialTaskPageVo>) page(dto).getData()).getList();
+    public ResponseEntity<byte[]> exportData(@Valid @RequestBody MaterialTaskPageDto dto) {
+        List<MaterialTaskPageVo> customerList = ((PageOutput<MaterialTaskPageVo>) page(dto).getData()).getList();
         ByteArrayOutputStream bot = new ByteArrayOutputStream();
         EasyExcel.write(bot, MaterialTaskPageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
 
@@ -267,10 +267,17 @@ public class MaterialTaskController {
         }}));
     }
 
-    @GetMapping("/form-data-export-query")
+    @PostMapping("/form-data-export-query")
     @ApiOperation(value = "表单缴交数据条件导出")
     public ResponseEntity<byte[]> formDataExportQuery(@Valid @RequestBody FormDataExportQueryDto dto) {
         ByteArrayOutputStream bot = materialTaskService.formDataExportQuery(dto);
         return RT.fileStream(bot.toByteArray(), "MaterialFormData" + ExcelTypeEnum.XLSX.getValue());
     }
+
+    @PostMapping("/download-file-export-query")
+    @ApiOperation(value = "下载附件(zip压缩包)")
+    public ResponseEntity<byte[]> downloadFile(@Valid @RequestBody MaterialTaskAssignListDto dto) {
+        byte[] bytes = materialTaskService.downloadFile(dto);
+        return RT.fileStream(bytes, "download-file-export.zip");
+    }
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/material/dto/MaterialTaskAssignAppendixDto.java

@@ -24,7 +24,7 @@ public class MaterialTaskAssignAppendixDto {
     /**
      * 表单模板id
      */
-    @NotNull(message = "表单模板id")
+    @ApiModelProperty("表单模板id")
     private Long templateId;
 
     /**

+ 2 - 0
src/main/java/com/xjrsoft/module/material/service/IMaterialTaskService.java

@@ -58,4 +58,6 @@ public interface IMaterialTaskService extends MPJBaseService<MaterialTask> {
     List<MaterialTaskAssignListVo> assignList(MaterialTaskAssignListDto dto);
 
     ByteArrayOutputStream formDataExportQuery(FormDataExportQueryDto dto);
+
+    byte[] downloadFile(MaterialTaskAssignListDto dto);
 }

+ 86 - 14
src/main/java/com/xjrsoft/module/material/service/impl/MaterialTaskServiceImpl.java

@@ -6,6 +6,7 @@ import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.github.yulichang.base.MPJBaseServiceImpl;
@@ -15,6 +16,7 @@ import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.MaterialCategoryEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.model.generator.ComponentConfig;
+import com.xjrsoft.common.utils.FileZipUtil;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.concat.service.IXjrUserService;
@@ -50,6 +52,8 @@ import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.service.IWeChatService;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
+import com.xjrsoft.module.system.entity.File;
+import com.xjrsoft.module.system.service.IFileService;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.vo.XjrUserVo;
 import lombok.AllArgsConstructor;
@@ -57,6 +61,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
 import java.time.LocalDate;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -74,7 +82,7 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
     private final MaterialTaskMapper materialTaskMaterialTaskMapper;
 
     private final MaterialTaskAssignMapper materialTaskMaterialTaskAssignMapper;
-    private final MaterialTaskAppendixMapper materialTaskMaterialTaskAppendixMapper;
+    private final MaterialTaskAppendixMapper appendixMapper;
 
     private final IMaterialTypeService materialTypeService;
     private final IWeChatService weChatService;
@@ -82,6 +90,8 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
     private final IFormExecuteService formExecuteService;
 
     private final FormTemplateMapper formTemplateMapper;
+    private final IFileService fileService;
+    private final IUserService userService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -219,7 +229,7 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
         //********************************* MaterialTaskAppendix  增删改  开始 *******************************************/
         {
             // 查出所有子级的id
-            List<MaterialTaskAppendix> materialTaskAppendixList = materialTaskMaterialTaskAppendixMapper.selectList(Wrappers.lambdaQuery(MaterialTaskAppendix.class).eq(MaterialTaskAppendix::getMaterialTaskId, materialTask.getId()).select(MaterialTaskAppendix::getId));
+            List<MaterialTaskAppendix> materialTaskAppendixList = appendixMapper.selectList(Wrappers.lambdaQuery(MaterialTaskAppendix.class).eq(MaterialTaskAppendix::getMaterialTaskId, materialTask.getId()).select(MaterialTaskAppendix::getId));
             List<Long> materialTaskAppendixIds = materialTaskAppendixList.stream().map(MaterialTaskAppendix::getId).collect(Collectors.toList());
             //原有子表单 没有被删除的主键
             List<Long> materialTaskAppendixOldIds = materialTask.getMaterialTaskAppendixList().stream().map(MaterialTaskAppendix::getId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -229,18 +239,18 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
             for (MaterialTaskAppendix materialTaskAppendix : materialTask.getMaterialTaskAppendixList()) {
                 //如果不等于空则修改
                 if (materialTaskAppendix.getId() != null) {
-                    materialTaskMaterialTaskAppendixMapper.updateById(materialTaskAppendix);
+                    appendixMapper.updateById(materialTaskAppendix);
                 }
                 //如果等于空 则新增
                 else {
                     //已经不存在的id 删除
                     materialTaskAppendix.setMaterialTaskId(materialTask.getId());
-                    materialTaskMaterialTaskAppendixMapper.insert(materialTaskAppendix);
+                    appendixMapper.insert(materialTaskAppendix);
                 }
             }
             //已经不存在的id 删除
             if (materialTaskAppendixRemoveIds.size() > 0) {
-                materialTaskMaterialTaskAppendixMapper.deleteBatchIds(materialTaskAppendixRemoveIds);
+                appendixMapper.deleteBatchIds(materialTaskAppendixRemoveIds);
             }
         }
         //********************************* MaterialTaskAppendix  增删改  结束 *******************************************/
@@ -253,7 +263,7 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
     public Boolean delete(List<Long> ids) {
         materialTaskMaterialTaskMapper.deleteBatchIds(ids);
         materialTaskMaterialTaskAssignMapper.delete(Wrappers.lambdaQuery(MaterialTaskAssign.class).in(MaterialTaskAssign::getMaterialTaskId, ids));
-        materialTaskMaterialTaskAppendixMapper.delete(Wrappers.lambdaQuery(MaterialTaskAppendix.class).in(MaterialTaskAppendix::getMaterialTaskId, ids));
+        appendixMapper.delete(Wrappers.lambdaQuery(MaterialTaskAppendix.class).in(MaterialTaskAppendix::getMaterialTaskId, ids));
 
         return true;
     }
@@ -289,14 +299,14 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
                 materialTaskMaterialTaskAssignMapper.updateById(materialTaskAssign);
 
                 if (oldStatus == 4) { // 重做删除原来的
-                    materialTaskMaterialTaskAppendixMapper.delete(Wrappers.lambdaQuery(MaterialTaskAppendix.class).eq(MaterialTaskAppendix::getMaterialTaskId, materialTaskAssignAppendixDto.getMaterialTaskAssignId()));
+                    appendixMapper.delete(Wrappers.lambdaQuery(MaterialTaskAppendix.class).eq(MaterialTaskAppendix::getMaterialTaskId, materialTaskAssignAppendixDto.getMaterialTaskAssignId()));
                 }
 
                 for (AddMaterialTaskAppendixDto materialTaskAppendixDto : materialTaskAssignAppendixDto.getMaterialTaskAppendixList()) {
                     MaterialTaskAppendix materialTaskAppendix = new MaterialTaskAppendix();
                     materialTaskAppendix.setMaterialTaskId(materialTaskAssignAppendixDto.getMaterialTaskAssignId());
                     materialTaskAppendix.setFileId(materialTaskAppendixDto.getFileId());
-                    materialTaskMaterialTaskAppendixMapper.insert(materialTaskAppendix);
+                    appendixMapper.insert(materialTaskAppendix);
                 }
             }
         }
@@ -329,7 +339,7 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
                 materialTaskMaterialTaskAssignMapper.updateById(materialTaskAssign);
 
                 if (oldStatus == 4) { // 重做删除原来的
-                    materialTaskMaterialTaskAppendixMapper.delete(Wrappers.lambdaQuery(MaterialTaskAppendix.class).eq(MaterialTaskAppendix::getMaterialTaskId, materialTaskAssignAppendixDto.getMaterialTaskAssignId()));
+                    appendixMapper.delete(Wrappers.lambdaQuery(MaterialTaskAppendix.class).eq(MaterialTaskAppendix::getMaterialTaskId, materialTaskAssignAppendixDto.getMaterialTaskAssignId()));
                 }
 
                 long id = formExecuteService.addByTemplateId(new FormExecuteAddOrUpdateDto(){{
@@ -340,7 +350,7 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
                 MaterialTaskAppendix materialTaskAppendix = new MaterialTaskAppendix();
                 materialTaskAppendix.setMaterialTaskId(materialTaskAssignAppendixDto.getMaterialTaskAssignId());
                 materialTaskAppendix.setFileId(id);
-                materialTaskMaterialTaskAppendixMapper.insert(materialTaskAppendix);
+                appendixMapper.insert(materialTaskAppendix);
             }
         }
         return true;
@@ -440,7 +450,8 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
                 .disableSubLogicDel()
                 .distinct()
                 .select(MaterialTaskAssign::getId)
-                .selectAs(MaterialTaskAppendix::getFileId, MaterialTaskAssignListVo::getFolderId)
+                .selectAs(MaterialTaskAppendix::getFileId, MaterialTaskAssignListVo::getFileId)
+                .selectAs(File::getFolderId, MaterialTaskAssignListVo::getFolderId)
                 .selectAs(MaterialTaskAppendix::getFileId, MaterialTaskAssignListVo::getFormDataId)
                 .selectAs(MaterialTask::getMaterialCategory, MaterialTaskAssignListVo::getMaterialCategory)
                 .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(MaterialTaskAssignListVo.class).contains(x.getProperty()))
@@ -450,6 +461,7 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
                 .leftJoin(Department.class, Department::getId, UserDeptRelation::getDeptId, ext -> ext.selectAs(Department::getName, MaterialTaskAssignListVo::getDeptName))
                 .leftJoin(MaterialTask.class, MaterialTask::getId, MaterialTaskAssign::getMaterialTaskId)
                 .leftJoin(MaterialTaskAppendix.class, MaterialTaskAppendix::getMaterialTaskId, MaterialTaskAssign::getId)
+                .leftJoin(File.class, File::getId, MaterialTaskAppendix::getFileId)
                 .like(dto.getName() != null && !"".equals(dto.getName()), XjrUser::getName, dto.getName())
                 .eq(MaterialTaskAssign::getMaterialTaskId, dto.getMaterialTaskId())
                 .eq(dto.getState() != null, MaterialTaskAssign::getStatus, dto.getState())
@@ -457,7 +469,6 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
                 .eq(Department::getDeleteMark, DeleteMark.NODELETE.getCode())
                 .eq(MaterialTask::getDeleteMark, DeleteMark.NODELETE.getCode())
                 .eq(MaterialTaskAssign::getDeleteMark, DeleteMark.NODELETE.getCode())
-                .eq(MaterialTaskAppendix::getDeleteMark, DeleteMark.NODELETE.getCode())
 //                .select("(\n" +
 //                        "SELECT id FROM xjr_file WHERE id IN (\n" +
 //                        "SELECT file_id FROM material_task_appendix WHERE material_task_id = t.id\n" +
@@ -467,8 +478,11 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
 
         List<MaterialTaskAssignListVo> pageOutput = materialTaskMaterialTaskAssignMapper.selectJoinList(MaterialTaskAssignListVo.class, queryWrapper);
 
-        for (MaterialTaskAssignListVo materialTaskAssignListVo : pageOutput){
-            materialTypeService.handleFileAndTemplate(materialTaskAssignListVo, materialTaskAssignListVo.getMaterialCategory());
+        for (MaterialTaskAssignListVo el : pageOutput){
+            materialTypeService.handleFileAndTemplate(el, el.getMaterialCategory());
+
+            List<File> fileList = fileService.list(Wrappers.<File>query().lambda().eq(File::getFolderId, el.getFolderId()));
+            el.setFiles(fileList);
         }
 
         return pageOutput;
@@ -510,6 +524,64 @@ public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapp
         return null;
     }
 
+    @Override
+    public byte[] downloadFile(MaterialTaskAssignListDto dto) {
+
+        MPJLambdaWrapper<MaterialTaskAppendix> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper
+                .disableSubLogicDel()
+                .distinct()
+                .select(MaterialTaskAppendix::getId)
+                .select(MaterialTaskAppendix.class, x -> VoToColumnUtil.fieldsToColumns(MaterialTaskAppendix.class).contains(x.getProperty()))
+                .innerJoin(MaterialTaskAssign.class, MaterialTaskAssign::getId, MaterialTaskAppendix::getMaterialTaskId)
+                .eq(MaterialTaskAssign::getMaterialTaskId, dto.getMaterialTaskId())
+                .eq(MaterialTaskAssign::getStatus, dto.getState())
+        ;
+
+        List<MaterialTaskAppendix> appendices = appendixMapper.selectJoinList(MaterialTaskAppendix.class, queryWrapper);
+        if(appendices.isEmpty()){
+            throw new MyException("未能查询到附件");
+        }
+        List<Long> userIds = appendices.stream().map(MaterialTaskAppendix::getCreateUserId).collect(Collectors.toList());
+        List<User> userList = userService.listByIds(userIds);
+        Map<Long, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, x -> x));
+
+        Map<String, byte[]> byteAryMap = new HashMap<>();
+        MaterialTask task = this.getById(dto.getMaterialTaskId());
+
+        for (MaterialTaskAppendix appendix : appendices) {
+            List<File> fileList = fileService.list(Wrappers.<File>query().lambda().eq(File::getId, appendix.getFileId()));
+            User user = userMap.get(appendix.getCreateUserId());
+
+            for (int i = 0; i < fileList.size(); i++) {
+                try {
+                    URL url = new URL(fileList.get(i).getFileUrl());
+                    URLConnection conn = url.openConnection();
+                    InputStream in = conn.getInputStream();
+                    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+                    byte[] buffer = new byte[1024];
+                    int bytesRead;
+                    while ((bytesRead = in.read(buffer)) != -1) {
+                        outputStream.write(buffer, 0, bytesRead);
+                    }
+                    byte[] byteArray = outputStream.toByteArray();
+                    String fileName = user.getName() + "-" + user.getUserName() + "-" + task.getName();
+                    if(fileList.size() > 1){
+                        fileName += "-" + (i + 1);
+                    }
+                    fileName += fileList.get(i).getFileType();
+                    byteAryMap.put(fileName, byteArray);
+                    in.close();
+                    outputStream.close();
+                } catch (IOException e) {
+                    throw new MyException("文件下载失败", e);
+                }
+            }
+        }
+
+        return FileZipUtil.byteAryMap2Zip(byteAryMap);
+    }
+
     private void sendMessageUtil(MaterialTask materialTask ) {
         IUserService userService = SpringUtil.getBean(IUserService.class);
         RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);

+ 4 - 1
src/main/java/com/xjrsoft/module/material/vo/MaterialTaskAssignListVo.java

@@ -58,8 +58,11 @@ public class MaterialTaskAssignListVo {
     /**
      * 文件模板
      */
-    @ApiModelProperty("文件模板")
+    @ApiModelProperty("文件夹id")
     private Long folderId;
+
+    @ApiModelProperty("文件id")
+    private Long fileId;
     /**
      * 文件模板
      */

+ 1 - 1
src/main/java/com/xjrsoft/module/student/controller/BaseNewStudentController.java

@@ -352,7 +352,7 @@ public class BaseNewStudentController {
         return RT.ok(true);
     }
 
-    @GetMapping("/report-export")
+    @PostMapping("/report-export-query")
     @ApiOperation(value = "导出")
     public ResponseEntity<byte[]> exportData(@Valid BaseNewStudentPageDto dto) {
         List<BaseNewStudentPageVo> reportList = baseNewStudentService.getReportList(dto);

+ 4 - 0
src/main/java/com/xjrsoft/module/system/service/IFileService.java

@@ -3,6 +3,8 @@ package com.xjrsoft.module.system.service;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.system.entity.File;
 
+import java.util.List;
+
 /**
  * <p>
  * 文件关联关系表 服务类
@@ -16,4 +18,6 @@ public interface IFileService extends MPJBaseService<File> {
     boolean deleteFile(String encode);
 
     byte[] downloadFileByZip(Long folderId);
+
+    byte[] downloadFileByZip(List<Long> folderIds);
 }

+ 37 - 0
src/main/java/com/xjrsoft/module/system/service/impl/FileServiceImpl.java

@@ -64,6 +64,43 @@ public class FileServiceImpl extends MPJBaseServiceImpl<FileMapper, File> implem
 //                    System.err.println(byteArray.length);
 //                    outputStream.writeTo(fos);
 
+//                System.out.println("File downloaded successfully.");
+                in.close();
+                outputStream.close();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        //执行下面这段代码就可以拿到压缩之后的byte数组
+        return FileZipUtil.byteAryMap2Zip(byteAryMap);
+    }
+
+    @Override
+    public byte[] downloadFileByZip(List<Long> folderIds) {
+        List<File> fileList = this.list(Wrappers.<File>query().lambda().in(File::getFolderId, folderIds));
+
+        //声明一个Map,将所有文件装进去,map的key是完整的文件名
+        Map<String, byte[]> byteAryMap = new HashMap<>();
+
+        for (int i = 0; i < fileList.size(); i++) {
+//            String localFilePath = "C:\\Users\\大数据与最优化研究所\\Downloads\\" + fileList.get(i).getFileName() + fileList.get(i).getFileType();
+//            System.err.println(localFilePath);
+            try {
+                URL url = new URL(fileList.get(i).getFileUrl());
+                URLConnection conn = url.openConnection();
+                InputStream in = conn.getInputStream();
+//                        FileOutputStream fos = new FileOutputStream(localFilePath)
+                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+                byte[] buffer = new byte[1024];
+                int bytesRead;
+                while ((bytesRead = in.read(buffer)) != -1) {
+                    outputStream.write(buffer, 0, bytesRead);
+                }
+                byte[] byteArray = outputStream.toByteArray();
+                byteAryMap.put(fileList.get(i).getFileName() + fileList.get(i).getFileType(), byteArray);
+//                    System.err.println(byteArray.length);
+//                    outputStream.writeTo(fos);
+
 //                System.out.println("File downloaded successfully.");
                 in.close();
                 outputStream.close();

+ 4 - 0
src/main/resources/mapper/base/WhitelistManagement.xml

@@ -82,4 +82,8 @@
         </if>
     </select>
 
+    <select id="getCachesList" resultType="com.xjrsoft.module.base.entity.WhitelistManagement">
+        SELECT * FROM whitelist_management WHERE delete_mark = 0
+        AND (is_temporary = 0 OR (is_temporary = 1 AND end_time > NOW()))
+    </select>
 </mapper>