瀏覽代碼

Merge branch 'dev'

yangdamao 9 月之前
父節點
當前提交
71383485ce
共有 26 個文件被更改,包括 763 次插入64 次删除
  1. 10 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/base/UserProfileController.java
  2. 1 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CaptchaController.java
  3. 10 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  4. 43 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java
  5. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/impl/AliSmsServiceImpl.java
  6. 20 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserCardEditBo.java
  7. 3 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/IUserProfileService.java
  8. 49 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java
  9. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  10. 30 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/CommonOrderBo.java
  11. 31 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/CommonWithoutOrderBo.java
  12. 13 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/GoodsByBusinessQuery.java
  13. 33 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/HandleStudyQuery.java
  14. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderExportNewBo.java
  15. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderGoodsMapper.java
  16. 2 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java
  17. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderGoodsService.java
  18. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java
  19. 6 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java
  20. 165 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  21. 54 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/HandleStudyVo.java
  22. 56 23
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderExportNewVo.java
  23. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserHandleImportBo.java
  24. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/User.java
  25. 70 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderGoodsMapper.xml
  26. 121 18
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml

+ 10 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/base/UserProfileController.java

@@ -10,6 +10,7 @@ import cn.hutool.core.lang.Validator;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.TokenService;
+import com.zhongzheng.modules.base.bo.UserCardEditBo;
 import com.zhongzheng.modules.base.vo.UserProfileExportGaiVo;
 import com.zhongzheng.modules.base.vo.UserProfileExportVo;
 import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportVo;
@@ -93,6 +94,15 @@ public class UserProfileController extends BaseController {
         return AjaxResult.success(iUserProfileService.queryById(id));
     }
 
+    /**
+     * 修改身份证正反面照片
+     */
+    @ApiOperation("修改身份证正反面照片")
+    @PostMapping("/edit/card")
+    public AjaxResult<Void> editUserCard(@RequestBody UserCardEditBo bo) {
+        return toAjax(iUserProfileService.editUserCard(bo) ? 1 : 0);
+    }
+
     /**
      * 修改填写资料审核
      */

+ 1 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CaptchaController.java

@@ -71,7 +71,7 @@ public class CaptchaController {
 	/**
 	 * 生成验证码
 	 */
-	@ApiOperation("获取验证码")
+	@ApiOperation("")
 	@DynamicResponseParameters(name = "CodeMapModel",properties = {
 			@DynamicParameter(name = "uuid",value = "验证码uuid"),
 			@DynamicParameter(name = "img",value = "验证码图片base64"),

+ 10 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -63,6 +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.CommonOrderBo;
 import com.zhongzheng.modules.order.bo.TopOldOrderRefundBo;
 import com.zhongzheng.modules.order.domain.Order;
 import com.zhongzheng.modules.order.domain.OrderGoods;
@@ -950,4 +951,13 @@ public class CommonController extends BaseController {
        List<ClassBusinessVo> list = iClassGradeService.getBusinessClassList(query);
         return getDataTable(list);
     }
+
+    @ApiOperation("外部下单接口")
+    @PostMapping("/common/free/order")
+    public AjaxResult<Void> commonWithoutOrder(@RequestBody CommonOrderBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            throw new CustomException("签名错误");
+        }
+        return AjaxResult.success(iOrderService.commonWithoutOrder(bo));
+    }
 }

+ 43 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -13,10 +13,11 @@ import com.zhongzheng.modules.course.vo.CourseEducationTypeVo;
 import com.zhongzheng.modules.goods.bo.GoodsFirstChoiceAddBo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.order.bo.*;
+import com.zhongzheng.modules.order.service.IOrderBusinessConfigGoodsService;
+import com.zhongzheng.modules.order.service.IOrderBusinessConfigService;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.service.IOrderService;
-import com.zhongzheng.modules.order.vo.OrderGoodsVo;
-import com.zhongzheng.modules.order.vo.OrderListVo;
+import com.zhongzheng.modules.order.vo.*;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -47,6 +48,10 @@ public class OrderController extends BaseController {
 
     private final ICourseEducationTypeService iCourseEducationTypeService;
 
+    private final IOrderBusinessConfigService iOrderBusinessConfigService;
+
+    private final IOrderBusinessConfigGoodsService iOrderBusinessConfigGoodsService;
+
     /**
      * 查询订单列表
      */
@@ -244,4 +249,40 @@ public class OrderController extends BaseController {
     public AjaxResult<GoodsVo> getCourseViewSign(@PathVariable("orderGoodsId") Long orderGoodsId) {
         return AjaxResult.success(iOrderGoodsService.getCourseViewSign(orderGoodsId));
     }
+
+    /**
+     * 查询录单配置列表
+     */
+    @ApiOperation("查询录单配置列表")
+    @GetMapping("/business/config/list")
+    public TableDataInfo<OrderBusinessConfigVo> list(OrderBusinessConfigQueryBo bo) {
+        startPage();
+        List<OrderBusinessConfigVo> list = iOrderBusinessConfigService.getList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询订单配置商品列表
+     */
+    @ApiOperation("查询订单配置商品列表")
+    @GetMapping("/business/goods/list")
+    public TableDataInfo<OrderBusinessConfigGoodsVo> list(OrderBusinessConfigGoodsQueryBo bo) {
+        startPage();
+        List<OrderBusinessConfigGoodsVo> list = iOrderBusinessConfigGoodsService.selectList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取经办订单学员学习进度
+     */
+    @ApiOperation("获取经办订单学员学习进度")
+    @GetMapping("/handle/study")
+    public TableDataInfo<HandleStudyVo> handleStudyList(HandleStudyQuery query) {
+        startPage();
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        query.setUserId(loginUser.getUser().getUserId());
+        List<HandleStudyVo> list = iOrderGoodsService.getHandleStudyList(query);
+        return getDataTable(list);
+    }
+
 }

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/impl/AliSmsServiceImpl.java

@@ -5,11 +5,13 @@ import cn.hutool.core.lang.Validator;
 import com.alibaba.fastjson.JSON;
 import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
+import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.SmsUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
@@ -17,6 +19,7 @@ import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.alisms.vo.ResultBean;
 import com.zhongzheng.modules.base.bo.SmsAddBo;
+import com.zhongzheng.modules.base.domain.Sms;
 import com.zhongzheng.modules.base.service.ISmsService;
 import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
 import com.zhongzheng.modules.system.domain.SysConfig;
@@ -127,6 +130,7 @@ public class AliSmsServiceImpl implements IAliSmsService {
 
     @Override
     public Boolean sendRegisterSms(String tel) {
+        checkCodeFrequency();
         initData();
         if(tel==null){
             throw new CustomException("手机号码不能为空");
@@ -194,6 +198,8 @@ public class AliSmsServiceImpl implements IAliSmsService {
 
     @Override
     public Boolean sendLoginSms(String tel) {
+        //校验短信频率
+        checkCodeFrequency();
         initData();
         if(tel==null){
             throw new CustomException("手机号码不能为空");
@@ -225,6 +231,22 @@ public class AliSmsServiceImpl implements IAliSmsService {
         return false;
     }
 
+    /**
+     * 校验短信发送频率(一个ip 60秒一次)
+     */
+    private void checkCodeFrequency() {
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        Sms sms = iSmsService.getOne(new LambdaQueryWrapper<Sms>().eq(Sms::getIp, ipAddr)
+                .orderByDesc(Sms::getCreateTime).last("limit 1"));
+        if (ObjectUtils.isNull(sms)){
+            return;
+        }
+        Long createTime = sms.getCreateTime();
+        if (DateUtils.getNowTime() - createTime < 60){
+            throw new CustomException("请在60秒后重试!");
+        }
+    }
+
     @Override
     public Boolean sendPwdSms(String tel,String code) {
         initData();

+ 20 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserCardEditBo.java

@@ -0,0 +1,20 @@
+package com.zhongzheng.modules.base.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class UserCardEditBo implements Serializable {
+
+    private Long id;
+
+    private Long userId;
+
+    private String idCard1;
+
+    private String idCard2;
+
+    private Integer degree;
+}

+ 3 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/IUserProfileService.java

@@ -1,14 +1,11 @@
 package com.zhongzheng.modules.base.service;
 
 import com.zhongzheng.common.core.domain.model.LoginUser;
-import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
+import com.zhongzheng.modules.base.bo.*;
 import com.zhongzheng.modules.base.domain.UserProfile;
 import com.zhongzheng.modules.base.vo.UserProfileExportGaiVo;
 import com.zhongzheng.modules.base.vo.UserProfileExportVo;
 import com.zhongzheng.modules.base.vo.UserProfileVo;
-import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
-import com.zhongzheng.modules.base.bo.UserProfileAddBo;
-import com.zhongzheng.modules.base.bo.UserProfileEditBo;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 
@@ -81,4 +78,6 @@ public interface IUserProfileService extends IService<UserProfile> {
 	Integer getProfileStatusNum(ConsoleQueryBo bo);
 
     UserProfile getByOrderGoodsIdNoTenant(Long orderGoodsId);
+
+	boolean editUserCard(UserCardEditBo bo);
 }

+ 49 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java

@@ -28,9 +28,7 @@ import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.impl.OssServiceImpl;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.base.bo.*;
-import com.zhongzheng.modules.base.vo.JsonBean;
-import com.zhongzheng.modules.base.vo.UserProfileExportGaiVo;
-import com.zhongzheng.modules.base.vo.UserProfileExportVo;
+import com.zhongzheng.modules.base.vo.*;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
@@ -60,7 +58,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.Page;
 import com.zhongzheng.modules.base.domain.UserProfile;
 import com.zhongzheng.modules.base.mapper.UserProfileMapper;
-import com.zhongzheng.modules.base.vo.UserProfileVo;
 import com.zhongzheng.modules.base.service.IUserProfileService;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -1075,6 +1072,54 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
         return baseMapper.getByOrderGoodsIdNoTenant(orderGoodsId);
     }
 
+    @Override
+    public boolean editUserCard(UserCardEditBo bo) {
+        UserProfile userProfile = getById(bo.getId());
+        if (ObjectUtils.isNull(userProfile)){
+            throw new CustomException("获取用户资料失败!");
+        }
+        User user = iUserService.getById(userProfile.getUserId());
+        if (ObjectUtils.isNull(user)){
+            throw new CustomException("用户信息获取失败!");
+        }
+        if (ObjectUtils.isNotNull(bo.getDegree())){
+            if (bo.getDegree() < 0){
+                //角度为负数
+                bo.setDegree(bo.getDegree() + 360);
+            }
+            //调整照片角度
+            if (ObjectUtils.isNotNull(bo.getIdCard1())){
+                ossService.processObject(bo.getIdCard1(),bo.getIdCard1(), String.format("image/rotate,%s", bo.getDegree()));
+            }
+            if (ObjectUtils.isNotNull(bo.getIdCard2())){
+                ossService.processObject(bo.getIdCard2(),bo.getIdCard2(), String.format("image/rotate,%s", bo.getDegree()));
+            }
+        }else {
+            //更换照片
+            String keyValue = userProfile.getKeyValue();
+            JsonBean jsonBean = JSON.parseObject(keyValue, JsonBean.class);
+            if (ObjectUtils.isNotNull(bo.getIdCard1())){
+                if (Validator.isNotEmpty(jsonBean.getIdcard_face_photo())) {
+                    Idcard_face_photo idcard1 = jsonBean.getIdcard_face_photo();
+                    idcard1.setValue(bo.getIdCard1());
+                }
+                user.setIdCardImg1(bo.getIdCard1());
+            }
+            if (ObjectUtils.isNotNull(bo.getIdCard2())){
+                if (Validator.isNotEmpty(jsonBean.getIdcard_national_photo())) {
+                    Idcard_national_photo idcard2 = jsonBean.getIdcard_national_photo();
+                    idcard2.setValue(bo.getIdCard2());
+                }
+                user.setIdCardImg2(bo.getIdCard2());
+            }
+            String jsonString = JSON.toJSONString(jsonBean);
+            userProfile.setKeyValue(jsonString);
+            updateById(userProfile);
+            iUserService.updateById(user);
+        }
+        return true;
+    }
+
     /**
      * url读取image转换为Base64字符串
      *

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -1461,6 +1461,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     public boolean checkEjjjPeopleNumLimit(Long businessId, Long gradeId) {
         //企业ID
         String tenant = ServletUtils.getRequest().getHeader("TenantId");
+        if (StringUtils.isBlank(tenant)){
+            tenant = ServletUtils.getResponse().getHeader("TenantId");
+        }
         SysOldOrg org = sysOldOrgService.list(new LambdaQueryWrapper<SysOldOrg>()
                 .eq(SysOldOrg::getTenantId, tenant)
                 .last("limit 1")).stream().findFirst().orElse(null);

+ 30 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/CommonOrderBo.java

@@ -0,0 +1,30 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2024年06月06日 15:23
+ */
+@Data
+public class CommonOrderBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("商户ID")
+    private String tenantId;
+
+    @ApiModelProperty("下单信息集合")
+    private List<CommonWithoutOrderBo> orderBos;
+}

+ 31 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/CommonWithoutOrderBo.java

@@ -0,0 +1,31 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CommonWithoutOrderBo implements Serializable {
+
+    @ApiModelProperty("学员名称")
+    private String userName;
+
+    @ApiModelProperty("学员身份证")
+    private String userCard;
+
+    @ApiModelProperty("学员手机号码")
+    private String userTel;
+
+    @ApiModelProperty("公司名称")
+    private String companyName;
+
+    @ApiModelProperty("业务层次")
+    private String businessName;
+
+    @ApiModelProperty("专业")
+    private String majorName;
+
+    @ApiModelProperty("年份")
+    private String year;
+}

+ 13 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/GoodsByBusinessQuery.java

@@ -0,0 +1,13 @@
+package com.zhongzheng.modules.order.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class GoodsByBusinessQuery implements Serializable {
+
+    private String businessName;
+    private String majorName;
+    private String year;
+}

+ 33 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/HandleStudyQuery.java

@@ -0,0 +1,33 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class HandleStudyQuery implements Serializable {
+
+    /** 分页大小 */
+    @ApiModelProperty("分页大小")
+    private Integer pageSize;
+    /** 当前页数 */
+    @ApiModelProperty("当前页数")
+    private Integer pageNum;
+    /** 排序列 */
+    @ApiModelProperty("排序列")
+    private String orderByColumn;
+    /** 排序的方向desc或者asc */
+    @ApiModelProperty(value = "排序的方向", example = "asc,desc")
+    private String isAsc;
+    @ApiModelProperty("")
+    private Long userId;
+    @ApiModelProperty("订单号")
+    private String orderSn;
+    @ApiModelProperty("学员姓名")
+    private String userName;
+    @ApiModelProperty("学员身份证")
+    private String userCard;
+    @ApiModelProperty("学员手机号")
+    private String userTel;
+}

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

@@ -4,10 +4,13 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.List;
 
 @Data
 public class OrderExportNewBo implements Serializable {
 
+    @ApiModelProperty("订单号集合")
+    private List<String> orderSnList;
     @ApiModelProperty("订单号")
     private String orderSn;
     @ApiModelProperty("订单开始时间")

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

@@ -5,10 +5,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.course.vo.CourseLiveVo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.vo.GoodsSectionListVo;
+import com.zhongzheng.modules.order.bo.HandleStudyQuery;
 import com.zhongzheng.modules.order.bo.MailOrderBo;
 import com.zhongzheng.modules.order.bo.OrderGoodsQueryBo;
 import com.zhongzheng.modules.order.bo.OrderQueryBo;
 import com.zhongzheng.modules.order.domain.OrderGoods;
+import com.zhongzheng.modules.order.vo.HandleStudyVo;
 import com.zhongzheng.modules.order.vo.MailOrderVo;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.top.goods.bo.TopOldOrderGoodsQuery;
@@ -92,4 +94,6 @@ public interface OrderGoodsMapper extends BaseMapper<OrderGoods> {
     int upBatchNumById(OrderGoods orderGoods);
 
     List<TopOldOrderRepDetailVo> listRepByOrderSn(TopOrderRepGoodsQueryBo queryBo);
+
+    List<HandleStudyVo> getHandleStudyList(HandleStudyQuery query);
 }

+ 2 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java

@@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.grade.bo.ClassGradeListBo;
 import com.zhongzheng.modules.grade.domain.ClassGrade;
-import com.zhongzheng.modules.order.bo.OrderExportNewBo;
-import com.zhongzheng.modules.order.bo.OrderGoodsQueryBo;
-import com.zhongzheng.modules.order.bo.OrderQueryBo;
-import com.zhongzheng.modules.order.bo.RepetitionOrderBo;
+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.vo.OrderExportNewVo;
@@ -82,4 +79,5 @@ public interface OrderMapper extends BaseMapper<Order> {
 
     List<RepetitionOrderVo> getSevenOrder(RepetitionOrderBo bo);
 
+    Long getGoodsIdByBusiness(GoodsByBusinessQuery query);
 }

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

@@ -10,6 +10,7 @@ import com.zhongzheng.modules.goods.vo.GoodsSectionListVo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.order.bo.*;
 import com.zhongzheng.modules.order.domain.OrderGoods;
+import com.zhongzheng.modules.order.vo.HandleStudyVo;
 import com.zhongzheng.modules.order.vo.MailOrderVo;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderUserGoodsVo;
@@ -148,4 +149,5 @@ public interface IOrderGoodsService extends IService<OrderGoods> {
 
     List<TopOldOrderRepDetailVo> listRepByOrderSn(TopOrderRepGoodsQueryBo queryBo);
 
+    List<HandleStudyVo> getHandleStudyList(HandleStudyQuery query);
 }

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

@@ -137,4 +137,5 @@ public interface IOrderService extends IService<Order> {
 
 	void handleRepetitionOrder(RepetitionOrderBo bo);
 
+    String commonWithoutOrder(CommonOrderBo bo);
 }

+ 6 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java

@@ -69,10 +69,7 @@ import com.zhongzheng.modules.order.mapper.OrderGoodsMapper;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.service.IOrderInputService;
 import com.zhongzheng.modules.order.service.IOrderService;
-import com.zhongzheng.modules.order.vo.MailOrderVo;
-import com.zhongzheng.modules.order.vo.OrderGoodsVo;
-import com.zhongzheng.modules.order.vo.OrderListVo;
-import com.zhongzheng.modules.order.vo.OrderUserGoodsVo;
+import com.zhongzheng.modules.order.vo.*;
 import com.zhongzheng.modules.polyv.bo.PolyvLiveQueryBo;
 import com.zhongzheng.modules.polyv.service.IPolyvLiveService;
 import com.zhongzheng.modules.system.domain.SysTenant;
@@ -1001,6 +998,11 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
         return baseMapper.listRepByOrderSn(queryBo);
     }
 
+    @Override
+    public List<HandleStudyVo> getHandleStudyList(HandleStudyQuery query) {
+        return baseMapper.getHandleStudyList(query);
+    }
+
     private boolean checkUnique(Long GoodsId,Long UserId) {
         ShoppingCart info = iShoppingCartService.getOne(new LambdaQueryWrapper<ShoppingCart>()
                 .eq(ShoppingCart::getUserId,UserId).eq(ShoppingCart::getGoodsId,GoodsId).last("limit 1"));

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

@@ -13,14 +13,14 @@ 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.constant.Constants;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.core.redis.RedisLockEntity;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
-import com.zhongzheng.common.utils.DateUtils;
-import com.zhongzheng.common.utils.ServletUtils;
-import com.zhongzheng.common.utils.ToolsUtils;
+import com.zhongzheng.common.utils.*;
 import com.zhongzheng.common.utils.http.HttpUtils;
+import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.modules.activity.domain.ActivityGoodsPrice;
 import com.zhongzheng.modules.activity.domain.ActivityOrder;
 import com.zhongzheng.modules.activity.service.IActivityGoodsPriceService;
@@ -2775,6 +2775,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         String businessFull = iGoodsService.getGoodsBusinessName(goodsId);
         Goods goods = iGoodsService.getById(goodsId);
         String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        if (StringUtils.isBlank(tenantId)){
+            tenantId = ServletUtils.getResponse().getHeader("TenantId");
+        }
         SysTenant sysTenant = iSysTenantService.getById(Long.valueOf(tenantId));
         String sevenYear = goods.getSevenYear();
         //指定班级
@@ -3481,6 +3484,165 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String commonWithoutOrder(CommonOrderBo bo) {
+        if (CollectionUtils.isEmpty(bo.getOrderBos())){
+            throw new CustomException("开单数据为空");
+        }
+        ServletUtils.getResponse().setHeader("TenantId",bo.getTenantId());
+        for (CommonWithoutOrderBo orderBo : bo.getOrderBos()) {
+            //确定用户信息
+            String userCard = orderBo.getUserCard();
+            User user = iUserService.getOne(new LambdaQueryWrapper<User>().eq(User::getIdCard, EncryptHandler.encrypt(userCard)));
+            if (ObjectUtils.isNull(user)){
+                //校验手机号码
+                int count = iUserService.count(new LambdaQueryWrapper<User>().eq(User::getTelphone, EncryptHandler.encrypt(orderBo.getUserTel())));
+                if (count > 0){
+                    throw new CustomException(String.format("【%s】该手机号码已绑定其他身份证,请修改",orderBo.getUserTel()));
+                }
+                //用户不存在创建用户信息
+                User data = new User();
+                data.setTelphone(orderBo.getUserTel());
+                //隐藏手机号作为初始昵称
+                data.setNickname(TelPhoneUtils.hideTelPhone(orderBo.getUserTel()));
+                //雪花算法产生账号ID
+                SnowflakeIdUtils idWorker = new SnowflakeIdUtils(3, 1);
+                data.setUserAccount(String.valueOf(idWorker.nextId()));
+                //性别
+                data.setSex(getGenderByIdCard(orderBo.getUserCard()));
+                data.setIdCard(orderBo.getUserCard());
+                data.setRealname(orderBo.getUserName());
+                data.setCompanyName(orderBo.getCompanyName());
+                data.setStatus(1);
+                data.setRegisterPlat("5");
+                data.setAvatar(Constants.DEFAULT_AVATAR);
+                data.setLastLoginTime(DateUtils.getNowTime());
+                data.setCreateTime(DateUtils.getNowTime());
+                data.setUpdateTime(DateUtils.getNowTime());
+                //初始密码(身份证后6位)
+                String idCard = orderBo.getUserCard();
+                String pwd =  idCard.substring(idCard.length() - 6); // 随机密码
+                data.setPasswordAes(EncryptHandler.encrypt(pwd));
+                data.setPassword(SecurityUtils.encryptPassword(pwd));
+                iUserService.save(data);
+                user = iUserService.getOne(new LambdaQueryWrapper<User>().eq(User::getIdCard, EncryptHandler.encrypt(userCard)));
+            }
+            //确认商品信息
+            GoodsByBusinessQuery query = new GoodsByBusinessQuery();
+            query.setBusinessName(orderBo.getBusinessName());
+            query.setMajorName(orderBo.getMajorName());
+            query.setYear(orderBo.getYear());
+            Long goodsId = baseMapper.getGoodsIdByBusiness(query);
+            if (ObjectUtils.isNull(goodsId)){
+                throw new CustomException("未正确匹配到课程");
+            }
+
+            //生成订单
+            Order add = new Order();
+            add.setCreateTime(DateUtils.getNowTime());
+            add.setUpdateTime(DateUtils.getNowTime());
+            add.setUserId(user.getUserId());
+            add.setOrderType(3);
+            add.setCreateUsername("外部接口开单");//
+            add.setOrderFrom(7);
+            //订单运营类型
+            add.setOperationType(2);
+            //生成订单号
+            String out_trade_no = DateUtils.getDateOrderSn();
+
+            //订单商品
+            Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId, goodsId));
+            checkBuyGoods(goods.getGoodsId(), user.getUserId(), goods.getGoodsType());
+            //校验是否有重复商品
+            if (StringUtils.isNotBlank(goods.getSevenYear())){
+                Long count = iOrderGoodsService.countOrderGoodsByYear(goods.getSevenYear(),goodsId,user.getUserId());
+                if (count > 0){
+                    throw new CustomException(goods.getGoodsName() + ",请勿重复购买相同年份的商品");
+                }
+            }
+            OrderGoods orderGoods = new OrderGoods();
+            orderGoods.setOrderSn(out_trade_no);
+            orderGoods.setGoodsId(goodsId);
+            orderGoods.setGoodsInputData("{}");
+            if (StringUtils.isNotBlank(goods.getSevenYear())){
+                orderGoods.setSevenYear(goods.getSevenYear());
+            }
+            //成交价
+            orderGoods.setGoodsPrice(goods.getStandPrice());
+            orderGoods.setGoodsRealPrice(goods.getStandPrice());
+            orderGoods.setGoodsYear(goods.getYear().toString());
+            orderGoods.setCreateTime(DateUtils.getNowTime());
+            orderGoods.setUpdateTime(DateUtils.getNowTime());
+
+            //订单价格不计算优惠
+            BigDecimal totalPrice = goods.getStandPrice();
+            //暂不计算优惠券
+            BigDecimal payPrice = goods.getStandPrice();
+            iOrderGoodsService.save(orderGoods);
+            //二建课程设置课程录像
+            setCourseVideo(user.getUserId(),goodsId,orderGoods.getOrderGoodsId());
+            //视频商品安排班级
+            if (goods.getGoodsType() == 1) {
+                if (Validator.isNotEmpty(goods.getStudyCount())) {
+                    orderGoods.setStudyCount(goods.getStudyCount() - 1); //默认消耗一次学习机会
+                } else {
+                    orderGoods.setStudyCount(0L);//没配置则为0
+                }
+
+                Long gradeId = null;
+
+                String requestId = IdUtil.simpleUUID();
+                RedisLockEntity redisLockEntity = new RedisLockEntity();
+                redisLockEntity.setLockKey(RedisLockEntity.KEY_LOCK_GRADE);
+                redisLockEntity.setRequestId(requestId);
+                boolean isArrange = false;
+                if (redisCache.lock(redisLockEntity)) {
+                    isArrange = arrangeGrade(goods.getGoodsName(), goods.getGoodsId(), orderGoods.getOrderGoodsId(), gradeId, user.getUserId(), out_trade_no, goods.getBusinessId());
+                    redisCache.unlockLua(redisLockEntity);
+                }
+                if (!isArrange) {
+                    throw new CustomException("分班错误");
+                }
+                iOrderGoodsService.updateById(orderGoods);
+            }
+
+            add.setOrderSn(out_trade_no);
+            add.setPayPrice(payPrice);
+            add.setOrderPrice(totalPrice);
+            //完全收费
+            add.setOrderStatus(Order.ORDER_STATUS_PAY);
+            add.setStatus(1);
+            this.save(add);
+            dealFreeGoods(orderGoods, add);
+        }
+
+        return "";
+    }
+
+    /**
+     * 根据身份证号码判断性别
+     *
+     * @param idCard 身份证号码
+     * @return "男" 或 "女"
+     */
+    private Integer getGenderByIdCard(String idCard) {
+        if (idCard == null || idCard.length() != 18) {
+            throw new IllegalArgumentException("无效的身份证号码");
+        }
+
+        // 获取第17位字符
+        char genderChar = idCard.charAt(16);
+
+        // 判断奇偶性
+        int genderDigit = Character.getNumericValue(genderChar);
+        if (genderDigit % 2 == 0) {
+            return 2;
+        } else {
+            return 1;
+        }
+    }
+
     private void questionOpen(User user, QuestionMerchant merchant,UserSubscribe userSubscribe,Long loginId,String loginName) {
         //商家商品
         Goods merGoods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>()

+ 54 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/HandleStudyVo.java

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

+ 56 - 23
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderExportNewVo.java

@@ -17,15 +17,29 @@ import java.math.BigDecimal;
  */
 @Data
 @ApiModel("订单视图对象")
-public class OrderExportNewVo implements Serializable {
+public class  OrderExportNewVo implements Serializable {
 
     /**
      * 订单时间
      */
-    @Excel(name = "订单时间")
-    @ApiModelProperty("订单时间")
+    @Excel(name = "订单号")
+    @ApiModelProperty("订单号")
+    private String orderSn;
+
+    /**
+     * 订单时间
+     */
+    @Excel(name = "下单时间")
+    @ApiModelProperty("下单时间")
     private String orderTime;
 
+    /**
+     * 订单状态
+     */
+    @Excel(name = "订单状态")
+    @ApiModelProperty("订单状态")
+    private String orderStatus;
+
     /**
      * 学员姓名
      */
@@ -50,43 +64,62 @@ public class OrderExportNewVo implements Serializable {
     @Excel(name = "公司名称")
     @ApiModelProperty("公司名称")
     private String companyName;
-    /**
-     * 订单编号
-     */
-    @Excel(name = "订单编号")
-    @ApiModelProperty("订单编号")
-    private String orderSn;
+
 
     /**
      * 商品名称
      */
-    @Excel(name = "商品名称")
-    @ApiModelProperty("商品名称")
+    @Excel(name = "课程名称")
+    @ApiModelProperty("课程名称")
     private String goodsName;
 
+    /**
+     * 年份
+     */
+    @Excel(name = "年份")
+    @ApiModelProperty("年份")
+    private String sevenYear;
+
+    /**
+     * 业务层次
+     */
+    @Excel(name = "业务层次")
+    @ApiModelProperty("业务层次")
+    private String businessName;
+
     /**
      * 报名岗位
      */
     @Excel(name = "报名岗位")
     @ApiModelProperty("报名岗位")
-    private String majorName;
+    private String categoryName;
 
     /**
-     * 商品年份
+     * 班级名称
      */
-    @Excel(name = "商品年份")
-    @ApiModelProperty("商品年份")
-    private String goodsYear;
+    @Excel(name = "班级名称")
+    @ApiModelProperty("班级名称")
+    private String className;
 
     /**
-     * 是否关闭过订单
+     * 班级状态
      */
-    @Excel(name = "订单是否关闭")
-    @ApiModelProperty("订单是否关闭")
-    private String orderStatus;
+    @Excel(name = "班级状态")
+    @ApiModelProperty("班级状态")
+    private String classStatus;
+
+    /**
+     * 班级结束时间
+     */
+    @Excel(name = "班级结束时间")
+    @ApiModelProperty("班级结束时间")
+    private String classEndTime;
 
-    @Excel(name = "是否学时复购冲突")
-    @ApiModelProperty("是否学时复购冲突")
-    private String studyStatus;
+    /**
+     * 学习进度
+     */
+    @Excel(name = "学习进度")
+    @ApiModelProperty("学习进度")
+    private String studySchedule;
 
 }

+ 10 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserHandleImportBo.java

@@ -50,4 +50,14 @@ public class UserHandleImportBo implements Serializable {
     @ApiModelProperty("经办公司")
     @Excel(name = "*所属公司")
     private String companyName;
+
+    /** 专业 */
+    @ApiModelProperty("专业")
+    @Excel(name = "专业")
+    private String majorName;
+
+    /** 年份 */
+    @ApiModelProperty("年份")
+    @Excel(name = "年份")
+    private String yearName;
 }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/User.java

@@ -102,7 +102,7 @@ private static final long serialVersionUID=1L;
 
     private String unionId;
 
-    /** 注册平台 1小程序 2网站 3后台 4老业务系统*/
+    /** 注册平台 1小程序 2网站 3后台 4老业务系统 5外部接口开单*/
     private String registerPlat;
 
     private String lastLoginIp;

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

@@ -1031,4 +1031,74 @@
             og.order_sn = #{orderSn}
           AND og.`status` = 1
     </select>
+
+    <select id="getHandleStudyList" parameterType="com.zhongzheng.modules.order.bo.HandleStudyQuery" resultType="com.zhongzheng.modules.order.vo.HandleStudyVo">
+        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 userTel,
+                u.company_name,
+                g.goods_name,
+                g.seven_year,
+                CONCAT(cet.education_name,cb.business_name,cpt.project_name) AS businessName,
+                m.category_name,
+                cg.class_name,
+                CASE
+                    WHEN cg.class_status = 1 THEN '已开班'
+                    WHEN cg.class_status = 0 THEN '未开班'
+                    ELSE '其他' END AS classStart,
+                FROM_UNIXTIME( cg.class_end_time, '%Y-%m-%d %H:%i:%s' ) AS classTime,
+                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_handle oh
+                LEFT JOIN `order` o ON oh.handle_order_sn = o.handle_order_sn
+                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
+	            AND oh.create_user_id = #{userId}
+        <if test="orderSn != null and orderSn != ''">
+            AND o.order_sn = #{orderSn}
+        </if>
+        <if test="userName != null and userName != ''">
+            AND u.realname LIKE CONCAT('%',#{userName},'%')
+        </if>
+        <if test="userCard != null and userCard != ''">
+            AND AES_DECRYPT(UNHEX(u.id_card),'base20230213zzkj')  = #{userCard}
+        </if>
+        <if test="userTel != null and userTel != ''">
+            AND AES_DECRYPT(UNHEX(u.telphone),'base20230213zzkj') = #{userTel}
+        </if>
+    </select>
 </mapper>

+ 121 - 18
zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml

@@ -735,34 +735,115 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </select>
 
+<!--    <select id="exportNew" resultType="com.zhongzheng.modules.order.vo.OrderExportNewVo"-->
+<!--            parameterType="com.zhongzheng.modules.order.bo.OrderExportNewBo">-->
+<!--        SELECT-->
+<!--            FROM_UNIXTIME( og.create_time, '%Y-%m-%d %H:%i:%s' ) AS orderTime,-->
+<!--            u.realname AS realname,-->
+<!--            AES_DECRYPT( UNHEX( u.id_card ), 'base20230213zzkj' ) AS idCard,-->
+<!--            AES_DECRYPT( UNHEX( u.telphone ), 'base20230213zzkj' ) AS telphone,-->
+<!--            u.company_name AS companyName,-->
+<!--            m.category_name AS majorName,-->
+<!--            g.seven_year AS goodsYear,-->
+<!--            CASE-->
+<!--            WHEN og.`status` = 1 THEN-->
+<!--            '否'-->
+<!--            WHEN og.`status` = 0 THEN-->
+<!--            '是' ELSE '其他'-->
+<!--            END AS orderStatus-->
+<!--        FROM-->
+<!--            order_goods og-->
+<!--        LEFT JOIN `order` o ON og.order_sn = o.order_sn-->
+<!--        LEFT JOIN `user` u ON o.user_id = u.user_id-->
+<!--        LEFT JOIN goods g ON og.goods_id = g.goods_id-->
+<!--        LEFT JOIN major m ON g.major_id = m.id-->
+<!--        WHERE-->
+<!--        og.refund_status != 2-->
+<!--        AND og.pay_status != 1-->
+<!--        <if test="orderSn != null and orderSn != ''">-->
+<!--            AND o.order_sn = #{orderSn}-->
+<!--        </if>-->
+<!--        <if test="orderStartTime != null and orderStartTime != ''">-->
+<!--            AND og.create_time <![CDATA[ >= ]]> #{orderStartTime}-->
+<!--        </if>-->
+<!--        <if test="orderEndTime != null and orderEndTime != ''">-->
+<!--            AND og.create_time <![CDATA[ <= ]]> #{orderEndTime}-->
+<!--        </if>-->
+<!--        <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="companyName != null and companyName != ''">-->
+<!--            AND u.company_name = #{companyName}-->
+<!--        </if>-->
+<!--    </select>-->
+
     <select id="exportNew" resultType="com.zhongzheng.modules.order.vo.OrderExportNewVo"
             parameterType="com.zhongzheng.modules.order.bo.OrderExportNewBo">
         SELECT
-            FROM_UNIXTIME( og.create_time, '%Y-%m-%d %H:%i:%s' ) AS orderTime,
-            u.realname AS realname,
-            AES_DECRYPT( UNHEX( u.id_card ), 'base20230213zzkj' ) AS idCard,
-            AES_DECRYPT( UNHEX( u.telphone ), 'base20230213zzkj' ) AS telphone,
-            u.company_name AS companyName,
-            m.category_name AS majorName,
-            g.seven_year AS goodsYear,
-            CASE
-            WHEN og.`status` = 1 THEN
-            '否'
-            WHEN og.`status` = 0 THEN
-            '是' ELSE '其他'
-            END AS orderStatus
+        o.order_sn,
+        FROM_UNIXTIME( og.create_time, '%Y-%m-%d %H:%i:%s' ) AS orderTime,
+        u.realname,
+        AES_DECRYPT(UNHEX(u.id_card),'base20230213zzkj') AS idCard,
+        AES_DECRYPT(UNHEX(u.telphone),'base20230213zzkj') AS telphone,
+        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 categoryName,
+        cg.class_name AS className,
+        CASE
+        WHEN cg.class_status = 1 THEN '已开班'
+        WHEN cg.class_status = 0 THEN '未开班'
+        ELSE '其他' END AS classStart,
+        FROM_UNIXTIME( cg.class_end_time, '%Y-%m-%d %H:%i:%s' ) AS classEndTime,
+        CASE
+        WHEN o.order_status = 0 THEN '待支付'
+        WHEN o.order_status = 1 THEN '已支付'
+        WHEN o.order_status = -1 OR o.order_status = -2 THEN '已关闭'
+        WHEN o.order_status = 3 OR o.order_status = 4 THEN '已退款'
+        ELSE '其他' END AS orderStatus,
+        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
-            order_goods og
-        LEFT JOIN `order` o ON og.order_sn = o.order_sn
-        LEFT JOIN `user` u ON o.user_id = u.user_id
+        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
-        og.refund_status != 2
-        AND og.pay_status != 1
+        1=1
+        AND og.`status` = 1
+        AND o.input_order_sn IS NULL
         <if test="orderSn != null and orderSn != ''">
             AND o.order_sn = #{orderSn}
         </if>
+        <if test="orderSnList != null and orderSnList.size()!=0">
+            AND o.order_sn in
+            <foreach collection="orderSnList" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
         <if test="orderStartTime != null and orderStartTime != ''">
             AND og.create_time <![CDATA[ >= ]]> #{orderStartTime}
         </if>
@@ -778,6 +859,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="companyName != null and companyName != ''">
             AND u.company_name = #{companyName}
         </if>
+        ORDER BY og.create_time DESC
     </select>
 
     <select id="getSevenOrder" parameterType="com.zhongzheng.modules.order.bo.RepetitionOrderBo"
@@ -806,4 +888,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </if>
     </select>
 
+    <select id="getGoodsIdByBusiness" parameterType="com.zhongzheng.modules.order.bo.GoodsByBusinessQuery" resultType="java.lang.Long">
+        SELECT
+            g.goods_id
+        FROM
+            goods g
+                LEFT JOIN course_business cb ON g.business_id = cb.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 major m ON g.major_id = m.id
+        WHERE
+            g.`status` = 1
+            AND g.goods_status = 1
+            AND INSTR( CONCAT( cet.education_name, cb.business_name, cpt.project_name ), #{businessName} )
+            AND m.category_name = #{majorName}
+            <if test="year != null and year != ''">
+                AND g.seven_year = #{year}
+            </if>
+            ORDER BY g.create_time DESC
+            LIMIT 1
+    </select>
+
 </mapper>