Commit cbdadbdb by guanchen

修复代理商查找的潜在死循环问题

更新方法名称
parent 75e7fe9d
...@@ -42,17 +42,17 @@ public class AgentController { ...@@ -42,17 +42,17 @@ public class AgentController {
return agentManager.pushReward(); return agentManager.pushReward();
} }
@RequestMapping(value = "/hierarchy/parent", method = RequestMethod.POST) @RequestMapping(value = "/hierarchy/parent", method = RequestMethod.POST)
public Result<ArrayList<ParentAgent>> getHierarchyParents(@RequestBody @Valid Agent agent, @RequestHeader HttpHeaders headers) { public Result<ArrayList<ParentAgent>> getHierarchyParentList(@RequestBody @Valid Agent agent, @RequestHeader HttpHeaders headers) {
if (logger.isInfoEnabled()) { if (logger.isInfoEnabled()) {
logger.info("AgentController getHierarchyParents, header:{},time:{}", headers.keySet().toArray(), LocalDateTime.now()); logger.info("AgentController getHierarchyParentList, header:{},time:{}", headers.keySet().toArray(), LocalDateTime.now());
} }
return agentManager.getHierarchyParents(agent.getAgentId()); return agentManager.getHierarchyParentList(agent.getAgentId());
} }
@RequestMapping(value = "/pingtui/parent", method = RequestMethod.POST) @RequestMapping(value = "/pingtui/parent", method = RequestMethod.POST)
public Result<ArrayList<ParentAgent>> getPingtuiParents(@RequestBody @Valid Agent agent, @RequestHeader HttpHeaders headers) { public Result<ArrayList<ParentAgent>> getPingtuiParentList(@RequestBody @Valid Agent agent, @RequestHeader HttpHeaders headers) {
if (logger.isInfoEnabled()) { if (logger.isInfoEnabled()) {
logger.info("AgentController getPingtuiParents, header:{},time:{}", headers.keySet().toArray(), LocalDateTime.now()); logger.info("AgentController getPingtuiParentList, header:{},time:{}", headers.keySet().toArray(), LocalDateTime.now());
} }
return agentManager.getPingtuiParents(agent.getAgentId()); return agentManager.getPingtuiParentList(agent.getAgentId());
} }
} }
...@@ -36,5 +36,5 @@ public interface PartnerAccountMapper extends BaseMapper<PartnerAccount> { ...@@ -36,5 +36,5 @@ public interface PartnerAccountMapper extends BaseMapper<PartnerAccount> {
"FROM partner_invite_relation a " + "FROM partner_invite_relation a " +
"JOIN partner_account b on a.user_id=b.user_id " + "JOIN partner_account b on a.user_id=b.user_id " +
"WHERE a.invite_user_id=#{userId}") "WHERE a.invite_user_id=#{userId}")
List<PartnerAccount> getChildrenByUserId(Integer userId); List<PartnerAccount> getChildListByUserId(Integer userId);
} }
\ No newline at end of file
...@@ -40,8 +40,8 @@ public interface UserAgentMapper extends BaseMapper<UserAgent> { ...@@ -40,8 +40,8 @@ public interface UserAgentMapper extends BaseMapper<UserAgent> {
// "FROM user_agent a " + // "FROM user_agent a " +
// "JOIN user_agent b on a.#{parentColumnName}=b.agent_id " + // "JOIN user_agent b on a.#{parentColumnName}=b.agent_id " +
// "WHERE a.user_id=#{userId}") // "WHERE a.user_id=#{userId}")
// List<UserAgent> getChildrenByUserId(Integer userId, String parentColumnName); // List<UserAgent> getChildListByUserId(Integer userId, String parentColumnName);
@SelectProvider(type = UserAgentSqlProvider.class, method = "getChildrenByUserId") @SelectProvider(type = UserAgentSqlProvider.class, method = "getChildListByUserId")
List<UserAgent> getChildrenByUserId(@Param("userId") Integer userId, @Param("parentColumnName") String parentColumnName); List<UserAgent> getChildListByUserId(@Param("userId") Integer userId, @Param("parentColumnName") String parentColumnName);
} }
\ No newline at end of file
...@@ -17,7 +17,7 @@ public class UserAgentSqlProvider { ...@@ -17,7 +17,7 @@ public class UserAgentSqlProvider {
"JOIN user_agent b on a." + parentColumnName + "=b.agent_id " + "JOIN user_agent b on a." + parentColumnName + "=b.agent_id " +
"WHERE a.agent_id=#{agentId} and b.agent_level<=4"; "WHERE a.agent_id=#{agentId} and b.agent_level<=4";
} }
public String getChildrenByUserId(@Param("userId") Integer userId, @Param("parentColumnName") String parentColumnName) { public String getChildListByUserId(@Param("userId") Integer userId, @Param("parentColumnName") String parentColumnName) {
return "SELECT b.* " + return "SELECT b.* " +
"FROM user_agent a " + "FROM user_agent a " +
"JOIN user_agent b on a." + parentColumnName + "=b.agent_id " + "JOIN user_agent b on a." + parentColumnName + "=b.agent_id " +
......
...@@ -79,7 +79,7 @@ public class AgentManager { ...@@ -79,7 +79,7 @@ public class AgentManager {
* @author chen * @author chen
* @date 2019-07-04 14:48 * @date 2019-07-04 14:48
*/ */
public Result<ArrayList<ParentAgent>> getHierarchyParents(Integer agentId) { public Result<ArrayList<ParentAgent>> getHierarchyParentList(Integer agentId) {
ArrayList<ParentAgent> parentAgents = (ArrayList<ParentAgent>) userAgentService.getParentAgentListByAgentId(agentId, PARENT_COLUMN_NAME_CENGJI); ArrayList<ParentAgent> parentAgents = (ArrayList<ParentAgent>) userAgentService.getParentAgentListByAgentId(agentId, PARENT_COLUMN_NAME_CENGJI);
Result<ArrayList<ParentAgent>> result = new Result<ArrayList<ParentAgent>>(); Result<ArrayList<ParentAgent>> result = new Result<ArrayList<ParentAgent>>();
result.setData(parentAgents); result.setData(parentAgents);
...@@ -90,7 +90,7 @@ public class AgentManager { ...@@ -90,7 +90,7 @@ public class AgentManager {
* @author chen * @author chen
* @date 2019-07-04 14:48 * @date 2019-07-04 14:48
*/ */
public Result<ArrayList<ParentAgent>> getPingtuiParents(Integer agentId) { public Result<ArrayList<ParentAgent>> getPingtuiParentList(Integer agentId) {
ArrayList<ParentAgent> parentAgents = (ArrayList<ParentAgent>) userAgentService.getParentAgentListByAgentId(agentId, PARENT_COLUMN_NAME_PINGTUI); ArrayList<ParentAgent> parentAgents = (ArrayList<ParentAgent>) userAgentService.getParentAgentListByAgentId(agentId, PARENT_COLUMN_NAME_PINGTUI);
Result<ArrayList<ParentAgent>> result = new Result<ArrayList<ParentAgent>>(); Result<ArrayList<ParentAgent>> result = new Result<ArrayList<ParentAgent>>();
result.setData(parentAgents); result.setData(parentAgents);
......
...@@ -103,8 +103,8 @@ public class UserManager { ...@@ -103,8 +103,8 @@ public class UserManager {
/** /**
* 先找到直接下级 * 先找到直接下级
*/ */
setChildren(tree); setChildList(tree);
ArrayList<PartnerTree> children = tree.getChildrenList(); ArrayList<PartnerTree> children = tree.getChildList();
/** /**
* 如果没有下级了 那么直接输出结果 * 如果没有下级了 那么直接输出结果
*/ */
...@@ -122,7 +122,7 @@ public class UserManager { ...@@ -122,7 +122,7 @@ public class UserManager {
* 如果有 那么在各自的recursiveSet中 应该没有走到 line:52 的outputTree 方法 * 如果有 那么在各自的recursiveSet中 应该没有走到 line:52 的outputTree 方法
* 所以要在这里执行一次, 把他们自己输出 * 所以要在这里执行一次, 把他们自己输出
*/ */
if (child.getChildrenList().size() > 0) { if (child.getChildList().size() > 0) {
outputTree(child); outputTree(child);
} }
} }
...@@ -160,8 +160,8 @@ public class UserManager { ...@@ -160,8 +160,8 @@ public class UserManager {
* 把下级的数据, 设置到输入的tree中的childrenList * 把下级的数据, 设置到输入的tree中的childrenList
* @param tree * @param tree
*/ */
private void setChildren(PartnerTree tree) { private void setChildList(PartnerTree tree) {
ArrayList<PartnerAccount> partnerAccountArrayList = (ArrayList<PartnerAccount>) userService.getPartnerAccountChildrenByUserId(tree.getUserId()); ArrayList<PartnerAccount> partnerAccountArrayList = (ArrayList<PartnerAccount>) userService.getPartnerAccountChildListByUserId(tree.getUserId());
for (PartnerAccount partnerAccount : partnerAccountArrayList) { for (PartnerAccount partnerAccount : partnerAccountArrayList) {
Integer childId = partnerAccount.getUserId(); Integer childId = partnerAccount.getUserId();
Integer childLevel = partnerAccount.getIsSuperPartner() == 1 ? 30 : partnerAccount.getPartnerLevel(); Integer childLevel = partnerAccount.getIsSuperPartner() == 1 ? 30 : partnerAccount.getPartnerLevel();
...@@ -172,7 +172,7 @@ public class UserManager { ...@@ -172,7 +172,7 @@ public class UserManager {
oneChild.setUserId(childId); oneChild.setUserId(childId);
oneChild.setLevel(childLevel); oneChild.setLevel(childLevel);
oneChild.setParentList(parentList4Child); oneChild.setParentList(parentList4Child);
tree.getChildrenList().add(oneChild); tree.getChildList().add(oneChild);
} }
} }
} }
...@@ -193,8 +193,8 @@ public class UserManager { ...@@ -193,8 +193,8 @@ public class UserManager {
/** /**
* 先找到直接下级 * 先找到直接下级
*/ */
setChildren(tree, parentColumnName); setChildList(tree, parentColumnName);
ArrayList<AgentTree> children = tree.getChildrenList(); ArrayList<AgentTree> children = tree.getChildList();
/** /**
* 如果没有下级了 那么直接输出结果 * 如果没有下级了 那么直接输出结果
*/ */
...@@ -212,7 +212,7 @@ public class UserManager { ...@@ -212,7 +212,7 @@ public class UserManager {
* 如果有 那么在各自的recursiveSet中 应该没有走到 line:52 的outputTree 方法 * 如果有 那么在各自的recursiveSet中 应该没有走到 line:52 的outputTree 方法
* 所以要在这里执行一次, 把他们自己输出 * 所以要在这里执行一次, 把他们自己输出
*/ */
if (child.getChildrenList().size() > 0) { if (child.getChildList().size() > 0) {
outputTree(child); outputTree(child);
} }
} }
...@@ -245,8 +245,8 @@ public class UserManager { ...@@ -245,8 +245,8 @@ public class UserManager {
* 把下级的数据, 设置到输入的tree中的childrenList * 把下级的数据, 设置到输入的tree中的childrenList
* @param tree * @param tree
*/ */
private void setChildren(AgentTree tree, String parentColumnName) { private void setChildList(AgentTree tree, String parentColumnName) {
ArrayList<UserAgent> partnerAccountArrayList = (ArrayList<UserAgent>) userService.getUserAgentChildrenByUserId(tree.getUserId(), parentColumnName); ArrayList<UserAgent> partnerAccountArrayList = (ArrayList<UserAgent>) userService.getUserAgentChildListByUserId(tree.getUserId(), parentColumnName);
for (UserAgent userAgent : partnerAccountArrayList) { for (UserAgent userAgent : partnerAccountArrayList) {
Integer childId = userAgent.getUserId(); Integer childId = userAgent.getUserId();
Integer agentId = userAgent.getAgentId(); Integer agentId = userAgent.getAgentId();
...@@ -259,7 +259,7 @@ public class UserManager { ...@@ -259,7 +259,7 @@ public class UserManager {
oneChild.setAgentId(agentId); oneChild.setAgentId(agentId);
oneChild.setLevel(childLevel); oneChild.setLevel(childLevel);
oneChild.setParentList(parentList4Child); oneChild.setParentList(parentList4Child);
tree.getChildrenList().add(oneChild); tree.getChildList().add(oneChild);
} }
} }
} }
......
...@@ -19,7 +19,7 @@ public class AgentTree extends BaseModel { ...@@ -19,7 +19,7 @@ public class AgentTree extends BaseModel {
Integer agentId; Integer agentId;
Integer level; Integer level;
ArrayList<ParentAgent> parentList; ArrayList<ParentAgent> parentList;
ArrayList<AgentTree> childrenList = new ArrayList<AgentTree>(); ArrayList<AgentTree> childList = new ArrayList<AgentTree>();
public ArrayList<ParentAgent> cloneParent() { public ArrayList<ParentAgent> cloneParent() {
ArrayList<ParentAgent> copyList = new ArrayList<ParentAgent>(); ArrayList<ParentAgent> copyList = new ArrayList<ParentAgent>();
......
...@@ -22,4 +22,23 @@ public class ParentAgent extends BaseModel { ...@@ -22,4 +22,23 @@ public class ParentAgent extends BaseModel {
this.agentId = agentId; this.agentId = agentId;
this.level = level; this.level = level;
} }
@Override
public boolean equals(Object obj) {
if(obj==null) {
return false;
}
if(this==obj) {
return true;
}
if(obj instanceof ParentAgent){
ParentAgent parentAgent = (ParentAgent) obj;
if(parentAgent.agentId == this.agentId) {
return true;
} else {
return false;
}
}
return false;
}
} }
...@@ -18,7 +18,7 @@ public class PartnerTree extends BaseModel { ...@@ -18,7 +18,7 @@ public class PartnerTree extends BaseModel {
Integer userId; Integer userId;
Integer level; Integer level;
ArrayList<ParentPartner> parentList; ArrayList<ParentPartner> parentList;
ArrayList<PartnerTree> childrenList = new ArrayList<PartnerTree>(); ArrayList<PartnerTree> childList = new ArrayList<PartnerTree>();
public ArrayList<ParentPartner> cloneParent() { public ArrayList<ParentPartner> cloneParent() {
ArrayList<ParentPartner> copyList = new ArrayList<ParentPartner>(); ArrayList<ParentPartner> copyList = new ArrayList<ParentPartner>();
......
...@@ -7,7 +7,6 @@ import java.util.List; ...@@ -7,7 +7,6 @@ import java.util.List;
/** /**
* @title: ${NAME} * @title: ${NAME}
* @projectName partner * @projectName partner
* @description: TODO
* @author chen * @author chen
* @package ${PACKAGE_NAME} * @package ${PACKAGE_NAME}
* @date 2019-07-04 11:44 * @date 2019-07-04 11:44
......
...@@ -24,16 +24,15 @@ public interface UserAgentService extends IService<UserAgent> { ...@@ -24,16 +24,15 @@ public interface UserAgentService extends IService<UserAgent> {
UserAgent getOneByAgentId(Integer agentId); UserAgent getOneByAgentId(Integer agentId);
/** /**
* @description: 查找一个用户的全部代理商上级, 根据字段presenter_id
* @param agentId
* @return List<ParentAgent>
*/
List<ParentAgent> getParentAgentListByAgentId(Integer agentId, String parentColumnName);
/**
* @description: 查找一个用户的直接代理商上级, 根据字段presenter_id * @description: 查找一个用户的直接代理商上级, 根据字段presenter_id
* @param agentId * @param agentId
* @return ParentAgent * @return ParentAgent
*/ */
ParentAgent getParentAgentByAgentId(Integer agentId, String parentColumnName); ParentAgent getParentAgentByAgentId(Integer agentId, String parentColumnName);
/**
* @description: 查找一个用户的全部直属代理商上级, 根据字段presenter_id
* @param agentId
* @return List<ParentAgent>
*/
List<ParentAgent> getParentAgentListByAgentId(Integer agentId, String parentColumnName);
} }
package com.lanren.huhu.partner.service; import com.lanren.huhu.partner.domain.PartnerAccount;import com.lanren.huhu.partner.domain.UserAgent;import com.lanren.huhu.partner.model.User; import java.util.List; /** * @author houseme * @date 2019-06-28 18:35 * @Project partner * @Package com.lanren.huhu.partner.service * @File: UserService */public interface UserService { /** * @description: 根据用户id, 查找一个用户的全部合伙人上级 和 代理商上级(此处为层级关系 非平推关系) * 缓存用户邀请关系和代理商关系数据 * 缓存不能带有构造方法的Bean 所以只能返回User的Bean * 包装Result在Cacheable注解的方法之外进行操作 * 注意 !!!!!!!! 这个方法是按输入用户的邀请关系链上查找 第一个有agent_level<=4的代理商身份的邀请人, 然后再走他的代理关系 * 注意 !!!!!!!! 如果需要获取一个代理商的上级代理 需要从UserAgentService里的方法获取 * @param userId * @return User * @throws * @author chen * @date 2019-06-26 20:01 */ User getRelationByUserId(Integer userId); /** * 清理用户缓存 */ boolean deleteRalationByUserId(Integer userId); /*** * PartnerAccount * * 根据用户id查询账户信息 * @param userId * @return PartnerAccount */ PartnerAccount getPartnerAccountByUserId(Integer userId); /** * @description: 根据用户id查询全部下级合伙人 * @param userId * @return List<PartnerAccount> * @author chen * @date 2019-06-28 11:49 */ List<PartnerAccount> getPartnerAccountChildrenByUserId(Integer userId); /*** * UserAgent * 根据用户id查询账户信息 * @param userId * @return */ UserAgent getUserAgentByUserId(Integer userId); /** * @description: 根据用户id查询全部下级代理商 * @param userId * @return List<PartnerAccount> * @author chen * @date 2019-06-28 11:49 */ List<UserAgent> getUserAgentChildrenByUserId(Integer userId, String parentColumnName); // /** // * 按userId查找上级合伙人的 userId 和 level // * @param userId // * @return // */ // ParentPartner getParentPartner(Integer userId); // /** // * @description: 查找一个用户的全部合伙人上级, set到User对象的partnerList中 // * @param userId // * @author chen // * @return List<ParentPartner> // */ // List<ParentPartner> getPartnerListByUserId(Integer userId); // /** // * 按agentId 查找上级代理商的 agentId 和 level // * @param agentId // * @return // */ // ParentAgent getParentAgent(Integer agentId); // /** // * @description: 查找一个用户的全部代理商上级 set到User对象的agentList中 // * @param userId // * @return List<ParentAgent> // */ // List<ParentAgent> getAgentListByUserId(Integer userId); } package com.lanren.huhu.partner.service; import com.lanren.huhu.partner.domain.PartnerAccount;import com.lanren.huhu.partner.domain.UserAgent;import com.lanren.huhu.partner.model.User; import java.util.List; /** * @author houseme * @date 2019-06-28 18:35 * @Project partner * @Package com.lanren.huhu.partner.service * @File: UserService */public interface UserService { /** * @description: 根据用户id, 查找一个用户的全部合伙人上级 和 代理商上级(此处为层级关系 非平推关系) * 缓存用户邀请关系和代理商关系数据 * 缓存不能带有构造方法的Bean 所以只能返回User的Bean * 包装Result在Cacheable注解的方法之外进行操作 * 注意 !!!!!!!! 这个方法是按输入用户的邀请关系链上查找 第一个有agent_level<=4的代理商身份的邀请人, 然后再走他的代理关系 * 注意 !!!!!!!! 如果需要获取一个代理商的上级代理 需要从UserAgentService里的方法获取 * @param userId * @return User * @throws * @author chen * @date 2019-06-26 20:01 */ User getRelationByUserId(Integer userId); /** * 清理用户缓存 */ boolean deleteRalationByUserId(Integer userId); /*** * PartnerAccount * * 根据用户id查询账户信息 * @param userId * @return PartnerAccount */ PartnerAccount getPartnerAccountByUserId(Integer userId); /** * @description: 根据用户id查询全部直属下级合伙人 * @param userId * @return List<PartnerAccount> * @author chen * @date 2019-06-28 11:49 */ List<PartnerAccount> getPartnerAccountChildListByUserId(Integer userId); /*** * UserAgent * 根据用户id查询账户信息 * @param userId * @return */ UserAgent getUserAgentByUserId(Integer userId); /** * @description: 根据用户id查询全部直属下级代理商 * @param userId * @return List<PartnerAccount> * @author chen * @date 2019-06-28 11:49 */ List<UserAgent> getUserAgentChildListByUserId(Integer userId, String parentColumnName); }
\ No newline at end of file \ No newline at end of file
......
...@@ -11,7 +11,6 @@ import java.util.List; ...@@ -11,7 +11,6 @@ import java.util.List;
/** /**
* @title: ${NAME} * @title: ${NAME}
* @projectName partner * @projectName partner
* @description: TODO
* @author chen * @author chen
* @package ${PACKAGE_NAME} * @package ${PACKAGE_NAME}
* @date 2019-07-04 11:44 * @date 2019-07-04 11:44
......
...@@ -6,6 +6,8 @@ import com.lanren.huhu.partner.dao.UserAgentMapper; ...@@ -6,6 +6,8 @@ import com.lanren.huhu.partner.dao.UserAgentMapper;
import com.lanren.huhu.partner.domain.UserAgent; import com.lanren.huhu.partner.domain.UserAgent;
import com.lanren.huhu.partner.model.ParentAgent; import com.lanren.huhu.partner.model.ParentAgent;
import com.lanren.huhu.partner.service.UserAgentService; import com.lanren.huhu.partner.service.UserAgentService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -16,6 +18,7 @@ import java.util.List; ...@@ -16,6 +18,7 @@ import java.util.List;
*/ */
@Service @Service
public class UserAgentServiceImpl extends ServiceImpl<UserAgentMapper, UserAgent> implements UserAgentService { public class UserAgentServiceImpl extends ServiceImpl<UserAgentMapper, UserAgent> implements UserAgentService {
private static Logger logger = LoggerFactory.getLogger(UserAgentServiceImpl.class);
// @Autowired // @Autowired
// UserAgentMapper userAgentMapper; // UserAgentMapper userAgentMapper;
...@@ -51,18 +54,30 @@ public class UserAgentServiceImpl extends ServiceImpl<UserAgentMapper, UserAgent ...@@ -51,18 +54,30 @@ public class UserAgentServiceImpl extends ServiceImpl<UserAgentMapper, UserAgent
@Override @Override
public List<ParentAgent> getParentAgentListByAgentId(Integer agentId, String parentColumnName) { public List<ParentAgent> getParentAgentListByAgentId(Integer agentId, String parentColumnName) {
List<ParentAgent> returnList = new ArrayList<ParentAgent>(); List<ParentAgent> parentList = new ArrayList<ParentAgent>();
int loogAgentId = agentId; int loogAgentId = agentId;
int loopTimes = 0;
while (true) { while (true) {
ParentAgent parentAgent = getParentAgentByAgentId(loogAgentId, parentColumnName); ParentAgent parentAgent = getParentAgentByAgentId(loogAgentId, parentColumnName);
if (null == parentAgent) { if (null == parentAgent) {
break; break;
} else { } else {
returnList.add(parentAgent); if (parentList.contains(parentAgent) || parentAgent.getAgentId() == agentId) {
logger.info("发现互为上级的代理关系 代理商({})", parentAgent.getAgentId());
logger.info("退出循环, 不再继续查找");
break;
}
parentList.add(parentAgent);
loogAgentId = parentAgent.getAgentId(); loogAgentId = parentAgent.getAgentId();
loopTimes++;
if (loopTimes > 500) {
parentList.clear();
logger.error("代理商:{} 邀请关系异常, 已超500层", agentId);
break;
}
} }
} }
return returnList; return parentList;
} }
@Override @Override
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment