diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AdminUserController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AdminUserController.java index db3bea74..e2224385 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AdminUserController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AdminUserController.java @@ -111,15 +111,15 @@ public class AdminUserController extends ControllerBase { @ApiMark(moduleName = "账号管理", apiName = "新增账号") public ApiResult addAccount(@Valid @RequestBody AccountAddRequest request) { request.setPassword(RandomUtil.randomString(6)); - AdminUser adminUser=adminUserService.add(request); + AdminUser adminUser = adminUserService.add(request); try { String email = adminUser.getEmail(); String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_ACTIVATION, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_ACTIVATION_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) - .replace("${loginName}",adminUser.getLoginName()) - .replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((email+"|0").getBytes())) - .replace("${password}",request.getPassword()) - .replace("${website}",websiteUrl); + .replace("${loginName}", adminUser.getLoginName()) + .replace("${url}", activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((email + "|0").getBytes())) + .replace("${password}", request.getPassword()) + .replace("${website}", websiteUrl); emailService.sendEmail(email, subject, content); } catch (MessagingException e) { log.error("发送邮件失败", e); @@ -136,7 +136,7 @@ public class AdminUserController extends ControllerBase { @MethodInfoMark(value = "更新账号", menuName = "账号管理") @ApiMark(moduleName = "账号管理", apiName = "更新账号") public ApiResult updateAccount(@Valid @RequestBody AccountUpdateRequest request) { - AdminUser user=adminUserService.getById(request.getId()); + AdminUser user = adminUserService.getById(request.getId()); if (!Objects.equals(user.getDepartmentId(), request.getDepartmentId())) { departmentService.updateHasManager(user.getDepartmentId()); departmentService.lambdaUpdate() @@ -144,6 +144,12 @@ public class AdminUserController extends ControllerBase { .eq(TBaseDepartment::isHasManager, false) .eq(TBaseDepartment::getId, request.getDepartmentId()) .update(); + VUtils.trueThrowBusinessError(departmentService.lambdaQuery() + .eq(TBaseDepartment::getId, request.getDepartmentId()) + .eq(TBaseDepartment::isHasManager, true) + .exists() + ) + .throwMessage("部门已存在负责人"); } user.setUserCode(request.getUserCode()) .setUserName(request.getUserName()) @@ -154,6 +160,7 @@ public class AdminUserController extends ControllerBase { .setProductLine(request.getProductLine()) .setGongFuHandler(request.isGongFuHandler()) .setGongfu(StrUtil.contains(request.getProductLine(), Constant.MOBILE_BROKEN)) + .setCategoryId(request.getCategoryId()) .setUpdateBy(AdminUserUtil.getUserId()) .setUpdateTime(LocalDateTime.now()); if (!Objects.equals(user.getState(), UserState.ToBeActivated.getState()) && Objects.nonNull(request.getEnable())) { @@ -211,9 +218,9 @@ public class AdminUserController extends ControllerBase { AdminUser adminUser = adminUserService.resetPassword(id, password); String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) - .replace("${loginName}",adminUser.getLoginName()) - .replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((adminUser.getEmail()+"|0").getBytes())) - .replace("${password}",password); + .replace("${loginName}", adminUser.getLoginName()) + .replace("${url}", activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((adminUser.getEmail() + "|0").getBytes())) + .replace("${password}", password); emailService.sendEmail(adminUser.getEmail(), subject, content); } } catch (Exception ex) { @@ -232,12 +239,12 @@ public class AdminUserController extends ControllerBase { public ApiResult forgetPassword(@Valid @RequestParam @NotBlank String email) { try { String password = RandomUtil.randomString(6); - AdminUser adminUser=adminUserService.forgetPassword(email, password); + AdminUser adminUser = adminUserService.forgetPassword(email, password); String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) - .replace("${loginName}",adminUser.getLoginName()) - .replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((email+"|0").getBytes())) - .replace("${password}",password); + .replace("${loginName}", adminUser.getLoginName()) + .replace("${url}", activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((email + "|0").getBytes())) + .replace("${password}", password); emailService.sendEmail(email, subject, content); } catch (Exception ex) { throw new NflgException(STATE.BusinessError, "发送邮件失败:" + ex.getMessage()); @@ -271,7 +278,7 @@ public class AdminUserController extends ControllerBase { */ @GetMapping("getFollowUrl") @ApiMark(moduleName = "账号管理", apiName = "获取关注二维码链接", isPublic = true) - public ApiResult getFollowUrl(){ + public ApiResult getFollowUrl() { return ApiResult.success(wxQRCodeService.getFollowUrl(AdminUserUtil.getUserId())); } @@ -315,8 +322,8 @@ public class AdminUserController extends ControllerBase { stringRedisTemplate.opsForValue().set(StrUtil.format(Constant.REDIS_KEY_USER_UPDATE_KAPTCHA_ADMIN, email), kaptcha, Duration.ofHours(72)); String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_CHANGE_PASSWORD, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_CHANGE_PASSWORD, Constant.DEFAULT_LANGUAGE_CODE) - .replace("${loginName}",email) - .replace("${password}",kaptcha); + .replace("${loginName}", email) + .replace("${password}", kaptcha); emailService.sendEmail(email, subject, content); } catch (Exception ex) { throw new NflgException(STATE.BusinessError, "发送邮件失败:" + ex.getMessage()); @@ -329,7 +336,7 @@ public class AdminUserController extends ControllerBase { * @return 用户信息 **/ @GetMapping("getInfo") - @ApiMark(moduleName = "账号管理", apiName = "获取当前登录用户信息",isPublic = true) + @ApiMark(moduleName = "账号管理", apiName = "获取当前登录用户信息", isPublic = true) public ApiResult getInfo() { AdminUserVO adminUserVO = adminUserService.getInfo(AdminUserUtil.getUserId()); return ApiResult.success(adminUserVO); @@ -341,7 +348,7 @@ public class AdminUserController extends ControllerBase { * @return 用户信息 **/ @GetMapping("getInfoById") - public ApiResult getInfoById(@Valid @RequestParam @NotNull Integer userId){ + public ApiResult getInfoById(@Valid @RequestParam @NotNull Integer userId) { return ApiResult.success(adminUserService.getInfo(userId)); } @@ -351,7 +358,7 @@ public class AdminUserController extends ControllerBase { **/ @PostMapping("deleteAccount") @ApiMark(moduleName = "账号管理", apiName = "删除账号", code = "account.delete") - public ApiResult deleteAccount(@Valid @RequestBody DeleteRequest request){ + public ApiResult deleteAccount(@Valid @RequestBody DeleteRequest request) { adminUserService.deleteAccount(request.getId()); return ApiResult.success(); } @@ -363,19 +370,19 @@ public class AdminUserController extends ControllerBase { @PostMapping("changeEmail") @ApiMark(moduleName = "账号管理", apiName = "更改邮箱") public ApiResult changeEmail(@Valid @RequestBody EmailChangeRequest request) throws MessagingException { - AdminUser user=adminUserService.getById(request.getUserId()); + AdminUser user = adminUserService.getById(request.getUserId()); VUtils.trueThrowBusinessError(adminUserService.lambdaQuery() - .eq(AdminUser::getLoginName, request.getEmail()) - .ne(AdminUser::getId, request.getUserId()) - .exists()) - .throwMessage("已存在相同的登录名"); - String code= RandomUtil.randomString(6); + .eq(AdminUser::getLoginName, request.getEmail()) + .ne(AdminUser::getId, request.getUserId()) + .exists()) + .throwMessage("已存在相同的登录名"); + String code = RandomUtil.randomString(6); stringRedisTemplate.opsForValue().set(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + user.getLoginName(), code, Duration.ofHours(72)); stringRedisTemplate.opsForValue().set(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + code, request.getEmail(), Duration.ofHours(72)); String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_CHANGE_EMAIL, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_CHANGE_EMAIL, Constant.DEFAULT_LANGUAGE_CODE) .replace("${email}", user.getLoginName()) - .replace("${url}", activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((user.getLoginName()+"|1").getBytes())) + .replace("${url}", activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((user.getLoginName() + "|1").getBytes())) .replace("${password}", code); emailService.sendEmail(request.getEmail(), subject, content); return ApiResult.success(); diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/BaseAreaController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/BaseAreaController.java index d52722d6..dfb17173 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/BaseAreaController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/BaseAreaController.java @@ -108,6 +108,7 @@ public class BaseAreaController extends ControllerBase { oldEnt.setDataModifyUserNo(AdminUserUtil.getUserNo()); oldEnt.setDataModifyUserName(AdminUserUtil.getUserName()); oldEnt.setDataModifyTime(LocalDateTime.now()); + oldEnt.setCategoryId(baseAreaEditDTO.getCategoryId()); baseAreaService.updateById(oldEnt); return ApiResult.success(true); diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java index 42d2aeb4..50aea0ab 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java @@ -143,4 +143,9 @@ public class Constant { * 移动破产品线名称 */ public static final String MOBILE_BROKEN = "移动破碎"; + + /** + * 字典-直销类别 + */ + public static final String DICTIONARY_DIRECT_SALES_CATEGORY ="DirectSalesCategory"; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/ApiResult.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/ApiResult.java index 4b4527b1..299bdd1b 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/ApiResult.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/ApiResult.java @@ -8,6 +8,10 @@ import lombok.Data; import java.io.Serializable; import java.time.LocalDateTime; import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; @Data public class ApiResult implements Serializable { @@ -60,6 +64,19 @@ public class ApiResult implements Serializable { return vo; } + public static ApiResult> success(IPage page, Function converter) { + ApiResult> vo = new ApiResult<>(); + PageData 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 ApiResult error(int state, String msg, T value) { ApiResult vo = new ApiResult<>(); vo.result = value; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelDiscountConfigAreaVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelDiscountConfigAreaVO.java new file mode 100644 index 00000000..c1cecce2 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelDiscountConfigAreaVO.java @@ -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; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelDiscountConfigVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelDiscountConfigVO.java new file mode 100644 index 00000000..6fa378f5 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelDiscountConfigVO.java @@ -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 areas; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelPriceConfigAreaVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelPriceConfigAreaVO.java index caaee195..a6647bd0 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelPriceConfigAreaVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ModelPriceConfigAreaVO.java @@ -9,7 +9,7 @@ import java.math.BigDecimal; @Accessors(chain = true) public class ModelPriceConfigAreaVO { - private Long id; +// private Long id; /** * 价格区域,字典id diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ProductModelSearchVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ProductModelSearchVO.java index 5766fdc3..f83da1d5 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ProductModelSearchVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ProductModelSearchVO.java @@ -39,6 +39,11 @@ public class ProductModelSearchVO { */ private String typeNumber; + /** + * 批次号 + */ + private Long batchNumber; + /** * 型号 */ diff --git a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/DiscountConfigController.java b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/DiscountConfigController.java new file mode 100644 index 00000000..c5b40f65 --- /dev/null +++ b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/admin/DiscountConfigController.java @@ -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> getHeaders() { + List 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 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>> search(@Valid @RequestBody ModelConfigSearchRequest request) { + IPage pdata = discountService.search(request); + if (CollectionUtil.isEmpty(pdata.getRecords())) { + return ApiResult.success(PageData.empty()); + } + List areas = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY); + List modelPrices = priceItemAreaService.lambdaQuery() + .eq(QuotationModelPriceItemArea::getPriceItemId, 0) + .in(QuotationModelPriceItemArea::getPriceId, pdata.getRecords().stream().map(ModelDiscountConfigVO::getPriceId).collect(Collectors.toList())) + .list(); + List discountAreas = discountAreaService.lambdaQuery() + .in(QuotationModelDiscountArea::getDiscountId, pdata.getRecords().stream().map(ModelDiscountConfigVO::getId).collect(Collectors.toList())) + .list(); + return ApiResult.success(pdata,data->{ + Map 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 save(@Valid @RequestBody List datas) { +// +// } +} \ No newline at end of file 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 8f744aa4..191e6d12 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 @@ -5,6 +5,7 @@ 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.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; @@ -72,7 +73,7 @@ public class PriceConfigController extends ControllerBase { vos.add(new DynamicHeaderVO().setProp("priceStatusDesc").setLabel("单价版本状态")); vos.add(new DynamicHeaderVO().setProp("typeDesc").setLabel("配置类别")); vos.add(new DynamicHeaderVO().setProp("optionalTypeDesc").setLabel("配置单价类型")); - List areas = dictionaryItemService.getListByDictionaryCode("DispatchCategory"); + List areas = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY); vos.add(new DynamicHeaderVO().setProp("").setLabel("保护价(¥)") .setChildren( areas.stream() @@ -89,33 +90,20 @@ public class PriceConfigController extends ControllerBase { } /** - * 获取机型价格配置列表 + * 搜索 */ @PostMapping("/search") public ApiResult>> search(@Valid @RequestBody ModelConfigSearchRequest request) { - IPage pdata = priceService.search(request); - ApiResult>> vo = new ApiResult<>(); - PageData> 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 map = objectMapper.convertValue(it, new TypeReference<>() { - }); - if (CollectionUtil.isNotEmpty(it.getAreas())) { - it.getAreas().forEach(area -> { - map.put(area.getCode(), NumberUtil.format(area.getAmount())); - }); - } - return map; - }) - .collect(Collectors.toList()) - ); - vo.setCode(STATE.Success.getState()); - vo.setType(STATE.Success.getType()); - vo.setResult(pageData); - return vo; + return ApiResult.success(priceService.search(request), data -> { + Map map = objectMapper.convertValue(data, new TypeReference<>() { + }); + if (CollectionUtil.isNotEmpty(data.getAreas())) { + data.getAreas().forEach(area -> { + map.put(area.getCode(), NumberUtil.format(area.getAmount())); + }); + } + return map; + }); } /** @@ -124,7 +112,7 @@ public class PriceConfigController extends ControllerBase { @Transactional @PostMapping("/save") public ApiResult save(@Valid @RequestBody List datas) { - List dbAreas = dictionaryItemService.getListByDictionaryCode("DispatchCategory"); + List dbAreas = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY); Map> group = datas.stream().collect(Collectors.groupingBy(ModelPriceSaveRequest::getModelId)); group.forEach((modelId, itemList) -> { QuotationModelPrice price = priceService.lambdaQuery() @@ -147,14 +135,18 @@ public class PriceConfigController extends ControllerBase { List items = new ArrayList<>(); List areas = new ArrayList<>(); for (ModelPriceSaveRequest it : itemList) { - QuotationModelPriceItem item = new QuotationModelPriceItem() - .setPriceId(price.getId()) - .setId(IdUtil.getSnowflakeNextId()) - .setConfigItemUniqueId(it.getConfigItemUniqueId()) - .setUpdateById(AdminUserUtil.getUserId()) - .setUpdateBy(AdminUserUtil.getUserName()) - .setUpdateTime(LocalDateTime.now()); - items.add(item); + Long itemId = 0L; + if (it.getConfigItemUniqueId() > 0) { + QuotationModelPriceItem item = new QuotationModelPriceItem() + .setPriceId(price.getId()) + .setId(IdUtil.getSnowflakeNextId()) + .setConfigItemUniqueId(it.getConfigItemUniqueId()) + .setUpdateById(AdminUserUtil.getUserId()) + .setUpdateBy(AdminUserUtil.getUserName()) + .setUpdateTime(LocalDateTime.now()); + items.add(item); + itemId = item.getId(); + } for (ModelPriceSaveAreaRequest ait : it.getAreas()) { DictionaryItem ai = dbAreas.stream() .filter(a -> a.getCode().equals(ait.getAreaCode())) @@ -164,7 +156,7 @@ public class PriceConfigController extends ControllerBase { QuotationModelPriceItemArea area = new QuotationModelPriceItemArea() .setAreaId(ai.getId()) .setPriceId(price.getId()) - .setPriceItemId(item.getId()) + .setPriceItemId(itemId) .setAmount(ait.getAmount()); areas.add(area); } @@ -182,9 +174,11 @@ public class PriceConfigController extends ControllerBase { .list(); List areas = priceItemAreaService.lambdaQuery() .eq(QuotationModelPriceItemArea::getPriceId, price.getId()) - .in(QuotationModelPriceItemArea::getPriceItemId, items.stream() - .map(QuotationModelPriceItem::getId) - .collect(Collectors.toList()) + .and(or -> or.eq(QuotationModelPriceItemArea::getPriceItemId, 0) + .in(QuotationModelPriceItemArea::getPriceItemId, items.stream() + .map(QuotationModelPriceItem::getId) + .collect(Collectors.toList()) + ) ) .list(); List itemsForAdd = new ArrayList<>(); @@ -192,37 +186,63 @@ public class PriceConfigController extends ControllerBase { List areasForAdd = new ArrayList<>(); List areasForUpdate = new ArrayList<>(); for (ModelPriceSaveRequest sit : itemList) { - QuotationModelPriceItem item = items.stream() - .filter(it -> sit.getConfigItemUniqueId().equals(it.getConfigItemUniqueId())) - .findFirst() - .orElse(null); - if (Objects.isNull(item)) { - item = new QuotationModelPriceItem() - .setId(IdUtil.getSnowflakeNextId()) - .setPriceId(price.getId()) - .setConfigItemUniqueId(sit.getConfigItemUniqueId()) - .setUpdateById(AdminUserUtil.getUserId()) - .setUpdateBy(AdminUserUtil.getUserName()) - .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(ai.getId()) + if (sit.getConfigItemUniqueId() > 0) { + QuotationModelPriceItem item = items.stream() + .filter(it -> sit.getConfigItemUniqueId().equals(it.getConfigItemUniqueId())) + .findFirst() + .orElse(null); + if (Objects.isNull(item)) { + item = new QuotationModelPriceItem() + .setId(IdUtil.getSnowflakeNextId()) .setPriceId(price.getId()) - .setPriceItemId(item.getId()) - .setAmount(ait.getAmount())); + .setConfigItemUniqueId(sit.getConfigItemUniqueId()) + .setUpdateById(AdminUserUtil.getUserId()) + .setUpdateBy(AdminUserUtil.getUserName()) + .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(ai.getId()) + .setPriceId(price.getId()) + .setPriceItemId(item.getId()) + .setAmount(ait.getAmount())); + } + } else { + item.setUpdateById(AdminUserUtil.getUserId()); + item.setUpdateBy(AdminUserUtil.getUserName()); + item.setUpdateTime(LocalDateTime.now()); + 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(ai.getId()) + ) + .findFirst() + .orElse(null); + if (Objects.isNull(area)) { + areasForAdd.add(new QuotationModelPriceItemArea() + .setAreaId(ai.getId()) + .setPriceId(price.getId()) + .setPriceItemId(item.getId()) + .setAmount(ait.getAmount())); + } else { + area.setAmount(ait.getAmount()); + areasForUpdate.add(area); + } + } } } else { - item.setUpdateById(AdminUserUtil.getUserId()); - item.setUpdateBy(AdminUserUtil.getUserName()); - item.setUpdateTime(LocalDateTime.now()); - itemsForUpdate.add(item); - QuotationModelPriceItem finalItem = item; for (ModelPriceSaveAreaRequest ait : sit.getAreas()) { DictionaryItem ai = dbAreas.stream() .filter(a -> a.getCode().equals(ait.getAreaCode())) @@ -230,18 +250,12 @@ public class PriceConfigController extends ControllerBase { .orElse(null); VUtils.trueThrowBusinessError(Objects.isNull(ai)).throwMessage("找不到区域:" + ait.getAreaCode()); QuotationModelPriceItemArea area = areas.stream() - .filter(it -> it.getPriceItemId().equals(finalItem.getId()) + .filter(it -> it.getPriceItemId().equals(0L) && it.getAreaId().equals(ai.getId()) ) .findFirst() .orElse(null); - if (Objects.isNull(area)) { - areasForAdd.add(new QuotationModelPriceItemArea() - .setAreaId(ai.getId()) - .setPriceId(price.getId()) - .setPriceItemId(item.getId()) - .setAmount(ait.getAmount())); - } else { + if (Objects.nonNull(area)) { area.setAmount(ait.getAmount()); areasForUpdate.add(area); } @@ -279,69 +293,90 @@ public class PriceConfigController extends ControllerBase { price.setUpdateBy(AdminUserUtil.getUserName()); price.setUpdateTime(LocalDateTime.now()); for (ModelPriceSaveRequest sit : itemList) { - QuotationModelPriceItem dbItem = dbItems.stream() - .filter(ait -> ait.getConfigItemUniqueId().equals(sit.getConfigItemUniqueId())) - .findFirst() - .orElse(null); - if (Objects.nonNull(dbItem)) { - List areas = areasForAdd.stream() - .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(ai.getId())) - .findFirst() - .orElse(null); - if (Objects.nonNull(area)) { - area.setId(IdUtil.getSnowflakeNextId()); - area.setPriceId(price.getId()); - area.setAmount(ait.getAmount()); - areasForAdd.add(area); - } else { + if (sit.getConfigItemUniqueId() > 0) { + QuotationModelPriceItem dbItem = dbItems.stream() + .filter(ait -> ait.getConfigItemUniqueId().equals(sit.getConfigItemUniqueId())) + .findFirst() + .orElse(null); + if (Objects.nonNull(dbItem)) { + List areas = areasForAdd.stream() + .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(ai.getId())) + .findFirst() + .orElse(null); + if (Objects.nonNull(area)) { + area.setId(IdUtil.getSnowflakeNextId()); + area.setPriceId(price.getId()); + area.setAmount(ait.getAmount()); + areasForAdd.add(area); + } else { + areasForAdd.add(new QuotationModelPriceItemArea() + .setAreaId(ai.getId()) + .setPriceId(price.getId()) + .setPriceItemId(dbItem.getId()) + .setAmount(ait.getAmount())); + } + } + } else { + QuotationModelPriceItem item = new QuotationModelPriceItem() + .setId(IdUtil.getSnowflakeNextId()) + .setPriceId(price.getId()) + .setConfigItemUniqueId(sit.getConfigItemUniqueId()) + .setUpdateById(AdminUserUtil.getUserId()) + .setUpdateBy(AdminUserUtil.getUserName()) + .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(ai.getId()) .setPriceId(price.getId()) - .setPriceItemId(dbItem.getId()) + .setPriceItemId(item.getId()) .setAmount(ait.getAmount())); } } } else { - QuotationModelPriceItem item = new QuotationModelPriceItem() - .setId(IdUtil.getSnowflakeNextId()) - .setPriceId(price.getId()) - .setConfigItemUniqueId(sit.getConfigItemUniqueId()) - .setUpdateById(AdminUserUtil.getUserId()) - .setUpdateBy(AdminUserUtil.getUserName()) - .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(ai.getId()) - .setPriceId(price.getId()) - .setPriceItemId(item.getId()) - .setAmount(ait.getAmount())); + 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) { + Long itemId = IdUtil.getSnowflakeNextId(); item.setUpdateById(AdminUserUtil.getUserId()); item.setUpdateBy(AdminUserUtil.getUserName()); item.setUpdateTime(LocalDateTime.now()); - item.setId(IdUtil.getSnowflakeNextId()); item.setPriceId(price.getId()); areasForAdd.stream() .filter(area -> area.getPriceItemId().equals(item.getId())) - .forEach(area -> area.setPriceItemId(item.getId())); + .forEach(area -> area.setPriceItemId(itemId)); + item.setId(itemId); } priceService.save(price); if (CollectionUtil.isNotEmpty(itemsForAdd)) { diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelDiscount.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelDiscount.java new file mode 100644 index 00000000..fc4e1c74 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelDiscount.java @@ -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; + +/** + *

+ * 报价-机型折扣 + *

+ * + * @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; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelDiscountApply.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelDiscountApply.java new file mode 100644 index 00000000..64ee6adc --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelDiscountApply.java @@ -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; + +/** + *

+ * 报价-机型折扣-折扣对象 + *

+ * + * @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; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelDiscountArea.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelDiscountArea.java new file mode 100644 index 00000000..d10af9f2 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelDiscountArea.java @@ -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; + +/** + *

+ * 报价-机型折扣-区域 + *

+ * @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; + } +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelDiscountApplyMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelDiscountApplyMapper.java new file mode 100644 index 00000000..711bba3e --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelDiscountApplyMapper.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.mapper; + +import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountApply; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 报价-机型折扣-折扣对象 Mapper 接口 + *

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

+ * 报价-机型折扣-区域 Mapper 接口 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface QuotationModelDiscountAreaMapper extends BaseMapper { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelDiscountMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelDiscountMapper.java new file mode 100644 index 00000000..c6ca0551 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelDiscountMapper.java @@ -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; + +/** + *

+ * 报价-机型折扣 Mapper 接口 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface QuotationModelDiscountMapper extends BaseMapper { + + IPage search(ModelConfigSearchRequest request, Page page); +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelDiscountApplyService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelDiscountApplyService.java new file mode 100644 index 00000000..954d847c --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelDiscountApplyService.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.service; + +import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountApply; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 报价-机型折扣-折扣对象 服务类 + *

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

+ * 报价-机型折扣-区域 服务类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface IQuotationModelDiscountAreaService extends IService { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelDiscountService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelDiscountService.java new file mode 100644 index 00000000..6af28532 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelDiscountService.java @@ -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; + +/** + *

+ * 报价-机型折扣 服务类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface IQuotationModelDiscountService extends IService { + + IPage search(ModelConfigSearchRequest request); +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java index dbd52967..e5d020aa 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java @@ -87,6 +87,12 @@ public class AdminUserServiceImpl extends ServiceImpl roots = adminUsers.stream() .filter(u -> Objects.equals(u.getDepartmentId(), department.getId())) .collect(Collectors.toList()); - if (CollectionUtil.isEmpty(adminUsers)) { + if (CollectionUtil.isEmpty(roots)) { return Collections.emptyList(); } List rootUserVOS = convert(roots, department, positions, roleMaps, roles); diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelDiscountApplyServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelDiscountApplyServiceImpl.java new file mode 100644 index 00000000..65c2cc01 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelDiscountApplyServiceImpl.java @@ -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; + +/** + *

+ * 报价-机型折扣-折扣对象 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Service +public class QuotationModelDiscountApplyServiceImpl extends ServiceImpl implements IQuotationModelDiscountApplyService { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelDiscountAreaServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelDiscountAreaServiceImpl.java new file mode 100644 index 00000000..b8b25f3e --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelDiscountAreaServiceImpl.java @@ -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; + +/** + *

+ * 报价-机型折扣-区域 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Service +public class QuotationModelDiscountAreaServiceImpl extends ServiceImpl implements IQuotationModelDiscountAreaService { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelDiscountServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelDiscountServiceImpl.java new file mode 100644 index 00000000..8b6799fe --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelDiscountServiceImpl.java @@ -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; + +/** + *

+ * 报价-机型折扣 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Service +public class QuotationModelDiscountServiceImpl extends ServiceImpl implements IQuotationModelDiscountService { + + @Override + public IPage search(ModelConfigSearchRequest request) { + return baseMapper.search(request, new Page<>(request.getPage(), request.getPageSize())); + } +} 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 66b56e68..a27b6961 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 @@ -3,6 +3,7 @@ package com.nflg.mobilebroken.repository.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.metadata.IPage; 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.vo.ModelPriceConfigAreaVO; import com.nflg.mobilebroken.common.pojo.vo.ModelPriceConfigVO; @@ -63,7 +64,7 @@ public class QuotationModelPriceServiceImpl extends ServiceImpl priceItems = CollectionUtil.isEmpty(priceIds) ? new ArrayList<>() : priceItemService.lambdaQuery() .in(QuotationModelPriceItem::getPriceId, priceIds) .list(); - List areas = dictionaryItemService.getListByDictionaryCode("DispatchCategory"); + List areas = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DIRECT_SALES_CATEGORY); pdata.getRecords().forEach(data -> { if (Objects.nonNull(data.getConfigId())) { List items = configItems.stream() @@ -108,7 +109,7 @@ public class QuotationModelPriceServiceImpl extends ServiceImpl + + + + diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelDiscountAreaMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelDiscountAreaMapper.xml new file mode 100644 index 00000000..07d5c503 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelDiscountAreaMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelDiscountMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelDiscountMapper.xml new file mode 100644 index 00000000..5820b207 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelDiscountMapper.xml @@ -0,0 +1,30 @@ + + + + + + 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 200ef987..78bcd976 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_price_item_area") //只生成指定表 + builder.addInclude("quotation_model_discount_area") //只生成指定表 .entityBuilder() .enableLombok() .enableChainModel()