yangdamao 2 年之前
父节点
当前提交
a16ad37a9c
共有 36 个文件被更改,包括 1114 次插入10 次删除
  1. 26 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  2. 7 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  3. 10 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java
  4. 210 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/poi/ExcelUtil.java
  5. 10 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  6. 12 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ActivityRecommendServiceImpl.java
  7. 51 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyResultExportBo.java
  8. 24 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/SubscribeInfoBo.java
  9. 13 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamApplyMapper.java
  10. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamApplyService.java
  11. 154 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java
  12. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderGoodsMapper.java
  13. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderGoodsService.java
  14. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java
  15. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java
  16. 215 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  17. 44 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/domain/SysTask.java
  18. 13 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/mapper/SysTaskMapper.java
  19. 16 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/ISysTaskService.java
  20. 16 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysTaskServiceImpl.java
  21. 20 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/SubUserExportBo.java
  22. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserSubscribe.java
  23. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMapper.java
  24. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordMapper.java
  25. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserSubscribeMapper.java
  26. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserService.java
  27. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordService.java
  28. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java
  29. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java
  30. 43 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java
  31. 3 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubVo.java
  32. 91 0
      zhongzheng-system/src/main/resources/mapper/modules/exam/ExamApplyMapper.xml
  33. 9 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderGoodsMapper.xml
  34. 19 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml
  35. 4 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml
  36. 47 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserSubscribeMapper.xml

+ 26 - 4
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -42,10 +42,7 @@ import com.zhongzheng.modules.distribution.service.IDistributionActivityGoodsSer
 import com.zhongzheng.modules.distribution.service.IDistributionCashWithdrawalService;
 import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
 import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
-import com.zhongzheng.modules.exam.bo.ExamApplyDetailBo;
-import com.zhongzheng.modules.exam.bo.ExamApplyResultBo;
-import com.zhongzheng.modules.exam.bo.ExamApplySubscribeBo;
-import com.zhongzheng.modules.exam.bo.UpdateStudentImageBo;
+import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.exam.vo.ExamApplyDetailVo;
 import com.zhongzheng.modules.goods.bo.AlikeGoodsBo;
@@ -315,6 +312,31 @@ public class CommonController extends BaseController {
     }
 
     @ApiOperation("七大员新考结果")
+    @PostMapping("common/apply/result/receipt")
+    public AjaxResult examApplyResultReceipt(List<MultipartFile> files) {
+        files.forEach(item -> {
+            try {
+                ExcelUtil<ExamApplyResultExportBo> util = new ExcelUtil<ExamApplyResultExportBo>(ExamApplyResultExportBo.class);
+                //测试时间
+                String time = util.examApplyTimeAnalysis(item.getInputStream(), 1);
+                //成绩数据
+                List<ExamApplyResultExportBo> exportBo = util.examApplyImportExcel("", item.getInputStream());
+                iExamApplyService.examApplyResultReceipt(exportBo,time);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("七大员新考证书")
+    @PostMapping("common/apply/result/certificate")
+    public AjaxResult examApplyResultCertificate(List<MultipartFile> files) {
+        iExamApplyService.examApplyResultCertificate(files);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("七大员考试结果回执")
     @PostMapping("common/apply/result")
     public AjaxResult examApplyResult(@RequestBody ExamApplyResultBo bo) {
         if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {

+ 7 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java

@@ -444,4 +444,11 @@ public class ScheduleController extends BaseController {
         iScheduleService.syncUserDateStudyLog();
         return AjaxResult.success();
     }
+
+    @ApiOperation("七大员学员预约下载任务执行")
+    @GetMapping("/user/download")
+    public AjaxResult usbUserDownload(){
+        iScheduleService.usbUserDownload();
+        return AjaxResult.success();
+    }
 }

+ 10 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java

@@ -80,6 +80,16 @@ public class UserSubscribeController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 预约学员资料下载
+     */
+    @ApiOperation("预约学员资料下载")
+    @GetMapping("/sub/user/export")
+    public AjaxResult<Void> subUserExport(SubUserExportBo bo) {
+        return toAjax(iUserSubscribeService.subUserExport(bo) ? 1 : 0);
+    }
+
+
     /**
      * 根据月份获取当月考试场次
      */

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

@@ -315,6 +315,216 @@ public class ExcelUtil<T>
         return list;
     }
 
+    /**
+     * 获取七大员指定表格考试时间
+     *
+     * @param is 输入流
+     * @return 转换后集合
+     */
+    public String examApplyTimeAnalysis(InputStream is,Integer index) throws Exception
+    {
+        this.type = Type.IMPORT;
+        this.wb = WorkbookFactory.create(is);
+        Sheet sheet = wb.getSheetAt(0);
+        if (sheet == null)
+        {
+            throw new IOException("文件sheet不存在");
+        }
+        // 获取表头
+        Row heard = sheet.getRow(index);
+        Iterator<Cell> cellIterator = heard.cellIterator();
+        List<String> dataList = new ArrayList<>();
+        while(cellIterator.hasNext()) {
+            Cell next = cellIterator.next();
+            String stringCellValue = next.getStringCellValue();
+            dataList.add(stringCellValue);
+        }
+        return dataList.get(dataList.size() -1);
+    }
+    /**
+     * 七大员考试回执方法
+     *
+     * @param sheetName 表格索引名
+     * @param is 输入流
+     * @return 转换后集合
+     */
+    public List<T> examApplyImportExcel(String sheetName, InputStream is) throws Exception
+    {
+        this.type = Type.IMPORT;
+        this.wb = WorkbookFactory.create(is);
+        List<T> list = new ArrayList<T>();
+        Sheet sheet = null;
+        if (Validator.isNotEmpty(sheetName))
+        {
+            // 如果指定sheet名,则取指定sheet中的内容.
+            sheet = wb.getSheet(sheetName);
+        }
+        else
+        {
+            // 如果传入的sheet名不存在则默认指向第1个sheet.
+            sheet = wb.getSheetAt(0);
+        }
+
+        if (sheet == null)
+        {
+            throw new IOException("文件sheet不存在");
+        }
+
+        int rows = sheet.getPhysicalNumberOfRows();
+
+        if (rows > 0)
+        {
+            // 定义一个map用于存放excel列的序号和field.
+            Map<String, Integer> cellMap = new HashMap<String, Integer>();
+            // 第2行是表头
+            Row heard = sheet.getRow(2);
+            for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++)
+            {
+                Cell cell = heard.getCell(i);
+                if (Validator.isNotNull(cell))
+                {
+                    String value = this.getCellValue(heard, i).toString();
+                    cellMap.put(value, i);
+                }
+                else
+                {
+                    cellMap.put(null, i);
+                }
+            }
+            // 有数据时才处理 得到类的所有field.
+            Field[] allFields = clazz.getDeclaredFields();
+            // 定义一个map用于存放列的序号和field.
+            Map<Integer, Field> fieldsMap = new HashMap<Integer, Field>();
+            for (int col = 0; col < allFields.length; col++)
+            {
+                Field field = allFields[col];
+                Excel attr = field.getAnnotation(Excel.class);
+                if (attr != null && (attr.type() == Type.ALL || attr.type() == type))
+                {
+                    // 设置类的私有字段属性可访问.
+                    field.setAccessible(true);
+                    Integer column = cellMap.get(attr.name());
+                    if (column != null)
+                    {
+                        fieldsMap.put(column, field);
+                    }
+                }
+            }
+            for (int i = 3; i < rows; i++)
+            {
+                // 从第3行开始取数据,第2行是表头.
+                Row row = sheet.getRow(i);
+                if(row == null)
+                {
+                    continue;
+                }
+                T entity = null;
+                for (Map.Entry<Integer, Field> entry : fieldsMap.entrySet())
+                {
+                    Object val = this.getCellValue(row, entry.getKey());
+
+                    // 如果不存在实例则新建.
+                    entity = (entity == null ? clazz.newInstance() : entity);
+                    // 从map中得到对应列的field.
+                    Field field = fieldsMap.get(entry.getKey());
+                    // 取得类型,并根据对象类型设置值.
+                    Class<?> fieldType = field.getType();
+                    if (String.class == fieldType)
+                    {
+                        String s = Convert.toStr(val);
+                        if (StrUtil.endWith(s, ".0"))
+                        {
+                            //    val = StrUtil.subBefore(s, ".0",false);
+                        }
+                        else
+                        {
+                            if (val instanceof Double)
+                            {
+                                String dateFormat = field.getAnnotation(Excel.class).dateFormat();
+                                if (Validator.isNotEmpty(dateFormat))
+                                {
+                                    val = DateUtils.parseDateToStr(dateFormat, (Date) val);
+                                }
+                                else
+                                {
+                                    val = Convert.toStr(val);
+                                }
+                            }
+                            if (val instanceof Date)
+                            {
+                                String dateFormat = field.getAnnotation(Excel.class).dateFormat();
+                                if (Validator.isNotEmpty(dateFormat))
+                                {
+                                    val = DateUtils.parseDateToStr(dateFormat, (Date) val);
+                                }
+                                else
+                                {
+                                    val = Convert.toStr(val);
+                                }
+                            }
+
+                        }
+                    }
+                    else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && Validator.isNumber(Convert.toStr(val)))
+                    {
+                        val = Convert.toInt(val);
+                    }
+                    else if (Long.TYPE == fieldType || Long.class == fieldType)
+                    {
+                        val = Convert.toLong(val);
+                    }
+                    else if (Double.TYPE == fieldType || Double.class == fieldType)
+                    {
+                        val = Convert.toDouble(val);
+                    }
+                    else if (Float.TYPE == fieldType || Float.class == fieldType)
+                    {
+                        val = Convert.toFloat(val);
+                    }
+                    else if (BigDecimal.class == fieldType)
+                    {
+                        val = Convert.toBigDecimal(val);
+                    }
+                    else if (Date.class == fieldType)
+                    {
+                        if (val instanceof String)
+                        {
+                            val = DateUtils.parseDate(val);
+                        }
+                        else if (val instanceof Double)
+                        {
+                            val = DateUtil.getJavaDate((Double) val);
+                        }
+                    }
+                    else if (Boolean.TYPE == fieldType || Boolean.class == fieldType)
+                    {
+                        val = Convert.toBool(val, false);
+                    }
+                    if (Validator.isNotNull(fieldType))
+                    {
+                        Excel attr = field.getAnnotation(Excel.class);
+                        String propertyName = field.getName();
+                        if (Validator.isNotEmpty(attr.targetAttr()))
+                        {
+                            propertyName = field.getName() + "." + attr.targetAttr();
+                        }
+                        else if (Validator.isNotEmpty(attr.readConverterExp()))
+                        {
+                            val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator());
+                        }
+                        else if (Validator.isNotEmpty(attr.dictType()))
+                        {
+                            val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator());
+                        }
+                        ReflectUtils.invokeSetter(entity, propertyName, val);
+                    }
+                }
+                list.add(entity);
+            }
+        }
+        return list;
+    }
+
     /**
      * 对list数据源将其里面的数据导入到excel表单
      *

+ 10 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java

@@ -1584,6 +1584,16 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return tokenService.createToken(loginUser);
     }
 
+    @Override
+    public User getByIdNoTenant(Long userId) {
+        return baseMapper.getByIdNoTenant(userId);
+    }
+
+    @Override
+    public User getByCardNoTenant(String idCard) {
+        return baseMapper.getByCardNoTenant(idCard);
+    }
+
 
     @Override
     public Map<String, Object> accountLogin(UserAppAccountLoginBo bo) {

+ 12 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ActivityRecommendServiceImpl.java

@@ -140,6 +140,18 @@ public class ActivityRecommendServiceImpl extends ServiceImpl<ActivityRecommendM
                             GoodsSpecAttributeRelation relation = list.stream().findFirst().get();
                             item.setSpecTemplateId(relation.getSpecTemplateId());
                         }
+                        //多规格下的价格区间
+                        List<GoodsSpecAttributeRelation> specAttributeRelations = goodsSpecAttributeRelationService
+                                .list(new LambdaQueryWrapper<GoodsSpecAttributeRelation>()
+                                        .eq(GoodsSpecAttributeRelation::getSpecTemplateId, item.getSpecTemplateId()));
+                        if (CollectionUtils.isNotEmpty(specAttributeRelations)) {
+                            List<Long> goodsIds = specAttributeRelations.stream().filter(x -> ObjectUtils.isNotNull(x.getGoodsId())).map(GoodsSpecAttributeRelation::getGoodsId).collect(Collectors.toList());
+                            List<Goods> goodsList = iGoodsService.listByIds(goodsIds);
+                            //从小到大排序
+                            List<Goods> collect = goodsList.stream().filter(x -> ObjectUtils.isNotNull(x.getStandPrice())).sorted(Comparator.comparing(Goods::getStandPrice)).collect(Collectors.toList());
+                            item.setMinPrice(collect.get(0).getStandPrice());
+                            item.setMaxPrice(collect.get(collect.size() - 1).getStandPrice());
+                        }
                     }
                 });
             }

+ 51 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyResultExportBo.java

@@ -0,0 +1,51 @@
+package com.zhongzheng.modules.exam.bo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月20日 11:22
+ */
+@Data
+public class ExamApplyResultExportBo implements Serializable {
+
+    @Excel(name = "序号")
+    private String index;
+
+    @Excel(name = "考生姓名")
+    private String userName;
+
+    @Excel(name = "考生身份证号")
+    private String idCard;
+
+    @Excel(name = "联系方式")
+    private String telphone;
+
+    @Excel(name = "岗位名称")
+    private String majorName;
+
+    @Excel(name = "考试状态")
+    private String applyStatus;
+
+    @Excel(name = "考试成绩")
+    private String score;
+
+    @Excel(name = "成绩审核状态")
+    private String scoreCheck;
+
+    @Excel(name = "成绩审核时间")
+    private String scoreCheckTime;
+
+    @Excel(name = "工作单位")
+    private String companyName;
+
+    @Excel(name = "证书编码")
+    private String certificateCode;
+
+
+}

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/SubscribeInfoBo.java

@@ -0,0 +1,24 @@
+package com.zhongzheng.modules.exam.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年10月11日 11:40
+ */
+@Data
+public class SubscribeInfoBo implements Serializable {
+
+    private Long userId;
+
+    private Long applyTime;
+
+    private String applyStartTime;
+
+    private String applyEndTime;
+
+    private String major;
+
+}

+ 13 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamApplyMapper.java

@@ -3,10 +3,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;
-import com.zhongzheng.modules.exam.bo.ExamNumberGoodsQueryBo;
+import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.domain.ExamApply;
 import com.zhongzheng.modules.exam.vo.*;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
@@ -100,4 +97,16 @@ public interface ExamApplyMapper extends BaseMapper<ExamApply> {
 
     @InterceptorIgnore(tenantLine = "true")
     String getExamRelCodeNotTenant(@Param("applyName") String applyName);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<UserStudyRecordExport> getUserStudyRecordNoTenant(Long orderGoodsId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<String> getSevenMajorNames();
+
+    @InterceptorIgnore(tenantLine = "true")
+    UserSubscribe getSubscribeInfo(SubscribeInfoBo infoBo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    UserSubscribe getExamPassSub(SubscribeInfoBo infoBo);
 }

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

@@ -8,6 +8,7 @@ import com.zhongzheng.modules.exam.vo.*;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
+import com.zhongzheng.modules.user.vo.UserStudyRecordExport;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Collection;
@@ -104,4 +105,9 @@ public interface IExamApplyService extends IService<ExamApply> {
 
     String getExamRelCodeNotTenant(String applyName);
 
+    List<UserStudyRecordExport> getUserStudyRecordNoTenant(Long orderGoodsId);
+
+    void examApplyResultReceipt(List<ExamApplyResultExportBo> exportBo, String time);
+
+    void examApplyResultCertificate(List<MultipartFile> files);
 }

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

@@ -78,9 +78,12 @@ import javax.mail.internet.*;
 import javax.mail.util.ByteArrayDataSource;
 import java.awt.image.BufferedImage;
 import java.io.*;
+import java.math.BigDecimal;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -1234,6 +1237,157 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
         return baseMapper.getExamRelCodeNotTenant(applyName);
     }
 
+    @Override
+    public List<UserStudyRecordExport> getUserStudyRecordNoTenant(Long orderGoodsId) {
+        return baseMapper.getUserStudyRecordNoTenant(orderGoodsId);
+    }
+
+    @Override
+    public void examApplyResultReceipt(List<ExamApplyResultExportBo> exportBo, String time) {
+        if (CollectionUtils.isEmpty(exportBo)){
+            return;
+        }
+        //考试时间
+        List<String> collect = Arrays.stream(time.split(" ")).collect(Collectors.toList());
+        SubscribeInfoBo infoBo = new SubscribeInfoBo();
+        infoBo.setApplyTime(DateUtils.dateTimeSec("yyyy-MM-dd",collect.get(0)));
+        infoBo.setApplyStartTime(getTimeStr(collect.get(1)));
+        infoBo.setApplyEndTime(getTimeStr(collect.get(3)));
+        //补充学员成绩
+        exportBo.forEach(bo -> {
+            //查询学员信息
+            User user = iUserService.getByCardNoTenant(bo.getIdCard());
+            if (ObjectUtils.isNull(user)){
+                log.error("学员信息查询不到:"+bo.getUserName());
+                return;
+            }
+            //预约考试信息
+            //匹配系统七大员报考岗位
+            String majorName = getMajorName(bo.getMajorName());
+            infoBo.setMajor(majorName);
+            infoBo.setUserId(user.getUserId());
+            UserSubscribe subscribe = baseMapper.getSubscribeInfo(infoBo);
+            if (ObjectUtils.isNull(subscribe)){
+                return;
+            }
+            switch (bo.getApplyStatus()){
+                case "正常":
+                    //补充考试成绩
+                    BigDecimal bigDecimal = new BigDecimal(bo.getScore());
+                    subscribe.setExamStatus(1);
+                    subscribe.setPerformance(bigDecimal.longValue());
+                    if (bigDecimal.compareTo(new BigDecimal("60.00")) >= 0){
+                        subscribe.setResult(1);
+                    }else {
+                        subscribe.setResult(0);
+                    }
+                    break;
+                case "缺考":
+                    //补充考试成绩
+                    BigDecimal bigDecimal2 = new BigDecimal(bo.getScore());
+                    subscribe.setExamStatus(2);
+                    subscribe.setPerformance(bigDecimal2.longValue());
+                    subscribe.setResult(0);
+                    break;
+                case "作弊":
+                    //补充考试成绩
+                    BigDecimal bigDecimal3 = new BigDecimal(bo.getScore());
+                    subscribe.setExamStatus(3);
+                    subscribe.setPerformance(bigDecimal3.longValue());
+                    subscribe.setResult(0);
+                    break;
+                    default :
+                        break;
+            }
+
+            iUserSubscribeService.updateByIdNoTenant(subscribe);
+        });
+    }
+
+    @Override
+    public void examApplyResultCertificate(List<MultipartFile> files) {
+        if (CollectionUtils.isEmpty(files)){
+            return;
+        }
+        files.forEach(multipartFile -> {
+            //文件名= 身份证号码_岗位名称_证书编号_发证日期
+            String fileName = multipartFile.getOriginalFilename();
+            List<String> collect = Arrays.stream(fileName.split("_")).collect(Collectors.toList());
+            //查询学员信息
+            User user = iUserService.getByCardNoTenant(collect.get(0));
+            if (ObjectUtils.isNull(user)){
+                log.error("学员信息查询不到:"+collect.get(0));
+                return;
+            }
+            SubscribeInfoBo infoBo = new SubscribeInfoBo();
+            infoBo.setMajor(collect.get(1));
+            infoBo.setUserId(user.getUserId());
+            UserSubscribe subscribe = baseMapper.getExamPassSub(infoBo);
+            if (ObjectUtils.isNull(subscribe)){
+                return;
+            }
+            subscribe.setCertificateCode(collect.get(2));
+            Long time = DateUtils.dateTimeSec("yyyy-MM-dd",collect.get(3));
+            subscribe.setCertificateStartTime(time);
+            //有效期为一年
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(DateUtils.timeToDate(time));
+            // 将年份加一
+            calendar.add(Calendar.YEAR, 1);
+            Long timeTwo = calendar.getTime().getTime()/1000;
+            subscribe.setCertificateEndTime(timeTwo);
+
+            //上传证书
+            OssRequest ossRequest = new OssRequest();
+            ossRequest.setGradeId(0L);
+            ossRequest.setUserId(0L);
+            ossRequest.setImageStatus(7);
+            ossRequest.setFile(multipartFile);
+            try {
+                String upload = ossService.upload(ossRequest);
+                subscribe.setCertificateUrl(upload);
+            } catch (Exception e) {
+                log.error("证书上传有误:"+collect.get(0));
+                e.printStackTrace();
+            }
+            iUserSubscribeService.updateByIdNoTenant(subscribe);
+        });
+    }
+
+    private String getMajorName(String majorName) {
+        //祥粤学习 七大员报考岗位名称
+        List<String> names = baseMapper.getSevenMajorNames();
+        if (CollectionUtils.isEmpty(names)){
+            return "";
+        }
+        List<String> collect = names.stream().sorted(Comparator.comparing(x -> {
+            Integer count = 0;
+            for (int i = 0; i < majorName.length(); i++) {
+                char c = majorName.charAt(i);
+                if (x.contains(Character.toString(c))) {
+                    count++;
+                }
+            }
+            return count;
+        })).collect(Collectors.toList());
+
+        return collect.get(collect.size() - 1);
+    }
+
+    private String getTimeStr(String str){
+        String format = "";
+        SimpleDateFormat sf = new SimpleDateFormat("HH:mm:ss");
+        SimpleDateFormat sf2 = new SimpleDateFormat("HH:mm");
+        try {
+            Date parse = sf.parse(str);
+            format = sf2.format(parse);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return format;
+    }
+
+
     //生成承诺书
     private void generateCommitment(String keyValue,String toPath,String idCard,String major)throws IOException {
         int imgIndex=(int)(Math.random() * 10 );

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderGoodsMapper.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.order.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.course.vo.CourseLiveVo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
@@ -72,4 +73,7 @@ public interface OrderGoodsMapper extends BaseMapper<OrderGoods> {
     OrderGoods getSevenLastOne(@Param("projectId")Integer projectId,@Param("sevenYear")String sevenYear,@Param("userId")Long userId);
 
     Long countOrderGoodsByYear(@Param("sevenYear") String sevenYear,@Param("goodsId") Long goodsId,@Param("userId") Long userId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    OrderGoods getByIdNoTenant(Long orderGoodsId);
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderGoodsService.java

@@ -127,4 +127,6 @@ public interface IOrderGoodsService extends IService<OrderGoods> {
     String getOrderSevenYear(Long orderGoodsId);
 
     GoodsFirstChoiceAddBo firstChoiceGoods(GoodsFirstChoiceAddBo bo);
+
+    OrderGoods getByIdNoTenant(Long orderGoodsId);
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java

@@ -856,6 +856,11 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
         return orderGoods.getSevenYear();
     }
 
+    @Override
+    public OrderGoods getByIdNoTenant(Long orderGoodsId) {
+        return baseMapper.getByIdNoTenant(orderGoodsId);
+    }
+
     private boolean checkUnique(Long GoodsId,Long UserId) {
         ShoppingCart info = iShoppingCartService.getOne(new LambdaQueryWrapper<ShoppingCart>()
                 .eq(ShoppingCart::getUserId,UserId).eq(ShoppingCart::getGoodsId,GoodsId).last("limit 1"));

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java

@@ -116,4 +116,5 @@ public interface IScheduleService extends IService<PolyvVideo> {
 
     void syncUserDateStudyLog();
 
+    void usbUserDownload();
 }

+ 215 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java

@@ -14,9 +14,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.file.FileUtils;
 import com.zhongzheng.common.utils.http.HttpUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.alioss.bo.OssRequest;
+import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.alisms.vo.ResultBean;
 import com.zhongzheng.modules.base.service.IProfileTpService;
 import com.zhongzheng.modules.base.vo.ProfileTpVo;
@@ -98,7 +103,9 @@ import com.zhongzheng.modules.polyv.service.IPolyvLiveService;
 import com.zhongzheng.modules.schedule.service.IScheduleService;
 import com.zhongzheng.modules.system.bo.SysTenantBadBillConfigBo;
 import com.zhongzheng.modules.system.bo.SysTenantQueryBo;
+import com.zhongzheng.modules.system.domain.SysTask;
 import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.service.ISysTaskService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.system.service.ISysUserService;
 import com.zhongzheng.modules.system.vo.SysTenantVo;
@@ -128,7 +135,14 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigDecimal;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -136,6 +150,7 @@ import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 定时任务
@@ -328,6 +343,10 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
     private ICourseProjectTypeService iCourseProjectTypeService;
     @Autowired
     private ICourseBusinessService iCourseBusinessService;
+    @Autowired
+    private ISysTaskService iSysTaskService;
+    @Autowired
+    private OssService ossService;
 
 
     @Value("${aliyun.sms.OpenTheGoodsCode}")
@@ -1815,6 +1834,202 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
         iUserStudyRecordService.syncUserDateStudyLog();
     }
 
+    @Override
+    public void usbUserDownload() {
+        int count = iSysTaskService
+                .count(new LambdaQueryWrapper<SysTask>()
+                .eq(SysTask::getStatus, 1)
+                .eq(SysTask::getTaskStatus, 2));
+        if (count > 0){
+            //已有任务在执行中 不同步执行
+            return;
+        }
+        SysTask task = iSysTaskService.getOne(new LambdaQueryWrapper<SysTask>()
+                .eq(SysTask::getTaskStatus, 1)
+                .eq(SysTask::getStatus, 1)
+                .orderByAsc(SysTask::getCreateTime)
+                .last("limit 1"));
+        if (ObjectUtils.isNull(task)){
+            return;
+        }
+
+        //执行下载任务
+        SubUserExportBo subUserExportBo = JSONObject.parseObject(task.getTaskParam(), SubUserExportBo.class);
+        List<UserSubscribe> subscribeList = iUserSubscribeService.listByTimeNoTenant(subUserExportBo);
+        if (CollectionUtils.isEmpty(subscribeList)){
+            task.setTaskStatus(3);//完成
+            iSysTaskService.updateById(task);
+            return;
+        }
+        task.setTaskStatus(2);//执行中
+        iSysTaskService.updateById(task);
+        String zhiyuan = System.getProperty("user.dir");
+        String destDirPath = zhiyuan+"/zhongzheng-admin/src/main/resources/"
+                +String.format("%s预约考试",DateUtils.timestampToDateFormat(subUserExportBo.getApplyTime(),"yyyy-MM-dd"));
+        List<UserStudyRecordExport> recordExports = new ArrayList<>();
+        for (int i = 0; i < subscribeList.size(); i++) {
+            UserSubscribe item = subscribeList.get(i);
+            User user = iUserService.getByIdNoTenant(item.getUserId());
+            String userPhotoPath = destDirPath+"/"+user.getRealname()+"/"+"个人相片";
+            File dirw = new File(userPhotoPath);
+            if (!dirw.exists()){
+                dirw.mkdirs();
+            }
+            //获取个人近照和身份证照片
+            try {
+                InputStream inputStream = ossService.getStreamByObject(user.getOneInchPhotos());
+                //写入本地文件
+                String inchPath = userPhotoPath + "/"+String.format("%s$头像.jpg", EncryptHandler.decrypt(user.getIdCard()));
+                FileOutputStream fileOutputStream = new FileOutputStream(inchPath);
+                byte[] buffer = new byte[1024];
+                int len = 0;
+                while ((len = inputStream.read(buffer)) != -1) {
+                    fileOutputStream.write(buffer, 0, len);
+                }
+                inputStream.close();
+                fileOutputStream.close();
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            try {
+                InputStream inputStream = ossService.getStreamByObject(user.getIdCardImg2());
+                //写入本地文件
+                String cardPath1 = userPhotoPath + "/"+String.format("%s身份证反面.jpg", user.getRealname());
+                FileOutputStream fileOutputStream = new FileOutputStream(cardPath1);
+                byte[] buffer = new byte[1024];
+                int len = 0;
+                while ((len = inputStream.read(buffer)) != -1) {
+                    fileOutputStream.write(buffer, 0, len);
+                }
+                inputStream.close();
+                fileOutputStream.close();
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            try {
+                InputStream inputStream = ossService.getStreamByObject(user.getIdCardImg1());
+                //写入本地文件
+                String cardPath2 = userPhotoPath + "/"+String.format("%s身份证正面.jpg", user.getRealname());
+                FileOutputStream fileOutputStream = new FileOutputStream(cardPath2);
+                byte[] buffer = new byte[1024];
+                int len = 0;
+                while ((len = inputStream.read(buffer)) != -1) {
+                    fileOutputStream.write(buffer, 0, len);
+                }
+                inputStream.close();
+                fileOutputStream.close();
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            //学习照片
+            OrderGoods orderGoods = iOrderGoodsService.getByIdNoTenant(item.getOrderGoodsId());
+            Goods goods = iGoodsService.getGoodsByIdNotTenant(orderGoods.getGoodsId());
+            String goodsPath = destDirPath+"/"+user.getRealname()+"/"+goods.getGoodsName();
+            File dirw2 = new File(goodsPath);
+            if (!dirw2.exists()){
+                dirw2.mkdirs();
+            }
+            List<UserStudyRecord> recordList = iUserStudyRecordService.getStudyRecordNoTenant(orderGoods.getOrderGoodsId());
+            if (CollectionUtils.isEmpty(recordList)){
+                continue;
+            }
+            Map<Long, List<UserStudyRecord>> map = recordList.stream().collect(Collectors.groupingBy(UserStudyRecord::getSectionId));
+            map.forEach((k,v) -> {
+                CourseSection section = iCourseSectionService.getSectionByNotTenant(k);
+                String sectionPath = goodsPath+"/"+section.getName();
+                File dirw3 = new File(sectionPath);
+                if (!dirw3.exists()){
+                    dirw3.mkdirs();
+                }
+                //视频拍照信息
+                v.stream().filter(x -> ObjectUtils.isNotNull(x.getPhoto())).forEach(photo -> {
+                    try {
+                        InputStream inputStream = ossService.getStreamByObject(photo.getPhoto());
+                        //写入本地文件
+                        String photoPath1 = sectionPath + "/"+String.format("%s.jpg",DateUtils.getNowTime());
+                        FileOutputStream fileOutputStream = new FileOutputStream(photoPath1);
+                        byte[] buffer = new byte[1024];
+                        int len = 0;
+                        while ((len = inputStream.read(buffer)) != -1) {
+                            fileOutputStream.write(buffer, 0, len);
+                        }
+                        inputStream.close();
+                        fileOutputStream.close();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                });
+            });
+
+            //学习记录
+           List<UserStudyRecordExport> exports = iExamApplyService.getUserStudyRecordNoTenant(item.getOrderGoodsId());
+            if (CollectionUtils.isEmpty(exports)) {
+                continue;
+            }
+            exports.forEach(recordItem -> {
+                recordItem.setUserName(user.getRealname());
+                recordItem.setIdCard(EncryptHandler.decrypt(user.getIdCard()));
+                recordItem.setCompanyName(user.getCompanyName());
+                recordItem.setSectionTime(DateUtils.secondConvertHourMinSecond(recordItem.getDurationTime()));
+                if (ObjectUtils.isNotNull(recordItem.getStatus()) && recordItem.getStatus() == 1) {
+                    //已学完
+                    recordItem.setStudyTime(DateUtils.secondConvertHourMinSecond(recordItem.getDurationTime()));
+                    recordItem.setFinish("已完成");
+                } else {
+                    recordItem.setFinish("未完成");
+                }
+                recordItem.setStudyStartTime(DateUtils.timestampToDateFormat(recordItem.getStartTime(), "yyyy/MM/dd HH:mm:ss"));
+                recordItem.setStudyEndTime(DateUtils.timestampToDateFormat(recordItem.getEndTime(), "yyyy/MM/dd HH:mm:ss"));
+            });
+            recordExports.addAll(exports);
+            task.setFinishNum(i+1);
+            iSysTaskService.updateById(task);
+        }
+        ExcelUtil<UserStudyRecordExport> util = new ExcelUtil<UserStudyRecordExport>(UserStudyRecordExport.class);
+        String path = destDirPath + "/" +"学习记录表" + ".xlsx";
+        util.exportEasyExcelStudy(util.exportEasyData(recordExports), path);
+        //打包zip 上传oss
+        String zipPath = zhiyuan+"/zhongzheng-admin/src/main/resources/"
+                +String.format("%s预约考试.zip",DateUtils.timestampToDateFormat(subUserExportBo.getApplyTime(),"yyyy-MM-dd"));
+        FileUtils.toZip(zipPath,destDirPath,true);
+        //上传oss
+        OssRequest ossRequest = new OssRequest();
+        ossRequest.setGradeId(0L);
+        ossRequest.setUserId(0L);
+        ossRequest.setImageStatus(7);
+        File file1 = new File(zipPath);
+        ossRequest.setFile(FileUtils.getMultipartFile(file1));
+        try {
+            String upload = ossService.upload(ossRequest);
+            task.setTaskPath(upload);
+            task.setTaskStatus(3);//完成
+            iSysTaskService.updateById(task);
+            //删除本地资源
+            Path pathStr = Paths.get(destDirPath);
+            try (Stream<Path> walk = Files.walk(pathStr)) {
+                walk.sorted(Comparator.reverseOrder())
+                        .forEach(FileUtils::deleteDirectoryStream);
+            }catch (IOException e) {
+                log.error("删除本地资源失败:"+ DateUtils.getNowTime());
+            }
+
+            Path zipStr = Paths.get(zipPath);
+            try (Stream<Path> walk = Files.walk(zipStr)) {
+                walk.sorted(Comparator.reverseOrder())
+                        .forEach(FileUtils::deleteDirectoryStream);
+            }catch (IOException e) {
+                log.error("删除本地资源失败:"+ DateUtils.getNowTime());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
     private String getWeeks(Long time){
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(DateUtils.timeToDate(time));

+ 44 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/domain/SysTask.java

@@ -0,0 +1,44 @@
+package com.zhongzheng.modules.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 系统商户对象 sys_tenant
+ *
+ * @author hjl
+ * @date 2021-08-03
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("sys_task")
+public class SysTask implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Long createTime;
+    private Long updateTime;
+    /** 0 失效 1启用 */
+    private Integer status;
+    /** 任务名称 */
+    private String taskName;
+    /** 任务数量 */
+    private Integer taskNum;
+    /** 完成数量 */
+    private Integer finishNum;
+    /** 执行参数 */
+    private String taskParam;
+    /** 下载路径 */
+    private String taskPath;
+    /** 1未开始 2执行中 3已完成 */
+    private Integer taskStatus;
+
+    private Long tenantId;
+
+}

+ 13 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/mapper/SysTaskMapper.java

@@ -0,0 +1,13 @@
+package com.zhongzheng.modules.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.system.domain.SysTask;
+
+/**
+ * 参数配置 数据层
+ *
+ * @author zhongzheng
+ */
+public interface SysTaskMapper extends BaseMapper<SysTask> {
+
+}

+ 16 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/ISysTaskService.java

@@ -0,0 +1,16 @@
+package com.zhongzheng.modules.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.system.domain.SysConfig;
+import com.zhongzheng.modules.system.domain.SysTask;
+import com.zhongzheng.modules.system.vo.SysConfigVo;
+
+import java.util.List;
+
+/**
+ * 参数配置 服务层
+ *
+ * @author zhongzheng
+ */
+public interface ISysTaskService extends IService<SysTask> {
+}

+ 16 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysTaskServiceImpl.java

@@ -0,0 +1,16 @@
+package com.zhongzheng.modules.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.system.domain.SysTask;
+import com.zhongzheng.modules.system.mapper.SysTaskMapper;
+import com.zhongzheng.modules.system.service.ISysTaskService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 参数配置 服务层实现
+ *
+ * @author zhongzheng
+ */
+@Service
+public class SysTaskServiceImpl extends ServiceImpl<SysTaskMapper, SysTask> implements ISysTaskService {
+}

+ 20 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/SubUserExportBo.java

@@ -0,0 +1,20 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年10月09日 15:29
+ */
+@Data
+public class SubUserExportBo implements Serializable {
+
+    @ApiModelProperty("考试日期时间")
+    private Long applyTime;
+
+    private List<Long> tenantIds;
+}

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserSubscribe.java

@@ -117,5 +117,11 @@ private static final long serialVersionUID=1L;
     private Long reportFileTime;
     /** 智慧考场抓拍照 */
     private String snapPictures;
+    /** 证书下载地址 */
+    private String certificateUrl;
+    /** 发证时间 */
+    private Long certificateStartTime;
+    /** 到期时间 */
+    private Long certificateEndTime;
 
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMapper.java

@@ -78,4 +78,10 @@ public interface UserMapper extends BaseMapper<User> {
 
     @InterceptorIgnore(tenantLine = "true")
     List<User> listByIdsNotTenant(@Param("userIds")List<Long> userIds);
+
+    @InterceptorIgnore(tenantLine = "true")
+    User getByIdNoTenant(Long userId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    User getByCardNoTenant(String idCard);
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordMapper.java

@@ -126,4 +126,8 @@ public interface UserStudyRecordMapper extends BaseMapper<UserStudyRecord> {
 
     @InterceptorIgnore(tenantLine = "true")
     List<CdUserStudyLogVo> syncUserList(UserStudyRecordQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<UserStudyRecord> getStudyRecordNoTenant(Long orderGoodsId);
+
 }

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserSubscribeMapper.java

@@ -3,6 +3,7 @@ package com.zhongzheng.modules.user.mapper;
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.goods.domain.GoodsQuestionRel;
+import com.zhongzheng.modules.user.bo.SubUserExportBo;
 import com.zhongzheng.modules.user.bo.UserSubQueryBo;
 import com.zhongzheng.modules.user.bo.UserSubscribeQueryBo;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
@@ -76,4 +77,10 @@ public interface UserSubscribeMapper extends BaseMapper<UserSubscribe> {
 
     @InterceptorIgnore(tenantLine = "true")
     GoodsQuestionRel getQuestionRel(Long orderGoodsId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<UserSubscribe> listByTimeNoTenant(SubUserExportBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void updateByIdNoTenant(UserSubscribe subscribe);
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserService.java

@@ -138,4 +138,8 @@ public interface IUserService extends IService<User> {
     List<User> listByIdsNotTenant(List<Long> userIds);
 
 	String createToken(LoginUser loginUser);
+
+    User getByIdNoTenant(Long userId);
+
+    User getByCardNoTenant(String idCard);
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordService.java

@@ -150,4 +150,5 @@ public interface IUserStudyRecordService extends IService<UserStudyRecord> {
 
 	Boolean syncUserDateStudyLog();
 
+    List<UserStudyRecord> getStudyRecordNoTenant(Long orderGoodsId);
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java

@@ -114,4 +114,10 @@ public interface IUserSubscribeService extends IService<UserSubscribe> {
 	void examApplySubscribeCancel(ExamApplySubscribeBo bo);
 
 	List<UserSubVo> getListSubscribe(UserSubQueryBo bo);
+
+    Boolean subUserExport(SubUserExportBo bo);
+
+	List<UserSubscribe> listByTimeNoTenant(SubUserExportBo subUserExportBo);
+
+	void updateByIdNoTenant(UserSubscribe subscribe);
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java

@@ -1445,6 +1445,11 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
         return null;
     }
 
+    @Override
+    public List<UserStudyRecord> getStudyRecordNoTenant(Long orderGoodsId) {
+        return baseMapper.getStudyRecordNoTenant(orderGoodsId);
+    }
+
 
     /**
      * 获取最后一次看完的节

+ 43 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java

@@ -69,7 +69,9 @@ import com.zhongzheng.modules.inform.vo.InformRemindBusinessVo;
 import com.zhongzheng.modules.inform.vo.InformRemindVo;
 import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
+import com.zhongzheng.modules.system.domain.SysTask;
 import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.service.ISysTaskService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.User;
@@ -177,6 +179,8 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     private ICourseBusinessService iCourseBusinessService;
     @Autowired
     private ISysTenantService iSysTenantService;
+    @Autowired
+    private ISysTaskService iSysTaskService;
 
     @Value("${aliyun.sms.cancellationReminder}")
     private String cancellationReminder;
@@ -2665,7 +2669,7 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             if (ObjectUtils.isNotNull(questionRel)){
                 item.setQuestionStatus(1);
             }else {
-                item.setQuestionStatus(0);
+                item.setQuestionStatus(2);
             }
             //考试状态
             if (item.getSubscribeStatus() == 1 && item.getExamStatus() == 0){
@@ -2682,6 +2686,44 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         return userSubVos;
     }
 
+    @Override
+    public Boolean subUserExport(SubUserExportBo bo) {
+        //加入任务列表
+        SysTask sysTask = new SysTask();
+        sysTask.setTaskName(String.format("%s 学员预约下载任务",DateUtils.getTime()));
+        //下载数量
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        SysTenant sysTenant = iSysTenantService.getById(Long.valueOf(tenantId));
+        if (ObjectUtils.isNotNull(sysTenant.getExamRoom()) && sysTenant.getExamRoom() == 1){
+            //公用祥粤考场
+            List<SysTenant> list = iSysTenantService
+                    .list(new LambdaQueryWrapper<SysTenant>().eq(SysTenant::getStatus, 1)
+                    .eq(SysTenant::getExamRoom, 1));
+            bo.setTenantIds(list.stream().map(SysTenant::getTenantId).collect(Collectors.toList()));
+        }else {
+            bo.setTenantIds(Arrays.asList(Long.valueOf(tenantId)));
+        }
+        List<UserSubscribe> subscribeList = baseMapper.listByTimeNoTenant(bo);
+        sysTask.setTaskNum(subscribeList.size());
+        sysTask.setFinishNum(0);
+        sysTask.setTaskParam(JSONObject.toJSONString(bo));
+        sysTask.setTaskStatus(1);
+        sysTask.setCreateTime(DateUtils.getNowTime());
+        sysTask.setUpdateTime(DateUtils.getNowTime());
+        return iSysTaskService.save(sysTask);
+    }
+
+    @Override
+    public List<UserSubscribe> listByTimeNoTenant(SubUserExportBo subUserExportBo) {
+        return baseMapper.listByTimeNoTenant(subUserExportBo);
+    }
+
+    @Override
+    public void updateByIdNoTenant(UserSubscribe subscribe) {
+        baseMapper.updateByIdNoTenant(subscribe);
+    }
+
+
     /**
      * 学员学时图片修改
      * @author change

+ 3 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubVo.java

@@ -32,6 +32,8 @@ public class UserSubVo implements Serializable {
 	private String goodsName;
 	@ApiModelProperty("岗位")
 	private String majorName;
+	@ApiModelProperty("公司名称")
+	private String companyName;
 	@ApiModelProperty("所属机构")
 	private String tenantName;
 	@ApiModelProperty("创建时间")
@@ -40,7 +42,7 @@ public class UserSubVo implements Serializable {
 	private Integer subscribeStatus;
 	@ApiModelProperty("预约结果")
 	private String applyResult;
-	@ApiModelProperty("是否开通题库:1是 0否")
+	@ApiModelProperty("是否开通题库:1是 2否")
 	private Integer questionStatus;
 	@ApiModelProperty("考试状态:1待考试 2通过 3未通过")
 	private Integer applyStatus;

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

@@ -655,4 +655,95 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND m.`status` = 1
           AND m.category_name = #{majorName}
     </select>
+
+
+    <select id="getUserStudyRecordNoTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.user.vo.UserStudyRecordExport">
+        SELECT
+            order_goods_id,
+            goods_id,
+            module_id,
+            chapter_id,
+            section_id,
+            (SELECT goods_name FROM goods WHERE goods_id = usr.goods_id) as goods_name,
+            (SELECT `name` FROM course_chapter WHERE chapter_id = usr.chapter_id) as chapter_name,
+            (SELECT `name` FROM course_section WHERE section_id = usr.section_id) as section_name,
+            (SELECT duration_time FROM course_section WHERE section_id = usr.section_id) as duration_time,
+            MIN(start_time) AS start_time,
+            MAX(end_time) AS end_time,
+            MAX(`status`) AS `status`,
+            any_value(ip) AS ip
+        FROM
+            user_study_record usr
+        WHERE
+            order_goods_id = #{orderGoodsId}
+        GROUP BY
+            order_goods_id,
+            goods_id,
+            course_id,
+            module_id,
+            chapter_id,
+            section_id
+    </select>
+
+    <select id="getSevenMajorNames" resultType="java.lang.String">
+        SELECT DISTINCT
+            m.category_name
+        FROM
+            course_education_type cet
+                LEFT JOIN course_project_type cpt ON cpt.education_id = cet.id
+                AND cet.tenant_id = 867735392558919680
+                LEFT JOIN major_project mp ON mp.project_id = cpt.id
+                AND mp.tenant_id = 867735392558919680
+                LEFT JOIN major m ON mp.major_id = m.id
+                AND m.tenant_id = 867735392558919680
+        WHERE
+            cet.education_name = '考前培训'
+          AND cpt.project_name = '施工现场专业人员'
+          AND cet.`status` = 1
+          AND cpt.`status` = 1
+          AND m.`status` = 1
+          AND m.tenant_id = 867735392558919680
+    </select>
+
+    <select id="getSubscribeInfo" parameterType="com.zhongzheng.modules.exam.bo.SubscribeInfoBo"
+            resultType="com.zhongzheng.modules.user.domain.UserSubscribe">
+        SELECT
+            *
+        FROM
+            user_subscribe us
+                LEFT JOIN order_goods og ON us.order_goods_id = og.order_goods_id
+                LEFT JOIN goods g ON og.goods_id = g.goods_id
+                LEFT JOIN major m ON g.major_id = m.id
+        WHERE
+            us.user_id = #{userId}
+            AND us.subscribe_status = 1
+            AND m.category_name = #{major}
+            AND us.apply_site_exam_time = #{applyTime}
+            <if test="applyStartTime != null and applyStartTime != ''">
+                AND us.apply_site_start_time = #{applyStartTime}
+            </if>
+            <if test="applyEndTime != null and applyEndTime != ''">
+                AND us.apply_site_end_time = #{applyEndTime}
+            </if>
+            LIMIT 1
+    </select>
+
+    <select id="getExamPassSub" parameterType="com.zhongzheng.modules.exam.bo.SubscribeInfoBo"
+            resultType="com.zhongzheng.modules.user.domain.UserSubscribe">
+        SELECT
+            *
+        FROM
+            user_subscribe us
+            LEFT JOIN order_goods og ON us.order_goods_id = og.order_goods_id
+            LEFT JOIN goods g ON og.goods_id = g.goods_id
+            LEFT JOIN major m ON g.major_id = m.id
+        WHERE
+            us.user_id = #{userId}
+            AND us.subscribe_status = 1
+            AND us.exam_status = 1
+            AND us.result = 1
+            AND m.category_name = #{major}
+            LIMIT 1
+    </select>
+
 </mapper>

+ 9 - 0
zhongzheng-system/src/main/resources/mapper/modules/order/OrderGoodsMapper.xml

@@ -920,4 +920,13 @@
             AND og.service_start_time <![CDATA[  <=  ]]> UNIX_TIMESTAMP()
             AND og.service_end_time <![CDATA[   >=  ]]> UNIX_TIMESTAMP()
     </select>
+
+    <select id="getByIdNoTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.order.domain.OrderGoods">
+        SELECT
+            *
+        FROM
+            order_goods
+        WHERE
+            order_goods_id = #{orderGoodsId}
+    </select>
 </mapper>

+ 19 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml

@@ -655,6 +655,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </foreach>
     </select>
 
+    <select id="getByIdNoTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.user.domain.User">
+        SELECT
+        *
+        FROM
+        `user`
+        WHERE
+        status = 1 AND user_id = #{userId}
+    </select>
+
+    <select id="getByCardNoTenant" parameterType="java.lang.String" resultType="com.zhongzheng.modules.user.domain.User">
+        SELECT
+            *
+        FROM
+            `user`
+        WHERE
+            status = 1 AND id_card = #{idCard,typeHandler=com.zhongzheng.common.type.EncryptHandler}
+            LIMIT 1
+    </select>
+
     <select id="getUserOrderCount" parameterType="map" resultType="java.lang.Long">
         SELECT
             COUNT(o.order_sn)

+ 4 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml

@@ -1988,4 +1988,8 @@
         WHERE
             o.plan_id > 0
     </select>
+
+    <select id="getStudyRecordNoTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.user.domain.UserStudyRecord">
+        SELECT * FROM user_study_record WHERE order_goods_id = #{orderGoodsId} AND current_status = 1
+    </select>
 </mapper>

+ 47 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserSubscribeMapper.xml

@@ -602,6 +602,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             u.realname AS userName,
             u.id_card AS userCard,
             u.telphone AS userPhone,
+            u.company_name AS companyName,
             g.goods_name,
             m.category_name AS majorName,
             t.tenant_name,
@@ -615,6 +616,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             us.apply_site_start_time as applyStartTime,
             us.apply_site_end_time as applyEndTime,
             us.apply_site_address as applyAddress,
+            us.certificate_start_time as certificateStartTime,
+            us.certificate_end_time as certificateEndTime,
             us.certificate_code,
         CASE
         WHEN    (
@@ -714,4 +717,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT * FROM goods_question_rel WHERE order_goods_id = #{orderGoodsId} AND `status` = 1 AND question_do_num &gt; 0 LIMIT 1
     </select>
 
+    <select id="listByTimeNoTenant" parameterType="com.zhongzheng.modules.user.bo.SubUserExportBo" resultType="com.zhongzheng.modules.user.domain.UserSubscribe">
+        SELECT * FROM user_subscribe
+        WHERE subscribe_status = 1 AND exam_status = 0
+        <if test="applyTime != null and applyTime != '' ">
+            AND apply_site_exam_time = #{applyTime}
+        </if>
+        <if test="tenantIds != null and tenantIds.size()!=0 " >
+            AND tenant_id IN
+            <foreach collection="tenantIds" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+
+    </select>
+    <update id="updateByIdNoTenant"  parameterType="com.zhongzheng.modules.user.domain.UserSubscribe">
+        UPDATE
+            user_subscribe
+        SET
+            <if test="examStatus != null and examStatus != '' ">
+                exam_status = #{examStatus},
+            </if>
+            <if test="performance != null and performance != '' ">
+                performance = #{performance},
+            </if>
+            <if test="result != null and result != '' ">
+                `result` = #{result},
+            </if>
+            <if test="certificateCode != null and certificateCode != '' ">
+                certificate_code = #{certificateCode},
+            </if>
+            <if test="certificateUrl != null and certificateUrl != '' ">
+                certificate_url = #{certificateUrl},
+            </if>
+            <if test="certificateStartTime != null and certificateStartTime != '' ">
+                certificate_start_time = #{certificateStartTime},
+            </if>
+            <if test="certificateEndTime != null and certificateEndTime != '' ">
+                certificate_end_time = #{certificateEndTime},
+            </if>
+                update_time = unix_timestamp()
+        WHERE
+            subscribe_id = #{subscribeId}
+    </update>
+
 </mapper>