he2802 2 年之前
父節點
當前提交
208ee7669c
共有 21 個文件被更改,包括 527 次插入38 次删除
  1. 14 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java
  2. 63 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/FileUtils.java
  3. 60 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/poi/ExcelUtil.java
  4. 1 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  5. 4 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java
  6. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserProfileQueryBo.java
  7. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/vo/UserProfileVo.java
  8. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamApplyMapper.java
  9. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamApplyService.java
  10. 222 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java
  11. 6 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  12. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/domain/SysOldOrg.java
  13. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/bo/TopOldOrderQueryBo.java
  14. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/NumSettleBo.java
  15. 79 30
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/service/impl/ITopInstSettleServiceImpl.java
  16. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/vo/SettleVo.java
  17. 18 2
      zhongzheng-system/src/main/resources/mapper/modules/base/UserProfileMapper.xml
  18. 20 0
      zhongzheng-system/src/main/resources/mapper/modules/exam/ExamApplyMapper.xml
  19. 1 1
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeUserMapper.xml
  20. 3 1
      zhongzheng-system/src/main/resources/mapper/modules/settle/ExamActivityMapper.xml
  21. 9 0
      zhongzheng-system/src/main/resources/mapper/modules/top/TopOldOrderMapper.xml

+ 14 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java

@@ -10,6 +10,7 @@ import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.poi.EasyPoiUtil;
+import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
 import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
 import com.zhongzheng.modules.exam.service.IExamApplyService;
@@ -266,4 +267,17 @@ public class ExamApplyController extends BaseController {
         return AjaxResult.success(vo);
     }
 
+    @ApiOperation("七大员学员资料批量变更")
+    @PostMapping("/user/profile")
+    public AjaxResult updateExamUserProfile(MultipartFile file) {
+        iExamApplyService.updateExamUserProfile(file);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("七大员学员资料导出")
+    @PostMapping("/user/profile/export")
+    public AjaxResult examUserProfileExport(@RequestBody UserProfileQueryBo bo) {
+        return AjaxResult.success(iExamApplyService.examUserProfileExport(bo));
+    }
+
 }

+ 63 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/FileUtils.java

@@ -503,4 +503,67 @@ public class FileUtils extends org.apache.commons.io.FileUtils
     }
 
 
+    /**
+     * 打包压缩文件夹
+     *
+     * @param folderPath 文件夹路径
+     * @param zipFilePath 压缩后的文件路径
+     * @throws IOException IO异常
+     */
+    public static void zipFolder(String folderPath, String zipFilePath) throws IOException {
+        FileOutputStream fos = null;
+        ZipOutputStream zos = null;
+        try {
+            fos = new FileOutputStream(zipFilePath);
+            zos = new ZipOutputStream(fos);
+
+            // 递归遍历整个文件夹并添加到压缩包
+            addFolderToZip("", new File(folderPath), zos);
+        } finally {
+            if (zos != null) {
+                zos.close();
+            }
+            if (fos != null) {
+                fos.close();
+            }
+        }
+    }
+
+    /**
+     * 将文件夹及其中的文件递归添加到压缩流中
+     *
+     * @param parentPath 父级路径
+     * @param folder 文件夹
+     * @param zos Zip输出流
+     * @throws FileNotFoundException 文件未找到异常
+     * @throws IOException IO异常
+     */
+    private static void addFolderToZip(String parentPath, File folder, ZipOutputStream zos) throws FileNotFoundException, IOException {
+        for (File file : folder.listFiles()) {
+            if (file.isDirectory()) {
+                // 递归添加子文件夹中的文件
+                addFolderToZip(parentPath + folder.getName() + "/", file, zos);
+            } else {
+                FileInputStream fis = null;
+                try {
+                    fis = new FileInputStream(file);
+
+                    // 新建Zip条目并将输入流加入到Zip包中
+                    ZipEntry zipEntry = new ZipEntry( folder.getName() + "/" + file.getName());
+                    zos.putNextEntry(zipEntry);
+
+                    byte[] bytes = new byte[1024];
+                    int length;
+                    while ((length = fis.read(bytes)) >= 0) {
+                        zos.write(bytes, 0, length);
+                    }
+                } finally {
+                    if (fis != null) {
+                        fis.close();
+                    }
+                }
+            }
+        }
+    }
+
 }

+ 60 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/poi/ExcelUtil.java

@@ -342,6 +342,55 @@ public class ExcelUtil<T>
         return sheetsList;
     }
 
+    public String userProfileExport(String filePath, String sheetName)
+    {
+        OutputStream out = null;
+        try
+        {
+            FileInputStream inputStream = new FileInputStream(filePath);
+            String filename = encodingName(sheetName);
+            out = new FileOutputStream(getAbsoluteFile(filename));
+            byte[] buffer = new byte[1024];
+            int len = 0;
+            while ((len = inputStream.read(buffer)) != -1) {
+                out.write(buffer, 0, len);
+            }
+            return filename;
+        }
+        catch (Exception e)
+        {
+            log.error("导出学员资料异常{}", e.getMessage());
+            throw new CustomException("导出学员资料异常,请联系网站管理员!");
+        }
+        finally
+        {
+
+            if (wb != null)
+            {
+                try
+                {
+                    wb.close();
+                }
+                catch (IOException e1)
+                {
+                    e1.printStackTrace();
+                }
+            }
+            if (out != null)
+            {
+                try
+                {
+                    out.close();
+                }
+                catch (IOException e1)
+                {
+                    e1.printStackTrace();
+                }
+            }
+        }
+    }
+
+
     public AjaxResult exportEasyExcel(List<Map<String, Object>> sheetsList, String sheetName)
     {
         OutputStream out = null;
@@ -387,6 +436,8 @@ public class ExcelUtil<T>
         }
     }
 
+
+
     public void exportEasyExcelStudy(List<Map<String, Object>> sheetsList,String path)
     {
         OutputStream out = null;
@@ -984,6 +1035,15 @@ public class ExcelUtil<T>
         return filename;
     }
 
+    /**
+     * 编码文件名
+     */
+    public String encodingName(String filename)
+    {
+        filename = UUID.randomUUID().toString() + "_" + filename;
+        return filename;
+    }
+
     public String encodingFilename(String filename)
     {
         filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx";

+ 1 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java

@@ -139,6 +139,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/common/decompression").anonymous()
                 .antMatchers("/common/merge/file").anonymous()
                 .antMatchers("/common/get/goods").anonymous()
+                .antMatchers("/common/apply/user/profile").anonymous()
                 .antMatchers("/common/get/goods/studyUrl").anonymous()
                 .antMatchers("/common/apply/detail").anonymous()
                 .antMatchers("/common/student/image/update").anonymous()

+ 4 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java

@@ -15,6 +15,7 @@ import com.aliyuncs.exceptions.ClientException;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.file.FileUtils;
 import com.zhongzheng.modules.alioss.bo.OssCallbackParam;
 import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.OssService;
@@ -249,8 +250,10 @@ public class OssServiceImpl implements OssService {
             //获取上传文件输入流
             InputStream inputStream = file.getFile().getInputStream();
             String originalFilename = file.getFile().getOriginalFilename();
+            String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
 
-            String fileName = ALIYUN_OSS_DIR_PREFIX + generateRandomFilename(file) ;
+            String fileName = ALIYUN_OSS_DIR_PREFIX + generateRandomFilename(file) + "." + suffix;
+//            String fileName = ALIYUN_OSS_DIR_PREFIX + generateRandomFilename(file) ;
 
             //调用oss方法实现上传
             //第一个参数  Bucket名称

+ 9 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserProfileQueryBo.java

@@ -118,4 +118,13 @@ public class UserProfileQueryBo extends BaseEntity implements Serializable {
 	/** 订单商品ID */
 	@ApiModelProperty("订单商品ID")
 	private Long orderGoodsId;
+
+	@ApiModelProperty("报名开始时间")
+	private Long applyStartTime;
+
+	@ApiModelProperty("报名结束时间")
+	private Long applyEndTime;
+
+	@ApiModelProperty("公司名称")
+	private String companyName;
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/vo/UserProfileVo.java

@@ -112,4 +112,10 @@ public class UserProfileVo {
 	private Integer typeStatus;
 	/** 订单商品ID */
 	private Long orderGoodsId;
+
+	@ApiModelProperty("报名时间")
+	private Long applyTime;
+
+	@ApiModelProperty("公司名称")
+	private String companyName;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamApplyMapper.java

@@ -2,6 +2,7 @@ package com.zhongzheng.modules.exam.mapper;
 
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.base.domain.UserProfile;
 import com.zhongzheng.modules.exam.bo.ExamApplyDetailBo;
 import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
 import com.zhongzheng.modules.exam.bo.ExamApplyRoomQueryBo;
@@ -91,4 +92,6 @@ public interface ExamApplyMapper extends BaseMapper<ExamApply> {
     List<Long> getApplyGoodsId(@Param("applyId") Long applyId,@Param("majorName")  String majorName);
 
     UserSubscribe getHaveSubscribe(ExamApplyQueryBo queryBo);
+
+    List<UserProfile> getUserProfileList(@Param("idCard") String idCard,@Param("businessName") String businessName,@Param("post") String post);
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamApplyService.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.modules.exam.service;
 
 import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
 import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.domain.ExamApply;
 import com.zhongzheng.modules.exam.vo.*;
@@ -98,4 +99,6 @@ public interface IExamApplyService extends IService<ExamApply> {
     List<Long> getApplyGoodsId(Long applyId, String majorName);
 
     void updateExamUserProfile(MultipartFile file);
+
+	String examUserProfileExport(UserProfileQueryBo bo);
 }

+ 222 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java

@@ -17,6 +17,7 @@ import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.JavaMailUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.file.FileUploadUtils;
 import com.zhongzheng.common.utils.file.FileUtils;
 import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.poi.EasyPoiUtil;
@@ -30,6 +31,12 @@ import com.zhongzheng.modules.bank.domain.Exam;
 import com.zhongzheng.modules.bank.domain.QuestionBusiness;
 import com.zhongzheng.modules.bank.service.IExamService;
 import com.zhongzheng.modules.bank.service.IQuestionBusinessService;
+import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
+import com.zhongzheng.modules.base.domain.UserProfile;
+import com.zhongzheng.modules.base.service.IUserProfileService;
+import com.zhongzheng.modules.base.vo.UserProfileVo;
+import com.zhongzheng.modules.course.domain.Major;
+import com.zhongzheng.modules.course.service.IMajorService;
 import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.domain.*;
 import com.zhongzheng.modules.exam.mapper.ExamApplyMapper;
@@ -47,6 +54,7 @@ import com.zhongzheng.modules.user.domain.UserSubscribe;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.service.IUserSubscribeService;
 import com.zhongzheng.modules.user.vo.UserStudyRecordExport;
+import com.zhongzheng.modules.user.vo.UserVo;
 import org.apache.commons.io.IOUtils;
 import org.apache.http.entity.ContentType;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -90,6 +98,8 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
     @Autowired
     private IGoodsService iGoodsService;
     @Autowired
+    private IMajorService iMajorService;
+    @Autowired
     private IUserService iUserService;
     @Autowired
     private ISysTenantService sysTenantService;
@@ -105,6 +115,8 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
     private OssService ossService;
     @Autowired
     private ISysConfigService iSysConfigService;
+    @Autowired
+    private IUserProfileService iUserProfileService;
     @Value("${exam.applyDelete}")
     private String EXAM_APPLY_DELETE;
 
@@ -1008,7 +1020,217 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
             e.printStackTrace();
             throw new CustomException("文件解压错误");
         }
+        // 路径
+        try (Stream<Path> paths = Files.walk(Paths.get(path))){
+            List<Path> fileNames = paths
+                    .filter(Files::isRegularFile)
+                    .collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(fileNames)){
+                return;
+            }
+            Map<String, List<Path>> map = fileNames.stream().collect(Collectors.groupingBy(item -> {
+                Path name = item.getFileName();
+                List<String> sign = Arrays.stream(name.toString().split("\\$")).collect(Collectors.toList());
+                //身份证号
+                String idCard = sign.get(0);
+                return idCard;
+            }));
+            map.forEach((k,v) ->{
+                //身份证号
+                String idCard = k;
+                User user = iUserService.getOne(new LambdaQueryWrapper<User>()
+                        .eq(User::getIdCard, EncryptHandler.encrypt(idCard)));
+                if (ObjectUtils.isNull(user)){
+                    return;
+                }
+                for (Path item : v) {
+                    List<String> sign = Arrays.stream(item.getFileName().toString().split("\\$")).collect(Collectors.toList());
+                    String promise = sign.get(1);
+                    String post = Arrays.stream(sign.get(sign.size() - 1).split("\\.")).findFirst().orElse("");
+                    String content1 = item.toString();
+                    File userFile = new File(content1);
+                    MultipartFile multipartFile = FileUtils.getMultipartFile(userFile);
+                    if (!promise.contains("承诺书")){
+                        continue;
+                    }
+                    //查询学员资料填写情况
+                    List<UserProfile> profiles = baseMapper.getUserProfileList(idCard,"考前培训施工现场专业人员",post);
+                    profiles.forEach(userItem -> {
+                        JSONObject jsonObject = JSONObject.parseObject(userItem.getKeyValue());
+                        Map<String, Object> userMap = new HashMap<>();
+                        for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
+                            userMap.put(entry.getKey(), entry.getValue());
+                        }
+                        String key = "commitment_seal";
+                        String fieldName = "承诺书盖章";
+                        OssRequest ossRequest = new OssRequest();
+                        ossRequest.setUserId(user.getUserId());
+                        ossRequest.setFile(multipartFile);
+                        ossRequest.setImageStatus(0);
+                        try {
+                            String upload = ossService.upload(ossRequest);
+                            JSONObject recentJson = JSONObject.parseObject(userMap.get(key).toString());
+                            Map<String, Object> recentMap = new HashMap<>();
+                            for (Map.Entry<String, Object> entry : recentJson.entrySet()) {
+                                recentMap.put(entry.getKey(), entry.getValue());
+                            }
+                            if (ObjectUtils.isNotNull(recentMap)){
+                                recentMap.put("value",upload);
+                            }else {
+                                recentMap.put("fieldKey",key);
+                                recentMap.put("value",upload);
+                                recentMap.put("fieldName",fieldName);
+                                recentMap.put("status",0);
+                            }
+                            userMap.put(key,recentMap);
+                        }catch (Exception e) {
+                            throw new CustomException(fieldName+"上传oss失败");
+                        }
+                        String content = JSONObject.toJSONString(userMap);
+                        userItem.setKeyValue(content);
+                    });
+                    iUserProfileService.updateBatchById(profiles);
+                }
+            });
+            //删除本地文件
+            FileUtils.deleteFilePackage(path);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new CustomException("学员资料有误");
+        }
+
+    }
+
+    @Override
+    public String examUserProfileExport(UserProfileQueryBo bo) {
+        List<UserProfileVo> userProfileVos = iUserProfileService.queryList(bo);
+        if (CollectionUtils.isEmpty(userProfileVos)){
+            throw new CustomException("请勿导出空数据");
+        }
+        //根据公司分组
+        Map< String, List<UserProfileVo>> map = userProfileVos.stream().collect(Collectors.groupingBy(x -> {
+            User user = iUserService.getById(x.getUserId());
+            return StringUtils.isNotBlank(user.getCompanyName())?user.getCompanyName():"没有填写公司名称的学员";
+        }));
+        //写入文件
+        String path = System.getProperty("user.dir") + "/zhongzheng-admin/src/main/resources/profile";
+
+        map.forEach((k,v) -> {
+            String toPath = path+"/"+k;
+            File file = new File(toPath);
+            if (!file.exists()){
+                file.mkdirs();
+            }
+            //学员分组
+            Map<Long, List<UserProfileVo>> userMap = v.stream().collect(Collectors.groupingBy(UserProfileVo::getUserId));
+            userMap.forEach((m,j) -> {
+                User user = iUserService.getById(m);
+                if (ObjectUtils.isNull(user)){
+                    return;
+                }
+                String idCard = EncryptHandler.decrypt(user.getIdCard());
+                //学员资料
+                String keyValue = j.get(0).getKeyValue();
+                JSONObject jsonObject = JSONObject.parseObject(keyValue);
+                //头像
+                JSONObject recentPhotos = JSONObject.parseObject(JSONObject.toJSONString(jsonObject.get("recent_photos")));
+                if (ObjectUtils.isNotNull(recentPhotos)){
+                    handleFile(recentPhotos,idCard,toPath,"recent_photos","");
+                }
+                //身份证正面
+                JSONObject facePhoto = JSONObject.parseObject(JSONObject.toJSONString(jsonObject.get("idcard_face_photo")));
+                if (ObjectUtils.isNotNull(facePhoto)){
+                    handleFile(facePhoto,idCard,toPath,"idcard_face_photo","");
+                }
+                //身份证反面
+                JSONObject nationalPhotos = JSONObject.parseObject(JSONObject.toJSONString(jsonObject.get("idcard_national_photo")));
+                if (ObjectUtils.isNotNull(nationalPhotos)){
+                    handleFile(nationalPhotos,idCard,toPath,"idcard_national_photo","");
+                }
+
+                //承诺书
+                for (UserProfileVo userProfile : j) {
+                    Goods goods = iGoodsService.getById(userProfile.getGoodsId());
+                    Major major = iMajorService.getById(goods.getMajorId());
+                    if (ObjectUtils.isNotNull(major)){
+                        JSONObject json = JSONObject.parseObject(userProfile.getKeyValue());
+                        //头像
+                        JSONObject sign = JSONObject.parseObject(JSONObject.toJSONString(json.get("commitment_electr_signature")));
+                        handleFile(sign,idCard,toPath,"commitment_electr_signature",major.getCategoryName());
+                    }
+                }
+            });
+        });
+
+        //打成压缩包
+        String zipPath = System.getProperty("user.dir") + "/zhongzheng-admin/src/main/resources/profile-zip/七大员资料.zip";
+        try {
+            File file = new File(zipPath);
+            if (!file.exists()){
+                //先得到文件的上级目录,并创建上级目录,在创建文件
+                file.getParentFile().mkdir();
+                file.createNewFile();
+            }
+            FileUtils.zipFolder(path,zipPath);
+            //删除本地资源
+            FileUtils.deleteFilePackage(path);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new CustomException("文件压缩zip包失败!");
+        }
+        ExcelUtil<UserProfile> util = new ExcelUtil<>(UserProfile.class);
+        String content = util.userProfileExport(zipPath, "七大员资料.zip");
 
+        //删除本地资源
+        FileUtils.deleteFilePackage(System.getProperty("user.dir") + "/zhongzheng-admin/src/main/resources/profile-zip");
+        return content;
+    }
+
+    private void handleFile(JSONObject recentPhotos,String idCard,String toPath,String key,String major){
+        try {
+            if (ObjectUtils.isNotNull(recentPhotos.get("value"))){
+                String content = recentPhotos.get("value").toString();
+                InputStream photos = ossService.getStreamByObject(content);
+                //文件名称
+                String keyName = "";
+                if ("recent_photos".equals(key)){
+                    keyName = "头像";
+                }else if ("idcard_face_photo".equals(key)){
+                    keyName = "身份证正面";
+                }else if ("idcard_national_photo".equals(key)){
+                    keyName = "身份证反面";
+                }else if ("commitment_electr_signature".equals(key)){
+                    keyName = "承诺书";
+                }
+
+                if (StringUtils.isBlank(keyName)){
+                    return;
+                }
+                String fileName = idCard+"$"+keyName;
+                if (StringUtils.isNotBlank(major)){
+                    fileName = fileName+"$"+major;
+                }
+                if (content.contains(".")){
+                    List<String> names = Arrays.stream(content.split("\\.")).collect(Collectors.toList());
+                    fileName = fileName + "." + names.get(names.size() -1);
+                }else {
+                    fileName = fileName +".jpg";
+                }
+                String filePath = toPath+"/"+fileName;
+                //写入本地文件
+                FileOutputStream fileOutputStream = new FileOutputStream(filePath);
+                byte[] buffer = new byte[1024];
+                int len = 0;
+                while ((len = photos.read(buffer)) != -1) {
+                    fileOutputStream.write(buffer, 0, len);
+                }
+                photos.close();
+                fileOutputStream.close();
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+            throw new CustomException("获取学员资料文件失败");
+        }
     }
 
 

+ 6 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -771,11 +771,16 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     }
 
     private void instTimeSettleOrder(Order order, Long checkTime) {
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        SysOldOrg sysOldOrg = sysOldOrgService.getOne(new LambdaQueryWrapper<SysOldOrg>()
+                .eq(SysOldOrg::getTenantId, Long.valueOf(tenantId))
+                .eq(SysOldOrg::getStatus, 1)
+                .last("limit 1"));
         //业务层次
         List<String> fullName = this.queryBusinessFullNameBySn(order.getOrderSn());
         Set<TopInstSettle> settleList = new HashSet<>();
         for (String name : fullName) {
-            List<TopInstSettle> settles = topInstSettleService.getSettleByBusiness(name,checkTime,order.getOperationType());
+            List<TopInstSettle> settles = topInstSettleService.getSettleByBusiness(name,checkTime,sysOldOrg.getOperationType());
             settleList.addAll(settles);
         }
         if (CollectionUtils.isNotEmpty(settleList)){

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/domain/SysOldOrg.java

@@ -48,5 +48,7 @@ private static final long serialVersionUID=1L;
     /** 分成模式 1机构分成 2业务员分成 */
     private Integer divideModel;
 
+    /** 运营类型:1代运营 2独立运营 */
+    private Integer operationType;
 
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/bo/TopOldOrderQueryBo.java

@@ -143,5 +143,7 @@ public class TopOldOrderQueryBo extends BaseEntity {
 	private Integer billType;
 	@ApiModelProperty("超收预期 (1:7天 2:30天 3:半年 4:1年 )")
 	private Integer billOverType;
+	@ApiModelProperty("运营类型:1代运营 2独立运营")
+	private Integer operationType;
 
 }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/NumSettleBo.java

@@ -51,7 +51,7 @@ public class NumSettleBo implements Serializable {
     private Long loginId;
 
     @ApiModelProperty("结算订单信息")
-    private List<NumSettleOrderBo> settleOrders;
+    private List<NumSettleOrderBo> settleOrderVos;
 
     @ApiModelProperty("1提交审核 0草稿")
     private Integer status;

+ 79 - 30
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/service/impl/ITopInstSettleServiceImpl.java

@@ -1,7 +1,6 @@
 package com.zhongzheng.modules.top.settle.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -359,6 +358,11 @@ public class ITopInstSettleServiceImpl extends ServiceImpl<TopInstSettleMapper,
         entity.setCheckStatus(1);
         entity.setCreateBy(bo.getLoginName());
         entity.setCreateUserId(bo.getLoginId());
+        if (CollectionUtils.isNotEmpty(bo.getSettleOrderVos())){
+            BigDecimal reduce = bo.getSettleOrderVos().stream().filter(x -> ObjectUtils.isNotNull(x.getSettleMoney()))
+                    .map(NumSettleOrderBo::getSettleMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            entity.setSettleMoney(reduce);
+        }
         entity.setProjectId(getProjectId(bo.getBusinessId()));
         //供应商默认结算成本模板
         TopCostInstTp costInstTp = topCostInstTpService
@@ -371,8 +375,8 @@ public class ITopInstSettleServiceImpl extends ServiceImpl<TopInstSettleMapper,
         }
         save(entity);
         //结算订单信息
-        if (CollectionUtils.isNotEmpty(bo.getSettleOrders())){
-            List<TopInstSettleRelaiton> relaitonList = bo.getSettleOrders().stream().map(item -> {
+        if (CollectionUtils.isNotEmpty(bo.getSettleOrderVos())){
+            List<TopInstSettleRelaiton> relaitonList = bo.getSettleOrderVos().stream().map(item -> {
                 TopInstSettleRelaiton relaiton = BeanUtil.toBean(item, TopInstSettleRelaiton.class);
                 relaiton.setSettleId(entity.getSettleId());
                 relaiton.setCreateTime(DateUtils.getNowTime());
@@ -398,6 +402,26 @@ public class ITopInstSettleServiceImpl extends ServiceImpl<TopInstSettleMapper,
     }
 
     private void createCheckLog(String settleSn,Long loginId,String loginName){
+        List<TopOldOrderCheckLog> checkLogListTwo = topOldOrderCheckLogService
+                .list(new LambdaQueryWrapper<TopOldOrderCheckLog>()
+                .eq(TopOldOrderCheckLog::getOrderSn, settleSn)
+                .eq(TopOldOrderCheckLog::getStatus, 1));
+        if (CollectionUtils.isNotEmpty(checkLogListTwo)){
+            //重新提交重置审核流程
+            checkLogListTwo.forEach(item -> {
+                if (item.getType() == 8){
+                    item.setCheckStatus(2);
+                }else {
+                    item.setCheckStatus(0);
+                }
+            });
+            topOldOrderCheckLogService.updateBatchById(checkLogListTwo);
+            update(new LambdaUpdateWrapper<TopInstSettle>()
+                    .eq(TopInstSettle::getSettleSn,settleSn)
+                    .set(TopInstSettle::getCheckStatus,2)//审核流程
+                    .eq(TopInstSettle::getStatus,1));
+            return;
+        }
         //获取审核和支付流程
         List<TopOldOrderCheck> list = topOldOrderCheckService
                 .list(new LambdaQueryWrapper<TopOldOrderCheck>()
@@ -496,30 +520,46 @@ public class ITopInstSettleServiceImpl extends ServiceImpl<TopInstSettleMapper,
         }
         //审核角色和审核时间
         settleVos.forEach(item -> {
-            TopOldOrderCheckLog checkLog = topOldOrderCheckLogService
-                    .getOne(new LambdaQueryWrapper<TopOldOrderCheckLog>()
-                    .eq(TopOldOrderCheckLog::getOrderSn, item.getSettleSn())
-                    .eq(TopOldOrderCheckLog::getCheckSign, 1)
-                    .eq(TopOldOrderCheckLog::getCheckFrom, 4)
-                    .eq(TopOldOrderCheckLog::getStatus, 1));
-            if (ObjectUtils.isNotNull(checkLog)){
-                TopSysRole role = topSysRoleService.getById(checkLog.getRoleId());
-                item.setCheckRole(role.getRoleName());
-                if (ObjectUtils.isNotNull(checkLog.getCheckTime())){
-                    item.setCheckTime(checkLog.getCheckTime());
-                }else if (checkLog.getCheckSort() > 1){
-                    TopOldOrderCheckLog checkLogTwo = topOldOrderCheckLogService
-                                    .getOne(new LambdaQueryWrapper<TopOldOrderCheckLog>()
-                                    .eq(TopOldOrderCheckLog::getOrderSn, item.getSettleSn())
-                                    .eq(TopOldOrderCheckLog::getCheckSort, checkLog.getCheckSort() -1)
-                                    .eq(TopOldOrderCheckLog::getCheckFrom, 4)
-                                    .eq(TopOldOrderCheckLog::getStatus, 1));
-                    if (ObjectUtil.isNotNull(checkLogTwo)){
-                        item.setCheckTime(checkLogTwo.getCheckTime());
-                    }
+            if (item.getCheckStatus() == 3){
+                //审核不通过
+                TopOldOrderCheckLog refundLog = topOldOrderCheckLogService
+                        .getOne(new LambdaQueryWrapper<TopOldOrderCheckLog>()
+                        .eq(TopOldOrderCheckLog::getOrderSn, item.getSettleSn())
+                        .eq(TopOldOrderCheckLog::getCheckStatus, -1)
+                        .eq(TopOldOrderCheckLog::getStatus, 1)
+                        .orderByDesc(TopOldOrderCheckLog::getCheckSort)
+                        .last("limit 1"));
+                if (ObjectUtils.isNotNull(refundLog)){
+                    TopSysRole role = topSysRoleService.getById(refundLog.getRoleId());
+                    item.setCheckRole(role.getRoleName());
+                    item.setCheckTime(refundLog.getCheckTime());
                 }
-                if (CollectionUtils.isNotEmpty(bo.getRoleIds()) && bo.getRoleIds().contains(checkLog.getRoleId())){
-                    item.setCheckStatus(7);
+            }else {
+                TopOldOrderCheckLog checkLog = topOldOrderCheckLogService
+                        .getOne(new LambdaQueryWrapper<TopOldOrderCheckLog>()
+                                .eq(TopOldOrderCheckLog::getOrderSn, item.getSettleSn())
+                                .eq(TopOldOrderCheckLog::getCheckSign, 1)
+                                .eq(TopOldOrderCheckLog::getCheckFrom, 4)
+                                .eq(TopOldOrderCheckLog::getStatus, 1));
+                if (ObjectUtils.isNotNull(checkLog)){
+                    TopSysRole role = topSysRoleService.getById(checkLog.getRoleId());
+                    item.setCheckRole(role.getRoleName());
+                    if (ObjectUtils.isNotNull(checkLog.getCheckTime())){
+                        item.setCheckTime(checkLog.getCheckTime());
+                    }else if (checkLog.getCheckSort() > 1){
+                        TopOldOrderCheckLog checkLogTwo = topOldOrderCheckLogService
+                                .getOne(new LambdaQueryWrapper<TopOldOrderCheckLog>()
+                                        .eq(TopOldOrderCheckLog::getOrderSn, item.getSettleSn())
+                                        .eq(TopOldOrderCheckLog::getCheckSort, checkLog.getCheckSort() -1)
+                                        .eq(TopOldOrderCheckLog::getCheckFrom, 4)
+                                        .eq(TopOldOrderCheckLog::getStatus, 1));
+                        if (ObjectUtil.isNotNull(checkLogTwo)){
+                            item.setCheckTime(checkLogTwo.getCheckTime());
+                        }
+                    }
+                    if (CollectionUtils.isNotEmpty(bo.getRoleIds()) && bo.getRoleIds().contains(checkLog.getRoleId())){
+                        item.setCheckStatus(7);
+                    }
                 }
             }
         });
@@ -610,6 +650,8 @@ public class ITopInstSettleServiceImpl extends ServiceImpl<TopInstSettleMapper,
                 orderVo.setOrderSn(item.getOrderSn());
                 orderVo.setSubmitDataTime(item.getSubmitDataTime());
                 orderVo.setSettleMoney(item.getSettleMoney());
+                orderVo.setOrderFrom(item.getOrderFrom());
+                orderVo.setOrderGoodsId(item.getOrderGoodsId());
                 if (item.getOrderFrom() == 1) {
                     Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, item.getOrderSn()));
                     User user = userService.getById(order.getUserId());
@@ -658,13 +700,20 @@ public class ITopInstSettleServiceImpl extends ServiceImpl<TopInstSettleMapper,
         TopInstSettle entity = BeanUtil.toBean(bo, TopInstSettle.class);
         entity.setStatus(bo.getStatus());
         entity.setUpdateTime(DateUtils.getNowTime());
+        if (CollectionUtils.isNotEmpty(bo.getSettleOrderVos())){
+            BigDecimal reduce = bo.getSettleOrderVos().stream().filter(x -> ObjectUtils.isNotNull(x.getSettleMoney()))
+                    .map(NumSettleOrderBo::getSettleMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            entity.setSettleMoney(reduce);
+        }else {
+            entity.setSettleMoney(BigDecimal.ZERO);
+        }
         entity.setProjectId(getProjectId(bo.getBusinessId()));
         updateById(entity);
         //删除重新添加结算订单信息
         topInstSettleRelationService.remove(new LambdaQueryWrapper<TopInstSettleRelaiton>()
         .eq(TopInstSettleRelaiton::getSettleId,entity.getSettleId()));
-        if (CollectionUtils.isNotEmpty(bo.getSettleOrders())){
-            List<TopInstSettleRelaiton> relaitonList = bo.getSettleOrders().stream().map(item -> {
+        if (CollectionUtils.isNotEmpty(bo.getSettleOrderVos())){
+            List<TopInstSettleRelaiton> relaitonList = bo.getSettleOrderVos().stream().map(item -> {
                 TopInstSettleRelaiton relaiton = BeanUtil.toBean(item, TopInstSettleRelaiton.class);
                 relaiton.setSettleId(entity.getSettleId());
                 relaiton.setCreateTime(DateUtils.getNowTime());
@@ -781,7 +830,7 @@ public class ITopInstSettleServiceImpl extends ServiceImpl<TopInstSettleMapper,
             default :
                 break;
         }
-        return true;
+        return topOldOrderCheckLogService.updateById(checkLog);
     }
 
     @Override
@@ -1000,7 +1049,7 @@ public class ITopInstSettleServiceImpl extends ServiceImpl<TopInstSettleMapper,
         if (ObjectUtils.isNull(settle)){
             throw new CustomException("数据不存在!");
         }
-        if (settle.getCheckStatus() != 1){
+        if (settle.getCheckStatus() != 1 && settle.getCheckStatus() != 3){
             throw new CustomException("该结算单已进入审核流程,请勿修改!");
         }
         if (!"admin".equals(loginName) && !settle.getCreateUserId().equals(loginId)){

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/vo/SettleVo.java

@@ -31,7 +31,7 @@ public class SettleVo implements Serializable {
     private String instName;
 
     @ApiModelProperty("供应商成本分类id")
-    private String costCatId;
+    private Long costCatId;
 
     @ApiModelProperty("成本分类")
     private String costCatName;

+ 18 - 2
zhongzheng-system/src/main/resources/mapper/modules/base/UserProfileMapper.xml

@@ -45,11 +45,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="text" column="text"/>
         <result property="auditTime" column="audit_time"/>
         <result property="orderGoodsId" column="order_goods_id"/>
+        <result property="applyTime" column="apply_time"/>
+        <result property="companyName" column="company_name"/>
     </resultMap>
 
     <select id="selectUserProfile" parameterType="com.zhongzheng.modules.base.bo.UserProfileQueryBo" resultMap="UserProfileVo">
         SELECT
         up.*,
+        og.create_time as apply_time,
+        u.company_name,
         (SELECT u.realname FROM `user` u where u.user_id = up.user_id) as realname,
         (SELECT u.user_account FROM `user` u where u.user_id = up.user_id) as user_account,
         (SELECT u.telphone FROM `user` u where u.user_id = up.user_id) as telphone,
@@ -61,7 +65,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         (SELECT cet.business_name FROM goods g LEFT JOIN course_business cet on g.business_id = cet.id where up.goods_id = g.goods_id) as business_name
         FROM
         user_profile up
-        LEFT JOIN goods g ON  up.goods_id = g.goods_id LEFT JOIN course_business cb on g.business_id = cb.id
+        LEFT JOIN goods g ON  up.goods_id = g.goods_id
+        LEFT JOIN course_business cb on g.business_id = cb.id
+        LEFT JOIN order_goods og on up.order_goods_id = og.order_goods_id
+        LEFT JOIN `user` u on up.user_id = u.user_id
         where 1=1
         and up.current_status = 1
         and up.status != -1
@@ -99,7 +106,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND up.change_status =#{changeStatus}
         </if>
         <if test="realname != null and realname !='' ">
-            AND (SELECT count(1) FROM `user` u where u.user_id = up.user_id and u.realname like concat('%', #{realname}, '%') )> 0
+            AND u.realname like concat('%', #{realname}, '%')
         </if>
         <if test="searchStartTime != null and searchStartTime !='' ">
             AND up.create_time >=#{searchStartTime}
@@ -107,6 +114,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="searchEndTime != null and searchEndTime !='' ">
             AND #{searchEndTime} >= up.create_time
         </if>
+        <if test="applyStartTime != null and applyStartTime !='' ">
+            AND og.create_time >=#{searchStartTime}
+        </if>
+        <if test="applyEndTime != null and applyEndTime !='' ">
+            AND #{searchEndTime} >= og.create_time
+        </if>
+        <if test="companyName != null and companyName !='' ">
+            AND u.company_name like concat('%', #{companyName}, '%')
+        </if>
         <!-- 数据范围过滤 -->
         ${params.dataScope}
         order by up.create_time desc

+ 20 - 0
zhongzheng-system/src/main/resources/mapper/modules/exam/ExamApplyMapper.xml

@@ -297,6 +297,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           and us.goods_id = #{goodsId}
           and us.order_goods_id = #{orderGoodsId}
     </select>
+
+    <select id="getUserProfileList" parameterType="java.lang.String" resultType="com.zhongzheng.modules.base.domain.UserProfile">
+        SELECT
+            up.*
+        FROM
+            `user_profile` up
+                LEFT JOIN `user` u ON up.user_id = u.user_id
+                LEFT JOIN goods g ON up.goods_id = g.goods_id
+                LEFT JOIN major m ON g.major_id = m.id
+                LEFT JOIN course_education_type cet ON g.education_type_id = cet.id
+                LEFT JOIN course_project_type cpt ON g.project_id = cpt.id
+                LEFT JOIN course_business cb ON g.business_id = cb.id
+        WHERE
+            u.id_card = #{idCard,typeHandler=com.zhongzheng.common.type.EncryptHandler}
+          AND INSTR(
+                CONCAT( cet.education_name, cpt.project_name, cb.business_name ),#{businessName})
+          AND up.`status` != -1
+          AND m.category_name = #{post}
+    </select>
+
     <select id="selectExamUserApplyVo" parameterType="com.zhongzheng.modules.exam.bo.ExamApplyQueryBo" resultMap="ExamUserApplyVo">
         SELECT
             ea.apply_id,

+ 1 - 1
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeUserMapper.xml

@@ -352,7 +352,7 @@
             AND u.realname like concat('%', #{realname}, '%')
         </if>
         <if test="telphone != null and telphone != ''">
-            AND u.telphone = #{telphone,typeHandler=com.zhongzheng.common.type.EncryptHandler}
+            AND u.telphone = #{telphone`,typeHandler=com.zhongzheng.common.type.EncryptHandler`}
         </if>
         <if test="idCard != null and idCard != ''">
             AND u.id_card = #{idCard,typeHandler=com.zhongzheng.common.type.EncryptHandler}

+ 3 - 1
zhongzheng-system/src/main/resources/mapper/modules/settle/ExamActivityMapper.xml

@@ -66,6 +66,8 @@
             ti.bank_account,
             tis.check_status,
             tis.`status`,
+            tic.cost_cat_id,
+            tic.category_name as costCatName,
             cet.education_name,
             CONCAT(cb.business_name,cpt.project_name) AS business_name
         FROM
@@ -128,7 +130,7 @@
         AND INSTR(
         #{businessName},
         CONCAT( cet.education_name, cb.business_name, cpt.project_name )) > 0
-        AND (tis.settle_order_type == 3 OR tis.settle_order_type == #{settleOrderType})
+        AND (tis.settle_order_type = 3 OR tis.settle_order_type = #{settleOrderType})
     </select>
 
 </mapper>

+ 9 - 0
zhongzheng-system/src/main/resources/mapper/modules/top/TopOldOrderMapper.xml

@@ -85,6 +85,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                  ) a
                     LEFT JOIN v_top_order vto ON a.order_sn = vto.order_sn
         WHERE vto.`status` in (0,1)
+        <if test="operationType != null">
+            AND vto.operation_type = #{operationType}
+        </if>
         <if test="checkStatus != null">
             AND vto.check_status = #{checkStatus}
         </if>
@@ -161,6 +164,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="userCard != null and userCard != ''">
             AND otg.user_card = #{userCard,typeHandler=com.zhongzheng.common.type.EncryptHandler}
         </if>
+        <if test="operationType != null">
+            AND ot.operation_type = #{operationType}
+        </if>
         <if test="userName != null and userName != ''">
             AND otg.user_name LIKE CONCAT( '%', #{userName}, '%' )
         </if>
@@ -257,6 +263,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="checkStatus != null">
             AND o.check_status = #{checkStatus}
         </if>
+        <if test="operationType != null">
+            AND o.operation_type = #{operationType}
+        </if>
         <if test="refundStatus != null">
             AND o.order_refund_status = #{refundStatus}
         </if>