From 8fbac0aa4cada58ed65c04b79bf1916237b12f7e Mon Sep 17 00:00:00 2001
From: zhangheng <3226558941@qq.com>
Date: Fri, 24 Nov 2023 14:22:54 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E5=9F=B9=E8=AE=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 8 +
xinelu-common/pom.xml | 6 +
.../common/enums/TrainingItemTypeEnum.java | 46 ++
.../common/enums/TrainingShelfFlagEnum.java | 29 +
.../xinelu/common/utils/file/FileUtils.java | 76 +-
.../TrainingCategoryController.java | 110 +++
.../trainingitem/TrainingItemController.java | 156 ++++
.../trainingcategory/TrainingCategory.java | 86 ++
.../domain/trainingitem/TrainingItem.java | 194 +++++
.../TrainingItemDirectory.java | 109 +++
.../NurseAppletPersonTrainingItemDTO.java | 58 ++
.../TrainingItemAndDirectory.java | 41 +
.../dto/trainingitem/TrainingItemDTO.java | 28 +
...NurseAppletPersonTrainingItemOrderDTO.java | 53 ++
.../TrainingCategoryMapper.java | 70 ++
.../trainingitem/TrainingItemMapper.java | 151 ++++
.../TrainingItemDirectoryMapper.java | 72 ++
.../ITrainingCategoryService.java | 65 ++
.../Impl/TrainingCategoryServiceImpl.java | 135 ++++
.../trainingitem/ITrainingItemService.java | 102 +++
.../Impl/TrainingItemServiceImpl.java | 427 ++++++++++
.../NurseAppletPersonTrainingItemVO.java | 47 ++
.../TrainingItemAndCategoryVO.java | 35 +
.../vo/trainingitem/TrainingItemVO.java | 27 +
.../TrainingItemDirectoryVO.java | 79 ++
.../TrainingCategoryMapper.xml | 170 ++++
.../trainingitem/TrainingItemMapper.xml | 753 ++++++++++++++++++
27 files changed, 3113 insertions(+), 20 deletions(-)
create mode 100644 xinelu-common/src/main/java/com/xinelu/common/enums/TrainingItemTypeEnum.java
create mode 100644 xinelu-common/src/main/java/com/xinelu/common/enums/TrainingShelfFlagEnum.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/controller/trainingcategory/TrainingCategoryController.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/controller/trainingitem/TrainingItemController.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingcategory/TrainingCategory.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingitem/TrainingItem.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingitemdirectory/TrainingItemDirectory.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/NurseAppletPersonTrainingItemDTO.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/TrainingItemAndDirectory.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/TrainingItemDTO.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingorder/NurseAppletPersonTrainingItemOrderDTO.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingcategory/TrainingCategoryMapper.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingitem/TrainingItemMapper.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingitemdirectory/TrainingItemDirectoryMapper.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingcategory/ITrainingCategoryService.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingcategory/Impl/TrainingCategoryServiceImpl.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingitem/ITrainingItemService.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingitem/Impl/TrainingItemServiceImpl.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/NurseAppletPersonTrainingItemVO.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/TrainingItemAndCategoryVO.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/TrainingItemVO.java
create mode 100644 xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitemdirectory/TrainingItemDirectoryVO.java
create mode 100644 xinelu-nurse-manage/src/main/resources/mapper/manage/trainingcategory/TrainingCategoryMapper.xml
create mode 100644 xinelu-nurse-manage/src/main/resources/mapper/manage/trainingitem/TrainingItemMapper.xml
diff --git a/pom.xml b/pom.xml
index e776c35..6273128 100644
--- a/pom.xml
+++ b/pom.xml
@@ -37,6 +37,7 @@
3.0.3
2.7.1
0.4.4
+ 1.0.2
@@ -243,6 +244,13 @@
wechatpay-apache-httpclient
${wechatpay-apiv3.version}
+
+
+
+ it.sauronsoftware
+ jave
+ ${jave.version}
+
diff --git a/xinelu-common/pom.xml b/xinelu-common/pom.xml
index 6527690..90ac090 100644
--- a/xinelu-common/pom.xml
+++ b/xinelu-common/pom.xml
@@ -191,6 +191,12 @@
core
3.4.0
+
+
+
+ it.sauronsoftware
+ jave
+
diff --git a/xinelu-common/src/main/java/com/xinelu/common/enums/TrainingItemTypeEnum.java b/xinelu-common/src/main/java/com/xinelu/common/enums/TrainingItemTypeEnum.java
new file mode 100644
index 0000000..82bfddd
--- /dev/null
+++ b/xinelu-common/src/main/java/com/xinelu/common/enums/TrainingItemTypeEnum.java
@@ -0,0 +1,46 @@
+package com.xinelu.common.enums;
+
+import lombok.Getter;
+
+/**
+ * 培训项目类型枚举
+ *
+ * @author ljh
+ * @version 1.0
+ * Create by 2023/4/20 17:33
+ */
+@Getter
+public enum TrainingItemTypeEnum {
+
+ /**
+ * 视频学习
+ */
+ VIDEO_LEARNING("VIDEO_LEARNING"),
+
+ /**
+ * 图文学习
+ */
+ GRAPHIC_LEARNING("GRAPHIC_LEARNING"),
+
+ /**
+ * 直播课程
+ */
+ LIVE_COURSES("LIVE_COURSES"),
+
+ /**
+ * 线下培训
+ */
+ OFFLINE_TRAINING("OFFLINE_TRAINING"),
+
+ /**
+ * 学习培训项目组
+ */
+ LEARNING_ITEM_GROUP("LEARNING_ITEM_GROUP"),
+ ;
+
+ final private String info;
+
+ TrainingItemTypeEnum(String info) {
+ this.info = info;
+ }
+}
\ No newline at end of file
diff --git a/xinelu-common/src/main/java/com/xinelu/common/enums/TrainingShelfFlagEnum.java b/xinelu-common/src/main/java/com/xinelu/common/enums/TrainingShelfFlagEnum.java
new file mode 100644
index 0000000..ce9ccc1
--- /dev/null
+++ b/xinelu-common/src/main/java/com/xinelu/common/enums/TrainingShelfFlagEnum.java
@@ -0,0 +1,29 @@
+package com.xinelu.common.enums;
+
+import lombok.Getter;
+
+/**
+ * @Description 学习培训课程上架状态枚举
+ * @Author 纪寒
+ * @Date 2023-04-25 16:27:58
+ * @Version 1.0
+ */
+@Getter
+public enum TrainingShelfFlagEnum {
+ /**
+ * 已上架
+ */
+ SHEL(0),
+
+ /**
+ * 未上架
+ */
+ NOT_SHEL(1),
+ ;
+
+ final private Integer info;
+
+ TrainingShelfFlagEnum(Integer info) {
+ this.info = info;
+ }
+}
\ No newline at end of file
diff --git a/xinelu-common/src/main/java/com/xinelu/common/utils/file/FileUtils.java b/xinelu-common/src/main/java/com/xinelu/common/utils/file/FileUtils.java
index aac2210..555529a 100644
--- a/xinelu-common/src/main/java/com/xinelu/common/utils/file/FileUtils.java
+++ b/xinelu-common/src/main/java/com/xinelu/common/utils/file/FileUtils.java
@@ -6,7 +6,9 @@ import com.xinelu.common.exception.ServiceException;
import com.xinelu.common.utils.DateUtils;
import com.xinelu.common.utils.StringUtils;
import com.xinelu.common.utils.uuid.IdUtils;
-import java.util.Base64;
+import it.sauronsoftware.jave.Encoder;
+import it.sauronsoftware.jave.MultimediaInfo;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.io.IOUtils;
@@ -22,6 +24,7 @@ import java.nio.charset.StandardCharsets;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
+import java.util.Base64;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -31,6 +34,7 @@ import java.util.regex.Pattern;
*
* @author xinelu
*/
+@Slf4j
public class FileUtils {
public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
@@ -339,6 +343,37 @@ public class FileUtils {
}
}
+ /**
+ * 根据视频文件地址获取对应的视频时长
+ *
+ * @param videoPath 视频地址
+ * @return 视频时长
+ */
+ public static LocalTime getVideoDuration(String videoPath) {
+ LocalTime duration;
+ File source = new File(videoPath);
+ if (source.length() > 0) {
+ Encoder encoder = new Encoder();
+ try {
+ MultimediaInfo m = encoder.getInfo(source);
+ long ls = m.getDuration() / 1000;
+ int hour = (int) (ls / 3600);
+ int minute = (int) (ls % 3600) / 60;
+ int second = (int) (ls - hour * 3600 - minute * 60);
+ String hourStr = hour < 10 ? "0" + hour : String.valueOf(hour);
+ String minuteStr = minute < 10 ? "0" + minute : String.valueOf(minute);
+ String secondStr = second < 10 ? "0" + second : String.valueOf(second);
+ String durationStr = hourStr + ":" + minuteStr + ":" + secondStr;
+ duration = LocalTime.parse(DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalTime.parse(durationStr)));
+ return duration;
+ } catch (Exception e) {
+ log.error("计算视频时长异常,异常信息为:{}", e.getMessage());
+ return null;
+ }
+ }
+ return null;
+ }
+
/**
* 图片上传接口
*
@@ -357,25 +392,26 @@ public class FileUtils {
return ajax;
}
- //将图片转换成Base64格式的数据集
- public static String PicToBase64(String filePath) {
- Base64.Encoder encoder = Base64.getEncoder();
- byte[] ImgContainer = null;
- FileInputStream fileInputStream = null;
- try {
- fileInputStream = new FileInputStream(filePath);
- ImgContainer = new byte[fileInputStream.available()];
- fileInputStream.read(ImgContainer);
- String Base64ImgData = encoder.encodeToString(ImgContainer);
- fileInputStream.close();
- return "data:image/png" + ";base64," + Base64ImgData;
- } catch (FileNotFoundException e) {
- return "找不到指定文件!";
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
+ //将图片转换成Base64格式的数据集
+ public static String PicToBase64(String filePath) {
+ Base64.Encoder encoder = Base64.getEncoder();
+ byte[] ImgContainer = null;
+ FileInputStream fileInputStream = null;
+ try {
+ fileInputStream = new FileInputStream(filePath);
+ ImgContainer = new byte[fileInputStream.available()];
+ fileInputStream.read(ImgContainer);
+ String Base64ImgData = encoder.encodeToString(ImgContainer);
+ fileInputStream.close();
+ return "data:image/png" + ";base64," + Base64ImgData;
+ } catch (FileNotFoundException e) {
+ return "找不到指定文件!";
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
/**
* 视频上传接口
*
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/controller/trainingcategory/TrainingCategoryController.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/controller/trainingcategory/TrainingCategoryController.java
new file mode 100644
index 0000000..3e363cb
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/controller/trainingcategory/TrainingCategoryController.java
@@ -0,0 +1,110 @@
+package com.xinelu.manage.controller.trainingcategory;
+
+
+import com.xinelu.common.annotation.Log;
+import com.xinelu.common.constant.Constants;
+import com.xinelu.common.core.controller.BaseController;
+import com.xinelu.common.core.domain.AjaxResult;
+import com.xinelu.common.core.page.TableDataInfo;
+import com.xinelu.common.enums.BusinessType;
+import com.xinelu.common.utils.poi.ExcelUtil;
+import com.xinelu.manage.domain.trainingcategory.TrainingCategory;
+import com.xinelu.manage.service.trainingcategory.ITrainingCategoryService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 学习培训分类Controller
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+@RestController
+@RequestMapping("/system/trainingCategory")
+public class TrainingCategoryController extends BaseController {
+ @Resource
+ private ITrainingCategoryService trainingCategoryService;
+
+ /**
+ * 查询学习培训分类列表
+ */
+ @PreAuthorize("@ss.hasPermi('system:trainingCategory:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(TrainingCategory trainingCategory) {
+ startPage();
+ List list = trainingCategoryService.selectTrainingCategoryList(trainingCategory);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出学习培训分类列表
+ */
+ @PreAuthorize("@ss.hasPermi('system:trainingCategory:export')")
+ @Log(title = "学习培训分类", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, TrainingCategory trainingCategory) {
+ List list = trainingCategoryService.selectTrainingCategoryList(trainingCategory);
+ ExcelUtil util = new ExcelUtil<>(TrainingCategory.class);
+ util.exportExcel(response, list, "学习培训分类数据");
+ }
+
+ /**
+ * 获取学习培训分类详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('system:trainingCategory:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id) {
+ return AjaxResult.success(trainingCategoryService.selectTrainingCategoryById(id));
+ }
+
+ /**
+ * 新增学习培训分类
+ */
+ @PreAuthorize("@ss.hasPermi('system:trainingCategory:add')")
+ @Log(title = "学习培训分类", businessType = BusinessType.INSERT)
+ @PostMapping("/add")
+ public AjaxResult add(@RequestBody TrainingCategory trainingCategory) {
+ return toAjax(trainingCategoryService.insertTrainingCategory(trainingCategory));
+ }
+
+ /**
+ * 修改学习培训分类
+ */
+ @PreAuthorize("@ss.hasPermi('system:trainingCategory:edit')")
+ @Log(title = "学习培训分类", businessType = BusinessType.UPDATE)
+ @PostMapping("/edit")
+ public AjaxResult edit(@RequestBody TrainingCategory trainingCategory) {
+ return trainingCategoryService.updateTrainingCategory(trainingCategory);
+ }
+
+ /**
+ * 删除学习培训分类
+ */
+ @PreAuthorize("@ss.hasPermi('system:trainingCategory:remove')")
+ @Log(title = "学习培训分类", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids) {
+ return trainingCategoryService.deleteTrainingCategoryByIds(ids);
+ }
+
+ /**
+ * 图片上传
+ */
+ @PostMapping("/uploadTrainingCategoryPicture")
+ public AjaxResult uploadTrainingCategoryPicture(@RequestParam("file") MultipartFile multipartFile) throws Exception {
+ if (Objects.isNull(multipartFile) || StringUtils.isBlank(multipartFile.getOriginalFilename())) {
+ return AjaxResult.error("当前文件不存在,无法上传!");
+ }
+ if (multipartFile.getOriginalFilename().contains(Constants.EMPTY)) {
+ return AjaxResult.error("当前文件名含有空格,请先去除空格在上传!");
+ }
+ return trainingCategoryService.uploadTrainingCategoryPicture(multipartFile);
+ }
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/controller/trainingitem/TrainingItemController.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/controller/trainingitem/TrainingItemController.java
new file mode 100644
index 0000000..b1f6f18
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/controller/trainingitem/TrainingItemController.java
@@ -0,0 +1,156 @@
+package com.xinelu.manage.controller.trainingitem;
+
+
+import com.xinelu.common.annotation.Log;
+import com.xinelu.common.constant.Constants;
+import com.xinelu.common.core.controller.BaseController;
+import com.xinelu.common.core.domain.AjaxResult;
+import com.xinelu.common.core.page.TableDataInfo;
+import com.xinelu.common.custominterface.Insert;
+import com.xinelu.common.custominterface.Update;
+import com.xinelu.common.enums.BusinessType;
+import com.xinelu.manage.domain.trainingitem.TrainingItem;
+import com.xinelu.manage.dto.trainingitem.TrainingItemAndDirectory;
+import com.xinelu.manage.service.trainingitem.ITrainingItemService;
+import com.xinelu.manage.vo.trainingitem.TrainingItemAndCategoryVO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 学习培训项目信息Controller
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+@RestController
+@RequestMapping("/system/trainingItem")
+public class TrainingItemController extends BaseController {
+ @Resource
+ private ITrainingItemService trainingItemService;
+
+ /**
+ * 查询学习培训项目信息列表
+ */
+ @PreAuthorize("@ss.hasPermi('system:trainingItem:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(TrainingItem trainingItem) {
+ startPage();
+ List list = trainingItemService.selectTrainingItemList(trainingItem);
+ return getDataTable(list);
+ }
+
+ /**
+ * 获取学习培训项目信息详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('system:trainingItem:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id) {
+ if (Objects.isNull(id)) {
+ return AjaxResult.error("学习培训课程信息为空!");
+ }
+ return AjaxResult.success(trainingItemService.selectTrainingItemById(id));
+ }
+
+ /**
+ * 新增学习培训项目信息
+ */
+ @PreAuthorize("@ss.hasPermi('system:trainingItem:add')")
+ @Log(title = "学习培训课程信息", businessType = BusinessType.INSERT)
+ @PostMapping("/add")
+ public AjaxResult add(@RequestBody @Validated(Insert.class) TrainingItemAndDirectory trainingItem) {
+ return trainingItemService.insertTrainingItem(trainingItem);
+ }
+
+ /**
+ * 修改学习培训项目信息
+ */
+ @PreAuthorize("@ss.hasPermi('system:trainingItem:edit')")
+ @Log(title = "学习培训课程信息", businessType = BusinessType.UPDATE)
+ @PostMapping("/edit")
+ public AjaxResult edit(@RequestBody @Validated(Update.class) TrainingItemAndDirectory trainingItem) {
+ if (Objects.isNull(trainingItem) || Objects.isNull(trainingItem.getTrainingItemId())) {
+ return AjaxResult.error("请输入需要修改信息!");
+ }
+ return trainingItemService.updateTrainingItem(trainingItem);
+ }
+
+ /**
+ * 删除学习培训项目信息
+ */
+ @PreAuthorize("@ss.hasPermi('system:trainingItem:remove')")
+ @Log(title = "学习培训课程信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids) {
+ if (Objects.isNull(ids)) {
+ return AjaxResult.error("请传入需要删除的信息!");
+ }
+ return trainingItemService.deleteTrainingItemByIds(ids);
+ }
+
+ /**
+ * 图片上传
+ */
+ @PostMapping("/uploadUrl")
+ public AjaxResult uploadUrl(@RequestParam("file") MultipartFile multipartFile, String type) throws Exception {
+ if (StringUtils.isBlank(type)) {
+ return AjaxResult.error("请选择所要上传的路径类型!");
+ }
+ if (Objects.isNull(multipartFile) || StringUtils.isBlank(multipartFile.getOriginalFilename())) {
+ return AjaxResult.error("当前文件不存在,无法上传!");
+ }
+ if (multipartFile.getOriginalFilename().contains(Constants.EMPTY)) {
+ return AjaxResult.error("当前文件名含有空格,请先去除空格在上传!");
+ }
+ return trainingItemService.uploadUrl(multipartFile, type);
+ }
+
+ /**
+ * 上传视频
+ */
+ @PostMapping("/uploadVideoUrl")
+ public AjaxResult uploadVideoUrl(@RequestParam("file") MultipartFile multipartFile) throws Exception {
+ if (Objects.isNull(multipartFile)) {
+ return AjaxResult.error("请选择视频!");
+ }
+ return trainingItemService.uploadVideoUrl(multipartFile);
+ }
+
+ /**
+ * 父级项目组
+ */
+ @GetMapping("/selectTrainingParent")
+ public TableDataInfo selectTrainingParent(TrainingItemAndDirectory trainingItem) {
+ startPage();
+ List list = trainingItemService.selectTrainingParent(trainingItem);
+ return getDataTable(list);
+ }
+
+ /**
+ * 修改上下架状态
+ */
+ @PostMapping("/updateTrainingShelfFlag")
+ public AjaxResult updateTrainingShelfFlag(@RequestBody TrainingItem trainingItem) {
+ if (Objects.isNull(trainingItem) || Objects.isNull(trainingItem.getId()) || Objects.isNull(trainingItem.getTrainingShelfFlag())) {
+ return AjaxResult.error("请选择学习培训项目信息!");
+ }
+ return trainingItemService.updateTrainingShelfFlag(trainingItem);
+ }
+
+ /**
+ * 查询下级项目
+ */
+ @GetMapping("selectSubordinateItem")
+ public AjaxResult selectSubordinateItem(TrainingItem trainingItem) {
+ if (Objects.isNull(trainingItem) || Objects.isNull(trainingItem.getTrainingParentId())) {
+ return AjaxResult.error("请选择需要查询的项目信息!");
+ }
+ return trainingItemService.selectSubordinateItem(trainingItem);
+ }
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingcategory/TrainingCategory.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingcategory/TrainingCategory.java
new file mode 100644
index 0000000..b136403
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingcategory/TrainingCategory.java
@@ -0,0 +1,86 @@
+package com.xinelu.manage.domain.trainingcategory;
+
+import com.xinelu.common.annotation.Excel;
+import com.xinelu.common.core.domain.BaseDomain;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.io.Serializable;
+
+/**
+ * 学习培训分类对象 training_category
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "学习培训分类对象", description = "training_category")
+public class TrainingCategory extends BaseDomain implements Serializable {
+ private static final long serialVersionUID = 7472672566803333086L;
+ /**
+ * 主键id
+ */
+ private Long id;
+
+ /**
+ * 父级分类id
+ */
+ @ApiModelProperty(value = "父级分类id")
+ @Excel(name = "父级分类id")
+ private Long parentId;
+
+ /**
+ * 培训分类名称
+ */
+ @ApiModelProperty(value = "培训分类名称")
+ @Excel(name = "培训分类名称")
+ private String trainingCategoryName;
+
+ /**
+ * 培训分类编码
+ */
+ @ApiModelProperty(value = "培训分类编码")
+ @Excel(name = "培训分类编码")
+ private String trainingCategoryCode;
+
+ /**
+ * 培训分类图片路径
+ */
+ @ApiModelProperty(value = "培训分类图片路径")
+ @Excel(name = "培训分类图片路径")
+ private String trainingCategoryPictureUrl;
+
+ /**
+ * 培训分类排序
+ */
+ @ApiModelProperty(value = "培训分类排序")
+ @Excel(name = "培训分类排序")
+ private Integer trainingCategorySort;
+
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("parentId", getParentId())
+ .append("trainingCategoryName", getTrainingCategoryName())
+ .append("trainingCategoryCode", getTrainingCategoryCode())
+ .append("trainingCategoryPictureUrl", getTrainingCategoryPictureUrl())
+ .append("trainingCategorySort", getTrainingCategorySort())
+ .append("remark", getRemark())
+ .append("createBy", getCreateBy())
+ .append("createTime", getCreateTime())
+ .append("updateBy", getUpdateBy())
+ .append("updateTime", getUpdateTime())
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingitem/TrainingItem.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingitem/TrainingItem.java
new file mode 100644
index 0000000..6b297c9
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingitem/TrainingItem.java
@@ -0,0 +1,194 @@
+package com.xinelu.manage.domain.trainingitem;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xinelu.common.annotation.Excel;
+import com.xinelu.common.core.domain.BaseDomain;
+import com.xinelu.common.custominterface.Insert;
+import com.xinelu.common.custominterface.Update;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalTime;
+
+/**
+ * 学习培训项目信息对象 training_item
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "学习培训项目信息对象", description = "training_item")
+public class TrainingItem extends BaseDomain implements Serializable {
+ private static final long serialVersionUID = -3956320664123691176L;
+ /**
+ * 主键id
+ */
+ private Long id;
+
+ /**
+ * 培训分类表id
+ */
+ @ApiModelProperty(value = "培训分类表id")
+ @Excel(name = "培训分类表id")
+ private Long trainingCategoryId;
+
+ /**
+ * 培训项目父级id
+ */
+ private Long trainingParentId;
+
+ /**
+ * 培训项目标题
+ */
+ @NotBlank(message = "培训项目标题不能为空", groups = {Insert.class, Update.class})
+ @ApiModelProperty(value = "培训项目标题")
+ @Excel(name = "培训项目标题")
+ private String trainingItemTitle;
+
+ /**
+ * 培训项目编号
+ */
+ @ApiModelProperty(value = "培训项目编号")
+ @Excel(name = "培训项目编号")
+ private String trainingItemCode;
+
+ /**
+ * 培训项目价格
+ */
+ @ApiModelProperty(value = "培训项目价格")
+ @Excel(name = "培训项目价格")
+ private BigDecimal trainingItemPrice;
+
+ /**
+ * 培训项目logo图片路径
+ */
+ @ApiModelProperty(value = "培训项目logo图片路径")
+ @Excel(name = "培训项目logo图片路径")
+ private String trainingItemCoverUrl;
+
+ /**
+ * 培训项目海报图片路径
+ */
+ @ApiModelProperty(value = "培训项目海报图片路径")
+ @Excel(name = "培训项目海报图片路径")
+ private String trainingItemPosterUrl;
+
+ /**
+ * 培训项目类型,视频学习:VIDEO_LEARNING,图文学习:GRAPHIC_LEARNING,直播课程:LIVE_COURSES,线下培训:OFFLINE_TRAINING
+ */
+ @NotBlank(message = "培训项目类型不能为空", groups = {Insert.class, Update.class})
+ @ApiModelProperty(value = "培训项目类型,学习培训项目组:LEARNING_ITEM_GROUP,视频学习:VIDEO_LEARNING,图文学习:GRAPHIC_LEARNING,直播课程:LIVE_COURSES,线下培训:OFFLINE_TRAINING")
+ @Excel(name = "培训项目类型,学习培训项目组:LEARNING_ITEM_GROUP,视频学习:VIDEO_LEARNING,图文学习:GRAPHIC_LEARNING,直播课程:LIVE_COURSES,线下培训:OFFLINE_TRAINING")
+ private String trainingItemType;
+
+ /**
+ * 培训项目详情,视频学习和直播课程培训类型使用
+ */
+ @ApiModelProperty(value = "培训项目详情,视频学习和直播课程培训类型使用")
+ @Excel(name = "培训项目详情,视频学习和直播课程培训类型使用")
+ private String trainingItemDetails;
+
+ /**
+ * 培训项目内容,图文学习类型使用,主要存放图文学习类型的内容
+ */
+ @ApiModelProperty(value = "培训项目内容,图文学习类型使用,主要存放图文学习类型的内容")
+ @Excel(name = "培训项目内容,图文学习类型使用,主要存放图文学习类型的内容")
+ private String trainingItemContent;
+
+ /**
+ * 培训项目日期,格式:yyyy-MM-dd,直播课程和线下培训类型使用
+ */
+ @ApiModelProperty(value = "培训项目日期,格式:yyyy-MM-dd,直播课程和线下培训类型使用")
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @DateTimeFormat(pattern = "yyyy-MM-dd")
+ @Excel(name = "培训项目日期,格式:yyyy-MM-dd,直播课程和线下培训类型使用", width = 30, dateFormat = "yyyy-MM-dd")
+ private LocalDate trainingItemDate;
+
+ /**
+ * 培训项目开始时间,格式:HH:mm:ss,直播课程和线下培训类型使用
+ */
+ @ApiModelProperty(value = "培训项目开始时间,格式:HH:mm:ss,直播课程和线下培训类型使用")
+ @JsonFormat(pattern = "HH:mm:ss")
+ @Excel(name = "培训项目开始时间,格式:HH:mm:ss,直播课程和线下培训类型使用", width = 30, dateFormat = "yyyy-MM-dd")
+ private LocalTime trainingItemStartTime;
+
+ /**
+ * 培训项目结束时间,格式:HH:mm:ss,直播课程和线下培训类型使用
+ */
+ @ApiModelProperty(value = "培训项目结束时间,格式:HH:mm:ss,直播课程和线下培训类型使用")
+ @JsonFormat(pattern = "HH:mm:ss")
+ @Excel(name = "培训项目结束时间,格式:HH:mm:ss,直播课程和线下培训类型使用", width = 30, dateFormat = "yyyy-MM-dd")
+ private LocalTime trainingItemEndTime;
+
+ /**
+ * 培训项目地址,线下培训类型使用,存放线下培训的地址
+ */
+ @ApiModelProperty(value = "培训项目地址,线下培训类型使用,存放线下培训的地址")
+ @Excel(name = "培训项目地址,线下培训类型使用,存放线下培训的地址")
+ private String trainingItemAddress;
+
+ /**
+ * 报名须知,线下培训使用,存放线下报名须知信息
+ */
+ @ApiModelProperty(value = "报名须知,线下培训使用,存放线下报名须知信息")
+ @Excel(name = "报名须知,线下培训使用,存放线下报名须知信息")
+ private String trainingItemNotes;
+
+ /**
+ * 是否可以购买,0:是,1:否
+ */
+ private Integer buyFlag;
+
+ /**
+ * 培训项目排序
+ */
+ @ApiModelProperty(value = "培训项目排序")
+ @Excel(name = "培训项目排序")
+ private Integer trainingItemSort;
+
+ /**
+ * 上架标识,0:已上架,1:未上架
+ */
+ private Integer trainingShelfFlag;
+
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("trainingCategoryId", getTrainingCategoryId())
+ .append("trainingItemTitle", getTrainingItemTitle())
+ .append("trainingItemCode", getTrainingItemCode())
+ .append("trainingItemPrice", getTrainingItemPrice())
+ .append("trainingItemCoverUrl", getTrainingItemCoverUrl())
+ .append("trainingItemPosterUrl", getTrainingItemPosterUrl())
+ .append("trainingItemType", getTrainingItemType())
+ .append("trainingItemDetails", getTrainingItemDetails())
+ .append("trainingItemContent", getTrainingItemContent())
+ .append("trainingItemDate", getTrainingItemDate())
+ .append("trainingItemStartTime", getTrainingItemStartTime())
+ .append("trainingItemEndTime", getTrainingItemEndTime())
+ .append("trainingItemAddress", getTrainingItemAddress())
+ .append("trainingItemNotes", getTrainingItemNotes())
+ .append("trainingItemSort", getTrainingItemSort())
+ .append("createBy", getCreateBy())
+ .append("createTime", getCreateTime())
+ .append("updateBy", getUpdateBy())
+ .append("updateTime", getUpdateTime())
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingitemdirectory/TrainingItemDirectory.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingitemdirectory/TrainingItemDirectory.java
new file mode 100644
index 0000000..db7c88d
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/domain/trainingitemdirectory/TrainingItemDirectory.java
@@ -0,0 +1,109 @@
+package com.xinelu.manage.domain.trainingitemdirectory;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xinelu.common.annotation.Excel;
+import com.xinelu.common.core.domain.BaseDomain;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.io.Serializable;
+import java.time.LocalTime;
+
+/**
+ * 学习培训项目章节对象 training_item_directory
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "学习培训项目章节对象", description = "training_item_directory")
+public class TrainingItemDirectory extends BaseDomain implements Serializable {
+ private static final long serialVersionUID = -1110703661850660701L;
+ /**
+ * 主键id
+ */
+ private Long id;
+
+ /**
+ * 培训项目表id
+ */
+ @ApiModelProperty(value = "培训项目表id")
+ @Excel(name = "培训项目表id")
+ private Long trainingItemId;
+
+ /**
+ * 培训项目章节名称
+ */
+ @ApiModelProperty(value = "培训项目章节名称")
+ @Excel(name = "培训项目章节名称")
+ private String itemDirectoryName;
+
+ /**
+ * 培训项目章节编码
+ */
+ @ApiModelProperty(value = "培训项目章节编码")
+ @Excel(name = "培训项目章节编码")
+ private String itemDirectoryCode;
+
+ /**
+ * 培训项目章节标题
+ */
+ @ApiModelProperty(value = "培训项目章节标题")
+ @Excel(name = "培训项目章节标题")
+ private String itemDirectoryTitle;
+
+ /**
+ * 培训项目章节视频存放地址
+ */
+ @ApiModelProperty(value = "培训项目章节视频存放地址")
+ @Excel(name = "培训项目章节视频存放地址")
+ private String itemDirectoryUrl;
+
+ /**
+ * 培训章节视频时长
+ */
+ @JsonFormat(pattern = "HH:mm:ss")
+ private LocalTime itemDirectoryVideoDuration;
+
+ /**
+ * 培训项目章节内容简介
+ */
+ @ApiModelProperty(value = "培训项目章节内容简介")
+ @Excel(name = "培训项目章节内容简介")
+ private String itemDirectoryIntroduce;
+
+ /**
+ * 培训项目章节排序
+ */
+ @ApiModelProperty(value = "培训项目章节排序")
+ @Excel(name = "培训项目章节排序")
+ private Integer itemDirectorySort;
+
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("trainingItemId", getTrainingItemId())
+ .append("itemDirectoryName", getItemDirectoryName())
+ .append("itemDirectoryCode", getItemDirectoryCode())
+ .append("itemDirectoryTitle", getItemDirectoryTitle())
+ .append("itemDirectoryUrl", getItemDirectoryUrl())
+ .append("itemDirectoryIntroduce", getItemDirectoryIntroduce())
+ .append("itemDirectorySort", getItemDirectorySort())
+ .append("createBy", getCreateBy())
+ .append("createTime", getCreateTime())
+ .append("updateBy", getUpdateBy())
+ .append("updateTime", getUpdateTime())
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/NurseAppletPersonTrainingItemDTO.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/NurseAppletPersonTrainingItemDTO.java
new file mode 100644
index 0000000..f902638
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/NurseAppletPersonTrainingItemDTO.java
@@ -0,0 +1,58 @@
+package com.xinelu.manage.dto.trainingitem;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 护理员学习培训DTO
+ *
+ * @author ljh
+ * @version 1.0
+ * Create by 2023/4/21 11:02
+ */
+@Data
+public class NurseAppletPersonTrainingItemDTO implements Serializable {
+
+ private static final long serialVersionUID = 8981152698442355834L;
+
+ /**
+ * 分类id
+ **/
+ private Long trainingCategoryId;
+
+ /**
+ * 培训项目id
+ */
+ private Long trainingItemId;
+
+ /**
+ * 培训项目父级id
+ */
+ private Long trainingParentId;
+
+ /**
+ * 培训项目类型,视频学习:VIDEO_LEARNING,图文学习:GRAPHIC_LEARNING,直播课程:LIVE_COURSES,线下培训:OFFLINE_TRAINING,学习培训项目组:LEARNING_ITEM_GROUP
+ */
+ private String trainingItemType;
+
+ /**
+ * 护理员表id
+ */
+ private Long nurseStationPersonId;
+
+ /**
+ * 订单状态,待付款:WAIT_PAY,已付款:PAY,退款中:WAIT_REFUND,已退款:REFUNDED,已取消:CANCEL
+ */
+ private String trainingOrderStatus;
+
+ /**
+ * 订单明细id
+ */
+ private Long trainingOrderDetailsId;
+
+ /**
+ * 订单编号
+ */
+ private String trainingOrderNo;
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/TrainingItemAndDirectory.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/TrainingItemAndDirectory.java
new file mode 100644
index 0000000..3c88d16
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/TrainingItemAndDirectory.java
@@ -0,0 +1,41 @@
+package com.xinelu.manage.dto.trainingitem;
+
+import com.xinelu.manage.domain.trainingitem.TrainingItem;
+import com.xinelu.manage.vo.trainingitemdirectory.TrainingItemDirectoryVO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 学习培训项目信息对象 training_item
+ *
+ * @author zh
+ * @date 2023-04-21
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TrainingItemAndDirectory extends TrainingItem implements Serializable {
+ private static final long serialVersionUID = -5750779226642929884L;
+
+ /**
+ * 章节视频
+ */
+ private List trainingItemDirectoryList;
+
+ /**
+ * 学习培训项目信息对象主键id
+ */
+ private Long trainingItemId;
+
+ /**
+ * 分类名字
+ */
+ private String trainingCategoryName;
+
+ /**
+ * 父级项目名称
+ */
+ private String trainingParentName;
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/TrainingItemDTO.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/TrainingItemDTO.java
new file mode 100644
index 0000000..b7e91dd
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingitem/TrainingItemDTO.java
@@ -0,0 +1,28 @@
+package com.xinelu.manage.dto.trainingitem;
+
+import com.xinelu.manage.domain.trainingitem.TrainingItem;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * @author ljh
+ * @version 1.0
+ * Create by 2023/4/26 13:56
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TrainingItemDTO extends TrainingItem implements Serializable {
+ private static final long serialVersionUID = 7823310897700958081L;
+
+ /**
+ * 护理人员id
+ */
+ private Long nurseStationPersonId;
+
+ /**
+ * 订单状态,待付款:WAIT_PAY,已付款:PAY,退款中:WAIT_REFUND,已退款:REFUNDED,已取消:CANCEL',
+ */
+ private String trainingOrderStatus;
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingorder/NurseAppletPersonTrainingItemOrderDTO.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingorder/NurseAppletPersonTrainingItemOrderDTO.java
new file mode 100644
index 0000000..834e77b
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/dto/trainingorder/NurseAppletPersonTrainingItemOrderDTO.java
@@ -0,0 +1,53 @@
+package com.xinelu.manage.dto.trainingorder;
+
+import com.xinelu.common.custominterface.Insert;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author ljh
+ * @version 1.0
+ * Create by 2023/4/21 14:38
+ */
+@Data
+public class NurseAppletPersonTrainingItemOrderDTO implements Serializable {
+ private static final long serialVersionUID = 3880260231562214744L;
+ /**
+ * 培训项目表id
+ */
+ @NotNull(message = "学习课程信息不存在,无法购买!", groups = {Insert.class})
+ private Long trainingItemId;
+
+ /**
+ * 培训项目表父id
+ */
+ private Long trainingParentId;
+
+ /**
+ * 护理站id
+ */
+ @NotNull(message = "所属护理站信息不存在,无法购买!", groups = {Insert.class})
+ private Long nurseStationId;
+
+ /**
+ * 护理员表id
+ */
+ @NotNull(message = "护理员人员信息不存在,无法够买!", groups = {Insert.class})
+ private Long nurseStationPersonId;
+
+ /**
+ * 订单金额
+ */
+ @NotNull(message = "订单金额错误,无法购买!", groups = {Insert.class})
+ private BigDecimal trainingOrderAmount;
+
+ /**
+ * 护理员名称
+ */
+ @NotBlank(message = "护理员姓名不存在,无法购买!", groups = {Insert.class})
+ private String nursePersonName;
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingcategory/TrainingCategoryMapper.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingcategory/TrainingCategoryMapper.java
new file mode 100644
index 0000000..80f2742
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingcategory/TrainingCategoryMapper.java
@@ -0,0 +1,70 @@
+package com.xinelu.manage.mapper.trainingcategory;
+
+
+import com.xinelu.manage.domain.trainingcategory.TrainingCategory;
+
+import java.util.List;
+
+/**
+ * 学习培训分类Mapper接口
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+public interface TrainingCategoryMapper {
+ /**
+ * 查询学习培训分类
+ *
+ * @param id 学习培训分类主键
+ * @return 学习培训分类
+ */
+ TrainingCategory selectTrainingCategoryById(Long id);
+
+ /**
+ * 查询学习培训分类列表
+ *
+ * @param trainingCategory 学习培训分类
+ * @return 学习培训分类集合
+ */
+ List selectTrainingCategoryList(TrainingCategory trainingCategory);
+
+ /**
+ * 新增学习培训分类
+ *
+ * @param trainingCategory 学习培训分类
+ * @return 结果
+ */
+ int insertTrainingCategory(TrainingCategory trainingCategory);
+
+ /**
+ * 修改学习培训分类
+ *
+ * @param trainingCategory 学习培训分类
+ * @return 结果
+ */
+ int updateTrainingCategory(TrainingCategory trainingCategory);
+
+ /**
+ * 删除学习培训分类
+ *
+ * @param id 学习培训分类主键
+ * @return 结果
+ */
+ int deleteTrainingCategoryById(Long id);
+
+ /**
+ * 批量删除学习培训分类
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ int deleteTrainingCategoryByIds(Long[] ids);
+
+ /**
+ * 查询学习培训分类
+ *
+ * @param ids 学习培训分类主键
+ * @return 学习培训分类
+ */
+ List selectTrainingCategoryByIds(Long[] ids);
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingitem/TrainingItemMapper.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingitem/TrainingItemMapper.java
new file mode 100644
index 0000000..3bea656
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingitem/TrainingItemMapper.java
@@ -0,0 +1,151 @@
+package com.xinelu.manage.mapper.trainingitem;
+
+import com.xinelu.manage.domain.trainingitem.TrainingItem;
+import com.xinelu.manage.dto.trainingitem.NurseAppletPersonTrainingItemDTO;
+import com.xinelu.manage.dto.trainingitem.TrainingItemAndDirectory;
+import com.xinelu.manage.dto.trainingitem.TrainingItemDTO;
+import com.xinelu.manage.dto.trainingorder.NurseAppletPersonTrainingItemOrderDTO;
+import com.xinelu.manage.vo.trainingitem.NurseAppletPersonTrainingItemVO;
+import com.xinelu.manage.vo.trainingitem.TrainingItemAndCategoryVO;
+import com.xinelu.manage.vo.trainingitem.TrainingItemVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+/**
+ * 学习培训项目信息Mapper接口
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+public interface TrainingItemMapper {
+ /**
+ * 查询学习培训项目信息
+ *
+ * @param id 学习培训项目信息主键
+ * @return 学习培训项目信息
+ */
+ TrainingItem selectTrainingItemById(Long id);
+
+ /**
+ * 查询学习培训项目信息列表
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 学习培训项目信息集合
+ */
+ List selectTrainingItemList(TrainingItem trainingItem);
+
+ /**
+ * 新增学习培训项目信息
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 结果
+ */
+ int insertTrainingItem(TrainingItem trainingItem);
+
+ /**
+ * 修改学习培训项目信息
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 结果
+ */
+ int updateTrainingItem(TrainingItem trainingItem);
+
+ /**
+ * 删除学习培训项目信息
+ *
+ * @param id 学习培训项目信息主键
+ * @return 结果
+ */
+ int deleteTrainingItemById(Long id);
+
+ /**
+ * 批量删除学习培训项目信息
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ int deleteTrainingItemByIds(List ids);
+
+ /**
+ * 查询学习培训项目信息列表
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 学习培训项目信息集合
+ */
+ List selectTrainingLearnItemList(NurseAppletPersonTrainingItemOrderDTO trainingItem);
+
+ /**
+ * 查询学习培训项目详情信息
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 学习培训项目信息集合
+ */
+ NurseAppletPersonTrainingItemVO selectTrainingLearnItemDetailsList(NurseAppletPersonTrainingItemDTO trainingItem);
+
+ /**
+ * 查询学习培训项目信息列表
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 学习培训项目信息集合
+ */
+ List selectTrainingItemAndCategoryList(TrainingItem trainingItem);
+
+ /**
+ * 查询学习培训项目信息
+ *
+ * @param id 学习培训项目信息主键
+ * @return 学习培训项目信息
+ */
+ TrainingItemAndDirectory selectTrainingItemAndDirectoryById(Long id);
+
+ /**
+ * 根据id集合查询学习培训项目信息列表集合
+ *
+ * @param trainingItemIdList 学习培训项目id集合
+ * @return 学习培训项目信息集合
+ */
+ List selectTrainingItemByIdList(@Param("trainingItemIdList") List trainingItemIdList);
+
+ /**
+ * 项目信息
+ *
+ * @param ids 项目ids
+ * @param trainingParentIds 项目ids
+ * @return TrainingItemAndDirectory
+ */
+ List selectTrainingItemAndDirectoryList(@Param("ids") Long[] ids, @Param("trainingParentIds") Long[] trainingParentIds);
+
+ /**
+ * 查询学习培训项目信息列表
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 学习培训项目信息集合
+ */
+ List selectTrainingItems(TrainingItemAndDirectory trainingItem);
+
+ /**
+ * 查询学习培训项目信息列表
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 学习培训项目信息集合
+ */
+ List getTrainingItemList(TrainingItemDTO trainingItem);
+
+ /**
+ * 修改学习培训项目信息
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 结果
+ */
+ int updateTrainingItems(TrainingItem trainingItem);
+
+ /**
+ * 修改学习培训项目信息
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 结果
+ */
+ int updateTrainingItemList(TrainingItem trainingItem);
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingitemdirectory/TrainingItemDirectoryMapper.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingitemdirectory/TrainingItemDirectoryMapper.java
new file mode 100644
index 0000000..d643b49
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/mapper/trainingitemdirectory/TrainingItemDirectoryMapper.java
@@ -0,0 +1,72 @@
+package com.xinelu.manage.mapper.trainingitemdirectory;
+
+
+import com.xinelu.manage.domain.trainingitemdirectory.TrainingItemDirectory;
+import com.xinelu.manage.vo.trainingitemdirectory.TrainingItemDirectoryVO;
+
+import java.util.List;
+
+
+/**
+ * 学习培训项目章节Mapper接口
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+public interface TrainingItemDirectoryMapper {
+ /**
+ * 查询学习培训项目章节
+ *
+ * @param id 学习培训项目章节主键
+ * @return 学习培训项目章节
+ */
+ TrainingItemDirectory selectTrainingItemDirectoryById(Long id);
+
+ /**
+ * 查询学习培训项目章节列表
+ *
+ * @param trainingItemDirectory 学习培训项目章节
+ * @return 学习培训项目章节集合
+ */
+ List selectTrainingItemDirectoryList(TrainingItemDirectory trainingItemDirectory);
+
+ /**
+ * 新增学习培训项目章节
+ *
+ * @param trainingItemDirectory 学习培训项目章节
+ * @return 结果
+ */
+ int insertTrainingItemDirectory(TrainingItemDirectory trainingItemDirectory);
+
+ /**
+ * 修改学习培训项目章节
+ *
+ * @param trainingItemDirectory 学习培训项目章节
+ * @return 结果
+ */
+ int updateTrainingItemDirectory(TrainingItemDirectory trainingItemDirectory);
+
+ /**
+ * 删除学习培训项目章节
+ *
+ * @param id 学习培训项目章节主键
+ * @return 结果
+ */
+ int deleteTrainingItemDirectoryById(Long id);
+
+ /**
+ * 批量删除学习培训项目章节
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ int deleteTrainingItemDirectoryByIds(Long[] ids);
+
+ /**
+ * 批量
+ *
+ * @param trainingItemDirectoryList 章节集合
+ * @return int
+ */
+ int insertTrainingItemDirectoryList(List trainingItemDirectoryList);
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingcategory/ITrainingCategoryService.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingcategory/ITrainingCategoryService.java
new file mode 100644
index 0000000..ec8d456
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingcategory/ITrainingCategoryService.java
@@ -0,0 +1,65 @@
+package com.xinelu.manage.service.trainingcategory;
+
+import com.xinelu.common.core.domain.AjaxResult;
+import com.xinelu.manage.domain.trainingcategory.TrainingCategory;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+
+/**
+ * 学习培训分类Service接口
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+public interface ITrainingCategoryService {
+ /**
+ * 查询学习培训分类
+ *
+ * @param id 学习培训分类主键
+ * @return 学习培训分类
+ */
+ TrainingCategory selectTrainingCategoryById(Long id);
+
+ /**
+ * 查询学习培训分类列表
+ *
+ * @param trainingCategory 学习培训分类
+ * @return 学习培训分类集合
+ */
+ List selectTrainingCategoryList(TrainingCategory trainingCategory);
+
+ /**
+ * 新增学习培训分类
+ *
+ * @param trainingCategory 学习培训分类
+ * @return 结果
+ */
+ int insertTrainingCategory(TrainingCategory trainingCategory);
+
+ /**
+ * 修改学习培训分类
+ *
+ * @param trainingCategory 学习培训分类
+ * @return 结果
+ */
+ AjaxResult updateTrainingCategory(TrainingCategory trainingCategory);
+
+ /**
+ * 批量删除学习培训分类
+ *
+ * @param ids 需要删除的学习培训分类主键集合
+ * @return 结果
+ */
+ AjaxResult deleteTrainingCategoryByIds(Long[] ids);
+
+ /**
+ * 上传文件
+ *
+ * @param multipartFile 文件
+ * @return AjaxResult
+ * @throws Exception 异常信息
+ */
+ AjaxResult uploadTrainingCategoryPicture(MultipartFile multipartFile) throws Exception;
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingcategory/Impl/TrainingCategoryServiceImpl.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingcategory/Impl/TrainingCategoryServiceImpl.java
new file mode 100644
index 0000000..2a885b9
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingcategory/Impl/TrainingCategoryServiceImpl.java
@@ -0,0 +1,135 @@
+package com.xinelu.manage.service.trainingcategory.Impl;
+
+import com.xinelu.common.config.XinELuConfig;
+import com.xinelu.common.constant.Constants;
+import com.xinelu.common.core.domain.AjaxResult;
+import com.xinelu.common.utils.SecurityUtils;
+import com.xinelu.common.utils.codes.GenerateSystemCodeUtil;
+import com.xinelu.common.utils.file.FileUtils;
+import com.xinelu.manage.domain.trainingcategory.TrainingCategory;
+import com.xinelu.manage.mapper.trainingcategory.TrainingCategoryMapper;
+import com.xinelu.manage.service.trainingcategory.ITrainingCategoryService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 学习培训分类Service业务层处理
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+@Service
+public class TrainingCategoryServiceImpl implements ITrainingCategoryService {
+ @Resource
+ private TrainingCategoryMapper trainingCategoryMapper;
+ @Resource
+ private XinELuConfig xinYiLuConfig;
+ @Resource
+ private GenerateSystemCodeUtil generateSystemCodeUtil;
+
+ /**
+ * 查询学习培训分类
+ *
+ * @param id 学习培训分类主键
+ * @return 学习培训分类
+ */
+ @Override
+ public TrainingCategory selectTrainingCategoryById(Long id) {
+ return trainingCategoryMapper.selectTrainingCategoryById(id);
+ }
+
+ /**
+ * 查询学习培训分类列表
+ *
+ * @param trainingCategory 学习培训分类
+ * @return 学习培训分类
+ */
+ @Override
+ public List selectTrainingCategoryList(TrainingCategory trainingCategory) {
+ return trainingCategoryMapper.selectTrainingCategoryList(trainingCategory);
+ }
+
+ /**
+ * 新增学习培训分类
+ *
+ * @param trainingCategory 学习培训分类
+ * @return 结果
+ */
+ @Override
+ public int insertTrainingCategory(TrainingCategory trainingCategory) {
+ trainingCategory.setCreateTime(LocalDateTime.now());
+ trainingCategory.setCreateBy(SecurityUtils.getUsername());
+ trainingCategory.setTrainingCategoryCode(Constants.TRAINING_CATEGORY + generateSystemCodeUtil.generateSystemCode(Constants.TRAINING_CATEGORY));
+ return trainingCategoryMapper.insertTrainingCategory(trainingCategory);
+ }
+
+ /**
+ * 修改学习培训分类
+ *
+ * @param trainingCategory 学习培训分类
+ * @return 结果
+ */
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public AjaxResult updateTrainingCategory(TrainingCategory trainingCategory) {
+ TrainingCategory initial = trainingCategoryMapper.selectTrainingCategoryById(trainingCategory.getId());
+ if (Objects.isNull(initial)) {
+ return AjaxResult.error("当前分类信息不存在,无法修改,请联系管理员!");
+ }
+ trainingCategory.setUpdateTime(LocalDateTime.now());
+ trainingCategory.setUpdateBy(SecurityUtils.getUsername());
+ //删除原有上传的分类图片
+ if (StringUtils.isNotBlank(trainingCategory.getTrainingCategoryPictureUrl()) && StringUtils.isNotBlank(initial.getTrainingCategoryPictureUrl())
+ && !trainingCategory.getTrainingCategoryPictureUrl().equals(initial.getTrainingCategoryPictureUrl())) {
+ FileUtils.deleteSystemFile(initial.getTrainingCategoryPictureUrl());
+ }
+ return AjaxResult.success(trainingCategoryMapper.updateTrainingCategory(trainingCategory));
+ }
+
+ /**
+ * 批量删除学习培训分类
+ *
+ * @param ids 需要删除的学习培训分类主键
+ * @return 结果
+ */
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public AjaxResult deleteTrainingCategoryByIds(Long[] ids) {
+ if (Objects.isNull(ids)) {
+ return AjaxResult.error("请选择需要删除的信息!");
+ }
+ List trainingCategories = trainingCategoryMapper.selectTrainingCategoryByIds(ids);
+ if (CollectionUtils.isEmpty(trainingCategories)) {
+ return AjaxResult.success();
+ }
+ trainingCategoryMapper.deleteTrainingCategoryByIds(ids);
+ for (TrainingCategory trainingCategory : trainingCategories) {
+ if (StringUtils.isBlank(trainingCategory.getTrainingCategoryPictureUrl())) {
+ continue;
+ }
+ FileUtils.deleteSystemFile(trainingCategory.getTrainingCategoryPictureUrl());
+ }
+ return AjaxResult.success();
+ }
+
+ /**
+ * 上传文件
+ *
+ * @param multipartFile 文件
+ * @return AjaxResult
+ * @throws Exception 异常信息
+ */
+ @Override
+ public AjaxResult uploadTrainingCategoryPicture(MultipartFile multipartFile) throws Exception {
+ String uploadPathUrl = XinELuConfig.getProfile() + xinYiLuConfig.getTrainingCategoryPictureUrl();
+ return FileUtils.uploadImages(uploadPathUrl, multipartFile);
+ }
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingitem/ITrainingItemService.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingitem/ITrainingItemService.java
new file mode 100644
index 0000000..81c337c
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingitem/ITrainingItemService.java
@@ -0,0 +1,102 @@
+package com.xinelu.manage.service.trainingitem;
+
+
+import com.xinelu.common.core.domain.AjaxResult;
+import com.xinelu.manage.domain.trainingitem.TrainingItem;
+import com.xinelu.manage.dto.trainingitem.TrainingItemAndDirectory;
+import com.xinelu.manage.vo.trainingitem.TrainingItemAndCategoryVO;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+
+/**
+ * 学习培训项目信息Service接口
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+public interface ITrainingItemService {
+ /**
+ * 查询学习培训项目信息
+ *
+ * @param id 学习培训项目信息主键
+ * @return 学习培训项目信息
+ */
+ TrainingItemAndDirectory selectTrainingItemById(Long id);
+
+ /**
+ * 查询学习培训项目信息列表
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 学习培训项目信息集合
+ */
+ List selectTrainingItemList(TrainingItem trainingItem);
+
+ /**
+ * 新增学习培训项目信息
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 结果
+ */
+ AjaxResult insertTrainingItem(TrainingItemAndDirectory trainingItem);
+
+ /**
+ * 修改学习培训项目信息
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 结果
+ */
+ AjaxResult updateTrainingItem(TrainingItemAndDirectory trainingItem);
+
+ /**
+ * 批量删除学习培训项目信息
+ *
+ * @param ids 需要删除的学习培训项目信息主键集合
+ * @return 结果
+ */
+ AjaxResult deleteTrainingItemByIds(Long[] ids);
+
+ /**
+ * 上传文件
+ *
+ * @param multipartFile 文件
+ * @param type 文件路径
+ * @return AjaxResult
+ * @throws Exception 错误信息
+ */
+ AjaxResult uploadUrl(MultipartFile multipartFile, String type) throws Exception;
+
+ /**
+ * 上传文件
+ *
+ * @param multipartFile 文件
+ * @return AjaxResult
+ * @throws Exception 错误信息
+ */
+ AjaxResult uploadVideoUrl(MultipartFile multipartFile) throws Exception;
+
+ /**
+ * 查询父级项目列表
+ *
+ * @param trainingItem 信息
+ * @return AjaxResult
+ */
+ List selectTrainingParent(TrainingItemAndDirectory trainingItem);
+
+ /**
+ * 修改上下架状态
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return AjaxResult
+ */
+ AjaxResult updateTrainingShelfFlag(TrainingItem trainingItem);
+
+ /**
+ * 查询下级项目
+ *
+ * @param trainingItem 父级id
+ * @return AjaxResult
+ */
+ AjaxResult selectSubordinateItem(TrainingItem trainingItem);
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingitem/Impl/TrainingItemServiceImpl.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingitem/Impl/TrainingItemServiceImpl.java
new file mode 100644
index 0000000..d1de84b
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/service/trainingitem/Impl/TrainingItemServiceImpl.java
@@ -0,0 +1,427 @@
+package com.xinelu.manage.service.trainingitem.Impl;
+
+
+import com.xinelu.common.config.XinELuConfig;
+import com.xinelu.common.constant.Constants;
+import com.xinelu.common.core.domain.AjaxResult;
+import com.xinelu.common.enums.TrainingItemTypeEnum;
+import com.xinelu.common.enums.TrainingShelfFlagEnum;
+import com.xinelu.common.exception.ServiceException;
+import com.xinelu.common.utils.SecurityUtils;
+import com.xinelu.common.utils.codes.GenerateSystemCodeUtil;
+import com.xinelu.common.utils.file.FileUtils;
+import com.xinelu.manage.domain.trainingitem.TrainingItem;
+import com.xinelu.manage.domain.trainingitemdirectory.TrainingItemDirectory;
+import com.xinelu.manage.dto.trainingitem.TrainingItemAndDirectory;
+import com.xinelu.manage.mapper.trainingitem.TrainingItemMapper;
+import com.xinelu.manage.mapper.trainingitemdirectory.TrainingItemDirectoryMapper;
+import com.xinelu.manage.service.trainingitem.ITrainingItemService;
+import com.xinelu.manage.vo.trainingitem.TrainingItemAndCategoryVO;
+import com.xinelu.manage.vo.trainingitemdirectory.TrainingItemDirectoryVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.compress.utils.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+
+/**
+ * 学习培训项目信息Service业务层处理
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+@Slf4j
+@Service
+public class TrainingItemServiceImpl implements ITrainingItemService {
+ @Resource
+ private TrainingItemMapper trainingItemMapper;
+ @Resource
+ private TrainingItemDirectoryMapper trainingItemDirectoryMapper;
+ @Resource
+ private GenerateSystemCodeUtil generateSystemCodeUtil;
+ @Resource
+ private XinELuConfig xinYiLuConfig;
+
+ /**
+ * 查询学习培训项目信息
+ *
+ * @param id 学习培训项目信息主键
+ * @return 学习培训项目信息
+ */
+ @Override
+ public TrainingItemAndDirectory selectTrainingItemById(Long id) {
+ return trainingItemMapper.selectTrainingItemAndDirectoryById(id);
+ }
+
+ /**
+ * 查询学习培训项目信息列表
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 学习培训项目信息
+ */
+ @Override
+ public List selectTrainingItemList(TrainingItem trainingItem) {
+ trainingItem.setTrainingParentId(Constants.TRAINING_PARENT_ID);
+ return trainingItemMapper.selectTrainingItemAndCategoryList(trainingItem);
+ }
+
+ /**
+ * 新增学习培训项目信息
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 结果
+ */
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public AjaxResult insertTrainingItem(TrainingItemAndDirectory trainingItem) {
+ if (Objects.nonNull(trainingItem.getTrainingItemPrice()) && trainingItem.getTrainingItemPrice().compareTo(BigDecimal.ZERO) <= 0) {
+ return AjaxResult.error("价格不能为负数或零!");
+ }
+ if (Objects.nonNull(trainingItem.getTrainingItemSort()) && trainingItem.getTrainingItemSort() <= 0) {
+ return AjaxResult.error("排序不能为负数或零!");
+ }
+ trainingItem.setCreateBy(SecurityUtils.getUsername());
+ trainingItem.setCreateTime(LocalDateTime.now());
+ trainingItem.setTrainingItemCode(Constants.TRAINING_ITEM + generateSystemCodeUtil.generateSystemCode(Constants.TRAINING_ITEM));
+ if (Objects.isNull(trainingItem.getTrainingParentId()) || TrainingItemTypeEnum.LEARNING_ITEM_GROUP.getInfo().equals(trainingItem.getTrainingItemType())) {
+ trainingItem.setTrainingParentId(Constants.TRAINING_PARENT_ID);
+ }
+ trainingItem.setTrainingShelfFlag(TrainingShelfFlagEnum.NOT_SHEL.getInfo());
+ int insertTrainingItem = trainingItemMapper.insertTrainingItem(trainingItem);
+ if (insertTrainingItem <= 0) {
+ throw new ServiceException("新增学习培训课程信息失败,请联系管理员!");
+ }
+ //新增章节视频
+ if (!TrainingItemTypeEnum.VIDEO_LEARNING.getInfo().equals(trainingItem.getTrainingItemType())) {
+ return AjaxResult.success();
+ }
+ if (TrainingItemTypeEnum.VIDEO_LEARNING.getInfo().equals(trainingItem.getTrainingItemType()) && CollectionUtils.isEmpty(trainingItem.getTrainingItemDirectoryList())) {
+ throw new ServiceException("请添加章节视频信息!");
+ }
+ for (TrainingItemDirectory trainingItemDirectory : trainingItem.getTrainingItemDirectoryList()) {
+ trainingItemDirectory.setTrainingItemId(Objects.isNull(trainingItem.getId()) ? null : trainingItem.getId());
+ if (StringUtils.isBlank(trainingItemDirectory.getItemDirectoryUrl())) {
+ throw new ServiceException("请添加章节视频信息!");
+ }
+ if (StringUtils.isNotBlank(trainingItemDirectory.getItemDirectoryUrl())) {
+ trainingItemDirectory.setItemDirectoryVideoDuration(FileUtils.getVideoDuration(trainingItemDirectory.getItemDirectoryUrl().replaceAll(Constants.D_RESOURCE_PREFIX, Constants.D_UPLOAD_PREFIX)));
+ }
+ if (Objects.nonNull(trainingItemDirectory.getItemDirectorySort()) && trainingItemDirectory.getItemDirectorySort() <= 0) {
+ throw new ServiceException("排序不能为负数或零!");
+ }
+ trainingItemDirectory.setItemDirectoryCode(Constants.TRAINING_ITEM_DIRECTORY + generateSystemCodeUtil.generateSystemCode(Constants.TRAINING_ITEM_DIRECTORY));
+ }
+ int count = trainingItemDirectoryMapper.insertTrainingItemDirectoryList(trainingItem.getTrainingItemDirectoryList());
+ if (count <= 0) {
+ throw new ServiceException("新增章节视频信息失败,请联系管理员!");
+ }
+ return AjaxResult.success();
+ }
+
+ /**
+ * 修改学习培训项目信息
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return 结果
+ */
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public AjaxResult updateTrainingItem(TrainingItemAndDirectory trainingItem) {
+ if (Objects.isNull(trainingItem.getTrainingItemId())) {
+ return AjaxResult.error("学习培训课程信息不能为空!");
+ }
+ if (Objects.nonNull(trainingItem.getTrainingItemPrice()) && trainingItem.getTrainingItemPrice().compareTo(BigDecimal.ZERO) <= 0) {
+ return AjaxResult.error("价格不能为负数或零!");
+ }
+ if (Objects.nonNull(trainingItem.getTrainingItemSort()) && trainingItem.getTrainingItemSort() <= 0) {
+ return AjaxResult.error("排序不能为负数或零!");
+ }
+ if (Objects.nonNull(trainingItem.getTrainingParentId()) && trainingItem.getTrainingParentId().equals(trainingItem.getTrainingItemId())) {
+ return AjaxResult.error("父级项目与本项目有冲突!请选择其他父级项目!");
+ }
+ //查询数据库信息
+ TrainingItemAndDirectory trainingItemAndDirectory = trainingItemMapper.selectTrainingItemAndDirectoryById(trainingItem.getTrainingItemId());
+ trainingItem.setUpdateBy(SecurityUtils.getUsername());
+ trainingItem.setUpdateTime(LocalDateTime.now());
+ trainingItem.setId(trainingItem.getTrainingItemId());
+ if (Objects.isNull(trainingItem.getTrainingParentId()) || TrainingItemTypeEnum.LEARNING_ITEM_GROUP.getInfo().equals(trainingItem.getTrainingItemType())) {
+ trainingItem.setTrainingParentId(Constants.TRAINING_PARENT_ID);
+ }
+ int updateTrainingItem = trainingItemMapper.updateTrainingItems(trainingItem);
+ if (updateTrainingItem <= 0) {
+ throw new ServiceException("修改培训课程信息失败,请联系管理员!");
+ }
+ //新增章节视频
+ if (!TrainingItemTypeEnum.VIDEO_LEARNING.getInfo().equals(trainingItem.getTrainingItemType())) {
+ //富文本修改
+ if (StringUtils.isNotBlank(trainingItemAndDirectory.getTrainingItemContent()) && StringUtils.isNotBlank(trainingItem.getTrainingItemContent()) && !trainingItemAndDirectory.getTrainingItemContent().equals(trainingItem.getTrainingItemContent())) {
+ FileUtils.deleteTextUrl(trainingItemAndDirectory.getTrainingItemContent(), trainingItem.getTrainingItemContent());
+ }
+ return AjaxResult.success();
+ }
+ if (TrainingItemTypeEnum.VIDEO_LEARNING.getInfo().equals(trainingItem.getTrainingItemType()) && CollectionUtils.isEmpty(trainingItem.getTrainingItemDirectoryList())) {
+ throw new ServiceException("请添加章节视频信息!");
+ }
+ //修改章节
+ updateTrainingItemDirectory(trainingItemAndDirectory, trainingItem);
+ //富文本修改
+ if (StringUtils.isNotBlank(trainingItemAndDirectory.getTrainingItemContent()) && StringUtils.isNotBlank(trainingItem.getTrainingItemContent()) && !trainingItemAndDirectory.getTrainingItemContent().equals(trainingItem.getTrainingItemContent())) {
+ FileUtils.deleteTextUrl(trainingItemAndDirectory.getTrainingItemContent(), trainingItem.getTrainingItemContent());
+ }
+ return AjaxResult.success();
+ }
+
+ /**
+ * 批量删除学习培训项目信息
+ *
+ * @param ids 需要删除的学习培训项目信息主键
+ * @return 结果
+ */
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public AjaxResult deleteTrainingItemByIds(Long[] ids) {
+ //查询数据库信息
+ List trainingItemAndDirectories = trainingItemMapper.selectTrainingItemAndDirectoryList(ids, null);
+ if (CollectionUtils.isEmpty(trainingItemAndDirectories)) {
+ return AjaxResult.success();
+ }
+ List childTrainingItemAndDirectories = trainingItemMapper.selectTrainingItemAndDirectoryList(null, ids);
+ if (CollectionUtils.isEmpty(childTrainingItemAndDirectories) && CollectionUtils.isEmpty(trainingItemAndDirectories)) {
+ return AjaxResult.success();
+ }
+ List dataList = Lists.newArrayList();
+ List childIdsList = childTrainingItemAndDirectories.stream().filter(Objects::nonNull).map(TrainingItemAndDirectory::getTrainingItemId).filter(Objects::nonNull).collect(Collectors.toList()).stream().filter(Objects::nonNull).collect(Collectors.toList());
+ dataList.addAll(Arrays.asList(ids));
+ dataList.addAll(childIdsList);
+ int count = trainingItemMapper.deleteTrainingItemByIds(dataList);
+ if (count <= 0) {
+ throw new ServiceException("删除信息失败,请联系管理员!");
+ }
+ //删除章节
+ deleteTrainingItemDirectory(trainingItemAndDirectories);
+ if (CollectionUtils.isNotEmpty(childTrainingItemAndDirectories)) {
+ deleteTrainingItemDirectory(childTrainingItemAndDirectories);
+ }
+ //删除图片视频
+ deleteUrl(trainingItemAndDirectories);
+ if (CollectionUtils.isNotEmpty(childTrainingItemAndDirectories)) {
+ deleteUrl(childTrainingItemAndDirectories);
+ }
+ return AjaxResult.success();
+ }
+
+ /**
+ * 上传文件
+ *
+ * @param multipartFile 文件
+ * @return AjaxResult
+ * @throws Exception 错误信息
+ */
+ @Override
+ public AjaxResult uploadUrl(MultipartFile multipartFile, String type) throws Exception {
+ //获取不同的文件路径
+ String uploadPathUrl = "";
+ if (Constants.TRAINING_ITEM_COVER_URL.equals(type)) {
+ uploadPathUrl = XinELuConfig.getProfile() + xinYiLuConfig.getTrainingItemCoverUrl();
+ }
+ if (Constants.TRAINING_ITEM_POSTER_URL.equals(type)) {
+ uploadPathUrl = XinELuConfig.getProfile() + xinYiLuConfig.getTrainingItemPosterUrl();
+ }
+ if (StringUtils.isEmpty(uploadPathUrl)) {
+ return AjaxResult.success();
+ }
+ return FileUtils.uploadImages(uploadPathUrl, multipartFile);
+ }
+
+ /**
+ * 上传文件
+ *
+ * @param multipartFile 文件
+ * @return AjaxResult
+ * @throws Exception 错误信息
+ */
+ @Override
+ public AjaxResult uploadVideoUrl(MultipartFile multipartFile) throws Exception {
+ if (Objects.isNull(multipartFile) || StringUtils.isBlank(multipartFile.getOriginalFilename())) {
+ return AjaxResult.error("当前文件视频不存在,无法上传!");
+ }
+ if (multipartFile.getOriginalFilename().contains(Constants.EMPTY)) {
+ return AjaxResult.error("当前视频文件名含有空格,请先去除空格在上传!");
+ }
+ String uploadPathUrl = XinELuConfig.getProfile() + xinYiLuConfig.getItemDirectoryUrl();
+ return FileUtils.uploadVideo(uploadPathUrl, multipartFile);
+ }
+
+ /**
+ * 查询父级项目列表
+ *
+ * @param trainingItem 信息
+ * @return AjaxResult
+ */
+ @Override
+ public List selectTrainingParent(TrainingItemAndDirectory trainingItem) {
+ trainingItem.setTrainingItemType(TrainingItemTypeEnum.LEARNING_ITEM_GROUP.getInfo());
+ return trainingItemMapper.selectTrainingItems(trainingItem);
+ }
+
+ /**
+ * 修改上下架状态
+ *
+ * @param trainingItem 学习培训项目信息
+ * @return AjaxResult
+ */
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public AjaxResult updateTrainingShelfFlag(TrainingItem trainingItem) {
+ //修改本级状态
+ int updateTrainingItem = trainingItemMapper.updateTrainingItem(trainingItem);
+ if (updateTrainingItem <= 0) {
+ log.error("修改学习培训课程组信息失败,学习培训课程组id为:{}", trainingItem.getId());
+ throw new ServiceException("修改上下架状态失败!");
+ }
+ //修改下级状态
+ if (StringUtils.isNotBlank(trainingItem.getTrainingItemType()) && TrainingItemTypeEnum.LEARNING_ITEM_GROUP.getInfo().equals(trainingItem.getTrainingItemType())) {
+ trainingItem.setTrainingParentId(trainingItem.getId());
+ int count = trainingItemMapper.updateTrainingItemList(trainingItem);
+ if (count < 0) {
+ log.error("修改学习培训视频课程信息失败,所属课程组id为:{}", trainingItem.getId());
+ throw new ServiceException("修改上下架状态失败!");
+ }
+ }
+ return AjaxResult.success();
+ }
+
+ /**
+ * 查询下级项目
+ *
+ * @param trainingItem 父级id
+ * @return AjaxResult
+ */
+ @Override
+ public AjaxResult selectSubordinateItem(TrainingItem trainingItem) {
+ return AjaxResult.success(trainingItemMapper.selectTrainingItemAndCategoryList(trainingItem));
+ }
+
+ /**
+ * 修改章节信息
+ *
+ * @param trainingItemAndDirectory 数据库数据库信息
+ * @param trainingItem 前端传入
+ */
+ private void updateTrainingItemDirectory(TrainingItemAndDirectory trainingItemAndDirectory, TrainingItemAndDirectory trainingItem) {
+ List databaseDirectoryIds = trainingItemAndDirectory.getTrainingItemDirectoryList().stream().filter(Objects::nonNull).map(TrainingItemDirectoryVO::getTrainingItemDirectoryId).filter(Objects::nonNull).collect(Collectors.toList());
+ List afferentDirectoryIds = trainingItem.getTrainingItemDirectoryList().stream().filter(Objects::nonNull).map(TrainingItemDirectoryVO::getTrainingItemDirectoryId).filter(Objects::nonNull).collect(Collectors.toList());
+ List itemDirectoryUrlList = trainingItemAndDirectory.getTrainingItemDirectoryList().stream().filter(Objects::nonNull).map(TrainingItemDirectory::getItemDirectoryUrl).filter(StringUtils::isNotBlank).collect(Collectors.toList());
+ List afferentUrlList = trainingItem.getTrainingItemDirectoryList().stream().filter(Objects::nonNull).map(TrainingItemDirectory::getItemDirectoryUrl).filter(StringUtils::isNotBlank).collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(afferentUrlList)) {
+ throw new ServiceException("请添加章节视频信息!");
+ }
+ //databaseDirectoryIds减afferentDirectoryIds,删除
+ List subtractIds = new ArrayList<>(CollectionUtils.subtract(databaseDirectoryIds, afferentDirectoryIds));
+ if (CollectionUtils.isNotEmpty(subtractIds)) {
+ Long[] longs = subtractIds.stream().filter(Objects::nonNull).toArray(Long[]::new);
+ int deleteCount = trainingItemDirectoryMapper.deleteTrainingItemDirectoryByIds(longs);
+ if (deleteCount <= 0) {
+ log.error("删除章节信息失败!");
+ throw new ServiceException("修改培训课程信息失败,请联系管理员!");
+ }
+ }
+ //id为空新增
+ List trainingItemDirectoryList = new ArrayList<>();
+ for (TrainingItemDirectoryVO trainingItemDirectory : trainingItem.getTrainingItemDirectoryList()) {
+ if (StringUtils.isBlank(trainingItemDirectory.getItemDirectoryTitle()) && StringUtils.isBlank(trainingItemDirectory.getItemDirectoryName()) && StringUtils.isBlank(trainingItemDirectory.getItemDirectoryUrl()) && StringUtils.isBlank(trainingItemDirectory.getItemDirectoryIntroduce())) {
+ continue;
+ }
+ if (StringUtils.isBlank(trainingItemDirectory.getItemDirectoryTitle()) || StringUtils.isBlank(trainingItemDirectory.getItemDirectoryName()) || StringUtils.isBlank(trainingItemDirectory.getItemDirectoryUrl()) || StringUtils.isBlank(trainingItemDirectory.getItemDirectoryIntroduce())) {
+ throw new ServiceException("请添加章节视频信息!");
+ }
+ if (Objects.nonNull(trainingItemDirectory.getItemDirectoryUrl())) {
+ trainingItemDirectory.setItemDirectoryVideoDuration(FileUtils.getVideoDuration(trainingItemDirectory.getItemDirectoryUrl().replaceAll(Constants.D_RESOURCE_PREFIX, Constants.D_UPLOAD_PREFIX)));
+ }
+ if (Objects.isNull(trainingItemDirectory.getTrainingItemDirectoryId())) {
+ trainingItemDirectory.setTrainingItemId(trainingItem.getId());
+ trainingItemDirectory.setItemDirectoryCode(Constants.TRAINING_ITEM_DIRECTORY + generateSystemCodeUtil.generateSystemCode(Constants.TRAINING_ITEM_DIRECTORY));
+ trainingItemDirectoryList.add(trainingItemDirectory);
+ }
+ //不为空修改
+ if (Objects.nonNull(trainingItemDirectory.getTrainingItemDirectoryId())) {
+ trainingItemDirectory.setId(trainingItemDirectory.getTrainingItemDirectoryId());
+ trainingItemDirectoryMapper.updateTrainingItemDirectory(trainingItemDirectory);
+ }
+ }
+ if (CollectionUtils.isNotEmpty(trainingItemDirectoryList)) {
+ int insertDirectoryCount = trainingItemDirectoryMapper.insertTrainingItemDirectoryList(trainingItemDirectoryList);
+ if (insertDirectoryCount <= 0) {
+ log.error("新增项目章节信息失败!");
+ throw new ServiceException("修改培训课程信息失败,请联系管理员!");
+ }
+ }
+ List subtractUrl = new ArrayList<>(CollectionUtils.subtract(itemDirectoryUrlList, afferentUrlList));
+ for (String itemDirectoryUrl : subtractUrl) {
+ FileUtils.deleteSystemFile(itemDirectoryUrl);
+ }
+ }
+
+ /**
+ * 删除视频主表
+ *
+ * @param trainingItemAndDirectories 文件信息
+ */
+ private void deleteTrainingItemDirectory(List trainingItemAndDirectories) {
+ List trainingItemDirectoryIdList = new ArrayList<>();
+ for (TrainingItemAndDirectory trainingItemAndDirectory : trainingItemAndDirectories) {
+ if (CollectionUtils.isEmpty(trainingItemAndDirectory.getTrainingItemDirectoryList())) {
+ continue;
+ }
+ List trainingItemDirectoryIds = trainingItemAndDirectory.getTrainingItemDirectoryList().stream().filter(Objects::nonNull).map(TrainingItemDirectoryVO::getTrainingItemDirectoryId).filter(Objects::nonNull).collect(Collectors.toList());
+ trainingItemDirectoryIdList.addAll(trainingItemDirectoryIds);
+ }
+ if (CollectionUtils.isNotEmpty(trainingItemDirectoryIdList)) {
+ trainingItemDirectoryMapper.deleteTrainingItemDirectoryByIds(trainingItemDirectoryIdList.toArray(new Long[0]));
+ }
+ }
+
+ /**
+ * 删除图片视频
+ *
+ * @param trainingItemAndDirectories 文件
+ */
+ private void deleteUrl(List trainingItemAndDirectories) {
+ //取出课程信息的封面路径和海报路径
+ List trainingItemCoverUrlList = trainingItemAndDirectories.stream().filter(Objects::nonNull).map(TrainingItemAndDirectory::getTrainingItemCoverUrl).filter(StringUtils::isNotBlank).collect(Collectors.toList());
+ List trainingItemPosterUrList = trainingItemAndDirectories.stream().filter(Objects::nonNull).map(TrainingItemAndDirectory::getTrainingItemPosterUrl).filter(StringUtils::isNotBlank).collect(Collectors.toList());
+ trainingItemCoverUrlList.addAll(trainingItemPosterUrList);
+ for (TrainingItemAndDirectory trainingItemAndDirectory : trainingItemAndDirectories) {
+ if (CollectionUtils.isEmpty(trainingItemAndDirectory.getTrainingItemDirectoryList())) {
+ continue;
+ }
+ List itemDirectoryUrlList = trainingItemAndDirectory.getTrainingItemDirectoryList().stream().filter(Objects::nonNull).map(TrainingItemDirectory::getItemDirectoryUrl).filter(StringUtils::isNotBlank).collect(Collectors.toList());
+ trainingItemCoverUrlList.addAll(itemDirectoryUrlList);
+ }
+ //删除图片
+ if (CollectionUtils.isNotEmpty(trainingItemCoverUrlList)) {
+ for (String trainingItemCoverUrl : trainingItemCoverUrlList) {
+ FileUtils.deleteSystemFile(trainingItemCoverUrl);
+ }
+ }
+ //富文本删除
+ List trainingItemContentList = trainingItemAndDirectories.stream().filter(Objects::nonNull).map(TrainingItem::getTrainingItemContent).filter(StringUtils::isNotBlank).collect(Collectors.toList());
+ if (CollectionUtils.isNotEmpty(trainingItemContentList)) {
+ for (String trainingItemContent : trainingItemContentList) {
+ FileUtils.deleteTextUrl(trainingItemContent, null);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/NurseAppletPersonTrainingItemVO.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/NurseAppletPersonTrainingItemVO.java
new file mode 100644
index 0000000..de4acfe
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/NurseAppletPersonTrainingItemVO.java
@@ -0,0 +1,47 @@
+package com.xinelu.manage.vo.trainingitem;
+
+import com.xinelu.manage.domain.trainingitem.TrainingItem;
+import com.xinelu.manage.vo.trainingitemdirectory.TrainingItemDirectoryVO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 护理员学习培训VO
+ *
+ * @author ljh
+ * @version 1.0
+ * Create by 2023/4/21 11:04
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class NurseAppletPersonTrainingItemVO extends TrainingItem implements Serializable {
+ private static final long serialVersionUID = 4910038250164588018L;
+
+ /**
+ * 学习培训项目章节信息表
+ */
+ List trainingItemDirectoryList;
+
+ /**
+ * 学习培训项目信息对象主键id
+ */
+ private Long trainingItemId;
+
+ /**
+ * 学习培训项目章节对象主键id
+ */
+ private Long trainingItemDirectoryId;
+
+ /**
+ * 订单状态,待付款:WAIT_PAY,已付款:PAY,退款中:WAIT_REFUND,已退款:REFUNDED,已取消:CANCEL
+ */
+ private String trainingOrderStatus;
+
+ /**
+ * 是否购买此包 BUY:已购买,NOT_BUY:未购买
+ */
+ private String trainingOrderDetailsBuy;
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/TrainingItemAndCategoryVO.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/TrainingItemAndCategoryVO.java
new file mode 100644
index 0000000..ce42f8a
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/TrainingItemAndCategoryVO.java
@@ -0,0 +1,35 @@
+package com.xinelu.manage.vo.trainingitem;
+
+import com.xinelu.manage.domain.trainingitem.TrainingItem;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * 学习培训项目信息对象 training_item
+ *
+ * @author zh
+ * @date 2023-04-21
+ */
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TrainingItemAndCategoryVO extends TrainingItem implements Serializable {
+ private static final long serialVersionUID = 8011776285939512204L;
+
+ /**
+ * 培训分类名称
+ */
+ private String trainingCategoryName;
+
+ /**
+ * 父级项目名称
+ */
+ private String trainingParentName;
+
+ /**
+ * 父级项目id
+ */
+ private Long trainingParentId;
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/TrainingItemVO.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/TrainingItemVO.java
new file mode 100644
index 0000000..3d6a3a5
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitem/TrainingItemVO.java
@@ -0,0 +1,27 @@
+package com.xinelu.manage.vo.trainingitem;
+
+import com.xinelu.manage.domain.trainingitem.TrainingItem;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * @author ljh
+ * @version 1.0
+ * Create by 2023/4/25 10:51
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TrainingItemVO extends TrainingItem implements Serializable {
+ private static final long serialVersionUID = 4886684550435223303L;
+ /**
+ * 是否购买此包 BUY:已购买,NOT_BUY:未购买
+ */
+ private String trainingOrderDetailsBuy;
+
+ /**
+ * 订单编号
+ */
+ private String trainingOrderNo;
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitemdirectory/TrainingItemDirectoryVO.java b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitemdirectory/TrainingItemDirectoryVO.java
new file mode 100644
index 0000000..9e1ad64
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/java/com/xinelu/manage/vo/trainingitemdirectory/TrainingItemDirectoryVO.java
@@ -0,0 +1,79 @@
+package com.xinelu.manage.vo.trainingitemdirectory;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xinelu.manage.domain.trainingitemdirectory.TrainingItemDirectory;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+
+/**
+ * 学习培训项目章节对象 training_item_directory
+ *
+ * @author xinyilu
+ * @date 2023-04-20
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TrainingItemDirectoryVO extends TrainingItemDirectory implements Serializable {
+ private static final long serialVersionUID = 1329246346741098330L;
+
+ /**
+ * 主键id
+ */
+ private Long trainingItemDirectoryId;
+
+ /**
+ * 是否购买学习培训项目章节 BUY:已购买,NOT_BUY:未购买
+ */
+ private String trainingOrderItemDirectoryBuy;
+
+ /**
+ * 未观看:NOT_WATCHED,已观看:WATCHED,已看完:FINISHED_READING
+ **/
+ private String itemDirectoryWatchStatus;
+
+ /**
+ * 订单编号
+ */
+ private String trainingOrderNo;
+
+ /**
+ * 订单主表id
+ */
+ private Long trainingOrderId;
+
+ /**
+ * 护理站id
+ */
+ private Long nurseStationId;
+
+ /**
+ * 护理站人员id
+ */
+ private Long nurseStationPersonId;
+
+ /**
+ * 护理站人员名称
+ */
+ private String nursePersonName;
+
+ /**
+ * 订单状态,待付款:WAIT_PAY,已付款:PAY,退款中:WAIT_REFUND,已退款:REFUNDED,已取消:CANCEL
+ */
+ private String trainingOrderStatus;
+
+ /**
+ * 观看日期,格式:yyyy-MM-dd
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private LocalDate watchDate;
+
+ /**
+ * 培训项目观看时间点,格式:HH:mm:ss,视频学习类型使用
+ */
+ @JsonFormat(pattern = "HH:mm:ss")
+ private LocalTime watchTime;
+}
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/resources/mapper/manage/trainingcategory/TrainingCategoryMapper.xml b/xinelu-nurse-manage/src/main/resources/mapper/manage/trainingcategory/TrainingCategoryMapper.xml
new file mode 100644
index 0000000..9199338
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/resources/mapper/manage/trainingcategory/TrainingCategoryMapper.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id,
+ parent_id,
+ training_category_name,
+ training_category_code,
+ training_category_picture_url,
+ training_category_sort,
+ remark,
+ create_by,
+ create_time,
+ update_by,
+ update_time
+ from training_category
+
+
+
+
+
+
+
+ insert into training_category
+
+ parent_id,
+
+ training_category_name,
+
+ training_category_code,
+
+ training_category_picture_url,
+
+ training_category_sort,
+
+ remark,
+
+ create_by,
+
+ create_time,
+
+ update_by,
+
+ update_time,
+
+
+
+ #{parentId},
+
+ #{trainingCategoryName},
+
+ #{trainingCategoryCode},
+
+ #{trainingCategoryPictureUrl},
+
+ #{trainingCategorySort},
+
+ #{remark},
+
+ #{createBy},
+
+ #{createTime},
+
+ #{updateBy},
+
+ #{updateTime},
+
+
+
+
+
+ update training_category
+
+ parent_id =
+ #{parentId},
+
+ training_category_name =
+ #{trainingCategoryName},
+
+ training_category_code =
+ #{trainingCategoryCode},
+
+ training_category_picture_url =
+ #{trainingCategoryPictureUrl},
+
+ training_category_sort =
+ #{trainingCategorySort},
+
+ remark =
+ #{remark},
+
+ create_by =
+ #{createBy},
+
+ create_time =
+ #{createTime},
+
+ update_by =
+ #{updateBy},
+
+ update_time =
+ #{updateTime},
+
+
+ where id = #{id}
+
+
+
+ delete
+ from training_category
+ where id = #{id}
+
+
+
+ delete from training_category where id in
+
+ #{id}
+
+
+
+
+
\ No newline at end of file
diff --git a/xinelu-nurse-manage/src/main/resources/mapper/manage/trainingitem/TrainingItemMapper.xml b/xinelu-nurse-manage/src/main/resources/mapper/manage/trainingitem/TrainingItemMapper.xml
new file mode 100644
index 0000000..0431539
--- /dev/null
+++ b/xinelu-nurse-manage/src/main/resources/mapper/manage/trainingitem/TrainingItemMapper.xml
@@ -0,0 +1,753 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id,
+ training_category_id,
+ training_parent_id,
+ training_item_title,
+ training_item_code,
+ training_item_price,
+ training_item_cover_url,
+ training_item_poster_url,
+ training_item_type,
+ training_item_details,
+ training_item_content,
+ training_item_date,
+ training_item_start_time,
+ training_item_end_time,
+ training_item_address,
+ training_item_notes,
+ training_item_sort,
+ buy_flag,
+ training_shelf_flag,
+ create_by,
+ create_time,
+ update_by,
+ update_time
+ from training_item
+
+
+
+
+
+
+
+ insert into training_item
+
+ training_category_id,
+
+ training_parent_id,
+
+ training_item_title,
+
+ training_item_code,
+
+ training_item_price,
+
+ training_item_cover_url,
+
+ training_item_poster_url,
+
+ training_item_type,
+
+ training_item_details,
+
+ training_item_content,
+
+ training_item_date,
+
+ training_item_start_time,
+
+ training_item_end_time,
+
+ training_item_address,
+
+ training_item_notes,
+
+ training_item_sort,
+
+ buy_flag,
+
+ training_shelf_flag,
+
+ create_by,
+
+ create_time,
+
+ update_by,
+
+ update_time,
+
+
+
+ #{trainingCategoryId},
+
+ #{trainingParentId},
+
+ #{trainingItemTitle},
+
+ #{trainingItemCode},
+
+ #{trainingItemPrice},
+
+ #{trainingItemCoverUrl},
+
+ #{trainingItemPosterUrl},
+
+ #{trainingItemType},
+
+ #{trainingItemDetails},
+
+ #{trainingItemContent},
+
+ #{trainingItemDate},
+
+ #{trainingItemStartTime},
+
+ #{trainingItemEndTime},
+
+ #{trainingItemAddress},
+
+ #{trainingItemNotes},
+
+ #{trainingItemSort},
+
+ #{buyFlag},
+
+ #{trainingShelfFlag},
+
+ #{createBy},
+
+ #{createTime},
+
+ #{updateBy},
+
+ #{updateTime},
+
+
+
+
+
+ update training_item
+
+ training_category_id =
+ #{trainingCategoryId},
+
+ training_parent_id =
+ #{trainingParentId},
+
+ training_item_title =
+ #{trainingItemTitle},
+
+ training_item_code =
+ #{trainingItemCode},
+
+ training_item_price =
+ #{trainingItemPrice},
+
+ training_item_cover_url =
+ #{trainingItemCoverUrl},
+
+ training_item_poster_url =
+ #{trainingItemPosterUrl},
+
+ training_item_type =
+ #{trainingItemType},
+
+ training_item_details =
+ #{trainingItemDetails},
+
+ training_item_content =
+ #{trainingItemContent},
+
+ training_item_date =
+ #{trainingItemDate},
+
+ training_item_start_time =
+ #{trainingItemStartTime},
+
+ training_item_end_time =
+ #{trainingItemEndTime},
+
+ training_item_address =
+ #{trainingItemAddress},
+
+ training_item_notes =
+ #{trainingItemNotes},
+
+ training_item_sort =
+ #{trainingItemSort},
+
+ buy_flag =
+ #{buyFlag},
+
+ training_shelf_flag =
+ #{trainingShelfFlag},
+
+ create_by =
+ #{createBy},
+
+ create_time =
+ #{createTime},
+
+ update_by =
+ #{updateBy},
+
+ update_time =
+ #{updateTime},
+
+
+ where id = #{id}
+
+
+
+ delete
+ from training_item
+ where id = #{id}
+
+
+
+ delete from training_item where id in
+
+ #{id}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ update training_item
+
+ training_category_id =
+ #{trainingCategoryId},
+
+ training_parent_id =
+ #{trainingParentId},
+
+ training_item_title =
+ #{trainingItemTitle},
+
+ training_item_code =
+ #{trainingItemCode},
+
+ training_item_price = #{trainingItemPrice},
+ training_item_cover_url =
+ #{trainingItemCoverUrl},
+
+ training_item_poster_url =
+ #{trainingItemPosterUrl},
+
+ training_item_type =
+ #{trainingItemType},
+
+ training_item_details =
+ #{trainingItemDetails},
+
+ training_item_content =
+ #{trainingItemContent},
+
+ training_item_date =
+ #{trainingItemDate},
+
+ training_item_start_time =
+ #{trainingItemStartTime},
+
+ training_item_end_time =
+ #{trainingItemEndTime},
+
+ training_item_address =
+ #{trainingItemAddress},
+
+ training_item_notes =
+ #{trainingItemNotes},
+
+ training_item_sort = #{trainingItemSort},
+ buy_flag = #{buyFlag},
+ training_shelf_flag =
+ #{trainingShelfFlag},
+
+ create_by =
+ #{createBy},
+
+ create_time =
+ #{createTime},
+
+ update_by =
+ #{updateBy},
+
+ update_time =
+ #{updateTime},
+
+
+ where id = #{id}
+
+
+
+ update training_item
+ set training_shelf_flag = #{trainingShelfFlag}
+ where training_parent_id = #{trainingParentId}
+
+
\ No newline at end of file