diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AppUserController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AppUserController.java index 34b74b69..cb661de2 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AppUserController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AppUserController.java @@ -232,6 +232,8 @@ public class AppUserController extends ControllerBase { if (!Objects.equals(user.getState(), UserState.ToBeActivated.getState()) && Objects.nonNull(request.getEnable())) { user.setState(request.getEnable() ? UserState.Activated.getState() : UserState.Disabled.getState()); } + String quotationCode = appUserService.getAppUserQuotationCode(request.getCompanyIds()); + user.setQuotationCode(quotationCode); appUserService.updateById(user); } @@ -288,6 +290,9 @@ public class AppUserController extends ControllerBase { .in(AppUser::getId, children.stream().map(AppUser::getId).collect(Collectors.toList())) .update(); } + //更新报价人代码g + String quotationCode = appUserService.getAppUserQuotationCode(request.getCompanyIds()); + user.setQuotationCode(quotationCode); appUserService.updateById(user); } 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..f4fb4365 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 @@ -47,7 +47,7 @@ public class BaseAreaController extends ControllerBase { * @return */ @PostMapping("getList") - public ApiResult> getList(@RequestBody BaseAreaQuery query){ + public ApiResult> getList(@RequestBody BaseAreaQuery query) { // return adminBaseAreaService.getList(query); } @@ -59,7 +59,7 @@ public class BaseAreaController extends ControllerBase { */ @GetMapping("getChild") @ApiMark(moduleName = "区域管理", apiName = "获取子级") - public ApiResult> getChild(@RequestParam("parentId") Integer parentId ){ + public ApiResult> getChild(@RequestParam("parentId") Integer parentId) { List result = baseAreaService.lambdaQuery().eq(TBaseArea::getParentAreaRowId, parentId).list(); return ApiResult.success(Convert.toList(TBaseAreaVO.class, result)); } @@ -70,13 +70,13 @@ public class BaseAreaController extends ControllerBase { * @return */ @PostMapping("add") - @MethodInfoMark(value = "新增" ,menuName = "区域管理") + @MethodInfoMark(value = "新增", menuName = "区域管理") @ApiMark(moduleName = "区域管理", apiName = "新增") - public ApiResult add(@Valid @RequestBody BaseAreaEditDTO baseAreaEditDTO){ + public ApiResult add(@Valid @RequestBody BaseAreaEditDTO baseAreaEditDTO) { List checkCode = baseAreaService.lambdaQuery().eq(TBaseArea::getAreaName, baseAreaEditDTO.getAreaName()).list(); VUtils.trueThrowBusinessError(CollUtil.isNotEmpty(checkCode)).throwMessage("区域名称已存在"); - Integer count = baseAreaService.getCount()+1; + Integer count = baseAreaService.getCount() + 1; TBaseArea ent = Convert.convert(TBaseArea.class, baseAreaEditDTO); ent.setId(null); ent.setDataCreateUserNo(AdminUserUtil.getUserNo()); @@ -86,6 +86,7 @@ public class BaseAreaController extends ControllerBase { // ent.setDataModifyUserName(AdminUserUtil.getUserName()); // ent.setDataModifyTime(LocalDateTime.now()); ent.setAreaCode(UniqueSequenceGenerator.generateCode(Constant.AreaCodePrefix)); + ent.setAreaQuoteCode(baseAreaEditDTO.getAreaQuoteCode()); baseAreaService.save(ent); return ApiResult.success(true); @@ -99,8 +100,8 @@ public class BaseAreaController extends ControllerBase { @PostMapping("update") @MethodInfoMark(value = "编辑", menuName = "区域管理") @ApiMark(moduleName = "区域管理", apiName = "编辑") - public ApiResult update(@Valid @RequestBody BaseAreaEditDTO baseAreaEditDTO){ - VUtils.trueThrow(baseAreaEditDTO.getId()<=0).throwMessage(STATE.ParamErr,"编辑时ID参数不能为空"); + public ApiResult update(@Valid @RequestBody BaseAreaEditDTO baseAreaEditDTO) { + VUtils.trueThrow(baseAreaEditDTO.getId() <= 0).throwMessage(STATE.ParamErr, "编辑时ID参数不能为空"); TBaseArea oldEnt = baseAreaService.getById(baseAreaEditDTO.getId()); VUtils.trueThrowBusinessError(Objects.isNull(oldEnt)).throwMessage("区域不存在"); oldEnt.setParentAreaRowId(baseAreaEditDTO.getParentAreaRowId()); @@ -108,6 +109,7 @@ public class BaseAreaController extends ControllerBase { oldEnt.setDataModifyUserNo(AdminUserUtil.getUserNo()); oldEnt.setDataModifyUserName(AdminUserUtil.getUserName()); oldEnt.setDataModifyTime(LocalDateTime.now()); + oldEnt.setAreaQuoteCode(baseAreaEditDTO.getAreaQuoteCode()); baseAreaService.updateById(oldEnt); return ApiResult.success(true); @@ -119,24 +121,24 @@ public class BaseAreaController extends ControllerBase { * @return */ @PostMapping("del") - @MethodInfoMark(value = "删除" ,menuName = "区域管理") + @MethodInfoMark(value = "删除", menuName = "区域管理") @ApiMark(moduleName = "区域管理", apiName = "删除") - public ApiResult del(@RequestBody List ids){ - VUtils.trueThrow(CollUtil.isEmpty(ids)).throwMessage(STATE.ParamErr,"请选择要删除的行"); + public ApiResult del(@RequestBody List ids) { + VUtils.trueThrow(CollUtil.isEmpty(ids)).throwMessage(STATE.ParamErr, "请选择要删除的行"); //检查下面是否有 List delNodes = baseAreaService.getBaseMapper().selectByIds(ids); - List hasChildNodes=new ArrayList<>(); - List childIds=new ArrayList<>(); - for ( TBaseArea delNode: delNodes) { + List hasChildNodes = new ArrayList<>(); + List childIds = new ArrayList<>(); + for (TBaseArea delNode : delNodes) { childIds.clear(); - adminBaseAreaService.getAllChildIds( Convert.convert(TBaseAreaVO.class,delNode) ,childIds); - if(CollUtil.isNotEmpty(childIds)){ + adminBaseAreaService.getAllChildIds(Convert.convert(TBaseAreaVO.class, delNode), childIds); + if (CollUtil.isNotEmpty(childIds)) { hasChildNodes.add(delNode.getAreaName()); } } - if(CollUtil.isNotEmpty(hasChildNodes)){ - throw new NflgException(STATE.ParamErr,StrUtil.join(",", hasChildNodes)+" 存在子级区域,请先删除子级"); + if (CollUtil.isNotEmpty(hasChildNodes)) { + throw new NflgException(STATE.ParamErr, StrUtil.join(",", hasChildNodes) + " 存在子级区域,请先删除子级"); } baseAreaService.getBaseMapper().deleteByIds(ids); @@ -152,10 +154,10 @@ public class BaseAreaController extends ControllerBase { * @return */ @PostMapping("enable") - @MethodInfoMark(value = "启用" ,menuName = "区域管理") + @MethodInfoMark(value = "启用", menuName = "区域管理") @ApiMark(moduleName = "区域管理", apiName = "启用") - public ApiResult enable(@RequestBody List ids){ - VUtils.trueThrow(CollUtil.isEmpty(ids)).throwMessage(STATE.ParamErr,"请选择要启用的行"); + public ApiResult enable(@RequestBody List ids) { + VUtils.trueThrow(CollUtil.isEmpty(ids)).throwMessage(STATE.ParamErr, "请选择要启用的行"); baseAreaService.upState(1, ids, AdminUserUtil.getUserNo(), AdminUserUtil.getUserName()); return ApiResult.success(true); @@ -168,15 +170,15 @@ public class BaseAreaController extends ControllerBase { * @return */ @PostMapping("disable") - @MethodInfoMark(value = "禁用" ,menuName = "区域管理") + @MethodInfoMark(value = "禁用", menuName = "区域管理") @ApiMark(moduleName = "区域管理", apiName = "禁用") - public ApiResult disable(@RequestBody List ids){ - VUtils.trueThrow(CollUtil.isEmpty(ids)).throwMessage(STATE.ParamErr,"请选择要禁用的行"); + public ApiResult disable(@RequestBody List ids) { + VUtils.trueThrow(CollUtil.isEmpty(ids)).throwMessage(STATE.ParamErr, "请选择要禁用的行"); List tBaseAreas = baseAreaService.getBaseMapper().selectByIds(ids); - List allIds=new ArrayList<>(); + List allIds = new ArrayList<>(); allIds.addAll(ids); - for (TBaseArea baseArea :tBaseAreas) { - adminBaseAreaService.getAllChildIds(Convert.convert(TBaseAreaVO.class,baseArea) , allIds); + for (TBaseArea baseArea : tBaseAreas) { + adminBaseAreaService.getAllChildIds(Convert.convert(TBaseAreaVO.class, baseArea), allIds); } baseAreaService.upState(0, allIds, AdminUserUtil.getUserNo(), AdminUserUtil.getUserName()); diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/BaseAreaEditDTO.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/BaseAreaEditDTO.java index d91d1b4c..9234db39 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/BaseAreaEditDTO.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/BaseAreaEditDTO.java @@ -10,11 +10,14 @@ import javax.validation.constraints.NotBlank; @Data public class BaseAreaEditDTO { - private Integer id=0; + private Integer id = 0; - private Integer parentAreaRowId=0; + private Integer parentAreaRowId = 0; @NotBlank(message = "区域名称不能为空") private String areaName; + + @NotBlank(message = "区域报价编码不能为空") + private String areaQuoteCode; } diff --git a/nflg-mobilebroken-auth/src/main/java/com/nflg/mobilebroken/auth/controller/AdminController.java b/nflg-mobilebroken-auth/src/main/java/com/nflg/mobilebroken/auth/controller/AdminController.java index f37d4387..15e1f137 100644 --- a/nflg-mobilebroken-auth/src/main/java/com/nflg/mobilebroken/auth/controller/AdminController.java +++ b/nflg-mobilebroken-auth/src/main/java/com/nflg/mobilebroken/auth/controller/AdminController.java @@ -64,6 +64,7 @@ public class AdminController extends ControllerBase { .setExtra("name", user.getUserName()) .setExtra("code", user.getUserCode()) .setExtra("email", user.getEmail()) + .setExtra("quotationCode", user.getQuotationCode()) .setExtra("roles", roleCodes.stream().map(RoleVO::getCode).collect(Collectors.toList())) .setExtra("language", Constant.DEFAULT_LANGUAGE_CODE + "-中文") ); diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminUserVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminUserVO.java index 00811883..3c292054 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminUserVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminUserVO.java @@ -66,6 +66,8 @@ public class AdminUserVO { //微信openid private String openId; + //报价代码 + private String quotationCode; /** * 产品线,多个用逗号分隔 */ diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TBaseAreaVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TBaseAreaVO.java index 2c768bb9..383a35d9 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TBaseAreaVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TBaseAreaVO.java @@ -84,6 +84,10 @@ public class TBaseAreaVO implements Serializable { */ private List children; + /** + * 报价区域代码 + */ + private String areaQuoteCode; @Override public boolean equals(Object o) { diff --git a/nflg-mobilebroken-repository/pom.xml b/nflg-mobilebroken-repository/pom.xml index a4410904..10160d6b 100644 --- a/nflg-mobilebroken-repository/pom.xml +++ b/nflg-mobilebroken-repository/pom.xml @@ -25,6 +25,10 @@ freemarker test + + org.springframework.retry + spring-retry + com.baomidou mybatis-plus-boot-starter diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminBaseSerialNumber.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminBaseSerialNumber.java new file mode 100644 index 00000000..954e6140 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminBaseSerialNumber.java @@ -0,0 +1,59 @@ +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 lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + *

+ * + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("admin_base_serial_number") +public class AdminBaseSerialNumber implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 0 管理端的报价人编号;1 代理商的报价人单号 + */ + private Integer businessType; + + /** + * 当前时间 YYYYMMDD + */ + private String currentDateStr; + + /** + * 当前最大流水号 + */ + private Integer maxSerial; + + /** + * 乐观锁版本号 + */ + private Integer version; + + /** + * 前缀 + */ + private String businessPrefixNumber; + + /** + * 流水号的长度 + */ + private Integer serialLength; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminUser.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminUser.java index d594a7d2..0a0648a2 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminUser.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminUser.java @@ -132,4 +132,10 @@ public class AdminUser implements Serializable { */ @TableField("is_gongfu") private boolean gongfu; + + /** + * 报价人代码 + */ + private String quotationCode; + } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AppUser.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AppUser.java index ab6dd52a..97d6fb63 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AppUser.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AppUser.java @@ -151,6 +151,12 @@ public class AppUser implements Serializable { */ private String customerName; + /** + * 报价人代码 + */ + private String quotationCode; + + /** * 地域类型,字典id */ diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelForbid.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelForbid.java new file mode 100644 index 00000000..b89c1957 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelForbid.java @@ -0,0 +1,77 @@ +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_forbid") +public class QuotationModelForbid implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; + + /** + * 禁止机型的流水ID + */ + private Integer modelId; + + /** + * 用户ID + */ + private Integer userId; + + /** + * 用户类型 0 内部用户;1 外部用户 + */ + private Integer userType; + + /** + * 是否仅售 + */ + private Boolean isForbid; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 新增人编号 + */ + private Integer createById; + + /** + * 修改人编号 + */ + private Integer updateById; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TBaseArea.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TBaseArea.java index b8fa322c..cb0dbd7d 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TBaseArea.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TBaseArea.java @@ -15,7 +15,7 @@ import lombok.experimental.Accessors; *

* * @author 代码生成器生成 - * @since 2025 + * @since 2026 */ @Getter @Setter @@ -47,7 +47,7 @@ public class TBaseArea implements Serializable { private String areaName; /** - * 状态 + * 状态 0-禁用 1-启用 */ private Byte areaState; @@ -85,4 +85,9 @@ public class TBaseArea implements Serializable { * 是否删除0-否 1-是 */ private Integer delIs; + + /** + * 报价区域代码 + */ + private String areaQuoteCode; } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/AdminBaseSerialNumberMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/AdminBaseSerialNumberMapper.java new file mode 100644 index 00000000..93f41782 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/AdminBaseSerialNumberMapper.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.mapper; + +import com.nflg.mobilebroken.repository.entity.AdminBaseSerialNumber; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

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

+ * Mapper 接口 + *

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

+ * 服务类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface IAdminBaseSerialNumberService extends IService { + + /** + * 生成流水号 + * @param businessType 业务类型 + * @param prefixNumber 前缀 + * @param specialNumber 特殊编号 + * @param hasTimeStr 是否包含时间 + * @param serialLength 流水号长度 + * @return 流水号 + */ + String generateSerialNumber(Integer businessType, String prefixNumber, String specialNumber, + boolean hasTimeStr, Integer serialLength); +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppUserService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppUserService.java index 37a05d39..430348b9 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppUserService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppUserService.java @@ -22,7 +22,15 @@ import java.util.List; */ public interface IAppUserService extends IService { - AppUser getUser(String userName,String password); + /** + * 获取用户报价码 + * + * @param companyId 公司id + * @return 报价码 + */ + String getAppUserQuotationCode(List companyId); + + AppUser getUser(String userName, String password); void disable(Integer id); diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelForbidService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelForbidService.java new file mode 100644 index 00000000..9956d8ea --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelForbidService.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.service; + +import com.nflg.mobilebroken.repository.entity.QuotationModelForbid; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface IQuotationModelForbidService extends IService { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminBaseSerialNumberServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminBaseSerialNumberServiceImpl.java new file mode 100644 index 00000000..84a1c641 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminBaseSerialNumberServiceImpl.java @@ -0,0 +1,72 @@ +package com.nflg.mobilebroken.repository.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.nflg.mobilebroken.repository.entity.AdminBaseSerialNumber; +import com.nflg.mobilebroken.repository.mapper.AdminBaseSerialNumberMapper; +import com.nflg.mobilebroken.repository.service.IAdminBaseSerialNumberService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Objects; + +/** + *

+ * 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Service +public class AdminBaseSerialNumberServiceImpl extends ServiceImpl implements IAdminBaseSerialNumberService { + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); + private static final int MAX_RETRY = 5; // 最大重试次数 + + @Retryable( + maxAttempts = 5, // 最大重试次数(包括第一次调用) + backoff = @Backoff(delay = 1000) // 重试间隔1秒 + ) + + @Override + public String generateSerialNumber(Integer businessType, String prefixNumber, String specialNumber, + boolean hasTimeStr, Integer serialLength) { + String currentDate = ""; + String serialNo = ""; + AdminBaseSerialNumber serialNumber = this.lambdaQuery() + .eq(AdminBaseSerialNumber::getBusinessType, businessType) + .one(); + if (hasTimeStr) { + currentDate = LocalDate.now().format(DATE_FORMATTER); + } + + if (Objects.isNull(serialNumber)) { + // 插入数据库 + AdminBaseSerialNumber newModel = new AdminBaseSerialNumber() + .setBusinessType(businessType) + .setCurrentDateStr(currentDate) + .setMaxSerial(1) + .setBusinessPrefixNumber(prefixNumber) + .setSerialLength(serialLength); + this.save(newModel); + serialNo = prefixNumber + specialNumber + currentDate + String.format("%0" + serialLength + "d", 1); + } else { +// 判断是否有时间 + Integer startSerial = 1; + if (hasTimeStr) { + if (serialNumber.getCurrentDateStr().equals(currentDate)) { + startSerial = serialNumber.getMaxSerial() + 1; + } + } + serialNumber.setSerialLength(serialLength); + serialNumber.setMaxSerial(startSerial); + serialNumber.setCurrentDateStr(currentDate); + this.updateById(serialNumber); + serialNo = prefixNumber + specialNumber + currentDate + String.format("%0" + serialLength + "d", startSerial); + } + return serialNo; + } +} 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 484228df..dedea371 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 @@ -67,6 +67,10 @@ public class AdminUserServiceImpl extends ServiceImpl rmaps.contains(r.getId())) diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserApplyforServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserApplyforServiceImpl.java index f3d5ca6f..0a1eb371 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserApplyforServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserApplyforServiceImpl.java @@ -22,13 +22,11 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.ttzero.excel.util.StringUtil; import javax.annotation.Resource; import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -111,7 +109,7 @@ public class AppUserApplyforServiceImpl extends ServiceImpl areas=customerService.getAreas(Arrays.stream(appUser.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList())); + Collection areas = customerService.getAreas(Arrays.stream(appUser.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList())); vo.setUser(new AppUserVO() - .setAreaName(StrUtil.join(",",areas)) + .setAreaName(StrUtil.join(",", areas)) .setSalesUserName(appUser.getSalesUserName()) .setState(1) .setTitle(Objects.isNull(appUser.getTitleId()) ? "" : positionService.getById(appUser.getTitleId()).getPositionName()) @@ -202,6 +200,9 @@ public class AppUserApplyforServiceImpl extends ServiceImpl companyIds = new ArrayList<>(); + companyIds.add(applyfor.getCompanyId()); + String quoationCode = appUserService.getAppUserQuotationCode(companyIds); AppUser user = new AppUser() .setLoginName(applyfor.getUserEmail()) .setName(applyfor.getUserName()) @@ -221,12 +222,21 @@ public class AppUserApplyforServiceImpl extends ServiceImpl companyIds = Arrays.stream(appUser.getCompanyId().split(",")) + .map(Integer::parseInt) + .collect(Collectors.toSet()); + String quoationCode = appUserService.getAppUserQuotationCode(new ArrayList<>(companyIds)); + appUser.setQuotationCode(quoationCode); + } appUser.setState(UserState.Activated.getState()) .setUpdateBy(applyUser.getName()) .setUpdateTime(LocalDateTime.now()); diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserServiceImpl.java index 8f7c7500..74166ae0 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserServiceImpl.java @@ -1,6 +1,7 @@ package com.nflg.mobilebroken.repository.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -30,6 +31,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.chrono.ChronoLocalDate; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -71,6 +73,101 @@ public class AppUserServiceImpl extends ServiceImpl impl @Resource private ITBaseAreaService baseAreaService; + @Resource + private IAdminBaseSerialNumberService adminBaseSerialNumberService; + + @Override + public String getAppUserQuotationCode(List companyId) { + if (CollectionUtil.isEmpty(companyId)) + return ""; + // 根据公司ID查询公司的区域信息 + List customers = customerService.lambdaQuery() + .in(TBaseCustomer::getId, companyId) + .eq(TBaseCustomer::getQuotationUse, true) + .list(); + if (CollectionUtil.isEmpty(customers)) { + return ""; + } + + // 获取到公司的区域代码 + List areaCodes = customers.stream() + .map(TBaseCustomer::getAreaCode) + .collect(Collectors.toList()); + Set uniqueAreaCodes = areaCodes.stream() + .filter(StrUtil::isNotBlank) + .flatMap(code -> Arrays.stream(code.split(","))) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()); + VUtils.trueThrowBusinessError(CollectionUtil.isEmpty(uniqueAreaCodes)).throwMessage("存在未维护区域信息的代理公司,请先维护区域信息"); + String specialCode = ""; + List areas = adminAreaService.lambdaQuery() + .in(TBaseArea::getAreaCode, uniqueAreaCodes) + .list(); + VUtils.trueThrowBusinessError(CollectionUtil.isEmpty(areas)).throwMessage("代理公司的区域信息维护有误,请先维护区域信息"); +// for (TBaseArea area : areas) { +// VUtils.trueThrowBusinessError(StrUtil.isBlank(area.getAreaQuoteCode())).throwMessage("区域报价代码没有维护,请先维护"); +// specialCode += "-" + area.getAreaQuoteCode(); +// } + // 如果是只有一个公司或区域,就返回区域报价代码 + if (areas.size() == 1) { + VUtils.trueThrowBusinessError(StrUtil.isBlank(areas.get(0).getAreaQuoteCode())).throwMessage("区域报价代码没有维护,请先维护"); + specialCode = areas.get(0).getAreaQuoteCode(); + } + // 如果存在多个公司或区域,需要查询上级 + Set parentIds = areas.stream() + .map(TBaseArea::getParentAreaRowId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + List parentAreas = adminAreaService.lambdaQuery() + .in(TBaseArea::getId, parentIds) + .list(); + // 如果只有一个上级,就返回上级报价代码 + if (parentAreas.size() == 1) { + VUtils.trueThrowBusinessError(StrUtil.isBlank(parentAreas.get(0).getAreaQuoteCode())).throwMessage("区域报价代码没有维护,请先维护"); + specialCode = parentAreas.get(0).getAreaQuoteCode(); + } else { + // 多个上级,区别处理,合并相同上级的,单独列出一个上级的 + Map parentCountMap = areas.stream() + .map(TBaseArea::getParentAreaRowId) + .filter(Objects::nonNull) + .collect(Collectors.groupingBy( + Function.identity(), + Collectors.counting() + )); + Set parentIds2 = parentCountMap.entrySet().stream() + .filter(entry -> entry.getValue() > 2) // 出现次数大于2 + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + + for (Integer parentId : parentIds2) { + TBaseArea parentArea = parentAreas.stream() + .filter(area -> area.getId().equals(parentId)) + .findFirst() + .orElse(null); + VUtils.trueThrowBusinessError(ObjectUtil.isNull(parentArea) || StrUtil.isBlank(parentArea.getAreaQuoteCode())).throwMessage("区域报价代码没有维护,请先维护"); + specialCode += "-" + parentArea.getAreaQuoteCode(); + } + + Set parentIds1 = parentCountMap.entrySet().stream() + .filter(entry -> entry.getValue() == 1) // 出现次数=1 + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + + List parentAreas1 = areas.stream() + .filter(area -> parentIds1.contains(area.getParentAreaRowId())) + .collect(Collectors.toList()); + + for (TBaseArea baseArea : parentAreas1) { + VUtils.trueThrowBusinessError(StrUtil.isBlank(baseArea.getAreaQuoteCode())).throwMessage("区域报价代码没有维护,请先维护"); + specialCode += "-" + baseArea.getAreaQuoteCode(); + } + } + + String code = adminBaseSerialNumberService.generateSerialNumber(1, "", specialCode, false, 6); + return code; + } + + @Override public AppUser getUser(String userName, String password) { AppUser user = lambdaQuery() @@ -157,6 +254,8 @@ public class AppUserServiceImpl extends ServiceImpl impl } String encodePassword = PASSWORDENCODER.encode(request.getPassword()); AppUser user = lambdaQuery().eq(AppUser::getLoginName, request.getLoginName()).one(); + String quotationCode = getAppUserQuotationCode(request.getCompanyIds()); + if (Objects.nonNull(user)) { VUtils.trueThrowBusinessError(!user.getIsDel()).throwMessage("登录名已存在"); user.setIsDel(false) @@ -175,9 +274,11 @@ public class AppUserServiceImpl extends ServiceImpl impl .setDepartmentId(request.getDepartmentId()) .setRegionTypeId(request.getRegionTypeId()) .setState(UserState.ToBeActivated.getState()) + .setQuotationCode(quotationCode) .setExpireTime(LocalDate.of(LocalDateTime.now().getYear() + 1, 1, 1)); updateById(user); } else { + // String quotationCode = adminBaseSerialNumberService.generateSerialNumber(1, "A", "", false, 6); user = new AppUser() .setLoginName(request.getLoginName()) .setName(request.getUserName()) @@ -194,6 +295,7 @@ public class AppUserServiceImpl extends ServiceImpl impl .setRegionTypeId(request.getRegionTypeId()) .setCreateBy(AdminUserUtil.getUserName()) .setCreateTime(LocalDateTime.now()) + .setQuotationCode(quotationCode) .setState(UserState.ToBeActivated.getState()) .setExpireTime(LocalDate.of(LocalDateTime.now().getYear() + 1, 1, 1)); save(user); @@ -402,16 +504,32 @@ public class AppUserServiceImpl extends ServiceImpl impl public void migrate(MigrateAppUserRequest request) { AppUser appUser = getPrimaryByCompanyId(request.getCompanyId().toString()); VUtils.trueThrowBusinessError(Objects.isNull(appUser)).throwMessage("该公司还未设置主账号"); - lambdaUpdate() - .set(AppUser::getCompanyId, request.getCompanyId()) - .set(AppUser::getExpireTime, appUser.getExpireTime()) -// .set(AppUser::getUpdateBy, AdminUserUtil.getUserId()) - .set(AppUser::getAreaId, null) - .set(AppUser::getUpdateTime, LocalDateTime.now()) - .eq(AppUser::getIsDel, false) - .eq(AppUser::getIsPrimary, false) - .in(AppUser::getId, request.getUserIds()) - .update(); + List companyIds = new ArrayList<>(); + companyIds.add(request.getCompanyId()); + + for (Integer userId : request.getUserIds()) { + String quotaionCode = getAppUserQuotationCode(companyIds); + lambdaUpdate() + .set(AppUser::getQuotationCode, quotaionCode) + .set(AppUser::getCompanyId, request.getCompanyId()) + .set(AppUser::getExpireTime, appUser.getExpireTime()) + .set(AppUser::getAreaId, null) + .set(AppUser::getUpdateTime, LocalDateTime.now()) + .eq(AppUser::getIsDel, false) + .eq(AppUser::getIsPrimary, false) + .eq(AppUser::getId, userId) + .update(); + } +// lambdaUpdate() +// .set(AppUser::getCompanyId, request.getCompanyId()) +// .set(AppUser::getExpireTime, appUser.getExpireTime()) +//// .set(AppUser::getUpdateBy, AdminUserUtil.getUserId()) +// .set(AppUser::getAreaId, null) +// .set(AppUser::getUpdateTime, LocalDateTime.now()) +// .eq(AppUser::getIsDel, false) +// .eq(AppUser::getIsPrimary, false) +// .in(AppUser::getId, request.getUserIds()) +// .update(); } @Override @@ -576,13 +694,27 @@ public class AppUserServiceImpl extends ServiceImpl impl @Override public void enable(EnableAppUserRequest request) { if (request.getEnable()) { - lambdaUpdate() - .set(AppUser::getState, UserState.Activated.getState()) - .set(AppUser::getUpdateBy, AdminUserUtil.getUserId()) - .set(AppUser::getUpdateTime, LocalDateTime.now()) - .eq(AppUser::getIsDel, false) - .in(AppUser::getId, request.getIds()) - .update(); + for (Integer id : request.getIds()) { + AppUser appUser = getById(id); + List companyIds = Arrays.stream(appUser.getCompanyId().split(",")).filter(StrUtil::isNotBlank).map(Integer::valueOf).collect(Collectors.toList()); + String quoationCode = getAppUserQuotationCode(companyIds); + lambdaUpdate() + .set(AppUser::getQuotationCode, quoationCode) + .set(AppUser::getState, UserState.Activated.getState()) + .set(AppUser::getUpdateBy, AdminUserUtil.getUserId()) + .set(AppUser::getUpdateTime, LocalDateTime.now()) + .eq(AppUser::getIsDel, false) + .eq(AppUser::getId, id) + .update(); + } + +// lambdaUpdate() +// .set(AppUser::getState, UserState.Activated.getState()) +// .set(AppUser::getUpdateBy, AdminUserUtil.getUserId()) +// .set(AppUser::getUpdateTime, LocalDateTime.now()) +// .eq(AppUser::getIsDel, false) +// .in(AppUser::getId, request.getIds()) +// .update(); } else { lambdaUpdate() .set(AppUser::getState, UserState.Disabled.getState()) diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelForbidServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelForbidServiceImpl.java new file mode 100644 index 00000000..8a2c1d3f --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelForbidServiceImpl.java @@ -0,0 +1,20 @@ +package com.nflg.mobilebroken.repository.service.impl; + +import com.nflg.mobilebroken.repository.entity.QuotationModelForbid; +import com.nflg.mobilebroken.repository.mapper.QuotationModelForbidMapper; +import com.nflg.mobilebroken.repository.service.IQuotationModelForbidService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Service +public class QuotationModelForbidServiceImpl extends ServiceImpl implements IQuotationModelForbidService { + +} diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/AdminBaseSerialNumberMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/AdminBaseSerialNumberMapper.xml new file mode 100644 index 00000000..c4699c1b --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/AdminBaseSerialNumberMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelForbidMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelForbidMapper.xml new file mode 100644 index 00000000..15f6abd5 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelForbidMapper.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 85bd2504..07b2b439 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("admin_permission_role_column_map") //只生成指定表 + builder.addInclude("t_base_area") //只生成指定表 .entityBuilder() .enableLombok() .enableChainModel()