From 38bb1e681c1eb0b659877009ba98ef525ca21f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Thu, 23 Jan 2025 21:04:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E6=8E=A5=E5=8F=A3=EF=BC=9B=E7=AE=A1=E7=90=86=E7=AB=AF?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=B7=BB=E5=8A=A0=E5=AD=97=E5=85=B8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nflg-mobilebroken-admin/pom.xml | 6 +- .../controller/DictionaryController.java | 210 ++++++++++++++++++ .../admin/controller/PlatformController.java | 46 ---- .../src/main/resources/bootstrap.properties | 2 +- nflg-mobilebroken-common/pom.xml | 10 +- .../mobilebroken/common/pojo/ApiResult.java | 23 +- .../pojo/dto/DictionaryItemTranslateDTO.java | 20 ++ .../request/DictionaryItemSearchRequest.java | 13 ++ .../request/SaveDictionaryItemRequest.java | 28 +++ .../pojo/request/SaveDictionaryRequest.java | 20 ++ .../common/pojo/request/TranslateMap.java | 16 ++ .../pojo/vo/DictionaryItemTranslateVO.java | 18 ++ .../common/pojo/vo/DictionaryItemVO.java | 46 ++++ .../common/util/EecExcelUtil.java | 33 ++- .../mobilebroken/common/util/TokenUtil.java | 10 + .../mapper/DictionaryItemMapper.java | 6 +- .../mapper/DictionaryItemTranslateMapper.java | 6 +- .../service/IDictionaryItemService.java | 10 +- .../IDictionaryItemTranslateService.java | 14 +- .../service/IDictionaryService.java | 5 +- .../impl/DictionaryItemServiceImpl.java | 99 ++++++++- .../DictionaryItemTranslateServiceImpl.java | 69 +++++- .../service/impl/DictionaryServiceImpl.java | 25 +++ .../mapper/DictionaryItemTranslateMapper.xml | 7 + 24 files changed, 669 insertions(+), 73 deletions(-) create mode 100644 nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DictionaryController.java delete mode 100644 nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/PlatformController.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DictionaryItemTranslateDTO.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/DictionaryItemSearchRequest.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryItemRequest.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryRequest.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TranslateMap.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DictionaryItemTranslateVO.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DictionaryItemVO.java diff --git a/nflg-mobilebroken-admin/pom.xml b/nflg-mobilebroken-admin/pom.xml index e1c48f33..7bffa4df 100644 --- a/nflg-mobilebroken-admin/pom.xml +++ b/nflg-mobilebroken-admin/pom.xml @@ -10,7 +10,7 @@ nflg-mobilebroken-admin 1.0.0-SNAPSHOT 服务-管理端服务 - 菜单等公用功能接口 + 管理端的功能接口 jar @@ -71,10 +71,6 @@ jakarta.validation jakarta.validation-api - - com.nflg - nflg-mobilebroken-starter - diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DictionaryController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DictionaryController.java new file mode 100644 index 00000000..534a4504 --- /dev/null +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DictionaryController.java @@ -0,0 +1,210 @@ +package com.nflg.mobilebroken.admin.controller; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.nflg.mobilebroken.common.constant.STATE; +import com.nflg.mobilebroken.common.exception.NflgException; +import com.nflg.mobilebroken.common.pojo.ApiResult; +import com.nflg.mobilebroken.common.pojo.PageData; +import com.nflg.mobilebroken.common.pojo.dto.DictionaryItemTranslateDTO; +import com.nflg.mobilebroken.common.pojo.request.DictionaryItemSearchRequest; +import com.nflg.mobilebroken.common.pojo.request.DictionarySearchRequest; +import com.nflg.mobilebroken.common.pojo.request.SaveDictionaryItemRequest; +import com.nflg.mobilebroken.common.pojo.request.SaveDictionaryRequest; +import com.nflg.mobilebroken.common.pojo.vo.DictionaryItemTranslateVO; +import com.nflg.mobilebroken.common.pojo.vo.DictionaryItemVO; +import com.nflg.mobilebroken.common.pojo.vo.DictionaryVO; +import com.nflg.mobilebroken.common.util.EecExcelUtil; +import com.nflg.mobilebroken.common.util.TokenUtil; +import com.nflg.mobilebroken.common.util.VUtils; +import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; +import com.nflg.mobilebroken.repository.entity.Language; +import com.nflg.mobilebroken.repository.service.IDictionaryItemService; +import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; +import com.nflg.mobilebroken.repository.service.IDictionaryService; +import com.nflg.mobilebroken.repository.service.ILanguageService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 字典相关 + * + * @author 曹鹏飞 + */ +@Slf4j +@RestController +@RequestMapping("/dictionary") +public class DictionaryController { + + @Resource + private IDictionaryService dictionaryService; + + @Resource + private IDictionaryItemService dictionaryItemService; + + @Resource + private IDictionaryItemTranslateService dictionaryItemTranslateService; + + @Resource + private ILanguageService languageService; + + /** + * 搜索字典 + * + * @param request 请求参数 + * @return 字典列表 + */ + @PostMapping("searchDictionary") + public ApiResult> searchDictionary(@RequestBody DictionarySearchRequest request) { + IPage page = new Page<>(); + page.setCurrent(request.getPageNum()); + page.setSize(request.getPageSize()); + dictionaryService.search(request, page); + return ApiResult.success(page); + } + + /** + * 保存字典 + * + * @param request 请求参数 + */ + @PostMapping("saveDictionary") + public ApiResult saveDictionary(@Valid @RequestBody SaveDictionaryRequest request) { + dictionaryService.save(request); + return ApiResult.success(); + } + + /** + * 删除字典 + * + * @param ids id列表 + */ + @PostMapping("deleteDictionary") + public ApiResult deleteDictionary(@Valid @RequestBody @NotEmpty List ids) { + dictionaryService.removeBatchByIds(ids); + return ApiResult.success(); + } + + /** + * 搜索字典值 + * + * @param request 请求参数 + * @return 字典列表 + */ + @PostMapping("searchDictionaryItem") + public ApiResult> searchDictionaryItem(@RequestBody DictionaryItemSearchRequest request) { + IPage page = new Page<>(); + page.setCurrent(request.getPageNum()); + page.setSize(request.getPageSize()); + dictionaryItemService.search(request, page); + return ApiResult.success(page); + } + + /** + * 保存字典值 + * + * @param request 请求参数 + */ + @PostMapping("saveDictionaryItem") + public ApiResult saveDictionaryItem(@Valid @RequestBody SaveDictionaryItemRequest request) { + dictionaryItemService.save(request); + return ApiResult.success(); + } + + /** + * 删除字典值 + * + * @param ids id列表 + */ + @PostMapping("deleteDictionaryItem") + public ApiResult deleteDictionaryItem(@Valid @RequestBody @NotEmpty List ids) { + dictionaryItemService.removeBatchByIds(ids); + return ApiResult.success(); + } + + /** + * 获取字典值翻译列表 + * + * @param id 字典值id + * @return 字典值翻译列表 + */ + @GetMapping("getDictionaryItemTranslateList") + public ApiResult> getDictionaryItemTranslateList(@Valid @RequestParam @NotNull Integer id) { + return ApiResult.success(dictionaryItemTranslateService.getListByDictionaryItemId(id)); + } + + /** + * 导出字典值翻译列表 + * + * @param dictionaryItemIds 字典值id列表 + */ + @GetMapping("exportDictionaryItemTranslates") + public void exportDictionaryItemTranslates(HttpServletResponse response + , @Validated @RequestParam @NotEmpty List dictionaryItemIds) throws IOException { + List datas = dictionaryItemTranslateService.getAllLanguageByDictionaryItemIds(dictionaryItemIds); + EecExcelUtil.export("字典翻译", "sheet1", datas, response); + } + + /** + * 导入字典值翻译列表 + * + * @param file 文件 + */ + @PostMapping("importDictionaryItemTranslates") + public ApiResult importDictionaryItemTranslates(@RequestParam("file") MultipartFile file) { + if (file.isEmpty()) { + return ApiResult.error("请选择一个文件上传!"); + } + try { + List datas = EecExcelUtil.readTo(file.getInputStream(), DictionaryItemTranslateDTO.class); + List languages = languageService.getLanguages(); + List forAdd = new ArrayList<>(); + List forUpdate = new ArrayList<>(); + for (DictionaryItemTranslateDTO dto : datas) { + Integer dictionaryItemId = dictionaryItemService.getId(dto.getDictionaryName(), dto.getDictionaryItemName()); + VUtils.trueThrowBusinessError(Objects.isNull(dictionaryItemId)).throwMessage("字典数据不存在:" + dto.getDictionaryName() + "-" + dto.getDictionaryItemName()); + Language language = languages.stream().filter(l -> StrUtil.equals(l.getName(), dto.getLanguageName())).findFirst().orElse(null); + VUtils.trueThrowBusinessError(Objects.isNull(language)).throwMessage("语言不存在:" + dto.getLanguageName()); + Integer translateId = dictionaryItemTranslateService.getId(dictionaryItemId, language.getCode()); + DictionaryItemTranslate translate = new DictionaryItemTranslate(); + translate.setValue(dto.getTranslateValue()); + if (Objects.isNull(translateId)) { + translate.setLanguageCode(language.getCode()) + .setDictionaryItemId(dictionaryItemId) + .setCreateBy(TokenUtil.getUserName()) + .setCreateTime(LocalDateTime.now()); + forAdd.add(translate); + } else { + translate.setUpdateBy(TokenUtil.getUserName()) + .setUpdateTime(LocalDateTime.now()) + .setId(translateId); + forUpdate.add(translate); + } + } + if (CollectionUtil.isNotEmpty(forAdd)) { + dictionaryItemTranslateService.saveBatch(forAdd); + } + if (CollectionUtil.isNotEmpty(forUpdate)) { + dictionaryItemTranslateService.updateBatchById(forUpdate); + } + return ApiResult.success(); + } catch (IOException e) { + throw new NflgException(STATE.BusinessError, "文件处理失败:" + e.getMessage()); + } + } +} diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/PlatformController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/PlatformController.java deleted file mode 100644 index 63a96768..00000000 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/PlatformController.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.nflg.mobilebroken.admin.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.nflg.mobilebroken.common.pojo.ApiResult; -import com.nflg.mobilebroken.common.pojo.PageData; -import com.nflg.mobilebroken.common.pojo.request.DictionarySearchRequest; -import com.nflg.mobilebroken.common.pojo.vo.DictionaryVO; -import com.nflg.mobilebroken.repository.service.IDictionaryService; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -/** - * 平台管理 - * @author 曹鹏飞 - */ -@RestController -@RequestMapping("/platform") -public class PlatformController { - - @Resource - private IDictionaryService dictionaryService; - - /** - * 搜索字典 - * @param request 请求参数 - * @return 字典列表 - */ - @PostMapping("search") - public ApiResult> search(@RequestBody DictionarySearchRequest request){ - IPage page=new Page<>(); - page.setCurrent(request.getPageNum()); - page.setSize(request.getPageSize()); - dictionaryService.search(request,page); - PageData pageData=new PageData<>(); - pageData.setPage(page.getCurrent()); - pageData.setPageSize(page.getSize()); - pageData.setTotal(page.getTotal()); - pageData.setItems(page.getRecords()); - return ApiResult.success(pageData); - } -} diff --git a/nflg-mobilebroken-cfs-app/src/main/resources/bootstrap.properties b/nflg-mobilebroken-cfs-app/src/main/resources/bootstrap.properties index 0e2eb30c..67ac4729 100644 --- a/nflg-mobilebroken-cfs-app/src/main/resources/bootstrap.properties +++ b/nflg-mobilebroken-cfs-app/src/main/resources/bootstrap.properties @@ -1,6 +1,6 @@ spring.application.name=cfs-app spring.profiles.active=dev -server.port=8080 +server.port=8083 # 设置最大文件大小 (默认为1MB) spring.servlet.multipart.max-file-size=100MB # 设置所有文件总大小 (默认为10MB) diff --git a/nflg-mobilebroken-common/pom.xml b/nflg-mobilebroken-common/pom.xml index ff3c701a..c79a84c5 100644 --- a/nflg-mobilebroken-common/pom.xml +++ b/nflg-mobilebroken-common/pom.xml @@ -40,7 +40,15 @@ org.ttzero eec - 0.4.14 + 0.5.21 + + + com.baomidou + mybatis-plus-core + + + org.springframework + spring-web diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/ApiResult.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/ApiResult.java index 7e891522..b10c51ca 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/ApiResult.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/ApiResult.java @@ -1,10 +1,9 @@ package com.nflg.mobilebroken.common.pojo; -import cn.hutool.db.Page; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.nflg.mobilebroken.common.constant.STATE; import lombok.Data; -import javax.validation.Valid; import java.io.Serializable; import java.time.LocalDateTime; import java.util.List; @@ -39,6 +38,19 @@ public class ApiResult implements Serializable { return vo; } + public static ApiResult> success(IPage page) { + ApiResult> vo = new ApiResult<>(); + PageData pageData = new PageData<>(); + pageData.setPage(page.getCurrent()); + pageData.setPageSize(page.getSize()); + pageData.setTotal(page.getTotal()); + pageData.setItems(page.getRecords()); + vo.setCode(STATE.Success.getState()); + vo.setType(STATE.Success.getType()); + vo.setResult(pageData); + return vo; + } + public static ApiResult error(int state,String msg,T value) { ApiResult vo = new ApiResult<>(); @@ -66,8 +78,11 @@ public class ApiResult implements Serializable { return vo; } - public static ApiResult success() { - return ApiResult.success(null); + public static ApiResult success() { + ApiResult vo = new ApiResult<>(); + vo.code = STATE.Success.getState(); + vo.type = STATE.Success.getType(); + return vo; } public static ApiResult error(STATE code, String msg) { return error(code.getState(),code.getType(), msg); diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DictionaryItemTranslateDTO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DictionaryItemTranslateDTO.java new file mode 100644 index 00000000..d9d3cc18 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DictionaryItemTranslateDTO.java @@ -0,0 +1,20 @@ +package com.nflg.mobilebroken.common.pojo.dto; + +import lombok.Data; +import org.ttzero.excel.annotation.ExcelColumn; + +@Data +public class DictionaryItemTranslateDTO { + + @ExcelColumn("字典名称") + private String dictionaryName; + + @ExcelColumn("字典值名称") + private String dictionaryItemName; + + @ExcelColumn("语言名称") + private String languageName; + + @ExcelColumn("翻译内容") + private String translateValue; +} \ No newline at end of file diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/DictionaryItemSearchRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/DictionaryItemSearchRequest.java new file mode 100644 index 00000000..5d354fa2 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/DictionaryItemSearchRequest.java @@ -0,0 +1,13 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; + +@Data +public class DictionaryItemSearchRequest extends PageRequest { + + //字典名称 + private String name; + + //字典编码 + private String code; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryItemRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryItemRequest.java new file mode 100644 index 00000000..6760c3e3 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryItemRequest.java @@ -0,0 +1,28 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +@Data +public class SaveDictionaryItemRequest { + + //字典值id + private Integer id; + + //字典值名称 + @NotBlank(message = "字典名称不能为空") + private String name; + + //字典值编码 + @NotBlank(message = "字典编码不能为空") + private String code; + + //属性值 + @NotBlank(message = "属性值不能为空") + private String value; + + //多语言翻译 + private List languages; +} \ No newline at end of file diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryRequest.java new file mode 100644 index 00000000..1b404e00 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryRequest.java @@ -0,0 +1,20 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class SaveDictionaryRequest { + + //字典id + private Integer id; + + //字典名称 + @NotBlank(message = "字典名称不能为空") + private String name; + + //字典编码 + @NotBlank(message = "字典编码不能为空") + private String code; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TranslateMap.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TranslateMap.java new file mode 100644 index 00000000..77a40c2f --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TranslateMap.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; + +@Data +public class TranslateMap { + + //翻译id + private Integer id; + + //语言代码 + private String code; + + //翻译值 + private String value; +} \ No newline at end of file diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DictionaryItemTranslateVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DictionaryItemTranslateVO.java new file mode 100644 index 00000000..a76077ec --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DictionaryItemTranslateVO.java @@ -0,0 +1,18 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; + +@Data +public class DictionaryItemTranslateVO { + + private Integer id; + + //语言代码 + private String code; + + //语言名称 + private String name; + + //翻译内容 + private String value; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DictionaryItemVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DictionaryItemVO.java new file mode 100644 index 00000000..2e5c7957 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DictionaryItemVO.java @@ -0,0 +1,46 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class DictionaryItemVO { + + private Integer id; + + /** + * 字典值名称 + */ + private String name; + + /** + * 字典值编码 + */ + private String code; + + /** + * 属性值 + */ + private String value; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 最后更新人 + */ + private String updateBy; + + /** + * 最后更新时间 + */ + private LocalDateTime updateTime; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/EecExcelUtil.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/EecExcelUtil.java index dc628470..3b5c3ddb 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/EecExcelUtil.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/EecExcelUtil.java @@ -3,8 +3,9 @@ package com.nflg.mobilebroken.common.util; import com.nflg.mobilebroken.common.constant.STATE; import com.nflg.mobilebroken.common.exception.NflgException; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.ttzero.excel.entity.ListSheet; - import org.ttzero.excel.entity.Workbook; import org.ttzero.excel.reader.ExcelReader; import org.ttzero.excel.reader.Row; @@ -13,9 +14,8 @@ import org.ttzero.excel.reader.Sheet; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; -import java.io.UnsupportedEncodingException; import java.net.URLEncoder; - +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -30,10 +30,9 @@ import java.util.stream.Collectors; */ public class EecExcelUtil { - public static void setResponseExcelHeader(HttpServletResponse response, String fileName) throws UnsupportedEncodingException { - response.setHeader("content-Type", "application/octet-stream"); - response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "utf-8")); - + public static void setResponseExcelHeader(HttpServletResponse response, String fileName) { + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", StandardCharsets.UTF_8)); } public static void eecExcel(String fileName, List sheets, HttpServletResponse response) throws IOException { @@ -45,6 +44,26 @@ public class EecExcelUtil { workbook.writeTo(response.getOutputStream()); } + public static void export(String fileName, String sheetName, List sheets, HttpServletResponse response) throws IOException { + setResponseExcelHeader(response, fileName); + new Workbook() + .setAutoSize(true) + .addSheet(new ListSheet<>(sheetName, sheets)) + .writeTo(response.getOutputStream()); + } + + public static List readTo(InputStream stream, Class clazz) { + try (ExcelReader reader = ExcelReader.read(stream)) { + return reader.sheet(0) // 读取第1个Sheet页 + .header(1) // 指定第6行为表头 + .rows() // 读取数据行 + .map(row -> row.to(clazz))// 将每行数据转换为User对象 + .collect(Collectors.toList()); // 收集数据进行后续处理 + } catch (IOException e) { + throw new NflgException(STATE.BusinessError, "读取EXCEL失败,请检查模板是否正确:" + e.getMessage()); + } + } + /** * 行读取excel sheet 0 * diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/TokenUtil.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/TokenUtil.java index b16eb68d..54aa8315 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/TokenUtil.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/TokenUtil.java @@ -27,4 +27,14 @@ public class TokenUtil { throw new NflgException(STATE.LoginError,"请登录"); } } + + public static String getUserName() { + try { + //TODO 待实现 + return "admin"; + //return StpUtil.getLoginIdAsInt(); + } catch (Exception ex) { + throw new NflgException(STATE.LoginError, "请登录"); + } + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemMapper.java index 24f5c9ca..4ace324d 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemMapper.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemMapper.java @@ -1,7 +1,9 @@ package com.nflg.mobilebroken.repository.mapper; -import com.nflg.mobilebroken.repository.entity.DictionaryItem; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nflg.mobilebroken.repository.entity.DictionaryItem; +import org.apache.ibatis.annotations.Select; +import org.springframework.data.repository.query.Param; /** *

@@ -13,4 +15,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface DictionaryItemMapper extends BaseMapper { + @Select("SELECT di.id FROM dictionary_item di INNER JOIN dictionary d ON di.dictionary_id=d.id WHERE d.`name`=#{dictionaryName} AND di.`name`=#{dictionaryItemName}") + Integer getId(@Param("dictionaryName") String dictionaryName, @Param("dictionaryItemName") String dictionaryItemName); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java index 963b3d43..f7ecda4b 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java @@ -1,7 +1,10 @@ package com.nflg.mobilebroken.repository.mapper; -import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nflg.mobilebroken.common.pojo.vo.DictionaryItemTranslateVO; +import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; + +import java.util.List; /** *

@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface DictionaryItemTranslateMapper extends BaseMapper { + List getListByDictionaryItemId(Integer id); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemService.java index fa69855e..713d1be6 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemService.java @@ -1,7 +1,10 @@ package com.nflg.mobilebroken.repository.service; -import com.nflg.mobilebroken.repository.entity.DictionaryItem; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import com.nflg.mobilebroken.common.pojo.request.DictionaryItemSearchRequest; +import com.nflg.mobilebroken.common.pojo.request.SaveDictionaryItemRequest; +import com.nflg.mobilebroken.repository.entity.DictionaryItem; /** *

@@ -13,4 +16,9 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface IDictionaryItemService extends IService { + void search(DictionaryItemSearchRequest request, IPage page); + + void save(SaveDictionaryItemRequest request); + + Integer getId(String dictionaryName, String dictionaryItemName); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java index 703bc993..563f88ad 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java @@ -1,7 +1,14 @@ package com.nflg.mobilebroken.repository.service; -import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; import com.baomidou.mybatisplus.extension.service.IService; +import com.nflg.mobilebroken.common.pojo.dto.DictionaryItemTranslateDTO; +import com.nflg.mobilebroken.common.pojo.vo.DictionaryItemTranslateVO; +import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; + +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; /** *

@@ -13,4 +20,9 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface IDictionaryItemTranslateService extends IService { + List getListByDictionaryItemId(@Valid @NotNull Integer id); + + List getAllLanguageByDictionaryItemIds(@NotEmpty List dictionaryItemIds); + + Integer getId(Integer dictionaryItemId, String code); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryService.java index ab8b7777..86a9256a 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryService.java @@ -1,10 +1,11 @@ package com.nflg.mobilebroken.repository.service; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; import com.nflg.mobilebroken.common.pojo.request.DictionarySearchRequest; +import com.nflg.mobilebroken.common.pojo.request.SaveDictionaryRequest; import com.nflg.mobilebroken.common.pojo.vo.DictionaryVO; import com.nflg.mobilebroken.repository.entity.Dictionary; -import com.baomidou.mybatisplus.extension.service.IService; /** *

@@ -17,4 +18,6 @@ import com.baomidou.mybatisplus.extension.service.IService; public interface IDictionaryService extends IService { void search(DictionarySearchRequest request, IPage page); + + void save(SaveDictionaryRequest request); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java index 38fdfeb7..300d7c4c 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java @@ -1,10 +1,28 @@ package com.nflg.mobilebroken.repository.service.impl; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.mobilebroken.common.pojo.request.DictionaryItemSearchRequest; +import com.nflg.mobilebroken.common.pojo.request.SaveDictionaryItemRequest; +import com.nflg.mobilebroken.common.pojo.request.TranslateMap; +import com.nflg.mobilebroken.common.util.TokenUtil; import com.nflg.mobilebroken.repository.entity.DictionaryItem; +import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; import com.nflg.mobilebroken.repository.mapper.DictionaryItemMapper; import com.nflg.mobilebroken.repository.service.IDictionaryItemService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; /** *

@@ -17,4 +35,83 @@ import org.springframework.stereotype.Service; @Service public class DictionaryItemServiceImpl extends ServiceImpl implements IDictionaryItemService { + @Resource + private IDictionaryItemTranslateService dictionaryItemTranslateService; + + @Override + public void search(DictionaryItemSearchRequest request, IPage page) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (StrUtil.isNotBlank(request.getName())) { + queryWrapper.like(DictionaryItem::getName, request.getName()); + } + if (StrUtil.isNotBlank(request.getCode())) { + queryWrapper.like(DictionaryItem::getCode, request.getCode()); + } + queryWrapper.orderByDesc(DictionaryItem::getId); + baseMapper.selectPage(page, queryWrapper); + } + + @Transactional + @Override + public boolean removeBatchByIds(Collection list) { + super.removeBatchByIds(list); + dictionaryItemTranslateService.remove(new LambdaQueryWrapper() + .in(DictionaryItemTranslate::getDictionaryItemId, list)); + return true; + } + + @Transactional + @Override + public void save(SaveDictionaryItemRequest request) { + Integer id = request.getId(); + if (Objects.isNull(request.getId())) { + DictionaryItem dictionary = new DictionaryItem() + .setName(request.getName()) + .setCode(request.getCode()) + .setValue(request.getValue()) + .setCreateBy(TokenUtil.getUserName()) + .setCreateTime(LocalDateTime.now()); + save(dictionary); + id = dictionary.getId(); + } else { + DictionaryItem dictionary = new DictionaryItem() + .setId(request.getId()) + .setName(request.getName()) + .setCode(request.getCode()) + .setValue(request.getValue()) + .setUpdateBy(TokenUtil.getUserName()) + .setUpdateTime(LocalDateTime.now()); + updateById(dictionary); + } + if (CollectionUtil.isNotEmpty(request.getLanguages())) { + dictionaryItemTranslateService.remove(new LambdaQueryWrapper() + .eq(DictionaryItemTranslate::getDictionaryItemId, id)); + List forAdd = new ArrayList<>(); + List forUpdate = new ArrayList<>(); + for (TranslateMap translate : request.getLanguages()) { + DictionaryItemTranslate t = new DictionaryItemTranslate() + .setDictionaryItemId(id) + .setLanguageCode(translate.getCode()) + .setValue(translate.getValue()); + if (Objects.isNull(translate.getId())) { + t.setCreateBy(TokenUtil.getUserName()).setCreateTime(LocalDateTime.now()); + forAdd.add(t); + } else { + t.setId(translate.getId()).setUpdateBy(TokenUtil.getUserName()).setUpdateTime(LocalDateTime.now()); + forUpdate.add(t); + } + } + if (CollectionUtil.isNotEmpty(forAdd)) { + dictionaryItemTranslateService.saveBatch(forAdd); + } + if (CollectionUtil.isNotEmpty(forUpdate)) { + dictionaryItemTranslateService.updateBatchById(forUpdate); + } + } + } + + @Override + public Integer getId(String dictionaryName, String dictionaryItemName) { + return baseMapper.getId(dictionaryName, dictionaryItemName); + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java index 597951f2..dbf86f1d 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java @@ -1,11 +1,27 @@ package com.nflg.mobilebroken.repository.service.impl; -import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; -import com.nflg.mobilebroken.repository.mapper.DictionaryItemTranslateMapper; -import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.mobilebroken.common.pojo.dto.DictionaryItemTranslateDTO; +import com.nflg.mobilebroken.common.pojo.vo.DictionaryItemTranslateVO; +import com.nflg.mobilebroken.common.util.VUtils; +import com.nflg.mobilebroken.repository.entity.Dictionary; +import com.nflg.mobilebroken.repository.entity.DictionaryItem; +import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; +import com.nflg.mobilebroken.repository.entity.Language; +import com.nflg.mobilebroken.repository.mapper.DictionaryItemTranslateMapper; +import com.nflg.mobilebroken.repository.service.IDictionaryItemService; +import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; +import com.nflg.mobilebroken.repository.service.IDictionaryService; +import com.nflg.mobilebroken.repository.service.ILanguageService; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + /** *

* 字典值翻译 服务实现类 @@ -17,4 +33,51 @@ import org.springframework.stereotype.Service; @Service public class DictionaryItemTranslateServiceImpl extends ServiceImpl implements IDictionaryItemTranslateService { + @Resource + private ILanguageService languageService; + + @Resource + private IDictionaryItemService dictionaryItemService; + + @Resource + private IDictionaryService dictionaryService; + + @Override + public List getListByDictionaryItemId(Integer id) { + return baseMapper.getListByDictionaryItemId(id); + } + + @Override + public List getAllLanguageByDictionaryItemIds(List dictionaryItemIds) { + List dictionaryItems = dictionaryItemService.lambdaQuery().in(DictionaryItem::getId, dictionaryItemIds).list(); + VUtils.trueThrowBusinessError(CollectionUtil.isEmpty(dictionaryItems)).throwMessage("字典值不存在"); + Dictionary dictionary = dictionaryService.getById(dictionaryItems.get(0).getDictionaryId()); + VUtils.trueThrowBusinessError(Objects.isNull(dictionary)).throwMessage("字典不存在"); + List dictionaryItemTranslates = lambdaQuery().in(DictionaryItemTranslate::getDictionaryItemId, dictionaryItemIds).list(); + List languages = languageService.getLanguages(); + List vos = new ArrayList<>(); + dictionaryItems.forEach(di -> { + languages.forEach(l -> { + DictionaryItemTranslateDTO vo = new DictionaryItemTranslateDTO(); + vo.setDictionaryName(dictionary.getName()); + vo.setDictionaryItemName(di.getName()); + vo.setLanguageName(l.getName()); + DictionaryItemTranslate it = dictionaryItemTranslates.stream().filter(t -> Objects.equals(di.getId(), t.getDictionaryItemId()) + && StrUtil.equals(t.getLanguageCode(), l.getCode())).findFirst().orElse(null); + if (Objects.nonNull(it)) { + vo.setTranslateValue(it.getValue()); + } + vos.add(vo); + }); + }); + return vos; + } + + @Override + public Integer getId(Integer dictionaryItemId, String code) { + DictionaryItemTranslate translate = lambdaQuery() + .eq(DictionaryItemTranslate::getDictionaryItemId, dictionaryItemId).eq(DictionaryItemTranslate::getLanguageCode, code) + .one(); + return Objects.isNull(translate) ? null : translate.getId(); + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryServiceImpl.java index 3df7dcca..6b363340 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryServiceImpl.java @@ -5,11 +5,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nflg.mobilebroken.common.pojo.request.DictionarySearchRequest; +import com.nflg.mobilebroken.common.pojo.request.SaveDictionaryRequest; +import com.nflg.mobilebroken.common.util.TokenUtil; import com.nflg.mobilebroken.repository.entity.Dictionary; import com.nflg.mobilebroken.repository.mapper.DictionaryMapper; import com.nflg.mobilebroken.repository.service.IDictionaryService; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.util.Objects; + /** *

* 字典 服务实现类 @@ -33,4 +38,24 @@ public class DictionaryServiceImpl extends ServiceImpl +