PartnerUserServiceImpl.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. package com.ydtech.modules.partner.service.Impl;
  2. import java.math.BigDecimal;
  3. import java.math.RoundingMode;
  4. import java.time.Instant;
  5. import java.time.LocalDateTime;
  6. import java.time.ZoneId;
  7. import java.util.*;
  8. import cn.hutool.core.bean.BeanUtil;
  9. import cn.hutool.core.collection.CollectionUtil;
  10. import cn.hutool.extra.spring.SpringUtil;
  11. import com.alibaba.fastjson.JSONObject;
  12. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  13. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  14. import com.baomidou.mybatisplus.core.metadata.IPage;
  15. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  16. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  17. import com.ydtech.core.page.HttpResult;
  18. import com.ydtech.modules.admin.controller.SysUserController;
  19. import com.ydtech.modules.admin.dao.SysPartnerConfigMapper;
  20. import com.ydtech.modules.admin.dao.SysUserMapper;
  21. import com.ydtech.modules.admin.model.SysUser;
  22. import com.ydtech.modules.admin.model.vo.AppUserInfoVo;
  23. import com.ydtech.modules.admin.model.vo.SysUser2Vo;
  24. import com.ydtech.modules.base.controller.BaseController;
  25. import com.ydtech.modules.esm.dao.EsmUserImageMapper;
  26. import com.ydtech.modules.esm.model.EsmUserImage;
  27. import com.ydtech.modules.order.dao.InsUploadFilesMapper;
  28. import com.ydtech.modules.order.entity.api.zhongmei.constants.TimeConstants;
  29. import com.ydtech.modules.order.entity.po.InsUploadFiles;
  30. import com.ydtech.modules.partner.CalculateCommissionUtils;
  31. import com.ydtech.modules.partner.dao.PartnerPartnerAccountMapper;
  32. import com.ydtech.modules.partner.dao.PartnerPremiumDetailsMapper;
  33. import com.ydtech.modules.partner.dao.PartnerUserMapper;
  34. import com.ydtech.modules.partner.model.*;
  35. import com.ydtech.modules.partner.model.param.AppHomeParams;
  36. import com.ydtech.modules.partner.model.param.PartnerRuleEntity;
  37. import com.ydtech.modules.partner.model.param.QueryVo;
  38. import com.ydtech.modules.partner.model.param.UserGradeParam;
  39. import com.ydtech.modules.partner.model.vo.*;
  40. import com.ydtech.modules.partner.service.PartnerLiftingRecordService;
  41. import com.ydtech.modules.partner.service.PartnerRuleService;
  42. import com.ydtech.modules.partner.service.PartnerUserService;
  43. import org.apache.commons.lang3.ObjectUtils;
  44. import org.apache.commons.lang3.StringUtils;
  45. import org.springframework.beans.factory.annotation.Autowired;
  46. import org.springframework.stereotype.Service;
  47. import javax.annotation.Resource;
  48. import java.util.stream.Collectors;
  49. import static net.sf.jsqlparser.parser.feature.Feature.values;
  50. @Service
  51. public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, PartnerUser> implements PartnerUserService {
  52. @Autowired
  53. private PartnerRuleService ruleService;
  54. @Autowired
  55. private PartnerLiftingRecordService liftingRecordService;
  56. @Resource
  57. private SysUserMapper sysUserMapper;
  58. @Autowired
  59. private InsUploadFilesMapper uploadFilesMapper;
  60. @Autowired
  61. private PartnerPartnerAccountMapper partnerPartnerAccountMapper;
  62. @Autowired
  63. private PartnerPremiumDetailsMapper detailsMapper;
  64. @Override
  65. public int insert(PartnerUser partnerUser) {
  66. return baseMapper.insert(partnerUser);
  67. }
  68. @Override
  69. public IPage<PartnerUserVo> queryPage(QueryVo queryVo) {
  70. IPage<PartnerUserVo> page = baseMapper.queryPage(queryVo.getPage(),queryVo);
  71. return page;
  72. }
  73. @Override
  74. public List<RelationalVo> relationalQuery(String id) {
  75. List<RelationalVo> list = new ArrayList<>();
  76. Integer grade = baseMapper.selectGradeIntMin(id);
  77. List<RelationalVo> partnerUsers = baseMapper.selectByUserId(id,grade);
  78. if (1 < grade){
  79. querySuperiors(list, grade,partnerUsers);
  80. }
  81. list.addAll(partnerUsers);
  82. querySubordinates(partnerUsers, grade,list);
  83. return list;
  84. }
  85. public void querySuperiors(List<RelationalVo> list,Integer grade,List<RelationalVo> partnerUsers){
  86. if (CollectionUtil.isEmpty(partnerUsers)){
  87. return;
  88. }
  89. String userId = partnerUsers.get(0).getUserId();
  90. grade --;
  91. List<RelationalVo> relationalVos = baseMapper.selectQuerySuperiors(userId,grade);
  92. list.addAll(relationalVos);
  93. querySuperiors( list, grade, relationalVos);
  94. }
  95. public void querySubordinates(List<RelationalVo> partnerUsers,Integer grade,List<RelationalVo> list){
  96. if (CollectionUtil.isEmpty(partnerUsers)){
  97. return;
  98. }
  99. String userId = partnerUsers.get(0).getUserId();
  100. grade ++;
  101. List<RelationalVo> relationalVos = baseMapper.selectByReferrerId(userId,grade);
  102. list.addAll(relationalVos);
  103. querySubordinates(relationalVos, grade,list);
  104. }
  105. public void querySubordinates(List<PartnerUser> list, PartnerUser partnerUser){
  106. while (partnerUser != null && StringUtils.isNotBlank(partnerUser.getUserId())) {
  107. PartnerUser one = baseMapper.selectOne(new LambdaQueryWrapper<>(PartnerUser.class).eq(PartnerUser::getReferrerId, partnerUser.getUserId()));
  108. list.add(one);
  109. querySubordinates( list,one);
  110. }
  111. }
  112. @Override
  113. public List<Map<String, String>> selectRecommender(String level) {
  114. if (StringUtils.isEmpty(level)){
  115. return new ArrayList<>(0);
  116. }
  117. if (StringUtils.equals(level,"2")){
  118. level = "1";
  119. }else if (StringUtils.equals(level,"3")){
  120. level = "2";
  121. }else if (StringUtils.equals(level,"4")){
  122. level = "3";
  123. }
  124. return baseMapper.selectRecommender(level);
  125. }
  126. @Override
  127. public HttpResult verifyUpgradeConditions(UserGradeParam userGradeParam) {
  128. if (StringUtils.isBlank(userGradeParam.getGrade())){
  129. return HttpResult.error("参数不能为空");
  130. }
  131. if (ruleService.verifyUpgradeConditions(userGradeParam.getId(),userGradeParam.getGrade())){
  132. return HttpResult.ok("满足升级条件");
  133. }
  134. return HttpResult.error("不满足升级条件");
  135. }
  136. @Override
  137. public HttpResult submitLiftingRecord(UserGradeParam userGradeParam) {
  138. if (StringUtils.equals("1",userGradeParam.getGrade())){
  139. return HttpResult.error("当前用户无法升级");
  140. }
  141. LambdaQueryWrapper<PartnerUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  142. lambdaQueryWrapper.eq(PartnerUser::getUserId,userGradeParam.getId());
  143. lambdaQueryWrapper.eq(PartnerUser::getGrade,userGradeParam.getGrade());
  144. PartnerUser partnerUser = baseMapper.selectOne(lambdaQueryWrapper);
  145. // 条件
  146. PartnerRuleEntity ruleEntity = ruleService.selectByGrade(userGradeParam.getGrade());
  147. PartnerLiftingRecord record = new PartnerLiftingRecord();
  148. record.setName(partnerUser.getName());
  149. record.setMobile(partnerUser.getMobile());
  150. record.setUserId(partnerUser.getUserId());
  151. record.setDeptId(partnerUser.getDeptId());
  152. record.setDeptName(partnerUser.getDeptName());
  153. record.setType("0");
  154. record.setOriginalLevel(userGradeParam.getGrade());
  155. switch (userGradeParam.getGrade()) {
  156. case "1":
  157. record.setAfterChange("");
  158. break;
  159. case "2":
  160. record.setAfterChange("1");
  161. break;
  162. case "3":
  163. record.setAfterChange("2");
  164. break;
  165. case "4":
  166. record.setAfterChange("3");
  167. break;
  168. }
  169. record.setCycle(getMessage(ruleEntity));
  170. record.setUpgradeStrategy(ruleService.verifyUpgradeConditionsMessage(userGradeParam.getId(),userGradeParam.getGrade()));
  171. return liftingRecordService.saveLiftingRecord(record);
  172. }
  173. public String getMessage(PartnerRuleEntity ruleEntity){
  174. String message = "";
  175. PartnerAttribute entityCycle = ruleEntity.getCycle();
  176. switch (entityCycle.getCycle()){
  177. case "1":
  178. message = "成为该等级后,无限期";
  179. break;
  180. case "2":
  181. message = "成为该等级后,限期" + entityCycle.getFixedDays() + "天";
  182. break;
  183. case "3":
  184. message = "成为该等级后,固定限期" + entityCycle.getMin() + "至" + entityCycle.getMax();
  185. break;
  186. }
  187. return message;
  188. }
  189. @Override
  190. public HttpResult getHomePage(AppHomeParams params) {
  191. Set<String> list = new HashSet<>();
  192. getLevelUserId(params.getUserId(),list);
  193. //List<String> strings = baseMapper.selectRelatedPerList(params.getUserId(), params);
  194. list.add(params.getUserId());
  195. params.setRelatedPerList(list);
  196. params.setCountCycle("Day");
  197. HomeVo homeVo = new HomeVo();
  198. TodayOverview overview = new TodayOverview();
  199. if (CollectionUtil.isNotEmpty(list)){
  200. overview = baseMapper.selectTodayOverview(params);
  201. homeVo.setTodayOverview(overview);
  202. }else {
  203. homeVo.setTodayOverview(overview);
  204. }
  205. //查询当前用户等级
  206. List<TeamOverviewVo> teamOverviewVos = baseMapper.selectTeamOverview(params);
  207. for (TeamOverviewVo overviewVo : teamOverviewVos) {
  208. switch (overviewVo.getGrade()){
  209. case "1":
  210. overviewVo.setVo1(baseMapper.selectStatistics(overviewVo.getGrade(), params));
  211. break;
  212. case "2":
  213. overviewVo.setVo2(baseMapper.selectStatistics(overviewVo.getGrade(), params));
  214. break;
  215. case "3":
  216. overviewVo.setVo3(baseMapper.selectStatistics(overviewVo.getGrade(), params));
  217. break;
  218. case "4":
  219. overviewVo.setVo4(baseMapper.selectStatistics(overviewVo.getGrade(), params));
  220. break;
  221. }
  222. }
  223. homeVo.setTeamOverview(teamOverviewVos);
  224. return HttpResult.ok(homeVo);
  225. }
  226. @Override
  227. public void getLevelUserId(String userId,Set<String> list){
  228. List<String> level = baseMapper.selectByLevelUserId(userId);
  229. if (CollectionUtil.isNotEmpty(level)){
  230. level.removeIf(s -> s.equals(userId));
  231. }
  232. if (CollectionUtil.isEmpty(level)){
  233. return;
  234. }
  235. if ( containsOnlyId(level, userId)){
  236. return;
  237. }
  238. if (CollectionUtil.isNotEmpty(level)){
  239. list.addAll(level);
  240. for (String s : level) {
  241. getLevelUserId(s,list);
  242. }
  243. }
  244. }
  245. @Override
  246. public List<String> getUserGradeList(String userId) {
  247. QueryWrapper<PartnerUser> queryWrapper = new QueryWrapper<>();
  248. queryWrapper.eq("user_id", userId);
  249. List<PartnerUser> partnerUsers = baseMapper.selectList(queryWrapper);
  250. return partnerUsers.stream()
  251. .map(user -> String.valueOf(user.getGrade()))
  252. .collect(Collectors.toList());
  253. }
  254. @Override
  255. public HttpResult addUserIdentity(Map<String, Object> map) {
  256. try {
  257. if (map.containsKey("userId")){
  258. String userId = (String) map.get("userId");
  259. PartnerUser partnerUsers = baseMapper.selectMaxGradeUserId(userId);
  260. if (partnerUsers == null){
  261. return HttpResult.error("请选择用户");
  262. }
  263. if (StringUtils.equals("4",String.valueOf(partnerUsers.getGrade()))){
  264. return HttpResult.error("请邀请团队长");
  265. }
  266. if (map.containsKey("gradeList")){
  267. List<String> list = (ArrayList<String>) map.get("gradeList");
  268. List<String> gradeList = list.stream()
  269. .sorted(Comparator.comparingInt(Integer::parseInt))
  270. .collect(Collectors.toList());
  271. if (partnerUsers != null && CollectionUtil.isNotEmpty(gradeList)){
  272. SysUser sysUser = sysUserMapper.selectById(userId);
  273. for (String s : gradeList) {
  274. PartnerUser partnerUser = new PartnerUser();
  275. partnerUser.setName(sysUser.getName());
  276. partnerUser.setMobile(sysUser.getMobile());
  277. partnerUser.setUserId(sysUser.getId());
  278. partnerUser.setDeptId(sysUser.getDeptId());
  279. partnerUser.setDeptName(sysUser.getDeptName());
  280. partnerUser.setGrade(Integer.valueOf(s));
  281. partnerUser.setReferrerId(partnerUsers.getUserId());
  282. baseMapper.insert(partnerUser);
  283. // if (StringUtils.equals("4",s)){
  284. // sysUser.setGrade(4);
  285. // SysUser2Vo sysUser2Vo = getUser2Vo(sysUser,partnerUser.getUserId());
  286. // SpringUtil.getBean(SysUserController.class).newSaveUserInfoByPartner(sysUser2Vo);
  287. // }
  288. }
  289. }
  290. }
  291. }
  292. }catch (Exception e){
  293. log.error("添加失败",e);
  294. return HttpResult.error();
  295. }
  296. return HttpResult.ok("添加成功");
  297. }
  298. private static SysUser2Vo getUser2Vo(SysUser sysUser,String id) {
  299. SysUser2Vo sysUser2Vo = new SysUser2Vo();
  300. SysUser user = new SysUser();
  301. user.setName(sysUser.getName());
  302. user.setMobile(sysUser.getMobile());
  303. user.setIdentity(sysUser.getIdentity());
  304. user.setPassword(sysUser.getPassword());
  305. user.setRoleId("21");
  306. user.setReferrerId(id);
  307. user.setDeptSource("2");
  308. user.setGrade(4);
  309. sysUser2Vo.setSysUser( user);
  310. return sysUser2Vo;
  311. }
  312. public static boolean containsOnlyId(List<String> list, String targetId) {
  313. return list != null
  314. && !list.isEmpty()
  315. && list.stream().allMatch(targetId::equals);
  316. }
  317. @Override
  318. public void deleteByUserId(String id) {
  319. baseMapper.deleteByUserId(id);
  320. }
  321. @Override
  322. public HttpResult selectUser(AppHomeParams params) {
  323. return HttpResult.ok(baseMapper.selectUser(params));
  324. }
  325. public Integer queryLevel(Integer grade){
  326. if (!Objects.isNull(grade)){
  327. switch (grade){
  328. case 1:
  329. return 2;
  330. case 2:
  331. return 3;
  332. case 3:
  333. return 4;
  334. case 4:
  335. return 5;
  336. }
  337. }
  338. return 1;
  339. }
  340. public Map<Integer, String> getRule() {
  341. List<PartnerRule> partnerRules = ruleService.selectAll();
  342. Map<Integer, String> ruleMap = partnerRules.stream()
  343. .collect(Collectors.toMap(
  344. PartnerRule::getGrade,
  345. rule -> rule.getGradeName() != null ? rule.getGradeName() : "",
  346. (existing, replacement) -> existing
  347. ));
  348. ruleMap.put(5, "团队长");
  349. ruleMap.put(6, "业务员");
  350. return ruleMap;
  351. }
  352. @Override
  353. public HttpResult userCountVo(AppHomeParams params) {
  354. PartnerUser minGrade = baseMapper.selectGradeMin(params.getUserId());
  355. if (minGrade == null) {
  356. return HttpResult.error("人员不存在");
  357. }
  358. Map<Integer, String> rule = getRule();
  359. Map<String, Object> vo = new HashMap<>();
  360. vo.put("vo1", getV1(minGrade, params, rule));
  361. vo.put("vo2", getVo2(minGrade, params, rule));
  362. vo.put("vo3", getVo3(minGrade, params, rule));
  363. vo.put("vo4", getVo4(minGrade, params, rule));
  364. return HttpResult.ok(vo);
  365. }
  366. /**
  367. *
  368. List<Student> sortedList = list.stream()
  369. .sorted(
  370. Comparator.comparing(Student::getSort) // 按 sort 升序
  371. .thenComparing(
  372. Student::getCreateTime,
  373. Comparator.nullsFirst(Comparator.reverseOrder()) // 创建时间降序,空值优先
  374. )
  375. )
  376. .collect(Collectors.toList());
  377. *
  378. *
  379. */
  380. @Override
  381. public HttpResult selectByIdList(String id) {
  382. if (StringUtils.isEmpty(id)) {
  383. return HttpResult.error("ID不能为空");
  384. }
  385. PartnerUser partnerUser = baseMapper.selectById(id);
  386. if (ObjectUtils.isEmpty(partnerUser)) {
  387. return HttpResult.error("人员不存在");
  388. }
  389. JSONObject referrerInfo = new JSONObject();
  390. referrerInfo.put("referrerGrade",baseMapper.selectByUserIdGrade(partnerUser.getUserId()));
  391. referrerInfo.put("referrerName",baseMapper.selectByUserIdUserName(partnerUser.getUserId()));
  392. referrerInfo.put("mobile",partnerUser.getMobile());
  393. referrerInfo.put("userName",partnerUser.getName());
  394. HashMap<String, Object> map = new HashMap<>();
  395. map.put("list",buildUserHierarchyResult(partnerUser.getUserId(), null));
  396. map.put("referrer",referrerInfo);
  397. return HttpResult.ok(map);
  398. }
  399. @Override
  400. public HttpResult selectByGradeList(Map<String,String> paeramsMap, String userId) {
  401. if (StringUtils.isEmpty(userId) || StringUtils.isEmpty(paeramsMap.get("grade"))) {
  402. return HttpResult.error("用户ID和等级不能为空");
  403. }
  404. AppHomeParams params = new AppHomeParams();
  405. params.setUserId(userId);
  406. List<TeamOverviewVo> teamOverviewVos = baseMapper.selectTeamOverview(params);
  407. List<Object> list = new ArrayList<>();
  408. for (TeamOverviewVo overviewVo : teamOverviewVos) {
  409. HashMap<String, Object> map = new HashMap<>();
  410. map.put("grade",overviewVo.getGrade());
  411. map.put("gradeName",overviewVo.getGradeName());
  412. PartnerUser partnerUser = baseMapper.selectOne(new LambdaQueryWrapper<>(PartnerUser.class)
  413. .eq(PartnerUser::getUserId, userId)
  414. .ge((CollectionUtil.isNotEmpty(paeramsMap) && paeramsMap.containsKey("startTime") && StringUtils.isNotEmpty(paeramsMap.get("startTime"))),
  415. PartnerUser::getCreateTime, paeramsMap.get("startTime") + " " + TimeConstants.START_TIME)
  416. .le((CollectionUtil.isNotEmpty(paeramsMap) && paeramsMap.containsKey("endTime") && StringUtils.isNotEmpty(paeramsMap.get("endTime"))),
  417. PartnerUser::getCreateTime, paeramsMap.get("endTime") + " " + TimeConstants.END_TIME)
  418. .eq(PartnerUser::getGrade, paeramsMap.get("grade")));
  419. List<JSONObject> object = new ArrayList<>();
  420. if (ObjectUtils.isNotEmpty(partnerUser)) {
  421. object = buildUserHierarchyResult(partnerUser.getUserId(),paeramsMap);
  422. }
  423. map.put("data",object);
  424. list.add(map);
  425. }
  426. return HttpResult.ok(list);
  427. }
  428. @Override
  429. public Object myPerformance(Map<String, String> map) {
  430. Set<String> setList = new HashSet<>();
  431. getLevelUserId(map.get("userId"),setList);
  432. JSONObject totalMap = baseMapper.myPerformanceTotal(map,setList);
  433. List<JSONObject> datalist = baseMapper.queryDataList(map,setList);
  434. HashMap<String, Object> hashMap = new HashMap<>();
  435. hashMap.put("data",datalist);
  436. hashMap.put("total",totalMap);
  437. return hashMap;
  438. }
  439. @Override
  440. public HttpResult myPerformanceDetails(String ordersNo) {
  441. JSONObject jsonObject = new JSONObject();
  442. jsonObject.put("ordersNo",1);
  443. jsonObject.put("carId",1);
  444. //收入类型
  445. jsonObject.put("incomeType",1);
  446. //代理人
  447. jsonObject.put("agent",1);
  448. //所属团队
  449. jsonObject.put("belongingTeam",1);
  450. // 保费
  451. jsonObject.put("premium",1);
  452. //佣金
  453. jsonObject.put("commission",1);
  454. //出单时间
  455. jsonObject.put("orderTime",1);
  456. // 佣金比例
  457. ArrayList<Object> list = new ArrayList<>();
  458. JSONObject object = new JSONObject();
  459. object.put("grade","我的创始人佣金");
  460. object.put("commission","26738.48*1%=140");
  461. list.add(object);
  462. jsonObject.put("commissionRatio",list);
  463. return HttpResult.ok(jsonObject);
  464. }
  465. @Override
  466. public HttpResult avatarUpdate(PartnerUser partnerUser) {
  467. PartnerUser user = new PartnerUser();
  468. user.setPictureUrl(partnerUser.getPictureUrl());
  469. return baseMapper.update(user,new LambdaQueryWrapper<>(PartnerUser.class)
  470. .eq(PartnerUser::getUserId, partnerUser.getUserId())
  471. ) > 0 ? HttpResult.ok("保存成功") : HttpResult.error("保存失败");
  472. }
  473. @Override
  474. public HttpResult userCountStatisticsVo(AppHomeParams params) {
  475. PartnerUser minGrade = baseMapper.selectGradeMin(params.getUserId());
  476. if (minGrade == null) {
  477. return HttpResult.error("人员不存在");
  478. }
  479. Map<Integer, String> rule = getRule();
  480. Map<String, Object> vo = new HashMap<>();
  481. vo.put("vo1", getV1(minGrade, params, rule));
  482. vo.put("vo2", getVo2(minGrade, params, rule));
  483. return HttpResult.ok(vo);
  484. }
  485. @Override
  486. public HttpResult userCountProportionVo(AppHomeParams params) {
  487. PartnerUser minGrade = baseMapper.selectGradeMin(params.getUserId());
  488. if (minGrade == null) {
  489. return HttpResult.error("人员不存在");
  490. }
  491. Map<Integer, String> rule = getRule();
  492. List<JSONObject> vo3 = getVo3(minGrade, params, rule);
  493. return HttpResult.ok(vo3);
  494. }
  495. @Override
  496. public HttpResult userCountRankingVo(AppHomeParams params) {
  497. PartnerUser minGrade = baseMapper.selectGradeMin(params.getUserId());
  498. if (minGrade == null) {
  499. return HttpResult.error("人员不存在");
  500. }
  501. Map<Integer, String> rule = getRule();
  502. List<JSONObject> vo4 = getVo4(minGrade, params, rule);
  503. return HttpResult.ok(vo4);
  504. }
  505. private List<JSONObject> buildUserHierarchyResult(String userId, Map<String,String> paeramsMap) {
  506. Map<Integer, String> rule = getRule();
  507. List<JSONObject> list = new ArrayList<>();
  508. getLevelUser(userId,list, rule,paeramsMap);
  509. return getSort(list);
  510. }
  511. @Override
  512. public boolean selectByUserIdList(String id) {
  513. List<PartnerUser> partnerUsers = baseMapper.selectList(new LambdaQueryWrapper<>(PartnerUser.class).eq(PartnerUser::getUserId, id));
  514. for (PartnerUser partnerUser : partnerUsers) {
  515. if (partnerUser.getGrade() > 4){
  516. return false;
  517. }
  518. }
  519. return CollectionUtil.isNotEmpty(partnerUsers) ? true : false;
  520. }
  521. @Override
  522. public AppUserInfoVo getUserInfo(Integer type) {
  523. String userId = BaseController.getUserId();
  524. AppUserInfoVo appUserInfoVo = sysUserMapper.queryByUserId(userId);
  525. Integer min = baseMapper.selectGradeIntMin(userId);
  526. appUserInfoVo.setGrade(min);
  527. PartnerUser partnerUser = baseMapper.selectOne(new LambdaQueryWrapper<>(PartnerUser.class)
  528. .eq(PartnerUser::getUserId, userId)
  529. .eq(PartnerUser::getGrade, min));
  530. InsUploadFiles insUploadFiles = uploadFilesMapper.selectById(partnerUser.getPictureUrl());
  531. appUserInfoVo.setInsUploadFiles(insUploadFiles);
  532. return appUserInfoVo;
  533. }
  534. public List<JSONObject> getSort(List<JSONObject> list) {
  535. return list.stream()
  536. .sorted(Comparator.comparing(
  537. jo -> parseSortField(JSONObject.parseObject(jo.toString())),
  538. Comparator.nullsLast(Comparator.naturalOrder()))
  539. .thenComparing(
  540. jo -> parseCreateTime(JSONObject.parseObject(jo.toString())),
  541. Comparator.nullsFirst(Comparator.naturalOrder())))
  542. .collect(Collectors.toList());
  543. }
  544. private static Integer parseSortField(JSONObject obj) {
  545. if (obj == null) {
  546. return 0;
  547. }
  548. Object value = obj.get("grade");
  549. if (value instanceof Number) {
  550. return ((Number) value).intValue();
  551. } else if (value instanceof String) {
  552. try {
  553. return Integer.parseInt(value.toString());
  554. } catch (NumberFormatException e) {
  555. return 0;
  556. }
  557. }
  558. return 0;
  559. }
  560. private static LocalDateTime parseCreateTime(JSONObject obj) {
  561. if (obj == null) {
  562. return LocalDateTime.MIN;
  563. }
  564. Object valueObj = obj.get("createTime");
  565. if (valueObj == null) {
  566. return LocalDateTime.MIN;
  567. }
  568. String value = valueObj.toString().trim();
  569. if (value.isEmpty()) {
  570. return LocalDateTime.MIN;
  571. }
  572. try {
  573. long epochSecond = Long.parseLong(value);
  574. return LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), ZoneId.systemDefault());
  575. } catch (NumberFormatException e) {
  576. return LocalDateTime.MIN;
  577. }
  578. }
  579. public void getLevelUser(String userId, List<JSONObject> list,Map<Integer, String> rule,Map<String,String> paeramsMap){
  580. LambdaQueryWrapper<PartnerUser> queryWrapper = new LambdaQueryWrapper<>();
  581. queryWrapper.eq(PartnerUser::getReferrerId,userId);
  582. if (CollectionUtil.isNotEmpty(paeramsMap) && paeramsMap.containsKey("startTime") && StringUtils.isNotEmpty(paeramsMap.get("startTime"))){
  583. queryWrapper.ge(PartnerUser::getCreateTime, paeramsMap.get("startTime") + " " + TimeConstants.START_TIME);
  584. }
  585. if (CollectionUtil.isNotEmpty(paeramsMap) && paeramsMap.containsKey("endTime") && StringUtils.isNotEmpty(paeramsMap.get("endTime"))){
  586. queryWrapper.le(PartnerUser::getCreateTime, paeramsMap.get("endTime") + " " + TimeConstants.END_TIME);
  587. }
  588. List<PartnerUser> partnerUsers = baseMapper.selectList(queryWrapper);
  589. for (PartnerUser partnerUser : partnerUsers) {
  590. Set<String> set = new HashSet<>();
  591. set.add(partnerUser.getUserId());
  592. getLevelUserId(partnerUser.getUserId(), set);
  593. QueryWrapper<PartnerPremiumDetails> wrapper = new QueryWrapper<>();
  594. wrapper.in("user_id",set);
  595. JSONObject jsonObject = new JSONObject();
  596. jsonObject.put("id",partnerUser.getId());
  597. jsonObject.put("userName", partnerUser.getName());
  598. jsonObject.put("grade", partnerUser.getGrade());
  599. jsonObject.put("createTime", partnerUser.getCreateTime());
  600. jsonObject.put("gradeName", rule.getOrDefault(Integer.valueOf(partnerUser.getGrade() + 1), ""));
  601. jsonObject.put("number", countByUserIdLevel(partnerUser.getUserId()));
  602. BigDecimal premium = detailsMapper.selectTotalSumPremium(wrapper);
  603. jsonObject.put("premium", premium == null ? BigDecimal.ZERO : premium);
  604. BigDecimal commission = detailsMapper.selectTotalCommission(wrapper);
  605. jsonObject.put("commission",commission == null ? BigDecimal.ZERO : commission);
  606. list.add(jsonObject);
  607. //getLevelUser( partnerUser.getUserId(), list, rule);
  608. }
  609. }
  610. public Long countByUserIdLevel(String userId){
  611. if (Objects.isNull(userId)){
  612. return Long.parseLong("0");
  613. }
  614. return baseMapper.selectCount(new LambdaQueryWrapper<PartnerUser>().eq(PartnerUser::getReferrerId, userId));
  615. }
  616. public List<JSONObject> getVo4(PartnerUser minGrade, AppHomeParams params, Map<Integer, String> rule) {
  617. Integer grade = queryLevel(minGrade.getGrade());
  618. List<JSONObject> list = new ArrayList<>();
  619. List<String> currentUserIds = new ArrayList<>();
  620. currentUserIds.add(minGrade.getUserId());
  621. while (grade < 7) {
  622. List<PartnerUser> currentUserList = new ArrayList<>();
  623. if (CollectionUtil.isNotEmpty(currentUserIds)) {
  624. currentUserList = baseMapper.selectJuniorListUser(grade, currentUserIds, params);
  625. currentUserIds = currentUserList.stream().map(PartnerUser::getUserId).collect(Collectors.toList());
  626. }
  627. getVo4Data(list, grade, currentUserList, params, rule);
  628. if ((minGrade.getGrade() >= 1 && minGrade.getGrade() <= 3 && grade == 4) ||
  629. (minGrade.getGrade() == 4 && grade == 5)) {
  630. break;
  631. }
  632. grade++;
  633. }
  634. return list;
  635. }
  636. public void getVo4Data(List<JSONObject> list, int grade, List<PartnerUser> currentUser, AppHomeParams params, Map<Integer, String> rule) {
  637. JSONObject object = new JSONObject();
  638. object.put("grade", grade);
  639. object.put("gradeName", rule.getOrDefault(grade, ""));
  640. List<JSONObject> arrayList = new ArrayList<>();
  641. for (PartnerUser user : currentUser) {
  642. JSONObject jsonObject = new JSONObject();
  643. jsonObject.put("id", user.getId());
  644. jsonObject.put("userName", user.getName());
  645. jsonObject.put("number", baseMapper.userCountVo(user.getUserId(), params));
  646. arrayList.add(jsonObject);
  647. }
  648. arrayList.sort((o1, o2) -> o2.getString("number").compareTo(o1.getString("number")));
  649. object.put("data", arrayList);
  650. list.add(object);
  651. }
  652. public List<JSONObject> getVo3(PartnerUser minGrade, AppHomeParams params, Map<Integer, String> rule) {
  653. Integer grade = queryLevel(minGrade.getGrade());
  654. List<JSONObject> list = new ArrayList<>();
  655. List<String> currentUserIds = new ArrayList<>();
  656. currentUserIds.add(minGrade.getUserId());
  657. while (grade < 7) {
  658. if (CollectionUtil.isNotEmpty(currentUserIds)) {
  659. currentUserIds = baseMapper.selectJuniorList(grade, currentUserIds, params);
  660. }
  661. getVo3Data(list, grade, currentUserIds, params, rule);
  662. if ((minGrade.getGrade() >= 1 && minGrade.getGrade() <= 3 && grade == 4) ||
  663. (minGrade.getGrade() == 4 && grade == 5)) {
  664. break;
  665. }
  666. grade++;
  667. }
  668. return list;
  669. }
  670. public void getVo3Data(List<JSONObject> list, int grade, List<String> currentUserIds, AppHomeParams params, Map<Integer, String> rule) {
  671. JSONObject object = new JSONObject();
  672. object.put("grade", grade);
  673. object.put("gradeName", rule.getOrDefault(grade, ""));
  674. Integer newNum = baseMapper.userCountIdsVo(currentUserIds, params);
  675. Integer number = baseMapper.userCountIdsVo(currentUserIds, null);
  676. JSONObject jsonObject = new JSONObject();
  677. //新增数量
  678. jsonObject.put("newNum", newNum);
  679. //总数量
  680. jsonObject.put("number", number);
  681. //新增占比
  682. jsonObject.put("newProportion", calculatePrecisePercentage(getToInt(newNum),getToInt(number)));
  683. //历史占比
  684. jsonObject.put("oldProportion",calculatePrecisePercentage(BigDecimal.valueOf(number).subtract(BigDecimal.valueOf(newNum)),getToInt(number)));
  685. object.put("data", jsonObject);
  686. list.add(object);
  687. }
  688. public static BigDecimal getToInt(Integer intValue){
  689. return Optional.ofNullable(intValue)
  690. .map(BigDecimal::valueOf)
  691. .orElse(BigDecimal.ZERO);
  692. }
  693. public static String calculatePrecisePercentage(BigDecimal part, BigDecimal total) {
  694. if (total.compareTo(BigDecimal.ZERO) == 0) {
  695. return "0";
  696. }
  697. BigDecimal ratio = part.divide(total, 4, RoundingMode.HALF_UP) // 保留4位小数
  698. .multiply(BigDecimal.valueOf(100))
  699. .setScale(2, RoundingMode.DOWN); // 最终保留两位小数
  700. return ratio + "%";
  701. }
  702. public List<Map<String, Object>> getVo2(PartnerUser minGrade, AppHomeParams params, Map<Integer, String> rule) {
  703. Integer grade = queryLevel(minGrade.getGrade());
  704. List<Map<String, Object>> list = new ArrayList<>();
  705. List<String> currentUserIds = new ArrayList<>();
  706. currentUserIds.add(minGrade.getUserId());
  707. while (grade < 7) {
  708. if (CollectionUtil.isNotEmpty(currentUserIds)) {
  709. currentUserIds = baseMapper.selectJuniorList(grade, currentUserIds, params);
  710. }
  711. processGradeVo2(list, grade, currentUserIds, params, rule);
  712. if ((minGrade.getGrade() >= 1 && minGrade.getGrade() <= 3 && grade == 4) ||
  713. (minGrade.getGrade() == 4 && grade == 5)) {
  714. break;
  715. }
  716. grade++;
  717. }
  718. return list;
  719. }
  720. public void processGradeVo2(List<Map<String, Object>> list, int grade, List<String> currentUserIds, AppHomeParams params, Map<Integer, String> rule) {
  721. Map<String, Object> voMap = new HashMap<>();
  722. voMap.put("grade", grade);
  723. voMap.put("gradeName", rule.getOrDefault(grade, ""));
  724. List<Map<String, String>> maps = new ArrayList<>(0);
  725. if (CollectionUtil.isNotEmpty(currentUserIds)){
  726. maps = baseMapper.userCountVo2(currentUserIds, params);
  727. }
  728. // Map<String, Integer> mergedMap = arrayList.stream()
  729. // .flatMap(map -> map.entrySet().stream())
  730. // .collect(Collectors.toMap(
  731. // Map.Entry::getKey,
  732. // Map.Entry::getValue,
  733. // Integer::sum
  734. // ));
  735. // for (Map.Entry<String, Integer> entry : mergedMap.entrySet()) {
  736. // Integer value = entry.getValue();
  737. // }
  738. List<String> keys = new ArrayList<>();
  739. List<String> values = new ArrayList<>();
  740. for (Map<String, String> map : maps) {
  741. for (Map.Entry<String, String> entry : map.entrySet()) {
  742. if ("total".equals(entry.getKey())){
  743. keys.add(String.valueOf(entry.getValue()));
  744. }else if ("createTime".equals(entry.getKey())){
  745. values.add(String.valueOf(entry.getValue()));
  746. }
  747. }
  748. }
  749. JSONObject jsonObject = new JSONObject();
  750. jsonObject.put("dataTime",values);
  751. jsonObject.put("data",keys);
  752. voMap.put("data", jsonObject);
  753. list.add(voMap);
  754. }
  755. public List<Map<String, Object>> getV1(PartnerUser minGrade, AppHomeParams params, Map<Integer, String> rule) {
  756. Integer grade = queryLevel(minGrade.getGrade());
  757. List<Map<String, Object>> list = new ArrayList<>();
  758. List<String> currentUserIds = new ArrayList<>();
  759. currentUserIds.add(minGrade.getUserId());
  760. while (grade < 7) {
  761. if (CollectionUtil.isNotEmpty(currentUserIds)) {
  762. currentUserIds = baseMapper.selectJuniorList(grade, currentUserIds, params);
  763. }
  764. processGrade(list, grade, currentUserIds, params, rule);
  765. grade++;
  766. }
  767. return list;
  768. }
  769. public void processGrade(List<Map<String, Object>> list, int grade, List<String> currentUserIds, AppHomeParams params, Map<Integer, String> rule) {
  770. Map<String, Object> map = new HashMap<>();
  771. map.put("grade", grade);
  772. map.put("gradeName", rule.getOrDefault(grade, ""));
  773. Integer count = 0;
  774. // for (String id : currentUserIds) {
  775. // count += baseMapper.userCountVo(id, params);
  776. // }
  777. map.put("count", currentUserIds.size());
  778. list.add(map);
  779. }
  780. @Override
  781. public HttpResult myCommissionRate(String userId) {
  782. List<PartnerUser> partnerUsers = baseMapper.selectList(new LambdaQueryWrapper<>(PartnerUser.class).eq(PartnerUser::getUserId, userId));
  783. if (CollectionUtil.isEmpty(partnerUsers)){
  784. return HttpResult.error("用户无权益信息");
  785. }
  786. // BigDecimal totalAmountSafe = partnerUsers.stream()
  787. // .map(PartnerUser::getCommissionRate)
  788. // .filter(Objects::nonNull)
  789. // .reduce(BigDecimal.ZERO, BigDecimal::add);
  790. BigDecimal totalAmountSafe = BigDecimal.ZERO;
  791. for (PartnerUser partnerUser : partnerUsers) {
  792. BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()),partnerUser.getUserId(),"");
  793. totalAmountSafe = totalAmountSafe.add(bigDecimal);
  794. }
  795. JSONObject jsonObject = new JSONObject();
  796. jsonObject.put("totalRate",totalAmountSafe);
  797. Map<Integer, String> rule = getRule();
  798. ArrayList<Object> list = new ArrayList<>();
  799. for (PartnerUser user : partnerUsers) {
  800. JSONObject object = new JSONObject();
  801. object.put("grade",user.getGrade());
  802. object.put("gradeName",rule.getOrDefault(user.getGrade(),""));
  803. object.put("commissionRate",CalculateCommissionUtils.calculateCommission(String.valueOf(user.getGrade()),user.getUserId(),""));
  804. list.add(object);
  805. }
  806. jsonObject.put("data",list);
  807. return HttpResult.ok(jsonObject);
  808. }
  809. @Override
  810. public List<PartnerUser> selectByUserId(String userId) {
  811. return baseMapper.selectList(new LambdaQueryWrapper<>(PartnerUser.class).eq(PartnerUser::getUserId, userId));
  812. }
  813. @Override
  814. public PartnerUser selectByUserIdAndGrade(String referrerId, Integer grade) {
  815. return baseMapper.selectOne(new LambdaQueryWrapper<>(PartnerUser.class)
  816. .eq(PartnerUser::getUserId, referrerId).eq(PartnerUser::getGrade, grade));
  817. }
  818. @Override
  819. public PartnerPartnerAccount newGetFee(String userId) {
  820. return partnerPartnerAccountMapper.selectByUserId(userId);
  821. }
  822. }