用户充值扣费(未测)

master
yqy 11 months ago
parent 2ef02b2cde
commit 55a2ff1f9a

@ -18,6 +18,13 @@ public interface AdminUserChecker {
*/ */
boolean isAdminUser(SysUser user); boolean isAdminUser(SysUser user);
/**
*
* @param userId ID
* @return boolean
*/
boolean isAdminUser(Long userId);
/** /**
* *
* @param targetUser * @param targetUser

@ -2,7 +2,6 @@ package com.baiye.system.checker;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import com.baiye.enums.SalesManEnum;
import com.baiye.security.util.SecurityUtils; import com.baiye.security.util.SecurityUtils;
import com.baiye.system.model.entity.SysUser; import com.baiye.system.model.entity.SysUser;
import com.baiye.system.properties.SystemProperties; import com.baiye.system.properties.SystemProperties;
@ -14,8 +13,6 @@ import java.util.Set;
/** /**
* *
*
* @author lingting 2020-06-24 21:00:15
*/ */
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@ -33,6 +30,12 @@ public class AdminUserCheckerImpl implements AdminUserChecker {
&& administrator.getUsername().equals(user.getUsername()); && administrator.getUsername().equals(user.getUsername());
} }
@Override
public boolean isAdminUser(Long userId) {
SystemProperties.Administrator administrator = systemProperties.getAdministrator();
return administrator.getUserId() == userId;
}
@Override @Override
public boolean hasModifyPermission(SysUser targetUser) { public boolean hasModifyPermission(SysUser targetUser) {
// 如果需要修改的用户是超级管理员,则只能本人修改 // 如果需要修改的用户是超级管理员,则只能本人修改

@ -1,6 +1,7 @@
package com.baiye.system.mapper; package com.baiye.system.mapper;
import com.baiye.system.model.dto.SysUserNameRoleDTO; import com.baiye.system.model.dto.SysUserNameRoleDTO;
import com.baiye.system.model.vo.SysUserBalanceVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
@ -22,6 +23,7 @@ import org.apache.ibatis.annotations.Param;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* *
@ -178,6 +180,27 @@ public interface SysUserMapper extends ExtendMapper<SysUser> {
return SqlHelper.retBool(count); return SqlHelper.retBool(count);
} }
List<SelectData<Void>> listSelectSonListData(@Param("userId") Long userId); List<SelectData<Void>> listSelectSonListData(@Param("userId") Long userId, @Param("roleCodes") Collection<String> roleCodes);
/**
*
*/
int recharge(@Param("userId") Long userId, @Param("rechargeClueNum") Integer rechargeClueNum);
/**
*
*/
int charging(@Param("map") Map<Long, Integer> map);
/**
*
*/
Integer findUserBalance(@Param("userId") Long userId);
/**
*
*/
List<SysUserBalanceVO> listUserBalance(@Param("userIdList") Collection<Long> userIdList);
void updateDistributeNum(@Param("map") Map<Long, Integer> map);
} }

@ -210,14 +210,18 @@ public interface SysUserService extends ExtendService<SysUser> {
/** /**
* - * -
* @param map * @param map
* @param bool admin
* @return true false * @return true false
*/ */
boolean detectionAvailableNumUpdate(Map<Long, Integer> map, boolean bool); boolean detectionAvailableNumUpdate(Map<Long, Integer> map);
/** /**
* *
* @return nickname: null: * @return nickname: null:
*/ */
String detectionAvailableNum(List<Long> userIds); String detectionAvailableNum(List<Long> userIds);
/**
*
*/
boolean recharge(SysUserDTO sysUserDTO);
} }

@ -1,6 +1,7 @@
package com.baiye.system.service.impl; package com.baiye.system.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@ -8,6 +9,7 @@ import com.baiye.enums.SalesManEnum;
import com.baiye.exception.BadRequestException; import com.baiye.exception.BadRequestException;
import com.baiye.system.checker.AdminUserChecker; import com.baiye.system.checker.AdminUserChecker;
import com.baiye.system.converter.SysUserConverter; import com.baiye.system.converter.SysUserConverter;
import com.baiye.system.enums.RoleCodeEnum;
import com.baiye.system.event.UserCreatedEvent; import com.baiye.system.event.UserCreatedEvent;
import com.baiye.system.event.UserDelEvent; import com.baiye.system.event.UserDelEvent;
import com.baiye.system.event.UserOrganizationChangeEvent; import com.baiye.system.event.UserOrganizationChangeEvent;
@ -15,6 +17,7 @@ import com.baiye.system.mapper.SysUserMapper;
import com.baiye.system.model.dto.SysUserNameRoleDTO; import com.baiye.system.model.dto.SysUserNameRoleDTO;
import com.baiye.system.model.dto.SysUserScope; import com.baiye.system.model.dto.SysUserScope;
import com.baiye.system.model.entity.SysRole; import com.baiye.system.model.entity.SysRole;
import com.baiye.system.model.vo.SysUserBalanceVO;
import com.baiye.system.properties.FileProperties; import com.baiye.system.properties.FileProperties;
import com.baiye.system.service.SysMenuService; import com.baiye.system.service.SysMenuService;
import com.baiye.system.service.SysUserRoleService; import com.baiye.system.service.SysUserRoleService;
@ -35,7 +38,6 @@ import com.baiye.system.model.entity.SysMenu;
import com.baiye.system.model.entity.SysUser; import com.baiye.system.model.entity.SysUser;
import com.baiye.system.model.qo.SysUserQO; import com.baiye.system.model.qo.SysUserQO;
import com.baiye.system.model.vo.SysUserPageVO; import com.baiye.system.model.vo.SysUserPageVO;
import com.baiye.system.service.SysRoleService;
import com.baiye.system.service.SysUserService; import com.baiye.system.service.SysUserService;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -69,8 +71,6 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
private final AdminUserChecker adminUserChecker; private final AdminUserChecker adminUserChecker;
private final SysRoleService sysRoleService;
private final ApplicationEventPublisher publisher; private final ApplicationEventPublisher publisher;
private final PasswordHelper passwordHelper; private final PasswordHelper passwordHelper;
@ -91,21 +91,28 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
List<SysUser> sysUsers = baseMapper.selectList(new LambdaQueryWrapper<>()); List<SysUser> sysUsers = baseMapper.selectList(new LambdaQueryWrapper<>());
List<SysUserPageVO> userAll = Convert.toList(SysUserPageVO.class, sysUsers); List<SysUserPageVO> userAll = Convert.toList(SysUserPageVO.class, sysUsers);
Map<Long, List<SysUserPageVO>> userGroup = userAll.stream() Map<Long, List<SysUserPageVO>> userGroup = userAll.stream().collect(Collectors.groupingBy(SysUserPageVO::getWhichUserId));
.collect(Collectors.groupingBy(SysUserPageVO::getWhichUserId));
result.getRecords().forEach(user -> { for (SysUserPageVO user : result.getRecords()) {
List<SysUserPageVO> byWhichUserId = userGroup.get(user.getUserId()); List<SysUserPageVO> byWhichUserId = userGroup.get(user.getUserId());
if (CollUtil.isNotEmpty(byWhichUserId)) { if (CollUtil.isNotEmpty(byWhichUserId)) {
user.setChildren(byWhichUserId); user.setChildren(byWhichUserId);
} }
}); user.setRoleCode(null);
}
return result; return result;
} }
@Override @Override
public PageResult<SysUserPageVO> queryAll(PageParam pageParam, SysUserQO qo) { public PageResult<SysUserPageVO> queryAll(PageParam pageParam, SysUserQO qo) {
return baseMapper.queryPage(pageParam, qo); PageResult<SysUserPageVO> result = baseMapper.queryPage(pageParam, qo);
for (SysUserPageVO user : result.getRecords()) {
List<String> of = ListUtil.of(RoleCodeEnum.find(15L), RoleCodeEnum.find(23L));
if (of.contains(user.getRoleCode())) user.setIsSalesman(true);
user.setRoleCode(null);
}
return result;
} }
/** /**
@ -193,7 +200,6 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
// 保存用户 // 保存用户
sysUser.setWhichUserId(SecurityUtils.getCurrentUserId()); sysUser.setWhichUserId(SecurityUtils.getCurrentUserId());
sysUser.setResidueClueNum(0);
sysUser.setChargingStatus(0); sysUser.setChargingStatus(0);
boolean insertSuccess = SqlHelper.retBool(baseMapper.insert(sysUser)); boolean insertSuccess = SqlHelper.retBool(baseMapper.insert(sysUser));
Assert.isTrue(insertSuccess, () -> { Assert.isTrue(insertSuccess, () -> {
@ -457,7 +463,12 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
@Override @Override
public List<SelectData<Void>> listSelectSonListData() { public List<SelectData<Void>> listSelectSonListData() {
return baseMapper.listSelectSonListData(SecurityUtils.getCurrentUserId()); Long userId = SecurityUtils.getCurrentUserId();
if (adminUserChecker.isAdminUser(userId)) {
return baseMapper.listSelectSonListData(userId, null);
}
List<String> list = ListUtil.of(RoleCodeEnum.find(15L), RoleCodeEnum.find(23L));
return baseMapper.listSelectSonListData(userId, list);
} }
@Override @Override
@ -467,39 +478,57 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean detectionAvailableNumUpdate(Map<Long, Integer> map, boolean bool) { public synchronized boolean detectionAvailableNumUpdate(Map<Long, Integer> map) {
if (CollUtil.isNotEmpty(map)) throw new BadRequestException("用户不能为空"); if (CollUtil.isEmpty(map)) throw new BadRequestException("用户不能为空");
List<SysUser> sysUserList = this.listByIds(map.keySet()); List<SysUserBalanceVO> sysUserList = baseMapper.listUserBalance(map.keySet());
Long whichUserId = sysUserList.get(0).getWhichUserId(); Long whichUserId = sysUserList.get(0).getWhichUserId();
SysUser sysUser = baseMapper.selectById(whichUserId); if (!adminUserChecker.isAdminUser(whichUserId)) {
for (SysUser user : sysUserList) { SysUser sysUser = baseMapper.selectById(whichUserId);
Integer clueNum = map.get(user.getUserId()); if (sysUser.getChargingStatus() == 1) {
// 非admin下发时 并且 公司管理员账号开启了计费模式(检测余额数量是否充足) // 检测余额是否充足
if (!bool && sysUser.getChargingStatus() == 1) { for (SysUserBalanceVO user : sysUserList) {
Integer residueClueNum = user.getResidueClueNum(); Integer clueNum = map.get(user.getUserId());
if (residueClueNum < clueNum) throw new BadRequestException(user.getNickname() + "用户余额不足!!"); // 非admin下发时 并且 公司管理员账号开启了计费模式(检测余额数量是否充足)
user.setResidueClueNum(residueClueNum - clueNum); Integer residueClueNum = user.getResidueClueNum();
if (residueClueNum < clueNum) throw new BadRequestException(user.getUsername() + "-用户余额不足");
}
baseMapper.charging(map);// 扣费
} }
user.setDistributeNum(user.getDistributeNum() + clueNum);
} }
this.updateBatchById(sysUserList); baseMapper.updateDistributeNum(map);// 修改分发数量
return true; return true;
} }
@Override @Override
public String detectionAvailableNum(List<Long> userIds) { public String detectionAvailableNum(List<Long> userIds) {
if (CollUtil.isNotEmpty(userIds)) throw new BadRequestException("用户不能为空"); if (CollUtil.isEmpty(userIds)) throw new BadRequestException("用户不能为空");
List<SysUser> sysUsers = this.listByUserIds(userIds); List<SysUserBalanceVO> sysUsers = baseMapper.listUserBalance(userIds);
Long whichUserId = sysUsers.get(0).getWhichUserId(); Long whichUserId = sysUsers.get(0).getWhichUserId();
if (whichUserId != 1) { SysUser whichUser = baseMapper.selectById(whichUserId);
SysUser whichUser = baseMapper.selectById(whichUserId); for (SysUserBalanceVO sysUser : sysUsers) {
for (SysUser sysUser : sysUsers) { if (!adminUserChecker.isAdminUser(whichUserId) && whichUser.getChargingStatus() == 1 && sysUser.getResidueClueNum() <= 0) {
if (whichUser.getChargingStatus() == 1 && sysUser.getResidueClueNum() <= 0) return sysUser.getUsername();
return sysUser.getNickname();
} }
} }
return null; return null;
} }
@Override
@Transactional(rollbackFor = Exception.class)
public synchronized boolean recharge(SysUserDTO sysUserDTO) {
Long currentUserId = SecurityUtils.getCurrentUserId();
Integer rechargeClueNum = sysUserDTO.getRechargeClueNum();
if (!adminUserChecker.isAdminUser(currentUserId)) {
Integer userBalance = baseMapper.findUserBalance(currentUserId);
if (userBalance < rechargeClueNum) throw new BadRequestException("余额不足");
Map<Long, Integer> map = new HashMap<>();
map.put(currentUserId, rechargeClueNum);
baseMapper.charging(map);
}
log.info("用户{},给{}充值,条数:{}", currentUserId, sysUserDTO.getUserId(), rechargeClueNum);
return SqlHelper.retBool(baseMapper.recharge(sysUserDTO.getUserId(), rechargeClueNum));
}
} }

@ -27,10 +27,13 @@
<select id="selectByPage" resultType="com.baiye.system.model.vo.SysUserPageVO"> <select id="selectByPage" resultType="com.baiye.system.model.vo.SysUserPageVO">
SELECT SELECT
<include refid="Base_Alias_Column_List"/> <include refid="Base_Alias_Column_List"/>
,so.name as organization_name ,so.name as organization_name,
sur.role_code as roleCode
FROM FROM
sys_user su sys_user su
LEFT JOIN LEFT JOIN
sys_user_role sur ON su.user_id = sur.user_id
LEFT JOIN
sys_organization so ON su.organization_id = so.id and so.deleted = 0 sys_organization so ON su.organization_id = so.id and so.deleted = 0
${ew.customSqlSegment} ${ew.customSqlSegment}
</select> </select>
@ -69,7 +72,7 @@
<select id="listUserNameByUserIds" resultType="com.baiye.system.model.dto.SysUserNameRoleDTO"> <select id="listUserNameByUserIds" resultType="com.baiye.system.model.dto.SysUserNameRoleDTO">
select select
username as userName, username as userName,
user_id as userId user_id as userId
from from
sys_user sys_user
where where
@ -97,13 +100,65 @@
</select> </select>
<select id="listSelectSonListData" resultType="com.baiye.domain.SelectData"> <select id="listSelectSonListData" resultType="com.baiye.domain.SelectData">
select username as name, select su.username as name,
user_id as value su.user_id as value
from from
sys_user sys_user su
where where
deleted = 0 which_user_id = #{userId}
AND which_user_id = #{userId}
<if test="roleCodes != null and roleCodes.size() > 0">
AND
EXISTS (
SELECT 1 from sys_user_role ur
where
ur.`role_code`
in
<foreach collection="roleCodes" item="roleCode" separator="," open="(" close=")">
#{roleCode}
</foreach>
and ur.user_id = su.user_id
)
</if>
AND su.deleted = 0
</select>
<update id="recharge">
update sys_user
set residue_clue_num = residue_clue_num + #{rechargeClueNum}
where user_id = #{userId}
</update>
<!-- 扣费 -->
<update id="charging" parameterType="java.util.Map">
<foreach collection="map" item="value" index="key" separator=";" close=";">
UPDATE sys_user SET residue_clue_num = residue_clue_num - #{value} WHERE user_id = #{key}
</foreach>
</update>
<update id="updateDistributeNum" parameterType="java.util.Map">
<foreach collection="map" item="value" index="key" separator=";" close=";">
UPDATE sys_user SET distribute_num = distribute_num + #{value} WHERE user_id = #{key}
</foreach>
</update>
<select id="findUserBalance" resultType="java.lang.Integer">
select residue_clue_num
from sys_user
where user_id = #{userId}
</select> </select>
<select id="listUserBalance" resultType="com.baiye.system.model.vo.SysUserBalanceVO">
SELECT
<include refid="Base_Alias_Column_List"/>
FROM
sys_user su
WHERE
user_id in
<foreach collection="userIdList" item="userId" separator="," open="(" close=")">
#{userId}
</foreach>
</select>
</mapper> </mapper>

@ -287,4 +287,11 @@ public class SysUserController {
return R.ok(objectName); return R.ok(objectName);
} }
@Operation(summary = "充值", description = "充值")
@PostMapping("/recharge")
public R<String> recharge(@RequestBody SysUserDTO sysUserDTO){
return sysUserService.recharge(sysUserDTO) ? R.ok()
: R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "充值失败");
}
} }

@ -103,7 +103,7 @@ public class SysUserDTO {
@Schema(title = "计费状态 0不计费 1计费") @Schema(title = "计费状态 0不计费 1计费")
private Integer chargingStatus; private Integer chargingStatus;
@Schema(title = "剩余线索数量") @Schema(title = "充值数量")
private Integer residueClueNum; private Integer rechargeClueNum;
} }

@ -107,8 +107,4 @@ public class SysUser extends LogicDeletedBaseEntity {
@Schema(title = "计费状态 0不计费 1计费") @Schema(title = "计费状态 0不计费 1计费")
private Integer chargingStatus; private Integer chargingStatus;
@Schema(title = "剩余线索数量")
private Integer residueClueNum;
} }

@ -0,0 +1,34 @@
package com.baiye.system.model.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* VO
*/
@Data
@Schema(title = "用户余额VO")
public class SysUserBalanceVO implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(title = "用户ID")
private Long userId;
@Schema(title = "登录账号")
private String username;
@Schema(title = "创建者(父ID)")
private Long whichUserId;
@Schema(title = "计费状态 0不计费 1计费")
private Integer chargingStatus;
@Schema(title = "剩余线索数量")
private Integer residueClueNum;
}

@ -10,8 +10,6 @@ import java.util.List;
/** /**
* *
*
* @author ballcat code generator 2019-09-12 20:39:31
*/ */
@Data @Data
@Schema(title = "系统用户VO") @Schema(title = "系统用户VO")
@ -105,6 +103,12 @@ public class SysUserPageVO implements Serializable {
private List<SysUserPageVO> children; private List<SysUserPageVO> children;
@Schema(title = "角色标识")
private String roleCode;
@Schema(title = "是否是专员")
private Boolean isSalesman = false;
@Schema(title = "计费状态 0不计费 1计费") @Schema(title = "计费状态 0不计费 1计费")
private Integer chargingStatus; private Integer chargingStatus;

@ -13,7 +13,7 @@ import com.baiye.modules.distribute.service.ClueFileService;
import com.baiye.modules.distribute.service.ClueRecordService; import com.baiye.modules.distribute.service.ClueRecordService;
import com.baiye.security.util.SecurityUtils; import com.baiye.security.util.SecurityUtils;
import com.baiye.system.properties.FileProperties; import com.baiye.system.properties.FileProperties;
import com.baiye.task.SyncTask; import com.baiye.task.service.SyncTaskService;
import com.baiye.util.AppUtils; import com.baiye.util.AppUtils;
import com.baiye.util.FileUtil; import com.baiye.util.FileUtil;
import com.baiye.util.RsaUtil; import com.baiye.util.RsaUtil;
@ -42,7 +42,7 @@ public class ClueFileServiceImpl implements ClueFileService {
private final UserSecretKeyMapper userSecretKeyMapper; private final UserSecretKeyMapper userSecretKeyMapper;
private final SyncTask syncTask; private final SyncTaskService syncTaskService;
@Override @Override
public Map<String, Object> detection(MultipartFile multipartFile) { public Map<String, Object> detection(MultipartFile multipartFile) {
@ -82,7 +82,7 @@ public class ClueFileServiceImpl implements ClueFileService {
public void readFile(Long recordId) { public void readFile(Long recordId) {
ClueRecordEntity clueRecordEntity = clueRecordService.getById(recordId); ClueRecordEntity clueRecordEntity = clueRecordService.getById(recordId);
// 异步读取资源 // 异步读取资源
syncTask.clueUpload(clueRecordEntity); syncTaskService.clueUpload(clueRecordEntity);
} }
@Override @Override

@ -24,8 +24,10 @@ import com.baiye.modules.distribute.service.ClueService;
import com.baiye.modules.distribute.service.DistributeTaskService; import com.baiye.modules.distribute.service.DistributeTaskService;
import com.baiye.modules.distribute.vo.DistributeTaskVO; import com.baiye.modules.distribute.vo.DistributeTaskVO;
import com.baiye.security.util.SecurityUtils; import com.baiye.security.util.SecurityUtils;
import com.baiye.system.checker.AdminUserChecker;
import com.baiye.system.model.entity.SysUser; import com.baiye.system.model.entity.SysUser;
import com.baiye.system.service.SysUserService; import com.baiye.system.service.SysUserService;
import com.baiye.task.service.DistributeTaskSyncService;
import com.baiye.utils.AssignDataUtil; import com.baiye.utils.AssignDataUtil;
import com.baiye.utils.DateTimeToCronUtils; import com.baiye.utils.DateTimeToCronUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -55,6 +57,10 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl<DistributeTaskM
private final MyJobService jobService; private final MyJobService jobService;
private final AdminUserChecker adminUserChecker;
private final DistributeTaskSyncService distributeTaskSyncService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean add(DistributeTaskDTO distributeTaskDTO) { public Boolean add(DistributeTaskDTO distributeTaskDTO) {
@ -275,8 +281,7 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl<DistributeTaskM
if (CollUtil.isNotEmpty(recordIdList)) { if (CollUtil.isNotEmpty(recordIdList)) {
// 查询分配人用户信息 // 查询分配人用户信息
List<SysUser> sysUsers = sysUserService.listByUserIds(userIdList); List<SysUser> sysUsers = sysUserService.listByUserIds(userIdList);
Map<Long, List<SysUser>> userIdMap = sysUsers.stream() Map<Long, List<SysUser>> userIdMap = sysUsers.stream().collect(Collectors.groupingBy(SysUser::getUserId));
.collect(Collectors.groupingBy(SysUser::getUserId));
// 获取文件中未分配的资源 // 获取文件中未分配的资源
List<Long> clueIds = clueService.findUndistributedClueIds(recordIdList); List<Long> clueIds = clueService.findUndistributedClueIds(recordIdList);
// 分配 // 分配
@ -293,7 +298,7 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl<DistributeTaskM
List<DistributeResponseDTO> responseDTOS = AssignDataUtil.assignData(distributeDTO); List<DistributeResponseDTO> responseDTOS = AssignDataUtil.assignData(distributeDTO);
// 查询业务管理员用户的默认文件记录 // 查询业务管理员用户的默认文件记录
Map<Long, List<ClueRecordEntity>> map = null; Map<Long, List<ClueRecordEntity>> map = null;
if (createBy == 1) { if (adminUserChecker.isAdminUser(createBy)) {
List<ClueRecordEntity> recordEntities = clueRecordMapper.selectList( List<ClueRecordEntity> recordEntities = clueRecordMapper.selectList(
new LambdaQueryWrapper<ClueRecordEntity>().in(ClueRecordEntity::getCreateBy, userIdList) new LambdaQueryWrapper<ClueRecordEntity>().in(ClueRecordEntity::getCreateBy, userIdList)
.eq(ClueRecordEntity::getRecordType, DefaultNumberConstants.ONE_NUMBER)); .eq(ClueRecordEntity::getRecordType, DefaultNumberConstants.ONE_NUMBER));
@ -310,7 +315,7 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl<DistributeTaskM
ClueEntity clueEntity = new ClueEntity(); ClueEntity clueEntity = new ClueEntity();
clueEntity.setClueId(clueId); clueEntity.setClueId(clueId);
// 业务员更新的是分配人,否则是admin给业务管理员分配(分配到默认创建的记录中) // 业务员更新的是分配人,否则是admin给业务管理员分配(分配到默认创建的记录中)
if (createBy != 1) { if (!adminUserChecker.isAdminUser(createBy)) {
clueEntity.setAssignedBy(assignedBy); clueEntity.setAssignedBy(assignedBy);
if (userIdMap.containsKey(assignedBy)) { if (userIdMap.containsKey(assignedBy)) {
SysUser sysUser = userIdMap.get(assignedBy).get(0); SysUser sysUser = userIdMap.get(assignedBy).get(0);
@ -335,15 +340,16 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl<DistributeTaskM
// 批量修改数据 // 批量修改数据
if (CollUtil.isNotEmpty(clueEntityList)) clueService.updateBatchById(clueEntityList); if (CollUtil.isNotEmpty(clueEntityList)) clueService.updateBatchById(clueEntityList);
// 用户分发量检测-扣减-修改 // 用户分发量检测-扣减-修改
sysUserService.detectionAvailableNumUpdate(updateUserNumMap, createBy == 1); boolean bool = sysUserService.detectionAvailableNumUpdate(updateUserNumMap);
if (!bool) throw new BadRequestException("分发失败");
// 修改任务执行次数+1 // 修改任务执行次数+1
baseMapper.updateByExecuteNumAddOne(taskEntity.getDistributeTaskId()); baseMapper.updateByExecuteNumAddOne(taskEntity.getDistributeTaskId());
// 修改记录分配状态 // 修改记录分配状态
if (CollUtil.isNotEmpty(recordIdList)) { if (CollUtil.isNotEmpty(recordIdList)) {
clueRecordMapper.updateAllocationStatusAndDistributeStatus(recordIdList, 1, 1); clueRecordMapper.updateAllocationStatusAndDistributeStatus(recordIdList, 1, 1);
} }
// 分发下级任务 // 异步分发下级任务
if (taskEntity.getCreateBy() == 1) this.syncExecuteTask(userIdList); if (adminUserChecker.isAdminUser(createBy)) distributeTaskSyncService.executeTask(userIdList, this);
} }
} }
} }
@ -355,8 +361,7 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl<DistributeTaskM
} }
@Override @Override
public void addDefaultTask(String taskName, String prefixName, String recordId, Long createUserId, public void addDefaultTask(String taskName, String prefixName, String recordId, Long createUserId, Long allocationBy) {
Long allocationBy) {
// 创建默认任务 // 创建默认任务
DistributeTaskEntity taskEntity = new DistributeTaskEntity(); DistributeTaskEntity taskEntity = new DistributeTaskEntity();
taskEntity.setDistributeTaskType(1); taskEntity.setDistributeTaskType(1);
@ -369,9 +374,7 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl<DistributeTaskM
taskEntity.setDefaultType(0); taskEntity.setDefaultType(0);
taskEntity.setCreateBy(createUserId); taskEntity.setCreateBy(createUserId);
// admin管理员创建是默认开启,业务管理员创建时由于不确定是否创建了子用户,所以无法自动开启 // admin管理员创建是默认开启,业务管理员创建时由于不确定是否创建了子用户,所以无法自动开启
if (createUserId == 1) { if (createUserId == 1) taskEntity.setExecuteStatus(1);
taskEntity.setExecuteStatus(1);
}
baseMapper.insert(taskEntity); baseMapper.insert(taskEntity);
// 任务默认当前选中用户平均分配 // 任务默认当前选中用户平均分配
@ -429,8 +432,7 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl<DistributeTaskM
} }
if (ruleStatus == DefaultNumberConstants.ONE_NUMBER) { if (ruleStatus == DefaultNumberConstants.ONE_NUMBER) {
int sum = userList.stream().mapToInt(DistributeTaskUserDTO::getWeight).sum(); int sum = userList.stream().mapToInt(DistributeTaskUserDTO::getWeight).sum();
if (sum != DefaultNumberConstants.TEN_NUMBER) if (sum != DefaultNumberConstants.TEN_NUMBER) throw new BadRequestException("权重分配不符合10份制");
throw new BadRequestException("权重分配不符合10份制");
} }
List<Long> userIds = userList.stream().map(DistributeTaskUserDTO::getUserId).collect(Collectors.toList()); List<Long> userIds = userList.stream().map(DistributeTaskUserDTO::getUserId).collect(Collectors.toList());
String nickName = sysUserService.detectionAvailableNum(userIds); String nickName = sysUserService.detectionAvailableNum(userIds);
@ -463,9 +465,7 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl<DistributeTaskM
.eq(DistributeTaskEntity::getDefaultType, 0) .eq(DistributeTaskEntity::getDefaultType, 0)
.ne(DistributeTaskEntity::getExecuteStatus, 0)); .ne(DistributeTaskEntity::getExecuteStatus, 0));
if (CollUtil.isNotEmpty(taskEntities)) { if (CollUtil.isNotEmpty(taskEntities)) {
List<Long> taskIds = taskEntities.stream() List<Long> taskIds = taskEntities.stream().map(DistributeTaskEntity::getDistributeTaskId).collect(Collectors.toList());
.map(DistributeTaskEntity::getDistributeTaskId)
.collect(Collectors.toList());
if (taskIds.size() < userIdList.size()) { if (taskIds.size() < userIdList.size()) {
throw new BadRequestException("用户默认分发任务无分配用户,请检查用户的分配任务"); throw new BadRequestException("用户默认分发任务无分配用户,请检查用户的分配任务");
} }
@ -477,14 +477,12 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl<DistributeTaskM
.collect(Collectors.groupingBy(DistributeTaskUserEntity::getDistributeTaskId)); .collect(Collectors.groupingBy(DistributeTaskUserEntity::getDistributeTaskId));
for (Long taskId : taskIds) { for (Long taskId : taskIds) {
if (!map.containsKey(taskId)) { if (!map.containsKey(taskId)) {
Map<Long, List<DistributeTaskEntity>> listMap = taskEntities.stream() Map<Long, List<DistributeTaskEntity>> listMap = taskEntities.stream().collect(Collectors.groupingBy(DistributeTaskEntity::getDistributeTaskId));
.collect(Collectors.groupingBy(DistributeTaskEntity::getDistributeTaskId));
Long createBy = listMap.get(taskId).get(0).getCreateBy(); Long createBy = listMap.get(taskId).get(0).getCreateBy();
SysUser sysUser = sysUserService.getById(createBy); SysUser sysUser = sysUserService.getById(createBy);
throw new BadRequestException("用户:" + sysUser.getUsername() + " 默认分发任务中无分配人,请通知整改后操作该用户"); throw new BadRequestException("用户:" + sysUser.getUsername() + " 默认分发任务中无分配人,请通知整改后操作该用户");
} }
} }
} else { } else {
throw new BadRequestException("用户默认分发任务无分配用户,请检查用户的分配任务"); throw new BadRequestException("用户默认分发任务无分配用户,请检查用户的分配任务");
} }
@ -493,24 +491,4 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl<DistributeTaskM
} }
} }
} }
/**
*
*/
private void syncExecuteTask(List<Long> userIdList) {
List<DistributeTaskEntity> taskEntities = baseMapper
.selectList(new LambdaQueryWrapper<DistributeTaskEntity>().eq(DistributeTaskEntity::getDefaultType, 0)
.in(DistributeTaskEntity::getCreateBy, userIdList));
if (CollUtil.isNotEmpty(taskEntities)) {
for (DistributeTaskEntity distributeTaskEntity : taskEntities) {
Integer executeStatus = distributeTaskEntity.getExecuteStatus();
Integer distributeTaskType = distributeTaskEntity.getDistributeTaskType();
Integer timeStatus = distributeTaskEntity.getTimeStatus();
if ((distributeTaskType == 1 && timeStatus == 0) && executeStatus != 0 && executeStatus != 3) {
this.execute(distributeTaskEntity);
}
}
}
}
} }

@ -6,22 +6,16 @@ import com.baiye.modules.distribute.dto.ClueDTO;
import com.baiye.modules.distribute.dto.DBPushClueDTO; import com.baiye.modules.distribute.dto.DBPushClueDTO;
import com.baiye.modules.distribute.dto.ReceivePushLeadsDTO; import com.baiye.modules.distribute.dto.ReceivePushLeadsDTO;
import com.baiye.modules.distribute.entity.ClueEntity; import com.baiye.modules.distribute.entity.ClueEntity;
import com.baiye.modules.distribute.entity.DistributeTaskEntity;
import com.baiye.modules.distribute.entity.PushLinkEntity;
import com.baiye.modules.distribute.entity.UserSecretKeyEntity; import com.baiye.modules.distribute.entity.UserSecretKeyEntity;
import com.baiye.modules.distribute.mapper.DistributeTaskMapper;
import com.baiye.modules.distribute.mapper.UserSecretKeyMapper; import com.baiye.modules.distribute.mapper.UserSecretKeyMapper;
import com.baiye.modules.distribute.service.ClueService; import com.baiye.modules.distribute.service.ClueService;
import com.baiye.modules.distribute.service.DistributeTaskService;
import com.baiye.modules.distribute.service.OutsideReqService; import com.baiye.modules.distribute.service.OutsideReqService;
import com.baiye.modules.distribute.service.PushLinkService; import com.baiye.task.service.SyncTaskService;
import com.baiye.util.AESUtils;
import com.baiye.util.MobileUtil; import com.baiye.util.MobileUtil;
import com.baiye.util.RsaUtil; import com.baiye.util.RsaUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.ballcat.security.properties.SecurityProperties;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -37,13 +31,7 @@ public class OutsideReqServiceImpl implements OutsideReqService {
private final UserSecretKeyMapper userSecretKeyMapper; private final UserSecretKeyMapper userSecretKeyMapper;
private final PushLinkService pushLinkService; private final SyncTaskService syncTaskService;
private final SecurityProperties securityProperties;
private final DistributeTaskMapper distributeTaskMapper;
private final DistributeTaskService distributeTaskService;
@Override @Override
public void pushClue(String appKey, DBPushClueDTO dbPushClueDTO) { public void pushClue(String appKey, DBPushClueDTO dbPushClueDTO) {
@ -53,38 +41,17 @@ public class OutsideReqServiceImpl implements OutsideReqService {
try { try {
byte[] mobileDecode = Base64.getDecoder().decode(dbPushClueDTO.getMobile()); byte[] mobileDecode = Base64.getDecoder().decode(dbPushClueDTO.getMobile());
mobileDecodeStr = new String(mobileDecode, StandardCharsets.UTF_8); mobileDecodeStr = new String(mobileDecode, StandardCharsets.UTF_8);
} } catch (Exception e) {
catch (Exception e) {
log.error("============推送解码手机号失败============"); log.error("============推送解码手机号失败============");
} }
boolean bool = MobileUtil.checkPhone(mobileDecodeStr); boolean bool = MobileUtil.checkPhone(mobileDecodeStr);
if (bool) { if (bool) {
// 查询appKey映射的记录 syncTaskService.pushClueExecuteTask(appKey, mobileDecodeStr);
PushLinkEntity linkEntity = pushLinkService.getByAppKey(appKey); } else {
if (linkEntity != null) {
// 添加资源信息
ClueEntity clueEntity = new ClueEntity();
clueEntity.setNid(AESUtils.encrypt(mobileDecodeStr, securityProperties.getPasswordSecretKey()));
clueEntity.setClueRecordId(linkEntity.getClueRecordId());
// clueEntity.setOtherClue(JSONUtil.toJsonStr(dbPushClueDTO));
clueEntity.setCreateBy(linkEntity.getCreateBy());
clueService.save(clueEntity);
// 执行任务
DistributeTaskEntity entity = distributeTaskMapper.selectOne(
new LambdaQueryWrapper<DistributeTaskEntity>().eq(DistributeTaskEntity::getDefaultType, 0)
.eq(DistributeTaskEntity::getCreateBy, linkEntity.getCreateBy())
.eq(DistributeTaskEntity::getFileRecordId, linkEntity.getClueRecordId()));
if (entity.getExecuteStatus() != 0 && entity.getExecuteStatus() != 3)
distributeTaskService.execute(entity);
}
}
else {
log.error("============推送手机号检验不通过============"); log.error("============推送手机号检验不通过============");
} }
} } else {
else {
log.info("============推送了空数据或者空手机号============"); log.info("============推送了空数据或者空手机号============");
} }
} }
@ -95,15 +62,14 @@ public class OutsideReqServiceImpl implements OutsideReqService {
List<String> clueList = receivePushLeadsDTO.getClueList(); List<String> clueList = receivePushLeadsDTO.getClueList();
UserSecretKeyEntity entity = userSecretKeyMapper UserSecretKeyEntity entity = userSecretKeyMapper
.selectOne(new LambdaQueryWrapper<UserSecretKeyEntity>().eq(UserSecretKeyEntity::getAppKey, appKey)); .selectOne(new LambdaQueryWrapper<UserSecretKeyEntity>().eq(UserSecretKeyEntity::getAppKey, appKey));
if (entity != null && CollUtil.isNotEmpty(clueList)) { if (entity != null && CollUtil.isNotEmpty(clueList)) {
List<ClueEntity> clueEntityList = new ArrayList<>(); List<ClueEntity> clueEntityList = new ArrayList<>();
for (String clueStr : clueList) { for (String clueStr : clueList) {
String jsonStr = null; String jsonStr = null;
try { try {
jsonStr = RsaUtil.decryptByPrivateKey(clueStr, RsaUtil.getPrivateKey(entity.getPrivateKey())); jsonStr = RsaUtil.decryptByPrivateKey(clueStr, RsaUtil.getPrivateKey(entity.getPrivateKey()));
} } catch (Exception e) {
catch (Exception e) {
log.error("解密失败"); log.error("解密失败");
} }
ClueDTO clueDTO = JSONUtil.toBean(jsonStr, ClueDTO.class); ClueDTO clueDTO = JSONUtil.toBean(jsonStr, ClueDTO.class);

@ -65,8 +65,7 @@ public class PushLinkServiceImpl extends ExtendServiceImpl<PushLinkMapper, PushL
baseMapper.insert(saveEntity); baseMapper.insert(saveEntity);
// 检验数据--创建默认的执行任务 // 检验数据--创建默认的执行任务
distributeTaskService.inspectUserTask(Collections.singletonList(userId)); distributeTaskService.inspectUserTask(Collections.singletonList(userId));
distributeTaskService.addDefaultTask(dtoName, dbPushUrl, recordId.toString(), distributeTaskService.addDefaultTask(dtoName, dbPushUrl, recordId.toString(), SecurityUtils.getCurrentUserId(), userId);
SecurityUtils.getCurrentUserId(), userId);
} }
return dbPushUrl; return dbPushUrl;
} }

@ -0,0 +1,38 @@
package com.baiye.task;
import cn.hutool.core.collection.CollUtil;
import com.baiye.modules.distribute.entity.DistributeTaskEntity;
import com.baiye.modules.distribute.mapper.DistributeTaskMapper;
import com.baiye.modules.distribute.service.DistributeTaskService;
import com.baiye.task.service.DistributeTaskSyncService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@RequiredArgsConstructor
@Slf4j
public class DistributeTaskSyncServiceImpl implements DistributeTaskSyncService {
private final DistributeTaskMapper distributeTaskMapper;
@Override
public void executeTask(List<Long> userIdList, DistributeTaskService distributeTaskService) {
List<DistributeTaskEntity> taskEntities = distributeTaskMapper
.selectList(new LambdaQueryWrapper<DistributeTaskEntity>().eq(DistributeTaskEntity::getDefaultType, 0)
.in(DistributeTaskEntity::getCreateBy, userIdList));
if (CollUtil.isNotEmpty(taskEntities)) {
for (DistributeTaskEntity distributeTaskEntity : taskEntities) {
Integer executeStatus = distributeTaskEntity.getExecuteStatus();
Integer distributeTaskType = distributeTaskEntity.getDistributeTaskType();
Integer timeStatus = distributeTaskEntity.getTimeStatus();
if ((distributeTaskType == 1 && timeStatus == 0) && executeStatus != 0 && executeStatus != 3) {
distributeTaskService.execute(distributeTaskEntity);
}
}
}
}
}

@ -1,36 +0,0 @@
package com.baiye.task;
import com.alibaba.excel.EasyExcelFactory;
import com.baiye.easyexcel.listener.ClueListener;
import com.baiye.modules.distribute.entity.ClueRecordEntity;
import com.baiye.modules.distribute.service.ClueService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@Component
@Slf4j
public class SyncTask {
@Resource
private ClueService clueService;
/**
*
*/
@Async
public void clueUpload(ClueRecordEntity clueRecordEntity) {
try {
FileInputStream file = new FileInputStream(clueRecordEntity.getUrl());
EasyExcelFactory.read(file, new ClueListener(clueService, clueRecordEntity)).build().readAll();
}
catch (FileNotFoundException e) {
log.error("========文件读取错误: {}==========", e.getMessage());
}
}
}

@ -0,0 +1,70 @@
package com.baiye.task;
import com.alibaba.excel.EasyExcelFactory;
import com.baiye.easyexcel.listener.ClueListener;
import com.baiye.modules.distribute.entity.ClueEntity;
import com.baiye.modules.distribute.entity.ClueRecordEntity;
import com.baiye.modules.distribute.entity.DistributeTaskEntity;
import com.baiye.modules.distribute.entity.PushLinkEntity;
import com.baiye.modules.distribute.mapper.DistributeTaskMapper;
import com.baiye.modules.distribute.service.ClueService;
import com.baiye.modules.distribute.service.DistributeTaskService;
import com.baiye.modules.distribute.service.PushLinkService;
import com.baiye.task.service.SyncTaskService;
import com.baiye.util.AESUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.ballcat.security.properties.SecurityProperties;
import org.springframework.stereotype.Component;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@Component
@RequiredArgsConstructor
@Slf4j
public class SyncTaskServiceImpl implements SyncTaskService {
private final PushLinkService pushLinkService;
private final SecurityProperties securityProperties;
private final ClueService clueService;
private final DistributeTaskMapper distributeTaskMapper;
private final DistributeTaskService distributeTaskService;
@Override
public void pushClueExecuteTask(String appKey, String mobile) {
// 查询appKey映射的记录
PushLinkEntity linkEntity = pushLinkService.getByAppKey(appKey);
if (linkEntity != null) {
// 添加资源信息
ClueEntity clueEntity = new ClueEntity();
clueEntity.setNid(AESUtils.encrypt(mobile, securityProperties.getPasswordSecretKey()));
clueEntity.setClueRecordId(linkEntity.getClueRecordId());
// clueEntity.setOtherClue(JSONUtil.toJsonStr(dbPushClueDTO));
clueEntity.setCreateBy(linkEntity.getCreateBy());
clueService.save(clueEntity);
// 执行任务
DistributeTaskEntity entity = distributeTaskMapper.selectOne(
new LambdaQueryWrapper<DistributeTaskEntity>().eq(DistributeTaskEntity::getDefaultType, 0)
.eq(DistributeTaskEntity::getCreateBy, linkEntity.getCreateBy())
.eq(DistributeTaskEntity::getFileRecordId, linkEntity.getClueRecordId()));
if (entity.getExecuteStatus() != 0 && entity.getExecuteStatus() != 3) distributeTaskService.execute(entity);
}
}
@Override
public void clueUpload(ClueRecordEntity clueRecordEntity) {
try {
FileInputStream file = new FileInputStream(clueRecordEntity.getUrl());
EasyExcelFactory.read(file, new ClueListener(clueService, clueRecordEntity)).build().readAll();
}
catch (FileNotFoundException e) {
log.error("========文件读取错误: {}==========", e.getMessage());
}
}
}

@ -0,0 +1,12 @@
package com.baiye.task.service;
import com.baiye.modules.distribute.service.DistributeTaskService;
import org.springframework.scheduling.annotation.Async;
import java.util.List;
public interface DistributeTaskSyncService {
@Async
void executeTask(List<Long> userIdList, DistributeTaskService distributeTaskService);
}

@ -0,0 +1,13 @@
package com.baiye.task.service;
import com.baiye.modules.distribute.entity.ClueRecordEntity;
import org.springframework.scheduling.annotation.Async;
public interface SyncTaskService {
@Async
void pushClueExecuteTask(String appKey, String mobile);
@Async
void clueUpload(ClueRecordEntity clueRecordEntity);
}

@ -1,6 +1,6 @@
spring: spring:
datasource: datasource:
url: jdbc:mysql://39.100.77.21:3306/ad_distribute?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai url: jdbc:mysql://39.100.77.21:3306/ad_distribute?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
username: root username: root
password: y7z7noq2 password: y7z7noq2
redis: redis:

@ -1,6 +1,6 @@
spring: spring:
datasource: datasource:
url: jdbc:mysql://localhost:3306/ad_distribute?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai url: jdbc:mysql://localhost:3306/ad_distribute?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
username: root username: root
password: 7f2vvawx password: 7f2vvawx
redis: redis:

@ -1,6 +1,6 @@
spring: spring:
datasource: datasource:
url: jdbc:mysql://39.100.77.21:3306/ad_distribute?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai url: jdbc:mysql://39.100.77.21:3306/ad_distribute?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
username: root username: root
password: y7z7noq2 password: y7z7noq2
redis: redis:

Loading…
Cancel
Save