From 68537648b849dac468b5cb75de93c90042b91181 Mon Sep 17 00:00:00 2001 From: yqy Date: Fri, 10 Nov 2023 09:39:53 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=9B=B4=E8=BE=BE=E4=B8=9A=E5=8A=A1-?= =?UTF-8?q?=E4=B8=8A=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/baiye/util/MobileUtil.java | 10 +- .../baiye/system/mapper/SysUserMapper.java | 6 + .../service/impl/SysRoleServiceImpl.java | 12 +- .../system/controller/SysUserController.java | 7 +- .../com/baiye/system/enums/RoleCodeEnum.java | 17 ++- .../controller/DirectClueController.java | 68 +++++++++ .../controller/OceanEngineController.java | 1 - .../converter/DirectClueConverter.java | 20 +++ .../modules/distribute/dto/DirectClueDTO.java | 22 +++ .../distribute/entity/DirectClueEntity.java | 70 +++++++++ .../entity/DirectClueUserEntity.java | 34 +++++ .../distribute/mapper/DirectClueMapper.java | 41 ++++++ .../mapper/DirectClueUserMapper.java | 7 + .../baiye/modules/distribute/qo/ClueQo.java | 4 - .../modules/distribute/qo/DirectClueQo.java | 39 +++++ .../distribute/service/DirectClueService.java | 35 +++++ .../service/impl/DirectClueServiceImpl.java | 135 ++++++++++++++++++ .../impl/OceanEngineClueServiceImpl.java | 47 ++++-- .../modules/distribute/vo/DirectClueVO.java | 56 ++++++++ .../resources/mapper/DirectClueMapper.xml | 27 ++++ admin/src/test/java/DirectClueTest.java | 47 ++++++ 21 files changed, 679 insertions(+), 26 deletions(-) create mode 100644 admin/src/main/java/com/baiye/modules/distribute/controller/DirectClueController.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/converter/DirectClueConverter.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/dto/DirectClueDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/entity/DirectClueEntity.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/entity/DirectClueUserEntity.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/mapper/DirectClueMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/mapper/DirectClueUserMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/qo/DirectClueQo.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/DirectClueService.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/impl/DirectClueServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/vo/DirectClueVO.java create mode 100644 admin/src/main/resources/mapper/DirectClueMapper.xml create mode 100644 admin/src/test/java/DirectClueTest.java diff --git a/ad-distribute-common/common-core/src/main/java/com/baiye/util/MobileUtil.java b/ad-distribute-common/common-core/src/main/java/com/baiye/util/MobileUtil.java index 008cdaf..7a99a50 100644 --- a/ad-distribute-common/common-core/src/main/java/com/baiye/util/MobileUtil.java +++ b/ad-distribute-common/common-core/src/main/java/com/baiye/util/MobileUtil.java @@ -11,14 +11,12 @@ import java.util.regex.Pattern; public class MobileUtil { /** - * 中国电信号码格式验证 手机段: - * 133,149,153,173,177,180,181,189,191,199,1349,1410,1700,1701,1702,193 + * 中国电信号码格式验证 手机段: 133,149,153,173,177,180,181,189,191,199,1349,1410,1700,1701,1702,193,===中国广电 192 **/ - private static final String CHINA_TELECOM_PATTERN = "(?:^(?:\\+86)?1(?:33|49|53|7[37]|8[019]|9[139])\\d{8}$)|(?:^(?:\\+86)?1349\\d{7}$)|(?:^(?:\\+86)?1410\\d{7}$)|(?:^(?:\\+86)?170[0-2]\\d{7}$)"; + private static final String CHINA_TELECOM_PATTERN = "(?:^(?:\\+86)?1(?:33|92|49|53|7[37]|8[019]|9[139])\\d{8}$)|(?:^(?:\\+86)?1349\\d{7}$)|(?:^(?:\\+86)?1410\\d{7}$)|(?:^(?:\\+86)?170[0-2]\\d{7}$)"; /** - * 中国联通号码格式验证 - * 手机段:130,131,132,145,146,155,156,166,171,175,176,185,186,1704,1707,1708,1709 + * 中国联通号码格式验证 手机段:130,131,132,145,146,155,156,166,171,175,176,185,186,1704,1707,1708,1709 **/ private static final String CHINA_UNICOM_PATTERN = "(?:^(?:\\+86)?1(?:3[0-2]|4[56]|5[56]|66|7[156]|8[56])\\d{8}$)|(?:^(?:\\+86)?170[47-9]\\d{7}$)"; @@ -26,8 +24,6 @@ public class MobileUtil { * 中国移动号码格式验证 * 手机段:134,135,136,137,138,139,147,148,150,151,152,157,158,159,178,182,183,184,187,188,195,198,1440,1703,1705,1706 **/ - // private static final String CHINA_MOBILE_PATTERN = - // "(?:^(?:\\+86)?1(?:3[4-9]|4[78]|5[0-27-9]|78|8[2-478]|98|95)\\d{8}$)|(?:^(?:\\+86)?1440\\d{7}$)|(?:^(?:\\+86)?170[356]\\d{7}$)"; private static final String CHINA_MOBILE_PATTERN = "(?:^(?:\\+86)?1(?:3[4-9]|4[78]|5[0-27-9]|6[5]|7[28]|8[2-478]|98|95)\\d{8}$)|(?:^(?:\\+86)?1440\\d{7}$)|(?:^(?:\\+86)?170[356]\\d{7}$)"; /** diff --git a/ad-distribute-system/system-biz/src/main/java/com/baiye/system/mapper/SysUserMapper.java b/ad-distribute-system/system-biz/src/main/java/com/baiye/system/mapper/SysUserMapper.java index 101a45e..d641477 100644 --- a/ad-distribute-system/system-biz/src/main/java/com/baiye/system/mapper/SysUserMapper.java +++ b/ad-distribute-system/system-biz/src/main/java/com/baiye/system/mapper/SysUserMapper.java @@ -180,6 +180,12 @@ public interface SysUserMapper extends ExtendMapper { return SqlHelper.retBool(count); } + /** + * 查询子用户 根据RoleCode + * + * @param roleCodes 角色标识 + * @return List 该角色标识对应的用户列表 + */ List> listSelectSonListData(@Param("userId") Long userId, @Param("roleCodes") Collection roleCodes); /** diff --git a/ad-distribute-system/system-biz/src/main/java/com/baiye/system/service/impl/SysRoleServiceImpl.java b/ad-distribute-system/system-biz/src/main/java/com/baiye/system/service/impl/SysRoleServiceImpl.java index 27737c5..bba3360 100644 --- a/ad-distribute-system/system-biz/src/main/java/com/baiye/system/service/impl/SysRoleServiceImpl.java +++ b/ad-distribute-system/system-biz/src/main/java/com/baiye/system/service/impl/SysRoleServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.ListUtil; import com.baiye.security.constant.UserAttributeNameConstants; import com.baiye.security.userdetails.User; import com.baiye.security.util.SecurityUtils; +import com.baiye.system.checker.AdminUserChecker; import com.baiye.system.enums.RoleCodeEnum; import com.baiye.system.model.entity.SysRole; import com.baiye.system.model.qo.SysRoleQO; @@ -32,6 +33,8 @@ public class SysRoleServiceImpl extends ExtendServiceImpl list = new HashSet<>(); - if (user.getUserId() == 1) { - list.add(salesExecutive); - list.add(storeExecutive); + if (adminUserChecker.isAdminUser(user.getUserId())) { + list.addAll(ListUtil.of(salesExecutive, storeExecutive, directExecutive)); } if (roleCodeList.contains(salesExecutive)) { list.add(entryClerk); @@ -87,6 +90,9 @@ public class SysRoleServiceImpl extends ExtendServiceImpl collect = selectData.stream().map(SelectData::getValue).filter(value -> !excludeRoleCode.contains(String.valueOf(value))).map(String::valueOf).collect(Collectors.toList()); list.addAll(collect); } + if (roleCodeList.contains(directExecutive)) { + list.addAll(ListUtil.of(RoleCodeEnum.find(25L), RoleCodeEnum.find(26L))); + } return selectData.stream().filter(c -> list.contains(String.valueOf(c.getValue()))).collect(Collectors.toList()); } diff --git a/ad-distribute-system/system-controller/src/main/java/com/baiye/system/controller/SysUserController.java b/ad-distribute-system/system-controller/src/main/java/com/baiye/system/controller/SysUserController.java index d1f4501..8243328 100644 --- a/ad-distribute-system/system-controller/src/main/java/com/baiye/system/controller/SysUserController.java +++ b/ad-distribute-system/system-controller/src/main/java/com/baiye/system/controller/SysUserController.java @@ -295,7 +295,6 @@ public class SysUserController { : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "充值失败"); } - @Operation(summary = "重审", description = "重审列表") @GetMapping("/review/list") public R>> recharge() { @@ -303,5 +302,11 @@ public class SysUserController { (SecurityUtils.getWhichUserId(), RoleCodeEnum.ROLE_REVIEWER.getRoleCode())); } + @Operation(summary = "分发员获取公司下的直达业务员", description = "分发员获取公司下的直达业务员") + @GetMapping("/findDirectSalesman") + public R findDirectSalesman() { + String directSalesmanCode = RoleCodeEnum.find(26L); + return R.ok(sysUserService.listByRoleCodeAndUserId(directSalesmanCode, SecurityUtils.getWhichUserId())); + } } diff --git a/ad-distribute-system/system-model/src/main/java/com/baiye/system/enums/RoleCodeEnum.java b/ad-distribute-system/system-model/src/main/java/com/baiye/system/enums/RoleCodeEnum.java index d144700..e57c462 100644 --- a/ad-distribute-system/system-model/src/main/java/com/baiye/system/enums/RoleCodeEnum.java +++ b/ad-distribute-system/system-model/src/main/java/com/baiye/system/enums/RoleCodeEnum.java @@ -50,7 +50,22 @@ public enum RoleCodeEnum { /** * 门店专员 */ - ROLE_STORE_SALESMAN(23L, "ROLE_STORE_SALESMAN"); + ROLE_STORE_SALESMAN(23L, "ROLE_STORE_SALESMAN"), + + /** + * 直达管理员 + */ + ROLE_DIRECT_EXECUTIVE(24L, "ROLE_DIRECT_EXECUTIVE"), + + /** + * 直达分发员 + */ + ROLE_DIRECT_DISTRIBUTE(25L, "ROLE_DIRECT_DISTRIBUTE"), + + /** + * 直达业务员 + */ + ROLE_DIRECT_SALESMAN(26L, "ROLE_DIRECT_SALESMAN"); private final Long id; diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/DirectClueController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/DirectClueController.java new file mode 100644 index 0000000..9376134 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/DirectClueController.java @@ -0,0 +1,68 @@ +package com.baiye.modules.distribute.controller; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.modules.distribute.dto.DirectClueDTO; +import com.baiye.modules.distribute.entity.DirectClueUserEntity; +import com.baiye.modules.distribute.qo.DirectClueQo; +import com.baiye.modules.distribute.service.DirectClueService; +import com.baiye.modules.distribute.service.OceanEngineClueService; +import com.baiye.modules.distribute.vo.DirectClueVO; +import com.baiye.result.BaseResultCode; +import com.baiye.result.R; +import com.baiye.security.util.SecurityUtils; +import com.baiye.validation.group.UpdateGroup; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +@RequiredArgsConstructor +@RestController +@Tag(name = "直达线索") +@RequestMapping("/directClue") +public class DirectClueController { + + private final DirectClueService directClueService; + + private final OceanEngineClueService oceanEngineClueService; + + @GetMapping("/page") + @Operation(summary = "分页查询资源") + public R> getClueRecordPage(@Validated PageParam pageParam, DirectClueQo qo) { + Long salesmanUserId = qo.getSalesmanUserId(); + Long distributeUserId = qo.getDistributeUserId(); + if (salesmanUserId == null && distributeUserId == null) qo.setCreateBy(SecurityUtils.getCurrentUserId()); + else qo.setCreateBy(SecurityUtils.getWhichUserId()); + + return R.ok(directClueService.queryPage(pageParam, qo)); + } + + @PostMapping("/update") + @Operation(summary = "修改", description = "修改") + public R update(@Validated({UpdateGroup.class}) @RequestBody DirectClueDTO directClueDTO) { + return directClueService.update(directClueDTO) ? R.ok() : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "修改失败"); + } + + @PostMapping("/distribute") + @Operation(summary = "分发员分发") + public R distribute(@Valid @RequestBody List directClueUserList) { + return R.ok(directClueService.distribute(directClueUserList)); + } + + @GetMapping("/test") + @Operation(summary = "分页查询资源") + public R test() { + DateTime date = DateUtil.parse("2023-11-02 00:00:00"); + DateTime date2 = DateUtil.parse("2023-11-03 23:00:00"); + oceanEngineClueService.getFeiYuSource(date, date2); + return R.ok(); + } + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/OceanEngineController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/OceanEngineController.java index 1e7bd60..b2a0bba 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/controller/OceanEngineController.java +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/OceanEngineController.java @@ -33,7 +33,6 @@ import java.io.IOException; public class OceanEngineController { private final OceanEngineService oceanEngineService; - private final OceanEngineClueService oceanEngineClueService; @GetMapping(value = "/url") public ResponseEntity query(Long companyId, String authorizeName) { diff --git a/admin/src/main/java/com/baiye/modules/distribute/converter/DirectClueConverter.java b/admin/src/main/java/com/baiye/modules/distribute/converter/DirectClueConverter.java new file mode 100644 index 0000000..0eba197 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/converter/DirectClueConverter.java @@ -0,0 +1,20 @@ +package com.baiye.modules.distribute.converter; + +import com.baiye.modules.distribute.dto.DirectClueDTO; +import com.baiye.modules.distribute.entity.DirectClueEntity; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface DirectClueConverter { + + DirectClueConverter INSTANCE = Mappers.getMapper(DirectClueConverter.class); + + /** + * 修改DTO 转 PO + * @param dto 修改DTO + * @return ClueEntity PO + */ + DirectClueEntity dtoToPo(DirectClueDTO dto); + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/DirectClueDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/DirectClueDTO.java new file mode 100644 index 0000000..369c55c --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/DirectClueDTO.java @@ -0,0 +1,22 @@ +package com.baiye.modules.distribute.dto; + +import com.baiye.validation.group.UpdateGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@Data +public class DirectClueDTO { + + @Schema(title = "ID") + @NotNull(message = "ID不能为空", groups = { UpdateGroup.class }) + private Long directClueId; + + @Schema(title = "有效状态 0:有效 1:无效") + private Integer effectiveStatus; + + @Schema(title = "标签") + private List clueLabel; +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/DirectClueEntity.java b/admin/src/main/java/com/baiye/modules/distribute/entity/DirectClueEntity.java new file mode 100644 index 0000000..be386d0 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/DirectClueEntity.java @@ -0,0 +1,70 @@ +package com.baiye.modules.distribute.entity; + +import com.baiye.entity.BaseEntity; +import com.baiye.extend.mybatis.plus.alias.TableAlias; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +@TableName("tb_direct_clue") +@TableAlias("dc") +@Schema(title = "直达线索表") +@AllArgsConstructor +@NoArgsConstructor +public class DirectClueEntity extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId + @Schema(title = "直达线索ID") + private Long directClueId; + + @Schema(title = "编号") + private String batchNo; + + @Schema(title = "客户名称") + private String customName; + + @Schema(title = "nid") + private String nid; + + @Schema(title = "来源 0:巨量") + private Integer originType; + + @Schema(title = "有效状态 0:有效 1:无效") + private Integer effectiveStatus; + + @Schema(title = "资源标签") + private String clueLabelName; + + @Schema(title = "分发状态 0:未分发 1:已分发") + private Integer distributeType; + + @Schema(title = "分发日期") + private LocalDateTime distributeDate; + + @Schema(title = "资源分发的分发员用户ID") + private Long distributeUserId; + + @Schema(title = "其它线索信息") + private String otherClue; + + public DirectClueEntity(String batchNo, String customName, String nid, Integer originType, Integer effectiveStatus, Integer distributeType, LocalDateTime distributeDate, String otherClue) { + this.batchNo = batchNo; + this.customName = customName; + this.nid = nid; + this.originType = originType; + this.effectiveStatus = effectiveStatus; + this.distributeType = distributeType; + this.distributeDate = distributeDate; + this.otherClue = otherClue; + } +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/DirectClueUserEntity.java b/admin/src/main/java/com/baiye/modules/distribute/entity/DirectClueUserEntity.java new file mode 100644 index 0000000..276818f --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/DirectClueUserEntity.java @@ -0,0 +1,34 @@ +package com.baiye.modules.distribute.entity; + +import com.baiye.validation.group.CreateGroup; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; + +@Getter +@Setter +@TableName("tb_direct_clue_user") +@Schema(title = "直达线索表") +public class DirectClueUserEntity { + + private static final long serialVersionUID = 1L; + + @TableId + @Schema(title = "直达线索用户关联表ID") + private Long id; + + @Schema(title = "线索ID") + @NotNull(message = "线索不能为空", groups = CreateGroup.class) + private Long clueId; + + @Schema(title = "用户ID") + @NotNull(message = "用户不能为空", groups = CreateGroup.class) + private Long userId; + + @Schema(title = "用户名") + private String userName; +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/DirectClueMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/DirectClueMapper.java new file mode 100644 index 0000000..3763675 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/DirectClueMapper.java @@ -0,0 +1,41 @@ +package com.baiye.modules.distribute.mapper; + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.conditions.query.LambdaAliasQueryWrapperX; +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.modules.distribute.entity.DirectClueEntity; +import com.baiye.modules.distribute.qo.DirectClueQo; +import com.baiye.modules.distribute.vo.DirectClueVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.ibatis.annotations.Param; + +public interface DirectClueMapper extends ExtendMapper { + + default PageResult queryPage(PageParam pageParam, DirectClueQo qo) { + IPage page = this.prodPage(pageParam); + + LambdaAliasQueryWrapperX wrapperX = WrappersX.lambdaAliasQueryX(DirectClueEntity.class); + wrapperX.eqIfPresent(DirectClueEntity::getCreateBy, qo.getCreateBy()) + .eqIfPresent(DirectClueEntity::getDistributeUserId, qo.getDistributeUserId()) + .likeIfPresent(DirectClueEntity::getCustomName, qo.getCustomName()) + .eqIfPresent(DirectClueEntity::getOriginType, qo.getOriginType()) + .eqIfPresent(DirectClueEntity::getEffectiveStatus, qo.getEffectiveStatus()) + .eqIfPresent(DirectClueEntity::getDistributeType, qo.getDistributeType()); + + if (qo.getSalesmanUserId() != null){ + wrapperX.exists("SELECT 1 from tb_direct_clue_user dcu where dcu.user_id = "+ qo.getSalesmanUserId() +" and dc.direct_clue_id = dcu.clue_id"); + } + if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) { + wrapperX.between(DirectClueEntity::getDistributeDate, qo.getStartTime(), qo.getEndTime()); + } + this.selectByPage(page, wrapperX, qo.getSalesmanUserId()); + return new PageResult<>(page.getRecords(), page.getTotal()); + } + + IPage selectByPage(IPage page, @Param(Constants.WRAPPER) Wrapper wrapper, @Param("userId") Long userId); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/DirectClueUserMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/DirectClueUserMapper.java new file mode 100644 index 0000000..487db36 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/DirectClueUserMapper.java @@ -0,0 +1,7 @@ +package com.baiye.modules.distribute.mapper; + +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.modules.distribute.entity.DirectClueUserEntity; + +public interface DirectClueUserMapper extends ExtendMapper { +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/qo/ClueQo.java b/admin/src/main/java/com/baiye/modules/distribute/qo/ClueQo.java index 6a33274..1b09438 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/qo/ClueQo.java +++ b/admin/src/main/java/com/baiye/modules/distribute/qo/ClueQo.java @@ -4,10 +4,6 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -/** - * @Author YQY - * @Date 2023/8/15 - */ @Data public class ClueQo { diff --git a/admin/src/main/java/com/baiye/modules/distribute/qo/DirectClueQo.java b/admin/src/main/java/com/baiye/modules/distribute/qo/DirectClueQo.java new file mode 100644 index 0000000..7a09c04 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/qo/DirectClueQo.java @@ -0,0 +1,39 @@ +package com.baiye.modules.distribute.qo; + +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class DirectClueQo { + + @Parameter(description = "开始时间") + private String startTime; + + @Parameter(description = "结束时间") + private String endTime; + + @Parameter(description = "创建人") + private Long createBy; + + @Schema(title = "资源分发的分发员用户ID") + private Long distributeUserId; + + @Schema(title = "资源分发的业务员用户ID") + private Long salesmanUserId; + + @Schema(title = "客户名称") + private String customName; + + @Schema(title = "来源 0:巨量") + private Integer originType; + + @Schema(title = "有效状态 0:有效 1:无效") + private Integer effectiveStatus; + + @Schema(title = "分发状态 0:未分发 1:已分发") + private Integer distributeType; + + @Schema(title = "属性") + private String attribute; +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/DirectClueService.java b/admin/src/main/java/com/baiye/modules/distribute/service/DirectClueService.java new file mode 100644 index 0000000..bba577e --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/DirectClueService.java @@ -0,0 +1,35 @@ +package com.baiye.modules.distribute.service; + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.service.ExtendService; +import com.baiye.modules.distribute.dto.DirectClueDTO; +import com.baiye.modules.distribute.entity.DirectClueEntity; +import com.baiye.modules.distribute.entity.DirectClueUserEntity; +import com.baiye.modules.distribute.qo.DirectClueQo; +import com.baiye.modules.distribute.vo.DirectClueVO; + +import java.util.List; + +public interface DirectClueService extends ExtendService { + + /** + * 分页查询 + */ + PageResult queryPage(PageParam pageParam, DirectClueQo qo); + + /** + * 修改 + */ + boolean update(DirectClueDTO directClueDTO); + + /** + * 分配后插入资源 + */ + void allocationClue(Long userId, List directClueEntityList); + + /** + * 分发员分发资源 + */ + boolean distribute(List directClueUserList); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/DirectClueServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/DirectClueServiceImpl.java new file mode 100644 index 0000000..a9a8a84 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/DirectClueServiceImpl.java @@ -0,0 +1,135 @@ +package com.baiye.modules.distribute.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.exception.BadRequestException; +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.modules.distribute.converter.DirectClueConverter; +import com.baiye.modules.distribute.dto.DirectClueDTO; +import com.baiye.modules.distribute.entity.DirectClueEntity; +import com.baiye.modules.distribute.entity.DirectClueUserEntity; +import com.baiye.modules.distribute.mapper.DirectClueMapper; +import com.baiye.modules.distribute.mapper.DirectClueUserMapper; +import com.baiye.modules.distribute.qo.DirectClueQo; +import com.baiye.modules.distribute.service.DirectClueService; +import com.baiye.modules.distribute.vo.DirectClueVO; +import com.baiye.system.enums.RoleCodeEnum; +import com.baiye.system.model.dto.SysUserNameRoleDTO; +import com.baiye.system.service.SysUserService; +import com.baiye.util.AESUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.ballcat.security.properties.SecurityProperties; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class DirectClueServiceImpl extends ExtendServiceImpl implements DirectClueService { + + private static final Map userIndexMap = new HashMap<>(); + + private final SysUserService sysUserService; + + private final DirectClueUserMapper directClueUserMapper; + + private final SecurityProperties securityProperties; + + @Override + public PageResult queryPage(PageParam pageParam, DirectClueQo qo) { + Long distributeUserId = qo.getDistributeUserId(); + + PageResult pageResult = baseMapper.queryPage(pageParam, qo); + List recordList = pageResult.getRecords(); + if (CollUtil.isNotEmpty(recordList)){ + // 线索接收人映射信息 + Map> map = new HashMap<>(); + if (qo.getDistributeUserId() != null){ + List ids = recordList.stream().map(DirectClueVO::getDirectClueId).collect(Collectors.toList()); + List userEntities = directClueUserMapper.selectList(new LambdaQueryWrapper().in(DirectClueUserEntity::getClueId, ids)); + map = userEntities.stream().collect(Collectors.groupingBy(DirectClueUserEntity::getClueId)); + } + for (DirectClueVO directClueVO : recordList) { + // 手机号解密 显示位数 + String decryptNid = AESUtils.decrypt(directClueVO.getNid(), securityProperties.getPasswordSecretKey()); + if (StringUtils.isNotBlank(decryptNid) && distributeUserId != null) { + StringBuilder stringBuilder = new StringBuilder(decryptNid); + decryptNid = stringBuilder.replace(1, 9, "****").toString(); + } + directClueVO.setNid(decryptNid); + //标签类型转换 + String clueLabelName = directClueVO.getClueLabelName(); + if (StringUtils.isNotBlank(clueLabelName)){ + directClueVO.setClueLabelName(""); + directClueVO.setClueLabel(JSONUtil.toList(clueLabelName, String.class)); + } + // 线索接收人 + if (qo.getDistributeUserId() != null && map.containsKey(directClueVO.getDirectClueId())){ + List directClueUserEntities = map.get(directClueVO.getDirectClueId()); + List userNames = directClueUserEntities.stream().map(DirectClueUserEntity::getUserName).collect(Collectors.toList()); + directClueVO.setUserNameList(userNames); + } + // 其它线索信息转换 + if (StringUtils.isNotBlank(directClueVO.getOtherClue())){ + directClueVO.setOtherClueObj(JSONUtil.parseObj(directClueVO.getOtherClue())); + directClueVO.setOtherClue(""); + } + } + } + return pageResult; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(DirectClueDTO directClueDTO) { + DirectClueEntity directClueEntity = DirectClueConverter.INSTANCE.dtoToPo(directClueDTO); + + List clueLabel = directClueDTO.getClueLabel(); + if (CollUtil.isNotEmpty(clueLabel)) { + directClueEntity.setClueLabelName(JSONUtil.toJsonStr(clueLabel)); + } + return SqlHelper.retBool(baseMapper.updateById(directClueEntity)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void allocationClue(Long userId, List directClueEntityList) { + if (userId != null && CollUtil.isNotEmpty(directClueEntityList)) { + List sysUserNameRoleDTOS = sysUserService.listByRoleCodeAndUserId(RoleCodeEnum.find(25L), userId); + + List userIdList = sysUserNameRoleDTOS.stream().map(SysUserNameRoleDTO::getUserId).collect(Collectors.toList()); + int index = 0; + if (userIndexMap.containsKey(userId)) index = userIndexMap.get(userId); + for (DirectClueEntity directClueEntity : directClueEntityList) { + directClueEntity.setDistributeUserId(userIdList.get(index)); + if (index < userIdList.size() - 1) index++; + else index = 0; + } + userIndexMap.put(userId, index); + + baseMapper.insertBatchSomeColumn(directClueEntityList); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean distribute(List directClueUserList) { + Long clueId = directClueUserList.get(0).getClueId(); + DirectClueEntity clueEntity = baseMapper.selectById(clueId); + if (clueEntity.getDistributeType() != 0) throw new BadRequestException("线索已分发"); + + clueEntity.setDistributeType(1); + baseMapper.updateById(clueEntity); + return SqlHelper.retBool(directClueUserMapper.insertBatchSomeColumn(directClueUserList)); + } +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineClueServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineClueServiceImpl.java index 2d6dff6..9aea748 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineClueServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineClueServiceImpl.java @@ -2,6 +2,7 @@ package com.baiye.modules.distribute.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.StrPool; import cn.hutool.core.util.URLUtil; import cn.hutool.http.HttpRequest; @@ -11,17 +12,28 @@ import cn.hutool.json.JSONUtil; import com.baiye.constant.DefaultNumberConstants; import com.baiye.constant.UrlConstant; import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.modules.distribute.entity.DirectClueEntity; import com.baiye.modules.distribute.entity.OceanEngineSourceEntity; import com.baiye.modules.distribute.entity.OceanEngineToken; import com.baiye.modules.distribute.mapper.OceanEngineSourceMapper; +import com.baiye.modules.distribute.service.DirectClueService; import com.baiye.modules.distribute.service.OceanEngineClueService; import com.baiye.modules.distribute.service.OceanEngineService; +import com.baiye.system.constant.DateConst; +import com.baiye.system.constant.LetterConst; +import com.baiye.util.AESUtils; +import com.baiye.util.MobileUtil; +import com.baiye.utils.SerialCode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.ballcat.security.properties.SecurityProperties; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.nio.charset.Charset; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.regex.Matcher; @@ -38,6 +50,10 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl oceanEngineSources = new ArrayList<>(); + List directClueEntityList = new ArrayList<>(); for (int i = 0; i < array.size(); i++) { JSONObject json = array.getJSONObject(i); + Map map = new HashMap<>(); //飞鱼线索id - String clueId = json.getStr("clue_id"); - String createTime = json.getStr("create_time_detail"); + map.put("clueId", json.getStr("clue_id")); + map.put("createTimeDetail", json.getStr("create_time_detail")); //广告商名称 - String advertiserName = json.getStr("advertiser_name"); + map.put("advertiserName", json.getStr("advertiser_name")); + map.put("wx", json.getStr("weixin")); + map.put("address", json.getStr("location")); + //线索留资(key-value形式的备注) + map.put("remarkDict", json.getStr("remark_dict")); //线索名 String name = json.getStr("name"); String phone = json.getStr("telephone"); - String weixin = json.getStr("weixin"); - String address = json.getStr("location"); - //线索留资(key-value形式的备注) - String remark_dict = json.getStr("remark_dict"); //===========原数据保存 OceanEngineSourceEntity oceanEngineSource = new OceanEngineSourceEntity(); oceanEngineSource.setUserId(userId); oceanEngineSource.setContent(JSONUtil.toJsonStr(json)); oceanEngineSources.add(oceanEngineSource); - //todo =====传递线索 - + //传递线索 + boolean bool = MobileUtil.checkPhone(phone); + if (bool){ + Date date = new Date(); + LocalDateTime dateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + String nid = AESUtils.encrypt(phone, securityProperties.getPasswordSecretKey()); + String jsonStr = JSONUtil.toJsonStr(map); + + DirectClueEntity directClueEntity = new DirectClueEntity("", name, nid, 0, 0, 0, dateTime, jsonStr); + directClueEntity.setCreateBy(userId); + directClueEntityList.add(directClueEntity); + } } + directClueService.allocationClue(userId, directClueEntityList); baseMapper.insertBatchSomeColumn(oceanEngineSources); } diff --git a/admin/src/main/java/com/baiye/modules/distribute/vo/DirectClueVO.java b/admin/src/main/java/com/baiye/modules/distribute/vo/DirectClueVO.java new file mode 100644 index 0000000..aa2f0e5 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/vo/DirectClueVO.java @@ -0,0 +1,56 @@ +package com.baiye.modules.distribute.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class DirectClueVO { + + @Schema(title = "直达线索ID") + private Long directClueId; + + @Schema(title = "编号") + private String batchNo; + + @Schema(title = "客户名称") + private String customName; + + @Schema(title = "nid") + private String nid; + + @Schema(title = "来源 0:巨量") + private Integer originType; + + @Schema(title = "有效状态 0:有效 1:无效") + private Integer effectiveStatus; + + @Schema(title = "资源标签") + private String clueLabelName; + + @Schema(title = "分发状态 0:未分发 1:已分发") + private Integer distributeType; + + @Schema(title = "分发日期") + private LocalDateTime distributeDate; + + @Schema(title = "资源分发的分发员用户ID") + private Long distributeUserId; + + @Schema(title = "其它线索信息") + private String otherClue; + + @Schema(title = "创建时间") + private LocalDateTime createTime; + + @Schema(title = "标签") + private List clueLabel; + + @Schema(title = "线索接收人用户名") + private List userNameList; + + @Schema(title = "其它线索") + private Object otherClueObj; +} diff --git a/admin/src/main/resources/mapper/DirectClueMapper.xml b/admin/src/main/resources/mapper/DirectClueMapper.xml new file mode 100644 index 0000000..afca374 --- /dev/null +++ b/admin/src/main/resources/mapper/DirectClueMapper.xml @@ -0,0 +1,27 @@ + + + + + dc.direct_clue_id, + dc.batch_no, + dc.nid, + dc.custom_name, + dc.origin_type, + dc.effective_status, + dc.clue_label_name, + dc.distribute_type, + dc.distribute_date, + dc.distribute_user_id, + dc.other_clue, + dc.create_time + + + + \ No newline at end of file diff --git a/admin/src/test/java/DirectClueTest.java b/admin/src/test/java/DirectClueTest.java new file mode 100644 index 0000000..8276f42 --- /dev/null +++ b/admin/src/test/java/DirectClueTest.java @@ -0,0 +1,47 @@ +import com.baiye.AdminApplication; +import com.baiye.modules.distribute.entity.DirectClueEntity; +import com.baiye.modules.distribute.service.DirectClueService; +import com.baiye.util.AESUtils; +import org.ballcat.security.properties.SecurityProperties; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = AdminApplication.class, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class DirectClueTest { + + @Resource + private DirectClueService directClueService; + @Resource + private SecurityProperties securityProperties; + + @Test + public void test1(){ + List list = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + DirectClueEntity directClueEntity = new DirectClueEntity(); + directClueEntity.setCustomName("y" + i); + String nid = "1346263987" + i; + String phone = AESUtils.encrypt(nid, securityProperties.getPasswordSecretKey()); + directClueEntity.setNid(phone); + directClueEntity.setEffectiveStatus(0); + directClueEntity.setDistributeType(0); + Date date = new Date(); + LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + directClueEntity.setDistributeDate(localDateTime); + directClueEntity.setCreateBy(182L); + list.add(directClueEntity); + } + directClueService.allocationClue(182L, list); + } +} From 2576e39da150b6ad7d860807a79e8e4ff45d78a5 Mon Sep 17 00:00:00 2001 From: wjt Date: Fri, 10 Nov 2023 10:42:16 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E9=A3=9E=E9=B1=BC?= =?UTF-8?q?=E7=BA=BF=E7=B4=A2=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/OceanEngineResponseDTO.java | 23 +++++++ .../impl/OceanEngineClueServiceImpl.java | 66 ++++++++----------- 2 files changed, 50 insertions(+), 39 deletions(-) create mode 100644 admin/src/main/java/com/baiye/modules/distribute/dto/OceanEngineResponseDTO.java diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/OceanEngineResponseDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/OceanEngineResponseDTO.java new file mode 100644 index 0000000..84fdff4 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/OceanEngineResponseDTO.java @@ -0,0 +1,23 @@ +package com.baiye.modules.distribute.dto; + +import cn.hutool.core.text.CharSequenceUtil; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * @author wjt + * @date 2023/11/10 + */ +@Data +public class OceanEngineResponseDTO { + private Object data; + + @JsonProperty("code") + private Integer code; + + @JsonProperty("message") + private String message; + + @JsonProperty("request_id") + private String requestId = CharSequenceUtil.EMPTY; +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineClueServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineClueServiceImpl.java index 9aea748..f48e789 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineClueServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineClueServiceImpl.java @@ -1,8 +1,6 @@ package com.baiye.modules.distribute.service.impl; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.text.StrPool; import cn.hutool.core.util.URLUtil; import cn.hutool.http.HttpRequest; @@ -12,6 +10,7 @@ import cn.hutool.json.JSONUtil; import com.baiye.constant.DefaultNumberConstants; import com.baiye.constant.UrlConstant; import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.modules.distribute.dto.OceanEngineResponseDTO; import com.baiye.modules.distribute.entity.DirectClueEntity; import com.baiye.modules.distribute.entity.OceanEngineSourceEntity; import com.baiye.modules.distribute.entity.OceanEngineToken; @@ -19,14 +18,10 @@ import com.baiye.modules.distribute.mapper.OceanEngineSourceMapper; import com.baiye.modules.distribute.service.DirectClueService; import com.baiye.modules.distribute.service.OceanEngineClueService; import com.baiye.modules.distribute.service.OceanEngineService; -import com.baiye.system.constant.DateConst; -import com.baiye.system.constant.LetterConst; import com.baiye.util.AESUtils; import com.baiye.util.MobileUtil; -import com.baiye.utils.SerialCode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.ballcat.security.properties.SecurityProperties; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -36,8 +31,6 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * @author wjt @@ -62,12 +55,10 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl advertiserIds = oceanEngineToken.getAdvertiserIds(); - log.info("=================== 获取到的广告主ids {} ===================", JSONUtil.toJsonStr(advertiserIds)); CompletableFuture.runAsync(() -> getAdvertiser(oceanEngineToken.getUserId(), accessToken, advertiserIds, startTime, endTime)); } } @@ -79,24 +70,25 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl advertisers, Date startTime, Date endTime) { - + log.info("=================== 巨量飞鱼,拉取用户{} ===================", userId); if (CollUtil.isEmpty(advertisers)) { + log.info("=================== 巨量飞鱼,拉取用户{} 无管家 ===================", userId); return; } List advertiseList = getAdvertiseIds(accessToken, advertisers); if (CollUtil.isEmpty(advertiseList)) { + log.info("=================== 巨量飞鱼,拉取用户{} 无广告商 ===================", userId); return; } Map map = new HashMap<>(5); map.put("advertiser_ids", advertiseList.toString()); map.put("start_time", startTime); map.put("end_time", endTime); - log.info("=================== 巨量飞鱼请求 {} ===================", JSONUtil.toJsonStr(map)); JSONArray array = reqOceanEngineClue(accessToken, map); + log.info("=================== 巨量飞鱼,线索数量{} ===================", array.size()); if (CollUtil.isEmpty(array)) { return; } - log.info("=================== 巨量飞鱼返回{} ===================", array.size()); parseAndSaveData(userId, array); } @@ -115,18 +107,21 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl map, String accessToken) { String body = HttpRequest.get(UrlConstant.SYNC_CLUE_URL + "?" + URLUtil.buildQuery(map, Charset.defaultCharset())).header("Access-Token", accessToken).execute().body(); - JSONObject response = JSONUtil.parseObj(body); - if (response.getInt("code") == 0 && response.getStr("data") != null) { - return JSONUtil.parseObj(response.getStr("data")); + OceanEngineResponseDTO response = JSONUtil.toBean(body, OceanEngineResponseDTO.class); + if (response.getCode() == 0) { + if (response.getData() != null) { + return JSONUtil.parseObj(response.getData()); + } + } else { + log.error("获取飞鱼线索失败 {}", response); } return null; } @@ -168,8 +167,8 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl