he2802 2 年之前
父节点
当前提交
0847bad80a
共有 43 个文件被更改,包括 544 次插入194 次删除
  1. 1 1
      Dockerfile
  2. 2 2
      run-prod.sh
  3. 1 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  4. 3 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  5. 8 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/wx/WxLoginController.java
  6. 1 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysUser.java
  7. 3 2
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/redis/RedisCache.java
  8. 10 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  9. 37 33
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  10. 17 11
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java
  11. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/ExamSimulateConfigBo.java
  12. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/ExamSimulateQueryBo.java
  13. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/mapper/ExamSimulateMapper.java
  14. 74 10
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/ExamSimulateServiceImpl.java
  15. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseBusiness.java
  16. 9 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseProjectTypeServiceImpl.java
  17. 16 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  18. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeOpenBo.java
  19. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeOpenUpBo.java
  20. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGradeInterface.java
  21. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeInterfaceMapper.java
  22. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeMapper.java
  23. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeInterfaceService.java
  24. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeInterfaceServiceImpl.java
  25. 66 30
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  26. 13 11
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
  27. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/inform/domain/InformRemind.java
  28. 42 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/inform/service/impl/InformSysUserServiceImpl.java
  29. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/inform/vo/InformSysUserVo.java
  30. 92 6
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsRefundServiceImpl.java
  31. 7 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  32. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  33. 24 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysConfigServiceImpl.java
  34. 3 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysWebServiceImpl.java
  35. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppRegisterBo.java
  36. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSystemRegisterBo.java
  37. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/bo/WxLoginBody.java
  38. 7 8
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java
  39. 37 60
      zhongzheng-system/src/main/resources/mapper/modules/bank/ExamSimulateMapper.xml
  40. 3 1
      zhongzheng-system/src/main/resources/mapper/modules/course/CourseBusinessMapper.xml
  41. 3 0
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeInterfaceMapper.xml
  42. 9 2
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml
  43. 4 4
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderGoodsRefundMapper.xml

+ 1 - 1
Dockerfile

@@ -5,7 +5,7 @@ ADD zhongzheng-api.jar /app.jar
 # 声明服务运行在8080端口
 EXPOSE 5055
 # 指定docker容器启动时运行jar包
-ENTRYPOINT ["java", "-jar","/app.jar"]
+ENTRYPOINT ["java", "-jar","-Xms2048m", "-Xmx2048m","/app.jar"]
 # 指定维护者的名字
 MAINTAINER zhongZheng
 

+ 2 - 2
run-prod.sh

@@ -21,8 +21,8 @@ docker run -p 5055:5055 --name ${app_name} \
 --restart=always \
 -e 'spring.profiles.active'=${profile_active} \
 -e TZ="Asia/Shanghai" \
--m 10G \
---cpus=4 \
+-m 10240m \
+--cpus=3 \
 -v /etc/localtime:/etc/localtime \
 -v /usr/share/fonts:/usr/share/fonts \
 -v /data/logs/prod_api:/logs \

+ 1 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java

@@ -366,4 +366,5 @@ public class GoodsController extends BaseController {
     public AjaxResult<Void> updateGoodsRepair(@RequestBody UpdateGoodsRepairBo bo) {
         return toAjax(iGoodsService.updateGoodsRepair(bo) ? 1 : 0);
     }
+
 }

+ 3 - 2
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -371,8 +371,9 @@ public class ClassGradeController extends BaseController {
     @GetMapping("/select")
     public AjaxResult<Integer> select(ClassGradeAddBo bo) {
         //自己公司的TenantId出现选择官方接口
-        boolean tenantId = ServletUtils.getRequest().getHeader("TenantId").equals("867735392558919680");
-        return AjaxResult.success(tenantId ? 1 : 0);
+//        boolean tenantId = ServletUtils.getRequest().getHeader("TenantId").equals("867735392558919680");
+//        return AjaxResult.success(tenantId ? 1 : 0);
+        return AjaxResult.success(1);
     }
 
     /**

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

@@ -1,6 +1,7 @@
 package com.zhongzheng.controller.wx;
 
 import cn.hutool.core.lang.Validator;
+import com.alibaba.fastjson.JSON;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.AjaxResult;
@@ -19,6 +20,8 @@ import com.zhongzheng.modules.wx.bo.WxLoginBody;
 import com.zhongzheng.modules.wx.bo.WxShareGoodsBo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -43,6 +46,7 @@ public class WxLoginController
     private  IUserService iUserService;
     @Autowired
     private  RedisCache redisCache;
+    private static final Logger log = LoggerFactory.getLogger(WxLoginController.class);
 
     /**
      * 登录方法
@@ -99,10 +103,14 @@ public class WxLoginController
     @PostMapping("/scan_login_check")
     public AjaxResult scanLoginCheck(@RequestBody WxLoginBody loginBody)
     {
+        log.info("loginBody:"+ JSON.toJSONString(loginBody));
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        log.info("loginUser:"+ JSON.toJSONString(loginUser));
         String scanCode = loginBody.getScanCode();
         String key = "SCAN_LOGIN_"+scanCode;
+        log.info("key:"+ key);
         String keyStatus = "SCAN_LOGIN_STATUS_"+scanCode; //0未扫码 1已扫码 2已登录
+        log.info("keyStatus:"+ keyStatus);
         Long status = redisCache.getCacheObject(keyStatus);
         if(Validator.isNotEmpty(status)&&status.equals(1L)){
             redisCache.setCacheObject(key, loginUser.getUser().getUserId(),60, TimeUnit.SECONDS);//60秒锁定

+ 1 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysUser.java

@@ -83,6 +83,7 @@ public class SysUser implements Serializable
     }
 
     /** 盐加密 */
+    @TableField(exist = false)
     private String salt;
 
     /** 帐号状态(1正常 0停用) */

+ 3 - 2
zhongzheng-common/src/main/java/com/zhongzheng/common/core/redis/RedisCache.java

@@ -5,6 +5,7 @@ import java.util.concurrent.TimeUnit;
 
 import cn.hutool.core.lang.Validator;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ToolsUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -60,7 +61,7 @@ public class RedisCache
     {
         String unionKey = key;
         if(Validator.isNotEmpty(ServletUtils.getRequest())){
-            String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+            String tenantId = ToolsUtils.getTenantId();
             if(Validator.isNotEmpty(tenantId)){
                 unionKey = tenantId + key;
             }
@@ -111,7 +112,7 @@ public class RedisCache
         ValueOperations<String, T> operation = redisTemplate.opsForValue();
         String unionKey = key;
         if(Validator.isNotEmpty(ServletUtils.getRequest())){
-            String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+            String tenantId = ToolsUtils.getTenantId();
             if(Validator.isNotEmpty(tenantId)){
                 unionKey = tenantId + key;
             }

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

@@ -1,11 +1,13 @@
 package com.zhongzheng.common.utils;
 
 import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
 import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
 import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
 import com.aliyun.teaopenapi.models.Config;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import io.micrometer.core.lang.NonNull;
+import net.sf.jsqlparser.expression.LongValue;
 
 import java.io.*;
 import java.nio.charset.StandardCharsets;
@@ -338,4 +340,12 @@ public class ToolsUtils {
         }
     }
 
+    public static String getTenantId() {
+        String TenantId = ServletUtils.getRequest().getHeader("TenantId");
+        if(!StrUtil.isNotBlank(TenantId)||TenantId==null){
+            TenantId = ServletUtils.getResponse().getHeader("TenantId");
+        }
+        return TenantId;
+    }
+
 }

+ 37 - 33
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java

@@ -6,7 +6,6 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -16,8 +15,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
 import com.zhongzheng.common.constant.Constants;
-import com.zhongzheng.common.core.domain.AjaxResult;
-import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.enums.UserStatus;
@@ -33,20 +30,11 @@ import com.zhongzheng.modules.collect.domain.CollectNote;
 import com.zhongzheng.modules.collect.mapper.CollectBankMapper;
 import com.zhongzheng.modules.collect.mapper.CollectCourseMapper;
 import com.zhongzheng.modules.collect.mapper.CollectNoteMapper;
-import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
-import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.domain.CourseSubject;
-import com.zhongzheng.modules.course.domain.MajorCategory;
-import com.zhongzheng.modules.course.service.ICourseService;
 import com.zhongzheng.modules.course.service.ICourseSubjectService;
-import com.zhongzheng.modules.exam.domain.ExamKnowledge;
-import com.zhongzheng.modules.goods.vo.GoodsUserVo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
 import com.zhongzheng.modules.grade.vo.ClassGradeUserGoodsVo;
-import com.zhongzheng.modules.inform.domain.InformSysUser;
-import com.zhongzheng.modules.order.domain.OrderBillGoods;
-import com.zhongzheng.modules.order.domain.OrderGoodsRefund;
 import com.zhongzheng.modules.system.service.ISysConfigService;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.*;
@@ -54,9 +42,7 @@ import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.mapper.UserMapper;
 import com.zhongzheng.modules.user.service.*;
 import com.zhongzheng.modules.user.vo.*;
-import io.swagger.models.auth.In;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -64,7 +50,6 @@ import org.springframework.util.CollectionUtils;
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
-import java.sql.Timestamp;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -640,23 +625,23 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if(bo.getTel().length()!=11){
             throw new CustomException("手机号格式错误");
         }
-        /*if(bo.getIdCard()==null){
+        if(bo.getIdcard()==null){
             throw new CustomException("身份证不能为空");
-        }*/
-        /*if(bo.getIdCard().length()!=18){
+        }
+        if(bo.getIdcard().length()!=18){
             throw new CustomException("身份证格式错误");
         }
-        if(bo.getRealname()==null){
-            throw new CustomException("真实姓名不能为空");
-        }*/
+//        if(bo.getRealname()==null){
+//            throw new CustomException("真实姓名不能为空");
+//        }
         User user = getOne(new LambdaQueryWrapper<User>()
                 .eq(User::getTelphone,EncryptHandler.encrypt(bo.getTel())).last("limit 1"));
         if(Validator.isNotNull(user)){
             throw new CustomException("该手机号已注册");
         }
-        if(Validator.isNotEmpty(bo.getIdCard())){
+        if(Validator.isNotEmpty(bo.getIdcard())){
             User user2 = getOne(new LambdaQueryWrapper<User>()
-                    .eq(User::getIdCard,EncryptHandler.encrypt(bo.getIdCard())).last("limit 1"));
+                    .eq(User::getIdCard,EncryptHandler.encrypt(bo.getIdcard())).last("limit 1"));
             if(Validator.isNotNull(user2)){
                 throw new CustomException("该身份证已被使用");
             }
@@ -669,7 +654,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         SnowflakeIdUtils idWorker = new SnowflakeIdUtils(3, 1);
         inertData.setUserAccount(String.valueOf(idWorker.nextId()));
         inertData.setSex(1);
-        inertData.setIdCard(bo.getIdCard());
+        inertData.setIdCard(bo.getIdcard());
         inertData.setRealname(bo.getRealname());
         inertData.setStatus(1);
         inertData.setRegisterPlat(bo.getRegisterPlat());
@@ -679,7 +664,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         inertData.setLastLoginTime(DateUtils.getNowTime());
         inertData.setCreateTime(DateUtils.getNowTime());
         inertData.setUpdateTime(DateUtils.getNowTime());
-        String pwd =  ToolsUtils.getSmsCode(); // 随机密码
+//        String pwd =  ToolsUtils.getSmsCode(); // 随机密码
+        String pwd =  bo.getIdcard().substring(bo.getIdcard().length() - 6);
         inertData.setPassword(SecurityUtils.encryptPassword(pwd));
         if(!save(inertData)){
             throw new CustomException("注册失败");
@@ -690,6 +676,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
 
     @Override
     public Boolean registerUser(UserAppRegisterBo bo) {
+        if(StringUtils.isBlank(bo.getIdcard())){
+            throw new CustomException("身份证不能为空");
+        }
         if(bo.getTel()==null){
             throw new CustomException("手机号不能为空");
         }
@@ -712,8 +701,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if(Validator.isNotNull(user)){
             throw new CustomException("该手机号已注册");
         }
+        User userIdCard = getOne(new LambdaQueryWrapper<User>()
+                .eq(User::getIdCard,EncryptHandler.encrypt(bo.getIdcard())).last("limit 1"));
+        if(Validator.isNotNull(userIdCard)){
+            throw new CustomException("该身份证已注册");
+        }
         User inertData = new User();
         inertData.setTelphone(bo.getTel());
+        inertData.setIdCard(bo.getIdcard());
         //隐藏手机号作为初始昵称
         inertData.setNickname(TelPhoneUtils.hideTelPhone(bo.getTel()));
         //雪花算法产生账号ID
@@ -756,11 +751,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 errorList.add(itemImport);
                 continue;
             }
-           /* if(Validator.isEmpty(itemImport.getIdCard())){
+            if(Validator.isEmpty(itemImport.getIdCard())){
                 itemImport.setCause("身份证不能为空");
                 errorList.add(itemImport);
                 continue;
-            }*/
+            }
             if(Validator.isEmpty(itemImport.getRealname())){
                 itemImport.setCause("真实姓名不能为空");
                 errorList.add(itemImport);
@@ -833,7 +828,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
             inertData.setLastLoginTime(DateUtils.getNowTime());
             inertData.setCreateTime(DateUtils.getNowTime());
             inertData.setUpdateTime(DateUtils.getNowTime());
-            String pwd =  ToolsUtils.getSmsCode(); // 随机密码
+//            String pwd =  ToolsUtils.getSmsCode(); // 随机密码
+//            inertData.setPassword(SecurityUtils.encryptPassword(pwd));
+            //初始密码(身份证后6位)
+            String idCard = itemImport.getIdCard();
+            String pwd =  idCard.substring(idCard.length() - 6); // 随机密码
             inertData.setPassword(SecurityUtils.encryptPassword(pwd));
             inertData.setImportNo(importNo); //设置导入编号 一个导入页面同时导入多次算一个编号
             if(!save(inertData)){
@@ -882,6 +881,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
             if(Validator.isEmpty(bo.getTelphone())){
                 throw new CustomException("用户手机号码缺失");
             }
+            if(Validator.isEmpty(bo.getIdCard())){
+                throw new CustomException("用户身份证号码缺失");
+            }
             User user1 = getOne(new LambdaQueryWrapper<User>()
                     .eq(User::getTelphone,EncryptHandler.encrypt(bo.getTelphone())).last("limit 1"));
             //手机号码存在
@@ -909,6 +911,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 }*/
                 UserSystemRegisterBo registerBo = BeanUtil.toBean(bo, UserSystemRegisterBo.class);
                 registerBo.setTel(bo.getTelphone());
+                registerBo.setIdcard(bo.getIdCard());
                 registerBo.setRegisterPlat("4");
                 Long userId = systemRegisterUser(registerBo);
                 if(userId.longValue()>0){
@@ -928,6 +931,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if (ObjectUtils.isNotNull(bo.getShareActivityCode())){
             return update(new LambdaUpdateWrapper<User>()
             .eq(User::getUserId,bo.getUserId())
+            .set(User::getUpdateTime,DateUtils.getNowTime())
             .set(User::getShareActivityCode,bo.getShareActivityCode()));
         }
         return false;
@@ -1001,7 +1005,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 queryBo.setTelphone(EncryptHandler.encrypt(item.getTelphone()));
             }
             if(isUpdate){
-           //     baseMapper.editUserInfo(queryBo);
+                baseMapper.editUserInfo(queryBo);
             }
         });
     }
@@ -1130,24 +1134,24 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if(Validator.isEmpty(bo.getAccount())){
             throw new CustomException("账号不能为空");
         }
-       /* String dualAuth = configService.selectConfigByKey("login.dual.auth");
+        String dualAuth = configService.selectConfigByKey("login.dual.auth");
         if(Validator.isNotEmpty(dualAuth)&&dualAuth.equals("1")){
             String key = Constants.LOGIN_SMS + bo.getTel();
             String code =  redisCache.getCacheObject(key);
             if(code==null){
-                throw new CustomException("验证码错误");
+                throw new CustomException("验证码不能为空");
             }
             if(!code.equals(bo.getCode())){
                 iUserLoginErrorService.saveErrorLog(bo.getTel());
                 throw new CustomException("验证码错误");
             }
-        }*/
+        }
         iUserLoginErrorService.checkLimit(bo.getAccount());
         LambdaQueryWrapper<User> queryWrapper =new LambdaQueryWrapper<User>();
         queryWrapper.and(wq -> wq
                 .eq(User::getTelphone,EncryptHandler.encrypt(bo.getAccount()))
                 .or()
-                .eq(User::getIdCard,bo.getAccount()));
+                .eq(User::getIdCard,EncryptHandler.encrypt(bo.getAccount())));
         User user = getOne(queryWrapper);
         if(Validator.isEmpty(user)){
             iUserLoginErrorService.saveErrorLog(bo.getAccount());

+ 17 - 11
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java

@@ -245,8 +245,11 @@ public class WxLoginService implements IWxLoginService {
     public Map<String, Object> login(WxLoginBody loginBody) {
         initData();
         User user = getWxUnionIdUser(loginBody);
-        if (user == null) {
-            throw new CustomException("登录错误");
+//        if (user == null) {
+//            throw new CustomException("登录错误");
+//        }
+        if (ObjectUtils.isNull(user)) {
+            throw new CustomException("新用户请先注册!",666);
         }
         //如果活动分销码变动
         if (StringUtils.isNotBlank(loginBody.getShareActivityCode())){
@@ -318,12 +321,13 @@ public class WxLoginService implements IWxLoginService {
      * @param tel
      * @return
      */
-    public Boolean register_small(String openId, String unionId, String tel, String inviteCode, String shareCode) {
+    public Boolean register_small(String openId, String unionId, String tel, String inviteCode, String shareCode,String idCard) {
         initData();
         User bo = new User();
         bo.setOpenId(openId);
         bo.setUnionId(unionId);
         bo.setTelphone(tel);
+        bo.setIdCard(idCard);
         //隐藏手机号作为初始昵称
         bo.setNickname(TelPhoneUtils.hideTelPhone(tel));
         //雪花算法产生账号ID
@@ -337,7 +341,8 @@ public class WxLoginService implements IWxLoginService {
         bo.setLastLoginTime(DateUtils.getNowTime());
         bo.setCreateTime(DateUtils.getNowTime());
         bo.setUpdateTime(DateUtils.getNowTime());
-        String pwd = ToolsUtils.getSmsCode(); // 随机密码
+//        String pwd = ToolsUtils.getSmsCode(); // 随机密码
+        String pwd = idCard.substring(idCard.length() - 6);
         bo.setPassword(SecurityUtils.encryptPassword(pwd));
         if (inviteCode != null) {
             User inviteUser = iUserService.queryByAccount(inviteCode);
@@ -412,13 +417,14 @@ public class WxLoginService implements IWxLoginService {
                 iUserService.updateById(user);
             }
         }
-        if (user == null) {
-            if (!register_small(openId, unionId, phoneNumber, loginBody.getInviteCode(),loginBody.getShareCode())) {
-                throw new CustomException("注册失败");
-            }
-            user = iUserService.getOne(new LambdaQueryWrapper<User>()
-                    .eq(User::getTelphone, EncryptHandler.encrypt(phoneNumber)).last("limit 1"));
-        }
+        //微信授权登入关闭注册入口
+//        if (user == null) {
+//            if (!register_small(openId, unionId, phoneNumber, loginBody.getInviteCode(),loginBody.getShareCode(),loginBody.getIdCard())) {
+//                throw new CustomException("注册失败");
+//            }
+//            user = iUserService.getOne(new LambdaQueryWrapper<User>()
+//                    .eq(User::getTelphone, EncryptHandler.encrypt(phoneNumber)).last("limit 1"));
+//        }
         return user;
     }
 

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/ExamSimulateConfigBo.java

@@ -26,4 +26,7 @@ public class ExamSimulateConfigBo {
     @ApiModelProperty("案列题")
     private ExamSimulateTypeBo caseQuestion;
 
+    /**  判断题 */
+    @ApiModelProperty("判断题")
+    private ExamSimulateTypeBo trueFalseQuestion;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/ExamSimulateQueryBo.java

@@ -69,6 +69,8 @@ public class ExamSimulateQueryBo extends BaseEntity {
 	private Integer qnum;
 	@ApiModelProperty("知识点题目ID数组")
 	private List<Long> knowledQuestionIds;
+	@ApiModelProperty("过滤错题ID数组")
+	private List<Long> wrongQuestionIds;
 
 	@ApiModelProperty("抽题顺序 1顺序 0随机")
 	private Integer randomNum;

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/mapper/ExamSimulateMapper.java

@@ -21,4 +21,6 @@ public interface ExamSimulateMapper extends BaseMapper<ExamSimulate> {
     List<Long> getQuestionList(ExamSimulateQueryBo bo);
 
     List<QuestionVo> queryBatchList(ExamSimulateQueryBo bo);
+
+    List<Long> getWrongQuestionList(ExamSimulateQueryBo bo);
 }

+ 74 - 10
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/ExamSimulateServiceImpl.java

@@ -127,45 +127,81 @@ public class ExamSimulateServiceImpl extends ServiceImpl<ExamSimulateMapper, Exa
         qk3Bo.setExamId(exam.getExamId());
         qk3Bo.setKnowledIds(simulateConfig.getCaseQuestion().getKnowledIds());
         qk3Bo.setKnum(simulateConfig.getCaseQuestion().getKnum());
-        qk3Bo.setRandomNum(2); //案例强制随机
         qk3Bo.setType(4);
         qk3Bo.setOrderGoodsId(bo.getOrderGoodsId());
         qk3Bo.setFromType(bo.getFrom());
         List<Long> qk3 = baseMapper.getKnowledQuestionList(qk3Bo);
 
+        ExamSimulateQueryBo qk4Bo = new ExamSimulateQueryBo(); //判断题选知识点
+        qk4Bo.setExamId(exam.getExamId());
+        qk4Bo.setKnowledIds(simulateConfig.getTrueFalseQuestion().getKnowledIds());
+        qk4Bo.setKnum(simulateConfig.getTrueFalseQuestion().getKnum());
+        qk4Bo.setType(3);
+        qk4Bo.setOrderGoodsId(bo.getOrderGoodsId());
+        qk4Bo.setFromType(bo.getFrom());
+        List<Long> qk4 = baseMapper.getKnowledQuestionList(qk4Bo);
+
+        List<Long> w1 = getWrongQuestion(bo.getOrderGoodsId(),bo.getExamId(),bo.getFrom(),simulateConfig.getType(),(simulateConfig.getSingleChoice().getQnum()-qk1.size()),qk1,1);//单选错题
+        List<Long> w2 = getWrongQuestion(bo.getOrderGoodsId(),bo.getExamId(),bo.getFrom(),simulateConfig.getType(),(simulateConfig.getMultipleChoice().getQnum()-qk2.size()),qk2,2);//多选错题
+        List<Long> w3 = getWrongQuestion(bo.getOrderGoodsId(),bo.getExamId(),bo.getFrom(),simulateConfig.getType(),(simulateConfig.getCaseQuestion().getQnum()-qk3.size()),qk3,4);//案例错题
+        List<Long> w4 = getWrongQuestion(bo.getOrderGoodsId(),bo.getExamId(),bo.getFrom(),simulateConfig.getType(),(simulateConfig.getTrueFalseQuestion().getQnum()-qk4.size()),qk4,3);//判断错题
+
         ExamSimulateQueryBo q1Bo = new ExamSimulateQueryBo();  //单选
         q1Bo.setExamId(exam.getExamId());
         q1Bo.setKnowledQuestionIds(qk1);
-        q1Bo.setQnum(simulateConfig.getSingleChoice().getQnum()-qk1.size());
+        q1Bo.setWrongQuestionIds(w1);
+        q1Bo.setQnum(simulateConfig.getSingleChoice().getQnum()-qk1.size()-w1.size());
         q1Bo.setRandomNum(simulateConfig.getType());
         q1Bo.setType(1);
         q1Bo.setOrderGoodsId(bo.getOrderGoodsId());
         q1Bo.setFromType(bo.getFrom());
         List<Long> q1 = baseMapper.getQuestionList(q1Bo);
+
         ExamSimulateQueryBo q2Bo = new ExamSimulateQueryBo();  //多选
         q2Bo.setExamId(exam.getExamId());
         q2Bo.setKnowledQuestionIds(qk2);
-        q2Bo.setQnum(simulateConfig.getMultipleChoice().getQnum()-qk2.size());
+        q2Bo.setWrongQuestionIds(w2);
+        q2Bo.setQnum(simulateConfig.getMultipleChoice().getQnum()-qk2.size()- w2.size());
         q2Bo.setRandomNum(simulateConfig.getType());
         q2Bo.setType(2);
         q2Bo.setOrderGoodsId(bo.getOrderGoodsId());
         q2Bo.setFromType(bo.getFrom());
         List<Long> q2 = baseMapper.getQuestionList(q2Bo);
+
         ExamSimulateQueryBo q3Bo = new ExamSimulateQueryBo();  //案例选
         q3Bo.setExamId(exam.getExamId());
         q3Bo.setKnowledQuestionIds(qk3);
-        q3Bo.setQnum(simulateConfig.getCaseQuestion().getQnum()-qk3.size());
-        q3Bo.setRandomNum(2);//案例强制随机
+        q3Bo.setWrongQuestionIds(w3);
+        q3Bo.setQnum(simulateConfig.getCaseQuestion().getQnum()-qk3.size()- w3.size());
         q3Bo.setType(4);
         q3Bo.setOrderGoodsId(bo.getOrderGoodsId());
         q3Bo.setFromType(bo.getFrom());
         List<Long> q3 = baseMapper.getQuestionList(q3Bo);
+
+        ExamSimulateQueryBo q4Bo = new ExamSimulateQueryBo();  //判断题
+        q4Bo.setExamId(exam.getExamId());
+        q4Bo.setKnowledQuestionIds(qk4);
+        q4Bo.setWrongQuestionIds(w4);
+        q4Bo.setQnum(simulateConfig.getTrueFalseQuestion().getQnum()-qk4.size()- w4.size());
+        q4Bo.setType(3);
+        q4Bo.setOrderGoodsId(bo.getOrderGoodsId());
+        q4Bo.setFromType(bo.getFrom());
+        List<Long> q4 = baseMapper.getQuestionList(q4Bo);
+
+        qk1.addAll(w1);
         qk1.addAll(q1);
+
+        qk2.addAll(w2);
         qk2.addAll(q2);
+
+        qk3.addAll(w3);
         qk3.addAll(q3);
+
+        qk4.addAll(w4);
+        qk4.addAll(q4);
         List<Long> allQ = new ArrayList<>();
         if(simulateConfig.getSingleChoice().getRandomNum()==1){ //题型顺序
-            for(int i=1;i<4;i++){
+            for(int i=1;i<5;i++){
                 if(simulateConfig.getSingleChoice().getOrderNum()==i){
                     allQ.addAll(qk1);
                 }
@@ -175,31 +211,40 @@ public class ExamSimulateServiceImpl extends ServiceImpl<ExamSimulateMapper, Exa
                 if(simulateConfig.getCaseQuestion().getOrderNum()==i){
                     allQ.addAll(qk3);
                 }
+                if(simulateConfig.getTrueFalseQuestion().getOrderNum()==i){
+                    allQ.addAll(qk4);
+                }
             }
         //    Collections.reverse(allQ);
         }else{//题型随机
             Map<Integer,Integer> map = new HashMap<>();
             for(int i=1;i<50;i++){
                 int num = (int)(10.0*Math.random()) + 1;
-                if(num%3==0){
+                if(num%4==0){
                     if(!map.containsKey(0)){
                         map.put(0,0);
                         allQ.addAll(qk1);
                     }
                 }
-                if(num%3==1){
+                if(num%4==1){
                     if(!map.containsKey(1)){
                         map.put(1,1);
                         allQ.addAll(qk2);
                     }
                 }
-                if(num%3==2){
+                if(num%4==2){
                     if(!map.containsKey(2)){
                         map.put(2,2);
                         allQ.addAll(qk3);
                     }
                 }
-                if(map.size()>=3){
+                if(num%4==3){
+                    if(!map.containsKey(3)){
+                        map.put(3,3);
+                        allQ.addAll(qk4);
+                    }
+                }
+                if(map.size()>=4){
                     break;
                 }
             }
@@ -267,4 +312,23 @@ public class ExamSimulateServiceImpl extends ServiceImpl<ExamSimulateMapper, Exa
     public List<QuestionVo> queryBatchList(ExamSimulateQueryBo bo) {
         return this.baseMapper.queryBatchList(bo);
     }
+
+
+    private List<Long> getWrongQuestion(Long orderGoodsId,Long examId,Integer fromType,Integer orderType,Integer maxQnum,List<Long> knowledQuestionIds,Integer qType){
+        if(orderType==2){
+            int num = ((int)(maxQnum*Math.random()) + 1)/2;
+            ExamSimulateQueryBo queryBo = new ExamSimulateQueryBo();
+            queryBo.setOrderGoodsId(orderGoodsId);
+            queryBo.setExamId(examId);
+            queryBo.setFromType(fromType);
+            queryBo.setKnowledQuestionIds(knowledQuestionIds);
+            queryBo.setType(qType);
+            queryBo.setQnum(num);
+            queryBo.setRandomNum(orderType);
+            List<Long> questionlist = baseMapper.getWrongQuestionList(queryBo);
+            return questionlist;
+        }else {
+            return new ArrayList<>();
+        }
+    }
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseBusiness.java

@@ -76,4 +76,7 @@ private static final long serialVersionUID=1L;
 
     @TableField(exist = false)
     private Long oId;
+
+    @TableField(exist = false)
+    private String templateName;
 }

+ 9 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseProjectTypeServiceImpl.java

@@ -114,10 +114,17 @@ public class CourseProjectTypeServiceImpl extends ServiceImpl<CourseProjectTypeM
         longs.add(1);
         longs.add(0);
         courseProjectTypeQueryBo.setStatus(longs);
-        Collection<CourseProjectTypeVo> courseProjectTypeVos = baseMapper.queryList(courseProjectTypeQueryBo);
-        if (!CollectionUtils.isEmpty(courseProjectTypeVos)){
+        Integer count = baseMapper.selectCount(new LambdaQueryWrapper<CourseProjectType>()
+                .eq(CourseProjectType::getProjectName, entity.getProjectName())
+                .eq(CourseProjectType::getEducationId, entity.getEducationId())
+                .in(CourseProjectType::getStatus, longs));
+        if (count > 0){
             throw new RuntimeException("项目重复");
         }
+//        Collection<CourseProjectTypeVo> courseProjectTypeVos = baseMapper.queryList(courseProjectTypeQueryBo);
+//        if (!CollectionUtils.isEmpty(courseProjectTypeVos)){
+//            throw new RuntimeException("项目重复");
+//        }
         //TODO 做一些数据校验,如唯一约束
     }
 

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

@@ -40,6 +40,8 @@ import com.zhongzheng.modules.goods.domain.*;
 import com.zhongzheng.modules.goods.mapper.GoodsMapper;
 import com.zhongzheng.modules.goods.service.*;
 import com.zhongzheng.modules.goods.vo.*;
+import com.zhongzheng.modules.grade.domain.ClassGradeInterface;
+import com.zhongzheng.modules.grade.service.IClassGradeInterfaceService;
 import com.zhongzheng.modules.grade.vo.ClassGradeVo;
 import com.zhongzheng.modules.grade.vo.SyncGoodsExport;
 import com.zhongzheng.modules.inform.domain.InformRemind;
@@ -123,6 +125,8 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
 
     @Autowired
     private IOrderInputTemplateService iOrderInputTemplateService;
+    @Autowired
+    private IClassGradeInterfaceService iClassGradeInterfaceService;
 
     @Autowired
     private ICourseMenuService iCourseMenuService;
@@ -3392,6 +3396,18 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             iOrderInputTemplateService.saveBatch(newTemplateList);
         }
 
+        //班级官方通知模板
+        List<ClassGradeInterface> gradeInterfaceList = iClassGradeInterfaceService.list();
+        if (CollectionUtils.isNotEmpty(gradeInterfaceList)){
+            List<ClassGradeInterface> newGradeInterfaceList = gradeInterfaceList.stream().map(x -> {
+                ClassGradeInterface gradeInterface = BeanUtil.toBean(x, ClassGradeInterface.class);
+                gradeInterface.setId(null);
+                gradeInterface.setTenantId(newTenantId);
+                return gradeInterface;
+            }).collect(Collectors.toList());
+            iClassGradeInterfaceService.saveBatch(newGradeInterfaceList);
+        }
+
         //保存记录
         iSysGoodsCopyRecordService.saveBatch(copyRecordList);
         return true;

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeOpenBo.java

@@ -38,4 +38,8 @@ public class ClassGradeOpenBo implements Serializable {
 
     @ApiModelProperty("班级名称")
     private String className;
+
+    private Integer learningStatus;
+
+    private Long learningTimeStart;
 }

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeOpenUpBo.java

@@ -29,4 +29,12 @@ public class ClassGradeOpenUpBo implements Serializable {
 
     @ApiModelProperty("班级名称")
     private String className;
+
+    private Long gradeId;
+
+    private Long interfacePushId;
+
+    private Integer learningStatus;
+
+    private Long learningTimeStart;
 }

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

@@ -40,4 +40,6 @@ private static final long serialVersionUID=1L;
     /** 修改时间 */
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Long updateTime;
+
+    private Long tenantId;
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeInterfaceMapper.java

@@ -1,7 +1,9 @@
 package com.zhongzheng.modules.grade.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.zhongzheng.modules.grade.domain.ClassGradeInterface;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 官方接口Mapper接口
@@ -11,4 +13,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ClassGradeInterfaceMapper extends BaseMapper<ClassGradeInterface> {
 
+    @InterceptorIgnore(tenantLine = "true")
+    ClassGradeInterface getInfterFaceByTenant(@Param("type") Integer type,@Param("tenantId") Long tenantId);
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeMapper.java

@@ -83,4 +83,6 @@ public interface ClassGradeMapper extends BaseMapper<ClassGrade> {
     @InterceptorIgnore(tenantLine = "true")
     void UpGradeCodeByIdTenant(@Param("ids") List<Long> ids);
 
+    @InterceptorIgnore(tenantLine = "true")
+    void UpGradeInterfaceByTenant(ClassGradeOpenUpBo upBo);
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeInterfaceService.java

@@ -49,4 +49,6 @@ public interface IClassGradeInterfaceService extends IService<ClassGradeInterfac
 	 * @return
 	 */
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    ClassGradeInterface getInfterFaceByTenant(Integer type, Long tenantId);
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeInterfaceServiceImpl.java

@@ -100,4 +100,9 @@ public class ClassGradeInterfaceServiceImpl extends ServiceImpl<ClassGradeInterf
         }
         return this.removeByIds(ids);
     }
+
+    @Override
+    public ClassGradeInterface getInfterFaceByTenant(Integer type, Long tenantId) {
+        return baseMapper.getInfterFaceByTenant(type, tenantId);
+    }
 }

+ 66 - 30
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -6,9 +6,12 @@ import cn.hutool.core.lang.Validator;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
 import com.zhongzheng.common.annotation.DataScope;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
@@ -20,19 +23,18 @@ import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
 import com.zhongzheng.modules.course.bo.CourseEducationTypeQueryBo;
 import com.zhongzheng.modules.course.bo.CourseProjectTypeQueryBo;
-import com.zhongzheng.modules.course.domain.*;
+import com.zhongzheng.modules.course.domain.CourseBusiness;
+import com.zhongzheng.modules.course.domain.CourseEducationType;
+import com.zhongzheng.modules.course.domain.CourseSubject;
 import com.zhongzheng.modules.course.service.*;
 import com.zhongzheng.modules.course.vo.*;
 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.bo.*;
-import com.zhongzheng.modules.grade.domain.ClassGradeGoods;
-import com.zhongzheng.modules.grade.domain.ClassGradeSys;
-import com.zhongzheng.modules.grade.domain.ClassGradeUser;
-import com.zhongzheng.modules.grade.service.IClassGradeGoodsService;
-import com.zhongzheng.modules.grade.service.IClassGradeSysService;
-import com.zhongzheng.modules.grade.service.IClassGradeUserService;
+import com.zhongzheng.modules.grade.domain.*;
+import com.zhongzheng.modules.grade.mapper.ClassGradeMapper;
+import com.zhongzheng.modules.grade.service.*;
 import com.zhongzheng.modules.grade.vo.*;
 import com.zhongzheng.modules.inform.bo.InformUserAddBo;
 import com.zhongzheng.modules.inform.service.IInformRemindService;
@@ -62,20 +64,12 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.github.pagehelper.Page;
-import com.zhongzheng.modules.grade.domain.ClassGrade;
-import com.zhongzheng.modules.grade.mapper.ClassGradeMapper;
-import com.zhongzheng.modules.grade.service.IClassGradeService;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -149,6 +143,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     @Autowired
     private IClassGradeGoodsService iClassGradeGoodsService;
 
+    @Autowired
+    private IClassGradeInterfaceService iClassGradeInterfaceService;
+
     @Autowired
     private ISysOldOrgService iSysOldOrgService;
 
@@ -236,6 +233,19 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         if (CollectionUtils.isNotEmpty(list)) {
             throw new RuntimeException("班级名称不能重复");
         }
+        //校验是否二建/二造商品创建班级
+        if (bo.getClassGradeGoodsAddBos() != null &&
+                (ObjectUtils.isNull(bo.getClassStatus()) || 1 == bo.getClassStatus())) {
+            Long goodsId = bo.getClassGradeGoodsAddBos()[0];
+            Goods goods = iGoodsService.getById(goodsId);
+            CourseBusinessQueryBo businessQueryBo = new CourseBusinessQueryBo();
+            businessQueryBo.setId(goods.getBusinessId());
+            String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
+            if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
+                throw new CustomException("二建/二造不允许直接创建开班班级!");
+            }
+        }
+
         //是否创建官方班级编号
         if (bo.getClassGradeGoodsAddBos() != null &&
                 (ObjectUtils.isNull(bo.getClassStatus()) || 0 == bo.getClassStatus())) {
@@ -391,6 +401,13 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                 if (StringUtils.isNotBlank(gradeGrade.getOfficialName())){
                     update.setRegisterCode(gradeGrade.getOfficialName());
                 }
+                //二建/二造官方信息推送开关打开
+                List<ClassGradeInterface> interfaceList = iClassGradeInterfaceService
+                        .list(new LambdaQueryWrapper<ClassGradeInterface>()
+                        .eq(ClassGradeInterface::getType, 1).last("limit 1"));
+                if (CollectionUtils.isNotEmpty(interfaceList)){
+                    update.setInterfacePushId(interfaceList.get(0).getId());
+                }
             }
         }
 
@@ -477,25 +494,30 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
             if (ObjectUtils.isNotNull(grade) && ObjectUtils.isNotNull(grade.getClassStatus())
                     && StringUtils.isNotBlank(grade.getOfficialName()) && grade.getClassStatus() == 1){
-                //开班修改预报名班级下 所有班级
-                List<ClassGrade> list = list(new LambdaQueryWrapper<ClassGrade>().eq(ClassGrade::getOfficialName, update.getRegisterCode()));
-                if (CollectionUtils.isNotEmpty(list)){
-                    update(new LambdaUpdateWrapper<ClassGrade>()
-                            .set(ClassGrade::getOfficialName,update.getOfficialName())
-                            .set(ClassGrade::getRegisterCode,update.getRegisterCode())
-                            .set(ClassGrade::getClassStartTime,update.getClassStartTime())
-                            .set(ClassGrade::getClassEndTime,update.getClassEndTime())
-                            .set(ClassGrade::getClassStatus,update.getClassStatus())
-                            .set(ClassGrade::getLearningStatus,update.getLearningStatus())
-                            .in(ClassGrade::getGradeId,list.stream().map(ClassGrade::getGradeId).collect(Collectors.toList())));
-                }
-                //官方班级开班通知旧系统
+//                List<ClassGrade> list = list(new LambdaQueryWrapper<ClassGrade>().eq(ClassGrade::getOfficialName, update.getRegisterCode()));
+//                if (CollectionUtils.isNotEmpty(list)){
+//                    update(new LambdaUpdateWrapper<ClassGrade>()
+//                            .set(ClassGrade::getOfficialName,update.getOfficialName())
+//                            .set(ClassGrade::getRegisterCode,update.getRegisterCode())
+//                            .set(ClassGrade::getClassStartTime,update.getClassStartTime())
+//                            .set(ClassGrade::getClassEndTime,update.getClassEndTime())
+//                            .set(ClassGrade::getClassStatus,update.getClassStatus())
+//                            .set(ClassGrade::getLearningStatus,update.getLearningStatus())
+//                            .set(ClassGrade::getInterfacePushId,update.getInterfacePushId())
+//                            .in(ClassGrade::getGradeId,list.stream().map(ClassGrade::getGradeId).collect(Collectors.toList())));
+//                }
+
                 ClassGradeOpenBo openBo = new ClassGradeOpenBo();
                 openBo.setOfficialName(grade.getOfficialName());
                 openBo.setRegisterCode(grade.getRegisterCode());
                 openBo.setClassName(grade.getClassName());
                 openBo.setClassStartTime(grade.getClassStartTime());
                 openBo.setClassEndTime(grade.getClassEndTime());
+                openBo.setLearningStatus(grade.getLearningStatus());
+                openBo.setLearningTimeStart(grade.getLearningTimeStart());
+                //开班修改预报名班级下 所有班级
+                this.openOfficialGrade(openBo);
+                //官方班级开班通知旧系统
                 Long nowTime = DateUtils.getNowTime();
                 String sign = ToolsUtils.EncoderByMd5(nowTime.toString()+"pubilc2022");
                 openBo.setSign(sign);
@@ -1259,7 +1281,21 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         openUpBo.setClassName(bo.getClassName());
         openUpBo.setClassStartTime(bo.getClassStartTime());
         openUpBo.setClassEndTime(bo.getClassEndTime());
+        openUpBo.setLearningStatus(bo.getLearningStatus());
+        openUpBo.setLearningTimeStart(bo.getLearningTimeStart());
         baseMapper.UpGradeStatusByTenant(openUpBo);
+
+        //开启官方信息推送
+        list.forEach(item -> {
+            ClassGradeInterface interfaceInterface = iClassGradeInterfaceService.getInfterFaceByTenant(1,item.getTenantId());
+            if (ObjectUtils.isNotNull(interfaceInterface)){
+                ClassGradeOpenUpBo upBo = new ClassGradeOpenUpBo();
+                upBo.setGradeId(item.getGradeId());
+                upBo.setInterfacePushId(interfaceInterface.getId());
+                baseMapper.UpGradeInterfaceByTenant(upBo);
+            }
+        });
+
     }
 
     @Override
@@ -1345,7 +1381,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         Goods goods = iGoodsService.getGoodsByIdTenant(goodsId,tenantId);
         CourseBusiness businessVo = iCourseBusinessService.getBusinessByIdTenant(goods.getBusinessId(),tenantId);
         boolean isConfigTp = false; //商品是否有配置选班模板
-        if (Validator.isNotEmpty(businessVo) && Validator.isNotEmpty(businessVo.getTemplateStatus()) && businessVo.getTemplateStatus() == 1) {
+        if (Validator.isNotEmpty(businessVo) && Validator.isNotEmpty(businessVo.getTemplateName()) && businessVo.getTemplateName().equals("班级")) {
             isConfigTp = true;
         }
         ClassGrade classGrade = new ClassGrade();

+ 13 - 11
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java

@@ -44,6 +44,7 @@ import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.domain.ClassGrade;
+import com.zhongzheng.modules.grade.domain.ClassGradeInterface;
 import com.zhongzheng.modules.grade.domain.StudyCountLog;
 import com.zhongzheng.modules.grade.service.*;
 import com.zhongzheng.modules.grade.vo.*;
@@ -127,6 +128,9 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
     @Autowired
     private IClassGradeService iClassGradeService;
 
+    @Autowired
+    private IClassGradeInterfaceService iClassGradeInterfaceService;
+
     @Autowired
     private IGoodsService iGoodsService;
 
@@ -533,15 +537,20 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
     @Override
     public String pushOfficialInfo(ClassGradeUserQueryBo bo) {
         //暂时先关闭信息推送入口
-        if (true){
-            return "";
-        }
+//        if (true){
+//            return "";
+//        }
         ClassGradeUserVo userVo = this.baseMapper.selectUser(bo);
         if (Validator.isEmpty(userVo)) {
             return "用户不存在";
         }
-        if (Validator.isEmpty(userVo.getInterfacePushId()) || !userVo.getInterfacePushId().equals(1L)) {
+        if (Validator.isEmpty(userVo.getInterfacePushId())) {
             return "没开通信息推送";
+        }else {
+            ClassGradeInterface gradeInterface = iClassGradeInterfaceService.getById(userVo.getInterfacePushId());
+            if (gradeInterface.getType() != 1){
+                return "没开通信息推送";
+            }
         }
         if (Validator.isEmpty(userVo.getOfficialName())) {
             return "没配置班号";
@@ -565,13 +574,6 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         if (Validator.isEmpty(orderGoods)) {
             return "班级商品不存在";
         }
-        Goods goods = iGoodsService.getById(orderGoods.getGoodsId());
-        CourseBusinessQueryBo businessQueryBo = new CourseBusinessQueryBo();
-        businessQueryBo.setId(goods.getBusinessId());
-        String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
-        if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
-            return "继教二建/二造班级不需要推送注册中心";
-        }
         Long bmrq = 0L;
         if(userVo.getClassStartTime().longValue()<orderGoods.getCreateTime().longValue()){
             bmrq = orderGoods.getCreateTime();

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/inform/domain/InformRemind.java

@@ -50,6 +50,7 @@ private static final long serialVersionUID=1L;
     private Integer gzhTpStatus;
     /** 1学员 2教务 */
     private Integer userType;
-
+    /** 类型:1,普通 2,订单初审 3,订单复审 */
+    private Integer type;
     private Long tenantId;
 }

+ 42 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/inform/service/impl/InformSysUserServiceImpl.java

@@ -2,23 +2,31 @@ package com.zhongzheng.modules.inform.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.modules.inform.bo.InformSysUserAddBo;
 import com.zhongzheng.modules.inform.bo.InformSysUserEditBo;
 import com.zhongzheng.modules.inform.bo.InformSysUserQueryBo;
 import com.zhongzheng.modules.inform.bo.InformUserEditBo;
+import com.zhongzheng.modules.inform.domain.InformRemind;
 import com.zhongzheng.modules.inform.domain.InformSysUser;
 import com.zhongzheng.modules.inform.mapper.InformSysUserMapper;
+import com.zhongzheng.modules.inform.service.IInformRemindService;
 import com.zhongzheng.modules.inform.service.IInformSysUserService;
 import com.zhongzheng.modules.inform.vo.InformSysUserVo;
+import com.zhongzheng.modules.order.domain.OrderGoods;
+import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.user.domain.User;
 import io.swagger.models.auth.In;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.Page;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -33,10 +41,26 @@ import java.util.stream.Collectors;
 @Service
 public class InformSysUserServiceImpl extends ServiceImpl<InformSysUserMapper, InformSysUser> implements IInformSysUserService {
 
+    @Autowired
+    private IOrderGoodsService iOrderGoodsService;
+    @Autowired
+    private IInformRemindService iInformRemindService;
+
     @Override
     public InformSysUserVo queryById(Long id){
         InformSysUser db = this.baseMapper.selectById(id);
-        return BeanUtil.toBean(db, InformSysUserVo.class);
+        InformSysUserVo vo = BeanUtil.toBean(db, InformSysUserVo.class);
+        if (ObjectUtils.isNotNull(vo.getOrderGoodsId())){
+            OrderGoods orderGoods = iOrderGoodsService.getById(vo.getOrderGoodsId());
+            vo.setOrderSn(orderGoods.getOrderSn());
+        }
+        if (ObjectUtils.isNotNull(vo.getRemindId())){
+            InformRemind informRemind = iInformRemindService.getById(vo.getRemindId());
+            vo.setType(informRemind.getType());
+        }else {
+            vo.setType(1);
+        }
+        return vo;
     }
 
     @Override
@@ -56,7 +80,23 @@ public class InformSysUserServiceImpl extends ServiceImpl<InformSysUserMapper, I
         lqw.eq(bo.getGradeId() != null, InformSysUser::getGradeId, bo.getGradeId());
         lqw.eq(bo.getOrderGoodsId() != null, InformSysUser::getOrderGoodsId, bo.getOrderGoodsId());
         lqw.eq(bo.getStatus() != null, InformSysUser::getStatus, bo.getStatus());
-        return entity2Vo(this.list(lqw));
+        List<InformSysUserVo> informSysUserVos = entity2Vo(this.list(lqw));
+        if (CollectionUtils.isEmpty(informSysUserVos)){
+            return new ArrayList<>();
+        }
+        informSysUserVos.forEach(item -> {
+            if (ObjectUtils.isNotNull(item.getOrderGoodsId())){
+                OrderGoods orderGoods = iOrderGoodsService.getById(item.getOrderGoodsId());
+                item.setOrderSn(orderGoods.getOrderSn());
+            }
+            if (ObjectUtils.isNotNull(item.getRemindId())){
+                InformRemind informRemind = iInformRemindService.getById(item.getRemindId());
+                item.setType(informRemind.getType());
+            }else {
+                item.setType(1);
+            }
+        });
+        return informSysUserVos;
     }
 
     /**

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/inform/vo/InformSysUserVo.java

@@ -76,6 +76,10 @@ public class InformSysUserVo {
 	@Excel(name = "订单商品ID")
 	@ApiModelProperty("订单商品ID")
 	private Long orderGoodsId;
+	@ApiModelProperty("订单号")
+	private String orderSn;
+	@ApiModelProperty("消息类型:1,普通 2,订单初审 3,订单复审")
+	private Integer type;
 	/** 状态 1有效 0无效 */
 	@Excel(name = "状态 1有效 0无效")
 	@ApiModelProperty("状态 1有效 0无效")

+ 92 - 6
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsRefundServiceImpl.java

@@ -5,9 +5,15 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
@@ -16,11 +22,18 @@ import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.modules.activity.domain.ActivityOrder;
 import com.zhongzheng.modules.activity.service.IActivityOrderService;
+import com.zhongzheng.modules.course.domain.CourseBusiness;
+import com.zhongzheng.modules.course.service.ICourseBusinessService;
 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.domain.ClassGradeUser;
+import com.zhongzheng.modules.grade.service.IClassGradeService;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
+import com.zhongzheng.modules.inform.domain.InformRemind;
+import com.zhongzheng.modules.inform.domain.InformSysUser;
+import com.zhongzheng.modules.inform.service.IInformRemindService;
+import com.zhongzheng.modules.inform.service.IInformSysUserService;
 import com.zhongzheng.modules.order.bo.*;
 import com.zhongzheng.modules.order.domain.Order;
 import com.zhongzheng.modules.order.domain.OrderGoods;
@@ -35,11 +48,10 @@ import com.zhongzheng.modules.order.vo.OrderGoodsRefundVo;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderShareGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderShareToOldVo;
+import com.zhongzheng.modules.system.service.ISysUserService;
 import com.zhongzheng.modules.user.bo.UserExamGoodsQueryBo;
 import com.zhongzheng.modules.user.bo.UserExamRecordQueryBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
-import com.zhongzheng.modules.user.domain.User;
-import com.zhongzheng.modules.user.domain.UserStudyRecord;
 import com.zhongzheng.modules.user.service.IUserExamGoodsService;
 import com.zhongzheng.modules.user.service.IUserExamRecordService;
 import com.zhongzheng.modules.user.service.IUserService;
@@ -49,10 +61,6 @@ import com.zhongzheng.modules.wx.service.IWxPayService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.github.pagehelper.Page;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
@@ -91,6 +99,16 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
     private IOrderShareMoneyService iOrderShareMoneyService;
     @Autowired
     private IActivityOrderService iActivityOrderService;
+    @Autowired
+    private IInformSysUserService iInformSysUserService;
+    @Autowired
+    private IInformRemindService informRemindService;
+    @Autowired
+    private ICourseBusinessService iCourseBusinessService;
+    @Autowired
+    private ISysUserService iSysUserService;
+    @Autowired
+    private IClassGradeService iClassGradeService;
     @Value("${oldStudySys.shareCanclePath}")
     private String SHARE_CANCLE_PATH;
 
@@ -144,6 +162,7 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean placeRefundSmallOrder(OrderGoodsRefundAddBo bo) {
         if(Validator.isEmpty(bo.getGoodsId())||Validator.isEmpty(bo.getOrderSn())){
             throw new CustomException("参数缺失");
@@ -224,6 +243,37 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
         .set(OrderGoods::getRefundStatus,1)
         .eq(OrderGoods::getOrderGoodsId,orderGoods.getOrderGoodsId()));
 
+        //通知教务审核(后台站内信)
+        InformRemind informRemind = informRemindService.getOne(new LambdaQueryWrapper<InformRemind>()
+        .eq(InformRemind::getRemind,"订单退款申请通知提醒").last("limit 1"));
+        if (informRemind.getWayStatus() == 1 && informRemind.getUserType() == 2) {
+            //获取初审审核人账号
+            CourseBusiness business = iCourseBusinessService.getById(goods.getBusinessId());
+            if (ObjectUtils.isNotNull(business) && StringUtils.isNotBlank(business.getRefundUserIds())){
+                List<SysUser> sysUsers = iSysUserService.listByIds(Arrays.asList(business.getRefundUserIds().split(",")));
+                if (CollectionUtils.isNotEmpty(sysUsers)){
+                    sysUsers.forEach(user -> {
+                        InformSysUser addBo = new InformSysUser();
+                        addBo.setUserId(user.getUserId());
+                        addBo.setSendTime(DateUtils.getNowTime());
+                        addBo.setSendStatus(1);
+                        addBo.setCreateTime(DateUtils.getNowTime());
+                        addBo.setUpdateTime(DateUtils.getNowTime());
+                        addBo.setRemindId(informRemind.getId());
+                        addBo.setReceiptStatus(0);
+                        addBo.setSystemStatus(1);
+                        addBo.setRemind("订单退款申请通知提醒");
+                        addBo.setGoodsId(goods.getGoodsId());
+                        addBo.setOrderGoodsId(orderGoods.getOrderGoodsId());
+                        GoodsVo goodsVo1 = iGoodsService.queryById(goods.getGoodsId());
+                        addBo.setText(String.format("【%s】课程申请退款,请尽快处理!",goodsVo1.getGoodsName()));
+                        iInformSysUserService.save(addBo);
+                    });
+                }
+            }
+
+        }
+
 //        OrderGoodsRefund add = getOne(new LambdaQueryWrapper<OrderGoodsRefund>().eq(OrderGoodsRefund::getGoodsId,bo.getGoodsId()).eq(OrderGoodsRefund::getOrderSn,bo.getOrderSn()));
 //        String out_trade_no = null;
 //        if(Validator.isNotEmpty(add)){
@@ -442,6 +492,9 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
             lqw.eq(ClassGradeUser::getGradeId, gradeId);
             lqw.eq( ClassGradeUser::getUserId, userId);
             iClassGradeUserService.remove(lqw);
+            //班级人数变动通知旧系统
+            Goods goods = iGoodsService.getById(goodsId);
+            iClassGradeService.gradeChangeEjjjPeople(goods.getBusinessId(),gradeId);
             //清除课程所有历史
             iUserStudyRecordService.delUserCourseHistory(userId,goodsId,gradeId,orderGoodsId);
         }
@@ -647,6 +700,39 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
                 orderGoodsUpdate.setUpdateTime(DateUtils.getNowTime());
                 iOrderGoodsService.updateById(orderGoodsUpdate);
             }
+
+            OrderGoodsRefund refundGoods = getById(bo.getRefundId());
+            if(refundGoods.getPeriodStatus() == 1){
+                //教务初审通过通知财务(后台站内信)
+                InformRemind informRemind = informRemindService.getOne(new LambdaQueryWrapper<InformRemind>()
+                        .eq(InformRemind::getRemind,"订单退款初审通过提醒").last("limit 1"));
+                if (informRemind.getWayStatus() == 1 && informRemind.getUserType() == 2) {
+                    Goods goods = iGoodsService.getById(refundGoods.getGoodsId());
+                    //获取初审审核人账号
+                    CourseBusiness business = iCourseBusinessService.getById(goods.getBusinessId());
+                    if (ObjectUtils.isNotNull(business) && StringUtils.isNotBlank(business.getRefundConfirmUserIds())){
+                        List<SysUser> sysUsers = iSysUserService.listByIds(Arrays.asList(business.getRefundConfirmUserIds().split(",")));
+                        if (CollectionUtils.isNotEmpty(sysUsers)){
+                            sysUsers.forEach(user -> {
+                                InformSysUser addBo = new InformSysUser();
+                                addBo.setUserId(user.getUserId());
+                                addBo.setSendTime(DateUtils.getNowTime());
+                                addBo.setSendStatus(1);
+                                addBo.setCreateTime(DateUtils.getNowTime());
+                                addBo.setUpdateTime(DateUtils.getNowTime());
+                                addBo.setRemindId(informRemind.getId());
+                                addBo.setReceiptStatus(0);
+                                addBo.setSystemStatus(1);
+                                addBo.setRemind("订单退款初审通过提醒");
+                                addBo.setGoodsId(goods.getGoodsId());
+                                addBo.setOrderGoodsId(refundGoods.getOrderGoodsId());
+                                addBo.setText(String.format("【%s】课程申请退款初审已通过,请尽快处理!",goods.getGoodsName()));
+                                iInformSysUserService.save(addBo);
+                            });
+                        }
+                    }
+                }
+            }
         }
 
         return true;

+ 7 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -1287,6 +1287,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean updateByEditBo(OrderEditBo bo) {
         Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderId, bo.getOrderId()));
         if (order.getOrderStatus() > 0) {
@@ -1302,7 +1303,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             //手动关闭订单
             OrderVo orderVo = this.queryById(bo.getOrderId());
             OrderGoodsQueryBo bo1 = new OrderGoodsQueryBo();
-            bo.setOrderSn(orderVo.getOrderSn());
+            bo1.setOrderSn(orderVo.getOrderSn());
             List<OrderGoodsVo> orderGoodsVoList = iOrderGoodsService.selectList(bo1);
             for (OrderGoodsVo g : orderGoodsVoList) {
                 //关闭锁定班级
@@ -1314,6 +1315,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     classGradeUserTemp.setStatus(ClassGradeUserTemp.STATUS_CLOSE);
                     classGradeUserTemp.setUpdateTime(DateUtils.getNowTime());
                     iClassGradeUserTempService.updateById(classGradeUserTemp);//关闭锁定状态
+
+                    //班级人数变动通知旧系统
+                    Goods goods = iGoodsService.getById(g.getGoodsId());
+                    iClassGradeService.gradeChangeEjjjPeople(goods.getBusinessId(),classGradeUserTemp.getGradeId());
                 }
             }
 
@@ -1740,7 +1745,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         //创建新班级
         CourseBusinessVo businessVo = iCourseBusinessService.queryById(businessId);
         boolean isConfigTp = false; //商品是否有配置选班模板
-        if (Validator.isNotEmpty(businessVo) && Validator.isNotEmpty(businessVo.getTemplateStatus()) && businessVo.getTemplateStatus() == 1) {
+        if (Validator.isNotEmpty(businessVo) && Validator.isNotEmpty(businessVo.getTemplateName()) && businessVo.getTemplateName().equals("班级")) {
             isConfigTp = true;
         }
         ClassGrade classGrade = new ClassGrade();

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

@@ -1942,6 +1942,9 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                 LambdaQueryWrapper<MockMajorSubjectTime> lqw2 = Wrappers.lambdaQuery();
                 lqw2.eq(MockMajorSubjectTime::getId, subscribeVo.getEachExamId());
                 MockMajorSubjectTime mockMajorSubjectTime = iMockMajorSubjectTimeService.getOne(lqw2);
+                if(Validator.isEmpty(mockMajorSubjectTime)){
+                    continue;
+                }
                 LambdaQueryWrapper<MockMajorSubject> lqw3 = Wrappers.lambdaQuery();
                 lqw3.eq(MockMajorSubject::getMockMajorSubjectId, mockMajorSubjectTime.getMockMajorSubjectId());
                 MockMajorSubject mockMajorSubject = iMockMajorSubjectService.getOne(lqw3);

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysConfigServiceImpl.java

@@ -4,8 +4,11 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zhongzheng.common.annotation.DataSource;
 import com.zhongzheng.common.constant.Constants;
@@ -13,9 +16,14 @@ import com.zhongzheng.common.constant.UserConstants;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.enums.DataSourceType;
 import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.system.domain.SysConfig;
+import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.mapper.SysConfigMapper;
 import com.zhongzheng.modules.system.service.ISysConfigService;
+import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.system.vo.SysConfigVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -36,6 +44,9 @@ public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    private ISysTenantService iSysTenantService;
+
     /**
      * 项目启动时,初始化参数到缓存
      */
@@ -147,6 +158,19 @@ public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig
         int row = baseMapper.updateById(sysConfig);
         if (row > 0) {
             redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+            if(config.getConfigKey().equals("home.mobile")){
+                /*JSONObject jsonObject = (JSONObject) JSONObject.parse(config.getConfigValue());
+                String hostPc = jsonObject.getString("hostPc");
+                String hostH5 = jsonObject.getString("hostH5");
+                String hostLive = jsonObject.getString("hostLive");
+                LambdaUpdateWrapper<SysTenant> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+                objectLambdaUpdateWrapper.eq(SysTenant::getTenantId, Long.valueOf(config.getTenantId()));
+                objectLambdaUpdateWrapper.set(SysTenant::getHostPc, hostPc);
+                objectLambdaUpdateWrapper.set(SysTenant::getHostH5, hostH5);
+                objectLambdaUpdateWrapper.set(SysTenant::getHostLive, hostLive);
+                objectLambdaUpdateWrapper.set(SysTenant::getUpdateTime, DateUtils.getNowTime());
+                iSysTenantService.update(null, objectLambdaUpdateWrapper);*/
+            }
         }
         return row;
     }

+ 3 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysWebServiceImpl.java

@@ -321,9 +321,9 @@ public class SysWebServiceImpl implements ISysWebService {
         config24.setTenantId(bo.getTenantId());
         config24.setConfigName("移动端配置");
         JSONObject jsonObject24 = new JSONObject();
-        jsonObject24.put("h5Logo",bo.getLogoH5Url());
-        jsonObject24.put("smallLogo",bo.getLogoSmallUrl());
-        jsonObject24.put("hostLive",bo.getHostLive());
+        jsonObject24.put("h5Logo","https://"+bo.getLogoH5Url());
+        jsonObject24.put("smallLogo","https://"+bo.getLogoSmallUrl());
+        jsonObject24.put("hostLive","https://"+bo.getHostLive());
         config24.setConfigKey("home.mobile");
         config24.setConfigValue(jsonObject24.toJSONString());
         config24.setConfigType("N");

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppRegisterBo.java

@@ -25,5 +25,7 @@ public class UserAppRegisterBo {
     private String shareCode;
     @ApiModelProperty("活动分销码")
     private String shareActivityCode;
+    @ApiModelProperty("身份证")
+    private String idcard;
 
 }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSystemRegisterBo.java

@@ -18,7 +18,7 @@ public class UserSystemRegisterBo {
     private String tel;
     /** 身份证号 */
     @ApiModelProperty("身份证号")
-    private String idCard;
+    private String idcard;
     /** 真实姓名 */
     @ApiModelProperty("真实姓名")
     private String realname;

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

@@ -48,4 +48,7 @@ public class WxLoginBody {
     @ApiModelProperty("活动分销码")
     private String shareActivityCode;
 
+    @ApiModelProperty("身份证号码")
+    private String idcard;
+
 }

+ 7 - 8
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java

@@ -359,22 +359,19 @@ public class WxPayServiceImpl implements IWxPayService {
 
     @Override
     public String paymentCallBack(String notifyData) {
-        initData();
         String xmlBack = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml> ";
-        WxSmallConfig config = new WxSmallConfig(appid, mchid, key);
         try {
-            WXPay wxpay = new WXPay(config);
-
             Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData);  // 转换成map
-
+            String TenantId = notifyMap.get("attach");
+            ServletUtils.getRequestAttributes().getResponse().setHeader("TenantId", TenantId);
+            initData();
+            WxSmallConfig config = new WxSmallConfig(appid, mchid, key);
+            WXPay wxpay = new WXPay(config);
             if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
                 String result_code = notifyMap.get("result_code");
                 if ("SUCCESS".equals(result_code)) {
                     String out_trade_no = notifyMap.get("out_trade_no");
                     String transaction_id = notifyMap.get("transaction_id");
-                    String TenantId = notifyMap.get("attach");
-                    ServletUtils.getRequestAttributes().getResponse().setHeader("TenantId", TenantId);
-
                     OrderPay orderPay = iOrderPayService.getOne(new LambdaQueryWrapper<OrderPay>().eq(OrderPay::getPaySn, out_trade_no));
                     if (Validator.isNotEmpty(orderPay)) {
                         String orderSn = orderPay.getOrderSn();
@@ -535,6 +532,7 @@ public class WxPayServiceImpl implements IWxPayService {
     public boolean shareToOldSys(Order order,List<OrderGoods> goodsList) {
         if (Validator.isNotEmpty(order)) {
             UserVo user = iUserService.queryById(order.getUserId());
+            log.info(JSONObject.toJSONString(user));
                 OrderShareToOldVo vo  = new OrderShareToOldVo();
                 vo.setOrderId(order.getOrderId());
                 vo.setSharecode(user.getShareCode());
@@ -567,6 +565,7 @@ public class WxPayServiceImpl implements IWxPayService {
                     shareGoodsVoList.add(shareGoodsVo);
                 }
                 vo.setGoodsList(shareGoodsVoList);
+                log.info(JSONObject.toJSONString(vo));
                 //分销下单
                 Map<String, String> params = new HashMap<>();
                 Long nowTime = DateUtils.getNowTime();

+ 37 - 60
zhongzheng-system/src/main/resources/mapper/modules/bank/ExamSimulateMapper.xml

@@ -43,39 +43,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 LEFT JOIN question q ON eq.question_id = q.question_id
         WHERE
             eq.exam_id = #{examId}
-        <if test="fromType != null and fromType == 1">
-            AND NOT FIND_IN_SET(
-            q.question_id,(
-            SELECT
-            IFNULL(GROUP_CONCAT( right_question_ids ),'')
-            FROM
-            user_exam_record uer
-            WHERE
-            order_goods_id = #{orderGoodsId} and exam_id = #{examId} and do_mode = 3
-            ))
-        </if>
-        <if test="fromType != null and fromType == 2">
-            AND NOT FIND_IN_SET(
-            q.question_id,(
-            SELECT
-            IFNULL(GROUP_CONCAT( right_question_ids ),'')
-            FROM
-            user_bank_record uer
-            WHERE
-            order_goods_id = #{orderGoodsId} and exam_id = #{examId} and do_mode = 3
-            ))
-        </if>
-        <if test="fromType != null and fromType == 3">
-            AND NOT FIND_IN_SET(
-            q.question_id,(
-            SELECT
-            IFNULL(GROUP_CONCAT( right_question_ids ),'')
-            FROM
-            user_mock_record uer
-            WHERE
-            order_goods_id = #{orderGoodsId} and exam_id = #{examId} and do_mode = 3
-            ))
-        </if>
         <if test="type != null and type != ''">
           AND q.`type` = #{type}
         </if>
@@ -103,38 +70,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN question q ON eq.question_id = q.question_id
         WHERE
         eq.exam_id = #{examId}
+        <if test="type != null and type != ''">
+            AND q.`type` = #{type}
+        </if>
+        <if test="knowledQuestionIds != null and knowledQuestionIds.size()!=0 ">
+            AND q.question_id not in
+            <foreach collection="knowledQuestionIds" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="wrongQuestionIds != null and wrongQuestionIds.size()!=0 ">
+            AND q.question_id not in
+            <foreach collection="wrongQuestionIds" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="randomNum == 1">
+            ORDER BY eq.sort,eq.id DESC
+        </if>
+        <if test=" randomNum == 2">
+            ORDER BY RAND()
+        </if>
+        LIMIT  #{qnum}
+    </select>
+
+    <select id="getWrongQuestionList" parameterType="com.zhongzheng.modules.bank.bo.ExamSimulateQueryBo" resultType="Long">
+        SELECT
+        DISTINCT q.question_id
+        FROM
+        user_exam_wrong_record uwr
+        LEFT JOIN question q ON uwr.question_id = q.question_id
+        WHERE
+        uwr.exam_id = #{examId}
+        AND uwr.order_goods_id = #{orderGoodsId}
+        AND uwr.do_mode = 3
         <if test="fromType != null and fromType == 1">
-            AND NOT FIND_IN_SET(
-            q.question_id,(
-            SELECT
-            IFNULL(GROUP_CONCAT( right_question_ids ),'')
-            FROM
-            user_exam_record uer
-            WHERE
-            order_goods_id = #{orderGoodsId} and exam_id = #{examId} and do_mode = 3
-            ))
+            AND uwr.course_type = 2
         </if>
         <if test="fromType != null and fromType == 2">
-            AND NOT FIND_IN_SET(
-            q.question_id,(
-            SELECT
-            IFNULL(GROUP_CONCAT( right_question_ids ),'')
-            FROM
-            user_bank_record uer
-            WHERE
-            order_goods_id = #{orderGoodsId} and exam_id = #{examId} and do_mode = 3
-            ))
+            AND uwr.course_type = 1
         </if>
         <if test="fromType != null and fromType == 3">
-            AND NOT FIND_IN_SET(
-            q.question_id,(
-            SELECT
-            IFNULL(GROUP_CONCAT( right_question_ids ),'')
-            FROM
-            user_mock_record uer
-            WHERE
-            order_goods_id = #{orderGoodsId} and exam_id = #{examId} and do_mode = 3
-            ))
+            AND uwr.course_type = 3
         </if>
         <if test="type != null and type != ''">
             AND q.`type` = #{type}

+ 3 - 1
zhongzheng-system/src/main/resources/mapper/modules/course/CourseBusinessMapper.xml

@@ -104,6 +104,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
     <select id="getBusinessByIdTenant" parameterType="map"  resultType="com.zhongzheng.modules.course.domain.CourseBusiness">
-        SELECT * FROM course_business WHERE id = #{businessId} and tenant_id = #{tenantId}
+        SELECT b.*,t.name as templateName FROM course_business b
+        LEFT JOIN order_input_template t ON b.template_status = t.id
+        WHERE b.id = #{businessId} and b.tenant_id = #{tenantId}
     </select>
 </mapper>

+ 3 - 0
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeInterfaceMapper.xml

@@ -14,5 +14,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateTime" column="update_time"/>
     </resultMap>
 
+    <select id="getInfterFaceByTenant" parameterType="map" resultType="com.zhongzheng.modules.grade.domain.ClassGradeInterface">
+        SELECT * FROM class_grade_interface WHERE `type` = #{type} AND tenant_id = #{tenantId}
+    </select>
 
 </mapper>

+ 9 - 2
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml

@@ -933,7 +933,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             u.id_card as idNum,
             u.telphone as mobile,
             u.company_name as companyName,
-            (SELECT og.create_time FROM order_goods og LEFT JOIN `order` o ON og.order_sn = o.order_sn WHERE og.goods_id = g.goods_id AND o.user_id = u.user_id) AS orderTimeLong,
+            (SELECT og.create_time FROM order_goods og LEFT JOIN `order` o ON og.order_sn = o.order_sn WHERE og.goods_id = g.goods_id AND o.user_id = u.user_id AND og.pay_status in (2, 3, 4)
+        AND og.refund_status !=2
+        ORDER BY og.create_time DESC LIMIT 1) AS orderTimeLong,
             cg.class_start_time as createTimeLong,
             cgu.official_status_time as doTimeLong,
             cgu.official_status as reportStatu,
@@ -1044,7 +1046,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
     <update id="UpGradeStatusByTenant" parameterType="com.zhongzheng.modules.grade.bo.ClassGradeOpenUpBo" >
-        update class_grade set class_status = #{classStatus},official_name = #{officialName},class_name = #{className},class_start_time = #{classStartTime},class_end_time = #{classEndTime}
+        update class_grade set class_status = #{classStatus},official_name = #{officialName},class_name = #{className},
+                               class_start_time = #{classStartTime},class_end_time = #{classEndTime},learning_status = #{learningStatus},learning_time_start = #{learningTimeStart}
         where 1 = 1
         <if test="gradeIds != null and gradeIds.size()!=0 ">
             AND grade_id in
@@ -1063,4 +1066,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </foreach>
         </if>
     </update>
+
+    <update id="UpGradeInterfaceByTenant" parameterType="com.zhongzheng.modules.grade.bo.ClassGradeOpenUpBo" >
+        update class_grade set interface_push_id = #{interfacePushId} where grade_id = #{gradeId}
+    </update>
 </mapper>

+ 4 - 4
zhongzheng-system/src/main/resources/mapper/modules/order/OrderGoodsRefundMapper.xml

@@ -164,16 +164,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and (u.realname like concat('%', #{searchKey}, '%') or u.id_card like concat('%', #{searchKey}, '%') or g.goods_name like concat('%', #{searchKey}, '%') or gr.order_sn = #{searchKey})
         </if>
         <if test="searchStartTime != null and searchStartTime !='' ">
-            AND og.create_time >=#{searchStartTime}
+            AND gr.create_time >=#{searchStartTime}
         </if>
         <if test="searchEndTime != null and searchEndTime !='' ">
-            AND #{searchEndTime} >= og.create_time
+            AND #{searchEndTime} >= gr.create_time
         </if>
         GROUP BY
         gr.order_sn
         ORDER BY
-        refund_id ASC,
-        create_time ASC
+        refund_id DESC,
+        create_time DESC
     </select>
 
     <select id="selectListByOrderSn" parameterType="com.zhongzheng.modules.order.bo.OrderGoodsRefundQueryBo" resultMap="OrderGoodsRefundVoResult">