Quellcode durchsuchen

Merge branch 'dev'

yangdamao vor 7 Monaten
Ursprung
Commit
16f2b3d4d8

+ 13 - 5
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -63,10 +63,7 @@ import com.zhongzheng.modules.grade.vo.ClassBusinessVo;
 import com.zhongzheng.modules.grade.vo.ClassGradeUserVo;
 import com.zhongzheng.modules.grade.vo.ClassPeriodStudentVo;
 import com.zhongzheng.modules.grade.vo.SyncGoodsExport;
-import com.zhongzheng.modules.order.bo.CommonGradeBo;
-import com.zhongzheng.modules.order.bo.CommonOrderBo;
-import com.zhongzheng.modules.order.bo.CommonOrderInfoBo;
-import com.zhongzheng.modules.order.bo.TopOldOrderRefundBo;
+import com.zhongzheng.modules.order.bo.*;
 import com.zhongzheng.modules.order.domain.Order;
 import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.order.service.IOrderGoodsRefundService;
@@ -75,6 +72,7 @@ import com.zhongzheng.modules.order.service.IOrderService;
 import com.zhongzheng.modules.order.vo.CommonGradeVo;
 import com.zhongzheng.modules.order.vo.CommonOrderInfoVo;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
+import com.zhongzheng.modules.order.vo.UserStudyConditionVo;
 import com.zhongzheng.modules.sdk.service.IZsBankService;
 import com.zhongzheng.modules.system.bo.SysTenantAdminBo;
 import com.zhongzheng.modules.system.bo.SysTenantAdminOldBo;
@@ -958,7 +956,7 @@ public class CommonController extends BaseController {
 
     @ApiOperation("外部下单接口")
     @PostMapping("/common/free/order")
-    public AjaxResult<Void> commonWithoutOrder(@RequestBody CommonOrderBo bo) {
+    public AjaxResult<List<String>> commonWithoutOrder(@RequestBody CommonOrderBo bo) {
         if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
             throw new CustomException("签名错误");
         }
@@ -986,4 +984,14 @@ public class CommonController extends BaseController {
         List<CommonOrderInfoVo> list = iOrderService.getCommonOrderInfo(bo);
         return AjaxResult.success(list);
     }
+
+    @ApiOperation("获取学员学习进度")
+    @PostMapping("/common/free/user/study")
+    public AjaxResult<List<UserStudyConditionVo>> getUserStudyCondition(@RequestBody UserStudyConditionBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            throw new CustomException("签名错误");
+        }
+        List<UserStudyConditionVo> list = iOrderService.getUserStudyCondition(bo);
+        return AjaxResult.success(list);
+    }
 }

+ 33 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/SynchronizationController.java

@@ -0,0 +1,33 @@
+package com.zhongzheng.controller.common;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.modules.user.service.IUserService;
+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.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 同步旧系统数据专业接口
+ */
+@RestController
+@RequestMapping("/common/synchronization")
+public class SynchronizationController  extends BaseController {
+    private static final Logger log = LoggerFactory.getLogger(SynchronizationController.class);
+
+    @Autowired
+    private IUserService iUserService;
+
+    @ApiOperation("同步用户信息")
+    @GetMapping("user/info/{orgId}")
+    public AjaxResult synchronizationUser(@PathVariable("orgId") Integer orgId) {
+        iUserService.synchronizationUser(orgId);
+        return AjaxResult.success();
+    }
+
+}

+ 11 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -77,6 +77,17 @@ public class OrderController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询订单列表
+     */
+    @ApiOperation("查询订单列表")
+    @GetMapping("/without/list")
+    public TableDataInfo<OrderListVo> withoutOrderList(OrderQueryBo bo) {
+        startPage();
+        List<OrderListVo> list = iOrderService.withoutOrderList(bo);
+        return getDataTable(list);
+    }
+
     @ApiOperation("导出订单列表")
     @GetMapping("/exportList")
     public AjaxResult<OrderListExportVo> exportList(OrderQueryBo bo) {

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

@@ -7,6 +7,7 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -57,6 +58,7 @@ import com.zhongzheng.modules.course.service.IMajorService;
 import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsService;
+import com.zhongzheng.modules.goods.vo.SynchUserVo;
 import com.zhongzheng.modules.goods.vo.UserNewGoodsVo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
@@ -188,6 +190,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     private String OLD_GOODS;
     @Value("${record.downloadPath}")
     private String RECORD_DOWNLOAD;
+//    @Value("${oldSys.userInfo}")
+    private String OLD_USERINFO;
 
 
     @Override
@@ -2313,6 +2317,34 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 .orderByDesc(UserVisitLog::getCreateTime));
     }
 
+    @Override
+    public void synchronizationUser(Integer orgId) {
+        //获取旧系统用户数据信息
+        Map<String, String> params = new HashMap<>();
+        Long nowTime = DateUtils.getNowTime();
+        String sign = ToolsUtils.EncoderByMd5(orgId.toString()+nowTime);
+        params.put("stamp", nowTime.toString());
+        params.put("sign", sign);
+        String respone = "";
+        try {
+            respone = HttpUtils.postFormBody(OLD_USERINFO, params);
+            if (!respone.contains("\"Status\":true")) {
+                throw new CustomException("获取用户接口失败");
+            }
+            JSONObject jsonObject = JSONObject.parseObject(respone);
+            Object data = jsonObject.get("data");
+            if (ObjectUtils.isNotNull(data)){
+                List<SynchUserVo> synchUserVos = JSONArray.parseArray(JSONObject.toJSONString(data), SynchUserVo.class);
+                if (CollectionUtils.isEmpty(synchUserVos)){
+                    throw new CustomException("用户数据解析失败");
+                }
+                //保存用户信息
+            }
+        }catch (Exception e){
+            throw new CustomException(e.getMessage());
+        }
+    }
+
     private String getTelPhone(){
         String mobile = TelPhoneUtils.createMobile();
         int count = count(new LambdaQueryWrapper<User>().eq(User::getIdCard, EncryptHandler.encrypt(mobile)));

+ 23 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/SynchUserVo.java

@@ -0,0 +1,23 @@
+package com.zhongzheng.modules.goods.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class SynchUserVo implements Serializable {
+
+    private String companyname;
+    private String headimagesrc;
+    private String mobile;
+    private Long userid;
+    private String workyears;
+    private String idcardphotosrc2;
+    private String school;
+    private String sex;
+    private String education;
+    private String idcardphotosrc;
+    private String pwd;
+    private String idcode;
+    private String username;
+}

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

@@ -612,7 +612,7 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
                 classGradeUser1.setFinishStatus(1);
             }
             if (Validator.isNotEmpty(classPeriodStudentVo.getClassEndTime()) && Validator.isNotEmpty(classPeriodStudentVo.getClassStartTime())) {
-                if (nowTime < classPeriodStudentVo.getClassEndTime() && nowTime > classPeriodStudentVo.getClassStartTime()) {
+                if (nowTime < (classPeriodStudentVo.getClassEndTime() + 2592000L) && nowTime > classPeriodStudentVo.getClassStartTime()) {
                     classGradeUser1.setFinishStatus(1);
                 }
             }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/UserPeriodServiceImpl.java

@@ -541,7 +541,7 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
             objectLambdaUpdateWrapper.set(ClassGradeUser::getFinishStatus, 1);
         }
         if (Validator.isNotEmpty(classPeriodStudentVo.getClassEndTime()) && Validator.isNotEmpty(classPeriodStudentVo.getClassStartTime())) {
-            if (nowTime < classPeriodStudentVo.getClassEndTime() && nowTime > classPeriodStudentVo.getClassStartTime()) {
+            if (nowTime < (classPeriodStudentVo.getClassEndTime() + 2592000L) && nowTime > classPeriodStudentVo.getClassStartTime()) {
                 objectLambdaUpdateWrapper.set(ClassGradeUser::getFinishStatus, 1);
             }
         }

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/UserStudyConditionBo.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+public class UserStudyConditionBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("商户ID")
+    private String tenantId;
+
+    private String userCard;
+
+    private String userName;
+
+    private String companyName;
+
+    private String businessName;
+
+    private String majorName;
+}

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java

@@ -83,4 +83,9 @@ public interface OrderMapper extends BaseMapper<Order> {
     List<OfflineOrderVo> getOfflineOrderList(OfflineOrderBo bo);
 
     List<CommonOrderInfoVo> getCommonOrderInfo(CommonOrderInfoBo bo);
+
+    List<OrderListVo> selectWithoutListByBo(OrderQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<UserStudyConditionVo> getUserStudyCondition(UserStudyConditionBo bo);
 }

+ 5 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java

@@ -137,7 +137,7 @@ public interface IOrderService extends IService<Order> {
 
 	void handleRepetitionOrder(RepetitionOrderBo bo);
 
-    String commonWithoutOrder(CommonOrderBo bo);
+    List<String> commonWithoutOrder(CommonOrderBo bo);
 
 	List<CommonGradeVo> getCommonGrade(CommonGradeBo bo);
 
@@ -146,4 +146,8 @@ public interface IOrderService extends IService<Order> {
 	boolean checkOfflineOrder(OfflineOrderCheckBo bo);
 
     List<CommonOrderInfoVo> getCommonOrderInfo(CommonOrderInfoBo bo);
+
+	List<OrderListVo> withoutOrderList(OrderQueryBo bo);
+
+	List<UserStudyConditionVo> getUserStudyCondition(UserStudyConditionBo bo);
 }

+ 44 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -3487,7 +3487,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public String commonWithoutOrder(CommonOrderBo bo) {
+    public List<String> commonWithoutOrder(CommonOrderBo bo) {
+        List<String> orderSns = new ArrayList<>();
         if (CollectionUtils.isEmpty(bo.getOrderBos())){
             throw new CustomException("开单数据为空");
         }
@@ -3555,7 +3556,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             add.setOperationType(2);
             //生成订单号
             String out_trade_no = DateUtils.getDateOrderSn();
-
+            orderSns.add(out_trade_no);
             //订单商品
             Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId, goodsId));
             checkBuyGoods(goods.getGoodsId(), user.getUserId(), goods.getGoodsType());
@@ -3622,7 +3623,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             dealFreeGoods(orderGoods, add);
         }
 
-        return "";
+        return orderSns;
     }
 
     @Override
@@ -3717,6 +3718,46 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         return infoVos;
     }
 
+    @Override
+    public List<OrderListVo> withoutOrderList(OrderQueryBo bo) {
+        if (Validator.isNotEmpty(bo.getOrderGoodsStatus())) {
+            if (bo.getOrderGoodsStatus() == -1) {
+                Integer[] orderStatus = new Integer[]{-2, -1};
+                bo.setOrderStatus(orderStatus);
+            } else if (bo.getOrderGoodsStatus() == 0) {
+                bo.setGoodsPayStatus(1);
+            } else if (bo.getOrderGoodsStatus() == 1) {
+                //已支付 sql实现
+            } else if (bo.getOrderGoodsStatus() == 2) {
+                bo.setRefundStatus(2);
+            }
+        }
+        List<OrderListVo> orderListVos = this.baseMapper.selectWithoutListByBo(bo);
+        for (OrderListVo vo : orderListVos) {
+            if (Validator.isNotEmpty(vo.getRebuyOrderGoodsId()) && vo.getRebuyOrderGoodsId().longValue() > 0) {
+                vo.setRebuy(this.baseMapper.getGradePeriod(vo.getRebuyOrderGoodsId(), vo.getUserId()));
+            }
+            //商品订单状态 -1关闭 0待支付 1已支付 2已退款
+            if (Validator.isEmpty(vo.getRefundStatus())) {
+                vo.setOrderGoodsStatus(-1);
+            } else if (vo.getRefundStatus() == 2) {
+                vo.setOrderGoodsStatus(2);
+            } else if (vo.getOrderStatus() < 0) {
+                vo.setOrderGoodsStatus(-1);
+            } else if (vo.getGoodsPayStatus() == 1) {
+                vo.setOrderGoodsStatus(0);
+            } else if (vo.getGoodsPayStatus() > 1) {
+                vo.setOrderGoodsStatus(1);
+            }
+        }
+        return orderListVos;
+    }
+
+    @Override
+    public List<UserStudyConditionVo> getUserStudyCondition(UserStudyConditionBo bo) {
+        return baseMapper.getUserStudyCondition(bo);
+    }
+
     /**
      * 根据身份证号码判断性别
      *

+ 53 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/UserStudyConditionVo.java

@@ -0,0 +1,53 @@
+package com.zhongzheng.modules.order.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+public class UserStudyConditionVo implements Serializable {
+
+    @ApiModelProperty("订单号")
+    private String orderSn;
+
+    @ApiModelProperty("下单时间")
+    private String orderTime;
+
+    @ApiModelProperty("学员姓名")
+    private String userName;
+
+    @ApiModelProperty("身份证号码")
+    private String userCard;
+
+    @ApiModelProperty("手机号码")
+    private String userPhone;
+
+    @ApiModelProperty("公司名称")
+    private String companyName;
+
+    @ApiModelProperty("课程名称")
+    private String goodsName;
+
+    @ApiModelProperty("年份")
+    private String sevenYear;
+
+    @ApiModelProperty("业务层次")
+    private String businessName;
+
+    @ApiModelProperty("专业")
+    private String majorName;
+
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    @ApiModelProperty("班级状态")
+    private String classStatus;
+
+    @ApiModelProperty("班级结束时间")
+    private String classEndTime;
+
+    @ApiModelProperty("学习进度")
+    private String studySchedule;
+}

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

@@ -185,4 +185,7 @@ public interface IUserService extends IService<User> {
 	void account_loginOutRecord(UserAppAccountLoginOutBo bo);
 
 	List<UserVisitLog> getControlsRecord(UserRecordQueryBo bo);
+
+    void synchronizationUser(Integer orgId);
+
 }

+ 189 - 0
zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml

@@ -1041,4 +1041,193 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </if>
     </select>
 
+    <select id="selectWithoutListByBo" parameterType="com.zhongzheng.modules.order.bo.OrderQueryBo" resultMap="OrderResultVo">
+        SELECT
+        o.*,
+        g.goods_id,
+        g.goods_name,
+        g.year,
+        g.cover_url,
+        g.code,
+        g.goods_type,
+        og.goods_price,
+        og.rebuy_order_goods_id,
+        og.order_goods_id,
+        og.goods_real_price,
+        og.offline_refund_sign,
+        u.telphone,
+        u.realname,
+        u.id_card,
+        u.company_name,
+        cet.education_name,
+        cpt.project_name,
+        cb.business_name,
+        s.school_name,
+        m.category_name,
+        og.goods_received,
+        og.refund_status,
+        og.pay_status as goods_pay_status,
+        (select cgu.period_plush from  class_grade_user cgu where cgu.grade_id = og.grade_id and cgu.order_goods_id = og.order_goods_id and cgu.user_id = o.user_id limit 1 ) period_plush,
+        (SELECT oi.invoice_status FROM order_invoice oi LEFT JOIN order_invoice_order oio ON oio.invoice_id = oi.invoice_id WHERE
+        oio.order_goods_id = og.order_goods_id AND oi.period_status != 2 limit 1) invoice_status
+        FROM
+        `order` o
+        LEFT JOIN order_goods og ON o.order_sn = og.order_sn
+        LEFT JOIN goods g ON og.goods_id = g.goods_id
+        LEFT JOIN `user` u ON o.user_id = u.user_id
+        LEFT JOIN course_education_type cet ON g.education_type_id = cet.id
+        LEFT JOIN course_project_type cpt ON g.project_id = cpt.id
+        LEFT JOIN course_business cb ON g.business_id = cb.id
+        LEFT JOIN school s ON s.id = g.school_id
+        LEFT JOIN major m ON g.major_id = m.id
+        WHERE 1=1
+            AND o.order_type = 3
+        <if test="educationTypeId != null and educationTypeId != ''">
+            AND g.education_type_id = #{educationTypeId}
+        </if>
+        <if test="businessId != null and businessId != ''">
+            AND g.business_id = #{businessId}
+        </if>
+        <if test="schoolId != null and schoolId != ''">
+            AND g.school_id = #{schoolId}
+        </if>
+        <if test="majorId != null and majorId != ''">
+            AND g.major_id = #{majorId}
+        </if>
+        <if test="orderSn != null and orderSn != ''">
+            AND o.order_sn = #{orderSn}
+        </if>
+        <if test="orderStatus != null ">
+            AND o.order_status in
+            <foreach collection="orderStatus" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="status != null ">
+            AND o.status in
+            <foreach collection="status" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="orderGoodsStatus == 1">
+            AND og.pay_status in (2,3,4) AND og.refund_status != 2
+        </if>
+        <if test="startTime != null">
+            AND o.create_time >= #{startTime}
+        </if>
+        <if test="endTime != null">
+            AND #{endTime} >= o.create_time
+        </if>
+        <if test="payStatus != null">
+            AND o.pay_status = #{payStatus}
+        </if>
+        <if test="goodsPayStatus != null">
+            AND og.pay_status = #{goodsPayStatus}
+        </if>
+        <if test="refundStatus != null">
+            AND og.refund_status = #{refundStatus}
+        </if>
+        <if test="goodsType != null">
+            AND g.goods_type = #{goodsType}
+        </if>
+        <if test="userId != null">
+            AND u.user_id = #{userId}
+            AND og.pay_status in (2,3,4)
+        </if>
+        <if test="inputOrderSn != null">
+            AND o.input_order_sn = #{inputOrderSn}
+        </if>
+        <if test="companyName != null and companyName != ''">
+            AND u.company_name like concat('%', #{companyName}, '%')
+        </if>
+        <if test="searchKey != null and searchKey != ''">
+            AND (u.realname like concat('%', #{searchKey}, '%') or o.order_sn = #{searchKey} or AES_DECRYPT(UNHEX(u.id_card),'base20230213zzkj') = #{searchKey} or g.goods_name like concat('%', #{searchKey}, '%'))
+        </if>
+        <if test="orderGoodsIds != null ">
+            AND og.order_goods_id in
+            <foreach collection="orderGoodsIds" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="orderFroms != null and orderFroms.size()!=0">
+            AND o.order_from in
+            <foreach collection="orderFroms" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        ORDER BY o.order_id DESC
+    </select>
+
+    <select id="getUserStudyCondition" parameterType="com.zhongzheng.modules.order.bo.UserStudyConditionBo" resultType="com.zhongzheng.modules.order.vo.UserStudyConditionVo">
+        SELECT
+        o.order_sn,
+        FROM_UNIXTIME( og.create_time, '%Y-%m-%d %H:%i:%s' ) AS orderTime,
+        u.realname AS userName,
+        AES_DECRYPT(UNHEX(u.id_card),'base20230213zzkj') AS userCard,
+        AES_DECRYPT(UNHEX(u.telphone),'base20230213zzkj') AS userPhone,
+        u.company_name AS companyName,
+        g.goods_name AS goodsName,
+        g.seven_year AS sevenYear,
+        CONCAT(cet.education_name,cb.business_name,cpt.project_name) AS businessName,
+        m.category_name AS majorName,
+        cg.class_name AS className,
+        CASE
+        WHEN cg.class_status = 1 THEN '已开班'
+        WHEN cg.class_status = 0 THEN '未开班'
+        ELSE '其他' END AS classStatus,
+        FROM_UNIXTIME( cg.class_end_time, '%Y-%m-%d %H:%i:%s' ) AS classEndTime,
+        CONCAT((
+        ((SELECT COUNT(DISTINCT ubr.module_id,ubr.chapter_id,ubr.exam_id) FROM user_bank_record ubr  where ubr.`status`=1 and ubr.report_status=1 and ubr.grade_id = og.grade_id and ubr.order_goods_id = og.order_goods_id and ubr.user_id = cgu.user_id and ubr.current_status = 1) +
+        (
+        SELECT
+        COUNT( DISTINCT course_id, module_id, chapter_id, section_id )
+        FROM
+        user_study_record
+        WHERE
+        current_status = 1
+        AND grade_id = og.grade_id
+        AND order_goods_id = og.order_goods_id
+        AND user_id = o.user_id
+        AND status = 1
+        AND goods_id = og.goods_id
+        ))
+        ),"/",og.course_num + og.exam_num) AS studySchedule
+        FROM
+        `order` o
+        LEFT JOIN order_goods og ON o.order_sn = og.order_sn
+        LEFT JOIN goods g ON og.goods_id = g.goods_id
+        LEFT JOIN course_education_type cet ON g.education_type_id = cet.id
+        LEFT JOIN course_project_type cpt ON g.project_id = cpt.id
+        LEFT JOIN course_business cb ON g.business_id = cb.id
+        LEFT JOIN major m ON g.major_id = m.id
+        LEFT JOIN `user` u ON o.user_id = u.user_id
+        LEFT JOIN class_grade_user cgu ON og.order_goods_id = cgu.order_goods_id
+        LEFT JOIN class_grade cg ON cgu.grade_id = cg.grade_id
+        WHERE
+        1=1
+        AND og.pay_status != 1
+        AND og.refund_status != 2
+        AND o.`status` = 1
+        AND og.`status` = 1
+        AND cgu.`status` = 1
+        <if test="tenantId != null and tenantId != ''">
+            AND o.tenant_id = #{tenantId}
+        </if>
+        <if test="userCard != null and userCard != ''">
+            AND AES_DECRYPT(UNHEX(u.id_card),'base20230213zzkj') = #{userCard}
+        </if>
+        <if test="userName != null and userName != ''">
+            AND u.realname = #{userName}
+        </if>
+        <if test="companyName != null and companyName != ''">
+            AND u.company_name = #{companyName}
+        </if>
+        <if test="businessName != null and businessName != ''">
+            AND INSTR(CONCAT(cet.education_name,cb.business_name,cpt.project_name),#{businessName})
+        </if>
+        <if test="majorName != null and majorName != ''">
+            AND m.category_name = #{majorName}
+        </if>
+    </select>
+
 </mapper>