feat(quotation): 添加折扣配置功能并优化价格配置
- 新增折扣配置控制器和相关VO类 - 添加直销类别字典常量 - 优化价格配置搜索方法使用统一的API返回格式 - 添加部门负责人验证逻辑防止重复设置 - 修复代码中的空格格式问题 - 更新价格配置保存逻辑支持区域价格设置 - 添加批次号字段到产品模型搜索VO - 修改代码生成器目标表名为折扣区域配置表
This commit is contained in:
parent
79e877cb5e
commit
5264fbc0d6
|
|
@ -144,6 +144,12 @@ public class AdminUserController extends ControllerBase {
|
||||||
.eq(TBaseDepartment::isHasManager, false)
|
.eq(TBaseDepartment::isHasManager, false)
|
||||||
.eq(TBaseDepartment::getId, request.getDepartmentId())
|
.eq(TBaseDepartment::getId, request.getDepartmentId())
|
||||||
.update();
|
.update();
|
||||||
|
VUtils.trueThrowBusinessError(departmentService.lambdaQuery()
|
||||||
|
.eq(TBaseDepartment::getId, request.getDepartmentId())
|
||||||
|
.eq(TBaseDepartment::isHasManager, true)
|
||||||
|
.exists()
|
||||||
|
)
|
||||||
|
.throwMessage("部门已存在负责人");
|
||||||
}
|
}
|
||||||
user.setUserCode(request.getUserCode())
|
user.setUserCode(request.getUserCode())
|
||||||
.setUserName(request.getUserName())
|
.setUserName(request.getUserName())
|
||||||
|
|
@ -154,6 +160,7 @@ public class AdminUserController extends ControllerBase {
|
||||||
.setProductLine(request.getProductLine())
|
.setProductLine(request.getProductLine())
|
||||||
.setGongFuHandler(request.isGongFuHandler())
|
.setGongFuHandler(request.isGongFuHandler())
|
||||||
.setGongfu(StrUtil.contains(request.getProductLine(), Constant.MOBILE_BROKEN))
|
.setGongfu(StrUtil.contains(request.getProductLine(), Constant.MOBILE_BROKEN))
|
||||||
|
.setCategoryId(request.getCategoryId())
|
||||||
.setUpdateBy(AdminUserUtil.getUserId())
|
.setUpdateBy(AdminUserUtil.getUserId())
|
||||||
.setUpdateTime(LocalDateTime.now());
|
.setUpdateTime(LocalDateTime.now());
|
||||||
if (!Objects.equals(user.getState(), UserState.ToBeActivated.getState()) && Objects.nonNull(request.getEnable())) {
|
if (!Objects.equals(user.getState(), UserState.ToBeActivated.getState()) && Objects.nonNull(request.getEnable())) {
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,7 @@ public class BaseAreaController extends ControllerBase {
|
||||||
oldEnt.setDataModifyUserNo(AdminUserUtil.getUserNo());
|
oldEnt.setDataModifyUserNo(AdminUserUtil.getUserNo());
|
||||||
oldEnt.setDataModifyUserName(AdminUserUtil.getUserName());
|
oldEnt.setDataModifyUserName(AdminUserUtil.getUserName());
|
||||||
oldEnt.setDataModifyTime(LocalDateTime.now());
|
oldEnt.setDataModifyTime(LocalDateTime.now());
|
||||||
|
oldEnt.setCategoryId(baseAreaEditDTO.getCategoryId());
|
||||||
baseAreaService.updateById(oldEnt);
|
baseAreaService.updateById(oldEnt);
|
||||||
return ApiResult.success(true);
|
return ApiResult.success(true);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -143,4 +143,9 @@ public class Constant {
|
||||||
* 移动破产品线名称
|
* 移动破产品线名称
|
||||||
*/
|
*/
|
||||||
public static final String MOBILE_BROKEN = "移动破碎";
|
public static final String MOBILE_BROKEN = "移动破碎";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字典-直销类别
|
||||||
|
*/
|
||||||
|
public static final String DICTIONARY_DIRECT_SALES_CATEGORY ="DirectSalesCategory";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,10 @@ import lombok.Data;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class ApiResult<T> implements Serializable {
|
public class ApiResult<T> implements Serializable {
|
||||||
|
|
@ -60,6 +64,19 @@ public class ApiResult<T> implements Serializable {
|
||||||
return vo;
|
return vo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T,D> ApiResult<PageData<D>> success(IPage<T> page, Function<T, D> converter) {
|
||||||
|
ApiResult<PageData<D>> vo = new ApiResult<>();
|
||||||
|
PageData<D> pageData = new PageData<>();
|
||||||
|
pageData.setPage((int) page.getCurrent());
|
||||||
|
pageData.setPageSize((int) page.getSize());
|
||||||
|
pageData.setTotal((int) page.getTotal());
|
||||||
|
pageData.setItems(page.getRecords().stream().map(converter).collect(Collectors.toList()));
|
||||||
|
vo.setCode(STATE.Success.getState());
|
||||||
|
vo.setType(STATE.Success.getType());
|
||||||
|
vo.setResult(pageData);
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
|
||||||
public static <T> ApiResult<T> error(int state, String msg, T value) {
|
public static <T> ApiResult<T> error(int state, String msg, T value) {
|
||||||
ApiResult<T> vo = new ApiResult<>();
|
ApiResult<T> vo = new ApiResult<>();
|
||||||
vo.result = value;
|
vo.result = value;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
package com.nflg.mobilebroken.common.pojo.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ModelDiscountConfigAreaVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 价格区域,字典id
|
||||||
|
*/
|
||||||
|
private Long areaId;
|
||||||
|
|
||||||
|
private String code;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 价格区域名称
|
||||||
|
*/
|
||||||
|
private String areaName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 折扣,如0.95
|
||||||
|
*/
|
||||||
|
private BigDecimal ratio;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 折扣开始时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime discountStartDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 折扣结束时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime discountEndDate;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
package com.nflg.mobilebroken.common.pojo.vo;
|
||||||
|
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class ModelDiscountConfigVO {
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机型表batch_number
|
||||||
|
*/
|
||||||
|
private Long modelId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系列名称
|
||||||
|
*/
|
||||||
|
private String seriesName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 类型名称
|
||||||
|
*/
|
||||||
|
private String typeName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机型编号
|
||||||
|
*/
|
||||||
|
private String modelNo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 价格配置id
|
||||||
|
*/
|
||||||
|
@JsonIgnore
|
||||||
|
private Long priceId;
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
private List<ModelDiscountConfigAreaVO> areas;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新人
|
||||||
|
*/
|
||||||
|
private String updateBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime updateTime;
|
||||||
|
}
|
||||||
|
|
@ -9,7 +9,7 @@ import java.math.BigDecimal;
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
public class ModelPriceConfigAreaVO {
|
public class ModelPriceConfigAreaVO {
|
||||||
|
|
||||||
private Long id;
|
// private Long id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 价格区域,字典id
|
* 价格区域,字典id
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,11 @@ public class ProductModelSearchVO {
|
||||||
*/
|
*/
|
||||||
private String typeNumber;
|
private String typeNumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批次号
|
||||||
|
*/
|
||||||
|
private Long batchNumber;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 型号
|
* 型号
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,138 @@
|
||||||
|
package com.nflg.mobilebroken.quotation.controller.admin;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.nflg.mobilebroken.common.constant.Constant;
|
||||||
|
import com.nflg.mobilebroken.common.constant.STATE;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.ApiResult;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.PageData;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.request.ModelConfigSearchRequest;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.request.ModelPriceSaveRequest;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.vo.DynamicHeaderVO;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.vo.ModelDiscountConfigVO;
|
||||||
|
import com.nflg.mobilebroken.common.util.DateTimeUtil;
|
||||||
|
import com.nflg.mobilebroken.common.util.NumberUtil;
|
||||||
|
import com.nflg.mobilebroken.quotation.controller.ControllerBase;
|
||||||
|
import com.nflg.mobilebroken.repository.entity.DictionaryItem;
|
||||||
|
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountArea;
|
||||||
|
import com.nflg.mobilebroken.repository.entity.QuotationModelPriceItemArea;
|
||||||
|
import com.nflg.mobilebroken.repository.service.IDictionaryItemService;
|
||||||
|
import com.nflg.mobilebroken.repository.service.IQuotationModelDiscountAreaService;
|
||||||
|
import com.nflg.mobilebroken.repository.service.IQuotationModelDiscountService;
|
||||||
|
import com.nflg.mobilebroken.repository.service.IQuotationModelPriceItemAreaService;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 折扣配置
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/discount/config")
|
||||||
|
public class DiscountConfigController extends ControllerBase {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ObjectMapper objectMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IDictionaryItemService dictionaryItemService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IQuotationModelDiscountService discountService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IQuotationModelDiscountAreaService discountAreaService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IQuotationModelPriceItemAreaService priceItemAreaService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取动态表头
|
||||||
|
*/
|
||||||
|
@GetMapping("/headers")
|
||||||
|
public ApiResult<List<DynamicHeaderVO>> getHeaders() {
|
||||||
|
List<DynamicHeaderVO> vos = new ArrayList<>();
|
||||||
|
vos.add(new DynamicHeaderVO().setProp("modelId").setLabel("modelId").setKey(true).setShow(false));
|
||||||
|
vos.add(new DynamicHeaderVO().setProp("modelNo").setLabel("产品机型"));
|
||||||
|
vos.add(new DynamicHeaderVO().setProp("seriesName").setLabel("产品系列"));
|
||||||
|
vos.add(new DynamicHeaderVO().setProp("typeName").setLabel("产品类型"));
|
||||||
|
List<DictionaryItem> areas = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY);
|
||||||
|
areas.forEach(area -> {
|
||||||
|
vos.add(new DynamicHeaderVO().setProp(area.getCode()).setLabel(area.getName())
|
||||||
|
.setChildren(
|
||||||
|
List.of(new DynamicHeaderVO().setProp(area.getCode() + "_price").setLabel("标配保护价")
|
||||||
|
, new DynamicHeaderVO().setProp(area.getCode() + "_ratio").setLabel("折扣系数")
|
||||||
|
, new DynamicHeaderVO().setProp(area.getCode() + "_discount_price").setLabel("折扣系数")
|
||||||
|
, new DynamicHeaderVO().setProp(area.getCode() + "_start").setLabel("折扣开始时间")
|
||||||
|
, new DynamicHeaderVO().setProp(area.getCode() + "_end").setLabel("折扣结束时间")
|
||||||
|
, new DynamicHeaderVO().setProp(area.getCode() + "_days").setLabel("折扣天数")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
vos.add(new DynamicHeaderVO().setProp("apply").setLabel("折扣对象"));
|
||||||
|
vos.add(new DynamicHeaderVO().setProp("updateBy").setLabel("设置人"));
|
||||||
|
vos.add(new DynamicHeaderVO().setProp("updateTime").setLabel("设置时间"));
|
||||||
|
return ApiResult.success(vos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 搜索
|
||||||
|
*/
|
||||||
|
@PostMapping("/search")
|
||||||
|
public ApiResult<PageData<Map<String, Object>>> search(@Valid @RequestBody ModelConfigSearchRequest request) {
|
||||||
|
IPage<ModelDiscountConfigVO> pdata = discountService.search(request);
|
||||||
|
if (CollectionUtil.isEmpty(pdata.getRecords())) {
|
||||||
|
return ApiResult.success(PageData.empty());
|
||||||
|
}
|
||||||
|
List<DictionaryItem> areas = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY);
|
||||||
|
List<QuotationModelPriceItemArea> modelPrices = priceItemAreaService.lambdaQuery()
|
||||||
|
.eq(QuotationModelPriceItemArea::getPriceItemId, 0)
|
||||||
|
.in(QuotationModelPriceItemArea::getPriceId, pdata.getRecords().stream().map(ModelDiscountConfigVO::getPriceId).collect(Collectors.toList()))
|
||||||
|
.list();
|
||||||
|
List<QuotationModelDiscountArea> discountAreas = discountAreaService.lambdaQuery()
|
||||||
|
.in(QuotationModelDiscountArea::getDiscountId, pdata.getRecords().stream().map(ModelDiscountConfigVO::getId).collect(Collectors.toList()))
|
||||||
|
.list();
|
||||||
|
return ApiResult.success(pdata,data->{
|
||||||
|
Map<String, Object> map = objectMapper.convertValue(data, new TypeReference<>() {
|
||||||
|
});
|
||||||
|
areas.forEach(area -> {
|
||||||
|
QuotationModelPriceItemArea modelPrice = modelPrices.stream()
|
||||||
|
.filter(price -> price.getAreaId().equals(area.getId()))
|
||||||
|
.findFirst()
|
||||||
|
.get();
|
||||||
|
map.put(area.getCode() + "_price", modelPrice.getAmount());
|
||||||
|
QuotationModelDiscountArea discountArea = discountAreas.stream()
|
||||||
|
.filter(price -> price.getAreaId().equals(area.getId()))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
BigDecimal ratio = Optional.ofNullable(discountArea).map(QuotationModelDiscountArea::getRatio).orElse(BigDecimal.ONE);
|
||||||
|
map.put(area.getCode() + "_ratio", NumberUtil.format(ratio));
|
||||||
|
map.put(area.getCode() + "_discount_price", NumberUtil.format(ratio.multiply(modelPrice.getAmount())));
|
||||||
|
map.put(area.getCode() + "_start", DateTimeUtil.format(Optional.ofNullable(discountArea).map(QuotationModelDiscountArea::getDiscountStartDate).orElse(null), "yyyy-MM-dd"));
|
||||||
|
map.put(area.getCode() + "_end", DateTimeUtil.format(Optional.ofNullable(discountArea).map(QuotationModelDiscountArea::getDiscountEndDate).orElse(null), "yyyy-MM-dd"));
|
||||||
|
map.put(area.getCode() + "_days", Optional.ofNullable(discountArea).map(QuotationModelDiscountArea::getDays).orElse(null));
|
||||||
|
});
|
||||||
|
return map;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * 保存
|
||||||
|
// */
|
||||||
|
// @Transactional
|
||||||
|
// @PostMapping("/save")
|
||||||
|
// public ApiResult<Void> save(@Valid @RequestBody List<ModelDiscountSaveRequest> datas) {
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
@ -5,6 +5,7 @@ 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.nflg.mobilebroken.common.constant.Constant;
|
||||||
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;
|
||||||
|
|
@ -72,7 +73,7 @@ public class PriceConfigController extends ControllerBase {
|
||||||
vos.add(new DynamicHeaderVO().setProp("priceStatusDesc").setLabel("单价版本状态"));
|
vos.add(new DynamicHeaderVO().setProp("priceStatusDesc").setLabel("单价版本状态"));
|
||||||
vos.add(new DynamicHeaderVO().setProp("typeDesc").setLabel("配置类别"));
|
vos.add(new DynamicHeaderVO().setProp("typeDesc").setLabel("配置类别"));
|
||||||
vos.add(new DynamicHeaderVO().setProp("optionalTypeDesc").setLabel("配置单价类型"));
|
vos.add(new DynamicHeaderVO().setProp("optionalTypeDesc").setLabel("配置单价类型"));
|
||||||
List<DictionaryItem> areas = dictionaryItemService.getListByDictionaryCode("DispatchCategory");
|
List<DictionaryItem> areas = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY);
|
||||||
vos.add(new DynamicHeaderVO().setProp("").setLabel("保护价(¥)")
|
vos.add(new DynamicHeaderVO().setProp("").setLabel("保护价(¥)")
|
||||||
.setChildren(
|
.setChildren(
|
||||||
areas.stream()
|
areas.stream()
|
||||||
|
|
@ -89,33 +90,20 @@ public class PriceConfigController extends ControllerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取机型价格配置列表
|
* 搜索
|
||||||
*/
|
*/
|
||||||
@PostMapping("/search")
|
@PostMapping("/search")
|
||||||
public ApiResult<PageData<Map<String, Object>>> search(@Valid @RequestBody ModelConfigSearchRequest request) {
|
public ApiResult<PageData<Map<String, Object>>> search(@Valid @RequestBody ModelConfigSearchRequest request) {
|
||||||
IPage<ModelPriceConfigVO> pdata = priceService.search(request);
|
return ApiResult.success(priceService.search(request), data -> {
|
||||||
ApiResult<PageData<Map<String, Object>>> vo = new ApiResult<>();
|
Map<String, Object> map = objectMapper.convertValue(data, new TypeReference<>() {
|
||||||
PageData<Map<String, Object>> pageData = new PageData<>();
|
|
||||||
pageData.setPage((int) pdata.getCurrent());
|
|
||||||
pageData.setPageSize((int) pdata.getSize());
|
|
||||||
pageData.setTotal((int) pdata.getTotal());
|
|
||||||
pageData.setItems(pdata.getRecords().stream()
|
|
||||||
.map(it -> {
|
|
||||||
Map<String, Object> map = objectMapper.convertValue(it, new TypeReference<>() {
|
|
||||||
});
|
});
|
||||||
if (CollectionUtil.isNotEmpty(it.getAreas())) {
|
if (CollectionUtil.isNotEmpty(data.getAreas())) {
|
||||||
it.getAreas().forEach(area -> {
|
data.getAreas().forEach(area -> {
|
||||||
map.put(area.getCode(), NumberUtil.format(area.getAmount()));
|
map.put(area.getCode(), NumberUtil.format(area.getAmount()));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
})
|
});
|
||||||
.collect(Collectors.toList())
|
|
||||||
);
|
|
||||||
vo.setCode(STATE.Success.getState());
|
|
||||||
vo.setType(STATE.Success.getType());
|
|
||||||
vo.setResult(pageData);
|
|
||||||
return vo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -124,7 +112,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");
|
List<DictionaryItem> dbAreas = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY);
|
||||||
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()
|
||||||
|
|
@ -147,6 +135,8 @@ public class PriceConfigController extends ControllerBase {
|
||||||
List<QuotationModelPriceItem> items = new ArrayList<>();
|
List<QuotationModelPriceItem> items = new ArrayList<>();
|
||||||
List<QuotationModelPriceItemArea> areas = new ArrayList<>();
|
List<QuotationModelPriceItemArea> areas = new ArrayList<>();
|
||||||
for (ModelPriceSaveRequest it : itemList) {
|
for (ModelPriceSaveRequest it : itemList) {
|
||||||
|
Long itemId = 0L;
|
||||||
|
if (it.getConfigItemUniqueId() > 0) {
|
||||||
QuotationModelPriceItem item = new QuotationModelPriceItem()
|
QuotationModelPriceItem item = new QuotationModelPriceItem()
|
||||||
.setPriceId(price.getId())
|
.setPriceId(price.getId())
|
||||||
.setId(IdUtil.getSnowflakeNextId())
|
.setId(IdUtil.getSnowflakeNextId())
|
||||||
|
|
@ -155,6 +145,8 @@ public class PriceConfigController extends ControllerBase {
|
||||||
.setUpdateBy(AdminUserUtil.getUserName())
|
.setUpdateBy(AdminUserUtil.getUserName())
|
||||||
.setUpdateTime(LocalDateTime.now());
|
.setUpdateTime(LocalDateTime.now());
|
||||||
items.add(item);
|
items.add(item);
|
||||||
|
itemId = item.getId();
|
||||||
|
}
|
||||||
for (ModelPriceSaveAreaRequest ait : it.getAreas()) {
|
for (ModelPriceSaveAreaRequest ait : it.getAreas()) {
|
||||||
DictionaryItem ai = dbAreas.stream()
|
DictionaryItem ai = dbAreas.stream()
|
||||||
.filter(a -> a.getCode().equals(ait.getAreaCode()))
|
.filter(a -> a.getCode().equals(ait.getAreaCode()))
|
||||||
|
|
@ -164,7 +156,7 @@ public class PriceConfigController extends ControllerBase {
|
||||||
QuotationModelPriceItemArea area = new QuotationModelPriceItemArea()
|
QuotationModelPriceItemArea area = new QuotationModelPriceItemArea()
|
||||||
.setAreaId(ai.getId())
|
.setAreaId(ai.getId())
|
||||||
.setPriceId(price.getId())
|
.setPriceId(price.getId())
|
||||||
.setPriceItemId(item.getId())
|
.setPriceItemId(itemId)
|
||||||
.setAmount(ait.getAmount());
|
.setAmount(ait.getAmount());
|
||||||
areas.add(area);
|
areas.add(area);
|
||||||
}
|
}
|
||||||
|
|
@ -182,16 +174,19 @@ public class PriceConfigController extends ControllerBase {
|
||||||
.list();
|
.list();
|
||||||
List<QuotationModelPriceItemArea> areas = priceItemAreaService.lambdaQuery()
|
List<QuotationModelPriceItemArea> areas = priceItemAreaService.lambdaQuery()
|
||||||
.eq(QuotationModelPriceItemArea::getPriceId, price.getId())
|
.eq(QuotationModelPriceItemArea::getPriceId, price.getId())
|
||||||
|
.and(or -> or.eq(QuotationModelPriceItemArea::getPriceItemId, 0)
|
||||||
.in(QuotationModelPriceItemArea::getPriceItemId, items.stream()
|
.in(QuotationModelPriceItemArea::getPriceItemId, items.stream()
|
||||||
.map(QuotationModelPriceItem::getId)
|
.map(QuotationModelPriceItem::getId)
|
||||||
.collect(Collectors.toList())
|
.collect(Collectors.toList())
|
||||||
)
|
)
|
||||||
|
)
|
||||||
.list();
|
.list();
|
||||||
List<QuotationModelPriceItem> itemsForAdd = new ArrayList<>();
|
List<QuotationModelPriceItem> itemsForAdd = new ArrayList<>();
|
||||||
List<QuotationModelPriceItem> itemsForUpdate = new ArrayList<>();
|
List<QuotationModelPriceItem> itemsForUpdate = new ArrayList<>();
|
||||||
List<QuotationModelPriceItemArea> areasForAdd = new ArrayList<>();
|
List<QuotationModelPriceItemArea> areasForAdd = new ArrayList<>();
|
||||||
List<QuotationModelPriceItemArea> areasForUpdate = new ArrayList<>();
|
List<QuotationModelPriceItemArea> areasForUpdate = new ArrayList<>();
|
||||||
for (ModelPriceSaveRequest sit : itemList) {
|
for (ModelPriceSaveRequest sit : itemList) {
|
||||||
|
if (sit.getConfigItemUniqueId() > 0) {
|
||||||
QuotationModelPriceItem item = items.stream()
|
QuotationModelPriceItem item = items.stream()
|
||||||
.filter(it -> sit.getConfigItemUniqueId().equals(it.getConfigItemUniqueId()))
|
.filter(it -> sit.getConfigItemUniqueId().equals(it.getConfigItemUniqueId()))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
|
|
@ -247,6 +242,25 @@ public class PriceConfigController extends ControllerBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
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(0L)
|
||||||
|
&& it.getAreaId().equals(ai.getId())
|
||||||
|
)
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
if (Objects.nonNull(area)) {
|
||||||
|
area.setAmount(ait.getAmount());
|
||||||
|
areasForUpdate.add(area);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
price.setUpdateById(AdminUserUtil.getUserId());
|
price.setUpdateById(AdminUserUtil.getUserId());
|
||||||
price.setUpdateBy(AdminUserUtil.getUserName());
|
price.setUpdateBy(AdminUserUtil.getUserName());
|
||||||
|
|
@ -279,6 +293,7 @@ public class PriceConfigController extends ControllerBase {
|
||||||
price.setUpdateBy(AdminUserUtil.getUserName());
|
price.setUpdateBy(AdminUserUtil.getUserName());
|
||||||
price.setUpdateTime(LocalDateTime.now());
|
price.setUpdateTime(LocalDateTime.now());
|
||||||
for (ModelPriceSaveRequest sit : itemList) {
|
for (ModelPriceSaveRequest sit : itemList) {
|
||||||
|
if (sit.getConfigItemUniqueId() > 0) {
|
||||||
QuotationModelPriceItem dbItem = dbItems.stream()
|
QuotationModelPriceItem dbItem = dbItems.stream()
|
||||||
.filter(ait -> ait.getConfigItemUniqueId().equals(sit.getConfigItemUniqueId()))
|
.filter(ait -> ait.getConfigItemUniqueId().equals(sit.getConfigItemUniqueId()))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
|
|
@ -332,16 +347,36 @@ public class PriceConfigController extends ControllerBase {
|
||||||
.setAmount(ait.getAmount()));
|
.setAmount(ait.getAmount()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
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 = areasForAdd.stream()
|
||||||
|
.filter(it -> it.getPriceItemId().equals(0L)
|
||||||
|
&& it.getAreaId().equals(ai.getId())
|
||||||
|
)
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
if (Objects.nonNull(area)) {
|
||||||
|
area.setAmount(ait.getAmount());
|
||||||
|
areasForAdd.add(area);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (QuotationModelPriceItem item : dbItems) {
|
for (QuotationModelPriceItem item : dbItems) {
|
||||||
|
Long itemId = IdUtil.getSnowflakeNextId();
|
||||||
item.setUpdateById(AdminUserUtil.getUserId());
|
item.setUpdateById(AdminUserUtil.getUserId());
|
||||||
item.setUpdateBy(AdminUserUtil.getUserName());
|
item.setUpdateBy(AdminUserUtil.getUserName());
|
||||||
item.setUpdateTime(LocalDateTime.now());
|
item.setUpdateTime(LocalDateTime.now());
|
||||||
item.setId(IdUtil.getSnowflakeNextId());
|
|
||||||
item.setPriceId(price.getId());
|
item.setPriceId(price.getId());
|
||||||
areasForAdd.stream()
|
areasForAdd.stream()
|
||||||
.filter(area -> area.getPriceItemId().equals(item.getId()))
|
.filter(area -> area.getPriceItemId().equals(item.getId()))
|
||||||
.forEach(area -> area.setPriceItemId(item.getId()));
|
.forEach(area -> area.setPriceItemId(itemId));
|
||||||
|
item.setId(itemId);
|
||||||
}
|
}
|
||||||
priceService.save(price);
|
priceService.save(price);
|
||||||
if (CollectionUtil.isNotEmpty(itemsForAdd)) {
|
if (CollectionUtil.isNotEmpty(itemsForAdd)) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
package com.nflg.mobilebroken.repository.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@TableName("quotation_model_discount")
|
||||||
|
public class QuotationModelDiscount implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流水号
|
||||||
|
*/
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机型编号
|
||||||
|
*/
|
||||||
|
private Long modelId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 版本状态,0:草稿;1:已发布;2:已弃用
|
||||||
|
*/
|
||||||
|
private Integer discountStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增人编号
|
||||||
|
*/
|
||||||
|
private Integer createById;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建人
|
||||||
|
*/
|
||||||
|
private String createBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改人编号
|
||||||
|
*/
|
||||||
|
private Integer updateById;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新人
|
||||||
|
*/
|
||||||
|
private String updateBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime updateTime;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
package com.nflg.mobilebroken.repository.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣-折扣对象
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@TableName("quotation_model_discount_apply")
|
||||||
|
public class QuotationModelDiscountApply implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 折扣ID
|
||||||
|
*/
|
||||||
|
private Integer discountId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户类型 0 内部用户;1 代理商公司
|
||||||
|
*/
|
||||||
|
private Integer sourceType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户ID
|
||||||
|
*/
|
||||||
|
private Integer sourceId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增人编号
|
||||||
|
*/
|
||||||
|
private Integer createById;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建人
|
||||||
|
*/
|
||||||
|
private String createBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
package com.nflg.mobilebroken.repository.entity;
|
||||||
|
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣-区域
|
||||||
|
* </p>
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@TableName("quotation_model_discount_area")
|
||||||
|
public class QuotationModelDiscountArea implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 折扣id
|
||||||
|
*/
|
||||||
|
private Long discountId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 区域,字典id
|
||||||
|
*/
|
||||||
|
private Long areaId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 折扣,如0.95
|
||||||
|
*/
|
||||||
|
private BigDecimal ratio;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 折扣开始时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime discountStartDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 折扣结束时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime discountEndDate;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
private Long days;
|
||||||
|
|
||||||
|
public Long getDays() {
|
||||||
|
return ChronoUnit.DAYS.between(discountStartDate, discountEndDate) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.nflg.mobilebroken.repository.mapper;
|
||||||
|
|
||||||
|
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountApply;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣-折扣对象 Mapper 接口
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
public interface QuotationModelDiscountApplyMapper extends BaseMapper<QuotationModelDiscountApply> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.nflg.mobilebroken.repository.mapper;
|
||||||
|
|
||||||
|
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountArea;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣-区域 Mapper 接口
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
public interface QuotationModelDiscountAreaMapper extends BaseMapper<QuotationModelDiscountArea> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.nflg.mobilebroken.repository.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.request.ModelConfigSearchRequest;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.vo.ModelDiscountConfigVO;
|
||||||
|
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscount;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣 Mapper 接口
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
public interface QuotationModelDiscountMapper extends BaseMapper<QuotationModelDiscount> {
|
||||||
|
|
||||||
|
IPage<ModelDiscountConfigVO> search(ModelConfigSearchRequest request, Page<?> page);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.nflg.mobilebroken.repository.service;
|
||||||
|
|
||||||
|
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountApply;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣-折扣对象 服务类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
public interface IQuotationModelDiscountApplyService extends IService<QuotationModelDiscountApply> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.nflg.mobilebroken.repository.service;
|
||||||
|
|
||||||
|
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountArea;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣-区域 服务类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
public interface IQuotationModelDiscountAreaService extends IService<QuotationModelDiscountArea> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.nflg.mobilebroken.repository.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.request.ModelConfigSearchRequest;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.vo.ModelDiscountConfigVO;
|
||||||
|
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscount;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
import javax.validation.Valid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣 服务类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
public interface IQuotationModelDiscountService extends IService<QuotationModelDiscount> {
|
||||||
|
|
||||||
|
IPage<ModelDiscountConfigVO> search(ModelConfigSearchRequest request);
|
||||||
|
}
|
||||||
|
|
@ -87,6 +87,12 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AdminUser add(AccountAddRequest request) {
|
public AdminUser add(AccountAddRequest request) {
|
||||||
|
VUtils.trueThrowBusinessError(departmentService.lambdaQuery()
|
||||||
|
.eq(TBaseDepartment::getId, request.getDepartmentId())
|
||||||
|
.eq(TBaseDepartment::isHasManager, true)
|
||||||
|
.exists()
|
||||||
|
)
|
||||||
|
.throwMessage("部门已存在负责人");
|
||||||
AdminUser user = lambdaQuery().eq(AdminUser::getLoginName, request.getLoginName()).one();
|
AdminUser user = lambdaQuery().eq(AdminUser::getLoginName, request.getLoginName()).one();
|
||||||
if (Objects.nonNull(user)) {
|
if (Objects.nonNull(user)) {
|
||||||
VUtils.trueThrowBusinessError(!user.getIsDel())
|
VUtils.trueThrowBusinessError(!user.getIsDel())
|
||||||
|
|
@ -463,7 +469,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
|
||||||
List<AdminUser> roots = adminUsers.stream()
|
List<AdminUser> roots = adminUsers.stream()
|
||||||
.filter(u -> Objects.equals(u.getDepartmentId(), department.getId()))
|
.filter(u -> Objects.equals(u.getDepartmentId(), department.getId()))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
if (CollectionUtil.isEmpty(adminUsers)) {
|
if (CollectionUtil.isEmpty(roots)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
List<AdminUserVO> rootUserVOS = convert(roots, department, positions, roleMaps, roles);
|
List<AdminUserVO> rootUserVOS = convert(roots, department, positions, roleMaps, roles);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.nflg.mobilebroken.repository.service.impl;
|
||||||
|
|
||||||
|
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountApply;
|
||||||
|
import com.nflg.mobilebroken.repository.mapper.QuotationModelDiscountApplyMapper;
|
||||||
|
import com.nflg.mobilebroken.repository.service.IQuotationModelDiscountApplyService;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣-折扣对象 服务实现类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class QuotationModelDiscountApplyServiceImpl extends ServiceImpl<QuotationModelDiscountApplyMapper, QuotationModelDiscountApply> implements IQuotationModelDiscountApplyService {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.nflg.mobilebroken.repository.service.impl;
|
||||||
|
|
||||||
|
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountArea;
|
||||||
|
import com.nflg.mobilebroken.repository.mapper.QuotationModelDiscountAreaMapper;
|
||||||
|
import com.nflg.mobilebroken.repository.service.IQuotationModelDiscountAreaService;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣-区域 服务实现类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class QuotationModelDiscountAreaServiceImpl extends ServiceImpl<QuotationModelDiscountAreaMapper, QuotationModelDiscountArea> implements IQuotationModelDiscountAreaService {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.nflg.mobilebroken.repository.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.request.ModelConfigSearchRequest;
|
||||||
|
import com.nflg.mobilebroken.common.pojo.vo.ModelDiscountConfigVO;
|
||||||
|
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscount;
|
||||||
|
import com.nflg.mobilebroken.repository.mapper.QuotationModelDiscountMapper;
|
||||||
|
import com.nflg.mobilebroken.repository.service.IQuotationModelDiscountService;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 报价-机型折扣 服务实现类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2026
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class QuotationModelDiscountServiceImpl extends ServiceImpl<QuotationModelDiscountMapper, QuotationModelDiscount> implements IQuotationModelDiscountService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPage<ModelDiscountConfigVO> search(ModelConfigSearchRequest request) {
|
||||||
|
return baseMapper.search(request, new Page<>(request.getPage(), request.getPageSize()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,7 @@ package com.nflg.mobilebroken.repository.service.impl;
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.nflg.mobilebroken.common.constant.Constant;
|
||||||
import com.nflg.mobilebroken.common.pojo.request.ModelConfigSearchRequest;
|
import com.nflg.mobilebroken.common.pojo.request.ModelConfigSearchRequest;
|
||||||
import com.nflg.mobilebroken.common.pojo.vo.ModelPriceConfigAreaVO;
|
import com.nflg.mobilebroken.common.pojo.vo.ModelPriceConfigAreaVO;
|
||||||
import com.nflg.mobilebroken.common.pojo.vo.ModelPriceConfigVO;
|
import com.nflg.mobilebroken.common.pojo.vo.ModelPriceConfigVO;
|
||||||
|
|
@ -63,7 +64,7 @@ public class QuotationModelPriceServiceImpl extends ServiceImpl<QuotationModelPr
|
||||||
List<QuotationModelPriceItem> priceItems = CollectionUtil.isEmpty(priceIds) ? new ArrayList<>() : priceItemService.lambdaQuery()
|
List<QuotationModelPriceItem> priceItems = CollectionUtil.isEmpty(priceIds) ? new ArrayList<>() : priceItemService.lambdaQuery()
|
||||||
.in(QuotationModelPriceItem::getPriceId, priceIds)
|
.in(QuotationModelPriceItem::getPriceId, priceIds)
|
||||||
.list();
|
.list();
|
||||||
List<DictionaryItem> areas = dictionaryItemService.getListByDictionaryCode("DispatchCategory");
|
List<DictionaryItem> areas = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY);
|
||||||
pdata.getRecords().forEach(data -> {
|
pdata.getRecords().forEach(data -> {
|
||||||
if (Objects.nonNull(data.getConfigId())) {
|
if (Objects.nonNull(data.getConfigId())) {
|
||||||
List<QuotationModelConfigItem> items = configItems.stream()
|
List<QuotationModelConfigItem> items = configItems.stream()
|
||||||
|
|
@ -108,7 +109,7 @@ public class QuotationModelPriceServiceImpl extends ServiceImpl<QuotationModelPr
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
return new ModelPriceConfigAreaVO()
|
return new ModelPriceConfigAreaVO()
|
||||||
.setId(area.getId())
|
// .setId(area.getId())
|
||||||
.setAmount(area.getAmount())
|
.setAmount(area.getAmount())
|
||||||
.setAreaId(area.getAreaId())
|
.setAreaId(area.getAreaId())
|
||||||
.setCode(Objects.isNull(aa) ? "" : aa.getCode())
|
.setCode(Objects.isNull(aa) ? "" : aa.getCode())
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!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.QuotationModelDiscountApplyMapper">
|
||||||
|
|
||||||
|
</mapper>
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!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.QuotationModelDiscountAreaMapper">
|
||||||
|
|
||||||
|
</mapper>
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!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.QuotationModelDiscountMapper">
|
||||||
|
|
||||||
|
<select id="search" resultType="com.nflg.mobilebroken.common.pojo.vo.ModelDiscountConfigVO">
|
||||||
|
SELECT qmd.model_id,qmp.id as 'priceId',ps.name as 'seriesName',pt.name as 'typeName',pm.`no` as 'modelNo',qmp.update_by,qmp.update_time
|
||||||
|
FROM quotation_model_discount qmd
|
||||||
|
INNER JOIN quotation_model_price qmp ON qmp.model_id=qmd.model_id and qmp.price_status=1
|
||||||
|
INNER JOIN product_model pm ON qmd.model_id=pm.batch_number
|
||||||
|
LEFT JOIN product_type pt on pm.type_number=pt.batch_number AND pt.state=1
|
||||||
|
LEFT JOIN product_series ps ON pm.series_number=ps.batch_number AND ps.state=1
|
||||||
|
LEFT JOIN dictionary_item di ON di.id=pm.module_id
|
||||||
|
WHERE pm.state=1
|
||||||
|
<where>
|
||||||
|
<if test="request.moduleId!=null">
|
||||||
|
AND pm.module_id=#{request.moduleId}
|
||||||
|
</if>
|
||||||
|
<if test="request.seriesNumber!=null">
|
||||||
|
AND pm.series_number=#{request.seriesNumber}
|
||||||
|
</if>
|
||||||
|
<if test="request.typeNumber!=null">
|
||||||
|
AND pm.type_number=#{request.typeNumber}
|
||||||
|
</if>
|
||||||
|
<if test="request.no!=null and request.no!=''">
|
||||||
|
AND pm.`no` like concat('%', #{request.no}, '%')
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
order by qmd.update_time desc,qmd.id desc
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
|
|
@ -33,7 +33,7 @@ public class CodeGeneratorTest {
|
||||||
, Paths.get(System.getProperty("user.dir")) + "/src/main/resources/mapper"))
|
, Paths.get(System.getProperty("user.dir")) + "/src/main/resources/mapper"))
|
||||||
)
|
)
|
||||||
.strategyConfig(builder -> {
|
.strategyConfig(builder -> {
|
||||||
builder.addInclude("quotation_model_price_item_area") //只生成指定表
|
builder.addInclude("quotation_model_discount_area") //只生成指定表
|
||||||
.entityBuilder()
|
.entityBuilder()
|
||||||
.enableLombok()
|
.enableLombok()
|
||||||
.enableChainModel()
|
.enableChainModel()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue