提交 471cb603 作者: 刘明祎-运维用途

Merge branch 'develop' of ssh://git.mmcuav.cn:8222/iuav/ims into develop

# Conflicts:
#	release-service/src/main/java/com/mmc/csf/release/controller/FlyerTrainingController.java
#	release-service/src/main/java/com/mmc/csf/release/feign/UserAppApi.java
#	release-service/src/main/java/com/mmc/csf/release/service/FlyerTrainingService.java
#	release-service/src/main/java/com/mmc/csf/release/service/impl/FlyerTrainingServiceImpl.java
......@@ -23,14 +23,12 @@ public class CurriculumQo implements Serializable {
private static final long serialVersionUID = 3124398495152234751L;
@ApiModelProperty(value = "课程名称")
private String curriculumName;
@ApiModelProperty(value = "省份编码")
private Integer provinceCode;
@ApiModelProperty(value = "执照id")
private Integer licenseId;
@ApiModelProperty(value = "技能id")
private Integer flightSkillsId;
@ApiModelProperty(value = "课程类型id")
private Integer categoriesId;
@ApiModelProperty(value = "1级课程分类")
private Integer oneCourseId;
@ApiModelProperty(value = "2级课程分类")
private Integer twoCourseId;
@ApiModelProperty(value = "课程属性: 0:免费 1:积分兑换 2:付费 ")
private Integer courseAttribute;
@ApiModelProperty(value = "页码", required = true)
@NotNull(message = "页码不能为空", groups = { Page.class })
@Min(value = 1, groups = Page.class)
......
package com.mmc.csf.release.flyer.vo;
import com.alibaba.fastjson.annotation.JSONField;
import com.mmc.csf.release.model.group.Insert;
import com.mmc.csf.release.model.group.Update;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Author han
* 概要:课程分类
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CurriculumClassifyVO implements Serializable {
private static final long serialVersionUID = -7343885960160805850L;
@ApiModelProperty(value = "课程分类id")
private Integer id;
@ApiModelProperty(value = "分类名字")
@NotNull(message = "分类名字不能为空" ,groups = {Update.class})
private String name;
@ApiModelProperty(value = "1级课程分类")
@NotNull(message = "1级课程分类不能为空" ,groups = {Update.class})
private Integer oneCourseId;
@ApiModelProperty(value = "2级课程分类")
private Integer twoCourseId;
@ApiModelProperty(value = "分类图标")
private String classifyUrl;
@ApiModelProperty(value = "分类描述")
private String classifyDesc;
@ApiModelProperty(value = "创建时间")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "更新时间")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
package com.mmc.csf.release.flyer.vo;
import com.alibaba.fastjson.annotation.JSONField;
import com.mmc.csf.release.model.group.Insert;
import com.mmc.csf.release.model.group.Update;
import io.swagger.annotations.ApiModelProperty;
......@@ -12,6 +13,7 @@ import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Author LW
......@@ -25,35 +27,19 @@ import java.math.BigDecimal;
public class CurriculumInfoVO implements Serializable {
private static final long serialVersionUID = -7343885960160805850L;
@ApiModelProperty(value = "课程id")
@NotNull(message = "课程id不能为空" ,groups = {Update.class})
private Integer id;
@ApiModelProperty(value = "价格")
private BigDecimal price;
@ApiModelProperty(value = "1级课程分类ID")
@NotNull(message = "1级课程分类ID不能为空" ,groups = {Insert.class})
private Integer oneCourseId;
@ApiModelProperty(value = "供应商名称")
private String supplierName;
@ApiModelProperty(value = "2级课程分类ID")
private Integer twoCourseId;
@ApiModelProperty(value = "课程名称,长度30")
@Length(max = 30)
private String curriculumName;
@ApiModelProperty(value = "课程是否免费 0:免费 1:付费")
private Integer free;
@ApiModelProperty(value = "课程类型,二级id")
@NotNull(message = "课程类型id不能为空" ,groups = {Insert.class})
private Integer categoriesId;
@ApiModelProperty(value = "目录名称", example = "技能")
private String directoryName;
@ApiModelProperty(value = "课程类型名称", example = "通用巡检")
private String categoriesName;
@ApiModelProperty(value = "课程技能类型,二级id")
private Integer flightSkills;
@ApiModelProperty(value = "课程介绍(简介), 长度255")
@Length(max = 255)
private String curriculumDesc;
......@@ -64,6 +50,27 @@ public class CurriculumInfoVO implements Serializable {
@ApiModelProperty(value = "课程视频")
private String videoUrl;
@ApiModelProperty(value = "课程属性: 0:免费 1:积分兑换 2:付费 ")
private Integer courseAttribute;
@ApiModelProperty(value = "价格")
private BigDecimal requireAmout;
@ApiModelProperty(value = "积分")
private Integer requireIntegral;
@ApiModelProperty(value = "课程是否热门 0:否 1:是")
private Integer isHot;
@ApiModelProperty(value = "课程详情")
private String detailContent;
@ApiModelProperty(value = "创建时间")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "更新时间")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
package com.mmc.csf.release.flyer.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @author Admin
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CurriculumOrderLogVO {
private Integer userAccountId;
@ApiModelProperty(value = "云享金消耗金额")
private BigDecimal cashAmtPaid;
@ApiModelProperty(value = "佣金消耗金额")
private BigDecimal salaryAmtPaid;
@ApiModelProperty(value = "订单编号")
private String orderNo;
}
package com.mmc.csf.release.flyer.vo;
import com.alibaba.fastjson.annotation.JSONField;
import com.mmc.csf.release.model.group.Insert;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Author LW
* @date 2023/5/17 14:28
* 概要:课程信息
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CurriculumPayVO implements Serializable {
private static final long serialVersionUID = -7343885960160805850L;
@ApiModelProperty(value = "课程ID")
private Integer id;
@ApiModelProperty(value = "支付类型")
private String paymentType;
@ApiModelProperty(value = "微信支付订单编号")
private String paymentOrderNumber;
}
......@@ -2,7 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mmc.csf</groupId>
<artifactId>iuav-ims</artifactId>
<artifactId>iuav-ims</artifactId>aa
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>信息发布管理系统</name>
......
package com.mmc.csf.release.controller;
import com.mmc.csf.common.util.date.TDateUtil;
import com.mmc.csf.common.util.math.CodeUtil;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.release.entity.curriculum.CurriculumInfoDO;
import com.mmc.csf.release.entity.curriculum.CurriculumOrderDO;
import com.mmc.csf.release.entity.curriculum.CurriculumOrderDO;
import com.mmc.csf.release.entity.curriculum.CurriculumOrderQO;
import com.mmc.csf.release.feign.PmsAppApi;
import com.mmc.csf.release.feign.UserAppApi;
import com.mmc.csf.release.flyer.qo.CurriculumQo;
import com.mmc.csf.release.flyer.vo.CurriculumInfoVO;
import com.mmc.csf.release.flyer.vo.DronePilotLicenseVO;
import com.mmc.csf.release.flyer.vo.FlightSkillsVO;
import com.mmc.csf.release.flyer.vo.RegistrationVO;
import com.mmc.csf.release.flyer.vo.*;
import com.mmc.csf.release.model.group.Insert;
import com.mmc.csf.release.model.group.Page;
import com.mmc.csf.release.model.group.Update;
import com.mmc.csf.release.service.FlyerTrainingService;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
......@@ -37,6 +41,10 @@ public class FlyerTrainingController extends BaseController {
@Resource
private FlyerTrainingService flyerTrainingService;
@Qualifier("com.mmc.csf.release.feign.UserAppApi")
@Autowired
private UserAppApi userAppApi;
@ApiOperation(value = "飞手报名")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("/pilotRegistration")
......@@ -154,4 +162,56 @@ public class FlyerTrainingController extends BaseController {
public ResultBody<CurriculumOrderDO> deleteCurriculumOrderInfo(@ApiParam(value = "订单查询QO", required = true) @Validated(Page.class) @RequestParam(value = "id") Integer id) {
return flyerTrainingService.deleteCurriculumOrderInfo(id);
}
@ApiOperation(value = "新增课程分类")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = CurriculumClassifyVO.class)})
@PostMapping("addCurriculumClassify")
public ResultBody addCurriculumClassify(@Validated(Insert.class) @RequestBody CurriculumClassifyVO curriculumClassifyVO) {
return ResultBody.success(flyerTrainingService.addCurriculumClassify(curriculumClassifyVO));
}
@ApiOperation(value = "修改课程分类")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = CurriculumClassifyVO.class)})
@PostMapping("updateCurriculumClassify")
public ResultBody updateCurriculumClassify(@Validated(Update.class) @RequestBody CurriculumClassifyVO curriculumClassifyVO) {
return ResultBody.success(flyerTrainingService.updateCurriculumClassify(curriculumClassifyVO));
}
@ApiOperation(value = "删除课程分类")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = CurriculumClassifyVO.class)})
@PostMapping("removeCurriculumClassify")
public ResultBody removeCurriculumClassify(Integer id) {
return flyerTrainingService.removeCurriculumClassify(id);
}
@ApiOperation(value = "所有课程分类列表")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = CurriculumClassifyVO.class)})
@GetMapping("/selectCurriculumClassify")
public ResultBody selectCurriculumClassify() {
return flyerTrainingService.selectCurriculumClassify();
}
@ApiOperation(value = "购买课程-使用积分-去支付")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("/curriculumPayByIntegral")
public ResultBody curriculumPayByIntegral(HttpServletRequest request, @RequestParam Integer id) {
CurriculumInfoDO curriculumInfo = flyerTrainingService.selectCurriculumInfoById(id);
ResultBody resultBody = userAppApi.feignChangeUserPoints(request.getHeader("token"),request, - curriculumInfo.getRequireIntegral(), "购买课程");
if("200".equals(resultBody.getCode())){
CurriculumOrderDO curriculumOrderDO = new CurriculumOrderDO();
curriculumOrderDO.setUserAccountId(id);
curriculumOrderDO.setJifenConsume(curriculumInfo.getRequireIntegral());
// 生成支付流水号(规则"CO" + 时间戳 + 用户id + 随机数4位)
curriculumOrderDO.setOrderNo("CO" + TDateUtil.getDateStr(new Date(), "yyyyMMddHHmmss") + id + CodeUtil.getRandomNum(4));
return ResultBody.success(flyerTrainingService.curriculumPayByIntegral(curriculumOrderDO));
} else {
return ResultBody.error("积分不足,购买失败");
}
}
@ApiOperation(value = "购买课程-使用金额-去支付")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("/curriculumPayByMoney")
public ResultBody curriculumPayByMoney(HttpServletRequest request,@RequestBody CurriculumPayVO curriculumPayVO) {
return flyerTrainingService.curriculumPayByMoney(request,curriculumPayVO);
}
}
package com.mmc.csf.release.dao;
import com.mmc.csf.release.entity.curriculum.CurriculumOrderDO;
import com.mmc.csf.release.entity.curriculum.CurriculumOrderQO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @author Admin
* @description 针对表【curriculum_order】的数据库操作Mapper
* @createDate 2023-12-07 10:01:44
* @Entity com.mmc.csf.release.entity.curriculum.CurriculumOrderDO
*/
@Mapper
public interface CurriculumOrderDao {
int deleteByPrimaryKey(Integer id);
int insert(CurriculumOrderDO record);
int insertSelective(CurriculumOrderDO record);
CurriculumOrderDO selectByPrimaryKey(Long id);
int updateByPrimaryKeySelective(CurriculumOrderDO record);
int updateByPrimaryKey(CurriculumOrderDO record);
/**
* 获取查询订单的总数
* @param param 条件
* @return int
*/
int getCountCurriculumOrder(CurriculumOrderQO param);
/**
* 获取课程订单信息
* @param param 查询条件
* @return {@link List}<{@link CurriculumOrderDO}>
*/
List<CurriculumOrderDO> selectOrderList(CurriculumOrderQO param);
}
......@@ -2,11 +2,10 @@ package com.mmc.csf.release.dao;
import java.util.List;
import com.mmc.csf.release.entity.curriculum.*;
import com.mmc.csf.release.flyer.vo.CurriculumClassifyVO;
import org.apache.ibatis.annotations.Mapper;
import com.mmc.csf.release.entity.curriculum.CurriculumInfoDO;
import com.mmc.csf.release.entity.curriculum.FlightSkillsDO;
import com.mmc.csf.release.entity.curriculum.PilotRegistrationDO;
import com.mmc.csf.release.flyer.qo.CurriculumQo;
import com.mmc.csf.release.flyer.vo.DronePilotLicenseVO;
......@@ -92,4 +91,53 @@ public interface FlyerTrainingDao {
int countCurriculumInfo(Integer categoriesId);
Integer getCurriculumCount();
/**
* 添加课程分类
*
* @param curriculumClassifyDO
*/
Integer addCurriculumClassify(CurriculumClassifyDO curriculumClassifyDO);
/**
* 修改课程分类
*
* @param curriculumClassify
*/
Integer updateCurriculumClassify(CurriculumClassifyDO curriculumClassify);
/**
* 删除课程分类
*
* @param id 课程分类id
*/
Integer removeCurriculumClassify(Integer id);
/**
* 查询一级分类的数量
* @return
*/
Integer countOneCourseClassify();
/**
* 查询当前一级分类下的二级分类的数量
* @param twoCourseId 2级课程分类
*/
Integer countTwoCourseClassify(Integer twoCourseId);
/**
* 查询所有的课程分类
* @return
*/
List<CurriculumClassifyDO> selectCurriculumClassify();
CurriculumClassifyDO selectCurriculumClassifyById(Integer id);
/**
* 根据课程ID查询课程信息
* @return
*/
CurriculumInfoDO selectCurriculumInfoById(Integer id);
int insertCurriculumOrder(CurriculumOrderDO record);
}
package com.mmc.csf.release.entity.curriculum;
import com.mmc.csf.release.flyer.vo.CurriculumClassifyVO;
import com.mmc.csf.release.flyer.vo.CurriculumInfoVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 课程基本信息(CurriculumClassifyDO)实体类
*
* @author han
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CurriculumClassifyDO implements Serializable {
private static final long serialVersionUID = 140348746605431718L;
private Integer id;
/**
* 课程类别名称
*/
private String name;
/**
* 1级课程分类
*/
private Integer oneCourseId;
/**
* 2级课程分类
*/
private Integer twoCourseId;
/**
* 分类图标
*/
private String classifyUrl;
/**
* 分类描述
*/
private String classifyDesc;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改时间
*/
private Date updateTime;
/**
* 是否删除 0:否 1:是
*/
private Integer deleted;
public CurriculumClassifyDO(CurriculumClassifyVO curriculumClassifyVO) {
this.id = curriculumClassifyVO.getId();
this.name = curriculumClassifyVO.getName();
this.oneCourseId = curriculumClassifyVO.getOneCourseId();
this.twoCourseId = curriculumClassifyVO.getTwoCourseId();
this.classifyUrl = curriculumClassifyVO.getClassifyUrl();
this.classifyDesc = curriculumClassifyVO.getClassifyDesc();
}
public CurriculumClassifyVO buildCurriculumClassifyVO(){
return CurriculumClassifyVO.builder().id(id).name(name)
.oneCourseId(oneCourseId).twoCourseId(twoCourseId)
.classifyUrl(classifyUrl).classifyDesc(classifyDesc)
.createTime(createTime).updateTime(updateTime).build();
}
}
package com.mmc.csf.release.entity.curriculum;
import com.mmc.csf.release.flyer.vo.CurriculumInfoVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -22,23 +23,51 @@ public class CurriculumInfoDO implements Serializable {
private static final long serialVersionUID = 140348746605431718L;
private Integer id;
/**
* 课程名称
* 1级课程分类ID
*/
private String curriculumName;
private Integer oneCourseId;
/**
* 课程供应商(id),用户id
* 2级课程分类ID
*/
private Integer supplierId;
private Integer twoCourseId;
/**
* 课程价格
* 课程名称
*/
private BigDecimal curriculumPrice;
private String curriculumName;
/**
* 课程简介
*/
private String curriculumDesc;
/**
* 课程封面
*/
private String surfaceUrl;
/**
* 课程视频
*/
private String videoUrl;
/**
* 课程属性
*/
private Integer courseAttribute;
/**
* 课程所需金额
*/
private BigDecimal requireAmout;
/**
* 课程所需积分
*/
private Integer requireIntegral;
/**
* 课程是否热门 0:否 1:是
*/
private Integer isHot;
/**
* 课程详情
*/
private String detailContent;
/**
* 创建时间
*/
......@@ -52,32 +81,30 @@ public class CurriculumInfoDO implements Serializable {
*/
private Integer deleted;
private String videoUrl;
private String surfaceUrl;
private String detailContent;
/**
* 课程类型id
*/
private Integer categoriesId;
public CurriculumInfoDO(CurriculumInfoVO curriculumInfoVO) {
this.id = curriculumInfoVO.getId();
this.oneCourseId = curriculumInfoVO.getOneCourseId();
this.twoCourseId = curriculumInfoVO.getTwoCourseId();
this.curriculumName = curriculumInfoVO.getCurriculumName();
this.curriculumDesc = curriculumInfoVO.getCurriculumDesc();
this.surfaceUrl = curriculumInfoVO.getSurfaceUrl();
this.detailContent = curriculumInfoVO.getDetailContent();
this.videoUrl = curriculumInfoVO.getVideoUrl();
this.categoriesId = curriculumInfoVO.getCategoriesId();
this.courseAttribute = curriculumInfoVO.getCourseAttribute();
this.requireAmout = curriculumInfoVO.getRequireAmout();
this.requireIntegral = curriculumInfoVO.getRequireIntegral();
this.isHot = curriculumInfoVO.getIsHot();
this.detailContent = curriculumInfoVO.getDetailContent();
}
public CurriculumInfoVO buildCurriculumInfoVO(){
return CurriculumInfoVO.builder().id(id).curriculumDesc(curriculumDesc).price(curriculumPrice)
.supplierName("浙江科比特创新科技有限公司").curriculumName(curriculumName)
return CurriculumInfoVO.builder().id(id).curriculumDesc(curriculumDesc)
.curriculumName(curriculumName)
.videoUrl(videoUrl).surfaceUrl(this.surfaceUrl).detailContent(this.detailContent)
.categoriesId(this.categoriesId).build();
.requireAmout(this.requireAmout).courseAttribute(courseAttribute)
.requireIntegral(this.requireIntegral).isHot(this.isHot)
.oneCourseId(this.oneCourseId).twoCourseId(this.twoCourseId)
.createTime(createTime).updateTime(updateTime).build();
}
}
......
......@@ -27,10 +27,6 @@ public class CurriculumOrderDO implements Serializable {
*/
private Integer userAccountId;
/**
* 上传课程的后台id
*/
private Integer backUserId;
/**
* 订单总金额
......@@ -57,8 +53,13 @@ public class CurriculumOrderDO implements Serializable {
*/
private String wechatPayOrderNumber;
/**
* 课程ID
*/
private Integer curriculumInfoId;
/**
* 所需积分
*/
private int jifenConsume;
private static final long serialVersionUID = 1L;
......
......@@ -8,11 +8,14 @@ import com.mmc.csf.infomation.dto.UserBaseInfoDTO;
import com.mmc.csf.release.auth.qo.BUserAccountQO;
import com.mmc.csf.release.auth.qo.UserAccountQO;
import com.mmc.csf.release.feign.hystrix.UserAppApiHystrix;
import com.mmc.csf.release.flyer.vo.CurriculumOrderLogVO;
import com.mmc.csf.user.vo.ChangeUserPointVO;
import io.swagger.annotations.ApiParam;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.List;
/**
......@@ -82,4 +85,9 @@ public interface UserAppApi {
@GetMapping("/userapp/user-account/feignGetUserBaseInfo")
UserBaseInfoDTO feignGetUserBaseInfo(@RequestParam Integer userAccountId);
@GetMapping("/userapp/userPoint/feignChangeUserPoints")
ResultBody feignChangeUserPoints(@RequestHeader("token") String token,@RequestHeader HttpServletRequest request, @RequestParam("id") int changePoint,@RequestParam("reason") String reason);
@GetMapping("/userapp/pay/feignCurriculumOrderLog")
ResultBody feignCurriculumOrderLog(@RequestHeader("token") String token,@RequestHeader HttpServletRequest request,@RequestBody CurriculumOrderLogVO curriculumOrderLogVO);
}
......@@ -9,9 +9,12 @@ import com.mmc.csf.infomation.dto.UserBaseInfoDTO;
import com.mmc.csf.release.auth.qo.BUserAccountQO;
import com.mmc.csf.release.auth.qo.UserAccountQO;
import com.mmc.csf.release.feign.UserAppApi;
import com.mmc.csf.release.flyer.vo.CurriculumOrderLogVO;
import com.mmc.csf.user.vo.ChangeUserPointVO;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.List;
/**
......@@ -68,5 +71,16 @@ public class UserAppApiHystrix implements UserAppApi {
return null;
}
@Override
public ResultBody feignChangeUserPoints(String token,HttpServletRequest request, int changePoint, String reason) {
log.error("获取积分日志 熔断:feignChangeUserPoints:{}", changePoint, reason);
return null;
}
@Override
public ResultBody feignCurriculumOrderLog(String token,HttpServletRequest request,CurriculumOrderLogVO curriculumOrderLogVO) {
return null;
}
}
......@@ -11,7 +11,7 @@ import com.mmc.csf.release.forum.qo.DynamicQO;
* @date 2023/6/19 10:47 概要:
*/
public interface BackstageForumService {
PageResult listDynamic(DynamicQO dynamic, HttpServletRequest request);
PageResult listDynamic (DynamicQO dynamic, HttpServletRequest request);
ResultBody getDynamicAuditSum();
ResultBody deleteDynamic(Integer dynamicId);
......
......@@ -4,6 +4,9 @@ import com.mmc.csf.common.util.page.PageResult;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.release.entity.curriculum.CurriculumOrderDO;
import com.mmc.csf.release.entity.curriculum.CurriculumOrderQO;
import com.mmc.csf.release.entity.curriculum.CurriculumClassifyDO;
import com.mmc.csf.release.entity.curriculum.CurriculumInfoDO;
import com.mmc.csf.release.entity.curriculum.CurriculumOrderDO;
import com.mmc.csf.release.flyer.qo.CurriculumQo;
import com.mmc.csf.release.flyer.vo.CurriculumInfoVO;
import com.mmc.csf.release.flyer.vo.RegistrationVO;
......@@ -96,6 +99,55 @@ public interface FlyerTrainingService {
Integer getCurriculumCount();
/**
* 添加课程分类
*
* @param curriculumClassify
*/
Integer addCurriculumClassify(CurriculumClassifyVO curriculumClassify);
/**
* 修改课程分类
*
* @param curriculumClassify
*/
Integer updateCurriculumClassify(CurriculumClassifyVO curriculumClassify);
/**
* 删除课程分类
*
* @param oneCourseId 1级课程分类
* @param twoCourseId 2级课程分类
*/
ResultBody removeCurriculumClassify(Integer id);
/**
* 查询所有的课程分类
* @return
*/
ResultBody selectCurriculumClassify();
/**
* 根据课程ID查询课程信息
* @param id
* @return
*/
CurriculumInfoDO selectCurriculumInfoById(Integer id);
/**
* 购买课程——积分支付
* @param curriculumOrderDO
* @return
*/
Integer curriculumPayByIntegral(CurriculumOrderDO curriculumOrderDO);
/**
* 购买课程——金钱支付
* @param curriculumPayVO
* @return
*/
ResultBody curriculumPayByMoney(HttpServletRequest request, CurriculumPayVO curriculumPayVO);
/**
* 分页查询订单列表
......
package com.mmc.csf.release.service.impl;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mmc.csf.common.util.date.TDateUtil;
import com.mmc.csf.common.util.math.CodeUtil;
import com.mmc.csf.common.util.web.ResultEnum;
import com.mmc.csf.infomation.dto.GetOrderNumberDTO;
import com.mmc.csf.infomation.dto.PayWalletDTO;
import com.mmc.csf.release.entity.curriculum.*;
import com.mmc.csf.release.feign.UserAppApi;
import com.mmc.csf.release.flyer.vo.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import com.mmc.csf.common.util.page.PageResult;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.release.dao.CurriculumOrderDao;
......@@ -9,10 +35,6 @@ import com.mmc.csf.release.feign.PmsAppApi;
import com.mmc.csf.release.flyer.dto.AllCategoryDTO;
import com.mmc.csf.release.flyer.dto.CategoriesInfoListDTO;
import com.mmc.csf.release.flyer.qo.CurriculumQo;
import com.mmc.csf.release.flyer.vo.CurriculumInfoVO;
import com.mmc.csf.release.flyer.vo.DronePilotLicenseVO;
import com.mmc.csf.release.flyer.vo.FlightSkillsVO;
import com.mmc.csf.release.flyer.vo.RegistrationVO;
import com.mmc.csf.release.service.FlyerTrainingService;
import lombok.AllArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
......@@ -26,12 +48,18 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import static com.sun.activation.registries.LogSupport.log;
/**
* @Author LW
* @date 2023/5/15 10:11
* 概要:
*/
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
@AllArgsConstructor
......@@ -41,7 +69,17 @@ public class FlyerTrainingServiceImpl implements FlyerTrainingService {
private FlyerTrainingDao flyerTrainingDao;
@Autowired
private PmsAppApi pmsAppApi;
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RestTemplate restTemplate;
@Value("${iuav.userapp.url}")
private String userApp;
@Qualifier("com.mmc.csf.release.feign.UserAppApi")
@Autowired
private UserAppApi userAppApi;
private CurriculumOrderDao curriculumOrderDao;
......@@ -91,10 +129,6 @@ public class FlyerTrainingServiceImpl implements FlyerTrainingService {
@Override
public PageResult queryCurriculumInfoList(CurriculumQo curriculumQo) {
Integer SZ = 440300;
if (curriculumQo.getProvinceCode() != null && !curriculumQo.getProvinceCode().equals(SZ)) {
return PageResult.buildPage(curriculumQo.getPageNo(), curriculumQo.getPageSize(), 0);
}
int count = flyerTrainingDao.countCurriculumInfoList(curriculumQo);
if (count == 0) {
return PageResult.buildPage(curriculumQo.getPageNo(), curriculumQo.getPageSize(), count);
......@@ -102,22 +136,7 @@ public class FlyerTrainingServiceImpl implements FlyerTrainingService {
Integer pageNo = curriculumQo.getPageNo();
curriculumQo.buildCurrentPage();
List<CurriculumInfoDO> curriculumList = flyerTrainingDao.listPageCurriculumInfo(curriculumQo);
List<AllCategoryDTO> allCategoryDTOS = pmsAppApi.feignQqueryCategoryInfoByType(3);
List<CurriculumInfoVO> list = curriculumList.stream().map(CurriculumInfoDO::buildCurriculumInfoVO).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(allCategoryDTOS)) {
list.stream().forEach(curriculumInfoVO -> {
allCategoryDTOS.stream().forEach(directory -> {
if (CollectionUtils.isNotEmpty(directory.getCategoriesInfoListDTO())) {
directory.getCategoriesInfoListDTO().stream().forEach(category -> {
if (curriculumInfoVO.getCategoriesId().equals(category.getId())) {
curriculumInfoVO.setDirectoryName(directory.getName());
curriculumInfoVO.setCategoriesName(category.getName());
}
});
}
});
});
}
return PageResult.buildPage(pageNo, curriculumQo.getPageSize(), count, list);
}
......@@ -142,18 +161,6 @@ public class FlyerTrainingServiceImpl implements FlyerTrainingService {
return ResultBody.error("课程不存在或已下架!");
} else {
CurriculumInfoVO curriculumInfoVO = curriculumInfoDO.buildCurriculumInfoVO();
List<AllCategoryDTO> allCategoryDTOS = pmsAppApi.feignQqueryCategoryInfoByType(3);
for (AllCategoryDTO directory : allCategoryDTOS) {
if (CollectionUtils.isNotEmpty(directory.getCategoriesInfoListDTO())) {
for (CategoriesInfoListDTO category : directory.getCategoriesInfoListDTO()) {
if (curriculumInfoVO.getCategoriesId().equals(category.getId())) {
curriculumInfoVO.setDirectoryName(directory.getName());
curriculumInfoVO.setCategoriesName(category.getName());
break;
}
}
}
}
return ResultBody.success(curriculumInfoVO);
}
}
......@@ -161,8 +168,6 @@ public class FlyerTrainingServiceImpl implements FlyerTrainingService {
@Override
public Integer addCurriculum(CurriculumInfoVO curriculumInfoVO) {
CurriculumInfoDO currInfoDO = new CurriculumInfoDO(curriculumInfoVO);
// TODO Auto-generated method stub 暂时先设置科比特单位ID
currInfoDO.setSupplierId(1);
return flyerTrainingDao.addCurriculum(currInfoDO);
}
......@@ -187,7 +192,6 @@ public class FlyerTrainingServiceImpl implements FlyerTrainingService {
@Override
public List<CurriculumInfoVO> feignCurriculumInfoList(Integer categoriesId) {
CurriculumQo curriculumQo = new CurriculumQo();
curriculumQo.setCategoriesId(categoriesId);
curriculumQo.setPageNo(1);
curriculumQo.setPageSize(Integer.MAX_VALUE);
int count = flyerTrainingDao.countCurriculumInfoList(curriculumQo);
......@@ -212,6 +216,154 @@ public class FlyerTrainingServiceImpl implements FlyerTrainingService {
return flyerTrainingDao.getCurriculumCount();
}
@Override
public Integer addCurriculumClassify(CurriculumClassifyVO curriculumClassify) {
CurriculumClassifyDO curriculumClassifyDO = new CurriculumClassifyDO(curriculumClassify);
Integer count;
if(curriculumClassifyDO.getOneCourseId() == null){
count = flyerTrainingDao.countOneCourseClassify();
curriculumClassifyDO.setOneCourseId(count + 1);
} else {
count = flyerTrainingDao.countTwoCourseClassify(curriculumClassify.getOneCourseId());
curriculumClassifyDO.setTwoCourseId(count);
}
return flyerTrainingDao.addCurriculumClassify(curriculumClassifyDO);
}
@Override
public Integer updateCurriculumClassify(CurriculumClassifyVO curriculumClassify) {
CurriculumClassifyDO curriculumClassifyDO = new CurriculumClassifyDO(curriculumClassify);
return flyerTrainingDao.updateCurriculumClassify(curriculumClassifyDO);
}
@Override
public ResultBody removeCurriculumClassify(Integer id) {
CurriculumClassifyDO classifyDO = flyerTrainingDao.selectCurriculumClassifyById(id);
if(classifyDO.getTwoCourseId() == null && flyerTrainingDao.countTwoCourseClassify(classifyDO.getOneCourseId() ) > 1){
return ResultBody.error("有二级分类无法删除");
}
flyerTrainingDao.removeCurriculumClassify(id);
return ResultBody.success();
}
@Override
public ResultBody selectCurriculumClassify() {
flyerTrainingDao.selectCurriculumClassify();
List<CurriculumClassifyDO> curriculumClassifyList = flyerTrainingDao.selectCurriculumClassify();
List<CurriculumClassifyVO> collect = curriculumClassifyList.stream().map(CurriculumClassifyDO::buildCurriculumClassifyVO).collect(Collectors.toList());
return ResultBody.success(collect);
}
@Override
public CurriculumInfoDO selectCurriculumInfoById(Integer id) {
return flyerTrainingDao.selectCurriculumInfoById(id);
}
@Override
public Integer curriculumPayByIntegral(CurriculumOrderDO curriculumOrderDO) {
return flyerTrainingDao.insertCurriculumOrder(curriculumOrderDO);
}
@Override
public ResultBody curriculumPayByMoney(HttpServletRequest request,CurriculumPayVO curriculumPayVO) {
//获取当前课程的内容
CurriculumInfoDO curriculumInfoDO = flyerTrainingDao.selectCurriculumInfoById(curriculumPayVO.getId());
// 获取支付类型
String[] split = curriculumPayVO.getPaymentType().split(",");
Set<String> collect = Arrays.asList(split).stream().collect(Collectors.toSet());
TreeSet<String> objects = new TreeSet<>(collect);
// 微信已经支付的金额
BigDecimal weChatPay = new BigDecimal(0);
if (objects.contains("3")) {
// 获取当前微信已经支付的金额
String json = stringRedisTemplate.opsForValue().get(curriculumPayVO.getPaymentOrderNumber() + curriculumPayVO.getId());
GetOrderNumberDTO orderNumberDTO = JSONObject.parseObject(json, GetOrderNumberDTO.class);
weChatPay = orderNumberDTO.getWeChatPay();
}
//获取用户钱包
ResultBody resultBody = getCurrentUserPayWalletInfo(request);
PayWalletDTO payWalletDTO = (PayWalletDTO) resultBody.getResult();
//用户剩余的佣金
BigDecimal userSalaryAmt = new BigDecimal(0);
userSalaryAmt = payWalletDTO.getSalaryAmt();
//云享金余额还剩余多少
BigDecimal userCashAmt = new BigDecimal(0);
userCashAmt = payWalletDTO.getCashAmt();
// 需要支付的总金额(除去微信已经支付过的金额,还需要支付的金额)
BigDecimal tempTotalAmount = new BigDecimal(0);
tempTotalAmount = curriculumInfoDO.getRequireAmout().subtract(weChatPay);
CurriculumOrderDO curriculumOrderDO = new CurriculumOrderDO();
curriculumOrderDO.setId(curriculumInfoDO.getId());
// 生成支付流水号(规则"CO" + 时间戳 + 用户id + 随机数4位)
curriculumOrderDO.setOrderNo("CO" + TDateUtil.getDateStr(new Date(), "yyyyMMddHHmmss") + curriculumInfoDO.getId() + CodeUtil.getRandomNum(4));
if(userSalaryAmt.add(userCashAmt).compareTo(tempTotalAmount) < 0 ){
if(!(weChatPay.compareTo(BigDecimal.ZERO) == 0)){
log("云享金或者佣金不够支付,支付失败,请回滚微信支付中的金额:" + curriculumPayVO.getPaymentOrderNumber());
return ResultBody.error("云享金或者佣金不够支付,支付失败,请回滚微信支付中的金额");
}else{
return ResultBody.error("云享金或者佣金不够支付,支付失败");
}
}
CurriculumOrderLogVO curriculumOrderLogVO = new CurriculumOrderLogVO();
curriculumOrderLogVO.setOrderNo(curriculumOrderDO.getOrderNo());
curriculumOrderLogVO.setUserAccountId(curriculumPayVO.getId());
if(objects.contains("1")){
if(tempTotalAmount.compareTo(userCashAmt) < 0){
curriculumOrderLogVO.setCashAmtPaid(tempTotalAmount);
curriculumOrderLogVO.setSalaryAmtPaid(BigDecimal.ZERO);
}else{
curriculumOrderLogVO.setCashAmtPaid(userCashAmt);
curriculumOrderLogVO.setSalaryAmtPaid(tempTotalAmount.subtract(userCashAmt));
}
} else if (objects.contains("2")) {
if(tempTotalAmount.compareTo(userSalaryAmt) < 0){
curriculumOrderLogVO.setCashAmtPaid(BigDecimal.ZERO);
curriculumOrderLogVO.setSalaryAmtPaid(userSalaryAmt.subtract(tempTotalAmount));
}else{
return ResultBody.error("佣金不够支付,支付失败");
}
}
userAppApi.feignCurriculumOrderLog(request.getHeader("token"),request,curriculumOrderLogVO);
curriculumOrderDO.setOrderTotalAmount(curriculumInfoDO.getRequireAmout());
curriculumOrderDO.setSalaryAmount(userSalaryAmt);
curriculumOrderDO.setWeChat(weChatPay);
curriculumOrderDO.setCashAmount(userCashAmt);
flyerTrainingDao.insertCurriculumOrder(curriculumOrderDO);
return ResultBody.success("支付成功");
}
/**
* 获取用户钱包信息
*
* @param
* @param request
* @return
*/
public ResultBody getCurrentUserPayWalletInfo(HttpServletRequest request) {
String token = request.getHeader("token");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("token", token);
FlyerTrainingServiceImpl.log.info("获取钱包信息的token:{}",token);
HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<MultiValueMap<String, Object>>(headers);
ResponseEntity<String> exchange = null;
try {
exchange = restTemplate.exchange(userApp + "/userapp/pay/getCurrentUserPayWalletInfo", HttpMethod.GET, formEntity, String.class);
} catch (RestClientException e) {
return ResultBody.error(ResultEnum.THE_THIRD_PARTY_INTERFACE_IS_BEING_UPDATED);
}
Object body = exchange.getBody();
JSONObject jsonObject = JSONObject.parseObject((String) body);
JSONObject result1 = (JSONObject) jsonObject.get("result");
PayWalletDTO payWalletDTO = JSON.parseObject(result1.toJSONString(), PayWalletDTO.class);
return ResultBody.success(payWalletDTO);
}
/**
* 分页查询订单列表
* @param param
......
......@@ -27,39 +27,65 @@
<insert id="addCurriculum" keyProperty="id" useGeneratedKeys="true"
parameterType="com.mmc.csf.release.entity.curriculum.CurriculumInfoDO">
INSERT INTO `curriculum_info`(`curriculum_name`, `supplier_id`, `curriculum_desc`, `drone_pilot_license_id`,
`flight_skills`, `categories_id`, `surface_url`, `video_url`, `detail_content`)
VALUES (#{curriculumName}, #{supplierId}, #{curriculumDesc}, #{dronePilotLicenseId}, #{flightSkills},
#{categoriesId}, #{surfaceUrl}, #{videoUrl}, #{detailContent});
INSERT INTO `curriculum_info`(`one_course_id`, `two_course_id`, `curriculum_name`, `curriculum_desc`,
`surface_url`, `video_url`, `course_attribute`, `require_amout`, `require_integral`, `is_hot`, `detail_content`)
VALUES (#{oneCourseId}, #{twoCourseId}, #{curriculumName}, #{curriculumDesc}, #{surfaceUrl},
#{videoUrl}, #{courseAttribute}, #{requireAmout}, #{requireIntegral}, #{isHot}, #{detailContent});
</insert>
<insert id="addCurriculumClassify" parameterType="com.mmc.csf.release.entity.curriculum.CurriculumClassifyDO">
INSERT INTO `course_classify`(`name`, `one_course_id`, `two_course_id`, `classify_url`, `classify_desc`)
VALUES (#{name}, #{oneCourseId}, #{twoCourseId}, #{classifyUrl}, #{classifyDesc});
</insert>
<insert id="insertCurriculumOrder" parameterType="com.mmc.csf.release.entity.curriculum.CurriculumOrderDO">
insert into curriculum_order
( id,order_no,user_account_id
,order_total_amount,salary_amount
,cash_amount,we_chat,wechat_pay_order_number
, curriculum_info_id, jifen_consume)
values (#{id},#{orderNo},#{userAccountId}
,#{orderTotalAmount},#{salaryAmount}
,#{cashAmount},#{weChat},#{wechatPayOrderNumber}
,#{curriculumInfoId}
,#{jifenConsume})
</insert>
<update id="updateCurriculum" parameterType="com.mmc.csf.release.entity.curriculum.CurriculumInfoDO">
UPDATE curriculum_info
<set>
<if test="oneCourseId != null">
one_course_id = #{oneCourseId},
</if>
<if test="twoCourseId != null">
two_course_id = #{twoCourseId},
</if>
<if test="curriculumName != null">
curriculum_name = #{curriculumName},
</if>
<if test="curriculumDesc != null">
curriculum_desc = #{curriculumDesc},
</if>
<if test="dronePilotLicenseId != null">
drone_pilot_license_id = #{dronePilotLicenseId},
</if>
<if test="flightSkills != null">
flight_skills = #{flightSkills},
</if>
<if test="categoriesId != null">
categories_id = #{categoriesId},
</if>
<if test="surfaceUrl != null">
surface_url = #{surfaceUrl},
</if>
<if test="videoUrl != null">
video_url = #{videoUrl},
</if>
<if test="detailContent ">
<if test="courseAttribute != null">
course_attribute = #{courseAttribute},
</if>
<if test="requireAmout != null">
require_amout = #{requireAmout},
</if>
<if test="requireIntegral != null">
require_integral = #{requireIntegral},
</if>
<if test="isHot != null">
is_hot = #{isHot},
</if>
<if test="detailContent != null ">
detail_content = #{detailContent},
</if>
update_time = NOW()
</set>
<where>
id = #{id}
......@@ -71,6 +97,36 @@
set is_deleted = 1
where id = #{id}
</update>
<update id="updateCurriculumClassify" parameterType="com.mmc.csf.release.entity.curriculum.CurriculumClassifyDO">
UPDATE course_classify
<set>
<if test="name != null">
name = #{name},
</if>
<if test="classifyUrl != null">
classify_url = #{classifyUrl},
</if>
<if test="classifyDesc != null">
classify_desc = #{classifyDesc},
</if>
update_time = NOW()
</set>
<where>
one_course_id = #{oneCourseId}
<if test="twoCourseId != null">
and two_course_id = #{twoCourseId}
</if>
</where>
</update>
<update id="removeCurriculumClassify">
UPDATE course_classify
<set>
is_deleted = 1
</set>
<where>
id = #{id}
</where>
</update>
<select id="selectAllLicenses" resultType="com.mmc.csf.release.flyer.vo.DronePilotLicenseVO">
select id,
parent_id,
......@@ -96,42 +152,33 @@
<if test="curriculumName != null">
and ci.curriculum_name like CONCAT("%", #{curriculumName}, "%")
</if>
<if test="licenseId != null">
and ci.drone_pilot_license_id = #{licenseId}
<if test="oneCourseId != null">
and ci.one_course_id = #{oneCourseId}
</if>
<if test="flightSkillsId != null">
and ci.flight_skills = #{flightSkillsId}
<if test="twoCourseId != null">
and ci.two_course_id = #{twoCourseId}
</if>
<if test="courseAttribute != null">
and ci.course_attribute = #{courseAttribute}
</if>
</where>
</select>
<select id="listPageCurriculumInfo" resultType="com.mmc.csf.release.entity.curriculum.CurriculumInfoDO">
SELECT
ci.id,
ci.curriculum_name,
ci.supplier_id,
ci.curriculum_price,
ci.curriculum_desc,
ci.is_free free,
ci.drone_pilot_license_id,
ci.flight_skills,
ci.detail_content,
ci.video_url,
ci.categories_id,
ci.surface_url
SELECT *
from curriculum_info ci
<where>
and ci.is_deleted = 0
<if test="curriculumName != null">
and ci.curriculum_name like CONCAT("%", #{curriculumName}, "%")
</if>
<if test="licenseId != null">
and drone_pilot_license_id = #{licenseId}
<if test="oneCourseId != null">
and ci.one_course_id = #{oneCourseId}
</if>
<if test="flightSkillsId != null">
and flight_skills = #{flightSkillsId}
<if test="twoCourseId != null">
and ci.two_course_id = #{twoCourseId}
</if>
<if test="categoriesId != null">
and categories_id = #{categoriesId}
<if test="courseAttribute != null">
and ci.course_attribute = #{courseAttribute}
</if>
</where>
order by ci.create_time desc
......@@ -204,4 +251,26 @@
from curriculum_info
where is_deleted = 0
</select>
<select id="countOneCourseClassify" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM course_classify
WHERE two_course_id IS NULL
</select>
<select id="countTwoCourseClassify" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM course_classify
WHERE one_course_id = #{one_course_id} and is_deleted = 0
</select>
<select id="selectCurriculumClassify"
resultType="com.mmc.csf.release.entity.curriculum.CurriculumClassifyDO">
select * from course_classify
where is_deleted = 0
</select>
<select id="selectCurriculumInfoById" resultType="com.mmc.csf.release.entity.curriculum.CurriculumInfoDO">
select * from curriculum_info where id = #{id}
</select>
<select id="selectCurriculumClassifyById"
resultType="com.mmc.csf.release.entity.curriculum.CurriculumClassifyDO">
select * from course_classify where id = #{id} and is_deleted = 0
</select>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论