fix(quotation): 修复机型配置模块的数据处理问题

- 将AdminMenuButtonVO中的id字段从Integer改为Long类型
- 修复ModelConfigController中排序逻辑,使用getItemId替代getId进行排序
- 在配置复制时清理children数据并移除无用节点
- 添加配置状态重置逻辑,将configStatus设为0,清空年份和版本信息
- 修复ID重新分配逻辑,确保父子关系正确映射
- 添加重复名称验证防止部件或系统名称冲突
- 优化删除逻辑,支持级联删除子项目
- 修复启用禁用功能,添加父级状态检查
- 在发布配置时自动生成年份信息
- 添加itemId字段到ModelConfigItemUpdateRequest请求类
- 为ModelConfigVO添加key字段用于标识
- 修复查询排序,按更新时间、创建时间降序排列
- 统一菜单按钮相关接口的menuId参数类型为Long
This commit is contained in:
曹鹏飞 2026-02-26 11:46:57 +08:00
parent 85987c0b01
commit 0975b122b9
6 changed files with 165 additions and 70 deletions

View File

@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode;
public class SearchMenuButtonRequest extends PageRequest {
// 菜单id
private Integer menuId;
private Long menuId;
// 菜单按钮名称
private String name;

View File

@ -7,7 +7,7 @@ import java.time.LocalDateTime;
@Data
public class AdminMenuButtonVO {
private Integer id;
private Long id;
// 按钮名称
private String name;

View File

@ -1,5 +1,6 @@
package com.nflg.mobilebroken.common.pojo.vo;
import cn.hutool.core.util.IdUtil;
import lombok.Data;
import java.time.LocalDateTime;
@ -7,6 +8,8 @@ import java.time.LocalDateTime;
@Data
public class ModelConfigVO {
private String key= IdUtil.getSnowflakeNextIdStr();
private Long id;
/**

View File

@ -77,20 +77,15 @@ public class ModelConfigController extends ControllerBase {
return ApiResult.success(Collections.emptyList());
}
vos.stream().filter(vo -> vo.getItemParentId() == 0L)
.sorted(Comparator.comparing(ModelConfigItemLanguageVO::getId))
.forEach(vo -> vo.setChildren(vos.stream()
.filter(i -> i.getItemParentId().equals(vo.getId()))
.map(i -> new ModelConfigItemLanguageVO()
.setId(i.getId())
.setPartName(i.getPartName())
.setPartRemark(i.getPartRemark())
.setImageUrl(i.getImageUrl())
.setEnable(i.getEnable())
.setType(i.getType())
.setOptionalType(i.getOptionalType())
).sorted(Comparator.comparing(ModelConfigItemLanguageVO::getId))
.collect(Collectors.toList())
));
.sorted(Comparator.comparing(ModelConfigItemLanguageVO::getItemId))
.forEach(vo ->
vo.setChildren(vos.stream()
.filter(i -> i.getItemParentId().equals(vo.getItemId()))
.sorted(Comparator.comparing(ModelConfigItemLanguageVO::getItemId))
.collect(Collectors.toList())
)
);
vos.removeIf(it -> it.getItemParentId() != 0L);
return ApiResult.success(vos);
}
@ -112,6 +107,9 @@ public class ModelConfigController extends ControllerBase {
List<QuotationModelConfigItemLanguage> itemLanguages = modelConfigItemLanguageService.lambdaQuery()
.eq(QuotationModelConfigItemLanguage::getConfigId, request.getConfigId())
.list();
config.setConfigStatus(0);
config.setConfigYear(null);
config.setConfigVersion(null);
config.setId(IdUtil.getSnowflakeNextId());
request.setConfigId(config.getId());
config.setUpdateById(AdminUserUtil.getUserId());
@ -120,19 +118,26 @@ public class ModelConfigController extends ControllerBase {
modelConfigService.save(config);
if (CollectionUtil.isNotEmpty(items)) {
items.forEach(it -> {
it.setId(IdUtil.getSnowflakeNextId());
Long id = IdUtil.getSnowflakeNextId();
if (Objects.equals(request.getParentId(), it.getId())){
request.setParentId(id);
}
itemLanguages.stream()
.filter(i -> i.getConfigItemId().equals(it.getId()))
.forEach(i -> {
i.setId(IdUtil.getSnowflakeNextId());
i.setConfigId(config.getId());
i.setConfigItemId(id);
i.setUpdateById(AdminUserUtil.getUserId());
i.setUpdateBy(AdminUserUtil.getUserName());
i.setUpdateTime(LocalDateTime.now());
});
items.stream().filter(i -> i.getParentId().equals(it.getId()))
.forEach(i -> i.setParentId(id));
it.setId(id);
it.setConfigId(config.getId());
});
modelConfigItemService.saveBatch(items);
}
if (CollectionUtil.isNotEmpty(itemLanguages)) {
itemLanguages.forEach(it -> {
it.setId(IdUtil.getSnowflakeNextId());
it.setConfigId(config.getId());
it.setUpdateById(AdminUserUtil.getUserId());
it.setUpdateBy(AdminUserUtil.getUserName());
it.setUpdateTime(LocalDateTime.now());
});
modelConfigItemLanguageService.saveBatch(itemLanguages);
}
}
@ -208,6 +213,9 @@ public class ModelConfigController extends ControllerBase {
List<QuotationModelConfigItemLanguage> itemLanguages = modelConfigItemLanguageService.lambdaQuery()
.eq(QuotationModelConfigItemLanguage::getConfigId, languageItem.getConfigId())
.list();
config.setConfigStatus(0);
config.setConfigYear(null);
config.setConfigVersion(null);
config.setId(IdUtil.getSnowflakeNextId());
config.setUpdateById(AdminUserUtil.getUserId());
config.setUpdateBy(AdminUserUtil.getUserName());
@ -215,7 +223,32 @@ public class ModelConfigController extends ControllerBase {
modelConfigService.save(config);
if (CollectionUtil.isNotEmpty(items)) {
items.forEach(it -> {
it.setId(IdUtil.getSnowflakeNextId());
Long id = IdUtil.getSnowflakeNextId();
if (Objects.equals(request.getParentId(), it.getId())){
request.setParentId(id);
}
itemLanguages.stream()
.filter(i -> i.getConfigItemId().equals(it.getId()))
.forEach(i -> {
VUtils.trueThrowBusinessError(modelConfigItemLanguageService.lambdaQuery()
.eq(QuotationModelConfigItemLanguage::getConfigId, languageItem.getConfigId())
.eq(QuotationModelConfigItemLanguage::getLanguageId, languageItem.getLanguageId())
.eq(QuotationModelConfigItemLanguage::getPartName, request.getPartName())
.exists())
.throwMessage("已存在该名称的部件或系统");
if (i.getId().equals(request.getId())) {
i.setPartName(request.getPartName());
i.setPartRemark(request.getPartRemark());
}
i.setId(IdUtil.getSnowflakeNextId());
i.setConfigId(config.getId());
i.setConfigItemId(id);
i.setUpdateById(AdminUserUtil.getUserId());
i.setUpdateBy(AdminUserUtil.getUserName());
i.setUpdateTime(LocalDateTime.now());
});
items.stream().filter(i -> i.getParentId().equals(it.getId()))
.forEach(i -> i.setParentId(id));
it.setConfigId(config.getId());
if (StrUtil.equals(request.getLanguageCode(), Constant.DEFAULT_LANGUAGE_CODE)
&& it.getId().equals(languageItem.getConfigItemId())) {
@ -226,29 +259,29 @@ public class ModelConfigController extends ControllerBase {
it.setPartRemark(request.getPartRemark());
it.setImageUrl(request.getImageUrl());
}
it.setId(id);
});
modelConfigItemService.saveBatch(items);
}
if (CollectionUtil.isNotEmpty(itemLanguages)) {
itemLanguages.forEach(it -> {
VUtils.trueThrowBusinessError(modelConfigItemLanguageService.lambdaQuery()
.eq(QuotationModelConfigItemLanguage::getConfigId, languageItem.getConfigId())
.eq(QuotationModelConfigItemLanguage::getLanguageId, languageItem.getLanguageId())
.eq(QuotationModelConfigItemLanguage::getPartName, request.getPartName())
.exists())
.throwMessage("已存在该名称的部件或系统");
if (it.getId().equals(request.getId())) {
it.setPartName(request.getPartName());
it.setPartRemark(request.getPartRemark());
}
it.setId(IdUtil.getSnowflakeNextId());
it.setConfigId(config.getId());
it.setUpdateById(AdminUserUtil.getUserId());
it.setUpdateBy(AdminUserUtil.getUserName());
it.setUpdateTime(LocalDateTime.now());
});
modelConfigItemLanguageService.saveBatch(itemLanguages);
}
} else {
languageItem.setPartName(request.getPartName());
languageItem.setPartRemark(request.getPartRemark());
languageItem.setUpdateById(AdminUserUtil.getUserId());
languageItem.setUpdateBy(AdminUserUtil.getUserName());
languageItem.setUpdateTime(LocalDateTime.now());
if (StrUtil.equals(request.getLanguageCode(), Constant.DEFAULT_LANGUAGE_CODE)) {
modelConfigItemService.lambdaUpdate()
.set(QuotationModelConfigItem::getType, request.getType())
.set(QuotationModelConfigItem::getOptionalType, request.getOptionalType())
.set(QuotationModelConfigItem::getParentId, request.getParentId())
.set(QuotationModelConfigItem::getPartName, request.getPartName())
.set(QuotationModelConfigItem::getPartRemark, request.getPartRemark())
.set(QuotationModelConfigItem::getImageUrl, request.getImageUrl())
.eq(QuotationModelConfigItem::getId, request.getItemId())
.update();
}
modelConfigItemLanguageService.updateById(languageItem);
}
return ApiResult.success(config.getId());
}
@ -263,7 +296,8 @@ public class ModelConfigController extends ControllerBase {
List<QuotationModelConfigItem> items = modelConfigItemService.lambdaQuery()
.in(QuotationModelConfigItem::getId, ids)
.list();
VUtils.trueThrowBusinessError(items.size() > 1).throwMessage("数据错误");
VUtils.trueThrowBusinessError(items.stream().map(QuotationModelConfigItem::getConfigId).distinct().count() > 1)
.throwMessage("数据错误");
QuotationModelConfig config = modelConfigService.getById(items.get(0).getConfigId());
VUtils.trueThrowBusinessError(Objects.isNull(config)).throwMessage("无效的机型配置");
if (config.getConfigStatus() != 0) {
@ -273,34 +307,61 @@ public class ModelConfigController extends ControllerBase {
List<QuotationModelConfigItemLanguage> itemLanguages = modelConfigItemLanguageService.lambdaQuery()
.eq(QuotationModelConfigItemLanguage::getConfigId, config.getId())
.list();
config.setConfigStatus(0);
config.setId(IdUtil.getSnowflakeNextId());
config.setUpdateById(AdminUserUtil.getUserId());
config.setUpdateBy(AdminUserUtil.getUserName());
config.setUpdateTime(LocalDateTime.now());
modelConfigService.save(config);
List<Long> childrenIds = modelConfigItemService.lambdaQuery()
.select(QuotationModelConfigItem::getId)
.in(QuotationModelConfigItem::getParentId, ids)
.list()
.stream()
.map(QuotationModelConfigItem::getId)
.collect(Collectors.toList());
Collection<Long> allIds = CollectionUtil.union(childrenIds, ids);
if (CollectionUtil.isNotEmpty(items)) {
items.removeIf(it -> ids.contains(it.getId()));
items.removeIf(it -> allIds.contains(it.getId()));
itemLanguages.removeIf(it -> allIds.contains(it.getConfigItemId()));
List<QuotationModelConfigItem> finalItems = items;
items.forEach(it -> {
it.setId(IdUtil.getSnowflakeNextId());
Long id = IdUtil.getSnowflakeNextId();
itemLanguages.forEach(i -> {
i.setId(IdUtil.getSnowflakeNextId());
i.setConfigId(config.getId());
i.setConfigItemId(id);
i.setUpdateById(AdminUserUtil.getUserId());
i.setUpdateBy(AdminUserUtil.getUserName());
i.setUpdateTime(LocalDateTime.now());
});
finalItems.stream().filter(i -> i.getParentId().equals(it.getId()))
.forEach(i -> i.setParentId(id));
it.setId(id);
it.setConfigId(config.getId());
});
if (CollectionUtil.isNotEmpty(items)) {
modelConfigItemService.saveBatch(items);
}
}
if (CollectionUtil.isNotEmpty(itemLanguages)) {
itemLanguages.removeIf(it -> ids.contains(it.getConfigItemId()));
itemLanguages.forEach(it -> {
it.setId(IdUtil.getSnowflakeNextId());
it.setConfigId(config.getId());
it.setUpdateById(AdminUserUtil.getUserId());
it.setUpdateBy(AdminUserUtil.getUserName());
it.setUpdateTime(LocalDateTime.now());
});
if (CollectionUtil.isNotEmpty(itemLanguages)) {
modelConfigItemLanguageService.saveBatch(itemLanguages);
}
}
} else {
List<Long> childrenIds = modelConfigItemService.lambdaQuery()
.select(QuotationModelConfigItem::getId)
.in(QuotationModelConfigItem::getParentId, ids)
.list()
.stream()
.map(QuotationModelConfigItem::getId)
.collect(Collectors.toList());
Collection<Long> allIds = CollectionUtil.union(childrenIds, ids);
modelConfigItemService.lambdaUpdate()
.in(QuotationModelConfigItem::getId, allIds)
.remove();
modelConfigItemLanguageService.lambdaUpdate()
.in(QuotationModelConfigItemLanguage::getConfigItemId, allIds)
.remove();
}
return ApiResult.success(config.getId());
}
@ -324,6 +385,9 @@ public class ModelConfigController extends ControllerBase {
List<QuotationModelConfigItemLanguage> itemLanguages = modelConfigItemLanguageService.lambdaQuery()
.eq(QuotationModelConfigItemLanguage::getConfigId, config.getId())
.list();
config.setConfigStatus(0);
config.setConfigYear(null);
config.setConfigVersion(null);
config.setId(IdUtil.getSnowflakeNextId());
config.setUpdateById(AdminUserUtil.getUserId());
config.setUpdateBy(AdminUserUtil.getUserName());
@ -331,24 +395,48 @@ public class ModelConfigController extends ControllerBase {
modelConfigService.save(config);
if (CollectionUtil.isNotEmpty(items)) {
items.forEach(it -> {
it.setId(IdUtil.getSnowflakeNextId());
Long id = IdUtil.getSnowflakeNextId();
itemLanguages.stream()
.filter(i -> i.getConfigItemId().equals(it.getId()))
.forEach(i -> {
i.setId(IdUtil.getSnowflakeNextId());
i.setConfigId(config.getId());
i.setConfigItemId(id);
i.setUpdateById(AdminUserUtil.getUserId());
i.setUpdateBy(AdminUserUtil.getUserName());
i.setUpdateTime(LocalDateTime.now());
});
it.setId(id);
it.setConfigId(config.getId());
if (it.getId().equals(request.getId())) {
VUtils.trueThrowBusinessError(
request.getEnable() && modelConfigItemService.lambdaQuery()
.eq(QuotationModelConfigItem::getId, it.getParentId())
.eq(QuotationModelConfigItem::getEnable, false)
.exists()
).throwMessage("父级部件或系统已禁用");
it.setEnable(request.getEnable());
}
if (it.getParentId().equals(request.getId())) {
it.setEnable(request.getEnable());
}
});
modelConfigItemService.saveBatch(items);
}
if (CollectionUtil.isNotEmpty(itemLanguages)) {
itemLanguages.forEach(it -> {
it.setId(IdUtil.getSnowflakeNextId());
it.setConfigId(config.getId());
it.setUpdateById(AdminUserUtil.getUserId());
it.setUpdateBy(AdminUserUtil.getUserName());
it.setUpdateTime(LocalDateTime.now());
});
modelConfigItemLanguageService.saveBatch(itemLanguages);
}
} else {
VUtils.trueThrowBusinessError(
request.getEnable() && modelConfigItemService.lambdaQuery()
.eq(QuotationModelConfigItem::getId, item.getParentId())
.eq(QuotationModelConfigItem::getEnable, false)
.exists()
).throwMessage("父级部件或系统已禁用");
item.setEnable(request.getEnable());
modelConfigItemService.updateById(item);
modelConfigItemService.lambdaUpdate()
.set(QuotationModelConfigItem::getEnable, request.getEnable())
.eq(QuotationModelConfigItem::getParentId, item.getId())
.update();
}
return ApiResult.success(config.getId());
}
@ -372,6 +460,7 @@ public class ModelConfigController extends ControllerBase {
.update();
config.setConfigStatus(1);
config.setConfigVersion("MC" + DateTimeUtil.format(LocalDateTime.now(), "yyMMddHHmm"));
config.setConfigYear(String.valueOf(LocalDateTime.now().getYear()));
config.setUpdateById(AdminUserUtil.getUserId());
config.setUpdateBy(AdminUserUtil.getUserName());
config.setUpdateTime(LocalDateTime.now());

View File

@ -11,6 +11,9 @@ public class ModelConfigItemUpdateRequest{
@NotNull
private Long id;
@NotNull
private Long itemId;
/**
* 多语言
*/

View File

@ -26,6 +26,6 @@
AND pm.`no` like concat('%', #{request.no}, '%')
</if>
</where>
order by qmc.update_time desc,pm.id
order by qmc.update_time desc,qmc.create_time desc,pm.id
</select>
</mapper>