feat(quotation): 新增机型配置管理和参数服务功能
- 创建IProductModelParamsItemService接口定义参数项服务方法 - 实现ModelConfigController控制器提供机型配置的增删改查功能 - 添加ModelConfigItemAddRequest和ModelConfigItemUpdateRequest请求对象 - 定义ModelConfigItemLanguageVO视图对象用于多语言配置展示 - 扩展ModelConfigEffectiveDTO增加分组名称字段支持 - 实现配置项的树形结构查询和层级关系处理逻辑 - 添加配置项的启用禁用状态管理功能 - 实现配置项的发布流程和版本控制机制 - 集成多语言翻译服务支持国际化配置 - 添加从产品中心同步部件参数的功能实现
This commit is contained in:
parent
f37d334641
commit
03d166d8af
|
|
@ -47,4 +47,9 @@ public class ModelConfigEffectiveDTO {
|
|||
*/
|
||||
@JsonProperty("hasSelect")
|
||||
private Boolean hasSelect;
|
||||
|
||||
/**
|
||||
* 分组名称,同组的可选配置替换
|
||||
*/
|
||||
private String groupName;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.nflg.mobilebroken.common.pojo.vo;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
|
@ -36,6 +37,9 @@ public class ModelPriceConfigVO {
|
|||
@JsonIgnore
|
||||
private Long priceId;
|
||||
|
||||
@JsonIgnore
|
||||
private Long parentId = 0L;
|
||||
|
||||
/**
|
||||
* 部件或系统
|
||||
*/
|
||||
|
|
@ -73,10 +77,10 @@ public class ModelPriceConfigVO {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置版本号
|
||||
*/
|
||||
private String configVersion;
|
||||
// /**
|
||||
// * 配置版本号
|
||||
// */
|
||||
// private String configVersion;
|
||||
|
||||
/**
|
||||
* 类别,0:可选配置;1:标准配置
|
||||
|
|
@ -115,7 +119,7 @@ public class ModelPriceConfigVO {
|
|||
private String optionalTypeDesc;
|
||||
|
||||
public String getOptionalTypeDesc() {
|
||||
if (Objects.isNull(optionalType)) {
|
||||
if (Objects.isNull(optionalType) || parentId == 0) {
|
||||
return null;
|
||||
}
|
||||
switch (optionalType) {
|
||||
|
|
@ -150,5 +154,5 @@ public class ModelPriceConfigVO {
|
|||
private List<ModelPriceConfigAreaVO> areas;
|
||||
|
||||
@JsonIgnore
|
||||
private List<ModelPriceConfigVO> children=new ArrayList<>();
|
||||
private List<ModelPriceConfigVO> children = new ArrayList<>();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,5 +79,10 @@ public class ModelConfigItemLanguageVO {
|
|||
*/
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
/**
|
||||
* 分组名称,同组的可选配置替换
|
||||
*/
|
||||
private String groupName;
|
||||
|
||||
private List<ModelConfigItemLanguageVO> children;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,14 +16,8 @@ import com.nflg.mobilebroken.common.util.VUtils;
|
|||
import com.nflg.mobilebroken.quotation.controller.ControllerBase;
|
||||
import com.nflg.mobilebroken.quotation.pojo.request.ModelConfigItemAddRequest;
|
||||
import com.nflg.mobilebroken.quotation.pojo.request.ModelConfigItemUpdateRequest;
|
||||
import com.nflg.mobilebroken.repository.entity.Language;
|
||||
import com.nflg.mobilebroken.repository.entity.QuotationModelConfig;
|
||||
import com.nflg.mobilebroken.repository.entity.QuotationModelConfigItem;
|
||||
import com.nflg.mobilebroken.repository.entity.QuotationModelConfigItemLanguage;
|
||||
import com.nflg.mobilebroken.repository.service.ILanguageService;
|
||||
import com.nflg.mobilebroken.repository.service.IQuotationModelConfigItemLanguageService;
|
||||
import com.nflg.mobilebroken.repository.service.IQuotationModelConfigItemService;
|
||||
import com.nflg.mobilebroken.repository.service.IQuotationModelConfigService;
|
||||
import com.nflg.mobilebroken.repository.entity.*;
|
||||
import com.nflg.mobilebroken.repository.service.*;
|
||||
import com.nflg.mobilebroken.starter.service.ITranslate;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
|
@ -58,6 +52,9 @@ public class ModelConfigController extends ControllerBase {
|
|||
@Resource
|
||||
private ITranslate translate;
|
||||
|
||||
@Resource
|
||||
private IProductModelParamsItemService productModelParamsItemService;
|
||||
|
||||
/**
|
||||
* 获取机型配置列表
|
||||
*/
|
||||
|
|
@ -96,6 +93,9 @@ public class ModelConfigController extends ControllerBase {
|
|||
@PostMapping("/item/add")
|
||||
@Transactional
|
||||
public ApiResult<Long> addItem(@Valid @RequestBody ModelConfigItemAddRequest request) {
|
||||
VUtils.trueThrowBusinessError(!Objects.equals(request.getParentId(), 0L)
|
||||
&& Objects.isNull(request.getOptionalType())
|
||||
).throwMessage("选配类别不能为空");
|
||||
List<Language> languages = languageService.getLanguages();
|
||||
Language cn = languages.stream().filter(it -> it.getCode().equals(Constant.DEFAULT_LANGUAGE_CODE)).findFirst().get();
|
||||
if (Objects.nonNull(request.getConfigId())) {
|
||||
|
|
@ -120,7 +120,7 @@ public class ModelConfigController extends ControllerBase {
|
|||
if (CollectionUtil.isNotEmpty(items)) {
|
||||
items.forEach(it -> {
|
||||
Long id = IdUtil.getSnowflakeNextId();
|
||||
if (Objects.equals(request.getParentId(), it.getId())){
|
||||
if (Objects.equals(request.getParentId(), it.getId())) {
|
||||
request.setParentId(id);
|
||||
}
|
||||
itemLanguages.stream()
|
||||
|
|
@ -162,6 +162,7 @@ public class ModelConfigController extends ControllerBase {
|
|||
.setId(IdUtil.getSnowflakeNextId())
|
||||
.setConfigId(request.getConfigId())
|
||||
.setType(request.getType())
|
||||
.setGroupName(request.getGroupName())
|
||||
.setOptionalType(request.getOptionalType())
|
||||
.setPartName(request.getPartName())
|
||||
.setPartRemark(request.getPartRemark())
|
||||
|
|
@ -203,6 +204,9 @@ public class ModelConfigController extends ControllerBase {
|
|||
@PostMapping("/item/update")
|
||||
@Transactional
|
||||
public ApiResult<Long> updateItem(@Valid @RequestBody ModelConfigItemUpdateRequest request) {
|
||||
VUtils.trueThrowBusinessError(!Objects.equals(request.getParentId(), 0L)
|
||||
&& Objects.isNull(request.getOptionalType())
|
||||
).throwMessage("选配类别不能为空");
|
||||
QuotationModelConfigItemLanguage languageItem = modelConfigItemLanguageService.getById(request.getId());
|
||||
VUtils.trueThrowBusinessError(Objects.isNull(languageItem)).throwMessage("无效的语言配置");
|
||||
QuotationModelConfig config = modelConfigService.getById(languageItem.getConfigId());
|
||||
|
|
@ -225,7 +229,7 @@ public class ModelConfigController extends ControllerBase {
|
|||
if (CollectionUtil.isNotEmpty(items)) {
|
||||
items.forEach(it -> {
|
||||
Long id = IdUtil.getSnowflakeNextId();
|
||||
if (Objects.equals(request.getParentId(), it.getId())){
|
||||
if (Objects.equals(request.getParentId(), it.getId())) {
|
||||
request.setParentId(id);
|
||||
}
|
||||
itemLanguages.stream()
|
||||
|
|
@ -260,6 +264,7 @@ public class ModelConfigController extends ControllerBase {
|
|||
it.setPartName(request.getPartName());
|
||||
it.setPartRemark(request.getPartRemark());
|
||||
it.setImageUrl(request.getImageUrl());
|
||||
it.setGroupName(request.getGroupName());
|
||||
}
|
||||
it.setId(id);
|
||||
});
|
||||
|
|
@ -469,4 +474,283 @@ public class ModelConfigController extends ControllerBase {
|
|||
modelConfigService.updateById(config);
|
||||
return ApiResult.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 从产品中心同步部件
|
||||
* @param configId 配置id
|
||||
*/
|
||||
@GetMapping("/syncPartFromProductModel")
|
||||
public ApiResult<List<ModelConfigItemLanguageVO>> syncPartFromProductModel(@RequestParam Long configId) {
|
||||
List<ProductModelParamsItem> paramsItems = productModelParamsItemService.getForQuotation(configId);
|
||||
VUtils.trueThrowBusinessError(CollectionUtil.isEmpty(paramsItems)).throwMessage("机型尚未配置参数");
|
||||
List<ProductModelParamsItem> paramsCnItems = paramsItems.stream()
|
||||
.filter(it -> Constant.DEFAULT_LANGUAGE_CODE.equals(it.getLanguageCode()))
|
||||
.collect(Collectors.toList());
|
||||
VUtils.trueThrowBusinessError(CollectionUtil.isEmpty(paramsCnItems)).throwMessage("机型尚未配置中文参数");
|
||||
paramsItems.removeAll(paramsCnItems);
|
||||
List<QuotationModelConfigItem> newItems = new ArrayList<>();
|
||||
List<QuotationModelConfigItemLanguage> newItemsLanguages = new ArrayList<>();
|
||||
List<Language> languages = languageService.getAllLanguages();
|
||||
paramsCnItems.forEach(cnItem -> {
|
||||
String parentPartName = cnItem.getIndexName();
|
||||
String childPartName = cnItem.getName();
|
||||
Long pitemId = IdUtil.getSnowflakeNextId();
|
||||
Integer ptype = parentPartName.contains("可选") ? 0 : 1;
|
||||
Long citemId = IdUtil.getSnowflakeNextId();
|
||||
Integer ctype = childPartName.contains("可选") ? 0 : 1;
|
||||
newItems.add(
|
||||
new QuotationModelConfigItem()
|
||||
.setId(pitemId)
|
||||
.setUniqueId(IdUtil.getSnowflakeNextId())
|
||||
.setConfigId(configId)
|
||||
.setType(ptype)
|
||||
.setParentId(0L)
|
||||
.setPartName(parentPartName)
|
||||
);
|
||||
newItems.add(
|
||||
new QuotationModelConfigItem()
|
||||
.setId(citemId)
|
||||
.setUniqueId(IdUtil.getSnowflakeNextId())
|
||||
.setConfigId(configId)
|
||||
.setType(ctype)
|
||||
.setParentId(pitemId)
|
||||
.setPartName(childPartName)
|
||||
);
|
||||
paramsItems.forEach(otherItem -> {
|
||||
Language language = languages.stream()
|
||||
.filter(l -> l.getName().equals(otherItem.getLanguageCode()))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (Objects.nonNull(language)) {
|
||||
newItemsLanguages.add(
|
||||
new QuotationModelConfigItemLanguage()
|
||||
.setConfigId(configId)
|
||||
.setConfigItemId(pitemId)
|
||||
.setLanguageId(language.getId())
|
||||
.setPartName(otherItem.getIndexName())
|
||||
.setPartRemark("")
|
||||
.setCreateById(AdminUserUtil.getUserId())
|
||||
.setCreateBy(AdminUserUtil.getUserName())
|
||||
.setCreateTime(LocalDateTime.now())
|
||||
);
|
||||
newItemsLanguages.add(
|
||||
new QuotationModelConfigItemLanguage()
|
||||
.setConfigId(configId)
|
||||
.setConfigItemId(citemId)
|
||||
.setLanguageId(language.getId())
|
||||
.setPartName(otherItem.getName())
|
||||
.setPartRemark("")
|
||||
.setCreateById(AdminUserUtil.getUserId())
|
||||
.setCreateBy(AdminUserUtil.getUserName())
|
||||
.setCreateTime(LocalDateTime.now())
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
List<QuotationModelConfigItem> dbItems = modelConfigItemService.lambdaQuery()
|
||||
.eq(QuotationModelConfigItem::getConfigId, configId)
|
||||
.list();
|
||||
List<QuotationModelConfigItemLanguage> dbLanguagesItem = modelConfigItemLanguageService.lambdaQuery()
|
||||
.eq(QuotationModelConfigItemLanguage::getConfigId, configId)
|
||||
.list();
|
||||
List<QuotationModelConfigItem> itemsForAdd = new ArrayList<>();
|
||||
List<QuotationModelConfigItemLanguage> itemsLanguagesForAdd = new ArrayList<>();
|
||||
newItems.stream()
|
||||
.filter(nit -> nit.getParentId() == 0)
|
||||
.forEach(pitem -> {
|
||||
QuotationModelConfigItem titem = dbItems.stream()
|
||||
.filter(dit -> dit.getParentId() == 0 && dit.getPartName().equals(pitem.getPartName()))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (Objects.isNull(titem)) {
|
||||
itemsForAdd.add(pitem);
|
||||
itemsLanguagesForAdd.addAll(newItemsLanguages.stream()
|
||||
.filter(lit -> lit.getConfigItemId().equals(pitem.getId()))
|
||||
.collect(Collectors.toList())
|
||||
);
|
||||
}else {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
paramsCnItems.forEach(cnItem -> {
|
||||
String parentPartName = cnItem.getIndexName();
|
||||
String childPartName = cnItem.getName();
|
||||
QuotationModelConfigItem pitem = dbItems.stream()
|
||||
.filter(it -> it.getParentId() == 0 && StrUtil.equals(it.getPartName(), parentPartName))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (Objects.isNull(pitem)) {
|
||||
Long pitemId = IdUtil.getSnowflakeNextId();
|
||||
Integer ptype = parentPartName.contains("可选") ? 0 : 1;
|
||||
itemsForAdd.add(
|
||||
new QuotationModelConfigItem()
|
||||
.setId(pitemId)
|
||||
.setConfigId(configId)
|
||||
.setPartName(parentPartName)
|
||||
.setType(ptype)
|
||||
.setParentId(0L)
|
||||
.setUniqueId(IdUtil.getSnowflakeNextId())
|
||||
);
|
||||
itemsLanguagesForAdd.add(
|
||||
new QuotationModelConfigItemLanguage()
|
||||
.setConfigId(configId)
|
||||
.setConfigItemId(pitemId)
|
||||
.setLanguageId(
|
||||
languages.stream()
|
||||
.filter(l -> l.getName().equals(cnItem.getLanguageCode()))
|
||||
.findFirst()
|
||||
.map(Language::getId)
|
||||
.orElse(null)
|
||||
)
|
||||
.setPartName(parentPartName)
|
||||
.setPartRemark("")
|
||||
.setCreateById(AdminUserUtil.getUserId())
|
||||
.setCreateBy(AdminUserUtil.getUserName())
|
||||
.setCreateTime(LocalDateTime.now())
|
||||
);
|
||||
//二级
|
||||
Long citemId = IdUtil.getSnowflakeNextId();
|
||||
Integer ctype = childPartName.contains("可选") ? 0 : 1;
|
||||
itemsForAdd.add(
|
||||
new QuotationModelConfigItem()
|
||||
.setId(citemId)
|
||||
.setConfigId(configId)
|
||||
.setPartName(childPartName)
|
||||
.setType(ctype)
|
||||
.setParentId(pitemId)
|
||||
.setUniqueId(IdUtil.getSnowflakeNextId())
|
||||
);
|
||||
itemsLanguagesForAdd.add(
|
||||
new QuotationModelConfigItemLanguage()
|
||||
.setConfigId(configId)
|
||||
.setConfigItemId(citemId)
|
||||
.setLanguageId(
|
||||
languages.stream()
|
||||
.filter(l -> l.getName().equals(cnItem.getLanguageCode()))
|
||||
.findFirst()
|
||||
.map(Language::getId)
|
||||
.orElse(null)
|
||||
)
|
||||
.setPartName(childPartName)
|
||||
.setPartRemark("")
|
||||
.setCreateById(AdminUserUtil.getUserId())
|
||||
.setCreateBy(AdminUserUtil.getUserName())
|
||||
.setCreateTime(LocalDateTime.now())
|
||||
);
|
||||
List<ProductModelParamsItem> otherLanguagesItems = paramsItems.stream()
|
||||
.filter(it -> it.getBatchNumber().equals(cnItem.getBatchNumber()))
|
||||
.collect(Collectors.toList());
|
||||
otherLanguagesItems.forEach(otherLanguagesItem -> {
|
||||
itemsLanguagesForAdd.add(
|
||||
new QuotationModelConfigItemLanguage()
|
||||
.setConfigId(configId)
|
||||
.setConfigItemId(pitemId)
|
||||
.setLanguageId(
|
||||
languages.stream()
|
||||
.filter(l -> l.getName().equals(otherLanguagesItem.getLanguageCode()))
|
||||
.findFirst()
|
||||
.map(Language::getId)
|
||||
.orElse(null)
|
||||
)
|
||||
.setPartName(otherLanguagesItem.getIndexName())
|
||||
.setPartRemark("")
|
||||
.setCreateById(AdminUserUtil.getUserId())
|
||||
.setCreateBy(AdminUserUtil.getUserName())
|
||||
.setCreateTime(LocalDateTime.now())
|
||||
);
|
||||
itemsLanguagesForAdd.add(
|
||||
new QuotationModelConfigItemLanguage()
|
||||
.setConfigId(configId)
|
||||
.setConfigItemId(citemId)
|
||||
.setLanguageId(
|
||||
languages.stream()
|
||||
.filter(l -> l.getName().equals(otherLanguagesItem.getLanguageCode()))
|
||||
.findFirst()
|
||||
.map(Language::getId)
|
||||
.orElse(null)
|
||||
)
|
||||
.setPartName(otherLanguagesItem.getName())
|
||||
.setPartRemark("")
|
||||
.setCreateById(AdminUserUtil.getUserId())
|
||||
.setCreateBy(AdminUserUtil.getUserName())
|
||||
.setCreateTime(LocalDateTime.now())
|
||||
);
|
||||
});
|
||||
} else {
|
||||
List<ProductModelParamsItem> otherLanguagesItems = paramsItems.stream()
|
||||
.filter(it -> it.getBatchNumber().equals(cnItem.getBatchNumber()))
|
||||
.collect(Collectors.toList());
|
||||
otherLanguagesItems.forEach(otherLanguagesItem -> {
|
||||
Language language = languages.stream()
|
||||
.filter(l -> l.getName().equals(otherLanguagesItem.getLanguageCode()))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (Objects.nonNull(language)) {
|
||||
QuotationModelConfigItemLanguage planguageItem = dbLanguagesItem.stream()
|
||||
.filter(it -> Objects.equals(it.getConfigItemId(), pitem.getId())
|
||||
&& it.getLanguageId().equals(language.getId())
|
||||
)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (Objects.isNull(planguageItem)) {
|
||||
itemsLanguagesForAdd.add(
|
||||
new QuotationModelConfigItemLanguage()
|
||||
.setConfigId(configId)
|
||||
.setConfigItemId(pitem.getId())
|
||||
.setLanguageId(language.getId())
|
||||
.setPartName(otherLanguagesItem.getIndexName())
|
||||
.setPartRemark("")
|
||||
.setCreateById(AdminUserUtil.getUserId())
|
||||
.setCreateBy(AdminUserUtil.getUserName())
|
||||
.setCreateTime(LocalDateTime.now())
|
||||
);
|
||||
} else {
|
||||
planguageItem.setPartName(otherLanguagesItem.getName());
|
||||
planguageItem.setUpdateById(AdminUserUtil.getUserId());
|
||||
planguageItem.setUpdateBy(AdminUserUtil.getUserName());
|
||||
planguageItem.setUpdateTime(LocalDateTime.now());
|
||||
}
|
||||
QuotationModelConfigItem citem = dbItems.stream()
|
||||
.filter(it -> Objects.equals(it.getParentId(), pitem.getId())
|
||||
&& StrUtil.equals(it.getPartName(), childPartName))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (Objects.isNull(citem)) {
|
||||
Long citemId = IdUtil.getSnowflakeNextId();
|
||||
Integer ctype = childPartName.contains("可选") ? 0 : 1;
|
||||
itemsForAdd.add(
|
||||
new QuotationModelConfigItem()
|
||||
.setId(citemId)
|
||||
.setConfigId(configId)
|
||||
.setPartName(childPartName)
|
||||
.setType(ctype)
|
||||
.setParentId(pitem.getId())
|
||||
.setUniqueId(IdUtil.getSnowflakeNextId())
|
||||
);
|
||||
itemsLanguagesForAdd.add(
|
||||
new QuotationModelConfigItemLanguage()
|
||||
.setConfigId(configId)
|
||||
.setConfigItemId(citemId)
|
||||
.setLanguageId(
|
||||
languages.stream()
|
||||
.filter(l -> l.getName().equals(cnItem.getLanguageCode()))
|
||||
.findFirst()
|
||||
.map(Language::getId)
|
||||
.orElse(null)
|
||||
)
|
||||
.setPartName(childPartName)
|
||||
.setPartRemark("")
|
||||
.setCreateById(AdminUserUtil.getUserId())
|
||||
.setCreateBy(AdminUserUtil.getUserName())
|
||||
.setCreateTime(LocalDateTime.now())
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
return ApiResult.success(Collections.emptyList());
|
||||
}
|
||||
}
|
||||
|
|
@ -20,6 +20,7 @@ import com.nflg.mobilebroken.common.util.*;
|
|||
import com.nflg.mobilebroken.quotation.controller.ControllerBase;
|
||||
import com.nflg.mobilebroken.quotation.pojo.request.*;
|
||||
import com.nflg.mobilebroken.quotation.pojo.vo.QuotationOrderInfoVO;
|
||||
import com.nflg.mobilebroken.quotation.pojo.vo.ShoppingCartPartGroupVO;
|
||||
import com.nflg.mobilebroken.quotation.pojo.vo.ShoppingCartPartVO;
|
||||
import com.nflg.mobilebroken.quotation.pojo.vo.ShoppingCartVO;
|
||||
import com.nflg.mobilebroken.repository.entity.*;
|
||||
|
|
@ -140,13 +141,11 @@ public class ShoppingController extends ControllerBase {
|
|||
.collect(Collectors.toList())
|
||||
);
|
||||
} else {
|
||||
List<AppUser> appUsers = appUserService.getEndUsers();
|
||||
return ApiResult.success(appUsers.stream()
|
||||
.map(appUser -> new SimpleUserVO()
|
||||
.setUserId(appUser.getId())
|
||||
.setUserName(appUser.getName())
|
||||
return ApiResult.success(List.of(
|
||||
new SimpleUserVO()
|
||||
.setUserId(AppUserUtil.getUserId())
|
||||
.setUserName("福建南方路面机械股份有限公司")
|
||||
)
|
||||
.collect(Collectors.toList())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -228,6 +227,17 @@ public class ShoppingController extends ControllerBase {
|
|||
vc.setHasSelect(vc.getType() == 1);
|
||||
return vc;
|
||||
})
|
||||
.collect(Collectors.groupingBy(ShoppingCartPartVO::getGroupName))
|
||||
.entrySet()
|
||||
.stream()
|
||||
.map(kv -> new ShoppingCartPartGroupVO()
|
||||
.setGroupName(kv.getKey())
|
||||
.setItems(kv.getValue()
|
||||
.stream()
|
||||
.sorted(Comparator.comparing(ShoppingCartPartVO::getType).reversed())
|
||||
.collect(Collectors.toList())
|
||||
)
|
||||
)
|
||||
.collect(Collectors.toList())
|
||||
);
|
||||
vi.setHasSelect(true);
|
||||
|
|
@ -247,6 +257,17 @@ public class ShoppingController extends ControllerBase {
|
|||
vc.setHasSelect(vc.getType() == 1);
|
||||
return vc;
|
||||
})
|
||||
.collect(Collectors.groupingBy(ShoppingCartPartVO::getGroupName))
|
||||
.entrySet()
|
||||
.stream()
|
||||
.map(kv -> new ShoppingCartPartGroupVO()
|
||||
.setGroupName(kv.getKey())
|
||||
.setItems(kv.getValue()
|
||||
.stream()
|
||||
.sorted(Comparator.comparing(ShoppingCartPartVO::getType).reversed())
|
||||
.collect(Collectors.toList())
|
||||
)
|
||||
)
|
||||
.collect(Collectors.toList())
|
||||
);
|
||||
vi.setHasSelect(false);
|
||||
|
|
@ -343,11 +364,11 @@ public class ShoppingController extends ControllerBase {
|
|||
QuotationShoppingCart cart = shoppingCartService.getById(id);
|
||||
VUtils.trueThrowBusinessError(Objects.isNull(cart)).throwMessage("未找到购物车信息");
|
||||
ShoppingCartVO vo = Convert.convert(ShoppingCartVO.class, cart);
|
||||
ProductModel model=productModelService.lambdaQuery()
|
||||
ProductModel model = productModelService.lambdaQuery()
|
||||
.eq(ProductModel::getState, 1)
|
||||
.eq(ProductModel::getBatchNumber, cart.getModelId())
|
||||
.one();
|
||||
if (Objects.nonNull(model)){
|
||||
if (Objects.nonNull(model)) {
|
||||
vo.setModelKeyId(model.getId());
|
||||
}
|
||||
//获取部件配置
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.nflg.mobilebroken.quotation.pojo.request;
|
||||
|
||||
import lombok.Data;
|
||||
import org.hibernate.validator.constraints.Range;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
|
@ -40,16 +41,22 @@ public class ModelConfigItemAddRequest {
|
|||
* 类别,0:可选配置;1:标准配置
|
||||
*/
|
||||
@NotNull
|
||||
@Range(min = 0, max = 1)
|
||||
private Integer type;
|
||||
|
||||
/**
|
||||
* 选配类别,0:新增可选;1:替换可选
|
||||
*/
|
||||
@NotNull
|
||||
@Range(min = 0, max = 1)
|
||||
private Integer optionalType;
|
||||
|
||||
/**
|
||||
* 图片
|
||||
*/
|
||||
private String imageUrl;
|
||||
|
||||
/**
|
||||
* 分组名称,同组的可选配置替换
|
||||
*/
|
||||
private String groupName;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.nflg.mobilebroken.quotation.pojo.request;
|
||||
|
||||
import lombok.Data;
|
||||
import org.hibernate.validator.constraints.Range;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
|
@ -34,20 +35,29 @@ public class ModelConfigItemUpdateRequest{
|
|||
/**
|
||||
* 上级id,0表示无上级
|
||||
*/
|
||||
@NotNull
|
||||
private Long parentId;
|
||||
|
||||
/**
|
||||
* 类别,0:可选配置;1:标准配置
|
||||
*/
|
||||
@NotNull
|
||||
@Range(min = 0, max = 1)
|
||||
private Integer type;
|
||||
|
||||
/**
|
||||
* 选配类别,0:新增可选;1:替换可选
|
||||
*/
|
||||
@Range(min = 0, max = 1)
|
||||
private Integer optionalType;
|
||||
|
||||
/**
|
||||
* 图片
|
||||
*/
|
||||
private String imageUrl;
|
||||
|
||||
/**
|
||||
* 分组名称,同组的可选配置替换
|
||||
*/
|
||||
private String groupName;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,18 @@
|
|||
package com.nflg.mobilebroken.quotation.pojo.vo;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class ShoppingCartPartGroupVO {
|
||||
|
||||
/**
|
||||
* 分组名称
|
||||
*/
|
||||
private String groupName;
|
||||
|
||||
private List<ShoppingCartPartVO> items;
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
package com.nflg.mobilebroken.quotation.pojo.vo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
|
@ -49,5 +50,11 @@ public class ShoppingCartPartVO {
|
|||
@JsonProperty("hasSelect")
|
||||
private Boolean hasSelect;
|
||||
|
||||
private List<ShoppingCartPartVO> children;
|
||||
/**
|
||||
* 分组名称
|
||||
*/
|
||||
@JsonIgnore
|
||||
private String groupName;
|
||||
|
||||
private List<ShoppingCartPartGroupVO> children;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,15 +1,10 @@
|
|||
package com.nflg.mobilebroken.quotation.pojo.vo;
|
||||
|
||||
import com.nflg.mobilebroken.quotation.pojo.request.ShoppingSaveAccessoryRequest;
|
||||
import com.nflg.mobilebroken.quotation.pojo.request.ShoppingSavePartRequest;
|
||||
import com.nflg.mobilebroken.quotation.pojo.request.ShoppingSaveServiceRequest;
|
||||
import com.nflg.mobilebroken.repository.entity.QuotationShoppingCartAccessory;
|
||||
import com.nflg.mobilebroken.repository.entity.QuotationShoppingCartService;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
|
|
|||
|
|
@ -68,4 +68,9 @@ public class QuotationModelConfigItem implements Serializable {
|
|||
* 唯一id,不随版本变化
|
||||
*/
|
||||
private Long uniqueId;
|
||||
|
||||
/**
|
||||
* 分组名称,同组的可选配置替换
|
||||
*/
|
||||
private String groupName;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ package com.nflg.mobilebroken.repository.mapper;
|
|||
import com.nflg.mobilebroken.repository.entity.ProductModelParamsItem;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品中心-机型-参数 Mapper 接口
|
||||
|
|
@ -13,4 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||
*/
|
||||
public interface ProductModelParamsItemMapper extends BaseMapper<ProductModelParamsItem> {
|
||||
|
||||
List<ProductModelParamsItem> getForQuotation(Long configId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,4 +43,6 @@ public interface IProductModelParamsItemService extends IService<ProductModelPar
|
|||
void updateItem(@Valid ProductModelParamsItemUpdateRequest1 request);
|
||||
|
||||
void deleteIndexName(@Valid ParamsIndexNameDeleteRequest request);
|
||||
|
||||
List<ProductModelParamsItem> getForQuotation(Long configId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ import com.nflg.mobilebroken.repository.mapper.ProductModelParamsItemMapper;
|
|||
import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService;
|
||||
import com.nflg.mobilebroken.repository.service.ILanguageService;
|
||||
import com.nflg.mobilebroken.repository.service.IProductModelParamsItemService;
|
||||
import org.springframework.data.redis.core.ReactiveRedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
|
|
@ -293,4 +294,9 @@ public class ProductModelParamsItemServiceImpl extends ServiceImpl<ProductModelP
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ProductModelParamsItem> getForQuotation(Long configId) {
|
||||
return baseMapper.getForQuotation(configId);
|
||||
}
|
||||
}
|
||||
|
|
@ -60,19 +60,27 @@ public class QuotationModelPriceServiceImpl extends ServiceImpl<QuotationModelPr
|
|||
List<QuotationModelConfigItem> configItems = configItemService.lambdaQuery()
|
||||
.in(QuotationModelConfigItem::getConfigId, configIds)
|
||||
.list();
|
||||
configItems.removeIf(it -> it.getParentId() > 0 && Objects.equals(it.getType(), 1));
|
||||
List<QuotationModelConfigItem> cc = configItems.stream()
|
||||
.filter(it -> it.getParentId() > 0)
|
||||
.collect(Collectors.toList());
|
||||
configItems.removeIf(it -> it.getParentId() == 0
|
||||
&& Objects.equals(it.getType(), 1)
|
||||
&& cc.stream().noneMatch(cit -> cit.getParentId().equals(it.getId()))
|
||||
);
|
||||
List<Long> priceIds = pdata.getRecords().stream()
|
||||
.map(ModelPriceConfigVO::getPriceId)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
List<QuotationModelPriceItem> priceItems = CollectionUtil.isEmpty(priceIds) ? new ArrayList<>() : priceItemService.lambdaQuery()
|
||||
.in(QuotationModelPriceItem::getPriceId, priceIds)
|
||||
.list();
|
||||
.in(QuotationModelPriceItem::getPriceId, priceIds)
|
||||
.list();
|
||||
List<DictionaryItem> areas = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY);
|
||||
pdata.getRecords().forEach(data -> {
|
||||
List<QuotationModelPriceItemArea> areaPrices = Objects.isNull(data.getPriceId()) ? new ArrayList<>()
|
||||
: priceItemAreaService.lambdaQuery()
|
||||
.in(QuotationModelPriceItemArea::getPriceId, data.getPriceId())
|
||||
.list();
|
||||
.in(QuotationModelPriceItemArea::getPriceId, data.getPriceId())
|
||||
.list();
|
||||
data.setAreas(
|
||||
areas.stream()
|
||||
.map(area -> new ModelPriceConfigAreaVO()
|
||||
|
|
@ -110,12 +118,13 @@ public class QuotationModelPriceServiceImpl extends ServiceImpl<QuotationModelPr
|
|||
|
||||
@Override
|
||||
public ModelPrice1VO getModelPrice(Long modelId, Long categoryId) {
|
||||
return baseMapper.getModelPrice(modelId,categoryId);
|
||||
return baseMapper.getModelPrice(modelId, categoryId);
|
||||
}
|
||||
|
||||
private ModelPriceConfigVO generateVO(Long modelId, QuotationModelConfigItem configItem, List<QuotationModelConfigItem> items
|
||||
, List<QuotationModelPriceItem> priceItems, List<QuotationModelPriceItemArea> areaPrices, List<DictionaryItem> areas) {
|
||||
ModelPriceConfigVO vo = new ModelPriceConfigVO()
|
||||
.setParentId(configItem.getParentId())
|
||||
.setPartName(configItem.getPartName())
|
||||
.setType(configItem.getType())
|
||||
.setConfigItemUniqueId(configItem.getUniqueId())
|
||||
|
|
@ -147,8 +156,8 @@ public class QuotationModelPriceServiceImpl extends ServiceImpl<QuotationModelPr
|
|||
vo.setAreas(
|
||||
areas.stream()
|
||||
.map(area -> new ModelPriceConfigAreaVO()
|
||||
.setAreaId(area.getId())
|
||||
.setCode(area.getCode())
|
||||
.setAreaId(area.getId())
|
||||
.setCode(area.getCode())
|
||||
// .setAreaName(area.getName())
|
||||
)
|
||||
.collect(Collectors.toList())
|
||||
|
|
|
|||
|
|
@ -2,4 +2,12 @@
|
|||
<!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.ProductModelParamsItemMapper">
|
||||
|
||||
</mapper>
|
||||
<select id="getForQuotation" resultType="com.nflg.mobilebroken.repository.entity.ProductModelParamsItem">
|
||||
SELECT pmpi.batch_number,pmpi.language_code,pmpi.index_name,pmpi.`name`,pmpi.`value`
|
||||
FROM quotation_model_config qmc
|
||||
INNER JOIN product_model pm ON qmc.model_id=pm.batch_number AND pm.state=1
|
||||
INNER JOIN product_model_params pmp ON pm.id=pmp.model_id AND pmp.state=1
|
||||
INNER JOIN product_model_params_item pmpi ON pmp.id=pmpi.model_params_id
|
||||
WHERE qmc.id=#{configId}
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
@ -28,7 +28,8 @@
|
|||
</select>
|
||||
|
||||
<select id="getEffectives" resultType="com.nflg.mobilebroken.common.pojo.dto.ModelConfigEffectiveDTO">
|
||||
SELECT qmci.id,qmci.parent_id,qmcil.part_name,qmcil.part_remark,qmci.image_url,pp.amount,qmci.type,qmci.optional_type
|
||||
SELECT qmci.id,qmci.parent_id,qmcil.part_name,qmcil.part_remark,qmci.image_url,pp.amount,qmci.type
|
||||
,qmci.optional_type,qmci.group_name
|
||||
FROM quotation_model_config_item qmci
|
||||
LEFT JOIN quotation_model_config_item_language qmcil ON qmcil.config_item_id=qmci.id
|
||||
LEFT JOIN `language` l ON l.id=qmcil.language_id
|
||||
|
|
@ -40,5 +41,6 @@
|
|||
WHERE qmpia.price_id=#{priceId} AND qmpia.area_id=#{categoryId}
|
||||
) pp ON qmci.unique_id=pp.config_item_unique_id
|
||||
WHERE qmci.`enable` AND qmci.config_id=#{configId} AND l.`code`=#{language}
|
||||
ORDER BY qmci.id
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@
|
|||
<select id="search" resultType="com.nflg.mobilebroken.common.pojo.vo.ModelPriceConfigVO">
|
||||
SELECT qmp.id,pm.batch_number as 'modelId',pm.`no` as 'modelNo',qmp.id as 'priceId',pm.`no` as 'partName'
|
||||
,qmp.price_version,qmp.price_status,qmp.update_by,qmp.update_time
|
||||
,if(qmp.price_status=1,qmc2.config_version,qmc1.config_version) as 'configVersion'
|
||||
,if(qmp.price_status=1,qmc2.id,qmc1.id) as 'configId'
|
||||
<!-- ,if(qmp.price_status=1,qmc2.config_version,qmc1.config_version) as 'configVersion'-->
|
||||
,qmc1.id as 'configId'
|
||||
FROM quotation_model_config qmc1
|
||||
INNER JOIN product_model pm ON qmc1.model_id=pm.batch_number
|
||||
LEFT JOIN product_type pt on pm.type_number=pt.batch_number AND pt.state=1
|
||||
|
|
|
|||
Loading…
Reference in New Issue