PartnerUserServiceImpl.java 38 KB

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