提交 b1a6e9bb 作者: 沈振路

Merge branch 'customer_service_SZlu'

...@@ -13,6 +13,16 @@ import lombok.EqualsAndHashCode; ...@@ -13,6 +13,16 @@ import lombok.EqualsAndHashCode;
@Data @Data
public class GenericsResult<T> extends BaseResult{ public class GenericsResult<T> extends BaseResult{
public GenericsResult(Boolean success, String message) {
if (success) {
success();
} else {
error();
}
this.message = message;
this.data = null;
}
public GenericsResult(Boolean success, String message, T data) { public GenericsResult(Boolean success, String message, T data) {
if (success) { if (success) {
success(); success();
......
package com.yaoyaozw.customer.components;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NetUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @author darker
* @date 2022/9/21 10:26
*/
@Component
@Slf4j
public class SnowflakeComponent {
@JsonFormat(shape = JsonFormat.Shape.STRING)
private long workerId ;
private final long dataCenterId = 1;
private final Snowflake snowFlake = IdUtil.createSnowflake(workerId,dataCenterId);
@PostConstruct
public void init(){
workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());
log.info("当前机器的workId:{}",workerId);
}
public synchronized long snowflakeId(){
return snowFlake.nextId();
}
public synchronized long snowflakeId(long workerId,long datacenterId){
Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId);
return snowflake.nextId();
}
}
\ No newline at end of file
package com.yaoyaozw.customer.constants;
/**
* @author darker
* @date 2022/9/20 14:54
*/
public class CrowdPackageCommonConstant {
public static final String CANT_FIND_ITEM = "无法获取该数据, 请刷新后重试";
public static final String CANT_FIND_DATA_BASE_CONFIG = "无法获取条件所属数据库服务, 请检查配置";
public static final String UNKNOWN_DATA_BASE_CONFIG = "未知数据库服务配置";
public static final String KANBAN_DATA_BASE = "kanban";
public static final String MATERIAL_DATA_BASE = "material";
public static final String COMPARE_TYPE = "compare";
public static final String RANGE_IN = "in";
public static final String GROUP_OR = "group_or";
}
...@@ -3,15 +3,15 @@ package com.yaoyaozw.customer.controller; ...@@ -3,15 +3,15 @@ package com.yaoyaozw.customer.controller;
import com.yaoyaozw.customer.common.BaseResult; import com.yaoyaozw.customer.common.BaseResult;
import com.yaoyaozw.customer.common.GenericsResult; import com.yaoyaozw.customer.common.GenericsResult;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageQueryDTO; import com.yaoyaozw.customer.dto.crowd.CrowdPackageQueryDTO;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageSaveDTO; import com.yaoyaozw.customer.dto.crowd.CrowdPackageConditionDTO;
import com.yaoyaozw.customer.service.CrowdPackageService; import com.yaoyaozw.customer.service.CrowdPackageService;
import com.yaoyaozw.customer.vo.crowd.CrowdPackageListVO; import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.crowd.*;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
...@@ -27,16 +27,16 @@ public class CrowdPackageController { ...@@ -27,16 +27,16 @@ public class CrowdPackageController {
private CrowdPackageService crowdPackageService; private CrowdPackageService crowdPackageService;
@ApiOperation("新增") @ApiOperation("新增人群包")
@PostMapping("/insert") @GetMapping("/insertPackage")
public BaseResult insertCrowdPackage(@RequestBody CrowdPackageSaveDTO saveDto) { public GenericsResult<CrowdPackageCommonIdVO> insertCrowdPackage(@RequestParam Long id, @RequestParam String name) {
return crowdPackageService.insertCrowdPackage(saveDto); return crowdPackageService.insertCrowdPackage(id, name);
} }
@ApiOperation("编辑") @ApiOperation("向人群包内新增条件")
@PostMapping("/edit") @PostMapping("/insertCondition")
public BaseResult updateCrowdPackage(@RequestBody CrowdPackageSaveDTO saveDto) { public GenericsResult<CrowdPackageCommonIdVO> insertCondition(@RequestBody CrowdPackageConditionDTO conditionDto) {
return crowdPackageService.updateCrowdPackage(saveDto); return crowdPackageService.insertConditionIntoPackage(conditionDto);
} }
@ApiOperation("查询") @ApiOperation("查询")
...@@ -45,12 +45,36 @@ public class CrowdPackageController { ...@@ -45,12 +45,36 @@ public class CrowdPackageController {
return crowdPackageService.pageList(queryDto); return crowdPackageService.pageList(queryDto);
} }
@ApiOperation("删除") @ApiOperation("删除人群包")
@GetMapping("/remove/{id}") @GetMapping("/removePackage/{id}")
public BaseResult removeCrowdPackage(@PathVariable("id") Long id) { public BaseResult removeCrowdPackage(@PathVariable("id") Long id) {
return crowdPackageService.removeCrowdPackage(id); return crowdPackageService.removeCrowdPackage(id);
} }
@ApiOperation("从人群包中删除条件")
@GetMapping("/removeCondition/{linkedId}")
public BaseResult removeCondition(@PathVariable("linkedId") Long linkedId) {
return crowdPackageService.removeConditionFromPackage(linkedId);
}
@ApiOperation("获取已配置的人群包条件")
@GetMapping("/getPackageInfo/{id}")
public GenericsResult<CrowdPackageDetailVO> getPackageInfo(@PathVariable("id") Long id) {
return crowdPackageService.getPackageInfo(id);
}
@ApiOperation("获取所有条件下拉框")
@GetMapping("/getAllConditions")
public GenericsResult<List<CrowdPackageConditionVO>> getAllConditions() {
return crowdPackageService.getAllConditions();
}
@ApiOperation("获取条件的可选项")
@GetMapping("/getOptions/{conditionId}")
public GenericsResult<ConditionOptionResponseVO> getOptions(@PathVariable("conditionId") Long conditionId) {
return crowdPackageService.getOptions(conditionId);
}
} }
package com.yaoyaozw.customer.dto.crowd; package com.yaoyaozw.customer.dto.crowd;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
/** /**
* @author darker * @author darker
* @date 2022/9/15 14:19 * @date 2022/9/15 14:19
*/ */
@Data @Data
public class CrowdPackageSaveDTO implements Serializable { @ApiModel("人群包条件保存实体")
public class CrowdPackageConditionDTO implements Serializable {
private String packageName; @ApiModelProperty("条件Id")
private Long conditionId;
@ApiModelProperty("人群包主键")
private Long packageId;
@ApiModelProperty("比较运算符")
private String compareOperator;
@ApiModelProperty("设置的条件值")
private String conditionValue;
@ApiModelProperty("设置的条件值")
private List<String> multipleOptions;
} }
package com.yaoyaozw.customer.entity; package com.yaoyaozw.customer.entity;
import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
/** /**
* 人群中包
*
* @author darker * @author darker
* @date 2022/9/16 10:43 * @date 2022/09/16
*/ */
@Data @Data
@TableName("crowd_package_main")
@NoArgsConstructor
public class CrowdPackage implements Serializable { public class CrowdPackage implements Serializable {
/**
* 主键ID
*/
@Id
@TableId("id")
private Long id;
/**
* 人群包名称
*/
@TableField("package_name")
private String packageName;
/**
* 人群包用户人数
*/
@TableField("crowd_num")
private Integer crowdNum;
/**
* 人数最后统计时间
*/
@TableField("last_count_time")
private Date lastCountTime;
/**
* 创建时间
*/
@TableField("create_time")
private Date createTime;
/**
* 创建人
*/
@TableField("create_user")
private Long createUser;
/**
* 修改时间
*/
@TableField("modified_time")
private Date modifiedTime;
/**
* 修改人
*/
@TableField("modified_user")
private Long modifiedUser;
private static final long serialVersionUID = 1L;
public CrowdPackage(Long id, String packageName) {
this.id = id;
this.packageName = packageName;
}
public void handleInfo(Date now, Long userId, Boolean isCreate) {
if (isCreate) {
this.createTime = now;
this.createUser = userId;
}
this.modifiedTime = now;
this.modifiedUser = userId;
}
} }
package com.yaoyaozw.customer.entity;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springframework.data.annotation.Id;
/**
* 人群包装条件
*
* @author darker
* @date 2022/09/20
*/
@Data
@TableName("crowd_package_condition")
public class CrowdPackageCondition implements Serializable {
/**
* 主键ID
*/
@TableId("id")
@Id
private Long id;
/**
* 条件值
*/
@TableField("condition_key")
private String conditionKey;
/**
* 条件名称
*/
@TableField("condition_name")
private String conditionName;
/**
* 条件类型
*/
@TableField("condition_type")
private String conditionType;
/**
* 条件选项的前端类型
*/
@TableField("front_type")
private String frontType;
/**
* 是否静态属性
*/
@TableField("is_static")
private Integer isStatic;
/**
* 选项所在数据库服务器
*/
@TableField("source_base_service")
private String sourceBaseService;
/**
* 选项所在表
*/
@TableField("source_table")
private String sourceTable;
/**
* 选项的key值对应字段
*/
@TableField("key_column")
private String keyColumn;
/**
* 选项的name对应字段
*/
@TableField("name_column")
private String nameColumn;
/**
* 选项查询时的额外条件
*/
@TableField("sql_factor")
private String sqlFactor;
private static final long serialVersionUID = 1L;
}
package com.yaoyaozw.customer.entity;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import org.springframework.data.annotation.Id;
/**
* 人群包条件匹配
*
* @author darker
* @date 2022/09/21
*/
@Data
public class CrowdPackageConditionMatch implements Serializable {
/**
* 主键
*/
@Id
@TableId("id")
private Long id;
/**
* 人群包ID
*/
@TableField("package_id")
private Long packageId;
/**
* 条件表主键ID
*/
@TableField("condition_id")
private Long conditionId;
/**
* 条件运算符
*/
@TableField("condition_operator")
private String conditionOperator;
/**
* 运算值
*/
@TableField("operator_value")
private String operatorValue;
/**
* 条件表达式
*/
@TableField("operator_expression")
private String operatorExpression;
/**
* 条件描述
*/
@TableField("operator_description")
private String operatorDescription;
private static final long serialVersionUID = 1L;
}
package com.yaoyaozw.customer.enums;
import cn.hutool.core.util.ObjectUtil;
/**
* @author darker
* @date 2022/9/21 16:40
*/
public enum CrowdPackageConditionEnum {
/**
* 人群包条件的运算符枚举
*/
GIANT_THAN("gt", ">", "大于"),
LITTLE_THEN("lt", "<", "小于"),
GIANT_AND_EQUALS("ge", ">=", "大于等于"),
LITTLE_AND_EQUALS("le", "<=", "小于等于"),
PURE_EQUALS("eq", "=", "等于"),
;
/**
* 关键
*/
private final String key;
/**
* 意义
*/
private final String meaning;
/**
* 描述
*/
private final String description;
CrowdPackageConditionEnum(String key, String meaning, String description) {
this.key = key;
this.meaning = meaning;
this.description = description;
}
public String getKey() {
return key;
}
public String getMeaning() {
return meaning;
}
public String getDescription() {
return description;
}
/**
* 获取运算信息
* @param operator 运算符
* @return 结果
*/
public static CrowdPackageConditionEnum getInfoByOperator(String operator) {
if (ObjectUtil.isNull(operator)) {
return null;
}
for (CrowdPackageConditionEnum value : CrowdPackageConditionEnum.values()) {
if (operator.equals(value.getKey())) {
return value;
}
}
return null;
}
}
package com.yaoyaozw.customer.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yaoyaozw.customer.entity.CrowdPackageConditionMatch;
import org.springframework.stereotype.Repository;
/**
* @author darker
* @date 2022/9/21 15:08
*/
@Repository
public interface CrowdPackageConditionMatchMapper extends BaseMapper<CrowdPackageConditionMatch> {
}
package com.yaoyaozw.customer.mapper; package com.yaoyaozw.customer.mapper;
import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.annotation.DS;
import com.yaoyaozw.customer.entity.CrowdPackageCondition;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List;
/** /**
* @author darker * @author darker
* @date 2022/9/16 15:23 * @date 2022/9/16 15:23
...@@ -11,6 +16,12 @@ import org.springframework.stereotype.Repository; ...@@ -11,6 +16,12 @@ import org.springframework.stereotype.Repository;
@Repository @Repository
public interface KanbanCommonMapper { public interface KanbanCommonMapper {
Integer testCountUser(); /**
* 根据条件配置获取条件选项
*
* @param conditionItem 条件项
* @return {@link List}<{@link CommonOptionResponseVO}>
*/
List<CommonOptionResponseVO> getConditionOptionByConfig(@Param("conditionItem") CrowdPackageCondition conditionItem);
} }
package com.yaoyaozw.customer.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yaoyaozw.customer.entity.CrowdPackageCondition;
import org.springframework.stereotype.Repository;
/**
* @author darker
* @date 2022/9/20 14:46
*/
@Repository
public interface MaterialCrowdPackageConditionMapper extends BaseMapper<CrowdPackageCondition> {
}
...@@ -2,9 +2,16 @@ package com.yaoyaozw.customer.mapper; ...@@ -2,9 +2,16 @@ package com.yaoyaozw.customer.mapper;
import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageQueryDTO;
import com.yaoyaozw.customer.entity.CrowdPackage; import com.yaoyaozw.customer.entity.CrowdPackage;
import com.yaoyaozw.customer.entity.CrowdPackageCondition;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.crowd.CrowdPackageListVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List;
/** /**
* @author darker * @author darker
* @date 2022/9/16 10:44 * @date 2022/9/16 10:44
...@@ -13,6 +20,28 @@ import org.springframework.stereotype.Repository; ...@@ -13,6 +20,28 @@ import org.springframework.stereotype.Repository;
@Repository @Repository
public interface MaterialCrowdPackageMapper extends BaseMapper<CrowdPackage> { public interface MaterialCrowdPackageMapper extends BaseMapper<CrowdPackage> {
Integer testCountUser(); /**
* 根据条件配置获取条件选项
*
* @param conditionItem 条件项
* @return {@link List}<{@link CommonOptionResponseVO}>
*/
List<CommonOptionResponseVO> getConditionOptionByConfig(@Param("conditionItem") CrowdPackageCondition conditionItem);
/**
* 获得页面列表
*
* @param queryDto 查询dto
* @return {@link List}<{@link CrowdPackageListVO}>
*/
List<CrowdPackageListVO> getPageList(@Param("queryDto") CrowdPackageQueryDTO queryDto);
/**
* 删除条件
*
* @param linkedId 相关id
*/
void removeCondition(@Param("linkedId") Long linkedId);
} }
package com.yaoyaozw.customer.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yaoyaozw.customer.entity.CrowdPackageConditionMatch;
/**
* @author darker
* @date 2022/9/21 15:08
*/
public interface CrowdPackageConditionMatchService extends IService<CrowdPackageConditionMatch> {
}
package com.yaoyaozw.customer.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yaoyaozw.customer.entity.CrowdPackageCondition;
/**
* @author darker
* @date 2022/9/20 14:47
*/
public interface CrowdPackageConditionService extends IService<CrowdPackageCondition> {
}
...@@ -4,9 +4,10 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -4,9 +4,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.yaoyaozw.customer.common.BaseResult; import com.yaoyaozw.customer.common.BaseResult;
import com.yaoyaozw.customer.common.GenericsResult; import com.yaoyaozw.customer.common.GenericsResult;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageQueryDTO; import com.yaoyaozw.customer.dto.crowd.CrowdPackageQueryDTO;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageSaveDTO; import com.yaoyaozw.customer.dto.crowd.CrowdPackageConditionDTO;
import com.yaoyaozw.customer.entity.CrowdPackage; import com.yaoyaozw.customer.entity.CrowdPackage;
import com.yaoyaozw.customer.vo.crowd.CrowdPackageListVO; import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.crowd.*;
import java.util.List; import java.util.List;
...@@ -18,18 +19,20 @@ public interface CrowdPackageService extends IService<CrowdPackage> { ...@@ -18,18 +19,20 @@ public interface CrowdPackageService extends IService<CrowdPackage> {
/** /**
* 插入人群包 * 插入人群包
* *
* @param saveDto 保存dto * @param id 人群包id
* @param name 人群包名
* @return {@link BaseResult} * @return {@link BaseResult}
*/ */
BaseResult insertCrowdPackage(CrowdPackageSaveDTO saveDto); GenericsResult<CrowdPackageCommonIdVO> insertCrowdPackage(Long id, String name);
/** /**
* 人群更新包 * 新增人群包条件
* *
* @param saveDto 保存dto * @param conditionDto 条件dto
* @return {@link BaseResult} * @return {@link BaseResult}
*/ */
BaseResult updateCrowdPackage(CrowdPackageSaveDTO saveDto); GenericsResult<CrowdPackageCommonIdVO> insertConditionIntoPackage(CrowdPackageConditionDTO conditionDto);
/** /**
* 页面列表 * 页面列表
...@@ -46,4 +49,39 @@ public interface CrowdPackageService extends IService<CrowdPackage> { ...@@ -46,4 +49,39 @@ public interface CrowdPackageService extends IService<CrowdPackage> {
* @return {@link BaseResult} * @return {@link BaseResult}
*/ */
BaseResult removeCrowdPackage(Long id); BaseResult removeCrowdPackage(Long id);
/**
* 删除条件
*
* @param linkedId 人群包-条件 关联主键
* @return {@link BaseResult}
*/
BaseResult removeConditionFromPackage(Long linkedId);
/**
* 得到包条件列表
*
* @param id id
* @return {@link GenericsResult}<{@link List}<{@link CrowdPackageConditionVO}>>
*/
GenericsResult<CrowdPackageDetailVO> getPackageInfo(Long id);
/**
* 得到所有条件
*
* @return {@link GenericsResult}<{@link List}<{@link CrowdPackageConditionVO}>>
*/
GenericsResult<List<CrowdPackageConditionVO>> getAllConditions();
/**
* 得到某个条件的可选项
*
* @param conditionId 状态标识
* @return {@link GenericsResult}<{@link ConditionOptionResponseVO}
*/
GenericsResult<ConditionOptionResponseVO> getOptions(Long conditionId);
} }
package com.yaoyaozw.customer.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yaoyaozw.customer.entity.CrowdPackageConditionMatch;
import com.yaoyaozw.customer.mapper.CrowdPackageConditionMatchMapper;
import com.yaoyaozw.customer.service.CrowdPackageConditionMatchService;
import org.springframework.stereotype.Service;
/**
* @author darker
* @date 2022/9/21 15:09
*/
@Service
public class CrowdPackageConditionMatchServiceImpl extends ServiceImpl<CrowdPackageConditionMatchMapper, CrowdPackageConditionMatch> implements CrowdPackageConditionMatchService {
}
package com.yaoyaozw.customer.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yaoyaozw.customer.entity.CrowdPackageCondition;
import com.yaoyaozw.customer.mapper.MaterialCrowdPackageConditionMapper;
import com.yaoyaozw.customer.service.CrowdPackageConditionService;
import org.springframework.stereotype.Service;
/**
* @author darker
* @date 2022/9/20 14:47
*/
@Service
public class CrowdPackageConditionServiceImpl extends ServiceImpl<MaterialCrowdPackageConditionMapper, CrowdPackageCondition> implements CrowdPackageConditionService {
}
package com.yaoyaozw.customer.service.impl; package com.yaoyaozw.customer.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yaoyaozw.customer.common.BaseResult; import com.yaoyaozw.customer.common.BaseResult;
import com.yaoyaozw.customer.common.GenericsResult; import com.yaoyaozw.customer.common.GenericsResult;
import com.yaoyaozw.customer.components.SnowflakeComponent;
import com.yaoyaozw.customer.components.TokenManager;
import com.yaoyaozw.customer.constants.CrowdPackageCommonConstant;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageQueryDTO; import com.yaoyaozw.customer.dto.crowd.CrowdPackageQueryDTO;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageSaveDTO; import com.yaoyaozw.customer.dto.crowd.CrowdPackageConditionDTO;
import com.yaoyaozw.customer.entity.CrowdPackage; import com.yaoyaozw.customer.entity.CrowdPackage;
import com.yaoyaozw.customer.entity.CrowdPackageCondition;
import com.yaoyaozw.customer.entity.CrowdPackageConditionMatch;
import com.yaoyaozw.customer.enums.CrowdPackageConditionEnum;
import com.yaoyaozw.customer.mapper.KanbanCommonMapper; import com.yaoyaozw.customer.mapper.KanbanCommonMapper;
import com.yaoyaozw.customer.mapper.MaterialCrowdPackageMapper; import com.yaoyaozw.customer.mapper.MaterialCrowdPackageMapper;
import com.yaoyaozw.customer.service.CrowdPackageConditionMatchService;
import com.yaoyaozw.customer.service.CrowdPackageConditionService;
import com.yaoyaozw.customer.service.CrowdPackageService; import com.yaoyaozw.customer.service.CrowdPackageService;
import com.yaoyaozw.customer.vo.crowd.CrowdPackageListVO; import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.crowd.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* @author darker * @author darker
...@@ -23,24 +40,240 @@ import java.util.List; ...@@ -23,24 +40,240 @@ import java.util.List;
@Service @Service
public class CrowdPackageServiceImpl extends ServiceImpl<MaterialCrowdPackageMapper, CrowdPackage> implements CrowdPackageService { public class CrowdPackageServiceImpl extends ServiceImpl<MaterialCrowdPackageMapper, CrowdPackage> implements CrowdPackageService {
private final static Logger LOCAL_LOG = LoggerFactory.getLogger(CrowdPackageServiceImpl.class);
@Autowired
private CrowdPackageConditionService conditionService;
@Autowired
private KanbanCommonMapper kanbanCommonMapper;
@Autowired
private TokenManager tokenManager;
@Autowired
private SnowflakeComponent snowflakeComponent;
@Autowired
private CrowdPackageConditionMatchService matchService;
@Override @Override
public BaseResult insertCrowdPackage(CrowdPackageSaveDTO saveDto) { public GenericsResult<CrowdPackageCommonIdVO> insertCrowdPackage(Long id, String name) {
return new BaseResult().success(); // 根据是否传了主键判断是创建还是更新
boolean isCreate = ObjectUtil.isNull(id);
// 获取操作人
Long userId = tokenManager.getUserIdFromToken();
id = ObjectUtil.isNull(id) ? snowflakeComponent.snowflakeId() : id;
CrowdPackage crowdPackage = new CrowdPackage(id, name);
crowdPackage.handleInfo(new Date(), userId, isCreate);
// 执行保存
return super.saveOrUpdate(crowdPackage) ? new GenericsResult<>(new CrowdPackageCommonIdVO(id, null)) : new GenericsResult<>(false, "新增人群包失败!");
} }
@Override @Override
public BaseResult updateCrowdPackage(CrowdPackageSaveDTO saveDto) { public GenericsResult<CrowdPackageCommonIdVO> insertConditionIntoPackage(CrowdPackageConditionDTO conditionDto) {
return new BaseResult().success(); CrowdPackageCommonIdVO crowdPackageCommonIdVo = new CrowdPackageCommonIdVO();
Long packageId = conditionDto.getPackageId();
if (ObjectUtil.isNull(packageId)) {
// 人群包内的第一个条件,先创建人群包,获取主键
GenericsResult<CrowdPackageCommonIdVO> insertResult = this.insertCrowdPackage(null, null);
if (!insertResult.getSuccess()) {
// 如果保存人群包失败
return insertResult;
}
crowdPackageCommonIdVo = insertResult.getData();
} else {
// 不是第一条条件,已经生成人群包
crowdPackageCommonIdVo.setPackageId(packageId);
}
// 构造关联表的相关数据
CrowdPackageConditionMatch match = new CrowdPackageConditionMatch();
match.setPackageId(packageId);
match.setConditionId(conditionDto.getConditionId());
// 构造条件数据
try {
constructOperator(match, conditionDto);
} catch (Exception e) {
LOCAL_LOG.info("构造运算条件异常");
return new GenericsResult<>(false, e.getMessage());
}
crowdPackageCommonIdVo.setConditionDescription(match.getOperatorDescription());
// 保存关联关系
long matchId = snowflakeComponent.snowflakeId();
match.setId(matchId);
boolean matchSaveResult = matchService.save(match);
if (!matchSaveResult) {
return new GenericsResult<>(false, "向人群包保存条件失败!");
}
// 构造返回数据
crowdPackageCommonIdVo.setLinkedId(matchId);
return new GenericsResult<>(crowdPackageCommonIdVo);
} }
@Override @Override
public GenericsResult<List<CrowdPackageListVO>> pageList(CrowdPackageQueryDTO queryDto) { public GenericsResult<CrowdPackageDetailVO> getPackageInfo(Long id) {
return null;
}
return new GenericsResult<>(new ArrayList<>()); @Override
public GenericsResult<List<CrowdPackageListVO>> pageList(CrowdPackageQueryDTO queryDto) {
List<CrowdPackageListVO> pageList = baseMapper.getPageList(queryDto);
if (CollectionUtil.isEmpty(pageList)) {
return new GenericsResult<>(false, "暂无数据");
}
return new GenericsResult<>(pageList);
} }
@Override @Override
public BaseResult removeCrowdPackage(Long id) { public BaseResult removeCrowdPackage(Long id) {
return super.removeById(id) ? new BaseResult().error("删除异常!") : new BaseResult().success();
}
@Override
public BaseResult removeConditionFromPackage(Long linkedId) {
baseMapper.removeCondition(linkedId);
return new BaseResult().success(); return new BaseResult().success();
} }
@Override
public GenericsResult<List<CrowdPackageConditionVO>> getAllConditions() {
List<CrowdPackageCondition> conditionList = conditionService.list();
// 将结果转换成返回结果
List<CrowdPackageConditionVO> conditionVoList = conditionList.stream().map(item -> {
CrowdPackageConditionVO vo = new CrowdPackageConditionVO();
BeanUtils.copyProperties(item, vo);
return vo;
}).collect(Collectors.toList());
// 封装返回结果
return new GenericsResult<>(conditionVoList);
}
@Override
public GenericsResult<ConditionOptionResponseVO> getOptions(Long conditionId) {
// 查出该条件的数据
CrowdPackageCondition conditionItem = conditionService.getById(conditionId);
if (ObjectUtil.isNull(conditionItem)) {
return new GenericsResult<>(Boolean.FALSE, CrowdPackageCommonConstant.CANT_FIND_ITEM);
}
if (ObjectUtil.isNull(conditionItem.getSourceBaseService())) {
return new GenericsResult<>(Boolean.FALSE, CrowdPackageCommonConstant.CANT_FIND_DATA_BASE_CONFIG);
}
// 根据条件配置判断查询的数据库
List<CommonOptionResponseVO> result;
if (CrowdPackageCommonConstant.KANBAN_DATA_BASE.equals(conditionItem.getSourceBaseService())) {
// 是看板的数据源
result = kanbanCommonMapper.getConditionOptionByConfig(conditionItem);
} else if (CrowdPackageCommonConstant.MATERIAL_DATA_BASE.equals(conditionItem.getSourceBaseService())) {
// 是运营系统的数据源
result = baseMapper.getConditionOptionByConfig(conditionItem);
} else {
return new GenericsResult<>(Boolean.FALSE, CrowdPackageCommonConstant.UNKNOWN_DATA_BASE_CONFIG);
}
return new GenericsResult<>(new ConditionOptionResponseVO(conditionItem.getFrontType(), result));
}
/**
* 构造操作符
*
* @param match 匹配
* @param conditionDto 条件dto
*/
private void constructOperator(CrowdPackageConditionMatch match, CrowdPackageConditionDTO conditionDto){
// TODO: 2022/9/21 构造运算表达式
CrowdPackageCondition conditionInfo = conditionService.getById(conditionDto.getConditionId());
if (ObjectUtil.isNull(conditionInfo)) {
throw new RuntimeException("无法获取条件");
}
String conditionType = conditionInfo.getConditionType();
LOCAL_LOG.info("当前条件类型: {}", conditionType);
// 是需要比较的类型, 获取对应的比较符号的数据
if (CrowdPackageCommonConstant.COMPARE_TYPE.equals(conditionType)) {
handleCompareType(match, conditionDto, conditionInfo);
return;
}
if (CrowdPackageCommonConstant.RANGE_IN.equals(conditionType)) {
handleRangeIn(match, conditionDto, conditionInfo);
return;
}
if (CrowdPackageCommonConstant.GROUP_OR.equals(conditionType)) {
handleGroupOr(match, conditionDto, conditionInfo);
return;
}
// 没有匹配的类型
throw new RuntimeException("找不到匹配的条件类型!");
}
/**
* 处理比较类型
* @param match 匹配关系
* @param conditionDto 请求条件
* @param conditionInfo 条件信息
*/
private void handleCompareType(CrowdPackageConditionMatch match, CrowdPackageConditionDTO conditionDto, CrowdPackageCondition conditionInfo){
LOCAL_LOG.info("是需要比较的类型");
CrowdPackageConditionEnum operatorInfo = CrowdPackageConditionEnum.getInfoByOperator(conditionDto.getCompareOperator());
if (ObjectUtil.isNull(operatorInfo)) {
throw new RuntimeException("无法获取比较类型");
}
String expression = conditionInfo.getConditionKey() + operatorInfo.getMeaning() + conditionDto.getConditionValue();
LOCAL_LOG.info("表达式拼接结果: {}", expression);
String description = conditionInfo.getConditionName() + operatorInfo.getDescription() + conditionDto.getConditionValue();
LOCAL_LOG.info("条件描述: {}", description);
match.setOperatorExpression(expression);
match.setOperatorDescription(description);
}
/**
* 处理范围类型
* @param match 匹配关系
* @param conditionDto 请求条件
* @param conditionInfo 条件信息
*/
private void handleRangeIn(CrowdPackageConditionMatch match, CrowdPackageConditionDTO conditionDto, CrowdPackageCondition conditionInfo) {
// 范围条件
LOCAL_LOG.info("是范围条件");
CrowdPackageConditionEnum operatorInfo = CrowdPackageConditionEnum.getInfoByOperator(conditionDto.getCompareOperator());
if (ObjectUtil.isNull(operatorInfo)) {
throw new RuntimeException("无法获取比较类型");
}
List<String> multipleOptions = conditionDto.getMultipleOptions();
StringBuilder expressionBuilder = new StringBuilder("in (");
for (String multipleOption : multipleOptions) {
expressionBuilder.append("'").append(multipleOption).append("'");
}
expressionBuilder.append(")");
// 表达式
String expression = expressionBuilder.toString();
LOCAL_LOG.info("表达式拼接结果: {}", expression);
// 获取选项对应的名称
ConditionOptionResponseVO responseVo = this.getOptions(conditionInfo.getId()).getData();
if (ObjectUtil.isNull(responseVo) || CollectionUtil.isEmpty(responseVo.getOptionList())) {
throw new RuntimeException("找不到条件的选项");
}
StringBuilder descriptionBuilder = new StringBuilder(conditionInfo.getConditionName() + " 范围: ");
for (CommonOptionResponseVO commonOptionResponseVo : responseVo.getOptionList()) {
descriptionBuilder.append(commonOptionResponseVo.getName()).append("/");
}
String description = descriptionBuilder.toString();
LOCAL_LOG.info("条件描述: {}", description);
match.setOperatorExpression(expression);
match.setOperatorDescription(description);
}
/**
* 处理分组求并类型
* @param match 匹配关系
* @param conditionDto 请求条件
* @param conditionInfo 条件信息
*/
private void handleGroupOr(CrowdPackageConditionMatch match, CrowdPackageConditionDTO conditionDto, CrowdPackageCondition conditionInfo) {
// 分组求并条件
}
} }
package com.yaoyaozw.customer.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author darker
* @date 2022/9/19 17:32
*/
@Data
@ApiModel("下拉框选项返回实体")
public class CommonOptionResponseVO implements Serializable {
@ApiModelProperty("key值")
private String key;
@ApiModelProperty("选项名称")
private String name;
}
package com.yaoyaozw.customer.vo.crowd;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @author darker
* @date 2022/9/21 19:34
*/
@Data
@ApiModel("条件选项实体")
@NoArgsConstructor
public class ConditionOptionResponseVO implements Serializable {
@ApiModelProperty("条件类型")
private String frontType;
@ApiModelProperty("选项列表")
private List<CommonOptionResponseVO> optionList;
public ConditionOptionResponseVO(String frontType, List<CommonOptionResponseVO> optionList) {
this.frontType = frontType;
this.optionList = optionList;
}
}
package com.yaoyaozw.customer.vo.crowd;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author darker
* @date 2022/9/19 17:37
*/
@Data
@ApiModel("接口执行生成的主键")
@NoArgsConstructor
public class CrowdPackageCommonIdVO implements Serializable {
@ApiModelProperty("人群包主键ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long packageId;
@ApiModelProperty("人群包与条件关联主键")
@JsonSerialize(using = ToStringSerializer.class)
private Long linkedId;
@ApiModelProperty("新增的条件描述")
private String conditionDescription;
public CrowdPackageCommonIdVO(Long packageId, Long linkedId) {
this.packageId = packageId;
this.linkedId = linkedId;
}
}
package com.yaoyaozw.customer.vo.crowd;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @author darker
* @date 2022/9/19 15:59
*/
@Data
@ApiModel("人群包条件回显实体")
public class CrowdPackageConditionVO implements Serializable {
@ApiModelProperty("人群包下的条件ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@ApiModelProperty("条件key")
private String ConditionKey;
@ApiModelProperty("条件名称")
private String conditionName;
@ApiModelProperty("条件类型")
private String conditionType;
@ApiModelProperty("条件在前端页面的类型")
private String frontType;
@ApiModelProperty("是否静态属性 0 - 否;1 - 是")
private Integer isStatic;
}
package com.yaoyaozw.customer.vo.crowd;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @author darker
* @date 2022/9/19 17:44
*/
@Data
@ApiModel("人群包详情页回显实体")
public class CrowdPackageDetailVO implements Serializable {
@ApiModelProperty("人群包主键")
@JsonSerialize(using = ToStringSerializer.class)
private Long packageId;
@ApiModelProperty("人群包名")
private String packageName;
@ApiModelProperty("已配置的人群包条件")
private List<CrowdPackageConditionVO> conditionList;
}
package com.yaoyaozw.customer.vo.crowd; package com.yaoyaozw.customer.vo.crowd;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -15,6 +17,7 @@ import java.io.Serializable; ...@@ -15,6 +17,7 @@ import java.io.Serializable;
public class CrowdPackageListVO implements Serializable { public class CrowdPackageListVO implements Serializable {
@ApiModelProperty("人群包主键") @ApiModelProperty("人群包主键")
@JsonSerialize(using = ToStringSerializer.class)
private Long id; private Long id;
@ApiModelProperty("人群包名称") @ApiModelProperty("人群包名称")
......
...@@ -2,7 +2,16 @@ ...@@ -2,7 +2,16 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yaoyaozw.customer.mapper.KanbanCommonMapper"> <mapper namespace="com.yaoyaozw.customer.mapper.KanbanCommonMapper">
<select id="testCountUser" resultType="java.lang.Integer"> <select id="getConditionOptionByConfig" resultType="com.yaoyaozw.customer.vo.CommonOptionResponseVO">
select count(1) from cost_order_setup_group select
${conditionItem.keyColumn} as `key`,
${conditionItem.nameColumn} as `name`
from ${conditionItem.sourceTable}
<if test="conditionItem.sqlFactor != null ">
${conditionItem.sqlFactor}
</if>
</select> </select>
</mapper> </mapper>
\ No newline at end of file
...@@ -2,7 +2,37 @@ ...@@ -2,7 +2,37 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yaoyaozw.customer.mapper.MaterialCrowdPackageMapper"> <mapper namespace="com.yaoyaozw.customer.mapper.MaterialCrowdPackageMapper">
<select id="testCountUser" resultType="java.lang.Integer"> <select id="getConditionOptionByConfig" resultType="com.yaoyaozw.customer.vo.CommonOptionResponseVO">
select count(1) from material_graphics_delay select
${conditionItem.keyColumn} as `key`,
${conditionItem.nameColumn} as `name`
from ${conditionItem.sourceTable}
<if test="conditionItem.sqlFactor != null ">
${conditionItem.sqlFactor}
</if>
</select>
<select id="getPageList" resultType="com.yaoyaozw.customer.vo.crowd.CrowdPackageListVO">
select
cpm.id, cpm.package_name as packageName,
cpm.create_time as createTime, cpm.modified_time as modifiedTime,
cau.nick_name as createUser, mau.nick_name as modifiedUser
from crowd_package_main cpm
left join acl_user cau
on cpm.create_user = cau.id
left join acl_user mau
on cpm.modified_user = mau.id
where cpm.package_name is not null
</select> </select>
<delete id="removeCondition">
delete from crowd_package_condition_match where id = #{linkedId}
</delete>
</mapper> </mapper>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论