Merge remote-tracking branch 'origin/develop' into develop

# Conflicts:
#	nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/TokenUtil.java
#	nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/config/MysqlDataSourceConfig.java
This commit is contained in:
luolm 2025-01-24 22:28:15 +08:00
commit 28b54385df
27 changed files with 675 additions and 81 deletions

View File

@ -10,7 +10,7 @@
<artifactId>nflg-mobilebroken-admin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>服务-管理端服务</name>
<description>菜单等公用功能接口</description>
<description>管理端的功能接口</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
@ -71,10 +71,6 @@
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
<dependency>
<groupId>com.nflg</groupId>
<artifactId>nflg-mobilebroken-starter</artifactId>
</dependency>
</dependencies>
<build>

View File

@ -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<PageData<DictionaryVO>> searchDictionary(@RequestBody DictionarySearchRequest request) {
IPage<DictionaryVO> 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<Void> saveDictionary(@Valid @RequestBody SaveDictionaryRequest request) {
dictionaryService.save(request);
return ApiResult.success();
}
/**
* 删除字典
*
* @param ids id列表
*/
@PostMapping("deleteDictionary")
public ApiResult<Void> deleteDictionary(@Valid @RequestBody @NotEmpty List<Integer> ids) {
dictionaryService.removeBatchByIds(ids);
return ApiResult.success();
}
/**
* 搜索字典值
*
* @param request 请求参数
* @return 字典列表
*/
@PostMapping("searchDictionaryItem")
public ApiResult<PageData<DictionaryItemVO>> searchDictionaryItem(@RequestBody DictionaryItemSearchRequest request) {
IPage<DictionaryItemVO> 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<Void> saveDictionaryItem(@Valid @RequestBody SaveDictionaryItemRequest request) {
dictionaryItemService.save(request);
return ApiResult.success();
}
/**
* 删除字典值
*
* @param ids id列表
*/
@PostMapping("deleteDictionaryItem")
public ApiResult<Void> deleteDictionaryItem(@Valid @RequestBody @NotEmpty List<Integer> ids) {
dictionaryItemService.removeBatchByIds(ids);
return ApiResult.success();
}
/**
* 获取字典值翻译列表
*
* @param id 字典值id
* @return 字典值翻译列表
*/
@GetMapping("getDictionaryItemTranslateList")
public ApiResult<List<DictionaryItemTranslateVO>> 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<Integer> dictionaryItemIds) throws IOException {
List<DictionaryItemTranslateDTO> datas = dictionaryItemTranslateService.getAllLanguageByDictionaryItemIds(dictionaryItemIds);
EecExcelUtil.export("字典翻译", "sheet1", datas, response);
}
/**
* 导入字典值翻译列表
*
* @param file 文件
*/
@PostMapping("importDictionaryItemTranslates")
public ApiResult<Void> importDictionaryItemTranslates(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return ApiResult.error("请选择一个文件上传!");
}
try {
List<DictionaryItemTranslateDTO> datas = EecExcelUtil.readTo(file.getInputStream(), DictionaryItemTranslateDTO.class);
List<Language> languages = languageService.getLanguages();
List<DictionaryItemTranslate> forAdd = new ArrayList<>();
List<DictionaryItemTranslate> 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());
}
}
}

View File

@ -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<PageData<DictionaryVO>> search(@RequestBody DictionarySearchRequest request){
IPage<DictionaryVO> page=new Page<>();
page.setCurrent(request.getPageNum());
page.setSize(request.getPageSize());
dictionaryService.search(request,page);
PageData<DictionaryVO> pageData=new PageData<>();
pageData.setPage(page.getCurrent());
pageData.setPageSize(page.getSize());
pageData.setTotal(page.getTotal());
pageData.setItems(page.getRecords());
return ApiResult.success(pageData);
}
}

View File

@ -9,7 +9,8 @@ import org.springframework.data.mongodb.repository.config.EnableMongoRepositorie
@SpringBootApplication
@MapperScan("com.nflg.mobilebroken.repository.mapper")
@ComponentScan(basePackages = {"com.nflg.mobilebroken"})
@ComponentScan(basePackages = {"com.nflg.mobilebroken.repository.service","com.nflg.mobilebroken.cfs.controller"
,"com.nflg.mobilebroken.starter"})
@EnableMongoRepositories(basePackages = "com.nflg.mobilebroken.repository.service")
@EnableDiscoveryClient
public class CfsApplication {

View File

@ -40,7 +40,7 @@ public class MessageController {
* @param request 请求参数
* @return 分页的消息列表
*/
@GetMapping("searchMessages")
@PostMapping("searchMessages")
public ApiResult<PageData<MessageVO>> searchMessages(@RequestBody MessageSearchRequest request){
IPage<MessageVO> page=new Page<>();
page.setCurrent(request.getPageNum());

View File

@ -92,7 +92,7 @@ public class TiketController {
* @param request 搜索条件
* @return 工单列表
**/
@GetMapping("searchTickets")
@PostMapping("searchTickets")
public ApiResult<PageData<TicketVO>> searchTickets(@Valid @RequestBody TicketSearchRequest request){
IPage<TicketVO> page=new Page<>();
page.setCurrent(request.getPageNum());

View File

@ -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)

View File

@ -40,7 +40,15 @@
<dependency>
<groupId>org.ttzero</groupId>
<artifactId>eec</artifactId>
<version>0.4.14</version>
<version>0.5.21</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
</dependencies>

View File

@ -1,11 +1,10 @@
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 com.nflg.mobilebroken.common.pojo.query.PageBaseQuery;
import lombok.Data;
import javax.validation.Valid;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@ -41,6 +40,19 @@ public class ApiResult<T> implements Serializable {
return vo;
}
public static <T> ApiResult<PageData<T>> success(IPage<T> page) {
ApiResult<PageData<T>> vo = new ApiResult<>();
PageData<T> 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 <T> ApiResult<T> error(int state,String msg,T value) {
ApiResult<T> vo = new ApiResult<>();
@ -68,8 +80,11 @@ public class ApiResult<T> implements Serializable {
return vo;
}
public static <T> ApiResult<T> success() {
return ApiResult.success(null);
public static ApiResult<Void> success() {
ApiResult<Void> vo = new ApiResult<>();
vo.code = STATE.Success.getState();
vo.type = STATE.Success.getType();
return vo;
}
public static <T> ApiResult<T> error(STATE code, String msg) {
return error(code.getState(),code.getType(), msg);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<TranslateMap> languages;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<ListSheet> sheets, HttpServletResponse response) throws IOException {
@ -45,6 +44,26 @@ public class EecExcelUtil {
workbook.writeTo(response.getOutputStream());
}
public static <T> void export(String fileName, String sheetName, List<T> sheets, HttpServletResponse response) throws IOException {
setResponseExcelHeader(response, fileName);
new Workbook()
.setAutoSize(true)
.addSheet(new ListSheet<>(sheetName, sheets))
.writeTo(response.getOutputStream());
}
public static <T> List<T> readTo(InputStream stream, Class<T> 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
*

View File

@ -11,7 +11,7 @@ public class TokenUtil {
public static Integer getUserId(){
try {
//TODO 待实现
return 111;
return 1;
//return StpUtil.getLoginIdAsInt();
}catch (Exception ex){
throw new NflgException(STATE.LoginError,"请登录");
@ -28,11 +28,18 @@ public class TokenUtil {
}
}
public static String getUserNo(){
return "test";
public static String getUserName() {
try {
//TODO 待实现
return "admin";
//return StpUtil.getLoginIdAsInt();
} catch (Exception ex) {
throw new NflgException(STATE.LoginError, "请登录");
}
}
public static String getUserName(){
return "test";
public static String getUserNo(){
return "admin";
}
}

View File

@ -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;
/**
* <p>
@ -13,4 +15,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface DictionaryItemMapper extends BaseMapper<DictionaryItem> {
@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);
}

View File

@ -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;
/**
* <p>
@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface DictionaryItemTranslateMapper extends BaseMapper<DictionaryItemTranslate> {
List<DictionaryItemTranslateVO> getListByDictionaryItemId(Integer id);
}

View File

@ -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;
/**
* <p>
@ -13,4 +16,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IDictionaryItemService extends IService<DictionaryItem> {
void search(DictionaryItemSearchRequest request, IPage page);
void save(SaveDictionaryItemRequest request);
Integer getId(String dictionaryName, String dictionaryItemName);
}

View File

@ -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;
/**
* <p>
@ -13,4 +20,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IDictionaryItemTranslateService extends IService<DictionaryItemTranslate> {
List<DictionaryItemTranslateVO> getListByDictionaryItemId(@Valid @NotNull Integer id);
List<DictionaryItemTranslateDTO> getAllLanguageByDictionaryItemIds(@NotEmpty List<Integer> dictionaryItemIds);
Integer getId(Integer dictionaryItemId, String code);
}

View File

@ -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;
/**
* <p>
@ -17,4 +18,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
public interface IDictionaryService extends IService<Dictionary> {
void search(DictionarySearchRequest request, IPage<DictionaryVO> page);
void save(SaveDictionaryRequest request);
}

View File

@ -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;
/**
* <p>
@ -17,4 +35,83 @@ import org.springframework.stereotype.Service;
@Service
public class DictionaryItemServiceImpl extends ServiceImpl<DictionaryItemMapper, DictionaryItem> implements IDictionaryItemService {
@Resource
private IDictionaryItemTranslateService dictionaryItemTranslateService;
@Override
public void search(DictionaryItemSearchRequest request, IPage page) {
LambdaQueryWrapper<DictionaryItem> 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<DictionaryItemTranslate>()
.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<DictionaryItemTranslate>()
.eq(DictionaryItemTranslate::getDictionaryItemId, id));
List<DictionaryItemTranslate> forAdd = new ArrayList<>();
List<DictionaryItemTranslate> 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);
}
}

View File

@ -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;
/**
* <p>
* 字典值翻译 服务实现类
@ -17,4 +33,51 @@ import org.springframework.stereotype.Service;
@Service
public class DictionaryItemTranslateServiceImpl extends ServiceImpl<DictionaryItemTranslateMapper, DictionaryItemTranslate> implements IDictionaryItemTranslateService {
@Resource
private ILanguageService languageService;
@Resource
private IDictionaryItemService dictionaryItemService;
@Resource
private IDictionaryService dictionaryService;
@Override
public List<DictionaryItemTranslateVO> getListByDictionaryItemId(Integer id) {
return baseMapper.getListByDictionaryItemId(id);
}
@Override
public List<DictionaryItemTranslateDTO> getAllLanguageByDictionaryItemIds(List<Integer> dictionaryItemIds) {
List<DictionaryItem> 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<DictionaryItemTranslate> dictionaryItemTranslates = lambdaQuery().in(DictionaryItemTranslate::getDictionaryItemId, dictionaryItemIds).list();
List<Language> languages = languageService.getLanguages();
List<DictionaryItemTranslateDTO> 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();
}
}

View File

@ -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;
/**
* <p>
* 字典 服务实现类
@ -33,4 +38,24 @@ public class DictionaryServiceImpl extends ServiceImpl<DictionaryMapper, Diction
queryWrapper.orderByDesc(Dictionary::getId);
baseMapper.selectPage(page,queryWrapper);
}
@Override
public void save(SaveDictionaryRequest request) {
if (Objects.isNull(request.getId())) {
Dictionary dictionary = new Dictionary()
.setName(request.getName())
.setCode(request.getCode())
.setCreateBy(TokenUtil.getUserName())
.setCreateTime(LocalDateTime.now());
save(dictionary);
} else {
Dictionary dictionary = new Dictionary()
.setId(request.getId())
.setName(request.getName())
.setCode(request.getCode())
.setUpdateBy(TokenUtil.getUserName())
.setUpdateTime(LocalDateTime.now());
updateById(dictionary);
}
}
}

View File

@ -2,4 +2,11 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.mobilebroken.repository.mapper.DictionaryItemTranslateMapper">
<select id="getListByDictionaryItemId"
resultType="com.nflg.mobilebroken.common.pojo.vo.DictionaryItemTranslateVO">
SELECT t.id,l.`code`,l.`name`,t.`value`
FROM dictionary_item_translate t
LEFT JOIN language l ON t.language_code=l.`code`
WHERE t.dictionary_item_id=#{id}
</select>
</mapper>