Merge branch 'feature/quotation-zhangke' into feature/quotation

# Conflicts:
#	nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AppUserController.java
#	nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/BaseAreaController.java
#	nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/BaseAreaEditDTO.java
#	nflg-mobilebroken-auth/src/main/java/com/nflg/mobilebroken/auth/controller/AdminController.java
#	nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/ControllerBase.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminUser.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AppUser.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelDiscount.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/QuotationModelForbid.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TBaseArea.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelDiscountMapper.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/QuotationModelForbidMapper.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelDiscountService.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IQuotationModelForbidService.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserApplyforServiceImpl.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserServiceImpl.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelDiscountServiceImpl.java
#	nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/QuotationModelForbidServiceImpl.java
#	nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelDiscountMapper.xml
#	nflg-mobilebroken-repository/src/main/resources/mapper/QuotationModelForbidMapper.xml
#	nflg-mobilebroken-repository/src/test/java/com/nflg/mobilebroken/repository/CodeGeneratorTest.java
This commit is contained in:
曹鹏飞 2026-03-12 16:27:28 +08:00
commit f36520de03
29 changed files with 772 additions and 55 deletions

View File

@ -246,6 +246,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);
}
@ -302,6 +304,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);
}

View File

@ -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);
}
@ -108,6 +109,7 @@ public class BaseAreaController extends ControllerBase {
oldEnt.setDataModifyUserName(AdminUserUtil.getUserName());
oldEnt.setDataModifyTime(LocalDateTime.now());
oldEnt.setCategoryId(baseAreaEditDTO.getCategoryId());
oldEnt.setAreaQuoteCode(baseAreaEditDTO.getAreaQuoteCode());
baseAreaService.updateById(oldEnt);
return ApiResult.success(true);

View File

@ -24,4 +24,7 @@ public class BaseAreaEditDTO {
*/
@NotNull(message = "类别不能为空")
private Long categoryId;
@NotBlank(message = "区域报价编码不能为空")
private String areaQuoteCode;
}

View File

@ -74,6 +74,7 @@ public class AdminController extends ControllerBase {
.setExtra("departmentName", Objects.isNull(department) ? null : department.getDeptName())
.setExtra("categoryId", user.getCategoryId())
.setExtra("categoryName", Objects.isNull(user.getCategoryId()) ? "" : dictionaryItemService.getById(user.getCategoryId()).getName())
.setExtra("quotationCode", user.getQuotationCode())
.setExtra("roles", roleCodes.stream().map(RoleVO::getCode).collect(Collectors.toList()))
.setExtra("language", Constant.DEFAULT_LANGUAGE_CODE + "-中文")
);

View File

@ -0,0 +1,55 @@
package com.nflg.mobilebroken.common.pojo.request;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@Accessors(chain = true)
public class EditQuotationDiscountRequest {
/**
* 流水号
*/
private Integer id;
/**
* 机型编号
*/
private Integer modelId;
/**
* 国内折扣
*/
private BigDecimal domesticDiscountRate;
/**
* 国内折扣开始时间
*/
private LocalDateTime domesticBeginTime;
/**
* 国内折扣结束时间
*/
private LocalDateTime domesticEndTime;
/**
* 国内折扣率
*/
private BigDecimal overseasDiscountRate;
/**
* 国外折扣开始时间
*/
private LocalDateTime overseasBeginTime;
/**
* 国外折扣结束时间
*/
private LocalDateTime overseasEndTime;
}

View File

@ -67,6 +67,8 @@ public class AdminUserVO {
//微信openid
private String openId;
//报价代码
private String quotationCode;
/**
* 产品线多个用逗号分隔
*/

View File

@ -0,0 +1,68 @@
package com.nflg.mobilebroken.common.pojo.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@Accessors(chain = true)
public class QuotationDiscountVO {
private Integer id;
/**
* 机型编号
*/
@NotNull
private Integer modelId;
/**
* 国内折扣
*/
@NotNull
private BigDecimal domesticDiscountRate;
/**
* 国内折扣开始时间
*/
@NotNull
private LocalDateTime domesticBeginTime;
/**
* 国内折扣结束时间
*/
@NotNull
private LocalDateTime domesticEndTime;
/**
* 折扣天数
*/
@NotNull
private Integer domesticDiscountDay;
/**
* 国内折扣率
*/
@NotNull
private BigDecimal overseasDiscountRate;
/**
* 国外折扣开始时间
*/
@NotNull
private LocalDateTime overseasBeginTime;
/**
* 国外折扣结束时间
*/
@NotNull
private LocalDateTime overseasEndTime;
}

View File

@ -94,6 +94,10 @@ public class TBaseAreaVO implements Serializable {
*/
private List<TBaseAreaVO> children;
/**
* 报价区域代码
*/
private String areaQuoteCode;
@Override
public boolean equals(Object o) {

View File

@ -0,0 +1,19 @@
package com.nflg.mobilebroken.quotation.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ApiMark {
String apiName() default "";
String moduleName() default "";
String code() default "";
boolean isPublic() default false;
}

View File

@ -0,0 +1,82 @@
package com.nflg.mobilebroken.quotation.controller;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.request.EditQuotationDiscountRequest;
import com.nflg.mobilebroken.common.pojo.vo.DepartmentSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.QuotationDiscountVO;
import com.nflg.mobilebroken.common.util.AdminUserUtil;
import com.nflg.mobilebroken.quotation.annotation.ApiMark;
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscount;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/discount")
@Slf4j
public class QuotationModelDiscountController extends ControllerBase {
@PostMapping("save")
@ApiMark(moduleName = "折扣管理", apiName = "保存设备的折扣信息")
public ApiResult<Void> getSimpleDepartments(List<EditQuotationDiscountRequest> requests) {
List<QuotationModelDiscount> addDatas = requests.stream()
.filter(request -> Objects.isNull(request.getId()))
.map(request -> {
return new QuotationModelDiscount()
.setModelId(request.getModelId())
.setDomesticDiscountRate(request.getDomesticDiscountRate())
.setDomesticBeginTime(request.getDomesticBeginTime())
.setDomesticEndTime(request.getDomesticEndTime())
.setDomesticDiscountDay(Math.toIntExact(ChronoUnit.DAYS.between(request.getDomesticBeginTime(), request.getDomesticEndTime())))
.setOverseasBeginTime(request.getOverseasBeginTime())
.setOverseasEndTime(request.getOverseasEndTime())
.setOverseasDiscountRate(request.getOverseasDiscountRate())
.setOverseasDiscountDay(Math.toIntExact(ChronoUnit.DAYS.between(request.getOverseasBeginTime(), request.getOverseasEndTime())))
.setCreateById(AdminUserUtil.getUserId())
.setCreateBy(AdminUserUtil.getUserName())
.setCreateTime(LocalDateTime.now());
}).collect(Collectors.toList());
List<QuotationModelDiscount> editDatas = requests.stream()
.filter(request -> Objects.nonNull(request.getId()))
.map(request -> {
return new QuotationModelDiscount()
.setId(request.getId())
.setModelId(request.getModelId())
.setDomesticDiscountRate(request.getDomesticDiscountRate())
.setDomesticBeginTime(request.getDomesticBeginTime())
.setDomesticEndTime(request.getDomesticEndTime())
.setDomesticDiscountDay(Math.toIntExact(ChronoUnit.DAYS.between(request.getDomesticBeginTime(), request.getDomesticEndTime())))
.setOverseasBeginTime(request.getOverseasBeginTime())
.setOverseasEndTime(request.getOverseasEndTime())
.setOverseasDiscountRate(request.getOverseasDiscountRate())
.setOverseasDiscountDay(Math.toIntExact(ChronoUnit.DAYS.between(request.getOverseasBeginTime(), request.getOverseasEndTime())))
.setUpdateById(AdminUserUtil.getUserId())
.setUpdateBy(AdminUserUtil.getUserName())
.setUpdateTime(LocalDateTime.now());
}).collect(Collectors.toList());
// List<QuotationModelDiscount> datas = requests.stream()
// .map(request -> {
// QuotationModelDiscount discount = new QuotationModelDiscount();
// discount.setModelId(request.getId());
// discount.setDomesticDiscountRate(request.getDomesticDiscountRate());
// discount.setDomesticBeginTime(request.getDomesticBeginTime());
// discount.setDomesticEndTime(request.getDomesticEndTime());
// discount.setDomesticDiscountDay(request.getDomesticDiscountDay());
// })
return ApiResult.success(departmentService.getSimpleDepartments());
}
//分页
//保存
//导入
//导出
//设置折扣人信息
//查询折扣人信息
}

View File

@ -25,6 +25,10 @@
<artifactId>freemarker</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>

View File

@ -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;
/**
* <p>
*
* </p>
*
* @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;
}

View File

@ -137,4 +137,10 @@ public class AdminUser implements Serializable {
* 直销类别国内国外字典id
*/
private Long categoryId;
/**
* 报价人代码
*/
private String quotationCode;
}

View File

@ -157,6 +157,11 @@ public class AppUser implements Serializable {
// @TableField("region_type_id")
// private Integer regionTypeId;
/**
* 报价人代码
*/
private String quotationCode;
/**
* 部门id
*/

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;

View File

@ -0,0 +1,63 @@
package com.nflg.mobilebroken.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("quotation_model_discount_item")
public class QuotationModelDiscountItem implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 折扣ID
*/
private Integer discountId;
/**
* 用户ID
*/
private Integer userId;
/**
* 用户类型 0 内部用户1 代理商用户
*/
private Integer userType;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 新增人编号
*/
private Integer createById;
}

View File

@ -47,7 +47,7 @@ public class TBaseArea implements Serializable {
private String areaName;
/**
* 状态
* 状态 0-禁用 1-启用
*/
private Byte areaState;
@ -90,4 +90,9 @@ public class TBaseArea implements Serializable {
* 类别国内国外字典id
*/
private Long categoryId;
/**
* 报价区域代码
*/
private String areaQuoteCode;
}

View File

@ -0,0 +1,16 @@
package com.nflg.mobilebroken.repository.mapper;
import com.nflg.mobilebroken.repository.entity.AdminBaseSerialNumber;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
public interface AdminBaseSerialNumberMapper extends BaseMapper<AdminBaseSerialNumber> {
}

View File

@ -0,0 +1,16 @@
package com.nflg.mobilebroken.repository.mapper;
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountItem;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
public interface QuotationModelDiscountItemMapper extends BaseMapper<QuotationModelDiscountItem> {
}

View File

@ -0,0 +1,27 @@
package com.nflg.mobilebroken.repository.service;
import com.nflg.mobilebroken.repository.entity.AdminBaseSerialNumber;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
public interface IAdminBaseSerialNumberService extends IService<AdminBaseSerialNumber> {
/**
* 生成流水号
* @param businessType 业务类型
* @param prefixNumber 前缀
* @param specialNumber 特殊编号
* @param hasTimeStr 是否包含时间
* @param serialLength 流水号长度
* @return 流水号
*/
String generateSerialNumber(Integer businessType, String prefixNumber, String specialNumber,
boolean hasTimeStr, Integer serialLength);
}

View File

@ -22,6 +22,14 @@ import java.util.List;
*/
public interface IAppUserService extends IService<AppUser> {
/**
* 获取用户报价码
*
* @param companyId 公司id
* @return 报价码
*/
String getAppUserQuotationCode(List<Integer> companyId);
AppUser getUser(String userName, String password);
void disable(Integer id);

View File

@ -0,0 +1,16 @@
package com.nflg.mobilebroken.repository.service;
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountItem;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
public interface IQuotationModelDiscountItemService extends IService<QuotationModelDiscountItem> {
}

View File

@ -0,0 +1,71 @@
package com.nflg.mobilebroken.repository.service.impl;
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;
/**
* <p>
* 服务实现类
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
@Service
public class AdminBaseSerialNumberServiceImpl extends ServiceImpl<AdminBaseSerialNumberMapper, AdminBaseSerialNumber> 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 {
// 判断是否有时间
int 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;
}
}

View File

@ -70,6 +70,10 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
@Resource
private IDictionaryItemService dictionaryItemService;
@Resource
private IAdminBaseSerialNumberService serialNumberService;
@Override
public AdminUser getUser(String userName, String password) {
AdminUser user = lambdaQuery()
@ -113,6 +117,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
.setUpdateTime(LocalDateTime.now());
updateById(user);
} else {
String quotationCode = serialNumberService.generateSerialNumber(0, "NF", "", false, 6);
user = new AdminUser()
.setUserCode(request.getUserCode())
.setUserName(request.getUserName())
@ -127,6 +132,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
.setGongfu(StrUtil.contains(request.getProductLine(), Constant.MOBILE_BROKEN))
.setCategoryId(request.getCategoryId())
.setTitleId(request.getTitleId())
.setQuotationCode(quotationCode)
.setCreateBy(AdminUserUtil.getUserId())
.setCreateTime(LocalDateTime.now());
save(user);
@ -233,6 +239,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
.setGongfu(u.isGongfu())
.setCategoryId(u.getCategoryId())
.setCategoryName(Objects.isNull(category) ? "" : category.getName())
.setQuotationCode(u.getQuotationCode())
.setRoles(
roles.stream()
.filter(r -> rmaps.contains(r.getId()))

View File

@ -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;
/**
@ -205,6 +203,9 @@ public class AppUserApplyforServiceImpl extends ServiceImpl<AppUserApplyforMappe
if (applyfor.getType() == AppUserApplyforType.ADD.getState().byteValue()) {
//新增账号
AppUser appUser = appUserService.getById(applyfor.getCreateBy());
List<Integer> companyIds = new ArrayList<>();
companyIds.add(applyfor.getCompanyId());
String quoationCode = appUserService.getAppUserQuotationCode(companyIds);
AppUser user = new AppUser()
.setLoginName(applyfor.getUserEmail())
.setName(applyfor.getUserName())
@ -225,6 +226,7 @@ public class AppUserApplyforServiceImpl extends ServiceImpl<AppUserApplyforMappe
.setCreateTime(LocalDateTime.now())
.setExpireTime(appUser.getExpireTime())
.setSalesUserName(appUser.getSalesUserName())
.setQuotationCode(quoationCode)
.setIsPrimary(false);
appUserService.save(user);
departmentService.lambdaUpdate()
@ -236,6 +238,14 @@ public class AppUserApplyforServiceImpl extends ServiceImpl<AppUserApplyforMappe
//账号启用
AppUser appUser = appUserService.getById(applyfor.getUserId());
AppUser applyUser = appUserService.getById(applyfor.getCreateBy());
if(StringUtil.isNotBlank(appUser.getCompanyId())) {
Set<Integer> 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());

View File

@ -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;
/**
@ -77,6 +79,101 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
@Resource
private IDictionaryItemService dictionaryItemService;
@Resource
private IAdminBaseSerialNumberService adminBaseSerialNumberService;
@Override
public String getAppUserQuotationCode(List<Integer> companyId) {
if (CollectionUtil.isEmpty(companyId))
return "";
// 根据公司ID查询公司的区域信息
List<TBaseCustomer> customers = customerService.lambdaQuery()
.in(TBaseCustomer::getId, companyId)
.eq(TBaseCustomer::getQuotationUse, true)
.list();
if (CollectionUtil.isEmpty(customers)) {
return "";
}
// 获取到公司的区域代码
List<String> areaCodes = customers.stream()
.map(TBaseCustomer::getAreaCode)
.collect(Collectors.toList());
Set<String> 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<TBaseArea> 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<Integer> parentIds = areas.stream()
.map(TBaseArea::getParentAreaRowId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
List<TBaseArea> 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<Integer, Long> parentCountMap = areas.stream()
.map(TBaseArea::getParentAreaRowId)
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(
Function.identity(),
Collectors.counting()
));
Set<Integer> 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<Integer> parentIds1 = parentCountMap.entrySet().stream()
.filter(entry -> entry.getValue() == 1) // 出现次数=1
.map(Map.Entry::getKey)
.collect(Collectors.toSet());
List<TBaseArea> 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()
@ -163,6 +260,8 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> 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)
@ -181,9 +280,11 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> 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())
@ -200,6 +301,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> 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);
@ -445,17 +547,33 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
public void migrate(MigrateAppUserRequest request) {
AppUser appUser = getPrimaryByCompanyId(request.getCompanyId().toString());
VUtils.trueThrowBusinessError(Objects.isNull(appUser)).throwMessage("该公司还未设置主账号");
List<Integer> 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::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())
.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
public PageData<AppUserForAdminVO> searchAppUserForAdmin(SearchAppUserForAdminRequest request) {
@ -627,13 +745,27 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
@Override
public void enable(EnableAppUserRequest request) {
if (request.getEnable()) {
for (Integer id : request.getIds()) {
AppUser appUser = getById(id);
List<Integer> 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.getUserName())
.set(AppUser::getUpdateBy, AdminUserUtil.getUserId())
.set(AppUser::getUpdateTime, LocalDateTime.now())
.eq(AppUser::getIsDel, false)
.in(AppUser::getId, request.getIds())
.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())

View File

@ -0,0 +1,20 @@
package com.nflg.mobilebroken.repository.service.impl;
import com.nflg.mobilebroken.repository.entity.QuotationModelDiscountItem;
import com.nflg.mobilebroken.repository.mapper.QuotationModelDiscountItemMapper;
import com.nflg.mobilebroken.repository.service.IQuotationModelDiscountItemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
@Service
public class QuotationModelDiscountItemServiceImpl extends ServiceImpl<QuotationModelDiscountItemMapper, QuotationModelDiscountItem> implements IQuotationModelDiscountItemService {
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.mobilebroken.repository.mapper.AdminBaseSerialNumberMapper">
</mapper>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.mobilebroken.repository.mapper.QuotationModelDiscountItemMapper">
</mapper>