From 02c5fff316e1e22a1e1401a7dc5396ae8eea6331 Mon Sep 17 00:00:00 2001 From: XaoLi717 <144221124+XaoLi717@users.noreply.github.com> Date: Fri, 13 Sep 2024 07:49:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=E6=9B=B4?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/only/onlyofController.java | 316 ++++++++++++++++++ .../admin/only/vo/onlyofPageReqVO.java | 41 +++ .../admin/only/vo/onlyofRespVO.java | 47 +++ .../admin/only/vo/onlyofSaveReqVO.java | 37 ++ .../only/dal/dataobject/only/onlyofDO.java | 55 +++ .../only/dal/mysql/only/onlyofMapper.java | 32 ++ .../only/service/only/onlyofService.java | 55 +++ .../only/service/only/onlyofServiceImpl.java | 74 ++++ .../resources/mapper/only/onlyofMapper.xml | 12 + .../service/only/onlyofServiceImplTest.java | 154 +++++++++ 10 files changed, 823 insertions(+) create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/onlyofController.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofPageReqVO.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofRespVO.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofSaveReqVO.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/dal/dataobject/only/onlyofDO.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/dal/mysql/only/onlyofMapper.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/service/only/onlyofService.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/service/only/onlyofServiceImpl.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/only/onlyofMapper.xml create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/only/service/only/onlyofServiceImplTest.java diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/onlyofController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/onlyofController.java new file mode 100644 index 0000000..aa7e676 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/onlyofController.java @@ -0,0 +1,316 @@ +package cn.iocoder.yudao.module.only.controller.admin.only; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.bpm.controller.admin.onlyoffice.utils.DocumentConstants; +import cn.iocoder.yudao.module.bpm.controller.admin.onlyoffice.utils.FileUtil; +import cn.iocoder.yudao.module.bpm.controller.admin.onlyoffice.utils.Md5Utils; +import cn.iocoder.yudao.module.bpm.controller.admin.onlyoffice.vo.Document; +import cn.iocoder.yudao.module.bpm.service.document.DocumentService; +import cn.iocoder.yudao.module.bpm.service.fileupload.FileUploadService; +import cn.iocoder.yudao.module.only.controller.admin.only.vo.onlyofPageReqVO; +import cn.iocoder.yudao.module.only.controller.admin.only.vo.onlyofRespVO; +import cn.iocoder.yudao.module.only.controller.admin.only.vo.onlyofSaveReqVO; +import cn.iocoder.yudao.module.only.dal.dataobject.only.onlyofDO; +import cn.iocoder.yudao.module.only.service.only.onlyofService; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.commons.lang3.StringUtils; +import org.hashids.Hashids; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.ModelAndView; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Scanner; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 文件编辑") +@RestController +@RequestMapping("/only/onlyof") +@Validated +@Controller +public class onlyofController { + + + @Value("${files.savePath}") + private String filePath; + @Value("${files.docservice.url.site}") + private String officeUrl; + @Value("${files.docservice.url.command}") + private String officeCommand; + @Autowired + private DocumentService documentService; + @Autowired + private FileUploadService uploadService; + @Autowired + RestTemplate restTemplate; +// @Resource +// private DocumentService documentService; + + @Resource + private onlyofService onlyofService; + + @PostMapping("/create") + @Operation(summary = "创建文件编辑") + @PreAuthorize("@ss.hasPermission('only:onlyof:create')") + public CommonResult createonlyof(@Valid @RequestBody onlyofSaveReqVO createReqVO) { + return success(onlyofService.createonlyof(createReqVO)); + } + + /** + * 下载文档接口 + * @param name + * @param response + */ + @GetMapping("/download") + @Operation(summary = "创建文件编辑") + @PreAuthorize("@ss.hasPermission('only:onlyof:create')") + public void download(String name, HttpServletResponse response) { + System.out.println("download---"+name+"-----"+response); + try { + FileUtil.downLoadFile(name,filePath,response); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @GetMapping("/edit") + @Operation(summary = "更新文件编辑") + @PreAuthorize("@ss.hasPermission('only:onlyof:update')") + public ModelAndView editDocFile(@RequestParam String name, String userName, String userId ,String token, Model model) { + String path = filePath+name; + System.out.println("path:"+path); + ModelAndView mav = new ModelAndView(); + Document document = documentService.getDocumentToken(documentService.buildDocument(path, name),token); + mav.addObject("document", document); + if (!documentService.canEdit(document)) { + System.out.println("demo"); + return mav; + } + mav.addObject("documentEditParam", documentService.buildDocumentEditParamToken(userId, userName, name,token)); + mav.setViewName("editor"); + System.out.println(mav); + return mav; + } + @GetMapping("/editStatus") + @Operation(summary = "更新文件编辑") + @PreAuthorize("@ss.hasPermission('only:onlyof:update')") + public ResponseEntity getDoucmentEditStatus(String name) throws ParseException { + System.out.println("editStatus"); + String url = officeUrl+officeCommand; + Map map = new HashMap(); + map.put("c", "forcesave"); + String docFileMd5 = Md5Utils.getFileMd5(new File(filePath+name)); + if (StringUtils.isBlank(docFileMd5)) { +// throw new DocumentException(ErrorCodeEnum.DOC_FILE_MD5_ERROR); + } + String pathShortMd5 = Md5Utils.md5(filePath + name); + String nameShortMd5 = Md5Utils.md5(name); + Hashids hashids = new Hashids(DocumentConstants.HASH_KEY); + // (将路径字符串短md5值 + 名称字符串短md5值) ==> 再转成短id形式 ==> 作为文档的key(暂且认为是不会重复的) + String key = hashids.encodeHex(String.format("%s%s%s", docFileMd5,pathShortMd5, nameShortMd5)); + map.put("key", key); + map.put("userdata", "sample userdata"); + JSONObject obj = (JSONObject) new JSONParser().parse(FileUtil.editStatus(url, JSON.toJSONString(map))); + return new ResponseEntity(obj, HttpStatus.OK); + } + + @RequestMapping("/callback") + @Operation(summary = "更新文件编辑") + @PreAuthorize("@ss.hasPermission('only:onlyof:update')") + public void saveDocumentFile(HttpServletRequest request, HttpServletResponse response) throws IOException { + System.out.println("callback"); + //处理编辑回调逻辑 + callBack(request, response); + + } + + /** + * 处理在线编辑文档的逻辑 + * @param request + * @param response + * @throws IOException + */ + private void callBack(HttpServletRequest request, HttpServletResponse response) throws IOException { + PrintWriter writer = null; + JSONObject jsonObj = null; + System.out.println("===saveeditedfile------------"); + try { + System.out.println("1111"); + writer = response.getWriter(); + System.out.println("2222"); + Scanner scanner = new Scanner(request.getInputStream()).useDelimiter("\\A"); + String body = scanner.hasNext() ? scanner.next() : ""; + System.out.println("4444: "+body); + jsonObj = (JSONObject) new JSONParser().parse(body); + System.out.println("5555"); +// jsonObj = (JSONObject) new JSONParser(body); + System.out.println(jsonObj); + System.out.println("===saveeditedfile:" + jsonObj.get("status")); + /* + 0 - no document with the key identifier could be found, + 1 - document is being edited, + 2 - document is ready for saving, + 3 - document saving error has occurred, + 4 - document is closed with no changes, + 6 - document is being edited, but the current document state is saved, + 7 - error has occurred while force saving the document. + * */ + if ((long) jsonObj.get("status") == 2) { + FileUtil.callBackSaveDocument(jsonObj,filePath,request, response); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (org.json.simple.parser.ParseException e) { + throw new RuntimeException(e); + } + /* + * status = 1,我们给onlyoffice的服务返回{"error":"0"}的信息,这样onlyoffice会认为回调接口是没问题的,这样就可以在线编辑文档了,否则的话会弹出窗口说明 + * 在线编辑还没有关闭,前端有人下载文档时,强制保存最新内容 当status 是6时说明有人在编辑时下载文档 + * */ + System.out.println(jsonObj.get("status")); + if ((long) jsonObj.get("status") == 6) { + //处理当文档正在编辑为关闭时,下载文档 + if (((String)jsonObj.get("userdata")).equals("sample userdata")){ + FileUtil.callBackSaveDocument(jsonObj,filePath,request, response); + } + + System.out.println("====保存失败:"); + writer.write("{\"error\":1}"); + } else { + //执行删除编辑时下载保存的文件: + FileUtil.deleteTempFile(filePath,request.getParameter("fileName")); + writer.write("{\"error\":0}"); + } + } + + @PostMapping("/update") + @Operation(summary = "更新文件编辑") + @PreAuthorize("@ss.hasPermission('only:onlyof:update')") +// public ResponseEntity upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws Exception { +// public ResponseEntity upload( String file) throws Exception { + public ResponseEntity upload(@RequestParam("file") MultipartFile file) throws Exception { + System.out.println("Open"); + System.out.println("1111"+file.getOriginalFilename()); + if (file.isEmpty()){ + throw new Exception("上传文件不能为空"); + } +// onlyofficeDO upload = new onlyofficeDO(); +// System.out.println("3333"+upload); +// String fileName = file.getOriginalFilename(); +// //更新保存文件信息到数据库 +// FileUtil.saveFile(file.getInputStream(),filePath+file.getOriginalFilename()); +// upload.setUploadDate(new Date()); +// upload.setFileName(fileName.substring(fileName.indexOf("."))); +// upload.setFilePath(filePath); +// upload.setFileName(file.getOriginalFilename()); +// upload.setFileSize(file.getSize()); +// System.out.println(upload); +// uploadService.save(upload); +// System.out.println("a111"); + + return new ResponseEntity("上传成功", HttpStatus.OK); + } +// public CommonResult updateonlyof(@Valid @RequestBody onlyofSaveReqVO updateReqVO) { +// onlyofService.updateonlyof(updateReqVO); +// return success(true); +// } + + @DeleteMapping("/delete") + @Operation(summary = "删除文件编辑") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('only:onlyof:delete')") + public CommonResult deleteonlyof(@RequestParam("id") Integer id) { + onlyofService.deleteonlyof(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得文件编辑") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('only:onlyof:query')") + public CommonResult getonlyof(@RequestParam("id") Integer id) { + onlyofDO onlyof = onlyofService.getonlyof(id); + return success(BeanUtils.toBean(onlyof, onlyofRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得文件编辑分页") + @PreAuthorize("@ss.hasPermission('only:onlyof:query')") + public CommonResult> getonlyofPage(@Valid onlyofPageReqVO pageReqVO) { + PageResult pageResult = onlyofService.getonlyofPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, onlyofRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出文件编辑 Excel") + @PreAuthorize("@ss.hasPermission('only:onlyof:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportonlyofExcel(@Valid onlyofPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = onlyofService.getonlyofPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "文件编辑.xls", "数据", onlyofRespVO.class, + BeanUtils.toBean(list, onlyofRespVO.class)); + } + + @PostMapping("/upload") + @PreAuthorize("@ss.hasPermission('only:onlyof:query')") + public String upload() { + return "56789"; + } +// public ResponseEntity upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws Exception { +// System.out.println("1111"); +// if (file.isEmpty()){ +// throw new Exception("上传文件不能为空"); +// } +// onlyofficeDO upload = new onlyofficeDO(); +// System.out.println("3333"+upload); +// String fileName = file.getOriginalFilename(); +// //更新保存文件信息到数据库 +// FileUtil.saveFile(file.getInputStream(),filePath+file.getOriginalFilename()); +// upload.setUploadDate(new Date()); +// upload.setFileName(fileName.substring(fileName.indexOf("."))); +// upload.setFilePath(filePath); +// upload.setFileName(file.getOriginalFilename()); +// upload.setFileSize(file.getSize()); +// System.out.println(upload); +// uploadService.save(upload); +// System.out.println("a111"); +// +// return new ResponseEntity("上传成功", HttpStatus.OK); +// } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofPageReqVO.java new file mode 100644 index 0000000..ea5695e --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofPageReqVO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.only.controller.admin.only.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 文件编辑分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class onlyofPageReqVO extends PageParam { + + @Schema(description = "文件名", example = "芋艿") + private String fileName; + + @Schema(description = "文件大小") + private Long fileSize; + + @Schema(description = "文件类型", example = "1") + private String fileType; + + @Schema(description = "文件路径") + private String filePath; + + @Schema(description = "更新时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] uploadDate; + + @Schema(description = "知识状态(0正常 1停用)", example = "1") + private String status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofRespVO.java new file mode 100644 index 0000000..f6d59e7 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofRespVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.only.controller.admin.only.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 文件编辑 Response VO") +@Data +@ExcelIgnoreUnannotated +public class onlyofRespVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32318") + @ExcelProperty("id") + private Integer id; + + @Schema(description = "文件名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("文件名") + private String fileName; + + @Schema(description = "文件大小") + @ExcelProperty("文件大小") + private Long fileSize; + + @Schema(description = "文件类型", example = "1") + @ExcelProperty("文件类型") + private String fileType; + + @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("文件路径") + private String filePath; + + @Schema(description = "更新时间") + @ExcelProperty("更新时间") + private LocalDateTime uploadDate; + + @Schema(description = "知识状态(0正常 1停用)", example = "1") + @ExcelProperty("知识状态(0正常 1停用)") + private String status; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofSaveReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofSaveReqVO.java new file mode 100644 index 0000000..6304a3c --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/controller/admin/only/vo/onlyofSaveReqVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.only.controller.admin.only.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 文件编辑新增/修改 Request VO") +@Data +public class onlyofSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32318") + private Integer id; + + @Schema(description = "文件名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotEmpty(message = "文件名不能为空") + private String fileName; + + @Schema(description = "文件大小") + private Long fileSize; + + @Schema(description = "文件类型", example = "1") + private String fileType; + + @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "文件路径不能为空") + private String filePath; + + @Schema(description = "更新时间") + private LocalDateTime uploadDate; + + @Schema(description = "知识状态(0正常 1停用)", example = "1") + private String status; + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/dal/dataobject/only/onlyofDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/dal/dataobject/only/onlyofDO.java new file mode 100644 index 0000000..5e34885 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/dal/dataobject/only/onlyofDO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.only.dal.dataobject.only; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 文件编辑 DO + * + * @author 君风 + */ +@TableName("file_info") +@KeySequence("file_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class onlyofDO extends BaseDO { + + /** + * id + */ + @TableId + private Integer id; + /** + * 文件名 + */ + private String fileName; + /** + * 文件大小 + */ + private Long fileSize; + /** + * 文件类型 + */ + private String fileType; + /** + * 文件路径 + */ + private String filePath; + /** + * 更新时间 + */ + private LocalDateTime uploadDate; + /** + * 知识状态(0正常 1停用) + */ + private String status; + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/dal/mysql/only/onlyofMapper.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/dal/mysql/only/onlyofMapper.java new file mode 100644 index 0000000..1d40472 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/dal/mysql/only/onlyofMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.only.dal.mysql.only; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.only.dal.dataobject.only.onlyofDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.only.controller.admin.only.vo.*; + +/** + * 文件编辑 Mapper + * + * @author 君风 + */ +@Mapper +public interface onlyofMapper extends BaseMapperX { + + default PageResult selectPage(onlyofPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(onlyofDO::getFileName, reqVO.getFileName()) + .eqIfPresent(onlyofDO::getFileSize, reqVO.getFileSize()) + .eqIfPresent(onlyofDO::getFileType, reqVO.getFileType()) + .eqIfPresent(onlyofDO::getFilePath, reqVO.getFilePath()) + .betweenIfPresent(onlyofDO::getUploadDate, reqVO.getUploadDate()) + .eqIfPresent(onlyofDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(onlyofDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(onlyofDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/service/only/onlyofService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/service/only/onlyofService.java new file mode 100644 index 0000000..821f000 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/service/only/onlyofService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.only.service.only; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.only.controller.admin.only.vo.*; +import cn.iocoder.yudao.module.only.dal.dataobject.only.onlyofDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 文件编辑 Service 接口 + * + * @author 君风 + */ +public interface onlyofService { + + /** + * 创建文件编辑 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createonlyof(@Valid onlyofSaveReqVO createReqVO); + + /** + * 更新文件编辑 + * + * @param updateReqVO 更新信息 + */ + void updateonlyof(@Valid onlyofSaveReqVO updateReqVO); + + /** + * 删除文件编辑 + * + * @param id 编号 + */ + void deleteonlyof(Integer id); + + /** + * 获得文件编辑 + * + * @param id 编号 + * @return 文件编辑 + */ + onlyofDO getonlyof(Integer id); + + /** + * 获得文件编辑分页 + * + * @param pageReqVO 分页查询 + * @return 文件编辑分页 + */ + PageResult getonlyofPage(onlyofPageReqVO pageReqVO); + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/service/only/onlyofServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/service/only/onlyofServiceImpl.java new file mode 100644 index 0000000..1865f03 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/only/service/only/onlyofServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.only.service.only; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.only.controller.admin.only.vo.*; +import cn.iocoder.yudao.module.only.dal.dataobject.only.onlyofDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.only.dal.mysql.only.onlyofMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.ONLYOF_NOT_EXISTS; + +/** + * 文件编辑 Service 实现类 + * + * @author 君风 + */ +@Service +@Validated +public class onlyofServiceImpl implements onlyofService { + + @Resource + private onlyofMapper onlyofMapper; + + @Override + public Integer createonlyof(onlyofSaveReqVO createReqVO) { + // 插入 + onlyofDO onlyof = BeanUtils.toBean(createReqVO, onlyofDO.class); + onlyofMapper.insert(onlyof); + // 返回 + return onlyof.getId(); + } + + @Override + public void updateonlyof(onlyofSaveReqVO updateReqVO) { + // 校验存在 + validateonlyofExists(updateReqVO.getId()); + // 更新 + onlyofDO updateObj = BeanUtils.toBean(updateReqVO, onlyofDO.class); + onlyofMapper.updateById(updateObj); + } + + @Override + public void deleteonlyof(Integer id) { + // 校验存在 + validateonlyofExists(id); + // 删除 + onlyofMapper.deleteById(id); + } + + private void validateonlyofExists(Integer id) { + if (onlyofMapper.selectById(id) == null) { + throw exception(ONLYOF_NOT_EXISTS); + } + } + + @Override + public onlyofDO getonlyof(Integer id) { + return onlyofMapper.selectById(id); + } + + @Override + public PageResult getonlyofPage(onlyofPageReqVO pageReqVO) { + return onlyofMapper.selectPage(pageReqVO); + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/only/onlyofMapper.xml b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/only/onlyofMapper.xml new file mode 100644 index 0000000..a6848a1 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/only/onlyofMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/only/service/only/onlyofServiceImplTest.java b/yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/only/service/only/onlyofServiceImplTest.java new file mode 100644 index 0000000..085e5a3 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/only/service/only/onlyofServiceImplTest.java @@ -0,0 +1,154 @@ +package cn.iocoder.yudao.module.only.service.only; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; + +import cn.iocoder.yudao.module.only.controller.admin.only.vo.*; +import cn.iocoder.yudao.module.only.dal.dataobject.only.onlyofDO; +import cn.iocoder.yudao.module.only.dal.mysql.only.onlyofMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.ONLYOF_NOT_EXISTS; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link onlyofServiceImpl} 的单元测试类 + * + * @author 君风 + */ +@Import(onlyofServiceImpl.class) +public class onlyofServiceImplTest extends BaseDbUnitTest { + + @Resource + private onlyofServiceImpl onlyofService; + + @Resource + private onlyofMapper onlyofMapper; + + @Test + public void testCreateonlyof_success() { + // 准备参数 + onlyofSaveReqVO createReqVO = randomPojo(onlyofSaveReqVO.class).setId(null); + + // 调用 + Integer onlyofId = onlyofService.createonlyof(createReqVO); + // 断言 + assertNotNull(onlyofId); + // 校验记录的属性是否正确 + onlyofDO onlyof = onlyofMapper.selectById(onlyofId); + assertPojoEquals(createReqVO, onlyof, "id"); + } + + @Test + public void testUpdateonlyof_success() { + // mock 数据 + onlyofDO dbonlyof = randomPojo(onlyofDO.class); + onlyofMapper.insert(dbonlyof);// @Sql: 先插入出一条存在的数据 + // 准备参数 + onlyofSaveReqVO updateReqVO = randomPojo(onlyofSaveReqVO.class, o -> { + o.setId(dbonlyof.getId()); // 设置更新的 ID + }); + + // 调用 + onlyofService.updateonlyof(updateReqVO); + // 校验是否更新正确 + onlyofDO onlyof = onlyofMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, onlyof); + } + + @Test + public void testUpdateonlyof_notExists() { + // 准备参数 + onlyofSaveReqVO updateReqVO = randomPojo(onlyofSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> onlyofService.updateonlyof(updateReqVO), ONLYOF_NOT_EXISTS); + } + + @Test + public void testDeleteonlyof_success() { + // mock 数据 + onlyofDO dbonlyof = randomPojo(onlyofDO.class); + onlyofMapper.insert(dbonlyof);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Integer id = dbonlyof.getId(); + + // 调用 + onlyofService.deleteonlyof(id); + // 校验数据不存在了 + assertNull(onlyofMapper.selectById(id)); + } + + @Test + public void testDeleteonlyof_notExists() { + // 准备参数 +// Integer id = randomIntegerId(); + + // 调用, 并断言异常 +// assertServiceException(() -> onlyofService.deleteonlyof(id), ONLYOF_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetonlyofPage() { + // mock 数据 + onlyofDO dbonlyof = randomPojo(onlyofDO.class, o -> { // 等会查询到 + o.setFileName(null); + o.setFileSize(null); + o.setFileType(null); + o.setFilePath(null); + o.setUploadDate(null); + o.setStatus(null); + o.setCreateTime(null); + }); + onlyofMapper.insert(dbonlyof); + // 测试 fileName 不匹配 + onlyofMapper.insert(cloneIgnoreId(dbonlyof, o -> o.setFileName(null))); + // 测试 fileSize 不匹配 + onlyofMapper.insert(cloneIgnoreId(dbonlyof, o -> o.setFileSize(null))); + // 测试 fileType 不匹配 + onlyofMapper.insert(cloneIgnoreId(dbonlyof, o -> o.setFileType(null))); + // 测试 filePath 不匹配 + onlyofMapper.insert(cloneIgnoreId(dbonlyof, o -> o.setFilePath(null))); + // 测试 uploadDate 不匹配 + onlyofMapper.insert(cloneIgnoreId(dbonlyof, o -> o.setUploadDate(null))); + // 测试 status 不匹配 + onlyofMapper.insert(cloneIgnoreId(dbonlyof, o -> o.setStatus(null))); + // 测试 createTime 不匹配 + onlyofMapper.insert(cloneIgnoreId(dbonlyof, o -> o.setCreateTime(null))); + // 准备参数 + onlyofPageReqVO reqVO = new onlyofPageReqVO(); + reqVO.setFileName(null); + reqVO.setFileSize(null); + reqVO.setFileType(null); + reqVO.setFilePath(null); +// reqVO.setUploadDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setStatus(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = onlyofService.getonlyofPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbonlyof, pageResult.getList().get(0)); + } + +}