Jelajahi Sumber

submit20241212

yangdamao 9 bulan lalu
induk
melakukan
928d0bf594
20 mengubah file dengan 550 tambahan dan 43 penghapusan
  1. 1 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CaptchaController.java
  2. 10 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  3. 43 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java
  4. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/impl/AliSmsServiceImpl.java
  5. 31 28
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  6. 30 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/CommonOrderBo.java
  7. 31 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/CommonWithoutOrderBo.java
  8. 13 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/GoodsByBusinessQuery.java
  9. 33 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/HandleStudyQuery.java
  10. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderGoodsMapper.java
  11. 2 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java
  12. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderGoodsService.java
  13. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java
  14. 6 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java
  15. 165 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  16. 54 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/HandleStudyVo.java
  17. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserHandleImportBo.java
  18. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/User.java
  19. 70 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderGoodsMapper.xml
  20. 21 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml

+ 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;
@@ -949,4 +950,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();

+ 31 - 28
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);
@@ -1611,34 +1614,34 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
         if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
             //继教二建或者继教二造班级
-//            ClassGradeVo gradeVo = queryById(gradeId);
-//            if (Validator.isNotEmpty(gradeVo) && Validator.isNotEmpty(gradeVo.getOfficialName())) {
-//                ClassGradeQueryBo queryBo = new ClassGradeQueryBo();
-//                queryBo.setOfficialName(gradeVo.getOfficialName());
-//                Integer num = queryOfficialGradeCount(queryBo);
-//                List<GradeChangeEjjjPeopleBo> boList = new ArrayList<>();
-//                GradeChangeEjjjPeopleBo bo = new GradeChangeEjjjPeopleBo();
-//                bo.setOfficialName(gradeVo.getOfficialName());
-//                bo.setNum(num);
-//                boList.add(bo);
-//                //通知旧系统
-//                Map<String, String> params = new HashMap<>();
-//                Long nowTime = DateUtils.getNowTime();
-//                String sign = ToolsUtils.EncoderByMd5(nowTime.toString() + "pubilc2022");
-//                params.put("stamp", nowTime.toString());
-//                params.put("sign", sign);
-//                params.put("jsonstr", JSONArray.toJSONString(boList));
-//                String respone = "";
-//                try {
-//                    respone = HttpUtils.postFormBody(GRADE_CHANGE_PATH, params);
-//                    log.info("同步系统班级人数结果" + respone, "");
-//                    if (!respone.contains("\"Status\":true")) {
-//                        throw new CustomException("旧系统接口请求错误" + respone);
-//                    }
-//                } catch (IOException e) {
-//                    throw new CustomException("旧系统接口请求错误" + e.getMessage());
-//                }
-//            }
+            ClassGradeVo gradeVo = queryById(gradeId);
+            if (Validator.isNotEmpty(gradeVo) && Validator.isNotEmpty(gradeVo.getOfficialName())) {
+                ClassGradeQueryBo queryBo = new ClassGradeQueryBo();
+                queryBo.setOfficialName(gradeVo.getOfficialName());
+                Integer num = queryOfficialGradeCount(queryBo);
+                List<GradeChangeEjjjPeopleBo> boList = new ArrayList<>();
+                GradeChangeEjjjPeopleBo bo = new GradeChangeEjjjPeopleBo();
+                bo.setOfficialName(gradeVo.getOfficialName());
+                bo.setNum(num);
+                boList.add(bo);
+                //通知旧系统
+                Map<String, String> params = new HashMap<>();
+                Long nowTime = DateUtils.getNowTime();
+                String sign = ToolsUtils.EncoderByMd5(nowTime.toString() + "pubilc2022");
+                params.put("stamp", nowTime.toString());
+                params.put("sign", sign);
+                params.put("jsonstr", JSONArray.toJSONString(boList));
+                String respone = "";
+                try {
+                    respone = HttpUtils.postFormBody(GRADE_CHANGE_PATH, params);
+                    log.info("同步系统班级人数结果" + respone, "");
+                    if (!respone.contains("\"Status\":true")) {
+                        throw new CustomException("旧系统接口请求错误" + respone);
+                    }
+                } catch (IOException e) {
+                    throw new CustomException("旧系统接口请求错误" + e.getMessage());
+                }
+            }
 
         }
         return true;

+ 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;
+}

+ 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;
+
+
+}

+ 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>

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

@@ -888,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>