he2802 3 سال پیش
والد
کامیت
ee85828b56
32فایلهای تغییر یافته به همراه320 افزوده شده و 23 حذف شده
  1. 0 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseModuleController.java
  2. 2 0
      zhongzheng-admin/src/main/resources/application-dev.yml
  3. 2 0
      zhongzheng-admin/src/main/resources/application-pre.yml
  4. 2 0
      zhongzheng-admin/src/main/resources/application-prod.yml
  5. 54 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/wx/WxLoginController.java
  6. 2 0
      zhongzheng-api/src/main/resources/application-dev.yml
  7. 2 0
      zhongzheng-api/src/main/resources/application-pre.yml
  8. 2 0
      zhongzheng-api/src/main/resources/application-prod.yml
  9. 12 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  10. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  11. 70 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java
  12. 10 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseChapterSectionServiceImpl.java
  13. 10 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseMenuServiceImpl.java
  14. 9 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseChapterSectionVo.java
  15. 11 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseMenuVo.java
  16. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsQueryBo.java
  17. 50 12
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  18. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java
  19. 16 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
  20. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentVo.java
  21. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/service/impl/MockApplyServiceImpl.java
  22. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/vo/MockMajorSubjectVo.java
  23. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderInputAddBo.java
  24. 3 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderInputEditBo.java
  25. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderInputQueryBo.java
  26. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderUserCheckBuyBo.java
  27. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderInput.java
  28. 9 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  29. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderInputVo.java
  30. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/bo/WxLoginBody.java
  31. 10 0
      zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml
  32. 2 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderInputMapper.xml

+ 0 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseModuleController.java

@@ -156,7 +156,6 @@ public class CourseModuleController extends BaseController {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         String operName = loginUser.getUsername();
         Map<String,Object> message = iCourseSectionService.importChapterSection(sectionList, businessList, operName);
-
         return AjaxResult.success(message);
     }
 }

+ 2 - 0
zhongzheng-admin/src/main/resources/application-dev.yml

@@ -109,6 +109,8 @@ wx:
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         appsecret: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         notifyUrl: http://42.192.164.187:19005/wx/pay/callback
+    scanLogin:
+        host: https://testm.xyyxt.net/
 
 certificate:
     host: http://192.168.1.38:8000/

+ 2 - 0
zhongzheng-admin/src/main/resources/application-pre.yml

@@ -109,6 +109,8 @@ wx:
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         appsecret: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         notifyUrl: http://120.79.166.78:19009/wx/pay/callback
+    scanLogin:
+        host: https://web.xyyxt.net/
 
 
 certificate:

+ 2 - 0
zhongzheng-admin/src/main/resources/application-prod.yml

@@ -109,6 +109,8 @@ wx:
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         appsecret: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         notifyUrl: https://api.xyyxt.net/wx/pay/callback
+    scanLogin:
+        host: https://m.xyyxt.net/
 
 certificate:
     host: https://m.xyyxt.net/

+ 54 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/wx/WxLoginController.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.controller.wx;
 
+import cn.hutool.core.lang.Validator;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.AjaxResult;
@@ -7,6 +8,7 @@ import com.zhongzheng.common.core.domain.entity.SysMenu;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.model.LoginBody;
 import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.*;
 import com.zhongzheng.modules.system.service.ISysMenuService;
@@ -23,6 +25,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 @Api(tags ="微信登录用户操作管理")
 @ApiSupport(order = 2)
@@ -37,6 +40,8 @@ public class WxLoginController
 
     @Autowired
     private  IUserService iUserService;
+    @Autowired
+    private  RedisCache redisCache;
 
     /**
      * 登录方法
@@ -75,6 +80,55 @@ public class WxLoginController
         return AjaxResult.success(openId);
     }
 
+    @ApiOperation("小程序校验PC登录二维码")
+    @PostMapping("/scan_login_check")
+    public AjaxResult scanLoginCheck(@RequestBody WxLoginBody loginBody)
+    {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        String scanCode = loginBody.getScanCode();
+        String key = "SCAN_LOGIN_"+scanCode;
+        Long userId = redisCache.getCacheObject(key);
+        if(Validator.isNotEmpty(userId)&&userId.equals(-2L)){
+            redisCache.setCacheObject(key, loginUser.getUser().getUserId(),60, TimeUnit.SECONDS);//60秒锁定
+            return AjaxResult.success();
+        }else{
+            return AjaxResult.error("校验码不存在或已过期");
+        }
+    }
+
+    @ApiOperation("PC获取登录二维码地址")
+    @GetMapping("/pc_login_url")
+    public AjaxResult pcLoginUrl()
+    {
+        Map<String,Object> map = wxLoginService.pcLoginUrl();
+        return AjaxResult.success(map);
+    }
+
+    @ApiOperation("小程序已扫码")
+    @GetMapping("/scan_code")
+    public AjaxResult scanCode(WxLoginBody loginBody)
+    {
+        String scanCode = loginBody.getScanCode();
+        String key = "SCAN_LOGIN_"+scanCode;
+        Long userId = redisCache.getCacheObject(key);
+        if(Validator.isEmpty(userId)){
+            return AjaxResult.error("标识码不存在");
+        }else{
+            redisCache.setCacheObject(key, -2L,180, TimeUnit.SECONDS);//延长180秒锁定
+            return AjaxResult.success();
+        }
+    }
+
+    @ApiOperation("PC检查小程序是否扫码登录")
+    @GetMapping("/check_pc_login")
+    public AjaxResult checkPcLogin(WxLoginBody loginBody)
+    {
+        String scanCode = loginBody.getScanCode();
+        Map<String,Object> map = wxLoginService.checkPcLogin(scanCode);
+        return AjaxResult.success(map);
+    }
+
+
     /**
      * 公众号登录方法
      *

+ 2 - 0
zhongzheng-api/src/main/resources/application-dev.yml

@@ -109,6 +109,8 @@ wx:
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         appsecret: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         notifyUrl: http://42.192.164.187:19005/wx/pay/callback
+    scanLogin:
+        host: https://testm.xyyxt.net/
 
 certificate:
     host: http://192.168.1.38:8000/

+ 2 - 0
zhongzheng-api/src/main/resources/application-pre.yml

@@ -109,6 +109,8 @@ wx:
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         appsecret: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         notifyUrl: http://120.79.166.78:19009/wx/pay/callback
+    scanLogin:
+        host: https://web.xyyxt.net/
 
 certificate:
     host: http://192.168.1.38:8000/

+ 2 - 0
zhongzheng-api/src/main/resources/application-prod.yml

@@ -121,6 +121,8 @@ wx:
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         appsecret: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
         notifyUrl: https://api.xyyxt.net/wx/pay/callback
+    scanLogin:
+        host: https://m.xyyxt.net/
 
 certificate:
     host: https://m.xyyxt.net/

+ 12 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java

@@ -139,4 +139,16 @@ public class ToolsUtils {
         }
     }
 
+    public static String getCharAndNumr(int length) {
+        Random random = new Random();
+        StringBuffer valSb = new StringBuffer();
+        String charStr = "0123456789abcdefghijklmnopqrstuvwxyz";
+        int charLength = charStr.length();
+        for (int i = 0; i < length; i++) {
+            int index = random.nextInt(charLength);
+            valSb.append(charStr.charAt(index));
+        }
+        return valSb.toString();
+    }
+
 }

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

@@ -110,7 +110,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 过滤请求
                 .authorizeRequests()
                 // 对于登录login 验证码captchaImage 允许匿名访问
-                .antMatchers("/login", "/captchaImage", "/testLogin","/wx/pay/callback","/gzh_login").anonymous()
+                .antMatchers("/login", "/captchaImage", "/testLogin","/wx/pay/callback","/gzh_login","/check_pc_login","/pc_login_url","/scan_code").anonymous()
                 .antMatchers("/aliyun/oss/callback").anonymous()
                 .antMatchers(
                         HttpMethod.GET,

+ 70 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java

@@ -6,13 +6,20 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.WriterException;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
 import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 
 import com.zhongzheng.common.utils.*;
 import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;
+import com.zhongzheng.modules.course.domain.CourseMenu;
 import com.zhongzheng.modules.course.mapper.CourseSectionMapper;
 import com.zhongzheng.modules.user.bo.UserAddBo;
 import com.zhongzheng.modules.user.domain.User;
@@ -31,8 +38,11 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 登录校验方法
@@ -59,6 +69,9 @@ public class WxLoginService
     @Value("${wx.gzh.appid}")
     private String gzh_appid;
 
+    @Value("${wx.scanLogin.host}")
+    private String scanLoginHost;
+
     @Value("${wx.gzh.appsecret}")
     private String gzh_appsrcret;
 
@@ -79,6 +92,9 @@ public class WxLoginService
     @Autowired
     private IAliSmsService iSmsService;
 
+    @Autowired
+    private RedisCache redisCache;
+
     @Autowired
     private UserSchoolInfoMapper userSchoolInfoMapper;
 
@@ -94,6 +110,60 @@ public class WxLoginService
         return map;
     }
 
+    public Map<String,Object> pcLoginUrl(){
+        String scanCode = ToolsUtils.getCharAndNumr(6);
+        String key = "SCAN_LOGIN_"+scanCode;
+        String code_url = scanLoginHost+"pc/login/"+scanCode;
+        String urlBase64 = null;
+        try {
+            QRCodeWriter qrCodeWriter = new QRCodeWriter();
+            BitMatrix bitMatrix = qrCodeWriter.encode(code_url, BarcodeFormat.QR_CODE, 120, 120);
+            // 写到输出流
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            MatrixToImageWriter.writeToStream(bitMatrix, "jpg", outputStream);
+            //转换为base64
+            java.util.Base64.Encoder encoder1 = java.util.Base64.getEncoder();
+            urlBase64 = "data:image/jpeg;base64,"
+                    + encoder1.encodeToString(outputStream.toByteArray());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        redisCache.setCacheObject(key, -1L,60, TimeUnit.SECONDS);//60秒锁定
+        Map<String,Object> map = new HashMap<>();
+        map.put("scanCode",scanCode);
+        map.put("urlBase64",urlBase64);
+        return  map;
+    }
+
+    /**
+     * PC检查是否小程序登录成功
+     * @param scanCode
+     * @return
+     */
+    public Map<String,Object> checkPcLogin(String scanCode) {
+        String key = "SCAN_LOGIN_"+scanCode;
+        Long userId = redisCache.getCacheObject(key);
+        if(Validator.isNotEmpty(userId)&&userId.equals(-2L)){
+            throw new CustomException("小程序已扫码");
+        }
+        else if(Validator.isNotEmpty(userId)&&userId.longValue()>0L){
+            User user = iUserService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserId, userId).last("limit 1"));
+            if(Validator.isEmpty(user)){
+                throw new CustomException("暂未登录");
+            }
+            ClientLoginUser loginUser = new ClientLoginUser();
+            loginUser.setUser(user);
+            Map<String,Object> map = new HashMap<>();
+            map.put(Constants.TOKEN,wxTokenService.createToken(loginUser));
+            map.put("user_account",loginUser.getUser().getUserAccount());
+            map.put("full_info",Validator.isEmpty(user.getIdCard())?false:true); //是否完善身份信息
+            return map;
+        }
+        else{
+            throw new CustomException("暂未登录");
+        }
+    }
+
     @Transactional(rollbackFor = Exception.class)
     public Map<String,Object> login(WxLoginBody loginBody) {
         User user = getWxUnionIdUser(loginBody);

+ 10 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseChapterSectionServiceImpl.java

@@ -49,7 +49,16 @@ public class CourseChapterSectionServiceImpl extends ServiceImpl<CourseChapterSe
 
     @Override
     public List<CourseChapterSectionVo> getListById(Long id) {
-        return courseChapterSectionMapper.getListById(id);
+        List<CourseChapterSectionVo> list = courseChapterSectionMapper.getListById(id);
+        list.forEach(courseChapterSectionVo -> {
+            if (Validator.isNotNull(courseChapterSectionVo.getDurationTime())) {
+                //设置节时长(分钟)
+                courseChapterSectionVo.setDurationMinTime(Math.ceil(courseChapterSectionVo.getDurationTime()/60.0));
+                //设置学时
+                courseChapterSectionVo.setClassHours(Double.valueOf(String.format("%.2f", courseChapterSectionVo.getDurationMinTime()/45.0)));
+            }
+        });
+        return list;
     }
 
     @Override

+ 10 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseMenuServiceImpl.java

@@ -69,7 +69,16 @@ public class CourseMenuServiceImpl extends ServiceImpl<CourseMenuMapper, CourseM
 
     @Override
     public List<CourseMenuVo> selectList(CourseMenuQueryBo bo) {
-        return courseMenuMapper.getList(bo);
+        List<CourseMenuVo> list = courseMenuMapper.getList(bo);
+        list.forEach(courseMenuVo -> {
+            if (Validator.isNotNull(courseMenuVo.getDurationTime())) {
+                //设置节时长(分钟)
+                courseMenuVo.setDurationMinTime(Math.ceil(courseMenuVo.getDurationTime()/60.0));
+                //设置学时
+                courseMenuVo.setClassHours(Double.valueOf(String.format("%.2f", courseMenuVo.getDurationMinTime()/45.0)));
+            }
+        });
+        return list;
     }
 
     @Override

+ 9 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseChapterSectionVo.java

@@ -61,10 +61,18 @@ public class CourseChapterSectionVo {
 	@Excel(name = "排序")
 	@ApiModelProperty("$column.columnComment")
 	private Long sort;
+	/** 节时长(秒) */
+	@Excel(name = "节时长(秒)")
+	@ApiModelProperty("节时长(秒)")
+	private Long durationTime;
 	/** 节时长(分钟) */
 	@Excel(name = "节时长(分钟)")
 	@ApiModelProperty("节时长(分钟)")
-	private Long durationTime;
+	private Double durationMinTime;
+	/** 学时 */
+	@Excel(name = "学时")
+	@ApiModelProperty("学时")
+	private Double classHours;
 
 	/** 1模块卷 2章卷 3试卷 */
 	@Excel(name = "1模块卷 2章卷 3试卷")

+ 11 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseMenuVo.java

@@ -5,6 +5,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -46,10 +48,18 @@ public class CourseMenuVo {
 	private Integer status;
 	@ApiModelProperty("目录名称")
 	private String menuName;
+	/** 节时长(秒) */
+	@Excel(name = "节时长(秒)")
+	@ApiModelProperty("节时长(秒)")
+	private Long durationTime;
 	/** 节时长(分钟) */
 	@Excel(name = "节时长(分钟)")
 	@ApiModelProperty("节时长(分钟)")
-	private Long durationTime;
+	private Double durationMinTime;
+	/** 学时 */
+	@Excel(name = "学时")
+	@ApiModelProperty("学时")
+	private Double classHours;
 	private Integer sort;
 
 	@ApiModelProperty("录播和回放的url地址")

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsQueryBo.java

@@ -11,6 +11,7 @@ import java.util.Map;
 import java.util.HashMap;
 
 import java.math.BigDecimal;
+
 import com.zhongzheng.common.core.domain.BaseEntity;
 
 /**
@@ -188,5 +189,9 @@ GoodsQueryBo extends BaseEntity {
 	private Long certificateTpId;
 	@ApiModelProperty("是否返回商品购买用户数量 1带 0不带")
 	private Long getUserNum;
+    @ApiModelProperty("获取章数量 1")
+    private Long chapterNum;
+
+
 
 }

+ 50 - 12
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -5,29 +5,23 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.zhongzheng.common.annotation.DataScope;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
-import com.zhongzheng.modules.course.bo.CourseChapterSectionListAddBo;
 import com.zhongzheng.modules.course.bo.CourseMenuListAddBo;
 import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
-import com.zhongzheng.modules.course.domain.CourseChapterSection;
-import com.zhongzheng.modules.course.mapper.CourseChapterMapper;
 import com.zhongzheng.modules.course.mapper.CourseMapper;
+import com.zhongzheng.modules.course.service.ICourseChapterSectionService;
 import com.zhongzheng.modules.course.service.ICourseMenuService;
-import com.zhongzheng.modules.course.service.ICourseService;
-import com.zhongzheng.modules.course.vo.CourseMenuVo;
-import com.zhongzheng.modules.course.vo.CourseModuleFreeExamVo;
-import com.zhongzheng.modules.course.vo.CourseVo;
+import com.zhongzheng.modules.course.service.ICourseModuleChapterService;
+import com.zhongzheng.modules.course.vo.*;
 import com.zhongzheng.modules.exam.bo.ExamNumberGoodsQueryBo;
 import com.zhongzheng.modules.exam.vo.ExamNumberGoodsVo;
 import com.zhongzheng.modules.goods.bo.*;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.domain.GoodsAttached;
-import com.zhongzheng.modules.goods.domain.GoodsAuditionConfig;
 import com.zhongzheng.modules.goods.domain.GoodsCourse;
 import com.zhongzheng.modules.goods.mapper.GoodsMapper;
 import com.zhongzheng.modules.goods.service.IGoodsAttachedService;
@@ -36,11 +30,8 @@ import com.zhongzheng.modules.goods.service.IGoodsCourseService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.*;
 import com.zhongzheng.modules.grade.vo.ClassGradeVo;
-import com.zhongzheng.modules.order.bo.OrderGoodsQueryBo;
 import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
-import com.zhongzheng.modules.order.vo.OrderGoodsVo;
-import com.zhongzheng.modules.user.domain.UserBankRecord;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -49,9 +40,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.Page;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
+import static java.math.RoundingMode.HALF_UP;
+
 /**
  * 商品Service业务层处理
  *
@@ -82,6 +77,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     @Autowired
     private ICourseMenuService iCourseMenuService;
 
+    @Autowired
+    private ICourseChapterSectionService iCourseChapterSectionService;
+
+    @Autowired
+    private ICourseModuleChapterService iCourseModuleChapterService;
+
     @Override
     public GoodsVo queryById(Long goodsId){
         Goods db = this.baseMapper.selectById(goodsId);
@@ -118,6 +119,43 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
                 vo.setTotalExamNum(totalNum);
             }
         }
+        //继教二建统计学时
+        if (Validator.isNotEmpty(bo.getChapterNum())) {
+            list.forEach(goodsVo -> {
+                AtomicReference<Double> classHours = new AtomicReference<>(0.0);
+                //查询课程列表
+                List<CourseVo> courseVoList = iGoodsCourseService.selectList(goodsVo.getGoodsId());
+                if (courseVoList != null && courseVoList.size() > 0) {
+                    courseVoList.forEach(courseVo -> {
+                        //获取模块信息
+                        CourseMenuQueryBo bo1 = new CourseMenuQueryBo();
+                        bo1.setCourseId(courseVo.getCourseId());
+                        List<CourseMenuVo> courseMenuVoList = iCourseMenuService.selectList(bo1);
+                        if (courseMenuVoList != null && courseMenuVoList.size() > 0) {
+                            courseMenuVoList.forEach(courseMenuVo -> {
+                                classHours.updateAndGet(v -> v + Math.round(courseMenuVo.getClassHours()));
+                                //获取章信息
+                                List<CourseModuleChapterVo> courseModuleChapterVoList = iCourseModuleChapterService.getListById(courseMenuVo.getMenuId());
+                                AtomicReference<Double> chapterHours = new AtomicReference<>(0.0);
+                                if (courseModuleChapterVoList != null && courseModuleChapterVoList.size() > 0) {
+                                    courseModuleChapterVoList.forEach(courseModuleChapterVo -> {
+                                        //获取节信息
+                                        List<CourseChapterSectionVo> courseChapterSectionVoList = iCourseChapterSectionService.getListById(courseModuleChapterVo.getChapterId());
+                                        if (courseChapterSectionVoList != null && courseChapterSectionVoList.size() > 0) {
+                                            courseChapterSectionVoList.forEach(courseChapterSectionVo -> {
+                                                chapterHours.updateAndGet(v -> v + courseChapterSectionVo.getClassHours());
+                                            });
+                                        }
+                                    });
+                                }
+                                classHours.updateAndGet(v -> v + Math.round(chapterHours.get()));
+                            });
+                        }
+                    });
+                }
+                goodsVo.setClassHours((new BigDecimal(String.valueOf(classHours))).setScale(0,HALF_UP));
+            });
+        }
         return list;
     }
 

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java

@@ -239,6 +239,9 @@ public class GoodsVo {
 	@ApiModelProperty("课程数量")
 	private Long courseNum;
 
+	@ApiModelProperty("章数量")
+	private Long chapterNum;
+
 	@ApiModelProperty("节数量")
 	private Long sectionNum;
 

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

@@ -114,6 +114,9 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
     @Autowired
     private IUserStudyRecordPhotoService userStudyRecordPhotoService;
 
+    @Autowired
+    private IUserStudyRecordPhotoService iUserStudyRecordPhotoService;
+
     @Autowired
     private OssService ossService;
 
@@ -1070,6 +1073,19 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
                     }
                 }
             }
+
+            //查询学员最近人脸照
+            LambdaQueryWrapper<UserStudyRecordPhoto> lqw = Wrappers.lambdaQuery();
+            lqw.eq(UserStudyRecordPhoto::getUserId, classPeriodStudentVo.getUserId());
+            lqw.orderByDesc(UserStudyRecordPhoto::getCreateTime);
+            List<UserStudyRecordPhoto> userStudyRecordPhotoList = iUserStudyRecordPhotoService.list(lqw);
+            List<String> recenPhotosList = new ArrayList<>();
+            userStudyRecordPhotoList.forEach(userStudyRecordPhoto -> {
+                if (Validator.isNotNull(userStudyRecordPhoto.getPhoto())) {
+                    recenPhotosList.add(userStudyRecordPhoto.getPhoto());
+                }
+            });
+            classPeriodStudentVo.setRecenPhotosList(recenPhotosList);
         }
         return classPeriodStudentVos;
     }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentVo.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 
 /**
@@ -198,4 +199,6 @@ public class ClassPeriodStudentVo {
 
 	private String oneInchPhotosOss;
 
+	private List<String> recenPhotosList;
+
 }

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/service/impl/MockApplyServiceImpl.java

@@ -527,7 +527,8 @@ public class MockApplyServiceImpl extends ServiceImpl<MockApplyMapper, MockApply
                         playBackList.add(mockApplyVo);
                     }
                     if (System.currentTimeMillis() / 1000 > mockApplyVo.getLiveEndTime() && mockApplyVo.getSectionType() != 3) {
-                        mockApplyVo.setLiveStatus(3);
+                        mockApplyVo.setLiveStatus(2);
+                        mockApplyVo.setWaitStatus(1);
                         overList.add(mockApplyVo);
                     }
                 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/vo/MockMajorSubjectVo.java

@@ -89,6 +89,11 @@ public class MockMajorSubjectVo {
 	@ApiModelProperty("封面地址")
 	private String coverUrl;
 
+	/** 暂未生成回放 1未生成*/
+	@Excel(name = "暂未生成回放 1未生成")
+	@ApiModelProperty("暂未生成回放 1未生成")
+	private Integer waitStatus;
+
 	/** 模考专业科目绑定时间集合 */
 	@Excel(name = "模考专业科目绑定时间集合")
 	@ApiModelProperty("模考专业科目绑定时间集合")

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderInputAddBo.java

@@ -45,4 +45,7 @@ public class OrderInputAddBo {
     /** 项目ID */
     @ApiModelProperty("项目ID")
     private Long projectId;
+    /** 旧业务系统订单号 */
+    @ApiModelProperty("旧业务系统订单号")
+    private String oldOrderSn;
 }

+ 3 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderInputEditBo.java

@@ -52,5 +52,7 @@ public class OrderInputEditBo {
     /** 项目ID */
     @ApiModelProperty("项目ID")
     private Long projectId;
-
+    /** 旧业务系统订单号 */
+    @ApiModelProperty("旧业务系统订单号")
+    private String oldOrderSn;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderInputQueryBo.java

@@ -67,4 +67,7 @@ public class OrderInputQueryBo extends BaseEntity {
 	private Long userId;
 	@ApiModelProperty("商品类型 1视频2题库 3面授 4服务 5组合")
 	private Integer goodsType;
+	/** 旧业务系统订单号 */
+	@ApiModelProperty("旧业务系统订单号")
+	private String oldOrderSn;
 }

+ 9 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderUserCheckBuyBo.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.order.bo;
 
+import com.zhongzheng.common.annotation.Excel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -32,4 +33,12 @@ public class OrderUserCheckBuyBo {
     private String msg;
     @ApiModelProperty("是否购买过")
     private Boolean buy;
+    /** 服务有效期开始 */
+    @Excel(name = "服务有效期开始")
+    @ApiModelProperty("服务有效期开始")
+    private Long serviceStartTime;
+    /** 服务有效期结束 */
+    @Excel(name = "服务有效期结束")
+    @ApiModelProperty("服务有效期结束")
+    private Long serviceEndTime;
 }

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

@@ -46,4 +46,6 @@ private static final long serialVersionUID=1L;
     private Long businessId;
     /** 项目ID */
     private Long projectId;
+    /** 旧业务系统订单号 */
+    private String oldOrderSn;
 }

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

@@ -259,6 +259,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             if(Validator.isNotEmpty(list1)&&list1.size()>0){
                 bo.setBuy(true);
             }
+            for(OrderGoodsVo vo : list1){
+                bo.setServiceEndTime(vo.getServiceEndTime());
+                bo.setServiceStartTime(vo.getServiceStartTime());
+            }
 /*            for(OrderGoodsVo goodsVo : list1){
 
                 if (goods.getGoodsType() == 6) {
@@ -643,7 +647,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         }
 
         add.setOrderSn(out_trade_no);
-        add.setOrderFrom(Order.FROM_INPUT);
+        if(Validator.isNotEmpty(bo.getOrderFrom())){
+            add.setOrderFrom(bo.getOrderFrom());
+        }else{
+            add.setOrderFrom(Order.FROM_INPUT);
+        }
         add.setPayPrice(payPrice);//需要支付价格
         add.setOrderPrice(totalPrice);//标准价格
         //有已收费的商品,修改订单支付状态

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderInputVo.java

@@ -105,4 +105,8 @@ public class OrderInputVo {
 	private Integer goodsType;
 	@ApiModelProperty("商品成交价格")
 	private BigDecimal goodsRealPrice;
+	/** 旧业务系统订单号 */
+	@Excel(name = "旧业务系统订单号")
+	@ApiModelProperty("旧业务系统订单号")
+	private String oldOrderSn;
 }

+ 2 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/bo/WxLoginBody.java

@@ -28,7 +28,6 @@ public class WxLoginBody {
 
     /** code */
     @ApiModelProperty("code")
-    @NotBlank(message = "code不能为空")
     private String code;
 
     /** encryptedData */
@@ -38,7 +37,8 @@ public class WxLoginBody {
     @ApiModelProperty("邀请码")
     private String inviteCode;
 
-
+    @ApiModelProperty("扫码标识码")
+    private String scanCode;
 
 
 }

+ 10 - 0
zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml

@@ -124,6 +124,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="certificateTpId" column="certificate_tp_id"/>
         <result property="subjectNames" column="subject_names"/>
         <result property="buyUserNum" column="buy_user_num"/>
+        <result property="chapterNum" column="chapter_num"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.exam.vo.ExamNumberGoodsVo" id="ExamNumberGoodsVoResult">
@@ -157,6 +158,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="sectionNum ==1">
         ,(SELECT COUNT(m.id)+(SELECT COUNT(n.id) FROM course_chapter_section n LEFT JOIN course_module_chapter p on n.chapter_id = p.chapter_id LEFT JOIN course_menu m on m.menu_id = p.module_id LEFT JOIN goods_course gc on gc.course_id = m.course_id  where gc.goods_id =  g.goods_id and m.type in(1))+(SELECT COUNT(n.id) FROM course_chapter_section n  LEFT JOIN course_menu m on m.menu_id = n.chapter_id LEFT JOIN goods_course gc on gc.course_id = m.course_id where gc.goods_id =  g.goods_id and m.type in(2)) FROM course_menu m LEFT JOIN goods_course gc on gc.course_id = m.course_id  where gc.goods_id =  g.goods_id  and m.type in(3)) as section_num
         </if>
+        <if test="chapterNum ==1">
+        ,(SELECT COUNT(m.id)+(SELECT COUNT(p.id) FROM course_module_chapter p LEFT JOIN course_menu m on m.menu_id = p.module_id LEFT JOIN goods_course gc on gc.course_id = m.course_id  where gc.goods_id =  g.goods_id and m.type in(1))+(SELECT COUNT(cmc.id) FROM course_module_chapter cmc  LEFT JOIN course_menu m on m.menu_id = cmc.module_id LEFT JOIN goods_course gc on gc.course_id = m.course_id where gc.goods_id =  g.goods_id and m.type in(2)) FROM course_menu m LEFT JOIN goods_course gc on gc.course_id = m.course_id  where gc.goods_id =  g.goods_id  and m.type in(3)) as chapter_num
+        </if>
         <if test="goodsType ==1">
         , (SELECT count(*) FROM goods_course where goods_id =g.goods_id ) as course_num
         , (SELECT count(*) FROM class_grade cg  LEFT JOIN class_grade_goods cgg on cg.grade_id = cgg.grade_id where  cgg.goods_id = g.goods_id and cg.`status` = 1 ) as grade_num
@@ -237,6 +241,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="businessId != null and businessId != ''">
             AND g.business_id = #{businessId}
         </if>
+        <if test="projectId != null and projectId != ''">
+            AND g.project_id = #{projectId}
+        </if>
         <if test="schoolId != null and schoolId != ''">
             AND g.school_id = #{schoolId}
         </if>
@@ -348,6 +355,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="businessId != null and businessId != ''">
             AND g.business_id = #{businessId}
         </if>
+        <if test="projectId != null and projectId != ''">
+            AND g.project_id = #{projectId}
+        </if>
         <if test="schoolId != null and schoolId != ''">
             AND g.school_id = #{schoolId}
         </if>

+ 2 - 0
zhongzheng-system/src/main/resources/mapper/modules/order/OrderInputMapper.xml

@@ -15,6 +15,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="educationTypeId" column="education_type_id"/>
         <result property="businessId" column="business_id"/>
         <result property="projectId" column="project_id"/>
+        <result property="oldOrderSn" column="old_order_sn"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.order.vo.OrderInputVo" id="OrderInputVoResult">
@@ -46,6 +47,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="goodsRefund" column="goods_refund"/>
         <result property="goodsType" column="goods_type"/>
         <result property="goodsRealPrice" column="goods_real_price"/>
+        <result property="oldOrderSn" column="old_order_sn"/>
     </resultMap>
 
     <select id="selectList" parameterType="com.zhongzheng.modules.order.bo.OrderInputQueryBo" resultMap="OrderInputVoResult">