From 03d166d8af6425ca461575fc0bca575598efa367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Fri, 3 Apr 2026 09:26:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(quotation):=20=E6=96=B0=E5=A2=9E=E6=9C=BA?= =?UTF-8?q?=E5=9E=8B=E9=85=8D=E7=BD=AE=E7=AE=A1=E7=90=86=E5=92=8C=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E6=9C=8D=E5=8A=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建IProductModelParamsItemService接口定义参数项服务方法 - 实现ModelConfigController控制器提供机型配置的增删改查功能 - 添加ModelConfigItemAddRequest和ModelConfigItemUpdateRequest请求对象 - 定义ModelConfigItemLanguageVO视图对象用于多语言配置展示 - 扩展ModelConfigEffectiveDTO增加分组名称字段支持 - 实现配置项的树形结构查询和层级关系处理逻辑 - 添加配置项的启用禁用状态管理功能 - 实现配置项的发布流程和版本控制机制 - 集成多语言翻译服务支持国际化配置 - 添加从产品中心同步部件参数的功能实现 --- .../pojo/dto/ModelConfigEffectiveDTO.java | 5 + .../common/pojo/vo/ModelPriceConfigVO.java | 16 +- .../quotation/ModelConfigItemLanguageVO.java | 5 + .../admin/ModelConfigController.java | 304 +++++++++++++++++- .../controller/app/ShoppingController.java | 37 ++- .../request/ModelConfigItemAddRequest.java | 9 +- .../request/ModelConfigItemUpdateRequest.java | 10 + .../pojo/vo/ShoppingCartPartGroupVO.java | 18 ++ .../quotation/pojo/vo/ShoppingCartPartVO.java | 9 +- .../quotation/pojo/vo/ShoppingCartVO.java | 5 - .../entity/QuotationModelConfigItem.java | 5 + .../mapper/ProductModelParamsItemMapper.java | 3 + .../IProductModelParamsItemService.java | 2 + .../ProductModelParamsItemServiceImpl.java | 6 + .../impl/QuotationModelPriceServiceImpl.java | 23 +- .../mapper/ProductModelParamsItemMapper.xml | 10 +- .../mapper/QuotationModelConfigMapper.xml | 4 +- .../mapper/QuotationModelPriceMapper.xml | 4 +- 18 files changed, 433 insertions(+), 42 deletions(-) create mode 100644 nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartPartGroupVO.java diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/ModelConfigEffectiveDTO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/ModelConfigEffectiveDTO.java index 33e8d076..1366627b 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/ModelConfigEffectiveDTO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/ModelConfigEffectiveDTO.java @@ -47,4 +47,9 @@ public class ModelConfigEffectiveDTO { */ @JsonProperty("hasSelect") private Boolean hasSelect; + + /** + * 分组名称,同组的可选配置替换 + */ + private String groupName; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelPriceConfigVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelPriceConfigVO.java index ca8593f8..5084f151 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelPriceConfigVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelPriceConfigVO.java @@ -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 areas; @JsonIgnore - private List children=new ArrayList<>(); + private List children = new ArrayList<>(); } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/quotation/ModelConfigItemLanguageVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/quotation/ModelConfigItemLanguageVO.java index d1f48db4..8f6ba65c 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/quotation/ModelConfigItemLanguageVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/quotation/ModelConfigItemLanguageVO.java @@ -79,5 +79,10 @@ public class ModelConfigItemLanguageVO { */ private LocalDateTime updateTime; + /** + * 分组名称,同组的可选配置替换 + */ + private String groupName; + private List children; } diff --git a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/ModelConfigController.java b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/ModelConfigController.java index 6df66fd9..82f1d386 100644 --- a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/ModelConfigController.java +++ b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/ModelConfigController.java @@ -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 addItem(@Valid @RequestBody ModelConfigItemAddRequest request) { + VUtils.trueThrowBusinessError(!Objects.equals(request.getParentId(), 0L) + && Objects.isNull(request.getOptionalType()) + ).throwMessage("选配类别不能为空"); List 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 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> syncPartFromProductModel(@RequestParam Long configId) { + List paramsItems = productModelParamsItemService.getForQuotation(configId); + VUtils.trueThrowBusinessError(CollectionUtil.isEmpty(paramsItems)).throwMessage("机型尚未配置参数"); + List 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 newItems = new ArrayList<>(); + List newItemsLanguages = new ArrayList<>(); + List 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 dbItems = modelConfigItemService.lambdaQuery() + .eq(QuotationModelConfigItem::getConfigId, configId) + .list(); + List dbLanguagesItem = modelConfigItemLanguageService.lambdaQuery() + .eq(QuotationModelConfigItemLanguage::getConfigId, configId) + .list(); + List itemsForAdd = new ArrayList<>(); + List 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 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 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()); + } } \ No newline at end of file diff --git a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/app/ShoppingController.java b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/app/ShoppingController.java index 74773ad6..2df82478 100644 --- a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/app/ShoppingController.java +++ b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/app/ShoppingController.java @@ -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 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()); } //获取部件配置 diff --git a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/request/ModelConfigItemAddRequest.java b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/request/ModelConfigItemAddRequest.java index 634cc3cb..3b63792f 100644 --- a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/request/ModelConfigItemAddRequest.java +++ b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/request/ModelConfigItemAddRequest.java @@ -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; } diff --git a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/request/ModelConfigItemUpdateRequest.java b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/request/ModelConfigItemUpdateRequest.java index aac8f0fa..9a3eed04 100644 --- a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/request/ModelConfigItemUpdateRequest.java +++ b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/request/ModelConfigItemUpdateRequest.java @@ -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; } diff --git a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartPartGroupVO.java b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartPartGroupVO.java new file mode 100644 index 00000000..9b267941 --- /dev/null +++ b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartPartGroupVO.java @@ -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 items; +} diff --git a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartPartVO.java b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartPartVO.java index 41b2dc85..67680681 100644 --- a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartPartVO.java +++ b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartPartVO.java @@ -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 children; + /** + * 分组名称 + */ + @JsonIgnore + private String groupName; + + private List children; } diff --git a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartVO.java b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartVO.java index 1081aaf4..0f7f0d95 100644 --- a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartVO.java +++ b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/pojo/vo/ShoppingCartVO.java @@ -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; diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelConfigItem.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelConfigItem.java index a6733ab7..2647cd2a 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelConfigItem.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelConfigItem.java @@ -68,4 +68,9 @@ public class QuotationModelConfigItem implements Serializable { * 唯一id,不随版本变化 */ private Long uniqueId; + + /** + * 分组名称,同组的可选配置替换 + */ + private String groupName; } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsItemMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsItemMapper.java index 3f1f6017..6b86d668 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsItemMapper.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsItemMapper.java @@ -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; + /** *

* 产品中心-机型-参数 Mapper 接口 @@ -13,4 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface ProductModelParamsItemMapper extends BaseMapper { + List getForQuotation(Long configId); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsItemService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsItemService.java index 54ede619..7b4674ed 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsItemService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsItemService.java @@ -43,4 +43,6 @@ public interface IProductModelParamsItemService extends IService getForQuotation(Long configId); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsItemServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsItemServiceImpl.java index 9f4c44cf..0d0d9371 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsItemServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsItemServiceImpl.java @@ -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 getForQuotation(Long configId) { + return baseMapper.getForQuotation(configId); + } } \ No newline at end of file diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelPriceServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelPriceServiceImpl.java index a2ce5ea3..05804ae6 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelPriceServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelPriceServiceImpl.java @@ -60,19 +60,27 @@ public class QuotationModelPriceServiceImpl extends ServiceImpl configItems = configItemService.lambdaQuery() .in(QuotationModelConfigItem::getConfigId, configIds) .list(); + configItems.removeIf(it -> it.getParentId() > 0 && Objects.equals(it.getType(), 1)); + List 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 priceIds = pdata.getRecords().stream() .map(ModelPriceConfigVO::getPriceId) .filter(Objects::nonNull) .collect(Collectors.toList()); List priceItems = CollectionUtil.isEmpty(priceIds) ? new ArrayList<>() : priceItemService.lambdaQuery() - .in(QuotationModelPriceItem::getPriceId, priceIds) - .list(); + .in(QuotationModelPriceItem::getPriceId, priceIds) + .list(); List areas = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY); pdata.getRecords().forEach(data -> { List 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 items , List priceItems, List areaPrices, List 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 new ModelPriceConfigAreaVO() - .setAreaId(area.getId()) - .setCode(area.getCode()) + .setAreaId(area.getId()) + .setCode(area.getCode()) // .setAreaName(area.getName()) ) .collect(Collectors.toList()) diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/ProductModelParamsItemMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/ProductModelParamsItemMapper.xml index 1e079237..633ff3b9 100644 --- a/nflg-mobilebroken-repository/src/main/resources/mapper/ProductModelParamsItemMapper.xml +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/ProductModelParamsItemMapper.xml @@ -2,4 +2,12 @@ - + + \ No newline at end of file diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelConfigMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelConfigMapper.xml index 1849d89d..e564183b 100644 --- a/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelConfigMapper.xml +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelConfigMapper.xml @@ -28,7 +28,8 @@ diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelPriceMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelPriceMapper.xml index bebb2ab6..7a6ddf23 100644 --- a/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelPriceMapper.xml +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelPriceMapper.xml @@ -5,8 +5,8 @@