feat(quotation): 新增机型配置管理和参数服务功能

- 创建IProductModelParamsItemService接口定义参数项服务方法
- 实现ModelConfigController控制器提供机型配置的增删改查功能
- 添加ModelConfigItemAddRequest和ModelConfigItemUpdateRequest请求对象
- 定义ModelConfigItemLanguageVO视图对象用于多语言配置展示
- 扩展ModelConfigEffectiveDTO增加分组名称字段支持
- 实现配置项的树形结构查询和层级关系处理逻辑
- 添加配置项的启用禁用状态管理功能
- 实现配置项的发布流程和版本控制机制
- 集成多语言翻译服务支持国际化配置
- 添加从产品中心同步部件参数的功能实现
This commit is contained in:
曹鹏飞 2026-04-03 09:26:01 +08:00
parent f37d334641
commit 03d166d8af
18 changed files with 433 additions and 42 deletions

View File

@ -47,4 +47,9 @@ public class ModelConfigEffectiveDTO {
*/
@JsonProperty("hasSelect")
private Boolean hasSelect;
/**
* 分组名称同组的可选配置替换
*/
private String groupName;
}

View File

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

View File

@ -79,5 +79,10 @@ public class ModelConfigItemLanguageVO {
*/
private LocalDateTime updateTime;
/**
* 分组名称同组的可选配置替换
*/
private String groupName;
private List<ModelConfigItemLanguageVO> children;
}

View File

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

View File

@ -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());
}
//获取部件配置

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -68,4 +68,9 @@ public class QuotationModelConfigItem implements Serializable {
* 唯一id不随版本变化
*/
private Long uniqueId;
/**
* 分组名称同组的可选配置替换
*/
private String groupName;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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