refactor(quotation): 重构价格配置中的区域处理逻辑

- 移除 DynamicHeaderVO 中的 dataId 字段
- 将 ModelPriceSaveAreaRequest 中的 areaId 改为 areaCode,并使用 @NotBlank 注解
- 新增 NumberUtil 工具类用于数字格式化
- 在价格配置控制器中使用 areaCode 查找区域并进行验证
- 更新数据库操作逻辑以使用区域编码而非区域ID
- 添加区域不存在时的业务异常处理
This commit is contained in:
曹鹏飞 2026-02-25 09:36:46 +08:00
parent 101701f586
commit 79e877cb5e
4 changed files with 53 additions and 24 deletions

View File

@ -2,6 +2,7 @@ package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -9,10 +10,10 @@ import java.math.BigDecimal;
public class ModelPriceSaveAreaRequest { public class ModelPriceSaveAreaRequest {
/** /**
* 价格区域字典id * 区域编码
*/ */
@NotNull @NotBlank
private Long areaId; private String areaCode;
/** /**
* 价格 * 价格

View File

@ -19,11 +19,6 @@ public class DynamicHeaderVO {
*/ */
private String label; private String label;
/**
* 数据id
*/
private String dataId;
/** /**
* 是否显示 * 是否显示
*/ */

View File

@ -0,0 +1,13 @@
package com.nflg.mobilebroken.common.util;
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class NumberUtil {
private static final DecimalFormat df = new DecimalFormat("0.###");
public static String format(BigDecimal number) {
return df.format(number);
}
}

View File

@ -1,13 +1,10 @@
package com.nflg.mobilebroken.quotation.controller.admin; package com.nflg.mobilebroken.quotation.controller.admin;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.nflg.mobilebroken.common.constant.STATE; import com.nflg.mobilebroken.common.constant.STATE;
import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.PageData;
@ -18,6 +15,8 @@ import com.nflg.mobilebroken.common.pojo.vo.DynamicHeaderVO;
import com.nflg.mobilebroken.common.pojo.vo.ModelPriceConfigVO; import com.nflg.mobilebroken.common.pojo.vo.ModelPriceConfigVO;
import com.nflg.mobilebroken.common.util.AdminUserUtil; import com.nflg.mobilebroken.common.util.AdminUserUtil;
import com.nflg.mobilebroken.common.util.DateTimeUtil; import com.nflg.mobilebroken.common.util.DateTimeUtil;
import com.nflg.mobilebroken.common.util.NumberUtil;
import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.quotation.controller.ControllerBase; import com.nflg.mobilebroken.quotation.controller.ControllerBase;
import com.nflg.mobilebroken.repository.entity.*; import com.nflg.mobilebroken.repository.entity.*;
import com.nflg.mobilebroken.repository.service.*; import com.nflg.mobilebroken.repository.service.*;
@ -41,9 +40,6 @@ import java.util.stream.Collectors;
@RequestMapping("/price/config") @RequestMapping("/price/config")
public class PriceConfigController extends ControllerBase { public class PriceConfigController extends ControllerBase {
// private static final ObjectMapper objectMapper = new ObjectMapper()
// .registerModule(new JavaTimeModule())
// .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@Resource @Resource
private ObjectMapper objectMapper; private ObjectMapper objectMapper;
@ -83,7 +79,6 @@ public class PriceConfigController extends ControllerBase {
.map(area -> new DynamicHeaderVO() .map(area -> new DynamicHeaderVO()
.setProp(area.getCode()) .setProp(area.getCode())
.setLabel(area.getName()) .setLabel(area.getName())
.setDataId(area.getCode() + "Id")
) )
.collect(Collectors.toList()) .collect(Collectors.toList())
) )
@ -110,8 +105,7 @@ public class PriceConfigController extends ControllerBase {
}); });
if (CollectionUtil.isNotEmpty(it.getAreas())) { if (CollectionUtil.isNotEmpty(it.getAreas())) {
it.getAreas().forEach(area -> { it.getAreas().forEach(area -> {
map.put(area.getCode(), area.getCode()); map.put(area.getCode(), NumberUtil.format(area.getAmount()));
map.put(area.getCode() + "Id", area.getAreaId());
}); });
} }
return map; return map;
@ -130,6 +124,7 @@ public class PriceConfigController extends ControllerBase {
@Transactional @Transactional
@PostMapping("/save") @PostMapping("/save")
public ApiResult<Void> save(@Valid @RequestBody List<ModelPriceSaveRequest> datas) { public ApiResult<Void> save(@Valid @RequestBody List<ModelPriceSaveRequest> datas) {
List<DictionaryItem> dbAreas = dictionaryItemService.getListByDictionaryCode("DispatchCategory");
Map<Long, List<ModelPriceSaveRequest>> group = datas.stream().collect(Collectors.groupingBy(ModelPriceSaveRequest::getModelId)); Map<Long, List<ModelPriceSaveRequest>> group = datas.stream().collect(Collectors.groupingBy(ModelPriceSaveRequest::getModelId));
group.forEach((modelId, itemList) -> { group.forEach((modelId, itemList) -> {
QuotationModelPrice price = priceService.lambdaQuery() QuotationModelPrice price = priceService.lambdaQuery()
@ -161,8 +156,13 @@ public class PriceConfigController extends ControllerBase {
.setUpdateTime(LocalDateTime.now()); .setUpdateTime(LocalDateTime.now());
items.add(item); items.add(item);
for (ModelPriceSaveAreaRequest ait : it.getAreas()) { for (ModelPriceSaveAreaRequest ait : it.getAreas()) {
DictionaryItem ai = dbAreas.stream()
.filter(a -> a.getCode().equals(ait.getAreaCode()))
.findFirst()
.orElse(null);
VUtils.trueThrowBusinessError(Objects.isNull(ai)).throwMessage("找不到区域:" + ait.getAreaCode());
QuotationModelPriceItemArea area = new QuotationModelPriceItemArea() QuotationModelPriceItemArea area = new QuotationModelPriceItemArea()
.setAreaId(ait.getAreaId()) .setAreaId(ai.getId())
.setPriceId(price.getId()) .setPriceId(price.getId())
.setPriceItemId(item.getId()) .setPriceItemId(item.getId())
.setAmount(ait.getAmount()); .setAmount(ait.getAmount());
@ -206,8 +206,13 @@ public class PriceConfigController extends ControllerBase {
.setUpdateTime(LocalDateTime.now()); .setUpdateTime(LocalDateTime.now());
itemsForAdd.add(item); itemsForAdd.add(item);
for (ModelPriceSaveAreaRequest ait : sit.getAreas()) { for (ModelPriceSaveAreaRequest ait : sit.getAreas()) {
DictionaryItem ai = dbAreas.stream()
.filter(a -> a.getCode().equals(ait.getAreaCode()))
.findFirst()
.orElse(null);
VUtils.trueThrowBusinessError(Objects.isNull(ai)).throwMessage("找不到区域:" + ait.getAreaCode());
areasForAdd.add(new QuotationModelPriceItemArea() areasForAdd.add(new QuotationModelPriceItemArea()
.setAreaId(ait.getAreaId()) .setAreaId(ai.getId())
.setPriceId(price.getId()) .setPriceId(price.getId())
.setPriceItemId(item.getId()) .setPriceItemId(item.getId())
.setAmount(ait.getAmount())); .setAmount(ait.getAmount()));
@ -219,15 +224,20 @@ public class PriceConfigController extends ControllerBase {
itemsForUpdate.add(item); itemsForUpdate.add(item);
QuotationModelPriceItem finalItem = item; QuotationModelPriceItem finalItem = item;
for (ModelPriceSaveAreaRequest ait : sit.getAreas()) { for (ModelPriceSaveAreaRequest ait : sit.getAreas()) {
DictionaryItem ai = dbAreas.stream()
.filter(a -> a.getCode().equals(ait.getAreaCode()))
.findFirst()
.orElse(null);
VUtils.trueThrowBusinessError(Objects.isNull(ai)).throwMessage("找不到区域:" + ait.getAreaCode());
QuotationModelPriceItemArea area = areas.stream() QuotationModelPriceItemArea area = areas.stream()
.filter(it -> it.getPriceItemId().equals(finalItem.getId()) .filter(it -> it.getPriceItemId().equals(finalItem.getId())
&& it.getAreaId().equals(ait.getAreaId()) && it.getAreaId().equals(ai.getId())
) )
.findFirst() .findFirst()
.orElse(null); .orElse(null);
if (Objects.isNull(area)) { if (Objects.isNull(area)) {
areasForAdd.add(new QuotationModelPriceItemArea() areasForAdd.add(new QuotationModelPriceItemArea()
.setAreaId(ait.getAreaId()) .setAreaId(ai.getId())
.setPriceId(price.getId()) .setPriceId(price.getId())
.setPriceItemId(item.getId()) .setPriceItemId(item.getId())
.setAmount(ait.getAmount())); .setAmount(ait.getAmount()));
@ -278,8 +288,13 @@ public class PriceConfigController extends ControllerBase {
.filter(area -> area.getPriceItemId().equals(dbItem.getId())) .filter(area -> area.getPriceItemId().equals(dbItem.getId()))
.collect(Collectors.toList()); .collect(Collectors.toList());
for (ModelPriceSaveAreaRequest ait : sit.getAreas()) { for (ModelPriceSaveAreaRequest ait : sit.getAreas()) {
DictionaryItem ai = dbAreas.stream()
.filter(a -> a.getCode().equals(ait.getAreaCode()))
.findFirst()
.orElse(null);
VUtils.trueThrowBusinessError(Objects.isNull(ai)).throwMessage("找不到区域:" + ait.getAreaCode());
QuotationModelPriceItemArea area = areas.stream() QuotationModelPriceItemArea area = areas.stream()
.filter(it -> it.getAreaId().equals(ait.getAreaId())) .filter(it -> it.getAreaId().equals(ai.getId()))
.findFirst() .findFirst()
.orElse(null); .orElse(null);
if (Objects.nonNull(area)) { if (Objects.nonNull(area)) {
@ -289,7 +304,7 @@ public class PriceConfigController extends ControllerBase {
areasForAdd.add(area); areasForAdd.add(area);
} else { } else {
areasForAdd.add(new QuotationModelPriceItemArea() areasForAdd.add(new QuotationModelPriceItemArea()
.setAreaId(ait.getAreaId()) .setAreaId(ai.getId())
.setPriceId(price.getId()) .setPriceId(price.getId())
.setPriceItemId(dbItem.getId()) .setPriceItemId(dbItem.getId())
.setAmount(ait.getAmount())); .setAmount(ait.getAmount()));
@ -305,8 +320,13 @@ public class PriceConfigController extends ControllerBase {
.setUpdateTime(LocalDateTime.now()); .setUpdateTime(LocalDateTime.now());
itemsForAdd.add(item); itemsForAdd.add(item);
for (ModelPriceSaveAreaRequest ait : sit.getAreas()) { for (ModelPriceSaveAreaRequest ait : sit.getAreas()) {
DictionaryItem ai = dbAreas.stream()
.filter(a -> a.getCode().equals(ait.getAreaCode()))
.findFirst()
.orElse(null);
VUtils.trueThrowBusinessError(Objects.isNull(ai)).throwMessage("找不到区域:" + ait.getAreaCode());
areasForAdd.add(new QuotationModelPriceItemArea() areasForAdd.add(new QuotationModelPriceItemArea()
.setAreaId(ait.getAreaId()) .setAreaId(ai.getId())
.setPriceId(price.getId()) .setPriceId(price.getId())
.setPriceItemId(item.getId()) .setPriceItemId(item.getId())
.setAmount(ait.getAmount())); .setAmount(ait.getAmount()));