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 javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@ -9,10 +10,10 @@ import java.math.BigDecimal;
public class ModelPriceSaveAreaRequest {
/**
* 价格区域字典id
* 区域编码
*/
@NotNull
private Long areaId;
@NotBlank
private String areaCode;
/**
* 价格

View File

@ -19,11 +19,6 @@ public class DynamicHeaderVO {
*/
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;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fasterxml.jackson.core.type.TypeReference;
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.pojo.ApiResult;
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.util.AdminUserUtil;
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.repository.entity.*;
import com.nflg.mobilebroken.repository.service.*;
@ -41,9 +40,6 @@ import java.util.stream.Collectors;
@RequestMapping("/price/config")
public class PriceConfigController extends ControllerBase {
// private static final ObjectMapper objectMapper = new ObjectMapper()
// .registerModule(new JavaTimeModule())
// .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@Resource
private ObjectMapper objectMapper;
@ -83,7 +79,6 @@ public class PriceConfigController extends ControllerBase {
.map(area -> new DynamicHeaderVO()
.setProp(area.getCode())
.setLabel(area.getName())
.setDataId(area.getCode() + "Id")
)
.collect(Collectors.toList())
)
@ -110,8 +105,7 @@ public class PriceConfigController extends ControllerBase {
});
if (CollectionUtil.isNotEmpty(it.getAreas())) {
it.getAreas().forEach(area -> {
map.put(area.getCode(), area.getCode());
map.put(area.getCode() + "Id", area.getAreaId());
map.put(area.getCode(), NumberUtil.format(area.getAmount()));
});
}
return map;
@ -130,6 +124,7 @@ public class PriceConfigController extends ControllerBase {
@Transactional
@PostMapping("/save")
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));
group.forEach((modelId, itemList) -> {
QuotationModelPrice price = priceService.lambdaQuery()
@ -161,8 +156,13 @@ public class PriceConfigController extends ControllerBase {
.setUpdateTime(LocalDateTime.now());
items.add(item);
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()
.setAreaId(ait.getAreaId())
.setAreaId(ai.getId())
.setPriceId(price.getId())
.setPriceItemId(item.getId())
.setAmount(ait.getAmount());
@ -206,8 +206,13 @@ public class PriceConfigController extends ControllerBase {
.setUpdateTime(LocalDateTime.now());
itemsForAdd.add(item);
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()
.setAreaId(ait.getAreaId())
.setAreaId(ai.getId())
.setPriceId(price.getId())
.setPriceItemId(item.getId())
.setAmount(ait.getAmount()));
@ -219,15 +224,20 @@ public class PriceConfigController extends ControllerBase {
itemsForUpdate.add(item);
QuotationModelPriceItem finalItem = item;
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()
.filter(it -> it.getPriceItemId().equals(finalItem.getId())
&& it.getAreaId().equals(ait.getAreaId())
&& it.getAreaId().equals(ai.getId())
)
.findFirst()
.orElse(null);
if (Objects.isNull(area)) {
areasForAdd.add(new QuotationModelPriceItemArea()
.setAreaId(ait.getAreaId())
.setAreaId(ai.getId())
.setPriceId(price.getId())
.setPriceItemId(item.getId())
.setAmount(ait.getAmount()));
@ -278,8 +288,13 @@ public class PriceConfigController extends ControllerBase {
.filter(area -> area.getPriceItemId().equals(dbItem.getId()))
.collect(Collectors.toList());
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()
.filter(it -> it.getAreaId().equals(ait.getAreaId()))
.filter(it -> it.getAreaId().equals(ai.getId()))
.findFirst()
.orElse(null);
if (Objects.nonNull(area)) {
@ -289,7 +304,7 @@ public class PriceConfigController extends ControllerBase {
areasForAdd.add(area);
} else {
areasForAdd.add(new QuotationModelPriceItemArea()
.setAreaId(ait.getAreaId())
.setAreaId(ai.getId())
.setPriceId(price.getId())
.setPriceItemId(dbItem.getId())
.setAmount(ait.getAmount()));
@ -305,8 +320,13 @@ public class PriceConfigController extends ControllerBase {
.setUpdateTime(LocalDateTime.now());
itemsForAdd.add(item);
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()
.setAreaId(ait.getAreaId())
.setAreaId(ai.getId())
.setPriceId(price.getId())
.setPriceItemId(item.getId())
.setAmount(ait.getAmount()));