瀏覽代碼

add 录单

he2802 3 年之前
父節點
當前提交
c35a77c900
共有 31 個文件被更改,包括 1049 次插入59 次删除
  1. 13 18
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java
  2. 101 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderInputController.java
  3. 13 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserController.java
  4. 5 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java
  5. 30 25
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  6. 1 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsCourseServiceImpl.java
  7. 66 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsConfigVo.java
  8. 12 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderAddBo.java
  9. 12 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderEditBo.java
  10. 48 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderInputAddBo.java
  11. 56 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderInputEditBo.java
  12. 60 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderInputQueryBo.java
  13. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderQueryBo.java
  14. 13 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/Order.java
  15. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java
  16. 49 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderInput.java
  17. 16 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderInputMapper.java
  18. 54 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderInputService.java
  19. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java
  20. 112 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderInputServiceImpl.java
  21. 200 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  22. 55 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderInputVo.java
  23. 16 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderVo.java
  24. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserImportAddBo.java
  25. 38 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserImportExportBo.java
  26. 11 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserQueryBo.java
  27. 3 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java
  28. 13 4
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderBusinessConfigGoodsMapper.xml
  29. 23 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderInputMapper.xml
  30. 4 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml
  31. 16 1
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml

+ 13 - 18
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -4,6 +4,7 @@ import java.util.List;
 import java.util.Arrays;
 
 import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.TokenService;
@@ -114,24 +115,18 @@ public class OrderController extends BaseController {
     }
 
     /**
-     * 修改订单
+     * 新增订单
      */
-   /* @ApiOperation("修改订单")
-    @PreAuthorize("@ss.hasPermi('system:order:edit')")
-    @Log(title = "订单", businessType = BusinessType.UPDATE)
-    @PostMapping("/edit")
-    public AjaxResult<Void> edit(@RequestBody OrderEditBo bo) {
-        return toAjax(iOrderService.updateByEditBo(bo) ? 1 : 0);
-    }*/
+    @ApiOperation("新增后台录单")
+    @PreAuthorize("@ss.hasPermi('system:order:add')")
+    @Log(title = "新增后台录单", businessType = BusinessType.INSERT)
+    @PostMapping("/inputOrder")
+    public AjaxResult addInputOrder(@RequestBody OrderAddBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setCreateSysUserId(loginUser.getUser().getUserId());
+        bo.setCreateBy(SecurityUtils.getUsername());
+        return AjaxResult.success(iOrderService.placePlatInputOrder(bo));
+    }
+
 
-    /**
-     * 删除订单
-     */
-   /* @ApiOperation("删除订单")
-    @PreAuthorize("@ss.hasPermi('system:order:remove')")
-    @Log(title = "订单" , businessType = BusinessType.DELETE)
-    @DeleteMapping("/{orderIds}")
-    public AjaxResult<Void> remove(@PathVariable Long[] orderIds) {
-        return toAjax(iOrderService.deleteWithValidByIds(Arrays.asList(orderIds), true) ? 1 : 0);
-    }*/
 }

+ 101 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderInputController.java

@@ -0,0 +1,101 @@
+package com.zhongzheng.controller.order;
+
+import java.util.List;
+import java.util.Arrays;
+
+import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.TokenService;
+import com.zhongzheng.modules.order.bo.OrderInputAddBo;
+import com.zhongzheng.modules.order.bo.OrderInputEditBo;
+import com.zhongzheng.modules.order.bo.OrderInputQueryBo;
+import com.zhongzheng.modules.order.service.IOrderInputService;
+import com.zhongzheng.modules.order.vo.OrderInputVo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 录单Controller
+ *
+ * @author hjl
+ * @date 2022-04-07
+ */
+@Api(value = "录单控制器", tags = {"录单管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/order/input")
+public class OrderInputController extends BaseController {
+
+    private final IOrderInputService iOrderInputService;
+
+    private final TokenService tokenService;
+
+    /**
+     * 查询录单列表
+     */
+    @ApiOperation("查询录单列表")
+    @PreAuthorize("@ss.hasPermi('system:input:list')")
+    @GetMapping("/list")
+    public TableDataInfo<OrderInputVo> list(OrderInputQueryBo bo) {
+        startPage();
+        List<OrderInputVo> list = iOrderInputService.queryList(bo);
+        return getDataTable(list);
+    }
+
+
+
+    /**
+     * 获取录单详细信息
+     */
+    @ApiOperation("获取录单详细信息")
+    @PreAuthorize("@ss.hasPermi('system:input:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<OrderInputVo> getInfo(@PathVariable("id" ) Long id) {
+        return AjaxResult.success(iOrderInputService.queryById(id));
+    }
+
+    /**
+     * 新增录单
+     */
+    @ApiOperation("新增录单")
+    @PreAuthorize("@ss.hasPermi('system:input:add')")
+    @Log(title = "录单", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@RequestBody OrderInputAddBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setCreateSysUserId(loginUser.getUser().getUserId());
+        bo.setCreateUsername(SecurityUtils.getUsername());
+        return toAjax(iOrderInputService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改录单
+     */
+    @ApiOperation("修改录单")
+    @PreAuthorize("@ss.hasPermi('system:input:edit')")
+    @Log(title = "录单", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult<Void> edit(@RequestBody OrderInputEditBo bo) {
+        return toAjax(iOrderInputService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+
+}

+ 13 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserController.java

@@ -14,6 +14,7 @@ import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportVo;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.vo.UserStudyRecordVo;
+import com.zhongzheng.modules.user.vo.UserSubscribeExport;
 import com.zhongzheng.modules.user.vo.UserVo;
 import lombok.RequiredArgsConstructor;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -155,4 +156,16 @@ public class UserController extends BaseController {
         Map<String, Object> rs = iUserService.importUser(userList,importNo);
         return AjaxResult.success(rs);
     }
+
+    @ApiOperation("导出失败导入用户")
+    @Log(title = "导入用户", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('system:section:import')")
+    @PostMapping("/exportFailData")
+    public AjaxResult<Map<String,Object>> exportFailData(@RequestBody List<UserImportExportBo> bo) throws Exception
+    {
+        List<UserImportExportBo> errorList = bo;
+        ExcelUtil<UserImportExportBo> util = new ExcelUtil<UserImportExportBo>(UserImportExportBo.class);
+        String timeStr= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        return util.exportEasyExcel(util.exportEasyData(errorList), "导出失败导入用户"+timeStr);
+    }
 }

+ 5 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java

@@ -202,6 +202,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return localDate+randomNumeric;
     }
 
+    public static String getDateInputOrderSn()
+    {
+        return "LD"+getDateOrderSn();
+    }
+
     public static String secToTime(int time) {
         String timeStr = null;
         int hour = 0;

+ 30 - 25
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java

@@ -559,6 +559,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         }
         List<UserImportAddBo> errorList = new ArrayList<>();
         List<UserImportAddBo> successList = new ArrayList<>();
+        if(Validator.isEmpty(importNo)){
+            importNo = ServletUtils.getEncoded("IMPORT");
+        }
         for (UserImportAddBo itemImport : list) {
             if(Validator.isEmpty(itemImport.getTelphone())||itemImport.getTelphone().length()!=11){
                 itemImport.setCause("手机号不能为空或者格式不对");
@@ -575,33 +578,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 errorList.add(itemImport);
                 continue;
             }
-            User user = getOne(new LambdaQueryWrapper<User>()
-                    .eq(User::getTelphone,itemImport.getTelphone()).last("limit 1"));
-            if(Validator.isNotNull(user)){
-                if(Validator.isNotEmpty(user.getImportNo())&&user.getImportNo().equals(importNo)){
-                    //同批次不作处理
-                    continue;
-                }
-                itemImport.setCause("该手机号已注册");
-                errorList.add(itemImport);
-                continue;
-            }
-            User user2 = getOne(new LambdaQueryWrapper<User>()
-                    .eq(User::getIdCard,itemImport.getIdCard()).last("limit 1"));
-            if(Validator.isNotNull(user2)){
-                if(Validator.isNotEmpty(user.getImportNo())&&user.getImportNo().equals(importNo)){
-                    //同批次不作处理
-                    continue;
-                }
-                itemImport.setCause("该身份证已被使用");
-                errorList.add(itemImport);
-                continue;
-            }
             //科目
-            if(Validator.isEmpty(itemImport.getSubjectNames())){
+            if(Validator.isNotEmpty(itemImport.getSubjectNames())){
                 List<String> SubjectList = Arrays.asList(itemImport.getSubjectNames().split(","));
                 List<Long> sIdList = new ArrayList<>();
                 for (String subject : SubjectList) {
+                    System.out.println(subject);
                     Long subjectId = findSubjectId(subject);
                     if(Validator.isNotEmpty(subjectId)){
                         //科目存在
@@ -611,8 +593,29 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 }
                 itemImport.setSubjectIds(ToolsUtils.join(",", sIdList));
             }
-            if(Validator.isEmpty(importNo)){
-                importNo = ServletUtils.getEncoded("IMPORT");
+            User user = getOne(new LambdaQueryWrapper<User>()
+                    .eq(User::getTelphone,itemImport.getTelphone()).last("limit 1"));
+            if(Validator.isNotNull(user)){
+                //手机号已存在
+                itemImport.setUserId(user.getUserId());
+                itemImport.setImportNo(importNo);
+                itemImport.setStudentCode(user.getUserAccount());
+                itemImport.setRealname(user.getRealname());
+                itemImport.setIdCard(user.getIdCard());
+                successList.add(itemImport);
+                continue;
+            }
+            User user2 = getOne(new LambdaQueryWrapper<User>()
+                    .eq(User::getIdCard,itemImport.getIdCard()).last("limit 1"));
+            if(Validator.isNotNull(user2)){
+                //身份证已存在
+                itemImport.setUserId(user2.getUserId());
+                itemImport.setImportNo(importNo);
+                itemImport.setStudentCode(user2.getUserAccount());
+                itemImport.setRealname(user2.getRealname());
+                itemImport.setTelphone(user2.getTelphone());
+                successList.add(itemImport);
+                continue;
             }
             User inertData = new User();
             inertData.setTelphone(itemImport.getTelphone());
@@ -642,11 +645,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
             iSmsService.sendPwdSms(itemImport.getTelphone(),pwd);
             itemImport.setUserId(inertData.getUserId());
             itemImport.setImportNo(importNo);
+            itemImport.setStudentCode(inertData.getUserAccount());
             successList.add(itemImport);
         }
         Map<String,Object> resultMap = new HashMap<>();
         resultMap.put("errorList",errorList);
         resultMap.put("successList",successList);
+        resultMap.put("importNo",importNo);
         return resultMap;
     }
 

+ 1 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsCourseServiceImpl.java

@@ -33,8 +33,6 @@ import java.util.stream.Collectors;
 @Service
 public class GoodsCourseServiceImpl extends ServiceImpl<GoodsCourseMapper, GoodsCourse> implements IGoodsCourseService {
 
-    @Autowired
-    private GoodsCourseMapper goodsCourseMapper;
 
 
     @Override
@@ -53,7 +51,7 @@ public class GoodsCourseServiceImpl extends ServiceImpl<GoodsCourseMapper, Goods
 
     @Override
     public List<CourseVo> selectList(Long goodsId) {
-        return goodsCourseMapper.selectList(goodsId);
+        return this.baseMapper.selectList(goodsId);
     }
 
     /**

+ 66 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsConfigVo.java

@@ -0,0 +1,66 @@
+package com.zhongzheng.modules.goods.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 商品视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2021-10-12
+ */
+@Data
+@ApiModel("商品视图对象")
+public class GoodsConfigVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long goodsId;
+
+	/** $column.columnComment */
+	@Excel(name = "供应方" , readConverterExp = "商品类型 1视频2题库 3补考 4前培 ")
+	@ApiModelProperty("商品类型 1视频2题库 3补考 4前培 ")
+	private Long goodsType;
+
+	/** 所属专业 */
+	@Excel(name = "所属专业")
+	@ApiModelProperty("所属专业")
+	private Long majorId;
+	/** 商品名称 */
+	@Excel(name = "商品名称")
+	@ApiModelProperty("商品名称")
+	private String goodsName;
+	/** 标准价格 */
+	@Excel(name = "标准价格")
+	@ApiModelProperty("标准价格")
+	private BigDecimal standPrice;
+	/** 最低价格 */
+	@Excel(name = "最低价格")
+	@ApiModelProperty("最低价格")
+	private BigDecimal lowestPrice;
+
+	/** 班级*/
+	@Excel(name = "班级")
+	@ApiModelProperty("班级")
+	private Long gradeId;
+
+	/** 编码 */
+	@Excel(name = "编码")
+	@ApiModelProperty("编码")
+	private String code;
+
+
+	@ApiModelProperty("专业名称")
+	private String categoryName;
+
+	@ApiModelProperty("班级名称")
+	private String gradeName;
+
+}

+ 12 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderAddBo.java

@@ -85,4 +85,16 @@ public class OrderAddBo {
     /** 系统订单操作人ID */
     @ApiModelProperty("系统订单操作人ID")
     private Long createSysUserId;
+    /** 录单订单编号 */
+    @ApiModelProperty("录单订单编号")
+    private String inputOrderSn;
+    /** 已收价格 */
+    @ApiModelProperty("已收价格")
+    private BigDecimal receivedPrice;
+    /** 已退价格 */
+    @ApiModelProperty("已退价格")
+    private BigDecimal refundPrice;
+    /** 支付状态 0未收费,1部分付款  2完全付款 3免费 */
+    @ApiModelProperty("支付状态 0未收费,1部分付款  2完全付款 3免费")
+    private Integer payStatus;
 }

+ 12 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderEditBo.java

@@ -99,5 +99,16 @@ public class OrderEditBo {
     /** 系统订单操作人ID */
     @ApiModelProperty("系统订单操作人ID")
     private Long createSysUserId;
-
+    /** 录单订单编号 */
+    @ApiModelProperty("录单订单编号")
+    private String inputOrderSn;
+    /** 已收价格 */
+    @ApiModelProperty("已收价格")
+    private BigDecimal receivedPrice;
+    /** 已退价格 */
+    @ApiModelProperty("已退价格")
+    private BigDecimal refundPrice;
+    /** 支付状态 0未收费,1部分付款  2完全付款 3免费 */
+    @ApiModelProperty("支付状态 0未收费,1部分付款  2完全付款 3免费")
+    private Integer payStatus;
 }

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

@@ -0,0 +1,48 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 录单添加对象 order_input
+ *
+ * @author hjl
+ * @date 2022-04-07
+ */
+@Data
+@ApiModel("录单添加对象")
+public class OrderInputAddBo {
+
+    /** 录单订单编号 */
+    @ApiModelProperty("录单订单编号")
+    private String inputOrderSn;
+    /** 系统订单操作人 */
+    @ApiModelProperty("系统订单操作人")
+    private String createUsername;
+    /** 1有效 0无效 */
+    @ApiModelProperty("1有效 0无效")
+    private Integer status;
+    /** 系统订单操作人ID */
+    @ApiModelProperty("系统订单操作人ID")
+    private Long createSysUserId;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+    /** 教育类型id */
+    @ApiModelProperty("教育类型id")
+    private Long educationTypeId;
+    /** 业务层次id */
+    @ApiModelProperty("业务层次id")
+    private Long businessId;
+    /** 项目ID */
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+}

+ 56 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderInputEditBo.java

@@ -0,0 +1,56 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 录单编辑对象 order_input
+ *
+ * @author hjl
+ * @date 2022-04-07
+ */
+@Data
+@ApiModel("录单编辑对象")
+public class OrderInputEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long id;
+
+    /** 录单订单编号 */
+    @ApiModelProperty("录单订单编号")
+    private String inputOrderSn;
+
+    /** 系统订单操作人 */
+    @ApiModelProperty("系统订单操作人")
+    private String createUsername;
+
+    /** 1有效 0无效 */
+    @ApiModelProperty("1有效 0无效")
+    private Integer status;
+
+    /** 系统订单操作人ID */
+    @ApiModelProperty("系统订单操作人ID")
+    private Long createSysUserId;
+
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+
+    /** 教育类型id */
+    @ApiModelProperty("教育类型id")
+    private Long educationTypeId;
+
+    /** 业务层次id */
+    @ApiModelProperty("业务层次id")
+    private Long businessId;
+
+    /** 项目ID */
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+
+}

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

@@ -0,0 +1,60 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 录单分页查询对象 order_input
+ *
+ * @author hjl
+ * @date 2022-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("录单分页查询对象")
+public class OrderInputQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 录单订单编号 */
+	@ApiModelProperty("录单订单编号")
+	private String inputOrderSn;
+	/** 系统订单操作人 */
+	@ApiModelProperty("系统订单操作人")
+	private String createUsername;
+	/** 1有效 0无效 */
+	@ApiModelProperty("1有效 0无效")
+	private Integer status;
+	/** 系统订单操作人ID */
+	@ApiModelProperty("系统订单操作人ID")
+	private Long createSysUserId;
+	/** 教育类型id */
+	@ApiModelProperty("教育类型id")
+	private Long educationTypeId;
+	/** 业务层次id */
+	@ApiModelProperty("业务层次id")
+	private Long businessId;
+	/** 项目ID */
+	@ApiModelProperty("项目ID")
+	private Long projectId;
+}

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderQueryBo.java

@@ -112,4 +112,8 @@ public class OrderQueryBo extends BaseEntity {
 	/** 1有效 0无效 */
 	@ApiModelProperty("1有效 0无效")
 	private Integer[] status;
+
+	/** 录单订单编号 */
+	@ApiModelProperty("录单订单编号")
+	private String inputOrderSn;
 }

+ 13 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/Order.java

@@ -28,10 +28,12 @@ private static final long serialVersionUID=1L;
 
 
     public static final Integer PAY_NO =0;  //0未收费
-    public static final Integer PAY_PART =1;  //1部分收费
-    public static final Integer PAY_FULL =2;  //2完全收费
+    public static final Integer PAY_PART =1;  //1部分收费(支付状态)
+    public static final Integer PAY_FULL =2;  //2完全收费(支付状态)
+    public static final Integer PAY_FREE =3;  //3免费(支付状态)
     public static final Integer REFUND_PART =3;  //1部分收费
     public static final Integer REFUND_FULL =4;  //2完全收费
+    public static final Integer ORDER_STATUS_PAY =1;  //1已支付(订单状态)
 
 
     public static final Integer FROM_PLAT =1;  //业务员录单
@@ -48,7 +50,7 @@ private static final long serialVersionUID=1L;
     private BigDecimal orderPrice;
     /** 支付订单号 */
     private String orderGeneral;
-    /** 订单状态 -2 超时关闭,-1手动关闭,0普通状态,1部分付款  2完全付款 3部分退款 4完全退款 */
+    /** 订单状态 -2 超时关闭,-1手动关闭,0普通状态,1为已付款,3为成功 */
     private Integer orderStatus;
     /** 创建时间 */
     @TableField(fill = FieldFill.INSERT)
@@ -81,5 +83,13 @@ private static final long serialVersionUID=1L;
     private Integer status;
     /** 系统订单操作人ID */
     private Long createSysUserId;
+    /** 录单订单编号 */
+    private String inputOrderSn;
+    /** 已收价格 */
+    private BigDecimal receivedPrice;
+    /** 已退价格 */
+    private BigDecimal refundPrice;
+    /** 支付状态 0未收费,1部分付款  2完全付款 3免费 */
+    private Integer payStatus;
 
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java

@@ -27,6 +27,7 @@ public class OrderGoods implements Serializable {
     public static final Integer PAY_NO =1;  //1未收费
     public static final Integer PAY_PART =2;  //2部分收费
     public static final Integer PAY_FULL =3;  //3完全收费
+    public static final Integer PAY_FREE =4;  //4免费
 
 private static final long serialVersionUID=1L;
     /** $column.columnComment */

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

@@ -0,0 +1,49 @@
+package com.zhongzheng.modules.order.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 录单对象 order_input
+ *
+ * @author hjl
+ * @date 2022-04-07
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("order_input")
+public class OrderInput implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 录单订单编号 */
+    private String inputOrderSn;
+    /** 系统订单操作人 */
+    private String createUsername;
+    /** 1有效 0无效 */
+    private Integer status;
+    /** 系统订单操作人ID */
+    private Long createSysUserId;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 教育类型id */
+    private Long educationTypeId;
+    /** 业务层次id */
+    private Long businessId;
+    /** 项目ID */
+    private Long projectId;
+}

+ 16 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderInputMapper.java

@@ -0,0 +1,16 @@
+package com.zhongzheng.modules.order.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.order.domain.OrderInput;
+import com.zhongzheng.modules.order.vo.OrderInputVo;
+
+/**
+ * 录单Mapper接口
+ *
+ * @author hjl
+ * @date 2022-04-07
+ */
+public interface OrderInputMapper extends BaseMapper<OrderInput> {
+
+
+}

+ 54 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderInputService.java

@@ -0,0 +1,54 @@
+package com.zhongzheng.modules.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.order.bo.OrderInputAddBo;
+import com.zhongzheng.modules.order.bo.OrderInputEditBo;
+import com.zhongzheng.modules.order.bo.OrderInputQueryBo;
+import com.zhongzheng.modules.order.domain.OrderInput;
+import com.zhongzheng.modules.order.vo.OrderInputVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 录单Service接口
+ *
+ * @author hjl
+ * @date 2022-04-07
+ */
+public interface IOrderInputService extends IService<OrderInput> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	OrderInputVo queryById(Long id);
+
+	OrderInput queryBySn(String inputOrderSn);
+
+	/**
+	 * 查询列表
+	 */
+	List<OrderInputVo> queryList(OrderInputQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入录单
+	 * @param bo 录单新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(OrderInputAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改录单
+	 * @param bo 录单编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(OrderInputEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -47,6 +47,8 @@ public interface IOrderService extends IService<Order> {
 
 	Map<String, Object> placePlatOrder(OrderAddBo bo);
 
+	Map<String, Object> placePlatInputOrder(OrderAddBo bo);
+
 	boolean joinGrade(Long orderGoodsId,Long gradeId,Long userId);
 	/**
 	 * 小程序下单

+ 112 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderInputServiceImpl.java

@@ -0,0 +1,112 @@
+package com.zhongzheng.modules.order.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.order.bo.OrderInputAddBo;
+import com.zhongzheng.modules.order.bo.OrderInputEditBo;
+import com.zhongzheng.modules.order.bo.OrderInputQueryBo;
+import com.zhongzheng.modules.order.domain.OrderInput;
+import com.zhongzheng.modules.order.mapper.OrderInputMapper;
+import com.zhongzheng.modules.order.service.IOrderInputService;
+import com.zhongzheng.modules.order.vo.OrderInputVo;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.Page;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 录单Service业务层处理
+ *
+ * @author hjl
+ * @date 2022-04-07
+ */
+@Service
+public class OrderInputServiceImpl extends ServiceImpl<OrderInputMapper, OrderInput> implements IOrderInputService {
+
+    @Override
+    public OrderInputVo queryById(Long id){
+        OrderInput db = this.baseMapper.selectById(id);
+        return BeanUtil.toBean(db, OrderInputVo.class);
+    }
+
+    @Override
+    public OrderInput queryBySn(String inputOrderSn) {
+        return getOne(new LambdaQueryWrapper<OrderInput>().eq(OrderInput::getInputOrderSn,inputOrderSn));
+    }
+
+    @Override
+    public List<OrderInputVo> queryList(OrderInputQueryBo bo) {
+        LambdaQueryWrapper<OrderInput> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StrUtil.isNotBlank(bo.getInputOrderSn()), OrderInput::getInputOrderSn, bo.getInputOrderSn());
+        lqw.like(StrUtil.isNotBlank(bo.getCreateUsername()), OrderInput::getCreateUsername, bo.getCreateUsername());
+        lqw.eq(bo.getStatus() != null, OrderInput::getStatus, bo.getStatus());
+        lqw.eq(bo.getCreateSysUserId() != null, OrderInput::getCreateSysUserId, bo.getCreateSysUserId());
+        lqw.eq(bo.getEducationTypeId() != null, OrderInput::getEducationTypeId, bo.getEducationTypeId());
+        lqw.eq(bo.getBusinessId() != null, OrderInput::getBusinessId, bo.getBusinessId());
+        lqw.eq(bo.getProjectId() != null, OrderInput::getProjectId, bo.getProjectId());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<OrderInputVo> entity2Vo(Collection<OrderInput> collection) {
+        List<OrderInputVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, OrderInputVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<OrderInput> page = (Page<OrderInput>)collection;
+            Page<OrderInputVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(OrderInputAddBo bo) {
+        OrderInput add = BeanUtil.toBean(bo, OrderInput.class);
+        add.setInputOrderSn(DateUtils.getDateInputOrderSn());
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(OrderInputEditBo bo) {
+        OrderInput update = BeanUtil.toBean(bo, OrderInput.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(OrderInput entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+}

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

@@ -30,11 +30,14 @@ import com.zhongzheng.modules.inform.service.IInformUserService;
 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.domain.OrderInput;
 import com.zhongzheng.modules.order.mapper.OrderMapper;
 import com.zhongzheng.modules.order.service.IOrderBusinessService;
 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.OrderGoodsVo;
+import com.zhongzheng.modules.order.vo.OrderInputVo;
 import com.zhongzheng.modules.order.vo.OrderListVo;
 import com.zhongzheng.modules.order.vo.OrderVo;
 import com.zhongzheng.modules.user.service.IUserService;
@@ -100,6 +103,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     @Autowired
     private ICourseBusinessService iCourseBusinessService;
 
+    @Autowired
+    private IOrderInputService iOrderInputService;
+
     @Autowired
     private RedisCache redisCache;
 
@@ -217,6 +223,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
         BigDecimal totalPrice = new BigDecimal(0);
         BigDecimal payPrice = new BigDecimal(0);
+        List<OrderGoods> freeList = new ArrayList<>();
         //生成订单
         for (OrderGoodsAddBo g : goodsList) {
             //订单商品
@@ -284,21 +291,191 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             if(!canRepeatBuy&&goods.getGoodsType()!=3&&goods.getGoodsType()!=4){
                 this.checkBuyGoods(g.getGoodsId(),bo.getUserId(),goods.getGoodsType());
             }
-
+            //商品0元加入免费商品列表
+            if(orderGoods.getGoodsPrice().compareTo(BigDecimal.ZERO)==0){
+                freeList.add(orderGoods);
+            }
         }
 
         add.setOrderSn(out_trade_no);
         add.setOrderFrom(Order.FROM_PLAT);
         add.setPayPrice(payPrice);
         add.setOrderPrice(totalPrice);
+        //订单0元
+        if(payPrice.compareTo(BigDecimal.ZERO)==0){
+            //完全收费
+            add.setOrderStatus(Order.PAY_FULL);
+            add.setStatus(1);
+        }
 
         this.save(add);
+        //处理免费商品
+        for( OrderGoods orderGoods : freeList){
+            dealFreeGoods(orderGoods,add);
+        }
         Map<String, Object> result = new HashMap<>();
         result.put("orderId",add.getOrderId());
         result.put("orderSn",out_trade_no);
         return result;
     }
 
+    /**
+     *系统录单
+     * @param bo
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> placePlatInputOrder(OrderAddBo bo) {
+        List<OrderGoodsAddBo> goodsList = bo.getGoodsList();
+        if(goodsList==null||goodsList.size()<1){
+            throw new CustomException("商品列表为空");
+        }
+        if(Validator.isEmpty(bo.getInputOrderSn())){
+            throw new CustomException("录单单号为空");
+        }
+        OrderInput orderInput = iOrderInputService.queryBySn(bo.getInputOrderSn());
+        if(Validator.isEmpty(orderInput)){
+            throw new CustomException("录单单号不存在");
+        }
+        Order add = BeanUtil.toBean(bo, Order.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        add.setOrderType(Order.CONSUME_ORDER);
+        add.setCreateUsername(bo.getCreateBy());//
+        //生成订单号
+        String out_trade_no = DateUtils.getDateOrderSn();
+
+        BigDecimal totalPrice = new BigDecimal(0);
+        BigDecimal payPrice = new BigDecimal(0);
+        BigDecimal receivedPrice = new BigDecimal(0);
+        //收费的商品列表,不含免费
+        List<OrderGoods> payList = new ArrayList<>();
+        List<OrderGoods> freeList = new ArrayList<>();
+        //生成订单
+        for (OrderGoodsAddBo g : goodsList) {
+            //订单商品
+            Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId,g.getGoodsId()));
+            if(goods.getGoodsStatus()!=1){
+                throw new CustomException("商品尚未上架");
+            }
+            OrderGoods orderGoods = BeanUtil.toBean(g, OrderGoods.class);
+            orderGoods.setOrderSn(out_trade_no);
+            if(g.getGoodsInputData()!=null){
+                orderGoods.setGoodsInputData(JSON.toJSONString(g.getGoodsInputData()));
+            }
+
+            //成交价
+            orderGoods.setGoodsRealPrice(g.getGoodsRealPrice());
+
+            orderGoods.setCreateTime(DateUtils.getNowTime());
+            orderGoods.setUpdateTime(DateUtils.getNowTime());
+            orderGoods.setGoodsReceived(g.getGoodsReceived());
+
+            //订单标准价格不计算优惠
+            totalPrice = totalPrice.add(goods.getStandPrice());
+            //实际应收价格
+            payPrice = payPrice.add(g.getGoodsRealPrice());
+            //已收价格
+            receivedPrice = receivedPrice.add(g.getGoodsReceived());
+            boolean orderGoodsRs = iOrderGoodsService.save(orderGoods);
+            boolean canRepeatBuy = false;
+            //视频商品安排班级
+            if(goods.getGoodsType()==1){
+                if(Validator.isNotEmpty(goods.getStudyCount())){
+                    orderGoods.setStudyCount(goods.getStudyCount()-1); //默认消耗一次学习机会
+                }else{
+                    orderGoods.setStudyCount(0L);//没配置则为0
+                }
+
+                Long gradeId = null;
+                //判断是否购买历史班级都过期
+                canRepeatBuy =this.canBuyRepeatGoods(g.getGoodsId(),bo.getUserId());
+                if(g.getGoodsInputData()!=null){
+                    gradeId = g.getGoodsInputData().getGradeId();
+                    //判断是否有购买过
+                    Long oldOrderGoodsId = getHaveBuyGoods(g.getGoodsId(),bo.getUserId());
+                    if(Validator.isNotEmpty(oldOrderGoodsId)){
+                        //有指定选班模板且视频商品班级已过期,记录复购状态
+                        orderGoods.setRebuyOrderGoodsId(oldOrderGoodsId);
+                    }
+                }
+                String requestId = IdUtil.simpleUUID();
+                RedisLockEntity redisLockEntity = new RedisLockEntity();
+                redisLockEntity.setLockKey(RedisLockEntity.KEY_LOCK_GRADE);
+                redisLockEntity.setRequestId(requestId);
+                if(redisCache.lock(redisLockEntity)){
+                    arrangeGrade(goods.getGoodsName(),goods.getGoodsId(),orderGoods.getOrderGoodsId(),gradeId,add.getUserId(),out_trade_no,goods.getBusinessId());
+                    redisCache.unlockLua(redisLockEntity);
+                }
+                iOrderGoodsService.updateById(orderGoods);
+            }
+
+            if(!canRepeatBuy&&goods.getGoodsType()!=3&&goods.getGoodsType()!=4){
+                this.checkBuyGoods(g.getGoodsId(),bo.getUserId(),goods.getGoodsType());
+            }
+            //商品0元或已收费加入收费商品列表
+            if(g.getGoodsRealPrice().compareTo(BigDecimal.ZERO)==0){
+                //免费的
+                freeList.add(orderGoods);
+            }
+            else if(g.getGoodsRealPrice().compareTo(BigDecimal.ZERO)>0&&g.getGoodsReceived().compareTo(BigDecimal.ZERO)>0){
+                //有收费的
+                payList.add(orderGoods);
+            }
+        }
+
+        add.setOrderSn(out_trade_no);
+        add.setOrderFrom(Order.FROM_PLAT);
+        add.setPayPrice(payPrice);//需要支付价格
+        add.setOrderPrice(totalPrice);//标准价格
+        add.setReceivedPrice(receivedPrice);//已支付
+        //有已收费的商品
+        if((freeList.size()+payList.size())>0){
+            add.setOrderStatus(Order.ORDER_STATUS_PAY);
+            if(payPrice.compareTo(BigDecimal.ZERO)==0){
+                //总订单0元
+                add.setPayStatus(Order.PAY_FREE);
+            }
+            else if(payPrice.compareTo(receivedPrice)==0){
+                //完全收费
+                add.setPayStatus(Order.PAY_FULL);
+            }else {
+                //部分收费
+                add.setPayStatus(Order.PAY_PART);
+            }
+            add.setStatus(1);
+        }
+
+        this.save(add);
+        //处理收费商品,生成计费单
+        for( OrderGoods orderGoods : payList){
+
+        }
+        //处理免费商品
+        for( OrderGoods orderGoods : freeList){
+            dealFreeGoods(orderGoods,add);
+        }
+        Map<String, Object> result = new HashMap<>();
+        result.put("orderId",add.getOrderId());
+        result.put("orderSn",out_trade_no);
+        return result;
+    }
+
+
+    private void dealFreeGoods(OrderGoods orderGoods,Order order){
+        //免费商品
+        orderGoods.setPayStatus(OrderGoods.PAY_FREE);
+        orderGoods.setGoodsReceived(orderGoods.getGoodsRealPrice());
+        //设置商品服务期
+        orderGoods = iWxPayService.setServiceTime(orderGoods);
+        iOrderGoodsService.updateById(orderGoods);
+        //给用户增加商品考试次数前培次数
+        iWxPayService.updateUserExamGoods(orderGoods,order);
+        iWxPayService.joinLockGrade(order.getOrderSn(),orderGoods.getGoodsId(),orderGoods.getOrderGoodsId());
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Map<String, String> placeSmallOrder(OrderAddBo bo) {
@@ -317,6 +494,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         BigDecimal totalPrice = new BigDecimal(0);
         BigDecimal payPrice = new BigDecimal(0);
         String body = "中正祥粤云-";
+        List<OrderGoods> freeList = new ArrayList<>();
         //生成订单
         for (OrderGoodsAddBo g : goodsList) {
             //订单商品
@@ -386,6 +564,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 this.checkBuyGoods(g.getGoodsId(),bo.getUserId(),goods.getGoodsType());
             }
             iShoppingCartService.deleteByGoodsId(g.getGoodsId(),bo.getUserId());
+            //商品0元加入免费商品列表
+            if(orderGoods.getGoodsPrice().compareTo(BigDecimal.ZERO)==0){
+                freeList.add(orderGoods);
+            }
         }
 
         add.setOrderSn(out_trade_no);
@@ -393,14 +575,30 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         add.setPayPrice(payPrice);
 
         add.setOrderPrice(totalPrice);
+        //订单0元
+        if(payPrice.compareTo(BigDecimal.ZERO)==0){
+            //完全收费
+            add.setOrderStatus(Order.ORDER_STATUS_PAY);
+            add.setPayStatus(Order.PAY_FREE);
+            add.setStatus(1);
+        }
         this.save(add);
+        //处理免费商品
+        for( OrderGoods orderGoods : freeList){
+            dealFreeGoods(orderGoods,add);
+        }
+
         Map<String, Object> result = new HashMap<>();
         result.put("oderId",add.getOrderId());
         result.put("orderSn",out_trade_no);
         UserVo userVo = iUserService.queryById(add.getUserId());
     //    String price = "1";
+        Map<String, String> payResult = new HashMap<>();
+        //大于0元,获取微信支付信息
+        if(payPrice.compareTo(BigDecimal.ZERO)!=0){
+            payResult =  iWxPayService.payment(out_trade_no,userVo.getOpenId(),body,payPrice);
+        }
 
-        Map<String, String> payResult =  iWxPayService.payment(out_trade_no,userVo.getOpenId(),body,payPrice);
         payResult.put("orderSn",out_trade_no);
         return payResult;
     }

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

@@ -0,0 +1,55 @@
+package com.zhongzheng.modules.order.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 录单视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2022-04-07
+ */
+@Data
+@ApiModel("录单视图对象")
+public class OrderInputVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long id;
+
+	/** 录单订单编号 */
+	@Excel(name = "录单订单编号")
+	@ApiModelProperty("录单订单编号")
+	private String inputOrderSn;
+	/** 系统订单操作人 */
+	@Excel(name = "系统订单操作人")
+	@ApiModelProperty("系统订单操作人")
+	private String createUsername;
+	/** 1有效 0无效 */
+	@Excel(name = "1有效 0无效")
+	@ApiModelProperty("1有效 0无效")
+	private Integer status;
+	/** 系统订单操作人ID */
+	@Excel(name = "系统订单操作人ID")
+	@ApiModelProperty("系统订单操作人ID")
+	private Long createSysUserId;
+	/** 教育类型id */
+	@Excel(name = "教育类型id")
+	@ApiModelProperty("教育类型id")
+	private Long educationTypeId;
+	/** 业务层次id */
+	@Excel(name = "业务层次id")
+	@ApiModelProperty("业务层次id")
+	private Long businessId;
+	/** 项目ID */
+	@Excel(name = "项目ID")
+	@ApiModelProperty("项目ID")
+	private Long projectId;
+}

+ 16 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderVo.java

@@ -89,5 +89,20 @@ public class OrderVo {
 	@Excel(name = "系统订单操作人ID")
 	@ApiModelProperty("系统订单操作人ID")
 	private Long createSysUserId;
-
+	/** 录单订单编号 */
+	@Excel(name = "录单订单编号")
+	@ApiModelProperty("录单订单编号")
+	private String inputOrderSn;
+	/** 已收价格 */
+	@Excel(name = "已收价格")
+	@ApiModelProperty("已收价格")
+	private BigDecimal receivedPrice;
+	/** 已退价格 */
+	@Excel(name = "已退价格")
+	@ApiModelProperty("已退价格")
+	private BigDecimal refundPrice;
+	/** 支付状态 0未收费,1部分付款  2完全付款 3免费 */
+	@Excel(name = "支付状态 0未收费,1部分付款  2完全付款 3免费")
+	@ApiModelProperty("支付状态 0未收费,1部分付款  2完全付款 3免费")
+	private Integer payStatus;
 }

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

@@ -44,4 +44,6 @@ public class UserImportAddBo {
 
     @ApiModelProperty("科目ID,多个,拼接")
     private String subjectIds;
+    @ApiModelProperty("用户编号")
+    private String studentCode;
 }

+ 38 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserImportExportBo.java

@@ -0,0 +1,38 @@
+package com.zhongzheng.modules.user.bo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 客户端用户添加对象 user
+ *
+ * @author ruoyi
+ * @date 2021-06-08
+ */
+@Data
+@ApiModel("客户端导入用户添加对象")
+public class UserImportExportBo {
+
+    /** 真实姓名 */
+    @Excel(name = "*学员姓名")
+    @ApiModelProperty("真实姓名")
+    private String realname;
+    /** 身份证号 */
+    @Excel(name = "*学员身份证号码")
+    @ApiModelProperty("身份证号")
+    private String idCard;
+    /** 手机号码 */
+    @Excel(name = "*手机号码")
+    @ApiModelProperty("手机号码")
+    private String telphone;
+
+    @Excel(name = "科目")
+    @ApiModelProperty("科目,多个,拼接")
+    private String subjectNames;
+
+    @Excel(name = "失败原因")
+    private String cause;
+}

+ 11 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserQueryBo.java

@@ -149,4 +149,15 @@ public class UserQueryBo extends BaseEntity {
 	/** 导入编号 */
 	@ApiModelProperty("导入编号")
 	private String importNo;
+
+	@ApiModelProperty("是否合并查询 0单查 1联合查")
+	private Integer searchType;
+
+	/** 查找key */
+	@ApiModelProperty("searchKey")
+	private String searchKey;
+
+	/** 身份证号 */
+	@ApiModelProperty("身份证号列表")
+	private List<String> idCards;
 }

+ 3 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java

@@ -330,10 +330,12 @@ public class WxPayServiceImpl  implements IWxPayService {
         redisCache.setCacheObject(key, "dealing", 1, TimeUnit.MINUTES);//1分钟
         Order order = iOrderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, out_trade_no));
         if(order!=null&&order.getOrderStatus()==0){
-            order.setOrderStatus(Order.PAY_FULL);
+            order.setOrderStatus(Order.ORDER_STATUS_PAY);
+            order.setPayStatus(Order.PAY_FULL);
             order.setPayTime(DateUtils.getNowTime());
             order.setTransid(transaction_id);
             order.setOrderGeneral(out_trade_no);
+            order.setReceivedPrice(order.getPayPrice());
             order.setStatus(1);
             if(iOrderService.updateById(order)){
                 Map<String,Object> map = new HashMap<>();

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

@@ -23,12 +23,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <collection property="goodsList" column="goods_ids" select="findGoodsList"/>
     </resultMap>
 
-    <resultMap type="com.zhongzheng.modules.goods.vo.GoodsVo" id="GoodsResultVo">
+    <resultMap type="com.zhongzheng.modules.goods.vo.GoodsConfigVo" id="GoodsResultVo">
         <result property="goodsName" column="goods_name"/>
         <result property="goodsId" column="goods_id"/>
         <result property="goodsType" column="goods_type"/>
         <result property="categoryName" column="category_name"/>
-
+        <result property="standPrice" column="stand_price"/>
+        <result property="lowestPrice" column="lowest_price"/>
+        <result property="gradeId" column="grade_id"/>
+        <result property="gradeName" column="class_name"/>
     </resultMap>
 
     <select id="findGoodsList" resultMap="GoodsResultVo">
@@ -36,12 +39,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             g.goods_name,
             g.goods_id,
             g.goods_type,
-            m.category_name
+            m.category_name,
+            g.stand_price,
+            g.lowest_price,
+            any_value(cg.grade_id) grade_id,
+            any_value(cg.class_name) class_name
         FROM
              goods g
                  LEFT JOIN major m ON g.major_id = m.id and m.`status` = 1
+        LEFT JOIN class_grade_goods gg on g.goods_id = gg.goods_id
+        LEFT JOIN class_grade cg on gg.grade_id = cg.grade_id AND (unix_timestamp(now()) &lt; cg.class_end_time or cg.class_start_time is null) AND cg.`status` = 1  AND (SELECT COUNT(a.id) FROM class_grade_user a where a.grade_id = cg.grade_id and a.status =1) &lt; cg.student_upper
         WHERE
-            FIND_IN_SET( g.goods_id,#{goods_ids} )
+            FIND_IN_SET( g.goods_id,#{goods_ids} ) GROUP BY g.goods_id
     </select>
 
 

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

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhongzheng.modules.order.mapper.OrderInputMapper">
+
+    <resultMap type="com.zhongzheng.modules.order.domain.OrderInput" id="OrderInputResult">
+        <result property="id" column="id"/>
+        <result property="inputOrderSn" column="input_order_sn"/>
+        <result property="createUsername" column="create_username"/>
+        <result property="status" column="status"/>
+        <result property="createSysUserId" column="create_sys_user_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="educationTypeId" column="education_type_id"/>
+        <result property="businessId" column="business_id"/>
+        <result property="projectId" column="project_id"/>
+    </resultMap>
+
+
+
+
+</mapper>

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

@@ -24,6 +24,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="orderFrom" column="order_from"/>
         <result property="createUsername" column="create_username"/>
         <result property="createSysUserId" column="create_sys_user_id"/>
+        <result property="inputOrderSn" column="input_order_sn"/>
+        <result property="receivedPrice" column="received_price"/>
+        <result property="refundPrice" column="refund_price"/>
+        <result property="payStatus" column="pay_status"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.order.vo.OrderListVo" id="OrderResultVo">

+ 16 - 1
zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml

@@ -193,7 +193,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="gradePoint != null and gradePoint == 2" >
             AND (SELECT COUNT(u.user_id) FROM class_grade_user cgu where 1=1 AND u.status in (1) and cgu.user_id= u.user_id) = 0
         </if>
-
+        <if test="searchKey != null and searchKey != '' and searchType == 0 ">
+            and (u.realname like concat('%', #{searchKey}, '%') or u.id_card like concat('%', #{searchKey}, '%'))
+        </if>
+        <if test="idCards != null and idCards.size()!=0 and searchType == 0" >
+            AND u.id_card in
+            <foreach collection="idCards" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="searchType == 1" >
+            and (u.realname like concat('%', #{searchKey}, '%') or u.id_card like concat('%', #{searchKey}, '%') or
+            u.id_card in
+            <foreach collection="idCards" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>)
+        </if>
     </select>