he2802 3 年之前
父節點
當前提交
37c9010ff9

+ 16 - 4
zhongzheng-api/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java

@@ -12,10 +12,7 @@ import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
 import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.exam.service.IExamApplySiteService;
 import com.zhongzheng.modules.exam.vo.*;
-import com.zhongzheng.modules.user.bo.UserAppSubscribeEditBo;
-import com.zhongzheng.modules.user.bo.UserSubscribeAddBo;
-import com.zhongzheng.modules.user.bo.UserSubscribeEditBo;
-import com.zhongzheng.modules.user.bo.UserSubscribeQueryBo;
+import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.service.IUserSubscribeService;
 import com.zhongzheng.modules.user.vo.UserSubscribeVo;
@@ -25,6 +22,7 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.text.ParseException;
 import java.util.List;
@@ -125,6 +123,20 @@ public class ExamApplyController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 签署疫情防控承诺书
+     */
+    @ApiOperation("签署疫情防控承诺书")
+    @PostMapping("/signReport")
+    public  AjaxResult<Void> signReport(MultipartFile image,UserSubscribeSignReportBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        bo.setPhone(loginUser.getUser().getTelphone());
+        bo.setIdCard(loginUser.getUser().getIdCard());
+        return toAjax(iUserSubscribeService.signReport(image,bo)?1:0);
+    }
+
+
     /**
      * 修改用户预约考试
      */

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSectionWatchPerServiceImpl.java

@@ -118,6 +118,7 @@ public class CourseSectionWatchPerServiceImpl extends ServiceImpl<CourseSectionW
                 .eq(CourseSectionWatchPer::getCourseId, bo.getCourseId())
                 .eq(CourseSectionWatchPer::getGoodsId, bo.getGoodsId())
                 .eq(CourseSectionWatchPer::getSectionId, bo.getSectionId())
+                .eq(CourseSectionWatchPer::getStatus, 1)
                 .last("LIMIT 1"));
         if (ObjectUtils.isNull(watchPer) || watchPer.getWatchPer() == 1){
             //没有配观看权限或者观看权限为开通课程的学员

+ 38 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeSignReportBo.java

@@ -0,0 +1,38 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年08月25日 10:14
+ */
+@Data
+@ApiModel("用户考试预约疫情防控签署BO")
+public class UserSubscribeSignReportBo implements Serializable {
+
+    @ApiModelProperty("考试预约ID")
+    private Long subscribeId;
+
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("电话")
+    private String phone;
+
+    @ApiModelProperty("身份证")
+    private String idCard;
+
+    @ApiModelProperty("身份证")
+    private String applySiteStartTime;
+
+    @ApiModelProperty("专业")
+    private String major;
+
+    @ApiModelProperty("座位号")
+    private String seatNumber;
+
+}

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

@@ -8,6 +8,7 @@ import com.zhongzheng.modules.user.vo.UserSubscribeIdsImportCheck;
 import com.zhongzheng.modules.user.vo.UserSubscribeImport;
 import com.zhongzheng.modules.user.vo.UserSubscribeVo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.text.ParseException;
 import java.util.Collection;
@@ -80,4 +81,14 @@ public interface IUserSubscribeService extends IService<UserSubscribe> {
 	List<UserSubscribeVo> listSubscribeByUser(UserSubscribeQueryBo bo);
 
     Integer getConsoleTestSubscribeNum(ConsoleQueryBo bo);
+
+    /**
+     * 签署疫情防控承诺书
+     * @author change
+     * @date 2022/8/25 10:29
+     * @param image
+     * @param bo
+     * @return java.lang.Boolean
+     */
+	Boolean signReport(MultipartFile image, UserSubscribeSignReportBo bo);
 }

+ 30 - 11
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java

@@ -673,23 +673,42 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
                 Map<Integer, List<UserStudyRecord>> buyMap = recordList.stream().filter(x -> ObjectUtils.isNotNull(x.getBuyCourse())).collect(Collectors.groupingBy(UserStudyRecord::getBuyCourse));
                 if (CollectionUtils.isNotEmpty(buyMap)){
                     //开通课程
-                    Map<Long, List<UserStudyRecord>> records = buyMap.get(1).stream().filter(x -> ObjectUtils.isNotNull(x.getUserId())).collect(Collectors.groupingBy(UserStudyRecord::getUserId));
-                    Set<Long> buyCourseUserIds = records.keySet();
-                    item.setBuyCourseNumber(buyCourseUserIds.size());
-                    //未开通课程
-                    Map<Long, List<UserStudyRecord>> collect = buyMap.get(0).stream().filter(x -> ObjectUtils.isNotNull(x.getUserId())).collect(Collectors.groupingBy(UserStudyRecord::getUserId));
-                    List<Long> unBuyCourseUserIds = collect.keySet().stream().filter(x -> !buyCourseUserIds.contains(x)).collect(Collectors.toList());
-                    item.setUnBuyCourseNumber(CollectionUtils.isNotEmpty(unBuyCourseUserIds)?unBuyCourseUserIds.size():0);
+                    List<UserStudyRecord> records1 = buyMap.get(1);
+                    Set<Long> buyCourseUserIds = new HashSet<>();
+                    if (CollectionUtils.isNotEmpty(records1)){
+                        Map<Long, List<UserStudyRecord>> records = records1.stream().filter(x -> ObjectUtils.isNotNull(x.getUserId())).collect(Collectors.groupingBy(UserStudyRecord::getUserId));
+                         buyCourseUserIds = records.keySet();
+                        item.setBuyCourseNumber(buyCourseUserIds.size());
+                    }
 
+                    //未开通课程
+                    List<UserStudyRecord> records = buyMap.get(0);
+                    if (CollectionUtils.isNotEmpty(records)){
+                        Map<Long, List<UserStudyRecord>> collect = records.stream().filter(x -> ObjectUtils.isNotNull(x.getUserId())).collect(Collectors.groupingBy(UserStudyRecord::getUserId));
+                        List<Long> unBuyCourseUserIds = new ArrayList<>();
+                        for (Long id : collect.keySet()) {
+                            if (CollectionUtils.isNotEmpty(buyCourseUserIds) && !buyCourseUserIds.contains(id)){
+                                unBuyCourseUserIds.add(id);
+                            }
+                        }
+                        item.setUnBuyCourseNumber(CollectionUtils.isNotEmpty(unBuyCourseUserIds)?unBuyCourseUserIds.size():0);
+                    }
                 }
                 Map<String, List<UserStudyRecord>> collect = recordList.stream().filter(x -> ObjectUtils.isNotNull(x.getFromPlat())).collect(Collectors.groupingBy(UserStudyRecord::getFromPlat));
                 if (CollectionUtils.isNotEmpty(collect)) {
                     //小程序
-                    Map<Long, List<UserStudyRecord>> rListMap = collect.get("1").stream().filter(x -> ObjectUtils.isNotNull(x.getUserId())).collect(Collectors.groupingBy(UserStudyRecord::getUserId));
-                    item.setAppWatchNumber(rListMap.keySet().size());
+                    List<UserStudyRecord> records1 = collect.get("1");
+                    if (CollectionUtils.isNotEmpty(records1)){
+                        Map<Long, List<UserStudyRecord>> rListMap = records1.stream().filter(x -> ObjectUtils.isNotNull(x.getUserId())).collect(Collectors.groupingBy(UserStudyRecord::getUserId));
+                        item.setAppWatchNumber(rListMap.keySet().size());
+                    }
                     //PC
-                    Map<Long, List<UserStudyRecord>> records = collect.get("2").stream().filter(x -> ObjectUtils.isNotNull(x.getUserId())).collect(Collectors.groupingBy(UserStudyRecord::getUserId));
-                    item.setAdminWatchNumber(records.keySet().size());
+                    List<UserStudyRecord> records2 = collect.get("2");
+                    if (CollectionUtils.isNotEmpty(records2)){
+                        Map<Long, List<UserStudyRecord>> records = records2.stream().filter(x -> ObjectUtils.isNotNull(x.getUserId())).collect(Collectors.groupingBy(UserStudyRecord::getUserId));
+                        item.setAdminWatchNumber(records.keySet().size());
+                    }
+
                 }
             }
         });

+ 101 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java

@@ -8,16 +8,23 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
 import com.zhongzheng.common.annotation.DataScope;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
+import com.zhongzheng.modules.course.domain.Major;
 import com.zhongzheng.modules.course.mapper.CourseMapper;
 import com.zhongzheng.modules.course.service.ICourseService;
+import com.zhongzheng.modules.course.service.IMajorService;
 import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
 import com.zhongzheng.modules.exam.bo.ExamApplySiteTimeJson;
 import com.zhongzheng.modules.exam.mapper.ExamApplyMapper;
@@ -25,6 +32,7 @@ import com.zhongzheng.modules.exam.vo.ExamApplySiteTimeVo;
 import com.zhongzheng.modules.exam.vo.ExamApplySiteVo;
 import com.zhongzheng.modules.exam.vo.ExamApplyVo;
 import com.zhongzheng.modules.exam.vo.ExamUserApplyVo;
+import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.grade.vo.ClassGradeVo;
@@ -39,6 +47,7 @@ import com.zhongzheng.modules.user.domain.UserExamGoods;
 import com.zhongzheng.modules.user.service.IUserExamGoodsService;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.vo.*;
+import org.apache.poi.hpsf.Thumbnail;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -50,11 +59,18 @@ import com.zhongzheng.modules.user.domain.UserSubscribe;
 import com.zhongzheng.modules.user.mapper.UserSubscribeMapper;
 import com.zhongzheng.modules.user.service.IUserSubscribeService;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 import org.thymeleaf.util.StringUtils;
 
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.URL;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -91,6 +107,9 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     @Autowired
     private IUserService iUserService;
 
+    @Autowired
+    private IMajorService majorService;
+
     @Value("${aliyun.sms.cancellationReminder}")
     private String cancellationReminder;
 
@@ -103,6 +122,12 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     @Value("${aliyun.sms.newExamFail}")
     private String newExamFail;
 
+    @Value("${aliyun.oss.endpoint}")
+    private String ALIYUN_OSS_ENDPOINT;
+
+    @Autowired
+    private OssService ossService;
+
 
 
     @Autowired
@@ -1597,4 +1622,80 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     public Integer getConsoleTestSubscribeNum(ConsoleQueryBo bo) {
         return baseMapper.getConsoleTestSubscribeNum(bo);
     }
+
+    @Override
+    public Boolean signReport(MultipartFile image, UserSubscribeSignReportBo bo) {
+        //获取考试预约信息
+        UserSubscribe userSubscribe = getById(bo.getSubscribeId());
+        if (ObjectUtils.isNull(userSubscribe)){
+            throw new CustomException("预约考试信息获取失败");
+        }
+        //获取考试专业
+        Goods goods = iGoodsService.getById(userSubscribe.getGoodsId());
+        Major major = majorService.getById(goods.getMajorId());
+        bo.setMajor(major.getCategoryName());
+        String applyDate = DateUtils.timestampToDateFormat(Long.valueOf(userSubscribe.getApplySiteExamTime()), "yyyy-MM-dd");
+        bo.setApplySiteStartTime(String.format("%s %s",applyDate,userSubscribe.getApplySiteStartTime()));
+        bo.setSeatNumber(userSubscribe.getSeatNumber());
+        //获取承诺书模板
+        String reportUrl = drawReport(image, bo);
+        userSubscribe.setReportStatus(1);//已签署
+        userSubscribe.setReportFile(reportUrl);
+        updateById(userSubscribe);
+        return true;
+    }
+
+    private String drawReport(MultipartFile image, UserSubscribeSignReportBo bo){
+        Font font = new Font("宋体", Font.BOLD, 48);// 添加字体的属性设置 微软雅黑
+        String imgName = null;
+        try {
+            // 获取模板
+            String imageUrl = ALIYUN_OSS_ENDPOINT+"/oss/images/file/20220825/1661411743620.png";
+            URL url = new URL(imageUrl);
+            BufferedImage imageLocal = ImageIO.read(url);
+            // 以本地图片为模板
+            Graphics2D g = imageLocal.createGraphics();
+            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
+            // 设置文本样式
+            g.setFont(font);
+            g.setColor(Color.BLACK);
+
+            g.drawString(bo.getApplySiteStartTime(), 668, 3341);
+            g.drawString(bo.getMajor(), 673, 3464);
+            g.drawString(bo.getSeatNumber(), 615, 3603);
+            g.drawString(bo.getIdCard(), 730, 3732);
+            g.drawString(bo.getPhone(), 678, 3864);
+            g.drawString(DateUtils.getDate(), 682, 3988);
+
+            //用户签名
+            ByteArrayInputStream inputStream = new ByteArrayInputStream(image.getBytes());
+            BufferedImage qrImage = ImageIO.read(inputStream);
+            Image scaledInstance = qrImage.getScaledInstance(304, 251, Image.SCALE_AREA_AVERAGING);
+//
+            // 在模板上添加用户签名图片(地址,左边距,上边距,图片宽度,图片高度,未知)
+            g.drawImage(scaledInstance, 636, 4169, 304, 251, null);
+            // 完成模板修改
+            g.dispose();
+            //上传OSS
+            InputStream is =  bufferedImageToInputStream(imageLocal);
+            String ossPath = ossService.uploadInputStream(is,7);
+            return ossPath;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return imgName;
+    }
+
+    private InputStream bufferedImageToInputStream(BufferedImage image){
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        try {
+            ImageIO.write(image, "jpg", os);
+            InputStream input = new ByteArrayInputStream(os.toByteArray());
+            return input;
+        } catch (IOException e) {
+
+        }
+        return null;
+    }
+
 }

+ 4 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserVisitLogServiceImpl.java

@@ -3,6 +3,8 @@ package com.zhongzheng.modules.user.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
@@ -43,10 +45,10 @@ public class UserVisitLogServiceImpl extends ServiceImpl<UserVisitLogMapper, Use
     @Override
     public List<UserVisitLogVo> queryList(UserVisitLogQueryBo bo) {
         LambdaQueryWrapper<UserVisitLog> lqw = Wrappers.lambdaQuery();
-        lqw.eq(bo.getUserId() != null, UserVisitLog::getUserId, bo.getUserId());
+        lqw.eq(ObjectUtils.isNotNull(bo.getUserId()), UserVisitLog::getUserId, bo.getUserId());
         lqw.eq(StrUtil.isNotBlank(bo.getFromPlat()), UserVisitLog::getFromPlat, bo.getFromPlat());
         lqw.eq(StrUtil.isNotBlank(bo.getIp()), UserVisitLog::getIp, bo.getIp());
-        lqw.between(bo.getStartTime() != null,UserVisitLog::getCreateTime,bo.getStartTime(),bo.getEndTime());
+        lqw.between(StringUtils.isNotBlank(bo.getStartTime()),UserVisitLog::getCreateTime,bo.getStartTime(),bo.getEndTime());
         return entity2Vo(this.list(lqw));
     }