Commit 5f308eb9 by henry

添加视图设计

1 parent 86b8f070
package org.arch.overall.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.arch.Result;
import org.arch.common.modules.archoverall.dto.BatchRemoveDTO;
import org.arch.log.annotation.OperLog;
import org.arch.log.entity.DescContent;
import org.arch.log.logenum.LogOperTypeEnum;
import org.arch.log.logenum.LogTypeEnum;
import org.arch.overall.dto.ArchiViewDTO;
import org.arch.overall.entity.ArchiView;
import org.arch.overall.service.ArchiViewService;
import org.springframework.validation.annotation.Validated;
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;
/**
* 架构视图
*
* @author lizhen
* @date 2024/05/22
*/
@Api(value = "/archi-vw", tags = {"架构视图"})
@RestController
@RequestMapping("archi-vw")
@RequiredArgsConstructor
public class ArchiViewController {
private final ArchiViewService archiViewService;
@PostMapping(value = "/")
@ApiOperation(DescContent.QUERY_LIST_VIEWS)
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, moduleName = "架构视图设计", operDes = "架构视图设计查询")
public Result gtArchiView(@RequestBody ArchiViewDTO dto) {
return Result.success(archiViewService.gtArchiView(dto, PageDTO.of(dto.getCurrent(), dto.getPageSize())));
}
@PostMapping("/ad-archi-vw")
@ApiOperation(value = "新增架构视图")
@OperLog(value = LogOperTypeEnum.ADD, logTypeValue = LogTypeEnum.BUSI_LOG,moduleName = "架构视图设计", operDes = "新增架构视图")
public Result adArchiView(@RequestBody ArchiView vwDiss) {
return Result.success(archiViewService.insert(vwDiss));
}
@PostMapping(value = "/upd-archi-vw")
@ApiOperation(value = "修改视图配置")
@OperLog(value = LogOperTypeEnum.UPDATE, logTypeValue = LogTypeEnum.BUSI_LOG,moduleName = "架构视图设计", operDes = "修改视图配置")
public Result updArchiView(@RequestBody ArchiView vwDiss) {
return Result.success(archiViewService.update(vwDiss));
}
@PostMapping(value = "/del-vw")
@ApiOperation("根据Id删除视图")
@OperLog(value = LogOperTypeEnum.DELETE, logTypeValue = LogTypeEnum.BUSI_LOG,moduleName = "架构视图设计", operDes = "根据Id删除视图")
public Result delArchiView(@RequestBody ArchiView vwDis) {
return archiViewService.delArchiView(vwDis) ? Result.success("删除成功") : Result.error("删除失败");
}
@PostMapping(value = "/batchupd-vw")
@ApiOperation(value = "批量发布版本", notes = "批量发布版本")
@OperLog(value = LogOperTypeEnum.OTHER, logTypeValue = LogTypeEnum.BUSI_LOG,moduleName = "架构视图设计", operDes = "架构视图设计批量发布")
public Result updateVwDisBatch(@RequestBody @Validated BatchRemoveDTO requestMap) {
return Result.success(archiViewService.updEleBatch(requestMap));
}
}
package org.arch.overall.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.arch.common.modules.archoverall.dto.BasePageEntity;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(value = "视图配置查询的传输对象", description = "视图配置查询的传输对象")
public class ArchiViewDTO extends BasePageEntity {
@ApiModelProperty(value = "总条数")
private Integer total;
@ApiModelProperty(value = "主键")
@TableId(value = "view_id", type = IdType.AUTO)
private Long viewId;
@ApiModelProperty(value = "架构视图名称")
private String viewName;
@ApiModelProperty(value = "架构层次")
private Long archiLevelId;
@ApiModelProperty(value = "架构归属")
private Long archiBelongId;
@ApiModelProperty(value = "状态 0:已停用 1:已发布 2:暂存")
private Integer state;
@ApiModelProperty(value = "架构阶段(1:总体架构;2:系统架构 3:概设架构 4:其他架构)")
private Integer archiStage;
@ApiModelProperty(value = "适用范围(1:总体架构 2:系统架构 3:总体及系统架构)")
private Integer scope;
@ApiModelProperty(value = "适用范围集合")
@TableField(exist = false)
private List<Long> scopeList;
}
package org.arch.overall.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.arch.common.BaseEntity;
import java.util.List;
/**
* <p>
* 架构视图配置
* </p>
*
* @author lizhen
* @since 2023-12-06
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("archi_view")
@ApiModel(value = "ArchiView", description = "架构视图配置")
public class ArchiView extends BaseEntity {
@ApiModelProperty(value = "主键")
@TableId(value = "view_id", type = IdType.AUTO)
private Long viewId;
@ApiModelProperty(value = "编码")
private String viewCode;
@ApiModelProperty(value = "架构视图名称")
private String viewName;
@ApiModelProperty(value = "架构层次")
private Long archiLevelId;
@ApiModelProperty(value = "架构归属")
private Long archiBelongId;
@ApiModelProperty(value = "架构视图模板 ID")
private Integer viewTemplateId;
@ApiModelProperty(value = "版本信息")
private String version;
@ApiModelProperty(value = "状态 0:已停用 1:已发布 2:暂存")
private Integer state;
@ApiModelProperty(value = "描述")
private String content;
@ApiModelProperty(value = "架构阶段(1:总体架构;2:系统架构)")
private Integer archiStage;
@ApiModelProperty(value = "适用范围(1:总体架构 2:系统架构 3:总体及系统架构)")
private Integer scope;
//-------------------------------- 以下为非数据库字段 --------------------------------
@ApiModelProperty(value = "架构视图 ID")
@TableField(exist = false)
private Long archiViewId;
@ApiModelProperty(value = "架构元素 ID")
@TableField(exist = false)
private String archiEleId;
@ApiModelProperty(value = "架构元素名称")
@TableField(exist = false)
private String eleName;
@ApiModelProperty(value = "架构元素关系 ID")
@TableField(exist = false)
private String archiEleRelId;
@ApiModelProperty(value = "架构元素关系名称")
@TableField(exist = false)
private String relName;
@ApiModelProperty(value = "1:元素范围 2:包含元素")
@TableField(exist = false)
private Long type;
@ApiModelProperty(value = "适用范围集合")
@TableField(exist = false)
private List<Long> scopeList;
}
package org.arch.overall.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -24,6 +25,7 @@ public class ArchiViewEle {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "架构视图 ID")
@TableId
private Long archiViewId;
@ApiModelProperty(value = "架构元素 ID")
......
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.arch.overall.entity.ArchiView;
import java.util.List;
public interface ArchiViewMapper extends BaseMapper<ArchiView> {
@Select("select (SELECT CONCAT((SELECT REPLACE((select date_format(now(), '%Y-%m-%d')),CHAR(45),'')),'-V',(SELECT (select date_format(now(), '%Y')) - 2023 +1),'.',(select date_format(now(), '%m')),'.','1')) as version")
List<ArchiView> selectVer();
List<ArchiView> maxVer(ArchiView vwDiss);
/**
* 获取版本
*
* @param id id
* @return {@link List }<{@link ArchiElement }>
*/
String getVersion(@Param("id") Long id);
}
package org.arch.overall.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.overall.entity.ArchiView;
import org.arch.overall.entity.ArchiViewEle;
import org.jetbrains.annotations.NotNull;
import org.springframework.transaction.annotation.Transactional;
public interface ArchiViewEleService extends IService<ArchiViewEle> {
@Transactional(rollbackFor = Exception.class)
default Boolean createArchiViewEle(@NotNull ArchiView params) {
ArchiViewEle archiViewEles = new ArchiViewEle();
archiViewEles.setArchiViewId(params.getViewId());
archiViewEles.setArchiEleId(params.getArchiEleId());
archiViewEles.setEleName(params.getEleName());
archiViewEles.setArchiEleRelId(params.getArchiEleRelId());
archiViewEles.setRelName(params.getRelName());
archiViewEles.setType(params.getType());
return save(archiViewEles);
}
}
package org.arch.overall.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.overall.dto.ArchiViewDTO;
import org.arch.common.modules.archoverall.dto.BatchRemoveDTO;
import org.arch.overall.entity.ArchiView;
public interface ArchiViewService extends IService<ArchiView> {
IPage<ArchiView> gtArchiView(ArchiViewDTO dto, Page<ArchiView> page);
Boolean insert(ArchiView vwDiss);
Boolean update(ArchiView vwDiss);
Boolean updEleBatch(BatchRemoveDTO requestMap);
Boolean delArchiView(ArchiView vwDis);
}
package org.arch.overall.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.arch.overall.entity.ArchiViewEle;
import org.arch.overall.mapper.ArchiViewEleMapper;
import org.arch.overall.service.ArchiViewEleService;
import org.springframework.stereotype.Service;
@Service
public class ArchiViewEleImpl extends ServiceImpl<ArchiViewEleMapper, ArchiViewEle> implements ArchiViewEleService {
}
package org.arch.overall.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.arch.common.modules.archoverall.dto.BatchRemoveDTO;
import org.arch.overall.dto.ArchiViewDTO;
import org.arch.enums.ArchiStateEnum;
import org.arch.overall.entity.ArchiView;
import org.arch.overall.entity.ArchiViewEle;
import org.arch.overall.mapper.ArchiViewEleMapper;
import org.arch.overall.mapper.ArchiViewMapper;
import org.arch.overall.service.ArchiViewEleService;
import org.arch.overall.service.ArchiViewService;
import org.arch.utils.VersionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
public class ArchiViewImpl extends ServiceImpl<ArchiViewMapper, ArchiView> implements ArchiViewService {
@Resource
private ArchiViewMapper archiViewMapper;
@Resource
private ArchiViewEleMapper archiViewEleMapper;
@Autowired
private ArchiViewService archiViewService;
@Autowired
private ArchiViewEleService archiViewEleService;
@Override
public IPage<ArchiView> gtArchiView(ArchiViewDTO dto, Page<ArchiView> page) {
LambdaQueryWrapper<ArchiView> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(!StrUtil.isBlank(dto.getViewName()), ArchiView::getViewName, dto.getViewName())
.eq(dto.getArchiBelongId() != null, ArchiView::getArchiBelongId, dto.getArchiBelongId())
.eq(dto.getArchiLevelId() != null, ArchiView::getArchiLevelId, dto.getArchiLevelId())
.eq(dto.getState() != null, ArchiView::getState, dto.getState())
.eq(Objects.nonNull(dto.getArchiStage()), ArchiView::getArchiStage, dto.getArchiStage());
IPage<ArchiView> viewPage = archiViewMapper.selectPage(page, queryWrapper);
if (!CollectionUtils.isEmpty(viewPage.getRecords())) {
List<Long> viewIdList = viewPage.getRecords().stream().map(ArchiView::getViewId).collect(Collectors.toList());
List<ArchiViewEle> viewEles = archiViewEleMapper.selectList(new QueryWrapper<ArchiViewEle>().lambda().in(ArchiViewEle::getArchiViewId, viewIdList));
Map<Long, ArchiViewEle> viewEleByViewIdMap = viewEles.stream().collect(Collectors.toMap(ArchiViewEle::getArchiViewId, Function.identity()));
viewPage.getRecords().forEach(view -> {
ArchiViewEle viewEle = viewEleByViewIdMap.get(view.getViewId());
if (viewEle != null) {
view.setEleName(viewEle.getEleName());
view.setRelName(viewEle.getRelName());
view.setArchiEleId(viewEle.getArchiEleId());
view.setArchiEleRelId(viewEle.getArchiEleRelId());
}
});
}
return viewPage;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insert(ArchiView params) {
int state = ArchiStateEnum.PUBLISHED.getCode();
params.setViewCode(IdUtil.fastSimpleUUID());
params.setDelFlag(0);
params.insert();
if (params.getState() == state) {
params.setVersion(VersionUtil.getNextVersion(archiViewMapper.getVersion(params.getViewId())));
params.setState(state);
}
params.updateById();
return archiViewEleService.createArchiViewEle(params);
}
@Override
public Boolean update(ArchiView vwDiss) {
Integer state = vwDiss.getState();
Date time = Calendar.getInstance().getTime();
if (vwDiss.getViewId() == null) {
throw new IllegalArgumentException("修改视图主键不能为空!");
}
// 发布生成新版本,须传元素名称
LambdaQueryWrapper<ArchiView> queryWrapper = Wrappers.lambdaQuery(ArchiView.class)
.select()
.eq(StringUtils.isNotBlank(vwDiss.getViewName()), ArchiView::getViewName, vwDiss.getViewName())
.eq(Objects.nonNull(vwDiss.getViewId()), ArchiView::getViewId, vwDiss.getViewId());
List<ArchiView> lists = baseMapper.selectList(queryWrapper);
if (state == 1 && !lists.isEmpty() && lists.get(0).getVersion() == null) {
List<ArchiView> list = archiViewMapper.selectVer();
for (ArchiView view : list) {
if (view.getVersion() != null) {
vwDiss.setVersion(view.getVersion());
break;
}
}
} else if (state == 1 && !lists.isEmpty() && lists.get(0).getVersion() != null) {
LambdaQueryWrapper<ArchiView> wrapper = Wrappers.lambdaQuery(ArchiView.class)
.select()
.eq(StrUtil.isNotBlank(vwDiss.getViewName()), ArchiView::getViewName, vwDiss.getViewName())
.eq(Objects.nonNull(vwDiss.getArchiBelongId()), ArchiView::getArchiBelongId, vwDiss.getArchiBelongId())
.eq(Objects.nonNull(vwDiss.getArchiStage()), ArchiView::getArchiStage, vwDiss.getArchiStage())
.eq(Objects.nonNull(vwDiss.getArchiLevelId()), ArchiView::getArchiLevelId, vwDiss.getArchiLevelId())
.ne(Objects.nonNull(vwDiss.getViewId()), ArchiView::getViewId, vwDiss.getViewId());
List<ArchiView> viewList = baseMapper.selectList(wrapper);
if (!CollectionUtils.isEmpty(viewList)) {
viewList.forEach(e -> {
e.setState(0);
baseMapper.updateById(e);
});
}
List<ArchiView> maxVer = archiViewMapper.maxVer(vwDiss);
if (!CollectionUtils.isEmpty(maxVer)) {
String lastMaxVer = maxVer.get(0).getVersion();
String ver = VersionUtil.getNextVersion(lastMaxVer);
vwDiss.setVersion(ver);
}
}
vwDiss.setLastUpdateTime(time);
vwDiss.setCreateTime(null);
archiViewService.updateById(vwDiss);
ArchiViewEle archiViewEles = new ArchiViewEle();
LambdaQueryWrapper<ArchiViewEle> querywarpper = new LambdaQueryWrapper();
querywarpper.eq(ArchiViewEle::getArchiViewId, vwDiss.getViewId());
List<ArchiViewEle> list = archiViewEleService.list(querywarpper);
if (list.size() > 0) {
LambdaUpdateWrapper<ArchiViewEle> wrapper = new LambdaUpdateWrapper();
wrapper.eq(ArchiViewEle::getArchiViewId, vwDiss.getViewId());
wrapper.set(ArchiViewEle::getEleName, vwDiss.getEleName());
wrapper.set(ArchiViewEle::getArchiEleId, vwDiss.getArchiEleId());
wrapper.set(ArchiViewEle::getArchiEleRelId, vwDiss.getArchiEleRelId());
wrapper.set(ArchiViewEle::getRelName, vwDiss.getRelName());
wrapper.set(ArchiViewEle::getType, vwDiss.getType());
archiViewEleService.update(wrapper);
} else {
archiViewEles.setArchiViewId(vwDiss.getViewId());
archiViewEles.setArchiEleId(vwDiss.getArchiEleId());
archiViewEles.setEleName(vwDiss.getEleName());
archiViewEles.setArchiEleRelId(vwDiss.getArchiEleRelId());
archiViewEles.setRelName(vwDiss.getRelName());
archiViewEles.setType(vwDiss.getType());
archiViewEleService.save(archiViewEles);
}
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updEleBatch(BatchRemoveDTO requestMap) {
requestMap.getIds().forEach(id -> {
ArchiView archiView = archiViewMapper.selectById(id);
Assert.notNull(archiView, "未找到对应视图");
Assert.isFalse(1 == archiView.getState(), "当前状态下不可发布");
archiView.setVersion(VersionUtil.getNextVersion(archiViewMapper.getVersion(id)));
archiView.setState(ArchiStateEnum.PUBLISHED.getCode());
archiView.updateById();
});
return Boolean.TRUE;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean delArchiView(ArchiView vwDis) {
ArchiView view = archiViewService.getById(vwDis.getViewId());
Assert.notNull(view, "未找到对应视图");
Assert.isFalse(ArchiStateEnum.PUBLISHED.getCode() == view.getState(),
"已发布的视图不可删除");
return removeById(vwDis.getViewId());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.arch.overall.mapper.ArchiViewMapper">
<select id="maxVer" resultType="org.arch.overall.entity.ArchiView">
SELECT a.version
FROM archi_view a
<where>
<if test="viewName != null and viewName != ''">
and a.view_name = #{viewName}
</if>
<if test="archiBelongId != null ">
and a.archi_belong_id = #{archiBelongId}
</if>
<if test="archiStage != null ">
and a.archi_stage = #{archiStage}
</if>
<if test="archiLevelId != null ">
and a.archi_level_id = #{archiLevelId}
</if>
and a.del_flag = 0
</where>
ORDER BY CAST(SUBSTRING_INDEX(version, '.', -1) AS DECIMAL) DESC
LIMIT 1
</select>
<!--获取最新版本-->
<select id="getVersion" resultType="java.lang.String">
set @i := (<include refid="org.arch.overall.mapper.VersionInitMapper.versionInit"/>);
select ifnull(version, @i) from archi_view where view_id = #{id} for update
</select>
</mapper>
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!