From 6e5a1375cdf828274734c0c17bc0a20d32fa459e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Fri, 27 Feb 2026 16:16:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(quotation):=20=E6=B7=BB=E5=8A=A0=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E5=95=86=E7=B3=BB=E6=95=B0=E9=85=8D=E7=BD=AE=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增RatioAgentController控制器,提供动态表头获取接口 - 添加QuotationModelRatioAgent和QuotationModelRatioAgentItem实体类 - 生成对应的Mapper、Service接口及实现类 - 修改CodeGeneratorTest测试类,更新代码生成目标表名 - 调整ModelPriceConfigVO,移除id字段 - 更新PriceConfigController中的价格配置逻辑,添加版本状态初始化 - 优化价格项目区域数据的添加和更新流程 --- .../common/pojo/vo/ModelPriceConfigVO.java | 2 +- .../admin/PriceConfigController.java | 37 ++++--- .../admin/RatioAgentController.java | 100 ++++++++++++++++++ .../entity/QuotationModelRatioAgent.java | 62 +++++++++++ .../entity/QuotationModelRatioAgentItem.java | 52 +++++++++ .../QuotationModelRatioAgentItemMapper.java | 16 +++ .../QuotationModelRatioAgentMapper.java | 16 +++ .../IQuotationModelRatioAgentItemService.java | 16 +++ .../IQuotationModelRatioAgentService.java | 16 +++ ...otationModelRatioAgentItemServiceImpl.java | 20 ++++ .../QuotationModelRatioAgentServiceImpl.java | 20 ++++ .../QuotationModelRatioAgentItemMapper.xml | 5 + .../mapper/QuotationModelRatioAgentMapper.xml | 5 + .../repository/CodeGeneratorTest.java | 2 +- 14 files changed, 354 insertions(+), 15 deletions(-) create mode 100644 nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/RatioAgentController.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelRatioAgent.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelRatioAgentItem.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelRatioAgentItemMapper.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelRatioAgentMapper.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelRatioAgentItemService.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelRatioAgentService.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelRatioAgentItemServiceImpl.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelRatioAgentServiceImpl.java create mode 100644 nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelRatioAgentItemMapper.xml create mode 100644 nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelRatioAgentMapper.xml 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 71b5e181..df814b51 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 @@ -13,7 +13,7 @@ import java.util.Objects; @Accessors(chain = true) public class ModelPriceConfigVO { - private Long id; +// private Long id; /** * 机型表batch_number diff --git a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/PriceConfigController.java b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/PriceConfigController.java index ff2cac93..22866294 100644 --- a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/PriceConfigController.java +++ b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/PriceConfigController.java @@ -304,6 +304,8 @@ public class PriceConfigController extends ControllerBase { List itemsForAdd = new ArrayList<>(); price.setId(IdUtil.getSnowflakeNextId()); price.setConfigId(null); + price.setPriceVersion(null); + price.setPriceStatus(0); price.setUpdateById(AdminUserUtil.getUserId()); price.setUpdateBy(AdminUserUtil.getUserName()); price.setUpdateTime(LocalDateTime.now()); @@ -328,7 +330,6 @@ public class PriceConfigController extends ControllerBase { area.setId(IdUtil.getSnowflakeNextId()); area.setPriceId(price.getId()); area.setAmount(new BigDecimal(map.get(category.getCode()))); - areasForAdd.add(area); } else { areasForAdd.add(new QuotationModelPriceItemArea() .setAreaId(category.getId()) @@ -370,31 +371,41 @@ public class PriceConfigController extends ControllerBase { .orElse(null); if (Objects.nonNull(area)) { area.setAmount(new BigDecimal(map.get(category.getCode()))); - areasForAdd.add(area); + }else { + areasForAdd.add(new QuotationModelPriceItemArea() + .setAreaId(category.getId()) + .setPriceId(price.getId()) + .setPriceItemId(0L) + .setAmount(new BigDecimal(map.get(category.getCode()))) + ); } } } } } - for (QuotationModelPriceItem item : dbItems) { - Long itemId = IdUtil.getSnowflakeNextId(); - item.setUpdateById(AdminUserUtil.getUserId()); - item.setUpdateBy(AdminUserUtil.getUserName()); - item.setUpdateTime(LocalDateTime.now()); - item.setPriceId(price.getId()); - areasForAdd.stream() - .filter(area -> area.getPriceItemId().equals(item.getId())) - .forEach(area -> area.setPriceItemId(itemId)); - item.setId(itemId); - } priceService.save(price); if (CollectionUtil.isNotEmpty(itemsForAdd)) { priceItemService.saveBatch(itemsForAdd); } if (CollectionUtil.isNotEmpty(dbItems)) { + for (QuotationModelPriceItem item : dbItems) { + Long itemId = IdUtil.getSnowflakeNextId(); + item.setUpdateById(AdminUserUtil.getUserId()); + item.setUpdateBy(AdminUserUtil.getUserName()); + item.setUpdateTime(LocalDateTime.now()); + item.setPriceId(price.getId()); + areasForAdd.stream() + .filter(area -> area.getPriceItemId().equals(item.getId())) + .forEach(area -> area.setPriceItemId(itemId)); + item.setId(itemId); + } priceItemService.saveBatch(dbItems); } if (CollectionUtil.isNotEmpty(areasForAdd)) { + for (QuotationModelPriceItemArea area : areasForAdd) { + area.setId(IdUtil.getSnowflakeNextId()); + area.setPriceId(price.getId()); + } priceItemAreaService.saveBatch(areasForAdd); } } diff --git a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/RatioAgentController.java b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/RatioAgentController.java new file mode 100644 index 00000000..4b9ab9ab --- /dev/null +++ b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/RatioAgentController.java @@ -0,0 +1,100 @@ +package com.nflg.mobilebroken.quotation.controller.admin; + +import cn.hutool.core.util.StrUtil; +import com.nflg.mobilebroken.common.constant.Constant; +import com.nflg.mobilebroken.common.pojo.ApiResult; +import com.nflg.mobilebroken.common.pojo.vo.DynamicHeaderVO; +import com.nflg.mobilebroken.quotation.controller.ControllerBase; +import com.nflg.mobilebroken.repository.entity.AppUser; +import com.nflg.mobilebroken.repository.entity.DictionaryItem; +import com.nflg.mobilebroken.repository.entity.TBaseCustomer; +import com.nflg.mobilebroken.repository.service.IAppUserService; +import com.nflg.mobilebroken.repository.service.IDictionaryItemService; +import com.nflg.mobilebroken.repository.service.ITBaseCustomerService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 代理商配置系数 + */ +@RestController +@RequestMapping("/ratio/agent") +public class RatioAgentController extends ControllerBase { + + @Resource + private IAppUserService appUserService; + + @Resource + private ITBaseCustomerService customerService; + + @Resource + private IDictionaryItemService dictionaryItemService; + + /** + * 获取动态表头 + */ + @GetMapping("/headers") + public ApiResult> getHeaders() { + List vos = new ArrayList<>(); + vos.add(new DynamicHeaderVO() + .setProp("appUser") + .setLabel("代理商账号") + .setChildren(new ArrayList<>() { + { + add(new DynamicHeaderVO().setProp("modelNo").setLabel("机型")); + } + }) + ); + List customers = customerService.lambdaQuery() + .select(TBaseCustomer::getId, TBaseCustomer::getCategoryId) + .eq(TBaseCustomer::getDelIs, 0) + .eq(TBaseCustomer::getEnableState, 1) + .list(); + List categories = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY); + List users = appUserService.lambdaQuery() + .eq(AppUser::getIsDel, false) + .eq(AppUser::getIsPrimary, true) + .list(); + users.forEach(user -> { + TBaseCustomer customer = customers.stream() + .filter(cit -> StrUtil.split(user.getCompanyId(), ',').contains(cit.getId().toString())) + .findFirst() + .orElse(null); + String categoryName; + if (Objects.nonNull(customer)) { + DictionaryItem category = categories.stream() + .filter(cit -> cit.getId().equals(customer.getCategoryId())) + .findFirst() + .orElse(null); + if (Objects.nonNull(category)) { + categoryName = category.getName(); + } else { + categoryName = "未知"; + } + } else { + categoryName = "未知"; + } + DynamicHeaderVO avo = new DynamicHeaderVO() + .setProp(user.getId().toString()) + .setLabel(user.getName()) + .setChildren(new ArrayList<>() { + { + add(new DynamicHeaderVO().setProp("standardPrice").setLabel("标配价(" + categoryName + ")")); + add(new DynamicHeaderVO().setProp("standardRatio").setLabel("标配系数")); + add(new DynamicHeaderVO().setProp("optionalRatio").setLabel("选配系数")); + add(new DynamicHeaderVO().setProp("salePrice").setLabel("市场价(" + categoryName + ")")); + } + }); + vos.add(avo); + }); + return ApiResult.success(vos); + } + + +} \ No newline at end of file diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelRatioAgent.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelRatioAgent.java new file mode 100644 index 00000000..fd51789f --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelRatioAgent.java @@ -0,0 +1,62 @@ +package com.nflg.mobilebroken.repository.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + *

+ * 报价-代理商系数 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("quotation_model_ratio_agent") +public class QuotationModelRatioAgent implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 年份 + */ + private String year; + + /** + * 版本号 + */ + private String version; + + /** + * 状态,0:草稿;1:已发布;2:已废弃 + */ + private Integer staus; + + /** + * 创建人类型,0:内部用户;1:代理商账号 + */ + private Integer createByType; + + /** + * 创建人id + */ + private Integer createById; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private LocalDateTime createTime; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelRatioAgentItem.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelRatioAgentItem.java new file mode 100644 index 00000000..f013cfc2 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelRatioAgentItem.java @@ -0,0 +1,52 @@ +package com.nflg.mobilebroken.repository.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + *

+ * 报价-代理商系数-子项 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("quotation_model_ratio_agent_item") +public class QuotationModelRatioAgentItem implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 系数id + */ + private Long ratioId; + + /** + * 机型id + */ + private Integer modelId; + + /** + * 代理商账号id + */ + private Integer userId; + + /** + * 标配系数 + */ + private BigDecimal standardRatio; + + /** + * 选配系数 + */ + private BigDecimal optionalRatio; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelRatioAgentItemMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelRatioAgentItemMapper.java new file mode 100644 index 00000000..a7d1d769 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelRatioAgentItemMapper.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.mapper; + +import com.nflg.mobilebroken.repository.entity.QuotationModelRatioAgentItem; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 报价-代理商系数-子项 Mapper 接口 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface QuotationModelRatioAgentItemMapper extends BaseMapper { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelRatioAgentMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelRatioAgentMapper.java new file mode 100644 index 00000000..547d2462 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelRatioAgentMapper.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.mapper; + +import com.nflg.mobilebroken.repository.entity.QuotationModelRatioAgent; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 报价-代理商系数 Mapper 接口 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface QuotationModelRatioAgentMapper extends BaseMapper { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelRatioAgentItemService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelRatioAgentItemService.java new file mode 100644 index 00000000..c142a154 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelRatioAgentItemService.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.service; + +import com.nflg.mobilebroken.repository.entity.QuotationModelRatioAgentItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 报价-代理商系数-子项 服务类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface IQuotationModelRatioAgentItemService extends IService { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelRatioAgentService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelRatioAgentService.java new file mode 100644 index 00000000..725c650e --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelRatioAgentService.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.service; + +import com.nflg.mobilebroken.repository.entity.QuotationModelRatioAgent; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 报价-代理商系数 服务类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface IQuotationModelRatioAgentService extends IService { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelRatioAgentItemServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelRatioAgentItemServiceImpl.java new file mode 100644 index 00000000..dd132a7c --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelRatioAgentItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.nflg.mobilebroken.repository.service.impl; + +import com.nflg.mobilebroken.repository.entity.QuotationModelRatioAgentItem; +import com.nflg.mobilebroken.repository.mapper.QuotationModelRatioAgentItemMapper; +import com.nflg.mobilebroken.repository.service.IQuotationModelRatioAgentItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 报价-代理商系数-子项 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Service +public class QuotationModelRatioAgentItemServiceImpl extends ServiceImpl implements IQuotationModelRatioAgentItemService { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelRatioAgentServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelRatioAgentServiceImpl.java new file mode 100644 index 00000000..e3ec3d60 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelRatioAgentServiceImpl.java @@ -0,0 +1,20 @@ +package com.nflg.mobilebroken.repository.service.impl; + +import com.nflg.mobilebroken.repository.entity.QuotationModelRatioAgent; +import com.nflg.mobilebroken.repository.mapper.QuotationModelRatioAgentMapper; +import com.nflg.mobilebroken.repository.service.IQuotationModelRatioAgentService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 报价-代理商系数 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Service +public class QuotationModelRatioAgentServiceImpl extends ServiceImpl implements IQuotationModelRatioAgentService { + +} diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelRatioAgentItemMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelRatioAgentItemMapper.xml new file mode 100644 index 00000000..c0dc3b34 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelRatioAgentItemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelRatioAgentMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelRatioAgentMapper.xml new file mode 100644 index 00000000..1ff97c6e --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelRatioAgentMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/nflg-mobilebroken-repository/src/test/java/com/nflg/mobilebroken/repository/CodeGeneratorTest.java b/nflg-mobilebroken-repository/src/test/java/com/nflg/mobilebroken/repository/CodeGeneratorTest.java index 39c707c0..6b3b7536 100644 --- a/nflg-mobilebroken-repository/src/test/java/com/nflg/mobilebroken/repository/CodeGeneratorTest.java +++ b/nflg-mobilebroken-repository/src/test/java/com/nflg/mobilebroken/repository/CodeGeneratorTest.java @@ -33,7 +33,7 @@ public class CodeGeneratorTest { , Paths.get(System.getProperty("user.dir")) + "/src/main/resources/mapper")) ) .strategyConfig(builder -> { - builder.addInclude("quotation_model_forbid") //只生成指定表 + builder.addInclude("quotation_model_ratio_agent_item") //只生成指定表 .entityBuilder() .enableLombok() .enableChainModel()