package com.xjrsoft.module.app.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.TypeReference; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSON; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xjrsoft.common.constant.GlobalConstant; import com.xjrsoft.common.enums.YesOrNoEnum; import com.xjrsoft.common.exception.MyException; import com.xjrsoft.common.utils.RedisUtil; import com.xjrsoft.config.GeneratePathConfig; import com.xjrsoft.module.app.dto.AddAppPageDesignDto; import com.xjrsoft.module.app.dto.UpdateAppPageDesignDto; import com.xjrsoft.module.app.entity.AppMenu; import com.xjrsoft.module.app.entity.AppPageDesign; import com.xjrsoft.module.app.mapper.AppMenuMapper; import com.xjrsoft.module.app.mapper.AppPageDesignMapper; import com.xjrsoft.module.app.service.IAppPageDesignService; import com.xjrsoft.module.generator.utils.GeneratorUtil; import com.xjrsoft.module.system.entity.DictionaryDetail; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.File; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; /** *

* xjr_data_display【数据展示表】 服务实现类 *

* * @author hnyyzy * @since 2023-06-25 */ @Service @AllArgsConstructor public class AppPageDesignServiceImpl extends ServiceImpl implements IAppPageDesignService { private final AppMenuMapper appMenuMapper; private final GeneratePathConfig generatePathConfig; private final RedisUtil redisUtil; @Override @Transactional(rollbackFor = Exception.class) @SneakyThrows public Boolean add(AddAppPageDesignDto dto) { long count = count(Wrappers.query().lambda().eq(AppPageDesign::getName, dto.getName())); if (count > 0) { throw new MyException("此数据展示页已经存在!"); } AppPageDesign appPageDesign = BeanUtil.toBean(dto, AppPageDesign.class); List detailList = redisUtil.get(GlobalConstant.DIC_DETAIL_CACHE_KEY, new TypeReference>() { }); if (dto.getIsMenu() == YesOrNoEnum.YES.getCode()) { Optional first = detailList.stream().filter(x -> x.getId().equals(dto.getCategoryId())).findFirst(); if (!first.isPresent()) { throw new MyException("找不到当前功能类别信息!"); } AppMenu appMenu = new AppMenu(); appMenu.setCode(dto.getCode()); appMenu.setName(dto.getName()); appMenu.setIcon(dto.getIcon()); appMenu.setCategoryId(dto.getCategoryId()); appMenu.setRemark(dto.getRemark()); appMenu.setUrl(StringPool.SLASH+"pages"+StringPool.SLASH +first.get().getValue().toLowerCase() + StringPool.SLASH + dto.getCode().toLowerCase()); appMenuMapper.insert(appMenu); appPageDesign.setAppMenuId(appMenu.getId()); save(appPageDesign); //保存成功之后 生成代码 GeneratorUtil.writeFile(getPageOutputDir(first.get().getValue()), dto.getCode().toLowerCase() + StringPool.DOT + "vue", dto.getPageCode()); File tempFile = FileUtil.file(generatePathConfig.getAppPath() + StringPool.SLASH + "pages.json"); JSON jsonContent = JSONUtil.readJSON(tempFile, StandardCharsets.UTF_8); Map pageJsonMap = new HashMap<>(); pageJsonMap.put("path", "pages/" + first.get().getValue().toLowerCase() + StringPool.SLASH + dto.getCode().toLowerCase()); Map styleMap = new HashMap<>(); styleMap.put("navigationBarTitleText", dto.getName()); pageJsonMap.put("style", styleMap); JSONArray pages = JSONUtil.parseArray(jsonContent.getByPath("pages").toString()); pages.add(pageJsonMap); jsonContent.putByPath("pages", pages); FileUtil.writeString(jsonContent.toJSONString(4), tempFile, StandardCharsets.UTF_8); } else { save(appPageDesign); return Boolean.TRUE; } return Boolean.TRUE; } @Override @Transactional(rollbackFor = Exception.class) @SneakyThrows public Boolean modify(UpdateAppPageDesignDto dto) { AppPageDesign appPageDesign = BeanUtil.toBean(dto, AppPageDesign.class); if (dto.getIsMenu() == YesOrNoEnum.YES.getCode()) { List detailList = redisUtil.get(GlobalConstant.DIC_DETAIL_CACHE_KEY, new TypeReference>() { }); Optional first = detailList.stream().filter(x -> x.getId().equals(dto.getCategoryId())).findFirst(); if (!first.isPresent()) { throw new MyException("找不到当前功能类别信息!"); } GeneratorUtil.writeFile(getPageOutputDir(first.get().getValue().toLowerCase()), dto.getCode().toLowerCase() + StringPool.DOT + "vue", dto.getPageCode()); AppMenu appMenu = new AppMenu(); appMenu.setCode(dto.getCode()); appMenu.setName(dto.getName()); appMenu.setIcon(dto.getIcon()); appMenu.setCategoryId(dto.getCategoryId()); appMenu.setUrl(StringPool.SLASH+"pages"+StringPool.SLASH +first.get().getValue().toLowerCase() + StringPool.SLASH + dto.getCode().toLowerCase()); appMenu.setRemark(dto.getRemark()); //如果发布菜单 menuid 不为空 则需要修改 if (ObjectUtil.isNotNull(dto.getAppMenuId())) { appMenu.setId(dto.getAppMenuId()); appMenuMapper.updateById(appMenu); } else { appMenuMapper.insert(appMenu); } // //保存成功之后 生成代码 // GeneratorUtil.writeFile(getPageOutputDir(first.get().getValue()), dto.getCode().toLowerCase() + StringPool.DOT + "vue", dto.getPageCode()); File tempFile = FileUtil.file(generatePathConfig.getAppPath() + StringPool.SLASH + "pages.json"); JSON jsonContent = JSONUtil.readJSON(tempFile, StandardCharsets.UTF_8); //判断page.json里面是否有对应的路径,没有就进行生成 String path = "pages/" + first.get().getValue().toLowerCase() + StringPool.SLASH + dto.getCode().toLowerCase(); if (((JSONObject) jsonContent).get("pages").toString().contains(path)){ JSONArray pages = JSONUtil.parseArray(jsonContent.getByPath("pages").toString()); for (Object page : pages) { if (page.toString().contains(path) && !page.toString().contains(dto.getName())){//找到这个path路径的值,再判断页面名称是否改变,改变则先移除,再新增 pages.remove(page); Map pageJsonMap = new HashMap<>(); pageJsonMap.put("path", path); Map styleMap = new HashMap<>(); styleMap.put("navigationBarTitleText", dto.getName()); pageJsonMap.put("style", styleMap); pages.add(pageJsonMap); jsonContent.putByPath("pages", pages); FileUtil.writeString(jsonContent.toJSONString(4), tempFile, StandardCharsets.UTF_8); } } }else { Map pageJsonMap = new HashMap<>(); pageJsonMap.put("path", path); Map styleMap = new HashMap<>(); styleMap.put("navigationBarTitleText", dto.getName()); pageJsonMap.put("style", styleMap); JSONArray pages = JSONUtil.parseArray(jsonContent.getByPath("pages").toString()); pages.add(pageJsonMap); jsonContent.putByPath("pages", pages); FileUtil.writeString(jsonContent.toJSONString(4), tempFile, StandardCharsets.UTF_8); } appPageDesign.setAppMenuId(appMenu.getId()); } else { //如果不发布菜单 并且 appmenuId又在 需要删除菜单 if (ObjectUtil.isNotNull(dto.getAppMenuId())) { appMenuMapper.deleteById(dto.getAppMenuId()); } } updateById(appPageDesign); return Boolean.TRUE; } /** * 获取实体类生成目录 * * @param outputArea * @return */ private String getPageOutputDir(String outputArea) { return generatePathConfig.getAppPath() + StringPool.SLASH + "pages" + StringPool.SLASH + outputArea.toLowerCase(); } }